MT#6693 Rework PBX subscriber/group handling.

agranig/subprof
Andreas Granig 12 years ago
parent f197d4a665
commit 16b44673f4

@ -281,19 +281,35 @@ sub base :Chained('list_customer') :PathPart('') :CaptureArgs(1) {
desc => $c->loc('Invalid product id for this customer contract.'),
) unless($product);
$c->stash->{pbxgroup_dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [
$c->stash->{subscriber_dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [
{ name => "id", search => 1, title => $c->loc("#") },
{ name => "name", search => 1, title => $c->loc("Name") },
{ name => "extension", search => 1, title => $c->loc("Extension") },
{ name => "username", search => 1, title => $c->loc("Name") },
{ name => "provisioning_voip_subscriber.pbx_extension", search => 1, title => $c->loc("Extension") },
]);
my $subs = NGCP::Panel::Utils::Subscriber::get_custom_subscriber_struct(
c => $c,
contract => $contract_rs->first,
show_locked => 1,
);
$c->stash->{subscribers} = $subs->{subscribers};
$c->stash->{pbx_groups} = $subs->{pbx_groups};
$c->stash->{pbxgroup_dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [
{ name => "id", search => 1, title => $c->loc("#") },
{ name => "username", search => 1, title => $c->loc("Name") },
{ name => "provisioning_voip_subscriber.pbx_extension", search => 1, title => $c->loc("Extension") },
{ name => "provisioning_voip_subscriber.pbx_hunt_policy", search => 1, title => $c->loc("Hunt Policy") },
{ name => "provisioning_voip_subscriber.pbx_hunt_timeout", search => 1, title => $c->loc("Serial Hunt Timeout") },
]);
$c->stash->{subscribers} = $c->model('DB')->resultset('voip_subscribers')->search({
contract_id => $contract_id,
status => { '!=' => 'terminated' },
'provisioning_voip_subscriber.is_pbx_group' => 0,
}, {
join => 'provisioning_voip_subscriber',
});
if($c->config->{features}->{cloudpbx}) {
$c->stash->{pbx_groups} = $c->model('DB')->resultset('voip_subscribers')->search({
contract_id => $contract_id,
status => { '!=' => 'terminated' },
'provisioning_voip_subscriber.is_pbx_group' => 1,
}, {
join => 'provisioning_voip_subscriber',
});
}
my $field_devs = [ $c->model('DB')->resultset('autoprov_field_devices')->search({
'contract_id' => $contract_rs->first->id
@ -498,16 +514,15 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) {
$pbx = 1 if $c->stash->{product}->class eq 'pbxaccount';
my $form;
my $posted = ($c->request->method eq 'POST');
my $admin_subscribers = NGCP::Panel::Utils::Subscriber::get_admin_subscribers(
voip_subscribers => $c->stash->{subscribers});
$c->stash->{admin_subscriber} = $c->model('DB')->resultset('voip_subscribers')->find(
$admin_subscribers->[0]->{id},
);
my $admin_subscribers = $c->stash->{subscribers}->search({
'provisioning_voip_subscriber.admin' => 1,
});
$c->stash->{admin_subscriber} = $admin_subscribers->first;
if($c->config->{features}->{cloudpbx} && $pbx) {
$c->stash(customer_id => $c->stash->{contract}->id);
# we need to create an admin subscriber first
unless(@{ $admin_subscribers }) {
unless($c->stash->{admin_subscriber}) {
$pbxadmin = 1;
$form = NGCP::Panel::Form::Customer::PbxAdminSubscriber->new(ctx => $c);
} else {
@ -549,18 +564,18 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) {
$schema->txn_do(sub {
my $preferences = {};
if($pbx && !$pbxadmin) {
my $admin = $admin_subscribers->[0];
$form->params->{domain}{id} = $admin->{domain_id};
my $admin = $c->stash->{admin_subscriber};
$form->params->{domain}{id} = $admin->domain_id;
# TODO: make DT selection multi-select capable
$form->params->{pbx_group_id} = $form->params->{group}{id};
delete $form->params->{group};
my $base_number = $admin->{primary_number};
my $base_number = $admin->primary_number;
if($base_number) {
$preferences->{cloud_pbx_base_cli} = $base_number->{cc} . $base_number->{ac} . $base_number->{sn};
if($form->params->{extension}) {
$form->params->{e164}{cc} = $base_number->{cc};
$form->params->{e164}{ac} = $base_number->{ac};
$form->params->{e164}{sn} = $base_number->{sn} . $form->params->{extension};
$preferences->{cloud_pbx_base_cli} = $base_number->cc . $base_number->ac . $base_number->sn;
if($form->params->{pbx_extension}) {
$form->params->{e164}{cc} = $base_number->cc;
$form->params->{e164}{ac} = $base_number->ac;
$form->params->{e164}{sn} = $base_number->sn . $form->params->{pbx_extension};
}
}
}
@ -838,10 +853,26 @@ sub calls_svg :Chained('base') :PathPart('calls/template') :Args {
}
}
sub subscriber_ajax :Chained('base') :PathPart('subscriber/ajax') :Args(0) {
my ($self, $c) = @_;
my $res = $c->stash->{contract}->voip_subscribers->search({
'provisioning_voip_subscriber.is_pbx_group' => 0,
status => { '!=' => 'terminated' },
},{
join => 'provisioning_voip_subscriber',
});
NGCP::Panel::Utils::Datatables::process($c, $res, $c->stash->{subscriber_dt_columns});
$c->detach( $c->view("JSON") );
}
sub pbx_group_ajax :Chained('base') :PathPart('pbx/group/ajax') :Args(0) {
my ($self, $c) = @_;
my $res = $c->model('DB')->resultset('voip_pbx_groups')->search({
contract_id => $c->stash->{contract}->id,
my $res = $c->stash->{contract}->voip_subscribers->search({
'provisioning_voip_subscriber.is_pbx_group' => 1,
},{
join => 'provisioning_voip_subscriber',
});
NGCP::Panel::Utils::Datatables::process($c, $res, $c->stash->{pbxgroup_dt_columns});
$c->detach( $c->view("JSON") );
@ -866,9 +897,11 @@ sub pbx_group_create :Chained('base') :PathPart('pbx/group/create') :Args(0) {
}
my $posted = ($c->request->method eq 'POST');
my $admin_subscribers = NGCP::Panel::Utils::Subscriber::get_admin_subscribers(
voip_subscribers => $c->stash->{subscribers});
unless(@{ $admin_subscribers }) {
my $admin_subscribers = $c->stash->{subscribers}->search({
'provisioning_voip_subscriber.admin' => 1,
});
$c->stash->{admin_subscriber} = $admin_subscribers->first;
unless($c->stash->{admin_subscriber}) {
NGCP::Panel::Utils::Message->error(
c => $c,
error => 'cannot create pbx group without having an admin subscriber',
@ -896,27 +929,24 @@ sub pbx_group_create :Chained('base') :PathPart('pbx/group/create') :Args(0) {
my $schema = $c->model('DB');
$schema->txn_do( sub {
my $preferences = {};
my $admin = $admin_subscribers->[0];
my $admin = $c->stash->{admin_subscriber};
my $base_number = $admin->{primary_number};
my $base_number = $admin->primary_number;
if($base_number) {
$preferences->{cloud_pbx_base_cli} = $base_number->{cc} . $base_number->{ac} . $base_number->{sn};
if($form->params->{extension}) {
$form->params->{e164}{cc} = $base_number->{cc};
$form->params->{e164}{ac} = $base_number->{ac};
$form->params->{e164}{sn} = $base_number->{sn} . $form->params->{extension};
$preferences->{cloud_pbx_base_cli} = $base_number->cc . $base_number->ac . $base_number->sn;
if($form->params->{pbx_extension}) {
$form->params->{e164}{cc} = $base_number->cc;
$form->params->{e164}{ac} = $base_number->ac;
$form->params->{e164}{sn} = $base_number->sn . $form->params->{pbx_extension};
}
}
$form->params->{is_pbx_group} = 1;
$form->params->{domain}{id} = $admin->{domain_id};
$form->params->{domain}{id} = $admin->domain_id;
$form->params->{status} = 'active';
$form->params->{username} = lc $form->params->{name};
$form->params->{username} =~ s/\s+/_/g;
$preferences->{cloud_pbx} = 1;
$preferences->{cloud_pbx_hunt_policy} = $form->params->{hunt_policy};
$preferences->{cloud_pbx_hunt_timeout} = $form->params->{hunt_policy_timeout};
$preferences->{cloud_pbx_hunt_timeout} = $form->params->{hunt_timeout};
my $billing_subscriber = NGCP::Panel::Utils::Subscriber::create_subscriber(
c => $c,
schema => $schema,
@ -925,12 +955,7 @@ sub pbx_group_create :Chained('base') :PathPart('pbx/group/create') :Args(0) {
admin_default => 0,
preferences => $preferences,
);
foreach my $k(qw/is_pbx_group username password e164 pbx_group domain status/) {
delete $form->params->{$k};
}
$form->params->{subscriber_id} = $billing_subscriber->provisioning_voip_subscriber->id;
my $group = $c->stash->{contract}->voip_pbx_groups->create($form->params);
$c->session->{created_objects}->{group} = { id => $group->id };
$c->session->{created_objects}->{group} = { id => $billing_subscriber->id };
});
$c->flash(messages => [{type => 'success', text => $c->loc('PBX group successfully created.')}]);
@ -955,7 +980,7 @@ sub pbx_group_create :Chained('base') :PathPart('pbx/group/create') :Args(0) {
sub pbx_group_base :Chained('base') :PathPart('pbx/group') :CaptureArgs(1) {
my ($self, $c, $group_id) = @_;
my $group = $c->model('DB')->resultset('voip_pbx_groups')->find($group_id);
my $group = $c->stash->{pbx_groups}->find($group_id);
unless($group) {
NGCP::Panel::Utils::Message->error(
c => $c,

@ -12,7 +12,7 @@ has_field 'id' => (
# this is set in the form:
#ajax_src => '/',
table_titles => ['#', 'Name', 'Extension'],
table_fields => ['id', 'name', 'extension'],
table_fields => ['id', 'username', 'provisioning_voip_subscriber_pbx_extension'],
);
has_field 'create' => (

@ -10,7 +10,7 @@ has_field 'group' => (
validate_when_empty => 1,
);
has_field 'extension' => (
has_field 'pbx_extension' => (
type => '+NGCP::Panel::Field::PosInteger',
element_attr => {
rel => ['tooltip'],
@ -23,7 +23,7 @@ has_field 'extension' => (
has_block 'fields' => (
tag => 'div',
class => [qw/modal-body/],
render_list => [qw/group extension display_name webusername webpassword username password status external_id profile_set/ ],
render_list => [qw/group pbx_extension display_name webusername webpassword username password status external_id profile/ ],
);
sub field_list {
@ -35,6 +35,15 @@ sub field_list {
$group->field('id')->ajax_src(
$c->uri_for_action('/customer/pbx_group_ajax', [$c->stash->{customer_id}])->as_string
);
if($c->stash->{admin_subscriber}) {
my $profile_set = $c->stash->{admin_subscriber}->provisioning_voip_subscriber->voip_subscriber_profile_set;
if($profile_set) {
$self->field('profile')->field('id')->ajax_src(
$c->uri_for_action('/subscriberprofile/profile_ajax', [$profile_set->id])->as_string
);
}
}
}

@ -37,10 +37,8 @@ sub update_fields {
$c->uri_for_action('/customer/pbx_group_ajax', [$c->stash->{customer_id}])->as_string
);
print "++++++++++++++++++++++ fetching profile set\n";
my $profile_set = $c->stash->{subscriber}->provisioning_voip_subscriber->voip_subscriber_profile_set;
if($profile_set) {
print "++++++++++++++++++++++ got profile set\n";
$self->field('profile')->field('id')->ajax_src(
$c->uri_for_action('/subscriberprofile/profile_ajax', [$profile_set->id])->as_string
);

@ -3,13 +3,13 @@ package NGCP::Panel::Form::Customer::PbxGroup;
use HTML::FormHandler::Moose;
extends 'NGCP::Panel::Form::Customer::PbxGroupBase';
has_field 'name' => (
has_field 'username' => (
type => 'Text',
required => 1,
label => 'Name',
);
has_field 'extension' => (
has_field 'pbx_extension' => (
type => 'Text',
required => 1,
label => 'Extension',
@ -18,14 +18,14 @@ has_field 'extension' => (
has_block 'fields' => (
tag => 'div',
class => [qw/modal-body/],
render_list => [qw/name extension hunt_policy hunt_policy_timeout/],
render_list => [qw/username pbx_extension pbx_hunt_policy pbx_hunt_timeout/],
);
sub validate_name {
sub validate_username {
my ($self, $field) = @_;
unless($field->value =~ /^[a-zA-Z0-9_\-\s]+$/) {
$field->add_error("Invalid group name, must only contain letters, digits, - and _ and spaces");
unless($field->value =~ /^[a-zA-Z0-9_\-]+$/) {
$field->add_error("Invalid group name, must only contain letters, digits, - and _");
}
}

@ -12,7 +12,7 @@ has_field 'submitid' => ( type => 'Hidden' );
sub build_render_list {[qw/submitid fields actions/]}
sub build_form_element_class {[qw(form-horizontal)]}
has_field 'hunt_policy' => (
has_field 'pbx_hunt_policy' => (
type => 'Select',
required => 1,
label => 'Hunting Policy',
@ -23,7 +23,7 @@ has_field 'hunt_policy' => (
default => 'serial',
);
has_field 'hunt_policy_timeout' => (
has_field 'pbx_hunt_timeout' => (
type => '+NGCP::Panel::Field::PosInteger',
required => 1,
label => 'Serial Hunting Timeout',
@ -40,7 +40,7 @@ has_field 'save' => (
has_block 'fields' => (
tag => 'div',
class => [qw/modal-body/],
render_list => [qw/hunt_policy hunt_policy_timeout/],
render_list => [qw/pbx_hunt_policy pbx_hunt_timeout/],
);
has_block 'actions' => (

@ -115,16 +115,6 @@ sub get_lock_string {
return $LOCK{$level};
}
sub get_admin_subscribers {
my %params = @_;
my $subs = $params{voip_subscribers};
my @subscribers = ();
foreach my $s(@{ $subs }) {
push @subscribers, $s if($s->{admin});
}
return \@subscribers;
}
sub create_subscriber {
my %params = @_;
my $c = $params{c};
@ -214,6 +204,7 @@ sub create_subscriber {
domain_id => $prov_domain->id,
is_pbx_group => $params->{is_pbx_group} // 0,
pbx_group_id => $params->{pbx_group_id},
pbx_extension => $params->{pbx_extension},
profile_set_id => $profile_set ? $profile_set->id : undef,
profile_id => $profile ? $profile->id : undef,
create_timestamp => NGCP::Panel::Utils::DateTime::current_local,
@ -275,47 +266,6 @@ sub update_preferences {
}
}
sub get_custom_subscriber_struct {
my %params = @_;
my $c = $params{c};
my $contract = $params{contract};
my @subscribers = ();
my @pbx_groups = ();
my $voip_sub_rs = $contract->voip_subscribers;
if($params{show_locked}) {
$voip_sub_rs = $voip_sub_rs->search_rs({ status => { -in => [ 'active', 'locked' ] } });
} else {
$voip_sub_rs = $voip_sub_rs->search_rs({ status => 'active' });
}
foreach my $s($voip_sub_rs->all) {
my $sub = { $s->get_columns };
if($c->config->{features}->{cloudpbx}) {
$sub->{voip_pbx_group} = { $s->provisioning_voip_subscriber->voip_pbx_group->get_columns }
if($s->provisioning_voip_subscriber->voip_pbx_group);
}
$sub->{domain} = $s->domain->domain;
$sub->{admin} = $s->provisioning_voip_subscriber->admin if
$s->provisioning_voip_subscriber;
$sub->{primary_number} = {$s->primary_number->get_columns} if(defined $s->primary_number);
$sub->{locations} = [ map { { $_->get_columns } } $c->model('DB')->resultset('location')->
search({
username => $s->username,
($c->config->{features}->{multidomain}) ? (domain => $s->domain->domain) : (),
})->all ];
if($c->config->{features}->{cloudpbx} && $s->provisioning_voip_subscriber->is_pbx_group) {
my $grp = $contract->voip_pbx_groups->find({ subscriber_id => $s->provisioning_voip_subscriber->id });
$sub->{voip_pbx_group} = { $grp->get_columns } if $grp;
push @pbx_groups, $sub;
} else {
push @subscribers, $sub;
}
}
return { subscribers => \@subscribers, pbx_groups => \@pbx_groups };
}
sub update_pbx_group_prefs {
my %params = @_;
@ -333,7 +283,7 @@ sub update_pbx_group_prefs {
my $uri = "sip:$username\@$domain";
if($old_group_id) {
$old_grp_subscriber= $c->model('DB')->resultset('voip_pbx_groups')
$old_grp_subscriber= $c->stash->{pbx_groups}
->find($old_group_id)
->provisioning_voip_subscriber;
if($old_grp_subscriber) {
@ -345,7 +295,7 @@ sub update_pbx_group_prefs {
}
}
if($new_group_id) {
$new_grp_subscriber = $c->model('DB')->resultset('voip_pbx_groups')
$new_grp_subscriber = $c->stash->{pbx_groups}
->find($new_group_id)
->provisioning_voip_subscriber;
if($new_grp_subscriber) {
@ -477,7 +427,7 @@ sub update_subscriber_numbers {
if ( (defined $old_cc && defined $old_sn)
&& $billing_subs->contract->billing_mappings->first->product->class eq "pbxaccount"
&& ! defined $prov_subs->voip_pbx_group
&& ! defined $prov_subs->pbx_group_id
&& $prov_subs->admin ) {
my $customer_subscribers_rs = $billing_subs->contract->voip_subscribers;
my $my_cc = $primary_number->{cc};
@ -618,26 +568,23 @@ sub terminate {
my $schema = $c->model('DB');
$schema->txn_do(sub {
if($subscriber->provisioning_voip_subscriber->is_pbx_group) {
my $pbx_group = $schema->resultset('voip_pbx_groups')->find({
subscriber_id => $subscriber->provisioning_voip_subscriber->id
my $group = $schema->resultset('provisioning_voip_subscribers')->search({
pbx_group_id => $subscriber->id
});
$group->update({
pbx_group_id => undef,
});
if($pbx_group) {
$pbx_group->provisioning_voip_subscribers->update_all({
pbx_group_id => undef,
});
}
$pbx_group->delete;
}
my $prov_subscriber = $subscriber->provisioning_voip_subscriber;
if($prov_subscriber) {
update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => $prov_subscriber->voip_pbx_group->id,
old_group_id => $prov_subscriber->pbx_group_id,
new_group_id => undef,
username => $prov_subscriber->username,
domain => $prov_subscriber->domain->domain,
) if($prov_subscriber->voip_pbx_group);
) if($prov_subscriber->pbx_group_id);
$prov_subscriber->delete;
}
if ($c->user->roles eq 'subscriberadmin') {

@ -179,57 +179,34 @@
<i class="icon-star"></i> [% c.loc('Create Subscriber') %]
</a>
[% END -%]
<div class="ngcp-separator"></div>
<table class="table table-bordered table-striped table-highlight table-hover" id="subscribers_table">
<thead>
<tr>
<th>[% c.loc('SIP URI') %]</th>
<th>[% c.loc('Primary Number') %]</th>
[% IF c.config.features.cloudpbx && product.class == 'pbxaccount' -%]
<th>[% c.loc('PBX Group') %]</th>
[% END -%]
<th>[% c.loc('Registered Devices') %]</th>
<th class="ngcp-actions-column"></th>
</tr>
</thead>
<tbody>
[% FOR subscriber IN subscribers -%]
<tr class="sw_action_row">
<td>[% subscriber.username %]@[% subscriber.domain %]</td>
<td>[% subscriber.primary_number.cc %] [% subscriber.primary_number.ac %] [% subscriber.primary_number.sn %]</td>
[% IF c.config.features.cloudpbx && product.class == 'pbxaccount' -%]
<td>
[% subscriber.voip_pbx_group.name -%]
</td>
[% END -%]
<td>
[% FOR location IN subscriber.locations -%]
[% location.user_agent %]<br/>
[% END -%]
</td>
<td class="ngcp-actions-column">
<div class="sw_actions">
<a class="btn btn-primary btn-small" href="[% c.uri_for_action("/subscriber/details", [subscriber.id]) %]">
<i class="icon-th-list"></i> [% c.loc('Details') %]
</a>
<a class="btn btn-tertiary btn-small" href="[% c.uri_for_action("/subscriber/preferences", [subscriber.id]) %]">
<i class="icon-list"></i> [% c.loc('Preferences') %]
</a>
[% IF (!c.user.readonly && (c.user.role == 'admin' || c.user.role == 'reseller')) || c.user.uuid != subscriber.uuid -%]
<a class="btn btn-secondary btn-small" href="[% c.uri_for_action("/subscriber/terminate", [subscriber.id]) %]" data-confirm="Terminate">
<i class="icon-remove"></i> [% c.loc('Terminate') %]</a>
[% END -%]
</div>
</td>
</tr>
[% END -%]
</tbody>
</table>
[%
helper.name = c.loc('Subscribers');
helper.identifier = 'subscribers';
helper.dt_columns = subscriber_dt_columns;
helper.ajax_uri = c.uri_for_action('/customer/subscriber_ajax', [ c.req.captures.0 ]);
UNLESS c.user.read_only;
helper.dt_buttons = [
{ name = c.loc('Terminate'), uri = "/subscriber/'+full.id+'/terminate", class = 'btn-small btn-secondary', icon = 'icon-remove' },
{ name = c.loc('Details'), uri = "/subscriber/'+full.id+'/details", class = 'btn-small btn-primary', icon = 'icon-th-list' },
{ name = c.loc('Preferences'), uri = "/subscriber/'+full.id+'/preferences", class = 'btn-small btn-tertiary', icon = 'icon-list' },
];
ELSE;
helper.dt_buttons = [
{ name = c.loc('Details'), uri = "/subscriber/'+full.id+'/details", class = 'btn-small btn-primary', icon = 'icon-th-list' },
{ name = c.loc('Preferences'), uri = "/subscriber/'+full.id+'/preferences", class = 'btn-small btn-tertiary', icon = 'icon-list' },
];
END;
PROCESS 'helpers/datatables.tt';
%]
</div>
</div>
</div>
[% IF c.config.features.cloudpbx && product.class == 'pbxaccount' && subscribers.size -%]
[% IF c.config.features.cloudpbx && product.class == 'pbxaccount' && subscribers.count -%]
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" data-toggle="collapse" data-parent="#customer_details" href="#collapse_pbxgroups">[% c.loc('PBX Groups') %]</a>
@ -251,48 +228,29 @@
</div>
[% END -%]
<div class="ngcp-separator"></div>
<table class="table table-bordered table-striped table-highlight table-hover" id="subscribers_table">
<thead>
<tr>
<th>[% c.loc('Name') %]</th>
<th>[% c.loc('SIP URI') %]</th>
<th>[% c.loc('Primary Number') %]</th>
<th>[% c.loc('Hunting Policy') %]</th>
<th>[% c.loc('Hunting Timeout') %]</th>
<th class="ngcp-actions-column"></th>
</tr>
</thead>
<tbody>
[% FOR subscriber IN pbx_groups -%]
<tr class="sw_action_row">
<td>[% subscriber.voip_pbx_group.name %]</td>
<td>[% subscriber.username %]@[% subscriber.domain %]</td>
<td>[% subscriber.primary_number.cc %] [% subscriber.primary_number.ac %] [% subscriber.primary_number.sn %]</td>
<td>[% subscriber.voip_pbx_group.hunt_policy %]</td>
<td>[% subscriber.voip_pbx_group.hunt_policy_timeout %]</td>
<td class="ngcp-actions-column">
<div class="sw_actions">
[% UNLESS c.user.readonly -%]
<a class="btn btn-secondary btn-small" href="[% c.uri_for_action("/subscriber/terminate", [subscriber.id]) %]" data-confirm="Terminate">
<i class="icon-remove"></i> [% c.loc('Terminate') %]
</a>
<a class="btn btn-primary btn-small" href="[% c.uri_for_action("/customer/pbx_group_edit", [contract.id, subscriber.voip_pbx_group.id]) %]">
<i class="icon-edit"></i> [% c.loc('Edit') %]
</a>
[% END -%]
<a class="btn btn-primary btn-small" href="[% c.uri_for_action("/subscriber/details", [subscriber.id]) %]">
<i class="icon-th-list"></i> [% c.loc('Details') %]
</a>
<a class="btn btn-tertiary btn-small" href="[% c.uri_for_action("/subscriber/preferences", [subscriber.id]) %]">
<i class="icon-list"></i> [% c.loc('Preferences') %]
</a>
</div>
</td>
</tr>
[% END -%]
</tbody>
</table>
[%
helper.name = c.loc('PBX Groups');
helper.identifier = 'pbx_groups';
helper.dt_columns = pbxgroup_dt_columns;
helper.ajax_uri = c.uri_for_action('/customer/pbx_group_ajax', [ c.req.captures.0 ]);
UNLESS c.user.read_only;
helper.dt_buttons = [
{ name = c.loc('Terminate'), uri = "/subscriber/'+full.id+'/terminate", class = 'btn-small btn-secondary', icon = 'icon-remove' },
{ name = c.loc('Details'), uri = "/subscriber/'+full.id+'/details", class = 'btn-small btn-primary', icon = 'icon-th-list' },
{ name = c.loc('Preferences'), uri = "/subscriber/'+full.id+'/preferences", class = 'btn-small btn-tertiary', icon = 'icon-list' },
];
ELSE;
helper.dt_buttons = [
{ name = c.loc('Details'), uri = "/subscriber/'+full.id+'/details", class = 'btn-small btn-primary', icon = 'icon-th-list' },
{ name = c.loc('Preferences'), uri = "/subscriber/'+full.id+'/preferences", class = 'btn-small btn-tertiary', icon = 'icon-list' },
];
END;
PROCESS 'helpers/datatables.tt';
%]
</div>
</div>
</div>

@ -1,4 +1,11 @@
[% site_config.title = c.loc('Subscriber [_1]@[_2]', subscriber.username, subscriber.domain.domain) -%]
[%
IF subscriber.provisioning_voip_subscriber.is_pbx_group;
site_config.title = c.loc('PBX Group [_1]@[_2]', subscriber.username, subscriber.domain.domain);
ELSE;
site_config.title = c.loc('Subscriber [_1]@[_2]', subscriber.username, subscriber.domain.domain);
END;
-%]
<div class="row">
<span class="pull-left" style="margin:0 5px 0 5px;">

@ -1,4 +1,10 @@
[% site_config.title = c.loc('Subscriber Preferences for [_1]@[_2]', subscriber.username, subscriber.domain.domain) -%]
[%
IF subscriber.provisioning_voip_subscriber.is_pbx_group;
site_config.title = c.loc('PBX Group Preferences for [_1]@[_2]', subscriber.username, subscriber.domain.domain);
ELSE;
site_config.title = c.loc('Subscriber Preferences for [_1]@[_2]', subscriber.username, subscriber.domain.domain);
END;
-%]
[%
helper.name = c.loc('Subscriber');

Loading…
Cancel
Save