Commit 52c6f16f89bdedf6e42ea05e87c6b5af8468260f

Authored by 王强
1 parent e8b0b5d9

优化 人事通用组件-可编辑表格;

src/pages/ehr/components/EditTable.tsx
... ... @@ -24,6 +24,7 @@ interface Props<T> extends TableProps<T> {
24 24 onChange?: (value?: T[]) => void;
25 25 disabled?: boolean;
26 26 uniqueKey: string; // 列表唯一字段 key
  27 + edit?: boolean;
27 28 columns: (ColumnTypes[number] & {
28 29 editable?: boolean;
29 30 inputType?: "input" | "number" | "text";
... ... @@ -41,6 +42,8 @@ interface Props<T> extends TableProps<T> {
41 42 value: StoreValue,
42 43 callback: (error?: string) => void
43 44 ) => Promise<void | any> | void)[];
  45 + inputSuffix?: React.ReactNode | ((item: T) => React.ReactNode);
  46 + inputPrefix?: React.ReactNode | ((item: T) => React.ReactNode);
44 47 })[];
45 48 }
46 49  
... ... @@ -50,6 +53,7 @@ export default function EditTable&lt;T&gt;({
50 53 disabled,
51 54 columns,
52 55 uniqueKey,
  56 + edit,
53 57 ...otherProps
54 58 }: Props<T>) {
55 59 interface EditableRowProps {
... ... @@ -88,6 +92,8 @@ export default function EditTable&lt;T&gt;({
88 92 value: StoreValue,
89 93 callback: (error?: string) => void
90 94 ) => Promise<void | any> | void)[];
  95 + inputSuffix?: React.ReactNode | ((item: T) => React.ReactNode);
  96 + inputPrefix?: React.ReactNode | ((item: T) => React.ReactNode);
91 97 }
92 98  
93 99 const EditableCell: React.FC<EditableCellProps> = ({
... ... @@ -105,27 +111,44 @@ export default function EditTable&lt;T&gt;({
105 111 record,
106 112 handleSave,
107 113 validatorList,
  114 + inputPrefix,
  115 + inputSuffix,
108 116 ...restProps
109 117 }) => {
110   - const [editing, setEditing] = useState(false);
  118 + const [editing, setEditing] = useState(edit ?? false);
111 119 const inputRef = useRef<InputRef>(null);
112 120 const form = useContext(EditableContext)!;
113 121  
114 122 useEffect(() => {
115   - if (editing) {
  123 + if (edit) {
  124 + form.setFieldsValue({
  125 + [dataIndex]: record?.[dataIndex] ?? '',
  126 + });
  127 + }
  128 + }, []);
  129 +
  130 + useEffect(() => {
  131 + if (edit ? false : editing) {
116 132 inputRef.current?.focus();
117 133 }
118 134 }, [editing]);
119 135  
120 136 const toggleEdit = () => {
121   - setEditing(!editing);
122   - form.setFieldsValue({ [dataIndex]: record[dataIndex] });
  137 + if (!edit) {
  138 + setEditing(!editing);
  139 + form.setFieldsValue({
  140 + [dataIndex]:
  141 + inputType === "number"
  142 + ? `${record?.[dataIndex] ?? ""}`?.replace(/^0+/g, "")
  143 + : record[dataIndex],
  144 + });
  145 + }
123 146 };
124 147  
125   - const save = async () => {
  148 + const save = async (e: any) => {
126 149 try {
  150 + e.preventDefault();
127 151 const values = await form.validateFields();
128   -
129 152 toggleEdit();
130 153 handleSave({ ...record, ...values });
131 154 } catch (errInfo) {
... ... @@ -148,16 +171,14 @@ export default function EditTable&lt;T&gt;({
148 171 },
149 172 {
150 173 validator(rule, value, callback) {
151   - if ((Number.isFinite(min) || minKey) && /^(\d)+$/g.test(value)) {
  174 + if (Number.isFinite(min) || minKey) {
152 175 // @ts-ignore
153 176 const minVal = min ?? (minKey ? (record[minKey] as number) : 0);
154 177 if (minVal > +value) {
155 178 return Promise.reject(Error(`输入的值不能小于${minVal}`));
156 179 }
157   - } else if (
158   - (Number.isFinite(max) || maxKey) &&
159   - /^(\d)+$/g.test(value)
160   - ) {
  180 + }
  181 + if (Number.isFinite(max) || maxKey) {
161 182 // @ts-ignore
162 183 const maxVal = max ?? (maxKey ? (record[maxKey] as number) : 0);
163 184 if (maxVal < +value) {
... ... @@ -198,8 +219,31 @@ export default function EditTable&lt;T&gt;({
198 219 maxLength={maxLength}
199 220 // showCount={!!maxLength}
200 221 onPressEnter={save}
  222 + onFocus={() => {
  223 + inputType === "number" &&
  224 + form.setFieldsValue({
  225 + [dataIndex]: `${record?.[dataIndex] ?? ''}`?.replace(
  226 + /^0+/g,
  227 + ""
  228 + ),
  229 + });
  230 + }}
201 231 onBlur={save}
202 232 onClick={(e) => e.stopPropagation()}
  233 + prefix={
  234 + inputPrefix
  235 + ? typeof inputPrefix === "function"
  236 + ? inputPrefix(record)
  237 + : inputPrefix
  238 + : null
  239 + }
  240 + suffix={
  241 + inputSuffix
  242 + ? typeof inputSuffix === "function"
  243 + ? inputSuffix(record)
  244 + : inputSuffix
  245 + : null
  246 + }
203 247 />
204 248 )}
205 249 </Form.Item>
... ...