Commit d6cefc6cc2ce78e27d415357e306699c9ce7d026

Authored by xp.Huang
2 parents 87aeeacf e839d712

Merge branch 'ft-dev' into 'main'

fix:把批量删除修改为统一封装形式,移除我之前单独写的批量删除代码

See merge request huang/yun-teng-iot-front!210
... ... @@ -75,10 +75,9 @@
75 75 </template>
76 76
77 77 <script lang="ts">
78   - import { defineComponent, reactive, ref, computed } from 'vue';
  78 + import { defineComponent, reactive, nextTick } from 'vue';
79 79 import { BasicTable, useTable, TableAction, TableImg } from '/@/components/Table';
80 80 import { PageWrapper } from '/@/components/Page';
81   - import { useMessage } from '/@/hooks/web/useMessage';
82 81 import { useDrawer } from '/@/components/Drawer';
83 82 import CameraDrawer from './CameraDrawer.vue';
84 83 import { useResetOrganizationTree, OrganizationIdTree } from '/@/views/common/organizationIdTree';
... ... @@ -87,6 +86,7 @@
87 86 import VideoPreviewModal from './DialogPreviewVideo.vue';
88 87 import { useModal } from '/@/components/Modal';
89 88 import { Authority } from '/@/components/Authority';
  89 + import { useBatchDelete } from '/@/hooks/web/useBatchDelete';
