@planningcenter/tapestry 4.9.0-rc.5 → 4.9.0-rc.7
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/FilterContext.d.ts +2 -2
- package/dist/components/DataTable/FilterContext.d.ts.map +1 -1
- package/dist/components/DataTable/FilterContext.js +6 -7
- package/dist/components/DataTable/FilterContext.js.map +1 -1
- package/dist/components/DataTable/FilterControls.d.ts.map +1 -1
- package/dist/components/DataTable/FilterControls.js +14 -5
- package/dist/components/DataTable/FilterControls.js.map +1 -1
- package/dist/components/DataTable/FilterTypes.d.ts +3 -3
- package/dist/components/DataTable/FilterTypes.d.ts.map +1 -1
- package/dist/components/DataTable/PendingFilterQueue.d.ts +2 -2
- package/dist/components/DataTable/PendingFilterQueue.d.ts.map +1 -1
- package/dist/components/DataTable/PendingFilterQueue.js +8 -7
- package/dist/components/DataTable/PendingFilterQueue.js.map +1 -1
- package/dist/components/DataTable/SearchableFilters.d.ts +1 -0
- package/dist/components/DataTable/SearchableFilters.d.ts.map +1 -1
- package/dist/components/DataTable/SearchableFilters.js +2 -2
- package/dist/components/DataTable/SearchableFilters.js.map +1 -1
- package/dist/components/DataTable/scopedFilter.d.ts +2 -2
- package/dist/components/DataTable/scopedFilter.d.ts.map +1 -1
- package/dist/components/DataTable/scopedFilter.js +14 -3
- package/dist/components/DataTable/scopedFilter.js.map +1 -1
- package/dist/components/DataTable/utils.d.ts +7 -1
- package/dist/components/DataTable/utils.d.ts.map +1 -1
- package/dist/components/DataTable/utils.js +17 -1
- package/dist/components/DataTable/utils.js.map +1 -1
- package/dist/components/dropdown/Dropdown.d.ts +2 -0
- package/dist/components/dropdown/Dropdown.d.ts.map +1 -1
- package/dist/components/dropdown/Dropdown.js.map +1 -1
- package/dist/reactRender.css +1180 -1180
- package/dist/reactRender.css.map +1 -1
- package/dist/reactRenderLegacy.css +1180 -1180
- package/dist/reactRenderLegacy.css.map +1 -1
- package/package.json +2 -2
- package/dist/components/DataTable/FilterTypes.js +0 -7
- package/dist/components/DataTable/FilterTypes.js.map +0 -1
|
@@ -8,7 +8,7 @@ export declare const FilterContext: React.Context<{
|
|
|
8
8
|
addFilterButtonRef: React.RefObject<HTMLButtonElement>;
|
|
9
9
|
findActiveFilterOperator: (activeFilter: ActiveFilter) => RelatedFilterOperatorResult | undefined;
|
|
10
10
|
flatFilters: FilterNodeItem[];
|
|
11
|
-
hasFilterInstances: (name: string) => boolean;
|
|
11
|
+
hasFilterInstances: (name: string, scope?: string) => boolean;
|
|
12
12
|
/** Restores focus after an action (e.g. clearing filters). */
|
|
13
13
|
restoreFilterFocus: () => void;
|
|
14
14
|
}>;
|
|
@@ -20,5 +20,5 @@ export declare function FiltersProvider({ activeFilters, filters, children, }: {
|
|
|
20
20
|
export declare function useRelatedFilterOperator(activeFilter: ActiveFilter): RelatedFilterOperatorResult;
|
|
21
21
|
export declare function useAddFilterButtonRef(): React.RefObject<HTMLButtonElement>;
|
|
22
22
|
export declare function useRestoreFilterFocus(): () => void;
|
|
23
|
-
export declare function useHasFilterInstancesChecker(): (name: string) => boolean;
|
|
23
|
+
export declare function useHasFilterInstancesChecker(): (name: string, scope?: string) => boolean;
|
|
24
24
|
//# sourceMappingURL=FilterContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterContext.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/FilterContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAA;AAEd,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,cAAc,EACd,QAAQ,EACT,MAAM,eAAe,CAAA;AAQtB,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,aAAa,CAAC,EAAE,cAAc,CAAA;CAC/B,CAAA;AACD,eAAO,MAAM,aAAa;wBACJ,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC;8BAC5B,CACxB,YAAY,EAAE,YAAY,KACvB,2BAA2B,GAAG,SAAS;iBAC/B,cAAc,EAAE;wBACT,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO;
|
|
1
|
+
{"version":3,"file":"FilterContext.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/FilterContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAA;AAEd,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,cAAc,EACd,QAAQ,EACT,MAAM,eAAe,CAAA;AAQtB,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,aAAa,CAAC,EAAE,cAAc,CAAA;CAC/B,CAAA;AACD,eAAO,MAAM,aAAa;wBACJ,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC;8BAC5B,CACxB,YAAY,EAAE,YAAY,KACvB,2BAA2B,GAAG,SAAS;iBAC/B,cAAc,EAAE;wBACT,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO;IAC7D,8DAA8D;wBAC1C,MAAM,IAAI;EAO9B,CAAA;AAiBF,wBAAgB,eAAe,CAAC,EAC9B,aAAkB,EAClB,OAAO,EACP,QAAQ,GACT,EAAE;IACD,aAAa,CAAC,EAAE,YAAY,EAAE,CAAA;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,OAAO,EAAE,UAAU,EAAE,CAAA;CACtB,qBAUA;AAuDD,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,YAAY,GACzB,2BAA2B,CAQ7B;AAED,wBAAgB,qBAAqB,uCAEpC;AAED,wBAAgB,qBAAqB,UAjHT,IAAI,CAmH/B;AAED,wBAAgB,4BAA4B,IAAI,CAC9C,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,KACX,OAAO,CAEX"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React__default, { createContext, useMemo, useCallback, useRef, useContext } from 'react';
|
|
2
|
-
import { isScopedFilter } from './FilterTypes.js';
|
|
3
2
|
import { PendingFilterProvider, usePendingFilters } from './PendingFilterContext.js';
|
|
4
3
|
import { SearchableFiltersProvider } from './SearchableFilters.js';
|
|
4
|
+
import { isScopedFilter, isKnownScope } from './utils.js';
|
|
5
5
|
|
|
6
6
|
const FilterContext = createContext({
|
|
7
7
|
addFilterButtonRef: { current: null },
|
|
@@ -16,10 +16,7 @@ function flattenFilters(nodes) {
|
|
|
16
16
|
function findScopeFilter(filter, scope) {
|
|
17
17
|
if (scope === undefined || !isScopedFilter(filter))
|
|
18
18
|
return undefined;
|
|
19
|
-
|
|
20
|
-
if (!isLazy && !filter.options.some(({ value }) => value === scope))
|
|
21
|
-
return undefined;
|
|
22
|
-
return filter.scopeFilter;
|
|
19
|
+
return isKnownScope(filter, scope) ? filter.scopeFilter : undefined;
|
|
23
20
|
}
|
|
24
21
|
function findOperator(filter, operatorName) {
|
|
25
22
|
return filter.operators.find((operator) => operator.name === operatorName);
|
|
@@ -53,8 +50,10 @@ function FilterContextProvider({ activeFilters, filters, children, }) {
|
|
|
53
50
|
return { operator, relatedFilter };
|
|
54
51
|
},
|
|
55
52
|
flatFilters,
|
|
56
|
-
hasFilterInstances: (name
|
|
57
|
-
|
|
53
|
+
hasFilterInstances: (name, scope) => {
|
|
54
|
+
const matches = (f) => f.name === name && (scope === undefined || f.scope === scope);
|
|
55
|
+
return activeFilters.some(matches) || pendingFilters.some(matches);
|
|
56
|
+
},
|
|
58
57
|
restoreFilterFocus,
|
|
59
58
|
}), [activeFilters, findFilter, flatFilters, pendingFilters, restoreFilterFocus]);
|
|
60
59
|
return (React__default.createElement(FilterContext.Provider, { value: value }, children));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterContext.js","sources":["../../../src/components/DataTable/FilterContext.tsx"],"sourcesContent":["import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n} from \"react\"\n\nimport type {\n ActiveFilter,\n FilterNode,\n FilterNodeItem,\n Operator,\n} from \"./FilterTypes\"\nimport {
|
|
1
|
+
{"version":3,"file":"FilterContext.js","sources":["../../../src/components/DataTable/FilterContext.tsx"],"sourcesContent":["import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n} from \"react\"\n\nimport type {\n ActiveFilter,\n FilterNode,\n FilterNodeItem,\n Operator,\n} from \"./FilterTypes\"\nimport {\n PendingFilterProvider,\n usePendingFilters,\n} from \"./PendingFilterContext\"\nimport { SearchableFiltersProvider } from \"./SearchableFilters\"\nimport { isKnownScope, isScopedFilter } from \"./utils\"\n\nexport type RelatedFilterOperatorResult = {\n operator?: Operator\n relatedFilter?: FilterNodeItem\n}\nexport const FilterContext = createContext<{\n addFilterButtonRef: React.RefObject<HTMLButtonElement>\n findActiveFilterOperator: (\n activeFilter: ActiveFilter\n ) => RelatedFilterOperatorResult | undefined\n flatFilters: FilterNodeItem[]\n hasFilterInstances: (name: string, scope?: string) => boolean\n /** Restores focus after an action (e.g. clearing filters). */\n restoreFilterFocus: () => void\n}>({\n addFilterButtonRef: { current: null },\n findActiveFilterOperator: () => undefined,\n flatFilters: [],\n hasFilterInstances: () => false,\n restoreFilterFocus: () => {},\n})\n\nfunction flattenFilters(nodes: FilterNode[]): FilterNodeItem[] {\n return nodes.flatMap((node) =>\n node.children ? flattenFilters(node.children) : node\n )\n}\n\nfunction findScopeFilter(filter: FilterNodeItem, scope: string | undefined) {\n if (scope === undefined || !isScopedFilter(filter)) return undefined\n return isKnownScope(filter, scope) ? filter.scopeFilter : undefined\n}\n\nfunction findOperator(filter: FilterNodeItem, operatorName: string) {\n return filter.operators.find((operator) => operator.name === operatorName)\n}\n\nexport function FiltersProvider({\n activeFilters = [],\n filters,\n children,\n}: {\n activeFilters?: ActiveFilter[]\n children: React.ReactNode\n filters: FilterNode[]\n}) {\n return (\n <PendingFilterProvider>\n <SearchableFiltersProvider filters={filters}>\n <FilterContextProvider activeFilters={activeFilters} filters={filters}>\n {children}\n </FilterContextProvider>\n </SearchableFiltersProvider>\n </PendingFilterProvider>\n )\n}\n\nfunction FilterContextProvider({\n activeFilters,\n filters,\n children,\n}: {\n activeFilters: ActiveFilter[]\n children: React.ReactNode\n filters: FilterNode[]\n}) {\n const { pendingFilters } = usePendingFilters()\n const flatFilters = useMemo(() => flattenFilters(filters), [filters])\n const findFilter = useCallback(\n (activeFilter: ActiveFilter) =>\n flatFilters.find((f) => f.name === activeFilter.name),\n [flatFilters]\n )\n const addFilterButtonRef = useRef<HTMLButtonElement>(null!)\n const restoreFilterFocus = useCallback(() => {\n addFilterButtonRef.current?.focus()\n }, [])\n const value = useMemo(\n () => ({\n addFilterButtonRef,\n findActiveFilterOperator: (activeFilter: ActiveFilter) => {\n const relatedFilter = findFilter(activeFilter)\n if (!relatedFilter) return { operator: undefined, relatedFilter }\n\n const scopeFilter = findScopeFilter(relatedFilter, activeFilter.scope)\n const isScopeUnrecognized =\n isScopedFilter(relatedFilter) &&\n activeFilter.scope !== undefined &&\n !scopeFilter\n\n const operator = isScopeUnrecognized\n ? undefined\n : findOperator(scopeFilter ?? relatedFilter, activeFilter.operator)\n return { operator, relatedFilter }\n },\n flatFilters,\n hasFilterInstances: (name: string, scope?: string) => {\n const matches = (f: ActiveFilter) =>\n f.name === name && (scope === undefined || f.scope === scope)\n return activeFilters.some(matches) || pendingFilters.some(matches)\n },\n restoreFilterFocus,\n }),\n [activeFilters, findFilter, flatFilters, pendingFilters, restoreFilterFocus]\n )\n return (\n <FilterContext.Provider value={value}>{children}</FilterContext.Provider>\n )\n}\n\nexport function useRelatedFilterOperator(\n activeFilter: ActiveFilter\n): RelatedFilterOperatorResult {\n const context = React.useContext(FilterContext)\n return (\n context.findActiveFilterOperator(activeFilter) || {\n operator: undefined,\n relatedFilter: undefined,\n }\n )\n}\n\nexport function useAddFilterButtonRef() {\n return React.useContext(FilterContext).addFilterButtonRef\n}\n\nexport function useRestoreFilterFocus() {\n return React.useContext(FilterContext).restoreFilterFocus\n}\n\nexport function useHasFilterInstancesChecker(): (\n name: string,\n scope?: string\n) => boolean {\n return useContext(FilterContext).hasFilterInstances\n}\n"],"names":["React"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterControls.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/FilterControls.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAuD,MAAM,OAAO,CAAA;AAY3E,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EAGX,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"FilterControls.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/FilterControls.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAuD,MAAM,OAAO,CAAA;AAY3E,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EAGX,MAAM,eAAe,CAAA;AAgJtB,MAAM,WAAW,mBAAmB;IAClC,2FAA2F;IAC3F,aAAa,CAAC,EAAE,YAAY,EAAE,CAAA;IAC9B,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,uDAAuD;IACvD,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;CAC3B;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,EAC7B,aAAkB,EAClB,OAAO,EACP,eAAuB,EACvB,aAAwB,GACzB,EAAE,mBAAmB,qBAgHrB;yBArHe,cAAc"}
|
|
@@ -21,7 +21,7 @@ import styles from './FilterControls.module.css.js';
|
|
|
21
21
|
import { PendingFilterQueue, useQueuePendingFilter, useIsFilterTaken } from './PendingFilterQueue.js';
|
|
22
22
|
import { useSearchableFilters } from './SearchableFilters.js';
|
|
23
23
|
import { TruncatedFilterLabel } from './TruncatedFilterLabel.js';
|
|
24
|
-
import { getDefaultOperatorName } from './utils.js';
|
|
24
|
+
import { getDefaultOperatorName, isScopedFilter, hasAvailableScope } from './utils.js';
|
|
25
25
|
|
|
26
26
|
const NOOP_ACTION = () => { };
|
|
27
27
|
/** Mirrors the `::after` separator in `.search-result-grouping-chevron`. */
|
|
@@ -34,7 +34,14 @@ function isFilterNodeVisible(node, isFilterTaken) {
|
|
|
34
34
|
if (node.children) {
|
|
35
35
|
return node.children.some((child) => isFilterNodeVisible(child, isFilterTaken));
|
|
36
36
|
}
|
|
37
|
-
return node
|
|
37
|
+
return isFilterItemAvailable(node, isFilterTaken);
|
|
38
|
+
}
|
|
39
|
+
function isFilterItemAvailable(node, isFilterTaken) {
|
|
40
|
+
if (!node.allowMultiple)
|
|
41
|
+
return !isFilterTaken(node.name);
|
|
42
|
+
if (!isScopedFilter(node) || node.allowMultiplePerScope)
|
|
43
|
+
return true;
|
|
44
|
+
return hasAvailableScope(node, (scope) => isFilterTaken(node.name, scope));
|
|
38
45
|
}
|
|
39
46
|
// Must be a dedicated component, not returned inline from `renderFilterItem`.
|
|
40
47
|
// RAC clones an `id` onto whatever that function returns, and an inline
|
|
@@ -54,8 +61,7 @@ function FilterSubmenu({ group }) {
|
|
|
54
61
|
function FilterItem({ node }) {
|
|
55
62
|
const queuePendingFilter = useQueuePendingFilter();
|
|
56
63
|
const isFilterTaken = useIsFilterTaken();
|
|
57
|
-
|
|
58
|
-
if (hide)
|
|
64
|
+
if (!isFilterItemAvailable(node, isFilterTaken))
|
|
59
65
|
return null;
|
|
60
66
|
return (React__default.createElement(DropdownAction, { key: node.name, id: node.name, onAction: () => queuePendingFilter({
|
|
61
67
|
name: node.name,
|
|
@@ -114,7 +120,10 @@ FilterControls.displayName = "FilterControls";
|
|
|
114
120
|
function SearchResultItem({ filter }) {
|
|
115
121
|
const queuePendingFilter = useQueuePendingFilter();
|
|
116
122
|
const isFilterTaken = useIsFilterTaken();
|
|
117
|
-
const
|
|
123
|
+
const isScopeTaken = filter.scope !== undefined &&
|
|
124
|
+
!filter.allowMultiplePerScope &&
|
|
125
|
+
isFilterTaken(filter.name, filter.scope);
|
|
126
|
+
const hide = (!filter.allowMultiple && isFilterTaken(filter.name)) || isScopeTaken;
|
|
118
127
|
if (hide)
|
|
119
128
|
return null;
|
|
120
129
|
const [, ...remainingGrouping] = filter.grouping;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterControls.js","sources":["../../../src/components/DataTable/FilterControls.tsx"],"sourcesContent":["import { Button, IconButton } from \"@components/button\"\nimport { ButtonGroup } from \"@components/button-group\"\nimport { DropdownAction, DropdownSection } from \"@components/dropdown\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"@components/popover\"\nimport Icon from \"@utilities/Icon\"\nimport { useId } from \"@utilities/useId\"\nimport classNames from \"classnames\"\nimport React, { type ReactElement, useMemo, useRef, useState } from \"react\"\nimport { Autocomplete, SearchField } from \"react-aria-components\"\nimport { Input } from \"react-aria-components/Input\"\nimport { Label } from \"react-aria-components/Label\"\nimport {\n Menu,\n Popover as AriaPopover,\n SubmenuTrigger,\n} from \"react-aria-components/Menu\"\n\nimport { useAddFilterButtonRef } from \"./FilterContext\"\nimport styles from \"./FilterControls.module.css\"\nimport type {\n ActiveFilter,\n FilterNode,\n FilterNodeGroup,\n FilterNodeItem,\n} from \"./FilterTypes\"\nimport {\n PendingFilterQueue,\n useIsFilterTaken,\n useQueuePendingFilter,\n} from \"./PendingFilterQueue\"\nimport type { SearchableSimpleFilterItem } from \"./SearchableFilters\"\nimport { useSearchableFilters } from \"./SearchableFilters\"\nimport { TruncatedFilterLabel } from \"./TruncatedFilterLabel\"\nimport { getDefaultOperatorName } from \"./utils\"\n\nconst NOOP_ACTION = () => {}\n\n/** Mirrors the `::after` separator in `.search-result-grouping-chevron`. */\nconst GROUPING_SEPARATOR = \" › \"\n\nconst useVisibleChildren = (group: FilterNodeGroup) => {\n const isFilterTaken = useIsFilterTaken()\n return group.children.filter((child) =>\n isFilterNodeVisible(child, isFilterTaken)\n )\n}\n\nfunction isFilterNodeVisible(\n node: FilterNode,\n isFilterTaken: (name: string) => boolean\n): boolean {\n if (node.children) {\n return node.children.some((child) =>\n isFilterNodeVisible(child, isFilterTaken)\n )\n }\n\n return node.allowMultiple || !isFilterTaken(node.name)\n}\n\n// Must be a dedicated component, not returned inline from `renderFilterItem`.\n// RAC clones an `id` onto whatever that function returns, and an inline\n// `SubmenuTrigger` has none of its own — the clone falls back to `item.id`,\n// colliding with the trigger child's own `id` and silently breaking it.\nfunction FilterSubmenu({ group }: { group: FilterNodeGroup }) {\n const visibleChildren = useVisibleChildren(group)\n\n if (visibleChildren.length === 0) return null\n\n return (\n <SubmenuTrigger>\n <DropdownAction\n className=\"tds-data-table-filter-controls-submenu-trigger\"\n id={group.label}\n onAction={NOOP_ACTION}\n textValue={group.label}\n >\n <span slot=\"label\">{group.label}</span>\n <Icon\n aria-hidden\n className=\"tds-data-table-filter-controls-submenu-chevron\"\n slot=\"suffix\"\n symbol=\"general#right-chevron\"\n />\n </DropdownAction>\n <AriaPopover\n className=\"tds-dropdown-popover tds-data-table-filter-controls-submenu-popover\"\n placement=\"right top\"\n >\n <Menu\n aria-label={group.label}\n className=\"tds-data-table-filter-controls-submenu-list\"\n items={visibleChildren}\n >\n {renderFilterItem}\n </Menu>\n </AriaPopover>\n </SubmenuTrigger>\n )\n}\n\nfunction FilterItem({ node }: { node: FilterNodeItem }) {\n const queuePendingFilter = useQueuePendingFilter()\n const isFilterTaken = useIsFilterTaken()\n const hide = !node.allowMultiple && isFilterTaken(node.name)\n\n if (hide) return null\n\n return (\n <DropdownAction\n key={node.name}\n id={node.name}\n onAction={() =>\n queuePendingFilter({\n name: node.name,\n operator: getDefaultOperatorName(node),\n value: undefined,\n })\n }\n textValue={node.label}\n >\n {({ isFocusVisible, isHovered }) => (\n <TruncatedFilterLabel\n active={isFocusVisible || isHovered}\n text={node.label}\n />\n )}\n </DropdownAction>\n )\n}\n\nfunction FilterGroupSection({ group }: { group: FilterNodeGroup }) {\n const visibleChildren = useVisibleChildren(group)\n\n if (visibleChildren.length === 0) return null\n\n return (\n <DropdownSection id={group.label} title={group.label}>\n {visibleChildren.map(renderFilterItem)}\n </DropdownSection>\n )\n}\n\nfunction renderFilterItem(node: FilterNode): ReactElement {\n if (node.children) {\n if (node.renderChildrenInSubmenu) {\n return <FilterSubmenu key={node.label} group={node} />\n }\n\n return <FilterGroupSection key={node.label} group={node} />\n }\n\n return <FilterItem key={node.name} node={node} />\n}\n\nexport interface FilterControlsProps {\n /** The currently active filters. The toggle button only renders when this is non-empty. */\n activeFilters?: ActiveFilter[]\n filters: FilterNode[]\n /** Whether the filters shelf is currently expanded. */\n isShelfExpanded?: boolean\n /** Called when the toggle button is pressed. */\n onToggleShelf?: () => void\n}\n\n/** Skeleton for the DataTable filters cluster — grows incrementally. */\nexport function FilterControls({\n activeFilters = [],\n filters,\n isShelfExpanded = false,\n onToggleShelf = () => {},\n}: FilterControlsProps) {\n const searchInputId = `tds-data-table-filter-controls-search-${useId()}`\n const [searchQuery, setSearchQuery] = useState(\"\")\n const addFilterButtonRef = useAddFilterButtonRef()\n const searchInputRef = useRef<HTMLInputElement | null>(null)\n\n return (\n <ButtonGroup\n aria-label=\"Filters\"\n className=\"tds-data-table-filter-controls\"\n >\n <Popover\n onOpenChange={(open) => {\n if (open) setSearchQuery(\"\")\n }}\n >\n <PopoverTrigger>\n <Button\n ref={addFilterButtonRef}\n label=\"Add filter\"\n prefix={\n <Icon\n aria-hidden\n symbol=\"general#three-reducing-horizontal-bars\"\n />\n }\n />\n </PopoverTrigger>\n <PopoverContent className=\"tds-data-table-popover\" placement=\"bottom\">\n <PendingFilterQueue>\n <Autocomplete\n filter={prefixSearch}\n inputValue={searchQuery}\n onInputChange={setSearchQuery}\n >\n <SearchField className=\"tds-data-table-filter-controls-search-input-sticky\">\n <Label\n className=\"tds-data-table-filter-controls-label--hidden\"\n htmlFor={searchInputId}\n >\n Search filters\n </Label>\n <div\n className={classNames(\n \"tds-data-table-filter-controls-search-input-control\",\n {\n \"tds-data-table-filter-controls-search-input-control--has-value\":\n searchQuery.length > 0,\n }\n )}\n >\n <Icon\n aria-hidden\n className=\"tds-data-table-filter-controls-search-input-icon\"\n symbol=\"general#search\"\n />\n <Input\n id={searchInputId}\n placeholder=\"Search filters\"\n className=\"tds-data-table-filter-controls-search-input\"\n ref={searchInputRef}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n />\n <IconButton\n aria-label=\"Clear\"\n icon={\n <Icon\n aria-hidden\n className=\"tds-data-table-filter-controls-search-input-clear-icon\"\n symbol=\"general#x\"\n />\n }\n kind=\"neutral-inline\"\n onClick={() => {\n setSearchQuery(\"\")\n searchInputRef.current?.focus()\n }}\n tabIndex={-1}\n />\n </div>\n </SearchField>\n <Menu\n aria-label=\"Filters\"\n items={filters}\n className=\"tds-data-table-filter-controls-list\"\n renderEmptyState={() => (\n <span className=\"tds-dropdown-item\">No filters match</span>\n )}\n >\n {searchQuery.length ? <SearchResults /> : renderFilterItem}\n </Menu>\n </Autocomplete>\n </PendingFilterQueue>\n </PopoverContent>\n </Popover>\n {activeFilters.length > 0 && (\n <Button\n aria-expanded={isShelfExpanded}\n aria-label={`${activeFilters.length} active filter${\n activeFilters.length === 1 ? \"\" : \"s\"\n }`}\n label={\n <span className=\"tds-data-table-filter-controls-badge\">\n {activeFilters.length}\n </span>\n }\n onClick={onToggleShelf}\n />\n )}\n </ButtonGroup>\n )\n}\n\nFilterControls.displayName = \"FilterControls\"\n\nfunction SearchResultItem({ filter }: { filter: SearchableSimpleFilterItem }) {\n const queuePendingFilter = useQueuePendingFilter()\n const isFilterTaken = useIsFilterTaken()\n const hide = !filter.allowMultiple && isFilterTaken(filter.name)\n\n if (hide) return null\n\n const [, ...remainingGrouping] = filter.grouping\n const resultId = filter.scope\n ? `filter-search-${filter.name}-${filter.scope}`\n : `filter-search-${filter.name}`\n const visibleLabel = [...remainingGrouping, filter.label].join(\n GROUPING_SEPARATOR\n )\n\n return (\n <DropdownAction\n key={resultId}\n textValue={filter.searchable}\n id={resultId}\n onAction={() =>\n queuePendingFilter({\n name: filter.name,\n operator: filter.operator,\n scope: filter.scope,\n value: undefined,\n })\n }\n >\n {({ isFocusVisible, isHovered }) => (\n <TruncatedFilterLabel\n active={isFocusVisible || isHovered}\n text={visibleLabel}\n >\n {remainingGrouping.length > 0 && (\n <span className={styles[\"search-result-grouping\"]}>\n {remainingGrouping.map((grouping, index) => (\n <span\n className={styles[\"search-result-grouping-chevron\"]}\n key={`${grouping}-${index}`}\n >\n {grouping}\n <span className={styles[\"search-result-grouping-separator\"]}>\n {\", \"}\n </span>\n </span>\n ))}\n </span>\n )}\n {filter.label}\n </TruncatedFilterLabel>\n )}\n </DropdownAction>\n )\n}\n\nfunction SearchResults() {\n const filters = useSearchableFilters()\n\n const { groups, ungrouped } = useMemo(() => {\n const ungroupedItems = filters.filter((f) => f.grouping.length === 0)\n const groupedItems = new Map<string, SearchableSimpleFilterItem[]>()\n filters.forEach((filter) => {\n const [heading] = filter.grouping\n if (!heading) return\n groupedItems.set(heading, [...(groupedItems.get(heading) ?? []), filter])\n })\n return { groups: groupedItems, ungrouped: ungroupedItems }\n }, [filters])\n\n return (\n <>\n {ungrouped.map((filter) => (\n <SearchResultItem\n key={filter.scope ? `${filter.name}-${filter.scope}` : filter.name}\n filter={filter}\n />\n ))}\n {Array.from(groups, ([groupLabel, items]) => (\n <DropdownSection key={groupLabel} id={groupLabel} title={groupLabel}>\n {items.map((filter) => (\n <SearchResultItem\n key={\n filter.scope ? `${filter.name}-${filter.scope}` : filter.name\n }\n filter={filter}\n />\n ))}\n </DropdownSection>\n ))}\n </>\n )\n}\n\nfunction prefixSearch(string: string, query: string): boolean {\n if (query.length === 0) {\n return true\n }\n\n const segments = query.normalize(\"NFC\").toLowerCase().split(/\\s+/)\n return segments.every((segment) => string.includes(segment))\n}\n"],"names":["React","AriaPopover"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FilterControls.js","sources":["../../../src/components/DataTable/FilterControls.tsx"],"sourcesContent":["import { Button, IconButton } from \"@components/button\"\nimport { ButtonGroup } from \"@components/button-group\"\nimport { DropdownAction, DropdownSection } from \"@components/dropdown\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"@components/popover\"\nimport Icon from \"@utilities/Icon\"\nimport { useId } from \"@utilities/useId\"\nimport classNames from \"classnames\"\nimport React, { type ReactElement, useMemo, useRef, useState } from \"react\"\nimport { Autocomplete, SearchField } from \"react-aria-components\"\nimport { Input } from \"react-aria-components/Input\"\nimport { Label } from \"react-aria-components/Label\"\nimport {\n Menu,\n Popover as AriaPopover,\n SubmenuTrigger,\n} from \"react-aria-components/Menu\"\n\nimport { useAddFilterButtonRef } from \"./FilterContext\"\nimport styles from \"./FilterControls.module.css\"\nimport type {\n ActiveFilter,\n FilterNode,\n FilterNodeGroup,\n FilterNodeItem,\n} from \"./FilterTypes\"\nimport {\n PendingFilterQueue,\n useIsFilterTaken,\n useQueuePendingFilter,\n} from \"./PendingFilterQueue\"\nimport type { SearchableSimpleFilterItem } from \"./SearchableFilters\"\nimport { useSearchableFilters } from \"./SearchableFilters\"\nimport { TruncatedFilterLabel } from \"./TruncatedFilterLabel\"\nimport {\n getDefaultOperatorName,\n hasAvailableScope,\n isScopedFilter,\n} from \"./utils\"\n\nconst NOOP_ACTION = () => {}\n\n/** Mirrors the `::after` separator in `.search-result-grouping-chevron`. */\nconst GROUPING_SEPARATOR = \" › \"\n\nconst useVisibleChildren = (group: FilterNodeGroup) => {\n const isFilterTaken = useIsFilterTaken()\n return group.children.filter((child) =>\n isFilterNodeVisible(child, isFilterTaken)\n )\n}\n\ntype IsFilterTaken = (name: string, scope?: string) => boolean\n\nfunction isFilterNodeVisible(\n node: FilterNode,\n isFilterTaken: IsFilterTaken\n): boolean {\n if (node.children) {\n return node.children.some((child) =>\n isFilterNodeVisible(child, isFilterTaken)\n )\n }\n\n return isFilterItemAvailable(node, isFilterTaken)\n}\n\nfunction isFilterItemAvailable(\n node: FilterNodeItem,\n isFilterTaken: IsFilterTaken\n) {\n if (!node.allowMultiple) return !isFilterTaken(node.name)\n if (!isScopedFilter(node) || node.allowMultiplePerScope) return true\n return hasAvailableScope(node, (scope) => isFilterTaken(node.name, scope))\n}\n\n// Must be a dedicated component, not returned inline from `renderFilterItem`.\n// RAC clones an `id` onto whatever that function returns, and an inline\n// `SubmenuTrigger` has none of its own — the clone falls back to `item.id`,\n// colliding with the trigger child's own `id` and silently breaking it.\nfunction FilterSubmenu({ group }: { group: FilterNodeGroup }) {\n const visibleChildren = useVisibleChildren(group)\n\n if (visibleChildren.length === 0) return null\n\n return (\n <SubmenuTrigger>\n <DropdownAction\n className=\"tds-data-table-filter-controls-submenu-trigger\"\n id={group.label}\n onAction={NOOP_ACTION}\n textValue={group.label}\n >\n <span slot=\"label\">{group.label}</span>\n <Icon\n aria-hidden\n className=\"tds-data-table-filter-controls-submenu-chevron\"\n slot=\"suffix\"\n symbol=\"general#right-chevron\"\n />\n </DropdownAction>\n <AriaPopover\n className=\"tds-dropdown-popover tds-data-table-filter-controls-submenu-popover\"\n placement=\"right top\"\n >\n <Menu\n aria-label={group.label}\n className=\"tds-data-table-filter-controls-submenu-list\"\n items={visibleChildren}\n >\n {renderFilterItem}\n </Menu>\n </AriaPopover>\n </SubmenuTrigger>\n )\n}\n\nfunction FilterItem({ node }: { node: FilterNodeItem }) {\n const queuePendingFilter = useQueuePendingFilter()\n const isFilterTaken = useIsFilterTaken()\n if (!isFilterItemAvailable(node, isFilterTaken)) return null\n\n return (\n <DropdownAction\n key={node.name}\n id={node.name}\n onAction={() =>\n queuePendingFilter({\n name: node.name,\n operator: getDefaultOperatorName(node),\n value: undefined,\n })\n }\n textValue={node.label}\n >\n {({ isFocusVisible, isHovered }) => (\n <TruncatedFilterLabel\n active={isFocusVisible || isHovered}\n text={node.label}\n />\n )}\n </DropdownAction>\n )\n}\n\nfunction FilterGroupSection({ group }: { group: FilterNodeGroup }) {\n const visibleChildren = useVisibleChildren(group)\n\n if (visibleChildren.length === 0) return null\n\n return (\n <DropdownSection id={group.label} title={group.label}>\n {visibleChildren.map(renderFilterItem)}\n </DropdownSection>\n )\n}\n\nfunction renderFilterItem(node: FilterNode): ReactElement {\n if (node.children) {\n if (node.renderChildrenInSubmenu) {\n return <FilterSubmenu key={node.label} group={node} />\n }\n\n return <FilterGroupSection key={node.label} group={node} />\n }\n\n return <FilterItem key={node.name} node={node} />\n}\n\nexport interface FilterControlsProps {\n /** The currently active filters. The toggle button only renders when this is non-empty. */\n activeFilters?: ActiveFilter[]\n filters: FilterNode[]\n /** Whether the filters shelf is currently expanded. */\n isShelfExpanded?: boolean\n /** Called when the toggle button is pressed. */\n onToggleShelf?: () => void\n}\n\n/** Skeleton for the DataTable filters cluster — grows incrementally. */\nexport function FilterControls({\n activeFilters = [],\n filters,\n isShelfExpanded = false,\n onToggleShelf = () => {},\n}: FilterControlsProps) {\n const searchInputId = `tds-data-table-filter-controls-search-${useId()}`\n const [searchQuery, setSearchQuery] = useState(\"\")\n const addFilterButtonRef = useAddFilterButtonRef()\n const searchInputRef = useRef<HTMLInputElement | null>(null)\n\n return (\n <ButtonGroup\n aria-label=\"Filters\"\n className=\"tds-data-table-filter-controls\"\n >\n <Popover\n onOpenChange={(open) => {\n if (open) setSearchQuery(\"\")\n }}\n >\n <PopoverTrigger>\n <Button\n ref={addFilterButtonRef}\n label=\"Add filter\"\n prefix={\n <Icon\n aria-hidden\n symbol=\"general#three-reducing-horizontal-bars\"\n />\n }\n />\n </PopoverTrigger>\n <PopoverContent className=\"tds-data-table-popover\" placement=\"bottom\">\n <PendingFilterQueue>\n <Autocomplete\n filter={prefixSearch}\n inputValue={searchQuery}\n onInputChange={setSearchQuery}\n >\n <SearchField className=\"tds-data-table-filter-controls-search-input-sticky\">\n <Label\n className=\"tds-data-table-filter-controls-label--hidden\"\n htmlFor={searchInputId}\n >\n Search filters\n </Label>\n <div\n className={classNames(\n \"tds-data-table-filter-controls-search-input-control\",\n {\n \"tds-data-table-filter-controls-search-input-control--has-value\":\n searchQuery.length > 0,\n }\n )}\n >\n <Icon\n aria-hidden\n className=\"tds-data-table-filter-controls-search-input-icon\"\n symbol=\"general#search\"\n />\n <Input\n id={searchInputId}\n placeholder=\"Search filters\"\n className=\"tds-data-table-filter-controls-search-input\"\n ref={searchInputRef}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n />\n <IconButton\n aria-label=\"Clear\"\n icon={\n <Icon\n aria-hidden\n className=\"tds-data-table-filter-controls-search-input-clear-icon\"\n symbol=\"general#x\"\n />\n }\n kind=\"neutral-inline\"\n onClick={() => {\n setSearchQuery(\"\")\n searchInputRef.current?.focus()\n }}\n tabIndex={-1}\n />\n </div>\n </SearchField>\n <Menu\n aria-label=\"Filters\"\n items={filters}\n className=\"tds-data-table-filter-controls-list\"\n renderEmptyState={() => (\n <span className=\"tds-dropdown-item\">No filters match</span>\n )}\n >\n {searchQuery.length ? <SearchResults /> : renderFilterItem}\n </Menu>\n </Autocomplete>\n </PendingFilterQueue>\n </PopoverContent>\n </Popover>\n {activeFilters.length > 0 && (\n <Button\n aria-expanded={isShelfExpanded}\n aria-label={`${activeFilters.length} active filter${\n activeFilters.length === 1 ? \"\" : \"s\"\n }`}\n label={\n <span className=\"tds-data-table-filter-controls-badge\">\n {activeFilters.length}\n </span>\n }\n onClick={onToggleShelf}\n />\n )}\n </ButtonGroup>\n )\n}\n\nFilterControls.displayName = \"FilterControls\"\n\nfunction SearchResultItem({ filter }: { filter: SearchableSimpleFilterItem }) {\n const queuePendingFilter = useQueuePendingFilter()\n const isFilterTaken = useIsFilterTaken()\n const isScopeTaken =\n filter.scope !== undefined &&\n !filter.allowMultiplePerScope &&\n isFilterTaken(filter.name, filter.scope)\n const hide =\n (!filter.allowMultiple && isFilterTaken(filter.name)) || isScopeTaken\n\n if (hide) return null\n\n const [, ...remainingGrouping] = filter.grouping\n const resultId = filter.scope\n ? `filter-search-${filter.name}-${filter.scope}`\n : `filter-search-${filter.name}`\n const visibleLabel = [...remainingGrouping, filter.label].join(\n GROUPING_SEPARATOR\n )\n\n return (\n <DropdownAction\n key={resultId}\n textValue={filter.searchable}\n id={resultId}\n onAction={() =>\n queuePendingFilter({\n name: filter.name,\n operator: filter.operator,\n scope: filter.scope,\n value: undefined,\n })\n }\n >\n {({ isFocusVisible, isHovered }) => (\n <TruncatedFilterLabel\n active={isFocusVisible || isHovered}\n text={visibleLabel}\n >\n {remainingGrouping.length > 0 && (\n <span className={styles[\"search-result-grouping\"]}>\n {remainingGrouping.map((grouping, index) => (\n <span\n className={styles[\"search-result-grouping-chevron\"]}\n key={`${grouping}-${index}`}\n >\n {grouping}\n <span className={styles[\"search-result-grouping-separator\"]}>\n {\", \"}\n </span>\n </span>\n ))}\n </span>\n )}\n {filter.label}\n </TruncatedFilterLabel>\n )}\n </DropdownAction>\n )\n}\n\nfunction SearchResults() {\n const filters = useSearchableFilters()\n\n const { groups, ungrouped } = useMemo(() => {\n const ungroupedItems = filters.filter((f) => f.grouping.length === 0)\n const groupedItems = new Map<string, SearchableSimpleFilterItem[]>()\n filters.forEach((filter) => {\n const [heading] = filter.grouping\n if (!heading) return\n groupedItems.set(heading, [...(groupedItems.get(heading) ?? []), filter])\n })\n return { groups: groupedItems, ungrouped: ungroupedItems }\n }, [filters])\n\n return (\n <>\n {ungrouped.map((filter) => (\n <SearchResultItem\n key={filter.scope ? `${filter.name}-${filter.scope}` : filter.name}\n filter={filter}\n />\n ))}\n {Array.from(groups, ([groupLabel, items]) => (\n <DropdownSection key={groupLabel} id={groupLabel} title={groupLabel}>\n {items.map((filter) => (\n <SearchResultItem\n key={\n filter.scope ? `${filter.name}-${filter.scope}` : filter.name\n }\n filter={filter}\n />\n ))}\n </DropdownSection>\n ))}\n </>\n )\n}\n\nfunction prefixSearch(string: string, query: string): boolean {\n if (query.length === 0) {\n return true\n }\n\n const segments = query.normalize(\"NFC\").toLowerCase().split(/\\s+/)\n return segments.every((segment) => string.includes(segment))\n}\n"],"names":["React","AriaPopover"],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ export interface Operator {
|
|
|
12
12
|
name: string;
|
|
13
13
|
}
|
|
14
14
|
export interface FilterNodeItem extends FilterNodeBase {
|
|
15
|
-
/** Whether multiple instances of this filter can be active simultaneously. */
|
|
15
|
+
/** Whether multiple instances of this filter can be active simultaneously. `scopedFilter` defaults this to true. */
|
|
16
16
|
allowMultiple?: boolean;
|
|
17
17
|
children?: never;
|
|
18
18
|
/** Binds this filter to one active filter's operator and value. Supplied by the filter factories. */
|
|
@@ -44,12 +44,12 @@ export type ScopeOption = {
|
|
|
44
44
|
* while these are alternatives the user picks between one at a time.
|
|
45
45
|
*/
|
|
46
46
|
export interface FilterNodeScoped extends FilterNodeItem {
|
|
47
|
+
/** Whether multiple instances can share a scope. Otherwise a scope in use by one instance is disabled for the rest. */
|
|
48
|
+
allowMultiplePerScope?: boolean;
|
|
47
49
|
/** The scopes to pick from. Empty when they load lazily in the editor. */
|
|
48
50
|
options: ScopeOption[];
|
|
49
51
|
scopeFilter: FilterNodeItem;
|
|
50
52
|
}
|
|
51
|
-
/** Whether a filter delegates to scoped options. */
|
|
52
|
-
export declare function isScopedFilter(filter: FilterNodeItem): filter is FilterNodeScoped;
|
|
53
53
|
export interface FilterNodeGroup extends FilterNodeBase {
|
|
54
54
|
/** Filters and nested groups, in display order. */
|
|
55
55
|
children: FilterNode[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterTypes.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/FilterTypes.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAElE,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,SAAS,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,
|
|
1
|
+
{"version":3,"file":"FilterTypes.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/FilterTypes.tsx"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,6 @@ export declare function PendingFilterQueue({ children }: {
|
|
|
8
8
|
children: ReactNode;
|
|
9
9
|
}): React.JSX.Element;
|
|
10
10
|
export declare function useQueuePendingFilter(): (filter: ActiveFilter) => void;
|
|
11
|
-
/** Whether a filter is active, pending, or queued to become pending. */
|
|
12
|
-
export declare function useIsFilterTaken(): (name: string) => boolean;
|
|
11
|
+
/** Whether a filter, or one of its scopes, is active, pending, or queued to become pending. */
|
|
12
|
+
export declare function useIsFilterTaken(): (name: string, scope?: string) => boolean;
|
|
13
13
|
//# sourceMappingURL=PendingFilterQueue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PendingFilterQueue.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/PendingFilterQueue.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAEZ,KAAK,SAAS,EAMf,MAAM,OAAO,CAAA;AAGd,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AASjD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,qBA8BvE;AAED,wBAAgB,qBAAqB,aA1CoB,YAAY,KAAK,IAAI,CA4C7E;AAED
|
|
1
|
+
{"version":3,"file":"PendingFilterQueue.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/PendingFilterQueue.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAEZ,KAAK,SAAS,EAMf,MAAM,OAAO,CAAA;AAGd,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AASjD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,qBA8BvE;AAED,wBAAgB,qBAAqB,aA1CoB,YAAY,KAAK,IAAI,CA4C7E;AAED,+FAA+F;AAC/F,wBAAgB,gBAAgB,KAGtB,MAAM,MAAM,EAAE,QAAQ,MAAM,aAKrC"}
|
|
@@ -3,7 +3,7 @@ import { useHasFilterInstancesChecker } from './FilterContext.js';
|
|
|
3
3
|
import { usePendingFilters } from './PendingFilterContext.js';
|
|
4
4
|
|
|
5
5
|
const QueuePendingFilterContext = createContext(() => { });
|
|
6
|
-
const
|
|
6
|
+
const QueuedFiltersContext = createContext([]);
|
|
7
7
|
/**
|
|
8
8
|
* Defers `addPendingFilter` for everything queued beneath it until this
|
|
9
9
|
* component unmounts — i.e. until the enclosing menu popover has fully closed.
|
|
@@ -15,10 +15,10 @@ function PendingFilterQueue({ children }) {
|
|
|
15
15
|
addPendingFilterRef.current = addPendingFilter;
|
|
16
16
|
}, [addPendingFilter]);
|
|
17
17
|
const queue = useRef([]);
|
|
18
|
-
const [
|
|
18
|
+
const [queuedFilters, setQueuedFilters] = useState([]);
|
|
19
19
|
const queuePendingFilter = useCallback((filter) => {
|
|
20
20
|
queue.current.push(filter);
|
|
21
|
-
|
|
21
|
+
setQueuedFilters((prev) => [...prev, filter]);
|
|
22
22
|
}, []);
|
|
23
23
|
useEffect(() => () => {
|
|
24
24
|
const filters = queue.current;
|
|
@@ -26,16 +26,17 @@ function PendingFilterQueue({ children }) {
|
|
|
26
26
|
filters.forEach((filter) => addPendingFilterRef.current(filter));
|
|
27
27
|
}, []);
|
|
28
28
|
return (React__default.createElement(QueuePendingFilterContext.Provider, { value: queuePendingFilter },
|
|
29
|
-
React__default.createElement(
|
|
29
|
+
React__default.createElement(QueuedFiltersContext.Provider, { value: queuedFilters }, children)));
|
|
30
30
|
}
|
|
31
31
|
function useQueuePendingFilter() {
|
|
32
32
|
return useContext(QueuePendingFilterContext);
|
|
33
33
|
}
|
|
34
|
-
/** Whether a filter is active, pending, or queued to become pending. */
|
|
34
|
+
/** Whether a filter, or one of its scopes, is active, pending, or queued to become pending. */
|
|
35
35
|
function useIsFilterTaken() {
|
|
36
36
|
const hasFilterInstances = useHasFilterInstancesChecker();
|
|
37
|
-
const
|
|
38
|
-
return (name) => hasFilterInstances(name) ||
|
|
37
|
+
const queuedFilters = useContext(QueuedFiltersContext);
|
|
38
|
+
return (name, scope) => hasFilterInstances(name, scope) ||
|
|
39
|
+
queuedFilters.some((f) => f.name === name && (scope === undefined || f.scope === scope));
|
|
39
40
|
}
|
|
40
41
|
|
|
41
42
|
export { PendingFilterQueue, useIsFilterTaken, useQueuePendingFilter };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PendingFilterQueue.js","sources":["../../../src/components/DataTable/PendingFilterQueue.tsx"],"sourcesContent":["import React, {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\"\n\nimport { useHasFilterInstancesChecker } from \"./FilterContext\"\nimport type { ActiveFilter } from \"./FilterTypes\"\nimport { usePendingFilters } from \"./PendingFilterContext\"\n\nconst QueuePendingFilterContext = createContext<(filter: ActiveFilter) => void>(\n () => {}\n)\n\nconst
|
|
1
|
+
{"version":3,"file":"PendingFilterQueue.js","sources":["../../../src/components/DataTable/PendingFilterQueue.tsx"],"sourcesContent":["import React, {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\"\n\nimport { useHasFilterInstancesChecker } from \"./FilterContext\"\nimport type { ActiveFilter } from \"./FilterTypes\"\nimport { usePendingFilters } from \"./PendingFilterContext\"\n\nconst QueuePendingFilterContext = createContext<(filter: ActiveFilter) => void>(\n () => {}\n)\n\nconst QueuedFiltersContext = createContext<ActiveFilter[]>([])\n\n/**\n * Defers `addPendingFilter` for everything queued beneath it until this\n * component unmounts — i.e. until the enclosing menu popover has fully closed.\n */\nexport function PendingFilterQueue({ children }: { children: ReactNode }) {\n const { addPendingFilter } = usePendingFilters()\n const addPendingFilterRef = useRef(addPendingFilter)\n useEffect(() => {\n addPendingFilterRef.current = addPendingFilter\n }, [addPendingFilter])\n\n const queue = useRef<ActiveFilter[]>([])\n const [queuedFilters, setQueuedFilters] = useState<ActiveFilter[]>([])\n const queuePendingFilter = useCallback((filter: ActiveFilter) => {\n queue.current.push(filter)\n setQueuedFilters((prev) => [...prev, filter])\n }, [])\n\n useEffect(\n () => () => {\n const filters = queue.current\n queue.current = []\n filters.forEach((filter) => addPendingFilterRef.current(filter))\n },\n []\n )\n\n return (\n <QueuePendingFilterContext.Provider value={queuePendingFilter}>\n <QueuedFiltersContext.Provider value={queuedFilters}>\n {children}\n </QueuedFiltersContext.Provider>\n </QueuePendingFilterContext.Provider>\n )\n}\n\nexport function useQueuePendingFilter() {\n return useContext(QueuePendingFilterContext)\n}\n\n/** Whether a filter, or one of its scopes, is active, pending, or queued to become pending. */\nexport function useIsFilterTaken() {\n const hasFilterInstances = useHasFilterInstancesChecker()\n const queuedFilters = useContext(QueuedFiltersContext)\n return (name: string, scope?: string) =>\n hasFilterInstances(name, scope) ||\n queuedFilters.some(\n (f) => f.name === name && (scope === undefined || f.scope === scope)\n )\n}\n"],"names":["React"],"mappings":";;;;AAcA,MAAM,yBAAyB,GAAG,aAAa,CAC7C,MAAK,EAAE,CAAC,CACT;AAED,MAAM,oBAAoB,GAAG,aAAa,CAAiB,EAAE,CAAC;AAE9D;;;AAGG;AACG,SAAU,kBAAkB,CAAC,EAAE,QAAQ,EAA2B,EAAA;AACtE,IAAA,MAAM,EAAE,gBAAgB,EAAE,GAAG,iBAAiB,EAAE;AAChD,IAAA,MAAM,mBAAmB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACpD,SAAS,CAAC,MAAK;AACb,QAAA,mBAAmB,CAAC,OAAO,GAAG,gBAAgB;AAChD,IAAA,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;AAEtB,IAAA,MAAM,KAAK,GAAG,MAAM,CAAiB,EAAE,CAAC;IACxC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAiB,EAAE,CAAC;AACtE,IAAA,MAAM,kBAAkB,GAAG,WAAW,CAAC,CAAC,MAAoB,KAAI;AAC9D,QAAA,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;AAC1B,QAAA,gBAAgB,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,SAAS,CACP,MAAM,MAAK;AACT,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO;AAC7B,QAAA,KAAK,CAAC,OAAO,GAAG,EAAE;AAClB,QAAA,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC,EACD,EAAE,CACH;IAED,QACEA,6BAAC,yBAAyB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,kBAAkB,EAAA;AAC3D,QAAAA,cAAA,CAAA,aAAA,CAAC,oBAAoB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,aAAa,EAAA,EAChD,QAAQ,CACqB,CACG;AAEzC;SAEgB,qBAAqB,GAAA;AACnC,IAAA,OAAO,UAAU,CAAC,yBAAyB,CAAC;AAC9C;AAEA;SACgB,gBAAgB,GAAA;AAC9B,IAAA,MAAM,kBAAkB,GAAG,4BAA4B,EAAE;AACzD,IAAA,MAAM,aAAa,GAAG,UAAU,CAAC,oBAAoB,CAAC;AACtD,IAAA,OAAO,CAAC,IAAY,EAAE,KAAc,KAClC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC;QAC/B,aAAa,CAAC,IAAI,CAChB,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CACrE;AACL;;;;"}
|
|
@@ -3,6 +3,7 @@ import { FilterNode } from "./FilterTypes";
|
|
|
3
3
|
export declare function useSearchableFilters(): SearchableSimpleFilterItem[];
|
|
4
4
|
export type SearchableSimpleFilterItem = {
|
|
5
5
|
allowMultiple?: boolean;
|
|
6
|
+
allowMultiplePerScope?: boolean;
|
|
6
7
|
grouping: string[];
|
|
7
8
|
label: string;
|
|
8
9
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchableFilters.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/SearchableFilters.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6C,MAAM,OAAO,CAAA;AAEjE,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"SearchableFilters.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/SearchableFilters.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6C,MAAM,OAAO,CAAA;AAEjE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAG1C,wBAAgB,oBAAoB,IAAI,0BAA0B,EAAE,CAEnE;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,mFAAmF;IACnF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAID,wBAAgB,yBAAyB,CAAC,EACxC,QAAQ,EACR,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,OAAO,EAAE,UAAU,EAAE,CAAA;CACtB,qBA8DA"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import React__default, { createContext, useMemo, useContext } from 'react';
|
|
2
|
-
import { isScopedFilter } from './
|
|
3
|
-
import { getDefaultOperatorName } from './utils.js';
|
|
2
|
+
import { isScopedFilter, getDefaultOperatorName } from './utils.js';
|
|
4
3
|
|
|
5
4
|
function useSearchableFilters() {
|
|
6
5
|
return useContext(SearchableFiltersContext);
|
|
@@ -27,6 +26,7 @@ function SearchableFiltersProvider({ children, filters, }) {
|
|
|
27
26
|
.toLowerCase();
|
|
28
27
|
result.push({
|
|
29
28
|
allowMultiple: filter.allowMultiple,
|
|
29
|
+
allowMultiplePerScope: filter.allowMultiplePerScope,
|
|
30
30
|
grouping: optionGrouping,
|
|
31
31
|
label: option.label,
|
|
32
32
|
name: filter.name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchableFilters.js","sources":["../../../src/components/DataTable/SearchableFilters.tsx"],"sourcesContent":["import React, { createContext, useContext, useMemo } from \"react\"\n\nimport { FilterNode
|
|
1
|
+
{"version":3,"file":"SearchableFilters.js","sources":["../../../src/components/DataTable/SearchableFilters.tsx"],"sourcesContent":["import React, { createContext, useContext, useMemo } from \"react\"\n\nimport { FilterNode } from \"./FilterTypes\"\nimport { getDefaultOperatorName, isScopedFilter } from \"./utils\"\n\nexport function useSearchableFilters(): SearchableSimpleFilterItem[] {\n return useContext(SearchableFiltersContext)\n}\n\nexport type SearchableSimpleFilterItem = {\n allowMultiple?: boolean\n allowMultiplePerScope?: boolean\n grouping: string[]\n label: string\n name: string\n operator: string\n /** For a scoped filter's option: the scope to pre-select on the pending filter. */\n scope?: string\n searchable: string\n}\n\nconst SearchableFiltersContext = createContext<SearchableSimpleFilterItem[]>([])\n\nexport function SearchableFiltersProvider({\n children,\n filters,\n}: {\n children: React.ReactNode\n filters: FilterNode[]\n}) {\n const searchableSimpleFilterItems = useMemo(() => {\n const result: SearchableSimpleFilterItem[] = []\n\n function addFilterItem(\n filter: FilterNode,\n grouping: string[] = [],\n collectedKeywords: string[] = []\n ) {\n const keywords = [...collectedKeywords, ...(filter.keywords || [])]\n if (filter.children) {\n return filter.children.forEach((child) =>\n addFilterItem(child, [...grouping, filter.label], keywords)\n )\n }\n\n if (isScopedFilter(filter)) {\n return filter.options.forEach((option) => {\n const optionGrouping = [...grouping, filter.label]\n const optionKeywords = [...keywords, ...(option.keywords || [])]\n const optionSearchable = dedup([\n ...optionGrouping,\n option.label,\n ...optionKeywords,\n ])\n .join(\" \")\n .toLowerCase()\n result.push({\n allowMultiple: filter.allowMultiple,\n allowMultiplePerScope: filter.allowMultiplePerScope,\n grouping: optionGrouping,\n label: option.label,\n name: filter.name,\n operator: getDefaultOperatorName(filter.scopeFilter),\n scope: option.value,\n searchable: optionSearchable,\n })\n })\n }\n\n const searchable = dedup([...grouping, filter.label, ...keywords])\n .join(\" \")\n .toLowerCase()\n result.push({\n allowMultiple: filter.allowMultiple,\n grouping,\n label: filter.label,\n name: filter.name,\n operator: getDefaultOperatorName(filter),\n searchable,\n })\n }\n\n filters.forEach((filter) => addFilterItem(filter))\n return result\n }, [filters])\n\n return (\n <SearchableFiltersContext.Provider value={searchableSimpleFilterItems}>\n {children}\n </SearchableFiltersContext.Provider>\n )\n}\n\nfunction dedup(items: string[]): string[] {\n return Array.from(new Set(items))\n}\n"],"names":["React"],"mappings":";;;SAKgB,oBAAoB,GAAA;AAClC,IAAA,OAAO,UAAU,CAAC,wBAAwB,CAAC;AAC7C;AAcA,MAAM,wBAAwB,GAAG,aAAa,CAA+B,EAAE,CAAC;SAEhE,yBAAyB,CAAC,EACxC,QAAQ,EACR,OAAO,GAIR,EAAA;AACC,IAAA,MAAM,2BAA2B,GAAG,OAAO,CAAC,MAAK;QAC/C,MAAM,MAAM,GAAiC,EAAE;QAE/C,SAAS,aAAa,CACpB,MAAkB,EAClB,WAAqB,EAAE,EACvB,oBAA8B,EAAE,EAAA;AAEhC,YAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,iBAAiB,EAAE,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;AACnE,YAAA,IAAI,MAAM,CAAC,QAAQ,EAAE;gBACnB,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,KACnC,aAAa,CAAC,KAAK,EAAE,CAAC,GAAG,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAC5D;YACH;AAEA,YAAA,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE;gBAC1B,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;oBACvC,MAAM,cAAc,GAAG,CAAC,GAAG,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC;AAClD,oBAAA,MAAM,cAAc,GAAG,CAAC,GAAG,QAAQ,EAAE,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;oBAChE,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC7B,wBAAA,GAAG,cAAc;AACjB,wBAAA,MAAM,CAAC,KAAK;AACZ,wBAAA,GAAG,cAAc;qBAClB;yBACE,IAAI,CAAC,GAAG;AACR,yBAAA,WAAW,EAAE;oBAChB,MAAM,CAAC,IAAI,CAAC;wBACV,aAAa,EAAE,MAAM,CAAC,aAAa;wBACnC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;AACnD,wBAAA,QAAQ,EAAE,cAAc;wBACxB,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;AACjB,wBAAA,QAAQ,EAAE,sBAAsB,CAAC,MAAM,CAAC,WAAW,CAAC;wBACpD,KAAK,EAAE,MAAM,CAAC,KAAK;AACnB,wBAAA,UAAU,EAAE,gBAAgB;AAC7B,qBAAA,CAAC;AACJ,gBAAA,CAAC,CAAC;YACJ;AAEA,YAAA,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC;iBAC9D,IAAI,CAAC,GAAG;AACR,iBAAA,WAAW,EAAE;YAChB,MAAM,CAAC,IAAI,CAAC;gBACV,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,QAAQ;gBACR,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;AACjB,gBAAA,QAAQ,EAAE,sBAAsB,CAAC,MAAM,CAAC;gBACxC,UAAU;AACX,aAAA,CAAC;QACJ;AAEA,QAAA,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,CAAC,CAAC;AAClD,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAEb,IAAA,QACEA,cAAA,CAAA,aAAA,CAAC,wBAAwB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,2BAA2B,EAAA,EAClE,QAAQ,CACyB;AAExC;AAEA,SAAS,KAAK,CAAC,KAAe,EAAA;IAC5B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;AACnC;;;;"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { FilterItemConfig, FilterNodeItem, FilterNodeScoped, ScopeOption } from "./FilterTypes";
|
|
2
2
|
export type ScopedFilterOptions = ScopeOption[];
|
|
3
3
|
export type ScopedFilterOptionsLoader = () => Promise<ScopedFilterOptions> | ScopedFilterOptions;
|
|
4
|
-
export type ScopedFilterConfig = Omit<FilterItemConfig, "excludes" | "includes"> & {
|
|
4
|
+
export type ScopedFilterConfig = Omit<FilterItemConfig, "excludes" | "includes"> & Pick<FilterNodeScoped, "allowMultiplePerScope"> & {
|
|
5
5
|
filter: FilterNodeItem;
|
|
6
6
|
options: ScopedFilterOptions | ScopedFilterOptionsLoader;
|
|
7
7
|
};
|
|
8
|
-
export declare function scopedFilter({ filter: scopeFilter, options, ...config }: ScopedFilterConfig): FilterNodeScoped;
|
|
8
|
+
export declare function scopedFilter({ allowMultiple, filter: scopeFilter, options, ...config }: ScopedFilterConfig): FilterNodeScoped;
|
|
9
9
|
//# sourceMappingURL=scopedFilter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scopedFilter.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/scopedFilter.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scopedFilter.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/scopedFilter.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAGV,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAEhB,WAAW,EACZ,MAAM,eAAe,CAAA;AAWtB,MAAM,MAAM,mBAAmB,GAAG,WAAW,EAAE,CAAA;AAE/C,MAAM,MAAM,yBAAyB,GAAG,MACpC,OAAO,CAAC,mBAAmB,CAAC,GAC5B,mBAAmB,CAAA;AAEvB,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,gBAAgB,EAChB,UAAU,GAAG,UAAU,CACxB,GACC,IAAI,CAAC,gBAAgB,EAAE,uBAAuB,CAAC,GAAG;IAChD,MAAM,EAAE,cAAc,CAAA;IACtB,OAAO,EAAE,mBAAmB,GAAG,yBAAyB,CAAA;CACzD,CAAA;AAEH,wBAAgB,YAAY,CAAC,EAC3B,aAAoB,EACpB,MAAM,EAAE,WAAW,EACnB,OAAO,EACP,GAAG,MAAM,EACV,EAAE,kBAAkB,GAAG,gBAAgB,CAYvC"}
|
|
@@ -2,6 +2,7 @@ import { Select } from '../select/Select.js';
|
|
|
2
2
|
import React__default from 'react';
|
|
3
3
|
import { ActiveFilterInstance } from './ActiveFilterInstance.js';
|
|
4
4
|
import { Loading, LoadError } from './CollectionEditorsLazy.js';
|
|
5
|
+
import { useHasFilterInstancesChecker } from './FilterContext.js';
|
|
5
6
|
import { OperatorSelect } from './OperatorSelect.js';
|
|
6
7
|
import { useLazyOptions } from './useLazyOptions.js';
|
|
7
8
|
import { isEmptyValue, getDefaultOperatorName } from './utils.js';
|
|
@@ -11,10 +12,11 @@ const SCOPED_DEFAULT = {
|
|
|
11
12
|
label: "",
|
|
12
13
|
name: "scoped",
|
|
13
14
|
};
|
|
14
|
-
function scopedFilter({ filter: scopeFilter, options, ...config }) {
|
|
15
|
+
function scopedFilter({ allowMultiple = true, filter: scopeFilter, options, ...config }) {
|
|
15
16
|
const loadOptions = typeof options === "function" ? options : undefined;
|
|
16
17
|
const filter = {
|
|
17
18
|
...config,
|
|
19
|
+
allowMultiple,
|
|
18
20
|
createActiveFilterInstance: (activeFilter, operator) => new ScopedActiveFilter(filter, operator, activeFilter, loadOptions),
|
|
19
21
|
operators: [SCOPED_DEFAULT],
|
|
20
22
|
options: typeof options === "function" ? [] : options,
|
|
@@ -73,6 +75,7 @@ class ScopedActiveFilter extends ActiveFilterInstance {
|
|
|
73
75
|
renderEditor(onChange) {
|
|
74
76
|
const props = {
|
|
75
77
|
activeFilter: this.activeFilter,
|
|
78
|
+
allowMultiplePerScope: this.scopedFilter.allowMultiplePerScope,
|
|
76
79
|
label: this.filter.label,
|
|
77
80
|
onChange,
|
|
78
81
|
scopeFilter: this.scopedFilter.scopeFilter,
|
|
@@ -104,10 +107,18 @@ function LazyScopeEditor({ loadOptions, ...props }) {
|
|
|
104
107
|
};
|
|
105
108
|
return React__default.createElement(ScopeEditor, { ...props, ...reset, options: options, storeScopeLabel: true });
|
|
106
109
|
}
|
|
107
|
-
function ScopeEditor({ activeFilter, label, onChange, options, scopeFilter, scopeFilterInstance, storeScopeLabel = false, }) {
|
|
110
|
+
function ScopeEditor({ activeFilter, allowMultiplePerScope, label, onChange, options, scopeFilter, scopeFilterInstance, storeScopeLabel = false, }) {
|
|
108
111
|
const remembered = React__default.useRef({});
|
|
112
|
+
const hasFilterInstances = useHasFilterInstancesChecker();
|
|
113
|
+
const scopeOptions = allowMultiplePerScope
|
|
114
|
+
? options
|
|
115
|
+
: options.map((option) => ({
|
|
116
|
+
...option,
|
|
117
|
+
disabled: option.value !== activeFilter.scope &&
|
|
118
|
+
hasFilterInstances(activeFilter.name, option.value),
|
|
119
|
+
}));
|
|
109
120
|
return (React__default.createElement(React__default.Fragment, null,
|
|
110
|
-
React__default.createElement(Select, { hideLabel: true, label: label, options:
|
|
121
|
+
React__default.createElement(Select, { hideLabel: true, label: label, options: scopeOptions, placeholder: `Select a ${label.toLowerCase()}`, value: activeFilter.scope ?? "", onChange: (e) => {
|
|
111
122
|
const { label: valueLabel, operator, scope, value } = activeFilter;
|
|
112
123
|
if (scope !== undefined) {
|
|
113
124
|
if (isEmptyValue(value)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scopedFilter.js","sources":["../../../src/components/DataTable/scopedFilter.tsx"],"sourcesContent":["import { Select } from \"@components/select\"\nimport React from \"react\"\n\nimport { ActiveFilterInstance } from \"./ActiveFilterInstance\"\nimport { LoadError, Loading } from \"./CollectionEditorsLazy\"\nimport type {\n ActiveFilter,\n FilterChange,\n FilterItemConfig,\n FilterNodeItem,\n FilterNodeScoped,\n Operator,\n ScopeOption,\n} from \"./FilterTypes\"\nimport { OperatorSelect } from \"./OperatorSelect\"\nimport { useLazyOptions } from \"./useLazyOptions\"\nimport { getDefaultOperatorName, isEmptyValue } from \"./utils\"\n\nconst SCOPED_DEFAULT = {\n inputType: { type: \"scoped\" },\n label: \"\",\n name: \"scoped\",\n} as const satisfies Operator\n\nexport type ScopedFilterOptions = ScopeOption[]\n\nexport type ScopedFilterOptionsLoader = () =>\n | Promise<ScopedFilterOptions>\n | ScopedFilterOptions\n\nexport type ScopedFilterConfig = Omit<\n FilterItemConfig,\n \"excludes\" | \"includes\"\n> & {\n filter: FilterNodeItem\n options: ScopedFilterOptions | ScopedFilterOptionsLoader\n}\n\nexport function scopedFilter({\n filter: scopeFilter,\n options,\n ...config\n}: ScopedFilterConfig): FilterNodeScoped {\n const loadOptions = typeof options === \"function\" ? options : undefined\n const filter: FilterNodeScoped = {\n ...config,\n createActiveFilterInstance: (activeFilter, operator) =>\n new ScopedActiveFilter(filter, operator, activeFilter, loadOptions),\n operators: [SCOPED_DEFAULT],\n options: typeof options === \"function\" ? [] : options,\n scopeFilter,\n }\n return filter\n}\n\nfunction defaultScopedActiveFilter(\n parentName: string,\n scopeFilter: FilterNodeItem,\n option: ScopeOption\n): ActiveFilter {\n return {\n label: undefined,\n name: parentName,\n operator: getDefaultOperatorName(scopeFilter),\n scope: option.value,\n value: undefined,\n }\n}\n\nclass ScopedActiveFilter extends ActiveFilterInstance<unknown> {\n private readonly activeFilter: ActiveFilter\n\n constructor(\n private readonly scopedFilter: FilterNodeScoped,\n operator: Operator,\n activeFilter: ActiveFilter,\n private readonly loadOptions: ScopedFilterOptionsLoader | undefined\n ) {\n super(scopedFilter, operator, activeFilter.value)\n this.activeFilter = activeFilter\n }\n\n private get scopeLabel() {\n const { scope, scopeLabel } = this.activeFilter\n if (scope === undefined) return undefined\n if (this.loadOptions) return scopeLabel ?? scope\n return this.scopedFilter.options.find(({ value }) => value === scope)?.label\n }\n\n private get scopeFilterInstance() {\n return this.scopedFilter.scopeFilter.createActiveFilterInstance(\n this.activeFilter,\n this.operator\n )\n }\n\n toSegments() {\n const { scopeLabel } = this\n if (!scopeLabel) return [this.filter.label]\n\n if (this.activeFilter.value === undefined)\n return [this.filter.label, scopeLabel]\n\n const SKIP_SCOPE_FILTER_LABEL = 1\n return [\n this.filter.label,\n scopeLabel,\n ...this.scopeFilterInstance.toSegments().slice(SKIP_SCOPE_FILTER_LABEL),\n ]\n }\n\n formatValue() {\n if (!this.scopeLabel) return []\n return this.scopeFilterInstance.formatValue()\n }\n\n renderEditor(onChange: FilterChange) {\n const props = {\n activeFilter: this.activeFilter,\n label: this.filter.label,\n onChange,\n scopeFilter: this.scopedFilter.scopeFilter,\n scopeFilterInstance:\n this.activeFilter.scope === undefined\n ? undefined\n : this.scopeFilterInstance,\n }\n\n if (this.loadOptions)\n return <LazyScopeEditor {...props} loadOptions={this.loadOptions} />\n\n return <ScopeEditor {...props} options={this.scopedFilter.options} />\n }\n}\n\ntype ScopeEditorProps = {\n activeFilter: ActiveFilter\n label: string\n onChange: FilterChange\n scopeFilter: FilterNodeItem\n scopeFilterInstance: ActiveFilterInstance | undefined\n}\n\nfunction LazyScopeEditor({\n loadOptions,\n ...props\n}: ScopeEditorProps & { loadOptions: ScopedFilterOptionsLoader }) {\n const { error, loading, options } = useLazyOptions(loadOptions)\n if (loading) return <Loading />\n if (error) return <LoadError />\n\n const { activeFilter } = props\n const isScopeMissing =\n activeFilter.scope !== undefined &&\n !options.some(({ value }) => value === activeFilter.scope)\n\n const reset = isScopeMissing && {\n activeFilter: {\n name: activeFilter.name,\n operator: SCOPED_DEFAULT.name,\n value: undefined,\n },\n scopeFilterInstance: undefined,\n }\n\n return <ScopeEditor {...props} {...reset} options={options} storeScopeLabel />\n}\n\nfunction ScopeEditor({\n activeFilter,\n label,\n onChange,\n options,\n scopeFilter,\n scopeFilterInstance,\n storeScopeLabel = false,\n}: ScopeEditorProps & {\n options: ScopedFilterOptions\n /** Lazy scopes only: the chip can't look the label up, so it's stored. */\n storeScopeLabel?: boolean\n}) {\n const remembered = React.useRef<\n Record<string, Pick<ActiveFilter, \"label\" | \"operator\" | \"value\">>\n >({})\n\n return (\n <>\n <Select\n hideLabel\n label={label}\n options={options}\n placeholder={`Select a ${label.toLowerCase()}`}\n value={activeFilter.scope ?? \"\"}\n onChange={(e) => {\n const { label: valueLabel, operator, scope, value } = activeFilter\n if (scope !== undefined) {\n if (isEmptyValue(value)) {\n delete remembered.current[scope]\n } else {\n remembered.current[scope] = {\n operator,\n value,\n ...(valueLabel !== undefined && { label: valueLabel }),\n }\n }\n }\n const next = options.find((option) => option.value === e.target.value)\n if (!next) return\n const restored = remembered.current[next.value]\n const scoped = {\n ...defaultScopedActiveFilter(activeFilter.name, scopeFilter, next),\n ...(storeScopeLabel && { scopeLabel: next.label }),\n ...restored,\n }\n onChange(scoped, { complete: !isEmptyValue(scoped.value) })\n }}\n />\n {scopeFilterInstance && (\n <SelectedScopeEditor\n activeFilter={activeFilter}\n instance={scopeFilterInstance}\n scopeFilter={scopeFilter}\n onChange={onChange}\n />\n )}\n </>\n )\n}\n\nfunction SelectedScopeEditor({\n activeFilter,\n instance,\n scopeFilter,\n onChange,\n}: {\n activeFilter: ActiveFilter\n instance: ActiveFilterInstance\n onChange: FilterChange\n scopeFilter: FilterNodeItem\n}) {\n return (\n <>\n <OperatorSelect\n operator={instance.operator}\n relatedFilter={scopeFilter}\n updateActiveFilter={(updates) => {\n if (updates.operator && updates.operator !== activeFilter.operator) {\n onChange({ ...updates, value: undefined }, { complete: false })\n return\n }\n onChange(updates, { complete: false })\n }}\n />\n <React.Fragment key={`${activeFilter.scope}:${instance.operator.name}`}>\n {instance.renderEditor(onChange)}\n </React.Fragment>\n </>\n )\n}\n"],"names":["React"],"mappings":";;;;;;;;AAkBA,MAAM,cAAc,GAAG;AACrB,IAAA,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;AAC7B,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,IAAI,EAAE,QAAQ;CACa;AAgBvB,SAAU,YAAY,CAAC,EAC3B,MAAM,EAAE,WAAW,EACnB,OAAO,EACP,GAAG,MAAM,EACU,EAAA;AACnB,IAAA,MAAM,WAAW,GAAG,OAAO,OAAO,KAAK,UAAU,GAAG,OAAO,GAAG,SAAS;AACvE,IAAA,MAAM,MAAM,GAAqB;AAC/B,QAAA,GAAG,MAAM;AACT,QAAA,0BAA0B,EAAE,CAAC,YAAY,EAAE,QAAQ,KACjD,IAAI,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC;QACrE,SAAS,EAAE,CAAC,cAAc,CAAC;AAC3B,QAAA,OAAO,EAAE,OAAO,OAAO,KAAK,UAAU,GAAG,EAAE,GAAG,OAAO;QACrD,WAAW;KACZ;AACD,IAAA,OAAO,MAAM;AACf;AAEA,SAAS,yBAAyB,CAChC,UAAkB,EAClB,WAA2B,EAC3B,MAAmB,EAAA;IAEnB,OAAO;AACL,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,IAAI,EAAE,UAAU;AAChB,QAAA,QAAQ,EAAE,sBAAsB,CAAC,WAAW,CAAC;QAC7C,KAAK,EAAE,MAAM,CAAC,KAAK;AACnB,QAAA,KAAK,EAAE,SAAS;KACjB;AACH;AAEA,MAAM,kBAAmB,SAAQ,oBAA6B,CAAA;AAIzC,IAAA,YAAA;AAGA,IAAA,WAAA;AANF,IAAA,YAAY;AAE7B,IAAA,WAAA,CACmB,YAA8B,EAC/C,QAAkB,EAClB,YAA0B,EACT,WAAkD,EAAA;QAEnE,KAAK,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC;QALhC,IAAA,CAAA,YAAY,GAAZ,YAAY;QAGZ,IAAA,CAAA,WAAW,GAAX,WAAW;AAG5B,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;IAClC;AAEA,IAAA,IAAY,UAAU,GAAA;QACpB,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,YAAY;QAC/C,IAAI,KAAK,KAAK,SAAS;AAAE,YAAA,OAAO,SAAS;QACzC,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,UAAU,IAAI,KAAK;QAChD,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,KAAK,KAAK,CAAC,EAAE,KAAK;IAC9E;AAEA,IAAA,IAAY,mBAAmB,GAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,0BAA0B,CAC7D,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,QAAQ,CACd;IACH;IAEA,UAAU,GAAA;AACR,QAAA,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAE3C,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,KAAK,SAAS;YACvC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC;QAExC,MAAM,uBAAuB,GAAG,CAAC;QACjC,OAAO;YACL,IAAI,CAAC,MAAM,CAAC,KAAK;YACjB,UAAU;YACV,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,uBAAuB,CAAC;SACxE;IACH;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,EAAE;AAC/B,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE;IAC/C;AAEA,IAAA,YAAY,CAAC,QAAsB,EAAA;AACjC,QAAA,MAAM,KAAK,GAAG;YACZ,YAAY,EAAE,IAAI,CAAC,YAAY;AAC/B,YAAA,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,QAAQ;AACR,YAAA,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW;AAC1C,YAAA,mBAAmB,EACjB,IAAI,CAAC,YAAY,CAAC,KAAK,KAAK;AAC1B,kBAAE;kBACA,IAAI,CAAC,mBAAmB;SAC/B;QAED,IAAI,IAAI,CAAC,WAAW;YAClB,OAAOA,cAAA,CAAA,aAAA,CAAC,eAAe,EAAA,EAAA,GAAK,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAA,CAAI;AAEtE,QAAA,OAAOA,cAAA,CAAA,aAAA,CAAC,WAAW,EAAA,EAAA,GAAK,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,GAAI;IACvE;AACD;AAUD,SAAS,eAAe,CAAC,EACvB,WAAW,EACX,GAAG,KAAK,EACsD,EAAA;AAC9D,IAAA,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,WAAW,CAAC;AAC/D,IAAA,IAAI,OAAO;QAAE,OAAOA,cAAA,CAAA,aAAA,CAAC,OAAO,EAAA,IAAA,CAAG;AAC/B,IAAA,IAAI,KAAK;QAAE,OAAOA,cAAA,CAAA,aAAA,CAAC,SAAS,EAAA,IAAA,CAAG;AAE/B,IAAA,MAAM,EAAE,YAAY,EAAE,GAAG,KAAK;AAC9B,IAAA,MAAM,cAAc,GAClB,YAAY,CAAC,KAAK,KAAK,SAAS;AAChC,QAAA,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,KAAK,YAAY,CAAC,KAAK,CAAC;IAE5D,MAAM,KAAK,GAAG,cAAc,IAAI;AAC9B,QAAA,YAAY,EAAE;YACZ,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,QAAQ,EAAE,cAAc,CAAC,IAAI;AAC7B,YAAA,KAAK,EAAE,SAAS;AACjB,SAAA;AACD,QAAA,mBAAmB,EAAE,SAAS;KAC/B;AAED,IAAA,OAAOA,cAAA,CAAA,aAAA,CAAC,WAAW,EAAA,EAAA,GAAK,KAAK,EAAA,GAAM,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,SAAG;AAChF;AAEA,SAAS,WAAW,CAAC,EACnB,YAAY,EACZ,KAAK,EACL,QAAQ,EACR,OAAO,EACP,WAAW,EACX,mBAAmB,EACnB,eAAe,GAAG,KAAK,GAKxB,EAAA;IACC,MAAM,UAAU,GAAGA,cAAK,CAAC,MAAM,CAE7B,EAAE,CAAC;AAEL,IAAA,QACEA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA;AACE,QAAAA,cAAA,CAAA,aAAA,CAAC,MAAM,EAAA,EACL,SAAS,EAAA,IAAA,EACT,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,YAAY,KAAK,CAAC,WAAW,EAAE,CAAA,CAAE,EAC9C,KAAK,EAAE,YAAY,CAAC,KAAK,IAAI,EAAE,EAC/B,QAAQ,EAAE,CAAC,CAAC,KAAI;AACd,gBAAA,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY;AAClE,gBAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,oBAAA,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;AACvB,wBAAA,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC;oBAClC;yBAAO;AACL,wBAAA,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;4BAC1B,QAAQ;4BACR,KAAK;4BACL,IAAI,UAAU,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;yBACvD;oBACH;gBACF;gBACA,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;AACtE,gBAAA,IAAI,CAAC,IAAI;oBAAE;gBACX,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;AAC/C,gBAAA,MAAM,MAAM,GAAG;oBACb,GAAG,yBAAyB,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC;oBAClE,IAAI,eAAe,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AAClD,oBAAA,GAAG,QAAQ;iBACZ;AACD,gBAAA,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAC7D,YAAA,CAAC,EAAA,CACD;QACD,mBAAmB,KAClBA,cAAA,CAAA,aAAA,CAAC,mBAAmB,EAAA,EAClB,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,mBAAmB,EAC7B,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAAA,CAClB,CACH,CACA;AAEP;AAEA,SAAS,mBAAmB,CAAC,EAC3B,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,QAAQ,GAMT,EAAA;AACC,IAAA,QACEA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA;AACE,QAAAA,cAAA,CAAA,aAAA,CAAC,cAAc,EAAA,EACb,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAC3B,aAAa,EAAE,WAAW,EAC1B,kBAAkB,EAAE,CAAC,OAAO,KAAI;AAC9B,gBAAA,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,YAAY,CAAC,QAAQ,EAAE;AAClE,oBAAA,QAAQ,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;oBAC/D;gBACF;gBACA,QAAQ,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACxC,YAAA,CAAC,EAAA,CACD;QACFA,cAAA,CAAA,aAAA,CAACA,cAAK,CAAC,QAAQ,EAAA,EAAC,GAAG,EAAE,CAAA,EAAG,YAAY,CAAC,KAAK,CAAA,CAAA,EAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAA,CAAE,EAAA,EACnE,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CACjB,CAChB;AAEP;;;;"}
|
|
1
|
+
{"version":3,"file":"scopedFilter.js","sources":["../../../src/components/DataTable/scopedFilter.tsx"],"sourcesContent":["import { Select } from \"@components/select\"\nimport React from \"react\"\n\nimport { ActiveFilterInstance } from \"./ActiveFilterInstance\"\nimport { LoadError, Loading } from \"./CollectionEditorsLazy\"\nimport { useHasFilterInstancesChecker } from \"./FilterContext\"\nimport type {\n ActiveFilter,\n FilterChange,\n FilterItemConfig,\n FilterNodeItem,\n FilterNodeScoped,\n Operator,\n ScopeOption,\n} from \"./FilterTypes\"\nimport { OperatorSelect } from \"./OperatorSelect\"\nimport { useLazyOptions } from \"./useLazyOptions\"\nimport { getDefaultOperatorName, isEmptyValue } from \"./utils\"\n\nconst SCOPED_DEFAULT = {\n inputType: { type: \"scoped\" },\n label: \"\",\n name: \"scoped\",\n} as const satisfies Operator\n\nexport type ScopedFilterOptions = ScopeOption[]\n\nexport type ScopedFilterOptionsLoader = () =>\n | Promise<ScopedFilterOptions>\n | ScopedFilterOptions\n\nexport type ScopedFilterConfig = Omit<\n FilterItemConfig,\n \"excludes\" | \"includes\"\n> &\n Pick<FilterNodeScoped, \"allowMultiplePerScope\"> & {\n filter: FilterNodeItem\n options: ScopedFilterOptions | ScopedFilterOptionsLoader\n }\n\nexport function scopedFilter({\n allowMultiple = true,\n filter: scopeFilter,\n options,\n ...config\n}: ScopedFilterConfig): FilterNodeScoped {\n const loadOptions = typeof options === \"function\" ? options : undefined\n const filter: FilterNodeScoped = {\n ...config,\n allowMultiple,\n createActiveFilterInstance: (activeFilter, operator) =>\n new ScopedActiveFilter(filter, operator, activeFilter, loadOptions),\n operators: [SCOPED_DEFAULT],\n options: typeof options === \"function\" ? [] : options,\n scopeFilter,\n }\n return filter\n}\n\nfunction defaultScopedActiveFilter(\n parentName: string,\n scopeFilter: FilterNodeItem,\n option: ScopeOption\n): ActiveFilter {\n return {\n label: undefined,\n name: parentName,\n operator: getDefaultOperatorName(scopeFilter),\n scope: option.value,\n value: undefined,\n }\n}\n\nclass ScopedActiveFilter extends ActiveFilterInstance<unknown> {\n private readonly activeFilter: ActiveFilter\n\n constructor(\n private readonly scopedFilter: FilterNodeScoped,\n operator: Operator,\n activeFilter: ActiveFilter,\n private readonly loadOptions: ScopedFilterOptionsLoader | undefined\n ) {\n super(scopedFilter, operator, activeFilter.value)\n this.activeFilter = activeFilter\n }\n\n private get scopeLabel() {\n const { scope, scopeLabel } = this.activeFilter\n if (scope === undefined) return undefined\n if (this.loadOptions) return scopeLabel ?? scope\n return this.scopedFilter.options.find(({ value }) => value === scope)?.label\n }\n\n private get scopeFilterInstance() {\n return this.scopedFilter.scopeFilter.createActiveFilterInstance(\n this.activeFilter,\n this.operator\n )\n }\n\n toSegments() {\n const { scopeLabel } = this\n if (!scopeLabel) return [this.filter.label]\n\n if (this.activeFilter.value === undefined)\n return [this.filter.label, scopeLabel]\n\n const SKIP_SCOPE_FILTER_LABEL = 1\n return [\n this.filter.label,\n scopeLabel,\n ...this.scopeFilterInstance.toSegments().slice(SKIP_SCOPE_FILTER_LABEL),\n ]\n }\n\n formatValue() {\n if (!this.scopeLabel) return []\n return this.scopeFilterInstance.formatValue()\n }\n\n renderEditor(onChange: FilterChange) {\n const props = {\n activeFilter: this.activeFilter,\n allowMultiplePerScope: this.scopedFilter.allowMultiplePerScope,\n label: this.filter.label,\n onChange,\n scopeFilter: this.scopedFilter.scopeFilter,\n scopeFilterInstance:\n this.activeFilter.scope === undefined\n ? undefined\n : this.scopeFilterInstance,\n }\n\n if (this.loadOptions)\n return <LazyScopeEditor {...props} loadOptions={this.loadOptions} />\n\n return <ScopeEditor {...props} options={this.scopedFilter.options} />\n }\n}\n\ntype ScopeEditorProps = {\n activeFilter: ActiveFilter\n allowMultiplePerScope: boolean | undefined\n label: string\n onChange: FilterChange\n scopeFilter: FilterNodeItem\n scopeFilterInstance: ActiveFilterInstance | undefined\n}\n\nfunction LazyScopeEditor({\n loadOptions,\n ...props\n}: ScopeEditorProps & { loadOptions: ScopedFilterOptionsLoader }) {\n const { error, loading, options } = useLazyOptions(loadOptions)\n if (loading) return <Loading />\n if (error) return <LoadError />\n\n const { activeFilter } = props\n const isScopeMissing =\n activeFilter.scope !== undefined &&\n !options.some(({ value }) => value === activeFilter.scope)\n\n const reset = isScopeMissing && {\n activeFilter: {\n name: activeFilter.name,\n operator: SCOPED_DEFAULT.name,\n value: undefined,\n },\n scopeFilterInstance: undefined,\n }\n\n return <ScopeEditor {...props} {...reset} options={options} storeScopeLabel />\n}\n\nfunction ScopeEditor({\n activeFilter,\n allowMultiplePerScope,\n label,\n onChange,\n options,\n scopeFilter,\n scopeFilterInstance,\n storeScopeLabel = false,\n}: ScopeEditorProps & {\n options: ScopedFilterOptions\n /** Lazy scopes only: the chip can't look the label up, so it's stored. */\n storeScopeLabel?: boolean\n}) {\n const remembered = React.useRef<\n Record<string, Pick<ActiveFilter, \"label\" | \"operator\" | \"value\">>\n >({})\n const hasFilterInstances = useHasFilterInstancesChecker()\n const scopeOptions = allowMultiplePerScope\n ? options\n : options.map((option) => ({\n ...option,\n disabled:\n option.value !== activeFilter.scope &&\n hasFilterInstances(activeFilter.name, option.value),\n }))\n\n return (\n <>\n <Select\n hideLabel\n label={label}\n options={scopeOptions}\n placeholder={`Select a ${label.toLowerCase()}`}\n value={activeFilter.scope ?? \"\"}\n onChange={(e) => {\n const { label: valueLabel, operator, scope, value } = activeFilter\n if (scope !== undefined) {\n if (isEmptyValue(value)) {\n delete remembered.current[scope]\n } else {\n remembered.current[scope] = {\n operator,\n value,\n ...(valueLabel !== undefined && { label: valueLabel }),\n }\n }\n }\n const next = options.find((option) => option.value === e.target.value)\n if (!next) return\n const restored = remembered.current[next.value]\n const scoped = {\n ...defaultScopedActiveFilter(activeFilter.name, scopeFilter, next),\n ...(storeScopeLabel && { scopeLabel: next.label }),\n ...restored,\n }\n onChange(scoped, { complete: !isEmptyValue(scoped.value) })\n }}\n />\n {scopeFilterInstance && (\n <SelectedScopeEditor\n activeFilter={activeFilter}\n instance={scopeFilterInstance}\n scopeFilter={scopeFilter}\n onChange={onChange}\n />\n )}\n </>\n )\n}\n\nfunction SelectedScopeEditor({\n activeFilter,\n instance,\n scopeFilter,\n onChange,\n}: {\n activeFilter: ActiveFilter\n instance: ActiveFilterInstance\n onChange: FilterChange\n scopeFilter: FilterNodeItem\n}) {\n return (\n <>\n <OperatorSelect\n operator={instance.operator}\n relatedFilter={scopeFilter}\n updateActiveFilter={(updates) => {\n if (updates.operator && updates.operator !== activeFilter.operator) {\n onChange({ ...updates, value: undefined }, { complete: false })\n return\n }\n onChange(updates, { complete: false })\n }}\n />\n <React.Fragment key={`${activeFilter.scope}:${instance.operator.name}`}>\n {instance.renderEditor(onChange)}\n </React.Fragment>\n </>\n )\n}\n"],"names":["React"],"mappings":"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"}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import type { FilterNodeItem } from "./FilterTypes";
|
|
1
|
+
import type { FilterNodeItem, FilterNodeScoped } from "./FilterTypes";
|
|
2
2
|
export declare function getDefaultOperatorName(node: FilterNodeItem): string;
|
|
3
3
|
export declare function isEmptyValue(value: unknown): boolean;
|
|
4
|
+
/** Whether a filter delegates to scoped options. */
|
|
5
|
+
export declare function isScopedFilter(filter: FilterNodeItem): filter is FilterNodeScoped;
|
|
6
|
+
/** Lazy scopes aren't known until the editor loads them, so any one might be free. */
|
|
7
|
+
export declare function hasAvailableScope(filter: FilterNodeScoped, isScopeTaken: (scope: string) => boolean): boolean;
|
|
8
|
+
/** Whether `scope` is one of the filter's scopes. Lazy scopes are assumed to be. */
|
|
9
|
+
export declare function isKnownScope(filter: FilterNodeScoped, scope: string): boolean;
|
|
4
10
|
//# sourceMappingURL=utils.d.ts.map
|