diff --git a/src/api/pbx-config.js b/src/api/pbx-config.js
index 8f9166d0..0ac2c2eb 100644
--- a/src/api/pbx-config.js
+++ b/src/api/pbx-config.js
@@ -1,56 +1,71 @@
import Vue from 'vue';
+import { getJsonBody } from './utils';
+import { getNumbers } from './user';
-export function getGroups(options) {
+var assumedRows = 1000;
+
+export function getAllPbxSubscribers() {
return new Promise((resolve, reject)=>{
- Vue.http.get('/api/subscribers', {
- params: {
- is_pbx_group: true
- }
- }).then((result)=>{
- var groups = [];
- var body = JSON.parse(result.body);
- if(_.isArray(body["_embedded"]["ngcp:subscribers"])) {
- body['_embedded']['ngcp:subscribers'].forEach((group)=>{
- groups.push(group);
+ var params = {};
+ Promise.resolve().then(()=>{
+ return Vue.http.get('/api/subscribers', {
+ params: _.assign(params, {
+ page: 1,
+ rows: assumedRows,
+ })
+ });
+ }).then((res)=>{
+ let body = getJsonBody(res.body);
+ if(body.total_count > assumedRows) {
+ return Vue.http.get('/api/subscribers', {
+ params: _.assign(params, {
+ page: 1,
+ rows: body.total_count,
+ })
});
+ } else {
+ return Promise.resolve(body);
}
- resolve(groups);
+ }).then(($subscribers)=>{
+ let subscribers = _.get($subscribers, '_embedded.ngcp:subscribers', []);
+ let pilot = null;
+ let seats = [];
+ let groups = [];
+ subscribers.forEach((subscriber)=>{
+ if(subscriber.is_pbx_group) {
+ groups.push(subscriber);
+ } else if(subscriber.is_pbx_pilot) {
+ pilot = subscriber;
+ } else {
+ seats.push(subscriber);
+ }
+ });
+ resolve({
+ pilot: pilot,
+ groups: groups,
+ seats: seats
+ });
}).catch((err)=>{
reject(err);
});
});
}
-export function createGroup(options) {
-
-}
-
-export function saveGroup(options) {
-
-}
-
-export function getSeats() {
-
-}
-
-export function createSeat() {
-
-}
-
-export function saveSeat() {
-
-}
-
-export function getDevices() {
-
-}
-
-export function createDevice() {
-
-}
-
-export function saveDevice() {
-
+export function getPbxConfiguration() {
+ return new Promise((resolve, reject)=>{
+ Promise.all([
+ getAllPbxSubscribers(),
+ getNumbers()
+ ]).then((result)=>{
+ resolve({
+ pilot: result[0].pilot,
+ seats: result[0].seats,
+ groups: result[0].groups,
+ numbers: result[1]
+ });
+ }).catch((err)=>{
+ reject(err);
+ });
+ });
}
-
diff --git a/src/api/user.js b/src/api/user.js
index fd588124..9303b394 100644
--- a/src/api/user.js
+++ b/src/api/user.js
@@ -2,6 +2,8 @@
import _ from 'lodash';
import Vue from 'vue';
+var assumedNumbers = 1000;
+
export function login(username, password) {
return new Promise((resolve, reject)=>{
var jwt = null;
@@ -68,8 +70,36 @@ export function getCapabilities() {
export function getNumbers() {
return new Promise((resolve, reject)=>{
- Vue.http.get('/api/numbers').then((result)=>{
- resolve(result);
+ let params = {};
+ let path = '/api/numbers';
+ Promise.resolve().then(()=>{
+ return Vue.http.get(path, {
+ params: _.assign(params, {
+ page: 1,
+ rows: assumedNumbers,
+ })
+ });
+ }).then((res)=>{
+ let body = JSON.parse(res.body);
+ if(body.total_count > assumedNumbers) {
+ return Vue.http.get(path, {
+ params: _.assign(params, {
+ page: 1,
+ rows: body.total_count,
+ })
+ });
+ } else {
+ return Promise.resolve(res);
+ }
+ }).then((res)=>{
+ let body = JSON.parse(res.body);
+ let numbers = [];
+ if(_.isArray(body["_embedded"]["ngcp:numbers"])) {
+ body['_embedded']['ngcp:numbers'].forEach((number)=>{
+ numbers.push(number);
+ });
+ }
+ resolve(numbers);
}).catch((err)=>{
reject(err);
});
diff --git a/src/components/card/CscNumberChip.vue b/src/components/card/CscNumberChip.vue
new file mode 100644
index 00000000..190b9c3d
--- /dev/null
+++ b/src/components/card/CscNumberChip.vue
@@ -0,0 +1,26 @@
+
+
+ {{ item.primary_number | number(item.pbx_extension) }}
+ {{ item.pbx_extension }}
+
+
+
+
+
+
diff --git a/src/components/layouts/Default.vue b/src/components/layouts/Default.vue
index f5e7a7e0..294e8169 100644
--- a/src/components/layouts/Default.vue
+++ b/src/components/layouts/Default.vue
@@ -69,11 +69,11 @@
:label="$t('navigation.pbxConfiguration.title')"
:sublabel="$t('navigation.pbxConfiguration.subTitle')">
-
+
-
+
diff --git a/src/components/pages/PbxConfiguration/CscPbxGroup.vue b/src/components/pages/PbxConfiguration/CscPbxGroup.vue
new file mode 100644
index 00000000..db759a32
--- /dev/null
+++ b/src/components/pages/PbxConfiguration/CscPbxGroup.vue
@@ -0,0 +1,191 @@
+
+
+
+
+ {{ group.display_name }}
+
+ {{ $t('pbxConfig.extension') }}: {{ group.pbx_extension }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/pages/PbxConfiguration/Groups.vue b/src/components/pages/PbxConfiguration/Groups.vue
index 3bc4023f..2ecf263b 100644
--- a/src/components/pages/PbxConfiguration/Groups.vue
+++ b/src/components/pages/PbxConfiguration/Groups.vue
@@ -1,17 +1,22 @@
-
+
+
+
diff --git a/src/components/pages/PbxConfiguration/Seats.vue b/src/components/pages/PbxConfiguration/Seats.vue
index 8446979c..14aad75b 100644
--- a/src/components/pages/PbxConfiguration/Seats.vue
+++ b/src/components/pages/PbxConfiguration/Seats.vue
@@ -1,18 +1,52 @@
-
+
+
+
+
+ {{ seat.display_name }}
+
+
+
+
diff --git a/src/filters/number.js b/src/filters/number.js
index 201ac394..4a85a6de 100644
--- a/src/filters/number.js
+++ b/src/filters/number.js
@@ -1,4 +1,20 @@
-export default function(number) {
- return '+' + number.cc + number.ac + number.sn;
+import _ from 'lodash';
+import { normalizeNumber } from './number-format'
+
+export default function(number, extension) {
+ let constructedNumber = "" + number.cc + number.ac + number.sn;
+ let normalizedNumber = normalizeNumber(constructedNumber);
+ let finalNumber;
+ if(_.isString(normalizedNumber)) {
+ finalNumber = normalizedNumber;
+ } else {
+ finalNumber = constructedNumber;
+ }
+ if(extension) {
+ return finalNumber.replace(new RegExp(extension + '$'), '');
+ } else {
+ return finalNumber;
+ }
+
}
diff --git a/src/locales/en.json b/src/locales/en.json
index 6b986eaa..908dc788 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -127,5 +127,22 @@
"number": "Number",
"endCall": "End Call",
"endCallDialog": "You are about to end the current call. Are you sure?"
+ },
+ "pbxConfig": {
+ "seat": "Seat",
+ "seats": "Seats",
+ "group": "Group",
+ "extension": "Extension",
+ "groupName": "Name",
+ "huntPolicy": "Hunt Policy",
+ "huntTimeout": "Hunt Timeout",
+ "primaryNumber": "Primary Number",
+ "aliasNumbers": "Alias Numbers",
+ "serialRinging": "Serial Ringing",
+ "parallelRinging": "Parallel Ringing",
+ "randomRinging": "Random Ringing",
+ "circularRinging": "Circular Ringing",
+ "allocatedByNobody": "Free",
+ "allocatedBy": "Allocated by {type} {name}"
}
}
diff --git a/src/store/index.js b/src/store/index.js
index 9f342f15..9578c233 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -8,7 +8,7 @@ import CallForwardModule from './call-forward'
import CallModule from './call'
import ConversationsModule from './conversations'
import LayoutModule from './layout'
-import PbxGroupsModule from './pbx-groups'
+import PbxConfigModule from './pbx-config'
import ReminderModule from './reminder'
import UserModule from './user'
@@ -21,7 +21,7 @@ export const store = new Vuex.Store({
call: CallModule,
conversations: ConversationsModule,
layout: LayoutModule,
- pbxGroups: PbxGroupsModule,
+ pbxConfig: PbxConfigModule,
reminder: ReminderModule,
user: UserModule
}
diff --git a/src/store/pbx-config.js b/src/store/pbx-config.js
new file mode 100644
index 00000000..f497abd4
--- /dev/null
+++ b/src/store/pbx-config.js
@@ -0,0 +1,92 @@
+
+import _ from 'lodash';
+import { getPbxConfiguration } from '../api/pbx-config'
+
+export default {
+ namespaced: true,
+ state: {
+ pilot: null,
+ groups: {},
+ groupsOrdered: [],
+ seats: {},
+ seatsOrdered: [],
+ numbers: []
+ },
+ getters: {
+ groups(state, getters) {
+ return state.groupsOrdered;
+ },
+ seats(state, getters) {
+ return state.seatsOrdered;
+ },
+ numbers(state, getters) {
+ return state.numbers;
+ },
+ aliasNumbers(state, getters) {
+
+ }
+ },
+ mutations: {
+ show: function(state, options) {
+ state.groups = options.groups;
+ },
+ listAll(state, all) {
+ state.pilot = all.pilot;
+ state.groups = {};
+ state.groupsOrdered = [];
+ state.seats = {};
+ state.seatsOrdered = [];
+ all.groups.forEach((group)=>{
+ state.groups[group.id] = group;
+ state.groupsOrdered.push(group);
+ });
+ all.seats.forEach((seat)=>{
+ seat.pbx_group_ids.forEach((groupId)=>{
+ let group = state.groups[groupId];
+ let seats = _.get(group, 'seats', []);
+ seats.push(seat);
+ _.set(group, 'seats', seats);
+ let groups = _.get(seat, 'groups', []);
+ groups.push(group);
+ _.set(seat, 'groups', groups);
+ });
+ state.seats[seat.id] = seat;
+ state.seatsOrdered.push(seat);
+ });
+ if(_.isArray(all.numbers) && all.numbers.length > 0) {
+ all.numbers.forEach((number)=>{
+ if(_.has(state.groups, number.subscriber_id)) {
+ number.subscriber = state.groups[number.subscriber_id];
+ } else if (_.has(state.seats, number.subscriber_id)) {
+ number.subscriber = state.seats[number.subscriber_id];
+ } else if (state.pilot.id === number.subscriber_id) {
+ number.subscriber = state.pilot;
+ } else {
+ number.subscriber = null;
+ }
+ });
+ state.numbers = all.numbers;
+ }
+ }
+ },
+ actions: {
+ listSeats(context, options) {
+ return new Promise((resolve, reject)=>{
+ getPbxConfiguration().then((config)=>{
+ context.commit('listAll', config);
+ }).catch((err)=>{
+ console.log(err);
+ });
+ });
+ },
+ listGroups(context, options) {
+ return new Promise((resolve, reject)=>{
+ getPbxConfiguration().then((config)=>{
+ context.commit('listAll', config);
+ }).catch((err)=>{
+ console.log(err);
+ });
+ });
+ }
+ }
+};
diff --git a/src/store/pbx-groups.js b/src/store/pbx-groups.js
deleted file mode 100644
index 2342aa57..00000000
--- a/src/store/pbx-groups.js
+++ /dev/null
@@ -1,31 +0,0 @@
-
-import { getGroups } from '../api/pbx-config'
-
-export default {
- namespaced: true,
- state: {
- groups: [],
- page: 1
- },
- getters: {
-
- },
- mutations: {
- show: function(state, options) {
- state.groups = options.groups;
- }
- },
- actions: {
- load: function(context, options) {
- return new Promise((resolve, reject)=>{
- getGroups().then((groups)=>{
- context.commit('show', {
- groups: groups
- });
- }).catch((err)=>{
- reject(err);
- });
- });
- }
- }
-};
diff --git a/t/store/pbx-config.js b/t/store/pbx-config.js
new file mode 100644
index 00000000..566da44d
--- /dev/null
+++ b/t/store/pbx-config.js
@@ -0,0 +1,46 @@
+'use strict';
+
+import PbxConfig from '../../src/store/pbx-config';
+import { assert } from 'chai';
+
+describe('PBX Configuration Store', () => {
+
+ it('should list all PBX Groups', () => {
+ let state = {};
+ let data = {
+ pilot: {},
+ seats: [
+ {
+ id: 2,
+ pbx_group_ids: []
+ },
+ {
+ id: 3,
+ pbx_group_ids: []
+ }
+ ],
+ groups: [
+ {
+ id: 4
+ },
+ {
+ id: 5
+ }
+ ],
+ numbers: [
+ {
+ id: 6
+ },
+ {
+ id: 7
+ }
+ ]
+ };
+ PbxConfig.mutations.listAll(state, data);
+ assert.equal(state.seats[2], data.seats[0]);
+ assert.equal(state.seats[3], data.seats[1]);
+ assert.equal(state.groups[4], data.groups[0]);
+ assert.equal(state.groups[5], data.groups[1]);
+ assert.deepEqual(state.numbers, data.numbers);
+ });
+});