EditRowTable.vue 5.6 KB

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