TT#28065 User wants to remove sourcesets

What has been done:
- TT#36196, CallForward: Implement UI delete button and method for
  removing sourceset, plus confirmation dialog component
- TT#36184, CallForward: Implement api layer methods, plus corresponding
  store actions and mutations
- TT#36197, CallForward: Implement success toast, error handling, remove
  dialog and loading animation

Change-Id: I75fd94f9d83bcb28b111c206d5b686f70fe5ddb4
changes/73/21173/5
raxelsen 8 years ago
parent afbe0a031e
commit acd8f5b7a5

@ -806,3 +806,13 @@ export function createSourcesetWithSource(options) {
}); });
}); });
} }
export function deleteSourcesetById(id) {
return new Promise((resolve, reject) => {
Vue.http.delete('/api/cfsourcesets/' + id).then(() => {
resolve();
}).catch(err => {
reject(err);
});
});
}

@ -31,6 +31,19 @@
class="sources-section" class="sources-section"
v-if="sourceset.sourcesetId" v-if="sourceset.sourcesetId"
> >
<div class="sourceset-delete row justify-end">
<q-btn
flat
align="right"
color="negative"
icon="delete"
class="add-destination-button sourceset-delete"
:class="{ 'no-padding': $q.platform.is.mobile, 'mobile-button': $q.platform.is.mobile }"
@click="removeSourceset(sourceset)"
>
{{ deleteSourcesetLabel }}
</q-btn>
</div>
<div class="sources-title"> <div class="sources-title">
<q-icon <q-icon
name="contact_phone" name="contact_phone"
@ -137,7 +150,8 @@
QInput, QInput,
QIcon, QIcon,
QSelect, QSelect,
QBtn QBtn,
Dialog
} from 'quasar-framework' } from 'quasar-framework'
export default { export default {
name: 'csc-sourcesets', name: 'csc-sourcesets',
@ -178,17 +192,25 @@
QInput, QInput,
QIcon, QIcon,
QSelect, QSelect,
QBtn QBtn,
Dialog
}, },
computed: { computed: {
...mapGetters('callForward', [ ...mapGetters('callForward', [
'addSourceState', 'addSourceState',
'addSourceError', 'addSourceError',
'lastAddedSource', 'lastAddedSource',
'addSourceFormEnabled' 'addSourceFormEnabled',
'removeSourcesetError',
'removeSourcesetState',
'lastRemovedSourceset'
]), ]),
isValid() { isValid() {
return this.source.length > 0 && this.sourcesetName.length > 0; return this.source.length > 0 && this.sourcesetName.length > 0;
},
deleteSourcesetLabel() {
return this.$q.platform.is.mobile ? '' :
this.$t('pages.callForward.sources.removeSourcesetButton');
} }
}, },
methods: { methods: {
@ -202,9 +224,14 @@
this.tab = 'Everybody'; this.tab = 'Everybody';
}, },
sourcesetSources(id) { sourcesetSources(id) {
if (this.sourcesets[0]) {
return this.sourcesets.filter((sourceset) => { return this.sourcesets.filter((sourceset) => {
return sourceset.id === id; return sourceset.id === id;
})[0].sources; })[0].sources;
}
else {
return [];
}
}, },
destinationsCount(groups) { destinationsCount(groups) {
let groupCollection = [ let groupCollection = [
@ -250,6 +277,31 @@
}, },
addSource(options) { addSource(options) {
this.$store.dispatch('callForward/appendSourceToSourceset', options); this.$store.dispatch('callForward/appendSourceToSourceset', options);
},
removeSourceset(sourceset) {
let self = this;
Dialog.create({
title: self.$t('pages.callForward.sources.removeSourcesetDialogTitle'),
message: self.$t('pages.callForward.sources.removeSourcesetDialogText', {
sourceset: sourceset.sourcesetName
}),
buttons: [
self.$t('buttons.cancel'),
{
label: self.$t('buttons.remove'),
color: 'negative',
handler () {
self.$store.dispatch('callForward/deleteSourcesetById', sourceset);
}
}
]
});
},
loadAll() {
this.$store.dispatch('callForward/loadDestinations', {
timeset: this.timesetName
});
this.$store.dispatch('callForward/loadSourcesets');
} }
}, },
watch: { watch: {
@ -272,6 +324,24 @@
}); });
this.closeForm(); this.closeForm();
} }
},
removeSourcesetState(state) {
if (state === 'requesting') {
startLoading;
}
else if (state === 'failed') {
stopLoading;
showGlobalError(this.removeSourcesetError);
}
else if (state === 'succeeded') {
stopLoading;
showToast(this.$t('pages.callForward.sources.removeSourcesetSuccessMessage', {
sourceset: this.lastRemovedSourceset
}));
this.loadAll();
this.resetForm();
}
} }
} }
} }
@ -298,7 +368,10 @@
margin-top 8px margin-top 8px
.sources-section .sources-section
padding 30px 0 20px 0 padding 0 0 20px 0
.mobile-button > span > i
margin 0
.sources-title .sources-title
color $secondary color $secondary

