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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
+
-
-
- {{ $t('pbxConfig.seatsFilters') }}
-
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
+
-
-
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"