diff options
Diffstat (limited to 'httemplate/edit/elements/edit.html')
-rw-r--r-- | httemplate/edit/elements/edit.html | 881 |
1 files changed, 0 insertions, 881 deletions
diff --git a/httemplate/edit/elements/edit.html b/httemplate/edit/elements/edit.html deleted file mode 100644 index cab5167c6..000000000 --- a/httemplate/edit/elements/edit.html +++ /dev/null @@ -1,881 +0,0 @@ -<%doc> - -Example: - - include( 'elements/edit.html', - 'name_singular' => #singular name for the record - # (preferred, will be pluralized automatically) - 'name' => #name for the record - # (deprecated, will be pluralized simplistically) - 'table' => - - #? 'primary_key' => #required when the dbdef doesn't know...??? - 'labels' => { - 'column' => 'Label', - } - - #listref - each item is a literal column name (or method) or hashref - # or (notyet) coderef - #if not specified all columns (except for the primary key) will be editable - 'fields' => [ - 'columname', - { 'field' => 'another_columname', - 'type' => 'text', #text - #password - #money - #percentage - #checkbox - #select - #selectlayers (can now use after a tablebreak-tr-title... but not inside columnstart/columnnext/columnend) - #title - #tablebreak-tr-title - #columnstart - #columnnext - #columnend - #hidden - hidden value from object - #fixed - display fixed value from object or here - #fixed-country - #fixed-state - 'value' => 'Y', #for checkbox, title, fixed, hidden - 'disabled' => 0, - 'onchange' => 'javascript_function', - - 'include_opt_callback' => sub { my $object = @_; - ( 'option' => 'value', ); - }, - - 'm2name_table' => 'table_name', - 'm2name_namecol' => 'name_column', - #OR# - 'm2m_method' => - #'m2m_srccol' => #opt, if not the same as this table - 'm2m_dstcol' => #required for now, eventuaully opt, if not the same as target table - #OR# - 'o2m_table' => - - 'm2_label' => 'Label', # - 'm2_new_default' => \@table_name_objects, #default - #m2 objects for - #new records - 'm2_error_callback' => sub { my($cgi, $object) = @_; }, - 'm2_remove_warnings' => \%warnings, #hashref of warning - #messages for m2 - #removal - 'm2_new_js' => 'function_name', #javascript function called - #on spawned rows (one arg: - #new_element) - 'm2_remove_js' => 'function_name', #js function called when - #a row is deleted (three - #args: value, text, - #'no_match') - #layer_fields & layer_values_callback only for selectlayer - 'layer_fields' => [ - 'fieldname' => 'Label', - 'another_field' => { - label=>'Label', - type =>'text', #text, money - }, - ], - 'layer_values_callback' => - sub { - my( $cgi, $object ) = @_; - { 'layer' => { 'fieldname' => 'current_value', - 'fieldname2' => 'field2value', - ... - }, - 'layer2' => { 'l2fieldname' => 'l2value', - ... - }, - ... - }; - }, - }, - ] - - 'menubar' => '', #menubar arrayref - - #agent virtualization - 'agent_virt' => 1, - 'agent_null' => 1, #if true, always allow no-agentnum globals - 'agent_null_right' => 'Access Right Name', - 'agent_clone_extra_sql' => '', #if provided, this overrides the extra_sql - #implementing agent virt, for clone - #operations. i.e. pass "1=1" to allow - #cloning anything - - 'viewall_dir' => '', #'search' or 'browse', defaults to 'search' - - # overrides default popurl(1)."process/$table.html" - 'post_url' => popurl(1).'process/something', - - #we're in a popup (no title/menu/searchboxes) - 'popup' => 1, - - ### - # HTML callbacks - ### - - 'body_etc' => '', # Additional BODY attributes, i.e. onLoad="" - - 'html_init' => '', #after the header/menubar - - #string or coderef of additional HTML to add before </TABLE> - 'html_table_bottom' => '', - - #after </TABLE> but before the submit - 'html_bottom' => '', #string - 'html_bottom' => sub { - my $object = shift; - # ... - "html_string"; - }, - - #javascript function name, will be called with form name as arg - 'onsubmit' => 'check_form_data', - - #at the very bottom (well, as low as you can go from here) - 'html_foot' => '', - - ### - # initialization callbacks - ### - - ###global callbacks, always run if provided - - #after decoding long CGI "redirect=" responses but - # before object creation/search - # (useful if you have a long form that might trigger redirect= and you need - # to do things with $cgi params - they're not decoded in the calling - # <%init> block yet) - 'begin_callback' = sub { my( $cgi, $fields_listref, $opt_hashref ) = @_; }, - - #after the mode-specific object creation/search - 'end_callback' = sub { my( $cgi, $object, $fields_listref, $opt_hashref ) = @_; }, - - ###mode-specific callbacks. one (and only one) of these four is called - - #run when adding - 'new_callback' => sub { my( $cgi, $object, $fields_listref, $opt_hashref ) = @_; }, - - #run when editing - 'edit_callback' => sub { my( $cgi, $object, $fields_listref, $opt_hashref ) = @_; }, - - #run when re-displaying with an error - 'error_callback' => sub { my( $cgi, $object, $fields_listref, $opt_hashref ) = @_; }, - - #run when cloning - 'clone_callback' => sub { my( $cgi, $object, $fields_listref, $opt_hashref ) = @_; }, - - ###callbacks called in new mode only - - # returns a hashref for the new object - 'new_hashref_callback' - - # returns the new object iself (otherwise, ->new is called) - 'new_object_callback' - - ###display callbacks - - #run before display to return a different value - 'value_callback' => sub { my( $columname, $value ) = @_; }, - - #run before display to manipulate element of the 'fields' arrayref - 'field_callback' => sub { my( $cgi, $object, $field_hashref ) = @_; }, - - ); - -</%doc> - -<% include('/elements/header'. ( $opt{popup} ? '-popup' : '' ). '.html', - $title, - include( '/elements/menubar.html', @menubar ), - $opt{'body_etc'}, - ) -%> - -<% defined($opt{'html_init'}) - ? ( ref($opt{'html_init'}) - ? &{$opt{'html_init'}}() - : $opt{'html_init'} - ) - : '' -%> - -<% include('/elements/error.html') %> - -% my $url = $opt{'post_url'} || popurl(1)."process/$table.html"; - -<FORM NAME = "edit_topform" - METHOD = POST - ACTION = "<% $url %>" - <% $opt{onsubmit} ? 'onSubmit="return '.$opt{onsubmit}.'(this)"' : '' %> -> - -<INPUT TYPE="hidden" NAME="svcdb" VALUE="<% $table %>"> -<INPUT TYPE="hidden" NAME="<% $pkey %>" VALUE="<% $clone ? '' : $object->$pkey() %>"> - -<FONT SIZE="+1"><B> -<% ( $opt{labels} && exists $opt{labels}->{$pkey} ) - ? $opt{labels}->{$pkey} - : $pkey -%> -</B></FONT> -#<% ( !$clone && $object->$pkey() ) || "(NEW)" %> - -% my $tablenum = 0; -<TABLE ID="TableNumber<% $tablenum++ %>" BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0> - -% my $g_row = 0; -% my @g_row_stack = (); -% foreach my $f ( map { ref($_) ? $_ : {'field'=>$_} } -% @$fields -% ) { -% -% my $trash = &{ $opt{'field_callback'} }( $cgi, $object, $f ) -% if $opt{'field_callback'}; -% -% my $field = $f->{'field'}; -% my $type = $f->{'type'} ||= 'text'; -% -% my $label = ( $opt{labels} && exists $opt{labels}->{$field} ) -% ? $opt{labels}->{$field} -% : $field; -% -% my $onchange = $f->{'onchange'}; -% -% my $layer_values = {}; -% $layer_values = &{ $f->{'layer_values_callback'} }( $cgi, $object ) -% if $f->{'layer_values_callback'} -% && ! $f->{'m2name_table'} -% && ! $f->{'o2m_table'} -% && ! $f->{'m2m_method'}; -% -% warn "layer values: ". Dumper($layer_values) -% if $opt{'debug'}; -% -% my %include_common = ( -% -% #text and derivitives -% 'size' => $f->{'size'}, -% 'maxlength' => $f->{'maxlength'}, -% 'postfix' => $f->{'postfix'}, -% -% #checkbox, title, fixed, hidden -% #& deprecated weird value hashref used only by reason.html -% 'value' => $f->{'value'}, -% -% #select(-*) -% 'options' => $f->{'options'}, -% 'labels' => $f->{'labels'}, -% 'multiple' => $f->{'multiple'}, -% 'disable_empty' => $f->{'disable_empty'}, -% #select-reason -% 'reason_class' => $f->{'reason_class'}, -% -% #selectlayers -% 'layer_fields' => $f->{'layer_fields'}, -% 'layer_values' => $layer_values, -% 'html_between' => $f->{'html_between'}, -% -% #umm. for select-agent_types at least -% 'disabled' => $f->{'disabled'}, -% ); -% -% #selectlayers, others? -% $include_common{$_} = $f->{$_} -% foreach grep exists($f->{$_}), -% qw( js_only html_only select_only layers_only cell_style); -% -% #select-* -% $include_common{$_} = $f->{$_} -% foreach grep exists($f->{$_}), qw( empty_label ); -% -% #select-table -% $include_common{$_} = $f->{$_} -% foreach grep exists($f->{$_}), qw( value_col ); -% $include_common{$_} = ref( $f->{$_} ) eq 'CODE' -% ? &{ $f->{$_} }( $cgi, $object ) #, $f ) -% : $f->{$_} -% foreach grep exists($f->{$_}), qw( extra_sql ); -% -% #select-table, checkboxes-table -% $include_common{$_} = $f->{$_} -% foreach grep exists($f->{$_}), qw( table name_col ); -% -% #checkboxes-table -% $include_common{$_} = $f->{$_} -% foreach grep exists($f->{$_}), qw( target_table link_table ); -% -% #*-table -% $include_common{$_} = $f->{$_} -% foreach grep exists($f->{$_}), -% qw( hashref agent_virt agent_null agent_null_right ); -% -% # fixed -% $include_common{$_} = $f->{$_} -% foreach grep exists($f->{$_}), -% qw( formatted_value ); -% -% #htmlarea -% $include_common{$_} = $f->{$_} -% foreach grep exists($f->{$_}), qw( width height ); -% -% -% if ( $type eq 'tablebreak-tr-title' ) { -% $include_common{'table_id'} = 'TableNumber'. $tablenum++; -% } -% if ( $type eq 'tablebreak-tr-title' || $type eq 'title' ) { -% $include_common{'colspan'} = $f->{colspan} if $f->{colspan}; -% } -% -% if ( $f->{include_opt_callback} ) { -% %include_common = ( %include_common, -% &{ $f->{include_opt_callback} }( $object ) -% ); -% } -% -% my $layer_prefix_on = ''; -% -% my $include_sub = sub { -% my %opt = @_; -% -% my $fieldnum = delete $opt{'fieldnum'}; -% -% my $include = $type; -% $include = "input-$include" if $include =~ /^(text|money|percentage)$/; -% $include = "tr-$include" unless $include =~ /^(hidden|tablebreak|column)/; -% -% $include_common{'layer_prefix'} = "$field$fieldnum." -% if $layer_prefix_on; -% -% my @include = -% ( "/elements/$include.html", -% 'field' => "$field$fieldnum", -% 'id' => "$field$fieldnum", #separate? -% 'label_id' => $field."_label$fieldnum", #don't want field0_label0... -% %include_common, -% %opt, -% ); -% -% if ( $include eq 'tr-input-date-field' ) { -% # it's either hacking it here, or changing a lot more stuff -% @include = ( -% "/elements/$include.html", { -% 'name' => $field, -% 'value' => $opt{curr_value}, -% 'label' => $label, -% 'noinit' => $f->{noinit}, -% } -% ); -% } -% -% @include; -% }; -% -% my $column_sub = sub { -% my %opt = @_; -% -% my $column = delete($opt{field}); -% my $fieldnum = delete($opt{fieldnum}); -% my $include = delete($opt{type}) || 'text'; -% $include = "input-$include" if $include =~ /^(text|money|percentage)$/; -% -% ( "/elements/$include.html", -% 'field' => $field.'__'.$column.$fieldnum, -% 'id' => $field.'__'.$column.$fieldnum, -% 'layer_prefix' => $field.'__'.$column.$fieldnum.".", -% ( $fieldnum -% ? ('cell_style' => 'border-top:1px solid black') -% : () -% ), -% 'cgi' => $cgi, -% %opt, -% ); -% }; -% -% unless ( $type =~ /^column/ ) { -% $g_row = 1 if $type eq 'tablebreak-tr-title'; -% $g_row++; -% $g_row++ if $type eq 'title'; -% } else { -% if ( $type eq 'columnstart' ) { -% push @g_row_stack, $g_row; -% $g_row = 0; -% #} elsif ( $type eq 'columnnext' ) { -% } elsif ( $type eq 'columnend' ) { -% $g_row = pop @g_row_stack; -% } -% -% } -% -% my $fieldnum = ''; -% my $curr_value = ''; -% if ( $f->{'m2name_table'} || $f->{'o2m_table'} || $f->{'m2m_method'} ) { -% -% my($table, $col); -% if ( $f->{'m2name_table'} ) { -% $table = $f->{'m2name_table'}; -% $col = $f->{'m2name_namecol'}; -% } elsif ( $f->{'o2m_table'} ) { -% $table = $f->{'o2m_table'}; -% $col = dbdef->table($f->{'o2m_table'})->primary_key; -% } elsif ( $f->{'m2m_method'} ) { -% $table = $f->{'m2m_method'}; -% $col = $f->{'m2m_dstcol'}; -% } -% $fieldnum = 0; -% $layer_prefix_on = 1; -% #print out the fields for the existing m2s -% my @existing = (); -% if ( $mode eq 'error' ) { -% @existing = &{ $f->{'m2_error_callback'} }( $cgi, $object ); -% } elsif ( $object->$pkey() ) { # $mode eq 'edit'||'clone' -% @existing = $object->$table(); -% warn scalar(@existing). " from $object->$table: ". join('/', @existing) -% if $opt{'debug'}; -% } elsif ( $f->{'m2_new_default'} ) { # && $mode eq 'new' -% @existing = @{ $f->{'m2_new_default'} }; -% } -% foreach my $name_obj ( @existing ) { -% -% my $ex_label = '<INPUT TYPE="button" VALUE="X" TITLE="Remove this '. -% lc($f->{'m2_label'}). -% qq(" onClick="remove_$field($fieldnum);"). -% ' STYLE="color:#ff0000;font-weight:bold;'. -% 'padding-left:2px;padding-right:2px"'. -% '> '. ($f->{'m2_label'} || $field ). ' '; -% -% if ( $f->{'layer_values_callback'} ) { -% my %switches = ( 'mode' => $mode ); -% $layer_values = -% &{ $f->{'layer_values_callback'} }( $cgi, $name_obj, \%switches ); -% } -% warn "layer values: ". Dumper($layer_values) -% if $opt{'debug'}; -% -% my @existing = &{ $include_sub }( -% 'label' => $ex_label, -% 'fieldnum' => $fieldnum, -% 'curr_value' => $name_obj->$col(), -% 'onchange' => $onchange, -% 'layer_values' => $layer_values, -% 'cell_style' => ( $fieldnum ? 'border-top:1px solid black' : '' ), -% ); -% $existing[0] =~ s(^/elements/tr-)(/elements/); -% my @label = @existing; -% $label[0] = '/elements/tr-td-label.html'; - - <% include( @label ) %> - <TD COLSPAN="<% $f->{'colspan'} || 1 %>"> - <% include( @existing ) %> - </TD> - -% if ( $f->{'m2_fields'} ) { -% foreach my $c ( @{ $f->{'m2_fields'} } ) { -% my $column = $c->{field}; -% my @column = &{ $column_sub }( %$c, -% 'fieldnum' => $fieldnum, -% 'curr_value' => $name_obj->$column() -% ); - - <TD id='<% $field %>__<% $column %>_label<% $fieldnum %>' - style='text-align:right;vertical-align:top; - border-top:1px solid black;padding-top:5px;'> - <% $c->{'label'} || '' %> - </TD> - <TD style='border-top:1px solid black;padding-top:3px;'> - <% include( @column ) %> - </TD> -% } -% } - - </TR> - -% $fieldnum++; -% $g_row++; -% } -% #$field .= $fieldnum; -% $onchange .= "\nspawn_$field(what);"; -% } else { -% if ( $f->{curr_value_callback} ) { -% $curr_value = &{ $f->{curr_value_callback} }( $cgi, $object, $field ), -% } else { -% $curr_value = $object->$field(); -% } -% $curr_value = &{ $opt{'value_callback'} }( $f->{'field'}, $curr_value ) -% if $opt{'value_callback'} && $mode ne 'error'; -% } -% -% my @include = &{ $include_sub }( -% 'label' => $label, -% 'fieldnum' => $fieldnum, -% 'curr_value' => $curr_value, -% 'object' => $object, -% 'cgi' => $cgi, -% 'onchange' => $onchange, -% ( $fieldnum ? ('cell_style' => 'border-top:1px solid black') : () ), -% ); -% -% if ( $f->{'m2name_table'} || $f->{'o2m_table'} || $f->{'m2m_method'} ) { -% $include[0] =~ s(^/elements/tr-)(/elements/); -% my @label = @include; -% $label[0] = '/elements/tr-td-label.html'; - - <% include( @label ) %> - <TD COLSPAN="<% $f->{'colspan'} || 1 %>"> - <% include( @include ) %> - </TD> - -% if ( $f->{'m2_fields'} ) { -% foreach my $c ( @{ $f->{'m2_fields'} } ) { -% my $column = $c->{field}; -% my @column = &{ $column_sub }( %$c, 'fieldnum' => $fieldnum ); - - <TD id='<% $field %>__<% $column %>_label<% $fieldnum %>' - style='text-align:right;vertical-align:top; - border-top:1px solid black;padding-top:5px;'> - <% $c->{'label'} || '' %> - </TD> - <TD style='border-top:1px solid black;padding-top:3px;'> - <% include( @column ) %> - </TD> -% } -% } - - </TR> - -% } else { - - <% include( @include ) %> - -% } -% if ( $f->{'m2name_table'} || $f->{'o2m_table'} || $f->{'m2m_method'} ) { - - <SCRIPT TYPE="text/javascript"> - - var <%$field%>_rownum = <% $g_row %>; - var <%$field%>_fieldnum = <% $fieldnum %>; - - function spawn_<%$field%>(what) { - - // only spawn if we're the last element... return if not - - var field_regex = /(\d+)(_[a-z]+)?$/; - var match = field_regex.exec(what.name); - if ( !match ) { - alert(what.name + " didn't match for " + what); - return; - } - if ( match[1] != <%$field%>_fieldnum ) { - return; - } - - // change the label on the last entry & add a remove button - var prev_label = document.getElementById('<% $field %>_label' + <%$field%>_fieldnum ); - prev_label.innerHTML = '<INPUT TYPE="button" VALUE="X" TITLE="Remove this <% lc($f->{'m2_label'}) %>" onClick="remove_<% $field %>(' + <%$field%>_fieldnum + ');" STYLE="color:#ff0000;font-weight:bold;padding-left:2px;padding-right:2px" > <% $f->{'m2_label'} || $field %>'; - - <%$field%>_fieldnum++; - - //get the new widget - -% $include[0] =~ s(^/elements/tr-)(/elements/); -% my @layer_opt = ( @include, -% 'field' => $field."MAGIC_NUMBER", -% 'id' => $field."MAGIC_NUMBER", -% 'layer_prefix' => $field."MAGIC_NUMBER.", -% ); -% warn @layer_opt if $opt{'debug'}; - - var newrow = <% include(@layer_opt, html_only=>1) |js_string %>; - -% #until the rest have html/js_only -% if ( $type eq 'selectlayers' || $type =~ /^select-cgp_rule_/ ) { - var newfunc = <% include(@layer_opt, js_only=>1) |js_string %>; -% } else { - var newfunc = ''; -% } - - // substitute in the new field name - var magic_regex = /MAGIC_NUMBER/g; - newrow = newrow.replace( magic_regex, <%$field%>_fieldnum ); - newfunc = newfunc.replace( magic_regex, <%$field%>_fieldnum ); - - // evaluate new_func - if (window.ActiveXObject) { - window.execScript(newfunc); - } else { /* (window.XMLHttpRequest) */ - //window.eval(newfunc); - setTimeout(newfunc, 0); - } - - // add new row - - //hmm, can't use selectlayers after a tablebreak-title for now - var table = document.getElementById('TableNumber<% $tablenum-1 %>'); - - var row = table.insertRow(<%$field%>_rownum++); - - var label_cell = document.createElement('TD'); - - label_cell.id = '<% $field %>_label' + <%$field%>_fieldnum; - - label_cell.style.textAlign = "right"; - label_cell.style.verticalAlign = "top"; - label_cell.style.borderTop = "1px solid black"; - label_cell.style.paddingTop = "5px"; - - label_cell.innerHTML = '<% $label %>'; - - row.appendChild(label_cell); - - var widget_cell = document.createElement('TD'); - - widget_cell.style.borderTop = "1px solid black"; - widget_cell.style.paddingTop = "3px"; - widget_cell.colSpan = "<% $f->{'colspan'} || 1 %>" - - widget_cell.innerHTML = newrow; - - row.appendChild(widget_cell); - -% if ( $f->{'m2_fields'} ) { -% foreach my $c ( @{ $f->{'m2_fields'} } ) { -% my $column = $c->{field}; -% my @column = &{ $column_sub }(%$c, 'fieldnum' => 'MAGIC_NUMBER'); - - var column = <% include(@column, html_only=>1) |js_string %>; - column = column.replace( magic_regex, <%$field%>_fieldnum ); - - var column_label = document.createElement('TD'); - column_label.id = - '<% $field %>__<% $column %>_label' + <%$field%>_fieldnum; - - column_label.style.textAlign = "right"; - column_label.style.verticalAlign = "top"; - column_label.style.borderTop = "1px solid black"; - column_label.style.paddingTop = "5px"; - - column_label.innerHTML = '<% $c->{'label'} || '' %>'; - - row.appendChild(column_label); - - var column_widget = document.createElement('TD'); - - column_widget.style.borderTop = "1px solid black"; - column_widget.style.paddingTop = "3px"; - - column_widget.innerHTML = column; - - row.appendChild(column_widget); - -% } -% } - -% if ( $f->{'m2_new_js'} ) { - // take out items selected in previous dropdowns - var new_element = document.getElementById("<%$field%>" + <%$field%>_fieldnum ); - <% $f->{'m2_new_js'} %>(new_element); - - if ( new_element.length < 2 ) { - //just the ** Select new **, so don't display the row - row.style.display = 'none'; - } -% } - - } - - function remove_<%$field%>(remove_fieldnum) { - //alert("remove <%$field%> " + remove_fieldnum); - var select = document.getElementById('<%$field%>' + remove_fieldnum); - - if ( ! select ) { - alert("can't find element <%$field%>" + remove_fieldnum); - return; - } - -% my $warnings = $f->{'m2_remove_warnings'}; -% if ( $warnings ) { - var sel_value = select.options[select.selectedIndex].value; -% foreach my $value ( keys %$warnings ) { - if ( sel_value == '<% $value %>' ) { - if ( ! confirm( <% $warnings->{$value} |js_string %> ) ) { - return; - } - } -% } -% } - - select.disabled = 'disabled'; // this seems to prevent it from being submitted on tested browsers so far (IE, moz, konq at least) - var label_td = document.getElementById('<%$field%>_label' + remove_fieldnum ); - label_td.parentNode.style.display = 'none'; - -% if ( $f->{m2_remove_js} ) { - var opt = select.options[select.selectedIndex]; - <% $f->{m2_remove_js} %>( opt.value, opt.text, 'no_match'); -% } - - } - - </SCRIPT> - -% } - -% } - -<% ref( $opt{'html_table_bottom'} ) - ? &{ $opt{'html_table_bottom'} }( $object ) - : $opt{'html_table_bottom'} -%> - -</TABLE> - -<% ref( $opt{'html_bottom'} ) - ? &{ $opt{'html_bottom'} }( $object ) - : $opt{'html_bottom'} -%> - -<BR> - -<INPUT TYPE = "submit" - ID = "submit" - VALUE = "<% ( !$clone && $object->$pkey() ) - ? "Apply changes" - : "Add ". ( $opt{'name'} || $opt{'name_singular'} ) - %>" -> - -</FORM> - -<% ref( $opt{'html_foot'} ) - ? &{ $opt{'html_foot'} }( $object ) - : $opt{'html_foot'} -%> - -<% include("/elements/footer.html") %> -<%init> - -my(%opt) = @_; - -my $curuser = $FS::CurrentUser::CurrentUser; - -#false laziness w/process.html -my $table = $opt{'table'}; -my $class = "FS::$table"; -my $pkey = dbdef->table($table)->primary_key; #? $opt{'primary_key'} || -my $fields = $opt{'fields'} - #|| [ grep { $_ ne $pkey } dbdef->table($table)->columns ]; - || [ grep { $_ ne $pkey } fields($table) ]; -#my @actualfields = map { ref($_) ? $_->{'field'} : $_ } @$fields; - -if ( $cgi->param('redirect') ) { - my $session = $cgi->param('redirect'); - my $pref = $curuser->option("redirect$session"); - die "unknown redirect session $session\n" unless length($pref); - $cgi = new CGI($pref); -} - -&{$opt{'begin_callback'}}( $cgi, $fields, \%opt ) - if $opt{'begin_callback'}; - -my %qsearch = ( - 'table' => $table, - 'extra_sql' => ( $opt{'agent_virt'} - ? ' AND '. $curuser->agentnums_sql( - 'null_right' => $opt{'agent_null_right'} - ) - : '' - ), -); - -my $mode; -my $object; -my $clone = ''; -if ( $cgi->param('error') ) { - - $mode = 'error'; - - $object = $class->new( { - map { $_ => scalar($cgi->param($_)) } fields($table) - }); - - &{$opt{'error_callback'}}( $cgi, $object, $fields, \%opt ) - if $opt{'error_callback'}; - -} elsif ( $cgi->param('clone') =~ /^(\d+)$/ ) { - - $mode = 'clone'; - - $clone = $1; - - $qsearch{'extra_sql'} = ' AND '. $opt{'agent_clone_extra_sql'} - if $opt{'agent_clone_extra_sql'}; - - $object = qsearchs({ %qsearch, 'hashref' => { $pkey => $clone } }) - or die "$pkey $clone not found in $table"; - - &{$opt{'clone_callback'}}( $cgi, $object, $fields, \%opt ) - if $opt{'clone_callback'}; - - #$object->$pkey(''); - - $opt{action} ||= 'Add'; - -} elsif ( $cgi->keywords || $cgi->param($pkey) ) { #editing - - $mode = 'edit'; - - my $value; - if ( $cgi->param($pkey) ) { - $value = $cgi->param($pkey) - } else { - my( $query ) = $cgi->keywords; - $value = $query; - } - $value =~ /^(\d+)$/ or die "unparsable $pkey"; - $object = qsearchs({ %qsearch, 'hashref' => { $pkey => $1 } }) - or die "$pkey $1 not found in $table"; - - warn "$table $pkey => $1" - if $opt{'debug'}; - - &{$opt{'edit_callback'}}( $cgi, $object, $fields, \%opt ) - if $opt{'edit_callback'}; - -} else { #adding - - $mode = 'new'; - - my $hashref = $opt{'new_hashref_callback'} - ? &{$opt{'new_hashref_callback'}} - : {}; - - $object = $opt{'new_object_callback'} - ? &{$opt{'new_object_callback'}}( $cgi, $hashref, $fields, \%opt ) - : $class->new( $hashref ); - - &{$opt{'new_callback'}}( $cgi, $object, $fields, \%opt ) - if $opt{'new_callback'}; - -} - -&{$opt{'end_callback'}}( $cgi, $object, $fields, \%opt ) - if $opt{'end_callback'}; - -$opt{action} ||= $object->$pkey() ? 'Edit' : 'Add'; - -my $title = $opt{action}. ' '. ( $opt{name} || $opt{'name_singular'} ); - -my $viewall_url = $p . ( $opt{'viewall_dir'} || 'search' ) . "/$table.html"; -$viewall_url = $opt{'viewall_url'} if $opt{'viewall_url'}; - -my @menubar = (); -if ( $opt{'menubar'} ) { - @menubar = @{ $opt{'menubar'} }; -} else { - my $items = $opt{'name'} ? $opt{'name'}.'s' : PL($opt{'name_singular'}); - @menubar = ( - "View all $items" => $viewall_url, - ); -} - -</%init> |