Commit ee7c31db44fd8f99f0d26da368e1d82b5630f309

Authored by 无木
1 parent a36825a6

feat(table): add `onValid` for editRow

为table的可编辑行添加校验方法
CHANGELOG.zh_CN.md
1 ### ✨ Features 1 ### ✨ Features
2 2
3 - **BasicForm** 表单组件新增`Divider`,用于较长表单的区域分割 3 - **BasicForm** 表单组件新增`Divider`,用于较长表单的区域分割
4 -- **BasicTable** 单元格编辑新增提交回调,将根据回调函数返回的结果来决定是否将数据提交到表格 4 +- **BasicTable**
  5 + - 单元格编辑新增提交回调,将根据回调函数返回的结果来决定是否将数据提交到表格
  6 + - 行编辑添加校验方法,允许只校验而不提交值,以便异步保存数据成功后才提交倒表格
5 7
6 ### 🐛 Bug Fixes 8 ### 🐛 Bug Fixes
7 9
src/components/Table/src/components/editable/EditableCell.vue
@@ -364,13 +364,7 @@ @@ -364,13 +364,7 @@
364 /* eslint-disable */ 364 /* eslint-disable */
365 props.record.onSubmitEdit = async () => { 365 props.record.onSubmitEdit = async () => {
366 if (isArray(props.record?.submitCbs)) { 366 if (isArray(props.record?.submitCbs)) {
367 - const validFns = (props.record?.validCbs || []).map((fn) => fn());  
368 -  
369 - const res = await Promise.all(validFns);  
370 -  
371 - const pass = res.every((item) => !!item);  
372 -  
373 - if (!pass) return; 367 + if (!props.record?.onValid?.()) return;
374 const submitFns = props.record?.submitCbs || []; 368 const submitFns = props.record?.submitCbs || [];
375 submitFns.forEach((fn) => fn(false, false)); 369 submitFns.forEach((fn) => fn(false, false));
376 table.emit?.('edit-row-end'); 370 table.emit?.('edit-row-end');
src/components/Table/src/components/editable/index.ts
@@ -3,6 +3,7 @@ import type { BasicColumn } from '/@/components/Table/src/types/table'; @@ -3,6 +3,7 @@ import type { BasicColumn } from '/@/components/Table/src/types/table';
3 import { h, Ref } from 'vue'; 3 import { h, Ref } from 'vue';
4 4
5 import EditableCell from './EditableCell.vue'; 5 import EditableCell from './EditableCell.vue';
  6 +import { isArray } from '/@/utils/is';
6 7
7 interface Params { 8 interface Params {
8 text: string; 9 text: string;
@@ -12,12 +13,23 @@ interface Params { @@ -12,12 +13,23 @@ interface Params {
12 13
13 export function renderEditCell(column: BasicColumn) { 14 export function renderEditCell(column: BasicColumn) {
14 return ({ text: value, record, index }: Params) => { 15 return ({ text: value, record, index }: Params) => {
  16 + record.onValid = async () => {
  17 + if (isArray(record?.validCbs)) {
  18 + const validFns = (record?.validCbs || []).map((fn) => fn());
  19 + const res = await Promise.all(validFns);
  20 + return res.every((item) => !!item);
  21 + } else {
  22 + return false;
  23 + }
  24 + };
  25 +
15 record.onEdit = async (edit: boolean, submit = false) => { 26 record.onEdit = async (edit: boolean, submit = false) => {
16 if (!submit) { 27 if (!submit) {
17 record.editable = edit; 28 record.editable = edit;
18 } 29 }
19 30
20 if (!edit && submit) { 31 if (!edit && submit) {
  32 + if (!(await record.onValid())) return false;
21 const res = await record.onSubmitEdit?.(); 33 const res = await record.onSubmitEdit?.();
22 if (res) { 34 if (res) {
23 record.editable = false; 35 record.editable = false;
@@ -44,6 +56,7 @@ export function renderEditCell(column: BasicColumn) { @@ -44,6 +56,7 @@ export function renderEditCell(column: BasicColumn) {
44 export type EditRecordRow<T = Recordable> = Partial< 56 export type EditRecordRow<T = Recordable> = Partial<
45 { 57 {
46 onEdit: (editable: boolean, submit?: boolean) => Promise<boolean>; 58 onEdit: (editable: boolean, submit?: boolean) => Promise<boolean>;
  59 + onValid: () => Promise<boolean>;
47 editable: boolean; 60 editable: boolean;
48 onCancel: Fn; 61 onCancel: Fn;
49 onSubmit: Fn; 62 onSubmit: Fn;
src/views/demo/table/EditRowTable.vue
@@ -21,6 +21,8 @@ @@ -21,6 +21,8 @@
21 21
22 import { demoListApi } from '/@/api/demo/table'; 22 import { demoListApi } from '/@/api/demo/table';
23 import { treeOptionsListApi } from '/@/api/demo/tree'; 23 import { treeOptionsListApi } from '/@/api/demo/tree';
  24 + import { cloneDeep } from 'lodash-es';
  25 + import { useMessage } from '/@/hooks/web/useMessage';
24 26
25 const columns: BasicColumn[] = [ 27 const columns: BasicColumn[] = [
26 { 28 {
@@ -162,6 +164,7 @@ @@ -162,6 +164,7 @@
162 export default defineComponent({ 164 export default defineComponent({
163 components: { BasicTable, TableAction }, 165 components: { BasicTable, TableAction },
164 setup() { 166 setup() {
  167 + const { createMessage: msg } = useMessage();
165 const currentEditKeyRef = ref(''); 168 const currentEditKeyRef = ref('');
166 const [registerTable] = useTable({ 169 const [registerTable] = useTable({
167 title: '可编辑行示例', 170 title: '可编辑行示例',
@@ -192,9 +195,26 @@ @@ -192,9 +195,26 @@
192 } 195 }
193 196
194 async function handleSave(record: EditRecordRow) { 197 async function handleSave(record: EditRecordRow) {
195 - const pass = await record.onEdit?.(false, true);  
196 - if (pass) {  
197 - currentEditKeyRef.value = ''; 198 + // 校验
  199 + msg.loading({ content: '正在保存...', duration: 0, key: 'saving' });
  200 + const valid = await record.onValid?.();
  201 + if (valid) {
  202 + try {
  203 + const data = cloneDeep(record.editValueRefs);
  204 + console.log(data);
  205 + //TODO 此处将数据提交给服务器保存
  206 + // ...
  207 + // 保存之后提交编辑状态
  208 + const pass = await record.onEdit?.(false, true);
  209 + if (pass) {
  210 + currentEditKeyRef.value = '';
  211 + }
  212 + msg.success({ content: '数据已保存', key: 'saving' });
  213 + } catch (error) {
  214 + msg.error({ content: '保存失败', key: 'saving' });
  215 + }
  216 + } else {
  217 + msg.error({ content: '请填写正确的数据', key: 'saving' });
198 } 218 }
199 } 219 }
200 220