feat: use table action
							parent
							
								
									2ea9b4781e
								
							
						
					
					
						commit
						0af58f8f9a
					
				|  | @ -1,16 +1,10 @@ | |||
| import type { VbenFormSchema } from '#/adapter/form'; | ||||
| import type { OnActionClickFn, VxeTableGridOptions } from '#/adapter/vxe-table'; | ||||
| import type { SystemDictDataApi } from '#/api/system/dict/data'; | ||||
| import type { SystemDictTypeApi } from '#/api/system/dict/type'; | ||||
| 
 | ||||
| import { useAccess } from '@vben/access'; | ||||
| import type { VxeTableGridOptions } from '#/adapter/vxe-table'; | ||||
| 
 | ||||
| import { z } from '#/adapter/form'; | ||||
| import { getSimpleDictTypeList } from '#/api/system/dict/type'; | ||||
| import { CommonStatusEnum, DICT_TYPE, getDictOptions } from '#/utils'; | ||||
| 
 | ||||
| const { hasAccessByCodes } = useAccess(); | ||||
| 
 | ||||
| // ============================== 字典类型 ==============================
 | ||||
| 
 | ||||
| /** 类型新增/修改的表单 */ | ||||
|  | @ -96,9 +90,7 @@ export function useTypeGridFormSchema(): VbenFormSchema[] { | |||
| } | ||||
| 
 | ||||
