diff --git a/lib/NGCP/Panel/Controller/Invoice.pm b/lib/NGCP/Panel/Controller/Invoice.pm index 5144ad6293..f6ad62ff00 100644 --- a/lib/NGCP/Panel/Controller/Invoice.pm +++ b/lib/NGCP/Panel/Controller/Invoice.pm @@ -759,7 +759,7 @@ sub template_list :Chained('template_base') :PathPart('list') :Args(0) { my ($self, $c) = @_; $c->log->debug('template_list'); $c->forward( 'template_list_data' ); - $c->stash( template => 'invoice/template_list.tt' ); + $c->stash( template => 'invoice/template_list_alt.tt' ); $c->detach($c->view('SVG'));#just no wrapper - maybe there is some other way? } @@ -768,6 +768,14 @@ sub template :Chained('template_base') :PathPart('') :Args(0) { $c->forward('template_list_data'); $c->stash(template => 'invoice/template.tt'); } +sub template_alt :Chained('template_base') :PathPart('') :Args(1) { + my ($self, $c) = @_; + my $in={}; + (undef,undef,$in->{tt_id}) = @_; + #for form hidden too. And for template_view. + $c->stash(tt_id => $in->{tt_id}); + $c->stash(template => 'invoice/template_alt.tt'); +} sub template_view :Chained('template_base') :PathPart('view') :Args { my ($self, $c) = @_; @@ -780,6 +788,8 @@ sub template_view :Chained('template_base') :PathPart('view') :Args { #input (undef,undef,@$in{qw/tt_type tt_viewmode tt_sourcestate tt_output_type tt_id/}) = @_ ; $in->{provider_id} = $c->stash->{provider}->id; + $in->{tt_id} //= $c->request->parameters->{tt_id}; + $in->{tt_id} //= $c->stash->{tt_id}; #$in->{client_id} = ; $in->{tt_string} = $c->request->body_parameters->{template} || ''; foreach(qw/name is_active/){$in->{$_} = $c->request->parameters->{$_};} diff --git a/lib/NGCP/Panel/Controller/Reseller.pm b/lib/NGCP/Panel/Controller/Reseller.pm index a7cc59f020..f60d207c2f 100644 --- a/lib/NGCP/Panel/Controller/Reseller.pm +++ b/lib/NGCP/Panel/Controller/Reseller.pm @@ -314,7 +314,11 @@ sub _handle_reseller_status_change { sub details :Chained('base') :PathPart('details') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) { my ($self, $c) = @_; + + $c->stash(provider => $c->stash->{reseller}->first); #didn't find a way to make it correct with chain + $c->forward('/invoice/template_list_data'); + $c->stash(template => 'reseller/details.tt'); return; } diff --git a/lib/NGCP/Panel/Utils/InvoiceTemplate.pm b/lib/NGCP/Panel/Utils/InvoiceTemplate.pm index 11b9b77d01..ef2863f7cd 100644 --- a/lib/NGCP/Panel/Utils/InvoiceTemplate.pm +++ b/lib/NGCP/Panel/Utils/InvoiceTemplate.pm @@ -74,7 +74,8 @@ sub convertSvg2Pdf{ binmode B; local $/ = undef; $out->{tt_string_pdf} = ; - close B; + $c->log->error("Pipe: close: !=$!; ?=$?;"); + close B or ($? == 0 ) or $c->log->error("Error closing rsvg pipe: close: $!;"); } } sub preprocessInvoiceTemplateSvg{ diff --git a/share/static/js/invoice_template.js b/share/static/js/invoice_template.js index 430ae66d43..51dc483da0 100644 --- a/share/static/js/invoice_template.js +++ b/share/static/js/invoice_template.js @@ -1,5 +1,9 @@ //constructor var svgCanvasEmbed = null; +var svgEditor = null; +function setNoSaveWarning(){ + svgCanvasEmbed.frame.contentWindow.svgCanvas.undoMgr.resetUndoStack(); +} function init_embed() { var svgEditFrameName = 'svgedit'; var frame = document.getElementById(svgEditFrameName); @@ -12,6 +16,7 @@ function init_embed() { } var mainButton = doc.getElementById('main_button'); mainButton.style.display = 'none'; + svgEditor = frame.contentWindow.svgEditor; } //private function getSvgString(){ @@ -24,12 +29,16 @@ function setSvgStringToEditor( svgParsedString ){ if(error){ }else{ svgCanvasEmbed.zoomChanged('', 'canvas'); + setNoSaveWarning(); } } ); } function setSvgStringToPreview( svgParsedString, q, data ) { - var previewIframe = document.getElementById('svgpreview'); + var previewIframe = document.getElementById('svgpreview'); + if(!previewIframe){ + return; + } //alert('setSvgStringToPreview: svgParsedString='+svgParsedString+';data='+data+';'); if ($.browser.msie) { //we need to repeat query to server for msie if we don't want send template string via GET method @@ -109,7 +118,7 @@ function clearTemplateForm(data){ data.tt_sourcestate = 'default'; fetchInvoiceTemplateData(data, 1);//1 = no show form again, just clear it up to default state } -function savePreviewedAndShowParsed( data ){ +function savePreviewed( data, callback ){ var svgString = getSvgString(); var q = uriForAction( data, 'template_previewed' ); //alert('savePreviewedAndShowParsed: svgString='+svgString+'; q='+q+';'); @@ -119,14 +128,43 @@ function savePreviewedAndShowParsed( data ){ $.post( q, { template: svgString } ) .done( function( httpResponse ){ // & show template - //alert('savePreviewedAndShowParsed: httpResponse='+httpResponse+';'); - setSvgStringToPreview( httpResponse, q, data ) + //alert('savePreviewed: httpResponse='+httpResponse+';'); + //alert('savePreviewed: callback='+callback+'; typeof='+(typeof callback)+';'); + + //setSvgStringToPreview( httpResponse, q, data ) + + if(typeof callback == 'function'){ + //alert('savePreviewed.1: callback='+callback+'; typeof='+(typeof callback)+';'); + callback(httpResponse, q, data); + }else{ + eval(callback); + } + //$('#load_previewed_control').css('display', 'inline' ); //refresh list after saving - there is nothin that can be cahnged in templates list after preview refresh //refreshAjaxList( 'template', data ); } ); } -function saveTemplate( data ) { +function savePreviewedAndShowParsed( data ){ + savePreviewed(data, setSvgStringToPreview ); + //var svgString = getSvgString(); + //var q = uriForAction( data, 'template_previewed' ); + ////alert('savePreviewedAndShowParsed: svgString='+svgString+'; q='+q+';'); + ////alert('savePreviewedAndShowParsed: q='+q+';'); + ////save + //q=formToUri(q); + //$.post( q, { template: svgString } ) + //.done( function( httpResponse ){ + // // & show template + // //alert('savePreviewedAndShowParsed: httpResponse='+httpResponse+';'); + // setSvgStringToPreview( httpResponse, q, data ) + // //$('#load_previewed_control').css('display', 'inline' ); + // //refresh list after saving - there is nothin that can be cahnged in templates list after preview refresh + // //refreshAjaxList( 'template', data ); + //} ); +} + +function saveTemplate( data, callback ) { var svgString = getSvgString(); data.tt_sourcestate='saved'; data.tt_output_type = 'json'; @@ -143,6 +181,13 @@ function saveTemplate( data ) { $('form[name=template_editor]').loadJSON(jsonResponse.aaData.form); } $('#load_saved_control').css('display', 'inline' ); + if(typeof callback == 'function'){ + //alert('saveTemplate.1: callback='+callback+'; typeof='+(typeof callback)+';'); + callback(jsonResponse, q, data); + }else{ + eval(callback); + } + setNoSaveWarning(); //refreshAjaxList( 'template', data ); }); } diff --git a/share/templates/helpers/modal.tt b/share/templates/helpers/modal.tt index 43f75e7fe6..35e2a34190 100644 --- a/share/templates/helpers/modal.tt +++ b/share/templates/helpers/modal.tt @@ -28,7 +28,7 @@ [% MACRO modal_script BLOCK %] + + + + + +[%PROCESS "invoice/uri_wrapper_js.tt"%] + + +
+ + [% c.loc('Back') %] + + + + [% c.loc('Invoices')%] + +
+ +[% IF reseller.first.status != "active" -%] + [%messages.unshift( c.loc('Reseller is [_1]', reseller.first.status) ); %] +[% END -%] +
+[%PROCESS 'helpers/ajax_messages.tt' -%] +
+ + +
+[% back_created = 1 -%] + + +
+[%PROCESS 'invoice/template_editor_form_alt.tt' %] +
diff --git a/share/templates/invoice/template_editor_form_alt.tt b/share/templates/invoice/template_editor_form_alt.tt new file mode 100644 index 0000000000..ab54110c8b --- /dev/null +++ b/share/templates/invoice/template_editor_form_alt.tt @@ -0,0 +1,106 @@ +[%# USE FillInForm %] + +
+ + + + [% c.loc('Preview')%] + + + [% c.loc('Discard Changes')%] + + + [% c.loc('Save template')%] + +[%IF viewmode == 'development' %] +
+ + [% c.loc('Load default')%] + + + +
+ + [% c.loc('Previewed SVG')%] + + + [% c.loc('Saved SVG')%] + + + [% c.loc('Saved PDF')%] + +[%END%] +[%initial = 'saved'%] +
+ + +
\ No newline at end of file diff --git a/share/templates/invoice/template_list_alt.tt b/share/templates/invoice/template_list_alt.tt new file mode 100644 index 0000000000..ac4539bba2 --- /dev/null +++ b/share/templates/invoice/template_list_alt.tt @@ -0,0 +1,54 @@ +[% USE Dumper %] +[% USE format %] +[% money_format = format('%.2f') %] +[% IF !c.user.read_only && (c.user.roles == 'admin' || c.user.roles == 'reseller') -%] +[% write_access = 1 %] +[%END%] + +[%IF template_list.size %] + + + + + + + + + + + + [% FOR template IN template_list -%] + [%# Dumper.dump_html(template_list.as_query)%] + [%# Dumper.dump_html(template)%] + + + + + + + + [%END%] + +
[% c.loc('Active') %][% c.loc('Id') %][% c.loc('Name') %][% c.loc('Type') %]
[%IF template.get_column('is_active') > 0; '✓'; END%][% template.get_column('id') %][% template.get_column('name') %][% template.get_column('type') %] + +
+[%END%] + + \ No newline at end of file diff --git a/share/templates/invoice/uri_wrapper_js.tt b/share/templates/invoice/uri_wrapper_js.tt new file mode 100644 index 0000000000..4a607dd754 --- /dev/null +++ b/share/templates/invoice/uri_wrapper_js.tt @@ -0,0 +1,38 @@ + diff --git a/share/templates/reseller/details.tt b/share/templates/reseller/details.tt index 080485d5bd..94bbb35f00 100644 --- a/share/templates/reseller/details.tt +++ b/share/templates/reseller/details.tt @@ -4,9 +4,6 @@ [% c.loc('Back') %] - - [% c.loc('Invoice Template')%] - [% c.loc('Invoices')%] @@ -273,6 +270,37 @@ +[% IF branding_edit_flag != 1 -%] + +[%PROCESS 'helpers/modal.tt' -%] +[%mf_helper = { + ajax_load => 1, + ajax_list_refresh => 'template', + }%] +[%modal_script( m = mf_helper )%] +[%END%] + + + +[%PROCESS "invoice/uri_wrapper_js.tt"%] +
+ +
+
+ [% c.loc('Create invoices template')%] +
+
+[%PROCESS 'invoice/template_list_alt.tt' %] +
+
+
+ + + + +
[% IF branding_edit_flag == 1 -%]