@planningcenter/tapestry 4.6.1 → 4.7.0-rc.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.
Files changed (88) hide show
  1. package/dist/components/DataTable/ActiveFilterInstance.d.ts +13 -0
  2. package/dist/components/DataTable/ActiveFilterInstance.d.ts.map +1 -0
  3. package/dist/components/DataTable/ActiveFilterInstance.js +23 -0
  4. package/dist/components/DataTable/ActiveFilterInstance.js.map +1 -0
  5. package/dist/components/DataTable/ActiveFilters.d.ts +3 -4
  6. package/dist/components/DataTable/ActiveFilters.d.ts.map +1 -1
  7. package/dist/components/DataTable/ActiveFilters.js +25 -35
  8. package/dist/components/DataTable/ActiveFilters.js.map +1 -1
  9. package/dist/components/DataTable/DataTable.d.ts +1 -0
  10. package/dist/components/DataTable/DataTable.d.ts.map +1 -1
  11. package/dist/components/DataTable/DataTable.js +12 -2
  12. package/dist/components/DataTable/DataTable.js.map +1 -1
  13. package/dist/components/DataTable/FilterChip.d.ts +26 -0
  14. package/dist/components/DataTable/FilterChip.d.ts.map +1 -0
  15. package/dist/components/DataTable/FilterChip.js +36 -0
  16. package/dist/components/DataTable/FilterChip.js.map +1 -0
  17. package/dist/components/DataTable/FilterContext.d.ts.map +1 -1
  18. package/dist/components/DataTable/FilterContext.js +3 -1
  19. package/dist/components/DataTable/FilterContext.js.map +1 -1
  20. package/dist/components/DataTable/FilterControls.d.ts +8 -2
  21. package/dist/components/DataTable/FilterControls.d.ts.map +1 -1
  22. package/dist/components/DataTable/FilterControls.js +48 -7
  23. package/dist/components/DataTable/FilterControls.js.map +1 -1
  24. package/dist/components/DataTable/FilterTypes.d.ts +14 -1
  25. package/dist/components/DataTable/FilterTypes.d.ts.map +1 -1
  26. package/dist/components/DataTable/OperatorSelect.d.ts +1 -2
  27. package/dist/components/DataTable/OperatorSelect.d.ts.map +1 -1
  28. package/dist/components/DataTable/OperatorSelect.js.map +1 -1
  29. package/dist/components/DataTable/SearchableFilters.d.ts +14 -0
  30. package/dist/components/DataTable/SearchableFilters.d.ts.map +1 -0
  31. package/dist/components/DataTable/SearchableFilters.js +35 -0
  32. package/dist/components/DataTable/SearchableFilters.js.map +1 -0
  33. package/dist/components/DataTable/collectionFilter.d.ts +48 -0
  34. package/dist/components/DataTable/collectionFilter.d.ts.map +1 -0
  35. package/dist/components/DataTable/collectionFilter.js +86 -0
  36. package/dist/components/DataTable/collectionFilter.js.map +1 -0
  37. package/dist/components/DataTable/dateFilter.d.ts +60 -0
  38. package/dist/components/DataTable/dateFilter.d.ts.map +1 -0
  39. package/dist/components/DataTable/dateFilter.js +67 -0
  40. package/dist/components/DataTable/dateFilter.js.map +1 -0
  41. package/dist/components/DataTable/filters.d.ts +5 -0
  42. package/dist/components/DataTable/filters.d.ts.map +1 -0
  43. package/dist/components/DataTable/index.d.ts +4 -0
  44. package/dist/components/DataTable/index.d.ts.map +1 -1
  45. package/dist/components/DataTable/numberFilter.d.ts +46 -0
  46. package/dist/components/DataTable/numberFilter.d.ts.map +1 -0
  47. package/dist/components/DataTable/numberFilter.js +63 -0
  48. package/dist/components/DataTable/numberFilter.js.map +1 -0
  49. package/dist/components/DataTable/resolveOperators.d.ts +7 -0
  50. package/dist/components/DataTable/resolveOperators.d.ts.map +1 -0
  51. package/dist/components/DataTable/resolveOperators.js +11 -0
  52. package/dist/components/DataTable/resolveOperators.js.map +1 -0
  53. package/dist/components/DataTable/textFilter.d.ts +58 -0
  54. package/dist/components/DataTable/textFilter.d.ts.map +1 -0
  55. package/dist/components/DataTable/textFilter.js +49 -0
  56. package/dist/components/DataTable/textFilter.js.map +1 -0
  57. package/dist/components/DataTable/useShelfExpanded.d.ts +6 -0
  58. package/dist/components/DataTable/useShelfExpanded.d.ts.map +1 -0
  59. package/dist/components/DataTable/useShelfExpanded.js +26 -0
  60. package/dist/components/DataTable/useShelfExpanded.js.map +1 -0
  61. package/dist/components/dropdown/Dropdown.d.ts +4 -0
  62. package/dist/components/dropdown/Dropdown.d.ts.map +1 -1
  63. package/dist/components/dropdown/Dropdown.js +4 -0
  64. package/dist/components/dropdown/Dropdown.js.map +1 -1
  65. package/dist/components/input/Input.d.ts +4 -4
  66. package/dist/components/input/Input.d.ts.map +1 -1
  67. package/dist/components/input/Input.js +3 -3
  68. package/dist/components/input/Input.js.map +1 -1
  69. package/dist/components/popover/Popover.d.ts +1 -1
  70. package/dist/components/popover/Popover.js +1 -1
  71. package/dist/components/popover/Popover.js.map +1 -1
  72. package/dist/index.css +89 -1
  73. package/dist/index.css.map +1 -1
  74. package/dist/index.d.ts +1 -0
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +1 -0
  77. package/dist/index.js.map +1 -1
  78. package/dist/reactRender.css +1292 -1041
  79. package/dist/reactRender.css.map +1 -1
  80. package/dist/reactRenderLegacy.css +1292 -1041
  81. package/dist/reactRenderLegacy.css.map +1 -1
  82. package/dist/unstable.css +3717 -3466
  83. package/dist/unstable.css.map +1 -1
  84. package/dist/unstable.d.ts +0 -1
  85. package/dist/unstable.d.ts.map +1 -1
  86. package/dist/unstable.js +5 -1
  87. package/dist/unstable.js.map +1 -1
  88. package/package.json +2 -2
@@ -1,4 +1,5 @@
1
1
  import React__default, { createContext, useMemo, useCallback } from 'react';
2
+ import { SearchableFiltersProvider } from './SearchableFilters.js';
2
3
 
3
4
  const FilterContext = createContext({
4
5
  findActiveFilterOperator: () => undefined,
@@ -18,7 +19,8 @@ function FiltersProvider({ filters, children, }) {
18
19
  },
19
20
  flatFilters,
20
21
  }), [findFilter, flatFilters]);
21
- return (React__default.createElement(FilterContext.Provider, { value: value }, children));
22
+ return (React__default.createElement(SearchableFiltersProvider, { filters: filters },
23
+ React__default.createElement(FilterContext.Provider, { value: value }, children)));
22
24
  }