90 90
91 91 export default defineComponent({
92 92 components: {
... ... @@ -100,22 +100,11 @@
100 100 Authority,
101 101 },
102 102 setup() {
103   - let selectedRowIds = ref<string[]>([]);
104   - const hasBatchDelete = ref(true);
105   - // 复选框事件
106   - const onSelectRowChange = (selectedRowKeys: string[]) => {
107   - selectedRowIds.value = selectedRowKeys;
108   - if (selectedRowIds.value.length > 0) {
109   - hasBatchDelete.value = false;
110   - } else {
111   - hasBatchDelete.value = true;
112   - }
113   - };
114 103 const searchInfo = reactive<Recordable>({});
115 104 const { organizationIdTreeRef, resetFn } = useResetOrganizationTree(searchInfo);
116 105 const [registerModal, { openModal }] = useModal();
117 106 // 表格hooks
118   - const [registerTable, { reload }] = useTable({
  107 + const [registerTable, { reload, setProps }] = useTable({
119 108 title: '视频列表',
120 109 api: cameraPage,
121 110 columns,
... ... @@ -129,10 +118,6 @@
129 118 useSearchForm: true,
130 119 showTableSetting: true,
131 120 bordered: true,
132   - rowSelection: {
133   - onChange: onSelectRowChange,
134   - type: 'checkbox',
135   - },
136 121 rowKey: 'id',
137 122 actionColumn: {
138 123 width: 200,
... ... @@ -144,12 +129,20 @@
144 129 });
145 130 // 弹框
146 131 const [registerDrawer, { openDrawer }] = useDrawer();
147   - const { createMessage } = useMessage();
148 132
149 133 // 刷新
150 134 const handleSuccess = () => {
151 135 reload();
152 136 };
  137 + const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions } = useBatchDelete(
  138 + deleteCameraManage,
  139 + handleSuccess,
  140 + setProps
  141 + );
  142 +
  143 + nextTick(() => {
  144 + setProps(selectionOptions);
  145 + });
153 146 // 新增或编辑
154 147 const handleCreateOrEdit = (record: Recordable | null) => {
155 148 if (record) {
... ... @@ -163,27 +156,6 @@
163 156 });
164 157 }
165 158 };
166   - // 删除或批量删除
167   - const handleDeleteOrBatchDelete = async (record: Recordable | null) => {
168   - if (record) {
169   - try {
170   - await deleteCameraManage([record.id]);
171   - createMessage.success('删除视频成功');
172   - handleSuccess();
173   - } catch (e) {}
174   - } else {
175   - hasBatchDelete.value = true;
176   - try {
177   - await deleteCameraManage(selectedRowIds.value);
178   - createMessage.success('批量删除视频成功');
179   - selectedRowIds.value = [];
180   - handleSuccess();
181   - setTimeout(() => {
182   - hasBatchDelete.value = false;
183   - }, 3000);
184   - } catch (e) {}
185   - }
186   - };
187 159
188 160 // 树形选择器
189 161 const handleSelect = (organizationId: string) => {
... ...
... ... @@ -15,7 +15,12 @@
15 15 <a-button disabled @click="handleImport"> 导入设备配置 </a-button>
16 16 </ImpExcel>
17 17 <Authority value="api:yt:admin:deleteDeviceConfig">
18   - <a-button danger color="error" @click="handleTableDel" :disabled="disabled">
  18 + <a-button
  19 + type="primary"
  20 + color="error"
  21 + @click="handleDeleteOrBatchDelete(null)"
  22 + :disabled="hasBatchDelete"
  23 + >
19 24 批量删除
20 25 </a-button>
21 26 </Authority>
... ... @@ -67,7 +72,7 @@
67 72 color: 'error',
68 73 popConfirm: {
69 74 title: '是否确认删除',
70   - confirm: handleDelete.bind(null, record),
  75 + confirm: handleDeleteOrBatchDelete.bind(null, record),
71 76 },
72 77 ifShow: () => {
73 78 return record.default === false;
... ... @@ -96,6 +101,7 @@
96 101 import { ImpExcel, ExcelData } from '/@/components/Excel';
97 102 // import { jsonToSheetXlsx, ExportModalResult } from '/@/components/Excel';
98 103 import { Authority } from '/@/components/Authority';
  104 + import { useBatchDelete } from '/@/hooks/web/useBatchDelete';
99 105
100 106 export default defineComponent({
101 107 name: 'DeviceProfileManagement',
... ... @@ -112,31 +118,45 @@
112 118 const { createMessage } = useMessage();
113 119 const [registerModal, { openModal }] = useModal();
114 120 const [registerModalDetail] = useModal();
115   - const [registerTable, { reload, getSelectRows, setTableData, getForm, getSelectRowKeys }] =
116   - useTable({
117   - title: '设备配置列表',
118   - clickToRowSelect: false,
119   - api: deviceConfigGetQuery,
120   - immediate: immediateStatus.value,
121   - columns,
122   - formConfig: {
123   - labelWidth: 120,
124   - schemas: searchFormSchema,
125   - },
126   - rowKey: 'id',
127   - useSearchForm: true,
128   - showTableSetting: true,
129   - bordered: true,
130   - showIndexColumn: false,
131   - actionColumn: {
132   - width: 240,
133   - title: '操作',
134   - dataIndex: 'action',
135   - slots: { customRender: 'action' },
136   - fixed: 'right',
137   - },
138   - });
139   -
  121 + const [
  122 + registerTable,
  123 + { setProps, reload, getSelectRows, setTableData, getForm, getSelectRowKeys },
  124 + ] = useTable({
  125 + title: '设备配置列表',
  126 + clickToRowSelect: false,
  127 + api: deviceConfigGetQuery,
  128 + immediate: immediateStatus.value,
  129 + columns,
  130 + formConfig: {
  131 + labelWidth: 120,
  132 + schemas: searchFormSchema,
  133 + },
  134 + rowKey: 'id',
  135 + useSearchForm: true,
  136 + showTableSetting: true,
  137 + bordered: true,
  138 + showIndexColumn: false,
  139 + actionColumn: {
  140 + width: 240,
  141 + title: '操作',
  142 + dataIndex: 'action',
  143 + slots: { customRender: 'action' },
  144 + fixed: 'right',
  145 + },
  146 + });
  147 + const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions, resetSelectedRowKeys } =
  148 + useBatchDelete(deviceConfigDelete, handleSuccess, setProps);
  149 + selectionOptions.rowSelection.getCheckboxProps = (record: Recordable) => {
  150 + // Demo:status为1的选择框禁用
  151 + if (record.default === true) {
  152 + return { disabled: true };
  153 + } else {
  154 + return { disabled: false };
  155 + }
  156 + };
  157 + nextTick(() => {
  158 + setProps(selectionOptions);
  159 + });
140 160 /**
141 161 *@param url,name
142 162 **/
... ... @@ -251,26 +271,26 @@
251 271 disabled.value = true;
252 272 }
253 273 };
254   - const handleTableDel = () => {
255   - disabled.value = true;
256   - deviceConfigDelete(selectedRowKeys)
257   - .then(() => {
258   - createMessage.success('删除设备配置成功');
259   - handleSuccess();
260   - setTimeout(() => {
261   - disabled.value = false;
262   - }, 3000);
263   - selectedRowKeys.length = 0;
264   - })
265   - .catch((e) => {
266   - selectedRowKeys.length = 0;
267   - setTimeout(() => {
268   - disabled.value = false;
269   - }, 3000);
270   - createMessage.error(e);
271   - });
272   - selectedRowKeys.length = 0;
273   - };
  274 + // const handleTableDel = () => {
  275 + // disabled.value = true;
  276 + // deviceConfigDelete(selectedRowKeys)
  277 + // .then(() => {
  278 + // createMessage.success('删除设备配置成功');
  279 + // handleSuccess();
  280 + // setTimeout(() => {
  281 + // disabled.value = false;
  282 + // }, 3000);
  283 + // selectedRowKeys.length = 0;
  284 + // })
  285 + // .catch((e) => {
  286 + // selectedRowKeys.length = 0;
  287 + // setTimeout(() => {
  288 + // disabled.value = false;
  289 + // }, 3000);
  290 + // createMessage.error(e);
  291 + // });
  292 + // selectedRowKeys.length = 0;
  293 + // };
274 294
275 295 function handleDelete(record: Recordable) {
276 296 let ids = [record.id];
... ... @@ -304,6 +324,7 @@
304 324 function handleSuccess() {
305 325 reload();
306 326 }
  327 +
307 328 const handleSetDefault = async (record: Recordable) => {
308 329 let id = record.id;
309 330 const obj = {
... ... @@ -337,7 +358,7 @@
337 358 // register1,
338 359 // defaultHeader,
339 360 useSelectionChange,
340   - handleTableDel,
  361 + // handleTableDel,
341 362 tableListRef,
342 363 loadDataSuccess,
343 364 handleImport,
... ... @@ -349,6 +370,8 @@
349 370 handleDelete,
350 371 handleSuccess,
351 372 registerModal,
  373 + hasBatchDelete,
  374 + handleDeleteOrBatchDelete,
352 375 };
353 376 },
354 377 });
... ...
... ... @@ -13,11 +13,12 @@
13 13 </Authority>
14 14 <Authority value="api:yt:admin:deleteDataFlow">
15 15 <a-button
16   - :disabled="disabledStatus1"
17   - @click="handleDelete"
18   - :type="disabledStatus1 ? 'default' : 'primary'"
  16 + type="primary"
  17 + color="error"
  18 + @click="handleDeleteOrBatchDelete(null)"
  19 + :disabled="hasBatchDelete"
19 20 >
20   - <span :style="{ color: disabledStatus1 ? 'grey' : 'white' }">批量删除</span>
  21 + 批量删除
21 22 </a-button>
22 23 </Authority>
23 24 <a-button
... ... @@ -55,7 +56,7 @@
55 56 color: 'error',
56 57 popConfirm: {
57 58 title: '是否确认删除',
58   - confirm: handleSingleDelete.bind(null, record),
  59 + confirm: handleDeleteOrBatchDelete.bind(null, record),
59 60 },
60 61 ifShow: (_action) => {
61 62 return record.status == 0;
... ... @@ -94,7 +95,7 @@
94 95 </div>
95 96 </template>
96 97 <script lang="ts">
97   - import { defineComponent, reactive, ref } from 'vue';
  98 + import { defineComponent, reactive, ref, nextTick } from 'vue';
98 99 import { BasicTable, useTable, TableAction } from '/@/components/Table';
99 100 import { columns, searchFormSchema } from './config';
100 101 import { useModal } from '/@/components/Modal';
... ... @@ -106,6 +107,7 @@
106 107 } from '/@/api/datamanager/dataManagerApi';
107 108 import { useMessage } from '/@/hooks/web/useMessage';
108 109 import { Authority } from '/@/components/Authority';
  110 + import { useBatchDelete } from '/@/hooks/web/useBatchDelete';
109 111
110 112 export default defineComponent({
111 113 name: 'Index',
... ... @@ -123,10 +125,13 @@
123 125 let selectedRowKeys: any = ref([]);
124 126 let getSelectRowsArr: any = ref([]);
125 127 let isJudgeSelectRowsArr: any = ref([]);
  128 + const handleSuccess = () => {
  129 + reload();
  130 + };
126 131 const [registerModal, { openModal }] = useModal();
127 132 const [
128 133 registerTable,
129   - { reload, getSelectRowKeys, getSelectRows, setLoading, clearSelectedRowKeys },
  134 + { setProps, reload, getSelectRowKeys, getSelectRows, setLoading, clearSelectedRowKeys },
130 135 ] = useTable({
131 136 title: '数据流转列表',
132 137 clickToRowSelect: false,
... ... @@ -149,6 +154,22 @@
149 154 fixed: 'right',
150 155 },
151 156 });
  157 + const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions } = useBatchDelete(
  158 + deleteConvertApi,
  159 + handleSuccess,
  160 + setProps
  161 + );
  162 + selectionOptions.rowSelection.getCheckboxProps = (record: Recordable) => {
  163 + // Demo:status为1的选择框禁用
  164 + if (record.status === 1) {
  165 + return { disabled: true };
  166 + } else {
  167 + return { disabled: false };
  168 + }
  169 + };
  170 + nextTick(() => {
  171 + setProps(selectionOptions);
  172 + });
152 173
153 174 //新增
154 175 const handleAdd = () => {
... ... @@ -159,9 +180,6 @@
159 180 }, 10);
160 181 };
161 182
162   - const handleSuccess = () => {
163   - reload();
164   - };
165 183 const handleEdit = (record: Recordable) => {
166 184 setTimeout(() => {
167 185 openModal(true, {
... ... @@ -217,16 +235,6 @@
217 235 setLoading(false);
218 236 }
219 237 };
220   - const handleSingleDelete = async (record: Recordable) => {
221   - try {
222   - let ids = [record.id];
223   - await deleteConvertApi(ids);
224   - createMessage.success('删除成功');
225   - reload();
226   - } catch (e) {
227   - return e;
228   - }
229   - };
230 238 const useSelectionChange = () => {
231 239 selectedRowKeys.value = getSelectRowKeys();
232 240 isJudgeSelectRowsArr.value = getSelectRows();
... ... @@ -262,35 +270,6 @@
262 270 disabledStatus1.value = true;
263 271 }
264 272 };
265   -
266   - const handleDelete = async () => {
267   - try {
268   - disabledStatus1.value = true;
269   - setLoading(true);
270   - const data = await deleteConvertApi(selectedRowKeys.value);
271   - if (data == true) {
272   - createMessage.success('删除成功');
273   - setLoading(false);
274   - setTimeout(() => {
275   - disabledStatus1.value = false;
276   - }, 3000);
277   - reload();
278   - } else {
279   - createMessage.error('删除失败');
280   - }
281   - } catch (e: any) {
282   - createMessage.error(e);
283   - setTimeout(() => {
284   - disabledStatus1.value = false;
285   - }, 3000);
286   - } finally {
287   - setLoading(false);
288   - clearSelectedRowKeys();
289   - setTimeout(() => {
290   - disabledStatus1.value = false;
291   - }, 3000);
292   - }
293   - };
294 273 const handleMutiuteDisable = async () => {
295 274 enableObj.convertIds.length = 0;
296 275 try {
... ... @@ -354,15 +333,15 @@
354 333 loading,
355 334 registerTable,
356 335 handleAdd,
357   - handleDelete,
358 336 registerModal,
359 337 handleSuccess,
360 338 handleEdit,
361 339 handleEnableOrDisable,
362   - handleSingleDelete,
363 340 useSelectionChange,
364 341 handleMutiuteDisable,
365 342 handleDisable,
  343 + hasBatchDelete,
  344 + handleDeleteOrBatchDelete,
366 345 };
367 346 },
368 347 });
... ...
... ... @@ -44,9 +44,8 @@
44 44 </template>
45 45
46 46 <script lang="ts">
47   - import { defineComponent, reactive, ref, computed, h } from 'vue';
  47 + import { defineComponent, reactive, h, nextTick } from 'vue';
48 48 import { BasicTable, useTable, TableAction } from '/@/components/Table';
49   - import { useMessage } from '/@/hooks/web/useMessage';
50 49 import { useDrawer } from '/@/components/Drawer';
51 50 import FeedbackDrawer from './FeedbackDrawer.vue';
52 51 import { feedbackPage, deleteFeedbackManage } from '/@/api/feedback/feedbackManager';
... ... @@ -55,6 +54,7 @@
55 54 import { Modal } from 'ant-design-vue';
56 55 import { JsonPreview } from '/@/components/CodeEditor';
57 56 import { Authority } from '/@/components/Authority';
  57 + import { useBatchDelete } from '/@/hooks/web/useBatchDelete';
58 58
59 59 export default defineComponent({
60 60 components: {
... ... @@ -64,21 +64,10 @@
64 64 Authority,
65 65 },
66 66 setup() {
67   - let selectedRowIds = ref<string[]>([]);
68   - const hasBatchDelete = ref(true);
69   - // 复选框事件
70   - const onSelectRowChange = (selectedRowKeys: string[]) => {
71   - selectedRowIds.value = selectedRowKeys;
72   - if (selectedRowIds.value.length > 0) {
73   - hasBatchDelete.value = false;
74   - } else {
75   - hasBatchDelete.value = true;
76   - }
77   - };
78 67 const searchInfo = reactive<Recordable>({});
79 68 const [registerModal] = useModal();
80 69 // 表格hooks
81   - const [registerTable, { reload }] = useTable({
  70 + const [registerTable, { reload, setProps }] = useTable({
82 71 title: '意见反馈列表',
83 72 api: feedbackPage,
84 73 columns,
... ... @@ -91,10 +80,6 @@
91 80 useSearchForm: true,
92 81 showTableSetting: true,
93 82 bordered: true,
94   - rowSelection: {
95   - onChange: onSelectRowChange,
96   - type: 'checkbox',
97   - },
98 83 rowKey: 'id',
99 84 actionColumn: {
100 85 width: 200,
... ... @@ -106,12 +91,20 @@
106 91 });
107 92 // 弹框
108 93 const [registerDrawer, { openDrawer }] = useDrawer();
109   - const { createMessage } = useMessage();
110 94
111 95 // 刷新
112 96 const handleSuccess = () => {
113 97 reload();
114 98 };
  99 + const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions } = useBatchDelete(
  100 + deleteFeedbackManage,
  101 + handleSuccess,
  102 + setProps
  103 + );
  104 +
  105 + nextTick(() => {
  106 + setProps(selectionOptions);
  107 + });
115 108 // 新增或编辑
116 109 const handleCreateOrEdit = (record: Recordable | null) => {
117 110 if (record) {
... ... @@ -125,27 +118,6 @@
125 118 });
126 119 }
127 120 };
128   - // 删除或批量删除
129   - const handleDeleteOrBatchDelete = async (record: Recordable | null) => {
130   - if (record) {
131   - try {
132   - await deleteFeedbackManage([record.id]);
133   - createMessage.success('删除成功');
134   - handleSuccess();
135   - } catch (e) {}
136   - } else {
137   - hasBatchDelete.value = true;
138   - try {
139   - await deleteFeedbackManage(selectedRowIds.value);
140   - createMessage.success('批量删除成功');
141   - selectedRowIds.value = [];
142   - handleSuccess();
143   - setTimeout(() => {
144   - hasBatchDelete.value = false;
145   - }, 3000);
146   - } catch (e) {}
147   - }
148   - };
149 121
150 122 // 树形选择器
151 123 const handleSelect = (organizationId: string) => {
... ...
... ... @@ -90,9 +90,13 @@
90 90 roleMenus.value = await getMenusIdsByRoleId(data.record.id);
91 91 originMenus.value = [...roleMenus.value];
92 92 for (let item of treeData.value) {
93   - pidArr.value.push(item.key);
  93 + if (item?.children != 0) {
  94 + pidArr.value.push(item.key);
  95 + }
94 96 for (let item1 of item?.children) {
95   - pidArr.value.push(item1.key);
  97 + if (item1?.children != 0) {
  98 + pidArr.value.push(item1.key);
  99 + }
96 100 }
97 101 }
98 102 for (let item of roleMenus.value) {
... ...
... ... @@ -11,11 +11,25 @@
11 11 <a-button type="primary" @click="handleCreate">新增角色</a-button>
12 12 </Authority>
13 13 <Authority value="api:yt:admin:deleteSysRole">
14   - <a-button color="error" @click="handleDeleteOrBatchDelete(null)" :disabled="isStatus">
  14 + <a-button
  15 + type="primary"
  16 + color="error"
  17 + @click="handleDeleteOrBatchDelete(null)"
  18 + :disabled="hasBatchDelete"
  19 + >
15 20 批量删除
16 21 </a-button>
17 22 </Authority>
18 23 </template>
  24 + <template #status="{ record }">
  25 + <Switch
  26 + :checked="record.status === 1"
  27 + :loading="record.pendingStatus"
  28 + checkedChildren="启用"
  29 + unCheckedChildren="禁用"
  30 + @change="(checked:boolean)=>statusChange(checked,record)"
  31 + />
  32 + </template>
19 33 <template #action="{ record }">
20 34 <TableAction
21 35 :actions="[
... ... @@ -44,26 +58,27 @@
44 58 </div>
45 59 </template>
46 60 <script lang="ts">
47   - import { defineComponent, ref } from 'vue';
  61 + import { defineComponent, nextTick } from 'vue';
48 62 import { BasicTable, useTable, TableAction } from '/@/components/Table';
49   - import { delRole, getRoleListByPage } from '/@/api/system/system';
  63 + import { delRole, getRoleListByPage, setRoleStatus } from '/@/api/system/system';
50 64 import { useDrawer } from '/@/components/Drawer';
51 65 import RoleDrawer from './RoleDrawer.vue';
52 66 import { columns, searchFormSchema } from './role.data';
53 67 import { RoleEnum } from '/@/enums/roleEnum';
54   - import { useMessage } from '/@/hooks/web/useMessage';
55 68 import { Authority } from '/@/components/Authority';
  69 + import { useBatchDelete } from '/@/hooks/web/useBatchDelete';
  70 + import { useMessage } from '/@/hooks/web/useMessage';
  71 + import { Switch } from 'ant-design-vue';
56 72
57 73 export default defineComponent({
58 74 name: 'RoleManagement',
59   - components: { BasicTable, RoleDrawer, TableAction, Authority },
  75 + components: { BasicTable, RoleDrawer, TableAction, Authority, Switch },
60 76 setup() {
61   - const { createMessage } = useMessage();
62 77 const [registerDrawer, { openDrawer }] = useDrawer();
63   - const isStatus = ref(true);
64   - let selectArray: any = [];
65   -
66   - const [registerTable, { reload, getSelectRows }] = useTable({
  78 + function handleSuccess() {
  79 + reload();
  80 + }
  81 + const [registerTable, { setProps, reload, setSelectedRowKeys }] = useTable({
67 82 title: '角色列表',
68 83 api: getRoleListByPage,
69 84 columns,
... ... @@ -83,6 +98,19 @@
83 98 fixed: 'right',
84 99 },
85 100 });
  101 + const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions, resetSelectedRowKeys } =
  102 + useBatchDelete(delRole, handleSuccess, setProps);
  103 + selectionOptions.rowSelection.getCheckboxProps = (record: Recordable) => {
  104 + // Demo:status为1的选择框禁用
  105 + if (record.status === 1) {
  106 + return { disabled: true };
  107 + } else {
  108 + return { disabled: false };
  109 + }
  110 + };
  111 + nextTick(() => {
  112 + setProps(selectionOptions);
  113 + });
86 114
87 115 function handleCreate() {
88 116 openDrawer(true, {
... ... @@ -96,52 +124,27 @@
96 124 isUpdate: true,
97 125 });
98 126 }
99   - function handleSuccess() {
100   - reload();
101   - }
102 127
103   - const useSelectionChange = () => {
104   - let getRows = getSelectRows();
105   - const isJudge = getRows.map((m) => m.roleType);
106   - if (isJudge.includes('SYS_ADMIN')) {
107   - isStatus.value = true;
108   - } else {
109   - isStatus.value = false;
110   - }
111   - if (isJudge.length === 0) {
112   - isStatus.value = true;
113   - }
114   - selectArray = getRows.filter((f) => f.status !== 'SYS_ADMIN').map((m) => m.id);
115   - };
116   -
117   - const handleDeleteOrBatchDelete = async (record: Recordable | null) => {
118   - if (record) {
119   - try {
120   - await delRole([record.id]);
121   - createMessage.success('删除成功');
122   - handleSuccess();
123   - } catch (e: any) {}
124   - } else {
125   - isStatus.value = true;
126   - try {
127   - await delRole(selectArray);
128   - createMessage.success('批量删除成功');
129   - handleSuccess();
130   - selectArray.length = 0;
131   - setTimeout(() => {
132   - isStatus.value = false;
133   - }, 3000);
134   - } catch (e: any) {
135   - selectArray.length = 0;
136   - setTimeout(() => {
137   - isStatus.value = false;
138   - }, 3000);
139   - } finally {
140   - selectArray.length = 0;
141   - setTimeout(() => {
142   - isStatus.value = false;
143   - }, 3000);
  128 + const statusChange = async (checked, record) => {
  129 + setProps({
  130 + loading: true,
  131 + });
  132 + setSelectedRowKeys([]);
  133 + resetSelectedRowKeys();
  134 + const newStatus = checked ? 1 : 0;
  135 + const { createMessage } = useMessage();
  136 + try {
  137 + await setRoleStatus(record.id, newStatus);
  138 + if (newStatus) {
  139 + createMessage.success(`启用成功`);
  140 + } else {
  141 + createMessage.success('禁用成功');
144 142 }
  143 + } finally {
  144 + setProps({
  145 + loading: false,
  146 + });
  147 + reload();
145 148 }
146 149 };
147 150
... ... @@ -152,9 +155,9 @@
152 155 handleEdit,
153 156 handleSuccess,
154 157 RoleEnum,
  158 + hasBatchDelete,
155 159 handleDeleteOrBatchDelete,
156   - isStatus,
157   - useSelectionChange,
  160 + statusChange,
158 161 };
159 162 },
160 163 });
... ...
1 1 import { BasicColumn } from '/@/components/Table';
2 2 import { FormSchema } from '/@/components/Table';
3   -import { h } from 'vue';
4   -import { Switch } from 'ant-design-vue';
5   -import { setRoleStatus } from '/@/api/system/system';
6   -import { useMessage } from '/@/hooks/web/useMessage';
7   -import { getRoleListByPage } from '/@/api/system/system';
8   -import { USER_INFO_KEY } from '/@/enums/cacheEnum';
9   -import { getAuthCache } from '/@/utils/auth';
10 3
11 4 export const columns: BasicColumn[] = [
12 5 {
... ... @@ -23,46 +16,7 @@ export const columns: BasicColumn[] = [
23 16 title: '状态',
24 17 dataIndex: 'status',
25 18 width: 120,
26   - customRender: ({ record }) => {
27   - if (!Reflect.has(record, 'pendingStatus')) {
28   - record.pendingStatus = false;
29   - }
30   - return h(Switch, {
31   - checked: record.status === 1,
32   - checkedChildren: '已启用',
33   - unCheckedChildren: '已禁用',
34   - loading: record.pendingStatus,
35   - async onChange(checked: boolean) {
36   - record.pendingStatus = true;
37   - const newStatus = checked ? 1 : 0;
38   - const { createMessage } = useMessage();
39   - const data = await getRoleListByPage({
40   - page: 1,
41   - pageSize: 100,
42   - // roleType: 'CUSTOMER_USER',
43   - });
44   - const userInfo = (await getAuthCache(USER_INFO_KEY)) as unknown as any;
45   - const findById = data.items.find((f) => {
46   - if (f.id === userInfo.plainRoles[0].roleId) {
47   - return f.id;
48   - }
49   - });
50   - if (record.id == findById?.id) return createMessage.error(`该租户下面有此客户,无法禁用`);
51   - record.pendingStatus = true;
52   - setRoleStatus(record.id, newStatus)
53   - .then(() => {
54   - record.status = newStatus;
55   - createMessage.success(`已成功修改角色状态`);
56   - })
57   - .catch(() => {
58   - createMessage.error('修改角色状态失败');
59   - })
60   - .finally(() => {
61   - record.pendingStatus = false;
62   - });
63   - },
64   - });
65   - },
  19 + slots: { customRender: 'status' },
66 20 },
67 21
68 22 {
... ...
... ... @@ -93,9 +93,13 @@
93 93 roleMenus.value = await getMenusIdsByRoleId(data.record.id);
94 94 originMenus.value = [...roleMenus.value];
95 95 for (let item of treeData.value) {
96   - pidArr.value.push(item.key);
  96 + if (item?.children != 0) {
  97 + pidArr.value.push(item.key);
  98 + }
97 99 for (let item1 of item?.children) {
98   - pidArr.value.push(item1.key);
  100 + if (item1?.children != 0) {
  101 + pidArr.value.push(item1.key);
  102 + }
99 103 }
100 104 }
101 105 for (let item of roleMenus.value) {
... ...
... ... @@ -2,7 +2,6 @@
2 2 <div>
3 3 <BasicTable
4 4 @register="registerTable"
5   - @selection-change="useSelectionChange"
6 5 :rowSelection="{ type: 'checkbox' }"
7 6 :clickToRowSelect="false"
8 7 >
... ... @@ -11,11 +10,25 @@
11 10 <a-button type="primary" @click="handleCreate"> 新增角色 </a-button>
12 11 </Authority>
13 12 <Authority value="api:yt:admin:deleteTenantRole">
14   - <a-button type="default" :disabled="disabled" @click="handleBatchDelete">
  13 + <a-button
  14 + type="primary"
  15 + color="error"
  16 + @click="handleDeleteOrBatchDelete(null)"
  17 + :disabled="hasBatchDelete"
  18 + >
15 19 批量删除
16 20 </a-button>
17 21 </Authority>
18 22 </template>
  23 + <template #status="{ record }">
  24 + <Switch
  25 + :checked="record.status === 1"
  26 + :loading="record.pendingStatus"
  27 + checkedChildren="启用"
  28 + unCheckedChildren="禁用"
  29 + @change="(checked:boolean)=>statusChange(checked,record)"
  30 + />
  31 + </template>
19 32 <template #action="{ record }">
20 33 <TableAction
21 34 :actions="[
... ... @@ -32,7 +45,7 @@
32 45 color: 'error',
33 46 popConfirm: {
34 47 title: '是否确认删除',
35   - confirm: handleDelete.bind(null, record),
  48 + confirm: handleDeleteOrBatchDelete.bind(null, record),
36 49 },
37 50 },
38 51 ]"
... ... @@ -43,29 +56,30 @@
43 56 </div>
44 57 </template>
45 58 <script lang="ts">
46   - import { defineComponent, ref } from 'vue';
  59 + import { defineComponent, nextTick } from 'vue';
47 60 import { BasicTable, useTable, TableAction } from '/@/components/Table';
48   - import { delRole, getRoleListByPage } from '/@/api/system/system';
  61 + import { delRole, getRoleListByPage, setRoleStatus } from '/@/api/system/system';
49 62 import { useMessage } from '/@/hooks/web/useMessage';
50 63 import { useDrawer } from '/@/components/Drawer';
51 64 import RoleDrawer from './RoleDrawer.vue';
52 65 import { columns, searchFormSchema } from './role.data';
53 66 import { RoleEnum } from '/@/enums/roleEnum';
54 67 import { Authority } from '/@/components/Authority';
  68 + import { useBatchDelete } from '/@/hooks/web/useBatchDelete';
  69 + import { Switch } from 'ant-design-vue';
55 70
56 71 export default defineComponent({
57 72 name: 'TenantRoleManagement',
58   - components: { BasicTable, RoleDrawer, TableAction, Authority },
  73 + components: { BasicTable, RoleDrawer, TableAction, Authority, Switch },
59 74 setup() {
60 75 const [registerDrawer, { openDrawer }] = useDrawer();
61   - let selectedRowKeys: Array<string> = [];
62   - const disabled = ref(true);
63   - const { createMessage } = useMessage();
64   - const [registerTable, { reload, getSelectRows }] = useTable({
  76 + function handleSuccess() {
  77 + reload();
  78 + }
  79 + const [registerTable, { reload, setProps, setSelectedRowKeys }] = useTable({
65 80 title: '租户角色列表',
66 81 api: getRoleListByPage,
67 82 columns,
68   -
69 83 formConfig: {
70 84 labelWidth: 120,
71 85 schemas: searchFormSchema,
... ... @@ -82,6 +96,19 @@
82 96 fixed: 'right',
83 97 },
84 98 });
  99 + const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions, resetSelectedRowKeys } =
  100 + useBatchDelete(delRole, handleSuccess, setProps);
  101 + selectionOptions.rowSelection.getCheckboxProps = (record: Recordable) => {
  102 + // Demo:status为1的选择框禁用
  103 + if (record.status === 1) {
  104 + return { disabled: true };
  105 + } else {
  106 + return { disabled: false };
  107 + }
  108 + };
  109 + nextTick(() => {
  110 + setProps(selectionOptions);
  111 + });
85 112
86 113 function handleCreate() {
87 114 openDrawer(true, {
... ... @@ -95,50 +122,39 @@
95 122 isUpdate: true,
96 123 });
97 124 }
98   -
99   - async function handleDelete(record: Recordable) {
100   - const roleIds = [record.id];
101   - delRole(roleIds).then(() => {
102   - createMessage.success('删除成功');
103   - reload();
  125 + const statusChange = async (checked, record) => {
  126 + setProps({
  127 + loading: true,
104 128 });
105   - }
106   -
107   - const useSelectionChange = () => {
108   - selectedRowKeys = getSelectRows();
109   - if (selectedRowKeys.length !== 0) {
110   - disabled.value = false;
111   - } else {
112   - disabled.value = true;
  129 + setSelectedRowKeys([]);
  130 + resetSelectedRowKeys();
  131 + const newStatus = checked ? 1 : 0;
  132 + const { createMessage } = useMessage();
  133 + try {
  134 + await setRoleStatus(record.id, newStatus);
  135 + if (newStatus) {
  136 + createMessage.success(`启用成功`);
  137 + } else {
  138 + createMessage.success('禁用成功');
  139 + }
  140 + } finally {
  141 + setProps({
  142 + loading: false,
  143 + });
  144 + reload();
113 145 }
114 146 };
115   - const handleBatchDelete = async () => {
116   - disabled.value = true;
117   - let roleIds = selectedRowKeys.map((m: any) => {
118   - return m.id;
119   - });
120   - await delRole(roleIds);
121   - createMessage.success('批量删除成功');
122   - reload();
123   - setTimeout(() => {
124   - disabled.value = false;
125   - }, 3000);
126   - };
127   - function handleSuccess() {
128   - reload();
129   - }
130 147
131 148 return {
132   - disabled,
133   - useSelectionChange,
134   - handleBatchDelete,
  149 + statusChange,
135 150 registerTable,
136 151 registerDrawer,
137 152 handleCreate,
138 153 handleEdit,
139   - handleDelete,
140 154 handleSuccess,
141 155 RoleEnum,
  156 + hasBatchDelete,
  157 + handleDeleteOrBatchDelete,
142 158 };
143 159 },
144 160 });
... ...
1 1 import { BasicColumn } from '/@/components/Table';
2 2 import { FormSchema } from '/@/components/Table';
3   -import { h } from 'vue';
4   -import { Switch } from 'ant-design-vue';
5   -import { setRoleStatus } from '/@/api/system/system';
6   -import { useMessage } from '/@/hooks/web/useMessage';
7 3 import { RoleEnum } from '/@/enums/roleEnum';
8 4 export const columns: BasicColumn[] = [
9 5 {
... ... @@ -20,35 +16,8 @@ export const columns: BasicColumn[] = [
20 16 title: '状态',
21 17 dataIndex: 'status',
22 18 width: 120,
23   - customRender: ({ record }) => {
24   - if (!Reflect.has(record, 'pendingStatus')) {
25   - record.pendingStatus = false;
26   - }
27   - return h(Switch, {
28   - checked: record.status === 1,
29   - checkedChildren: '已启用',
30   - unCheckedChildren: '已禁用',
31   - loading: record.pendingStatus,
32   - onChange(checked: boolean) {
33   - record.pendingStatus = true;
34   - const newStatus = checked ? 1 : 0;
35   - const { createMessage } = useMessage();
36   - setRoleStatus(record.id, newStatus)
37   - .then(() => {
38   - record.status = newStatus;
39   - createMessage.success(`已成功修改角色状态`);
40   - })
41   - .catch(() => {
42   - createMessage.error('修改角色状态失败');
43   - })
44   - .finally(() => {
45   - record.pendingStatus = false;
46   - });
47   - },
48   - });
49   - },
  19 + slots: { customRender: 'status' },
50 20 },
51   -
52 21 {
53 22 title: '备注',
54 23 dataIndex: 'remark',
... ...