TemplateSelectTable.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <template>
  2. <LayoutSeparate first-size="200px" :show-line="false" class="full-height">
  3. <template #first>
  4. <TemplateGroup class="full-height" @current-change="handleCurrentChange" />
  5. </template>
  6. <template #second>
  7. <SmartTable
  8. @register="registerTable"
  9. @checkbox-change="handleCheckboxChange"
  10. @proxy-query="resetCheckbox"
  11. />
  12. </template>
  13. </LayoutSeparate>
  14. </template>
  15. <script lang="ts" setup>
  16. import { useI18n } from '@/hooks/web/useI18n';
  17. import { ApiServiceEnum, defHttp } from '@/utils/http/axios';
  18. import { merge } from 'lodash-es';
  19. import { SmartTable, useSmartTable } from '@/components/SmartTable';
  20. import { LayoutSeparate } from '@/components/LayoutSeparate';
  21. import { TemplateType as templateTypeConstants } from '@/modules/codeGenerator/constants/DatabaseConstants';
  22. import TemplateGroup from '@/modules/codeGenerator/components/template/TemplateGroup.vue';
  23. import { watch } from 'vue';
  24. const props = defineProps({
  25. addSelectData: {
  26. type: Function as PropType<Function>,
  27. required: true,
  28. },
  29. removeSelectData: {
  30. type: Function as PropType<Function>,
  31. required: true,
  32. },
  33. selectData: Array,
  34. });
  35. const { t } = useI18n();
  36. let currentGroup: Recordable = {};
  37. const handleCurrentChange = (row) => {
  38. currentGroup = row || {};
  39. query();
  40. };
  41. const handleCheckboxChange = ({ checked, row }) => {
  42. if (checked) {
  43. props.addSelectData([row]);
  44. } else {
  45. props.removeSelectData([row]);
  46. }
  47. };
  48. const resetCheckbox = async () => {
  49. // 数据重新加载后,设置选中的数据
  50. await getTableInstance().setAllCheckboxRow(false);
  51. await setCheckboxRow(props.selectData, true);
  52. };
  53. watch(
  54. () => props.selectData,
  55. () => {
  56. resetCheckbox();
  57. },
  58. );
  59. const [registerTable, { query, getTableInstance, setCheckboxRow }] = useSmartTable({
  60. useSearchForm: true,
  61. height: 'auto',
  62. pagerConfig: true,
  63. rowConfig: {
  64. keyField: 'templateId',
  65. },
  66. proxyConfig: {
  67. ajax: {
  68. query: (params) => {
  69. const parameter = merge(params.ajaxParameter, {
  70. parameter: {
  71. 'groupId@=': currentGroup.groupId,
  72. },
  73. });
  74. return defHttp.post({
  75. service: ApiServiceEnum.SMART_CODE,
  76. url: 'db/code/template/list',
  77. data: parameter,
  78. });
  79. },
  80. },
  81. },
  82. searchFormConfig: {
  83. colon: true,
  84. layout: 'inline',
  85. baseColProps: {
  86. span: 12,
  87. },
  88. actionColOptions: {
  89. span: 12,
  90. },
  91. schemas: [
  92. {
  93. label: t('generator.views.template.table.name'),
  94. field: 'name',
  95. component: 'Input',
  96. },
  97. ],
  98. },
  99. columns: [
  100. {
  101. type: 'checkbox',
  102. width: 60,
  103. fixed: 'left',
  104. },
  105. {
  106. field: 'name',
  107. title: '{generator.views.template.table.name}',
  108. width: 200,
  109. fixed: 'left',
  110. align: 'left',
  111. headerAlign: 'center',
  112. },
  113. {
  114. field: 'templateType',
  115. title: '{generator.views.template.table.templateType}',
  116. width: 140,
  117. formatter: ({ row }: any) => {
  118. const templateType = templateTypeConstants[row.templateType];
  119. if (templateType) {
  120. return t(templateType.label);
  121. }
  122. return '';
  123. },
  124. },
  125. {
  126. field: 'language',
  127. title: '{generator.views.template.table.language}',
  128. width: 200,
  129. },
  130. {
  131. field: 'remark',
  132. title: '{generator.views.template.table.remark}',
  133. minWidth: 200,
  134. align: 'left',
  135. headerAlign: 'center',
  136. },
  137. ],
  138. });
  139. </script>
  140. <style scoped></style>