@ -201,7 +201,12 @@
"addSourcesetErrorMessage": "An error occured while trying to create the sourceset. Please try again.", "addSourcesetErrorMessage": "An error occured while trying to create the sourceset. Please try again.",
"addSourceButton": "Add source", "addSourceButton": "Add source",
"addSourceSuccessMessage": "Added new source {source}", "addSourceSuccessMessage": "Added new source {source}",
"addSourceErrorMessage": "An error occured while trying to add the source. Please try again." "addSourceErrorMessage": "An error occured while trying to add the source. Please try again.",
"removeSourcesetButton": "Delete sourceset",
"removeSourcesetErrorMessage": "An error occured while trying to delete the sourceset. Please try again.",
"removeSourcesetSuccessMessage": "Removed sourceset {sourceset}",
"removeSourcesetDialogTitle": "Remove call forward sourceset",
"removeSourcesetDialogText": "You are about to remove the sourceset {sourceset}"
} }
}, },
"home": { "home": {

@ -23,7 +23,8 @@ import {
appendTimeToTimeset, appendTimeToTimeset,
loadDestinations, loadDestinations,
createSourcesetWithSource, createSourcesetWithSource,
appendSourceToSourceset appendSourceToSourceset,
deleteSourcesetById
} from '../api/call-forward'; } from '../api/call-forward';
const RequestState = { const RequestState = {
@ -61,6 +62,9 @@ export default {
addTimeError: null, addTimeError: null,
addSourcesetState: RequestState.button, addSourcesetState: RequestState.button,
addSourcesetError: null, addSourcesetError: null,
removeSourcesetState: RequestState.button,
removeSourcesetError: null,
lastRemovedSourceset: null,
lastAddedSourceset: null, lastAddedSourceset: null,
addSourceState: RequestState.button, addSourceState: RequestState.button,
addSourceError: null, addSourceError: null,
@ -152,6 +156,16 @@ export default {
}, },
addSourceFormEnabled(state) { addSourceFormEnabled(state) {
return state.addSourceFormEnabled; return state.addSourceFormEnabled;
},
removeSourcesetState(state) {
return state.removeSourcesetState;
},
removeSourcesetError(state) {
return state.removeSourcesetError ||
i18n.t('pages.callForward.sources.removeSourcesetErrorMessage');
},
lastRemovedSourceset(state) {
return state.lastRemovedSourceset;
} }
}, },
mutations: { mutations: {
@ -349,6 +363,21 @@ export default {
}, },
setAddSourceFormEnabled(state, value) { setAddSourceFormEnabled(state, value) {
state.addSourceFormEnabled = value; state.addSourceFormEnabled = value;
},
removeSourcesetRequesting(state) {
state.removeSourcesetState = RequestState.requesting;
state.removeSourcesetError = null;
},
removeSourcesetSucceeded(state) {
state.removeSourcesetState = RequestState.succeeded;
state.removeSourcesetError = null;
},
removeSourcesetFailed(state, error) {
state.removeSourcesetState = RequestState.failed;
state.removeSourcesetError = error;
},
setLastRemovedSourceset(state, value) {
state.lastRemovedSourceset = value;
} }
}, },
actions: { actions: {
@ -629,6 +658,15 @@ export default {
}).catch((err) => { }).catch((err) => {
context.commit('addSourceFailed', err.message); context.commit('addSourceFailed', err.message);
}); });
},
deleteSourcesetById(context, options) {
context.commit('removeSourcesetRequesting');
deleteSourcesetById(options.sourcesetId).then(() => {
context.commit('setLastRemovedSourceset', options.sourcesetName);
context.commit('removeSourcesetSucceeded');
}).catch((err) => {
context.commit('removeSourcesetFailed', err.message);
});
} }
} }
}; };

Loading…
Cancel
Save