From ee7c31db44fd8f99f0d26da368e1d82b5630f309 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=97=A0=E6=9C=A8?= Date: Fri, 27 Aug 2021 22:23:39 +0800 Subject: [PATCH] feat(table): add `onValid` for editRow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为table的可编辑行添加校验方法 --- CHANGELOG.zh_CN.md | 4 ++- .../src/components/editable/EditableCell.vue | 8 +----- .../Table/src/components/editable/index.ts | 13 ++++++++++ src/views/demo/table/EditRowTable.vue | 26 ++++++++++++++++--- 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.zh_CN.md b/CHANGELOG.zh_CN.md index 45c26ca2..a297bdb7 100644 --- a/CHANGELOG.zh_CN.md +++ b/CHANGELOG.zh_CN.md @@ -1,7 +1,9 @@ ### ✨ Features - **BasicForm** 表单组件新增`Divider`,用于较长表单的区域分割 -- **BasicTable** 单元格编辑新增提交回调,将根据回调函数返回的结果来决定是否将数据提交到表格 +- **BasicTable** + - 单元格编辑新增提交回调,将根据回调函数返回的结果来决定是否将数据提交到表格 + - 行编辑添加校验方法,允许只校验而不提交值,以便异步保存数据成功后才提交倒表格 ### 🐛 Bug Fixes diff --git a/src/components/Table/src/components/editable/EditableCell.vue b/src/components/Table/src/components/editable/EditableCell.vue index a1ea18c2..a0a3ff85 100644 --- a/src/components/Table/src/components/editable/EditableCell.vue +++ b/src/components/Table/src/components/editable/EditableCell.vue @@ -364,13 +364,7 @@ /* eslint-disable */ props.record.onSubmitEdit = async () => { if (isArray(props.record?.submitCbs)) { - const validFns = (props.record?.validCbs || []).map((fn) => fn()); - - const res = await Promise.all(validFns); - - const pass = res.every((item) => !!item); - - if (!pass) return; + if (!props.record?.onValid?.()) return; const submitFns = props.record?.submitCbs || []; submitFns.forEach((fn) => fn(false, false)); table.emit?.('edit-row-end'); diff --git a/src/components/Table/src/components/editable/index.ts b/src/components/Table/src/components/editable/index.ts index 4ea515b5..4f7d4dac 100644 --- a/src/components/Table/src/components/editable/index.ts +++ b/src/components/Table/src/components/editable/index.ts @@ -3,6 +3,7 @@ import type { BasicColumn } from '/@/components/Table/src/types/table'; import { h, Ref } from 'vue'; import EditableCell from './EditableCell.vue'; +import { isArray } from '/@/utils/is'; interface Params { text: string; @@ -12,12 +13,23 @@ interface Params { export function renderEditCell(column: BasicColumn) { return ({ text: value, record, index }: Params) => { + record.onValid = async () => { + if (isArray(record?.validCbs)) { + const validFns = (record?.validCbs || []).map((fn) => fn()); + const res = await Promise.all(validFns); + return res.every((item) => !!item); + } else { + return false; + } + }; + record.onEdit = async (edit: boolean, submit = false) => { if (!submit) { record.editable = edit; } if (!edit && submit) { + if (!(await record.onValid())) return false; const res = await record.onSubmitEdit?.(); if (res) { record.editable = false; @@ -44,6 +56,7 @@ export function renderEditCell(column: BasicColumn) { export type EditRecordRow = Partial< { onEdit: (editable: boolean, submit?: boolean) => Promise; + onValid: () => Promise; editable: boolean; onCancel: Fn; onSubmit: Fn; diff --git a/src/views/demo/table/EditRowTable.vue b/src/views/demo/table/EditRowTable.vue index e87e0cc9..4a8e5792 100644 --- a/src/views/demo/table/EditRowTable.vue +++ b/src/views/demo/table/EditRowTable.vue @@ -21,6 +21,8 @@ import { demoListApi } from '/@/api/demo/table'; import { treeOptionsListApi } from '/@/api/demo/tree'; + import { cloneDeep } from 'lodash-es'; + import { useMessage } from '/@/hooks/web/useMessage'; const columns: BasicColumn[] = [ { @@ -162,6 +164,7 @@ export default defineComponent({ components: { BasicTable, TableAction }, setup() { + const { createMessage: msg } = useMessage(); const currentEditKeyRef = ref(''); const [registerTable] = useTable({ title: '可编辑行示例', @@ -192,9 +195,26 @@ } async function handleSave(record: EditRecordRow) { - const pass = await record.onEdit?.(false, true); - if (pass) { - currentEditKeyRef.value = ''; + // 校验 + msg.loading({ content: '正在保存...', duration: 0, key: 'saving' }); + const valid = await record.onValid?.(); + if (valid) { + try { + const data = cloneDeep(record.editValueRefs); + console.log(data); + //TODO 此处将数据提交给服务器保存 + // ... + // 保存之后提交编辑状态 + const pass = await record.onEdit?.(false, true); + if (pass) { + currentEditKeyRef.value = ''; + } + msg.success({ content: '数据已保存', key: 'saving' }); + } catch (error) { + msg.error({ content: '保存失败', key: 'saving' }); + } + } else { + msg.error({ content: '请填写正确的数据', key: 'saving' }); } }