Lots of cleanups and bugfixes and back-nav.

Implement automatic back navigation.
Fix subscriber creation.
Unify controller handling.
agranig/1_0_subfix
Andreas Granig 12 years ago
parent e384577cb0
commit 21af84fdf6

@ -57,6 +57,7 @@ my $builder = Local::Module::Build->new(
'Template' => 0, 'Template' => 0,
'Text::CSV_XS' => 0, 'Text::CSV_XS' => 0,
'UUID' => 0, 'UUID' => 0,
'Hash::Merge::Simple' => 0,
'warnings' => 0, 'warnings' => 0,
}, },
test_requires => { test_requires => {

4
debian/control vendored

@ -30,7 +30,7 @@ Build-Depends: debhelper (>= 8),
libsys-sig-perl, libsys-sig-perl,
libtext-csv-xs-perl, libtext-csv-xs-perl,
libtrycatch-perl, libtrycatch-perl,
libhash-merge-perl, libhash-merge-simple-perl,
ngcp-schema ngcp-schema
Standards-Version: 3.9.4 Standards-Version: 3.9.4
Homepage: http://sipwise.com/ Homepage: http://sipwise.com/
@ -59,13 +59,13 @@ Depends: libcatalyst-actionrole-acl-perl,
libmoosex-fileattribute-perl, libmoosex-fileattribute-perl,
libmoosex-object-pluggable-perl, libmoosex-object-pluggable-perl,
libmoosex-singleton-perl, libmoosex-singleton-perl,
libnamespace-autoclean-perl,
libnamespace-sweep-perl, libnamespace-sweep-perl,
libnet-http-perl, libnet-http-perl,
libregexp-parser-perl, libregexp-parser-perl,
libsys-sig-perl, libsys-sig-perl,
libtemplate-perl, libtemplate-perl,
libtext-csv-xs-perl, libtext-csv-xs-perl,
libhash-merge-simple-perl,
ngcp-schema, ngcp-schema,
${misc:Depends}, ${misc:Depends},
${perl:Depends} ${perl:Depends}

@ -1,6 +1,5 @@
package NGCP::Panel; package NGCP::Panel;
use Moose; use Moose;
use namespace::autoclean;
use Catalyst::Runtime 5.80; use Catalyst::Runtime 5.80;

@ -1,6 +1,5 @@
package NGCP::Panel::Controller::Billing; package NGCP::Panel::Controller::Billing;
use Sipwise::Base; use Sipwise::Base;
use namespace::autoclean;
use Text::CSV_XS; use Text::CSV_XS;
use I18N::Langinfo qw(langinfo DAY_1 DAY_2 DAY_3 DAY_4 DAY_5 DAY_6 DAY_7); use I18N::Langinfo qw(langinfo DAY_1 DAY_2 DAY_3 DAY_4 DAY_5 DAY_6 DAY_7);
use DateTime::Format::ISO8601; use DateTime::Format::ISO8601;

@ -94,7 +94,7 @@ sub create_without_reseller :Chained('list_contact') :PathPart('create/noreselle
sub base :Chained('list_contact') :PathPart('') :CaptureArgs(1) { sub base :Chained('list_contact') :PathPart('') :CaptureArgs(1) {
my ($self, $c, $contact_id) = @_; my ($self, $c, $contact_id) = @_;
unless($contact_id && $contact_id =~ /^\d+$/) { unless($contact_id && $contact_id->is_int) {
$c->flash(messages => [{type => 'error', text => 'Invalid contact id detected!'}]); $c->flash(messages => [{type => 'error', text => 'Invalid contact id detected!'}]);
NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for()); NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for());
} }

@ -1,8 +1,7 @@
package NGCP::Panel::Controller::Contract; package NGCP::Panel::Controller::Contract;
use Sipwise::Base; use Sipwise::Base;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; } BEGIN { extends 'Catalyst::Controller'; }
use Hash::Merge;
use NGCP::Panel::Form::Contract; use NGCP::Panel::Form::Contract;
use NGCP::Panel::Utils::Navigation; use NGCP::Panel::Utils::Navigation;
use NGCP::Panel::Utils::Contract; use NGCP::Panel::Utils::Contract;
@ -83,7 +82,7 @@ sub create :Chained('contract_list') :PathPart('create') :Args(0) {
my $posted = ($c->request->method eq 'POST'); my $posted = ($c->request->method eq 'POST');
my $params = {}; my $params = {};
$params = Hash::Merge->new('RIGHT_PRECEDENT')->merge($params, $c->session->{created_objects}); $params = $params->merge($c->session->{created_objects});
my $form; my $form;
$form = NGCP::Panel::Form::Contract->new; $form = NGCP::Panel::Form::Contract->new;
$form->process( $form->process(
@ -177,7 +176,7 @@ sub edit :Chained('base') :PathPart('edit') :Args(0) {
my $contract = $c->stash->{contract_result}; my $contract = $c->stash->{contract_result};
my $billing_mapping = $contract->billing_mappings->find($contract->get_column('bmid')); my $billing_mapping = $contract->billing_mappings->find($contract->get_column('bmid'));
my $params = {}; my $params = {};
$params = Hash::Merge->new('RIGHT_PRECEDENT')->merge($params, $c->session->{created_objects}); $params = $params->merge($c->session->{created_objects});
unless($posted) { unless($posted) {
$params->{billing_profile}{id} = $billing_mapping->billing_profile->id; $params->{billing_profile}{id} = $billing_mapping->billing_profile->id;
$params->{contact}{id} = $contract->contact_id; $params->{contact}{id} = $contract->contact_id;
@ -298,7 +297,7 @@ sub peering_create :Chained('peering_list') :PathPart('create') :Args(0) {
my $posted = ($c->request->method eq 'POST'); my $posted = ($c->request->method eq 'POST');
my $params = {}; my $params = {};
$params = Hash::Merge->new('RIGHT_PRECEDENT')->merge($params, $c->session->{created_objects}); $params = $params->merge($c->session->{created_objects});
my $form = NGCP::Panel::Form::Contract->new; my $form = NGCP::Panel::Form::Contract->new;
$form->process( $form->process(
posted => $posted, posted => $posted,
@ -379,7 +378,7 @@ sub customer_create :Chained('customer_list') :PathPart('create') :Args(0) {
my $posted = ($c->request->method eq 'POST'); my $posted = ($c->request->method eq 'POST');
my $params = {}; my $params = {};
$params = Hash::Merge->new('RIGHT_PRECEDENT')->merge($params, $c->session->{created_objects}); $params = $params->merge($c->session->{created_objects});
my $form = NGCP::Panel::Form::Contract->new; my $form = NGCP::Panel::Form::Contract->new;
$form->process( $form->process(
posted => $posted, posted => $posted,

@ -1,6 +1,5 @@
package NGCP::Panel::Controller::Dashboard; package NGCP::Panel::Controller::Dashboard;
use Moose; use Moose;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; } BEGIN { extends 'Catalyst::Controller'; }
use NGCP::Panel::Widget; use NGCP::Panel::Widget;

@ -1,6 +1,6 @@
package NGCP::Panel::Controller::Domain; package NGCP::Panel::Controller::Domain;
use Sipwise::Base; use Sipwise::Base;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; } BEGIN { extends 'Catalyst::Controller'; }

@ -1,7 +1,7 @@
package NGCP::Panel::Controller::Login; package NGCP::Panel::Controller::Login;
use Moose; use Moose;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; } BEGIN { extends 'Catalyst::Controller'; }
use NGCP::Panel::Form::Login; use NGCP::Panel::Form::Login;

@ -1,6 +1,6 @@
package NGCP::Panel::Controller::Logout; package NGCP::Panel::Controller::Logout;
use Moose; use Moose;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; } BEGIN { extends 'Catalyst::Controller'; }

@ -1,6 +1,6 @@
package NGCP::Panel::Controller::NCOS; package NGCP::Panel::Controller::NCOS;
use Sipwise::Base; use Sipwise::Base;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; } BEGIN { extends 'Catalyst::Controller'; }

@ -1,6 +1,6 @@
package NGCP::Panel::Controller::Peering; package NGCP::Panel::Controller::Peering;
use Sipwise::Base; use Sipwise::Base;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; } BEGIN { extends 'Catalyst::Controller'; }
@ -73,7 +73,7 @@ sub edit :Chained('base') :PathPart('edit') {
my $posted = ($c->request->method eq 'POST'); my $posted = ($c->request->method eq 'POST');
my $form = NGCP::Panel::Form::PeeringGroup->new; my $form = NGCP::Panel::Form::PeeringGroup->new;
my $params = {}; my $params = {};
$params = Hash::Merge->new('RIGHT_PRECEDENT')->merge($params, $c->session->{created_objects}); $params = $params->merge($c->session->{created_objects});
$form->process( $form->process(
posted => $posted, posted => $posted,
params => $c->request->params, params => $c->request->params,
@ -122,7 +122,7 @@ sub create :Chained('group_list') :PathPart('create') :Args(0) {
my $posted = ($c->request->method eq 'POST'); my $posted = ($c->request->method eq 'POST');
my $form = NGCP::Panel::Form::PeeringGroup->new; my $form = NGCP::Panel::Form::PeeringGroup->new;
my $params = {}; my $params = {};
$params = Hash::Merge->new('RIGHT_PRECEDENT')->merge($params, $c->session->{created_objects}); $params = $params->merge($c->session->{created_objects});
$form->process( $form->process(
posted => $posted, posted => $posted,
params => $c->request->params, params => $c->request->params,

@ -3,7 +3,6 @@ use Sipwise::Base;
use namespace::sweep; use namespace::sweep;
BEGIN { extends 'Catalyst::Controller'; } BEGIN { extends 'Catalyst::Controller'; }
use DateTime qw(); use DateTime qw();
use Hash::Merge;
use HTTP::Status qw(HTTP_SEE_OTHER); use HTTP::Status qw(HTTP_SEE_OTHER);
use NGCP::Panel::Form::Reseller; use NGCP::Panel::Form::Reseller;
use NGCP::Panel::Utils::Navigation; use NGCP::Panel::Utils::Navigation;
@ -61,7 +60,7 @@ sub create :Chained('list_reseller') :PathPart('create') :Args(0) {
if($c->user->read_only); if($c->user->read_only);
my $params = {}; my $params = {};
$params = Hash::Merge->new('RIGHT_PRECEDENT')->merge($params, $c->session->{created_objects}); $params = $params->merge($c->session->{created_objects});
my $posted = $c->request->method eq 'POST'; my $posted = $c->request->method eq 'POST';
my $form = NGCP::Panel::Form::Reseller->new; my $form = NGCP::Panel::Form::Reseller->new;
@ -83,14 +82,14 @@ sub create :Chained('list_reseller') :PathPart('create') :Args(0) {
delete $form->params->{contract}; delete $form->params->{contract};
my $reseller = $c->model('DB')->resultset('resellers')->create($form->params); my $reseller = $c->model('DB')->resultset('resellers')->create($form->params);
delete $c->session->{created_objects}->{contract}; delete $c->session->{created_objects}->{contract};
$c->session->{created_objects}->{reseller} = { id => $reseller->id };
$c->flash(messages => [{type => 'success', text => 'Reseller successfully created'}]); $c->flash(messages => [{type => 'success', text => 'Reseller successfully created'}]);
} catch($e) { } catch($e) {
$c->log->error($e); $c->log->error($e);
$c->flash(messages => [{type => 'error', text => 'Failed to create reseller'}]); $c->flash(messages => [{type => 'error', text => 'Failed to create reseller'}]);
} }
$c->response->redirect($c->uri_for()); NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for());
return;
} }
$c->stash(create_flag => 1); $c->stash(create_flag => 1);
@ -101,7 +100,7 @@ sub create :Chained('list_reseller') :PathPart('create') :Args(0) {
sub base :Chained('list_reseller') :PathPart('') :CaptureArgs(1) { sub base :Chained('list_reseller') :PathPart('') :CaptureArgs(1) {
my ($self, $c, $reseller_id) = @_; my ($self, $c, $reseller_id) = @_;
unless($reseller_id && $reseller_id =~ /^\d+$/) { unless($reseller_id && $reseller_id->is_int) {
$c->flash(messages => [{type => 'error', text => 'Invalid reseller id detected'}]); $c->flash(messages => [{type => 'error', text => 'Invalid reseller id detected'}]);
$c->response->redirect($c->uri_for()); $c->response->redirect($c->uri_for());
return; return;
@ -198,7 +197,7 @@ sub edit :Chained('base') :PathPart('edit') :Args(0) {
my $params = { $c->stash->{reseller}->first->get_inflated_columns }; my $params = { $c->stash->{reseller}->first->get_inflated_columns };
$params->{contract}{id} = delete $params->{contract_id}; $params->{contract}{id} = delete $params->{contract_id};
$params = Hash::Merge->new('RIGHT_PRECEDENT')->merge($params, $c->session->{created_objects}); $params = $params->merge($c->session->{created_objects});
$form->process( $form->process(
posted => $posted, posted => $posted,
params => $c->request->params, params => $c->request->params,
@ -361,7 +360,7 @@ sub create_defaults :Path('create_defaults') :Args(0) {
$c->flash(messages => [{type => 'error', text => 'Failed to create reseller'}]); $c->flash(messages => [{type => 'error', text => 'Failed to create reseller'}]);
}; };
$c->flash(messages => [{type => 'success', text => "Reseller successfully created with login <b>".$defaults{admins}->{login}."</b> and password <b>".$defaults{admins}->{md5pass}."</b>, please review your settings below" }]); $c->flash(messages => [{type => 'success', text => "Reseller successfully created with login <b>".$defaults{admins}->{login}."</b> and password <b>".$defaults{admins}->{md5pass}."</b>, please review your settings below" }]);
$c->res->redirect(sprintf('/reseller/%d/details', $r{resellers}->id), HTTP_SEE_OTHER); $c->res->redirect($c->uri_for_action('/reseller/details', [$r{resellers}->id]));
$c->detach; $c->detach;
return; return;
} }

@ -1,6 +1,6 @@
package NGCP::Panel::Controller::Rewrite; package NGCP::Panel::Controller::Rewrite;
use Sipwise::Base; use Sipwise::Base;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; } BEGIN { extends 'Catalyst::Controller'; }

@ -1,6 +1,6 @@
package NGCP::Panel::Controller::Root; package NGCP::Panel::Controller::Root;
use Moose; use Moose;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller' } BEGIN { extends 'Catalyst::Controller' }
@ -73,6 +73,25 @@ sub index :Path :Args(0) {
$c->response->redirect($c->uri_for('/dashboard')); $c->response->redirect($c->uri_for('/dashboard'));
} }
sub back :Path('/back') :Args(0) {
my ( $self, $c ) = @_;
my $target;
my $ref_uri = URI->new($c->req->referer) || $c->uri_for('/dashboard');
if($c->session->{redirect_targets}) {
while(@{ $c->session->{redirect_targets} }) {
$target = shift @{ $c->session->{redirect_targets} };
last unless($ref_uri->path eq $target->path);
}
if($ref_uri->path eq $target->path) {
$target = $c->uri_for('/dashboard');
}
} else {
$target = $c->uri_for('/dashboard');
}
$c->response->redirect($target);
$c->detach;
}
sub default :Path { sub default :Path {
my ( $self, $c ) = @_; my ( $self, $c ) = @_;
$c->detach( '/error_page' ); $c->detach( '/error_page' );

@ -1,6 +1,6 @@
package NGCP::Panel::Controller::Sound; package NGCP::Panel::Controller::Sound;
use Sipwise::Base; use Sipwise::Base;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; } BEGIN { extends 'Catalyst::Controller'; }

@ -1,6 +1,6 @@
package NGCP::Panel::Controller::Statistics; package NGCP::Panel::Controller::Statistics;
use Moose; use Moose;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; } BEGIN { extends 'Catalyst::Controller'; }
use Sipwise::Base; use Sipwise::Base;

@ -78,16 +78,23 @@ sub root :Chained('sub_list') :PathPart('') :Args(0) {
sub create_list :Chained('sub_list') :PathPart('create') :Args(0) { sub create_list :Chained('sub_list') :PathPart('create') :Args(0) {
my ($self, $c) = @_; my ($self, $c) = @_;
my $posted = ($c->request->method eq 'POST');
my $params = {};
$params = $params->merge($c->session->{created_objects});
my $form = NGCP::Panel::Form::Subscriber->new; my $form = NGCP::Panel::Form::Subscriber->new;
$form->process( $form->process(
posted => ($c->request->method eq 'POST'), posted => $posted,
params => $c->request->params, params => $c->request->params,
action => $c->uri_for('/subscriber/create'), item => $params,
); );
NGCP::Panel::Utils::Navigation::check_form_buttons( NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c, c => $c,
form => $form, form => $form,
fields => [qw/domain.create/], fields => {
'domain.create' => $c->uri_for('/domain/create'),
'reseller.create' => $c->uri_for('/reseller/create'),
'contract.create' => $c->uri_for('/contract/customer/create'),
},
back_uri => $c->req->uri, back_uri => $c->req->uri,
); );
if($form->validated) { if($form->validated) {
@ -192,6 +199,10 @@ sub create_list :Chained('sub_list') :PathPart('create') :Args(0) {
password => sprintf("%04d", int(rand 10000)), password => sprintf("%04d", int(rand 10000)),
email => '', email => '',
}); });
delete $c->session->{created_objects}->{reseller};
delete $c->session->{created_objects}->{contract};
delete $c->session->{created_objects}->{domain};
}); });
$c->flash(messages => [{type => 'success', text => 'Subscriber successfully created!'}]); $c->flash(messages => [{type => 'success', text => 'Subscriber successfully created!'}]);
$c->response->redirect($c->uri_for('/subscriber')); $c->response->redirect($c->uri_for('/subscriber'));
@ -796,6 +807,12 @@ sub preferences_callforward_destinationset_create :Chained('base') :PathPart('pr
posted => $posted, posted => $posted,
params => $c->req->params, params => $c->req->params,
); );
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c,
form => $form,
fields => {},
back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
try { try {
@ -947,6 +964,12 @@ sub preferences_callforward_destinationset_edit :Chained('preferences_callforwar
$form->process( $form->process(
params => $posted ? $c->req->params : $params params => $posted ? $c->req->params : $params
); );
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c,
form => $form,
fields => {},
back_uri => $c->req->uri,
);
delete $c->stash->{cf_tmp_params}; delete $c->stash->{cf_tmp_params};
if($posted && $form->validated) { if($posted && $form->validated) {
@ -1133,6 +1156,12 @@ sub preferences_callforward_timeset_create :Chained('base') :PathPart('preferenc
posted => $posted, posted => $posted,
params => $c->req->params, params => $c->req->params,
); );
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c,
form => $form,
fields => {},
back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
try { try {
@ -1238,6 +1267,12 @@ sub preferences_callforward_timeset_edit :Chained('preferences_callforward_times
$form->process( $form->process(
params => $posted ? $c->req->params : $params params => $posted ? $c->req->params : $params
); );
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c,
form => $form,
fields => {},
back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
try { try {
@ -1459,6 +1494,12 @@ sub edit_master :Chained('master') :PathPart('edit') :Args(0) {
$form->process( $form->process(
params => $posted ? $c->request->params : $params params => $posted ? $c->request->params : $params
); );
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c,
form => $form,
fields => {},
back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
my $schema = $c->model('DB'); my $schema = $c->model('DB');
@ -1617,6 +1658,9 @@ sub edit_voicebox :Chained('base') :PathPart('preferences/voicebox/edit') :Args(
$form = NGCP::Panel::Form::Voicemail::Pin->new; $form = NGCP::Panel::Form::Voicemail::Pin->new;
$params = { 'pin' => $vm_user->password }; $params = { 'pin' => $vm_user->password };
$form->process(params => $posted ? $c->req->params : $params); $form->process(params => $posted ? $c->req->params : $params);
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c, form => $form, fields => {}, back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
$vm_user->update({ password => $form->field('pin')->value }); $vm_user->update({ password => $form->field('pin')->value });
} }
@ -1625,6 +1669,9 @@ sub edit_voicebox :Chained('base') :PathPart('preferences/voicebox/edit') :Args(
$form = NGCP::Panel::Form::Voicemail::Email->new; $form = NGCP::Panel::Form::Voicemail::Email->new;
$params = { 'email' => $vm_user->email }; $params = { 'email' => $vm_user->email };
$form->process(params => $posted ? $c->req->params : $params); $form->process(params => $posted ? $c->req->params : $params);
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c, form => $form, fields => {}, back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
$vm_user->update({ email => $form->field('email')->value }); $vm_user->update({ email => $form->field('email')->value });
} }
@ -1633,6 +1680,9 @@ sub edit_voicebox :Chained('base') :PathPart('preferences/voicebox/edit') :Args(
$form = NGCP::Panel::Form::Voicemail::Attach->new; $form = NGCP::Panel::Form::Voicemail::Attach->new;
$params = { 'attach' => $vm_user->attach eq 'yes' ? 1 : 0 }; $params = { 'attach' => $vm_user->attach eq 'yes' ? 1 : 0 };
$form->process(params => $posted ? $c->req->params : $params); $form->process(params => $posted ? $c->req->params : $params);
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c, form => $form, fields => {}, back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
$vm_user->update({ attach => $form->field('attach')->value ? 'yes' : 'no' }); $vm_user->update({ attach => $form->field('attach')->value ? 'yes' : 'no' });
} }
@ -1641,6 +1691,9 @@ sub edit_voicebox :Chained('base') :PathPart('preferences/voicebox/edit') :Args(
$form = NGCP::Panel::Form::Voicemail::Delete->new; $form = NGCP::Panel::Form::Voicemail::Delete->new;
$params = { 'delete' => $vm_user->get_column('delete') eq 'yes' ? 1 : 0 }; $params = { 'delete' => $vm_user->get_column('delete') eq 'yes' ? 1 : 0 };
$form->process(params => $posted ? $c->req->params : $params); $form->process(params => $posted ? $c->req->params : $params);
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c, form => $form, fields => {}, back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
$vm_user->update({ $vm_user->update({
delete => $form->field('delete')->value ? 'yes' : 'no', delete => $form->field('delete')->value ? 'yes' : 'no',
@ -1698,6 +1751,9 @@ sub edit_fax :Chained('base') :PathPart('preferences/fax/edit') :Args(1) {
$form = NGCP::Panel::Form::Faxserver::Name->new; $form = NGCP::Panel::Form::Faxserver::Name->new;
$params = { 'name' => $faxpref->name }; $params = { 'name' => $faxpref->name };
$form->process(params => $posted ? $c->req->params : $params); $form->process(params => $posted ? $c->req->params : $params);
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c, form => $form, fields => {}, back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
$faxpref->update({ name => $form->field('name')->value }); $faxpref->update({ name => $form->field('name')->value });
} }
@ -1706,6 +1762,9 @@ sub edit_fax :Chained('base') :PathPart('preferences/fax/edit') :Args(1) {
$form = NGCP::Panel::Form::Faxserver::Password->new; $form = NGCP::Panel::Form::Faxserver::Password->new;
$params = { 'password' => $faxpref->password }; $params = { 'password' => $faxpref->password };
$form->process(params => $posted ? $c->req->params : $params); $form->process(params => $posted ? $c->req->params : $params);
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c, form => $form, fields => {}, back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
$faxpref->update({ password => $form->field('password')->value }); $faxpref->update({ password => $form->field('password')->value });
} }
@ -1714,6 +1773,9 @@ sub edit_fax :Chained('base') :PathPart('preferences/fax/edit') :Args(1) {
$form = NGCP::Panel::Form::Faxserver::Active->new; $form = NGCP::Panel::Form::Faxserver::Active->new;
$params = { 'active' => $faxpref->active }; $params = { 'active' => $faxpref->active };
$form->process(params => $posted ? $c->req->params : $params); $form->process(params => $posted ? $c->req->params : $params);
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c, form => $form, fields => {}, back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
$faxpref->update({ active => $form->field('active')->value }); $faxpref->update({ active => $form->field('active')->value });
} }
@ -1722,6 +1784,9 @@ sub edit_fax :Chained('base') :PathPart('preferences/fax/edit') :Args(1) {
$form = NGCP::Panel::Form::Faxserver::SendStatus->new; $form = NGCP::Panel::Form::Faxserver::SendStatus->new;
$params = { 'send_status' => $faxpref->send_status }; $params = { 'send_status' => $faxpref->send_status };
$form->process(params => $posted ? $c->req->params : $params); $form->process(params => $posted ? $c->req->params : $params);
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c, form => $form, fields => {}, back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
$faxpref->update({ send_status => $form->field('send_status')->value }); $faxpref->update({ send_status => $form->field('send_status')->value });
} }
@ -1730,6 +1795,9 @@ sub edit_fax :Chained('base') :PathPart('preferences/fax/edit') :Args(1) {
$form = NGCP::Panel::Form::Faxserver::SendCopy->new; $form = NGCP::Panel::Form::Faxserver::SendCopy->new;
$params = { 'send_copy' => $faxpref->send_copy }; $params = { 'send_copy' => $faxpref->send_copy };
$form->process(params => $posted ? $c->req->params : $params); $form->process(params => $posted ? $c->req->params : $params);
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c, form => $form, fields => {}, back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
$faxpref->update({ send_copy => $form->field('send_copy')->value }); $faxpref->update({ send_copy => $form->field('send_copy')->value });
} }
@ -1751,6 +1819,9 @@ sub edit_fax :Chained('base') :PathPart('preferences/fax/edit') :Args(1) {
$params->{destination} = \@dests; $params->{destination} = \@dests;
} }
$form->process(params => $posted ? $c->req->params : $params); $form->process(params => $posted ? $c->req->params : $params);
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c, form => $form, fields => {}, back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
for my $dest($prov_subscriber->voip_fax_destinations->all) { for my $dest($prov_subscriber->voip_fax_destinations->all) {
$dest->delete; $dest->delete;
@ -1810,6 +1881,12 @@ sub edit_reminder :Chained('base') :PathPart('preferences/reminder/edit') {
$form->process( $form->process(
params => $posted ? $c->req->params : $params params => $posted ? $c->req->params : $params
); );
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c,
form => $form,
fields => {},
back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
@ -2009,6 +2086,12 @@ sub create_registered :Chained('master') :PathPart('registered/create') :Args(0)
posted => $posted, posted => $posted,
params => $c->request->params params => $c->request->params
); );
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c,
form => $form,
fields => {},
back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
try { try {
my $s = $c->stash->{subscriber}->provisioning_voip_subscriber; my $s = $c->stash->{subscriber}->provisioning_voip_subscriber;
@ -2065,6 +2148,12 @@ sub create_trusted :Chained('base') :PathPart('preferences/trusted/create') :Arg
posted => $posted, posted => $posted,
params => $posted ? $c->req->params : {} params => $posted ? $c->req->params : {}
); );
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c,
form => $form,
fields => {},
back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
try { try {
@ -2127,6 +2216,12 @@ sub edit_trusted :Chained('trusted_base') :PathPart('edit') {
$form->process( $form->process(
params => $posted ? $c->req->params : $params params => $posted ? $c->req->params : $params
); );
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c,
form => $form,
fields => {},
back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
try { try {
@ -2191,6 +2286,12 @@ sub create_speeddial :Chained('base') :PathPart('preferences/speeddial/create')
my $form = NGCP::Panel::Form::Subscriber::SpeedDial->new(ctx => $c); my $form = NGCP::Panel::Form::Subscriber::SpeedDial->new(ctx => $c);
$form->process(params => $c->req->params); $form->process(params => $c->req->params);
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c,
form => $form,
fields => {},
back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
try { try {
my $d = $form->field('destination')->value; my $d = $form->field('destination')->value;
@ -2269,6 +2370,12 @@ sub edit_speeddial :Chained('speeddial') :PathPart('edit') :Args(0) {
} }
$form->process(params => $posted ? $c->req->params : $params); $form->process(params => $posted ? $c->req->params : $params);
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c,
form => $form,
fields => {},
back_uri => $c->req->uri,
);
if($posted && $form->validated) { if($posted && $form->validated) {
try { try {
my $d = $form->field('destination')->value; my $d = $form->field('destination')->value;

@ -10,8 +10,8 @@ has_field 'id' => (
required => 1, required => 1,
template => 'share/templates/helpers/datatables_field.tt', template => 'share/templates/helpers/datatables_field.tt',
ajax_src => '/contract/customer/ajax', ajax_src => '/contract/customer/ajax',
table_titles => ['#', 'Contact #', 'External #', 'Status'], table_titles => ['#', 'Contact Email', 'External #', 'Status'],
table_fields => ['id', 'contact_id', 'external_id', 'status'], table_fields => ['id', 'contact_email', 'external_id', 'status'],
); );
has_field 'create' => ( has_field 'create' => (

@ -63,7 +63,7 @@ sub set_destination_groups {
my $parent_id = $self->parent->name; my $parent_id = $self->parent->name;
my $uri_d = ""; my $uri_d = "";
my $uri_t = 300; my $uri_t = 300;
if($parent_id =~ /^\d+$/ && if($parent_id->is_int &&
defined $self->form->ctx && defined $self->form->ctx &&
defined $self->form->ctx->stash->{cf_tmp_params}) { defined $self->form->ctx->stash->{cf_tmp_params}) {
my $d = $self->form->ctx->stash->{cf_tmp_params}->{destination}->[$parent_id]; my $d = $self->form->ctx->stash->{cf_tmp_params}->{destination}->[$parent_id];

@ -1,9 +1,8 @@
package NGCP::Panel::Utils::Navigation; package NGCP::Panel::Utils::Navigation;
use strict;
use warnings;
use Sipwise::Base; use Sipwise::Base;
use DBIx::Class::Exception; use DBIx::Class::Exception;
use URI::Encode qw(uri_decode);
sub check_redirect_chain { sub check_redirect_chain {
my %params = @_; my %params = @_;
@ -20,6 +19,17 @@ sub check_redirect_chain {
$c->stash(close_target => $target); $c->stash(close_target => $target);
} }
} }
if($c->request->params->{back}) {
my $back_uri = URI->new(uri_decode($c->request->params->{back}));
$back_uri->query_param_delete('back');
delete $c->request->params->{back};
if($c->session->{redirect_targets}) {
unshift @{ $c->session->{redirect_targets} }, $back_uri;
} else {
$c->session->{redirect_targets} = [ $back_uri ];
}
}
} }
sub check_form_buttons { sub check_form_buttons {
@ -30,6 +40,7 @@ sub check_form_buttons {
my $fields = $params{fields}; my $fields = $params{fields};
my $form = $params{form}; my $form = $params{form};
my $back_uri = $params{back_uri}; my $back_uri = $params{back_uri};
$back_uri->query_param_delete('back');
$fields = { map {($_, undef)} @$fields } $fields = { map {($_, undef)} @$fields }
if (ref($fields) eq "ARRAY"); if (ref($fields) eq "ARRAY");

@ -71,7 +71,7 @@ sub destination_as_string {
} else { } else {
my $d = $dest; my $d = $dest;
$d =~ s/sip:(.+)\@.+$/$1/; $d =~ s/sip:(.+)\@.+$/$1/;
if($d =~ /^\d+$/) { if($d->is_int) {
return $d; return $d;
} else { } else {
return $dest; return $dest;

@ -1,6 +1,5 @@
package NGCP::Panel::View::HTML; package NGCP::Panel::View::HTML;
use Moose; use Moose;
use namespace::autoclean;
extends 'Catalyst::View::TT'; extends 'Catalyst::View::TT';

@ -98,6 +98,31 @@ $(function () {
$('#dataConfirmModal').modal({show:true}); $('#dataConfirmModal').modal({show:true});
return false; return false;
}); });
[%
backuri = c.req.uri;
tmp = backuri.query_param_delete('back');
-%]
$('a').each(function() {
var _text = $(this).text().trim();
if(_text == "Back" ||
$(this).hasClass('accordion-toggle') ||
$(this).parents('#footer').length ||
$(this).parents('#topbar').length) {
return true;
}
var _href = $(this).attr('href');
var _back = 'back=[% backuri | uri %]';
if(_href == null) {
// ignore
} else if(_href.match(/\?/)) {
$(this).attr('href', _href + '&' + _back);
} else {
$(this).attr('href', _href + '?' + _back);
}
return true;
});
}); });
</script> </script>
</body> </body>

@ -60,7 +60,6 @@ $.fn.dataTableExt.oPagination.bootstrap = {
// Update stateful properties // Update stateful properties
this.fnUpdateState(oSettings); this.fnUpdateState(oSettings);
console.log(oSettings);
var totalPages = Math.ceil(oSettings._iRecordsDisplay / oSettings._iDisplayLength); var totalPages = Math.ceil(oSettings._iRecordsDisplay / oSettings._iDisplayLength);
if (oSettings._iCurrentPage === 1) { if (oSettings._iCurrentPage === 1) {

@ -12,7 +12,7 @@
<div class="row"> <div class="row">
<span> <span>
<a class="btn btn-primary btn-large" href="[% c.uri_for() %]"><i class="icon-arrow-left"></i> Back</a> <a class="btn btn-primary btn-large" href="[% c.uri_for('/back') %]"><i class="icon-arrow-left"></i> Back</a>
</span> </span>
</div> </div>

@ -8,6 +8,8 @@
helper.column_fields.push(col.accessor); helper.column_fields.push(col.accessor);
END; END;
END; END;
backuri = c.req.uri;
tmp = backuri.query_param_delete('back');
-%] -%]
<script src="/js/libs/datatables-bootstrap-paging.js"></script> <script src="/js/libs/datatables-bootstrap-paging.js"></script>
@ -62,7 +64,7 @@ $(document).ready(function() {
if([% button.condition %]) { if([% button.condition %]) {
[% END -%] [% END -%]
html += html +=
'<a class="btn [% button.class %]" href="[% button.uri %]" [% confirm_delete %]>' + '<a class="btn [% button.class %]" href="[% button.uri %]?back=[% backuri | uri %]" [% confirm_delete %]>' +
'<i class="[% button.icon %]"></i> [% button.name %]' + '<i class="[% button.icon %]"></i> [% button.name %]' +
'</a>'; '</a>';
[% IF button.condition -%] [% IF button.condition -%]
@ -128,10 +130,14 @@ $(document).ready(function() {
</script> </script>
<div class="row"> <div class="row">
<span class="pull-left" style="margin:0 5px 0 5px;">
<a class="btn btn-primary btn-large" href="[% c.uri_for('/back') %]"><i class="icon-arrow-left"></i> Back</a>
</span>
[% FOR button IN helper.top_buttons -%] [% FOR button IN helper.top_buttons -%]
[% IF button.method == "post" -%] [% IF button.method == "post" -%]
<form method="post" action="[% button.uri %]" style="float:left; margin:0 5px 0 5px;"> <form method="post" action="[% button.uri %]" style="float:left; margin:0 5px 0 5px;">
<button class="btn btn-primary btn-large" style="height:42px;"><i class="[% button.icon %]"></i> [% button.name %]</button> <button class="btn btn-primary btn-large" style="height:42px;"><i class="[% button.icon %]"></i> [% button.name %]</button>
<input type="hidden" name="back" value="[% c.req.uri %]"/>
</form> </form>
[% ELSE -%] [% ELSE -%]
<span class="pull-left" style="margin:0 5px 0 5px;"> <span class="pull-left" style="margin:0 5px 0 5px;">

@ -2,7 +2,7 @@
<div class="row"> <div class="row">
<span> <span>
<a class="btn btn-primary btn-large" href="[% c.uri_for() %]"><i class="icon-arrow-left"></i> Back</a> <a class="btn btn-primary btn-large" href="[% c.uri_for('/back') %]"><i class="icon-arrow-left"></i> Back</a>
</span> </span>
</div> </div>

@ -12,6 +12,7 @@
helper.form_object = form; helper.form_object = form;
helper.ajax_uri = c.uri_for_action('/subscriber/ajax'); helper.ajax_uri = c.uri_for_action('/subscriber/ajax');
UNLESS c.user.read_only;
helper.dt_buttons = [ helper.dt_buttons = [
{ name = 'Terminate', uri = "/subscriber/'+full.id+'/terminate", class = 'btn-small btn-secondary', icon = 'icon-trash', condition = 'full.status != "terminated"' }, { name = 'Terminate', uri = "/subscriber/'+full.id+'/terminate", class = 'btn-small btn-secondary', icon = 'icon-trash', condition = 'full.status != "terminated"' },
{ name = 'Details', uri = "/subscriber/'+full.id+'/details", class = 'btn-small btn-tertiary', icon = 'icon-th-list', condition = 'full.status != "terminated"' }, { name = 'Details', uri = "/subscriber/'+full.id+'/details", class = 'btn-small btn-tertiary', icon = 'icon-th-list', condition = 'full.status != "terminated"' },
@ -20,6 +21,12 @@
helper.top_buttons = [ helper.top_buttons = [
{ name = 'Create Subscriber', uri = c.uri_for_action('/subscriber/create_list'), icon = 'icon-star' }, { name = 'Create Subscriber', uri = c.uri_for_action('/subscriber/create_list'), icon = 'icon-star' },
]; ];
ELSE;
helper.dt_buttons = [
{ name = 'Details', uri = "/subscriber/'+full.id+'/details", class = 'btn-small btn-tertiary', icon = 'icon-th-list', condition = 'full.status != "terminated"' },
{ name = 'Customer', uri = "/customer/'+full.contract_id+'/details", class = 'btn-small btn-tertiary', icon = 'icon-user' },
];
END;
PROCESS 'helpers/datatables.tt'; PROCESS 'helpers/datatables.tt';
-%] -%]

@ -15,7 +15,7 @@
</ul> </ul>
</div> </div>
<div class="plan-actions"> <div class="plan-actions">
<a href="/billing" class="btn">Configure</a> <a href="[% c.uri_for('/billing') %]" class="btn">Configure</a>
</div> </div>
</div> </div>
</div> </div>

@ -14,7 +14,7 @@
</ul> </ul>
</div> </div>
<div class="plan-actions"> <div class="plan-actions">
<a href="[% c.uri_for_action("/peering/root") %]" class="btn">Configure</a> <a href="[% c.uri_for('/peering') %]" class="btn">Configure</a>
</div> </div>
</div> </div>
</div> </div>

@ -15,7 +15,7 @@
</ul> </ul>
</div> </div>
<div class="plan-actions"> <div class="plan-actions">
<a href="/reseller" class="btn">Configure</a> <a href="[% c.uri_for('/reseller') %]" class="btn">Configure</a>
</div> </div>
</div> </div>
</div> </div>

@ -15,7 +15,7 @@
</ul> </ul>
</div> </div>
<div class="plan-actions"> <div class="plan-actions">
<a href="[% c.uri_for_action('/statistics/index', []) %]" class="btn">View Statistics</a> <a href="[% c.uri_for('/statistics') %]" class="btn">View Statistics</a>
</div> </div>
</div> </div>
</div> </div>

Loading…
Cancel
Save