i18nList.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <template>
  2. <div class="full-height">
  3. <SmartTable
  4. @register="registerTable"
  5. :size="getTableSize"
  6. @current-change="handleCurrentChange"
  7. >
  8. <template #table-operation="{ row }">
  9. <SmartVxeTableAction :actions="getTableActions(row)" />
  10. </template>
  11. </SmartTable>
  12. </div>
  13. </template>
  14. <script lang="ts" setup>
  15. import { useSmartTable, SmartTable, SmartVxeTableAction } from '@/components/SmartTable';
  16. import { propTypes } from '@/utils/propTypes';
  17. import { useI18n } from '@/hooks/web/useI18n';
  18. import { useSizeSetting } from '@/hooks/setting/UseSizeSetting';
  19. import { message, Modal } from 'ant-design-vue';
  20. import { createVNode, watch } from 'vue';
  21. import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
  22. import { ApiServiceEnum, defHttp } from '@/utils/http/axios';
  23. import { getI18nTableColumns, getI18nAddEditSchemas } from './i18n.config';
  24. import { listI18nApi, getI18nByIdApi, i18nSaveUpdateApi, i18nDeleteApi } from './i18n.api';
  25. import { SystemPermissions } from '@/modules/system/constants/SystemConstants';
  26. const props = defineProps({
  27. groupId: propTypes.oneOfType([propTypes.nullable, propTypes.number]),
  28. });
  29. const emit = defineEmits(['change']);
  30. const { t } = useI18n();
  31. const { getTableSize } = useSizeSetting();
  32. watch(
  33. () => props.groupId,
  34. async () => {
  35. await query();
  36. emit('change', null);
  37. },
  38. );
  39. const permissions = SystemPermissions.i18n;
  40. const getTableActions = (row: any) => {
  41. return [
  42. {
  43. label: t('common.button.edit'),
  44. preIcon: 'ant-design:edit-out-lined',
  45. auth: permissions.update,
  46. onClick: () => editByRowModal(row),
  47. },
  48. ];
  49. };
  50. const handleCurrentChange = ({ row }) => {
  51. emit('change', row.i18nId);
  52. };
  53. const [registerTable, { query, editByRowModal }] = useSmartTable({
  54. id: 'smart-system-i18n-i18nList',
  55. height: 'auto',
  56. stripe: true,
  57. columns: getI18nTableColumns(),
  58. useSearchForm: true,
  59. pagerConfig: true,
  60. border: true,
  61. showOverflow: 'tooltip',
  62. rowConfig: {
  63. isCurrent: true,
  64. },
  65. customConfig: { storage: true },
  66. columnConfig: {
  67. resizable: true,
  68. },
  69. sortConfig: {
  70. remote: true,
  71. defaultSort: { field: 'seq', order: 'asc' },
  72. },
  73. searchFormConfig: {
  74. searchWithSymbol: true,
  75. schemas: [
  76. {
  77. label: t('system.views.i18n.i18n.titleI18nCode'),
  78. field: 'i18nCode',
  79. component: 'Input',
  80. searchSymbol: 'like',
  81. },
  82. ],
  83. compact: true,
  84. colon: true,
  85. layout: 'inline',
  86. actionColOptions: { span: undefined },
  87. },
  88. addEditConfig: {
  89. formConfig: {
  90. baseColProps: {
  91. span: 24,
  92. },
  93. schemas: getI18nAddEditSchemas(t),
  94. labelCol: { span: 5 },
  95. wrapperCol: { span: 17 },
  96. },
  97. },
  98. toolbarConfig: {
  99. refresh: true,
  100. resizable: true,
  101. zoom: true,
  102. column: {
  103. columnOrder: true,
  104. },
  105. buttons: [
  106. {
  107. name: t('system.views.i18n.i18n.button.reload'),
  108. customRender: 'ant',
  109. auth: permissions.reload,
  110. props: {
  111. preIcon: 'ant-design:reload-outlined',
  112. type: 'primary',
  113. onClick: () => handleReload(),
  114. size: 'small',
  115. },
  116. },
  117. { code: 'ModalAdd' },
  118. { code: 'ModalEdit' },
  119. { code: 'delete' },
  120. ],
  121. },
  122. proxyConfig: {
  123. ajax: {
  124. query: ({ ajaxParameter }) => {
  125. let groupId = props.groupId;
  126. if (groupId == null) {
  127. groupId = undefined;
  128. }
  129. const parameter = {
  130. ...ajaxParameter,
  131. parameter: {
  132. ...ajaxParameter?.parameter,
  133. 'groupId@=': groupId,
  134. },
  135. };
  136. return listI18nApi(parameter);
  137. },
  138. getById: (model) => getI18nByIdApi(model.i18nId),
  139. save: ({ body: { insertRecords, updateRecords } }) => {
  140. if (insertRecords?.length > 0) {
  141. insertRecords.forEach((item) => {
  142. item.groupId = props.groupId;
  143. });
  144. }
  145. return i18nSaveUpdateApi([...insertRecords, ...updateRecords][0]);
  146. },
  147. delete: ({ body: { removeRecords } }) => i18nDeleteApi(removeRecords),
  148. },
  149. },
  150. });
  151. /**
  152. * 刷新国际化信息
  153. */
  154. const handleReload = async () => {
  155. Modal.confirm({
  156. title: t('system.views.i18n.i18n.message.reloadConfirm'),
  157. content: t('system.views.i18n.i18n.message.reloadContent'),
  158. icon: createVNode(ExclamationCircleOutlined),
  159. onOk: async () => {
  160. await defHttp.post({
  161. service: ApiServiceEnum.SMART_SYSTEM,
  162. url: 'sys/i18n/reload',
  163. });
  164. message.success(t('system.views.i18n.i18n.message.reloadSuccess'));
  165. },
  166. });
  167. };
  168. </script>
  169. <style lang="less" scoped></style>