@planningcenter/tapestry 4.10.0-rc.8 → 4.10.0
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/components/DataTable/ActiveFilterInstance.d.ts +6 -4
- package/dist/components/DataTable/ActiveFilterInstance.d.ts.map +1 -1
- package/dist/components/DataTable/ActiveFilterInstance.js +8 -2
- package/dist/components/DataTable/ActiveFilterInstance.js.map +1 -1
- package/dist/components/DataTable/ActiveFilters.d.ts.map +1 -1
- package/dist/components/DataTable/ActiveFilters.js +3 -1
- package/dist/components/DataTable/ActiveFilters.js.map +1 -1
- package/dist/components/DataTable/CollectionEditorsLazy.d.ts.map +1 -1
- package/dist/components/DataTable/CollectionEditorsLazy.js +7 -5
- package/dist/components/DataTable/CollectionEditorsLazy.js.map +1 -1
- package/dist/components/DataTable/CollectionEditorsShared.d.ts.map +1 -1
- package/dist/components/DataTable/CollectionEditorsShared.js +1 -5
- package/dist/components/DataTable/CollectionEditorsShared.js.map +1 -1
- package/dist/components/DataTable/CollectionEditorsStatic.d.ts +1 -1
- package/dist/components/DataTable/CollectionEditorsStatic.d.ts.map +1 -1
- package/dist/components/DataTable/CollectionEditorsStatic.js +8 -17
- package/dist/components/DataTable/CollectionEditorsStatic.js.map +1 -1
- package/dist/components/DataTable/DataTable.d.ts +3 -1
- package/dist/components/DataTable/DataTable.d.ts.map +1 -1
- package/dist/components/DataTable/DataTable.js +22 -13
- package/dist/components/DataTable/DataTable.js.map +1 -1
- package/dist/components/DataTable/FilterChip.d.ts +4 -3
- package/dist/components/DataTable/FilterChip.d.ts.map +1 -1
- package/dist/components/DataTable/FilterChip.js +24 -3
- package/dist/components/DataTable/FilterChip.js.map +1 -1
- package/dist/components/DataTable/FilterControls.d.ts.map +1 -1
- package/dist/components/DataTable/FilterControls.js +1 -1
- package/dist/components/DataTable/FilterControls.js.map +1 -1
- package/dist/components/DataTable/FilterTypes.d.ts +32 -8
- package/dist/components/DataTable/FilterTypes.d.ts.map +1 -1
- package/dist/components/DataTable/FocusFirstControl.d.ts +11 -0
- package/dist/components/DataTable/FocusFirstControl.d.ts.map +1 -0
- package/dist/components/DataTable/FocusFirstControl.js +31 -0
- package/dist/components/DataTable/FocusFirstControl.js.map +1 -0
- package/dist/components/DataTable/TableSearch.d.ts.map +1 -1
- package/dist/components/DataTable/TableSearch.js +1 -1
- package/dist/components/DataTable/TableSearch.js.map +1 -1
- package/dist/components/DataTable/collectionFilter.d.ts +14 -8
- package/dist/components/DataTable/collectionFilter.d.ts.map +1 -1
- package/dist/components/DataTable/collectionFilter.js +9 -5
- package/dist/components/DataTable/collectionFilter.js.map +1 -1
- package/dist/components/DataTable/dateFilter.d.ts +7 -3
- package/dist/components/DataTable/dateFilter.d.ts.map +1 -1
- package/dist/components/DataTable/dateFilter.js +9 -14
- package/dist/components/DataTable/dateFilter.js.map +1 -1
- package/dist/components/DataTable/dayFilter.d.ts +4 -3
- package/dist/components/DataTable/dayFilter.d.ts.map +1 -1
- package/dist/components/DataTable/dayFilter.js +11 -12
- package/dist/components/DataTable/dayFilter.js.map +1 -1
- package/dist/components/DataTable/filterKeys.d.ts +1 -1
- package/dist/components/DataTable/filterKeys.d.ts.map +1 -1
- package/dist/components/DataTable/index.d.ts +8 -3
- package/dist/components/DataTable/index.d.ts.map +1 -1
- package/dist/components/DataTable/numberFilter.d.ts +16 -3
- package/dist/components/DataTable/numberFilter.d.ts.map +1 -1
- package/dist/components/DataTable/numberFilter.js +41 -13
- package/dist/components/DataTable/numberFilter.js.map +1 -1
- package/dist/components/DataTable/presenceFilter.d.ts +4 -1
- package/dist/components/DataTable/presenceFilter.d.ts.map +1 -1
- package/dist/components/DataTable/presenceFilter.js +3 -3
- package/dist/components/DataTable/presenceFilter.js.map +1 -1
- package/dist/components/DataTable/scopedFilter.d.ts +2 -0
- package/dist/components/DataTable/scopedFilter.d.ts.map +1 -1
- package/dist/components/DataTable/scopedFilter.js +6 -3
- package/dist/components/DataTable/scopedFilter.js.map +1 -1
- package/dist/components/DataTable/textFilter.d.ts +3 -1
- package/dist/components/DataTable/textFilter.d.ts.map +1 -1
- package/dist/components/DataTable/textFilter.js +5 -9
- package/dist/components/DataTable/textFilter.js.map +1 -1
- package/dist/components/DataTable/useSearchFilter.d.ts +1 -1
- package/dist/components/DataTable/utils.d.ts +1 -0
- package/dist/components/DataTable/utils.d.ts.map +1 -1
- package/dist/components/DataTable/utils.js +1 -1
- package/dist/components/DataTable/utils.js.map +1 -1
- package/dist/components/segmented-control/IconSegment.d.ts +6 -1
- package/dist/components/segmented-control/IconSegment.d.ts.map +1 -1
- package/dist/components/segmented-control/IconSegment.js +1 -1
- package/dist/components/segmented-control/IconSegment.js.map +1 -1
- package/dist/components/segmented-control/Segment.d.ts +6 -1
- package/dist/components/segmented-control/Segment.d.ts.map +1 -1
- package/dist/components/segmented-control/Segment.js +1 -1
- package/dist/components/segmented-control/Segment.js.map +1 -1
- package/dist/components/segmented-control/SegmentBase.d.ts +1 -5
- package/dist/components/segmented-control/SegmentBase.d.ts.map +1 -1
- package/dist/components/segmented-control/SegmentBase.js.map +1 -1
- package/dist/components/segmented-control/SegmentedControl.d.ts +3 -9
- package/dist/components/segmented-control/SegmentedControl.d.ts.map +1 -1
- package/dist/components/segmented-control/SegmentedControl.js +3 -9
- package/dist/components/segmented-control/SegmentedControl.js.map +1 -1
- package/dist/components/segmented-control/index.d.ts +1 -0
- package/dist/components/segmented-control/index.d.ts.map +1 -1
- package/dist/index.css +155 -0
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/reactRender.css +2182 -2002
- package/dist/reactRender.css.map +1 -1
- package/dist/reactRenderLegacy.css +2182 -2002
- package/dist/reactRenderLegacy.css.map +1 -1
- package/dist/unstable.css +210 -30
- package/dist/unstable.css.map +1 -1
- package/dist/unstable.d.ts +0 -1
- package/dist/unstable.d.ts.map +1 -1
- package/dist/unstable.js +3 -3
- package/package.json +2 -2
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import type React from "react";
|
|
2
|
-
import type { FilterChange, FilterNodeItem, Operator } from "./FilterTypes";
|
|
2
|
+
import type { FilterChange, FilterChipSegment, FilterNodeItem, Operator } from "./FilterTypes";
|
|
3
3
|
export declare abstract class ActiveFilterInstance<T = unknown> {
|
|
4
4
|
readonly filter: FilterNodeItem;
|
|
5
5
|
readonly operator: Operator;
|
|
6
6
|
readonly value: T;
|
|
7
7
|
constructor(filter: FilterNodeItem, operator: Operator, value: T);
|
|
8
8
|
get isCompleteWithoutInput(): boolean;
|
|
9
|
-
toSegments():
|
|
10
|
-
abstract formatValue(): string
|
|
11
|
-
|
|
9
|
+
toSegments(): FilterChipSegment[];
|
|
10
|
+
abstract formatValue(): string;
|
|
11
|
+
/** How many items the value lists, shown when a multi-item value is truncated. */
|
|
12
|
+
get valueCount(): number;
|
|
13
|
+
toValueSegments(): FilterChipSegment[];
|
|
12
14
|
abstract renderEditor(onChange: FilterChange): React.ReactNode;
|
|
13
15
|
}
|
|
14
16
|
//# sourceMappingURL=ActiveFilterInstance.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActiveFilterInstance.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/ActiveFilterInstance.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"ActiveFilterInstance.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/ActiveFilterInstance.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACT,MAAM,eAAe,CAAA;AAGtB,8BAAsB,oBAAoB,CAAC,CAAC,GAAG,OAAO;IAElD,QAAQ,CAAC,MAAM,EAAE,cAAc;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAFR,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,CAAC;IAGnB,IAAI,sBAAsB,IAAI,OAAO,CAEpC;IAED,UAAU,IAAI,iBAAiB,EAAE;IAOjC,QAAQ,CAAC,WAAW,IAAI,MAAM;IAE9B,kFAAkF;IAClF,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,eAAe,IAAI,iBAAiB,EAAE;IAOtC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,KAAK,CAAC,SAAS;CAC/D"}
|
|
@@ -18,10 +18,16 @@ class ActiveFilterInstance {
|
|
|
18
18
|
? [this.filter.label, label, ...this.toValueSegments()]
|
|
19
19
|
: [this.filter.label, ...this.toValueSegments()];
|
|
20
20
|
}
|
|
21
|
+
/** How many items the value lists, shown when a multi-item value is truncated. */
|
|
22
|
+
get valueCount() {
|
|
23
|
+
return 1;
|
|
24
|
+
}
|
|
21
25
|
toValueSegments() {
|
|
22
26
|
const value = this.formatValue();
|
|
23
|
-
|
|
24
|
-
|
|
27
|
+
if (isEmptyValue(value))
|
|
28
|
+
return [];
|
|
29
|
+
const count = this.valueCount > 1 ? this.valueCount : undefined;
|
|
30
|
+
return [{ count, kind: "value", label: value }];
|
|
25
31
|
}
|
|
26
32
|
}
|
|
27
33
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActiveFilterInstance.js","sources":["../../../src/components/DataTable/ActiveFilterInstance.tsx"],"sourcesContent":["import type React from \"react\"\n\nimport type {
|
|
1
|
+
{"version":3,"file":"ActiveFilterInstance.js","sources":["../../../src/components/DataTable/ActiveFilterInstance.tsx"],"sourcesContent":["import type React from \"react\"\n\nimport type {\n FilterChange,\n FilterChipSegment,\n FilterNodeItem,\n Operator,\n} from \"./FilterTypes\"\nimport { isEmptyValue } from \"./utils\"\n\nexport abstract class ActiveFilterInstance<T = unknown> {\n constructor(\n readonly filter: FilterNodeItem,\n readonly operator: Operator,\n readonly value: T\n ) {}\n\n get isCompleteWithoutInput(): boolean {\n return false\n }\n\n toSegments(): FilterChipSegment[] {\n const { label } = this.operator\n return label\n ? [this.filter.label, label, ...this.toValueSegments()]\n : [this.filter.label, ...this.toValueSegments()]\n }\n\n abstract formatValue(): string\n\n /** How many items the value lists, shown when a multi-item value is truncated. */\n get valueCount(): number {\n return 1\n }\n\n toValueSegments(): FilterChipSegment[] {\n const value = this.formatValue()\n if (isEmptyValue(value)) return []\n const count = this.valueCount > 1 ? this.valueCount : undefined\n return [{ count, kind: \"value\", label: value }]\n }\n\n abstract renderEditor(onChange: FilterChange): React.ReactNode\n}\n"],"names":[],"mappings":";;MAUsB,oBAAoB,CAAA;AAE7B,IAAA,MAAA;AACA,IAAA,QAAA;AACA,IAAA,KAAA;AAHX,IAAA,WAAA,CACW,MAAsB,EACtB,QAAkB,EAClB,KAAQ,EAAA;QAFR,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,KAAK,GAAL,KAAK;IACb;AAEH,IAAA,IAAI,sBAAsB,GAAA;AACxB,QAAA,OAAO,KAAK;IACd;IAEA,UAAU,GAAA;AACR,QAAA,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,QAAQ;AAC/B,QAAA,OAAO;AACL,cAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE;AACtD,cAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;IACpD;;AAKA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,CAAC;IACV;IAEA,eAAe,GAAA;AACb,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;QAChC,IAAI,YAAY,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;AAClC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,SAAS;AAC/D,QAAA,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACjD;AAGD;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActiveFilters.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/ActiveFilters.tsx"],"names":[],"mappings":"AAMA,OAAO,KAMN,MAAM,OAAO,CAAA;AAad,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"ActiveFilters.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/ActiveFilters.tsx"],"names":[],"mappings":"AAMA,OAAO,KAMN,MAAM,OAAO,CAAA;AAad,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAQ/D,wBAAgB,aAAa,CAAC,EAC5B,aAAa,EACb,UAAU,EACV,qBAAqB,EACrB,OAAyC,GAC1C,EAAE;IACD,aAAa,EAAE,YAAY,EAAE,CAAA;IAC7B,4CAA4C;IAC5C,UAAU,EAAE,OAAO,CAAA;IACnB,qBAAqB,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,KAAK,IAAI,CAAA;IAC9D,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,qBAgKA;AAsBD,iBAAS,YAAY,CAAC,EACpB,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,kBAAkB,EAClB,OAAe,EACf,UAAkB,GACnB,EAAE;IACD,YAAY,EAAE,YAAY,CAAA;IAC1B,QAAQ,EAAE,YAAY,CAAA;IACtB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,kBAAkB,EAAE,MAAM,IAAI,CAAA;IAC9B,uEAAuE;IACvE,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,qBA4FA"}
|
|
@@ -11,6 +11,7 @@ import { FilterChip, FilterChipSegments, FilterChipStaticSegments } from './Filt
|
|
|
11
11
|
import { useRestoreFilterFocus, useRelatedFilterOperator } from './FilterContext.js';
|
|
12
12
|
import { getFilterKey, keepFilterKey, getFilterSequence } from './filterKeys.js';
|
|
13
13
|
import { useFilterOpenRequest, useRequestedOpen } from './FilterOpenRequest.js';
|
|
14
|
+
import { FocusFirstControl } from './FocusFirstControl.js';
|
|
14
15
|
import { OperatorSelect } from './OperatorSelect.js';
|
|
15
16
|
import { usePendingFilters } from './PendingFilterContext.js';
|
|
16
17
|
|
|
@@ -181,7 +182,8 @@ function ActiveFilter({ activeFilter, onChange, onOpened, removeActiveFilter, pe
|
|
|
181
182
|
React__default.createElement(OperatorSelect, { operator: operator, relatedFilter: relatedFilter, updateActiveFilter: (updates) => onChange(updates, {
|
|
182
183
|
complete: relatedFilter.createActiveFilterInstance({ ...activeFilter, ...updates }, relatedFilter.operators.find(({ name }) => name === updates.operator) ?? operator).isCompleteWithoutInput,
|
|
183
184
|
}) }),
|
|
184
|
-
editor
|
|
185
|
+
editor,
|
|
186
|
+
React__default.createElement(FocusFirstControl, null))))));
|
|
185
187
|
}
|
|
186
188
|
|
|
187
189
|
export { ActiveFilters };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActiveFilters.js","sources":["../../../src/components/DataTable/ActiveFilters.tsx"],"sourcesContent":["import { Button } from \"@components/button\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@components/popover/Popover\"\nimport React, {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\"\n\nimport {\n FilterChip,\n FilterChipSegments,\n FilterChipStaticSegments,\n} from \"./FilterChip\"\nimport {\n useRelatedFilterOperator,\n useRestoreFilterFocus,\n} from \"./FilterContext\"\nimport { getFilterKey, getFilterSequence, keepFilterKey } from \"./filterKeys\"\nimport { useFilterOpenRequest, useRequestedOpen } from \"./FilterOpenRequest\"\nimport type { ActiveFilter, FilterChange } from \"./FilterTypes\"\nimport { OperatorSelect } from \"./OperatorSelect\"\nimport { usePendingFilters } from \"./PendingFilterContext\"\n\n/** A promoted filter the host may not have applied yet. */\ntype Promotion = { filter: ActiveFilter; index: number; key?: string }\n\nexport function ActiveFilters({\n activeFilters,\n hasFilters,\n onActiveFiltersChange,\n onClear = () => onActiveFiltersChange([]),\n}: {\n activeFilters: ActiveFilter[]\n /** Whether the filter schema has loaded. */\n hasFilters: boolean\n onActiveFiltersChange: (activeFilters: ActiveFilter[]) => void\n /** Called by the Clear button. Defaults to `onActiveFiltersChange([])`. */\n onClear?: () => void\n}) {\n const { pendingFilters, removePendingFilter, updatePendingFilter } =\n usePendingFilters()\n const restoreFilterFocus = useRestoreFilterFocus()\n const { clearFilterOpenRequest, filterOpenRequest } = useFilterOpenRequest()\n const [promotions, setPromotions] = useState<Promotion[]>([])\n\n // Keep each pending chip, and its open popover, mounted until the host\n // applies its promotion.\n const confirmed = useMemo(\n () =>\n promotions.flatMap((promotion) => {\n const promotedFilter = activeFilters[promotion.index]\n const pendingCopy =\n promotedFilter &&\n pendingFilters.find(\n (filter) => getFilterKey(filter) === promotion.key\n )\n if (!pendingCopy) return []\n keepFilterKey(pendingCopy, promotedFilter)\n return [{ pendingCopy, promotion }]\n }),\n [activeFilters, pendingFilters, promotions]\n )\n const pendingCopies = confirmed.map(({ pendingCopy }) => pendingCopy)\n\n useLayoutEffect(() => {\n if (confirmed.length === 0) return\n confirmed.forEach(({ pendingCopy }) => removePendingFilter(pendingCopy))\n const done = confirmed.map(({ promotion }) => promotion)\n setPromotions((prev) => prev.filter((p) => !done.includes(p)))\n }, [confirmed, removePendingFilter])\n\n // Hosts apply updates in order, so build each one on top of promotions they\n // haven't applied yet. A list without an entry supersedes one that had it.\n const inFlight = promotions.filter((p) => p.index >= activeFilters.length)\n const optimisticFilters = [...activeFilters, ...inFlight.map((p) => p.filter)]\n\n function sendWithout(index: number) {\n setPromotions((prev) =>\n prev\n .filter((p) => p.index !== index)\n .map((p) => (p.index > index ? { ...p, index: p.index - 1 } : p))\n )\n onActiveFiltersChange(optimisticFilters.filter((_, i) => i !== index))\n }\n\n function retractPromotion(filter: ActiveFilter) {\n const promotion = inFlight.find((p) => p.key === getFilterKey(filter))\n if (promotion) sendWithout(promotion.index)\n }\n\n function promote(filter: ActiveFilter, promoted: ActiveFilter) {\n const key = getFilterKey(filter)\n const existing = inFlight.find((p) => p.key === key)\n const index = existing?.index ?? optimisticFilters.length\n const next = [...optimisticFilters]\n next[index] = promoted\n setPromotions((prev) =>\n existing\n ? prev.map((p) => (p.key === key ? { ...p, filter: promoted } : p))\n : [...prev, { filter: promoted, index, key }]\n )\n onActiveFiltersChange(next)\n }\n\n // Hosts may return rebuilt, keyless filters (e.g. a JSON round trip). An\n // unchanged length means an edit, so carry keys over by position.\n const previousActiveFilters = useRef(activeFilters)\n if (activeFilters.length === previousActiveFilters.current.length) {\n activeFilters.forEach((filter, index) => {\n if (!getFilterKey(filter)) {\n keepFilterKey(previousActiveFilters.current[index], filter)\n }\n })\n }\n useLayoutEffect(() => {\n previousActiveFilters.current = activeFilters\n })\n\n // One list: React matches keys only within a list, so separate lists would\n // remount a promoted chip despite its stable key.\n const entries = inCreationOrder([\n ...activeFilters.map((filter, index) => ({\n filter,\n index,\n pending: false as const,\n })),\n ...pendingFilters\n .filter((filter) => !pendingCopies.includes(filter))\n .map((filter, index) => ({\n filter,\n index,\n pending: true as const,\n })),\n ])\n\n // Several chips can answer one request, but only one may act on it. A\n // request without a scope takes the first chip carrying the filter name.\n const openRequestSlot = filterOpenRequest\n ? entries.findIndex(\n ({ filter }) =>\n filter.name === filterOpenRequest.name &&\n (filterOpenRequest.scope === undefined ||\n filter.scope === filterOpenRequest.scope)\n )\n : -1\n\n return (\n <div className=\"tds-data-table-filters-active\">\n <div className=\"tds-data-table-filters-active-list\">\n {entries.map(({ filter, index, pending }, slot) => (\n <ActiveFilter\n key={\n getFilterKey(filter) ??\n `${pending ? \"pending\" : \"active\"}-${index}`\n }\n activeFilter={filter}\n onOpened={clearFilterOpenRequest}\n pending={pending}\n shouldOpen={slot === openRequestSlot}\n onChange={(updates, { complete = true } = {}) => {\n if (pending) {\n updatePendingFilter(filter, updates)\n if (complete) promote(filter, { ...filter, ...updates })\n else retractPromotion(filter)\n return\n }\n const next = [...optimisticFilters]\n next[index] = keepFilterKey(filter, { ...filter, ...updates })\n onActiveFiltersChange(next)\n }}\n removeActiveFilter={() => {\n if (pending) {\n removePendingFilter(filter)\n retractPromotion(filter)\n return\n }\n sendWithout(index)\n }}\n />\n ))}\n </div>\n <div className=\"tds-data-table-filters-active-actions\">\n <Button\n aria-label=\"Clear filters\"\n disabled={!hasFilters}\n kind=\"secondary\"\n label=\"Clear\"\n size=\"sm\"\n onClick={() => {\n setPromotions([])\n onClear()\n restoreFilterFocus()\n }}\n />\n {/* TODO: Save view button goes here */}\n </div>\n </div>\n )\n}\n\n// A promoted filter is appended to `activeFilters`, ahead of every pending\n// chip. Sorting keyed chips by creation order keeps it in place, so its open\n// popover stays anchored under it.\nfunction inCreationOrder<T extends { filter: ActiveFilter }>(entries: T[]) {\n const keyedSlots = entries.flatMap((entry, slot) =>\n getFilterSequence(entry.filter) === undefined ? [] : [slot]\n )\n const keyedEntries = keyedSlots\n .map((slot) => entries[slot])\n .sort(\n (a, b) =>\n (getFilterSequence(a.filter) ?? 0) - (getFilterSequence(b.filter) ?? 0)\n )\n const sorted = [...entries]\n keyedSlots.forEach((slot, i) => {\n sorted[slot] = keyedEntries[i]\n })\n return sorted\n}\n\nfunction ActiveFilter({\n activeFilter,\n onChange,\n onOpened,\n removeActiveFilter,\n pending = false,\n shouldOpen = false,\n}: {\n activeFilter: ActiveFilter\n onChange: FilterChange\n /** Called once this chip has acted on `shouldOpen`. */\n onOpened: () => void\n pending?: boolean\n removeActiveFilter: () => void\n /** Whether the add-filter menu asked this chip to open its popover. */\n shouldOpen?: boolean\n}) {\n const { relatedFilter, operator } = useRelatedFilterOperator(activeFilter)\n const activeFilterInstance =\n relatedFilter &&\n operator &&\n relatedFilter.createActiveFilterInstance(activeFilter, operator)\n const [isOpen, setIsOpen] = useRequestedOpen({\n initiallyOpen: pending,\n onOpened,\n shouldOpen,\n })\n\n const autoPromoted = useRef(false)\n useEffect(() => {\n if (\n !pending ||\n !activeFilterInstance?.isCompleteWithoutInput ||\n autoPromoted.current\n )\n return\n autoPromoted.current = true\n onChange({}, { complete: true })\n })\n\n if (!relatedFilter || !operator || !activeFilterInstance)\n return (\n <FilterChip\n label=\"Unrecognized filter\"\n onRemove={removeActiveFilter}\n status=\"invalid\"\n >\n <FilterChipSegments segments={[\"Unrecognized filter\"]} />\n </FilterChip>\n )\n\n const editor = activeFilterInstance.renderEditor(onChange)\n const segments = activeFilterInstance.toSegments()\n\n const isEditable = relatedFilter.operators.length > 1 || editor != null\n\n return (\n <FilterChip\n label={`${relatedFilter.label} filter${pending ? \" (pending)\" : \"\"}`}\n onRemove={removeActiveFilter}\n status={pending ? \"inactive\" : undefined}\n >\n {!isEditable ? (\n <FilterChipStaticSegments segments={segments} />\n ) : (\n <Popover open={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger>\n <FilterChipSegments segments={segments} />\n </PopoverTrigger>\n <PopoverContent\n className=\"tds-popover--data-table-filters-popover\"\n modal={false}\n >\n <h2 className=\"tds-data-table-filters-popover-label\">\n {relatedFilter.label}\n {relatedFilter.operators.length === 1 && (\n <span className=\"tds-data-table-filters-popover-label-operator\">\n {\" \"}\n {operator.label}\n </span>\n )}\n </h2>\n {relatedFilter.description && (\n <p className=\"tds-data-table-filters-popover-description\">\n {relatedFilter.description}\n </p>\n )}\n <OperatorSelect\n operator={operator}\n relatedFilter={relatedFilter}\n updateActiveFilter={(updates) =>\n onChange(updates, {\n complete: relatedFilter.createActiveFilterInstance(\n { ...activeFilter, ...updates },\n relatedFilter.operators.find(\n ({ name }) => name === updates.operator\n ) ?? operator\n ).isCompleteWithoutInput,\n })\n }\n />\n {editor}\n </PopoverContent>\n </Popover>\n )}\n </FilterChip>\n )\n}\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ActiveFilters.js","sources":["../../../src/components/DataTable/ActiveFilters.tsx"],"sourcesContent":["import { Button } from \"@components/button\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@components/popover/Popover\"\nimport React, {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\"\n\nimport {\n FilterChip,\n FilterChipSegments,\n FilterChipStaticSegments,\n} from \"./FilterChip\"\nimport {\n useRelatedFilterOperator,\n useRestoreFilterFocus,\n} from \"./FilterContext\"\nimport { getFilterKey, getFilterSequence, keepFilterKey } from \"./filterKeys\"\nimport { useFilterOpenRequest, useRequestedOpen } from \"./FilterOpenRequest\"\nimport type { ActiveFilter, FilterChange } from \"./FilterTypes\"\nimport { FocusFirstControl } from \"./FocusFirstControl\"\nimport { OperatorSelect } from \"./OperatorSelect\"\nimport { usePendingFilters } from \"./PendingFilterContext\"\n\n/** A promoted filter the host may not have applied yet. */\ntype Promotion = { filter: ActiveFilter; index: number; key?: string }\n\nexport function ActiveFilters({\n activeFilters,\n hasFilters,\n onActiveFiltersChange,\n onClear = () => onActiveFiltersChange([]),\n}: {\n activeFilters: ActiveFilter[]\n /** Whether the filter schema has loaded. */\n hasFilters: boolean\n onActiveFiltersChange: (activeFilters: ActiveFilter[]) => void\n /** Called by the Clear button. Defaults to `onActiveFiltersChange([])`. */\n onClear?: () => void\n}) {\n const { pendingFilters, removePendingFilter, updatePendingFilter } =\n usePendingFilters()\n const restoreFilterFocus = useRestoreFilterFocus()\n const { clearFilterOpenRequest, filterOpenRequest } = useFilterOpenRequest()\n const [promotions, setPromotions] = useState<Promotion[]>([])\n\n // Keep each pending chip, and its open popover, mounted until the host\n // applies its promotion.\n const confirmed = useMemo(\n () =>\n promotions.flatMap((promotion) => {\n const promotedFilter = activeFilters[promotion.index]\n const pendingCopy =\n promotedFilter &&\n pendingFilters.find(\n (filter) => getFilterKey(filter) === promotion.key\n )\n if (!pendingCopy) return []\n keepFilterKey(pendingCopy, promotedFilter)\n return [{ pendingCopy, promotion }]\n }),\n [activeFilters, pendingFilters, promotions]\n )\n const pendingCopies = confirmed.map(({ pendingCopy }) => pendingCopy)\n\n useLayoutEffect(() => {\n if (confirmed.length === 0) return\n confirmed.forEach(({ pendingCopy }) => removePendingFilter(pendingCopy))\n const done = confirmed.map(({ promotion }) => promotion)\n setPromotions((prev) => prev.filter((p) => !done.includes(p)))\n }, [confirmed, removePendingFilter])\n\n // Hosts apply updates in order, so build each one on top of promotions they\n // haven't applied yet. A list without an entry supersedes one that had it.\n const inFlight = promotions.filter((p) => p.index >= activeFilters.length)\n const optimisticFilters = [...activeFilters, ...inFlight.map((p) => p.filter)]\n\n function sendWithout(index: number) {\n setPromotions((prev) =>\n prev\n .filter((p) => p.index !== index)\n .map((p) => (p.index > index ? { ...p, index: p.index - 1 } : p))\n )\n onActiveFiltersChange(optimisticFilters.filter((_, i) => i !== index))\n }\n\n function retractPromotion(filter: ActiveFilter) {\n const promotion = inFlight.find((p) => p.key === getFilterKey(filter))\n if (promotion) sendWithout(promotion.index)\n }\n\n function promote(filter: ActiveFilter, promoted: ActiveFilter) {\n const key = getFilterKey(filter)\n const existing = inFlight.find((p) => p.key === key)\n const index = existing?.index ?? optimisticFilters.length\n const next = [...optimisticFilters]\n next[index] = promoted\n setPromotions((prev) =>\n existing\n ? prev.map((p) => (p.key === key ? { ...p, filter: promoted } : p))\n : [...prev, { filter: promoted, index, key }]\n )\n onActiveFiltersChange(next)\n }\n\n // Hosts may return rebuilt, keyless filters (e.g. a JSON round trip). An\n // unchanged length means an edit, so carry keys over by position.\n const previousActiveFilters = useRef(activeFilters)\n if (activeFilters.length === previousActiveFilters.current.length) {\n activeFilters.forEach((filter, index) => {\n if (!getFilterKey(filter)) {\n keepFilterKey(previousActiveFilters.current[index], filter)\n }\n })\n }\n useLayoutEffect(() => {\n previousActiveFilters.current = activeFilters\n })\n\n // One list: React matches keys only within a list, so separate lists would\n // remount a promoted chip despite its stable key.\n const entries = inCreationOrder([\n ...activeFilters.map((filter, index) => ({\n filter,\n index,\n pending: false as const,\n })),\n ...pendingFilters\n .filter((filter) => !pendingCopies.includes(filter))\n .map((filter, index) => ({\n filter,\n index,\n pending: true as const,\n })),\n ])\n\n // Several chips can answer one request, but only one may act on it. A\n // request without a scope takes the first chip carrying the filter name.\n const openRequestSlot = filterOpenRequest\n ? entries.findIndex(\n ({ filter }) =>\n filter.name === filterOpenRequest.name &&\n (filterOpenRequest.scope === undefined ||\n filter.scope === filterOpenRequest.scope)\n )\n : -1\n\n return (\n <div className=\"tds-data-table-filters-active\">\n <div className=\"tds-data-table-filters-active-list\">\n {entries.map(({ filter, index, pending }, slot) => (\n <ActiveFilter\n key={\n getFilterKey(filter) ??\n `${pending ? \"pending\" : \"active\"}-${index}`\n }\n activeFilter={filter}\n onOpened={clearFilterOpenRequest}\n pending={pending}\n shouldOpen={slot === openRequestSlot}\n onChange={(updates, { complete = true } = {}) => {\n if (pending) {\n updatePendingFilter(filter, updates)\n if (complete) promote(filter, { ...filter, ...updates })\n else retractPromotion(filter)\n return\n }\n const next = [...optimisticFilters]\n next[index] = keepFilterKey(filter, { ...filter, ...updates })\n onActiveFiltersChange(next)\n }}\n removeActiveFilter={() => {\n if (pending) {\n removePendingFilter(filter)\n retractPromotion(filter)\n return\n }\n sendWithout(index)\n }}\n />\n ))}\n </div>\n <div className=\"tds-data-table-filters-active-actions\">\n <Button\n aria-label=\"Clear filters\"\n disabled={!hasFilters}\n kind=\"secondary\"\n label=\"Clear\"\n size=\"sm\"\n onClick={() => {\n setPromotions([])\n onClear()\n restoreFilterFocus()\n }}\n />\n {/* TODO: Save view button goes here */}\n </div>\n </div>\n )\n}\n\n// A promoted filter is appended to `activeFilters`, ahead of every pending\n// chip. Sorting keyed chips by creation order keeps it in place, so its open\n// popover stays anchored under it.\nfunction inCreationOrder<T extends { filter: ActiveFilter }>(entries: T[]) {\n const keyedSlots = entries.flatMap((entry, slot) =>\n getFilterSequence(entry.filter) === undefined ? [] : [slot]\n )\n const keyedEntries = keyedSlots\n .map((slot) => entries[slot])\n .sort(\n (a, b) =>\n (getFilterSequence(a.filter) ?? 0) - (getFilterSequence(b.filter) ?? 0)\n )\n const sorted = [...entries]\n keyedSlots.forEach((slot, i) => {\n sorted[slot] = keyedEntries[i]\n })\n return sorted\n}\n\nfunction ActiveFilter({\n activeFilter,\n onChange,\n onOpened,\n removeActiveFilter,\n pending = false,\n shouldOpen = false,\n}: {\n activeFilter: ActiveFilter\n onChange: FilterChange\n /** Called once this chip has acted on `shouldOpen`. */\n onOpened: () => void\n pending?: boolean\n removeActiveFilter: () => void\n /** Whether the add-filter menu asked this chip to open its popover. */\n shouldOpen?: boolean\n}) {\n const { relatedFilter, operator } = useRelatedFilterOperator(activeFilter)\n const activeFilterInstance =\n relatedFilter &&\n operator &&\n relatedFilter.createActiveFilterInstance(activeFilter, operator)\n const [isOpen, setIsOpen] = useRequestedOpen({\n initiallyOpen: pending,\n onOpened,\n shouldOpen,\n })\n\n const autoPromoted = useRef(false)\n useEffect(() => {\n if (\n !pending ||\n !activeFilterInstance?.isCompleteWithoutInput ||\n autoPromoted.current\n )\n return\n autoPromoted.current = true\n onChange({}, { complete: true })\n })\n\n if (!relatedFilter || !operator || !activeFilterInstance)\n return (\n <FilterChip\n label=\"Unrecognized filter\"\n onRemove={removeActiveFilter}\n status=\"invalid\"\n >\n <FilterChipSegments segments={[\"Unrecognized filter\"]} />\n </FilterChip>\n )\n\n const editor = activeFilterInstance.renderEditor(onChange)\n const segments = activeFilterInstance.toSegments()\n\n const isEditable = relatedFilter.operators.length > 1 || editor != null\n\n return (\n <FilterChip\n label={`${relatedFilter.label} filter${pending ? \" (pending)\" : \"\"}`}\n onRemove={removeActiveFilter}\n status={pending ? \"inactive\" : undefined}\n >\n {!isEditable ? (\n <FilterChipStaticSegments segments={segments} />\n ) : (\n <Popover open={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger>\n <FilterChipSegments segments={segments} />\n </PopoverTrigger>\n <PopoverContent\n className=\"tds-popover--data-table-filters-popover\"\n modal={false}\n >\n <h2 className=\"tds-data-table-filters-popover-label\">\n {relatedFilter.label}\n {relatedFilter.operators.length === 1 && (\n <span className=\"tds-data-table-filters-popover-label-operator\">\n {\" \"}\n {operator.label}\n </span>\n )}\n </h2>\n {relatedFilter.description && (\n <p className=\"tds-data-table-filters-popover-description\">\n {relatedFilter.description}\n </p>\n )}\n <OperatorSelect\n operator={operator}\n relatedFilter={relatedFilter}\n updateActiveFilter={(updates) =>\n onChange(updates, {\n complete: relatedFilter.createActiveFilterInstance(\n { ...activeFilter, ...updates },\n relatedFilter.operators.find(\n ({ name }) => name === updates.operator\n ) ?? operator\n ).isCompleteWithoutInput,\n })\n }\n />\n {editor}\n <FocusFirstControl />\n </PopoverContent>\n </Popover>\n )}\n </FilterChip>\n )\n}\n"],"names":["React"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionEditorsLazy.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/CollectionEditorsLazy.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAgD,MAAM,OAAO,CAAA;AAGpE,OAAO,KAAK,EACV,2BAA2B,EAG5B,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"CollectionEditorsLazy.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/CollectionEditorsLazy.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAgD,MAAM,OAAO,CAAA;AAGpE,OAAO,KAAK,EACV,2BAA2B,EAG5B,MAAM,2BAA2B,CAAA;AAuBlC,wBAAgB,0BAA0B,CAAC,EACzC,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,MAAM,EACN,KAAK,EACL,KAAK,GACN,EAAE,2BAA2B,qBA6C7B;AAyFD,wBAAgB,OAAO,sBAOtB;AAED,wBAAgB,SAAS,sBAMxB"}
|
|
@@ -6,6 +6,7 @@ import React__default, { useCallback, useState, useEffect } from 'react';
|
|
|
6
6
|
import styles from './CollectionEditorsLazy.module.css.js';
|
|
7
7
|
import { CollectionEditorCombobox } from './CollectionEditorsShared.js';
|
|
8
8
|
import { CollectionEditorCheckboxes, CollectionEditorRadios, CollectionEditorSelect } from './CollectionEditorsStatic.js';
|
|
9
|
+
import { useFocusFirstControlAfterLoad } from './FocusFirstControl.js';
|
|
9
10
|
import { useLazyOptions } from './useLazyOptions.js';
|
|
10
11
|
import { isEmptyValue } from './utils.js';
|
|
11
12
|
|
|
@@ -17,6 +18,7 @@ function CollectionFilterEditorLazy({ config, onChange, operator, value, filter,
|
|
|
17
18
|
const [query, setQuery] = useState();
|
|
18
19
|
const debouncedQuery = useDebouncedValue(query, DEBOUNCE_MS);
|
|
19
20
|
const { error, loading, options: resolvedOptions, } = useLazyOptions(options, debouncedQuery);
|
|
21
|
+
useFocusFirstControlAfterLoad(loading);
|
|
20
22
|
const onCommit = useCallback((newValue) => {
|
|
21
23
|
const newLabel = findLabelFromOptions(resolvedOptions, newValue, {
|
|
22
24
|
label,
|
|
@@ -24,16 +26,16 @@ function CollectionFilterEditorLazy({ config, onChange, operator, value, filter,
|
|
|
24
26
|
});
|
|
25
27
|
return onChange({ label: newLabel, value: newValue }, { complete: !isEmptyValue(newValue) });
|
|
26
28
|
}, [resolvedOptions, onChange, value, label]);
|
|
27
|
-
const Editor = getLazyEditor(
|
|
29
|
+
const Editor = getLazyEditor(display);
|
|
28
30
|
return (React__default.createElement(Editor, { error: error, loading: loading, query: query, setQuery: setQuery, value: value, onCommit: onCommit, options: resolvedOptions, multiple: multiple, operator: operator, filterLabel: filter.label, filterName: filter.name }));
|
|
29
31
|
}
|
|
30
|
-
function getLazyEditor(
|
|
32
|
+
function getLazyEditor(display) {
|
|
31
33
|
if (display === "combobox")
|
|
32
34
|
return CollectionEditorComboboxLazy;
|
|
33
|
-
if (multiple)
|
|
34
|
-
return CollectionEditorCheckboxesLazy;
|
|
35
35
|
if (display === "checkboxes")
|
|
36
|
-
return
|
|
36
|
+
return CollectionEditorCheckboxesLazy;
|
|
37
|
+
if (display === "radios")
|
|
38
|
+
return CollectionEditorRadiosLazy;
|
|
37
39
|
return CollectionEditorSelectLazy;
|
|
38
40
|
}
|
|
39
41
|
function CollectionEditorCheckboxesLazy({ error, loading, ...props }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionEditorsLazy.js","sources":["../../../src/components/DataTable/CollectionEditorsLazy.tsx"],"sourcesContent":["import { ComboBoxItem } from \"@components/combo-box\"\nimport { LoadingSpinner } from \"@components/internal\"\nimport { useDebouncedValue } from \"@utilities/useDebouncedValue\"\nimport React, { Key, useCallback, useEffect, useState } from \"react\"\n\nimport styles from \"./CollectionEditorsLazy.module.css\"\nimport type {\n CollectionFilterEditorProps,\n CollectionFilterValue,\n CollectionOptionsLazy,\n} from \"./CollectionEditorsShared\"\nimport { CollectionEditorCombobox } from \"./CollectionEditorsShared\"\nimport {\n CollectionEditorCheckboxes,\n CollectionEditorRadios,\n CollectionEditorSelect,\n CollectionEditorStaticProps,\n} from \"./CollectionEditorsStatic\"\nimport { CollectionOption } from \"./collectionFilter\"\nimport type { ActiveFilterLabel } from \"./FilterTypes\"\nimport { useLazyOptions } from \"./useLazyOptions\"\nimport { isEmptyValue } from \"./utils\"\n\ntype CollectionEditorLazyProps = CollectionEditorStaticProps & {\n error: unknown\n loading: boolean\n query: string | undefined\n setQuery: (query: string | undefined) => void\n}\n\nconst DEBOUNCE_MS = 300\n\nexport function CollectionFilterEditorLazy({\n config,\n onChange,\n operator,\n value,\n filter,\n label,\n scope,\n}: CollectionFilterEditorProps) {\n const { display, multiple } = config\n const loadOptions = config.options as CollectionOptionsLazy\n const options = useCallback(\n (query?: string) => loadOptions(query, scope),\n [loadOptions, scope]\n )\n const [query, setQuery] = useState<string | undefined>()\n const debouncedQuery = useDebouncedValue(query, DEBOUNCE_MS)\n const {\n error,\n loading,\n options: resolvedOptions,\n } = useLazyOptions(options, debouncedQuery)\n const onCommit = useCallback(\n (newValue: CollectionFilterValue) => {\n const newLabel = findLabelFromOptions(resolvedOptions, newValue, {\n label,\n value,\n })\n return onChange(\n { label: newLabel, value: newValue },\n { complete: !isEmptyValue(newValue) }\n )\n },\n [resolvedOptions, onChange, value, label]\n )\n const Editor = getLazyEditor({ display, multiple })\n\n return (\n <Editor\n error={error}\n loading={loading}\n query={query}\n setQuery={setQuery}\n value={value}\n onCommit={onCommit}\n options={resolvedOptions}\n multiple={multiple}\n operator={operator}\n filterLabel={filter.label}\n filterName={filter.name}\n />\n )\n}\n\nfunction getLazyEditor({\n display,\n multiple,\n}: {\n display: string\n multiple: boolean\n}) {\n if (display === \"combobox\") return CollectionEditorComboboxLazy\n if (multiple) return CollectionEditorCheckboxesLazy\n if (display === \"checkboxes\") return CollectionEditorRadiosLazy // TODO: This looks like it might be a mistake, should it be CollectionEditorCheckboxes? or at least allow for `radios` as an option?\n return CollectionEditorSelectLazy\n}\n\nfunction CollectionEditorCheckboxesLazy({\n error,\n loading,\n ...props\n}: CollectionEditorLazyProps) {\n if (loading) return <Loading />\n if (error) return <LoadError />\n return <CollectionEditorCheckboxes {...props} />\n}\n\nfunction CollectionEditorRadiosLazy({\n error,\n loading,\n ...props\n}: CollectionEditorLazyProps) {\n if (loading) return <Loading />\n if (error) return <LoadError />\n return <CollectionEditorRadios {...props} />\n}\n\nfunction CollectionEditorSelectLazy({\n error,\n loading,\n ...props\n}: CollectionEditorLazyProps) {\n if (loading) return <Loading />\n if (error) return <LoadError />\n return <CollectionEditorSelect {...props} />\n}\n\nfunction CollectionEditorComboboxLazy({\n error,\n onCommit,\n options,\n query,\n loading,\n setQuery,\n ...props\n}: CollectionEditorLazyProps) {\n const [loadingState, setLoadingState] = useState<\n \"loading\" | \"filtering\" | \"idle\"\n >(loading ? \"loading\" : \"idle\")\n useEffect(() => {\n if (!loading) {\n setLoadingState(\"idle\")\n }\n }, [loading])\n\n return (\n <CollectionEditorCombobox\n {...props}\n loadingState={error ? \"error\" : loadingState}\n inputValue={query}\n onInputChange={(q: string) => {\n setLoadingState(\"filtering\")\n setQuery(q)\n }}\n onChange={(value: Key | Key[] | null) => {\n if (value === null) return\n\n const resolvedValue = Array.isArray(value)\n ? value.map(String)\n : String(value)\n onCommit(resolvedValue)\n }}\n items={options}\n renderEmptyState={error ? <LoadError /> : \"No results\"}\n >\n {(o) => {\n const option = o as CollectionOption\n return (\n <ComboBoxItem key={option.value} id={option.value}>\n {option.label}\n </ComboBoxItem>\n )\n }}\n </CollectionEditorCombobox>\n )\n}\n\nexport function Loading() {\n return (\n <div className={styles[\"loading\"]} role=\"status\">\n <span>Loading...</span>\n <LoadingSpinner />\n </div>\n )\n}\n\nexport function LoadError() {\n return (\n <div className={styles[\"load-error\"]} role=\"alert\">\n Error: Failed to load options\n </div>\n )\n}\n\nfunction findLabelFromOptions(\n options: CollectionOption[],\n value: CollectionFilterValue,\n previous: { label?: ActiveFilterLabel; value: CollectionFilterValue }\n) {\n const previousLabelByValue = buildPreviousLabelByValue(previous)\n const labelFor = (v: string) =>\n options.find((option) => option.value === v)?.label ??\n previousLabelByValue.get(v)\n\n return Array.isArray(value)\n ? value.map(labelFor).filter((label) => label !== undefined)\n : labelFor(value)\n}\n\nfunction buildPreviousLabelByValue(previous: {\n label?: ActiveFilterLabel\n value: CollectionFilterValue\n}): Map<string, string | undefined> {\n const previousValues = normalizeValueToArray(previous.value)\n const previousLabels = normalizeValueToArray(previous.label)\n return new Map(previousValues.map((v, index) => [v, previousLabels[index]]))\n}\n\nfunction normalizeValueToArray(value: string | string[] | undefined): string[] {\n if (value === undefined) return []\n return Array.isArray(value) ? value : [value]\n}\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CollectionEditorsLazy.js","sources":["../../../src/components/DataTable/CollectionEditorsLazy.tsx"],"sourcesContent":["import { ComboBoxItem } from \"@components/combo-box\"\nimport { LoadingSpinner } from \"@components/internal\"\nimport { useDebouncedValue } from \"@utilities/useDebouncedValue\"\nimport React, { Key, useCallback, useEffect, useState } from \"react\"\n\nimport styles from \"./CollectionEditorsLazy.module.css\"\nimport type {\n CollectionFilterEditorProps,\n CollectionFilterValue,\n CollectionOptionsLazy,\n} from \"./CollectionEditorsShared\"\nimport { CollectionEditorCombobox } from \"./CollectionEditorsShared\"\nimport {\n CollectionEditorCheckboxes,\n CollectionEditorRadios,\n CollectionEditorSelect,\n CollectionEditorStaticProps,\n} from \"./CollectionEditorsStatic\"\nimport type { CollectionDisplay, CollectionOption } from \"./collectionFilter\"\nimport type { ActiveFilterLabel } from \"./FilterTypes\"\nimport { useFocusFirstControlAfterLoad } from \"./FocusFirstControl\"\nimport { useLazyOptions } from \"./useLazyOptions\"\nimport { isEmptyValue } from \"./utils\"\n\ntype CollectionEditorLazyProps = CollectionEditorStaticProps & {\n error: unknown\n loading: boolean\n query: string | undefined\n setQuery: (query: string | undefined) => void\n}\n\nconst DEBOUNCE_MS = 300\n\nexport function CollectionFilterEditorLazy({\n config,\n onChange,\n operator,\n value,\n filter,\n label,\n scope,\n}: CollectionFilterEditorProps) {\n const { display, multiple } = config\n const loadOptions = config.options as CollectionOptionsLazy\n const options = useCallback(\n (query?: string) => loadOptions(query, scope),\n [loadOptions, scope]\n )\n const [query, setQuery] = useState<string | undefined>()\n const debouncedQuery = useDebouncedValue(query, DEBOUNCE_MS)\n const {\n error,\n loading,\n options: resolvedOptions,\n } = useLazyOptions(options, debouncedQuery)\n useFocusFirstControlAfterLoad(loading)\n const onCommit = useCallback(\n (newValue: CollectionFilterValue) => {\n const newLabel = findLabelFromOptions(resolvedOptions, newValue, {\n label,\n value,\n })\n return onChange(\n { label: newLabel, value: newValue },\n { complete: !isEmptyValue(newValue) }\n )\n },\n [resolvedOptions, onChange, value, label]\n )\n const Editor = getLazyEditor(display)\n\n return (\n <Editor\n error={error}\n loading={loading}\n query={query}\n setQuery={setQuery}\n value={value}\n onCommit={onCommit}\n options={resolvedOptions}\n multiple={multiple}\n operator={operator}\n filterLabel={filter.label}\n filterName={filter.name}\n />\n )\n}\n\nfunction getLazyEditor(display: CollectionDisplay) {\n if (display === \"combobox\") return CollectionEditorComboboxLazy\n if (display === \"checkboxes\") return CollectionEditorCheckboxesLazy\n if (display === \"radios\") return CollectionEditorRadiosLazy\n return CollectionEditorSelectLazy\n}\n\nfunction CollectionEditorCheckboxesLazy({\n error,\n loading,\n ...props\n}: CollectionEditorLazyProps) {\n if (loading) return <Loading />\n if (error) return <LoadError />\n return <CollectionEditorCheckboxes {...props} />\n}\n\nfunction CollectionEditorRadiosLazy({\n error,\n loading,\n ...props\n}: CollectionEditorLazyProps) {\n if (loading) return <Loading />\n if (error) return <LoadError />\n return <CollectionEditorRadios {...props} />\n}\n\nfunction CollectionEditorSelectLazy({\n error,\n loading,\n ...props\n}: CollectionEditorLazyProps) {\n if (loading) return <Loading />\n if (error) return <LoadError />\n return <CollectionEditorSelect {...props} />\n}\n\nfunction CollectionEditorComboboxLazy({\n error,\n onCommit,\n options,\n query,\n loading,\n setQuery,\n ...props\n}: CollectionEditorLazyProps) {\n const [loadingState, setLoadingState] = useState<\n \"loading\" | \"filtering\" | \"idle\"\n >(loading ? \"loading\" : \"idle\")\n useEffect(() => {\n if (!loading) {\n setLoadingState(\"idle\")\n }\n }, [loading])\n\n return (\n <CollectionEditorCombobox\n {...props}\n loadingState={error ? \"error\" : loadingState}\n inputValue={query}\n onInputChange={(q: string) => {\n setLoadingState(\"filtering\")\n setQuery(q)\n }}\n onChange={(value: Key | Key[] | null) => {\n if (value === null) return\n\n const resolvedValue = Array.isArray(value)\n ? value.map(String)\n : String(value)\n onCommit(resolvedValue)\n }}\n items={options}\n renderEmptyState={error ? <LoadError /> : \"No results\"}\n >\n {(o) => {\n const option = o as CollectionOption\n return (\n <ComboBoxItem key={option.value} id={option.value}>\n {option.label}\n </ComboBoxItem>\n )\n }}\n </CollectionEditorCombobox>\n )\n}\n\nexport function Loading() {\n return (\n <div className={styles[\"loading\"]} role=\"status\">\n <span>Loading...</span>\n <LoadingSpinner />\n </div>\n )\n}\n\nexport function LoadError() {\n return (\n <div className={styles[\"load-error\"]} role=\"alert\">\n Error: Failed to load options\n </div>\n )\n}\n\nfunction findLabelFromOptions(\n options: CollectionOption[],\n value: CollectionFilterValue,\n previous: { label?: ActiveFilterLabel; value: CollectionFilterValue }\n) {\n const previousLabelByValue = buildPreviousLabelByValue(previous)\n const labelFor = (v: string) =>\n options.find((option) => option.value === v)?.label ??\n previousLabelByValue.get(v)\n\n return Array.isArray(value)\n ? value.map(labelFor).filter((label) => label !== undefined)\n : labelFor(value)\n}\n\nfunction buildPreviousLabelByValue(previous: {\n label?: ActiveFilterLabel\n value: CollectionFilterValue\n}): Map<string, string | undefined> {\n const previousValues = normalizeValueToArray(previous.value)\n const previousLabels = normalizeValueToArray(previous.label)\n return new Map(previousValues.map((v, index) => [v, previousLabels[index]]))\n}\n\nfunction normalizeValueToArray(value: string | string[] | undefined): string[] {\n if (value === undefined) return []\n return Array.isArray(value) ? value : [value]\n}\n"],"names":["React"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionEditorsShared.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/CollectionEditorsShared.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC3E,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEpE,2EAA2E;AAC3E,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;AAErD,MAAM,MAAM,qBAAqB,GAAG,CAClC,CAAC,EAAE,MAAM,GAAG,SAAS,EACrB,KAAK,CAAC,EAAE,MAAM,KACX,OAAO,CAAC,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAA;AACrD,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,EAAE,GAAG,qBAAqB,CAAA;AAE1E,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3B,KAAK,EAAE,qBAAqB,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,EAAE;QACN,OAAO,EAAE,iBAAiB,CAAA;QAC1B,QAAQ,EAAE,OAAO,CAAA;QACjB,OAAO,EAAE,iBAAiB,CAAA;KAC3B,CAAA;IACD,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IACD,KAAK,EAAE,iBAAiB,CAAA;IACxB,QAAQ,EAAE,YAAY,CAAA;IACtB,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,qBAAqB,CAAA;CAC7B,CAAA;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,gBAAgB,EAAE,EAC3B,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,YAGtB;AAED,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,qBAAqB,GACtB,OAAO,CAAC,oBAAoB,CAAC,GAC7B,IAAI,CAAC,oBAAoB,EAAE,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"CollectionEditorsShared.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/CollectionEditorsShared.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC3E,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEpE,2EAA2E;AAC3E,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;AAErD,MAAM,MAAM,qBAAqB,GAAG,CAClC,CAAC,EAAE,MAAM,GAAG,SAAS,EACrB,KAAK,CAAC,EAAE,MAAM,KACX,OAAO,CAAC,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAA;AACrD,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,EAAE,GAAG,qBAAqB,CAAA;AAE1E,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3B,KAAK,EAAE,qBAAqB,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,EAAE;QACN,OAAO,EAAE,iBAAiB,CAAA;QAC1B,QAAQ,EAAE,OAAO,CAAA;QACjB,OAAO,EAAE,iBAAiB,CAAA;KAC3B,CAAA;IACD,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IACD,KAAK,EAAE,iBAAiB,CAAA;IACxB,QAAQ,EAAE,YAAY,CAAA;IACtB,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,qBAAqB,CAAA;CAC7B,CAAA;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,gBAAgB,EAAE,EAC3B,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,YAGtB;AAED,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,qBAAqB,GACtB,OAAO,CAAC,oBAAoB,CAAC,GAC7B,IAAI,CAAC,oBAAoB,EAAE,UAAU,CAAC,qBAUvC"}
|
|
@@ -5,11 +5,7 @@ function orderByOptions(options, selected) {
|
|
|
5
5
|
return options.filter((o) => selected.has(o.value)).map((o) => o.value);
|
|
6
6
|
}
|
|
7
7
|
function CollectionEditorCombobox({ value, multiple, operator, ...props }) {
|
|
8
|
-
return (React__default.createElement(ComboBox
|
|
9
|
-
// eslint-disable-next-line jsx-a11y/no-autofocus -- the editor only ever renders inside a chip popover that just opened, per ARIA dialog practices
|
|
10
|
-
, {
|
|
11
|
-
// eslint-disable-next-line jsx-a11y/no-autofocus -- the editor only ever renders inside a chip popover that just opened, per ARIA dialog practices
|
|
12
|
-
autoFocus: true, hideLabel: true, label: operator.label, selectionMode: multiple ? "multiple" : "single", value: value, ...props }));
|
|
8
|
+
return (React__default.createElement(ComboBox, { hideLabel: true, label: operator.label, selectionMode: multiple ? "multiple" : "single", value: value, ...props }));
|
|
13
9
|
}
|
|
14
10
|
|
|
15
11
|
export { CollectionEditorCombobox, orderByOptions };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionEditorsShared.js","sources":["../../../src/components/DataTable/CollectionEditorsShared.tsx"],"sourcesContent":["import { ComboBox, type ComboBoxElementProps } from \"@components/combo-box\"\nimport React from \"react\"\n\nimport type { CollectionDisplay } from \"./collectionFilter\"\nimport { CollectionOption } from \"./collectionFilter\"\nimport type { ActiveFilterLabel, FilterChange } from \"./FilterTypes\"\n\n/** A single option's `value`, or the selected `value`s when `multiple`. */\nexport type CollectionFilterValue = string | string[]\n\nexport type CollectionOptionsLazy = (\n q: string | undefined,\n scope?: string\n) => Promise<CollectionOption[]> | CollectionOption[]\nexport type CollectionOptions = CollectionOption[] | CollectionOptionsLazy\n\nexport type CollectionEditorProps = {\n multiple: boolean\n operator: { label: string }\n value: CollectionFilterValue\n}\n\nexport type CollectionFilterEditorProps = {\n config: {\n display: CollectionDisplay\n multiple: boolean\n options: CollectionOptions\n }\n filter: {\n label: string\n name: string\n }\n label: ActiveFilterLabel\n onChange: FilterChange\n operator: {\n label: string\n }\n scope?: string\n value: CollectionFilterValue\n}\n\nexport function orderByOptions(\n options: CollectionOption[],\n selected: Set<string>\n) {\n return options.filter((o) => selected.has(o.value)).map((o) => o.value)\n}\n\nexport function CollectionEditorCombobox({\n value,\n multiple,\n operator,\n ...props\n}: CollectionEditorProps &\n Partial<ComboBoxElementProps> &\n Pick<ComboBoxElementProps, \"children\">) {\n return (\n <ComboBox\n
|
|
1
|
+
{"version":3,"file":"CollectionEditorsShared.js","sources":["../../../src/components/DataTable/CollectionEditorsShared.tsx"],"sourcesContent":["import { ComboBox, type ComboBoxElementProps } from \"@components/combo-box\"\nimport React from \"react\"\n\nimport type { CollectionDisplay } from \"./collectionFilter\"\nimport { CollectionOption } from \"./collectionFilter\"\nimport type { ActiveFilterLabel, FilterChange } from \"./FilterTypes\"\n\n/** A single option's `value`, or the selected `value`s when `multiple`. */\nexport type CollectionFilterValue = string | string[]\n\nexport type CollectionOptionsLazy = (\n q: string | undefined,\n scope?: string\n) => Promise<CollectionOption[]> | CollectionOption[]\nexport type CollectionOptions = CollectionOption[] | CollectionOptionsLazy\n\nexport type CollectionEditorProps = {\n multiple: boolean\n operator: { label: string }\n value: CollectionFilterValue\n}\n\nexport type CollectionFilterEditorProps = {\n config: {\n display: CollectionDisplay\n multiple: boolean\n options: CollectionOptions\n }\n filter: {\n label: string\n name: string\n }\n label: ActiveFilterLabel\n onChange: FilterChange\n operator: {\n label: string\n }\n scope?: string\n value: CollectionFilterValue\n}\n\nexport function orderByOptions(\n options: CollectionOption[],\n selected: Set<string>\n) {\n return options.filter((o) => selected.has(o.value)).map((o) => o.value)\n}\n\nexport function CollectionEditorCombobox({\n value,\n multiple,\n operator,\n ...props\n}: CollectionEditorProps &\n Partial<ComboBoxElementProps> &\n Pick<ComboBoxElementProps, \"children\">) {\n return (\n <ComboBox\n hideLabel\n label={operator.label}\n selectionMode={multiple ? \"multiple\" : \"single\"}\n value={value}\n {...props}\n />\n )\n}\n"],"names":["React"],"mappings":";;;AAyCM,SAAU,cAAc,CAC5B,OAA2B,EAC3B,QAAqB,EAAA;AAErB,IAAA,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AACzE;AAEM,SAAU,wBAAwB,CAAC,EACvC,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,GAAG,KAAK,EAG8B,EAAA;AACtC,IAAA,QACEA,cAAA,CAAA,aAAA,CAAC,QAAQ,EAAA,EACP,SAAS,EAAA,IAAA,EACT,KAAK,EAAE,QAAQ,CAAC,KAAK,EACrB,aAAa,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,EAC/C,KAAK,EAAE,KAAK,EAAA,GACR,KAAK,EAAA,CACT;AAEN;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { CollectionEditorProps, CollectionFilterEditorProps, CollectionFilterValue } from "./CollectionEditorsShared";
|
|
3
|
-
import { CollectionOption } from "./collectionFilter";
|
|
3
|
+
import type { CollectionOption } from "./collectionFilter";
|
|
4
4
|
export type CollectionEditorStaticProps = CollectionEditorProps & {
|
|
5
5
|
filterLabel: string;
|
|
6
6
|
filterName: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionEditorsStatic.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/CollectionEditorsStatic.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAc,MAAM,OAAO,CAAA;AAElC,OAAO,EAEL,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EAEtB,MAAM,2BAA2B,CAAA;AAClC,OAAO,
|
|
1
|
+
{"version":3,"file":"CollectionEditorsStatic.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/CollectionEditorsStatic.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAc,MAAM,OAAO,CAAA;AAElC,OAAO,EAEL,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EAEtB,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAqB,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAG7E,MAAM,MAAM,2BAA2B,GAAG,qBAAqB,GAAG;IAChE,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAA;IAChD,OAAO,EAAE,gBAAgB,EAAE,CAAA;CAC5B,CAAA;AAED,wBAAgB,4BAA4B,CAAC,EAC3C,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,MAAM,GACP,EAAE,2BAA2B,qBAoB7B;AASD,wBAAgB,0BAA0B,CAAC,EACzC,WAAW,EACX,QAAQ,EACR,OAAO,EACP,KAAK,GACN,EAAE,2BAA2B,qBAqB7B;AAED,wBAAgB,sBAAsB,CAAC,EACrC,WAAW,EACX,UAAU,EACV,QAAQ,EACR,OAAO,EACP,KAAK,GACN,EAAE,2BAA2B,qBAe7B;AAED,wBAAgB,sBAAsB,CAAC,EACrC,KAAK,EACL,QAAQ,EACR,OAAO,EACP,QAAQ,GACT,EAAE,2BAA2B,qBAY7B"}
|
|
@@ -12,16 +12,16 @@ function CollectionFilterEditorStatic({ config, onChange, operator, value, filte
|
|
|
12
12
|
const { display, multiple } = config;
|
|
13
13
|
const options = config.options;
|
|
14
14
|
const onCommit = (value) => onChange({ label: undefined, value }, { complete: !isEmptyValue(value) });
|
|
15
|
-
const Editor = getStaticEditor(
|
|
15
|
+
const Editor = getStaticEditor(display);
|
|
16
16
|
return (React__default.createElement(Editor, { value: value, onCommit: onCommit, options: options, multiple: multiple, operator: operator, filterLabel: filter.label, filterName: filter.name }));
|
|
17
17
|
}
|
|
18
|
-
function getStaticEditor(
|
|
18
|
+
function getStaticEditor(display) {
|
|
19
19
|
if (display === "combobox")
|
|
20
20
|
return CollectionEditorComboboxStatic;
|
|
21
|
-
if (multiple)
|
|
22
|
-
return CollectionEditorCheckboxes;
|
|
23
21
|
if (display === "checkboxes")
|
|
24
|
-
return
|
|
22
|
+
return CollectionEditorCheckboxes;
|
|
23
|
+
if (display === "radios")
|
|
24
|
+
return CollectionEditorRadios;
|
|
25
25
|
return CollectionEditorSelect;
|
|
26
26
|
}
|
|
27
27
|
function CollectionEditorCheckboxes({ filterLabel, onCommit, options, value, }) {
|
|
@@ -34,24 +34,15 @@ function CollectionEditorCheckboxes({ filterLabel, onCommit, options, value, })
|
|
|
34
34
|
next.delete(optionValue);
|
|
35
35
|
onCommit(orderByOptions(options, next));
|
|
36
36
|
};
|
|
37
|
-
return (React__default.createElement(CheckboxGroup, { label: filterLabel }, options.map((option
|
|
38
|
-
// eslint-disable-next-line jsx-a11y/no-autofocus -- the editor only ever renders inside a chip popover that just opened, per ARIA dialog practices
|
|
39
|
-
autoFocus: index === 0, checked: selected.includes(option.value), label: option.label, onChange: (e) => toggle(option.value, e.target.checked) })))));
|
|
37
|
+
return (React__default.createElement(CheckboxGroup, { label: filterLabel }, options.map((option) => (React__default.createElement(Checkbox, { key: option.value, checked: selected.includes(option.value), label: option.label, onChange: (e) => toggle(option.value, e.target.checked) })))));
|
|
40
38
|
}
|
|
41
39
|
function CollectionEditorRadios({ filterLabel, filterName, onCommit, options, value, }) {
|
|
42
40
|
const selected = Array.isArray(value) ? value[0] : value;
|
|
43
|
-
|
|
44
|
-
return (React__default.createElement(RadioGroup, { label: filterLabel }, options.map((option, index) => (React__default.createElement(Radio, { key: option.value,
|
|
45
|
-
// eslint-disable-next-line jsx-a11y/no-autofocus -- the editor only ever renders inside a chip popover that just opened, per ARIA dialog practices
|
|
46
|
-
autoFocus: index === focusIndex, checked: selected === option.value, label: option.label, name: filterName, onChange: () => onCommit(option.value) })))));
|
|
41
|
+
return (React__default.createElement(RadioGroup, { label: filterLabel }, options.map((option) => (React__default.createElement(Radio, { key: option.value, checked: selected === option.value, label: option.label, name: filterName, onChange: () => onCommit(option.value) })))));
|
|
47
42
|
}
|
|
48
43
|
function CollectionEditorSelect({ value, operator, options, onCommit, }) {
|
|
49
44
|
const selected = Array.isArray(value) ? value[0] : value;
|
|
50
|
-
return (React__default.createElement(Select
|
|
51
|
-
// eslint-disable-next-line jsx-a11y/no-autofocus -- the editor only ever renders inside a chip popover that just opened, per ARIA dialog practices
|
|
52
|
-
, {
|
|
53
|
-
// eslint-disable-next-line jsx-a11y/no-autofocus -- the editor only ever renders inside a chip popover that just opened, per ARIA dialog practices
|
|
54
|
-
autoFocus: true, hideLabel: true, label: operator.label, options: options, value: selected, onChange: (e) => onCommit(e.target.value) }));
|
|
45
|
+
return (React__default.createElement(Select, { hideLabel: true, label: operator.label, options: options, value: selected, onChange: (e) => onCommit(e.target.value) }));
|
|
55
46
|
}
|
|
56
47
|
function CollectionEditorComboboxStatic({ onCommit, options, filterLabel, filterName, ...props }) {
|
|
57
48
|
return (React__default.createElement(CollectionEditorCombobox, { ...props, onChange: (value) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionEditorsStatic.js","sources":["../../../src/components/DataTable/CollectionEditorsStatic.tsx"],"sourcesContent":["import { Checkbox } from \"@components/checkbox\"\nimport { CheckboxGroup } from \"@components/checkbox-group\"\nimport { ComboBoxItem } from \"@components/combo-box\"\nimport { Radio } from \"@components/radio\"\nimport { RadioGroup } from \"@components/radio-group\"\nimport { Select } from \"@components/select\"\nimport React, { Key } from \"react\"\n\nimport {\n CollectionEditorCombobox,\n CollectionEditorProps,\n CollectionFilterEditorProps,\n CollectionFilterValue,\n orderByOptions,\n} from \"./CollectionEditorsShared\"\nimport { CollectionOption } from \"./collectionFilter\"\nimport { isEmptyValue } from \"./utils\"\n\nexport type CollectionEditorStaticProps = CollectionEditorProps & {\n filterLabel: string\n filterName: string\n onCommit: (value: CollectionFilterValue) => void\n options: CollectionOption[]\n}\n\nexport function CollectionFilterEditorStatic({\n config,\n onChange,\n operator,\n value,\n filter,\n}: CollectionFilterEditorProps) {\n const { display, multiple } = config\n const options = config.options as CollectionOption[]\n\n const onCommit = (value: CollectionFilterValue) =>\n onChange({ label: undefined, value }, { complete: !isEmptyValue(value) })\n\n const Editor = getStaticEditor(
|
|
1
|
+
{"version":3,"file":"CollectionEditorsStatic.js","sources":["../../../src/components/DataTable/CollectionEditorsStatic.tsx"],"sourcesContent":["import { Checkbox } from \"@components/checkbox\"\nimport { CheckboxGroup } from \"@components/checkbox-group\"\nimport { ComboBoxItem } from \"@components/combo-box\"\nimport { Radio } from \"@components/radio\"\nimport { RadioGroup } from \"@components/radio-group\"\nimport { Select } from \"@components/select\"\nimport React, { Key } from \"react\"\n\nimport {\n CollectionEditorCombobox,\n CollectionEditorProps,\n CollectionFilterEditorProps,\n CollectionFilterValue,\n orderByOptions,\n} from \"./CollectionEditorsShared\"\nimport type { CollectionDisplay, CollectionOption } from \"./collectionFilter\"\nimport { isEmptyValue } from \"./utils\"\n\nexport type CollectionEditorStaticProps = CollectionEditorProps & {\n filterLabel: string\n filterName: string\n onCommit: (value: CollectionFilterValue) => void\n options: CollectionOption[]\n}\n\nexport function CollectionFilterEditorStatic({\n config,\n onChange,\n operator,\n value,\n filter,\n}: CollectionFilterEditorProps) {\n const { display, multiple } = config\n const options = config.options as CollectionOption[]\n\n const onCommit = (value: CollectionFilterValue) =>\n onChange({ label: undefined, value }, { complete: !isEmptyValue(value) })\n\n const Editor = getStaticEditor(display)\n\n return (\n <Editor\n value={value}\n onCommit={onCommit}\n options={options}\n multiple={multiple}\n operator={operator}\n filterLabel={filter.label}\n filterName={filter.name}\n />\n )\n}\n\nfunction getStaticEditor(display: CollectionDisplay) {\n if (display === \"combobox\") return CollectionEditorComboboxStatic\n if (display === \"checkboxes\") return CollectionEditorCheckboxes\n if (display === \"radios\") return CollectionEditorRadios\n return CollectionEditorSelect\n}\n\nexport function CollectionEditorCheckboxes({\n filterLabel,\n onCommit,\n options,\n value,\n}: CollectionEditorStaticProps) {\n const selected = Array.isArray(value) ? value : [value]\n const toggle = (optionValue: string, checked: boolean) => {\n const next = new Set(selected)\n if (checked) next.add(optionValue)\n else next.delete(optionValue)\n onCommit(orderByOptions(options, next))\n }\n\n return (\n <CheckboxGroup label={filterLabel}>\n {options.map((option) => (\n <Checkbox\n key={option.value}\n checked={selected.includes(option.value)}\n label={option.label}\n onChange={(e) => toggle(option.value, e.target.checked)}\n />\n ))}\n </CheckboxGroup>\n )\n}\n\nexport function CollectionEditorRadios({\n filterLabel,\n filterName,\n onCommit,\n options,\n value,\n}: CollectionEditorStaticProps) {\n const selected = Array.isArray(value) ? value[0] : value\n return (\n <RadioGroup label={filterLabel}>\n {options.map((option) => (\n <Radio\n key={option.value}\n checked={selected === option.value}\n label={option.label}\n name={filterName}\n onChange={() => onCommit(option.value)}\n />\n ))}\n </RadioGroup>\n )\n}\n\nexport function CollectionEditorSelect({\n value,\n operator,\n options,\n onCommit,\n}: CollectionEditorStaticProps) {\n const selected = Array.isArray(value) ? value[0] : value\n\n return (\n <Select\n hideLabel\n label={operator.label}\n options={options}\n value={selected}\n onChange={(e) => onCommit(e.target.value)}\n />\n )\n}\n\nfunction CollectionEditorComboboxStatic({\n onCommit,\n options,\n filterLabel,\n filterName,\n ...props\n}: CollectionEditorStaticProps) {\n return (\n <CollectionEditorCombobox\n {...props}\n onChange={(value: Key | Key[] | null) => {\n if (value === null) return\n\n const resolvedValue = Array.isArray(value)\n ? orderByOptions(options, new Set(value.map(String)))\n : String(value)\n\n onCommit(resolvedValue)\n }}\n >\n {options.map((option) => (\n <ComboBoxItem key={option.value} id={option.value}>\n {option.label}\n </ComboBoxItem>\n ))}\n </CollectionEditorCombobox>\n )\n}\n"],"names":["React"],"mappings":"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"}
|
|
@@ -75,7 +75,9 @@ interface DataTableBaseProps {
|
|
|
75
75
|
/**
|
|
76
76
|
* Async loading state for the table body.
|
|
77
77
|
* - `"loading"`: While `data` is empty, replaces the empty state with a
|
|
78
|
-
* centered spinner.
|
|
78
|
+
* centered spinner. While `data` has rows, keeps them on screen with a
|
|
79
|
+
* spinner over them until new `data` arrives, so a search doesn't blank
|
|
80
|
+
* the table. When requests can overlap, apply only the latest response.
|
|
79
81
|
* - `"error"`: While `data` is empty, replaces the empty state with
|
|
80
82
|
* `errorState` (or a default error message).
|
|
81
83
|
* - `"idle"` (default): Normal rendering.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/DataTable.tsx"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAA;AACpB,OAAO,eAAe,CAAA;AAKtB,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAA;AAGhF,OAAO,KAAK,EAAE,EACZ,KAAK,SAAS,EAKf,MAAM,OAAO,CAAA;AACd,OAAO,EASL,KAAK,UAAU,IAAI,cAAc,EAClC,MAAM,6BAA6B,CAAA;AAGpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAMxD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE7D,OAAO,EAGL,KAAK,UAAU,EAEhB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,KAAK,SAAS,EAAc,MAAM,cAAc,CAAA;AAEzD,OAAO,EAAE,KAAK,WAAW,EAAgB,MAAM,gBAAgB,CAAA;AAG/D,OAAO,EACL,KAAK,kBAAkB,EAGxB,MAAM,yBAAyB,CAAA;AAMhC,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,CAAA;AAEtE,MAAM,MAAM,IAAI,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,CAAA;AAEhE,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;AAEhE,UAAU,kBAAkB;IAC1B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAA;IAC9B;;;;OAIG;IACH,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oCAAoC;IACpC,IAAI,EAAE,OAAO,EAAE,CAAA;IACf;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IAClC,iEAAiE;IACjE,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB;;;OAGG;IACH,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;IACtB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,MAAM,CAAA;IAC5C;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAA;IACrC;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;;OAGG;IACH,EAAE,CAAC,EAAE,MAAM,CAAA;IACX
|
|
1
|
+
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/DataTable.tsx"],"names":[],"mappings":"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"}
|
|
@@ -66,6 +66,8 @@ const DataTableInner = ({ activeFilters = [], className, canSelectAllPages, colu
|
|
|
66
66
|
const renderEmptyState = emptyStateContent
|
|
67
67
|
? () => emptyStateContent
|
|
68
68
|
: undefined;
|
|
69
|
+
// With rows on screen, loading keeps them in place under a spinner instead.
|
|
70
|
+
const showLoadingOverlay = loadingState === "loading" && data.length > 0;
|
|
69
71
|
// Keyed on column names rather than the `columns` array identity so a fresh
|
|
70
72
|
// `columns` literal each render doesn't rebuild every formatter. `columns` is
|
|
71
73
|
// intentionally omitted from the deps.
|
|
@@ -115,7 +117,8 @@ const DataTableInner = ({ activeFilters = [], className, canSelectAllPages, colu
|
|
|
115
117
|
const hasFilters = (filters.length ?? 0) > 0;
|
|
116
118
|
const hasViewSettingsToggle = hideableColumns.length > 0;
|
|
117
119
|
const hasTrailingControls = searchable || hasFilters || hasViewSettingsToggle;
|
|
118
|
-
const
|
|
120
|
+
const hasResults = hasResultsCount(resultNoun) || hasActions;
|
|
121
|
+
const showHeader = hasResults || Boolean(hasTrailingControls);
|
|
119
122
|
const hasRowActions = (rowActions?.length ?? 0) > 0;
|
|
120
123
|
const { pendingFilters } = usePendingFilters();
|
|
121
124
|
const { chipFilters, clearFilters, onChipFiltersChange, onSearchChange, searchQuery, } = useSearchFilter(activeFilters, onActiveFiltersChange);
|
|
@@ -139,19 +142,21 @@ const DataTableInner = ({ activeFilters = [], className, canSelectAllPages, colu
|
|
|
139
142
|
React__default.createElement("div", { className: "tds-data-table-frame" },
|
|
140
143
|
React__default.createElement(DataTableSelectionContext.Provider, { value: selectionModel },
|
|
141
144
|
showHeader && (React__default.createElement("div", { className: "tds-data-table-frame-header" },
|
|
142
|
-
React__default.createElement(
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
145
|
+
React__default.createElement("div", { className: "tds-data-table-frame-header-content" },
|
|
146
|
+
hasResults && (React__default.createElement("div", { className: "tds-data-table-frame-header-results" },
|
|
147
|
+
React__default.createElement(ResultsCount, { id: resultsCountId, resultNoun: resultNoun, selectable: selectable, selectedCount: selectedCount, totalCount: totalCount }),
|
|
148
|
+
hasActions && (React__default.createElement(TableActions, { actions: tableActions, resultNoun: resultNoun })))),
|
|
149
|
+
hasTrailingControls && (React__default.createElement("div", { className: "tds-data-table-frame-header-controls" },
|
|
150
|
+
searchable && (React__default.createElement(TableSearch, { label: searchLabel, tableId: tableId, value: searchQuery, onChange: onSearchChange })),
|
|
151
|
+
hasFilters && (React__default.createElement(FilterControls, { activeFilters: chipFilters, filters: filters, isShelfExpanded: isShelfExpanded, onToggleShelf: toggleShelf })),
|
|
152
|
+
hasViewSettingsToggle && (React__default.createElement(ViewSettingsToggle, { columns: hideableColumns, onColumnVisibilityChange: onColumnVisibilityChange, visibleColumnNames: visibleHideableColumns }))))))),
|
|
153
|
+
(hasFilters || hasEditableFilters) && (React__default.createElement("div", { className: classNames("tds-data-table-filters-shelf", {
|
|
154
|
+
"tds-data-table-filters-shelf--collapsed": !isShelfExpanded,
|
|
155
|
+
}), ...shelfInertProps },
|
|
156
|
+
React__default.createElement("div", { className: "tds-data-table-filters" }, hasEditableFilters && (React__default.createElement(ActiveFilters, { activeFilters: chipFilters, hasFilters: hasFilters, onActiveFiltersChange: onChipFiltersChange, onClear: clearFilters }))))),
|
|
148
157
|
React__default.createElement(SelectAllBanner, { resultNoun: resultNoun })),
|
|
149
|
-
(hasFilters || hasEditableFilters) && (React__default.createElement("div", { className: classNames("tds-data-table-filters-shelf", {
|
|
150
|
-
"tds-data-table-filters-shelf--collapsed": !isShelfExpanded,
|
|
151
|
-
}), ...shelfInertProps },
|
|
152
|
-
React__default.createElement("div", { className: "tds-data-table-filters" }, hasEditableFilters && (React__default.createElement(ActiveFilters, { activeFilters: chipFilters, hasFilters: hasFilters, onActiveFiltersChange: onChipFiltersChange, onClear: clearFilters }))))),
|
|
153
158
|
React__default.createElement("div", { ref: wrapperRef, className: "tds-data-table-scroll-wrapper" },
|
|
154
|
-
React__default.createElement("div", { ref: scrollRef, className: "tds-data-table-scroll" },
|
|
159
|
+
React__default.createElement("div", { ref: scrollRef, className: "tds-data-table-scroll", "aria-busy": showLoadingOverlay || undefined },
|
|
155
160
|
React__default.createElement(Table, { ...restProps, ...selectionProps, ...(ariaLabel ? { "aria-label": ariaLabel } : {}), ...(describedBy ? { "aria-describedby": describedBy } : {}), ...{ id: tableId }, className: combinedClassName,
|
|
156
161
|
// Pinned rather than exposed as a prop: `disabledKeys` only ever
|
|
157
162
|
// turns off selection here, leaving the row clickable and
|
|
@@ -184,7 +189,11 @@ const DataTableInner = ({ activeFilters = [], className, canSelectAllPages, colu
|
|
|
184
189
|
}) }, prepared.renderCell(row)))),
|
|
185
190
|
hasRowActions && (React__default.createElement(Cell, { ...cellBoundaryProps, className: "tds-data-table-cell tds-data-table-cell--actions" },
|
|
186
191
|
React__default.createElement(RowActions, { actions: rowActions, row: row, rowKey: rowKey })))));
|
|
187
|
-
}))))
|
|
192
|
+
})))),
|
|
193
|
+
showLoadingOverlay && (React__default.createElement("div", { className: "tds-data-table-loading-overlay", role: "status" },
|
|
194
|
+
React__default.createElement("span", { className: "tds-data-table-loading-label--hidden" }, "Loading"),
|
|
195
|
+
React__default.createElement("span", { className: "tds-data-table-loading-spinner", "aria-hidden": "true" },
|
|
196
|
+
React__default.createElement(LoadingSpinner, null))))),
|
|
188
197
|
showPagination && (React__default.createElement("div", { className: "tds-data-table-frame-footer" }, isIndexedPagination ? (React__default.createElement(Pagination, { "aria-label": paginationLabel, hasNextPage: hasNextPage, hasPreviousPage: hasPreviousPage, onNextPageClick: onNextPageClick, onPreviousPageClick: onPreviousPageClick, type: "indexed" })) : (React__default.createElement(Pagination, { "aria-label": paginationLabel, currentPage: currentPage, onPageChange: onPageChange, totalPages: totalPages })))))));
|
|
189
198
|
};
|
|
190
199
|
DataTable.displayName = "DataTable";
|