X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=httemplate%2Fedit%2Felements%2Fedit.html;h=f5698d98ec0ce59c10b675eb41892f2ee61897b3;hb=41d0660124cf3965a4a2b4706d02e382ac4cbf01;hp=c2ea22f276fa0f7ececb4f839e85faa221f2513b;hpb=6e3477c3068b88ad702316cd2d57e04c52de5855;p=freeside.git
diff --git a/httemplate/edit/elements/edit.html b/httemplate/edit/elements/edit.html
index c2ea22f27..f5698d98e 100644
--- a/httemplate/edit/elements/edit.html
+++ b/httemplate/edit/elements/edit.html
@@ -1,204 +1,712 @@
-%
-%
-% # options example...
-% #
-% # 'name' =>
-% # '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
-% # #checkbox
-% # #select
-% # #hidden - hidden value from object
-% # #fixed - display fixed value from here
-% # #fixedhidden - hidden value from here
-% # 'value' => 'Y', #for checkbox, fixed, fixedhidden
-% # },
-% # ]
-% #
-% # 'menubar' => '', #menubar arrayref
-% #
-% # #run when re-displaying with an error
-% # 'error_callback' => sub { my( $cgi, $object ) = @_; },
-% #
-% # #run when editing
-% # 'edit_callback' => sub { my( $cgi, $object ) = @_; },
-% #
-% # # returns a hashref for the new object
-% # 'new_hashref_callback'
-% #
-% # #run when adding
-% # 'new_callback' => sub { my( $cgi, $object ) = @_; },
-% #
-% # #XXX describe
-% # 'field_callback' => sub { },
-% #
-% # #string or coderef of additional HTML to add before
-% # 'html_table_bottom' => '',
-% #
-% # 'viewall_dir' => '', #'search' or 'browse', defaults to 'search'
-% #
-% # 'html_bottom' => '', #string
-% # 'html_bottom' => sub {
-% # my $object = shift;
-% # # ...
-% # "html_string";
-% # },
-%
-% my(%opt) = @_;
-%
-% #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;
-%
-% my $object;
-% if ( $cgi->param('error') ) {
-%
-% $object = $class->new( {
-% map { $_ => scalar($cgi->param($_)) } fields($table)
-% });
-%
-% &{$opt{'error_callback'}}($cgi, $object)
-% if $opt{'error_callback'};
-%
-% } elsif ( $cgi->keywords || $cgi->param($pkey) ) { #editing
-%
-% my( $query ) = $cgi->keywords;
-% $query = $cgi->param($pkey) unless $query;
-% $query =~ /^(\d+)$/;
-% $object = qsearchs( $table, { $pkey => $1 } );
-% warn "$table $pkey => $1"
-% if $opt{'debug'};
-%
-% &{$opt{'edit_callback'}}($cgi, $object)
-% if $opt{'edit_callback'};
-%
-% } else { #adding
-%
-% my $hashref = $opt{'new_hashref_callback'}
-% ? &{$opt{'new_hashref_callback'}}
-% : {};
-%
-% $object = $class->new( $hashref );
-%
-% &{$opt{'new_callback'}}($cgi, $object)
-% if $opt{'new_callback'};
-%
-% }
-%
-% my $action = $object->$pkey() ? 'Edit' : 'Add';
-%
-% my $title = "$action $opt{'name'}";
-%
-% 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 {
-% @menubar = (
-% 'Main menu' => $p, #eventually get rid of this when the ACL/UI update is done
-% #eventually use Lingua::bs to pluralize
-% "View all $opt{'name'}s" => $viewall_url,
-% );
-% }
-%
-%
-<% include("/elements/header.html", $title,
- include( '/elements/menubar.html', @menubar )
+<%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
+ 'html_table_bottom' => '',
+
+ #after 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'},
)
%>
-% if ( $cgi->param('error') ) {
- Error: <% $cgi->param('error') %>
-
-% }
+<% 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";
+