EditableCell.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import { __awaiter, __rest } from "tslib";
  2. import { jsx as _jsx } from "react/jsx-runtime";
  3. import { cloneElement, useContext, useEffect, useRef, useState, } from "react";
  4. import { Form } from "antd";
  5. import { DageEditableContext } from "./context";
  6. import { EditableCellValueWrap } from "./style";
  7. export const DageEditableCell = (_a) => {
  8. var { title, editable, children, dataIndex, record, Input, handleSave } = _a, restProps = __rest(_a, ["title", "editable", "children", "dataIndex", "record", "Input", "handleSave"]);
  9. // 防止首次触发校验
  10. const firstRender = useRef(true);
  11. const [editing, setEditing] = useState(Boolean(editable && Array.isArray(children) && !children[1]));
  12. const inputRef = useRef(null);
  13. const form = useContext(DageEditableContext);
  14. useEffect(() => {
  15. var _a;
  16. if (firstRender.current) {
  17. firstRender.current = false;
  18. return;
  19. }
  20. if (editing) {
  21. (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
  22. }
  23. }, [editing]);
  24. const toggleEdit = () => {
  25. setEditing(!editing);
  26. form.setFieldsValue({ [dataIndex]: record[dataIndex] });
  27. };
  28. const save = () => __awaiter(void 0, void 0, void 0, function* () {
  29. const values = yield form.validateFields();
  30. toggleEdit();
  31. handleSave(Object.assign(Object.assign({}, record), values));
  32. });
  33. let childNode = children;
  34. if (editable) {
  35. childNode = editing ? (_jsx(Form.Item, { style: { margin: 0 },
  36. // @ts-ignore
  37. name: dataIndex, rules: [{ required: true, message: `请填写${title}` }], children: cloneElement(Input, {
  38. ref: inputRef,
  39. onPressEnter: save,
  40. onBlur: save,
  41. }) })) : (_jsx(EditableCellValueWrap, { style: { paddingInlineEnd: 24 }, onClick: toggleEdit, children: children }));
  42. }
  43. return _jsx("td", Object.assign({}, restProps, { children: childNode }));
  44. };