Commit 52c6f16f89bdedf6e42ea05e87c6b5af8468260f
1 parent
e8b0b5d9
优化 人事通用组件-可编辑表格;
Showing
1 changed file
with
55 additions
and
11 deletions
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<T>({ |
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<T>({ |
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<T>({ |
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<T>({ |
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<T>({ |
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> | ... | ... |