TT#20520 PBXConfig: As a Customer, I want to remove PBX Devices

Change-Id: If44a106416eebc55420100eaf76133241408f766
changes/04/21504/4
Hans-Peter Herzog 7 years ago
parent f2b29029b0
commit bd629d5acf

@ -367,3 +367,18 @@ export function getModelFrontImage(id) {
}); });
}); });
} }
export function removeDevice(id) {
return new Promise((resolve, reject)=>{
Vue.http.delete('api/pbxdevices/' + id).then(()=>{
resolve();
}).catch((err)=>{
if(err.status >= 400) {
reject(new Error(err.body.message));
}
else {
reject(err);
}
});
});
}

@ -22,9 +22,10 @@
<csc-pbx-device-config :device="device" /> <csc-pbx-device-config :device="device" />
</q-item-tile> </q-item-tile>
</q-item-main> </q-item-main>
<q-item-side right> <q-item-side right class="csc-item-buttons">
<q-item-tile> <q-item-tile>
<q-btn :icon="titleIcon" :big="isMobile" color="primary" slot="right" flat @click="toggleMain()" /> <q-btn :icon="titleIcon" :big="isMobile" color="primary" slot="right" flat @click="toggleMain()" />
<q-btn icon="delete" :big="isMobile" color="negative" slot="right" flat @click="remove()" />
</q-item-tile> </q-item-tile>
</q-item-side> </q-item-side>
<q-inner-loading :visible="loading"> <q-inner-loading :visible="loading">
@ -87,6 +88,9 @@
methods: { methods: {
toggleMain() { toggleMain() {
this.expanded = !this.expanded; this.expanded = !this.expanded;
},
remove() {
this.$emit('remove', this.device);
} }
} }
} }
@ -113,4 +117,9 @@
font-weight 400 font-weight 400
letter-spacing normal letter-spacing normal
line-height 1.8rem line-height 1.8rem
.csc-item-buttons
.q-btn
padding-left 8px;
padding-right 8px;
</style> </style>

@ -7,7 +7,7 @@
<q-pagination :value="listCurrentPage" :max="listLastPage" @change="changePage" /> <q-pagination :value="listCurrentPage" :max="listLastPage" @change="changePage" />
</div> </div>
<q-list no-border separator sparse multiline> <q-list no-border separator sparse multiline>
<csc-pbx-device v-for="device in devices" :key="device.id" :device="device" <csc-pbx-device v-for="device in devices" :key="device.id" :device="device" @remove="removeDevice"
:modelOptions="modelOptions" :loading="isDeviceLoading(device.id)" /> :modelOptions="modelOptions" :loading="isDeviceLoading(device.id)" />
</q-list> </q-list>
<div v-if="devices.length === 0 && !isListRequesting" class="row justify-center csc-no-entities"> <div v-if="devices.length === 0 && !isListRequesting" class="row justify-center csc-no-entities">
@ -20,7 +20,9 @@
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import CscPage from '../../CscPage' import CscPage from '../../CscPage'
import CscPbxDevice from './CscPbxDevice' import CscPbxDevice from './CscPbxDevice'
import { QSpinnerDots, QPagination, QList } from 'quasar-framework' import { QSpinnerDots, QPagination, QList, Dialog } from 'quasar-framework'
import { showToast } from '../../../helpers/ui'
export default { export default {
data () { data () {
return { return {
@ -36,7 +38,8 @@
CscPbxDevice, CscPbxDevice,
QSpinnerDots, QSpinnerDots,
QPagination, QPagination,
QList QList,
Dialog
}, },
computed: { computed: {
...mapGetters('pbxConfig', [ ...mapGetters('pbxConfig', [
@ -46,7 +49,8 @@
'isListLoadingVisible', 'isListLoadingVisible',
'listCurrentPage', 'listCurrentPage',
'listLastPage', 'listLastPage',
'isDeviceLoading' 'isDeviceLoading',
'deviceRemoved'
]) ])
}, },
methods: { methods: {
@ -57,6 +61,33 @@
}, },
loadDevice(id) { loadDevice(id) {
this.$store.dispatch('pbxConfig/loadDevice', id); this.$store.dispatch('pbxConfig/loadDevice', id);
},
removeDevice(device) {
var store = this.$store;
var i18n = this.$i18n;
Dialog.create({
title: i18n.t('pbxConfig.removeDeviceTitle'),
message: i18n.t('pbxConfig.removeDeviceText', { device: device.station_name }),
buttons: [
'Cancel',
{
label: i18n.t('pbxConfig.removeDevice'),
color: 'negative',
handler () {
store.dispatch('pbxConfig/removeDevice', device);
}
}
]
});
}
},
watch: {
deviceRemoved(device) {
if(device !== null) {
showToast(this.$t('pbxConfig.toasts.removedDeviceToast', {
name: device.station_name
}));
}
} }
} }
} }

