69 lines
1.5 KiB
Plaintext
69 lines
1.5 KiB
Plaintext
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;
|
|
record: Recordable;
|
|
index: number;
|
|
}
|
|
|
|
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;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
// cancel
|
|
if (!edit && !submit) {
|
|
record.onCancelEdit?.();
|
|
}
|
|
return true;
|
|
};
|
|
|
|
return h(EditableCell, {
|
|
value,
|
|
record,
|
|
column,
|
|
index,
|
|
});
|
|
};
|
|
}
|
|
|
|
export type EditRecordRow<T = Recordable> = Partial<
|
|
{
|
|
onEdit: (editable: boolean, submit?: boolean) => Promise<boolean>;
|
|
onValid: () => Promise<boolean>;
|
|
editable: boolean;
|
|
onCancel: Fn;
|
|
onSubmit: Fn;
|
|
submitCbs: Fn[];
|
|
cancelCbs: Fn[];
|
|
validCbs: Fn[];
|
|
editValueRefs: Recordable<Ref>;
|
|
} & T
|
|
>;
|