From 54c98fc1887c1d08eca7ea96c1374812ea2dae93 Mon Sep 17 00:00:00 2001 From: Hans-Peter Herzog Date: Mon, 18 Dec 2017 09:48:33 +0100 Subject: [PATCH] TT#20509 PBXConfig: As a Customer, I want to see a list of all PBXGroups Change-Id: Ib4c4256b07ec177609fccab8ad42f695b7cef5d8 --- src/api/pbx-config.js | 101 +++++---- src/api/user.js | 34 +++- src/components/card/CscNumberChip.vue | 26 +++ src/components/layouts/Default.vue | 4 +- .../pages/PbxConfiguration/CscPbxGroup.vue | 191 ++++++++++++++++++ .../pages/PbxConfiguration/Groups.vue | 31 +-- .../pages/PbxConfiguration/Seats.vue | 38 +++- src/filters/number.js | 20 +- src/locales/en.json | 17 ++ src/store/index.js | 4 +- src/store/pbx-config.js | 92 +++++++++ src/store/pbx-groups.js | 31 --- t/store/pbx-config.js | 46 +++++ 13 files changed, 536 insertions(+), 99 deletions(-) create mode 100644 src/components/card/CscNumberChip.vue create mode 100644 src/components/pages/PbxConfiguration/CscPbxGroup.vue create mode 100644 src/store/pbx-config.js delete mode 100644 src/store/pbx-groups.js create mode 100644 t/store/pbx-config.js 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 @@ + + + + + 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 @@ + + + + + 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 @@ 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); + }); +});