MT#5879 Save wokring interface, but with alerts.

ipeshinskaya/InvoiceTemplate5
Irina Peshinskaya 11 years ago committed by Victor Seva
parent 9aa35efdc9
commit f877c908a6

@ -452,7 +452,6 @@ sub invoice_details :Chained('base') :PathPart('invoice') :CaptureArgs(0) {
$invoice_details = [map{[$i++,$_]} (@$invoice_details) x 21];
$c->stash( invoice_details => $invoice_details );
$c->stash( invoice_details_raw => $invoice_details_raw );
#$c->stash( invoice_template_form => $form );
}
sub invoice_details_ajax :Chained('base') :PathPart('invoice/details/ajax') :Args(0) {
my ($self, $c) = @_;
@ -466,7 +465,7 @@ sub invoice_details_ajax :Chained('base') :PathPart('invoice/details/ajax') :Arg
NGCP::Panel::Utils::Datatables::process($c, $c->stash->{invoice_details_raw}, $dt_columns );
$c->detach( $c->view("JSON") );
}
sub invoice_template_form :Chained('base') :PathPart('invoice/template/form') :Args(0) {
sub invoice_template_info :Chained('base') :PathPart('invoice/template/info') :Args(0) {
my ($self, $c) = @_;
$c->log->debug($c->action);
my($validator,$backend,$in,$out);
@ -492,8 +491,8 @@ sub invoice_template_form :Chained('base') :PathPart('invoice/template/form') :A
$validator->remove_undef_in($in);
#need to think how to automate it - maybe through form showing param through args? what about args for uri_for_action?
#join('/',$c->controller,$c->action)
$validator->action( $c->uri_for_action('reseller/invoice_template_form',[$in->{contract_id}]) );
$validator->name( 'invoice_template' );#from parameters
$validator->action( $c->uri_for_action('reseller/invoice_template_info',[$in->{contract_id}]) );
$validator->name( 'invoice_template_info' );#from parameters
#my $posted = 0;
my $posted = exists $in->{submitid};
$c->log->debug("posted=$posted;");
@ -506,7 +505,6 @@ sub invoice_template_form :Chained('base') :PathPart('invoice/template/form') :A
);
my $in_validated = $validator->fif;
if($posted){
#$c->forward('invoice_template_save');
if($validator->validated) {
try {
$backend->storeInvoiceTemplateInfo(%$in_validated);
@ -532,7 +530,7 @@ sub invoice_template_form :Chained('base') :PathPart('invoice/template/form') :A
$c->stash( m => {create_flag => !$in->{tt_id}} );
$c->stash( form => $validator );
#$c->stash( template => 'helpers/ajax_form_modal.tt' );
$c->stash( template => 'invoice/invoice_template_form_modal.tt' );
$c->stash( template => 'invoice/invoice_template_info_form.tt' );
$c->response->headers->header( 'X-Form-Status' => 'error' );
}
}else{
@ -541,7 +539,7 @@ sub invoice_template_form :Chained('base') :PathPart('invoice/template/form') :A
$c->stash( m => {create_flag => !$in->{tt_id}} );
$c->stash( form => $validator );
#$c->stash( template => 'helpers/ajax_form_modal.tt' );
$c->stash( template => 'invoice/invoice_template_form_modal.tt' );
$c->stash( template => 'invoice/invoice_template_info_form.tt' );
}
$c->detach( $c->view("SVG") );#to the sake of nowrapper
}
@ -743,6 +741,7 @@ sub invoice_template :Chained('invoice_details') :PathPart('template') :Args {
$out->{json} = {
tt_data => {
tt_id => $out->{tt_data}->get_column('id'),
base64_previewed => ( $out->{tt_data}->get_column('base64_previewed') ? 1 : 0),
},
};
foreach(qw/name is_active/){

@ -92,8 +92,8 @@ sub storeCustomerInvoiceTemplate{
$tt_record_created = $self->schema->resultset('invoice_templates')->create({
reseller_id => $contract_id,
type => $tt_type,
is_active => $is_active,
name => $name,
# is_active => $is_active,
# name => $name,
'base64_'.$tt_sourcestate => $$tt_string,
});
if($tt_record_created){
@ -103,14 +103,14 @@ sub storeCustomerInvoiceTemplate{
my $conditions = $self->getDefaultConditions(\%params);
$tt_record_updated = $self->schema->resultset('invoice_templates')->search($conditions);
$tt_record_updated->update({
is_active => $is_active,
name => $name,
# is_active => $is_active,
# name => $name,
'base64_'.$tt_sourcestate => $$tt_string,
});
}
if($is_active && $tt_id){
$self->deactivateOtherTemplates($contract_id,$tt_id);
}
# if($is_active && $tt_id){
# $self->deactivateOtherTemplates($contract_id,$tt_id);
# }
});
return { tt_id => $tt_id };
}

@ -276,6 +276,11 @@ div.ngcp_dt_top_elements > div:first-child + div + div > div {
text-align: center;
}
.ngcp_current_edit td {
background: #dff0d8 !important;
background-color: #dff0d8 !important;
}
/* ---------
sw_actions (Action Buttons)
------------*/

@ -54,27 +54,8 @@ function fetchSvgToEditor( data ) {
setSvgStringToEditor( httpResponse );
});
}
function refreshAccordionAjaxList ( item, data ){
alert('refreshAccordionAjaxList: q='+uriForAction( data, item + '_list' )+';item='+item);
var target = $('#'+ item + '_list');
if(target){
fetch_into(
item + '_list',
uriForAction( data, item + '_list' ),
'',
function(){ mainWrapperInit(); }
);
}
}
function refreshMessagesAjax ( ){
alert('refreshMessagesAjax: q='+uriForAction( {}, 'messages' ));
fetch_into(
'messages',
uriForAction( {}, 'messages' )
);
}
//public
function fetchInvoiceTemplateData( data ){
function fetchInvoiceTemplateData( data, noshowform ){
//params spec: tt_type=[svg|html]/tt_viewmode[parsed|raw]/tt_sourcestate[saved|previewed|default]/tt_output_type[svg|pdf|html|json|svgzip|pdfzip|htmlzip]/tt_id
//tt_output_type=svg really outputs text/html mimetype. But it will be couple of <svg> tags (<svg> per page).
data.tt_output_type = 'json';
@ -92,13 +73,27 @@ function fetchInvoiceTemplateData( data ){
setSvgStringToEditor( templatedata.aaData.template.raw );
setSvgStringToPreview( templatedata.aaData.template.parsed );
}
$('#load_previewed_control').css('display', 'none' );
if( templatedata.aaData.form ){
$('form[name=invoice_template]').loadJSON(templatedata.aaData.form);
$('form[name=invoice_template_editor]').loadJSON(templatedata.aaData.form);
if(templatedata.aaData.form.base64_previewed){
$('#load_previewed_control').css('display', 'inline' );
}
}
if( !noshowform ){
$('#invoice_template_editor_form').css('display','block');
}
$('#invoice_template_form').css('display','block');//document.getElementById('invoice_template_form');;
}
});
}
function clearTemplateForm(data){
$('#invoice_template_editor_form').css('display','none');
if(!data){
data = {};
}
data.tt_sourcestate = 'default';
fetchInvoiceTemplateData(data, 1);
}
function savePreviewedAndShowParsed( data ){
var svgString = getSvgString();
var q = uriForAction( data, 'invoice_template_previewed' );
@ -112,7 +107,7 @@ function savePreviewedAndShowParsed( data ){
//alert('savePreviewedAndShowParsed: httpResponse='+httpResponse+';');
setSvgStringToPreview( httpResponse, q )
//refresh list after saving
refreshAccordionAjaxList( 'invoice_template', data );
refreshAjaxList( 'invoice_template', data );
} );
}
function saveTemplate( data ) {
@ -129,58 +124,8 @@ function saveTemplate( data ) {
data: { template: svgString },
} ).done( function( jsonResponse ) {
if(jsonResponse.aaData && jsonResponse.aaData.form){
$('form[name=invoice_template]').loadJSON(jsonResponse.aaData.form);
$('form[name=invoice_template_editor]').loadJSON(jsonResponse.aaData.form);
}
refreshAccordionAjaxList( 'invoice_template', data );
refreshAjaxList( 'invoice_template', data );
});
}
function processModalFormAjax( form, callback ) {
//preventDefault();
alert(form.attr('action')+'?'+form.serialize());
var item = form.attr('id');
$.ajax( {
url: form.attr('action'),
type: "POST",
data: form.serialize(),
} ).done( function( responseText, textStatus, request ) {
/*
var headers = request.getAllResponseHeaders();
var i =0;
alert('headers='+headers);
for(i=0; i<headers.length; i++){
alert('i='+i+';header='+headers[i]);
}
*/
var status = request.getResponseHeader('X-Form-Status');
//alert('header='+request.getResponseHeader('X-Form-Status'));
var targetNames = [ item + '_messages','messages' ];
if('error' == status){
targetNames.unshift(item+'_form_modal');
}
/*
if(var targetDirect = request.getResponseHeader('X-Ajax-Target')){
targetNames.unshift(targetDirect);
}
*/
var target,i=0;
while( (!target) && ( i < targetNames.length ) ){
target = document.getElementById(targetNames[i++]);
//alert('i='+(i-1)+';name='+targetNames[i-1]+';target='+target);
}
//alert('target='+target);
if(target){
target.innerHTML=responseText;
}
if('error' != status){
refreshAccordionAjaxList( item, form.serializeObject() );
}
if(callback){
if(typeof callback == 'function'){
callback(status);
}else{
eval(callback);
}
}
});
}

