From 7dfca604c254ffc901eb037e7225d51bb99490c2 Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 16 Dec 2024 14:41:52 +0800 Subject: [PATCH] perf: update draw create update --- .../Table/TableFormatters/DetailFormatter.vue | 11 ---- src/guards.js | 2 +- .../GenericCreateUpdateForm/index.vue | 18 ++++-- .../GenericCreateUpdatePage/index.vue | 1 - .../components/GenericDetailPage/index.vue | 60 +++++++++++++------ .../GenericListDrawerPage/Drawer.vue | 29 +++++++-- .../GenericListDrawerPage/index.vue | 4 +- src/layout/components/Page/PageHeading.vue | 6 +- src/layout/components/Page/index.vue | 3 + src/store/getters.js | 3 +- src/store/modules/common.js | 5 +- src/utils/common.js | 6 +- .../users/Group/UserGroupDetail/index.vue | 1 - src/views/users/User/UserCreateUpdate.vue | 8 ++- src/views/users/User/UserDetail/UserInfo.vue | 8 +-- 15 files changed, 113 insertions(+), 52 deletions(-) diff --git a/src/components/Table/TableFormatters/DetailFormatter.vue b/src/components/Table/TableFormatters/DetailFormatter.vue index 91189cbd3..ccf5a7a68 100644 --- a/src/components/Table/TableFormatters/DetailFormatter.vue +++ b/src/components/Table/TableFormatters/DetailFormatter.vue @@ -124,20 +124,9 @@ export default { if (this.formatterArgs.openInNewPage) { const { href } = this.$router.resolve(detailRoute) this.linkClicked = this.formatterArgs.removeColorOnClick - return window.open(href, '_blank') } - if (detailRoute.query.type === 'pam') { - this.showTableDetailDrawer = true - - this.currentTemplate = detailRoute.name - this.drawerTitle = this.$t(detailRoute.name) - this.$route.params.id = detailRoute.params.id - - return - } - this.$router.push(detailRoute) } } diff --git a/src/guards.js b/src/guards.js index 6523e8a49..9996e5ec3 100644 --- a/src/guards.js +++ b/src/guards.js @@ -13,8 +13,8 @@ import { toSentenceCase } from '@/utils/common' router.beforeEach(async(to, from, next) => { // start progress bar // NProgress.start() - await store.dispatch('common/setDrawerActionMeta', {}) try { + await store.dispatch('common/cleanDrawerActionMeta') await startup({ to, from, next }) next() } catch (e) { diff --git a/src/layout/components/GenericCreateUpdateForm/index.vue b/src/layout/components/GenericCreateUpdateForm/index.vue index 03fa32c50..2a25ee849 100644 --- a/src/layout/components/GenericCreateUpdateForm/index.vue +++ b/src/layout/components/GenericCreateUpdateForm/index.vue @@ -209,7 +209,6 @@ export default { type: Function, default(res, method, vm, addContinue) { const route = this.getNextRoute(res, method) - if (!(route.params && route.params.id)) { route['params'] = deepmerge(route['params'] || {}, { 'id': res.id }) } @@ -218,10 +217,18 @@ export default { this.$emit('submitSuccess', res) this.emitPerformSuccessMsg(method, res, addContinue) - if (!addContinue) { + if (addContinue) { + return + } + + if (!vm.drawer) { if (this.$router.currentRoute.name !== route?.name) { setTimeout(() => this.$router.push(route), 100) } + } else { + console.log('Reload table clsonse dr') + this.$emit('close-drawer') + this.$emit('reload-table') } } }, @@ -390,7 +397,6 @@ export default { }) }, async getUpdateForm() { - }, async getCloneForm(cloneFrom) { const [curUrl, query] = this.url.split('?') @@ -438,7 +444,7 @@ export default { diff --git a/src/layout/components/GenericCreateUpdatePage/index.vue b/src/layout/components/GenericCreateUpdatePage/index.vue index ceadc9db5..517760626 100644 --- a/src/layout/components/GenericCreateUpdatePage/index.vue +++ b/src/layout/components/GenericCreateUpdatePage/index.vue @@ -22,7 +22,6 @@ export default { }, mounted() { this.$store.dispatch('common/getDrawerActionMeta').then((res) => { - console.log('res: ', res) if (res.action) { this.drawer = true } diff --git a/src/layout/components/GenericDetailPage/index.vue b/src/layout/components/GenericDetailPage/index.vue index 9951a1f1b..e5b620a72 100644 --- a/src/layout/components/GenericDetailPage/index.vue +++ b/src/layout/components/GenericDetailPage/index.vue @@ -35,7 +35,6 @@ export default { props: { url: { type: String, - required: false, default: '' }, object: { @@ -98,31 +97,34 @@ export default { }, data() { const vm = this - const detailApiUrl = this.getDetailUrl() const defaultActions = { // Delete button canDelete: vm.$hasCurrentResAction('delete'), + hasDelete: true, deleteCallback: function(item) { vm.defaultDelete(item) }, - deleteApiUrl: detailApiUrl, deleteSuccessRoute: this.$route.name.replace('Detail', 'List'), // Update button canUpdate: () => { return !vm.currentOrgIsRoot && vm.$hasCurrentResAction('change') }, + hasUpdate: true, updateCallback: function(item) { this.defaultUpdate(item) }, updateRoute: this.$route.name.replace('Detail', 'Update') } return { - detailApiUrl, defaultActions, loading: true, + drawer: '', + action: '', + actionId: '', validActions: Object.assign(defaultActions, this.actions) } }, + computed: { ...mapGetters(['currentOrgIsRoot']), pageActions() { @@ -133,7 +135,7 @@ export default { icon: 'el-icon-edit-outline', size: 'small', can: this.validActions.canUpdate, - has: this.validActions.hasUpdate, + has: this.validActions.hasUpdate && !this.drawer, callback: this.validActions.updateCallback.bind(this) }, { @@ -172,28 +174,53 @@ export default { return [...this.submenu, activity] } }, - async mounted() { + async created() { try { this.loading = true + await this.checkDrawer() await this.getObject() } finally { this.loading = false } }, methods: { + async checkDrawer() { + const drawActionMeta = await this.$store.dispatch('common/getDrawerActionMeta') + if (drawActionMeta) { + this.drawer = true + this.row = drawActionMeta.row + this.actionId = this.row?.id + } + }, getDetailUrl() { const vm = this - if (vm.url) { - return `${vm.url}/${vm.$route.params.id}/` + let objectId = '' + if (this.actionId) { + objectId = this.actionId } else { - return getApiPath(vm) + objectId = vm.$route.params.id + } + if (vm.url) { + return `${vm.url}/${objectId}/` + } else { + return getApiPath(vm, objectId) + } + }, + afterDelete() { + if (this.drawer) { + this.$emit('close-drawer') + this.$emit('detail-delete-success') + this.$emit('reload-table') + } else { + this.$message.success(this.$tc('DeleteSuccessMsg')) + this.$router.push({ name: this.validActions.deleteSuccessRoute }) } }, defaultDelete() { const msg = this.$t('DeleteWarningMsg') + ' ' + this.iTitle + ' ?' const title = this.$t('Info') const performDelete = () => { - const url = this.validActions.deleteApiUrl + const url = this.getDetailUrl() this.$log.debug('Start perform delete: ', url) return this.$axios.delete(url) } @@ -208,8 +235,7 @@ export default { try { await performDelete.bind(this)() done() - this.$message.success(this.$tc('DeleteSuccessMsg')) - this.$router.push({ name: this.validActions.deleteSuccessRoute }) + this.afterDelete() } catch (error) { const errorDetail = error?.response?.data?.detail || '' if (errorDetail) { @@ -240,13 +266,13 @@ export default { }, getObject() { // 兼容之前的 detailApiUrl - const url = this.validActions.detailApiUrl || this.detailApiUrl + const url = this.getDetailUrl() return this.$axios.get(url, { disableFlashErrorMsg: true }).then(data => { this.$emit('update:object', data) this.$emit('getObjectDone', data) }).catch(error => { if (error.response && error.response.status === 404) { - const msg = this.$t('ObjectNotFoundOrDeletedMsg') + const msg = this.$tc('ObjectNotFoundOrDeletedMsg') this.$message.error(msg) } else { flashErrorMsg({ error, response: error.response }) @@ -263,7 +289,7 @@ export default { diff --git a/src/layout/components/GenericListDrawerPage/Drawer.vue b/src/layout/components/GenericListDrawerPage/Drawer.vue index 2b2c906d3..651d364bd 100644 --- a/src/layout/components/GenericListDrawerPage/Drawer.vue +++ b/src/layout/components/GenericListDrawerPage/Drawer.vue @@ -1,11 +1,19 @@ @@ -27,6 +35,10 @@ export default { props: { type: Object, default: () => ({}) + }, + action: { + type: String, + default: '' } }, computed: { @@ -37,11 +49,13 @@ export default { set(val) { this.$emit('update:visible', val) } + }, + drawerSize() { + const width = window.innerWidth + if (width >= 768) return '800px' + return '90%' } }, - mounted() { - console.log('Mounted: ',) - }, methods: { closeDrawer() { this.iVisible = false @@ -55,7 +69,12 @@ export default { /* 可自定义样式 */ ::v-deep { + .el-card.ibox { + //border: none; + } + .el-drawer__header { + //border-bottom: 1px solid #EBEEF5; margin-bottom: 10px; padding-top: 10px; font-size: 16px; diff --git a/src/layout/components/GenericListDrawerPage/index.vue b/src/layout/components/GenericListDrawerPage/index.vue index 02f6909fe..aa90150ce 100644 --- a/src/layout/components/GenericListDrawerPage/index.vue +++ b/src/layout/components/GenericListDrawerPage/index.vue @@ -10,10 +10,12 @@ @@ -78,7 +80,7 @@ export default { } }, watch: { - visible(val) { + drawerVisible(val) { if (!val) { this.$store.dispatch('common/cleanDrawerActionMeta') } diff --git a/src/layout/components/Page/PageHeading.vue b/src/layout/components/Page/PageHeading.vue index 9509d9373..e709a53eb 100644 --- a/src/layout/components/Page/PageHeading.vue +++ b/src/layout/components/Page/PageHeading.vue @@ -1,7 +1,7 @@