9e374b5081ee874f62b054f8716691bfa7697193
[freeside.git] / httemplate / misc / process / meta-import.cgi
1 <!-- mason kludge -->
2 <%= header('Map tables') %>
3
4 <SCRIPT>
5 var gSafeOnload = new Array();
6 var gSafeOnsubmit = new Array();
7 window.onload = SafeOnload;
8 function SafeAddOnLoad(f) {
9   gSafeOnload[gSafeOnload.length] = f;
10 }
11 function SafeOnload() {
12   for (var i=0;i<gSafeOnload.length;i++)
13     gSafeOnload[i]();
14 }
15 function SafeAddOnSubmit(f) {
16   gSafeOnsubmit[gSafeOnsubmit.length] = f;
17 }
18 function SafeOnsubmit() {
19   for (var i=0;i<gSafeOnsubmit.length;i++)
20     gSafeOnsubmit[i]();
21 }
22 </SCRIPT>
23
24 <FORM NAME="OneTrueForm" METHOD="POST" ACTION="meta-import.cgi">
25
26 <%
27   #use DBIx::DBSchema;
28   my $schema = new_native DBIx::DBSchema
29                  map { $cgi->param($_) } qw( data_source username password );
30   foreach my $field (qw( data_source username password )) { %>
31     <INPUT TYPE="hidden" NAME=<%= $field %> VALUE="<%= $cgi->param($field) %>">
32   <% }
33
34   my %schema = ();
35   if ( $cgi->param('schema') ) {
36     my $schema_string = $cgi->param('schema');
37     %> <INPUT TYPE="hidden" NAME="schema" VALUE="<%=$schema_string%>"> <%
38     %schema = map { /^\s*(\w+)\s*=>\s*(\w+)\s*$/
39                       or die "guru meditation #420: $_";
40                     ( $1 => $2 );
41                   }
42               split( /\n/, $schema_string );
43   }
44
45   #first page
46   unless ( $cgi->param('magic') ) { %>
47
48     <INPUT TYPE="hidden" NAME="magic" VALUE="process">
49     <%= hashmaker('schema', [ $schema->tables ],
50                             [ grep !/^h_/, dbdef->tables ],  ) %>
51     <br><INPUT TYPE="submit" VALUE="done">
52     <%
53
54   #second page
55   } elsif ( $cgi->param('magic') eq 'process' ) { %>
56
57     <INPUT TYPE="hidden" NAME="magic" VALUE="process2">
58     <%
59
60     foreach my $table ( keys %schema ) {
61
62       my @from_columns = $schema->table($table)->columns;
63       my @fs_columns = dbdef->table($schema{$table})->columns;
64
65       %>
66       <%= hashmaker($table, \@from_columns => \@fs_columns,
67                             $table         =>  $schema{$table}, ) %>
68       <br><hr><br>
69       <%
70
71     }
72
73     %>
74     <br><INPUT TYPE="submit" VALUE="done">
75     <%
76
77   #third (results)
78   } elsif ( $cgi->param('magic') eq 'process2' ) {
79
80     print "<pre>\n";
81
82     foreach my $table ( keys %schema ) {
83       ( my $spaces = $table ) =~ s/./ /g;
84       print "'$table' => { 'table' => '$schema{$table}',\n".
85             #(length($table) x ' '). "         'map'   => {\n";
86             "$spaces        'map'   => {\n";
87       my %map = map { /^\s*(\w+)\s*=>\s*(\w+)\s*$/
88                          or die "guru meditation #420: $_";
89                        ( $1 => $2 );
90                      }
91                  split( /\n/, $cgi->param($table) );
92       foreach ( keys %map ) {
93         print "$spaces                     '$_' => '$map{$_}',\n";
94       }
95       print "$spaces                   },\n";
96       print "$spaces      },\n";
97
98     }
99     print "\n</pre>";
100
101   } else {
102     warn "unrecognized magic: ". $cgi->param('magic');
103   }
104
105   %>
106 </FORM>
107 </BODY>
108 </HTML>
109
110   <%
111   #hashmaker widget
112   sub hashmaker {
113     my($name, $from, $to, $labelfrom, $labelto) = @_;
114     $fromsize = scalar(@$from);
115     $tosize = scalar(@$to);
116     "<TABLE><TR><TH>$labelfrom</TH><TH>$labelto</TH></TR><TR><TD>".
117         qq!<SELECT NAME="${name}_from" SIZE=$fromsize>\n!.
118         join("\n", map { qq!<OPTION VALUE="$_">$_</OPTION>! } sort { $a cmp $b } @$from ).
119         "</SELECT>\n".
120       '</TD><TD>'.
121         qq!<SELECT NAME="${name}_to" SIZE=$tosize>\n!.
122         join("\n", map { qq!<OPTION VALUE="$_">$_</OPTION>! } sort { $a cmp $b } @$to ).
123         "</SELECT>\n".
124       '</TD></TR>'.
125       '<TR><TD COLSPAN=2>'.
126         qq!<INPUT TYPE="button" VALUE="map" onClick="toke_$name(this.form)">!.
127       '</TD></TR><TR><TD COLSPAN=2>'.
128       qq!<TEXTAREA NAME="$name" COLS=80 ROWS=8></TEXTAREA>!.
129       '</TD></TR></TABLE>'.
130       "<script>
131             function toke_$name() {
132               fromObject = document.OneTrueForm.${name}_from;
133               for (var i=fromObject.options.length-1;i>-1;i--) {
134                 if (fromObject.options[i].selected)
135                   fromname = deleteOption_$name(fromObject,i);
136               }
137               toObject = document.OneTrueForm.${name}_to;
138               for (var i=toObject.options.length-1;i>-1;i--) {
139                 if (toObject.options[i].selected)
140                   toname = deleteOption_$name(toObject,i);
141               }
142               document.OneTrueForm.$name.value = document.OneTrueForm.$name.value + fromname + ' => ' + toname + '\\n';
143             }
144             function deleteOption_$name(object,index) {
145               value = object.options[index].value;
146               object.options[index] = null;
147               return value;
148             }
149       </script>".
150       '';
151   }
152
153 %>