@ -0,0 +1,124 @@
function refreshAjaxList ( item, data ){
alert('refreshAjaxList: q='+uriForAction( data, item + '_list' )+';item='+item);
var target = $('#'+ item + '_list');
if(target){
fetch_into(
item + '_list',
uriForAction( data, item + '_list' ),
'',
function(){
mainWrapperInit();
listRestoreCurrentEdit(target);
}
);
}
}
function refreshMessagesAjax ( ){
alert('refreshMessagesAjax: q='+uriForAction( {}, 'messages' ));
fetch_into(
'messages',
uriForAction( {}, 'messages' )
);
}
function processModalFormAjax( form, callback ) {
//preventDefault();
alert(form.attr('action')+'?'+form.serialize());
var item = form.attr('id');
$.ajax( {
url: form.attr('action'),
type: "POST",
data: form.serialize(),
} ).done( function( responseText, textStatus, request ) {
/*
var headers = request.getAllResponseHeaders();
var i =0;
alert('headers='+headers);
for(i=0; i<headers.length; i++){
alert('i='+i+';header='+headers[i]);
}
*/
var status = request.getResponseHeader('X-Form-Status');
//alert('header='+request.getResponseHeader('X-Form-Status'));
var targetNames = [ item + '_messages','messages' ];
if('error' == status){
targetNames.unshift(item+'_form');
}
/*
if(var targetDirect = request.getResponseHeader('X-Ajax-Target')){
targetNames.unshift(targetDirect);
}
*/
var target,i=0;
while( (!target) && ( i < targetNames.length ) ){
target = document.getElementById(targetNames[i++]);
//alert('i='+(i-1)+';name='+targetNames[i-1]+';target='+target);
}
//alert('target='+target);
if(target){
target.innerHTML=responseText;
}
if(callback){
if(typeof callback == 'function'){
callback(status,form);
}else{
eval(callback);
}
}
});
}
function listRestoreCurrentEdit(staticContainer, staticContainerId){
if(!staticContainer){
staticContainer = $('#'+ staticContainerId );
}
if(staticContainer){
var id = getCurrentEditId(staticContainer, staticContainerId);
alert('listRestoreCurrentEdit:id='+id+';');
if(id){
var tr = staticContainer.find('tr[data-id='+id+']');
if(tr){
listSetCurrentEdit( id, tr, staticContainer );
}
}
}
}
function getCurrentEditId(staticContainer, staticContainerId){
var res = '';
if(!staticContainer){
staticContainer = $('#'+ staticContainerId );
}
if(staticContainer){
res = staticContainer.attr('data-current');
}
return res;
}
function setCurrentEditId(id, staticContainer, staticContainerId){
if(!staticContainer){
staticContainer = $('#'+ staticContainerId );
}
if(staticContainer){
staticContainer.attr('data-current',id);
}
}
function listSetCurrentEdit( id, tr, staticContainer ) {
alert('listSetCurrentEdit: id='+id+';tr='+tr+';');
var curclass = 'ngcp_current_edit';
if(!staticContainer){
staticContainer = tr.closest('.accordion-inner');
}
if(staticContainer){
setCurrentEditId(id, staticContainer);
staticContainer.find('.'+curclass ).each( function(i){
$(this).removeClass(curclass);
} );
}
//tr.find('td').addClass('ngcp_current_edit');
if(tr){
tr.addClass(curclass);
//alert('listSetCurrentEdit: class='+id+';tr='+tr.attr('class')+';');
}
/*else{
//tr.find('td').removeClass('ngcp_current_edit');
tr.removeClass(curclass);
}*/
}