23
25
  function useRelatedFilterOperator(activeFilter) {
24
26
  const context = React__default.useContext(FilterContext);
@@ -1 +1 @@
1
- {"version":3,"file":"FilterContext.js","sources":["../../../src/components/DataTable/FilterContext.tsx"],"sourcesContent":["import React, { createContext, useCallback, useMemo } from \"react\"\n\nimport type {\n ActiveFilter,\n FilterNode,\n FilterNodeItem,\n Operator,\n} from \"./FilterTypes\"\n\nexport type RelatedFilterOperatorResult = {\n operator?: Operator\n relatedFilter?: FilterNodeItem\n}\nexport const FilterContext = createContext<{\n findActiveFilterOperator: (\n activeFilter: ActiveFilter\n ) => RelatedFilterOperatorResult | undefined\n flatFilters: FilterNodeItem[]\n}>({\n findActiveFilterOperator: () => undefined,\n flatFilters: [],\n})\n\nfunction flattenFilters(nodes: FilterNode[]): FilterNodeItem[] {\n return nodes.flatMap((node) =>\n node.children ? flattenFilters(node.children) : node\n )\n}\n\nexport function FiltersProvider({\n filters,\n children,\n}: {\n children: React.ReactNode\n filters: FilterNode[]\n}) {\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 value = useMemo(\n () => ({\n findActiveFilterOperator: (activeFilter: ActiveFilter) => {\n const filter = findFilter(activeFilter)\n const operator = filter?.operators.find(\n (op) => op.name === activeFilter.operator\n )\n return { operator, relatedFilter: filter }\n },\n flatFilters,\n }),\n [findFilter, flatFilters]\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"],"names":["React"],"mappings":";;AAaO,MAAM,aAAa,GAAG,aAAa,CAKvC;AACD,IAAA,wBAAwB,EAAE,MAAM,SAAS;AACzC,IAAA,WAAW,EAAE,EAAE;AAChB,CAAA;AAED,SAAS,cAAc,CAAC,KAAmB,EAAA;IACzC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KACxB,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CACrD;AACH;SAEgB,eAAe,CAAC,EAC9B,OAAO,EACP,QAAQ,GAIT,EAAA;AACC,IAAA,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AACrE,IAAA,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,YAA0B,KACzB,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,CAAC,EACvD,CAAC,WAAW,CAAC,CACd;AACD,IAAA,MAAM,KAAK,GAAG,OAAO,CACnB,OAAO;AACL,QAAA,wBAAwB,EAAE,CAAC,YAA0B,KAAI;AACvD,YAAA,MAAM,MAAM,GAAG,UAAU,CAAC,YAAY,CAAC;YACvC,MAAM,QAAQ,GAAG,MAAM,EAAE,SAAS,CAAC,IAAI,CACrC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,KAAK,YAAY,CAAC,QAAQ,CAC1C;AACD,YAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE;QAC5C,CAAC;QACD,WAAW;AACZ,KAAA,CAAC,EACF,CAAC,UAAU,EAAE,WAAW,CAAC,CAC1B;AACD,IAAA,QACEA,cAAA,CAAA,aAAA,CAAC,aAAa,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,KAAK,EAAA,EAAG,QAAQ,CAA0B;AAE7E;AAEM,SAAU,wBAAwB,CACtC,YAA0B,EAAA;IAE1B,MAAM,OAAO,GAAGA,cAAK,CAAC,UAAU,CAAC,aAAa,CAAC;AAC/C,IAAA,QACE,OAAO,CAAC,wBAAwB,CAAC,YAAY,CAAC,IAAI;AAChD,QAAA,QAAQ,EAAE,SAAS;AACnB,QAAA,aAAa,EAAE,SAAS;AACzB,KAAA;AAEL;;;;"}
1
+ {"version":3,"file":"FilterContext.js","sources":["../../../src/components/DataTable/FilterContext.tsx"],"sourcesContent":["import React, { createContext, useCallback, useMemo } from \"react\"\n\nimport type {\n ActiveFilter,\n FilterNode,\n FilterNodeItem,\n Operator,\n} from \"./FilterTypes\"\nimport { SearchableFiltersProvider } from \"./SearchableFilters\"\n\nexport type RelatedFilterOperatorResult = {\n operator?: Operator\n relatedFilter?: FilterNodeItem\n}\nexport const FilterContext = createContext<{\n findActiveFilterOperator: (\n activeFilter: ActiveFilter\n ) => RelatedFilterOperatorResult | undefined\n flatFilters: FilterNodeItem[]\n}>({\n findActiveFilterOperator: () => undefined,\n flatFilters: [],\n})\n\nfunction flattenFilters(nodes: FilterNode[]): FilterNodeItem[] {\n return nodes.flatMap((node) =>\n node.children ? flattenFilters(node.children) : node\n )\n}\n\nexport function FiltersProvider({\n filters,\n children,\n}: {\n children: React.ReactNode\n filters: FilterNode[]\n}) {\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 value = useMemo(\n () => ({\n findActiveFilterOperator: (activeFilter: ActiveFilter) => {\n const filter = findFilter(activeFilter)\n const operator = filter?.operators.find(\n (op) => op.name === activeFilter.operator\n )\n return { operator, relatedFilter: filter }\n },\n flatFilters,\n }),\n [findFilter, flatFilters]\n )\n return (\n <SearchableFiltersProvider filters={filters}>\n <FilterContext.Provider value={value}>{children}</FilterContext.Provider>\n </SearchableFiltersProvider>\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"],"names":["React"],"mappings":";;;AAcO,MAAM,aAAa,GAAG,aAAa,CAKvC;AACD,IAAA,wBAAwB,EAAE,MAAM,SAAS;AACzC,IAAA,WAAW,EAAE,EAAE;AAChB,CAAA;AAED,SAAS,cAAc,CAAC,KAAmB,EAAA;IACzC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KACxB,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CACrD;AACH;SAEgB,eAAe,CAAC,EAC9B,OAAO,EACP,QAAQ,GAIT,EAAA;AACC,IAAA,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AACrE,IAAA,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,YAA0B,KACzB,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,CAAC,EACvD,CAAC,WAAW,CAAC,CACd;AACD,IAAA,MAAM,KAAK,GAAG,OAAO,CACnB,OAAO;AACL,QAAA,wBAAwB,EAAE,CAAC,YAA0B,KAAI;AACvD,YAAA,MAAM,MAAM,GAAG,UAAU,CAAC,YAAY,CAAC;YACvC,MAAM,QAAQ,GAAG,MAAM,EAAE,SAAS,CAAC,IAAI,CACrC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,KAAK,YAAY,CAAC,QAAQ,CAC1C;AACD,YAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE;QAC5C,CAAC;QACD,WAAW;AACZ,KAAA,CAAC,EACF,CAAC,UAAU,EAAE,WAAW,CAAC,CAC1B;AACD,IAAA,QACEA,cAAA,CAAA,aAAA,CAAC,yBAAyB,EAAA,EAAC,OAAO,EAAE,OAAO,EAAA;AACzC,QAAAA,cAAA,CAAA,aAAA,CAAC,aAAa,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,KAAK,EAAA,EAAG,QAAQ,CAA0B,CAC/C;AAEhC;AAEM,SAAU,wBAAwB,CACtC,YAA0B,EAAA;IAE1B,MAAM,OAAO,GAAGA,cAAK,CAAC,UAAU,CAAC,aAAa,CAAC;AAC/C,IAAA,QACE,OAAO,CAAC,wBAAwB,CAAC,YAAY,CAAC,IAAI;AAChD,QAAA,QAAQ,EAAE,SAAS;AACnB,QAAA,aAAa,EAAE,SAAS;AACzB,KAAA;AAEL;;;;"}
@@ -1,10 +1,16 @@
1
1
  import React from "react";
2
- import type { FilterNode } from "./FilterTypes";
2
+ import type { ActiveFilter, FilterNode } from "./FilterTypes";
3
3
  export interface FilterControlsProps {
4
+ /** The currently active filters. The toggle button only renders when this is non-empty. */
5
+ activeFilters?: ActiveFilter[];
4
6
  filters: FilterNode[];
7
+ /** Whether the filters shelf is currently expanded. */
8
+ isShelfExpanded?: boolean;
9
+ /** Called when the toggle button is pressed. */
10
+ onToggleShelf?: () => void;
5
11
  }
6
12
  /** Skeleton for the DataTable filters cluster — grows incrementally. */
7
- export declare function FilterControls({ filters }: FilterControlsProps): React.JSX.Element;
13
+ export declare function FilterControls({ activeFilters, filters, isShelfExpanded, onToggleShelf, }: FilterControlsProps): React.JSX.Element;
8
14
  export declare namespace FilterControls {
9
15
  var displayName: string;
10
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FilterControls.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/FilterControls.tsx"],"names":[],"mappings":"AAMA,OAAO,KAA4B,MAAM,OAAO,CAAA;AAShD,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,eAAe,CAAA;AAkEhE,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,UAAU,EAAE,CAAA;CACtB;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,EAAE,mBAAmB,qBA+C9D;yBA/Ce,cAAc"}
1
+ {"version":3,"file":"FilterControls.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/FilterControls.tsx"],"names":[],"mappings":"AAMA,OAAO,KAA+C,MAAM,OAAO,CAAA;AAUnE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAmB,MAAM,eAAe,CAAA;AAoE9E,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,qBAqErB;yBA1Ee,cAAc"}
@@ -10,10 +10,12 @@ import { DropdownSection, DropdownAction } from '../dropdown/Dropdown.js';
10
10
  import { Popover, PopoverTrigger, PopoverContent } from '../popover/Popover.js';
11
11
  import Icon from '../../utilities/Icon.js';
12
12
  import { useId } from '../../utilities/useId.js';
13
- import React__default from 'react';
13
+ import React__default, { useState, useMemo } from 'react';
14
+ import { Autocomplete, SearchField } from 'react-aria-components';
14
15
  import { Input } from 'react-aria-components/Input';
15
16
  import { Label } from 'react-aria-components/Label';
16
17
  import { Menu, SubmenuTrigger, Popover as Popover$1 } from 'react-aria-components/Menu';
18
+ import { useSearchableFilters } from './SearchableFilters.js';
17
19
 
18
20
  const NOOP_ACTION = () => { };
19
21
  // Must be a dedicated component, not returned inline from `renderFilterItem`.
@@ -39,19 +41,58 @@ function renderFilterItem(node) {
39
41
  React__default.createElement("span", { slot: "label" }, node.label)));
