From f59f7990490767487c0b61172d7be68791612e2b Mon Sep 17 00:00:00 2001 From: Robert Axelsen Date: Wed, 10 Apr 2019 11:59:09 +0200 Subject: [PATCH] TT#55911 Assign SoundSet to PBXGroup or PBXSeat Change-Id: Ic89de6e03e1ced79c94f5ac107f3ad1560ea8b1d --- src/api/common.js | 24 ++ src/api/pbx-config.js | 273 +++++++++++++++--- src/api/subscriber.js | 16 + src/components/CscObjectSpinner.vue | 6 +- src/components/CscSpinner.vue | 2 +- .../PbxConfiguration/CscPbxCallQueue.vue | 16 +- .../CscPbxCallQueueAddForm.vue | 11 +- .../PbxConfiguration/CscPbxCallQueues.vue | 12 +- .../pages/PbxConfiguration/CscPbxDevice.vue | 27 +- .../PbxConfiguration/CscPbxDeviceAddForm.vue | 16 +- .../pages/PbxConfiguration/CscPbxDevices.vue | 7 +- .../pages/PbxConfiguration/CscPbxGroup.vue | 83 +++++- .../PbxConfiguration/CscPbxGroupAddForm.vue | 60 +++- .../pages/PbxConfiguration/CscPbxGroups.vue | 52 ++-- .../pages/PbxConfiguration/CscPbxSeat.vue | 83 +++++- .../PbxConfiguration/CscPbxSeatAddForm.vue | 64 +++- .../pages/PbxConfiguration/CscPbxSeats.vue | 45 +-- .../pages/PbxConfiguration/CscPbxSoundSet.vue | 25 +- .../CscPbxSoundSetAddForm.vue | 11 +- .../PbxConfiguration/CscPbxSoundSets.vue | 19 +- src/locales/en.json | 4 +- src/store/pbx-config/actions.js | 88 +++--- src/store/pbx-config/getters.js | 54 +++- src/store/pbx-config/mutations.js | 110 ++----- src/store/pbx-config/state.js | 9 +- t/store/pbx-config.js | 24 +- 26 files changed, 777 insertions(+), 364 deletions(-) diff --git a/src/api/common.js b/src/api/common.js index 374221ed..d35f3187 100644 --- a/src/api/common.js +++ b/src/api/common.js @@ -104,6 +104,30 @@ export function patchReplace(options) { }); } +export function patchAdd(options) { + return new Promise((resolve, reject) => { + Vue.http.patch(options.path, [{ + op: 'add', + path: '/'+ options.fieldPath, + value: options.value + }], { + headers: { + 'Content-Type': 'application/json-patch+json', + 'Prefer': 'return=minimal' + } + }).then((result) => { + resolve(result); + }).catch((err) => { + if(err.status >= 400) { + reject(new Error(err.body.message)); + } + else { + reject(err); + } + }); + }); +} + export function getFieldList(options) { return new Promise((resolve, reject) => { options = options || {}; diff --git a/src/api/pbx-config.js b/src/api/pbx-config.js index 0ccfe9aa..e6ec1cb3 100644 --- a/src/api/pbx-config.js +++ b/src/api/pbx-config.js @@ -21,10 +21,16 @@ import { setQueueLength, setWrapUpTime, getPreferences, - removeCallQueueConfig + removeCallQueueConfig, + getAllPreferences } from './subscriber'; import uuid from 'uuid'; -import { getList, get, patchReplace} from './common' +import { + getList, + get, + patchReplace, + patchAdd +} from './common' var createId = uuid.v4; @@ -33,14 +39,40 @@ export const PBX_CONFIG_ORDER_DIRECTION = 'desc'; export function getGroups(options) { return new Promise((resolve, reject)=>{ + let subscribers = { + items: [] + }; + let soundSets = {}; + let preferences = {}; options = options || {}; options = _.merge(options, { params: { is_pbx_group: 1 } }); - getSubscribers(options).then((res)=>{ - resolve(res); + Promise.resolve().then(()=>{ + return getSubscribers(options); + }).then(($subscribers)=> { + subscribers = $subscribers; + return getAllSoundSets(); + }).then(($soundSets)=> { + soundSets = _.keyBy($soundSets.items, 'name'); + return getAllPreferences(); + }).then(($preferences)=>{ + preferences = _.keyBy($preferences.items, 'id'); + subscribers.items.forEach((subscriber) => { + delete preferences[subscriber.id]._links; + delete subscriber._links; + Object.assign(subscriber, preferences[subscriber.id]); + if (preferences[subscriber.id] && preferences[subscriber.id].contract_sound_set) { + subscriber.contract_sound_set_id = soundSets[preferences[subscriber.id].contract_sound_set].id; + } + else { + subscriber.contract_sound_set = null; + subscriber.contract_sound_set_id = null; + } + }); + resolve(subscribers); }).catch((err)=>{ reject(err); }); @@ -48,11 +80,44 @@ export function getGroups(options) { } export function getGroup(groupId) { - return getSubscriber(groupId); + return new Promise((resolve, reject) => { + let subscriber = {}; + let soundSets = {}; + let preferences = {}; + Promise.resolve().then(() => { + return getSubscriber(groupId); + }).then(($subscriber) => { + subscriber = $subscriber; + return getAllSoundSets(); + }).then(($soundSets) => { + soundSets = _.keyBy($soundSets.items, 'name'); + return getPreferences(groupId); + }).then(($preferences) => { + preferences = $preferences; + delete preferences._links; + delete subscriber._links; + Object.assign(subscriber, preferences); + if (preferences && preferences.contract_sound_set) { + subscriber.contract_sound_set_id = soundSets[preferences.contract_sound_set].id; + } + else { + subscriber.contract_sound_set = null; + subscriber.contract_sound_set_id = null; + } + resolve(subscriber); + }).catch((err) => { + reject(err); + }); + }); } export function getSeats(options) { return new Promise((resolve, reject)=>{ + let subscribers = { + items: [] + }; + let soundSets = {}; + let preferences = {}; options = options || {}; options = _.merge(options, { params: { @@ -60,8 +125,29 @@ export function getSeats(options) { is_pbx_pilot: 0 } }); - getSubscribers(options).then((res)=>{ - resolve(res); + Promise.resolve().then(()=>{ + return getSubscribers(options); + }).then(($subscribers)=> { + subscribers = $subscribers; + return getAllSoundSets(); + }).then(($soundSets)=> { + soundSets = _.keyBy($soundSets.items, 'name'); + return getAllPreferences(); + }).then(($preferences)=>{ + preferences = _.keyBy($preferences.items, 'id'); + subscribers.items.forEach((subscriber) => { + delete preferences[subscriber.id]._links; + delete subscriber._links; + Object.assign(subscriber, preferences[subscriber.id]); + if (preferences[subscriber.id] && preferences[subscriber.id].contract_sound_set) { + subscriber.contract_sound_set_id = soundSets[preferences[subscriber.id].contract_sound_set].id; + } + else { + subscriber.contract_sound_set = null; + subscriber.contract_sound_set_id = null; + } + }); + resolve(subscribers); }).catch((err)=>{ reject(err); }); @@ -69,7 +155,35 @@ export function getSeats(options) { } export function getSeat(seatId) { - return getSubscriber(seatId); + return new Promise((resolve, reject) => { + let subscriber = {}; + let soundSets = {}; + let preferences = {}; + Promise.resolve().then(() => { + return getSubscriber(seatId); + }).then(($subscriber) => { + subscriber = $subscriber; + return getAllSoundSets(); + }).then(($soundSets) => { + soundSets = _.keyBy($soundSets.items, 'name'); + return getPreferences(seatId); + }).then(($preferences) => { + preferences = $preferences; + delete preferences._links; + delete subscriber._links; + Object.assign(subscriber, preferences); + if (preferences && preferences.contract_sound_set) { + subscriber.contract_sound_set_id = soundSets[preferences.contract_sound_set].id; + } + else { + subscriber.contract_sound_set = null; + subscriber.contract_sound_set_id = null; + } + resolve(subscriber); + }).catch((err) => { + reject(err); + }); + }); } export function getAllGroupsAndSeats(options) { @@ -98,7 +212,7 @@ export function getPilot(options) { } }); getSubscribers(options).then((subscribers)=>{ - if(subscribers.items.length === 1) { + if (subscribers.items.length === 1) { resolve(subscribers.items[0]); } else { @@ -171,19 +285,70 @@ export function getGroupList(page) { getPilot(), getNumbers() ]).then((result)=>{ - resolve({ - groups: result[0], - seats: result[1], - pilot: result[2], - numbers: result[3], - lastPage: result[0].lastPage - }); + resolve(normalizeSubscribers( + { + groups: result[0], + seats: result[1], + pilot: result[2], + numbers: result[3], + lastPage: result[0].lastPage + } + )); }).catch((err)=>{ reject(err); }); }); } +export function normalizeSubscribers(all) { + let pilot = all.pilot; + let groups = {}; + let seats = {}; + let numbersMap = {}; + let numbers= []; + all.groups.items.forEach((group)=>{ + groups[group.id] = group; + }); + all.seats.items.forEach((seat)=>{ + seat.pbx_group_ids.forEach((groupId)=>{ + let group = 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); + }); + seats[seat.id] = seat; + }); + if (_.isArray(all.numbers) && all.numbers.length > 0) { + all.numbers.forEach((number)=>{ + if (_.has(groups, number.subscriber_id)) { + number.subscriber = groups[number.subscriber_id]; + } + else if (_.has(seats, number.subscriber_id)) { + number.subscriber = seats[number.subscriber_id]; + } + else if (pilot.id === number.subscriber_id) { + number.subscriber = pilot; + } + else { + number.subscriber = null; + } + numbersMap[number.id] = number; + }); + numbers = all.numbers; + } + return { + seats: seats, + groups: groups, + pilot: pilot, + numbers: numbers, + numbersMap: numbersMap, + lastPage: all.lastPage + }; +} + export function getSeatList(page) { return new Promise((resolve, reject)=>{ Promise.all([ @@ -199,15 +364,17 @@ export function getSeatList(page) { }), getPilot(), getNumbers() - ]).then((result)=>{ - resolve({ - seats: result[0], - groups: result[1], - pilot: result[2], - numbers: result[3], - lastPage: result[0].lastPage - }); - }).catch((err)=>{ + ]).then((result) => { + resolve(normalizeSubscribers( + { + seats: result[0], + groups: result[1], + pilot: result[2], + numbers: result[3], + lastPage: result[0].lastPage + } + )); + }).catch((err) => { reject(err); }); }); @@ -223,13 +390,13 @@ export function getDeviceList(options) { order_by: PBX_CONFIG_ORDER_BY, order_by_direction: PBX_CONFIG_ORDER_DIRECTION }; - if(params.profile_id === null) { + if (params.profile_id === null) { delete params['profile_id']; } - if(params.identifier === null) { + if (params.identifier === null) { delete params['identifier']; } - if(params.station_name === null) { + if (params.station_name === null) { delete params['station_name']; } return getDevices({ @@ -259,6 +426,12 @@ export function addGroup(group) { }); }).then((subscriberId)=>{ assignNumbers(group.aliasNumbers, subscriberId); + return subscriberId; + }).then((subscriberId)=>{ + if (group.soundSet) { + setSubscriberSoundSet(subscriberId, group.soundSet); + } + return; }).then(()=>{ resolve(); }).catch((err)=>{ @@ -286,6 +459,12 @@ export function addSeat(seat) { }); }).then((subscriberId)=>{ assignNumbers(seat.aliasNumbers, subscriberId); + return subscriberId; + }).then((subscriberId)=>{ + if (seat.soundSet) { + setSubscriberSoundSet(subscriberId, seat.soundSet); + } + return; }).then(()=>{ resolve(); }).catch((err)=>{ @@ -349,11 +528,11 @@ export function getDevice(id, options) { }); }).then(($device)=> { device = $device; - if(join === true) { + if (join === true) { let requests = [ getProfile(device.profile_id, join) ]; - if(joinLines === true && _.isArray(device.lines) && device.lines.length > 0) { + if (joinLines === true && _.isArray(device.lines) && device.lines.length > 0) { device.lines.forEach((line)=>{ requests.push(getSubscriber(line.subscriber_id)); }); @@ -365,7 +544,7 @@ export function getDevice(id, options) { } }).then((results)=>{ device.profile = results[0]; - if(results.length > 1) { + if (results.length > 1) { for(let i = 1; i < results.length; i++) { device.lines[i - 1].subscriber = results[i]; } @@ -386,7 +565,7 @@ export function getProfile(id, join) { }); }).then(($profile)=> { profile = $profile; - if(join === true) { + if (join === true) { return getModelFull(profile.device_id); } else { @@ -457,7 +636,7 @@ export function createDevice(device) { Vue.http.post('api/pbxdevices/', device).then((res)=>{ resolve(res); }).catch((err)=>{ - if(err.status >= 400) { + if (err.status >= 400) { reject(new Error(err.body.message)); } else { @@ -472,7 +651,7 @@ export function removeDevice(id) { Vue.http.delete('api/pbxdevices/' + id).then(()=>{ resolve(); }).catch((err)=>{ - if(err.status >= 400) { + if (err.status >= 400) { reject(new Error(err.body.message)); } else { @@ -599,10 +778,6 @@ export function setWrapUpTimeConfig(id, wrapUpTime) { return setWrapUpTime(id, wrapUpTime); } -export function getPrefs(id) { - return getPreferences(id); -} - export function getAllSoundSets(options) { return new Promise((resolve, reject)=>{ options = options || {}; @@ -852,3 +1027,25 @@ export function setSoundSetItemLoopplay(id, loopplay) { value: loopflag }); } + +export function setSubscriberSoundSet(id, soundSet) { + return patchAdd({ + path: 'api/subscriberpreferences/' + id, + fieldPath: 'contract_sound_set', + value: soundSet + }); +} + +export function getDefaultSoundSet() { + return new Promise((resolve, reject) => { + getAllSoundSets().then((result) => { + let defaultSoundSets = result.items.filter((soundSet) => { + return _.get(soundSet, 'contract_default', false); + }) + let defaultSoundSet = defaultSoundSets[0] ? defaultSoundSets[0].id : null; + resolve(defaultSoundSet); + }).catch((err) => { + reject(err); + }); + }); +} diff --git a/src/api/subscriber.js b/src/api/subscriber.js index cc27b3dc..b9d20658 100644 --- a/src/api/subscriber.js +++ b/src/api/subscriber.js @@ -366,3 +366,19 @@ export function removeCallQueueConfig(subscriberId) { let param = { cloud_pbx_callqueue: false }; return Vue.http.put('api/subscriberpreferences/' + subscriberId, param); } + +export function getAllPreferences(options) { + return new Promise((resolve, reject)=>{ + options = options || {}; + options = _.merge(options, { + path: 'api/subscriberpreferences/', + root: '_embedded.ngcp:subscriberpreferences' + }); + getList(options).then((list)=>{ + resolve(list); + }).catch((err)=>{ + reject(err); + }); + }); +} + diff --git a/src/components/CscObjectSpinner.vue b/src/components/CscObjectSpinner.vue index 14b9cf60..3a710650 100644 --- a/src/components/CscObjectSpinner.vue +++ b/src/components/CscObjectSpinner.vue @@ -1,9 +1,11 @@ diff --git a/src/components/CscSpinner.vue b/src/components/CscSpinner.vue index af32a1cd..1d80598c 100644 --- a/src/components/CscSpinner.vue +++ b/src/components/CscSpinner.vue @@ -4,7 +4,7 @@ > diff --git a/src/components/pages/PbxConfiguration/CscPbxCallQueue.vue b/src/components/pages/PbxConfiguration/CscPbxCallQueue.vue index 6aa21a60..c26c95bf 100644 --- a/src/components/pages/PbxConfiguration/CscPbxCallQueue.vue +++ b/src/components/pages/PbxConfiguration/CscPbxCallQueue.vue @@ -115,17 +115,17 @@ /> - - - +