| /** 类型列表的字段 */ | ||||
| export function useTypeGridColumns<T = SystemDictTypeApi.DictType>( | ||||
|   onActionClick: OnActionClickFn<T>, | ||||
| ): VxeTableGridOptions['columns'] { | ||||
| export function useTypeGridColumns(): VxeTableGridOptions['columns'] { | ||||
|   return [ | ||||
|     { | ||||
|       field: 'id', | ||||
|  | @ -136,29 +128,10 @@ export function useTypeGridColumns<T = SystemDictTypeApi.DictType>( | |||
|       formatter: 'formatDateTime', | ||||
|     }, | ||||
|     { | ||||
|       minWidth: 120, | ||||
|       title: '操作', | ||||
|       field: 'operation', | ||||
|       width: 160, | ||||
|       fixed: 'right', | ||||
|       align: 'center', | ||||
|       cellRender: { | ||||
|         attrs: { | ||||
|           nameField: 'type', | ||||
|           nameTitle: '字典类型', | ||||
|           onClick: onActionClick, | ||||
|         }, | ||||
|         name: 'CellOperation', | ||||
|         options: [ | ||||
|           { | ||||
|             code: 'edit', | ||||
|             show: hasAccessByCodes(['system:dict:update']), | ||||
|           }, | ||||
|           { | ||||
|             code: 'delete', | ||||
|             show: hasAccessByCodes(['system:dict:delete']), | ||||
|           }, | ||||
|         ], | ||||
|       }, | ||||
|       slots: { default: 'actions' }, | ||||
|     }, | ||||
|   ]; | ||||
| } | ||||
|  | @ -310,9 +283,7 @@ export function useDataGridFormSchema(): VbenFormSchema[] { | |||
| /** | ||||
|  * 字典数据表格列 | ||||
|  */ | ||||
| export function useDataGridColumns<T = SystemDictDataApi.DictData>( | ||||
|   onActionClick: OnActionClickFn<T>, | ||||
| ): VxeTableGridOptions['columns'] { | ||||
| export function useDataGridColumns(): VxeTableGridOptions['columns'] { | ||||
|   return [ | ||||
|     { | ||||
|       field: 'id', | ||||
|  | @ -360,29 +331,10 @@ export function useDataGridColumns<T = SystemDictDataApi.DictData>( | |||
|       formatter: 'formatDateTime', | ||||
|     }, | ||||
|     { | ||||
|       minWidth: 120, | ||||
|       title: '操作', | ||||
|       field: 'operation', | ||||
|       width: 160, | ||||
|       fixed: 'right', | ||||
|       align: 'center', | ||||
|       cellRender: { | ||||
|         attrs: { | ||||
|           nameField: 'label', | ||||
|           nameTitle: '字典数据', | ||||
|           onClick: onActionClick, | ||||
|         }, | ||||
|         name: 'CellOperation', | ||||
|         options: [ | ||||
|           { | ||||
|             code: 'edit', | ||||
|             show: hasAccessByCodes(['system:dict:update']), | ||||
|           }, | ||||
|           { | ||||
|             code: 'delete', | ||||
|             show: hasAccessByCodes(['system:dict:delete']), | ||||
|           }, | ||||
|         ], | ||||
|       }, | ||||
|       slots: { default: 'actions' }, | ||||
|     }, | ||||
|   ]; | ||||
| } | ||||
|  |  | |||
|  | @ -1,8 +1,5 @@ | |||
| <script lang="ts" setup> | ||||
| import type { | ||||
|   OnActionClickParams, | ||||
|   VxeTableGridOptions, | ||||
| } from '#/adapter/vxe-table'; | ||||
| import type { VxeTableGridOptions } from '#/adapter/vxe-table'; | ||||
| import type { SystemDictDataApi } from '#/api/system/dict/data'; | ||||
| 
 | ||||
| import { watch } from 'vue'; | ||||
|  | @ -19,6 +16,7 @@ import { | |||
|   exportDictData, | ||||
|   getDictDataPage, | ||||
| } from '#/api/system/dict/data'; | ||||
| import { ACTION_KEY, TableAction } from '#/components/table-action'; | ||||
| import { $t } from '#/locales'; | ||||
| 
 | ||||
| import { useDataGridColumns, useDataGridFormSchema } from '../data'; | ||||
|  | @ -53,41 +51,22 @@ function onCreate() { | |||
| } | ||||
| 
 | ||||
| /** 编辑字典数据 */ | ||||
| function onEdit(row: any) { | ||||
| function onEdit(row: SystemDictDataApi.DictData) { | ||||
|   dataFormModalApi.setData(row).open(); | ||||
| } | ||||
| 
 | ||||
| /** 删除字典数据 */ | ||||
| async function onDelete(row: any) { | ||||
|   const hideLoading = message.loading({ | ||||
|     content: $t('common.processing'), | ||||
|     duration: 0, | ||||
|     key: 'process_message', | ||||
| async function onDelete(row: SystemDictDataApi.DictData) { | ||||
|   message.loading({ | ||||
|     content: $t('ui.actionMessage.deleting', [row.label]), | ||||
|     key: ACTION_KEY, | ||||
|   }); | ||||
|   try { | ||||
|     await deleteDictData(row.id); | ||||
|     message.success({ | ||||
|       content: $t('common.operationSuccess'), | ||||
|       key: 'process_message', | ||||
|     }); | ||||
|     onRefresh(); | ||||
|   } finally { | ||||
|     hideLoading(); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /** 表格操作按钮回调 */ | ||||
| function onActionClick({ code, row }: OnActionClickParams) { | ||||
|   switch (code) { | ||||
|     case 'delete': { | ||||
|       onDelete(row); | ||||
|       break; | ||||
|     } | ||||
|     case 'edit': { | ||||
|       onEdit(row); | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|   await deleteDictData(row.id as number); | ||||
|   message.success({ | ||||
|     content: $t('ui.actionMessage.deleteSuccess', [row.label]), | ||||
|     key: ACTION_KEY, | ||||
|   }); | ||||
|   onRefresh(); | ||||
| } | ||||
| 
 | ||||
| const [Grid, gridApi] = useVbenVxeGrid({ | ||||
|  | @ -95,7 +74,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ | |||
|     schema: useDataGridFormSchema(), | ||||
|   }, | ||||
|   gridOptions: { | ||||
|     columns: useDataGridColumns(onActionClick), | ||||
|     columns: useDataGridColumns(), | ||||
|     height: 'auto', | ||||
|     keepSource: true, | ||||
|     proxyConfig: { | ||||
|  | @ -155,6 +134,30 @@ watch( | |||
|           {{ $t('ui.actionTitle.export') }} | ||||
|         </Button> | ||||
|       </template> | ||||
|       <template #actions="{ row }"> | ||||
|         <TableAction | ||||
|           :actions="[ | ||||
|             { | ||||
|               label: $t('common.edit'), | ||||
|               type: 'link', | ||||
|               icon: 'ant-design:edit-outlined', | ||||
|               auth: ['system:dict:update'], | ||||
|               onClick: onEdit.bind(null, row), | ||||
|             }, | ||||
|             { | ||||
|               label: $t('common.delete'), | ||||
|               type: 'link', | ||||
|               danger: true, | ||||
|               icon: 'ant-design:delete-outlined', | ||||
|               auth: ['system:dict:delete'], | ||||
|               popConfirm: { | ||||
|                 title: $t('ui.actionMessage.deleteConfirm', [row.label]), | ||||
|                 confirm: onDelete.bind(null, row), | ||||
|               }, | ||||
|             }, | ||||
|           ]" | ||||
|         /> | ||||
|       </template> | ||||
|     </Grid> | ||||
|   </div> | ||||
| </template> | ||||
|  |  | |||
|  | @ -1,6 +1,5 @@ | |||
| <script lang="ts" setup> | ||||
| import type { | ||||
|   OnActionClickParams, | ||||
|   VxeGridListeners, | ||||
|   VxeTableGridOptions, | ||||
| } from '#/adapter/vxe-table'; | ||||
|  | @ -18,6 +17,7 @@ import { | |||
|   exportDictType, | ||||
|   getDictTypePage, | ||||
| } from '#/api/system/dict/type'; | ||||
| import { ACTION_KEY, TableAction } from '#/components/table-action'; | ||||
| import { $t } from '#/locales'; | ||||
| 
 | ||||
| import { useTypeGridColumns, useTypeGridFormSchema } from '../data'; | ||||
|  | @ -53,38 +53,16 @@ function onEdit(row: any) { | |||
| 
 | ||||
| /** 删除字典类型 */ | ||||
| async function onDelete(row: SystemDictTypeApi.DictType) { | ||||
|   const hideLoading = message.loading({ | ||||
|     content: $t('common.processing'), | ||||
|     duration: 0, | ||||
|     key: 'process_message', | ||||
|   message.loading({ | ||||
|     content: $t('ui.actionMessage.deleting', [row.name]), | ||||
|     key: ACTION_KEY, | ||||
|   }); | ||||
|   try { | ||||
|     await deleteDictType(row.id as number); | ||||
|     message.success({ | ||||
|       content: $t('common.operationSuccess'), | ||||
|       key: 'process_message', | ||||
|     }); | ||||
|     onRefresh(); | ||||
|   } finally { | ||||
|     hideLoading(); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /** 表格操作按钮回调 */ | ||||
| function onActionClick({ | ||||
|   code, | ||||
|   row, | ||||
| }: OnActionClickParams<SystemDictTypeApi.DictType>) { | ||||
|   switch (code) { | ||||
|     case 'delete': { | ||||
|       onDelete(row); | ||||
|       break; | ||||
|     } | ||||
|     case 'edit': { | ||||
|       onEdit(row); | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|   await deleteDictType(row.id as number); | ||||
|   message.success({ | ||||
|     content: $t('ui.actionMessage.deleteSuccess', [row.name]), | ||||
|     key: ACTION_KEY, | ||||
|   }); | ||||
|   onRefresh(); | ||||
| } | ||||
| 
 | ||||
| /** 表格事件 */ | ||||
|  | @ -99,7 +77,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ | |||
|     schema: useTypeGridFormSchema(), | ||||
|   }, | ||||
|   gridOptions: { | ||||
|     columns: useTypeGridColumns(onActionClick), | ||||
|     columns: useTypeGridColumns(), | ||||
|     height: 'auto', | ||||
|     keepSource: true, | ||||
|     proxyConfig: { | ||||
|  | @ -150,6 +128,30 @@ const [Grid, gridApi] = useVbenVxeGrid({ | |||
|           {{ $t('ui.actionTitle.export') }} | ||||
|         </Button> | ||||
|       </template> | ||||
|       <template #actions="{ row }"> | ||||
|         <TableAction | ||||
|           :actions="[ | ||||
|             { | ||||
|               label: $t('common.edit'), | ||||
|               type: 'link', | ||||
|               icon: 'ant-design:edit-outlined', | ||||
|               auth: ['system:dict:update'], | ||||
|               onClick: onEdit.bind(null, row), | ||||
|             }, | ||||
|             { | ||||
|               label: $t('common.delete'), | ||||
|               type: 'link', | ||||
|               danger: true, | ||||
|               icon: 'ant-design:delete-outlined', | ||||
|               auth: ['system:dict:delete'], | ||||
|               popConfirm: { | ||||
|                 title: $t('ui.actionMessage.deleteConfirm', [row.name]), | ||||
|                 confirm: onDelete.bind(null, row), | ||||
|               }, | ||||
|             }, | ||||
|           ]" | ||||
|         /> | ||||
|       </template> | ||||
|     </Grid> | ||||
|   </div> | ||||
| </template> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 xingyu4j
						xingyu4j