From 4bbd2db7a016d9da19f1524895e3d04c3abf89a4 Mon Sep 17 00:00:00 2001 From: Jonathan Prykop Date: Fri, 20 Feb 2015 15:28:46 -0600 Subject: [PATCH] RT#23598: Feature Request - Email notice to A/R Report Results [now uses checkboxes and a proper popup] --- httemplate/elements/popup_link_onclick.html | 8 ++- httemplate/misc/email-customers.html | 16 +++++- httemplate/search/elements/checkbox-foot.html | 9 +++ .../search/elements/cust_main_dayranges.html | 65 +++++++++++++--------- httemplate/search/report_receivables.cgi | 2 +- 5 files changed, 68 insertions(+), 32 deletions(-) diff --git a/httemplate/elements/popup_link_onclick.html b/httemplate/elements/popup_link_onclick.html index 961f62336..5173115a5 100644 --- a/httemplate/elements/popup_link_onclick.html +++ b/httemplate/elements/popup_link_onclick.html @@ -8,6 +8,9 @@ Example: #required 'action' => 'content.html', # uri for content of popup + + #alternately, use instead of action + 'js_action' => 'url', # javascript variable or expression #strongly recommended 'actionlabel => 'You clicked', # popup title @@ -47,7 +50,8 @@ if (ref($_[0]) eq 'HASH') { $params = { @_ }; } -$action = $params->{'action'} if exists $params->{'action'}; +$action = q(') . $params->{'action'} . q(') if exists $params->{'action'}; +$action = $params->{'js_action'} if exists $params->{'js_action'}; $actionlabel = $params->{'actionlabel'} if exists $params->{'actionlabel'}; $width = $params->{'width'} if exists $params->{'width'}; $height = $params->{'height'} if exists $params->{'height'}; @@ -61,7 +65,7 @@ $scrolling = $params->{'scrolling'} if exists $params->{'scrolling'}; my $popup_name = 'popup-'.time. "-$$-". rand() * 2**32; my $onclick = - "overlib( OLiframeContent('$action', $width, $height, '$popup_name', 0, '$scrolling' ), ". + "overlib( OLiframeContent($action, $width, $height, '$popup_name', 0, '$scrolling' ), ". "CAPTION, '$actionlabel', STICKY, AUTOSTATUSCAP, MIDX, 0, MIDY, 0, ". "DRAGGABLE, CLOSECLICK, ". "BGCOLOR, '$color', CGCOLOR, '$color', CLOSETEXT, '$closetext'". diff --git a/httemplate/misc/email-customers.html b/httemplate/misc/email-customers.html index c74c15b1e..83e86158f 100644 --- a/httemplate/misc/email-customers.html +++ b/httemplate/misc/email-customers.html @@ -1,4 +1,9 @@ +% if ($popup) { +<% include('/elements/header-popup.html', $title) %> +% } else { <% include('/elements/header.html', $title) %> +% } +
@@ -7,6 +12,8 @@ %# multi-valued search params. We are no longer in search context, so we %# pack the search into a Storable string for later use. + + % if ( $cgi->param('action') eq 'send' ) { @@ -16,7 +23,7 @@ 'OneTrueForm', [ qw( search table from subject html_body text_body msgnum ) ], 'process/email-customers.html', - { 'message' => "Notice sent" }, #would be nice to show #, but.. + $pdest, ) %> @@ -159,13 +166,18 @@ my $conf = FS::Conf->new; my $table = $cgi->param('table') or die "'table' required"; my $agent_virt_agentnum = $cgi->param('agent_virt_agentnum') || ''; +my $popup = $cgi->param('popup'); +my $url = $cgi->param('url'); +my $pdest = { 'message' => "Notice sent" }; +$pdest->{'url'} = $cgi->param('url') if $url; + my %search; if ( $cgi->param('search') ) { %search = %{ thaw(decode_base64($cgi->param('search'))) }; } else { %search = $cgi->Vars; - delete $search{$_} for qw( action table from subject html_body text_body ); + delete $search{$_} for qw( action table from subject html_body text_body popup url ); # FS::$table->search is expected to know which parameters might be # multi-valued, and to accept scalar values for them also. No good # solution to this since CGI can't tell whether a parameter _might_ diff --git a/httemplate/search/elements/checkbox-foot.html b/httemplate/search/elements/checkbox-foot.html index cc4bac69b..c47009425 100644 --- a/httemplate/search/elements/checkbox-foot.html +++ b/httemplate/search/elements/checkbox-foot.html @@ -75,6 +75,15 @@ function setAll(setTo) { checkboxes[i].checked = setTo; } } +function toCGIString() { + var out = ''; + for (var i = 0; i < checkboxes.length; i++) { + if (checkboxes[i].checked) { + out += '&' + checkboxes[i].name + '=' + checkboxes[i].value; + } + } + return out; +} <%init> my %opt = @_; diff --git a/httemplate/search/elements/cust_main_dayranges.html b/httemplate/search/elements/cust_main_dayranges.html index 73a429f8a..e5b1f478c 100644 --- a/httemplate/search/elements/cust_main_dayranges.html +++ b/httemplate/search/elements/cust_main_dayranges.html @@ -21,6 +21,7 @@ Example: 'query' => $sql_query, 'count_query' => $count_sql, 'header' => [ + @act_blank, @cust_header, '0-30', '30-60', @@ -28,9 +29,9 @@ Example: '90+', emt('Total'), @pay_head, - @act_header, ], 'footer' => [ + @act_blank, 'Total', ( map '',( 1 .. $#cust_header ),), sprintf( $money_char.'%.2f', @@ -44,9 +45,9 @@ Example: sprintf( ''.$money_char.'%.2f', $row->{'rangecol_0_0'} ), ('') x @pay_labels, - @act_blank, ], 'fields' => [ + @act_fields, FS::UI::Web::cust_fields_subs(), format_rangecol('0_30'), format_rangecol('30_60'), @@ -54,9 +55,9 @@ Example: format_rangecol('90_0'), format_rangecol('0_0'), @pay_labels, - @act_fields, ], 'links' => [ + @act_blank, ( map { $_ ne 'Cust. Status' ? $clink : '' } @cust_header ), @@ -66,44 +67,41 @@ Example: '', '', @pay_links, - @act_blank, ], - 'link_onclicks' => [ ( map '', @cust_header ), - '', '', '', '', '', - ( map '', @pay_labels ), - @act_link_onclicks, - ], - 'align' => FS::UI::Web::cust_aligns(). + 'align' => $act_align. + FS::UI::Web::cust_aligns(). 'rrrrr'. ('c' x @pay_labels), - @act_align, - 'size' => [ ( map '', @cust_header ), + 'size' => [ + @act_blank, + ( map '', @cust_header ), #'-1', '', '', '', '', '', ], - '', '', '', '', '', '', + '', '', '', '', '', ( map '', @pay_labels ), + ], + 'style' => [ @act_blank, - ], - 'style' => [ FS::UI::Web::cust_styles(), + FS::UI::Web::cust_styles(), #'b', '', '', '', '', 'b', ], '', '', '', '', 'b', ( map '', @pay_labels ), - @act_blank, ], - 'xls_format' => [ (map '', FS::UI::Web::cust_styles), - '', '', '', '', { bold => 1 }, + 'xls_format' => [ @act_blank, + (map '', FS::UI::Web::cust_styles), + '', '', '', '', { bold => 1 }, ], 'color' => [ + @act_blank, FS::UI::Web::cust_colors(), '', '', '', '', '', - '', ( map '', @pay_labels ), - @act_blank, ], + 'html_foot' => $html_foot, %opt, &> <%init> @@ -250,16 +248,29 @@ if($opt{'payment_links'} && $curuser->access_right('Process payment') && @payby) @payby ); } -my (@act_header, @act_fields, @act_link_onclicks, @act_align, @act_blank); -if (delete($opt{'email_links'})) { - push @act_header, 'Actions'; - push @act_fields, sub { 'send email' }; - push @act_link_onclicks, sub { +my (@act_blank, @act_fields, $act_align, $html_foot); +if (delete($opt{'email_checkboxes'})) { + my $email_link = q!var url = toCGIString(); !; + $email_link .= q/if (!url) { alert('No customers selected'); return false; }; /; + $email_link .= q!url = '!; + $email_link .= "${p}misc/email-customers.html?table=cust_main"; + $email_link .= q!' + url + '&popup=1&url=javascript%3Awindow.top.location.reload%28%29%3B'; !; + $email_link .= include('/elements/popup_link_onclick.html', + 'js_action' => 'url', + 'actionlabel' => 'Send Customer Email', + 'width' => '900', + 'height' => '500', + ); + $html_foot = include('checkbox-foot.html', + label => 'Email selected customers', + onclick => $email_link, + ); + push @act_fields, sub { my $row = shift; my $custnum = $row->custnum; - return qq!window.open('${p}misc/email-customers.html?table=cust_main&custnum=$custnum','_blank')!; + qq!!; }; - push @act_align, 'l'; + $act_align = 'l'; push @act_blank, ''; } diff --git a/httemplate/search/report_receivables.cgi b/httemplate/search/report_receivables.cgi index bca2a057a..adbbc859c 100755 --- a/httemplate/search/report_receivables.cgi +++ b/httemplate/search/report_receivables.cgi @@ -2,7 +2,7 @@ 'title' => emt('Accounts Receivable Aging Summary'), 'range_sub' => \&balance, 'payment_links' => 1, - 'email_links' => 1, + 'email_checkboxes' => 1, &> <%init> -- 2.11.0