@12-apps/ui 6.41.0 → 6.41.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +8 -8
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +9 -9
- package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +1 -1
- package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +7 -7
- package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +4 -4
- package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +24 -1
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +23 -2
- package/dist/_internal/components/data-display/DataViews/data-views-overflow.js +1 -1
- package/dist/_internal/components/form/Autocomplete/Autocomplete.js +2 -2
- package/dist/_internal/components/form/Autocomplete/useAutocomplete.js +1 -1
- package/dist/_internal/components/form/index.js +2 -2
- package/dist/_internal/components/index.js +2 -2
- package/dist/{chunk-ODW2D5PN.js → chunk-6QYKZMEE.js} +5 -2
- package/dist/{chunk-ODW2D5PN.js.map → chunk-6QYKZMEE.js.map} +1 -1
- package/dist/{chunk-Y2UXX5IQ.js → chunk-BKZERHNC.js} +2 -2
- package/dist/{chunk-M4P7NS2L.js → chunk-BR2T72JI.js} +23 -15
- package/dist/chunk-BR2T72JI.js.map +1 -0
- package/dist/{chunk-UGPRBJWB.js → chunk-DH77PLFF.js} +5 -5
- package/dist/{chunk-EIII4QU4.js → chunk-HFVYWHJT.js} +4 -4
- package/dist/{chunk-VEEG4UXZ.js → chunk-IUD6N52Q.js} +2 -2
- package/dist/{chunk-J6KLT7HP.js → chunk-MEBQKYH4.js} +2 -2
- package/dist/{chunk-XVZG52CM.js → chunk-NOLSQK4J.js} +23 -25
- package/dist/chunk-NOLSQK4J.js.map +1 -0
- package/dist/{chunk-VWJEM2ER.js → chunk-NPPJ3IJP.js} +2 -2
- package/dist/chunk-NPPJ3IJP.js.map +1 -0
- package/dist/{chunk-FTQBVZ7V.js → chunk-TJ3334AJ.js} +2 -2
- package/dist/{chunk-VOJBLBXE.js → chunk-UT73NGRS.js} +2 -2
- package/dist/data-display/DataViews.js +9 -9
- package/dist/form/Autocomplete.js +2 -2
- package/dist/types/components/data-display/DataViews/data-views-category-pill.d.ts +6 -1
- package/dist/types/components/data-display/DataViews/data-views-category-pill.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-more-fields.d.ts +0 -11
- package/dist/types/components/data-display/DataViews/data-views-more-fields.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-overflow.d.ts.map +1 -1
- package/dist/types/components/form/Autocomplete/useAutocomplete.d.ts +9 -0
- package/dist/types/components/form/Autocomplete/useAutocomplete.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/data-display/DataViews/data-views-category-pill.tsx +6 -1
- package/src/components/data-display/DataViews/data-views-more-fields.tsx +43 -37
- package/src/components/data-display/DataViews/data-views-overflow.ts +12 -1
- package/src/components/form/Autocomplete/useAutocomplete.ts +46 -16
- package/dist/chunk-M4P7NS2L.js.map +0 -1
- package/dist/chunk-VWJEM2ER.js.map +0 -1
- package/dist/chunk-XVZG52CM.js.map +0 -1
- /package/dist/{chunk-Y2UXX5IQ.js.map → chunk-BKZERHNC.js.map} +0 -0
- /package/dist/{chunk-UGPRBJWB.js.map → chunk-DH77PLFF.js.map} +0 -0
- /package/dist/{chunk-EIII4QU4.js.map → chunk-HFVYWHJT.js.map} +0 -0
- /package/dist/{chunk-VEEG4UXZ.js.map → chunk-IUD6N52Q.js.map} +0 -0
- /package/dist/{chunk-J6KLT7HP.js.map → chunk-MEBQKYH4.js.map} +0 -0
- /package/dist/{chunk-FTQBVZ7V.js.map → chunk-TJ3334AJ.js.map} +0 -0
- /package/dist/{chunk-VOJBLBXE.js.map → chunk-UT73NGRS.js.map} +0 -0
|
@@ -2,12 +2,12 @@ import {
|
|
|
2
2
|
ClearAllControl,
|
|
3
3
|
CloseSearchControl
|
|
4
4
|
} from "./chunk-BM4KKGL7.js";
|
|
5
|
-
import {
|
|
6
|
-
PillControl
|
|
7
|
-
} from "./chunk-VWJEM2ER.js";
|
|
8
5
|
import {
|
|
9
6
|
MoreFilters
|
|
10
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-TJ3334AJ.js";
|
|
8
|
+
import {
|
|
9
|
+
PillControl
|
|
10
|
+
} from "./chunk-NPPJ3IJP.js";
|
|
11
11
|
import {
|
|
12
12
|
CollapsedSearch,
|
|
13
13
|
InlineKeyword
|
|
@@ -220,4 +220,4 @@ function FilterSlots({
|
|
|
220
220
|
export {
|
|
221
221
|
InlineFilterControls
|
|
222
222
|
};
|
|
223
|
-
//# sourceMappingURL=chunk-
|
|
223
|
+
//# sourceMappingURL=chunk-DH77PLFF.js.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
FilterDialog,
|
|
3
3
|
GridFilterPanel
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-BKZERHNC.js";
|
|
5
5
|
import {
|
|
6
6
|
DataViewsEmpty
|
|
7
7
|
} from "./chunk-3UEZ6NUI.js";
|
|
8
8
|
import {
|
|
9
9
|
InlineFilterControls
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-DH77PLFF.js";
|
|
11
11
|
import {
|
|
12
12
|
GridHeaderRow
|
|
13
13
|
} from "./chunk-KW3H5FUS.js";
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
import {
|
|
21
21
|
toOverflowFields,
|
|
22
22
|
useFilterOverflow
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-6QYKZMEE.js";
|
|
24
24
|
import {
|
|
25
25
|
ScopeTabsSlot
|
|
26
26
|
} from "./chunk-6N2EDWMG.js";
|
|
@@ -238,4 +238,4 @@ function GridShell(props) {
|
|
|
238
238
|
export {
|
|
239
239
|
GridShell
|
|
240
240
|
};
|
|
241
|
-
//# sourceMappingURL=chunk-
|
|
241
|
+
//# sourceMappingURL=chunk-HFVYWHJT.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
useAutocomplete
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-BR2T72JI.js";
|
|
4
4
|
import {
|
|
5
5
|
AutocompleteInput,
|
|
6
6
|
ChipList,
|
|
@@ -131,4 +131,4 @@ export {
|
|
|
131
131
|
Autocomplete,
|
|
132
132
|
Autocomplete_default
|
|
133
133
|
};
|
|
134
|
-
//# sourceMappingURL=chunk-
|
|
134
|
+
//# sourceMappingURL=chunk-IUD6N52Q.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DataViewsGrid
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UT73NGRS.js";
|
|
4
4
|
import {
|
|
5
5
|
DeleteViewDialog
|
|
6
6
|
} from "./chunk-DH5UJD2I.js";
|
|
@@ -178,4 +178,4 @@ function renderViewDialogs(ctl, fields, columns, views, testIdPrefix, onSaved) {
|
|
|
178
178
|
export {
|
|
179
179
|
DataViewsTableBase
|
|
180
180
|
};
|
|
181
|
-
//# sourceMappingURL=chunk-
|
|
181
|
+
//# sourceMappingURL=chunk-MEBQKYH4.js.map
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PillControl
|
|
3
|
+
} from "./chunk-NPPJ3IJP.js";
|
|
1
4
|
import {
|
|
2
5
|
RangeBounds
|
|
3
6
|
} from "./chunk-44USLRMT.js";
|
|
@@ -7,9 +10,6 @@ import {
|
|
|
7
10
|
import {
|
|
8
11
|
useDataViewsCopy
|
|
9
12
|
} from "./chunk-KHG57NAE.js";
|
|
10
|
-
import {
|
|
11
|
-
MultiSelectDropdown
|
|
12
|
-
} from "./chunk-3XS37SQT.js";
|
|
13
13
|
import {
|
|
14
14
|
default as default2
|
|
15
15
|
} from "./chunk-6DPAWXZ3.js";
|
|
@@ -33,43 +33,41 @@ import {
|
|
|
33
33
|
import Checkbox from "@mui/material/Checkbox/index.js";
|
|
34
34
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
35
35
|
var INLINE_OPTION_LIMIT = 2;
|
|
36
|
+
function sharesBarControl(field) {
|
|
37
|
+
const pill = field.pill;
|
|
38
|
+
if (!pill) return false;
|
|
39
|
+
return pill.control === "category" || pill.control === "multiselect" || pill.searchEnabled === true || pill.options.length > INLINE_OPTION_LIMIT;
|
|
40
|
+
}
|
|
36
41
|
function OverflowPill({
|
|
37
42
|
field,
|
|
38
43
|
values,
|
|
39
|
-
|
|
44
|
+
onTogglePill,
|
|
40
45
|
onClear,
|
|
41
46
|
testIdPrefix
|
|
42
47
|
}) {
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
if (options.length > INLINE_OPTION_LIMIT) {
|
|
48
|
+
const testId = `${testIdPrefix}-more-${field.id}`;
|
|
49
|
+
if (field.pill && sharesBarControl(field)) {
|
|
46
50
|
return /* @__PURE__ */ jsx(
|
|
47
|
-
|
|
51
|
+
PillControl,
|
|
48
52
|
{
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
onClear,
|
|
57
|
-
allLabel: copy.filters.allOption,
|
|
58
|
-
searchable: options.length > 6 ? true : void 0,
|
|
59
|
-
searchPlaceholder: copy.filters.optionSearchPlaceholder,
|
|
60
|
-
noResultsLabel: copy.filters.optionsEmpty,
|
|
61
|
-
layout: "pill",
|
|
62
|
-
"data-testid": `${testIdPrefix}-more-${field.id}`
|
|
53
|
+
fieldId: field.id,
|
|
54
|
+
pill: field.pill,
|
|
55
|
+
selected: values,
|
|
56
|
+
onTogglePill,
|
|
57
|
+
onClearField: onClear,
|
|
58
|
+
testIdPrefix,
|
|
59
|
+
testId
|
|
63
60
|
}
|
|
64
61
|
);
|
|
65
62
|
}
|
|
63
|
+
const onToggle = (value, checked) => onTogglePill(field.id, value, checked);
|
|
66
64
|
return /* @__PURE__ */ jsx(default2, { sx: { display: "flex", flexWrap: "wrap", gap: 0.75 }, children: (field.pill?.options ?? []).map((option) => {
|
|
67
65
|
const checked = values.includes(option.value);
|
|
68
66
|
return /* @__PURE__ */ jsxs(
|
|
69
67
|
default2,
|
|
70
68
|
{
|
|
71
69
|
component: "label",
|
|
72
|
-
"data-testid": `${
|
|
70
|
+
"data-testid": `${testId}-${option.value}`,
|
|
73
71
|
sx: {
|
|
74
72
|
display: "inline-flex",
|
|
75
73
|
alignItems: "center",
|
|
@@ -181,7 +179,7 @@ function MoreGroup({
|
|
|
181
179
|
{
|
|
182
180
|
field,
|
|
183
181
|
values: pills[field.id] ?? [],
|
|
184
|
-
|
|
182
|
+
onTogglePill,
|
|
185
183
|
onClear: () => (pills[field.id] ?? []).forEach((v) => onTogglePill(field.id, v, false)),
|
|
186
184
|
testIdPrefix
|
|
187
185
|
}
|
|
@@ -201,4 +199,4 @@ export {
|
|
|
201
199
|
fieldClearing,
|
|
202
200
|
MoreGroup
|
|
203
201
|
};
|
|
204
|
-
//# sourceMappingURL=chunk-
|
|
202
|
+
//# sourceMappingURL=chunk-NOLSQK4J.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/data-display/DataViews/data-views-more-fields.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * ONE FIELD, RENDERED INSIDE THE \"MAIS\" PANEL.\n *\n * Split from `data-views-more-filters` at the file-size gate, along the seam\n * that was already there: that module is the trigger, the panel and its\n * footer — the chrome — and this is what goes in it.\n *\n * A field with one or two options renders FLAT: inside a panel there is no\n * space to win back, and two labelled checkboxes are faster than a dropdown\n * needing a second click. Past that — or whenever the field asks for a tree or\n * a search — it is the bar's own {@link PillControl}; see `sharesBarControl`.\n */\nimport Checkbox from \"@mui/material/Checkbox/index.js\";\n\nimport { Box } from \"../../../mui/Box\";\nimport { Text } from \"../../typography/Text\";\n\nimport { PillControl } from \"./data-views-category-pill\";\nimport type { OverflowField } from \"./data-views-overflow\";\nimport { RangeBounds } from \"./data-views-range-pill\";\nimport { isRangeSet } from \"./data-views-range-values\";\nimport type { RangeValue } from \"./data-views-types\";\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { fieldRadiusPx } from \"../../../tokens/field-radius\";\nimport { fieldHeight } from \"../../../tokens/field-height\";\nimport { fieldEdge } from \"../../../tokens/field-edge\";\nimport { sxRem } from \"../../../tokens/relative\";\n\n/** What each field's control needs, minus the panel's own chrome. */\nexport interface MoreFieldProps {\n pills: Record<string, string[]>;\n ranges: Record<string, RangeValue>;\n onTogglePill: (fieldId: string, value: string, checked: boolean) => void;\n onChangeRange: (fieldId: string, range: RangeValue) => void;\n testIdPrefix: string;\n}\n\n/**\n * Above this many options a field is a DROPDOWN rather than a flat row of\n * checkboxes. Two options cost two lines and read faster laid out; a \"Cliente\"\n * with a dozen turns the panel into a scrolling wall and buries every field\n * under it, which is exactly what the overflow was meant to avoid.\n */\nconst INLINE_OPTION_LIMIT = 2;\n\n/**\n * Whether an overflowed pill keeps the SAME control it has on the bar.\n *\n * The panel used to build its own flat dropdown for every field past two\n * options, so a field's config only held while it fitted: `control:\n * \"category\"` lost its tree (subcategories flattened into one list, no\n * \"Marcar tudo\", no count footer) and `searchEnabled` lost its search, on\n * exactly the phone widths where most filters live in here. Anything the bar\n * would render as a dropdown now renders as the bar's own {@link PillControl};\n * only a plain two-option field — one that did not ask for a dropdown, a tree\n * or a search — stays a flat checkbox row, which is a panel layout rather than\n * a different control (the filter panel draws the same line).\n */\nfunction sharesBarControl<T extends Record<string, unknown>>(field: OverflowField<T>): boolean {\n const pill = field.pill;\n if (!pill) return false;\n return (\n pill.control === \"category\" ||\n pill.control === \"multiselect\" ||\n pill.searchEnabled === true ||\n pill.options.length > INLINE_OPTION_LIMIT\n );\n}\n\n/** One overflowed pill: the bar's control, or its options as checkboxes. */\nfunction OverflowPill<T extends Record<string, unknown>>({\n field,\n values,\n onTogglePill,\n onClear,\n testIdPrefix,\n}: {\n field: OverflowField<T>;\n values: string[];\n onTogglePill: (fieldId: string, value: string, checked: boolean) => void;\n onClear: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const testId = `${testIdPrefix}-more-${field.id}`;\n if (field.pill && sharesBarControl(field)) {\n return (\n <PillControl\n fieldId={field.id}\n pill={field.pill}\n selected={values}\n onTogglePill={onTogglePill}\n onClearField={onClear}\n testIdPrefix={testIdPrefix}\n testId={testId}\n />\n );\n }\n const onToggle = (value: string, checked: boolean) => onTogglePill(field.id, value, checked);\n return (\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 0.75 }}>\n {(field.pill?.options ?? []).map((option) => {\n const checked = values.includes(option.value);\n return (\n <Box\n key={option.value}\n component=\"label\"\n data-testid={`${testId}-${option.value}`}\n sx={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 0.25,\n pr: 1,\n border: 1,\n borderStyle: \"solid\",\n minHeight: fieldHeight,\n borderColor: (theme) => (checked ? theme.palette.primary.main : fieldEdge(theme)),\n bgcolor: checked ? \"action.selected\" : \"transparent\",\n borderRadius: fieldRadiusPx,\n cursor: \"pointer\",\n fontSize: sxRem(13),\n color: checked ? \"primary.main\" : \"text.secondary\",\n }}\n >\n <Checkbox\n size=\"small\"\n checked={checked}\n onChange={(event) => onToggle(option.value, event.target.checked)}\n inputProps={{ \"aria-label\": `${field.label}: ${option.label}` }}\n />\n {option.label}\n </Box>\n );\n })}\n </Box>\n );\n}\n\n\n/**\n * One overflowed range: its presets and its two bounds, as the same controls\n * the pill uses.\n *\n * The whole control DELEGATES to {@link RangeBounds} rather than being built\n * here, which is the point — this panel used to render a raw\n * `<input type=\"date\">`, so the masked `dd/mm/aaaa` field existed only while\n * the filter FITTED on the bar. The moment \"Data\" overflowed it reverted to the\n * native control the mask replaced, and a merchant on a narrow screen never saw\n * the fix at all (FUT-744). `Valor` had the twin bug: a bare `type=\"number\"`\n * plus `Number(raw)` dropped the decimal comma this panel is meant to accept.\n *\n * That also retires the intrinsic-width workaround this pair used to need — a\n * native date input reports a wide minimum (its own mask plus the picker\n * glyph), which is what made two of them refuse to shrink and scrolled the\n * panel sideways. A text input has no such minimum.\n *\n * `RangeBounds` renders the preset chips ITSELF, above the inputs. This panel\n * must NOT render its own row as well: when the delegation above landed, the\n * chips it used to draw by hand stayed behind, and \"Data\" showed Hoje/Ontem/\n * Esta semana/Este mês/Este ano twice — two rows, duplicated test ids, and half\n * the panel's height spent saying the same thing (FUT-751).\n */\nfunction OverflowRange<T extends Record<string, unknown>>({\n field,\n value,\n onChange,\n testIdPrefix,\n}: {\n field: OverflowField<T>;\n value: RangeValue;\n onChange: (range: RangeValue) => void;\n testIdPrefix: string;\n}): React.JSX.Element | null {\n // `group === \"range\"` is what selects this component, so `range` is always\n // set; the guard is for the type, not for a state the caller can reach.\n if (!field.range) return null;\n return (\n <RangeBounds\n field={field.range}\n value={value}\n onChange={onChange}\n testId={`${testIdPrefix}-more-${field.id}`}\n />\n );\n}\n\n/**\n * Whether a field has anything applied, and how to unapply it — the two shapes\n * (a pill's selected values, a range's bounds) answered in one place so the\n * group that renders them stays a renderer.\n */\nexport function fieldClearing<T extends Record<string, unknown>>({\n field,\n pills,\n ranges,\n onTogglePill,\n onChangeRange,\n}: {\n field: OverflowField<T>;\n} & Pick<MoreFieldProps, \"pills\" | \"ranges\" | \"onTogglePill\" | \"onChangeRange\">): {\n applied: boolean;\n clear: () => void;\n} {\n if (field.group === \"range\") {\n return {\n applied: isRangeSet(ranges[field.id] ?? {}),\n clear: () => onChangeRange(field.id, {}),\n };\n }\n const values = pills[field.id] ?? [];\n return {\n applied: values.length > 0,\n clear: () => values.forEach((value) => onTogglePill(field.id, value, false)),\n };\n}\n\n\n/** One labelled group in the panel: the field's name, then its control. */\nexport function MoreGroup<T extends Record<string, unknown>>({\n field,\n pills,\n ranges,\n onTogglePill,\n onChangeRange,\n testIdPrefix,\n}: {\n field: OverflowField<T>;\n} & MoreFieldProps): React.JSX.Element {\n const copy = useDataViewsCopy();\n const { applied, clear } = fieldClearing({ field, pills, ranges, onTogglePill, onChangeRange });\n return (\n <Box sx={{ mb: 1.5, \"&:last-of-type\": { mb: 0 } }}>\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1, mb: 0.5 }}>\n <Text variant=\"caption\" as=\"span\">\n <Box component=\"span\" sx={{ color: \"text.secondary\" }}>\n {field.label}\n {field.group === \"range\" && isRangeSet(ranges[field.id] ?? {}) ? \" •\" : \"\"}\n </Box>\n </Text>\n {/* The panel's equivalent of the pill's ✕. Without it a field applied\n in here could only be cleared by finding it again on the bar —\n which is where it goes the moment it becomes active, so the\n operator has to close this panel to undo what they just did. */}\n {applied && (\n <Box\n component=\"button\"\n type=\"button\"\n onClick={clear}\n data-testid={`${testIdPrefix}-more-${field.id}-clear`}\n sx={{\n ml: \"auto\",\n border: 0,\n p: 0,\n bgcolor: \"transparent\",\n cursor: \"pointer\",\n font: \"inherit\",\n fontSize: sxRem(12),\n color: \"primary.main\",\n \"&:hover\": { textDecoration: \"underline\" },\n }}\n >\n {copy.filters.clear}\n </Box>\n )}\n </Box>\n {field.group === \"pill\" ? (\n <OverflowPill\n field={field}\n values={pills[field.id] ?? []}\n onTogglePill={onTogglePill}\n onClear={() => (pills[field.id] ?? []).forEach((v) => onTogglePill(field.id, v, false))}\n testIdPrefix={testIdPrefix}\n />\n ) : (\n <OverflowRange\n field={field}\n value={ranges[field.id] ?? {}}\n onChange={(range) => onChangeRange(field.id, range)}\n testIdPrefix={testIdPrefix}\n />\n )}\n </Box>\n );\n}\n\n"],"mappings":"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","names":["default"]}
|
|
@@ -33,10 +33,10 @@ function PillControl({
|
|
|
33
33
|
onClearField,
|
|
34
34
|
onOpenChange,
|
|
35
35
|
testIdPrefix,
|
|
36
|
+
testId = `${testIdPrefix}-filter-${fieldId}`,
|
|
36
37
|
layout = "pill"
|
|
37
38
|
}) {
|
|
38
39
|
const copy = useDataViewsCopy();
|
|
39
|
-
const testId = `${testIdPrefix}-filter-${fieldId}`;
|
|
40
40
|
if (pill.control === "category") {
|
|
41
41
|
return /* @__PURE__ */ jsx(
|
|
42
42
|
CategorySelect,
|
|
@@ -79,4 +79,4 @@ export {
|
|
|
79
79
|
emitPillDiff,
|
|
80
80
|
PillControl
|
|
81
81
|
};
|
|
82
|
-
//# sourceMappingURL=chunk-
|
|
82
|
+
//# sourceMappingURL=chunk-NPPJ3IJP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/data-display/DataViews/data-views-category-pill.tsx"],"sourcesContent":["\"use client\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { CategorySelect } from \"../../form/CategorySelect\";\nimport { MultiSelectDropdown } from \"../../layout/ContentToolbar\";\n\nimport type { FilterFieldConfig, FilterOption } from \"./data-views-types\";\n\n/**\n * Diff a whole-array selection back into per-value toggles.\n *\n * The filter state's only channel is `onTogglePill(field, value, checked)`, but\n * a tree hands back the entire selection at once. Diffing here keeps that one\n * channel the single way a pill ever changes, rather than giving the\n * hierarchical control a private path into the state.\n */\nexport function emitPillDiff(\n fieldId: string,\n before: readonly string[],\n after: readonly string[],\n onTogglePill: (fieldId: string, value: string, checked: boolean) => void,\n): void {\n const had = new Set(before);\n const wants = new Set(after);\n after.forEach((value) => {\n if (!had.has(value)) onTogglePill(fieldId, value, true);\n });\n before.forEach((value) => {\n if (!wants.has(value)) onTogglePill(fieldId, value, false);\n });\n}\n\n/** A filter option as the category tree wants it. */\nconst toCategoryOption = (option: FilterOption) => ({\n id: option.value,\n name: option.label,\n parentId: option.parentId ?? null,\n});\n\ninterface PillControlProps<T extends Record<string, unknown>> {\n fieldId: string;\n pill: FilterFieldConfig<T>;\n selected: string[];\n onTogglePill: (fieldId: string, value: string, checked: boolean) => void;\n onClearField: (fieldId: string) => void;\n onOpenChange?: (open: boolean) => void;\n testIdPrefix: string;\n /**\n * Overrides the `<prefix>-filter-<id>` test id — the \"Mais\" panel keys its\n * fields `<prefix>-more-<id>` so a spec can tell which surface it drove.\n */\n testId?: string;\n /** `stacked` in the filter panel, `pill` on the inline bar. */\n layout?: \"stacked\" | \"pill\";\n}\n\n/**\n * One filter pill: the hierarchical category tree, or the flat multi-select.\n *\n * A category set nests, and flattening it into one list is what made \"Massas\"\n * (mercearia) indistinguishable from \"Massas\" (pratos principais). `control:\n * \"category\"` opts a field into the tree, which shows each hit under its parent.\n *\n * {@link FilterFieldConfig.allowParentSelection} decides whether a parent row is\n * itself tickable. It is forwarded rather than fixed here because it is a\n * per-SCREEN question: a filter over a catalogue where products sit on leaves\n * wants \"the whole category\" as one click, while one whose parents are pure\n * grouping would only offer a tick that means nothing.\n */\nexport function PillControl<T extends Record<string, unknown>>({\n fieldId,\n pill,\n selected,\n onTogglePill,\n onClearField,\n onOpenChange,\n testIdPrefix,\n testId = `${testIdPrefix}-filter-${fieldId}`,\n layout = \"pill\",\n}: PillControlProps<T>): React.JSX.Element {\n const copy = useDataViewsCopy();\n if (pill.control === \"category\") {\n return (\n <CategorySelect\n copy={copy.categorySelect}\n placeholder={pill.label}\n label={layout === \"stacked\" ? pill.label : undefined}\n fullWidth={layout === \"stacked\"}\n options={pill.options.map(toCategoryOption)}\n allowParentSelection={pill.allowParentSelection ?? false}\n value={selected}\n onChange={(next) => emitPillDiff(fieldId, selected, next, onTogglePill)}\n dataTestId={testId}\n />\n );\n }\n return (\n <MultiSelectDropdown\n extraOptionsHeading={copy.filters.optionsHeading}\n clearText={copy.filters.clear}\n clearLabel={copy.filters.clearRange(pill.label)}\n label={pill.label}\n options={pill.options}\n selected={new Set(selected)}\n onToggle={(value, checked) => onTogglePill(fieldId, value, checked)}\n onClear={() => onClearField(fieldId)}\n allLabel={copy.filters.allOption}\n searchable={pill.searchEnabled ? true : undefined}\n searchPlaceholder={copy.filters.optionSearchPlaceholder}\n noResultsLabel={copy.filters.optionsEmpty}\n layout={layout}\n onOpenChange={onOpenChange}\n data-testid={testId}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;AAmFM;AAnEC,SAAS,aACd,SACA,QACA,OACA,cACM;AACN,QAAM,MAAM,IAAI,IAAI,MAAM;AAC1B,QAAM,QAAQ,IAAI,IAAI,KAAK;AAC3B,QAAM,QAAQ,CAAC,UAAU;AACvB,QAAI,CAAC,IAAI,IAAI,KAAK,EAAG,cAAa,SAAS,OAAO,IAAI;AAAA,EACxD,CAAC;AACD,SAAO,QAAQ,CAAC,UAAU;AACxB,QAAI,CAAC,MAAM,IAAI,KAAK,EAAG,cAAa,SAAS,OAAO,KAAK;AAAA,EAC3D,CAAC;AACH;AAGA,IAAM,mBAAmB,CAAC,YAA0B;AAAA,EAClD,IAAI,OAAO;AAAA,EACX,MAAM,OAAO;AAAA,EACb,UAAU,OAAO,YAAY;AAC/B;AAgCO,SAAS,YAA+C;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,GAAG,YAAY,WAAW,OAAO;AAAA,EAC1C,SAAS;AACX,GAA2C;AACzC,QAAM,OAAO,iBAAiB;AAC9B,MAAI,KAAK,YAAY,YAAY;AAC/B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,OAAO,WAAW,YAAY,KAAK,QAAQ;AAAA,QAC3C,WAAW,WAAW;AAAA,QACtB,SAAS,KAAK,QAAQ,IAAI,gBAAgB;AAAA,QAC1C,sBAAsB,KAAK,wBAAwB;AAAA,QACnD,OAAO;AAAA,QACP,UAAU,CAAC,SAAS,aAAa,SAAS,UAAU,MAAM,YAAY;AAAA,QACtE,YAAY;AAAA;AAAA,IACd;AAAA,EAEJ;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,qBAAqB,KAAK,QAAQ;AAAA,MAClC,WAAW,KAAK,QAAQ;AAAA,MACxB,YAAY,KAAK,QAAQ,WAAW,KAAK,KAAK;AAAA,MAC9C,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,MACd,UAAU,IAAI,IAAI,QAAQ;AAAA,MAC1B,UAAU,CAAC,OAAO,YAAY,aAAa,SAAS,OAAO,OAAO;AAAA,MAClE,SAAS,MAAM,aAAa,OAAO;AAAA,MACnC,UAAU,KAAK,QAAQ;AAAA,MACvB,YAAY,KAAK,gBAAgB,OAAO;AAAA,MACxC,mBAAmB,KAAK,QAAQ;AAAA,MAChC,gBAAgB,KAAK,QAAQ;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,eAAa;AAAA;AAAA,EACf;AAEJ;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MoreGroup,
|
|
3
3
|
fieldClearing
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-NOLSQK4J.js";
|
|
5
5
|
import {
|
|
6
6
|
useDataViewsCopy
|
|
7
7
|
} from "./chunk-KHG57NAE.js";
|
|
@@ -184,4 +184,4 @@ function MoreFilters({
|
|
|
184
184
|
export {
|
|
185
185
|
MoreFilters
|
|
186
186
|
};
|
|
187
|
-
//# sourceMappingURL=chunk-
|
|
187
|
+
//# sourceMappingURL=chunk-TJ3334AJ.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
GridShell
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-HFVYWHJT.js";
|
|
4
4
|
import {
|
|
5
5
|
useDataViewsState
|
|
6
6
|
} from "./chunk-HKBJZX3C.js";
|
|
@@ -27,4 +27,4 @@ function DataViewsGrid(props) {
|
|
|
27
27
|
export {
|
|
28
28
|
DataViewsGrid
|
|
29
29
|
};
|
|
30
|
-
//# sourceMappingURL=chunk-
|
|
30
|
+
//# sourceMappingURL=chunk-UT73NGRS.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DataViewsTableBase
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-MEBQKYH4.js";
|
|
4
4
|
import {
|
|
5
5
|
DataViewsGrid
|
|
6
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-UT73NGRS.js";
|
|
7
7
|
import {
|
|
8
8
|
BaseCard
|
|
9
9
|
} from "../chunk-4S2LWZ7L.js";
|
|
@@ -22,22 +22,22 @@ import {
|
|
|
22
22
|
useDragItem
|
|
23
23
|
} from "../chunk-K4EKTMTC.js";
|
|
24
24
|
import "../chunk-ZOLAYP2D.js";
|
|
25
|
-
import "../chunk-
|
|
26
|
-
import "../chunk-
|
|
25
|
+
import "../chunk-HFVYWHJT.js";
|
|
26
|
+
import "../chunk-BKZERHNC.js";
|
|
27
27
|
import "../chunk-3UEZ6NUI.js";
|
|
28
|
-
import "../chunk-
|
|
28
|
+
import "../chunk-DH77PLFF.js";
|
|
29
29
|
import "../chunk-BM4KKGL7.js";
|
|
30
|
-
import "../chunk-VWJEM2ER.js";
|
|
31
30
|
import "../chunk-KW3H5FUS.js";
|
|
32
31
|
import "../chunk-LODMNSLR.js";
|
|
33
32
|
import {
|
|
34
33
|
DataViewsBoard
|
|
35
34
|
} from "../chunk-4XHVGUOM.js";
|
|
36
35
|
import "../chunk-BA6Z52QN.js";
|
|
37
|
-
import "../chunk-
|
|
36
|
+
import "../chunk-6QYKZMEE.js";
|
|
38
37
|
import "../chunk-DNT5PZLF.js";
|
|
39
|
-
import "../chunk-
|
|
40
|
-
import "../chunk-
|
|
38
|
+
import "../chunk-TJ3334AJ.js";
|
|
39
|
+
import "../chunk-NOLSQK4J.js";
|
|
40
|
+
import "../chunk-NPPJ3IJP.js";
|
|
41
41
|
import "../chunk-4UVFPORR.js";
|
|
42
42
|
import "../chunk-6N2EDWMG.js";
|
|
43
43
|
import "../chunk-O5UGAL2V.js";
|
|
@@ -2,8 +2,8 @@ import "../chunk-2LXHUGYB.js";
|
|
|
2
2
|
import {
|
|
3
3
|
Autocomplete,
|
|
4
4
|
Autocomplete_default
|
|
5
|
-
} from "../chunk-
|
|
6
|
-
import "../chunk-
|
|
5
|
+
} from "../chunk-IUD6N52Q.js";
|
|
6
|
+
import "../chunk-BR2T72JI.js";
|
|
7
7
|
import "../chunk-PELRSZFU.js";
|
|
8
8
|
import "../chunk-XBLFK2FL.js";
|
|
9
9
|
import "../chunk-JXS56EW5.js";
|
|
@@ -16,6 +16,11 @@ interface PillControlProps<T extends Record<string, unknown>> {
|
|
|
16
16
|
onClearField: (fieldId: string) => void;
|
|
17
17
|
onOpenChange?: (open: boolean) => void;
|
|
18
18
|
testIdPrefix: string;
|
|
19
|
+
/**
|
|
20
|
+
* Overrides the `<prefix>-filter-<id>` test id — the "Mais" panel keys its
|
|
21
|
+
* fields `<prefix>-more-<id>` so a spec can tell which surface it drove.
|
|
22
|
+
*/
|
|
23
|
+
testId?: string;
|
|
19
24
|
/** `stacked` in the filter panel, `pill` on the inline bar. */
|
|
20
25
|
layout?: "stacked" | "pill";
|
|
21
26
|
}
|
|
@@ -32,6 +37,6 @@ interface PillControlProps<T extends Record<string, unknown>> {
|
|
|
32
37
|
* wants "the whole category" as one click, while one whose parents are pure
|
|
33
38
|
* grouping would only offer a tick that means nothing.
|
|
34
39
|
*/
|
|
35
|
-
export declare function PillControl<T extends Record<string, unknown>>({ fieldId, pill, selected, onTogglePill, onClearField, onOpenChange, testIdPrefix, layout, }: PillControlProps<T>): React.JSX.Element;
|
|
40
|
+
export declare function PillControl<T extends Record<string, unknown>>({ fieldId, pill, selected, onTogglePill, onClearField, onOpenChange, testIdPrefix, testId, layout, }: PillControlProps<T>): React.JSX.Element;
|
|
36
41
|
export {};
|
|
37
42
|
//# sourceMappingURL=data-views-category-pill.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-views-category-pill.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/DataViews/data-views-category-pill.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAgB,MAAM,oBAAoB,CAAC;AAE1E;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GACvE,IAAI,CASN;AASD,UAAU,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACzE,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC7D,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,MAAe,GAChB,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"data-views-category-pill.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/DataViews/data-views-category-pill.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAgB,MAAM,oBAAoB,CAAC;AAE1E;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GACvE,IAAI,CASN;AASD,UAAU,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACzE,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC7D,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,MAA4C,EAC5C,MAAe,GAChB,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAoCzC"}
|
|
@@ -8,17 +8,6 @@ export interface MoreFieldProps {
|
|
|
8
8
|
onChangeRange: (fieldId: string, range: RangeValue) => void;
|
|
9
9
|
testIdPrefix: string;
|
|
10
10
|
}
|
|
11
|
-
/**
|
|
12
|
-
* The trigger, badged with how many fields had no room on the bar — and told
|
|
13
|
-
* apart when some of them are APPLIED.
|
|
14
|
-
*
|
|
15
|
-
* An applied filter can land in here now (it is ranked first, not exempt), so
|
|
16
|
-
* this button is the only thing on screen still saying it exists. A neutral
|
|
17
|
-
* badge reading "3" would make "three filters you have not used" and "three
|
|
18
|
-
* filters narrowing this list" look identical, which is the whole failure the
|
|
19
|
-
* old exemption was written to avoid. So an overflow holding applied filters
|
|
20
|
-
* takes the applied tone and counts them in its own badge.
|
|
21
|
-
|
|
22
11
|
/**
|
|
23
12
|
* Whether a field has anything applied, and how to unapply it — the two shapes
|
|
24
13
|
* (a pill's selected values, a range's bounds) answered in one place so the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-views-more-fields.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/DataViews/data-views-more-fields.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAOrD,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACzE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAC5D,YAAY,EAAE,MAAM,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"data-views-more-fields.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/DataViews/data-views-more-fields.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAOrD,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACzE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAC5D,YAAY,EAAE,MAAM,CAAC;CACtB;AAsJD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/D,KAAK,EACL,KAAK,EACL,MAAM,EACN,YAAY,EACZ,aAAa,GACd,EAAE;IACD,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;CACzB,GAAG,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,QAAQ,GAAG,cAAc,GAAG,eAAe,CAAC,GAAG;IAChF,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAYA;AAGD,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC3D,KAAK,EACL,KAAK,EACL,MAAM,EACN,YAAY,EACZ,aAAa,EACb,YAAY,GACb,EAAE;IACD,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;CACzB,GAAG,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAwDrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-views-overflow.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/DataViews/data-views-overflow.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE1F;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,2EAA2E;AAC3E,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC9D,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;CAC7B;AAED,mEAAmE;AACnE,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC9D,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3B,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7B;;;OAGG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;;;OAOG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;;OAMG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB;;;;;;OAMG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB,gDAAgD;IAChD,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;CAChD;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAC9B,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,GACjC,aAAa,CAAC,CAAC,CAAC,EAAE,CAKpB;AA4MD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC;AAClC;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAQ;AACd,iEAAiE;AACjE,SAAS,UAAO,GACf,aAAa,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"data-views-overflow.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/DataViews/data-views-overflow.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE1F;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,2EAA2E;AAC3E,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC9D,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;CAC7B;AAED,mEAAmE;AACnE,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC9D,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3B,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7B;;;OAGG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;;;OAOG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;;OAMG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB;;;;;;OAMG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB,gDAAgD;IAChD,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;CAChD;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAC9B,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,GACjC,aAAa,CAAC,CAAC,CAAC,EAAE,CAKpB;AA4MD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC;AAClC;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAQ;AACd,iEAAiE;AACjE,SAAS,UAAO,GACf,aAAa,CAAC,CAAC,CAAC,CAiClB"}
|
|
@@ -20,6 +20,15 @@ interface AutocompleteState<T> {
|
|
|
20
20
|
setJustCompletedGhost: Setter<boolean>;
|
|
21
21
|
userClosedDropdown: boolean;
|
|
22
22
|
setUserClosedDropdown: Setter<boolean>;
|
|
23
|
+
/**
|
|
24
|
+
* Mirrors `userClosedDropdown`, set synchronously wherever the state is
|
|
25
|
+
* (see {@link setDeliberateClose}). An effect scheduled by one render and
|
|
26
|
+
* flushed after a LATER render has already changed this flag reads a
|
|
27
|
+
* stale, closed-over `userClosedDropdown` — but `.current` on a ref is
|
|
28
|
+
* dereferenced live, so it always reflects the latest write regardless of
|
|
29
|
+
* which render's closure is doing the reading (FUT-2780).
|
|
30
|
+
*/
|
|
31
|
+
userClosedDropdownRef: React.RefObject<boolean>;
|
|
23
32
|
inputRef: React.RefObject<HTMLInputElement | null>;
|
|
24
33
|
listRef: React.RefObject<HTMLUListElement | null>;
|
|
25
34
|
debounceRef: React.RefObject<number | undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAutocomplete.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/Autocomplete/useAutocomplete.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,KAAK,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAEzD,8DAA8D;AAC9D,UAAU,iBAAiB,CAAC,CAAC;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,mBAAmB,EAAE,CAAC,EAAE,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IACpC,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACvC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACvC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACnD,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAClD,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CAClD;
|
|
1
|
+
{"version":3,"file":"useAutocomplete.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/Autocomplete/useAutocomplete.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,KAAK,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAEzD,8DAA8D;AAC9D,UAAU,iBAAiB,CAAC,CAAC;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,mBAAmB,EAAE,CAAC,EAAE,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IACpC,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACvC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACvC;;;;;;;OAOG;IACH,qBAAqB,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAChD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACnD,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAClD,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CAClD;AAyOD,gEAAgE;AAChE,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5B,kBAAkB,EAAE,CAAC,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IAC9B,kBAAkB,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC9D,aAAa,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAChE,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,4FAA4F;AAC5F,wBAAgB,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAiE/E"}
|
package/package.json
CHANGED
|
@@ -45,6 +45,11 @@ interface PillControlProps<T extends Record<string, unknown>> {
|
|
|
45
45
|
onClearField: (fieldId: string) => void;
|
|
46
46
|
onOpenChange?: (open: boolean) => void;
|
|
47
47
|
testIdPrefix: string;
|
|
48
|
+
/**
|
|
49
|
+
* Overrides the `<prefix>-filter-<id>` test id — the "Mais" panel keys its
|
|
50
|
+
* fields `<prefix>-more-<id>` so a spec can tell which surface it drove.
|
|
51
|
+
*/
|
|
52
|
+
testId?: string;
|
|
48
53
|
/** `stacked` in the filter panel, `pill` on the inline bar. */
|
|
49
54
|
layout?: "stacked" | "pill";
|
|
50
55
|
}
|
|
@@ -70,10 +75,10 @@ export function PillControl<T extends Record<string, unknown>>({
|
|
|
70
75
|
onClearField,
|
|
71
76
|
onOpenChange,
|
|
72
77
|
testIdPrefix,
|
|
78
|
+
testId = `${testIdPrefix}-filter-${fieldId}`,
|
|
73
79
|
layout = "pill",
|
|
74
80
|
}: PillControlProps<T>): React.JSX.Element {
|
|
75
81
|
const copy = useDataViewsCopy();
|
|
76
|
-
const testId = `${testIdPrefix}-filter-${fieldId}`;
|
|
77
82
|
if (pill.control === "category") {
|
|
78
83
|
return (
|
|
79
84
|
<CategorySelect
|
|
@@ -9,15 +9,15 @@
|
|
|
9
9
|
*
|
|
10
10
|
* A field with one or two options renders FLAT: inside a panel there is no
|
|
11
11
|
* space to win back, and two labelled checkboxes are faster than a dropdown
|
|
12
|
-
* needing a second click. Past that
|
|
13
|
-
* see `
|
|
12
|
+
* needing a second click. Past that — or whenever the field asks for a tree or
|
|
13
|
+
* a search — it is the bar's own {@link PillControl}; see `sharesBarControl`.
|
|
14
14
|
*/
|
|
15
15
|
import Checkbox from "@mui/material/Checkbox/index.js";
|
|
16
16
|
|
|
17
|
-
import { MultiSelectDropdown } from "../../layout/ContentToolbar";
|
|
18
17
|
import { Box } from "../../../mui/Box";
|
|
19
18
|
import { Text } from "../../typography/Text";
|
|
20
19
|
|
|
20
|
+
import { PillControl } from "./data-views-category-pill";
|
|
21
21
|
import type { OverflowField } from "./data-views-overflow";
|
|
22
22
|
import { RangeBounds } from "./data-views-range-pill";
|
|
23
23
|
import { isRangeSet } from "./data-views-range-values";
|
|
@@ -45,42 +45,59 @@ export interface MoreFieldProps {
|
|
|
45
45
|
*/
|
|
46
46
|
const INLINE_OPTION_LIMIT = 2;
|
|
47
47
|
|
|
48
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* Whether an overflowed pill keeps the SAME control it has on the bar.
|
|
50
|
+
*
|
|
51
|
+
* The panel used to build its own flat dropdown for every field past two
|
|
52
|
+
* options, so a field's config only held while it fitted: `control:
|
|
53
|
+
* "category"` lost its tree (subcategories flattened into one list, no
|
|
54
|
+
* "Marcar tudo", no count footer) and `searchEnabled` lost its search, on
|
|
55
|
+
* exactly the phone widths where most filters live in here. Anything the bar
|
|
56
|
+
* would render as a dropdown now renders as the bar's own {@link PillControl};
|
|
57
|
+
* only a plain two-option field — one that did not ask for a dropdown, a tree
|
|
58
|
+
* or a search — stays a flat checkbox row, which is a panel layout rather than
|
|
59
|
+
* a different control (the filter panel draws the same line).
|
|
60
|
+
*/
|
|
61
|
+
function sharesBarControl<T extends Record<string, unknown>>(field: OverflowField<T>): boolean {
|
|
62
|
+
const pill = field.pill;
|
|
63
|
+
if (!pill) return false;
|
|
64
|
+
return (
|
|
65
|
+
pill.control === "category" ||
|
|
66
|
+
pill.control === "multiselect" ||
|
|
67
|
+
pill.searchEnabled === true ||
|
|
68
|
+
pill.options.length > INLINE_OPTION_LIMIT
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** One overflowed pill: the bar's control, or its options as checkboxes. */
|
|
49
73
|
function OverflowPill<T extends Record<string, unknown>>({
|
|
50
74
|
field,
|
|
51
75
|
values,
|
|
52
|
-
|
|
76
|
+
onTogglePill,
|
|
53
77
|
onClear,
|
|
54
78
|
testIdPrefix,
|
|
55
79
|
}: {
|
|
56
80
|
field: OverflowField<T>;
|
|
57
81
|
values: string[];
|
|
58
|
-
|
|
82
|
+
onTogglePill: (fieldId: string, value: string, checked: boolean) => void;
|
|
59
83
|
onClear: () => void;
|
|
60
84
|
testIdPrefix: string;
|
|
61
85
|
}): React.JSX.Element {
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
if (options.length > INLINE_OPTION_LIMIT) {
|
|
86
|
+
const testId = `${testIdPrefix}-more-${field.id}`;
|
|
87
|
+
if (field.pill && sharesBarControl(field)) {
|
|
65
88
|
return (
|
|
66
|
-
<
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
onClear={onClear}
|
|
75
|
-
allLabel={copy.filters.allOption}
|
|
76
|
-
searchable={options.length > 6 ? true : undefined}
|
|
77
|
-
searchPlaceholder={copy.filters.optionSearchPlaceholder}
|
|
78
|
-
noResultsLabel={copy.filters.optionsEmpty}
|
|
79
|
-
layout="pill"
|
|
80
|
-
data-testid={`${testIdPrefix}-more-${field.id}`}
|
|
89
|
+
<PillControl
|
|
90
|
+
fieldId={field.id}
|
|
91
|
+
pill={field.pill}
|
|
92
|
+
selected={values}
|
|
93
|
+
onTogglePill={onTogglePill}
|
|
94
|
+
onClearField={onClear}
|
|
95
|
+
testIdPrefix={testIdPrefix}
|
|
96
|
+
testId={testId}
|
|
81
97
|
/>
|
|
82
98
|
);
|
|
83
99
|
}
|
|
100
|
+
const onToggle = (value: string, checked: boolean) => onTogglePill(field.id, value, checked);
|
|
84
101
|
return (
|
|
85
102
|
<Box sx={{ display: "flex", flexWrap: "wrap", gap: 0.75 }}>
|
|
86
103
|
{(field.pill?.options ?? []).map((option) => {
|
|
@@ -89,7 +106,7 @@ function OverflowPill<T extends Record<string, unknown>>({
|
|
|
89
106
|
<Box
|
|
90
107
|
key={option.value}
|
|
91
108
|
component="label"
|
|
92
|
-
data-testid={`${
|
|
109
|
+
data-testid={`${testId}-${option.value}`}
|
|
93
110
|
sx={{
|
|
94
111
|
display: "inline-flex",
|
|
95
112
|
alignItems: "center",
|
|
@@ -168,17 +185,6 @@ function OverflowRange<T extends Record<string, unknown>>({
|
|
|
168
185
|
);
|
|
169
186
|
}
|
|
170
187
|
|
|
171
|
-
/**
|
|
172
|
-
* The trigger, badged with how many fields had no room on the bar — and told
|
|
173
|
-
* apart when some of them are APPLIED.
|
|
174
|
-
*
|
|
175
|
-
* An applied filter can land in here now (it is ranked first, not exempt), so
|
|
176
|
-
* this button is the only thing on screen still saying it exists. A neutral
|
|
177
|
-
* badge reading "3" would make "three filters you have not used" and "three
|
|
178
|
-
* filters narrowing this list" look identical, which is the whole failure the
|
|
179
|
-
* old exemption was written to avoid. So an overflow holding applied filters
|
|
180
|
-
* takes the applied tone and counts them in its own badge.
|
|
181
|
-
|
|
182
188
|
/**
|
|
183
189
|
* Whether a field has anything applied, and how to unapply it — the two shapes
|
|
184
190
|
* (a pill's selected values, a range's bounds) answered in one place so the
|
|
@@ -262,7 +268,7 @@ export function MoreGroup<T extends Record<string, unknown>>({
|
|
|
262
268
|
<OverflowPill
|
|
263
269
|
field={field}
|
|
264
270
|
values={pills[field.id] ?? []}
|
|
265
|
-
|
|
271
|
+
onTogglePill={onTogglePill}
|
|
266
272
|
onClear={() => (pills[field.id] ?? []).forEach((v) => onTogglePill(field.id, v, false))}
|
|
267
273
|
testIdPrefix={testIdPrefix}
|
|
268
274
|
/>
|
|
@@ -361,5 +361,16 @@ export function useFilterOverflow<T extends Record<string, unknown>>(
|
|
|
361
361
|
if (cache.current === null || (!frozen && cache.current.signature !== signature)) {
|
|
362
362
|
cache.current = { signature, split: computeSplit(all, pills, ranges, width, hasExport, theme) };
|
|
363
363
|
}
|
|
364
|
-
|
|
364
|
+
// The cache holds the ARRANGEMENT — which ids sit on the bar, which in "Mais"
|
|
365
|
+
// — never the fields themselves. The signature keys on ids, so a field whose
|
|
366
|
+
// options arrive after the first measurement (a category list still loading)
|
|
367
|
+
// does not re-split, and handing back the cached objects served the empty
|
|
368
|
+
// list for good: "Categoria" in "Mais" rendered a label with no control under
|
|
369
|
+
// it (FUT-2828). Re-reading each field from `all` keeps the slots and the
|
|
370
|
+
// current config.
|
|
371
|
+
const { split } = cache.current;
|
|
372
|
+
const current = new Map(all.map((field) => [field.id, field]));
|
|
373
|
+
const fresh = (fields: OverflowField<T>[]): OverflowField<T>[] =>
|
|
374
|
+
fields.map((field) => current.get(field.id) ?? field);
|
|
375
|
+
return { ...split, inline: fresh(split.inline), overflow: fresh(split.overflow), barRef };
|
|
365
376
|
}
|