@ -49,11 +49,17 @@
$(this).parents('form').submit();
[%ELSE%]
$('#mod_edit').modal('hide');
processModalFormAjax($(this).parents('form'),function(status){
processModalFormAjax($(this).parents('form'),function(status,form){
//alert('in callback: status='+status);
if( status == 'error' ){
modalFormScript();
}
[%IF m.ajax_list_refresh%]
if( status != 'error' ){
//form object is necessary to compose uri for refresh
refreshAjaxList( '[%m.ajax_list_refresh%]', form.serializeObject() );
}
[%END%]
[%m.ajax_callback%]
});
[%END%]

@ -8,8 +8,9 @@
-%]
[%PROCESS 'helpers/modal.tt' -%]
[%mf_helper = {
ajax_load => 1,
}%]
ajax_load => 1,
ajax_list_refresh => 'invoice_template',
}%]
[%modal_script( m = mf_helper )%]
[% site_config.title = c.loc('Invoice template for [_1]', reseller.first.name) -%]
@ -19,6 +20,8 @@
<script type="text/javascript" src="/js/background.js"></script>
<script type="text/javascript" src="/js/jquery.loadJSON.js"></script>
<script type="text/javascript" src="/js/jquery.serializeObject.js"></script>
<script type="text/javascript" src="/js/modalAjax.js"></script>
<script type="text/javascript" src="/js/invoice_template.js"></script>
<script type="text/javascript">
var uriForAction = function( data, type ){
//also we can think about getting URIs via ajax )
@ -53,12 +56,9 @@ var uriForAction = function( data, type ){
q_template=q_template.replace(key,data[key]);
});
q_template=q_template.replace(/\/+$/,'');
//q_template=q_template+'?'+$('form[name=invoice_template]').serialize();
//alert('q_template='+q_template);
return q_template;
}
</script>
<script type="text/javascript" src="/js/invoice_template.js"></script>
<div class="row">
<span>
@ -66,7 +66,7 @@ var uriForAction = function( data, type ){
</span>
<span>
<!--a class="btn btn-primary btn-large" href="[% c.uri_for('/reseller/invoice_create') %]">[% c.loc('Create invoices template')%] <i class="icon-edit"></i></a-->
<a class="btn btn-primary btn-large" onclick="$(this).css('outline', 'none');fetch_into('invoice_template_form_modal', '[%- c.uri_for_action("/reseller/invoice_template_form", [contract.id]) -%]','item=invoice_template',function(){modalFormScript();});void(0);">[% c.loc('Create invoices template')%] <i class="icon-edit"></i></a>
<a class="btn btn-primary btn-large" onclick="$(this).css('outline', 'none');fetch_into('invoice_template_info_form', '[%- c.uri_for_action("/reseller/invoice_template_info", [contract.id]) -%]','item=invoice_template_info',function(){modalFormScript();});void(0);">[% c.loc('Create invoices template')%] <i class="icon-edit"></i></a>
</span>
</div>
@ -129,12 +129,12 @@ var uriForAction = function( data, type ){
</span>
<div style="display:none;" id="invoice_template_form">
[%PROCESS 'invoice/invoice_template_form.tt' %]
<div style="display:none;" id="invoice_template_editor_form">
[%PROCESS 'invoice/invoice_template_editor_form.tt' %]
</div>
</div>
<div id="invoice_template_form_modal">
<div id="invoice_template_info_form">
</div>

@ -3,27 +3,18 @@
[%# USE FillInForm %]
<script>
function getTtIdVal(){
return getForm().$('input[name=tt_id]').val();
return $('form[id=invoice_template_editor] :input[name=tt_id]').val();
}
function formToUri(q){
return q+'?'+getForm().serialize();
return q+'?'+$('form[id=invoice_template_editor]').serialize();
}
function formSerialize(){
return getForm().serialize();
}
function getForm(){
return $('form[id=invoice_template]');
return $('form[id=invoice_template_editor]').serialize();
}
</script>
<form name="invoice_template_old" id="invoice_template_old" action="[%- c.uri_for_action('/reseller/invoice_template', [contract.id]) -%]" class="form-horizontal" enctype="multipart/form-data" method="post">
<form name="invoice_template_editor" id="invoice_template_editor" action="[%- c.uri_for_action('/reseller/invoice_template', [contract.id]) -%]" class="form-horizontal" enctype="multipart/form-data" method="post">
<input type="hidden" name="tt_id" value="">
<input type="hidden" name="contract_id" value="">
<span>
<a class="btn btn-primary btn-small" data-confirm="[%c.loc('Overwrite changes');%]" href="javascript:fetchInvoiceTemplateData({
tt_sourcestate: 'default',
contract_id: '[%contract.id%]',
});void(0);">[% c.loc('Load default')%] <i class="icon-edit"></i></a>
</span>
<span>
<a class="btn btn-primary btn-small" onclick="
savePreviewedAndShowParsed({
@ -40,8 +31,21 @@ function getForm(){
});void(0);">[% c.loc('Save template')%] <i class="icon-disk"></i></a>
</span>
<div class="ngcp-separator"></div>
<span>
<a class="btn btn-secondary btn-small" data-confirm="[%c.loc('Overwrite changes');%]" href="javascript:fetchInvoiceTemplateData({
tt_sourcestate: 'default',
contract_id: '[%contract.id%]',
});void(0);">[% c.loc('Load default')%] <i class="icon-edit"></i></a>
</span>
<span id="load_previewed_control" style="display:none;">
<a class="btn btn-secondary btn-small" data-confirm="[%c.loc('Overwrite changes');%]" href="javascript:fetchInvoiceTemplateData({
tt_sourcestate: 'previewed',
tt_id: getTtIdVal(),
contract_id: '[%contract.id%]',
});void(0);">[% c.loc('Load previewed')%] <i class="icon-edit"></i></a>
</span>
[%initial = 'default'%]
<div class="ngcp-separator"></div>
<iframe
type="text/html"
src="/js/libs/svg-edit/svg-editor.htm" id="svgedit" onload="