@ -291,8 +291,12 @@
"addedGroupToast": "Added group {group}", "addedGroupToast": "Added group {group}",
"removedGroupToast": "Removed group {group}", "removedGroupToast": "Removed group {group}",
"addedSeatToast": "Added seat {seat}", "addedSeatToast": "Added seat {seat}",
"removedSeatToast": "Removed seat {seat}" "removedSeatToast": "Removed seat {seat}",
} "removedDeviceToast": "Removed device {name}"
},
"removeDevice": "Remove device",
"removeDeviceTitle": "Remove device",
"removeDeviceText": "You are about to remove device {device}"
}, },
"communication": { "communication": {
"sendFax": "Send Fax", "sendFax": "Send Fax",

@ -4,7 +4,7 @@ import _ from 'lodash';
import { assignNumbers } from '../../api/user'; import { assignNumbers } from '../../api/user';
import { addGroup, removeGroup, addSeat, removeSeat, setGroupName, import { addGroup, removeGroup, addSeat, removeSeat, setGroupName,
setGroupExtension, setGroupHuntPolicy, setGroupHuntTimeout, setGroupExtension, setGroupHuntPolicy, setGroupHuntTimeout,
updateGroupSeats, setSeatName, setSeatExtension, updateGroupSeats, setSeatName, setSeatExtension, removeDevice,
updateSeatGroups, getGroupList, getSeatList, getDeviceList, getDeviceFull } from '../../api/pbx-config' updateSeatGroups, getGroupList, getSeatList, getDeviceList, getDeviceFull } from '../../api/pbx-config'
export default { export default {
@ -209,5 +209,14 @@ export default {
}).catch((err)=>{ }).catch((err)=>{
context.commit('deviceFailed', deviceId, err.message); context.commit('deviceFailed', deviceId, err.message);
}); });
},
removeDevice(context, device) {
context.commit('deviceRequesting', device.id);
removeDevice(device.id).then(()=>{
context.commit('deviceRemoved', device);
context.dispatch('listDevices');
}).catch((err)=>{
context.commit('deviceFailed', device.id, err.message);
});
} }
} }

@ -151,7 +151,7 @@ export default {
}, },
isDeviceLoading(state) { isDeviceLoading(state) {
return (id)=>{ return (id)=>{
return state.deviceLoadingStates[id + ""] === true; return state.deviceStates[id + ""] === RequestState.requesting;
} }
}, },
lastAddedGroup(state) { lastAddedGroup(state) {
@ -174,5 +174,8 @@ export default {
}, },
lastRemovedSeat(state) { lastRemovedSeat(state) {
return state.lastRemovedSeat; return state.lastRemovedSeat;
},
deviceRemoved(state) {
return state.deviceRemoved;
} }
} }

@ -1,5 +1,6 @@
'use strict'; 'use strict';
import Vue from 'vue'
import _ from 'lodash' import _ from 'lodash'
import { RequestState } from '../common' import { RequestState } from '../common'
@ -154,6 +155,7 @@ export default {
state.listState = RequestState.succeeded; state.listState = RequestState.succeeded;
state.listError = null; state.listError = null;
state.listLastPage = data.lastPage; state.listLastPage = data.lastPage;
state.deviceRemoved = null;
state.devicesOrdered = data.items; state.devicesOrdered = data.items;
state.devicesOrdered.forEach((device)=>{ state.devicesOrdered.forEach((device)=>{
state.devices[device.id + ""] = device; state.devices[device.id + ""] = device;
@ -164,30 +166,26 @@ export default {
state.listError = error; state.listError = error;
}, },
deviceRequesting(state, deviceId) { deviceRequesting(state, deviceId) {
let deviceLoadingStates = _.clone(state.deviceLoadingStates); Vue.set(state.deviceStates, deviceId + "", RequestState.requesting);
deviceLoadingStates[deviceId + ""] = true;
state.deviceLoadingStates = deviceLoadingStates;
}, },
deviceSucceeded(state, device) { deviceSucceeded(state, device) {
let deviceLoadingStates = _.clone(state.deviceLoadingStates); Vue.set(state.deviceStates, device.id + "", RequestState.succeeded);
deviceLoadingStates[device.id + ""] = false; Vue.set(state.deviceErrors, device.id + "", null);
state.deviceLoadingStates = deviceLoadingStates; Vue.set(state.devices, device.id + "", device);
for(let i = 0; i <= state.devicesOrdered.length; i++) { for(let i = 0; i <= state.devicesOrdered.length; i++) {
if(state.devicesOrdered[i].id === device.id) { if(state.devicesOrdered[i].id === device.id) {
state.devicesOrdered[i] = device; state.devicesOrdered[i] = device;
} }
} }
delete state.devices[device.id + ""];
state.devices[device.id + ""] = device;
}, },
deviceFailed(state, deviceId, errorMessage) { deviceFailed(state, deviceId, error) {
let deviceLoadingStates = _.clone(state.deviceLoadingStates); Vue.set(state.deviceStates, deviceId + "", RequestState.failed);
deviceLoadingStates[deviceId + ""] = false; Vue.set(state.deviceErrors, deviceId + "", error);
state.deviceLoadingStates = deviceLoadingStates; },
let deviceLoadingErrors = _.clone(state.deviceLoadingErrors); deviceRemoved(state, device) {
deviceLoadingErrors[deviceId + ""] = errorMessage; Vue.set(state.deviceStates, device.id + "", 'deleted');
state.deviceLoadingErrors = deviceLoadingErrors; Vue.set(state.deviceErrors, device.id + "", null);
state.deviceRemoved = device;
}, },
lastAddedGroup(state, group) { lastAddedGroup(state, group) {
state.lastAddedGroup = group; state.lastAddedGroup = group;

@ -30,8 +30,9 @@ export default {
removeState: RequestState.initiated, removeState: RequestState.initiated,
removeError: null, removeError: null,
removeItem: null, removeItem: null,
deviceLoadingStates: {}, deviceStates: {},
deviceLoadingErrors: {}, deviceErrors: {},
deviceRemoved: null,
lastAddedGroup: null, lastAddedGroup: null,
lastRemovedGroup: null, lastRemovedGroup: null,
lastAddedSeat: null, lastAddedSeat: null,

Loading…
Cancel
Save