-
-
Notifications
You must be signed in to change notification settings - Fork 2k
/
getDirtyFields.ts
72 lines (65 loc) 路 2.03 KB
/
getDirtyFields.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import deepEqual from '../utils/deepEqual';
import isNullOrUndefined from '../utils/isNullOrUndefined';
import isObject from '../utils/isObject';
import isPrimitive from '../utils/isPrimitive';
import isUndefined from '../utils/isUndefined';
import objectHasFunction from '../utils/objectHasFunction';
function markFieldsDirty<T>(data: T, fields: Record<string, any> = {}) {
const isParentNodeArray = Array.isArray(data);
if (isObject(data) || isParentNodeArray) {
for (const key in data) {
if (
Array.isArray(data[key]) ||
(isObject(data[key]) && !objectHasFunction(data[key]))
) {
fields[key] = Array.isArray(data[key]) ? [] : {};
markFieldsDirty(data[key], fields[key]);
} else if (!isNullOrUndefined(data[key])) {
fields[key] = true;
}
}
}
return fields;
}
function getDirtyFieldsFromDefaultValues<T>(
data: T,
formValues: T,
dirtyFieldsFromValues: Record<
Extract<keyof T, string>,
ReturnType<typeof markFieldsDirty> | boolean
>,
) {
const isParentNodeArray = Array.isArray(data);
if (isObject(data) || isParentNodeArray) {
for (const key in data) {
if (
Array.isArray(data[key]) ||
(isObject(data[key]) && !objectHasFunction(data[key]))
) {
if (
isUndefined(formValues) ||
isPrimitive(dirtyFieldsFromValues[key])
) {
dirtyFieldsFromValues[key] = Array.isArray(data[key])
? markFieldsDirty(data[key], [])
: { ...markFieldsDirty(data[key]) };
} else {
getDirtyFieldsFromDefaultValues(
data[key],
isNullOrUndefined(formValues) ? {} : formValues[key],
dirtyFieldsFromValues[key],
);
}
} else {
dirtyFieldsFromValues[key] = !deepEqual(data[key], formValues[key]);
}
}
}
return dirtyFieldsFromValues;
}
export default <T>(defaultValues: T, formValues: T) =>
getDirtyFieldsFromDefaultValues(
defaultValues,
formValues,
markFieldsDirty(formValues),
);