list.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <script lang="ts" setup>
  2. import type { Recordable } from '@vben/types';
  3. import type {
  4. OnActionClickParams,
  5. VxeTableGridOptions,
  6. } from '#/adapter/vxe-table';
  7. import type { SystemRoleApi } from '#/api';
  8. import { Page, useVbenDrawer } from '@vben/common-ui';
  9. import { Plus } from '@vben/icons';
  10. import { Button, message, Modal } from 'ant-design-vue';
  11. import { useVbenVxeGrid } from '#/adapter/vxe-table';
  12. import { deleteRole, getRoleList, updateRole } from '#/api';
  13. import { $t } from '#/locales';
  14. import { useColumns, useGridFormSchema } from './data';
  15. import Form from './modules/form.vue';
  16. const [FormDrawer, formDrawerApi] = useVbenDrawer({
  17. connectedComponent: Form,
  18. destroyOnClose: true,
  19. });
  20. const [Grid, gridApi] = useVbenVxeGrid({
  21. formOptions: {
  22. fieldMappingTime: [['createTime', ['startTime', 'endTime']]],
  23. schema: useGridFormSchema(),
  24. submitOnChange: true,
  25. },
  26. gridOptions: {
  27. columns: useColumns(onActionClick, onStatusChange),
  28. height: 'auto',
  29. keepSource: true,
  30. proxyConfig: {
  31. ajax: {
  32. query: async ({ page }, formValues) => {
  33. return await getRoleList({
  34. page: page.currentPage,
  35. pageSize: page.pageSize,
  36. ...formValues,
  37. });
  38. },
  39. },
  40. },
  41. rowConfig: {
  42. keyField: 'id',
  43. },
  44. toolbarConfig: {
  45. custom: true,
  46. export: false,
  47. refresh: true,
  48. search: true,
  49. zoom: true,
  50. },
  51. } as VxeTableGridOptions<SystemRoleApi.SystemRole>,
  52. });
  53. function onActionClick(e: OnActionClickParams<SystemRoleApi.SystemRole>) {
  54. switch (e.code) {
  55. case 'delete': {
  56. onDelete(e.row);
  57. break;
  58. }
  59. case 'edit': {
  60. onEdit(e.row);
  61. break;
  62. }
  63. }
  64. }
  65. /**
  66. * 将Antd的Modal.confirm封装为promise,方便在异步函数中调用。
  67. * @param content 提示内容
  68. * @param title 提示标题
  69. */
  70. function confirm(content: string, title: string) {
  71. return new Promise((reslove, reject) => {
  72. Modal.confirm({
  73. content,
  74. onCancel() {
  75. reject(new Error('已取消'));
  76. },
  77. onOk() {
  78. reslove(true);
  79. },
  80. title,
  81. });
  82. });
  83. }
  84. /**
  85. * 状态开关即将改变
  86. * @param newStatus 期望改变的状态值
  87. * @param row 行数据
  88. * @returns 返回false则中止改变,返回其他值(undefined、true)则允许改变
  89. */
  90. async function onStatusChange(
  91. newStatus: number,
  92. row: SystemRoleApi.SystemRole,
  93. ) {
  94. const status: Recordable<string> = {
  95. 0: '禁用',
  96. 1: '启用',
  97. };
  98. try {
  99. await confirm(
  100. `你要将${row.name}的状态切换为 【${status[newStatus.toString()]}】 吗?`,
  101. `切换状态`,
  102. );
  103. await updateRole(row.id, { status: newStatus });
  104. return true;
  105. } catch {
  106. return false;
  107. }
  108. }
  109. function onEdit(row: SystemRoleApi.SystemRole) {
  110. formDrawerApi.setData(row).open();
  111. }
  112. function onDelete(row: SystemRoleApi.SystemRole) {
  113. const hideLoading = message.loading({
  114. content: $t('ui.actionMessage.deleting', [row.name]),
  115. duration: 0,
  116. key: 'action_process_msg',
  117. });
  118. deleteRole(row.id)
  119. .then(() => {
  120. message.success({
  121. content: $t('ui.actionMessage.deleteSuccess', [row.name]),
  122. key: 'action_process_msg',
  123. });
  124. onRefresh();
  125. })
  126. .catch(() => {
  127. hideLoading();
  128. });
  129. }
  130. function onRefresh() {
  131. gridApi.query();
  132. }
  133. function onCreate() {
  134. formDrawerApi.setData({}).open();
  135. }
  136. </script>
  137. <template>
  138. <Page auto-content-height>
  139. <FormDrawer />
  140. <Grid :table-title="$t('system.role.list')">
  141. <template #toolbar-tools>
  142. <Button type="primary" @click="onCreate">
  143. <Plus class="size-5" />
  144. {{ $t('ui.actionTitle.create', [$t('system.role.name')]) }}
  145. </Button>
  146. </template>
  147. </Grid>
  148. </Page>
  149. </template>