*Users can now add/select a B-number set when creating a call forward. Before this commit, this was only possible from the admin panel. Note, users cannot delete or amend B-numbers created by someone else (e.g. if a PBX admin user creates a B-number for a Seat,the Seat-User won't be able to edit it). *Fix the way we handle sourceset deletion ensuring data is reloaded. Change-Id: I58cb639156fb9ac0386d6bf0f3ec26daa4ebf857mr13.3
parent
47d4627980
commit
1697c9e483
@ -0,0 +1,71 @@
|
||||
<template>
|
||||
<q-select
|
||||
:value="value"
|
||||
:options="filteredOptions"
|
||||
emit-value
|
||||
use-input
|
||||
map-options
|
||||
input-debounce="300"
|
||||
v-bind="$attrs"
|
||||
@filter="filter"
|
||||
/>
|
||||
</template>
|
||||
<script>
|
||||
import { mapActions, mapState } from 'vuex'
|
||||
export default {
|
||||
name: 'CscCfBNumberSetSelection',
|
||||
props: {
|
||||
value: {
|
||||
type: [String, Number],
|
||||
default: undefined
|
||||
},
|
||||
mode: {
|
||||
type: String,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
options: []
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapState('callForwarding', [
|
||||
'bNumberSets'
|
||||
]),
|
||||
allOptions () {
|
||||
return this.bNumberSets
|
||||
.filter((bNumberSet) => bNumberSet.mode === this.mode)
|
||||
.map((bNumberSet) => ({
|
||||
value: bNumberSet.id,
|
||||
label: bNumberSet.name
|
||||
}))
|
||||
},
|
||||
filteredOptions () {
|
||||
return this.options.length ? this.options : this.allOptions
|
||||
}
|
||||
},
|
||||
async created () {
|
||||
await this.loadBNumberSets()
|
||||
this.options = this.allOptions
|
||||
},
|
||||
methods: {
|
||||
...mapActions('callForwarding', [
|
||||
'loadBNumberSets'
|
||||
]),
|
||||
async filter (value, update) {
|
||||
await this.loadBNumberSets()
|
||||
update(() => {
|
||||
if (!value) {
|
||||
this.options = this.allOptions
|
||||
} else {
|
||||
const lowerCaseValue = value.toLowerCase()
|
||||
this.options = this.allOptions.filter((option) =>
|
||||
option.label.toLowerCase().startsWith(lowerCaseValue)
|
||||
)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
@ -0,0 +1,73 @@
|
||||
<template>
|
||||
<csc-cf-condition-popup
|
||||
ref="popup"
|
||||
>
|
||||
<csc-cf-group-condition-b-number-set-create
|
||||
v-if="internalStep === 'call-not-to'"
|
||||
mode="blacklist"
|
||||
:title="$t('call not to ...')"
|
||||
icon="person_add_disabled"
|
||||
:back-button="false"
|
||||
:delete-button="true"
|
||||
:unassign-button="true"
|
||||
:mapping="mapping"
|
||||
:b-number-set="bNumberSet"
|
||||
@select="internalStep='call-not-to-select'"
|
||||
@close="closePopup"
|
||||
/>
|
||||
<csc-cf-group-condition-b-number-set-select
|
||||
v-if="internalStep === 'call-not-to-select'"
|
||||
mode="blacklist"
|
||||
:title="$t('call not to ...')"
|
||||
icon="person_add_disabled"
|
||||
:create-label="$t('Edit List')"
|
||||
:back-button="true"
|
||||
:mapping="mapping"
|
||||
:b-number-set="bNumberSet"
|
||||
@back="internalStep='call-not-to'"
|
||||
@create="internalStep='call-not-to'"
|
||||
@close="closePopup"
|
||||
/>
|
||||
</csc-cf-condition-popup>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import CscCfConditionPopup from 'components/call-forwarding/CscCfConditionPopup'
|
||||
import CscCfGroupConditionBNumberSetCreate from 'components/call-forwarding/CscCfGroupConditionBNumberSetCreate'
|
||||
import CscCfGroupConditionBNumberSetSelect from 'components/call-forwarding/CscCfGroupConditionBNumberSetSelect'
|
||||
export default {
|
||||
name: 'CscCfConditionPopupCallNotTo',
|
||||
components: {
|
||||
CscCfConditionPopup,
|
||||
CscCfGroupConditionBNumberSetSelect,
|
||||
CscCfGroupConditionBNumberSetCreate
|
||||
},
|
||||
props: {
|
||||
mapping: {
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
bNumberSet: {
|
||||
type: Object,
|
||||
default: undefined
|
||||
}
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
internalStep: 'call-not-to',
|
||||
selectedBNumberSet: null
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
internalStep () {
|
||||
this.$refs.popup.reOpen()
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
closePopup () {
|
||||
this.internalStep = 'call-not-to'
|
||||
this.$refs.popup.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
@ -0,0 +1,79 @@
|
||||
<template>
|
||||
<csc-cf-condition-popup
|
||||
ref="popup"
|
||||
>
|
||||
<csc-cf-group-condition-b-number-set-create
|
||||
v-if="internalStep === 'call-to'"
|
||||
mode="whitelist"
|
||||
:title="$t('call to ...')"
|
||||
icon="person_add"
|
||||
:back-button="false"
|
||||
:delete-button="true"
|
||||
:unassign-button="true"
|
||||
:mapping="mapping"
|
||||
:b-number-set="bNumberSet"
|
||||
:subscriber-id="subscriberId"
|
||||
@select="internalStep='call-to-select'"
|
||||
@close="closePopup"
|
||||
/>
|
||||
<csc-cf-group-condition-b-number-set-select
|
||||
v-if="internalStep === 'call-to-select'"
|
||||
mode="whitelist"
|
||||
:title="$t('call to ...')"
|
||||
icon="person_add"
|
||||
:create-label="$t('Edit List')"
|
||||
:back-button="true"
|
||||
:mapping="mapping"
|
||||
:b-number-set="bNumberSet"
|
||||
:subscriber-id="subscriberId"
|
||||
@back="internalStep='call-to'"
|
||||
@create="internalStep='call-to'"
|
||||
@close="closePopup"
|
||||
/>
|
||||
</csc-cf-condition-popup>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import CscCfConditionPopup from 'components/call-forwarding/CscCfConditionPopup'
|
||||
import CscCfGroupConditionBNumberSetCreate from 'components/call-forwarding/CscCfGroupConditionBNumberSetCreate'
|
||||
import CscCfGroupConditionBNumberSetSelect from 'components/call-forwarding/CscCfGroupConditionBNumberSetSelect'
|
||||
export default {
|
||||
name: 'CscCfConditionPopupCallTo',
|
||||
components: {
|
||||
CscCfConditionPopup,
|
||||
CscCfGroupConditionBNumberSetSelect,
|
||||
CscCfGroupConditionBNumberSetCreate
|
||||
},
|
||||
props: {
|
||||
mapping: {
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
bNumberSet: {
|
||||
type: Object,
|
||||
default: undefined
|
||||
},
|
||||
subscriberId: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
internalStep: 'call-to',
|
||||
selectedBNumberSet: null
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
internalStep () {
|
||||
this.$refs.popup.reOpen()
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
closePopup () {
|
||||
this.internalStep = 'call-to'
|
||||
this.$refs.popup.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
@ -0,0 +1,235 @@
|
||||
<template>
|
||||
<csc-cf-group-condition
|
||||
:title="title"
|
||||
:loading="$wait.is('csc-cf-b-number-set-create')"
|
||||
v-bind="$attrs"
|
||||
@close="$emit('close')"
|
||||
>
|
||||
<q-list
|
||||
class="no-margin q-pa-md"
|
||||
dense
|
||||
>
|
||||
<q-item
|
||||
class="no-margin no-padding"
|
||||
>
|
||||
<q-item-section>
|
||||
<csc-input
|
||||
v-model="bNumberSetNameInternal"
|
||||
dense
|
||||
clearable
|
||||
:label="$t('Number list name')"
|
||||
data-cy="csc-call-select-number-list"
|
||||
/>
|
||||
</q-item-section>
|
||||
</q-item>
|
||||
<q-item
|
||||
v-for="(number, index) in bNumberSetNumbersInternal"
|
||||
:key="index"
|
||||
class="no-margin no-padding"
|
||||
>
|
||||
<q-item-section>
|
||||
<csc-input
|
||||
v-model="bNumberSetNumbersInternal[index]"
|
||||
dense
|
||||
clearable
|
||||
:label="$t('Number')"
|
||||
data-cy="csc-call-select-number"
|
||||
>
|
||||
<template
|
||||
v-if="index > 0"
|
||||
>
|
||||
<q-btn
|
||||
flat
|
||||
dense
|
||||
color="negative"
|
||||
icon="delete"
|
||||
data-cy="csc-call-select-number-delete"
|
||||
@click="deleteNumber(index)"
|
||||
/>
|
||||
</template>
|
||||
</csc-input>
|
||||
</q-item-section>
|
||||
</q-item>
|
||||
<q-item
|
||||
class="no-margin no-padding"
|
||||
>
|
||||
<q-item-section>
|
||||
<q-btn
|
||||
:label="$t('Add number')"
|
||||
data-cy="csc-call-select-number-add"
|
||||
flat
|
||||
color="primary"
|
||||
icon="add"
|
||||
@click="bNumberSetNumbersInternal.push('')"
|
||||
/>
|
||||
</q-item-section>
|
||||
</q-item>
|
||||
</q-list>
|
||||
<template
|
||||
#actions
|
||||
>
|
||||
<q-btn
|
||||
v-if="deleteButton"
|
||||
:label="$t('Delete')"
|
||||
data-cy="csc-call-select-delete"
|
||||
flat
|
||||
color="negative"
|
||||
icon="delete"
|
||||
@click="deleteBNumberSetEvent"
|
||||
/>
|
||||
<q-btn
|
||||
v-if="unassignButton"
|
||||
:label="$t('Unassign')"
|
||||
data-cy="csc-call-select-unassign"
|
||||
flat
|
||||
color="primary"
|
||||
icon="undo"
|
||||
@click="unassignSourceSetEvent"
|
||||
/>
|
||||
<q-btn
|
||||
:label="$t('Select')"
|
||||
data-cy="csc-call-select-select"
|
||||
flat
|
||||
color="primary"
|
||||
icon="source"
|
||||
@click="$emit('select')"
|
||||
/>
|
||||
<q-btn
|
||||
:label="$t('Save')"
|
||||
data-cy="csc-call-select-save"
|
||||
flat
|
||||
color="primary"
|
||||
icon="check"
|
||||
@click="createBNumberSetEvent"
|
||||
/>
|
||||
</template>
|
||||
</csc-cf-group-condition>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import CscCfGroupCondition from 'components/call-forwarding/CscCfGroupCondition'
|
||||
import CscInput from 'components/form/CscInput'
|
||||
import { mapActions } from 'vuex'
|
||||
export default {
|
||||
name: 'CscCfGroupConditionBNumberSetCreate',
|
||||
components: {
|
||||
CscCfGroupCondition,
|
||||
CscInput
|
||||
},
|
||||
props: {
|
||||
title: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
mode: {
|
||||
type: String,
|
||||
required: true,
|
||||
validator (value) {
|
||||
return ['whitelist', 'blacklist'].includes(value.toLowerCase())
|
||||
}
|
||||
},
|
||||
mapping: {
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
bNumberSet: {
|
||||
type: Object,
|
||||
default: undefined
|
||||
},
|
||||
deleteButton: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
unassignButton: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
subscriberId: {
|
||||
type: String,
|
||||
default: null
|
||||
}
|
||||
},
|
||||
emits: ['close', 'select'],
|
||||
data () {
|
||||
return {
|
||||
bNumberSetNameInternal: null,
|
||||
bNumberSetNumbersInternal: null
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
bNumberSetNumbers () {
|
||||
const bnumbers = []
|
||||
if (this.bNumberSet && this.bNumberSet.bnumbers) {
|
||||
this.bNumberSet.bnumbers.forEach((item) => {
|
||||
bnumbers.push(item.bnumber)
|
||||
})
|
||||
} else {
|
||||
bnumbers.push('')
|
||||
}
|
||||
return bnumbers
|
||||
},
|
||||
bNumberSetName () {
|
||||
let name = this.$t('MyNumberList')
|
||||
if (this.bNumberSet) {
|
||||
name = this.bNumberSet.name
|
||||
}
|
||||
return name
|
||||
}
|
||||
},
|
||||
mounted () {
|
||||
this.bNumberSetNameInternal = this.bNumberSetName
|
||||
this.bNumberSetNumbersInternal = this.bNumberSetNumbers
|
||||
},
|
||||
methods: {
|
||||
...mapActions('callForwarding', [
|
||||
'createBNumberSet',
|
||||
'updateBNumberSet',
|
||||
'deleteBNumberSet',
|
||||
'unassignBNumberSet'
|
||||
]),
|
||||
deleteNumber (index) {
|
||||
this.bNumberSetNumbersInternal = this.bNumberSetNumbersInternal.filter((number, numberIndex) => {
|
||||
return numberIndex !== index
|
||||
})
|
||||
},
|
||||
async createBNumberSetEvent () {
|
||||
if (this.bNumberSet) {
|
||||
await this.updateBNumberSet({
|
||||
mapping: this.mapping,
|
||||
id: this.bNumberSet.id,
|
||||
name: this.bNumberSetNameInternal,
|
||||
numbers: this.bNumberSetNumbersInternal,
|
||||
mode: this.mode,
|
||||
subscriberId: this.subscriberId
|
||||
})
|
||||
} else {
|
||||
await this.createBNumberSet({
|
||||
mapping: this.mapping,
|
||||
name: this.bNumberSetNameInternal,
|
||||
numbers: this.bNumberSetNumbersInternal,
|
||||
mode: this.mode,
|
||||
subscriberId: this.subscriberId
|
||||
})
|
||||
}
|
||||
this.$emit('close')
|
||||
},
|
||||
async deleteBNumberSetEvent () {
|
||||
if (this.bNumberSet) {
|
||||
await this.deleteBNumberSet({
|
||||
mapping: this.mapping,
|
||||
id: this.bNumberSet.id
|
||||
})
|
||||
}
|
||||
},
|
||||
async unassignSourceSetEvent () {
|
||||
if (this.bNumberSet) {
|
||||
await this.unassignBNumberSet({
|
||||
mapping: this.mapping,
|
||||
id: this.bNumberSet.id,
|
||||
subscriberId: this.subscriberId
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
@ -0,0 +1,102 @@
|
||||
<template>
|
||||
<csc-cf-group-condition
|
||||
:title="title"
|
||||
:loading="$wait.is('csc-cf-b-number-set-create')"
|
||||
v-bind="$attrs"
|
||||
@close="$emit('close')"
|
||||
>
|
||||
<div
|
||||
class="no-margin q-pa-md"
|
||||
>
|
||||
<csc-cf-b-number-set-selection
|
||||
v-model="selectedBNumberSet"
|
||||
:mode="mode"
|
||||
dense
|
||||
:label="$t('Number list')"
|
||||
data-cy="csc-call-select-number-list"
|
||||
/>
|
||||
</div>
|
||||
<template
|
||||
#actions
|
||||
>
|
||||
<q-btn
|
||||
:label="createLabel"
|
||||
flat
|
||||
color="primary"
|
||||
icon="source"
|
||||
data-cy="csc-call-select-edit-list"
|
||||
@click="$emit('create')"
|
||||
/>
|
||||
<q-btn
|
||||
:label="$t('Save')"
|
||||
data-cy="csc-call-selection-save"
|
||||
flat
|
||||
color="primary"
|
||||
icon="check"
|
||||
:disable="!selectedBNumberSet"
|
||||
@click="selectBNumberSetEvent"
|
||||
/>
|
||||
</template>
|
||||
</csc-cf-group-condition>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import CscCfBNumberSetSelection from 'components/call-forwarding/CscCfBNumberSetSelection'
|
||||
import CscCfGroupCondition from 'components/call-forwarding/CscCfGroupCondition'
|
||||
import { mapActions } from 'vuex'
|
||||
export default {
|
||||
name: 'CscCfGroupConditionBNumberSetSelect',
|
||||
components: {
|
||||
CscCfBNumberSetSelection,
|
||||
CscCfGroupCondition
|
||||
},
|
||||
props: {
|
||||
title: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
mode: {
|
||||
type: String,
|
||||
required: true,
|
||||
validator (value) {
|
||||
return ['whitelist', 'blacklist'].includes(value.toLowerCase())
|
||||
}
|
||||
},
|
||||
mapping: {
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
bNumberSet: {
|
||||
type: Object,
|
||||
default: undefined
|
||||
},
|
||||
createLabel: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
subscriberId: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
},
|
||||
emits: ['close', 'create'],
|
||||
data () {
|
||||
return {
|
||||
selectedBNumberSet: null
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
...mapActions('callForwarding', [
|
||||
'assignBNumberSet'
|
||||
]),
|
||||
async selectBNumberSetEvent () {
|
||||
await this.assignBNumberSet({
|
||||
mapping: this.mapping,
|
||||
id: this.selectedBNumberSet,
|
||||
subscriberId: this.subscriberId
|
||||
})
|
||||
this.$emit('close')
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
Loading…
Reference in new issue