Compare commits

...

1 Commits

Author SHA1 Message Date
ibuler
1e471d0d22 perf: usign draw to create 2024-04-25 10:01:12 +08:00
8 changed files with 108 additions and 54 deletions

View File

@@ -0,0 +1,31 @@
<!-- DrawerComponent.vue -->
<template>
<el-drawer
:modal="false"
:visible.sync="drawerVisible"
append-to-body
size="600px"
title="Create Resource"
@close="closeDrawer"
>
<router-view /> <!-- 这里展示创建页面的路由组件 -->
</el-drawer>
</template>
<script>
export default {
data() {
return {
drawerVisible: true
}
},
methods: {
openDrawer() {
this.drawerVisible = true
},
closeDrawer() {
this.drawerVisible = false
}
}
}
</script>

View File

@@ -27,6 +27,7 @@ export default {
createRoute: { createRoute: {
type: [String, Object, Function], type: [String, Object, Function],
default() { default() {
console.log('This: ', this.$route)
return this.$route.name?.replace('List', 'Create') return this.$route.name?.replace('List', 'Create')
} }
}, },
@@ -114,12 +115,8 @@ export default {
}, },
callback: this.handleBulkUpdate callback: this.handleBulkUpdate
} }
] ],
} defaultActions: [
},
computed: {
defaultActions() {
const defaultActions = [
{ {
name: 'actionCreate', name: 'actionCreate',
title: this.createTitle, title: this.createTitle,
@@ -130,22 +127,10 @@ export default {
callback: this.onCreate || this.handleCreate callback: this.onCreate || this.handleCreate
} }
] ]
if (this.moreCreates) {
const defaultMoreCreate = {
name: 'actionMoreCreate',
title: this.createTitle,
type: 'primary',
has: true,
icon: 'plus',
can: this.canCreate,
dropdown: [],
callback: this.onCreate || this.handleCreate
} }
const createCreateAction = Object.assign(defaultMoreCreate, this.moreCreates)
defaultActions.push(createCreateAction)
}
return defaultActions
}, },
computed: {
iActions() { iActions() {
return [...this.actions, this.moreAction] return [...this.actions, this.moreAction]
}, },
@@ -189,6 +174,11 @@ export default {
}, },
methods: { methods: {
handleCreate() { handleCreate() {
// this.$router.push({
// name: 'UserCreate'
// })
// return
console.log('This: ', this.$router)
let route let route
if (typeof this.createRoute === 'string') { if (typeof this.createRoute === 'string') {
route = { name: this.createRoute } route = { name: this.createRoute }
@@ -198,7 +188,7 @@ export default {
} else if (typeof this.createRoute === 'object') { } else if (typeof this.createRoute === 'object') {
route = this.createRoute route = this.createRoute
} }
this.$log.debug('handle create') this.$log.debug('handle create: ', route, this.createRoute)
if (this.createInNewPage) { if (this.createInNewPage) {
const { href } = this.$router.resolve(route) const { href } = this.$router.resolve(route)
window.open(href, '_blank') window.open(href, '_blank')

View File

@@ -96,8 +96,8 @@ export default {
canDelete: true, canDelete: true,
hasClone: true, hasClone: true,
canClone: true, canClone: true,
updateRoute: this.$route.name.replace('List', 'Update'), updateRoute: 'UserUpdate',
cloneRoute: this.$route.name.replace('List', 'Create'), cloneRoute: 'UserCreate',
performDelete: defaultPerformDelete, performDelete: defaultPerformDelete,
onUpdate: defaultUpdateCallback, onUpdate: defaultUpdateCallback,
onDelete: defaultDeleteCallback, onDelete: defaultDeleteCallback,

View File

@@ -25,7 +25,7 @@ export default {
type: Object, type: Object,
default() { default() {
return { return {
route: this.$route.name.replace('List', 'Detail'), route: 'abc',
getRoute: null, getRoute: null,
routeQuery: null, routeQuery: null,
can: true, can: true,

View File

@@ -120,7 +120,7 @@ export default {
updateCallback: function(item) { updateCallback: function(item) {
this.defaultUpdate(item) this.defaultUpdate(item)
}, },
updateRoute: this.$route.name.replace('Detail', 'Update') updateRoute: 'abc'
} }
return { return {
detailApiUrl, detailApiUrl,

View File

@@ -6,21 +6,21 @@ const globalSubmenu = () => import('@/layout/globalOrg.vue')
export default [ export default [
{ {
path: 'users', path: 'users',
component: empty, // Parent router-view
redirect: '',
meta: {
permissions: ['users.view_user'],
expanded: true
},
children: [
{
path: '',
component: () => import('@/views/users/User/UserList.vue'), // Parent router-view component: () => import('@/views/users/User/UserList.vue'), // Parent router-view
name: 'UserList', name: 'UserList',
meta: { meta: {
permissions: ['users.view_user'],
title: i18n.t('UserList') title: i18n.t('UserList')
}
}, },
children: [
// {
// path: 'users',
// component: () => import('@/views/users/User/UserList.vue'), // Parent router-view
// name: 'UserList',
// meta: {
// title: i18n.t('UserList')
// }
// },
{ {
path: 'create', path: 'create',
component: () => import('@/views/users/User/UserCreateUpdate.vue'), // Parent router-view component: () => import('@/views/users/User/UserCreateUpdate.vue'), // Parent router-view

View File

@@ -1,9 +1,17 @@
<template> <template>
<GenericCreateUpdatePage v-if="!loading" class="user-create-update" v-bind="$data" @getObjectDone="afterGetUser" /> <el-drawer
:modal="false"
:visible="drawerVisible"
size="600px"
title="Create User"
@close="closeDrawer"
>
<GenericCreateUpdateForm v-if="!loading" class="user-create-update" v-bind="$data" @getObjectDone="afterGetUser" />
</el-drawer>
</template> </template>
<script> <script>
import { GenericCreateUpdatePage } from '@/layout/components' import { GenericCreateUpdateForm } from '@/layout/components'
import { PhoneInput, UserPassword } from '@/components/Form/FormFields' import { PhoneInput, UserPassword } from '@/components/Form/FormFields'
import rules from '@/components/Form/DataForm/rules' import rules from '@/components/Form/DataForm/rules'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
@@ -11,11 +19,12 @@ import { Select2 } from '@/components'
export default { export default {
components: { components: {
GenericCreateUpdatePage GenericCreateUpdateForm
}, },
data() { data() {
return { return {
loading: true, loading: true,
drawerVisible: true, // 默认抽屉可见
initial: { initial: {
need_update_password: true, need_update_password: true,
system_roles: [], system_roles: [],
@@ -195,6 +204,15 @@ export default {
this.loading = false this.loading = false
}, },
methods: { methods: {
closeDrawer() {
this.drawerVisible = false
// 可选:在抽屉关闭时重置路由到用户列表页
this.$router.back()
},
handleUserCreated() {
// 可选:在用户创建成功后执行的操作
this.closeDrawer() // 创建成功后关闭抽屉
},
afterGetUser(user) { afterGetUser(user) {
this.user = user this.user = user
if (this.user.id === this.currentUser.id) { if (this.user.id === this.currentUser.id) {

View File

@@ -1,4 +1,6 @@
<template> <template>
<div>
<keep-alive include="UserList">
<div> <div>
<GenericListPage <GenericListPage
ref="GenericListPage" ref="GenericListPage"
@@ -14,6 +16,9 @@
/> />
<InviteUsersDialog :setting="InviteDialogSetting" @close="handleInviteDialogClose" /> <InviteUsersDialog :setting="InviteDialogSetting" @close="handleInviteDialogClose" />
</div> </div>
</keep-alive>
<router-view /> <!-- 这里展示创建页面的路由组件 -->
</div>
</template> </template>
<script> <script>
@@ -42,6 +47,7 @@ export default {
return !vm.currentOrgIsRoot return !vm.currentOrgIsRoot
} }
return { return {
drawerVisible: false,
tableConfig: { tableConfig: {
url: '/api/v1/users/users/', url: '/api/v1/users/users/',
permissions: { permissions: {
@@ -253,10 +259,19 @@ export default {
'device', 'currentOrgIsDefault', 'currentUserIsSuperAdmin' 'device', 'currentOrgIsDefault', 'currentUserIsSuperAdmin'
]) ])
}, },
watch: {
'$route'(route) {
this.drawerVisible = !this.drawerVisible
console.log('Route changed: ', route)
}
},
mounted() { mounted() {
this.setRolesFilter() this.setRolesFilter()
}, },
methods: { methods: {
closeDrawer() {
this.drawerVisible = false
},
setRolesFilter() { setRolesFilter() {
const roleTypes = [{ name: 'system-roles', perm: 'systemrole' }, { name: 'org-roles', perm: 'orgrole' }] const roleTypes = [{ name: 'system-roles', perm: 'systemrole' }, { name: 'org-roles', perm: 'orgrole' }]
for (const roleType of roleTypes) { for (const roleType of roleTypes) {