Example:
- include( 'elements/edit.html',
+ <& elements/edit.html,
'name_singular' => #singular name for the record
# (preferred, will be pluralized automatically)
'name' => #name for the record
'disabled' => 0,
'onchange' => 'javascript_function',
+ 'include_opt_callback' => sub { my $object = @_;
+ ( 'option' => 'value', );
+ },
+
'm2name_table' => 'table_name',
'm2name_namecol' => 'name_column',
#OR#
#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
#we're in a popup (no title/menu/searchboxes)
'popup' => 1,
+ #we're embedded (rows only: no header at all, no html_init, no error
+ # display, no <FORM>, no hidden fields for table name or primary key, no
+ # display of primary key, no submit button, no html_foot, no footer)
+ 'embed' => $object, #need to pass the object
+
+ #don't show the primary key label and value
+ 'no_pkey_display' => 1,
+
###
# HTML callbacks
###
"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' => '',
#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'},
- )
-%>
+% unless ( $opt{embed} ) {
+%
+% 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,
+% );
+% }
-<% defined($opt{'html_init'})
- ? ( ref($opt{'html_init'})
- ? &{$opt{'html_init'}}()
- : $opt{'html_init'}
- )
- : ''
-%>
+ <% include('/elements/header'. ( $opt{popup} ? '-popup' : '' ). '.html',
+ $title,
+ include( '/elements/menubar.html', @menubar ),
+ $opt{'body_etc'},
+ )
+ %>
-<% include('/elements/error.html') %>
+ <% 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 ACTION="<% $url %>" METHOD=POST NAME="edit_topform">
+ <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() %>">
+ <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)" %>
+% unless ( $opt{'no_pkey_display'} ) {
+
+ <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>
% #text and derivitives
% 'size' => $f->{'size'},
% 'maxlength' => $f->{'maxlength'},
+% 'prefix' => $f->{'prefix'},
+% 'postfix' => $f->{'postfix'},
+%
+% #textarea
+% 'rows' => $f->{'rows'},
+% 'cols' => $f->{'cols'},
%
% #checkbox, title, fixed, hidden
% #& deprecated weird value hashref used only by reason.html
% 'value' => $f->{'value'},
%
+% #fixed
+% 'noescape' => $f->{'noescape'},
+%
% #select(-*)
% 'options' => $f->{'options'},
% 'labels' => $f->{'labels'},
% 'multiple' => $f->{'multiple'},
+% 'label_showkey' => $f->{'label_showkey'},
% 'disable_empty' => $f->{'disable_empty'},
% #select-reason
% 'reason_class' => $f->{'reason_class'},
%
% #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);
+% 'fixed' => $f->{'fixed'},
%
-% #select-*
-% $include_common{$_} = $f->{$_}
-% foreach grep exists($f->{$_}), qw( empty_label );
-%
-% #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 );
+% #any?
+% 'colspan' => $f->{'colspan'},
+% 'required' => $f->{'required'},
+% );
%
-% #*-table
-% $include_common{$_} = $f->{$_}
-% foreach grep exists($f->{$_}), qw( hashref agent_virt agent_null_right );
+% $include_common{$_} = $f->{$_} foreach grep exists($f->{$_}),
+% qw( js_only html_only select_only layers_only cell_style ),#selectlayers,?
+% qw( empty_label ), # select-*
+% qw( value_col compare_sub order_by ), # select-table
+% qw( table name_col ), #(select,checkboxes)-table
+% qw( target_table link_table ), #checkboxes-table
+% qw( hashref agent_virt agent_null agent_null_right ),#*-table
+% qw( formatted_value ), #fixed
+% qw( country ), #select-country
+% qw( width height config ), #htmlarea
+% qw( alt_format ), #select-cust_location
+% qw( classnum ), # select-inventory_item
+% ;
+%
+% #select-table
+% $include_common{$_} = ref( $f->{$_} ) eq 'CODE'
+% ? &{ $f->{$_} }( $cgi, $object ) #, $f )
+% : $f->{$_}
+% foreach grep exists($f->{$_}), qw( extra_sql );
%
% 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 {
% %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;
% };
%
% $g_row = 1 if $type eq 'tablebreak-tr-title';
% $g_row++;
% $g_row++ if $type eq 'title';
+% $g_row += scalar( @{ $f->{options} } )-1 if $type eq 'radio';
% } else {
% if ( $type eq 'columnstart' ) {
% push @g_row_stack, $g_row;
% }
% warn "layer values: ". Dumper($layer_values)
% if $opt{'debug'};
-%
+%
% my @existing = &{ $include_sub }(
% 'label' => $ex_label,
% 'fieldnum' => $fieldnum,
// only spawn if we're the last element... return if not
- var field_regex = /(\d+)(_[a-z]+)?$/;
+ var field_regex = /(\d+)(_[a-z_]+)?$/;
var match = field_regex.exec(what.name);
if ( !match ) {
- alert(what.name + " didn't match?!");
+ alert(what.name + " didn't match for " + what);
return;
}
if ( match[1] != <%$field%>_fieldnum ) {
var newrow = <% include(@layer_opt, html_only=>1) |js_string %>;
-% if ( $type eq 'selectlayers' ) { #until the rest have html/js_only
- var newfunc = <% include(@layer_opt, js_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 = '';
% }
: $opt{'html_bottom'}
%>
-<BR>
+% unless ($opt{'embed'}) {
-<INPUT TYPE="submit" ID="submit" VALUE="<% ( !$clone && $object->$pkey() ) ? "Apply changes" : "Add ". ( $opt{'name'} || $opt{'name_singular'} ) %>">
+ <BR>
-</FORM>
+% unless ($opt{'no_submit'}) {
+ <INPUT TYPE = "submit"
+ ID = "submit"
+ VALUE = "<% ( !$clone && $object->$pkey() )
+ ? "Apply changes"
+ : "Add ". ($opt{'name'} || $opt{'name_singular'})
+ %>"
+ >
+% }
-<% ref( $opt{'html_foot'} )
- ? &{ $opt{'html_foot'} }( $object )
- : $opt{'html_foot'}
-%>
+ </FORM>
+
+ <% ref( $opt{'html_foot'} )
+ ? &{ $opt{'html_foot'} }( $object )
+ : $opt{'html_foot'}
+ %>
-<% include("/elements/footer.html") %>
+ <% include("/elements/footer.html") %>
+
+% }
<%init>
my(%opt) = @_;
|| [ 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( $mode, $object);
my $clone = '';
-if ( $cgi->param('error') ) {
+if ( $opt{'embed'} ) {
- $mode = 'error';
+ $object = $opt{'embed'};
+ $mode = $cgi->param('error')
+ ? 'error'
+ : $object->$pkey()
+ ? 'edit'
+ : 'new';
- $object = $class->new( {
- map { $_ => scalar($cgi->param($_)) } fields($table)
- });
+} else {
- &{$opt{'error_callback'}}( $cgi, $object, $fields, \%opt )
- if $opt{'error_callback'};
+ #$m->comp('/elements/handle_uri_query');
+ 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);
+ }
-} elsif ( $cgi->param('clone') =~ /^(\d+)$/ ) {
+ &{$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'}
+ )
+ : ''
+ ),
+ );
- $mode = 'clone';
+ if ( $cgi->param('error') ) {
- $clone = $1;
+ $mode = 'error';
- $qsearch{'extra_sql'} = ' AND '. $opt{'agent_clone_extra_sql'}
- if $opt{'agent_clone_extra_sql'};
+ $object = $class->new( {
+ map { $_ => scalar($cgi->param($_)) } fields($table)
+ });
- $object = qsearchs({ %qsearch, 'hashref' => { $pkey => $clone } })
- or die "$pkey $clone not found in $table";
+ &{$opt{'error_callback'}}( $cgi, $object, $fields, \%opt )
+ if $opt{'error_callback'};
- &{$opt{'clone_callback'}}( $cgi, $object, $fields, \%opt )
- if $opt{'clone_callback'};
+ } elsif ( $cgi->param('clone') =~ /^(\d+)$/ ) {
- #$object->$pkey('');
+ $mode = 'clone';
- $opt{action} ||= 'Add';
+ $clone = $1;
-} elsif ( $cgi->keywords || $cgi->param($pkey) ) { #editing
+ $qsearch{'extra_sql'} = ' AND '. $opt{'agent_clone_extra_sql'}
+ if $opt{'agent_clone_extra_sql'};
- $mode = 'edit';
+ $object = qsearchs({ %qsearch, 'hashref' => { $pkey => $clone } })
+ or die "$pkey $clone not found in $table";
- 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{'clone_callback'}}( $cgi, $object, $fields, \%opt )
+ if $opt{'clone_callback'};
- &{$opt{'edit_callback'}}( $cgi, $object, $fields, \%opt )
- if $opt{'edit_callback'};
+ #$object->$pkey('');
-} else { #adding
+ $opt{action} ||= 'Add';
- $mode = 'new';
+ } elsif ( $cgi->keywords || $cgi->param($pkey) ) { #editing
- my $hashref = $opt{'new_hashref_callback'}
- ? &{$opt{'new_hashref_callback'}}
- : {};
+ $mode = 'edit';
- $object = $opt{'new_object_callback'}
- ? &{$opt{'new_object_callback'}}( $cgi, $hashref, $fields, \%opt )
- : $class->new( $hashref );
+ 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";
- &{$opt{'new_callback'}}( $cgi, $object, $fields, \%opt )
- if $opt{'new_callback'};
+ warn "$table $pkey => $1"
+ if $opt{'debug'};
-}
+ &{$opt{'edit_callback'}}( $cgi, $object, $fields, \%opt )
+ if $opt{'edit_callback'};
-&{$opt{'end_callback'}}( $cgi, $object, $fields, \%opt )
- if $opt{'end_callback'};
+ } else { #adding
-$opt{action} ||= $object->$pkey() ? 'Edit' : 'Add';
+ $mode = 'new';
-my $title = $opt{action}. ' '. ( $opt{name} || $opt{'name_singular'} );
+ my $hashref = $opt{'new_hashref_callback'}
+ ? &{$opt{'new_hashref_callback'}}
+ : {};
-my $viewall_url = $p . ( $opt{'viewall_dir'} || 'search' ) . "/$table.html";
-$viewall_url = $opt{'viewall_url'} if $opt{'viewall_url'};
+ $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 @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>