EditRowTable.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <template>
  2. <div class="p-4">
  3. <a-button v-if="isAdd" type="primary" @click="addRow"> 新增 </a-button>
  4. <BasicTable @register="registerTable" @edit-change="onEditChange">
  5. <template #action="{ record, column }">
  6. <TableAction :actions="createActions(record, column)" />
  7. </template>
  8. </BasicTable>
  9. </div>
  10. </template>
  11. <script lang="ts">
  12. import { defineComponent, ref, nextTick, inject } from 'vue';
  13. import { BasicTable, useTable, TableAction, BasicColumn, ActionItem, EditRecordRow } from '/@/components/Table';
  14. import { useMessage } from '/@/hooks/web/useMessage';
  15. // import { nextTick } from 'process';
  16. export default defineComponent({
  17. components: { BasicTable, TableAction },
  18. props: {
  19. columns: {
  20. type: Array,
  21. requried: true,
  22. },
  23. list: {
  24. type: Function,
  25. requried: true,
  26. },
  27. isAdd: {
  28. type: Boolean,
  29. },
  30. },
  31. emits: ['saveOrUpdate', 'deleteById'],
  32. setup(props, { emit }) {
  33. const deviceType = inject('deviceType');
  34. const { createMessage: msg } = useMessage();
  35. const currentEditKeyRef = ref('');
  36. const [registerTable, { insertTableDataRecord, reload }] = useTable({
  37. title: '',
  38. api: props.list?.bind(null, { devicetype: deviceType, valuetype: '9' }),
  39. columns: props.columns as BasicColumn[],
  40. showIndexColumn: false,
  41. showTableSetting: false,
  42. tableSetting: { fullScreen: true },
  43. actionColumn: {
  44. width: 160,
  45. title: '操作',
  46. dataIndex: 'action',
  47. slots: { customRender: 'action' },
  48. },
  49. });
  50. function addRow() {
  51. const record = {} as EditRecordRow;
  52. insertTableDataRecord(record);
  53. nextTick(() => {
  54. handleEdit(record);
  55. });
  56. }
  57. function handleEdit(record: EditRecordRow) {
  58. currentEditKeyRef.value = record.key;
  59. record.onEdit?.(true);
  60. }
  61. function handleCancel(record: EditRecordRow) {
  62. currentEditKeyRef.value = '';
  63. record.onEdit?.(false, false);
  64. }
  65. function handleDelete(record: EditRecordRow) {
  66. emit('deleteById', record.id, reload);
  67. }
  68. async function handleSave(record: EditRecordRow) {
  69. // 校验
  70. msg.loading({ content: '正在保存...', duration: 0, key: 'saving' });
  71. const valid = await record.onValid?.();
  72. if (valid) {
  73. try {
  74. //TODO 此处将数据提交给服务器保存
  75. emit('saveOrUpdate', record);
  76. // 保存之后提交编辑状态
  77. const pass = await record.onEdit?.(false, true);
  78. if (pass) {
  79. currentEditKeyRef.value = '';
  80. }
  81. msg.success({ content: '数据已保存', key: 'saving' });
  82. } catch (error) {
  83. msg.error({ content: '保存失败', key: 'saving' });
  84. }
  85. } else {
  86. msg.error({ content: '请填写正确的数据', key: 'saving' });
  87. }
  88. }
  89. function createActions(record: EditRecordRow, column: BasicColumn): ActionItem[] {
  90. if (!record.editable) {
  91. if (props.isAdd) {
  92. return [
  93. {
  94. label: '编辑',
  95. disabled: currentEditKeyRef.value ? currentEditKeyRef.value !== record.key : false,
  96. onClick: handleEdit.bind(null, record),
  97. },
  98. {
  99. label: '删除',
  100. disabled: currentEditKeyRef.value ? currentEditKeyRef.value !== record.key : false,
  101. onClick: handleDelete.bind(null, record),
  102. },
  103. ];
  104. } else {
  105. return [
  106. {
  107. label: '编辑',
  108. disabled: currentEditKeyRef.value ? currentEditKeyRef.value !== record.key : false,
  109. onClick: handleEdit.bind(null, record),
  110. },
  111. ];
  112. }
  113. }
  114. return [
  115. {
  116. label: '保存',
  117. onClick: handleSave.bind(null, record, column),
  118. },
  119. {
  120. label: '取消',
  121. popConfirm: {
  122. title: '是否取消编辑',
  123. confirm: handleCancel.bind(null, record, column),
  124. },
  125. },
  126. ];
  127. }
  128. function onEditChange({ column, value, record }) {
  129. // 本例
  130. if (column.dataIndex === 'id') {
  131. record.editValueRefs.name4.value = `${value}`;
  132. }
  133. // console.log(column, value, record);
  134. }
  135. return {
  136. registerTable,
  137. handleEdit,
  138. createActions,
  139. onEditChange,
  140. addRow,
  141. };
  142. },
  143. });
  144. </script>
  145. <style scoped lang="less">
  146. :deep(.ant-table-body) {
  147. height: auto !important;
  148. }
  149. </style>