40
42
  }
41
43
  /** Skeleton for the DataTable filters cluster — grows incrementally. */
42
- function FilterControls({ filters }) {
43
- const temporarySearchInputId = `tds-data-table-filter-controls-search-${useId()}`;
44
+ function FilterControls({ activeFilters = [], filters, isShelfExpanded = false, onToggleShelf = () => { }, }) {
45
+ const searchInputId = `tds-data-table-filter-controls-search-${useId()}`;
46
+ const [searchQuery, setSearchQuery] = useState("");
44
47
  return (React__default.createElement(ButtonGroup, { "aria-label": "Filters", className: "tds-data-table-filter-controls" },
45
48
  React__default.createElement(Popover, null,
46
49
  React__default.createElement(PopoverTrigger, null,
47
50
  React__default.createElement(Button, { label: "Add filter", prefix: React__default.createElement(Icon, { "aria-hidden": true, symbol: "general#three-reducing-horizontal-bars" }) })),
48
51
  React__default.createElement(PopoverContent, { className: "tds-data-table-popover", placement: "bottom" },
49
- React__default.createElement(Label, { className: "tds-data-table-filter-controls-label--hidden", htmlFor: temporarySearchInputId }, "Search filters"),
50
- React__default.createElement(Input, { className: "tds-data-table-filter-controls-search-input", id: temporarySearchInputId, placeholder: "Search isn't implemented yet" }),
51
- React__default.createElement(Menu, { "aria-label": "Filters", className: "tds-data-table-filter-controls-list", items: filters, renderEmptyState: () => "No filters match" }, renderFilterItem))),
52
- React__default.createElement(Button, { label: "0" })));
52
+ React__default.createElement(Autocomplete, { filter: prefixSearch },
53
+ React__default.createElement(SearchField, null,
54
+ React__default.createElement(Label, { className: "tds-data-table-filter-controls-label--hidden", htmlFor: searchInputId }, "Search filters"),
55
+ React__default.createElement("div", { className: "tds-data-table-filter-controls-search-input-sticky" },
56
+ React__default.createElement(Input, { id: searchInputId, placeholder: "Search filters", className: "tds-data-table-filter-controls-search-input", value: searchQuery, onChange: (e) => {
57
+ setSearchQuery(e.target.value);
58
+ } }))),
59
+ React__default.createElement(Menu, { "aria-label": "Filters", items: filters, className: "tds-data-table-filter-controls-list", renderEmptyState: () => "No filters match" }, searchQuery.length ? React__default.createElement(SearchResults, null) : renderFilterItem)))),
60
+ activeFilters.length > 0 && (React__default.createElement(Button, { "aria-expanded": isShelfExpanded, "aria-label": `${activeFilters.length} active filter${activeFilters.length === 1 ? "" : "s"}`, label: React__default.createElement("span", { className: "tds-data-table-filter-controls-badge" }, activeFilters.length), onClick: onToggleShelf }))));
53
61
  }
54
62
  FilterControls.displayName = "FilterControls";
63
+ function renderSearchResultItem(filter) {
64
+ const [, ...remainingGrouping] = filter.grouping;
65
+ return (React__default.createElement(DropdownAction, { key: filter.name, textValue: filter.searchable, id: `filter-search-${filter.name}`, onAction: NOOP_ACTION },
66
+ React__default.createElement("span", { slot: "label" },
67
+ remainingGrouping.length > 0 && (React__default.createElement("span", { className: "tds-data-table-filter-controls-grouping", style: { color: "crimson" } },
68
+ remainingGrouping.join(" > "),
69
+ " > ")),
70
+ filter.label)));
71
+ }
72
+ function SearchResults() {
73
+ const filters = useSearchableFilters();
74
+ const { groups, ungrouped } = useMemo(() => {
75
+ const ungroupedItems = filters.filter((f) => f.grouping.length === 0);
76
+ const groupedItems = new Map();
77
+ filters.forEach((filter) => {
78
+ const [heading] = filter.grouping;
79
+ if (!heading)
80
+ return;
81
+ groupedItems.set(heading, [...(groupedItems.get(heading) ?? []), filter]);
82
+ });
83
+ return { groups: groupedItems, ungrouped: ungroupedItems };
84
+ }, [filters]);
85
+ return (React__default.createElement(React__default.Fragment, null,
86
+ ungrouped.map(renderSearchResultItem),
87
+ Array.from(groups, ([groupLabel, items]) => (React__default.createElement(DropdownSection, { key: groupLabel, id: groupLabel, title: groupLabel }, items.map(renderSearchResultItem))))));
88
+ }
89
+ function prefixSearch(string, query) {
90
+ if (query.length === 0) {
91
+ return true;
92
+ }
93
+ const segments = query.normalize("NFC").toLowerCase().split(/\s+/);
94
+ return segments.every((segment) => string.includes(segment));
95
+ }
55
96
 
56
97
  export { FilterControls };
