<& elements/edit.html, 'body_etc' => $body_etc, 'name_singular' => 'invoice configuration', 'table' => 'invoice_conf', 'viewall_dir' => 'browse', 'fields' => \@fields, 'labels' => \%labels, 'new_callback' => \&new_callback, 'edit_callback' => \&edit_callback, 'error_callback' => \&error_callback, 'html_init' => \&html_init, 'html_table_bottom' => \&html_table_bottom, 'html_bottom' => '', # close tablebreak-tabs &> <%init> my $curuser = $FS::CurrentUser::CurrentUser; # ??? die "access denied" unless $curuser->access_right([ 'Edit templates', 'Edit global templates' ]); my $body_etc = ''; $body_etc = q!onload="document.getElementById('locale').onchange()"! if $cgi->param('locale') eq 'new'; my $modenum = $cgi->param('modenum'); my $mode = $modenum ? qsearchs('invoice_mode', { modenum => $modenum }) : ''; my %textarea = (type => 'textarea', rows => 10, cols => 40); my @fields = ( { field => 'modenum', type => 'hidden' }, { field => 'agentnum', type => 'select-agent', }, { field => 'modename', size=>60, }, { type => 'tablebreak-tabs', include_opt_callback => \&menubar_opt_callback, }, { field => 'locale', type => 'hidden' }, { field => 'notice_name', size=>60, }, { field => 'subject', size=>60, }, { field => 'lpr', size=>60, }, { type => 'columnstart', aligned => 1 }, { type => 'title', value => '
' }, map ( { +{ type => 'justtitle', value => $_ } } 'Notes', 'Footer', 'Summary header', 'Return address', 'Watermark', 'Small footer', 'Enable coupon', ), { type => 'columnnext' }, { type => 'title', value => 'LaTeX' }, { field => 'latexnotes', %textarea }, { field => 'latexfooter', %textarea }, { field => 'latexsummary', %textarea }, { field => 'latexreturnaddress', %textarea }, { field => 'latexwatermark', %textarea }, { field => 'latexsmallfooter', %textarea }, { field => 'with_latexcoupon', type => 'checkbox', value => 'Y' }, { type => 'columnnext' }, { type => 'title', value => 'HTML' }, { field => 'htmlnotes', %textarea }, #htmlarea? { field => 'htmlfooter', %textarea }, { field => 'htmlsummary', %textarea }, { field => 'htmlreturnaddress', %textarea }, { field => 'htmlwatermark', %textarea }, # logo { type => 'columnend' }, ); my %labels = ( 'confnum' => 'Configuration', 'locale' => 'Locale', 'agentnum' => 'Agent', 'modename' => 'Mode name', 'notice_name' => 'Notice name', 'subject' => 'Email Subject: header', 'lpr' => 'Alternate lpr command', map { $_ => '' } (qw( latexnotes latexfooter latexsummary latexreturnaddress latexwatermark with_latexcoupon latexsmallfooter htmlnotes htmlfooter htmlsummary htmlreturnaddress htmlwatermark ) ), ); sub get_invoice_mode { # because we can't quite use agent_virt here my $modenum = shift; qsearchs({ 'table' => 'invoice_mode', 'hashref' => { 'modenum' => $modenum }, 'extra_sql' => ' AND '. $FS::CurrentUser::CurrentUser->agentnums_sql( 'null_right' => 'Edit global templates', 'viewall_right' => 'Edit global templates' ), }); }; sub error_callback { my ($cgi, $object) = @_; foreach (qw(modename agentnum)) { $object->set($_, $cgi->param($_)); } if ($object->confnum) { return edit_callback(@_); } else { return new_callback(@_); } } sub new_callback { my ($cgi, $object, $fields_arrayref, $opt_hashref) = @_; my $modenum; if ( $cgi->param('locale') =~ /^(\w+)$/ ) { $object->set('locale' => $1); } if ( $cgi->param('modenum') =~ /^(\d+)$/ ) { $modenum = $1; # we're adding a locale to an existing mode $object->set('modenum' => $modenum); my $invoice_mode = get_invoice_mode($modenum) or die "invoice mode $modenum not found"; $object->set('modename', $invoice_mode->modename); $object->set('agentnum', $invoice_mode->agentnum); # also, need to select a locale # make a list of available locales my %existing_locales = map { $_->locale } qsearch('invoice_conf', { modenum => $modenum }); my @locales = grep { !exists($existing_locales{$_}) } FS::Conf->new->config('available-locales'); my %labels; foreach (@locales) { my %info = FS::Locales->locale_info($_); $labels{$_} = $info{'label'}; } unshift @locales, 'new'; $labels{'new'} = 'Select language'; # insert a field def my $i = 0; $i++ until ( $fields_arrayref->[$i]->{'field'} eq 'locale' ); my $locale_field = $fields_arrayref->[$i]; my $onchange_locale = "document.getElementById('submit').disabled = (this.options[this.selectedIndex].value == 'new');"; %$locale_field = ( field => 'locale', type => 'select', options => \@locales, labels => \%labels, curr_value => 'new', onchange => $onchange_locale, ); } # otherwise it's a completely new mode, so the locale is default } sub edit_callback { # massive false laziness with msg_template UI my ($cgi, $object, $fields_arrayref, $opt_hashref) = @_; # a little different here in that we treat the content object # as "primary" (this is edit/invoice_conf.html, etc.) # so all we need from the invoice_mode is its name # (and agent identity) my $modenum = $object->modenum; my $invoice_mode = get_invoice_mode($modenum) or die "invoice mode $modenum not found"; $object->set('modename', $invoice_mode->modename); $object->set('agentnum', $invoice_mode->agentnum); } sub menubar_opt_callback { my $object = shift; my $modenum = $object->modenum or return; my (@tabs, @options, %labels); my $display_new = 0; my $selected = ''; foreach my $l ('', FS::Conf->new->config('available-locales')) { my $invoice_conf = qsearchs('invoice_conf', { modenum => $modenum, locale => $l }); if ( $invoice_conf ) { my %info = FS::Locales->locale_info($l) if $l; my $label = $info{'label'} || mt('Default'); push @tabs, $label, $invoice_conf->confnum; $selected = $label if $object->locale eq $l; } else { $display_new = 1; # there is at least one unused locale left } } push @tabs, mt('New'), "modenum=$modenum;locale=new" if $display_new; $selected = mt('New') if $object->locale eq 'new'; $selected ||= mt('Default'); ( 'url_base' => $cgi->url() . '?', 'selected' => $selected, 'tabs' => \@tabs ); } sub html_init { q! ! } sub html_table_bottom { my $object = shift; my $locale = ''; my $modenum = ''; if ($object->locale =~ /^(\w+)$/) { $locale = $1; } if ($object->modenum =~ /^(\d+)$/) { $modenum = $1; } my $html; my $show_delete = 1; # don't allow the default locale to be removed unless it's the last one # in the mode $show_delete = 0 if ( $locale eq 'new' or $modenum eq '' or ($locale eq '' and FS::invoice_conf->count("modenum = $modenum and locale is not null") > 0 ) ); if ( $show_delete ) { # set up a delete link my $confnum = $object->confnum; my $url = $p."misc/delete-invoice_conf.html?$confnum"; my $link = qq!! . 'Delete this configuration' . ''; $html = qq! $link !; } $html; }