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