57
98
  //# sourceMappingURL=FilterControls.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FilterControls.js","sources":["../../../src/components/DataTable/FilterControls.tsx"],"sourcesContent":["import { Button } 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 React, { type ReactElement } from \"react\"\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 type { FilterNode, FilterNodeGroup } from \"./FilterTypes\"\n\nconst NOOP_ACTION = () => {}\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 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={group.children}\n >\n {renderFilterItem}\n </Menu>\n </AriaPopover>\n </SubmenuTrigger>\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 (\n <DropdownSection key={node.label} id={node.label} title={node.label}>\n {node.children.map(renderFilterItem)}\n </DropdownSection>\n )\n }\n\n return (\n <DropdownAction\n key={node.name}\n id={node.name}\n onAction={NOOP_ACTION}\n textValue={node.label}\n >\n <span slot=\"label\">{node.label}</span>\n </DropdownAction>\n )\n}\n\nexport interface FilterControlsProps {\n filters: FilterNode[]\n}\n\n/** Skeleton for the DataTable filters cluster — grows incrementally. */\nexport function FilterControls({ filters }: FilterControlsProps) {\n const temporarySearchInputId = `tds-data-table-filter-controls-search-${useId()}`\n\n return (\n <ButtonGroup\n aria-label=\"Filters\"\n className=\"tds-data-table-filter-controls\"\n >\n <Popover>\n <PopoverTrigger>\n <Button\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 {/* Search will go here. */}\n <Label\n className=\"tds-data-table-filter-controls-label--hidden\"\n htmlFor={temporarySearchInputId}\n >\n Search filters\n </Label>\n <Input\n className=\"tds-data-table-filter-controls-search-input\"\n id={temporarySearchInputId}\n placeholder=\"Search isn't implemented yet\"\n />\n <Menu\n aria-label=\"Filters\"\n className=\"tds-data-table-filter-controls-list\"\n items={filters}\n renderEmptyState={() => \"No filters match\"}\n >\n {renderFilterItem}\n </Menu>\n </PopoverContent>\n </Popover>\n {/* Active filter count will go here. */}\n <Button label=\"0\" />\n </ButtonGroup>\n )\n}\n\nFilterControls.displayName = \"FilterControls\"\n"],"names":["React","AriaPopover"],"mappings":"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"}
