diff --git a/lib/NGCP/Panel/Field/PosInteger.pm b/lib/NGCP/Panel/Field/PosInteger.pm new file mode 100644 index 0000000000..9d4a89062c --- /dev/null +++ b/lib/NGCP/Panel/Field/PosInteger.pm @@ -0,0 +1,14 @@ +package NGCP::Panel::Field::PosInteger; +use Sipwise::Base; +extends 'HTML::FormHandler::Field::Integer'; + +sub validate { + my ( $self ) = @_; + my $value = $self->value; + $self->add_error('Value must be a positive integer') + if(!$self->has_errors && $value < 0); +} + +1; + +# vim: set tabstop=4 expandtab: diff --git a/lib/NGCP/Panel/Form/Customer/PbxAdminSubscriber.pm b/lib/NGCP/Panel/Form/Customer/PbxAdminSubscriber.pm index 5f94a26811..5a586e244e 100644 --- a/lib/NGCP/Panel/Form/Customer/PbxAdminSubscriber.pm +++ b/lib/NGCP/Panel/Form/Customer/PbxAdminSubscriber.pm @@ -1,6 +1,7 @@ package NGCP::Panel::Form::Customer::PbxAdminSubscriber; use HTML::FormHandler::Moose; +use NGCP::Panel::Field::PosInteger; extends 'NGCP::Panel::Form::Customer::PbxSubscriber'; has_field 'e164' => ( @@ -13,7 +14,7 @@ has_field 'e164' => ( ); has_field 'e164.cc' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', element_attr => { class => ['ngcp_e164_cc'], rel => ['tooltip'], @@ -24,7 +25,7 @@ has_field 'e164.cc' => ( ); has_field 'e164.ac' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', element_attr => { class => ['ngcp_e164_ac'], rel => ['tooltip'], @@ -35,7 +36,7 @@ has_field 'e164.ac' => ( ); has_field 'e164.sn' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', element_attr => { class => ['ngcp_e164_sn'], rel => ['tooltip'], diff --git a/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriber.pm b/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriber.pm index d15a738f85..38b4dca7c3 100644 --- a/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriber.pm +++ b/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriber.pm @@ -1,6 +1,7 @@ package NGCP::Panel::Form::Customer::PbxExtensionSubscriber; use HTML::FormHandler::Moose; +use NGCP::Panel::Field::PosInteger; extends 'NGCP::Panel::Form::Customer::PbxSubscriber'; has_field 'group' => ( @@ -10,7 +11,7 @@ has_field 'group' => ( ); has_field 'extension' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', element_attr => { rel => ['tooltip'], title => ['Extension Number, e.g. 101'] diff --git a/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriberEdit.pm b/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriberEdit.pm index 1ed55d4214..f511be23d1 100644 --- a/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriberEdit.pm +++ b/lib/NGCP/Panel/Form/Customer/PbxExtensionSubscriberEdit.pm @@ -1,6 +1,7 @@ package NGCP::Panel::Form::Customer::PbxExtensionSubscriberEdit; use HTML::FormHandler::Moose; +use NGCP::Panel::Field::PosInteger; extends 'NGCP::Panel::Form::Customer::PbxSubscriber'; has_field 'group' => ( @@ -10,7 +11,7 @@ has_field 'group' => ( ); has_field 'extension' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', element_attr => { rel => ['tooltip'], title => ['Extension Number, e.g. 101'] diff --git a/lib/NGCP/Panel/Form/Customer/PbxGroupBase.pm b/lib/NGCP/Panel/Form/Customer/PbxGroupBase.pm index 22d7b5a68b..fd875622c9 100644 --- a/lib/NGCP/Panel/Form/Customer/PbxGroupBase.pm +++ b/lib/NGCP/Panel/Form/Customer/PbxGroupBase.pm @@ -5,6 +5,7 @@ extends 'HTML::FormHandler'; use Moose::Util::TypeConstraints; use HTML::FormHandler::Widget::Block::Bootstrap; +use NGCP::Panel::Field::PosInteger; has '+widget_wrapper' => ( default => 'Bootstrap' ); has_field 'submitid' => ( type => 'Hidden' ); @@ -23,7 +24,7 @@ has_field 'hunt_policy' => ( ); has_field 'hunt_policy_timeout' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', required => 1, label => 'Serial Hunting Timeout', default => 10, diff --git a/lib/NGCP/Panel/Form/Customer/Subscriber.pm b/lib/NGCP/Panel/Form/Customer/Subscriber.pm index ed598f119c..09074fb587 100644 --- a/lib/NGCP/Panel/Form/Customer/Subscriber.pm +++ b/lib/NGCP/Panel/Form/Customer/Subscriber.pm @@ -7,6 +7,7 @@ use Moose::Util::TypeConstraints; use HTML::FormHandler::Widget::Block::Bootstrap; use NGCP::Panel::Field::Domain; +use NGCP::Panel::Field::PosInteger; has '+widget_wrapper' => ( default => 'Bootstrap' ); has_field 'submitid' => ( type => 'Hidden' ); @@ -43,7 +44,7 @@ has_field 'e164' => ( ); has_field 'e164.cc' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', element_attr => { class => ['ngcp_e164_cc'], rel => ['tooltip'], @@ -54,7 +55,7 @@ has_field 'e164.cc' => ( ); has_field 'e164.ac' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', element_attr => { class => ['ngcp_e164_ac'], rel => ['tooltip'], @@ -65,7 +66,7 @@ has_field 'e164.ac' => ( ); has_field 'e164.sn' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', element_attr => { class => ['ngcp_e164_sn'], rel => ['tooltip'], @@ -155,7 +156,18 @@ sub validate { my $cc = $self->field('e164.cc')->value; my $sn = $self->field('e164.sn')->value; - if (defined $cc && $cc ne '' && (!defined $sn || $sn eq '')) { + my %sub_errors = map {$_, 1} ( + @{ $self->field('e164.cc')->errors }, + @{ $self->field('e164.ac')->errors }, + @{ $self->field('e164.sn')->errors } ); + $self->field('e164')->push_errors(keys %sub_errors); + $self->field('e164.cc')->clear_errors; + $self->field('e164.ac')->clear_errors; + $self->field('e164.sn')->clear_errors; + + if ($self->field('e164')->has_errors) { + #dont add more errors + } elsif (defined $cc && $cc ne '' && (!defined $sn || $sn eq '')) { my $err_msg = 'Subscriber Number required if Country Code is set'; $self->field('e164')->add_error($err_msg); } elsif(defined $sn && $sn ne '' && (!defined $cc || $cc eq '')) { diff --git a/lib/NGCP/Panel/Form/DestinationSet.pm b/lib/NGCP/Panel/Form/DestinationSet.pm index ba8e6cd0e7..217b385b6c 100644 --- a/lib/NGCP/Panel/Form/DestinationSet.pm +++ b/lib/NGCP/Panel/Form/DestinationSet.pm @@ -2,6 +2,7 @@ package NGCP::Panel::Form::DestinationSet; use HTML::FormHandler::Moose; use HTML::FormHandler::Widget::Block::Bootstrap; use Moose::Util::TypeConstraints; +use NGCP::Panel::Field::PosInteger; extends 'HTML::FormHandler'; with 'NGCP::Panel::Render::RepeatableJs'; @@ -83,14 +84,14 @@ has_field 'destination.uri.destination' => ( wrapper_class => [qw/hfh-rep-field/], ); has_field 'destination.uri.timeout' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', label => 'for (seconds)', default => 300, wrapper_class => [qw/hfh-rep-field/], ); has_field 'destination.priority' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', label => 'Priority', wrapper_class => [qw/hfh-rep-field/], default => 1, diff --git a/lib/NGCP/Panel/Form/PeeringServer.pm b/lib/NGCP/Panel/Form/PeeringServer.pm index bc9f33efe6..6c977bd0ce 100644 --- a/lib/NGCP/Panel/Form/PeeringServer.pm +++ b/lib/NGCP/Panel/Form/PeeringServer.pm @@ -3,6 +3,7 @@ use Sipwise::Base; use HTML::FormHandler::Moose; extends 'HTML::FormHandler'; use Moose::Util::TypeConstraints; +use NGCP::Panel::Field::PosInteger; use HTML::FormHandler::Widget::Block::Bootstrap; @@ -28,7 +29,7 @@ has_field 'host' => ( ); has_field 'port' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', max_range => 65535, default => '5060', required => 1, @@ -45,7 +46,7 @@ has_field 'transport' => ( ); has_field 'weight' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', required => 1, max_range => 25, default => 1, diff --git a/lib/NGCP/Panel/Form/Subscriber.pm b/lib/NGCP/Panel/Form/Subscriber.pm index 6fb398162f..ca7d27f0cd 100644 --- a/lib/NGCP/Panel/Form/Subscriber.pm +++ b/lib/NGCP/Panel/Form/Subscriber.pm @@ -8,7 +8,7 @@ use HTML::FormHandler::Widget::Block::Bootstrap; use NGCP::Panel::Field::Domain; use NGCP::Panel::Field::CustomerContract; -use NGCP::Panel::Field::Reseller; +use NGCP::Panel::Field::PosInteger; has '+widget_wrapper' => ( default => 'Bootstrap' ); has_field 'submitid' => ( type => 'Hidden' ); @@ -52,7 +52,7 @@ has_field 'e164' => ( ); has_field 'e164.cc' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', element_attr => { class => ['ngcp_e164_cc'], rel => ['tooltip'], @@ -63,7 +63,7 @@ has_field 'e164.cc' => ( ); has_field 'e164.ac' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', element_attr => { class => ['ngcp_e164_ac'], rel => ['tooltip'], @@ -74,7 +74,7 @@ has_field 'e164.ac' => ( ); has_field 'e164.sn' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', element_attr => { class => ['ngcp_e164_sn'], rel => ['tooltip'], @@ -165,7 +165,18 @@ sub validate { my $cc = $self->field('e164.cc')->value; my $sn = $self->field('e164.sn')->value; - if (defined $cc && $cc ne '' && (!defined $sn || $sn eq '')) { + my %sub_errors = map {$_, 1} ( + @{ $self->field('e164.cc')->errors }, + @{ $self->field('e164.ac')->errors }, + @{ $self->field('e164.sn')->errors } ); + $self->field('e164')->push_errors(keys %sub_errors); + $self->field('e164.cc')->clear_errors; + $self->field('e164.ac')->clear_errors; + $self->field('e164.sn')->clear_errors; + + if ($self->field('e164')->has_errors) { + #dont add more errors + } elsif (defined $cc && $cc ne '' && (!defined $sn || $sn eq '')) { my $err_msg = 'Subscriber Number required if Country Code is set'; $self->field('e164')->add_error($err_msg); } elsif(defined $sn && $sn ne '' && (!defined $cc || $cc eq '')) { diff --git a/lib/NGCP/Panel/Form/SubscriberCFSimple.pm b/lib/NGCP/Panel/Form/SubscriberCFSimple.pm index 6d1731cc09..500c4052b2 100644 --- a/lib/NGCP/Panel/Form/SubscriberCFSimple.pm +++ b/lib/NGCP/Panel/Form/SubscriberCFSimple.pm @@ -2,6 +2,7 @@ package NGCP::Panel::Form::SubscriberCFSimple; use HTML::FormHandler::Moose; use HTML::FormHandler::Widget::Block::Bootstrap; use Moose::Util::TypeConstraints; +use NGCP::Panel::Field::PosInteger; extends 'HTML::FormHandler'; has '+widget_wrapper' => (default => 'Bootstrap'); @@ -67,7 +68,7 @@ has_field 'destination.uri.destination' => ( label => 'URI/Number', ); has_field 'destination.uri.timeout' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', label => 'for (seconds)', default => 300, ); diff --git a/lib/NGCP/Panel/Form/SubscriberCFTAdvanced.pm b/lib/NGCP/Panel/Form/SubscriberCFTAdvanced.pm index 3db59f90ce..5a5b0132ad 100644 --- a/lib/NGCP/Panel/Form/SubscriberCFTAdvanced.pm +++ b/lib/NGCP/Panel/Form/SubscriberCFTAdvanced.pm @@ -2,10 +2,11 @@ package NGCP::Panel::Form::SubscriberCFTAdvanced; use HTML::FormHandler::Moose; use HTML::FormHandler::Widget::Block::Bootstrap; use Moose::Util::TypeConstraints; +use NGCP::Panel::Field::PosInteger; extends 'NGCP::Panel::Form::SubscriberCFAdvanced'; has_field 'ringtimeout' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', required => 1, label => 'after ring timeout', element_attr => { diff --git a/lib/NGCP/Panel/Form/SubscriberCFTSimple.pm b/lib/NGCP/Panel/Form/SubscriberCFTSimple.pm index 9cd291bac0..46cb5e1c69 100644 --- a/lib/NGCP/Panel/Form/SubscriberCFTSimple.pm +++ b/lib/NGCP/Panel/Form/SubscriberCFTSimple.pm @@ -2,10 +2,11 @@ package NGCP::Panel::Form::SubscriberCFTSimple; use HTML::FormHandler::Moose; use HTML::FormHandler::Widget::Block::Bootstrap; use Moose::Util::TypeConstraints; +use NGCP::Panel::Field::PosInteger; extends 'NGCP::Panel::Form::SubscriberCFSimple'; has_field 'ringtimeout' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', required => 1, label => 'after ring timeout', element_attr => { diff --git a/lib/NGCP/Panel/Form/SubscriberEdit.pm b/lib/NGCP/Panel/Form/SubscriberEdit.pm index afcd778330..6e28525e6e 100644 --- a/lib/NGCP/Panel/Form/SubscriberEdit.pm +++ b/lib/NGCP/Panel/Form/SubscriberEdit.pm @@ -9,6 +9,7 @@ use HTML::FormHandler::Widget::Block::Bootstrap; use NGCP::Panel::Field::Domain; use NGCP::Panel::Field::CustomerContract; use NGCP::Panel::Field::Reseller; +use NGCP::Panel::Field::PosInteger; with 'NGCP::Panel::Render::RepeatableJs'; @@ -54,7 +55,7 @@ has_field 'e164' => ( ); has_field 'e164.cc' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', element_attr => { class => ['ngcp_e164_cc'], rel => ['tooltip'], @@ -65,7 +66,7 @@ has_field 'e164.cc' => ( ); has_field 'e164.ac' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', element_attr => { class => ['ngcp_e164_ac'], rel => ['tooltip'], @@ -76,7 +77,7 @@ has_field 'e164.ac' => ( ); has_field 'e164.sn' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', element_attr => { class => ['ngcp_e164_sn'], rel => ['tooltip'], @@ -112,7 +113,7 @@ has_field 'alias_number.e164' => ( ); has_field 'alias_number.e164.cc' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', element_attr => { class => ['ngcp_e164_cc'], rel => ['tooltip'], @@ -123,7 +124,7 @@ has_field 'alias_number.e164.cc' => ( ); has_field 'alias_number.e164.ac' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', element_attr => { class => ['ngcp_e164_ac'], rel => ['tooltip'], @@ -134,7 +135,7 @@ has_field 'alias_number.e164.ac' => ( ); has_field 'alias_number.e164.sn' => ( - type => 'PosInteger', + type => '+NGCP::Panel::Field::PosInteger', element_attr => { class => ['ngcp_e164_sn'], rel => ['tooltip'],