-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy patharray.tsx
120 lines (112 loc) · 3.6 KB
/
array.tsx
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import React from 'react';
import { List, ListItem } from '@chakra-ui/react';
import {
WidgetRenderer,
SchemaFieldArray,
WidgetProps,
schemaToFormDataStructure
} from '@stac-manager/data-core';
import { FieldArray, useFormikContext } from 'formik';
import { get } from 'lodash-es';
import { getArrayLabel } from '../utils';
import { ArrayFieldset } from '../components/elements';
export function WidgetArray(props: WidgetProps) {
const { pointer, isRequired } = props;
const field = props.field as SchemaFieldArray;
return (
<ArrayItem
label={field.label}
pointer={pointer}
field={field}
isRequired={isRequired}
/>
);
}
interface ArrayItemProps {
label: React.ReactNode;
field: SchemaFieldArray;
pointer: string;
isRequired?: boolean;
onRemove?: () => void;
removeDisabled?: boolean;
}
function ArrayItem(props: ArrayItemProps) {
const { label, field, pointer, onRemove, removeDisabled, isRequired } = props;
const { values } = useFormikContext();
const fields: any[] = get(values, pointer) || [];
const items = field.items;
const minItems = field.minItems || 0;
const maxItems = field.maxItems || Infinity;
const isFixedCount = minItems === maxItems;
// Check if the nested array is special like an array of strings (Checkboxes)
// for example. Same logic as widget renderer.
const isRegularNestedArray =
items.type === 'array' && !['string', 'number'].includes(items.items.type);
return (
<FieldArray
name={pointer}
render={({ remove, push }) => (
<ArrayFieldset
label={label}
isRequired={isRequired}
onRemove={onRemove}
onAdd={
isFixedCount
? undefined
: () => {
push(schemaToFormDataStructure(items));
}
}
addDisabled={fields.length >= maxItems}
removeDisabled={removeDisabled}
>
{fields.length ? (
<List display='flex' flexDirection='column' gap={4}>
{fields.map((_, index) => (
<ListItem
key={index /* eslint-disable-line react/no-array-index-key */}
>
{isRegularNestedArray ? (
<ArrayItem
label={getArrayLabel(items, index)?.formatted}
pointer={`${pointer}.${index}`}
field={items as SchemaFieldArray}
onRemove={
isFixedCount
? undefined
: () => {
remove(index);
}
}
removeDisabled={fields.length <= minItems}
/>
) : (
<ArrayFieldset
label={getArrayLabel(items, index)?.formatted}
onRemove={
isFixedCount
? undefined
: () => {
remove(index);
}
}
removeDisabled={fields.length <= minItems}
>
<WidgetRenderer
pointer={`${pointer}.${index}`}
field={items}
isRequired={false}
/>
</ArrayFieldset>
)}
</ListItem>
))}
</List>
) : (
<p>No items</p>
)}
</ArrayFieldset>
)}
/>
);
}