1
+ {"version":3,"file":"FilterControls.js","sources":["../../../src/components/DataTable/FilterControls.tsx"],"sourcesContent":["import { Button } 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 React, { type ReactElement, useMemo, 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 type { ActiveFilter, FilterNode, FilterNodeGroup } from \"./FilterTypes\"\nimport type { SearchableSimpleFilterItem } from \"./SearchableFilters\"\nimport { useSearchableFilters } from \"./SearchableFilters\"\n\nconst NOOP_ACTION = () => {}\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 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={group.children}\n >\n {renderFilterItem}\n </Menu>\n </AriaPopover>\n </SubmenuTrigger>\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 (\n <DropdownSection key={node.label} id={node.label} title={node.label}>\n {node.children.map(renderFilterItem)}\n </DropdownSection>\n )\n }\n\n return (\n <DropdownAction\n key={node.name}\n id={node.name}\n onAction={NOOP_ACTION}\n textValue={node.label}\n >\n <span slot=\"label\">{node.label}</span>\n </DropdownAction>\n )\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\n return (\n <ButtonGroup\n aria-label=\"Filters\"\n className=\"tds-data-table-filter-controls\"\n >\n <Popover>\n <PopoverTrigger>\n <Button\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 <Autocomplete filter={prefixSearch}>\n <SearchField>\n <Label\n className=\"tds-data-table-filter-controls-label--hidden\"\n htmlFor={searchInputId}\n >\n Search filters\n </Label>\n <div className=\"tds-data-table-filter-controls-search-input-sticky\">\n <Input\n id={searchInputId}\n placeholder=\"Search filters\"\n className=\"tds-data-table-filter-controls-search-input\"\n value={searchQuery}\n onChange={(e) => {\n setSearchQuery(e.target.value)\n }}\n />\n </div>\n </SearchField>\n <Menu\n aria-label=\"Filters\"\n items={filters}\n className=\"tds-data-table-filter-controls-list\"\n renderEmptyState={() => \"No filters match\"}\n >\n {searchQuery.length ? <SearchResults /> : renderFilterItem}\n </Menu>\n </Autocomplete>\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 renderSearchResultItem(filter: SearchableSimpleFilterItem) {\n const [, ...remainingGrouping] = filter.grouping\n\n return (\n <DropdownAction\n key={filter.name}\n textValue={filter.searchable}\n id={`filter-search-${filter.name}`}\n onAction={NOOP_ACTION}\n >\n <span slot=\"label\">\n {remainingGrouping.length > 0 && (\n <span\n className=\"tds-data-table-filter-controls-grouping\"\n style={{ color: \"crimson\" }}\n >\n {remainingGrouping.join(\" > \")}\n {\" > \"}\n </span>\n )}\n {filter.label}\n </span>\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(renderSearchResultItem)}\n {Array.from(groups, ([groupLabel, items]) => (\n <DropdownSection key={groupLabel} id={groupLabel} title={groupLabel}>\n {items.map(renderSearchResultItem)}\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,5 +1,6 @@
1
+ import type { ActiveFilterInstance } from "./ActiveFilterInstance";
1
2
  export interface FilterNodeBase {
2
- /** Extra search terms beyond the label. Not yet matched by search. */
3
+ /** Extra search terms beyond the label. */
3
4
  keywords?: string[];
4
5
  }
5
6
  export interface InputType {
@@ -12,6 +13,8 @@ export interface Operator {
12
13
  }
13
14
  export interface FilterNodeItem extends FilterNodeBase {
14
15
  children?: never;
16
+ /** Binds this filter to one active filter's operator and value. Supplied by the filter factories. */
17
+ createActiveFilterInstance: (activeFilter: ActiveFilter, operator: Operator) => ActiveFilterInstance;
15
18
  /** Not rendered in the menu. Carried through as data for the change handler. */
16
19
  description?: string;
17
20
  /** Display name in the filter menu. */
@@ -35,6 +38,16 @@ export interface FilterNodeGroup extends FilterNodeBase {
35
38
  renderChildrenInSubmenu?: boolean;
36
39
  }
37
40
  export type FilterNode = FilterNodeItem | FilterNodeGroup;
41
+ /** Narrow a factory's operator set by name. `includes` keeps only the named operators, in the order given; `excludes` drops them. */
42
+ export type OperatorSelection<Name extends string = string> = {
43
+ excludes?: never;
44
+ includes?: Name[];
45
+ } | {
46
+ excludes?: Name[];
47
+ includes?: never;
48
+ };
49
+ export type FilterItemConfig<Name extends string = string> = Omit<FilterNodeItem, "createActiveFilterInstance" | "operators"> & OperatorSelection<Name>;
50
+ export type UpdateActiveFilter = (updates: Partial<ActiveFilter>) => void;
38
51
  export interface ActiveFilter<T = unknown> {
39
52
  /** The HTML name of the applied filter. Connects to the name of the filter. */
40
53
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"FilterTypes.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/FilterTypes.tsx"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,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,QAAQ,CAAC,EAAE,KAAK,CAAA;IAChB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,QAAQ,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,mDAAmD;IACnD,QAAQ,EAAE,UAAU,EAAE,CAAA;IACtB,WAAW,CAAC,EAAE,KAAK,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;IACb,gEAAgE;IAChE,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC;AAED,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,eAAe,CAAA;AAEzD,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAA;IACZ,qHAAqH;IACrH,QAAQ,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,KAAK,EAAE,CAAC,CAAA;CACT"}
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,QAAQ,CAAC,EAAE,KAAK,CAAA;IAChB,qGAAqG;IACrG,0BAA0B,EAAE,CAC1B,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,QAAQ,KACf,oBAAoB,CAAA;IACzB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,QAAQ,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,mDAAmD;IACnD,QAAQ,EAAE,UAAU,EAAE,CAAA;IACtB,WAAW,CAAC,EAAE,KAAK,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;IACb,gEAAgE;IAChE,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC;AAED,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,eAAe,CAAA;AAEzD,qIAAqI;AACrI,MAAM,MAAM,iBAAiB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,IACtD;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAA;CAAE,GACvC;IAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,CAAA;AAE3C,MAAM,MAAM,gBAAgB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,IAAI,IAAI,CAC/D,cAAc,EACd,4BAA4B,GAAG,WAAW,CAC3C,GACC,iBAAiB,CAAC,IAAI,CAAC,CAAA;AAEzB,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAA;AAEzE,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAA;IACZ,qHAAqH;IACrH,QAAQ,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,KAAK,EAAE,CAAC,CAAA;CACT"}
@@ -1,6 +1,5 @@
1
1
  import React from "react";
2
- import type { UpdateActiveFilter } from "./ActiveFilters";
3
- import type { FilterNodeItem, Operator } from "./FilterTypes";
2
+ import type { FilterNodeItem, Operator, UpdateActiveFilter } from "./FilterTypes";
4
3
  export declare function OperatorSelect(props: {
5
4
  operator: Operator;
6
5
  relatedFilter: FilterNodeItem;
@@ -1 +1 @@
1
- {"version":3,"file":"OperatorSelect.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/OperatorSelect.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7D,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,QAAQ,EAAE,QAAQ,CAAA;IAClB,aAAa,EAAE,cAAc,CAAA;IAC7B,kBAAkB,EAAE,kBAAkB,CAAA;CACvC,qBAIA"}
1
+ {"version":3,"file":"OperatorSelect.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/OperatorSelect.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EACV,cAAc,EACd,QAAQ,EACR,kBAAkB,EACnB,MAAM,eAAe,CAAA;AAEtB,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,QAAQ,EAAE,QAAQ,CAAA;IAClB,aAAa,EAAE,cAAc,CAAA;IAC7B,kBAAkB,EAAE,kBAAkB,CAAA;CACvC,qBAIA"}
@@ -1 +1 @@
1
- {"version":3,"file":"OperatorSelect.js","sources":["../../../src/components/DataTable/OperatorSelect.tsx"],"sourcesContent":["import { Segment, SegmentedControl } from \"@components/segmented-control\"\nimport { Select } from \"@components/select\"\nimport React from \"react\"\n\nimport type { UpdateActiveFilter } from \"./ActiveFilters\"\nimport type { FilterNodeItem, Operator } from \"./FilterTypes\"\n\nexport function OperatorSelect(props: {\n operator: Operator\n relatedFilter: FilterNodeItem\n updateActiveFilter: UpdateActiveFilter\n}) {\n const { relatedFilter } = props\n const Component = getOperatorSelectComponent(relatedFilter.operators)\n return <Component {...props} />\n}\n\nfunction getOperatorSelectComponent(operators: Operator[]) {\n if (operators.length <= 1) return OperatorSelectNone\n if (operators.length < 4) return OperatorSelectSegmented\n return OperatorSelectDropdown\n}\n\nfunction OperatorSelectNone() {\n return null\n}\n\nfunction OperatorSelectSegmented({\n operator,\n relatedFilter,\n updateActiveFilter,\n}: {\n operator: Operator\n relatedFilter: FilterNodeItem\n updateActiveFilter: UpdateActiveFilter\n}) {\n return (\n <SegmentedControl\n value={operator.name}\n hideLabel\n label=\"Operator\"\n onChange={(value) => updateActiveFilter({ operator: value })}\n >\n {relatedFilter.operators.map((op) => (\n <Segment label={op.label} value={op.name} key={op.name} />\n ))}\n </SegmentedControl>\n )\n}\n\nfunction OperatorSelectDropdown({\n operator,\n relatedFilter,\n updateActiveFilter,\n}: {\n operator: Operator\n relatedFilter: FilterNodeItem\n updateActiveFilter: UpdateActiveFilter\n}) {\n return (\n <Select\n value={operator.name}\n onChange={(el) => updateActiveFilter({ operator: el.target.value })}\n options={relatedFilter.operators.map((op) => ({\n label: op.label,\n value: op.name,\n }))}\n hideLabel\n label=\"Operator\"\n />\n )\n}\n"],"names":["React"],"mappings":";;;;;;AAOM,SAAU,cAAc,CAAC,KAI9B,EAAA;AACC,IAAA,MAAM,EAAE,aAAa,EAAE,GAAG,KAAK;IAC/B,MAAM,SAAS,GAAG,0BAA0B,CAAC,aAAa,CAAC,SAAS,CAAC;AACrE,IAAA,OAAOA,cAAA,CAAA,aAAA,CAAC,SAAS,EAAA,EAAA,GAAK,KAAK,GAAI;AACjC;AAEA,SAAS,0BAA0B,CAAC,SAAqB,EAAA;AACvD,IAAA,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC;AAAE,QAAA,OAAO,kBAAkB;AACpD,IAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;AAAE,QAAA,OAAO,uBAAuB;AACxD,IAAA,OAAO,sBAAsB;AAC/B;AAEA,SAAS,kBAAkB,GAAA;AACzB,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,uBAAuB,CAAC,EAC/B,QAAQ,EACR,aAAa,EACb,kBAAkB,GAKnB,EAAA;AACC,IAAA,QACEA,cAAA,CAAA,aAAA,CAAC,gBAAgB,EAAA,EACf,KAAK,EAAE,QAAQ,CAAC,IAAI,EACpB,SAAS,EAAA,IAAA,EACT,KAAK,EAAC,UAAU,EAChB,QAAQ,EAAE,CAAC,KAAK,KAAK,kBAAkB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,IAE3D,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,MAC9BA,cAAA,CAAA,aAAA,CAAC,OAAO,EAAA,EAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,EAAA,CAAI,CAC3D,CAAC,CACe;AAEvB;AAEA,SAAS,sBAAsB,CAAC,EAC9B,QAAQ,EACR,aAAa,EACb,kBAAkB,GAKnB,EAAA;AACC,IAAA,QACEA,cAAA,CAAA,aAAA,CAAC,MAAM,IACL,KAAK,EAAE,QAAQ,CAAC,IAAI,EACpB,QAAQ,EAAE,CAAC,EAAE,KAAK,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EACnE,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM;YAC5C,KAAK,EAAE,EAAE,CAAC,KAAK;YACf,KAAK,EAAE,EAAE,CAAC,IAAI;SACf,CAAC,CAAC,EACH,SAAS,EAAA,IAAA,EACT,KAAK,EAAC,UAAU,EAAA,CAChB;AAEN;;;;"}
1
+ {"version":3,"file":"OperatorSelect.js","sources":["../../../src/components/DataTable/OperatorSelect.tsx"],"sourcesContent":["import { Segment, SegmentedControl } from \"@components/segmented-control\"\nimport { Select } from \"@components/select\"\nimport React from \"react\"\n\nimport type {\n FilterNodeItem,\n Operator,\n UpdateActiveFilter,\n} from \"./FilterTypes\"\n\nexport function OperatorSelect(props: {\n operator: Operator\n relatedFilter: FilterNodeItem\n updateActiveFilter: UpdateActiveFilter\n}) {\n const { relatedFilter } = props\n const Component = getOperatorSelectComponent(relatedFilter.operators)\n return <Component {...props} />\n}\n\nfunction getOperatorSelectComponent(operators: Operator[]) {\n if (operators.length <= 1) return OperatorSelectNone\n if (operators.length < 4) return OperatorSelectSegmented\n return OperatorSelectDropdown\n}\n\nfunction OperatorSelectNone() {\n return null\n}\n\nfunction OperatorSelectSegmented({\n operator,\n relatedFilter,\n updateActiveFilter,\n}: {\n operator: Operator\n relatedFilter: FilterNodeItem\n updateActiveFilter: UpdateActiveFilter\n}) {\n return (\n <SegmentedControl\n value={operator.name}\n hideLabel\n label=\"Operator\"\n onChange={(value) => updateActiveFilter({ operator: value })}\n >\n {relatedFilter.operators.map((op) => (\n <Segment label={op.label} value={op.name} key={op.name} />\n ))}\n </SegmentedControl>\n )\n}\n\nfunction OperatorSelectDropdown({\n operator,\n relatedFilter,\n updateActiveFilter,\n}: {\n operator: Operator\n relatedFilter: FilterNodeItem\n updateActiveFilter: UpdateActiveFilter\n}) {\n return (\n <Select\n value={operator.name}\n onChange={(el) => updateActiveFilter({ operator: el.target.value })}\n options={relatedFilter.operators.map((op) => ({\n label: op.label,\n value: op.name,\n }))}\n hideLabel\n label=\"Operator\"\n />\n )\n}\n"],"names":["React"],"mappings":";;;;;;AAUM,SAAU,cAAc,CAAC,KAI9B,EAAA;AACC,IAAA,MAAM,EAAE,aAAa,EAAE,GAAG,KAAK;IAC/B,MAAM,SAAS,GAAG,0BAA0B,CAAC,aAAa,CAAC,SAAS,CAAC;AACrE,IAAA,OAAOA,cAAA,CAAA,aAAA,CAAC,SAAS,EAAA,EAAA,GAAK,KAAK,GAAI;AACjC;AAEA,SAAS,0BAA0B,CAAC,SAAqB,EAAA;AACvD,IAAA,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC;AAAE,QAAA,OAAO,kBAAkB;AACpD,IAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;AAAE,QAAA,OAAO,uBAAuB;AACxD,IAAA,OAAO,sBAAsB;AAC/B;AAEA,SAAS,kBAAkB,GAAA;AACzB,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,uBAAuB,CAAC,EAC/B,QAAQ,EACR,aAAa,EACb,kBAAkB,GAKnB,EAAA;AACC,IAAA,QACEA,cAAA,CAAA,aAAA,CAAC,gBAAgB,EAAA,EACf,KAAK,EAAE,QAAQ,CAAC,IAAI,EACpB,SAAS,EAAA,IAAA,EACT,KAAK,EAAC,UAAU,EAChB,QAAQ,EAAE,CAAC,KAAK,KAAK,kBAAkB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,IAE3D,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,MAC9BA,cAAA,CAAA,aAAA,CAAC,OAAO,EAAA,EAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,EAAA,CAAI,CAC3D,CAAC,CACe;AAEvB;AAEA,SAAS,sBAAsB,CAAC,EAC9B,QAAQ,EACR,aAAa,EACb,kBAAkB,GAKnB,EAAA;AACC,IAAA,QACEA,cAAA,CAAA,aAAA,CAAC,MAAM,IACL,KAAK,EAAE,QAAQ,CAAC,IAAI,EACpB,QAAQ,EAAE,CAAC,EAAE,KAAK,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EACnE,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM;YAC5C,KAAK,EAAE,EAAE,CAAC,KAAK;YACf,KAAK,EAAE,EAAE,CAAC,IAAI;SACf,CAAC,CAAC,EACH,SAAS,EAAA,IAAA,EACT,KAAK,EAAC,UAAU,EAAA,CAChB;AAEN;;;;"}
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ import { FilterNode } from "./FilterTypes";
3
+ export declare function useSearchableFilters(): SearchableSimpleFilterItem[];
4
+ export type SearchableSimpleFilterItem = {
5
+ grouping: string[];
6
+ label: string;
7
+ name: string;
8
+ searchable: string;
9
+ };
10
+ export declare function SearchableFiltersProvider({ children, filters, }: {
11
+ children: React.ReactNode;
12
+ filters: FilterNode[];
13
+ }): React.JSX.Element;
14
+ //# sourceMappingURL=SearchableFilters.d.ts.map
@@ -0,0 +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,EAAE,MAAM,eAAe,CAAA;AAE1C,wBAAgB,oBAAoB,IAAI,0BAA0B,EAAE,CAEnE;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,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,qBAmCA"}
@@ -0,0 +1,35 @@
1
+ import React__default, { createContext, useMemo, useContext } from 'react';
2
+
3
+ function useSearchableFilters() {
4
+ return useContext(SearchableFiltersContext);
5
+ }
6
+ const SearchableFiltersContext = createContext([]);
7
+ function SearchableFiltersProvider({ children, filters, }) {
8
+ const searchableSimpleFilterItems = useMemo(() => {
9
+ const result = [];
10
+ function addFilterItem(filter, grouping = [], collectedKeywords = []) {
11
+ const keywords = [...collectedKeywords, ...(filter.keywords || [])];
12
+ if (filter.children) {
13
+ return filter.children.forEach((child) => addFilterItem(child, [...grouping, filter.label], keywords));
14
+ }
15
+ const searchable = dedup([...grouping, filter.label, ...keywords])
16
+ .join(" ")
17
+ .toLowerCase();
18
+ result.push({
19
+ grouping,
20
+ label: filter.label,
21
+ name: filter.name,
22
+ searchable,
23
+ });
24
+ }
25
+ filters.forEach((filter) => addFilterItem(filter));
26
+ return result;
27
+ }, [filters]);
28
+ return (React__default.createElement(SearchableFiltersContext.Provider, { value: searchableSimpleFilterItems }, children));
29
+ }
30
+ function dedup(items) {
31
+ return Array.from(new Set(items));
32
+ }
33
+
34
+ export { SearchableFiltersProvider, useSearchableFilters };
35
+ //# sourceMappingURL=SearchableFilters.js.map
@@ -0,0 +1 @@
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\"\n\nexport function useSearchableFilters(): SearchableSimpleFilterItem[] {\n return useContext(SearchableFiltersContext)\n}\n\nexport type SearchableSimpleFilterItem = {\n grouping: string[]\n label: string\n name: 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 const searchable = dedup([...grouping, filter.label, ...keywords])\n .join(\" \")\n .toLowerCase()\n result.push({\n grouping,\n label: filter.label,\n name: filter.name,\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":";;SAIgB,oBAAoB,GAAA;AAClC,IAAA,OAAO,UAAU,CAAC,wBAAwB,CAAC;AAC7C;AASA,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;AACA,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,QAAQ;gBACR,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,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;;;;"}
@@ -0,0 +1,48 @@
1
+ import type { FilterItemConfig, FilterNodeItem } from "./FilterTypes";
2
+ export type CollectionOption = {
3
+ label: string;
4
+ value: string;
5
+ };
6
+ /** A single option's `value`, or the selected `value`s when `multiple`. */
7
+ export type CollectionFilterValue = string | string[];
8
+ export type CollectionDisplay = "checkboxes" | "combobox" | "select";
9
+ export declare const COLLECTION_IS: {
10
+ readonly inputType: {
11
+ readonly type: "collection";
12
+ };
13
+ readonly label: "is";
14
+ readonly name: "eq";
15
+ };
16
+ export declare const COLLECTION_NOT: {
17
+ readonly inputType: {
18
+ readonly type: "collection";
19
+ };
20
+ readonly label: "is not";
21
+ readonly name: "not";
22
+ };
23
+ declare const COLLECTION_OPERATORS: ({
24
+ readonly inputType: {
25
+ readonly type: "collection";
26
+ };
27
+ readonly label: "is";
28
+ readonly name: "eq";
29
+ } | {
30
+ readonly inputType: {
31
+ readonly type: "collection";
32
+ };
33
+ readonly label: "is not";
34
+ readonly name: "not";
35
+ })[];
36
+ export type CollectionOperatorName = (typeof COLLECTION_OPERATORS)[number]["name"];
37
+ export type CollectionFilterConfig = FilterItemConfig<CollectionOperatorName> & {
38
+ options: CollectionOption[];
39
+ } & ({
40
+ display?: CollectionDisplay;
41
+ multiple?: false;
42
+ } | {
43
+ display?: Exclude<CollectionDisplay, "select">;
44
+ multiple: true;
45
+ });
46
+ export declare function collectionFilter({ display, excludes, includes, multiple, options, ...config }: CollectionFilterConfig): FilterNodeItem;
47
+ export {};
48
+ //# sourceMappingURL=collectionFilter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectionFilter.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/collectionFilter.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EAGf,MAAM,eAAe,CAAA;AAItB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,2EAA2E;AAC3E,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;AAErD,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAA;AAEpE,eAAO,MAAM,aAAa;;;;;;CAIG,CAAA;AAC7B,eAAO,MAAM,cAAc;;;;;;CAIE,CAAA;AAE7B,QAAA,MAAM,oBAAoB;;;;;;;;;;;;IAAkC,CAAA;AAE5D,MAAM,MAAM,sBAAsB,GAChC,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAA;AAE/C,MAAM,MAAM,sBAAsB,GAChC,gBAAgB,CAAC,sBAAsB,CAAC,GAAG;IACzC,OAAO,EAAE,gBAAgB,EAAE,CAAA;CAC5B,GAAG,CACE;IAAE,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GACjD;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAA;CAAE,CACrE,CAAA;AAML,wBAAgB,gBAAgB,CAAC,EAC/B,OAAkB,EAClB,QAAQ,EACR,QAAQ,EACR,QAAgB,EAChB,OAAO,EACP,GAAG,MAAM,EACV,EAAE,sBAAsB,GAAG,cAAc,CAazC"}
@@ -0,0 +1,86 @@
1
+ import { Checkbox } from '../checkbox/Checkbox.js';
2
+ import { CheckboxGroup } from '../checkbox-group/CheckboxGroup.js';
3
+ import { ComboBox, ComboBoxItem } from '../combo-box/ComboBox.js';
4
+ import { Radio } from '../radio/Radio.js';
5
+ import { RadioGroup } from '../radio-group/RadioGroup.js';
6
+ import { Select } from '../select/Select.js';
7
+ import React__default from 'react';
8
+ import { ActiveFilterInstance } from './ActiveFilterInstance.js';
9
+ import { resolveOperators } from './resolveOperators.js';
10
+
11
+ const COLLECTION_IS = {
12
+ inputType: { type: "collection" },
13
+ label: "is",
14
+ name: "eq",
15
+ };
16
+ const COLLECTION_NOT = {
17
+ inputType: { type: "collection" },
18
+ label: "is not",
19
+ name: "not",
20
+ };
21
+ const COLLECTION_OPERATORS = [COLLECTION_IS, COLLECTION_NOT];
22
+ function orderByOptions(options, selected) {
23
+ return options.filter((o) => selected.has(o.value)).map((o) => o.value);
24
+ }
25
+ function collectionFilter({ display = "select", excludes, includes, multiple = false, options, ...config }) {
26
+ const filter = {
27
+ ...config,
28
+ createActiveFilterInstance: (activeFilter, operator) => new CollectionActiveFilter(filter, operator, activeFilter.value, { display, multiple, options }),
29
+ operators: resolveOperators(COLLECTION_OPERATORS, { excludes, includes }),
30
+ };
31
+ return filter;
32
+ }
33
+ class CollectionActiveFilter extends ActiveFilterInstance {
34
+ config;
35
+ constructor(filter, operator, value, config) {
36
+ super(filter, operator, value);
37
+ this.config = config;
38
+ }
39
+ formatValue() {
40
+ const values = Array.isArray(this.value) ? this.value : [this.value];
41
+ return values
42
+ .map((value) => this.config.options.find((option) => option.value === value)?.label ??
43
+ value)
44
+ .join(", ");
45
+ }
46
+ renderEditor(updateActiveFilter) {
47
+ const { display, multiple, options } = this.config;
48
+ const onCommit = (value) => updateActiveFilter({ value });
49
+ if (display === "combobox") {
50
+ return (React__default.createElement(ComboBox, { hideLabel: true, label: this.operator.label, selectionMode: multiple ? "multiple" : "single", value: this.value, onChange: (value) => {
51
+ if (Array.isArray(value)) {
52
+ onCommit(orderByOptions(options, new Set(value.map(String))));
53
+ }
54
+ else if (value !== null) {
55
+ onCommit(String(value));
56
+ }
57
+ } }, options.map((option) => (React__default.createElement(ComboBoxItem, { key: option.value, id: option.value }, option.label)))));
58
+ }
59
+ if (multiple) {
60
+ const selected = Array.isArray(this.value) ? this.value : [this.value];
61
+ return (React__default.createElement(CheckboxesEditor, { label: this.filter.label, options: options, value: selected, onCommit: onCommit }));
62
+ }
63
+ const selected = Array.isArray(this.value) ? this.value[0] : this.value;
64
+ if (display === "checkboxes") {
65
+ return (React__default.createElement(RadiosEditor, { label: this.filter.label, name: this.filter.name, options: options, value: selected, onCommit: onCommit }));
66
+ }
67
+ return (React__default.createElement(Select, { hideLabel: true, label: this.operator.label, options: options, value: selected, onChange: (e) => onCommit(e.target.value) }));
68
+ }
69
+ }
70
+ function CheckboxesEditor({ label, onCommit, options, value, }) {
71
+ const toggle = (optionValue, checked) => {
72
+ const next = new Set(value);
73
+ if (checked)
74
+ next.add(optionValue);
75
+ else
76
+ next.delete(optionValue);
77
+ onCommit(orderByOptions(options, next));
78
+ };
79
+ return (React__default.createElement(CheckboxGroup, { label: label }, options.map((option) => (React__default.createElement(Checkbox, { key: option.value, checked: value.includes(option.value), label: option.label, onChange: (e) => toggle(option.value, e.target.checked) })))));
80
+ }
81
+ function RadiosEditor({ label, name, onCommit, options, value, }) {
82
+ return (React__default.createElement(RadioGroup, { label: label }, options.map((option) => (React__default.createElement(Radio, { key: option.value, checked: value === option.value, label: option.label, name: name, onChange: () => onCommit(option.value) })))));
83
+ }
84
+
85
+ export { COLLECTION_IS, COLLECTION_NOT, collectionFilter };
86
+ //# sourceMappingURL=collectionFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectionFilter.js","sources":["../../../src/components/DataTable/collectionFilter.tsx"],"sourcesContent":["import { Checkbox } from \"@components/checkbox\"\nimport { CheckboxGroup } from \"@components/checkbox-group\"\nimport { ComboBox, ComboBoxItem } from \"@components/combo-box\"\nimport { Radio } from \"@components/radio\"\nimport { RadioGroup } from \"@components/radio-group\"\nimport { Select } from \"@components/select\"\nimport React from \"react\"\n\nimport { ActiveFilterInstance } from \"./ActiveFilterInstance\"\nimport type {\n FilterItemConfig,\n FilterNodeItem,\n Operator,\n UpdateActiveFilter,\n} from \"./FilterTypes\"\nimport { resolveOperators } from \"./resolveOperators\"\n\n// A type alias (not an interface) so it satisfies `Select`'s `data-*` index signature.\nexport type CollectionOption = {\n label: string\n value: string\n}\n\n/** A single option's `value`, or the selected `value`s when `multiple`. */\nexport type CollectionFilterValue = string | string[]\n\nexport type CollectionDisplay = \"checkboxes\" | \"combobox\" | \"select\"\n\nexport const COLLECTION_IS = {\n inputType: { type: \"collection\" },\n label: \"is\",\n name: \"eq\",\n} as const satisfies Operator\nexport const COLLECTION_NOT = {\n inputType: { type: \"collection\" },\n label: \"is not\",\n name: \"not\",\n} as const satisfies Operator\n\nconst COLLECTION_OPERATORS = [COLLECTION_IS, COLLECTION_NOT]\n\nexport type CollectionOperatorName =\n (typeof COLLECTION_OPERATORS)[number][\"name\"]\n\nexport type CollectionFilterConfig =\n FilterItemConfig<CollectionOperatorName> & {\n options: CollectionOption[]\n } & (\n | { display?: CollectionDisplay; multiple?: false }\n | { display?: Exclude<CollectionDisplay, \"select\">; multiple: true }\n )\n\nfunction orderByOptions(options: CollectionOption[], selected: Set<string>) {\n return options.filter((o) => selected.has(o.value)).map((o) => o.value)\n}\n\nexport function collectionFilter({\n display = \"select\",\n excludes,\n includes,\n multiple = false,\n options,\n ...config\n}: CollectionFilterConfig): FilterNodeItem {\n const filter: FilterNodeItem = {\n ...config,\n createActiveFilterInstance: (activeFilter, operator) =>\n new CollectionActiveFilter(\n filter,\n operator,\n activeFilter.value as CollectionFilterValue,\n { display, multiple, options }\n ),\n operators: resolveOperators(COLLECTION_OPERATORS, { excludes, includes }),\n }\n return filter\n}\n\nclass CollectionActiveFilter extends ActiveFilterInstance<CollectionFilterValue> {\n constructor(\n filter: FilterNodeItem,\n operator: FilterNodeItem[\"operators\"][number],\n value: CollectionFilterValue,\n private readonly config: {\n display: CollectionDisplay\n multiple: boolean\n options: CollectionOption[]\n }\n ) {\n super(filter, operator, value)\n }\n\n formatValue() {\n const values = Array.isArray(this.value) ? this.value : [this.value]\n return values\n .map(\n (value) =>\n this.config.options.find((option) => option.value === value)?.label ??\n value\n )\n .join(\", \")\n }\n\n renderEditor(updateActiveFilter: UpdateActiveFilter) {\n const { display, multiple, options } = this.config\n const onCommit = (value: CollectionFilterValue) =>\n updateActiveFilter({ value })\n\n if (display === \"combobox\") {\n return (\n <ComboBox\n hideLabel\n label={this.operator.label}\n selectionMode={multiple ? \"multiple\" : \"single\"}\n value={this.value}\n onChange={(value: React.Key | React.Key[] | null) => {\n if (Array.isArray(value)) {\n onCommit(orderByOptions(options, new Set(value.map(String))))\n } else if (value !== null) {\n onCommit(String(value))\n }\n }}\n >\n {options.map((option) => (\n <ComboBoxItem key={option.value} id={option.value}>\n {option.label}\n </ComboBoxItem>\n ))}\n </ComboBox>\n )\n }\n\n if (multiple) {\n const selected = Array.isArray(this.value) ? this.value : [this.value]\n return (\n <CheckboxesEditor\n label={this.filter.label}\n options={options}\n value={selected}\n onCommit={onCommit}\n />\n )\n }\n\n const selected = Array.isArray(this.value) ? this.value[0] : this.value\n if (display === \"checkboxes\") {\n return (\n <RadiosEditor\n label={this.filter.label}\n name={this.filter.name}\n options={options}\n value={selected}\n onCommit={onCommit}\n />\n )\n }\n return (\n <Select\n hideLabel\n label={this.operator.label}\n options={options}\n value={selected}\n onChange={(e) => onCommit(e.target.value)}\n />\n )\n }\n}\n\nfunction CheckboxesEditor({\n label,\n onCommit,\n options,\n value,\n}: {\n label: string\n onCommit: (value: string[]) => void\n options: CollectionOption[]\n value: string[]\n}) {\n const toggle = (optionValue: string, checked: boolean) => {\n const next = new Set(value)\n if (checked) next.add(optionValue)\n else next.delete(optionValue)\n onCommit(orderByOptions(options, next))\n }\n return (\n <CheckboxGroup label={label}>\n {options.map((option) => (\n <Checkbox\n key={option.value}\n checked={value.includes(option.value)}\n label={option.label}\n onChange={(e) => toggle(option.value, e.target.checked)}\n />\n ))}\n </CheckboxGroup>\n )\n}\n\nfunction RadiosEditor({\n label,\n name,\n onCommit,\n options,\n value,\n}: {\n label: string\n name: string\n onCommit: (value: string) => void\n options: CollectionOption[]\n value: string\n}) {\n return (\n <RadioGroup label={label}>\n {options.map((option) => (\n <Radio\n key={option.value}\n checked={value === option.value}\n label={option.label}\n name={name}\n onChange={() => onCommit(option.value)}\n />\n ))}\n </RadioGroup>\n )\n}\n"],"names":["React"],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { FilterItemConfig, FilterNodeItem } from "./FilterTypes";
2
+ /** ISO `YYYY-MM-DD` strings; a pair for `between`. */
3
+ export type DateFilterValue = string | [string, string];
4
+ export declare const DATE_IS: {
5
+ readonly inputType: {
6
+ readonly type: "date";
7
+ };
8
+ readonly label: "is";
9
+ readonly name: "eq";
10
+ };
11
+ export declare const BEFORE: {
12
+ readonly inputType: {
13
+ readonly type: "date";
14
+ };
15
+ readonly label: "before";
16
+ readonly name: "before";
17
+ };
18
+ export declare const AFTER: {
19
+ readonly inputType: {
20
+ readonly type: "date";
21
+ };
22
+ readonly label: "after";
23
+ readonly name: "after";
24
+ };
25
+ export declare const DATE_RANGE: {
26
+ readonly inputType: {
27
+ readonly type: "date-range";
28
+ };
29
+ readonly label: "between";
30
+ readonly name: "date_range";
31
+ };
32
+ declare const DATE_OPERATORS: ({
33
+ readonly inputType: {
34
+ readonly type: "date";
35
+ };
36
+ readonly label: "is";
37
+ readonly name: "eq";
38
+ } | {
39
+ readonly inputType: {
40
+ readonly type: "date";
41
+ };
42
+ readonly label: "before";
43
+ readonly name: "before";
44
+ } | {
45
+ readonly inputType: {
46
+ readonly type: "date";
47
+ };
48
+ readonly label: "after";
49
+ readonly name: "after";
50
+ } | {
51
+ readonly inputType: {
52
+ readonly type: "date-range";
53
+ };
54
+ readonly label: "between";
55
+ readonly name: "date_range";
56
+ })[];
57
+ export type DateOperatorName = (typeof DATE_OPERATORS)[number]["name"];
58
+ export declare function dateFilter({ excludes, includes, ...config }: FilterItemConfig<DateOperatorName>): FilterNodeItem;
59
+ export {};
60
+ //# sourceMappingURL=dateFilter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dateFilter.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/dateFilter.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EAGf,MAAM,eAAe,CAAA;AAGtB,sDAAsD;AACtD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAEvD,eAAO,MAAM,OAAO;;;;;;CAIS,CAAA;AAC7B,eAAO,MAAM,MAAM;;;;;;CAIU,CAAA;AAC7B,eAAO,MAAM,KAAK;;;;;;CAIW,CAAA;AAC7B,eAAO,MAAM,UAAU;;;;;;CAIM,CAAA;AAE7B,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;IAAuC,CAAA;AAE3D,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAA;AAUtE,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,QAAQ,EACR,GAAG,MAAM,EACV,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,cAAc,CAYrD"}