diff --git a/env/run_csc_ui b/env/run_csc_ui index 1250126e..4b46eee3 100755 --- a/env/run_csc_ui +++ b/env/run_csc_ui @@ -38,13 +38,13 @@ echo "JFYI, important components versions:" echo -n "node --version : " && node --version echo -n "yarn --version : " && yarnpkg --version -echo "Configuring Vue.js/Quasar dev environment, running 'npm ci'..." +echo "Configuring Vue.js/Quasar dev environment, running 'yarnpkg install'..." if ! yarnpkg install ; then echo "ERROR: cannot install all npm dependencies. Aborting." exit 1 fi -echo "Starting Quasar dev environment, running 'npm run dev'..." +echo "Starting Quasar dev environment, running 'yarnpkg run dev'..." if ! yarnpkg run dev ; then echo "ERROR: cannot run quasar dev environment. Aborting." exit 1 diff --git a/package.json b/package.json index 1fc73f74..d60372d5 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "eslint-plugin-promise": "^4.0.1", "eslint-plugin-standard": "^4.0.0", "eslint-plugin-vue": "^6.1.2", + "generate-password": "^1.5.1", "parseuri": "^0.0.6" }, "browserslist": [ diff --git a/src/api/pbx-config.js b/src/api/pbx-config.js index d0677b0f..de8b4956 100644 --- a/src/api/pbx-config.js +++ b/src/api/pbx-config.js @@ -73,27 +73,34 @@ export function getModel (id) { }) } -export function getModelFrontImage (id) { - return new Promise((resolve) => { - Vue.http.get('api/pbxdevicemodelimages/' + id, { +export async function getModelImage (id, type) { + try { + const res = await Vue.http.get('api/pbxdevicemodelimages/' + id, { responseType: 'blob', params: { - type: 'front' + type: type } - }).then((res) => { - resolve({ - id: id, - url: URL.createObjectURL(res.body), - blob: res.body - }) - }).catch(() => { - resolve({ - id: id, - url: null, - blob: null - }) }) - }) + return { + id: id, + url: URL.createObjectURL(res.body), + blob: res.body + } + } catch (err) { + return { + id: id, + url: null, + blob: null + } + } +} + +export async function getModelFrontImage (id) { + return getModelImage(id, 'front') +} + +export async function getModelFrontThumbnailImage (id) { + return getModelImage(id, 'front_thumb') } export function getAllSoundSets (options) { diff --git a/src/api/pbx-devices.js b/src/api/pbx-devices.js index 3abc32b0..48440005 100644 --- a/src/api/pbx-devices.js +++ b/src/api/pbx-devices.js @@ -162,7 +162,7 @@ export function setDeviceKeys (deviceId, keys) { }) } -export function loadDeviceModel (modelId) { +export async function loadDeviceModel (modelId) { return new Promise((resolve, reject) => { Promise.all([ getModel(modelId), diff --git a/src/api/pbx-seats.js b/src/api/pbx-seats.js index aa30fcac..f44355f1 100644 --- a/src/api/pbx-seats.js +++ b/src/api/pbx-seats.js @@ -80,16 +80,29 @@ export function getSeatList (options) { return new Promise((resolve, reject) => { const page = _.get(options, 'page', 1) const displayName = _.get(options, 'display_name', null) + const pbxExtension = _.get(options, 'pbx_extension', null) + const primaryNumber = _.get(options, 'primary_number', null) + const aliasNumber = _.get(options, 'alias_number', null) const params = { page: page, order_by: PBX_CONFIG_ORDER_BY, order_by_direction: PBX_CONFIG_ORDER_DIRECTION } + if (displayName) { + params.display_name = displayName + } + if (pbxExtension) { + params.pbx_extension = pbxExtension + } + if (primaryNumber) { + params.primary_number = primaryNumber + } + if (aliasNumber) { + params.alias_number = aliasNumber + } Promise.all([ getSeats({ - params: displayName ? _.merge({ - display_name: displayName - }, params) : params + params: params }), getGroupsOnly({ all: true diff --git a/src/components/CscPageLogin.vue b/src/components/CscPageLogin.vue index 3b8c4c23..4fc41031 100644 --- a/src/components/CscPageLogin.vue +++ b/src/components/CscPageLogin.vue @@ -39,12 +39,11 @@
- - - + - - + @keypress.enter="login()" + /> + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+ +
+ +
+ + diff --git a/src/components/CscPageStickyTabs.vue b/src/components/CscPageStickyTabs.vue index df19121d..56d8ac60 100644 --- a/src/components/CscPageStickyTabs.vue +++ b/src/components/CscPageStickyTabs.vue @@ -32,6 +32,7 @@ diff --git a/src/components/form/CscInputPassword.vue b/src/components/form/CscInputPassword.vue new file mode 100644 index 00000000..3d26faa0 --- /dev/null +++ b/src/components/form/CscInputPassword.vue @@ -0,0 +1,94 @@ + + diff --git a/src/components/form/CscInputPasswordRetype.vue b/src/components/form/CscInputPasswordRetype.vue new file mode 100644 index 00000000..6fc08bd7 --- /dev/null +++ b/src/components/form/CscInputPasswordRetype.vue @@ -0,0 +1,144 @@ + + + + diff --git a/src/components/pages/PbxConfiguration/CscPbxDevice.vue b/src/components/pages/PbxConfiguration/CscPbxDevice.vue index dd89204a..e97a8cd0 100644 --- a/src/components/pages/PbxConfiguration/CscPbxDevice.vue +++ b/src/components/pages/PbxConfiguration/CscPbxDevice.vue @@ -1,6 +1,6 @@ - - - - - - - - - - - - - - - - - @@ -59,7 +59,7 @@ @reset-profile="resetProfileFilter" @close-filters="closeFilters" @reset-filters="resetFilters" - @model-select-opened="loadDeviceModels" + @model-select-opened="loadDeviceModels('front_thumb')" />
diff --git a/src/components/pages/PbxConfiguration/CscPbxModelSelect.vue b/src/components/pages/PbxConfiguration/CscPbxModelSelect.vue index dc9570e6..455ad651 100644 --- a/src/components/pages/PbxConfiguration/CscPbxModelSelect.vue +++ b/src/components/pages/PbxConfiguration/CscPbxModelSelect.vue @@ -36,7 +36,7 @@ v-on="scope.itemEvents" > @@ -160,6 +160,9 @@ diff --git a/src/components/pages/PbxConfiguration/CscPbxSeats.vue b/src/components/pages/PbxConfiguration/CscPbxSeats.vue index c3463091..36965c12 100644 --- a/src/components/pages/PbxConfiguration/CscPbxSeats.vue +++ b/src/components/pages/PbxConfiguration/CscPbxSeats.vue @@ -1,111 +1,53 @@ - - diff --git a/src/components/pages/PbxSettings/CscPbxSettings.vue b/src/components/pages/PbxSettings/CscPbxSettings.vue index 3e71290b..939d8c30 100644 --- a/src/components/pages/PbxSettings/CscPbxSettings.vue +++ b/src/components/pages/PbxSettings/CscPbxSettings.vue @@ -53,12 +53,6 @@ export default { isLoading: false } }, - async mounted () { - this.requestInProgress(true) - const preferences = await this.loadPreferences(getSubscriberId()) - this.clirIntrapbx = preferences.clir_intrapbx - this.requestInProgress(false) - }, computed: { ...mapGetters('pbxSeats', [ 'getIntraPbx' @@ -85,6 +79,12 @@ export default { } } }, + async mounted () { + this.requestInProgress(true) + const preferences = await this.loadPreferences(getSubscriberId()) + this.clirIntrapbx = preferences.clir_intrapbx + this.requestInProgress(false) + }, methods: { ...mapActions('pbxSeats', [ 'setIntraPbx', diff --git a/src/i18n/en.json b/src/i18n/en.json index 26b48129..f8c87e76 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -602,12 +602,16 @@ "seatsFilters": "Filter", "seatsFiltersFilterByLabel": "Filter by", "seatsFiltersTypes": { - "name": "Name" + "display_name": "Name", + "pbx_extension": "Extension", + "primary_number": "Primary Number", + "alias_number": "Alias Number" }, "seatsFiltersSearch": "Search", "seatsFiltersClose": "Close", "seatsFiltersReset": "Reset Filters", - "seatsFilterInputLabel": "Type something" + "seatsFilterInputLabel": "Type something", + "webusername": "Login" }, "callBlocking": { "privacyEnabledToast": "Your number is hidden to the callee", diff --git a/src/store/pbx-seats.js b/src/store/pbx-seats.js index ae1b716d..650fd9c1 100644 --- a/src/store/pbx-seats.js +++ b/src/store/pbx-seats.js @@ -256,12 +256,18 @@ export default { const page = _.get(options, 'page', context.state.seatListCurrentPage) const clearList = _.get(options, 'clearList', true) const displayName = _.get(options, 'display_name', null) + const pbxExtension = _.get(options, 'pbx_extension', null) + const primaryNumber = _.get(options, 'primary_number', null) + const aliasNumber = _.get(options, 'alias_number', null) context.commit('seatListItemsRequesting', { clearList: clearList }) getSeatList({ page: page, - display_name: displayName + display_name: displayName, + pbx_extension: pbxExtension, + primary_number: primaryNumber, + alias_number: aliasNumber }).then((seatList) => { context.commit('pbx/pilotSucceeded', seatList.pilot, { root: true }) context.commit('pbx/numbersSucceeded', seatList.numbers, { root: true }) diff --git a/src/store/pbx.js b/src/store/pbx.js index 80e9f6bb..ffb5fb5d 100644 --- a/src/store/pbx.js +++ b/src/store/pbx.js @@ -3,7 +3,7 @@ import Vue from 'vue' import numberFilter from '../filters/number' import _ from 'lodash' import { - getAllProfiles + getAllProfiles, getModel, getModelFrontImage, getModelFrontThumbnailImage } from '../api/pbx-config' import { getSubscribers @@ -11,9 +11,9 @@ import { import { RequestState } from './common' -import { - loadDeviceModel -} from '../api/pbx-devices' +// import { +// loadDeviceModel +// } from '../api/pbx-devices' import { getNumbers } from '../api/user' import { i18n @@ -37,6 +37,7 @@ export default { deviceModelList: [], deviceModelMap: {}, deviceModelImageMap: {}, + deviceModelImageSmallMap: {}, subscriberList: [], subscriberListState: RequestState.initiated, subscriberMap: {} @@ -193,16 +194,21 @@ export default { deviceModelSucceeded (state, deviceModel) { const model = _.get(deviceModel, 'model', null) const modelImage = _.get(deviceModel, 'modelImage', null) + const modelImageThumbnail = _.get(deviceModel, 'modelImageThumbnail', null) if (model !== null) { - Vue.set(state.deviceModelMap, deviceModel.model.id, deviceModel.model) + Vue.set(state.deviceModelMap, model.id, model) } if (modelImage !== null) { - Vue.set(state.deviceModelImageMap, deviceModel.modelImage.id, deviceModel.modelImage) + Vue.set(state.deviceModelImageMap, modelImage.id, modelImage) + } + if (modelImageThumbnail !== null) { + Vue.set(state.deviceModelImageSmallMap, modelImageThumbnail.id, modelImageThumbnail) } }, deviceModelFailed (state, deviceModelId) { Vue.delete(state.deviceModelMap, deviceModelId) Vue.delete(state.deviceModelImageMap, deviceModelId) + Vue.delete(state.deviceModelImageSmallMap, deviceModelId) }, subscribersRequesting (state) { state.subcriberListState = RequestState.requesting @@ -232,19 +238,69 @@ export default { } }) }, - loadDeviceModel (context, deviceModelId) { - if (!context.state.deviceModelMap[deviceModelId]) { - loadDeviceModel(deviceModelId).then((deviceModel) => { - context.commit('deviceModelSucceeded', deviceModel) - }).catch(() => { - context.commit('deviceModelFailed', deviceModelId) - }) + async loadDeviceModel (context, payload) { + try { + const isFrontCached = context.state.deviceModelImageMap[payload.deviceId] !== undefined + const isFrontThumbnailCached = context.state.deviceModelImageSmallMap[payload.deviceId] !== undefined + const isModelCached = context.state.deviceModelMap[payload.deviceId] !== undefined + const deviceModel = { + modelImage: null, + modelImageThumbnail: null, + model: null + } + const requests = [] + let isFrontImageRequested = false + if (!isFrontCached && (payload.type === 'front' || payload.type === 'all')) { + requests.push(getModelFrontImage(payload.deviceId)) + isFrontImageRequested = true + } + let isFrontThumbnailImageRequested = false + if (!isFrontThumbnailCached && (payload.type === 'front_thumb' || payload.type === 'all')) { + requests.push(getModelFrontThumbnailImage(payload.deviceId)) + isFrontThumbnailImageRequested = true + } + let isModelRequested = false + if (!isModelCached) { + requests.push(getModel(payload.deviceId)) + isModelRequested = true + } + if (requests.length > 0) { + const res = await Promise.all(requests) + if (res.length === 1 && isModelRequested) { + deviceModel.model = res[0] + } else if (res.length === 1 && isFrontImageRequested) { + deviceModel.modelImage = res[0] + } else if (res.length === 1 && isFrontThumbnailImageRequested) { + deviceModel.modelImageThumbnail = res[0] + } else if (res.length === 2 && isModelRequested && isFrontImageRequested) { + deviceModel.modelImage = res[0] + deviceModel.model = res[1] + } else if (res.length === 2 && isModelRequested && isFrontThumbnailImageRequested) { + deviceModel.modelImageThumbnail = res[0] + deviceModel.model = res[1] + } else if (res.length === 2 && isFrontImageRequested && isFrontThumbnailImageRequested) { + deviceModel.modelImage = res[0] + deviceModel.modelImageThumbnail = res[1] + } else if (res.length === 3) { + deviceModel.modelImage = res[0] + deviceModel.modelImageThumbnail = res[1] + deviceModel.model = res[2] + } + } + context.commit('deviceModelSucceeded', deviceModel) + } catch (err) { + context.commit('deviceModelFailed', payload.deviceId) } }, - loadDeviceModels (context) { - context.state.deviceProfileList.forEach((profile) => { - context.dispatch('loadDeviceModel', profile.device_id) - }) + async loadDeviceModels (context, imageType) { + const requests = [] + for (let i = 0; i < context.state.deviceProfileList.length; i++) { + requests.push(context.dispatch('loadDeviceModel', { + deviceId: context.state.deviceProfileList[i].device_id, + type: imageType + })) + } + await Promise.all(requests) }, loadSubscribers (context) { if (context.state.subscriberList.length === 0 && diff --git a/yarn.lock b/yarn.lock index 7cbadbc4..9fb442d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5457,6 +5457,11 @@ gaze@^1.0.0: dependencies: globule "^1.0.0" +generate-password@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/generate-password/-/generate-password-1.5.1.tgz#ad463fadee1b4818edb7b827ff6f3499587d8dd5" + integrity sha512-XdsyfiF4mKoOEuzA44w9jSNav50zOurdWOV3V8DbA7SJIxR3Xm9ob14HKYTnMQOPX3ylqiJMnQF0wEa8gXZIMw== + gensync@^1.0.0-beta.1: version "1.0.0-beta.1" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"