@ -4,7 +4,9 @@
[% IF !c.user.read_only && (c.user.roles == 'admin' || c.user.roles == 'reseller') -%]
[% write_access = 1 %]
[%END%]
<script>
var staticContainerId='invoice_template_list';
</script>
[%IF invoice_template_list.size %]
<table class="table table-bordered table-striped table-highlight table-hover">
<thead>
@ -19,7 +21,7 @@
[% FOR template IN invoice_template_list -%]
[%# Dumper.dump_html(invoice_template_list.as_query)%]
[%# Dumper.dump_html(template)%]
<tr class="sw_action_row">
<tr class="sw_action_row" data-id="[%template.get_column('id')%]">
<td style="font-size: 20px;">[%IF template.get_column('is_active') > 0; '✓'; END%]</td><!--✓-->
<td>[% template.get_column('name') %]</td>
<td>[% template.get_column('type') %]</td>
@ -27,7 +29,7 @@
<div class="sw_actions">
[% IF write_access -%]
<a class="btn btn-small btn-primary"
onclick="alert('[%- c.uri_for_action("/reseller/invoice_template_form", [contract.id])%]');fetch_into('invoice_template_form_modal', '[%- c.uri_for_action("/reseller/invoice_template_form", [contract.id]) -%]','item=invoice_template&tt_id=[%template.get_column('id')%]',function(){modalFormScript();});void(0);
onclick="fetch_into('invoice_template_info_form', '[%- c.uri_for_action("/reseller/invoice_template_info", [contract.id]) -%]','item=invoice_template_info&tt_id=[%template.get_column('id')%]',function(){modalFormScript();});void(0);
">
<i class="icon-edit"></i> [% c.loc('Edit template info') %]
</a>
@ -36,15 +38,15 @@
tt_sourcestate: 'saved',
contract_id: '[%contract.id%]',
tt_id: '[%template.get_column('id')%]',
});">
});listSetCurrentEdit('[%template.get_column('id')%]', $(this).closest('tr') );">
<i class="icon-edit"></i> [% c.loc('Edit template') %]
</a>
<a class="btn btn-small btn-primary ngcp-noback-button" data-confirm="[%IF template.get_column('is_active'); c.loc('Deactivate'); ELSE; c.loc('Activate'); END%]"
href="javascript:fetch_into('invoice_template_list', '[%- c.uri_for_action("/reseller/invoice_template_activate", [contract.id, template.get_column('id'),template.get_column('is_active')]) -%]','',function(){ refreshMessagesAjax();mainWrapperInit(); });void(0);">
href="javascript:fetch_into(staticContainerId, '[%- c.uri_for_action("/reseller/invoice_template_activate", [contract.id, template.get_column('id'),template.get_column('is_active')]) -%]','',function(){ refreshMessagesAjax();mainWrapperInit(); listRestoreCurrentEdit('',staticContainerId);});void(0);">
<i class="icon-edit"></i> [%IF template.get_column('is_active'); c.loc('Deactivate'); ELSE; c.loc('Activate'); END%]
</a>
<a class="btn btn-small btn-secondary ngcp-noback-button" data-confirm="Delete"
href="javascript:fetch_into('invoice_template_list', '[%- c.uri_for_action("/reseller/invoice_template_delete", [contract.id, template.get_column('id')]) -%]','',function(){ refreshMessagesAjax();mainWrapperInit(); });void(0);">
href="javascript:fetch_into(staticContainerId, '[%- c.uri_for_action("/reseller/invoice_template_delete", [contract.id, template.get_column('id')]) -%]','',function(){ refreshMessagesAjax();mainWrapperInit();listRestoreCurrentEdit('',staticContainerId);if('[%template.get_column('id')%]' === getCurrentEditId('', staticContainerId)){clearTemplateForm({contract_id: '[%contract.id%]'});} });void(0);">
<i class="icon-trash"></i> [% c.loc('Delete') %]
</a>
[%END%]

Loading…
Cancel
Save