default to a session cookie instead of setting an explicit timeout, weird timezone...
[freeside.git] / httemplate / misc / process / meta-import.cgi
1 <% include("/elements/header.html",'Map tables') %>
2
3 <SCRIPT>
4 var gSafeOnload = new Array();
5 var gSafeOnsubmit = new Array();
6 window.onload = SafeOnload;
7 function SafeAddOnLoad(f) {
8   gSafeOnload[gSafeOnload.length] = f;
9 }
10 function SafeOnload() {
11   for (var i=0;i<gSafeOnload.length;i++)
12     gSafeOnload[i]();
13 }
14 function SafeAddOnSubmit(f) {
15   gSafeOnsubmit[gSafeOnsubmit.length] = f;
16 }
17 function SafeOnsubmit() {
18   for (var i=0;i<gSafeOnsubmit.length;i++)
19     gSafeOnsubmit[i]();
20 }
21 </SCRIPT>
22
23 <FORM NAME="OneTrueForm" METHOD="POST" ACTION="meta-import.cgi">
24 %
25 %  #use DBIx::DBSchema;
26 %  my $schema = new_native DBIx::DBSchema
27 %                 map { $cgi->param($_) } qw( data_source username password );
28 %  foreach my $field (qw( data_source username password )) { 
29
30     <INPUT TYPE="hidden" NAME=<% $field %> VALUE="<% $cgi->param($field) %>">
31 % }
32 %
33 %  my %schema;
34 %  use Tie::DxHash;
35 %  tie %schema, 'Tie::DxHash';
36 %  if ( $cgi->param('schema') ) {
37 %    my $schema_string = $cgi->param('schema');
38 %    
39  <INPUT TYPE="hidden" NAME="schema" VALUE="<%$schema_string%>"> 
40 %
41 %    %schema = map { /^\s*(\w+)\s*=>\s*(\w+)\s*$/
42 %                      or die "guru meditation #420: $_";
43 %                    ( $1 => $2 );
44 %                  }
45 %              split( /\n/, $schema_string );
46 %  }
47 %
48 %  #first page
49 %  unless ( $cgi->param('magic') ) { 
50
51
52     <INPUT TYPE="hidden" NAME="magic" VALUE="process">
53     <% hashmaker('schema', [ $schema->tables ],
54                             [ grep !/^h_/, dbdef->tables ],  ) %>
55     <br><INPUT TYPE="submit" VALUE="done">
56 %
57 %
58 %  #second page
59 %  } elsif ( $cgi->param('magic') eq 'process' ) { 
60
61
62     <INPUT TYPE="hidden" NAME="magic" VALUE="process2">
63 %
64 %
65 %    my %unique;
66 %    foreach my $table ( keys %schema ) {
67 %
68 %      my @from_columns = $schema->table($table)->columns;
69 %      my @fs_columns = dbdef->table($schema{$table})->columns;
70 %
71 %      
72
73       <% hashmaker( $table.'__'.$unique{$table}++,
74                      \@from_columns => \@fs_columns,
75                      $table         =>  $schema{$table}, ) %>
76       <br><hr><br>
77 %
78 %
79 %    }
80 %
81 %    
82
83     <br><INPUT TYPE="submit" VALUE="done">
84 %
85 %
86 %  #third (results)
87 %  } elsif ( $cgi->param('magic') eq 'process2' ) {
88 %
89 %    print "<pre>\n";
90 %
91 %    my %unique;
92 %    foreach my $table ( keys %schema ) {
93 %      ( my $spaces = $table ) =~ s/./ /g;
94 %      print "'$table' => { 'table' => '$schema{$table}',\n".
95 %            #(length($table) x ' '). "         'map'   => {\n";
96 %            "$spaces        'map'   => {\n";
97 %      my %map = map { /^\s*(\w+)\s*=>\s*(\w+)\s*$/
98 %                         or die "guru meditation #420: $_";
99 %                       ( $1 => $2 );
100 %                     }
101 %                 split( /\n/, $cgi->param($table.'__'.$unique{$table}++) );
102 %      foreach ( keys %map ) {
103 %        print "$spaces                     '$_' => '$map{$_}',\n";
104 %      }
105 %      print "$spaces                   },\n";
106 %      print "$spaces      },\n";
107 %
108 %    }
109 %    print "\n</pre>";
110 %
111 %  } else {
112 %    warn "unrecognized magic: ". $cgi->param('magic');
113 %  }
114 %
115 %  
116
117 </FORM>
118 </BODY>
119 </HTML>
120 %
121 %  #hashmaker widget
122 %  sub hashmaker {
123 %    my($name, $from, $to, $labelfrom, $labelto) = @_;
124 %    my $fromsize = scalar(@$from);
125 %    my $tosize = scalar(@$to);
126 %    "<TABLE><TR><TH>$labelfrom</TH><TH>$labelto</TH></TR><TR><TD>".
127 %        qq!<SELECT NAME="${name}_from" SIZE=$fromsize>\n!.
128 %        join("\n", map { qq!<OPTION VALUE="$_">$_</OPTION>! } sort { $a cmp $b } @$from ).
129 %        "</SELECT>\n<BR>".
130 %      qq!<INPUT TYPE="button" VALUE="refill" onClick="repack_${name}_from()">!.
131 %      '</TD><TD>'.
132 %        qq!<SELECT NAME="${name}_to" SIZE=$tosize>\n!.
133 %        join("\n", map { qq!<OPTION VALUE="$_">$_</OPTION>! } sort { $a cmp $b } @$to ).
134 %        "</SELECT>\n<BR>".
135 %      qq!<INPUT TYPE="button" VALUE="refill" onClick="repack_${name}_to()">!.
136 %      '</TD></TR>'.
137 %      '<TR><TD COLSPAN=2>'.
138 %        qq!<INPUT TYPE="button" VALUE="map" onClick="toke_$name(this.form)">!.
139 %      '</TD></TR><TR><TD COLSPAN=2>'.
140 %      qq!<TEXTAREA NAME="$name" COLS=80 ROWS=8></TEXTAREA>!.
141 %      '</TD></TR></TABLE>'.
142 %      "<script>
143 %            function toke_$name() {
144 %              fromObject = document.OneTrueForm.${name}_from;
145 %              for (var i=fromObject.options.length-1;i>-1;i--) {
146 %                if (fromObject.options[i].selected)
147 %                  fromname = deleteOption_$name(fromObject,i);
148 %              }
149 %              toObject = document.OneTrueForm.${name}_to;
150 %              for (var i=toObject.options.length-1;i>-1;i--) {
151 %                if (toObject.options[i].selected)
152 %                  toname = deleteOption_$name(toObject,i);
153 %              }
154 %              document.OneTrueForm.$name.value = document.OneTrueForm.$name.value + fromname + ' => ' + toname + '\\n';
155 %            }
156 %            function deleteOption_$name(object,index) {
157 %              value = object.options[index].value;
158 %              object.options[index] = null;
159 %              return value;
160 %            }
161 %            function repack_${name}_from() {
162 %              var object = document.OneTrueForm.${name}_from;
163 %              object.options.length = 0;
164 %              ". join("\n", 
165 %                   map { "addOption_$name(object, '$_');\n" }
166 %                       ( sort { $a cmp $b } @$from )           ). "
167 %            }
168 %            function repack_${name}_to() {
169 %              var object = document.OneTrueForm.${name}_to;
170 %              object.options.length = 0;
171 %              ". join("\n", 
172 %                   map { "addOption_$name(object, '$_');\n" }
173 %                       ( sort { $a cmp $b } @$to )           ). "
174 %            }
175 %            function addOption_$name(object,value) {
176 %              var length = object.length;
177 %              object.options[length] = new Option(value, value, false, false);
178 %            }
179 %      </script>".
180 %      '';
181 %  }
182 %
183 %
184 <%init>
185
186 #there's no ACL for this...  haven't used in ages
187 #make XSS-safe if this is used for more than just admins to import data....
188 die 'meta-import not enabled; remove this if you want to use it';
189
190 </%init>