diff --git a/ayanova/src/api/translation.js b/ayanova/src/api/translation.js index 0bfb3bab..19dd5f78 100644 --- a/ayanova/src/api/translation.js +++ b/ayanova/src/api/translation.js @@ -180,7 +180,7 @@ export default { "Cancel", "Close", "Save", - "SaveACopy", + "SaveAs", "Delete", "SoftDelete", "SoftDeleteAll", diff --git a/ayanova/src/components/data-table-filter-manager-control.vue b/ayanova/src/components/data-table-filter-manager-control.vue index 019bd8df..7657f03c 100644 --- a/ayanova/src/components/data-table-filter-manager-control.vue +++ b/ayanova/src/components/data-table-filter-manager-control.vue @@ -11,21 +11,157 @@ >{{ activeFilterNameAtOpen }} {{ activeFilterCreator }} - - + + + + + + - + + @@ -72,8 +209,14 @@ export default { filter: "[]" }, activeFilterNameAtOpen: null, + activeFilterPublicAtOpen: null, activeFilterCreator: "", isSelfOwned: true, + selectedSavedFilterToOverWrite: null, + selectLists: { + savedFilters: [] + }, + formState: { ready: false, dirty: false, @@ -85,9 +228,58 @@ export default { serverError: {} } }), + computed: { + offerReplace() { + return ( + this.activeFilter.defaultFilter && + this.selectLists.savedFilters.length > 0 + ); + }, + isDefaultFilter() { + if (this.activeFilter && this.activeFilter.defaultFilter) { + return true; + } + return false; + }, + namedFilterIsSavable() { + if ( + this.activeFilter.name != this.activeFilterNameAtOpen || + this.activeFilter.public != this.activeFilterPublicAtOpen + ) { + return true; + } else { + return false; + } + }, + defaultFilterNameEdited() { + if (this.activeFilter.name != this.activeFilterNameAtOpen) { + return true; + } else { + return false; + } + }, + defaultFilterIsSavAsAble() { + if ( + this.defaultFilterNameEdited && + this.selectedSavedFilterToOverWrite == null + ) { + return true; + } else { + return false; + } + }, + defaultFilterIsOverWriteSavAble() { + if (this.selectedSavedFilterToOverWrite != null) { + return true; + } else { + return false; + } + } + }, async created() { await initForm(this); }, + methods: { async deleteFilter() { //prompt if a true delete and not a default filter "reset" @@ -108,6 +300,9 @@ export default { } }, async saveAndExit(saveAs) { + //TODO: if it's going to do a replace then it needs to get a fresh copy of the replacement filter and it's concurrency token etc + //otherwise saveAs is fine as is I think + if (saveAs) { //SAVE AS //strip ID @@ -148,12 +343,13 @@ export default { }, async open(tableColumnData) { this.tableColumnData = tableColumnData; + this.selectedSavedFilterToOverWrite = null; await fetchActiveFilter(this); this.activeFilterNameAtOpen = this.activeFilter.name; + this.activeFilterPublicAtOpen = this.activeFilter.public; this.isSelfOwned = this.activeFilter.userId == window.$gz.store.state.userId; - //Get owner name if (!this.isSelfOwned) { const res = await window.$gz.api.post("pick-list/list", { @@ -170,6 +366,8 @@ export default { } } + await fetchSavedFilterList(this); + this.isVisible = true; return new Promise((resolve, reject) => { this.resolve = resolve; @@ -202,11 +400,30 @@ async function fetchActiveFilter(vm) { } } +//////////////////// +// +async function fetchSavedFilterList(vm) { + const res = await window.$gz.api.get( + "data-list-filter/list?ListKey=" + vm.dataListKey + ); + if (res.error) { + vm.formState.serverError = res.error; + window.$gz.form.setErrorBoxErrors(vm); + } else { + //use previous selects but weed out default filter + vm.selectLists.savedFilters = res.data.filter(z => z.default != true); + } +} + ////////////////////////////////////////////////////////// // // Ensures UI translated text is available // async function fetchTranslatedText() { - await window.$gz.translation.cacheTranslations(["GridFilterName", "AnyUser"]); + await window.$gz.translation.cacheTranslations([ + "GridFilterName", + "AnyUser", + "DataListSavedFilter" + ]); }