updated meta-import web UI to allow duplicate import tables
[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   use Tie::DxHash;
36   tie %schema, 'Tie::DxHash';
37   if ( $cgi->param('schema') ) {
38     my $schema_string = $cgi->param('schema');
39     %> <INPUT TYPE="hidden" NAME="schema" VALUE="<%=$schema_string%>"> <%
40     %schema = map { /^\s*(\w+)\s*=>\s*(\w+)\s*$/
41                       or die "guru meditation #420: $_";
42                     ( $1 => $2 );
43                   }
44               split( /\n/, $schema_string );
45   }
46
47   #first page
48   unless ( $cgi->param('magic') ) { %>
49
50     <INPUT TYPE="hidden" NAME="magic" VALUE="process">
51     <%= hashmaker('schema', [ $schema->tables ],
52                             [ grep !/^h_/, dbdef->tables ],  ) %>
53     <br><INPUT TYPE="submit" VALUE="done">
54     <%
55
56   #second page
57   } elsif ( $cgi->param('magic') eq 'process' ) { %>
58
59     <INPUT TYPE="hidden" NAME="magic" VALUE="process2">
60     <%
61
62     my %unique;
63     foreach my $table ( keys %schema ) {
64
65       my @from_columns = $schema->table($table)->columns;
66       my @fs_columns = dbdef->table($schema{$table})->columns;
67
68       %>
69       <%= hashmaker( $table.'__'.$unique{$table}++,
70                      \@from_columns => \@fs_columns,
71                      $table         =>  $schema{$table}, ) %>
72       <br><hr><br>
73       <%
74
75     }
76
77     %>
78     <br><INPUT TYPE="submit" VALUE="done">
79     <%
80
81   #third (results)
82   } elsif ( $cgi->param('magic') eq 'process2' ) {
83
84     print "<pre>\n";
85
86     my %unique;
87     foreach my $table ( keys %schema ) {
88       ( my $spaces = $table ) =~ s/./ /g;
89       print "'$table' => { 'table' => '$schema{$table}',\n".
90             #(length($table) x ' '). "         'map'   => {\n";
91             "$spaces        'map'   => {\n";
92       my %map = map { /^\s*(\w+)\s*=>\s*(\w+)\s*$/
93                          or die "guru meditation #420: $_";
94                        ( $1 => $2 );
95                      }
96                  split( /\n/, $cgi->param($table.'__'.$unique{$table}++) );
97       foreach ( keys %map ) {
98         print "$spaces                     '$_' => '$map{$_}',\n";
99       }
100       print "$spaces                   },\n";
101       print "$spaces      },\n";
102
103     }
104     print "\n</pre>";
105
106   } else {
107     warn "unrecognized magic: ". $cgi->param('magic');
108   }
109
110   %>
111 </FORM>
112 </BODY>
113 </HTML>
114
115   <%
116   #hashmaker widget
117   sub hashmaker {
118     my($name, $from, $to, $labelfrom, $labelto) = @_;
119     $fromsize = scalar(@$from);
120     $tosize = scalar(@$to);
121     "<TABLE><TR><TH>$labelfrom</TH><TH>$labelto</TH></TR><TR><TD>".
122         qq!<SELECT NAME="${name}_from" SIZE=$fromsize>\n!.
123         join("\n", map { qq!<OPTION VALUE="$_">$_</OPTION>! } sort { $a cmp $b } @$from ).
124         "</SELECT>\n<BR>".
125       qq!<INPUT TYPE="button" VALUE="refill" onClick="repack_${name}_from()">!.
126       '</TD><TD>'.
127         qq!<SELECT NAME="${name}_to" SIZE=$tosize>\n!.
128         join("\n", map { qq!<OPTION VALUE="$_">$_</OPTION>! } sort { $a cmp $b } @$to ).
129         "</SELECT>\n<BR>".
130       qq!<INPUT TYPE="button" VALUE="refill" onClick="repack_${name}_to()">!.
131       '</TD></TR>'.
132       '<TR><TD COLSPAN=2>'.
133         qq!<INPUT TYPE="button" VALUE="map" onClick="toke_$name(this.form)">!.
134       '</TD></TR><TR><TD COLSPAN=2>'.
135       qq!<TEXTAREA NAME="$name" COLS=80 ROWS=8></TEXTAREA>!.
136       '</TD></TR></TABLE>'.
137       "<script>
138             function toke_$name() {
139               fromObject = document.OneTrueForm.${name}_from;
140               for (var i=fromObject.options.length-1;i>-1;i--) {
141                 if (fromObject.options[i].selected)
142                   fromname = deleteOption_$name(fromObject,i);
143               }
144               toObject = document.OneTrueForm.${name}_to;
145               for (var i=toObject.options.length-1;i>-1;i--) {
146                 if (toObject.options[i].selected)
147                   toname = deleteOption_$name(toObject,i);
148               }
149               document.OneTrueForm.$name.value = document.OneTrueForm.$name.value + fromname + ' => ' + toname + '\\n';
150             }
151             function deleteOption_$name(object,index) {
152               value = object.options[index].value;
153               object.options[index] = null;
154               return value;
155             }
156             function repack_${name}_from() {
157               var object = document.OneTrueForm.${name}_from;
158               object.options.length = 0;
159               ". join("\n", 
160                    map { "addOption_$name(object, '$_');\n" }
161                        ( sort { $a cmp $b } @$from )           ). "
162             }
163             function repack_${name}_to() {
164               var object = document.OneTrueForm.${name}_to;
165               object.options.length = 0;
166               ". join("\n", 
167                    map { "addOption_$name(object, '$_');\n" }
168                        ( sort { $a cmp $b } @$to )           ). "
169             }
170             function addOption_$name(object,value) {
171               var length = object.length;
172               object.options[length] = new Option(value, value, false, false);
173             }
174       </script>".
175       '';
176   }
177
178 %>