Commit d6cefc6cc2ce78e27d415357e306699c9ce7d026
Merge branch 'ft-dev' into 'main'
fix:把批量删除修改为统一封装形式,移除我之前单独写的批量删除代码 See merge request huang/yun-teng-iot-front!210
Showing
10 changed files
with
258 additions
and
362 deletions
| @@ -75,10 +75,9 @@ | @@ -75,10 +75,9 @@ | ||
| 75 | </template> | 75 | </template> |
| 76 | 76 | ||
| 77 | <script lang="ts"> | 77 | <script lang="ts"> |
| 78 | - import { defineComponent, reactive, ref, computed } from 'vue'; | 78 | + import { defineComponent, reactive, nextTick } from 'vue'; |
| 79 | import { BasicTable, useTable, TableAction, TableImg } from '/@/components/Table'; | 79 | import { BasicTable, useTable, TableAction, TableImg } from '/@/components/Table'; |
| 80 | import { PageWrapper } from '/@/components/Page'; | 80 | import { PageWrapper } from '/@/components/Page'; |
| 81 | - import { useMessage } from '/@/hooks/web/useMessage'; | ||
| 82 | import { useDrawer } from '/@/components/Drawer'; | 81 | import { useDrawer } from '/@/components/Drawer'; |
| 83 | import CameraDrawer from './CameraDrawer.vue'; | 82 | import CameraDrawer from './CameraDrawer.vue'; |
| 84 | import { useResetOrganizationTree, OrganizationIdTree } from '/@/views/common/organizationIdTree'; | 83 | import { useResetOrganizationTree, OrganizationIdTree } from '/@/views/common/organizationIdTree'; |
| @@ -87,6 +86,7 @@ | @@ -87,6 +86,7 @@ | ||
| 87 | import VideoPreviewModal from './DialogPreviewVideo.vue'; | 86 | import VideoPreviewModal from './DialogPreviewVideo.vue'; |
| 88 | import { useModal } from '/@/components/Modal'; | 87 | import { useModal } from '/@/components/Modal'; |
| 89 | import { Authority } from '/@/components/Authority'; | 88 | import { Authority } from '/@/components/Authority'; |
| 89 | + import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | ||
| 90 | 90 | ||
| 91 | export default defineComponent({ | 91 | export default defineComponent({ |
| 92 | components: { | 92 | components: { |
| @@ -100,22 +100,11 @@ | @@ -100,22 +100,11 @@ | ||
| 100 | Authority, | 100 | Authority, |
| 101 | }, | 101 | }, |
| 102 | setup() { | 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 | const searchInfo = reactive<Recordable>({}); | 103 | const searchInfo = reactive<Recordable>({}); |
| 115 | const { organizationIdTreeRef, resetFn } = useResetOrganizationTree(searchInfo); | 104 | const { organizationIdTreeRef, resetFn } = useResetOrganizationTree(searchInfo); |
| 116 | const [registerModal, { openModal }] = useModal(); | 105 | const [registerModal, { openModal }] = useModal(); |
| 117 | // 表格hooks | 106 | // 表格hooks |
| 118 | - const [registerTable, { reload }] = useTable({ | 107 | + const [registerTable, { reload, setProps }] = useTable({ |
| 119 | title: '视频列表', | 108 | title: '视频列表', |
| 120 | api: cameraPage, | 109 | api: cameraPage, |
| 121 | columns, | 110 | columns, |
| @@ -129,10 +118,6 @@ | @@ -129,10 +118,6 @@ | ||
| 129 | useSearchForm: true, | 118 | useSearchForm: true, |
| 130 | showTableSetting: true, | 119 | showTableSetting: true, |
| 131 | bordered: true, | 120 | bordered: true, |
| 132 | - rowSelection: { | ||
| 133 | - onChange: onSelectRowChange, | ||
| 134 | - type: 'checkbox', | ||
| 135 | - }, | ||
| 136 | rowKey: 'id', | 121 | rowKey: 'id', |
| 137 | actionColumn: { | 122 | actionColumn: { |
| 138 | width: 200, | 123 | width: 200, |
| @@ -144,12 +129,20 @@ | @@ -144,12 +129,20 @@ | ||
| 144 | }); | 129 | }); |
| 145 | // 弹框 | 130 | // 弹框 |
| 146 | const [registerDrawer, { openDrawer }] = useDrawer(); | 131 | const [registerDrawer, { openDrawer }] = useDrawer(); |
| 147 | - const { createMessage } = useMessage(); | ||
| 148 | 132 | ||
| 149 | // 刷新 | 133 | // 刷新 |
| 150 | const handleSuccess = () => { | 134 | const handleSuccess = () => { |
| 151 | reload(); | 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 | const handleCreateOrEdit = (record: Recordable | null) => { | 147 | const handleCreateOrEdit = (record: Recordable | null) => { |
| 155 | if (record) { | 148 | if (record) { |
| @@ -163,27 +156,6 @@ | @@ -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 | const handleSelect = (organizationId: string) => { | 161 | const handleSelect = (organizationId: string) => { |
| @@ -15,7 +15,12 @@ | @@ -15,7 +15,12 @@ | ||
| 15 | <a-button disabled @click="handleImport"> 导入设备配置 </a-button> | 15 | <a-button disabled @click="handleImport"> 导入设备配置 </a-button> |
| 16 | </ImpExcel> | 16 | </ImpExcel> |
| 17 | <Authority value="api:yt:admin:deleteDeviceConfig"> | 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 | </a-button> | 25 | </a-button> |
| 21 | </Authority> | 26 | </Authority> |
| @@ -67,7 +72,7 @@ | @@ -67,7 +72,7 @@ | ||
| 67 | color: 'error', | 72 | color: 'error', |
| 68 | popConfirm: { | 73 | popConfirm: { |
| 69 | title: '是否确认删除', | 74 | title: '是否确认删除', |
| 70 | - confirm: handleDelete.bind(null, record), | 75 | + confirm: handleDeleteOrBatchDelete.bind(null, record), |
| 71 | }, | 76 | }, |
| 72 | ifShow: () => { | 77 | ifShow: () => { |
| 73 | return record.default === false; | 78 | return record.default === false; |
| @@ -96,6 +101,7 @@ | @@ -96,6 +101,7 @@ | ||
| 96 | import { ImpExcel, ExcelData } from '/@/components/Excel'; | 101 | import { ImpExcel, ExcelData } from '/@/components/Excel'; |
| 97 | // import { jsonToSheetXlsx, ExportModalResult } from '/@/components/Excel'; | 102 | // import { jsonToSheetXlsx, ExportModalResult } from '/@/components/Excel'; |
| 98 | import { Authority } from '/@/components/Authority'; | 103 | import { Authority } from '/@/components/Authority'; |
| 104 | + import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | ||
| 99 | 105 | ||
| 100 | export default defineComponent({ | 106 | export default defineComponent({ |
| 101 | name: 'DeviceProfileManagement', | 107 | name: 'DeviceProfileManagement', |
| @@ -112,31 +118,45 @@ | @@ -112,31 +118,45 @@ | ||
| 112 | const { createMessage } = useMessage(); | 118 | const { createMessage } = useMessage(); |
| 113 | const [registerModal, { openModal }] = useModal(); | 119 | const [registerModal, { openModal }] = useModal(); |
| 114 | const [registerModalDetail] = useModal(); | 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 | *@param url,name | 161 | *@param url,name |
| 142 | **/ | 162 | **/ |
| @@ -251,26 +271,26 @@ | @@ -251,26 +271,26 @@ | ||
| 251 | disabled.value = true; | 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 | function handleDelete(record: Recordable) { | 295 | function handleDelete(record: Recordable) { |
| 276 | let ids = [record.id]; | 296 | let ids = [record.id]; |
| @@ -304,6 +324,7 @@ | @@ -304,6 +324,7 @@ | ||
| 304 | function handleSuccess() { | 324 | function handleSuccess() { |
| 305 | reload(); | 325 | reload(); |
| 306 | } | 326 | } |
| 327 | + | ||
| 307 | const handleSetDefault = async (record: Recordable) => { | 328 | const handleSetDefault = async (record: Recordable) => { |
| 308 | let id = record.id; | 329 | let id = record.id; |
| 309 | const obj = { | 330 | const obj = { |
| @@ -337,7 +358,7 @@ | @@ -337,7 +358,7 @@ | ||
| 337 | // register1, | 358 | // register1, |
| 338 | // defaultHeader, | 359 | // defaultHeader, |
| 339 | useSelectionChange, | 360 | useSelectionChange, |
| 340 | - handleTableDel, | 361 | + // handleTableDel, |
| 341 | tableListRef, | 362 | tableListRef, |
| 342 | loadDataSuccess, | 363 | loadDataSuccess, |
| 343 | handleImport, | 364 | handleImport, |
| @@ -349,6 +370,8 @@ | @@ -349,6 +370,8 @@ | ||
| 349 | handleDelete, | 370 | handleDelete, |
| 350 | handleSuccess, | 371 | handleSuccess, |
| 351 | registerModal, | 372 | registerModal, |
| 373 | + hasBatchDelete, | ||
| 374 | + handleDeleteOrBatchDelete, | ||
| 352 | }; | 375 | }; |
| 353 | }, | 376 | }, |
| 354 | }); | 377 | }); |
| @@ -13,11 +13,12 @@ | @@ -13,11 +13,12 @@ | ||
| 13 | </Authority> | 13 | </Authority> |
| 14 | <Authority value="api:yt:admin:deleteDataFlow"> | 14 | <Authority value="api:yt:admin:deleteDataFlow"> |
| 15 | <a-button | 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 | </a-button> | 22 | </a-button> |
| 22 | </Authority> | 23 | </Authority> |
| 23 | <a-button | 24 | <a-button |
| @@ -55,7 +56,7 @@ | @@ -55,7 +56,7 @@ | ||
| 55 | color: 'error', | 56 | color: 'error', |
| 56 | popConfirm: { | 57 | popConfirm: { |
| 57 | title: '是否确认删除', | 58 | title: '是否确认删除', |
| 58 | - confirm: handleSingleDelete.bind(null, record), | 59 | + confirm: handleDeleteOrBatchDelete.bind(null, record), |
| 59 | }, | 60 | }, |
| 60 | ifShow: (_action) => { | 61 | ifShow: (_action) => { |
| 61 | return record.status == 0; | 62 | return record.status == 0; |
| @@ -94,7 +95,7 @@ | @@ -94,7 +95,7 @@ | ||
| 94 | </div> | 95 | </div> |
| 95 | </template> | 96 | </template> |
| 96 | <script lang="ts"> | 97 | <script lang="ts"> |
| 97 | - import { defineComponent, reactive, ref } from 'vue'; | 98 | + import { defineComponent, reactive, ref, nextTick } from 'vue'; |
| 98 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; | 99 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; |
| 99 | import { columns, searchFormSchema } from './config'; | 100 | import { columns, searchFormSchema } from './config'; |
| 100 | import { useModal } from '/@/components/Modal'; | 101 | import { useModal } from '/@/components/Modal'; |
| @@ -106,6 +107,7 @@ | @@ -106,6 +107,7 @@ | ||
| 106 | } from '/@/api/datamanager/dataManagerApi'; | 107 | } from '/@/api/datamanager/dataManagerApi'; |
| 107 | import { useMessage } from '/@/hooks/web/useMessage'; | 108 | import { useMessage } from '/@/hooks/web/useMessage'; |
| 108 | import { Authority } from '/@/components/Authority'; | 109 | import { Authority } from '/@/components/Authority'; |
| 110 | + import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | ||
| 109 | 111 | ||
| 110 | export default defineComponent({ | 112 | export default defineComponent({ |
| 111 | name: 'Index', | 113 | name: 'Index', |
| @@ -123,10 +125,13 @@ | @@ -123,10 +125,13 @@ | ||
| 123 | let selectedRowKeys: any = ref([]); | 125 | let selectedRowKeys: any = ref([]); |
| 124 | let getSelectRowsArr: any = ref([]); | 126 | let getSelectRowsArr: any = ref([]); |
| 125 | let isJudgeSelectRowsArr: any = ref([]); | 127 | let isJudgeSelectRowsArr: any = ref([]); |
| 128 | + const handleSuccess = () => { | ||
| 129 | + reload(); | ||
| 130 | + }; | ||
| 126 | const [registerModal, { openModal }] = useModal(); | 131 | const [registerModal, { openModal }] = useModal(); |
| 127 | const [ | 132 | const [ |
| 128 | registerTable, | 133 | registerTable, |
| 129 | - { reload, getSelectRowKeys, getSelectRows, setLoading, clearSelectedRowKeys }, | 134 | + { setProps, reload, getSelectRowKeys, getSelectRows, setLoading, clearSelectedRowKeys }, |
| 130 | ] = useTable({ | 135 | ] = useTable({ |
| 131 | title: '数据流转列表', | 136 | title: '数据流转列表', |
| 132 | clickToRowSelect: false, | 137 | clickToRowSelect: false, |
| @@ -149,6 +154,22 @@ | @@ -149,6 +154,22 @@ | ||
| 149 | fixed: 'right', | 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 | const handleAdd = () => { | 175 | const handleAdd = () => { |
| @@ -159,9 +180,6 @@ | @@ -159,9 +180,6 @@ | ||
| 159 | }, 10); | 180 | }, 10); |
| 160 | }; | 181 | }; |
| 161 | 182 | ||
| 162 | - const handleSuccess = () => { | ||
| 163 | - reload(); | ||
| 164 | - }; | ||
| 165 | const handleEdit = (record: Recordable) => { | 183 | const handleEdit = (record: Recordable) => { |
| 166 | setTimeout(() => { | 184 | setTimeout(() => { |
| 167 | openModal(true, { | 185 | openModal(true, { |
| @@ -217,16 +235,6 @@ | @@ -217,16 +235,6 @@ | ||
| 217 | setLoading(false); | 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 | const useSelectionChange = () => { | 238 | const useSelectionChange = () => { |
| 231 | selectedRowKeys.value = getSelectRowKeys(); | 239 | selectedRowKeys.value = getSelectRowKeys(); |
| 232 | isJudgeSelectRowsArr.value = getSelectRows(); | 240 | isJudgeSelectRowsArr.value = getSelectRows(); |
| @@ -262,35 +270,6 @@ | @@ -262,35 +270,6 @@ | ||
| 262 | disabledStatus1.value = true; | 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 | const handleMutiuteDisable = async () => { | 273 | const handleMutiuteDisable = async () => { |
| 295 | enableObj.convertIds.length = 0; | 274 | enableObj.convertIds.length = 0; |
| 296 | try { | 275 | try { |
| @@ -354,15 +333,15 @@ | @@ -354,15 +333,15 @@ | ||
| 354 | loading, | 333 | loading, |
| 355 | registerTable, | 334 | registerTable, |
| 356 | handleAdd, | 335 | handleAdd, |
| 357 | - handleDelete, | ||
| 358 | registerModal, | 336 | registerModal, |
| 359 | handleSuccess, | 337 | handleSuccess, |
| 360 | handleEdit, | 338 | handleEdit, |
| 361 | handleEnableOrDisable, | 339 | handleEnableOrDisable, |
| 362 | - handleSingleDelete, | ||
| 363 | useSelectionChange, | 340 | useSelectionChange, |
| 364 | handleMutiuteDisable, | 341 | handleMutiuteDisable, |
| 365 | handleDisable, | 342 | handleDisable, |
| 343 | + hasBatchDelete, | ||
| 344 | + handleDeleteOrBatchDelete, | ||
| 366 | }; | 345 | }; |
| 367 | }, | 346 | }, |
| 368 | }); | 347 | }); |
| @@ -44,9 +44,8 @@ | @@ -44,9 +44,8 @@ | ||
| 44 | </template> | 44 | </template> |
| 45 | 45 | ||
| 46 | <script lang="ts"> | 46 | <script lang="ts"> |
| 47 | - import { defineComponent, reactive, ref, computed, h } from 'vue'; | 47 | + import { defineComponent, reactive, h, nextTick } from 'vue'; |
| 48 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; | 48 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; |
| 49 | - import { useMessage } from '/@/hooks/web/useMessage'; | ||
| 50 | import { useDrawer } from '/@/components/Drawer'; | 49 | import { useDrawer } from '/@/components/Drawer'; |
| 51 | import FeedbackDrawer from './FeedbackDrawer.vue'; | 50 | import FeedbackDrawer from './FeedbackDrawer.vue'; |
| 52 | import { feedbackPage, deleteFeedbackManage } from '/@/api/feedback/feedbackManager'; | 51 | import { feedbackPage, deleteFeedbackManage } from '/@/api/feedback/feedbackManager'; |
| @@ -55,6 +54,7 @@ | @@ -55,6 +54,7 @@ | ||
| 55 | import { Modal } from 'ant-design-vue'; | 54 | import { Modal } from 'ant-design-vue'; |
| 56 | import { JsonPreview } from '/@/components/CodeEditor'; | 55 | import { JsonPreview } from '/@/components/CodeEditor'; |
| 57 | import { Authority } from '/@/components/Authority'; | 56 | import { Authority } from '/@/components/Authority'; |
| 57 | + import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | ||
| 58 | 58 | ||
| 59 | export default defineComponent({ | 59 | export default defineComponent({ |
| 60 | components: { | 60 | components: { |
| @@ -64,21 +64,10 @@ | @@ -64,21 +64,10 @@ | ||
| 64 | Authority, | 64 | Authority, |
| 65 | }, | 65 | }, |
| 66 | setup() { | 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 | const searchInfo = reactive<Recordable>({}); | 67 | const searchInfo = reactive<Recordable>({}); |
| 79 | const [registerModal] = useModal(); | 68 | const [registerModal] = useModal(); |
| 80 | // 表格hooks | 69 | // 表格hooks |
| 81 | - const [registerTable, { reload }] = useTable({ | 70 | + const [registerTable, { reload, setProps }] = useTable({ |
| 82 | title: '意见反馈列表', | 71 | title: '意见反馈列表', |
| 83 | api: feedbackPage, | 72 | api: feedbackPage, |
| 84 | columns, | 73 | columns, |
| @@ -91,10 +80,6 @@ | @@ -91,10 +80,6 @@ | ||
| 91 | useSearchForm: true, | 80 | useSearchForm: true, |
| 92 | showTableSetting: true, | 81 | showTableSetting: true, |
| 93 | bordered: true, | 82 | bordered: true, |
| 94 | - rowSelection: { | ||
| 95 | - onChange: onSelectRowChange, | ||
| 96 | - type: 'checkbox', | ||
| 97 | - }, | ||
| 98 | rowKey: 'id', | 83 | rowKey: 'id', |
| 99 | actionColumn: { | 84 | actionColumn: { |
| 100 | width: 200, | 85 | width: 200, |
| @@ -106,12 +91,20 @@ | @@ -106,12 +91,20 @@ | ||
| 106 | }); | 91 | }); |
| 107 | // 弹框 | 92 | // 弹框 |
| 108 | const [registerDrawer, { openDrawer }] = useDrawer(); | 93 | const [registerDrawer, { openDrawer }] = useDrawer(); |
| 109 | - const { createMessage } = useMessage(); | ||
| 110 | 94 | ||
| 111 | // 刷新 | 95 | // 刷新 |
| 112 | const handleSuccess = () => { | 96 | const handleSuccess = () => { |
| 113 | reload(); | 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 | const handleCreateOrEdit = (record: Recordable | null) => { | 109 | const handleCreateOrEdit = (record: Recordable | null) => { |
| 117 | if (record) { | 110 | if (record) { |
| @@ -125,27 +118,6 @@ | @@ -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 | const handleSelect = (organizationId: string) => { | 123 | const handleSelect = (organizationId: string) => { |
| @@ -90,9 +90,13 @@ | @@ -90,9 +90,13 @@ | ||
| 90 | roleMenus.value = await getMenusIdsByRoleId(data.record.id); | 90 | roleMenus.value = await getMenusIdsByRoleId(data.record.id); |
| 91 | originMenus.value = [...roleMenus.value]; | 91 | originMenus.value = [...roleMenus.value]; |
| 92 | for (let item of treeData.value) { | 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 | for (let item1 of item?.children) { | 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 | for (let item of roleMenus.value) { | 102 | for (let item of roleMenus.value) { |
| @@ -11,11 +11,25 @@ | @@ -11,11 +11,25 @@ | ||
| 11 | <a-button type="primary" @click="handleCreate">新增角色</a-button> | 11 | <a-button type="primary" @click="handleCreate">新增角色</a-button> |
| 12 | </Authority> | 12 | </Authority> |
| 13 | <Authority value="api:yt:admin:deleteSysRole"> | 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 | </a-button> | 21 | </a-button> |
| 17 | </Authority> | 22 | </Authority> |
| 18 | </template> | 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 | <template #action="{ record }"> | 33 | <template #action="{ record }"> |
| 20 | <TableAction | 34 | <TableAction |
| 21 | :actions="[ | 35 | :actions="[ |
| @@ -44,26 +58,27 @@ | @@ -44,26 +58,27 @@ | ||
| 44 | </div> | 58 | </div> |
| 45 | </template> | 59 | </template> |
| 46 | <script lang="ts"> | 60 | <script lang="ts"> |
| 47 | - import { defineComponent, ref } from 'vue'; | 61 | + import { defineComponent, nextTick } from 'vue'; |
| 48 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; | 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 | import { useDrawer } from '/@/components/Drawer'; | 64 | import { useDrawer } from '/@/components/Drawer'; |
| 51 | import RoleDrawer from './RoleDrawer.vue'; | 65 | import RoleDrawer from './RoleDrawer.vue'; |
| 52 | import { columns, searchFormSchema } from './role.data'; | 66 | import { columns, searchFormSchema } from './role.data'; |
| 53 | import { RoleEnum } from '/@/enums/roleEnum'; | 67 | import { RoleEnum } from '/@/enums/roleEnum'; |
| 54 | - import { useMessage } from '/@/hooks/web/useMessage'; | ||
| 55 | import { Authority } from '/@/components/Authority'; | 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 | export default defineComponent({ | 73 | export default defineComponent({ |
| 58 | name: 'RoleManagement', | 74 | name: 'RoleManagement', |
| 59 | - components: { BasicTable, RoleDrawer, TableAction, Authority }, | 75 | + components: { BasicTable, RoleDrawer, TableAction, Authority, Switch }, |
| 60 | setup() { | 76 | setup() { |
| 61 | - const { createMessage } = useMessage(); | ||
| 62 | const [registerDrawer, { openDrawer }] = useDrawer(); | 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 | title: '角色列表', | 82 | title: '角色列表', |
| 68 | api: getRoleListByPage, | 83 | api: getRoleListByPage, |
| 69 | columns, | 84 | columns, |
| @@ -83,6 +98,19 @@ | @@ -83,6 +98,19 @@ | ||
| 83 | fixed: 'right', | 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 | function handleCreate() { | 115 | function handleCreate() { |
| 88 | openDrawer(true, { | 116 | openDrawer(true, { |
| @@ -96,52 +124,27 @@ | @@ -96,52 +124,27 @@ | ||
| 96 | isUpdate: true, | 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,9 +155,9 @@ | ||
| 152 | handleEdit, | 155 | handleEdit, |
| 153 | handleSuccess, | 156 | handleSuccess, |
| 154 | RoleEnum, | 157 | RoleEnum, |
| 158 | + hasBatchDelete, | ||
| 155 | handleDeleteOrBatchDelete, | 159 | handleDeleteOrBatchDelete, |
| 156 | - isStatus, | ||
| 157 | - useSelectionChange, | 160 | + statusChange, |
| 158 | }; | 161 | }; |
| 159 | }, | 162 | }, |
| 160 | }); | 163 | }); |
| 1 | import { BasicColumn } from '/@/components/Table'; | 1 | import { BasicColumn } from '/@/components/Table'; |
| 2 | import { FormSchema } from '/@/components/Table'; | 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 | export const columns: BasicColumn[] = [ | 4 | export const columns: BasicColumn[] = [ |
| 12 | { | 5 | { |
| @@ -23,46 +16,7 @@ export const columns: BasicColumn[] = [ | @@ -23,46 +16,7 @@ export const columns: BasicColumn[] = [ | ||
| 23 | title: '状态', | 16 | title: '状态', |
| 24 | dataIndex: 'status', | 17 | dataIndex: 'status', |
| 25 | width: 120, | 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,9 +93,13 @@ | ||
| 93 | roleMenus.value = await getMenusIdsByRoleId(data.record.id); | 93 | roleMenus.value = await getMenusIdsByRoleId(data.record.id); |
| 94 | originMenus.value = [...roleMenus.value]; | 94 | originMenus.value = [...roleMenus.value]; |
| 95 | for (let item of treeData.value) { | 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 | for (let item1 of item?.children) { | 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 | for (let item of roleMenus.value) { | 105 | for (let item of roleMenus.value) { |
| @@ -2,7 +2,6 @@ | @@ -2,7 +2,6 @@ | ||
| 2 | <div> | 2 | <div> |
| 3 | <BasicTable | 3 | <BasicTable |
| 4 | @register="registerTable" | 4 | @register="registerTable" |
| 5 | - @selection-change="useSelectionChange" | ||
| 6 | :rowSelection="{ type: 'checkbox' }" | 5 | :rowSelection="{ type: 'checkbox' }" |
| 7 | :clickToRowSelect="false" | 6 | :clickToRowSelect="false" |
| 8 | > | 7 | > |
| @@ -11,11 +10,25 @@ | @@ -11,11 +10,25 @@ | ||
| 11 | <a-button type="primary" @click="handleCreate"> 新增角色 </a-button> | 10 | <a-button type="primary" @click="handleCreate"> 新增角色 </a-button> |
| 12 | </Authority> | 11 | </Authority> |
| 13 | <Authority value="api:yt:admin:deleteTenantRole"> | 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 | </a-button> | 20 | </a-button> |
| 17 | </Authority> | 21 | </Authority> |
| 18 | </template> | 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 | <template #action="{ record }"> | 32 | <template #action="{ record }"> |
| 20 | <TableAction | 33 | <TableAction |
| 21 | :actions="[ | 34 | :actions="[ |
| @@ -32,7 +45,7 @@ | @@ -32,7 +45,7 @@ | ||
| 32 | color: 'error', | 45 | color: 'error', |
| 33 | popConfirm: { | 46 | popConfirm: { |
| 34 | title: '是否确认删除', | 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,29 +56,30 @@ | ||
| 43 | </div> | 56 | </div> |
| 44 | </template> | 57 | </template> |
| 45 | <script lang="ts"> | 58 | <script lang="ts"> |
| 46 | - import { defineComponent, ref } from 'vue'; | 59 | + import { defineComponent, nextTick } from 'vue'; |
| 47 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; | 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 | import { useMessage } from '/@/hooks/web/useMessage'; | 62 | import { useMessage } from '/@/hooks/web/useMessage'; |
| 50 | import { useDrawer } from '/@/components/Drawer'; | 63 | import { useDrawer } from '/@/components/Drawer'; |
| 51 | import RoleDrawer from './RoleDrawer.vue'; | 64 | import RoleDrawer from './RoleDrawer.vue'; |
| 52 | import { columns, searchFormSchema } from './role.data'; | 65 | import { columns, searchFormSchema } from './role.data'; |
| 53 | import { RoleEnum } from '/@/enums/roleEnum'; | 66 | import { RoleEnum } from '/@/enums/roleEnum'; |
| 54 | import { Authority } from '/@/components/Authority'; | 67 | import { Authority } from '/@/components/Authority'; |
| 68 | + import { useBatchDelete } from '/@/hooks/web/useBatchDelete'; | ||
| 69 | + import { Switch } from 'ant-design-vue'; | ||
| 55 | 70 | ||
| 56 | export default defineComponent({ | 71 | export default defineComponent({ |
| 57 | name: 'TenantRoleManagement', | 72 | name: 'TenantRoleManagement', |
| 58 | - components: { BasicTable, RoleDrawer, TableAction, Authority }, | 73 | + components: { BasicTable, RoleDrawer, TableAction, Authority, Switch }, |
| 59 | setup() { | 74 | setup() { |
| 60 | const [registerDrawer, { openDrawer }] = useDrawer(); | 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 | title: '租户角色列表', | 80 | title: '租户角色列表', |
| 66 | api: getRoleListByPage, | 81 | api: getRoleListByPage, |
| 67 | columns, | 82 | columns, |
| 68 | - | ||
| 69 | formConfig: { | 83 | formConfig: { |
| 70 | labelWidth: 120, | 84 | labelWidth: 120, |
| 71 | schemas: searchFormSchema, | 85 | schemas: searchFormSchema, |
| @@ -82,6 +96,19 @@ | @@ -82,6 +96,19 @@ | ||
| 82 | fixed: 'right', | 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 | function handleCreate() { | 113 | function handleCreate() { |
| 87 | openDrawer(true, { | 114 | openDrawer(true, { |
| @@ -95,50 +122,39 @@ | @@ -95,50 +122,39 @@ | ||
| 95 | isUpdate: true, | 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 | return { | 148 | return { |
| 132 | - disabled, | ||
| 133 | - useSelectionChange, | ||
| 134 | - handleBatchDelete, | 149 | + statusChange, |
| 135 | registerTable, | 150 | registerTable, |
| 136 | registerDrawer, | 151 | registerDrawer, |
| 137 | handleCreate, | 152 | handleCreate, |
| 138 | handleEdit, | 153 | handleEdit, |
| 139 | - handleDelete, | ||
| 140 | handleSuccess, | 154 | handleSuccess, |
| 141 | RoleEnum, | 155 | RoleEnum, |
| 156 | + hasBatchDelete, | ||
| 157 | + handleDeleteOrBatchDelete, | ||
| 142 | }; | 158 | }; |
| 143 | }, | 159 | }, |
| 144 | }); | 160 | }); |
| 1 | import { BasicColumn } from '/@/components/Table'; | 1 | import { BasicColumn } from '/@/components/Table'; |
| 2 | import { FormSchema } from '/@/components/Table'; | 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 { RoleEnum } from '/@/enums/roleEnum'; | 3 | import { RoleEnum } from '/@/enums/roleEnum'; |
| 8 | export const columns: BasicColumn[] = [ | 4 | export const columns: BasicColumn[] = [ |
| 9 | { | 5 | { |
| @@ -20,35 +16,8 @@ export const columns: BasicColumn[] = [ | @@ -20,35 +16,8 @@ export const columns: BasicColumn[] = [ | ||
| 20 | title: '状态', | 16 | title: '状态', |
| 21 | dataIndex: 'status', | 17 | dataIndex: 'status', |
| 22 | width: 120, | 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 | title: '备注', | 22 | title: '备注', |
| 54 | dataIndex: 'remark', | 23 | dataIndex: 'remark', |