index.vue
4.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<script setup lang="ts">
import type { VbenFormProps } from '@vben/common-ui';
import type { VxeGridProps } from '#/adapter/vxe-table';
import type { User } from '#/api/system/user/model';
import { useRoute, useRouter } from 'vue-router';
import { Page, useVbenDrawer } from '@vben/common-ui';
import { getVxePopupContainer } from '@vben/utils';
import { message, Modal, Popconfirm, Space } from 'ant-design-vue';
import { useVbenVxeGrid, vxeCheckboxChecked } from '#/adapter/vxe-table';
import {
roleAllocatedList,
roleAuthCancelAll,
} from '#/api/system/role';
import { columns, querySchema } from './data';
import roleAssignDrawer from './role-assign-drawer.vue';
const route = useRoute();
const router = useRouter();
const roleId = route.params.roleId as string;
const formOptions: VbenFormProps = {
commonConfig: {
labelWidth: 80,
componentProps: {
allowClear: true,
},
},
schema: querySchema(),
wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4',
};
const gridOptions: VxeGridProps = {
checkboxConfig: {
// 高亮
highlight: true,
// 翻页时保留选中状态
reserve: true,
// 点击行选中
// trigger: 'row',
},
columns,
height: 'auto',
keepSource: true,
pagerConfig: {},
proxyConfig: {
ajax: {
query: async ({ page }, formValues = {}) => {
// 校验roleId是否为空
if (!roleId || roleId === ':roleId') {
message.error('角色信息丢失,请重新点击分配');
// 重定向回角色列表
router.push('/system/role');
return {
items: [],
total: 0,
};
}
return await roleAllocatedList(roleId, {
SkipCount: page.currentPage,
MaxResultCount: page.pageSize,
...formValues,
});
},
},
},
rowConfig: {
keyField: 'id',
},
id: 'system-role-assign-index',
};
// @ts-expect-error TS2589: User 与 proxyConfig 组合导致类型实例化层级过深;运行时泛型已被擦除,可控,先压制报错。
const [BasicTable, tableApi] = useVbenVxeGrid({
formOptions,
gridOptions,
});
const [RoleAssignDrawer, drawerApi] = useVbenDrawer({
connectedComponent: roleAssignDrawer,
});
function handleAdd() {
drawerApi.setData({});
drawerApi.open();
}
/**
* 取消授权 一条记录
*/
async function handleAuthCancel(record: User) {
await roleAuthCancelAll(roleId, [record.id]);
await tableApi.query();
}
/**
* 批量取消授权
*/
function handleMultipleAuthCancel() {
const rows = tableApi.grid.getCheckboxRecords();
const ids = rows.map((row: User) => row.id);
Modal.confirm({
title: '提示',
okType: 'danger',
content: `确认取消选中的${ids.length}条授权记录吗?`,
onOk: async () => {
await roleAuthCancelAll(roleId, ids);
await tableApi.query();
tableApi.grid.clearCheckboxRow();
},
});
}
</script>
<template>
<Page :auto-content-height="true">
<BasicTable table-title="已分配的用户列表">
<template #toolbar-tools>
<Space>
<a-button
:disabled="!vxeCheckboxChecked(tableApi)"
danger
type="primary"
v-access:code="['system:role:remove']"
@click="handleMultipleAuthCancel"
>
取消授权
</a-button>
<a-button
type="primary"
v-access:code="['system:role:add']"
@click="handleAdd"
>
{{ $t('pages.common.add') }}
</a-button>
</Space>
</template>
<template #action="{ row }">
<Popconfirm
:get-popup-container="getVxePopupContainer"
:title="`是否取消授权用户[${row.userName} - ${row.nick}]?`"
placement="left"
@confirm="handleAuthCancel(row)"
>
<ghost-button
danger
v-access:code="['system:role:remove']"
@click.stop=""
>
取消授权
</ghost-button>
</Popconfirm>
</template>
</BasicTable>
<RoleAssignDrawer @reload="tableApi.query()" />
</Page>
</template>