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 @@
+ :visible="loading"
+ :style="{zIndex: 12}"
+ >
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 @@
/>
-
-
-
+