@vuu-ui/vuu-filters 0.13.50 → 0.13.52
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/cjs/filter-pill/FilterMenu.js.map +1 -1
- package/cjs/filter-provider/FilterContext.js +8 -2
- package/cjs/filter-provider/FilterContext.js.map +1 -1
- package/cjs/filter-provider/FilterProvider.js +4 -3
- package/cjs/filter-provider/FilterProvider.js.map +1 -1
- package/cjs/filter-utils.js +7 -1
- package/cjs/filter-utils.js.map +1 -1
- package/cjs/saved-filters/DeleteFilterPrompt.js +2 -1
- package/cjs/saved-filters/DeleteFilterPrompt.js.map +1 -1
- package/cjs/saved-filters/SavedFilterPanel.js +1 -1
- package/cjs/saved-filters/SavedFilterPanel.js.map +1 -1
- package/cjs/saved-filters/useSavedFilterPanel.js +2 -2
- package/cjs/saved-filters/useSavedFilterPanel.js.map +1 -1
- package/cjs/tabbed-filter-container/TabbedFilterContainer.js +2 -2
- package/cjs/tabbed-filter-container/TabbedFilterContainer.js.map +1 -1
- package/esm/filter-pill/FilterMenu.js.map +1 -1
- package/esm/filter-provider/FilterContext.js +9 -3
- package/esm/filter-provider/FilterContext.js.map +1 -1
- package/esm/filter-provider/FilterProvider.js +4 -3
- package/esm/filter-provider/FilterProvider.js.map +1 -1
- package/esm/filter-utils.js +7 -1
- package/esm/filter-utils.js.map +1 -1
- package/esm/saved-filters/DeleteFilterPrompt.js +2 -1
- package/esm/saved-filters/DeleteFilterPrompt.js.map +1 -1
- package/esm/saved-filters/SavedFilterPanel.js +1 -1
- package/esm/saved-filters/SavedFilterPanel.js.map +1 -1
- package/esm/saved-filters/useSavedFilterPanel.js +2 -2
- package/esm/saved-filters/useSavedFilterPanel.js.map +1 -1
- package/esm/tabbed-filter-container/TabbedFilterContainer.js +2 -2
- package/esm/tabbed-filter-container/TabbedFilterContainer.js.map +1 -1
- package/package.json +11 -11
- package/types/filter-pill/FilterMenu.d.ts +6 -1
- package/types/filter-provider/FilterContext.d.ts +7 -2
- package/types/saved-filters/DeleteFilterPrompt.d.ts +3 -1
- package/types/saved-filters/useSavedFilterPanel.d.ts +7 -2
- package/types/tabbed-filter-container/TabbedFilterContainer.d.ts +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterMenu.js","sources":["../../../../packages/vuu-filters/src/filter-pill/FilterMenu.tsx"],"sourcesContent":["import { Menu, MenuItem, MenuPanel, MenuProps } from \"@salt-ds/core\";\nimport { ReactElement, useMemo } from \"react\";\n\nexport type FilterPermissions = {\n /** Closing a filter removes it from current display, without deleting*/\n allowClose?: boolean;\n /** Edit the details of the filter itself */\n allowEdit?: boolean;\n /** Rename the filter */\n allowRename?: boolean;\n /** Removing a filter deletes it entirely */\n allowRemove?: boolean;\n};\n\nconst defaultPermissions: FilterPermissions = {\n allowClose: true,\n allowEdit: true,\n allowRename: true,\n allowRemove: true,\n};\n\nexport interface FilterMenuProps\n extends Pick<MenuProps, \"getVirtualElement\" | \"onOpenChange\" | \"open\"> {\n filterId: string;\n onMenuAction: FilterMenuActionHandler;\n permissions?: FilterPermissions;\n}\n\nexport type FilterAction = \"close\" | \"remove\" | \"edit\" | \"rename\";\n\nexport type FilterMenuActionHandler = <T extends FilterAction = FilterAction>(\n filterId: string,\n filterAction: T,\n) => void;\n\nexport const FilterMenu = ({\n filterId,\n getVirtualElement,\n onMenuAction,\n onOpenChange,\n open,\n permissions = defaultPermissions,\n}: FilterMenuProps) => {\n const {\n allowClose = defaultPermissions.allowClose,\n allowEdit = defaultPermissions.allowEdit,\n allowRename = defaultPermissions.allowRename,\n allowRemove = defaultPermissions.allowRemove,\n } = permissions;\n\n const menuItems = useMemo<ReactElement[]>(() => {\n const items: ReactElement[] = [];\n if (allowClose) {\n items.push(\n <MenuItem key=\"close\" onClick={() => onMenuAction(filterId, \"close\")}>\n Close\n </MenuItem>,\n );\n }\n if (allowEdit) {\n items.push(\n <MenuItem key=\"edit\" onClick={() => onMenuAction(filterId, \"edit\")}>\n Edit Filter\n </MenuItem>,\n );\n }\n if (allowRename) {\n items.push(\n <MenuItem key=\"rename\" onClick={() => onMenuAction(filterId, \"rename\")}>\n Rename\n </MenuItem>,\n );\n }\n if (allowRemove) {\n items.push(\n <MenuItem key=\"delete\" onClick={() => onMenuAction(filterId, \"remove\")}>\n Delete\n </MenuItem>,\n );\n }\n\n return items;\n }, [allowClose, allowEdit, allowRemove, allowRename, filterId, onMenuAction]);\n return (\n <Menu\n getVirtualElement={getVirtualElement}\n open={open}\n onOpenChange={onOpenChange}\n >\n <MenuPanel>{menuItems}</MenuPanel>\n </Menu>\n );\n};\n"],"names":["useMemo","jsx","MenuItem","Menu","MenuPanel"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"FilterMenu.js","sources":["../../../../packages/vuu-filters/src/filter-pill/FilterMenu.tsx"],"sourcesContent":["import { Menu, MenuItem, MenuPanel, MenuProps } from \"@salt-ds/core\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { ReactElement, useMemo } from \"react\";\n\nexport type FilterPermissions = {\n /** Closing a filter removes it from current display, without deleting*/\n allowClose?: boolean;\n /** Edit the details of the filter itself */\n allowEdit?: boolean;\n /** Rename the filter */\n allowRename?: boolean;\n /** Removing a filter deletes it entirely */\n allowRemove?: boolean;\n};\n\nconst defaultPermissions: FilterPermissions = {\n allowClose: true,\n allowEdit: true,\n allowRename: true,\n allowRemove: true,\n};\n\nexport interface FilterMenuProps\n extends Pick<MenuProps, \"getVirtualElement\" | \"onOpenChange\" | \"open\"> {\n filterId: string;\n onMenuAction: FilterMenuActionHandler;\n permissions?: FilterPermissions;\n}\n\nexport type FilterAction = \"close\" | \"remove\" | \"edit\" | \"rename\";\n\nexport type FilterMenuActionHandler = <T extends FilterAction = FilterAction>(\n filterId: string,\n filterAction: T,\n /**\n * SOme menu action handlers may use columns to enrich filter display\n */\n columns?: ColumnDescriptor[],\n) => void;\n\nexport const FilterMenu = ({\n filterId,\n getVirtualElement,\n onMenuAction,\n onOpenChange,\n open,\n permissions = defaultPermissions,\n}: FilterMenuProps) => {\n const {\n allowClose = defaultPermissions.allowClose,\n allowEdit = defaultPermissions.allowEdit,\n allowRename = defaultPermissions.allowRename,\n allowRemove = defaultPermissions.allowRemove,\n } = permissions;\n\n const menuItems = useMemo<ReactElement[]>(() => {\n const items: ReactElement[] = [];\n if (allowClose) {\n items.push(\n <MenuItem key=\"close\" onClick={() => onMenuAction(filterId, \"close\")}>\n Close\n </MenuItem>,\n );\n }\n if (allowEdit) {\n items.push(\n <MenuItem key=\"edit\" onClick={() => onMenuAction(filterId, \"edit\")}>\n Edit Filter\n </MenuItem>,\n );\n }\n if (allowRename) {\n items.push(\n <MenuItem key=\"rename\" onClick={() => onMenuAction(filterId, \"rename\")}>\n Rename\n </MenuItem>,\n );\n }\n if (allowRemove) {\n items.push(\n <MenuItem key=\"delete\" onClick={() => onMenuAction(filterId, \"remove\")}>\n Delete\n </MenuItem>,\n );\n }\n\n return items;\n }, [allowClose, allowEdit, allowRemove, allowRename, filterId, onMenuAction]);\n return (\n <Menu\n getVirtualElement={getVirtualElement}\n open={open}\n onOpenChange={onOpenChange}\n >\n <MenuPanel>{menuItems}</MenuPanel>\n </Menu>\n );\n};\n"],"names":["useMemo","jsx","MenuItem","Menu","MenuPanel"],"mappings":";;;;;;AAeA,MAAM,kBAAwC,GAAA;AAAA,EAC5C,UAAY,EAAA,IAAA;AAAA,EACZ,SAAW,EAAA,IAAA;AAAA,EACX,WAAa,EAAA,IAAA;AAAA,EACb,WAAa,EAAA;AACf,CAAA;AAoBO,MAAM,aAAa,CAAC;AAAA,EACzB,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAc,GAAA;AAChB,CAAuB,KAAA;AACrB,EAAM,MAAA;AAAA,IACJ,aAAa,kBAAmB,CAAA,UAAA;AAAA,IAChC,YAAY,kBAAmB,CAAA,SAAA;AAAA,IAC/B,cAAc,kBAAmB,CAAA,WAAA;AAAA,IACjC,cAAc,kBAAmB,CAAA;AAAA,GAC/B,GAAA,WAAA;AAEJ,EAAM,MAAA,SAAA,GAAYA,cAAwB,MAAM;AAC9C,IAAA,MAAM,QAAwB,EAAC;AAC/B,IAAA,IAAI,UAAY,EAAA;AACd,MAAM,KAAA,CAAA,IAAA;AAAA,wBACJC,cAAA,CAACC,iBAAqB,OAAS,EAAA,MAAM,aAAa,QAAU,EAAA,OAAO,CAAG,EAAA,QAAA,EAAA,OAAA,EAAA,EAAxD,OAEd;AAAA,OACF;AAAA;AAEF,IAAA,IAAI,SAAW,EAAA;AACb,MAAM,KAAA,CAAA,IAAA;AAAA,wBACJD,cAAA,CAACC,iBAAoB,OAAS,EAAA,MAAM,aAAa,QAAU,EAAA,MAAM,CAAG,EAAA,QAAA,EAAA,aAAA,EAAA,EAAtD,MAEd;AAAA,OACF;AAAA;AAEF,IAAA,IAAI,WAAa,EAAA;AACf,MAAM,KAAA,CAAA,IAAA;AAAA,wBACJD,cAAA,CAACC,iBAAsB,OAAS,EAAA,MAAM,aAAa,QAAU,EAAA,QAAQ,CAAG,EAAA,QAAA,EAAA,QAAA,EAAA,EAA1D,QAEd;AAAA,OACF;AAAA;AAEF,IAAA,IAAI,WAAa,EAAA;AACf,MAAM,KAAA,CAAA,IAAA;AAAA,wBACJD,cAAA,CAACC,iBAAsB,OAAS,EAAA,MAAM,aAAa,QAAU,EAAA,QAAQ,CAAG,EAAA,QAAA,EAAA,QAAA,EAAA,EAA1D,QAEd;AAAA,OACF;AAAA;AAGF,IAAO,OAAA,KAAA;AAAA,GACT,EAAG,CAAC,UAAY,EAAA,SAAA,EAAW,aAAa,WAAa,EAAA,QAAA,EAAU,YAAY,CAAC,CAAA;AAC5E,EACE,uBAAAD,cAAA;AAAA,IAACE,SAAA;AAAA,IAAA;AAAA,MACC,iBAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA;AAAA,MAEA,QAAA,kBAAAF,cAAA,CAACG,kBAAW,QAAU,EAAA,SAAA,EAAA;AAAA;AAAA,GACxB;AAEJ;;;;"}
|
|
@@ -36,7 +36,7 @@ function useCurrentFilter() {
|
|
|
36
36
|
const { currentFilter, onApplyFilter, setCurrentFilter } = react.useContext(FilterContext);
|
|
37
37
|
return { currentFilter, onApplyFilter, setCurrentFilter };
|
|
38
38
|
}
|
|
39
|
-
function useSavedFilters() {
|
|
39
|
+
function useSavedFilters(props) {
|
|
40
40
|
const {
|
|
41
41
|
currentFilter,
|
|
42
42
|
onApplyFilter,
|
|
@@ -45,10 +45,16 @@ function useSavedFilters() {
|
|
|
45
45
|
saveFilter,
|
|
46
46
|
setCurrentFilter
|
|
47
47
|
} = react.useContext(FilterContext);
|
|
48
|
+
const handleFilterMenuAction = react.useCallback(
|
|
49
|
+
(filterId, filterAction) => {
|
|
50
|
+
onFilterMenuAction?.(filterId, filterAction, props?.availableColumns);
|
|
51
|
+
},
|
|
52
|
+
[onFilterMenuAction, props?.availableColumns]
|
|
53
|
+
);
|
|
48
54
|
return {
|
|
49
55
|
currentFilter,
|
|
50
56
|
onApplyFilter,
|
|
51
|
-
onFilterMenuAction,
|
|
57
|
+
onFilterMenuAction: handleFilterMenuAction,
|
|
52
58
|
savedFilters,
|
|
53
59
|
saveFilter,
|
|
54
60
|
setCurrentFilter
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterContext.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterContext.ts"],"sourcesContent":["import {\n FilterChangeHandler,\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { FilterMenuActionHandler } from \"../filter-pill/FilterMenu\";\nimport { createContext, useContext } from \"react\";\n\nexport interface FilterContextProps {\n currentFilter: FilterContainerFilterDescriptor;\n deleteFilter: (filterId: string) => void;\n saveFilter: (name: string) => void;\n savedFilters?: FilterContainerFilterDescriptor[];\n // TODO do we need this ?\n onApplyFilter: FilterChangeHandler;\n onFilterMenuAction?: FilterMenuActionHandler;\n setCurrentFilter: (filter: string | FilterContainerFilter) => void;\n}\n\nexport const EMPTY_FILTER = \"empty-filter\";\nexport const NULL_FILTER = \"null-filter\";\n\nexport const isEmptyFilter = (f?: FilterContainerFilterDescriptor) =>\n f?.id === EMPTY_FILTER;\nexport const isNullFilter = (f?: FilterContainerFilterDescriptor) =>\n f?.id === NULL_FILTER;\n\nexport const NullFilterDescriptor: FilterContainerFilterDescriptor = {\n active: true,\n id: NULL_FILTER,\n filter: null,\n};\n\nexport const EmptyFilterDescriptor: FilterContainerFilterDescriptor = {\n active: true,\n id: EMPTY_FILTER,\n filter: null,\n};\n\nexport const FilterContext = createContext<FilterContextProps>({\n currentFilter: NullFilterDescriptor,\n savedFilters: [],\n onApplyFilter: () =>\n console.warn(\n \"[FilterContext] onApplyFilter, no FilterProvider has been configured\",\n ),\n deleteFilter: () =>\n console.warn(\n \"[FilterContext] deleteFilter, no FilterProvider has been configured\",\n ),\n\n saveFilter: () =>\n console.warn(\n \"[FilterContext] saveFilter, no FilterProvider has been configured\",\n ),\n setCurrentFilter: () =>\n console.warn(\n \"[FilterContext] setCurrentFilter, no FilterProvider has been configured\",\n ),\n});\n\nexport function useCurrentFilter() {\n const { currentFilter, onApplyFilter, setCurrentFilter } =\n useContext(FilterContext);\n return { currentFilter, onApplyFilter, setCurrentFilter };\n}\n\nexport function useSavedFilters() {\n const {\n currentFilter,\n onApplyFilter,\n onFilterMenuAction,\n savedFilters,\n saveFilter,\n setCurrentFilter,\n } = useContext(FilterContext);\n return {\n currentFilter,\n onApplyFilter,\n onFilterMenuAction,\n savedFilters,\n saveFilter,\n setCurrentFilter,\n };\n}\n"],"names":["createContext","useContext"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"FilterContext.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterContext.ts"],"sourcesContent":["import {\n FilterChangeHandler,\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { FilterMenuActionHandler } from \"../filter-pill/FilterMenu\";\nimport { createContext, useCallback, useContext } from \"react\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport interface FilterContextProps {\n currentFilter: FilterContainerFilterDescriptor;\n deleteFilter: (filterId: string) => void;\n saveFilter: (name: string) => void;\n savedFilters?: FilterContainerFilterDescriptor[];\n // TODO do we need this ?\n onApplyFilter: FilterChangeHandler;\n onFilterMenuAction?: FilterMenuActionHandler;\n setCurrentFilter: (filter: string | FilterContainerFilter) => void;\n}\n\nexport const EMPTY_FILTER = \"empty-filter\";\nexport const NULL_FILTER = \"null-filter\";\n\nexport const isEmptyFilter = (f?: FilterContainerFilterDescriptor) =>\n f?.id === EMPTY_FILTER;\nexport const isNullFilter = (f?: FilterContainerFilterDescriptor) =>\n f?.id === NULL_FILTER;\n\nexport const NullFilterDescriptor: FilterContainerFilterDescriptor = {\n active: true,\n id: NULL_FILTER,\n filter: null,\n};\n\nexport const EmptyFilterDescriptor: FilterContainerFilterDescriptor = {\n active: true,\n id: EMPTY_FILTER,\n filter: null,\n};\n\nexport const FilterContext = createContext<FilterContextProps>({\n currentFilter: NullFilterDescriptor,\n savedFilters: [],\n onApplyFilter: () =>\n console.warn(\n \"[FilterContext] onApplyFilter, no FilterProvider has been configured\",\n ),\n deleteFilter: () =>\n console.warn(\n \"[FilterContext] deleteFilter, no FilterProvider has been configured\",\n ),\n\n saveFilter: () =>\n console.warn(\n \"[FilterContext] saveFilter, no FilterProvider has been configured\",\n ),\n setCurrentFilter: () =>\n console.warn(\n \"[FilterContext] setCurrentFilter, no FilterProvider has been configured\",\n ),\n});\n\nexport function useCurrentFilter() {\n const { currentFilter, onApplyFilter, setCurrentFilter } =\n useContext(FilterContext);\n return { currentFilter, onApplyFilter, setCurrentFilter };\n}\n\ninterface SavedFilterHookProps {\n availableColumns?: ColumnDescriptor[];\n}\n\nexport function useSavedFilters(props?: SavedFilterHookProps) {\n const {\n currentFilter,\n onApplyFilter,\n onFilterMenuAction,\n savedFilters,\n saveFilter,\n setCurrentFilter,\n } = useContext(FilterContext);\n\n const handleFilterMenuAction = useCallback<FilterMenuActionHandler>(\n (filterId, filterAction) => {\n onFilterMenuAction?.(filterId, filterAction, props?.availableColumns);\n },\n [onFilterMenuAction, props?.availableColumns],\n );\n\n return {\n currentFilter,\n onApplyFilter,\n onFilterMenuAction: handleFilterMenuAction,\n savedFilters,\n saveFilter,\n setCurrentFilter,\n };\n}\n"],"names":["createContext","useContext","useCallback"],"mappings":";;;;AAoBO,MAAM,YAAe,GAAA;AACrB,MAAM,WAAc,GAAA;AAEpB,MAAM,aAAgB,GAAA,CAAC,CAC5B,KAAA,CAAA,EAAG,EAAO,KAAA;AACL,MAAM,YAAe,GAAA,CAAC,CAC3B,KAAA,CAAA,EAAG,EAAO,KAAA;AAEL,MAAM,oBAAwD,GAAA;AAAA,EACnE,MAAQ,EAAA,IAAA;AAAA,EACR,EAAI,EAAA,WAAA;AAAA,EACJ,MAAQ,EAAA;AACV;AAEO,MAAM,qBAAyD,GAAA;AAAA,EACpE,MAAQ,EAAA,IAAA;AAAA,EACR,EAAI,EAAA,YAAA;AAAA,EACJ,MAAQ,EAAA;AACV;AAEO,MAAM,gBAAgBA,mBAAkC,CAAA;AAAA,EAC7D,aAAe,EAAA,oBAAA;AAAA,EACf,cAAc,EAAC;AAAA,EACf,aAAA,EAAe,MACb,OAAQ,CAAA,IAAA;AAAA,IACN;AAAA,GACF;AAAA,EACF,YAAA,EAAc,MACZ,OAAQ,CAAA,IAAA;AAAA,IACN;AAAA,GACF;AAAA,EAEF,UAAA,EAAY,MACV,OAAQ,CAAA,IAAA;AAAA,IACN;AAAA,GACF;AAAA,EACF,gBAAA,EAAkB,MAChB,OAAQ,CAAA,IAAA;AAAA,IACN;AAAA;AAEN,CAAC;AAEM,SAAS,gBAAmB,GAAA;AACjC,EAAA,MAAM,EAAE,aAAe,EAAA,aAAA,EAAe,gBAAiB,EAAA,GACrDC,iBAAW,aAAa,CAAA;AAC1B,EAAO,OAAA,EAAE,aAAe,EAAA,aAAA,EAAe,gBAAiB,EAAA;AAC1D;AAMO,SAAS,gBAAgB,KAA8B,EAAA;AAC5D,EAAM,MAAA;AAAA,IACJ,aAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAIA,iBAAW,aAAa,CAAA;AAE5B,EAAA,MAAM,sBAAyB,GAAAC,iBAAA;AAAA,IAC7B,CAAC,UAAU,YAAiB,KAAA;AAC1B,MAAqB,kBAAA,GAAA,QAAA,EAAU,YAAc,EAAA,KAAA,EAAO,gBAAgB,CAAA;AAAA,KACtE;AAAA,IACA,CAAC,kBAAoB,EAAA,KAAA,EAAO,gBAAgB;AAAA,GAC9C;AAEA,EAAO,OAAA;AAAA,IACL,aAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAoB,EAAA,sBAAA;AAAA,IACpB,YAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;;;;;;;;;;;;"}
|
|
@@ -73,11 +73,12 @@ const FilterProvider = ({
|
|
|
73
73
|
[applyNewName]
|
|
74
74
|
);
|
|
75
75
|
const promptForConfirmationOfDelete = react.useCallback(
|
|
76
|
-
(filterDescriptor) => {
|
|
76
|
+
(filterDescriptor, columns) => {
|
|
77
77
|
setDialog(
|
|
78
78
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
79
79
|
DeleteFilterPrompt.DeleteFilterPrompt,
|
|
80
80
|
{
|
|
81
|
+
columns,
|
|
81
82
|
filterDescriptor,
|
|
82
83
|
onConfirm: () => {
|
|
83
84
|
setDialog(null);
|
|
@@ -91,7 +92,7 @@ const FilterProvider = ({
|
|
|
91
92
|
[deleteFilter]
|
|
92
93
|
);
|
|
93
94
|
const handleFilterMenuAction = react.useCallback(
|
|
94
|
-
(filterId, actionType) => {
|
|
95
|
+
(filterId, actionType, columns) => {
|
|
95
96
|
const targetFilter = filterDescriptorUtils.findFilter(filterDescriptors, filterId);
|
|
96
97
|
switch (actionType) {
|
|
97
98
|
case "close":
|
|
@@ -104,7 +105,7 @@ const FilterProvider = ({
|
|
|
104
105
|
if (filterId === UNSAVED_FILTER) {
|
|
105
106
|
console.log("remove unsaved filter");
|
|
106
107
|
} else {
|
|
107
|
-
promptForConfirmationOfDelete(targetFilter);
|
|
108
|
+
promptForConfirmationOfDelete(targetFilter, columns);
|
|
108
109
|
}
|
|
109
110
|
break;
|
|
110
111
|
case "rename":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterProvider.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterProvider.tsx"],"sourcesContent":["import {\n FilterChangeHandler,\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n FilterContainerFilterDescriptorWithFilter,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ReactElement, ReactNode, useCallback, useState } from \"react\";\nimport { FilterMenuActionHandler } from \"../filter-pill/FilterMenu\";\nimport { FilterNamePrompt } from \"../saved-filters/FilterNamePrompt\";\nimport { DeleteFilterPrompt } from \"../saved-filters/DeleteFilterPrompt\";\nimport {\n activateFilter,\n findFilter,\n insertOrReplaceFilter,\n renameFilter,\n} from \"./filter-descriptor-utils\";\nimport { uuid } from \"@vuu-ui/vuu-utils\";\nimport {\n EMPTY_FILTER,\n EmptyFilterDescriptor,\n FilterContext,\n FilterContextProps,\n isEmptyFilter,\n isNullFilter,\n NULL_FILTER,\n NullFilterDescriptor,\n} from \"./FilterContext\";\n\nexport const UNSAVED_FILTER = \"unsaved-filter\";\n\nexport const filterDescriptorHasFilter = (\n f: FilterContainerFilterDescriptor,\n): f is FilterContainerFilterDescriptorWithFilter =>\n !isEmptyFilter(f) && !isNullFilter(f);\n\nconst findActiveFilter = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n) => filterDescriptors.find((f) => f.active) ?? NullFilterDescriptor;\n\nconst findFilterByName = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n name: string,\n) => filterDescriptors.find((f) => f.filter?.name === name);\n\nexport const FilterProvider = ({\n children,\n onFiltersSaved,\n savedFilters = [],\n}: Partial<Pick<FilterContextProps, \"currentFilter\" | \"savedFilters\">> & {\n children: ReactNode;\n onFiltersSaved?: (\n filterDescriptors: FilterContainerFilterDescriptor[],\n ) => void;\n}) => {\n const [filterDescriptors, setFilterDescriptors] = useState(savedFilters);\n const [dialog, setDialog] = useState<ReactElement | null>(null);\n\n const handleApplyFilter = useCallback<FilterChangeHandler>(() => {\n console.log(\"filter changed\");\n }, []);\n\n const deleteFilter = useCallback(\n (filterId: string) => {\n setFilterDescriptors((filterDescriptors) => {\n const newFilterDescriptors = filterDescriptors.filter(\n ({ id }) => id !== filterId,\n );\n if (filterId !== UNSAVED_FILTER) {\n onFiltersSaved?.(newFilterDescriptors);\n }\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const applyNewName = useCallback(\n (filterId: string, name: string) => {\n setFilterDescriptors((currentFilterDescriptors) => {\n const newFilterDescriptors = renameFilter(\n currentFilterDescriptors,\n filterId,\n name,\n );\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const PromptForFilterName = useCallback(\n ({ filter, id }: FilterContainerFilterDescriptor) => {\n const originalFilterName = filter?.name ?? \"\";\n setDialog(\n <FilterNamePrompt\n filterName={filter?.name}\n title=\"Rename filter\"\n onClose={() => setDialog(null)}\n onConfirm={(name) => {\n setDialog(null);\n if (originalFilterName !== name) {\n applyNewName(id, name);\n }\n }}\n />,\n );\n },\n [applyNewName],\n );\n\n const promptForConfirmationOfDelete = useCallback(\n (filterDescriptor: FilterContainerFilterDescriptor) => {\n setDialog(\n <DeleteFilterPrompt\n filterDescriptor={filterDescriptor}\n onConfirm={() => {\n setDialog(null);\n deleteFilter(filterDescriptor.id);\n }}\n onClose={() => setDialog(null)}\n />,\n );\n },\n [deleteFilter],\n );\n\n const handleFilterMenuAction = useCallback<FilterMenuActionHandler>(\n (filterId, actionType) => {\n const targetFilter = findFilter(filterDescriptors, filterId);\n switch (actionType) {\n case \"close\":\n console.log(`close filter ${filterId}`);\n break;\n case \"edit\":\n console.log(`edit filter ${filterId}`);\n break;\n case \"remove\":\n if (filterId === UNSAVED_FILTER) {\n console.log(\"remove unsaved filter\");\n } else {\n promptForConfirmationOfDelete(targetFilter);\n }\n break;\n case \"rename\":\n return PromptForFilterName(targetFilter);\n }\n },\n [filterDescriptors, promptForConfirmationOfDelete, PromptForFilterName],\n );\n\n const handleSaveFilter = useCallback(\n (name: string) => {\n setFilterDescriptors((filterDescriptors) => {\n const activeFilter = findActiveFilter(filterDescriptors);\n if (activeFilter.filter === null) {\n throw Error(\"[FilterProvider] cannot save an empty filter\");\n }\n const filterWithSameName = findFilterByName(filterDescriptors, name);\n // We are always renaming the active filter, how this will play out depends on whether\n // the name is unique and has actually changed\n if (activeFilter === filterWithSameName) {\n // name has not changed\n return filterDescriptors;\n } else if (filterWithSameName !== undefined) {\n // we are renaming the active filter, but another filter already has the same name,\n // keep the active filter, remove the duplicate.\n return filterDescriptors.reduce<FilterContainerFilterDescriptor[]>(\n (list, filterDescriptor) => {\n if (filterDescriptor === activeFilter) {\n list.push({\n active: true,\n filter: { ...filterDescriptor.filter, name },\n id: uuid(),\n name,\n } as FilterContainerFilterDescriptor);\n } else if (filterDescriptor.filter?.name !== name) {\n list.push(filterDescriptor);\n }\n return list;\n },\n [],\n );\n } else {\n const newFilterDescriptors = filterDescriptors.map(\n (filterDescriptor) =>\n filterDescriptor === activeFilter\n ? ({\n active: true,\n filter: { ...filterDescriptor.filter, name },\n id: uuid(),\n name,\n } as FilterContainerFilterDescriptor)\n : filterDescriptor,\n );\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n }\n });\n },\n [onFiltersSaved],\n );\n\n /**\n * Allows switching between saved filters. Alternatively, an anonymous\n * filter can be assigned. This is to allow for a dynamically created\n * filter to be active.\n */\n const setCurrentFilter = useCallback(\n (filter: string | FilterContainerFilter) => {\n if (filter === NULL_FILTER) {\n setFilterDescriptors((currentFilterDescriptors) =>\n insertOrReplaceFilter(currentFilterDescriptors, NullFilterDescriptor),\n );\n } else if (filter === EMPTY_FILTER) {\n setFilterDescriptors((currentFilterDescriptors) =>\n insertOrReplaceFilter(\n currentFilterDescriptors,\n EmptyFilterDescriptor,\n ),\n );\n } else if (typeof filter === \"string\") {\n setFilterDescriptors((currentFilterDescriptors) =>\n activateFilter(currentFilterDescriptors, filter),\n );\n } else if (filter) {\n setFilterDescriptors((currentFilterDescriptors) =>\n insertOrReplaceFilter(currentFilterDescriptors, {\n active: true,\n filter,\n id: UNSAVED_FILTER,\n }),\n );\n } else {\n deleteFilter(UNSAVED_FILTER);\n }\n },\n [deleteFilter],\n );\n\n return (\n <FilterContext.Provider\n value={{\n currentFilter: findActiveFilter(filterDescriptors),\n onApplyFilter: handleApplyFilter,\n onFilterMenuAction: handleFilterMenuAction,\n deleteFilter,\n saveFilter: handleSaveFilter,\n savedFilters: filterDescriptors.filter(filterDescriptorHasFilter),\n setCurrentFilter,\n }}\n >\n {children}\n {dialog}\n </FilterContext.Provider>\n );\n};\n"],"names":["isEmptyFilter","isNullFilter","NullFilterDescriptor","useState","useCallback","filterDescriptors","renameFilter","jsx","FilterNamePrompt","DeleteFilterPrompt","findFilter","uuid","NULL_FILTER","insertOrReplaceFilter","EMPTY_FILTER","EmptyFilterDescriptor","activateFilter","jsxs","FilterContext"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FilterProvider.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterProvider.tsx"],"sourcesContent":["import {\n FilterChangeHandler,\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n FilterContainerFilterDescriptorWithFilter,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ReactElement, ReactNode, useCallback, useState } from \"react\";\nimport { FilterMenuActionHandler } from \"../filter-pill/FilterMenu\";\nimport { FilterNamePrompt } from \"../saved-filters/FilterNamePrompt\";\nimport { DeleteFilterPrompt } from \"../saved-filters/DeleteFilterPrompt\";\nimport {\n activateFilter,\n findFilter,\n insertOrReplaceFilter,\n renameFilter,\n} from \"./filter-descriptor-utils\";\nimport { uuid } from \"@vuu-ui/vuu-utils\";\nimport {\n EMPTY_FILTER,\n EmptyFilterDescriptor,\n FilterContext,\n FilterContextProps,\n isEmptyFilter,\n isNullFilter,\n NULL_FILTER,\n NullFilterDescriptor,\n} from \"./FilterContext\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport const UNSAVED_FILTER = \"unsaved-filter\";\n\nexport const filterDescriptorHasFilter = (\n f: FilterContainerFilterDescriptor,\n): f is FilterContainerFilterDescriptorWithFilter =>\n !isEmptyFilter(f) && !isNullFilter(f);\n\nconst findActiveFilter = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n) => filterDescriptors.find((f) => f.active) ?? NullFilterDescriptor;\n\nconst findFilterByName = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n name: string,\n) => filterDescriptors.find((f) => f.filter?.name === name);\n\nexport const FilterProvider = ({\n children,\n onFiltersSaved,\n savedFilters = [],\n}: Partial<Pick<FilterContextProps, \"currentFilter\" | \"savedFilters\">> & {\n children: ReactNode;\n onFiltersSaved?: (\n filterDescriptors: FilterContainerFilterDescriptor[],\n ) => void;\n}) => {\n const [filterDescriptors, setFilterDescriptors] = useState(savedFilters);\n const [dialog, setDialog] = useState<ReactElement | null>(null);\n\n const handleApplyFilter = useCallback<FilterChangeHandler>(() => {\n console.log(\"filter changed\");\n }, []);\n\n const deleteFilter = useCallback(\n (filterId: string) => {\n setFilterDescriptors((filterDescriptors) => {\n const newFilterDescriptors = filterDescriptors.filter(\n ({ id }) => id !== filterId,\n );\n if (filterId !== UNSAVED_FILTER) {\n onFiltersSaved?.(newFilterDescriptors);\n }\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const applyNewName = useCallback(\n (filterId: string, name: string) => {\n setFilterDescriptors((currentFilterDescriptors) => {\n const newFilterDescriptors = renameFilter(\n currentFilterDescriptors,\n filterId,\n name,\n );\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const PromptForFilterName = useCallback(\n ({ filter, id }: FilterContainerFilterDescriptor) => {\n const originalFilterName = filter?.name ?? \"\";\n setDialog(\n <FilterNamePrompt\n filterName={filter?.name}\n title=\"Rename filter\"\n onClose={() => setDialog(null)}\n onConfirm={(name) => {\n setDialog(null);\n if (originalFilterName !== name) {\n applyNewName(id, name);\n }\n }}\n />,\n );\n },\n [applyNewName],\n );\n\n const promptForConfirmationOfDelete = useCallback(\n (\n filterDescriptor: FilterContainerFilterDescriptor,\n columns?: ColumnDescriptor[],\n ) => {\n setDialog(\n <DeleteFilterPrompt\n columns={columns}\n filterDescriptor={filterDescriptor}\n onConfirm={() => {\n setDialog(null);\n deleteFilter(filterDescriptor.id);\n }}\n onClose={() => setDialog(null)}\n />,\n );\n },\n [deleteFilter],\n );\n\n const handleFilterMenuAction = useCallback<FilterMenuActionHandler>(\n (filterId, actionType, columns) => {\n const targetFilter = findFilter(filterDescriptors, filterId);\n switch (actionType) {\n case \"close\":\n console.log(`close filter ${filterId}`);\n break;\n case \"edit\":\n console.log(`edit filter ${filterId}`);\n break;\n case \"remove\":\n if (filterId === UNSAVED_FILTER) {\n console.log(\"remove unsaved filter\");\n } else {\n promptForConfirmationOfDelete(targetFilter, columns);\n }\n break;\n case \"rename\":\n return PromptForFilterName(targetFilter);\n }\n },\n [filterDescriptors, promptForConfirmationOfDelete, PromptForFilterName],\n );\n\n const handleSaveFilter = useCallback(\n (name: string) => {\n setFilterDescriptors((filterDescriptors) => {\n const activeFilter = findActiveFilter(filterDescriptors);\n if (activeFilter.filter === null) {\n throw Error(\"[FilterProvider] cannot save an empty filter\");\n }\n const filterWithSameName = findFilterByName(filterDescriptors, name);\n // We are always renaming the active filter, how this will play out depends on whether\n // the name is unique and has actually changed\n if (activeFilter === filterWithSameName) {\n // name has not changed\n return filterDescriptors;\n } else if (filterWithSameName !== undefined) {\n // we are renaming the active filter, but another filter already has the same name,\n // keep the active filter, remove the duplicate.\n return filterDescriptors.reduce<FilterContainerFilterDescriptor[]>(\n (list, filterDescriptor) => {\n if (filterDescriptor === activeFilter) {\n list.push({\n active: true,\n filter: { ...filterDescriptor.filter, name },\n id: uuid(),\n name,\n } as FilterContainerFilterDescriptor);\n } else if (filterDescriptor.filter?.name !== name) {\n list.push(filterDescriptor);\n }\n return list;\n },\n [],\n );\n } else {\n const newFilterDescriptors = filterDescriptors.map(\n (filterDescriptor) =>\n filterDescriptor === activeFilter\n ? ({\n active: true,\n filter: { ...filterDescriptor.filter, name },\n id: uuid(),\n name,\n } as FilterContainerFilterDescriptor)\n : filterDescriptor,\n );\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n }\n });\n },\n [onFiltersSaved],\n );\n\n /**\n * Allows switching between saved filters. Alternatively, an anonymous\n * filter can be assigned. This is to allow for a dynamically created\n * filter to be active.\n */\n const setCurrentFilter = useCallback(\n (filter: string | FilterContainerFilter) => {\n if (filter === NULL_FILTER) {\n setFilterDescriptors((currentFilterDescriptors) =>\n insertOrReplaceFilter(currentFilterDescriptors, NullFilterDescriptor),\n );\n } else if (filter === EMPTY_FILTER) {\n setFilterDescriptors((currentFilterDescriptors) =>\n insertOrReplaceFilter(\n currentFilterDescriptors,\n EmptyFilterDescriptor,\n ),\n );\n } else if (typeof filter === \"string\") {\n setFilterDescriptors((currentFilterDescriptors) =>\n activateFilter(currentFilterDescriptors, filter),\n );\n } else if (filter) {\n setFilterDescriptors((currentFilterDescriptors) =>\n insertOrReplaceFilter(currentFilterDescriptors, {\n active: true,\n filter,\n id: UNSAVED_FILTER,\n }),\n );\n } else {\n deleteFilter(UNSAVED_FILTER);\n }\n },\n [deleteFilter],\n );\n\n return (\n <FilterContext.Provider\n value={{\n currentFilter: findActiveFilter(filterDescriptors),\n onApplyFilter: handleApplyFilter,\n onFilterMenuAction: handleFilterMenuAction,\n deleteFilter,\n saveFilter: handleSaveFilter,\n savedFilters: filterDescriptors.filter(filterDescriptorHasFilter),\n setCurrentFilter,\n }}\n >\n {children}\n {dialog}\n </FilterContext.Provider>\n );\n};\n"],"names":["isEmptyFilter","isNullFilter","NullFilterDescriptor","useState","useCallback","filterDescriptors","renameFilter","jsx","FilterNamePrompt","DeleteFilterPrompt","findFilter","uuid","NULL_FILTER","insertOrReplaceFilter","EMPTY_FILTER","EmptyFilterDescriptor","activateFilter","jsxs","FilterContext"],"mappings":"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"}
|
package/cjs/filter-utils.js
CHANGED
|
@@ -309,7 +309,13 @@ const getFilterClausesForDisplay = (filter, columns = [], clauses = []) => {
|
|
|
309
309
|
if (filter === void 0) {
|
|
310
310
|
return clauses;
|
|
311
311
|
} else if (vuuUtils.isSingleValueFilter(filter)) {
|
|
312
|
-
|
|
312
|
+
const column = columns.find((c) => c.name === filter.column);
|
|
313
|
+
if (column) {
|
|
314
|
+
const { name, label = name } = column;
|
|
315
|
+
clauses.push([label, filter.value.toString()]);
|
|
316
|
+
} else {
|
|
317
|
+
clauses.push([filter.column, filter.value.toString()]);
|
|
318
|
+
}
|
|
313
319
|
} else if (vuuUtils.isBetweenFilter(filter)) {
|
|
314
320
|
const [f1, f2] = filter.filters;
|
|
315
321
|
const column = columns.find((c) => c.name === f1.column);
|
package/cjs/filter-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-utils.js","sources":["../../../packages/vuu-filters/src/filter-utils.ts"],"sourcesContent":["import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n Filter,\n FilterClause,\n FilterCombinatorOp,\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n FilterWithPartialClause,\n MultiClauseFilter,\n NumericFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n extractFilterForColumn,\n filtersAreEqual,\n isAndFilter,\n isBetweenFilter,\n isInFilter,\n isMultiClauseFilter,\n isMultiValueFilter,\n isOrFilter,\n isSingleValueFilter,\n isTimeDataValue,\n partition,\n Time,\n} from \"@vuu-ui/vuu-utils\";\n\nexport const AND = \"and\";\nexport const EQUALS = \"=\";\nexport const GREATER_THAN = \">\";\nexport const LESS_THAN = \"<\";\nexport const OR = \"or\";\nexport const STARTS_WITH = \"starts\";\nexport const ENDS_WITH = \"ends\";\nexport const IN = \"in\";\n\nexport type FilterType =\n | \"and\"\n | \"=\"\n | \">\"\n | \">=\"\n | \"in\"\n | \"<=\"\n | \"<\"\n | \"NOT_IN\"\n | \"NOT_SW\"\n | \"or\"\n | \"SW\";\n\nexport const filterClauses = (\n filter: Partial<Filter> | FilterWithPartialClause | null,\n clauses: Partial<FilterClause>[] = [],\n): Partial<FilterClause>[] => {\n if (filter) {\n if (isMultiClauseFilter(filter)) {\n filter.filters.forEach((f) => clauses.push(...filterClauses(f)));\n } else {\n clauses.push(filter as Partial<FilterClause>);\n }\n }\n return clauses;\n};\n\ntype AddFilterOptions = {\n combineWith: FilterCombinatorOp;\n};\n\nconst DEFAULT_ADD_FILTER_OPTS: AddFilterOptions = {\n combineWith: \"and\",\n};\n\nexport const removeLastClause = (filter: MultiClauseFilter) => {\n const { filters } = filter;\n if (filters.length > 2) {\n return {\n ...filter,\n filters: filter.filters.slice(0, -1),\n };\n } else {\n // must be 2, we never have 1\n return filter.filters[0];\n }\n};\n\n/**\n Allows an empty FilterClause to be appended to an existing filter - for use\n in filter editing UI only.\n*/\nexport const addClause = (\n existingFilter: Filter,\n clause: Partial<Filter>,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS,\n): FilterWithPartialClause => {\n if (\n isMultiClauseFilter(existingFilter) &&\n existingFilter.op === combineWith\n ) {\n // if (isCompleteFilter(clause)) {\n return {\n ...existingFilter,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n filters: existingFilter.filters.concat(clause),\n };\n // } else {\n // throw Error(\n // \"filter-utils, replaceFilter, only a valid clause can be added to a filter\"\n // );\n // }\n } else {\n return {\n op: combineWith,\n filters: [existingFilter, clause],\n };\n }\n};\n\nexport const addFilter = (\n existingFilter: Filter | undefined,\n filter: Filter,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS,\n): Filter | undefined => {\n if (includesNoValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the no-values filter\n } else {\n existingFilter = removeFilterForColumn(existingFilter, {\n name: filter.column,\n });\n }\n } else if (includesAllValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the all-values filter\n }\n return removeFilterForColumn(existingFilter, { name: filter.column ?? \"\" });\n }\n\n if (!existingFilter) {\n return filter;\n }\n if (!filter) {\n return existingFilter;\n }\n if (existingFilter.op === AND && filter.op === AND) {\n return {\n op: AND,\n filters: combine(existingFilter.filters, filter.filters),\n };\n }\n if (existingFilter.op === AND) {\n const filters = replaceOrInsert(existingFilter.filters, filter);\n return filters.length > 1 ? { op: AND, filters } : filters[0];\n }\n if (filter.op === AND) {\n return { op: AND, filters: filter.filters.concat(existingFilter) };\n }\n\n if (filterEquals(existingFilter, filter, true)) {\n return filter;\n }\n\n if (canMerge(existingFilter, filter)) {\n return merge(existingFilter, filter);\n }\n\n return { op: combineWith, filters: [existingFilter, filter] };\n};\n\nconst includesNoValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (isInFilter(filter) && filter.values.length === 0) {\n return true;\n }\n return isAndFilter(filter) && filter.filters.some((f) => includesNoValues(f));\n};\n\ninterface CommonFilter {\n colName?: string;\n otherColFilters?: Filter[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mode?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n values?: any;\n op?: \"or\" | \"and\";\n column?: string;\n filters?: Filter[];\n}\n\nexport interface OtherFilter extends CommonFilter {\n type: FilterType;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n values?: any[];\n}\n\nconst includesAllValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (filter.op === STARTS_WITH && filter.value === \"\") {\n return true;\n }\n return filter.op === STARTS_WITH && filter.value === \"\";\n};\n\nconst replaceOrInsert = (filters: Filter[], filter: Filter) => {\n return filters.concat(filter);\n};\n\nconst merge = (f1: Filter, f2: Filter): Filter | undefined => {\n if (includesNoValues(f2)) {\n return f2;\n }\n if (isInFilter(f1) && isInFilter(f2)) {\n return {\n ...f1,\n values: [\n ...f1.values,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...(f2.values as any[]).filter(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (v: string | number) => !(f1.values as any[]).includes(v),\n ),\n ],\n };\n } else if (isInFilter(f1) && f2.op === EQUALS) {\n return {\n ...f1,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: f1.values.concat([f2.value]),\n };\n } else if (f1.op === EQUALS && f2.op === EQUALS) {\n return {\n column: f1.column,\n op: IN,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: [f1.value, f2.value],\n };\n }\n return f2;\n};\n\nconst combine = (existingFilters: Filter[], replacementFilters: Filter[]) => {\n const equivalentType = ({ op: op1 }: Filter, { op: op2 }: Filter) => {\n return (\n op1 === op2 ||\n (op1[0] === \">\" && op2[0] === \">\") ||\n (op1[0] === \"<\" && op2[0] === \"<\")\n );\n };\n const replaces = (existingFilter: Filter, replacementFilter: Filter) => {\n return (\n existingFilter.column === replacementFilter.column &&\n equivalentType(existingFilter, replacementFilter)\n );\n };\n const stillApplicable = (existingFilter: Filter) =>\n replacementFilters.some((replacementFilter) =>\n replaces(existingFilter, replacementFilter),\n ) === false;\n return existingFilters.filter(stillApplicable).concat(replacementFilters);\n};\n\nexport const removeFilter = (sourceFilter: Filter, filterToRemove: Filter) => {\n if (filterEquals(sourceFilter, filterToRemove, true)) {\n return null;\n }\n if (sourceFilter.op !== AND) {\n throw Error(\n `removeFilter cannot remove ${JSON.stringify(\n filterToRemove,\n )} from ${JSON.stringify(sourceFilter)}`,\n );\n }\n const filters = sourceFilter.filters.filter(\n (f) => !filterEquals(f, filterToRemove),\n );\n return filters.length > 0 ? { type: AND, filters } : null;\n};\n\nexport const splitFilterOnColumn = (\n columnName: string,\n filter?: Filter,\n): [Filter | undefined, Filter | undefined] => {\n if (!filter) {\n return [undefined, undefined];\n }\n if (filter.column === columnName) {\n return [filter, undefined];\n }\n if (filter.op !== AND) {\n return [undefined, filter];\n }\n const [[columnFilter = undefined], filters] = partition(\n (filter as MultiClauseFilter<\"and\">).filters,\n (f) => f.column === columnName,\n );\n return filters.length === 1\n ? [columnFilter, filters[0]]\n : [columnFilter, { op: AND, filters }];\n};\n\nexport const overrideColName = (filter: Filter, column: string): Filter => {\n if (isMultiClauseFilter(filter)) {\n return {\n op: filter.op,\n filters: filter.filters.map((f) => overrideColName(f, column)),\n };\n }\n return { ...filter, column };\n};\n\nexport const filterIncludesColumn = (\n filter: Filter,\n column: ColumnDescriptor,\n): boolean => {\n if (!filter) {\n return false;\n }\n const { op, column: filterColName } = filter;\n switch (op) {\n case AND:\n case OR:\n return (\n filter.filters != null &&\n filter.filters.some((f) => filterIncludesColumn(f, column))\n );\n default:\n return filterColName === column.name;\n }\n};\n\nconst removeFilterForColumn = (\n sourceFilter: Filter | undefined,\n column: ColumnDescriptor,\n): Filter | undefined => {\n const colName = column.name;\n if (!sourceFilter) {\n return undefined;\n }\n if (sourceFilter.column === colName) {\n return undefined;\n }\n if (isAndFilter(sourceFilter) || isOrFilter(sourceFilter)) {\n const { op } = sourceFilter;\n const filters = sourceFilter.filters;\n const otherColFilters = filters.filter((f) => f.column !== colName);\n switch (otherColFilters.length) {\n case 0:\n return undefined;\n case 1:\n return otherColFilters[0];\n default:\n return { op, filters: otherColFilters };\n }\n }\n return sourceFilter;\n};\n\nconst canMerge = (f1: Filter, f2: Filter) =>\n f1.column === f2.column &&\n (f1.op === \"=\" || f1.op === \"in\") &&\n (f2.op === \"=\" || f2.op === \"in\");\n\nconst sameValues = <T>(arr1: T[], arr2: T[]) => {\n if (arr1 === arr2) {\n return true;\n }\n if (arr1.length === arr2.length) {\n const a = arr1.slice().sort();\n const b = arr2.slice().sort();\n return a.join(\"|\") === b.join(\"|\");\n }\n return false;\n};\n\nexport const filterEquals = (f1?: Filter, f2?: Filter, strict = false) => {\n if (!strict) {\n return true;\n }\n if (f1 && f2 && canMerge(f1, f2)) {\n return (\n f1.op === f2.op &&\n ((isSingleValueFilter(f1) &&\n isSingleValueFilter(f2) &&\n f1.value === f2.value) ||\n (isMultiValueFilter(f1) &&\n isMultiValueFilter(f2) &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sameValues(f1.values as any[], f2.values)))\n );\n }\n return false;\n};\n\nexport const updateFilter = (\n filter: Filter | undefined,\n newFilter: Filter | undefined,\n mode: \"add\" | \"replace\",\n): Filter | undefined => {\n if (filter && newFilter) {\n if (mode === \"replace\") {\n return newFilter;\n }\n if (filter.op === \"and\") {\n return {\n ...filter,\n filters: filter.filters.concat(newFilter),\n };\n }\n const { column: columnName } = newFilter;\n if (columnName) {\n const existingClause = newFilter.column\n ? extractFilterForColumn(filter, columnName)\n : undefined;\n if (existingClause && columnName) {\n // The filter already contains a clause for this column, replace\n // with the new clause\n const result = removeFilterForColumn(filter, { name: columnName });\n return updateFilter(result, newFilter, \"add\");\n }\n }\n return {\n op: \"and\",\n filters: [filter, newFilter],\n };\n }\n if (newFilter) {\n return newFilter;\n }\n return filter;\n};\n\nexport const getTypeaheadFilter = (\n column: string,\n filterValues: string[],\n isStartsWithFilter?: boolean,\n): Filter | undefined => {\n if (filterValues.length === 0) {\n return undefined;\n }\n\n if (isStartsWithFilter) {\n // multiple starts with filters not currently supported\n const startsWith = filterValues[0].substring(0, filterValues[0].length - 3);\n return {\n column,\n op: \"starts\",\n value: `\"${startsWith}\"`,\n };\n }\n\n return {\n column,\n op: \"in\",\n values: filterValues.map((value) => `\"${value}\"`),\n };\n};\n\nexport const getNumericFilter = (\n column: string,\n op?: NumericFilterClauseOp,\n value?: number,\n): FilterClause | undefined => {\n if (op === undefined) return undefined;\n if (value === undefined || isNaN(value)) return undefined;\n return { column, op, value };\n};\n\ntype FilterClauseList = Array<[string, string]>;\n\n/**\n * Restructure a FilterContainerFilter into a list of [column, value] tuples\n * suitable for display in a text based control.\n */\nexport const getFilterClausesForDisplay = (\n filter?: FilterContainerFilter,\n columns: ColumnDescriptor[] = [],\n clauses: FilterClauseList = [],\n): FilterClauseList => {\n if (filter === undefined) {\n return clauses;\n } else if (isSingleValueFilter(filter)) {\n clauses.push([filter.column, filter.value.toString()]);\n } else if (isBetweenFilter(filter)) {\n const [f1, f2] = filter.filters;\n const column = columns.find((c) => c.name === f1.column);\n if (\n isTimeDataValue(column) &&\n typeof f1.value === \"number\" &&\n typeof f2.value === \"number\"\n ) {\n const { name, label = name } = column;\n clauses.push([\n label,\n `${Time.millisToTimeString(f1.value)} - ${Time.millisToTimeString(f2.value)}`,\n ]);\n } else if (column) {\n const { name, label = name } = column;\n clauses.push([label, `${f1.value} - ${f2.value}`]);\n } else {\n clauses.push([f1.column, `${f1.value} - ${f2.value}`]);\n }\n } else if (isAndFilter(filter)) {\n filter.filters.forEach((f) =>\n getFilterClausesForDisplay(f, columns, clauses),\n );\n }\n return clauses;\n};\n\n/**\n * Given a list of FilterContainerFilterDescriptors and a FilterContainerFilter,\n * find filter descriptor from the list with an equal filter. If\n * none exists, return undefined, otherwise return the matched filter descriptor\n */\nexport const findMatchingFilter = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n filter: FilterContainerFilter,\n) =>\n filterDescriptors.find(\n ({ active, filter: f }) =>\n !active && f !== null && f !== filter && filtersAreEqual(f, filter),\n );\n"],"names":["isMultiClauseFilter","isInFilter","isAndFilter","partition","isOrFilter","isSingleValueFilter","isMultiValueFilter","extractFilterForColumn","isBetweenFilter","isTimeDataValue","Time","filtersAreEqual"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filter-utils.js","sources":["../../../packages/vuu-filters/src/filter-utils.ts"],"sourcesContent":["import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n Filter,\n FilterClause,\n FilterCombinatorOp,\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n FilterWithPartialClause,\n MultiClauseFilter,\n NumericFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n extractFilterForColumn,\n filtersAreEqual,\n isAndFilter,\n isBetweenFilter,\n isInFilter,\n isMultiClauseFilter,\n isMultiValueFilter,\n isOrFilter,\n isSingleValueFilter,\n isTimeDataValue,\n partition,\n Time,\n} from \"@vuu-ui/vuu-utils\";\n\nexport const AND = \"and\";\nexport const EQUALS = \"=\";\nexport const GREATER_THAN = \">\";\nexport const LESS_THAN = \"<\";\nexport const OR = \"or\";\nexport const STARTS_WITH = \"starts\";\nexport const ENDS_WITH = \"ends\";\nexport const IN = \"in\";\n\nexport type FilterType =\n | \"and\"\n | \"=\"\n | \">\"\n | \">=\"\n | \"in\"\n | \"<=\"\n | \"<\"\n | \"NOT_IN\"\n | \"NOT_SW\"\n | \"or\"\n | \"SW\";\n\nexport const filterClauses = (\n filter: Partial<Filter> | FilterWithPartialClause | null,\n clauses: Partial<FilterClause>[] = [],\n): Partial<FilterClause>[] => {\n if (filter) {\n if (isMultiClauseFilter(filter)) {\n filter.filters.forEach((f) => clauses.push(...filterClauses(f)));\n } else {\n clauses.push(filter as Partial<FilterClause>);\n }\n }\n return clauses;\n};\n\ntype AddFilterOptions = {\n combineWith: FilterCombinatorOp;\n};\n\nconst DEFAULT_ADD_FILTER_OPTS: AddFilterOptions = {\n combineWith: \"and\",\n};\n\nexport const removeLastClause = (filter: MultiClauseFilter) => {\n const { filters } = filter;\n if (filters.length > 2) {\n return {\n ...filter,\n filters: filter.filters.slice(0, -1),\n };\n } else {\n // must be 2, we never have 1\n return filter.filters[0];\n }\n};\n\n/**\n Allows an empty FilterClause to be appended to an existing filter - for use\n in filter editing UI only.\n*/\nexport const addClause = (\n existingFilter: Filter,\n clause: Partial<Filter>,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS,\n): FilterWithPartialClause => {\n if (\n isMultiClauseFilter(existingFilter) &&\n existingFilter.op === combineWith\n ) {\n // if (isCompleteFilter(clause)) {\n return {\n ...existingFilter,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n filters: existingFilter.filters.concat(clause),\n };\n // } else {\n // throw Error(\n // \"filter-utils, replaceFilter, only a valid clause can be added to a filter\"\n // );\n // }\n } else {\n return {\n op: combineWith,\n filters: [existingFilter, clause],\n };\n }\n};\n\nexport const addFilter = (\n existingFilter: Filter | undefined,\n filter: Filter,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS,\n): Filter | undefined => {\n if (includesNoValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the no-values filter\n } else {\n existingFilter = removeFilterForColumn(existingFilter, {\n name: filter.column,\n });\n }\n } else if (includesAllValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the all-values filter\n }\n return removeFilterForColumn(existingFilter, { name: filter.column ?? \"\" });\n }\n\n if (!existingFilter) {\n return filter;\n }\n if (!filter) {\n return existingFilter;\n }\n if (existingFilter.op === AND && filter.op === AND) {\n return {\n op: AND,\n filters: combine(existingFilter.filters, filter.filters),\n };\n }\n if (existingFilter.op === AND) {\n const filters = replaceOrInsert(existingFilter.filters, filter);\n return filters.length > 1 ? { op: AND, filters } : filters[0];\n }\n if (filter.op === AND) {\n return { op: AND, filters: filter.filters.concat(existingFilter) };\n }\n\n if (filterEquals(existingFilter, filter, true)) {\n return filter;\n }\n\n if (canMerge(existingFilter, filter)) {\n return merge(existingFilter, filter);\n }\n\n return { op: combineWith, filters: [existingFilter, filter] };\n};\n\nconst includesNoValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (isInFilter(filter) && filter.values.length === 0) {\n return true;\n }\n return isAndFilter(filter) && filter.filters.some((f) => includesNoValues(f));\n};\n\ninterface CommonFilter {\n colName?: string;\n otherColFilters?: Filter[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mode?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n values?: any;\n op?: \"or\" | \"and\";\n column?: string;\n filters?: Filter[];\n}\n\nexport interface OtherFilter extends CommonFilter {\n type: FilterType;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n values?: any[];\n}\n\nconst includesAllValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (filter.op === STARTS_WITH && filter.value === \"\") {\n return true;\n }\n return filter.op === STARTS_WITH && filter.value === \"\";\n};\n\nconst replaceOrInsert = (filters: Filter[], filter: Filter) => {\n return filters.concat(filter);\n};\n\nconst merge = (f1: Filter, f2: Filter): Filter | undefined => {\n if (includesNoValues(f2)) {\n return f2;\n }\n if (isInFilter(f1) && isInFilter(f2)) {\n return {\n ...f1,\n values: [\n ...f1.values,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...(f2.values as any[]).filter(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (v: string | number) => !(f1.values as any[]).includes(v),\n ),\n ],\n };\n } else if (isInFilter(f1) && f2.op === EQUALS) {\n return {\n ...f1,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: f1.values.concat([f2.value]),\n };\n } else if (f1.op === EQUALS && f2.op === EQUALS) {\n return {\n column: f1.column,\n op: IN,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: [f1.value, f2.value],\n };\n }\n return f2;\n};\n\nconst combine = (existingFilters: Filter[], replacementFilters: Filter[]) => {\n const equivalentType = ({ op: op1 }: Filter, { op: op2 }: Filter) => {\n return (\n op1 === op2 ||\n (op1[0] === \">\" && op2[0] === \">\") ||\n (op1[0] === \"<\" && op2[0] === \"<\")\n );\n };\n const replaces = (existingFilter: Filter, replacementFilter: Filter) => {\n return (\n existingFilter.column === replacementFilter.column &&\n equivalentType(existingFilter, replacementFilter)\n );\n };\n const stillApplicable = (existingFilter: Filter) =>\n replacementFilters.some((replacementFilter) =>\n replaces(existingFilter, replacementFilter),\n ) === false;\n return existingFilters.filter(stillApplicable).concat(replacementFilters);\n};\n\nexport const removeFilter = (sourceFilter: Filter, filterToRemove: Filter) => {\n if (filterEquals(sourceFilter, filterToRemove, true)) {\n return null;\n }\n if (sourceFilter.op !== AND) {\n throw Error(\n `removeFilter cannot remove ${JSON.stringify(\n filterToRemove,\n )} from ${JSON.stringify(sourceFilter)}`,\n );\n }\n const filters = sourceFilter.filters.filter(\n (f) => !filterEquals(f, filterToRemove),\n );\n return filters.length > 0 ? { type: AND, filters } : null;\n};\n\nexport const splitFilterOnColumn = (\n columnName: string,\n filter?: Filter,\n): [Filter | undefined, Filter | undefined] => {\n if (!filter) {\n return [undefined, undefined];\n }\n if (filter.column === columnName) {\n return [filter, undefined];\n }\n if (filter.op !== AND) {\n return [undefined, filter];\n }\n const [[columnFilter = undefined], filters] = partition(\n (filter as MultiClauseFilter<\"and\">).filters,\n (f) => f.column === columnName,\n );\n return filters.length === 1\n ? [columnFilter, filters[0]]\n : [columnFilter, { op: AND, filters }];\n};\n\nexport const overrideColName = (filter: Filter, column: string): Filter => {\n if (isMultiClauseFilter(filter)) {\n return {\n op: filter.op,\n filters: filter.filters.map((f) => overrideColName(f, column)),\n };\n }\n return { ...filter, column };\n};\n\nexport const filterIncludesColumn = (\n filter: Filter,\n column: ColumnDescriptor,\n): boolean => {\n if (!filter) {\n return false;\n }\n const { op, column: filterColName } = filter;\n switch (op) {\n case AND:\n case OR:\n return (\n filter.filters != null &&\n filter.filters.some((f) => filterIncludesColumn(f, column))\n );\n default:\n return filterColName === column.name;\n }\n};\n\nconst removeFilterForColumn = (\n sourceFilter: Filter | undefined,\n column: ColumnDescriptor,\n): Filter | undefined => {\n const colName = column.name;\n if (!sourceFilter) {\n return undefined;\n }\n if (sourceFilter.column === colName) {\n return undefined;\n }\n if (isAndFilter(sourceFilter) || isOrFilter(sourceFilter)) {\n const { op } = sourceFilter;\n const filters = sourceFilter.filters;\n const otherColFilters = filters.filter((f) => f.column !== colName);\n switch (otherColFilters.length) {\n case 0:\n return undefined;\n case 1:\n return otherColFilters[0];\n default:\n return { op, filters: otherColFilters };\n }\n }\n return sourceFilter;\n};\n\nconst canMerge = (f1: Filter, f2: Filter) =>\n f1.column === f2.column &&\n (f1.op === \"=\" || f1.op === \"in\") &&\n (f2.op === \"=\" || f2.op === \"in\");\n\nconst sameValues = <T>(arr1: T[], arr2: T[]) => {\n if (arr1 === arr2) {\n return true;\n }\n if (arr1.length === arr2.length) {\n const a = arr1.slice().sort();\n const b = arr2.slice().sort();\n return a.join(\"|\") === b.join(\"|\");\n }\n return false;\n};\n\nexport const filterEquals = (f1?: Filter, f2?: Filter, strict = false) => {\n if (!strict) {\n return true;\n }\n if (f1 && f2 && canMerge(f1, f2)) {\n return (\n f1.op === f2.op &&\n ((isSingleValueFilter(f1) &&\n isSingleValueFilter(f2) &&\n f1.value === f2.value) ||\n (isMultiValueFilter(f1) &&\n isMultiValueFilter(f2) &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sameValues(f1.values as any[], f2.values)))\n );\n }\n return false;\n};\n\nexport const updateFilter = (\n filter: Filter | undefined,\n newFilter: Filter | undefined,\n mode: \"add\" | \"replace\",\n): Filter | undefined => {\n if (filter && newFilter) {\n if (mode === \"replace\") {\n return newFilter;\n }\n if (filter.op === \"and\") {\n return {\n ...filter,\n filters: filter.filters.concat(newFilter),\n };\n }\n const { column: columnName } = newFilter;\n if (columnName) {\n const existingClause = newFilter.column\n ? extractFilterForColumn(filter, columnName)\n : undefined;\n if (existingClause && columnName) {\n // The filter already contains a clause for this column, replace\n // with the new clause\n const result = removeFilterForColumn(filter, { name: columnName });\n return updateFilter(result, newFilter, \"add\");\n }\n }\n return {\n op: \"and\",\n filters: [filter, newFilter],\n };\n }\n if (newFilter) {\n return newFilter;\n }\n return filter;\n};\n\nexport const getTypeaheadFilter = (\n column: string,\n filterValues: string[],\n isStartsWithFilter?: boolean,\n): Filter | undefined => {\n if (filterValues.length === 0) {\n return undefined;\n }\n\n if (isStartsWithFilter) {\n // multiple starts with filters not currently supported\n const startsWith = filterValues[0].substring(0, filterValues[0].length - 3);\n return {\n column,\n op: \"starts\",\n value: `\"${startsWith}\"`,\n };\n }\n\n return {\n column,\n op: \"in\",\n values: filterValues.map((value) => `\"${value}\"`),\n };\n};\n\nexport const getNumericFilter = (\n column: string,\n op?: NumericFilterClauseOp,\n value?: number,\n): FilterClause | undefined => {\n if (op === undefined) return undefined;\n if (value === undefined || isNaN(value)) return undefined;\n return { column, op, value };\n};\n\ntype FilterClauseList = Array<[string, string]>;\n\n/**\n * Restructure a FilterContainerFilter into a list of [column, value] tuples\n * suitable for display in a text based control.\n */\nexport const getFilterClausesForDisplay = (\n filter?: FilterContainerFilter,\n columns: ColumnDescriptor[] = [],\n clauses: FilterClauseList = [],\n): FilterClauseList => {\n if (filter === undefined) {\n return clauses;\n } else if (isSingleValueFilter(filter)) {\n const column = columns.find((c) => c.name === filter.column);\n if (column) {\n const { name, label = name } = column;\n clauses.push([label, filter.value.toString()]);\n } else {\n clauses.push([filter.column, filter.value.toString()]);\n }\n } else if (isBetweenFilter(filter)) {\n const [f1, f2] = filter.filters;\n const column = columns.find((c) => c.name === f1.column);\n if (\n isTimeDataValue(column) &&\n typeof f1.value === \"number\" &&\n typeof f2.value === \"number\"\n ) {\n const { name, label = name } = column;\n clauses.push([\n label,\n `${Time.millisToTimeString(f1.value)} - ${Time.millisToTimeString(f2.value)}`,\n ]);\n } else if (column) {\n const { name, label = name } = column;\n clauses.push([label, `${f1.value} - ${f2.value}`]);\n } else {\n clauses.push([f1.column, `${f1.value} - ${f2.value}`]);\n }\n } else if (isAndFilter(filter)) {\n filter.filters.forEach((f) =>\n getFilterClausesForDisplay(f, columns, clauses),\n );\n }\n return clauses;\n};\n\n/**\n * Given a list of FilterContainerFilterDescriptors and a FilterContainerFilter,\n * find filter descriptor from the list with an equal filter. If\n * none exists, return undefined, otherwise return the matched filter descriptor\n */\nexport const findMatchingFilter = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n filter: FilterContainerFilter,\n) =>\n filterDescriptors.find(\n ({ active, filter: f }) =>\n !active && f !== null && f !== filter && filtersAreEqual(f, filter),\n );\n"],"names":["isMultiClauseFilter","isInFilter","isAndFilter","partition","isOrFilter","isSingleValueFilter","isMultiValueFilter","extractFilterForColumn","isBetweenFilter","isTimeDataValue","Time","filtersAreEqual"],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ var FilterDisplay = require('../filter-display/FilterDisplay.js');
|
|
|
8
8
|
const DeleteFilterPrompt = ({
|
|
9
9
|
children,
|
|
10
10
|
className,
|
|
11
|
+
columns,
|
|
11
12
|
filterDescriptor,
|
|
12
13
|
onClose,
|
|
13
14
|
onConfirm,
|
|
@@ -26,7 +27,7 @@ const DeleteFilterPrompt = ({
|
|
|
26
27
|
title: "Delete Filter",
|
|
27
28
|
children: [
|
|
28
29
|
/* @__PURE__ */ jsxRuntime.jsx("span", { children: `Do you want to delete '${filterDescriptor.filter?.name}' ?` }),
|
|
29
|
-
children ? children : filterDescriptor.filter ? /* @__PURE__ */ jsxRuntime.jsx(FilterDisplay.FilterDisplay, { filter: filterDescriptor.filter }) : null
|
|
30
|
+
children ? children : filterDescriptor.filter ? /* @__PURE__ */ jsxRuntime.jsx(FilterDisplay.FilterDisplay, { columns, filter: filterDescriptor.filter }) : null
|
|
30
31
|
]
|
|
31
32
|
}
|
|
32
33
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeleteFilterPrompt.js","sources":["../../../../packages/vuu-filters/src/saved-filters/DeleteFilterPrompt.tsx"],"sourcesContent":["import { FilterContainerFilterDescriptor } from \"@vuu-ui/vuu-filter-types\";\nimport { Prompt, PromptProps } from \"@vuu-ui/vuu-ui-controls\";\nimport cx from \"clsx\";\nimport { HTMLAttributes } from \"react\";\nimport { FilterDisplay } from \"../filter-display/FilterDisplay\";\n\nexport interface DeleteFilterPromptProps\n extends Pick<PromptProps, \"onConfirm\" | \"onClose\" | \"open\">,\n HTMLAttributes<HTMLDivElement> {\n filterDescriptor: FilterContainerFilterDescriptor;\n}\n\nexport const DeleteFilterPrompt = ({\n children,\n className,\n filterDescriptor,\n onClose,\n onConfirm,\n open = true,\n ...htmlAttributes\n}: DeleteFilterPromptProps) => {\n return (\n <Prompt\n {...htmlAttributes}\n className={cx(\"vuuDeleteFilterPrompt\", className)}\n initialFocusedItem=\"confirm\"\n onClose={onClose}\n onConfirm={onConfirm}\n open={open}\n title=\"Delete Filter\"\n >\n <span>{`Do you want to delete '${filterDescriptor.filter?.name}' ?`}</span>\n {children ? (\n children\n ) : filterDescriptor.filter ? (\n <FilterDisplay filter={filterDescriptor.filter} />\n ) : null}\n </Prompt>\n );\n};\n"],"names":["jsxs","Prompt","jsx","FilterDisplay"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"DeleteFilterPrompt.js","sources":["../../../../packages/vuu-filters/src/saved-filters/DeleteFilterPrompt.tsx"],"sourcesContent":["import { FilterContainerFilterDescriptor } from \"@vuu-ui/vuu-filter-types\";\nimport { Prompt, PromptProps } from \"@vuu-ui/vuu-ui-controls\";\nimport cx from \"clsx\";\nimport { HTMLAttributes } from \"react\";\nimport { FilterDisplay } from \"../filter-display/FilterDisplay\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport interface DeleteFilterPromptProps\n extends Pick<PromptProps, \"onConfirm\" | \"onClose\" | \"open\">,\n HTMLAttributes<HTMLDivElement> {\n columns?: ColumnDescriptor[];\n filterDescriptor: FilterContainerFilterDescriptor;\n}\n\nexport const DeleteFilterPrompt = ({\n children,\n className,\n columns,\n filterDescriptor,\n onClose,\n onConfirm,\n open = true,\n ...htmlAttributes\n}: DeleteFilterPromptProps) => {\n return (\n <Prompt\n {...htmlAttributes}\n className={cx(\"vuuDeleteFilterPrompt\", className)}\n initialFocusedItem=\"confirm\"\n onClose={onClose}\n onConfirm={onConfirm}\n open={open}\n title=\"Delete Filter\"\n >\n <span>{`Do you want to delete '${filterDescriptor.filter?.name}' ?`}</span>\n {children ? (\n children\n ) : filterDescriptor.filter ? (\n <FilterDisplay columns={columns} filter={filterDescriptor.filter} />\n ) : null}\n </Prompt>\n );\n};\n"],"names":["jsxs","Prompt","jsx","FilterDisplay"],"mappings":";;;;;;;AAcO,MAAM,qBAAqB,CAAC;AAAA,EACjC,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAO,GAAA,IAAA;AAAA,EACP,GAAG;AACL,CAA+B,KAAA;AAC7B,EACE,uBAAAA,eAAA;AAAA,IAACC,oBAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,uBAAA,EAAyB,SAAS,CAAA;AAAA,MAChD,kBAAmB,EAAA,SAAA;AAAA,MACnB,OAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAM,EAAA,eAAA;AAAA,MAEN,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,MAAM,EAAA,EAAA,QAAA,EAAA,CAAA,uBAAA,EAA0B,gBAAiB,CAAA,MAAA,EAAQ,IAAI,CAAM,GAAA,CAAA,EAAA,CAAA;AAAA,QACnE,QAAA,GACC,QACE,GAAA,gBAAA,CAAiB,MACnB,mBAAAA,cAAA,CAACC,+BAAc,OAAkB,EAAA,MAAA,EAAQ,gBAAiB,CAAA,MAAA,EAAQ,CAChE,GAAA;AAAA;AAAA;AAAA,GACN;AAEJ;;;;"}
|
|
@@ -37,7 +37,7 @@ const SavedFilterPanel = ({
|
|
|
37
37
|
} = filterPillPermissions;
|
|
38
38
|
return { allowClose, allowEdit, allowRemove, allowRename };
|
|
39
39
|
}, [filterPillPermissions]);
|
|
40
|
-
const { onClickFilter, onFilterMenuAction, savedFilters } = useSavedFilterPanel.useSavedFilterPanel();
|
|
40
|
+
const { onClickFilter, onFilterMenuAction, savedFilters } = useSavedFilterPanel.useSavedFilterPanel({ availableColumns });
|
|
41
41
|
const filtersToDisplay = savedFilters.filter(FilterProvider.filterDescriptorHasFilter);
|
|
42
42
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
43
43
|
"div",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SavedFilterPanel.js","sources":["../../../../packages/vuu-filters/src/saved-filters/SavedFilterPanel.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useMemo } from \"react\";\nimport { FilterPermissions } from \"../filter-pill/FilterMenu\";\nimport { FilterPillNext } from \"../filter-pill/FilterPillNext\";\nimport { filterDescriptorHasFilter } from \"../filter-provider/FilterProvider\";\nimport { useSavedFilterPanel } from \"./useSavedFilterPanel\";\n\nimport savedFilterPanelCss from \"./SavedFilterPanel.css\";\n\nconst classBase = \"vuuSavedFilterPanel\";\n\nconst defaultFilterPillPermissions: FilterPermissions = {\n allowEdit: true,\n allowRename: true,\n allowRemove: true,\n};\n\nexport interface SavedFilterPanelProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * ColumnDescriptors are not required but is passed will be\n * used to provide labels and correct value formatting for\n * displayed filters, e.g in tooltips\n */\n availableColumns?: ColumnDescriptor[];\n filterPillPermissions?: FilterPermissions;\n}\n\nexport const SavedFilterPanel = ({\n availableColumns,\n className,\n filterPillPermissions = defaultFilterPillPermissions,\n ...htmlAttributes\n}: SavedFilterPanelProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-saved-filter-panel\",\n css: savedFilterPanelCss,\n window: targetWindow,\n });\n\n const permissions = useMemo<FilterPermissions>(() => {\n const {\n allowClose = defaultFilterPillPermissions.allowClose,\n allowEdit = defaultFilterPillPermissions.allowEdit,\n allowRemove = defaultFilterPillPermissions.allowRename,\n allowRename = defaultFilterPillPermissions.allowRename,\n } = filterPillPermissions;\n return { allowClose, allowEdit, allowRemove, allowRename };\n }, [filterPillPermissions]);\n\n const { onClickFilter, onFilterMenuAction, savedFilters } =\n useSavedFilterPanel();\n\n const filtersToDisplay = savedFilters.filter(filterDescriptorHasFilter);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, \"vuuScrollable\", className)}\n >\n <div className={`${classBase}-filterPill-container`}>\n {filtersToDisplay.map((filterDescriptor, i) => (\n <FilterPillNext\n {...filterDescriptor}\n columns={availableColumns}\n key={i}\n onClick={onClickFilter}\n onMenuAction={onFilterMenuAction}\n permissions={permissions}\n />\n ))}\n </div>\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","savedFilterPanelCss","useMemo","useSavedFilterPanel","filterDescriptorHasFilter","jsx","createElement","FilterPillNext"],"mappings":";;;;;;;;;;;;AAYA,MAAM,SAAY,GAAA,qBAAA;AAElB,MAAM,4BAAkD,GAAA;AAAA,EACtD,SAAW,EAAA,IAAA;AAAA,EACX,WAAa,EAAA,IAAA;AAAA,EACb,WAAa,EAAA;AACf,CAAA;AAYO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,qBAAwB,GAAA,4BAAA;AAAA,EACxB,GAAG;AACL,CAA6B,KAAA;AAC3B,EAAA,MAAM,eAAeA,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,wBAAA;AAAA,IACR,GAAK,EAAAC,kBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA,WAAA,GAAcC,cAA2B,MAAM;AACnD,IAAM,MAAA;AAAA,MACJ,aAAa,4BAA6B,CAAA,UAAA;AAAA,MAC1C,YAAY,4BAA6B,CAAA,SAAA;AAAA,MACzC,cAAc,4BAA6B,CAAA,WAAA;AAAA,MAC3C,cAAc,4BAA6B,CAAA;AAAA,KACzC,GAAA,qBAAA;AACJ,IAAA,OAAO,EAAE,UAAA,EAAY,SAAW,EAAA,WAAA,EAAa,WAAY,EAAA;AAAA,GAC3D,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,
|
|
1
|
+
{"version":3,"file":"SavedFilterPanel.js","sources":["../../../../packages/vuu-filters/src/saved-filters/SavedFilterPanel.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useMemo } from \"react\";\nimport { FilterPermissions } from \"../filter-pill/FilterMenu\";\nimport { FilterPillNext } from \"../filter-pill/FilterPillNext\";\nimport { filterDescriptorHasFilter } from \"../filter-provider/FilterProvider\";\nimport { useSavedFilterPanel } from \"./useSavedFilterPanel\";\n\nimport savedFilterPanelCss from \"./SavedFilterPanel.css\";\n\nconst classBase = \"vuuSavedFilterPanel\";\n\nconst defaultFilterPillPermissions: FilterPermissions = {\n allowEdit: true,\n allowRename: true,\n allowRemove: true,\n};\n\nexport interface SavedFilterPanelProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * ColumnDescriptors are not required but is passed will be\n * used to provide labels and correct value formatting for\n * displayed filters, e.g in tooltips\n */\n availableColumns?: ColumnDescriptor[];\n filterPillPermissions?: FilterPermissions;\n}\n\nexport const SavedFilterPanel = ({\n availableColumns,\n className,\n filterPillPermissions = defaultFilterPillPermissions,\n ...htmlAttributes\n}: SavedFilterPanelProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-saved-filter-panel\",\n css: savedFilterPanelCss,\n window: targetWindow,\n });\n\n const permissions = useMemo<FilterPermissions>(() => {\n const {\n allowClose = defaultFilterPillPermissions.allowClose,\n allowEdit = defaultFilterPillPermissions.allowEdit,\n allowRemove = defaultFilterPillPermissions.allowRename,\n allowRename = defaultFilterPillPermissions.allowRename,\n } = filterPillPermissions;\n return { allowClose, allowEdit, allowRemove, allowRename };\n }, [filterPillPermissions]);\n\n const { onClickFilter, onFilterMenuAction, savedFilters } =\n useSavedFilterPanel({ availableColumns });\n\n const filtersToDisplay = savedFilters.filter(filterDescriptorHasFilter);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, \"vuuScrollable\", className)}\n >\n <div className={`${classBase}-filterPill-container`}>\n {filtersToDisplay.map((filterDescriptor, i) => (\n <FilterPillNext\n {...filterDescriptor}\n columns={availableColumns}\n key={i}\n onClick={onClickFilter}\n onMenuAction={onFilterMenuAction}\n permissions={permissions}\n />\n ))}\n </div>\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","savedFilterPanelCss","useMemo","useSavedFilterPanel","filterDescriptorHasFilter","jsx","createElement","FilterPillNext"],"mappings":";;;;;;;;;;;;AAYA,MAAM,SAAY,GAAA,qBAAA;AAElB,MAAM,4BAAkD,GAAA;AAAA,EACtD,SAAW,EAAA,IAAA;AAAA,EACX,WAAa,EAAA,IAAA;AAAA,EACb,WAAa,EAAA;AACf,CAAA;AAYO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,qBAAwB,GAAA,4BAAA;AAAA,EACxB,GAAG;AACL,CAA6B,KAAA;AAC3B,EAAA,MAAM,eAAeA,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,wBAAA;AAAA,IACR,GAAK,EAAAC,kBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA,WAAA,GAAcC,cAA2B,MAAM;AACnD,IAAM,MAAA;AAAA,MACJ,aAAa,4BAA6B,CAAA,UAAA;AAAA,MAC1C,YAAY,4BAA6B,CAAA,SAAA;AAAA,MACzC,cAAc,4BAA6B,CAAA,WAAA;AAAA,MAC3C,cAAc,4BAA6B,CAAA;AAAA,KACzC,GAAA,qBAAA;AACJ,IAAA,OAAO,EAAE,UAAA,EAAY,SAAW,EAAA,WAAA,EAAa,WAAY,EAAA;AAAA,GAC3D,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,EAAM,MAAA,EAAE,eAAe,kBAAoB,EAAA,YAAA,KACzCC,uCAAoB,CAAA,EAAE,kBAAkB,CAAA;AAE1C,EAAM,MAAA,gBAAA,GAAmB,YAAa,CAAA,MAAA,CAAOC,wCAAyB,CAAA;AAEtE,EACE,uBAAAC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAW,EAAA,EAAA,CAAG,SAAW,EAAA,eAAA,EAAiB,SAAS,CAAA;AAAA,MAEnD,QAAA,kBAAAA,cAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,yBACzB,QAAiB,EAAA,gBAAA,CAAA,GAAA,CAAI,CAAC,gBAAA,EAAkB,CACvC,qBAAAC,mBAAA;AAAA,QAACC,6BAAA;AAAA,QAAA;AAAA,UACE,GAAG,gBAAA;AAAA,UACJ,OAAS,EAAA,gBAAA;AAAA,UACT,GAAK,EAAA,CAAA;AAAA,UACL,OAAS,EAAA,aAAA;AAAA,UACT,YAAc,EAAA,kBAAA;AAAA,UACd;AAAA;AAAA,OAEH,CACH,EAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
var react = require('react');
|
|
4
4
|
var FilterContext = require('../filter-provider/FilterContext.js');
|
|
5
5
|
|
|
6
|
-
const useSavedFilterPanel = () => {
|
|
6
|
+
const useSavedFilterPanel = (props) => {
|
|
7
7
|
const {
|
|
8
8
|
savedFilters = [],
|
|
9
9
|
setCurrentFilter,
|
|
10
10
|
onFilterMenuAction
|
|
11
|
-
} = FilterContext.useSavedFilters();
|
|
11
|
+
} = FilterContext.useSavedFilters({ availableColumns: props?.availableColumns });
|
|
12
12
|
const handleClickFilter = react.useCallback(
|
|
13
13
|
(e) => {
|
|
14
14
|
const { id } = e.target;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSavedFilterPanel.js","sources":["../../../../packages/vuu-filters/src/saved-filters/useSavedFilterPanel.tsx"],"sourcesContent":["import { SyntheticEvent, useCallback } from \"react\";\nimport { useSavedFilters } from \"../filter-provider/FilterContext\";\n\nexport type FilterClickHandler = (filterId: string) => void;\n\nexport const useSavedFilterPanel = () => {\n const {\n savedFilters = [],\n setCurrentFilter,\n onFilterMenuAction,\n } = useSavedFilters();\n\n const handleClickFilter = useCallback(\n (e: SyntheticEvent) => {\n const { id } = e.target as HTMLElement;\n setCurrentFilter(id);\n },\n [setCurrentFilter],\n );\n\n return {\n onClickFilter: handleClickFilter,\n onFilterMenuAction,\n savedFilters,\n };\n};\n"],"names":["useSavedFilters","useCallback"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"useSavedFilterPanel.js","sources":["../../../../packages/vuu-filters/src/saved-filters/useSavedFilterPanel.tsx"],"sourcesContent":["import { SyntheticEvent, useCallback } from \"react\";\nimport { useSavedFilters } from \"../filter-provider/FilterContext\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport type FilterClickHandler = (filterId: string) => void;\n\ninterface SavedFilterPanelProps {\n availableColumns?: ColumnDescriptor[];\n}\n\nexport const useSavedFilterPanel = (props?: SavedFilterPanelProps) => {\n const {\n savedFilters = [],\n setCurrentFilter,\n onFilterMenuAction,\n } = useSavedFilters({ availableColumns: props?.availableColumns });\n\n const handleClickFilter = useCallback(\n (e: SyntheticEvent) => {\n const { id } = e.target as HTMLElement;\n setCurrentFilter(id);\n },\n [setCurrentFilter],\n );\n\n return {\n onClickFilter: handleClickFilter,\n onFilterMenuAction,\n savedFilters,\n };\n};\n"],"names":["useSavedFilters","useCallback"],"mappings":";;;;;AAUa,MAAA,mBAAA,GAAsB,CAAC,KAAkC,KAAA;AACpE,EAAM,MAAA;AAAA,IACJ,eAAe,EAAC;AAAA,IAChB,gBAAA;AAAA,IACA;AAAA,MACEA,6BAAgB,CAAA,EAAE,gBAAkB,EAAA,KAAA,EAAO,kBAAkB,CAAA;AAEjE,EAAA,MAAM,iBAAoB,GAAAC,iBAAA;AAAA,IACxB,CAAC,CAAsB,KAAA;AACrB,MAAM,MAAA,EAAE,EAAG,EAAA,GAAI,CAAE,CAAA,MAAA;AACjB,MAAA,gBAAA,CAAiB,EAAE,CAAA;AAAA,KACrB;AAAA,IACA,CAAC,gBAAgB;AAAA,GACnB;AAEA,EAAO,OAAA;AAAA,IACL,aAAe,EAAA,iBAAA;AAAA,IACf,kBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -11,7 +11,7 @@ var TabbedFilterContainer$1 = require('./TabbedFilterContainer.css.js');
|
|
|
11
11
|
|
|
12
12
|
const classBase = "vuuTabbedFilterContainer";
|
|
13
13
|
const TabbedFilterContainer = ({
|
|
14
|
-
|
|
14
|
+
SavedFilterPanelProps: SavedFilterPanelProps2,
|
|
15
15
|
children,
|
|
16
16
|
className,
|
|
17
17
|
filter,
|
|
@@ -39,7 +39,7 @@ const TabbedFilterContainer = ({
|
|
|
39
39
|
children
|
|
40
40
|
}
|
|
41
41
|
) }, "ad-hoc-filter"),
|
|
42
|
-
/* @__PURE__ */ jsxRuntime.jsx(lab.TabNextPanel, { value: "saved-filters", children: /* @__PURE__ */ jsxRuntime.jsx(SavedFilterPanel.SavedFilterPanel, {
|
|
42
|
+
/* @__PURE__ */ jsxRuntime.jsx(lab.TabNextPanel, { value: "saved-filters", children: /* @__PURE__ */ jsxRuntime.jsx(SavedFilterPanel.SavedFilterPanel, { ...SavedFilterPanelProps2 }) }, "saved-filters")
|
|
43
43
|
] }) });
|
|
44
44
|
};
|
|
45
45
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabbedFilterContainer.js","sources":["../../../../packages/vuu-filters/src/tabbed-filter-container/TabbedFilterContainer.tsx"],"sourcesContent":["import {\n TabListNext,\n TabNext,\n TabNextPanel,\n TabNextTrigger,\n TabsNext,\n} from \"@salt-ds/lab\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { FilterContainerProps } from \"../filter-container/FilterContainer\";\nimport { FilterPanel } from \"../filter-panel/FilterPanel\";\nimport {\n SavedFilterPanel,\n SavedFilterPanelProps,\n} from \"../saved-filters/SavedFilterPanel\";\nimport tabbedFilterContainerCss from \"./TabbedFilterContainer.css\";\n\nconst classBase = \"vuuTabbedFilterContainer\";\n\nexport interface TabbedFilterContainerProps\n extends HTMLAttributes<HTMLDivElement>,\n Pick<\n FilterContainerProps,\n \"filter\" | \"onFilterApplied\" | \"onFilterCleared\"\n
|
|
1
|
+
{"version":3,"file":"TabbedFilterContainer.js","sources":["../../../../packages/vuu-filters/src/tabbed-filter-container/TabbedFilterContainer.tsx"],"sourcesContent":["import {\n TabListNext,\n TabNext,\n TabNextPanel,\n TabNextTrigger,\n TabsNext,\n} from \"@salt-ds/lab\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { FilterContainerProps } from \"../filter-container/FilterContainer\";\nimport { FilterPanel } from \"../filter-panel/FilterPanel\";\nimport {\n SavedFilterPanel,\n SavedFilterPanelProps,\n} from \"../saved-filters/SavedFilterPanel\";\nimport tabbedFilterContainerCss from \"./TabbedFilterContainer.css\";\n\nconst classBase = \"vuuTabbedFilterContainer\";\n\nexport interface TabbedFilterContainerProps\n extends HTMLAttributes<HTMLDivElement>,\n Pick<\n FilterContainerProps,\n \"filter\" | \"onFilterApplied\" | \"onFilterCleared\"\n > {\n SavedFilterPanelProps?: Pick<\n SavedFilterPanelProps,\n \"availableColumns\" | \"filterPillPermissions\"\n >;\n children: ReactNode;\n}\n\nexport const TabbedFilterContainer = ({\n SavedFilterPanelProps,\n children,\n className,\n filter,\n onFilterApplied,\n onFilterCleared,\n ...htmlAttributes\n}: TabbedFilterContainerProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-tabbed-filter-container\",\n css: tabbedFilterContainerCss,\n window: targetWindow,\n });\n\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n <TabsNext defaultValue=\"ad-hoc-filter\">\n <TabListNext appearance=\"transparent\">\n <TabNext value=\"ad-hoc-filter\" key=\"ad-hoc-filter\">\n <TabNextTrigger>AD HOC</TabNextTrigger>\n </TabNext>\n <TabNext value=\"saved-filters\" key=\"saved-filters\">\n <TabNextTrigger>SAVED</TabNextTrigger>\n </TabNext>\n </TabListNext>\n <TabNextPanel value=\"ad-hoc-filter\" key=\"ad-hoc-filter\">\n <FilterPanel\n filter={filter}\n onFilterApplied={onFilterApplied}\n onFilterCleared={onFilterCleared}\n >\n {children}\n </FilterPanel>\n </TabNextPanel>\n <TabNextPanel value=\"saved-filters\" key=\"saved-filters\">\n <SavedFilterPanel {...SavedFilterPanelProps} />\n </TabNextPanel>\n </TabsNext>\n </div>\n );\n};\n"],"names":["SavedFilterPanelProps","useWindow","useComponentCssInjection","tabbedFilterContainerCss","jsx","jsxs","TabsNext","TabListNext","TabNext","TabNextTrigger","TabNextPanel","FilterPanel","SavedFilterPanel"],"mappings":";;;;;;;;;;;AAmBA,MAAM,SAAY,GAAA,0BAAA;AAeX,MAAM,wBAAwB,CAAC;AAAA,EACpC,qBAAAA,EAAAA,sBAAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,GAAG;AACL,CAAkC,KAAA;AAChC,EAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,6BAAA;AAAA,IACR,GAAK,EAAAC,uBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,uBACGC,cAAA,CAAA,KAAA,EAAA,EAAK,GAAG,cAAA,EAAgB,SAAW,EAAA,EAAA,CAAG,SAAW,EAAA,SAAS,CACzD,EAAA,QAAA,kBAAAC,eAAA,CAACC,YAAS,EAAA,EAAA,YAAA,EAAa,eACrB,EAAA,QAAA,EAAA;AAAA,oBAACD,eAAA,CAAAE,eAAA,EAAA,EAAY,YAAW,aACtB,EAAA,QAAA,EAAA;AAAA,sBAAAH,cAAA,CAACI,eAAQ,KAAM,EAAA,eAAA,EACb,yCAACC,kBAAe,EAAA,EAAA,QAAA,EAAA,QAAA,EAAM,KADW,eAEnC,CAAA;AAAA,sBACAL,cAAA,CAACI,eAAQ,KAAM,EAAA,eAAA,EACb,yCAACC,kBAAe,EAAA,EAAA,QAAA,EAAA,OAAA,EAAK,KADY,eAEnC;AAAA,KACF,EAAA,CAAA;AAAA,oBACAL,cAAA,CAACM,gBAAa,EAAA,EAAA,KAAA,EAAM,eAClB,EAAA,QAAA,kBAAAN,cAAA;AAAA,MAACO,uBAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,eAAA;AAAA,QACA,eAAA;AAAA,QAEC;AAAA;AAAA,SANmC,eAQxC,CAAA;AAAA,oBACAP,cAAA,CAACM,oBAAa,KAAM,EAAA,eAAA,EAClB,yCAACE,iCAAkB,EAAA,EAAA,GAAGZ,sBAAuB,EAAA,CAAA,EAAA,EADP,eAExC;AAAA,GAAA,EACF,CACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterMenu.js","sources":["../../../../packages/vuu-filters/src/filter-pill/FilterMenu.tsx"],"sourcesContent":["import { Menu, MenuItem, MenuPanel, MenuProps } from \"@salt-ds/core\";\nimport { ReactElement, useMemo } from \"react\";\n\nexport type FilterPermissions = {\n /** Closing a filter removes it from current display, without deleting*/\n allowClose?: boolean;\n /** Edit the details of the filter itself */\n allowEdit?: boolean;\n /** Rename the filter */\n allowRename?: boolean;\n /** Removing a filter deletes it entirely */\n allowRemove?: boolean;\n};\n\nconst defaultPermissions: FilterPermissions = {\n allowClose: true,\n allowEdit: true,\n allowRename: true,\n allowRemove: true,\n};\n\nexport interface FilterMenuProps\n extends Pick<MenuProps, \"getVirtualElement\" | \"onOpenChange\" | \"open\"> {\n filterId: string;\n onMenuAction: FilterMenuActionHandler;\n permissions?: FilterPermissions;\n}\n\nexport type FilterAction = \"close\" | \"remove\" | \"edit\" | \"rename\";\n\nexport type FilterMenuActionHandler = <T extends FilterAction = FilterAction>(\n filterId: string,\n filterAction: T,\n) => void;\n\nexport const FilterMenu = ({\n filterId,\n getVirtualElement,\n onMenuAction,\n onOpenChange,\n open,\n permissions = defaultPermissions,\n}: FilterMenuProps) => {\n const {\n allowClose = defaultPermissions.allowClose,\n allowEdit = defaultPermissions.allowEdit,\n allowRename = defaultPermissions.allowRename,\n allowRemove = defaultPermissions.allowRemove,\n } = permissions;\n\n const menuItems = useMemo<ReactElement[]>(() => {\n const items: ReactElement[] = [];\n if (allowClose) {\n items.push(\n <MenuItem key=\"close\" onClick={() => onMenuAction(filterId, \"close\")}>\n Close\n </MenuItem>,\n );\n }\n if (allowEdit) {\n items.push(\n <MenuItem key=\"edit\" onClick={() => onMenuAction(filterId, \"edit\")}>\n Edit Filter\n </MenuItem>,\n );\n }\n if (allowRename) {\n items.push(\n <MenuItem key=\"rename\" onClick={() => onMenuAction(filterId, \"rename\")}>\n Rename\n </MenuItem>,\n );\n }\n if (allowRemove) {\n items.push(\n <MenuItem key=\"delete\" onClick={() => onMenuAction(filterId, \"remove\")}>\n Delete\n </MenuItem>,\n );\n }\n\n return items;\n }, [allowClose, allowEdit, allowRemove, allowRename, filterId, onMenuAction]);\n return (\n <Menu\n getVirtualElement={getVirtualElement}\n open={open}\n onOpenChange={onOpenChange}\n >\n <MenuPanel>{menuItems}</MenuPanel>\n </Menu>\n );\n};\n"],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"FilterMenu.js","sources":["../../../../packages/vuu-filters/src/filter-pill/FilterMenu.tsx"],"sourcesContent":["import { Menu, MenuItem, MenuPanel, MenuProps } from \"@salt-ds/core\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { ReactElement, useMemo } from \"react\";\n\nexport type FilterPermissions = {\n /** Closing a filter removes it from current display, without deleting*/\n allowClose?: boolean;\n /** Edit the details of the filter itself */\n allowEdit?: boolean;\n /** Rename the filter */\n allowRename?: boolean;\n /** Removing a filter deletes it entirely */\n allowRemove?: boolean;\n};\n\nconst defaultPermissions: FilterPermissions = {\n allowClose: true,\n allowEdit: true,\n allowRename: true,\n allowRemove: true,\n};\n\nexport interface FilterMenuProps\n extends Pick<MenuProps, \"getVirtualElement\" | \"onOpenChange\" | \"open\"> {\n filterId: string;\n onMenuAction: FilterMenuActionHandler;\n permissions?: FilterPermissions;\n}\n\nexport type FilterAction = \"close\" | \"remove\" | \"edit\" | \"rename\";\n\nexport type FilterMenuActionHandler = <T extends FilterAction = FilterAction>(\n filterId: string,\n filterAction: T,\n /**\n * SOme menu action handlers may use columns to enrich filter display\n */\n columns?: ColumnDescriptor[],\n) => void;\n\nexport const FilterMenu = ({\n filterId,\n getVirtualElement,\n onMenuAction,\n onOpenChange,\n open,\n permissions = defaultPermissions,\n}: FilterMenuProps) => {\n const {\n allowClose = defaultPermissions.allowClose,\n allowEdit = defaultPermissions.allowEdit,\n allowRename = defaultPermissions.allowRename,\n allowRemove = defaultPermissions.allowRemove,\n } = permissions;\n\n const menuItems = useMemo<ReactElement[]>(() => {\n const items: ReactElement[] = [];\n if (allowClose) {\n items.push(\n <MenuItem key=\"close\" onClick={() => onMenuAction(filterId, \"close\")}>\n Close\n </MenuItem>,\n );\n }\n if (allowEdit) {\n items.push(\n <MenuItem key=\"edit\" onClick={() => onMenuAction(filterId, \"edit\")}>\n Edit Filter\n </MenuItem>,\n );\n }\n if (allowRename) {\n items.push(\n <MenuItem key=\"rename\" onClick={() => onMenuAction(filterId, \"rename\")}>\n Rename\n </MenuItem>,\n );\n }\n if (allowRemove) {\n items.push(\n <MenuItem key=\"delete\" onClick={() => onMenuAction(filterId, \"remove\")}>\n Delete\n </MenuItem>,\n );\n }\n\n return items;\n }, [allowClose, allowEdit, allowRemove, allowRename, filterId, onMenuAction]);\n return (\n <Menu\n getVirtualElement={getVirtualElement}\n open={open}\n onOpenChange={onOpenChange}\n >\n <MenuPanel>{menuItems}</MenuPanel>\n </Menu>\n );\n};\n"],"names":[],"mappings":";;;;AAeA,MAAM,kBAAwC,GAAA;AAAA,EAC5C,UAAY,EAAA,IAAA;AAAA,EACZ,SAAW,EAAA,IAAA;AAAA,EACX,WAAa,EAAA,IAAA;AAAA,EACb,WAAa,EAAA;AACf,CAAA;AAoBO,MAAM,aAAa,CAAC;AAAA,EACzB,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAc,GAAA;AAChB,CAAuB,KAAA;AACrB,EAAM,MAAA;AAAA,IACJ,aAAa,kBAAmB,CAAA,UAAA;AAAA,IAChC,YAAY,kBAAmB,CAAA,SAAA;AAAA,IAC/B,cAAc,kBAAmB,CAAA,WAAA;AAAA,IACjC,cAAc,kBAAmB,CAAA;AAAA,GAC/B,GAAA,WAAA;AAEJ,EAAM,MAAA,SAAA,GAAY,QAAwB,MAAM;AAC9C,IAAA,MAAM,QAAwB,EAAC;AAC/B,IAAA,IAAI,UAAY,EAAA;AACd,MAAM,KAAA,CAAA,IAAA;AAAA,wBACJ,GAAA,CAAC,YAAqB,OAAS,EAAA,MAAM,aAAa,QAAU,EAAA,OAAO,CAAG,EAAA,QAAA,EAAA,OAAA,EAAA,EAAxD,OAEd;AAAA,OACF;AAAA;AAEF,IAAA,IAAI,SAAW,EAAA;AACb,MAAM,KAAA,CAAA,IAAA;AAAA,wBACJ,GAAA,CAAC,YAAoB,OAAS,EAAA,MAAM,aAAa,QAAU,EAAA,MAAM,CAAG,EAAA,QAAA,EAAA,aAAA,EAAA,EAAtD,MAEd;AAAA,OACF;AAAA;AAEF,IAAA,IAAI,WAAa,EAAA;AACf,MAAM,KAAA,CAAA,IAAA;AAAA,wBACJ,GAAA,CAAC,YAAsB,OAAS,EAAA,MAAM,aAAa,QAAU,EAAA,QAAQ,CAAG,EAAA,QAAA,EAAA,QAAA,EAAA,EAA1D,QAEd;AAAA,OACF;AAAA;AAEF,IAAA,IAAI,WAAa,EAAA;AACf,MAAM,KAAA,CAAA,IAAA;AAAA,wBACJ,GAAA,CAAC,YAAsB,OAAS,EAAA,MAAM,aAAa,QAAU,EAAA,QAAQ,CAAG,EAAA,QAAA,EAAA,QAAA,EAAA,EAA1D,QAEd;AAAA,OACF;AAAA;AAGF,IAAO,OAAA,KAAA;AAAA,GACT,EAAG,CAAC,UAAY,EAAA,SAAA,EAAW,aAAa,WAAa,EAAA,QAAA,EAAU,YAAY,CAAC,CAAA;AAC5E,EACE,uBAAA,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,iBAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA;AAAA,MAEA,QAAA,kBAAA,GAAA,CAAC,aAAW,QAAU,EAAA,SAAA,EAAA;AAAA;AAAA,GACxB;AAEJ;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createContext, useContext } from 'react';
|
|
1
|
+
import { createContext, useContext, useCallback } from 'react';
|
|
2
2
|
|
|
3
3
|
const EMPTY_FILTER = "empty-filter";
|
|
4
4
|
const NULL_FILTER = "null-filter";
|
|
@@ -34,7 +34,7 @@ function useCurrentFilter() {
|
|
|
34
34
|
const { currentFilter, onApplyFilter, setCurrentFilter } = useContext(FilterContext);
|
|
35
35
|
return { currentFilter, onApplyFilter, setCurrentFilter };
|
|
36
36
|
}
|
|
37
|
-
function useSavedFilters() {
|
|
37
|
+
function useSavedFilters(props) {
|
|
38
38
|
const {
|
|
39
39
|
currentFilter,
|
|
40
40
|
onApplyFilter,
|
|
@@ -43,10 +43,16 @@ function useSavedFilters() {
|
|
|
43
43
|
saveFilter,
|
|
44
44
|
setCurrentFilter
|
|
45
45
|
} = useContext(FilterContext);
|
|
46
|
+
const handleFilterMenuAction = useCallback(
|
|
47
|
+
(filterId, filterAction) => {
|
|
48
|
+
onFilterMenuAction?.(filterId, filterAction, props?.availableColumns);
|
|
49
|
+
},
|
|
50
|
+
[onFilterMenuAction, props?.availableColumns]
|
|
51
|
+
);
|
|
46
52
|
return {
|
|
47
53
|
currentFilter,
|
|
48
54
|
onApplyFilter,
|
|
49
|
-
onFilterMenuAction,
|
|
55
|
+
onFilterMenuAction: handleFilterMenuAction,
|
|
50
56
|
savedFilters,
|
|
51
57
|
saveFilter,
|
|
52
58
|
setCurrentFilter
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterContext.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterContext.ts"],"sourcesContent":["import {\n FilterChangeHandler,\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { FilterMenuActionHandler } from \"../filter-pill/FilterMenu\";\nimport { createContext, useContext } from \"react\";\n\nexport interface FilterContextProps {\n currentFilter: FilterContainerFilterDescriptor;\n deleteFilter: (filterId: string) => void;\n saveFilter: (name: string) => void;\n savedFilters?: FilterContainerFilterDescriptor[];\n // TODO do we need this ?\n onApplyFilter: FilterChangeHandler;\n onFilterMenuAction?: FilterMenuActionHandler;\n setCurrentFilter: (filter: string | FilterContainerFilter) => void;\n}\n\nexport const EMPTY_FILTER = \"empty-filter\";\nexport const NULL_FILTER = \"null-filter\";\n\nexport const isEmptyFilter = (f?: FilterContainerFilterDescriptor) =>\n f?.id === EMPTY_FILTER;\nexport const isNullFilter = (f?: FilterContainerFilterDescriptor) =>\n f?.id === NULL_FILTER;\n\nexport const NullFilterDescriptor: FilterContainerFilterDescriptor = {\n active: true,\n id: NULL_FILTER,\n filter: null,\n};\n\nexport const EmptyFilterDescriptor: FilterContainerFilterDescriptor = {\n active: true,\n id: EMPTY_FILTER,\n filter: null,\n};\n\nexport const FilterContext = createContext<FilterContextProps>({\n currentFilter: NullFilterDescriptor,\n savedFilters: [],\n onApplyFilter: () =>\n console.warn(\n \"[FilterContext] onApplyFilter, no FilterProvider has been configured\",\n ),\n deleteFilter: () =>\n console.warn(\n \"[FilterContext] deleteFilter, no FilterProvider has been configured\",\n ),\n\n saveFilter: () =>\n console.warn(\n \"[FilterContext] saveFilter, no FilterProvider has been configured\",\n ),\n setCurrentFilter: () =>\n console.warn(\n \"[FilterContext] setCurrentFilter, no FilterProvider has been configured\",\n ),\n});\n\nexport function useCurrentFilter() {\n const { currentFilter, onApplyFilter, setCurrentFilter } =\n useContext(FilterContext);\n return { currentFilter, onApplyFilter, setCurrentFilter };\n}\n\nexport function useSavedFilters() {\n const {\n currentFilter,\n onApplyFilter,\n onFilterMenuAction,\n savedFilters,\n saveFilter,\n setCurrentFilter,\n } = useContext(FilterContext);\n return {\n currentFilter,\n onApplyFilter,\n onFilterMenuAction,\n savedFilters,\n saveFilter,\n setCurrentFilter,\n };\n}\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"FilterContext.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterContext.ts"],"sourcesContent":["import {\n FilterChangeHandler,\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { FilterMenuActionHandler } from \"../filter-pill/FilterMenu\";\nimport { createContext, useCallback, useContext } from \"react\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport interface FilterContextProps {\n currentFilter: FilterContainerFilterDescriptor;\n deleteFilter: (filterId: string) => void;\n saveFilter: (name: string) => void;\n savedFilters?: FilterContainerFilterDescriptor[];\n // TODO do we need this ?\n onApplyFilter: FilterChangeHandler;\n onFilterMenuAction?: FilterMenuActionHandler;\n setCurrentFilter: (filter: string | FilterContainerFilter) => void;\n}\n\nexport const EMPTY_FILTER = \"empty-filter\";\nexport const NULL_FILTER = \"null-filter\";\n\nexport const isEmptyFilter = (f?: FilterContainerFilterDescriptor) =>\n f?.id === EMPTY_FILTER;\nexport const isNullFilter = (f?: FilterContainerFilterDescriptor) =>\n f?.id === NULL_FILTER;\n\nexport const NullFilterDescriptor: FilterContainerFilterDescriptor = {\n active: true,\n id: NULL_FILTER,\n filter: null,\n};\n\nexport const EmptyFilterDescriptor: FilterContainerFilterDescriptor = {\n active: true,\n id: EMPTY_FILTER,\n filter: null,\n};\n\nexport const FilterContext = createContext<FilterContextProps>({\n currentFilter: NullFilterDescriptor,\n savedFilters: [],\n onApplyFilter: () =>\n console.warn(\n \"[FilterContext] onApplyFilter, no FilterProvider has been configured\",\n ),\n deleteFilter: () =>\n console.warn(\n \"[FilterContext] deleteFilter, no FilterProvider has been configured\",\n ),\n\n saveFilter: () =>\n console.warn(\n \"[FilterContext] saveFilter, no FilterProvider has been configured\",\n ),\n setCurrentFilter: () =>\n console.warn(\n \"[FilterContext] setCurrentFilter, no FilterProvider has been configured\",\n ),\n});\n\nexport function useCurrentFilter() {\n const { currentFilter, onApplyFilter, setCurrentFilter } =\n useContext(FilterContext);\n return { currentFilter, onApplyFilter, setCurrentFilter };\n}\n\ninterface SavedFilterHookProps {\n availableColumns?: ColumnDescriptor[];\n}\n\nexport function useSavedFilters(props?: SavedFilterHookProps) {\n const {\n currentFilter,\n onApplyFilter,\n onFilterMenuAction,\n savedFilters,\n saveFilter,\n setCurrentFilter,\n } = useContext(FilterContext);\n\n const handleFilterMenuAction = useCallback<FilterMenuActionHandler>(\n (filterId, filterAction) => {\n onFilterMenuAction?.(filterId, filterAction, props?.availableColumns);\n },\n [onFilterMenuAction, props?.availableColumns],\n );\n\n return {\n currentFilter,\n onApplyFilter,\n onFilterMenuAction: handleFilterMenuAction,\n savedFilters,\n saveFilter,\n setCurrentFilter,\n };\n}\n"],"names":[],"mappings":";;AAoBO,MAAM,YAAe,GAAA;AACrB,MAAM,WAAc,GAAA;AAEpB,MAAM,aAAgB,GAAA,CAAC,CAC5B,KAAA,CAAA,EAAG,EAAO,KAAA;AACL,MAAM,YAAe,GAAA,CAAC,CAC3B,KAAA,CAAA,EAAG,EAAO,KAAA;AAEL,MAAM,oBAAwD,GAAA;AAAA,EACnE,MAAQ,EAAA,IAAA;AAAA,EACR,EAAI,EAAA,WAAA;AAAA,EACJ,MAAQ,EAAA;AACV;AAEO,MAAM,qBAAyD,GAAA;AAAA,EACpE,MAAQ,EAAA,IAAA;AAAA,EACR,EAAI,EAAA,YAAA;AAAA,EACJ,MAAQ,EAAA;AACV;AAEO,MAAM,gBAAgB,aAAkC,CAAA;AAAA,EAC7D,aAAe,EAAA,oBAAA;AAAA,EACf,cAAc,EAAC;AAAA,EACf,aAAA,EAAe,MACb,OAAQ,CAAA,IAAA;AAAA,IACN;AAAA,GACF;AAAA,EACF,YAAA,EAAc,MACZ,OAAQ,CAAA,IAAA;AAAA,IACN;AAAA,GACF;AAAA,EAEF,UAAA,EAAY,MACV,OAAQ,CAAA,IAAA;AAAA,IACN;AAAA,GACF;AAAA,EACF,gBAAA,EAAkB,MAChB,OAAQ,CAAA,IAAA;AAAA,IACN;AAAA;AAEN,CAAC;AAEM,SAAS,gBAAmB,GAAA;AACjC,EAAA,MAAM,EAAE,aAAe,EAAA,aAAA,EAAe,gBAAiB,EAAA,GACrD,WAAW,aAAa,CAAA;AAC1B,EAAO,OAAA,EAAE,aAAe,EAAA,aAAA,EAAe,gBAAiB,EAAA;AAC1D;AAMO,SAAS,gBAAgB,KAA8B,EAAA;AAC5D,EAAM,MAAA;AAAA,IACJ,aAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAI,WAAW,aAAa,CAAA;AAE5B,EAAA,MAAM,sBAAyB,GAAA,WAAA;AAAA,IAC7B,CAAC,UAAU,YAAiB,KAAA;AAC1B,MAAqB,kBAAA,GAAA,QAAA,EAAU,YAAc,EAAA,KAAA,EAAO,gBAAgB,CAAA;AAAA,KACtE;AAAA,IACA,CAAC,kBAAoB,EAAA,KAAA,EAAO,gBAAgB;AAAA,GAC9C;AAEA,EAAO,OAAA;AAAA,IACL,aAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAoB,EAAA,sBAAA;AAAA,IACpB,YAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -71,11 +71,12 @@ const FilterProvider = ({
|
|
|
71
71
|
[applyNewName]
|
|
72
72
|
);
|
|
73
73
|
const promptForConfirmationOfDelete = useCallback(
|
|
74
|
-
(filterDescriptor) => {
|
|
74
|
+
(filterDescriptor, columns) => {
|
|
75
75
|
setDialog(
|
|
76
76
|
/* @__PURE__ */ jsx(
|
|
77
77
|
DeleteFilterPrompt,
|
|
78
78
|
{
|
|
79
|
+
columns,
|
|
79
80
|
filterDescriptor,
|
|
80
81
|
onConfirm: () => {
|
|
81
82
|
setDialog(null);
|
|
@@ -89,7 +90,7 @@ const FilterProvider = ({
|
|
|
89
90
|
[deleteFilter]
|
|
90
91
|
);
|
|
91
92
|
const handleFilterMenuAction = useCallback(
|
|
92
|
-
(filterId, actionType) => {
|
|
93
|
+
(filterId, actionType, columns) => {
|
|
93
94
|
const targetFilter = findFilter(filterDescriptors, filterId);
|
|
94
95
|
switch (actionType) {
|
|
95
96
|
case "close":
|
|
@@ -102,7 +103,7 @@ const FilterProvider = ({
|
|
|
102
103
|
if (filterId === UNSAVED_FILTER) {
|
|
103
104
|
console.log("remove unsaved filter");
|
|
104
105
|
} else {
|
|
105
|
-
promptForConfirmationOfDelete(targetFilter);
|
|
106
|
+
promptForConfirmationOfDelete(targetFilter, columns);
|
|
106
107
|
}
|
|
107
108
|
break;
|
|
108
109
|
case "rename":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterProvider.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterProvider.tsx"],"sourcesContent":["import {\n FilterChangeHandler,\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n FilterContainerFilterDescriptorWithFilter,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ReactElement, ReactNode, useCallback, useState } from \"react\";\nimport { FilterMenuActionHandler } from \"../filter-pill/FilterMenu\";\nimport { FilterNamePrompt } from \"../saved-filters/FilterNamePrompt\";\nimport { DeleteFilterPrompt } from \"../saved-filters/DeleteFilterPrompt\";\nimport {\n activateFilter,\n findFilter,\n insertOrReplaceFilter,\n renameFilter,\n} from \"./filter-descriptor-utils\";\nimport { uuid } from \"@vuu-ui/vuu-utils\";\nimport {\n EMPTY_FILTER,\n EmptyFilterDescriptor,\n FilterContext,\n FilterContextProps,\n isEmptyFilter,\n isNullFilter,\n NULL_FILTER,\n NullFilterDescriptor,\n} from \"./FilterContext\";\n\nexport const UNSAVED_FILTER = \"unsaved-filter\";\n\nexport const filterDescriptorHasFilter = (\n f: FilterContainerFilterDescriptor,\n): f is FilterContainerFilterDescriptorWithFilter =>\n !isEmptyFilter(f) && !isNullFilter(f);\n\nconst findActiveFilter = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n) => filterDescriptors.find((f) => f.active) ?? NullFilterDescriptor;\n\nconst findFilterByName = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n name: string,\n) => filterDescriptors.find((f) => f.filter?.name === name);\n\nexport const FilterProvider = ({\n children,\n onFiltersSaved,\n savedFilters = [],\n}: Partial<Pick<FilterContextProps, \"currentFilter\" | \"savedFilters\">> & {\n children: ReactNode;\n onFiltersSaved?: (\n filterDescriptors: FilterContainerFilterDescriptor[],\n ) => void;\n}) => {\n const [filterDescriptors, setFilterDescriptors] = useState(savedFilters);\n const [dialog, setDialog] = useState<ReactElement | null>(null);\n\n const handleApplyFilter = useCallback<FilterChangeHandler>(() => {\n console.log(\"filter changed\");\n }, []);\n\n const deleteFilter = useCallback(\n (filterId: string) => {\n setFilterDescriptors((filterDescriptors) => {\n const newFilterDescriptors = filterDescriptors.filter(\n ({ id }) => id !== filterId,\n );\n if (filterId !== UNSAVED_FILTER) {\n onFiltersSaved?.(newFilterDescriptors);\n }\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const applyNewName = useCallback(\n (filterId: string, name: string) => {\n setFilterDescriptors((currentFilterDescriptors) => {\n const newFilterDescriptors = renameFilter(\n currentFilterDescriptors,\n filterId,\n name,\n );\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const PromptForFilterName = useCallback(\n ({ filter, id }: FilterContainerFilterDescriptor) => {\n const originalFilterName = filter?.name ?? \"\";\n setDialog(\n <FilterNamePrompt\n filterName={filter?.name}\n title=\"Rename filter\"\n onClose={() => setDialog(null)}\n onConfirm={(name) => {\n setDialog(null);\n if (originalFilterName !== name) {\n applyNewName(id, name);\n }\n }}\n />,\n );\n },\n [applyNewName],\n );\n\n const promptForConfirmationOfDelete = useCallback(\n (filterDescriptor: FilterContainerFilterDescriptor) => {\n setDialog(\n <DeleteFilterPrompt\n filterDescriptor={filterDescriptor}\n onConfirm={() => {\n setDialog(null);\n deleteFilter(filterDescriptor.id);\n }}\n onClose={() => setDialog(null)}\n />,\n );\n },\n [deleteFilter],\n );\n\n const handleFilterMenuAction = useCallback<FilterMenuActionHandler>(\n (filterId, actionType) => {\n const targetFilter = findFilter(filterDescriptors, filterId);\n switch (actionType) {\n case \"close\":\n console.log(`close filter ${filterId}`);\n break;\n case \"edit\":\n console.log(`edit filter ${filterId}`);\n break;\n case \"remove\":\n if (filterId === UNSAVED_FILTER) {\n console.log(\"remove unsaved filter\");\n } else {\n promptForConfirmationOfDelete(targetFilter);\n }\n break;\n case \"rename\":\n return PromptForFilterName(targetFilter);\n }\n },\n [filterDescriptors, promptForConfirmationOfDelete, PromptForFilterName],\n );\n\n const handleSaveFilter = useCallback(\n (name: string) => {\n setFilterDescriptors((filterDescriptors) => {\n const activeFilter = findActiveFilter(filterDescriptors);\n if (activeFilter.filter === null) {\n throw Error(\"[FilterProvider] cannot save an empty filter\");\n }\n const filterWithSameName = findFilterByName(filterDescriptors, name);\n // We are always renaming the active filter, how this will play out depends on whether\n // the name is unique and has actually changed\n if (activeFilter === filterWithSameName) {\n // name has not changed\n return filterDescriptors;\n } else if (filterWithSameName !== undefined) {\n // we are renaming the active filter, but another filter already has the same name,\n // keep the active filter, remove the duplicate.\n return filterDescriptors.reduce<FilterContainerFilterDescriptor[]>(\n (list, filterDescriptor) => {\n if (filterDescriptor === activeFilter) {\n list.push({\n active: true,\n filter: { ...filterDescriptor.filter, name },\n id: uuid(),\n name,\n } as FilterContainerFilterDescriptor);\n } else if (filterDescriptor.filter?.name !== name) {\n list.push(filterDescriptor);\n }\n return list;\n },\n [],\n );\n } else {\n const newFilterDescriptors = filterDescriptors.map(\n (filterDescriptor) =>\n filterDescriptor === activeFilter\n ? ({\n active: true,\n filter: { ...filterDescriptor.filter, name },\n id: uuid(),\n name,\n } as FilterContainerFilterDescriptor)\n : filterDescriptor,\n );\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n }\n });\n },\n [onFiltersSaved],\n );\n\n /**\n * Allows switching between saved filters. Alternatively, an anonymous\n * filter can be assigned. This is to allow for a dynamically created\n * filter to be active.\n */\n const setCurrentFilter = useCallback(\n (filter: string | FilterContainerFilter) => {\n if (filter === NULL_FILTER) {\n setFilterDescriptors((currentFilterDescriptors) =>\n insertOrReplaceFilter(currentFilterDescriptors, NullFilterDescriptor),\n );\n } else if (filter === EMPTY_FILTER) {\n setFilterDescriptors((currentFilterDescriptors) =>\n insertOrReplaceFilter(\n currentFilterDescriptors,\n EmptyFilterDescriptor,\n ),\n );\n } else if (typeof filter === \"string\") {\n setFilterDescriptors((currentFilterDescriptors) =>\n activateFilter(currentFilterDescriptors, filter),\n );\n } else if (filter) {\n setFilterDescriptors((currentFilterDescriptors) =>\n insertOrReplaceFilter(currentFilterDescriptors, {\n active: true,\n filter,\n id: UNSAVED_FILTER,\n }),\n );\n } else {\n deleteFilter(UNSAVED_FILTER);\n }\n },\n [deleteFilter],\n );\n\n return (\n <FilterContext.Provider\n value={{\n currentFilter: findActiveFilter(filterDescriptors),\n onApplyFilter: handleApplyFilter,\n onFilterMenuAction: handleFilterMenuAction,\n deleteFilter,\n saveFilter: handleSaveFilter,\n savedFilters: filterDescriptors.filter(filterDescriptorHasFilter),\n setCurrentFilter,\n }}\n >\n {children}\n {dialog}\n </FilterContext.Provider>\n );\n};\n"],"names":["filterDescriptors"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FilterProvider.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterProvider.tsx"],"sourcesContent":["import {\n FilterChangeHandler,\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n FilterContainerFilterDescriptorWithFilter,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ReactElement, ReactNode, useCallback, useState } from \"react\";\nimport { FilterMenuActionHandler } from \"../filter-pill/FilterMenu\";\nimport { FilterNamePrompt } from \"../saved-filters/FilterNamePrompt\";\nimport { DeleteFilterPrompt } from \"../saved-filters/DeleteFilterPrompt\";\nimport {\n activateFilter,\n findFilter,\n insertOrReplaceFilter,\n renameFilter,\n} from \"./filter-descriptor-utils\";\nimport { uuid } from \"@vuu-ui/vuu-utils\";\nimport {\n EMPTY_FILTER,\n EmptyFilterDescriptor,\n FilterContext,\n FilterContextProps,\n isEmptyFilter,\n isNullFilter,\n NULL_FILTER,\n NullFilterDescriptor,\n} from \"./FilterContext\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport const UNSAVED_FILTER = \"unsaved-filter\";\n\nexport const filterDescriptorHasFilter = (\n f: FilterContainerFilterDescriptor,\n): f is FilterContainerFilterDescriptorWithFilter =>\n !isEmptyFilter(f) && !isNullFilter(f);\n\nconst findActiveFilter = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n) => filterDescriptors.find((f) => f.active) ?? NullFilterDescriptor;\n\nconst findFilterByName = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n name: string,\n) => filterDescriptors.find((f) => f.filter?.name === name);\n\nexport const FilterProvider = ({\n children,\n onFiltersSaved,\n savedFilters = [],\n}: Partial<Pick<FilterContextProps, \"currentFilter\" | \"savedFilters\">> & {\n children: ReactNode;\n onFiltersSaved?: (\n filterDescriptors: FilterContainerFilterDescriptor[],\n ) => void;\n}) => {\n const [filterDescriptors, setFilterDescriptors] = useState(savedFilters);\n const [dialog, setDialog] = useState<ReactElement | null>(null);\n\n const handleApplyFilter = useCallback<FilterChangeHandler>(() => {\n console.log(\"filter changed\");\n }, []);\n\n const deleteFilter = useCallback(\n (filterId: string) => {\n setFilterDescriptors((filterDescriptors) => {\n const newFilterDescriptors = filterDescriptors.filter(\n ({ id }) => id !== filterId,\n );\n if (filterId !== UNSAVED_FILTER) {\n onFiltersSaved?.(newFilterDescriptors);\n }\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const applyNewName = useCallback(\n (filterId: string, name: string) => {\n setFilterDescriptors((currentFilterDescriptors) => {\n const newFilterDescriptors = renameFilter(\n currentFilterDescriptors,\n filterId,\n name,\n );\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const PromptForFilterName = useCallback(\n ({ filter, id }: FilterContainerFilterDescriptor) => {\n const originalFilterName = filter?.name ?? \"\";\n setDialog(\n <FilterNamePrompt\n filterName={filter?.name}\n title=\"Rename filter\"\n onClose={() => setDialog(null)}\n onConfirm={(name) => {\n setDialog(null);\n if (originalFilterName !== name) {\n applyNewName(id, name);\n }\n }}\n />,\n );\n },\n [applyNewName],\n );\n\n const promptForConfirmationOfDelete = useCallback(\n (\n filterDescriptor: FilterContainerFilterDescriptor,\n columns?: ColumnDescriptor[],\n ) => {\n setDialog(\n <DeleteFilterPrompt\n columns={columns}\n filterDescriptor={filterDescriptor}\n onConfirm={() => {\n setDialog(null);\n deleteFilter(filterDescriptor.id);\n }}\n onClose={() => setDialog(null)}\n />,\n );\n },\n [deleteFilter],\n );\n\n const handleFilterMenuAction = useCallback<FilterMenuActionHandler>(\n (filterId, actionType, columns) => {\n const targetFilter = findFilter(filterDescriptors, filterId);\n switch (actionType) {\n case \"close\":\n console.log(`close filter ${filterId}`);\n break;\n case \"edit\":\n console.log(`edit filter ${filterId}`);\n break;\n case \"remove\":\n if (filterId === UNSAVED_FILTER) {\n console.log(\"remove unsaved filter\");\n } else {\n promptForConfirmationOfDelete(targetFilter, columns);\n }\n break;\n case \"rename\":\n return PromptForFilterName(targetFilter);\n }\n },\n [filterDescriptors, promptForConfirmationOfDelete, PromptForFilterName],\n );\n\n const handleSaveFilter = useCallback(\n (name: string) => {\n setFilterDescriptors((filterDescriptors) => {\n const activeFilter = findActiveFilter(filterDescriptors);\n if (activeFilter.filter === null) {\n throw Error(\"[FilterProvider] cannot save an empty filter\");\n }\n const filterWithSameName = findFilterByName(filterDescriptors, name);\n // We are always renaming the active filter, how this will play out depends on whether\n // the name is unique and has actually changed\n if (activeFilter === filterWithSameName) {\n // name has not changed\n return filterDescriptors;\n } else if (filterWithSameName !== undefined) {\n // we are renaming the active filter, but another filter already has the same name,\n // keep the active filter, remove the duplicate.\n return filterDescriptors.reduce<FilterContainerFilterDescriptor[]>(\n (list, filterDescriptor) => {\n if (filterDescriptor === activeFilter) {\n list.push({\n active: true,\n filter: { ...filterDescriptor.filter, name },\n id: uuid(),\n name,\n } as FilterContainerFilterDescriptor);\n } else if (filterDescriptor.filter?.name !== name) {\n list.push(filterDescriptor);\n }\n return list;\n },\n [],\n );\n } else {\n const newFilterDescriptors = filterDescriptors.map(\n (filterDescriptor) =>\n filterDescriptor === activeFilter\n ? ({\n active: true,\n filter: { ...filterDescriptor.filter, name },\n id: uuid(),\n name,\n } as FilterContainerFilterDescriptor)\n : filterDescriptor,\n );\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n }\n });\n },\n [onFiltersSaved],\n );\n\n /**\n * Allows switching between saved filters. Alternatively, an anonymous\n * filter can be assigned. This is to allow for a dynamically created\n * filter to be active.\n */\n const setCurrentFilter = useCallback(\n (filter: string | FilterContainerFilter) => {\n if (filter === NULL_FILTER) {\n setFilterDescriptors((currentFilterDescriptors) =>\n insertOrReplaceFilter(currentFilterDescriptors, NullFilterDescriptor),\n );\n } else if (filter === EMPTY_FILTER) {\n setFilterDescriptors((currentFilterDescriptors) =>\n insertOrReplaceFilter(\n currentFilterDescriptors,\n EmptyFilterDescriptor,\n ),\n );\n } else if (typeof filter === \"string\") {\n setFilterDescriptors((currentFilterDescriptors) =>\n activateFilter(currentFilterDescriptors, filter),\n );\n } else if (filter) {\n setFilterDescriptors((currentFilterDescriptors) =>\n insertOrReplaceFilter(currentFilterDescriptors, {\n active: true,\n filter,\n id: UNSAVED_FILTER,\n }),\n );\n } else {\n deleteFilter(UNSAVED_FILTER);\n }\n },\n [deleteFilter],\n );\n\n return (\n <FilterContext.Provider\n value={{\n currentFilter: findActiveFilter(filterDescriptors),\n onApplyFilter: handleApplyFilter,\n onFilterMenuAction: handleFilterMenuAction,\n deleteFilter,\n saveFilter: handleSaveFilter,\n savedFilters: filterDescriptors.filter(filterDescriptorHasFilter),\n setCurrentFilter,\n }}\n >\n {children}\n {dialog}\n </FilterContext.Provider>\n );\n};\n"],"names":["filterDescriptors"],"mappings":"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"}
|
package/esm/filter-utils.js
CHANGED
|
@@ -307,7 +307,13 @@ const getFilterClausesForDisplay = (filter, columns = [], clauses = []) => {
|
|
|
307
307
|
if (filter === void 0) {
|
|
308
308
|
return clauses;
|
|
309
309
|
} else if (isSingleValueFilter(filter)) {
|
|
310
|
-
|
|
310
|
+
const column = columns.find((c) => c.name === filter.column);
|
|
311
|
+
if (column) {
|
|
312
|
+
const { name, label = name } = column;
|
|
313
|
+
clauses.push([label, filter.value.toString()]);
|
|
314
|
+
} else {
|
|
315
|
+
clauses.push([filter.column, filter.value.toString()]);
|
|
316
|
+
}
|
|
311
317
|
} else if (isBetweenFilter(filter)) {
|
|
312
318
|
const [f1, f2] = filter.filters;
|
|
313
319
|
const column = columns.find((c) => c.name === f1.column);
|
package/esm/filter-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-utils.js","sources":["../../../packages/vuu-filters/src/filter-utils.ts"],"sourcesContent":["import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n Filter,\n FilterClause,\n FilterCombinatorOp,\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n FilterWithPartialClause,\n MultiClauseFilter,\n NumericFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n extractFilterForColumn,\n filtersAreEqual,\n isAndFilter,\n isBetweenFilter,\n isInFilter,\n isMultiClauseFilter,\n isMultiValueFilter,\n isOrFilter,\n isSingleValueFilter,\n isTimeDataValue,\n partition,\n Time,\n} from \"@vuu-ui/vuu-utils\";\n\nexport const AND = \"and\";\nexport const EQUALS = \"=\";\nexport const GREATER_THAN = \">\";\nexport const LESS_THAN = \"<\";\nexport const OR = \"or\";\nexport const STARTS_WITH = \"starts\";\nexport const ENDS_WITH = \"ends\";\nexport const IN = \"in\";\n\nexport type FilterType =\n | \"and\"\n | \"=\"\n | \">\"\n | \">=\"\n | \"in\"\n | \"<=\"\n | \"<\"\n | \"NOT_IN\"\n | \"NOT_SW\"\n | \"or\"\n | \"SW\";\n\nexport const filterClauses = (\n filter: Partial<Filter> | FilterWithPartialClause | null,\n clauses: Partial<FilterClause>[] = [],\n): Partial<FilterClause>[] => {\n if (filter) {\n if (isMultiClauseFilter(filter)) {\n filter.filters.forEach((f) => clauses.push(...filterClauses(f)));\n } else {\n clauses.push(filter as Partial<FilterClause>);\n }\n }\n return clauses;\n};\n\ntype AddFilterOptions = {\n combineWith: FilterCombinatorOp;\n};\n\nconst DEFAULT_ADD_FILTER_OPTS: AddFilterOptions = {\n combineWith: \"and\",\n};\n\nexport const removeLastClause = (filter: MultiClauseFilter) => {\n const { filters } = filter;\n if (filters.length > 2) {\n return {\n ...filter,\n filters: filter.filters.slice(0, -1),\n };\n } else {\n // must be 2, we never have 1\n return filter.filters[0];\n }\n};\n\n/**\n Allows an empty FilterClause to be appended to an existing filter - for use\n in filter editing UI only.\n*/\nexport const addClause = (\n existingFilter: Filter,\n clause: Partial<Filter>,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS,\n): FilterWithPartialClause => {\n if (\n isMultiClauseFilter(existingFilter) &&\n existingFilter.op === combineWith\n ) {\n // if (isCompleteFilter(clause)) {\n return {\n ...existingFilter,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n filters: existingFilter.filters.concat(clause),\n };\n // } else {\n // throw Error(\n // \"filter-utils, replaceFilter, only a valid clause can be added to a filter\"\n // );\n // }\n } else {\n return {\n op: combineWith,\n filters: [existingFilter, clause],\n };\n }\n};\n\nexport const addFilter = (\n existingFilter: Filter | undefined,\n filter: Filter,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS,\n): Filter | undefined => {\n if (includesNoValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the no-values filter\n } else {\n existingFilter = removeFilterForColumn(existingFilter, {\n name: filter.column,\n });\n }\n } else if (includesAllValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the all-values filter\n }\n return removeFilterForColumn(existingFilter, { name: filter.column ?? \"\" });\n }\n\n if (!existingFilter) {\n return filter;\n }\n if (!filter) {\n return existingFilter;\n }\n if (existingFilter.op === AND && filter.op === AND) {\n return {\n op: AND,\n filters: combine(existingFilter.filters, filter.filters),\n };\n }\n if (existingFilter.op === AND) {\n const filters = replaceOrInsert(existingFilter.filters, filter);\n return filters.length > 1 ? { op: AND, filters } : filters[0];\n }\n if (filter.op === AND) {\n return { op: AND, filters: filter.filters.concat(existingFilter) };\n }\n\n if (filterEquals(existingFilter, filter, true)) {\n return filter;\n }\n\n if (canMerge(existingFilter, filter)) {\n return merge(existingFilter, filter);\n }\n\n return { op: combineWith, filters: [existingFilter, filter] };\n};\n\nconst includesNoValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (isInFilter(filter) && filter.values.length === 0) {\n return true;\n }\n return isAndFilter(filter) && filter.filters.some((f) => includesNoValues(f));\n};\n\ninterface CommonFilter {\n colName?: string;\n otherColFilters?: Filter[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mode?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n values?: any;\n op?: \"or\" | \"and\";\n column?: string;\n filters?: Filter[];\n}\n\nexport interface OtherFilter extends CommonFilter {\n type: FilterType;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n values?: any[];\n}\n\nconst includesAllValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (filter.op === STARTS_WITH && filter.value === \"\") {\n return true;\n }\n return filter.op === STARTS_WITH && filter.value === \"\";\n};\n\nconst replaceOrInsert = (filters: Filter[], filter: Filter) => {\n return filters.concat(filter);\n};\n\nconst merge = (f1: Filter, f2: Filter): Filter | undefined => {\n if (includesNoValues(f2)) {\n return f2;\n }\n if (isInFilter(f1) && isInFilter(f2)) {\n return {\n ...f1,\n values: [\n ...f1.values,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...(f2.values as any[]).filter(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (v: string | number) => !(f1.values as any[]).includes(v),\n ),\n ],\n };\n } else if (isInFilter(f1) && f2.op === EQUALS) {\n return {\n ...f1,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: f1.values.concat([f2.value]),\n };\n } else if (f1.op === EQUALS && f2.op === EQUALS) {\n return {\n column: f1.column,\n op: IN,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: [f1.value, f2.value],\n };\n }\n return f2;\n};\n\nconst combine = (existingFilters: Filter[], replacementFilters: Filter[]) => {\n const equivalentType = ({ op: op1 }: Filter, { op: op2 }: Filter) => {\n return (\n op1 === op2 ||\n (op1[0] === \">\" && op2[0] === \">\") ||\n (op1[0] === \"<\" && op2[0] === \"<\")\n );\n };\n const replaces = (existingFilter: Filter, replacementFilter: Filter) => {\n return (\n existingFilter.column === replacementFilter.column &&\n equivalentType(existingFilter, replacementFilter)\n );\n };\n const stillApplicable = (existingFilter: Filter) =>\n replacementFilters.some((replacementFilter) =>\n replaces(existingFilter, replacementFilter),\n ) === false;\n return existingFilters.filter(stillApplicable).concat(replacementFilters);\n};\n\nexport const removeFilter = (sourceFilter: Filter, filterToRemove: Filter) => {\n if (filterEquals(sourceFilter, filterToRemove, true)) {\n return null;\n }\n if (sourceFilter.op !== AND) {\n throw Error(\n `removeFilter cannot remove ${JSON.stringify(\n filterToRemove,\n )} from ${JSON.stringify(sourceFilter)}`,\n );\n }\n const filters = sourceFilter.filters.filter(\n (f) => !filterEquals(f, filterToRemove),\n );\n return filters.length > 0 ? { type: AND, filters } : null;\n};\n\nexport const splitFilterOnColumn = (\n columnName: string,\n filter?: Filter,\n): [Filter | undefined, Filter | undefined] => {\n if (!filter) {\n return [undefined, undefined];\n }\n if (filter.column === columnName) {\n return [filter, undefined];\n }\n if (filter.op !== AND) {\n return [undefined, filter];\n }\n const [[columnFilter = undefined], filters] = partition(\n (filter as MultiClauseFilter<\"and\">).filters,\n (f) => f.column === columnName,\n );\n return filters.length === 1\n ? [columnFilter, filters[0]]\n : [columnFilter, { op: AND, filters }];\n};\n\nexport const overrideColName = (filter: Filter, column: string): Filter => {\n if (isMultiClauseFilter(filter)) {\n return {\n op: filter.op,\n filters: filter.filters.map((f) => overrideColName(f, column)),\n };\n }\n return { ...filter, column };\n};\n\nexport const filterIncludesColumn = (\n filter: Filter,\n column: ColumnDescriptor,\n): boolean => {\n if (!filter) {\n return false;\n }\n const { op, column: filterColName } = filter;\n switch (op) {\n case AND:\n case OR:\n return (\n filter.filters != null &&\n filter.filters.some((f) => filterIncludesColumn(f, column))\n );\n default:\n return filterColName === column.name;\n }\n};\n\nconst removeFilterForColumn = (\n sourceFilter: Filter | undefined,\n column: ColumnDescriptor,\n): Filter | undefined => {\n const colName = column.name;\n if (!sourceFilter) {\n return undefined;\n }\n if (sourceFilter.column === colName) {\n return undefined;\n }\n if (isAndFilter(sourceFilter) || isOrFilter(sourceFilter)) {\n const { op } = sourceFilter;\n const filters = sourceFilter.filters;\n const otherColFilters = filters.filter((f) => f.column !== colName);\n switch (otherColFilters.length) {\n case 0:\n return undefined;\n case 1:\n return otherColFilters[0];\n default:\n return { op, filters: otherColFilters };\n }\n }\n return sourceFilter;\n};\n\nconst canMerge = (f1: Filter, f2: Filter) =>\n f1.column === f2.column &&\n (f1.op === \"=\" || f1.op === \"in\") &&\n (f2.op === \"=\" || f2.op === \"in\");\n\nconst sameValues = <T>(arr1: T[], arr2: T[]) => {\n if (arr1 === arr2) {\n return true;\n }\n if (arr1.length === arr2.length) {\n const a = arr1.slice().sort();\n const b = arr2.slice().sort();\n return a.join(\"|\") === b.join(\"|\");\n }\n return false;\n};\n\nexport const filterEquals = (f1?: Filter, f2?: Filter, strict = false) => {\n if (!strict) {\n return true;\n }\n if (f1 && f2 && canMerge(f1, f2)) {\n return (\n f1.op === f2.op &&\n ((isSingleValueFilter(f1) &&\n isSingleValueFilter(f2) &&\n f1.value === f2.value) ||\n (isMultiValueFilter(f1) &&\n isMultiValueFilter(f2) &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sameValues(f1.values as any[], f2.values)))\n );\n }\n return false;\n};\n\nexport const updateFilter = (\n filter: Filter | undefined,\n newFilter: Filter | undefined,\n mode: \"add\" | \"replace\",\n): Filter | undefined => {\n if (filter && newFilter) {\n if (mode === \"replace\") {\n return newFilter;\n }\n if (filter.op === \"and\") {\n return {\n ...filter,\n filters: filter.filters.concat(newFilter),\n };\n }\n const { column: columnName } = newFilter;\n if (columnName) {\n const existingClause = newFilter.column\n ? extractFilterForColumn(filter, columnName)\n : undefined;\n if (existingClause && columnName) {\n // The filter already contains a clause for this column, replace\n // with the new clause\n const result = removeFilterForColumn(filter, { name: columnName });\n return updateFilter(result, newFilter, \"add\");\n }\n }\n return {\n op: \"and\",\n filters: [filter, newFilter],\n };\n }\n if (newFilter) {\n return newFilter;\n }\n return filter;\n};\n\nexport const getTypeaheadFilter = (\n column: string,\n filterValues: string[],\n isStartsWithFilter?: boolean,\n): Filter | undefined => {\n if (filterValues.length === 0) {\n return undefined;\n }\n\n if (isStartsWithFilter) {\n // multiple starts with filters not currently supported\n const startsWith = filterValues[0].substring(0, filterValues[0].length - 3);\n return {\n column,\n op: \"starts\",\n value: `\"${startsWith}\"`,\n };\n }\n\n return {\n column,\n op: \"in\",\n values: filterValues.map((value) => `\"${value}\"`),\n };\n};\n\nexport const getNumericFilter = (\n column: string,\n op?: NumericFilterClauseOp,\n value?: number,\n): FilterClause | undefined => {\n if (op === undefined) return undefined;\n if (value === undefined || isNaN(value)) return undefined;\n return { column, op, value };\n};\n\ntype FilterClauseList = Array<[string, string]>;\n\n/**\n * Restructure a FilterContainerFilter into a list of [column, value] tuples\n * suitable for display in a text based control.\n */\nexport const getFilterClausesForDisplay = (\n filter?: FilterContainerFilter,\n columns: ColumnDescriptor[] = [],\n clauses: FilterClauseList = [],\n): FilterClauseList => {\n if (filter === undefined) {\n return clauses;\n } else if (isSingleValueFilter(filter)) {\n clauses.push([filter.column, filter.value.toString()]);\n } else if (isBetweenFilter(filter)) {\n const [f1, f2] = filter.filters;\n const column = columns.find((c) => c.name === f1.column);\n if (\n isTimeDataValue(column) &&\n typeof f1.value === \"number\" &&\n typeof f2.value === \"number\"\n ) {\n const { name, label = name } = column;\n clauses.push([\n label,\n `${Time.millisToTimeString(f1.value)} - ${Time.millisToTimeString(f2.value)}`,\n ]);\n } else if (column) {\n const { name, label = name } = column;\n clauses.push([label, `${f1.value} - ${f2.value}`]);\n } else {\n clauses.push([f1.column, `${f1.value} - ${f2.value}`]);\n }\n } else if (isAndFilter(filter)) {\n filter.filters.forEach((f) =>\n getFilterClausesForDisplay(f, columns, clauses),\n );\n }\n return clauses;\n};\n\n/**\n * Given a list of FilterContainerFilterDescriptors and a FilterContainerFilter,\n * find filter descriptor from the list with an equal filter. If\n * none exists, return undefined, otherwise return the matched filter descriptor\n */\nexport const findMatchingFilter = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n filter: FilterContainerFilter,\n) =>\n filterDescriptors.find(\n ({ active, filter: f }) =>\n !active && f !== null && f !== filter && filtersAreEqual(f, filter),\n );\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filter-utils.js","sources":["../../../packages/vuu-filters/src/filter-utils.ts"],"sourcesContent":["import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n Filter,\n FilterClause,\n FilterCombinatorOp,\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n FilterWithPartialClause,\n MultiClauseFilter,\n NumericFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n extractFilterForColumn,\n filtersAreEqual,\n isAndFilter,\n isBetweenFilter,\n isInFilter,\n isMultiClauseFilter,\n isMultiValueFilter,\n isOrFilter,\n isSingleValueFilter,\n isTimeDataValue,\n partition,\n Time,\n} from \"@vuu-ui/vuu-utils\";\n\nexport const AND = \"and\";\nexport const EQUALS = \"=\";\nexport const GREATER_THAN = \">\";\nexport const LESS_THAN = \"<\";\nexport const OR = \"or\";\nexport const STARTS_WITH = \"starts\";\nexport const ENDS_WITH = \"ends\";\nexport const IN = \"in\";\n\nexport type FilterType =\n | \"and\"\n | \"=\"\n | \">\"\n | \">=\"\n | \"in\"\n | \"<=\"\n | \"<\"\n | \"NOT_IN\"\n | \"NOT_SW\"\n | \"or\"\n | \"SW\";\n\nexport const filterClauses = (\n filter: Partial<Filter> | FilterWithPartialClause | null,\n clauses: Partial<FilterClause>[] = [],\n): Partial<FilterClause>[] => {\n if (filter) {\n if (isMultiClauseFilter(filter)) {\n filter.filters.forEach((f) => clauses.push(...filterClauses(f)));\n } else {\n clauses.push(filter as Partial<FilterClause>);\n }\n }\n return clauses;\n};\n\ntype AddFilterOptions = {\n combineWith: FilterCombinatorOp;\n};\n\nconst DEFAULT_ADD_FILTER_OPTS: AddFilterOptions = {\n combineWith: \"and\",\n};\n\nexport const removeLastClause = (filter: MultiClauseFilter) => {\n const { filters } = filter;\n if (filters.length > 2) {\n return {\n ...filter,\n filters: filter.filters.slice(0, -1),\n };\n } else {\n // must be 2, we never have 1\n return filter.filters[0];\n }\n};\n\n/**\n Allows an empty FilterClause to be appended to an existing filter - for use\n in filter editing UI only.\n*/\nexport const addClause = (\n existingFilter: Filter,\n clause: Partial<Filter>,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS,\n): FilterWithPartialClause => {\n if (\n isMultiClauseFilter(existingFilter) &&\n existingFilter.op === combineWith\n ) {\n // if (isCompleteFilter(clause)) {\n return {\n ...existingFilter,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n filters: existingFilter.filters.concat(clause),\n };\n // } else {\n // throw Error(\n // \"filter-utils, replaceFilter, only a valid clause can be added to a filter\"\n // );\n // }\n } else {\n return {\n op: combineWith,\n filters: [existingFilter, clause],\n };\n }\n};\n\nexport const addFilter = (\n existingFilter: Filter | undefined,\n filter: Filter,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS,\n): Filter | undefined => {\n if (includesNoValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the no-values filter\n } else {\n existingFilter = removeFilterForColumn(existingFilter, {\n name: filter.column,\n });\n }\n } else if (includesAllValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the all-values filter\n }\n return removeFilterForColumn(existingFilter, { name: filter.column ?? \"\" });\n }\n\n if (!existingFilter) {\n return filter;\n }\n if (!filter) {\n return existingFilter;\n }\n if (existingFilter.op === AND && filter.op === AND) {\n return {\n op: AND,\n filters: combine(existingFilter.filters, filter.filters),\n };\n }\n if (existingFilter.op === AND) {\n const filters = replaceOrInsert(existingFilter.filters, filter);\n return filters.length > 1 ? { op: AND, filters } : filters[0];\n }\n if (filter.op === AND) {\n return { op: AND, filters: filter.filters.concat(existingFilter) };\n }\n\n if (filterEquals(existingFilter, filter, true)) {\n return filter;\n }\n\n if (canMerge(existingFilter, filter)) {\n return merge(existingFilter, filter);\n }\n\n return { op: combineWith, filters: [existingFilter, filter] };\n};\n\nconst includesNoValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (isInFilter(filter) && filter.values.length === 0) {\n return true;\n }\n return isAndFilter(filter) && filter.filters.some((f) => includesNoValues(f));\n};\n\ninterface CommonFilter {\n colName?: string;\n otherColFilters?: Filter[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mode?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n values?: any;\n op?: \"or\" | \"and\";\n column?: string;\n filters?: Filter[];\n}\n\nexport interface OtherFilter extends CommonFilter {\n type: FilterType;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n values?: any[];\n}\n\nconst includesAllValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (filter.op === STARTS_WITH && filter.value === \"\") {\n return true;\n }\n return filter.op === STARTS_WITH && filter.value === \"\";\n};\n\nconst replaceOrInsert = (filters: Filter[], filter: Filter) => {\n return filters.concat(filter);\n};\n\nconst merge = (f1: Filter, f2: Filter): Filter | undefined => {\n if (includesNoValues(f2)) {\n return f2;\n }\n if (isInFilter(f1) && isInFilter(f2)) {\n return {\n ...f1,\n values: [\n ...f1.values,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...(f2.values as any[]).filter(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (v: string | number) => !(f1.values as any[]).includes(v),\n ),\n ],\n };\n } else if (isInFilter(f1) && f2.op === EQUALS) {\n return {\n ...f1,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: f1.values.concat([f2.value]),\n };\n } else if (f1.op === EQUALS && f2.op === EQUALS) {\n return {\n column: f1.column,\n op: IN,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: [f1.value, f2.value],\n };\n }\n return f2;\n};\n\nconst combine = (existingFilters: Filter[], replacementFilters: Filter[]) => {\n const equivalentType = ({ op: op1 }: Filter, { op: op2 }: Filter) => {\n return (\n op1 === op2 ||\n (op1[0] === \">\" && op2[0] === \">\") ||\n (op1[0] === \"<\" && op2[0] === \"<\")\n );\n };\n const replaces = (existingFilter: Filter, replacementFilter: Filter) => {\n return (\n existingFilter.column === replacementFilter.column &&\n equivalentType(existingFilter, replacementFilter)\n );\n };\n const stillApplicable = (existingFilter: Filter) =>\n replacementFilters.some((replacementFilter) =>\n replaces(existingFilter, replacementFilter),\n ) === false;\n return existingFilters.filter(stillApplicable).concat(replacementFilters);\n};\n\nexport const removeFilter = (sourceFilter: Filter, filterToRemove: Filter) => {\n if (filterEquals(sourceFilter, filterToRemove, true)) {\n return null;\n }\n if (sourceFilter.op !== AND) {\n throw Error(\n `removeFilter cannot remove ${JSON.stringify(\n filterToRemove,\n )} from ${JSON.stringify(sourceFilter)}`,\n );\n }\n const filters = sourceFilter.filters.filter(\n (f) => !filterEquals(f, filterToRemove),\n );\n return filters.length > 0 ? { type: AND, filters } : null;\n};\n\nexport const splitFilterOnColumn = (\n columnName: string,\n filter?: Filter,\n): [Filter | undefined, Filter | undefined] => {\n if (!filter) {\n return [undefined, undefined];\n }\n if (filter.column === columnName) {\n return [filter, undefined];\n }\n if (filter.op !== AND) {\n return [undefined, filter];\n }\n const [[columnFilter = undefined], filters] = partition(\n (filter as MultiClauseFilter<\"and\">).filters,\n (f) => f.column === columnName,\n );\n return filters.length === 1\n ? [columnFilter, filters[0]]\n : [columnFilter, { op: AND, filters }];\n};\n\nexport const overrideColName = (filter: Filter, column: string): Filter => {\n if (isMultiClauseFilter(filter)) {\n return {\n op: filter.op,\n filters: filter.filters.map((f) => overrideColName(f, column)),\n };\n }\n return { ...filter, column };\n};\n\nexport const filterIncludesColumn = (\n filter: Filter,\n column: ColumnDescriptor,\n): boolean => {\n if (!filter) {\n return false;\n }\n const { op, column: filterColName } = filter;\n switch (op) {\n case AND:\n case OR:\n return (\n filter.filters != null &&\n filter.filters.some((f) => filterIncludesColumn(f, column))\n );\n default:\n return filterColName === column.name;\n }\n};\n\nconst removeFilterForColumn = (\n sourceFilter: Filter | undefined,\n column: ColumnDescriptor,\n): Filter | undefined => {\n const colName = column.name;\n if (!sourceFilter) {\n return undefined;\n }\n if (sourceFilter.column === colName) {\n return undefined;\n }\n if (isAndFilter(sourceFilter) || isOrFilter(sourceFilter)) {\n const { op } = sourceFilter;\n const filters = sourceFilter.filters;\n const otherColFilters = filters.filter((f) => f.column !== colName);\n switch (otherColFilters.length) {\n case 0:\n return undefined;\n case 1:\n return otherColFilters[0];\n default:\n return { op, filters: otherColFilters };\n }\n }\n return sourceFilter;\n};\n\nconst canMerge = (f1: Filter, f2: Filter) =>\n f1.column === f2.column &&\n (f1.op === \"=\" || f1.op === \"in\") &&\n (f2.op === \"=\" || f2.op === \"in\");\n\nconst sameValues = <T>(arr1: T[], arr2: T[]) => {\n if (arr1 === arr2) {\n return true;\n }\n if (arr1.length === arr2.length) {\n const a = arr1.slice().sort();\n const b = arr2.slice().sort();\n return a.join(\"|\") === b.join(\"|\");\n }\n return false;\n};\n\nexport const filterEquals = (f1?: Filter, f2?: Filter, strict = false) => {\n if (!strict) {\n return true;\n }\n if (f1 && f2 && canMerge(f1, f2)) {\n return (\n f1.op === f2.op &&\n ((isSingleValueFilter(f1) &&\n isSingleValueFilter(f2) &&\n f1.value === f2.value) ||\n (isMultiValueFilter(f1) &&\n isMultiValueFilter(f2) &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sameValues(f1.values as any[], f2.values)))\n );\n }\n return false;\n};\n\nexport const updateFilter = (\n filter: Filter | undefined,\n newFilter: Filter | undefined,\n mode: \"add\" | \"replace\",\n): Filter | undefined => {\n if (filter && newFilter) {\n if (mode === \"replace\") {\n return newFilter;\n }\n if (filter.op === \"and\") {\n return {\n ...filter,\n filters: filter.filters.concat(newFilter),\n };\n }\n const { column: columnName } = newFilter;\n if (columnName) {\n const existingClause = newFilter.column\n ? extractFilterForColumn(filter, columnName)\n : undefined;\n if (existingClause && columnName) {\n // The filter already contains a clause for this column, replace\n // with the new clause\n const result = removeFilterForColumn(filter, { name: columnName });\n return updateFilter(result, newFilter, \"add\");\n }\n }\n return {\n op: \"and\",\n filters: [filter, newFilter],\n };\n }\n if (newFilter) {\n return newFilter;\n }\n return filter;\n};\n\nexport const getTypeaheadFilter = (\n column: string,\n filterValues: string[],\n isStartsWithFilter?: boolean,\n): Filter | undefined => {\n if (filterValues.length === 0) {\n return undefined;\n }\n\n if (isStartsWithFilter) {\n // multiple starts with filters not currently supported\n const startsWith = filterValues[0].substring(0, filterValues[0].length - 3);\n return {\n column,\n op: \"starts\",\n value: `\"${startsWith}\"`,\n };\n }\n\n return {\n column,\n op: \"in\",\n values: filterValues.map((value) => `\"${value}\"`),\n };\n};\n\nexport const getNumericFilter = (\n column: string,\n op?: NumericFilterClauseOp,\n value?: number,\n): FilterClause | undefined => {\n if (op === undefined) return undefined;\n if (value === undefined || isNaN(value)) return undefined;\n return { column, op, value };\n};\n\ntype FilterClauseList = Array<[string, string]>;\n\n/**\n * Restructure a FilterContainerFilter into a list of [column, value] tuples\n * suitable for display in a text based control.\n */\nexport const getFilterClausesForDisplay = (\n filter?: FilterContainerFilter,\n columns: ColumnDescriptor[] = [],\n clauses: FilterClauseList = [],\n): FilterClauseList => {\n if (filter === undefined) {\n return clauses;\n } else if (isSingleValueFilter(filter)) {\n const column = columns.find((c) => c.name === filter.column);\n if (column) {\n const { name, label = name } = column;\n clauses.push([label, filter.value.toString()]);\n } else {\n clauses.push([filter.column, filter.value.toString()]);\n }\n } else if (isBetweenFilter(filter)) {\n const [f1, f2] = filter.filters;\n const column = columns.find((c) => c.name === f1.column);\n if (\n isTimeDataValue(column) &&\n typeof f1.value === \"number\" &&\n typeof f2.value === \"number\"\n ) {\n const { name, label = name } = column;\n clauses.push([\n label,\n `${Time.millisToTimeString(f1.value)} - ${Time.millisToTimeString(f2.value)}`,\n ]);\n } else if (column) {\n const { name, label = name } = column;\n clauses.push([label, `${f1.value} - ${f2.value}`]);\n } else {\n clauses.push([f1.column, `${f1.value} - ${f2.value}`]);\n }\n } else if (isAndFilter(filter)) {\n filter.filters.forEach((f) =>\n getFilterClausesForDisplay(f, columns, clauses),\n );\n }\n return clauses;\n};\n\n/**\n * Given a list of FilterContainerFilterDescriptors and a FilterContainerFilter,\n * find filter descriptor from the list with an equal filter. If\n * none exists, return undefined, otherwise return the matched filter descriptor\n */\nexport const findMatchingFilter = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n filter: FilterContainerFilter,\n) =>\n filterDescriptors.find(\n ({ active, filter: f }) =>\n !active && f !== null && f !== filter && filtersAreEqual(f, filter),\n );\n"],"names":[],"mappings":";;AA0BO,MAAM,GAAM,GAAA;AACZ,MAAM,MAAS,GAAA;AACf,MAAM,YAAe,GAAA;AACrB,MAAM,SAAY,GAAA;AAClB,MAAM,EAAK,GAAA;AACX,MAAM,WAAc,GAAA;AACpB,MAAM,SAAY,GAAA;AAClB,MAAM,EAAK,GAAA;AAeX,MAAM,aAAgB,GAAA,CAC3B,MACA,EAAA,OAAA,GAAmC,EACP,KAAA;AAC5B,EAAA,IAAI,MAAQ,EAAA;AACV,IAAI,IAAA,mBAAA,CAAoB,MAAM,CAAG,EAAA;AAC/B,MAAO,MAAA,CAAA,OAAA,CAAQ,OAAQ,CAAA,CAAC,CAAM,KAAA,OAAA,CAAQ,KAAK,GAAG,aAAA,CAAc,CAAC,CAAC,CAAC,CAAA;AAAA,KAC1D,MAAA;AACL,MAAA,OAAA,CAAQ,KAAK,MAA+B,CAAA;AAAA;AAC9C;AAEF,EAAO,OAAA,OAAA;AACT;AAMA,MAAM,uBAA4C,GAAA;AAAA,EAChD,WAAa,EAAA;AACf,CAAA;AAEa,MAAA,gBAAA,GAAmB,CAAC,MAA8B,KAAA;AAC7D,EAAM,MAAA,EAAE,SAAY,GAAA,MAAA;AACpB,EAAI,IAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AACtB,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH,OAAS,EAAA,MAAA,CAAO,OAAQ,CAAA,KAAA,CAAM,GAAG,CAAE,CAAA;AAAA,KACrC;AAAA,GACK,MAAA;AAEL,IAAO,OAAA,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA;AAE3B;AAMa,MAAA,SAAA,GAAY,CACvB,cACA,EAAA,MAAA,EACA,EAAE,WAAc,GAAA,GAAA,KAA0B,uBACd,KAAA;AAC5B,EAAA,IACE,mBAAoB,CAAA,cAAc,CAClC,IAAA,cAAA,CAAe,OAAO,WACtB,EAAA;AAEA,IAAO,OAAA;AAAA,MACL,GAAG,cAAA;AAAA;AAAA;AAAA,MAGH,OAAS,EAAA,cAAA,CAAe,OAAQ,CAAA,MAAA,CAAO,MAAM;AAAA,KAC/C;AAAA,GAMK,MAAA;AACL,IAAO,OAAA;AAAA,MACL,EAAI,EAAA,WAAA;AAAA,MACJ,OAAA,EAAS,CAAC,cAAA,EAAgB,MAAM;AAAA,KAClC;AAAA;AAEJ;AAEa,MAAA,SAAA,GAAY,CACvB,cACA,EAAA,MAAA,EACA,EAAE,WAAc,GAAA,GAAA,KAA0B,uBACnB,KAAA;AACvB,EAAI,IAAA,gBAAA,CAAiB,MAAM,CAAG,EAAA;AAC5B,IAAI,IAAA,mBAAA,CAAoB,MAAM,CAAG,EAAA,CAE1B,MAAA;AACL,MAAA,cAAA,GAAiB,sBAAsB,cAAgB,EAAA;AAAA,QACrD,MAAM,MAAO,CAAA;AAAA,OACd,CAAA;AAAA;AACH,GACF,MAAA,IAAW,iBAAkB,CAAA,MAAM,CAAG,EAAA;AACpC,IAAI,IAAA,mBAAA,CAAoB,MAAM,CAAG,EAAA;AAGjC,IAAA,OAAO,sBAAsB,cAAgB,EAAA,EAAE,MAAM,MAAO,CAAA,MAAA,IAAU,IAAI,CAAA;AAAA;AAG5E,EAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,IAAO,OAAA,MAAA;AAAA;AAET,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,cAAA;AAAA;AAET,EAAA,IAAI,cAAe,CAAA,EAAA,KAAO,GAAO,IAAA,MAAA,CAAO,OAAO,GAAK,EAAA;AAClD,IAAO,OAAA;AAAA,MACL,EAAI,EAAA,GAAA;AAAA,MACJ,OAAS,EAAA,OAAA,CAAQ,cAAe,CAAA,OAAA,EAAS,OAAO,OAAO;AAAA,KACzD;AAAA;AAEF,EAAI,IAAA,cAAA,CAAe,OAAO,GAAK,EAAA;AAC7B,IAAA,MAAM,OAAU,GAAA,eAAA,CAAgB,cAAe,CAAA,OAAA,EAAS,MAAM,CAAA;AAC9D,IAAO,OAAA,OAAA,CAAQ,SAAS,CAAI,GAAA,EAAE,IAAI,GAAK,EAAA,OAAA,EAAY,GAAA,OAAA,CAAQ,CAAC,CAAA;AAAA;AAE9D,EAAI,IAAA,MAAA,CAAO,OAAO,GAAK,EAAA;AACrB,IAAO,OAAA,EAAE,IAAI,GAAK,EAAA,OAAA,EAAS,OAAO,OAAQ,CAAA,MAAA,CAAO,cAAc,CAAE,EAAA;AAAA;AAGnE,EAAA,IAAI,YAAa,CAAA,cAAA,EAAgB,MAAQ,EAAA,IAAI,CAAG,EAAA;AAC9C,IAAO,OAAA,MAAA;AAAA;AAGT,EAAI,IAAA,QAAA,CAAS,cAAgB,EAAA,MAAM,CAAG,EAAA;AACpC,IAAO,OAAA,KAAA,CAAM,gBAAgB,MAAM,CAAA;AAAA;AAGrC,EAAA,OAAO,EAAE,EAAI,EAAA,WAAA,EAAa,SAAS,CAAC,cAAA,EAAgB,MAAM,CAAE,EAAA;AAC9D;AAEA,MAAM,gBAAA,GAAmB,CAAC,MAAoC,KAAA;AAC5D,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,KAAA;AAAA;AAET,EAAA,IAAI,WAAW,MAAM,CAAA,IAAK,MAAO,CAAA,MAAA,CAAO,WAAW,CAAG,EAAA;AACpD,IAAO,OAAA,IAAA;AAAA;AAET,EAAO,OAAA,WAAA,CAAY,MAAM,CAAA,IAAK,MAAO,CAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,KAAM,gBAAiB,CAAA,CAAC,CAAC,CAAA;AAC9E,CAAA;AAsBA,MAAM,iBAAA,GAAoB,CAAC,MAAoC,KAAA;AAC7D,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,KAAA;AAAA;AAET,EAAA,IAAI,MAAO,CAAA,EAAA,KAAO,WAAe,IAAA,MAAA,CAAO,UAAU,EAAI,EAAA;AACpD,IAAO,OAAA,IAAA;AAAA;AAET,EAAA,OAAO,MAAO,CAAA,EAAA,KAAO,WAAe,IAAA,MAAA,CAAO,KAAU,KAAA,EAAA;AACvD,CAAA;AAEA,MAAM,eAAA,GAAkB,CAAC,OAAA,EAAmB,MAAmB,KAAA;AAC7D,EAAO,OAAA,OAAA,CAAQ,OAAO,MAAM,CAAA;AAC9B,CAAA;AAEA,MAAM,KAAA,GAAQ,CAAC,EAAA,EAAY,EAAmC,KAAA;AAC5D,EAAI,IAAA,gBAAA,CAAiB,EAAE,CAAG,EAAA;AACxB,IAAO,OAAA,EAAA;AAAA;AAET,EAAA,IAAI,UAAW,CAAA,EAAE,CAAK,IAAA,UAAA,CAAW,EAAE,CAAG,EAAA;AACpC,IAAO,OAAA;AAAA,MACL,GAAG,EAAA;AAAA,MACH,MAAQ,EAAA;AAAA,QACN,GAAG,EAAG,CAAA,MAAA;AAAA;AAAA,QAEN,GAAI,GAAG,MAAiB,CAAA,MAAA;AAAA;AAAA,UAEtB,CAAC,CAAuB,KAAA,CAAE,EAAG,CAAA,MAAA,CAAiB,SAAS,CAAC;AAAA;AAC1D;AACF,KACF;AAAA,aACS,UAAW,CAAA,EAAE,CAAK,IAAA,EAAA,CAAG,OAAO,MAAQ,EAAA;AAC7C,IAAO,OAAA;AAAA,MACL,GAAG,EAAA;AAAA;AAAA;AAAA,MAGH,QAAQ,EAAG,CAAA,MAAA,CAAO,OAAO,CAAC,EAAA,CAAG,KAAK,CAAC;AAAA,KACrC;AAAA,aACS,EAAG,CAAA,EAAA,KAAO,MAAU,IAAA,EAAA,CAAG,OAAO,MAAQ,EAAA;AAC/C,IAAO,OAAA;AAAA,MACL,QAAQ,EAAG,CAAA,MAAA;AAAA,MACX,EAAI,EAAA,EAAA;AAAA;AAAA;AAAA,MAGJ,MAAQ,EAAA,CAAC,EAAG,CAAA,KAAA,EAAO,GAAG,KAAK;AAAA,KAC7B;AAAA;AAEF,EAAO,OAAA,EAAA;AACT,CAAA;AAEA,MAAM,OAAA,GAAU,CAAC,eAAA,EAA2B,kBAAiC,KAAA;AAC3E,EAAM,MAAA,cAAA,GAAiB,CAAC,EAAE,EAAA,EAAI,KAAe,EAAA,EAAE,EAAI,EAAA,GAAA,EAAkB,KAAA;AACnE,IAAA,OACE,QAAQ,GACP,IAAA,GAAA,CAAI,CAAC,CAAA,KAAM,OAAO,GAAI,CAAA,CAAC,CAAM,KAAA,GAAA,IAC7B,IAAI,CAAC,CAAA,KAAM,GAAO,IAAA,GAAA,CAAI,CAAC,CAAM,KAAA,GAAA;AAAA,GAElC;AACA,EAAM,MAAA,QAAA,GAAW,CAAC,cAAA,EAAwB,iBAA8B,KAAA;AACtE,IAAA,OACE,eAAe,MAAW,KAAA,iBAAA,CAAkB,MAC5C,IAAA,cAAA,CAAe,gBAAgB,iBAAiB,CAAA;AAAA,GAEpD;AACA,EAAM,MAAA,eAAA,GAAkB,CAAC,cAAA,KACvB,kBAAmB,CAAA,IAAA;AAAA,IAAK,CAAC,iBAAA,KACvB,QAAS,CAAA,cAAA,EAAgB,iBAAiB;AAAA,GACtC,KAAA,KAAA;AACR,EAAA,OAAO,eAAgB,CAAA,MAAA,CAAO,eAAe,CAAA,CAAE,OAAO,kBAAkB,CAAA;AAC1E,CAAA;AAEa,MAAA,YAAA,GAAe,CAAC,YAAA,EAAsB,cAA2B,KAAA;AAC5E,EAAA,IAAI,YAAa,CAAA,YAAA,EAAc,cAAgB,EAAA,IAAI,CAAG,EAAA;AACpD,IAAO,OAAA,IAAA;AAAA;AAET,EAAI,IAAA,YAAA,CAAa,OAAO,GAAK,EAAA;AAC3B,IAAM,MAAA,KAAA;AAAA,MACJ,8BAA8B,IAAK,CAAA,SAAA;AAAA,QACjC;AAAA,OACD,CAAA,MAAA,EAAS,IAAK,CAAA,SAAA,CAAU,YAAY,CAAC,CAAA;AAAA,KACxC;AAAA;AAEF,EAAM,MAAA,OAAA,GAAU,aAAa,OAAQ,CAAA,MAAA;AAAA,IACnC,CAAC,CAAA,KAAM,CAAC,YAAA,CAAa,GAAG,cAAc;AAAA,GACxC;AACA,EAAA,OAAO,QAAQ,MAAS,GAAA,CAAA,GAAI,EAAE,IAAM,EAAA,GAAA,EAAK,SAAY,GAAA,IAAA;AACvD;AAEa,MAAA,mBAAA,GAAsB,CACjC,UAAA,EACA,MAC6C,KAAA;AAC7C,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,CAAC,QAAW,KAAS,CAAA,CAAA;AAAA;AAE9B,EAAI,IAAA,MAAA,CAAO,WAAW,UAAY,EAAA;AAChC,IAAO,OAAA,CAAC,QAAQ,KAAS,CAAA,CAAA;AAAA;AAE3B,EAAI,IAAA,MAAA,CAAO,OAAO,GAAK,EAAA;AACrB,IAAO,OAAA,CAAC,QAAW,MAAM,CAAA;AAAA;AAE3B,EAAA,MAAM,CAAC,CAAC,YAAA,GAAe,KAAS,CAAA,CAAA,EAAG,OAAO,CAAI,GAAA,SAAA;AAAA,IAC3C,MAAoC,CAAA,OAAA;AAAA,IACrC,CAAC,CAAM,KAAA,CAAA,CAAE,MAAW,KAAA;AAAA,GACtB;AACA,EAAA,OAAO,OAAQ,CAAA,MAAA,KAAW,CACtB,GAAA,CAAC,cAAc,OAAQ,CAAA,CAAC,CAAC,CAAA,GACzB,CAAC,YAAc,EAAA,EAAE,EAAI,EAAA,GAAA,EAAK,SAAS,CAAA;AACzC;AAEa,MAAA,eAAA,GAAkB,CAAC,MAAA,EAAgB,MAA2B,KAAA;AACzE,EAAI,IAAA,mBAAA,CAAoB,MAAM,CAAG,EAAA;AAC/B,IAAO,OAAA;AAAA,MACL,IAAI,MAAO,CAAA,EAAA;AAAA,MACX,OAAA,EAAS,OAAO,OAAQ,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA,eAAA,CAAgB,CAAG,EAAA,MAAM,CAAC;AAAA,KAC/D;AAAA;AAEF,EAAO,OAAA,EAAE,GAAG,MAAA,EAAQ,MAAO,EAAA;AAC7B;AAEa,MAAA,oBAAA,GAAuB,CAClC,MAAA,EACA,MACY,KAAA;AACZ,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,KAAA;AAAA;AAET,EAAA,MAAM,EAAE,EAAA,EAAI,MAAQ,EAAA,aAAA,EAAkB,GAAA,MAAA;AACtC,EAAA,QAAQ,EAAI;AAAA,IACV,KAAK,GAAA;AAAA,IACL,KAAK,EAAA;AACH,MACE,OAAA,MAAA,CAAO,OAAW,IAAA,IAAA,IAClB,MAAO,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,CAAM,KAAA,oBAAA,CAAqB,CAAG,EAAA,MAAM,CAAC,CAAA;AAAA,IAE9D;AACE,MAAA,OAAO,kBAAkB,MAAO,CAAA,IAAA;AAAA;AAEtC;AAEA,MAAM,qBAAA,GAAwB,CAC5B,YAAA,EACA,MACuB,KAAA;AACvB,EAAA,MAAM,UAAU,MAAO,CAAA,IAAA;AACvB,EAAA,IAAI,CAAC,YAAc,EAAA;AACjB,IAAO,OAAA,KAAA,CAAA;AAAA;AAET,EAAI,IAAA,YAAA,CAAa,WAAW,OAAS,EAAA;AACnC,IAAO,OAAA,KAAA,CAAA;AAAA;AAET,EAAA,IAAI,WAAY,CAAA,YAAY,CAAK,IAAA,UAAA,CAAW,YAAY,CAAG,EAAA;AACzD,IAAM,MAAA,EAAE,IAAO,GAAA,YAAA;AACf,IAAA,MAAM,UAAU,YAAa,CAAA,OAAA;AAC7B,IAAA,MAAM,kBAAkB,OAAQ,CAAA,MAAA,CAAO,CAAC,CAAM,KAAA,CAAA,CAAE,WAAW,OAAO,CAAA;AAClE,IAAA,QAAQ,gBAAgB,MAAQ;AAAA,MAC9B,KAAK,CAAA;AACH,QAAO,OAAA,KAAA,CAAA;AAAA,MACT,KAAK,CAAA;AACH,QAAA,OAAO,gBAAgB,CAAC,CAAA;AAAA,MAC1B;AACE,QAAO,OAAA,EAAE,EAAI,EAAA,OAAA,EAAS,eAAgB,EAAA;AAAA;AAC1C;AAEF,EAAO,OAAA,YAAA;AACT,CAAA;AAEA,MAAM,WAAW,CAAC,EAAA,EAAY,OAC5B,EAAG,CAAA,MAAA,KAAW,GAAG,MAChB,KAAA,EAAA,CAAG,EAAO,KAAA,GAAA,IAAO,GAAG,EAAO,KAAA,IAAA,CAAA,KAC3B,GAAG,EAAO,KAAA,GAAA,IAAO,GAAG,EAAO,KAAA,IAAA,CAAA;AAE9B,MAAM,UAAA,GAAa,CAAI,IAAA,EAAW,IAAc,KAAA;AAC9C,EAAA,IAAI,SAAS,IAAM,EAAA;AACjB,IAAO,OAAA,IAAA;AAAA;AAET,EAAI,IAAA,IAAA,CAAK,MAAW,KAAA,IAAA,CAAK,MAAQ,EAAA;AAC/B,IAAA,MAAM,CAAI,GAAA,IAAA,CAAK,KAAM,EAAA,CAAE,IAAK,EAAA;AAC5B,IAAA,MAAM,CAAI,GAAA,IAAA,CAAK,KAAM,EAAA,CAAE,IAAK,EAAA;AAC5B,IAAA,OAAO,EAAE,IAAK,CAAA,GAAG,CAAM,KAAA,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA;AAEnC,EAAO,OAAA,KAAA;AACT,CAAA;AAEO,MAAM,YAAe,GAAA,CAAC,EAAa,EAAA,EAAA,EAAa,SAAS,KAAU,KAAA;AACxE,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,IAAA;AAAA;AAET,EAAA,IAAI,EAAM,IAAA,EAAA,IAAM,QAAS,CAAA,EAAA,EAAI,EAAE,CAAG,EAAA;AAChC,IAAA,OACE,GAAG,EAAO,KAAA,EAAA,CAAG,OACX,mBAAoB,CAAA,EAAE,KACtB,mBAAoB,CAAA,EAAE,CACtB,IAAA,EAAA,CAAG,UAAU,EAAG,CAAA,KAAA,IACf,mBAAmB,EAAE,CAAA,IACpB,mBAAmB,EAAE,CAAA;AAAA,IAErB,UAAW,CAAA,EAAA,CAAG,MAAiB,EAAA,EAAA,CAAG,MAAM,CAAA,CAAA;AAAA;AAGhD,EAAO,OAAA,KAAA;AACT;AAEO,MAAM,YAAe,GAAA,CAC1B,MACA,EAAA,SAAA,EACA,IACuB,KAAA;AACvB,EAAA,IAAI,UAAU,SAAW,EAAA;AACvB,IAAA,IAAI,SAAS,SAAW,EAAA;AACtB,MAAO,OAAA,SAAA;AAAA;AAET,IAAI,IAAA,MAAA,CAAO,OAAO,KAAO,EAAA;AACvB,MAAO,OAAA;AAAA,QACL,GAAG,MAAA;AAAA,QACH,OAAS,EAAA,MAAA,CAAO,OAAQ,CAAA,MAAA,CAAO,SAAS;AAAA,OAC1C;AAAA;AAEF,IAAM,MAAA,EAAE,MAAQ,EAAA,UAAA,EAAe,GAAA,SAAA;AAC/B,IAAA,IAAI,UAAY,EAAA;AACd,MAAA,MAAM,iBAAiB,SAAU,CAAA,MAAA,GAC7B,sBAAuB,CAAA,MAAA,EAAQ,UAAU,CACzC,GAAA,KAAA,CAAA;AACJ,MAAA,IAAI,kBAAkB,UAAY,EAAA;AAGhC,QAAA,MAAM,SAAS,qBAAsB,CAAA,MAAA,EAAQ,EAAE,IAAA,EAAM,YAAY,CAAA;AACjE,QAAO,OAAA,YAAA,CAAa,MAAQ,EAAA,SAAA,EAAW,KAAK,CAAA;AAAA;AAC9C;AAEF,IAAO,OAAA;AAAA,MACL,EAAI,EAAA,KAAA;AAAA,MACJ,OAAA,EAAS,CAAC,MAAA,EAAQ,SAAS;AAAA,KAC7B;AAAA;AAEF,EAAA,IAAI,SAAW,EAAA;AACb,IAAO,OAAA,SAAA;AAAA;AAET,EAAO,OAAA,MAAA;AACT;AAEO,MAAM,kBAAqB,GAAA,CAChC,MACA,EAAA,YAAA,EACA,kBACuB,KAAA;AACvB,EAAI,IAAA,YAAA,CAAa,WAAW,CAAG,EAAA;AAC7B,IAAO,OAAA,KAAA,CAAA;AAAA;AAGT,EAAA,IAAI,kBAAoB,EAAA;AAEtB,IAAM,MAAA,UAAA,GAAa,YAAa,CAAA,CAAC,CAAE,CAAA,SAAA,CAAU,GAAG,YAAa,CAAA,CAAC,CAAE,CAAA,MAAA,GAAS,CAAC,CAAA;AAC1E,IAAO,OAAA;AAAA,MACL,MAAA;AAAA,MACA,EAAI,EAAA,QAAA;AAAA,MACJ,KAAA,EAAO,IAAI,UAAU,CAAA,CAAA;AAAA,KACvB;AAAA;AAGF,EAAO,OAAA;AAAA,IACL,MAAA;AAAA,IACA,EAAI,EAAA,IAAA;AAAA,IACJ,QAAQ,YAAa,CAAA,GAAA,CAAI,CAAC,KAAU,KAAA,CAAA,CAAA,EAAI,KAAK,CAAG,CAAA,CAAA;AAAA,GAClD;AACF;AAEO,MAAM,gBAAmB,GAAA,CAC9B,MACA,EAAA,EAAA,EACA,KAC6B,KAAA;AAC7B,EAAI,IAAA,EAAA,KAAO,QAAkB,OAAA,KAAA,CAAA;AAC7B,EAAA,IAAI,KAAU,KAAA,KAAA,CAAA,IAAa,KAAM,CAAA,KAAK,GAAU,OAAA,KAAA,CAAA;AAChD,EAAO,OAAA,EAAE,MAAQ,EAAA,EAAA,EAAI,KAAM,EAAA;AAC7B;AAQa,MAAA,0BAAA,GAA6B,CACxC,MACA,EAAA,OAAA,GAA8B,EAC9B,EAAA,OAAA,GAA4B,EACP,KAAA;AACrB,EAAA,IAAI,WAAW,KAAW,CAAA,EAAA;AACxB,IAAO,OAAA,OAAA;AAAA,GACT,MAAA,IAAW,mBAAoB,CAAA,MAAM,CAAG,EAAA;AACtC,IAAM,MAAA,MAAA,GAAS,QAAQ,IAAK,CAAA,CAAC,MAAM,CAAE,CAAA,IAAA,KAAS,OAAO,MAAM,CAAA;AAC3D,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,MAAM,EAAE,IAAA,EAAM,KAAQ,GAAA,IAAA,EAAS,GAAA,MAAA;AAC/B,MAAA,OAAA,CAAQ,KAAK,CAAC,KAAA,EAAO,OAAO,KAAM,CAAA,QAAA,EAAU,CAAC,CAAA;AAAA,KACxC,MAAA;AACL,MAAQ,OAAA,CAAA,IAAA,CAAK,CAAC,MAAO,CAAA,MAAA,EAAQ,OAAO,KAAM,CAAA,QAAA,EAAU,CAAC,CAAA;AAAA;AACvD,GACF,MAAA,IAAW,eAAgB,CAAA,MAAM,CAAG,EAAA;AAClC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,MAAO,CAAA,OAAA;AACxB,IAAM,MAAA,MAAA,GAAS,QAAQ,IAAK,CAAA,CAAC,MAAM,CAAE,CAAA,IAAA,KAAS,GAAG,MAAM,CAAA;AACvD,IACE,IAAA,eAAA,CAAgB,MAAM,CAAA,IACtB,OAAO,EAAA,CAAG,UAAU,QACpB,IAAA,OAAO,EAAG,CAAA,KAAA,KAAU,QACpB,EAAA;AACA,MAAA,MAAM,EAAE,IAAA,EAAM,KAAQ,GAAA,IAAA,EAAS,GAAA,MAAA;AAC/B,MAAA,OAAA,CAAQ,IAAK,CAAA;AAAA,QACX,KAAA;AAAA,QACA,CAAA,EAAG,IAAK,CAAA,kBAAA,CAAmB,EAAG,CAAA,KAAK,CAAC,CAAA,GAAA,EAAM,IAAK,CAAA,kBAAA,CAAmB,EAAG,CAAA,KAAK,CAAC,CAAA;AAAA,OAC5E,CAAA;AAAA,eACQ,MAAQ,EAAA;AACjB,MAAA,MAAM,EAAE,IAAA,EAAM,KAAQ,GAAA,IAAA,EAAS,GAAA,MAAA;AAC/B,MAAQ,OAAA,CAAA,IAAA,CAAK,CAAC,KAAA,EAAO,CAAG,EAAA,EAAA,CAAG,KAAK,CAAM,GAAA,EAAA,EAAA,CAAG,KAAK,CAAA,CAAE,CAAC,CAAA;AAAA,KAC5C,MAAA;AACL,MAAQ,OAAA,CAAA,IAAA,CAAK,CAAC,EAAA,CAAG,MAAQ,EAAA,CAAA,EAAG,EAAG,CAAA,KAAK,CAAM,GAAA,EAAA,EAAA,CAAG,KAAK,CAAA,CAAE,CAAC,CAAA;AAAA;AACvD,GACF,MAAA,IAAW,WAAY,CAAA,MAAM,CAAG,EAAA;AAC9B,IAAA,MAAA,CAAO,OAAQ,CAAA,OAAA;AAAA,MAAQ,CAAC,CAAA,KACtB,0BAA2B,CAAA,CAAA,EAAG,SAAS,OAAO;AAAA,KAChD;AAAA;AAEF,EAAO,OAAA,OAAA;AACT;AAOO,MAAM,kBAAqB,GAAA,CAChC,iBACA,EAAA,MAAA,KAEA,iBAAkB,CAAA,IAAA;AAAA,EAChB,CAAC,EAAE,MAAQ,EAAA,MAAA,EAAQ,GACjB,KAAA,CAAC,MAAU,IAAA,CAAA,KAAM,IAAQ,IAAA,CAAA,KAAM,MAAU,IAAA,eAAA,CAAgB,GAAG,MAAM;AACtE;;;;"}
|
|
@@ -6,6 +6,7 @@ import { FilterDisplay } from '../filter-display/FilterDisplay.js';
|
|
|
6
6
|
const DeleteFilterPrompt = ({
|
|
7
7
|
children,
|
|
8
8
|
className,
|
|
9
|
+
columns,
|
|
9
10
|
filterDescriptor,
|
|
10
11
|
onClose,
|
|
11
12
|
onConfirm,
|
|
@@ -24,7 +25,7 @@ const DeleteFilterPrompt = ({
|
|
|
24
25
|
title: "Delete Filter",
|
|
25
26
|
children: [
|
|
26
27
|
/* @__PURE__ */ jsx("span", { children: `Do you want to delete '${filterDescriptor.filter?.name}' ?` }),
|
|
27
|
-
children ? children : filterDescriptor.filter ? /* @__PURE__ */ jsx(FilterDisplay, { filter: filterDescriptor.filter }) : null
|
|
28
|
+
children ? children : filterDescriptor.filter ? /* @__PURE__ */ jsx(FilterDisplay, { columns, filter: filterDescriptor.filter }) : null
|
|
28
29
|
]
|
|
29
30
|
}
|
|
30
31
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeleteFilterPrompt.js","sources":["../../../../packages/vuu-filters/src/saved-filters/DeleteFilterPrompt.tsx"],"sourcesContent":["import { FilterContainerFilterDescriptor } from \"@vuu-ui/vuu-filter-types\";\nimport { Prompt, PromptProps } from \"@vuu-ui/vuu-ui-controls\";\nimport cx from \"clsx\";\nimport { HTMLAttributes } from \"react\";\nimport { FilterDisplay } from \"../filter-display/FilterDisplay\";\n\nexport interface DeleteFilterPromptProps\n extends Pick<PromptProps, \"onConfirm\" | \"onClose\" | \"open\">,\n HTMLAttributes<HTMLDivElement> {\n filterDescriptor: FilterContainerFilterDescriptor;\n}\n\nexport const DeleteFilterPrompt = ({\n children,\n className,\n filterDescriptor,\n onClose,\n onConfirm,\n open = true,\n ...htmlAttributes\n}: DeleteFilterPromptProps) => {\n return (\n <Prompt\n {...htmlAttributes}\n className={cx(\"vuuDeleteFilterPrompt\", className)}\n initialFocusedItem=\"confirm\"\n onClose={onClose}\n onConfirm={onConfirm}\n open={open}\n title=\"Delete Filter\"\n >\n <span>{`Do you want to delete '${filterDescriptor.filter?.name}' ?`}</span>\n {children ? (\n children\n ) : filterDescriptor.filter ? (\n <FilterDisplay filter={filterDescriptor.filter} />\n ) : null}\n </Prompt>\n );\n};\n"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"DeleteFilterPrompt.js","sources":["../../../../packages/vuu-filters/src/saved-filters/DeleteFilterPrompt.tsx"],"sourcesContent":["import { FilterContainerFilterDescriptor } from \"@vuu-ui/vuu-filter-types\";\nimport { Prompt, PromptProps } from \"@vuu-ui/vuu-ui-controls\";\nimport cx from \"clsx\";\nimport { HTMLAttributes } from \"react\";\nimport { FilterDisplay } from \"../filter-display/FilterDisplay\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport interface DeleteFilterPromptProps\n extends Pick<PromptProps, \"onConfirm\" | \"onClose\" | \"open\">,\n HTMLAttributes<HTMLDivElement> {\n columns?: ColumnDescriptor[];\n filterDescriptor: FilterContainerFilterDescriptor;\n}\n\nexport const DeleteFilterPrompt = ({\n children,\n className,\n columns,\n filterDescriptor,\n onClose,\n onConfirm,\n open = true,\n ...htmlAttributes\n}: DeleteFilterPromptProps) => {\n return (\n <Prompt\n {...htmlAttributes}\n className={cx(\"vuuDeleteFilterPrompt\", className)}\n initialFocusedItem=\"confirm\"\n onClose={onClose}\n onConfirm={onConfirm}\n open={open}\n title=\"Delete Filter\"\n >\n <span>{`Do you want to delete '${filterDescriptor.filter?.name}' ?`}</span>\n {children ? (\n children\n ) : filterDescriptor.filter ? (\n <FilterDisplay columns={columns} filter={filterDescriptor.filter} />\n ) : null}\n </Prompt>\n );\n};\n"],"names":[],"mappings":";;;;;AAcO,MAAM,qBAAqB,CAAC;AAAA,EACjC,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAO,GAAA,IAAA;AAAA,EACP,GAAG;AACL,CAA+B,KAAA;AAC7B,EACE,uBAAA,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,uBAAA,EAAyB,SAAS,CAAA;AAAA,MAChD,kBAAmB,EAAA,SAAA;AAAA,MACnB,OAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAM,EAAA,eAAA;AAAA,MAEN,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAM,EAAA,EAAA,QAAA,EAAA,CAAA,uBAAA,EAA0B,gBAAiB,CAAA,MAAA,EAAQ,IAAI,CAAM,GAAA,CAAA,EAAA,CAAA;AAAA,QACnE,QAAA,GACC,QACE,GAAA,gBAAA,CAAiB,MACnB,mBAAA,GAAA,CAAC,iBAAc,OAAkB,EAAA,MAAA,EAAQ,gBAAiB,CAAA,MAAA,EAAQ,CAChE,GAAA;AAAA;AAAA;AAAA,GACN;AAEJ;;;;"}
|
|
@@ -35,7 +35,7 @@ const SavedFilterPanel = ({
|
|
|
35
35
|
} = filterPillPermissions;
|
|
36
36
|
return { allowClose, allowEdit, allowRemove, allowRename };
|
|
37
37
|
}, [filterPillPermissions]);
|
|
38
|
-
const { onClickFilter, onFilterMenuAction, savedFilters } = useSavedFilterPanel();
|
|
38
|
+
const { onClickFilter, onFilterMenuAction, savedFilters } = useSavedFilterPanel({ availableColumns });
|
|
39
39
|
const filtersToDisplay = savedFilters.filter(filterDescriptorHasFilter);
|
|
40
40
|
return /* @__PURE__ */ jsx(
|
|
41
41
|
"div",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SavedFilterPanel.js","sources":["../../../../packages/vuu-filters/src/saved-filters/SavedFilterPanel.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useMemo } from \"react\";\nimport { FilterPermissions } from \"../filter-pill/FilterMenu\";\nimport { FilterPillNext } from \"../filter-pill/FilterPillNext\";\nimport { filterDescriptorHasFilter } from \"../filter-provider/FilterProvider\";\nimport { useSavedFilterPanel } from \"./useSavedFilterPanel\";\n\nimport savedFilterPanelCss from \"./SavedFilterPanel.css\";\n\nconst classBase = \"vuuSavedFilterPanel\";\n\nconst defaultFilterPillPermissions: FilterPermissions = {\n allowEdit: true,\n allowRename: true,\n allowRemove: true,\n};\n\nexport interface SavedFilterPanelProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * ColumnDescriptors are not required but is passed will be\n * used to provide labels and correct value formatting for\n * displayed filters, e.g in tooltips\n */\n availableColumns?: ColumnDescriptor[];\n filterPillPermissions?: FilterPermissions;\n}\n\nexport const SavedFilterPanel = ({\n availableColumns,\n className,\n filterPillPermissions = defaultFilterPillPermissions,\n ...htmlAttributes\n}: SavedFilterPanelProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-saved-filter-panel\",\n css: savedFilterPanelCss,\n window: targetWindow,\n });\n\n const permissions = useMemo<FilterPermissions>(() => {\n const {\n allowClose = defaultFilterPillPermissions.allowClose,\n allowEdit = defaultFilterPillPermissions.allowEdit,\n allowRemove = defaultFilterPillPermissions.allowRename,\n allowRename = defaultFilterPillPermissions.allowRename,\n } = filterPillPermissions;\n return { allowClose, allowEdit, allowRemove, allowRename };\n }, [filterPillPermissions]);\n\n const { onClickFilter, onFilterMenuAction, savedFilters } =\n useSavedFilterPanel();\n\n const filtersToDisplay = savedFilters.filter(filterDescriptorHasFilter);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, \"vuuScrollable\", className)}\n >\n <div className={`${classBase}-filterPill-container`}>\n {filtersToDisplay.map((filterDescriptor, i) => (\n <FilterPillNext\n {...filterDescriptor}\n columns={availableColumns}\n key={i}\n onClick={onClickFilter}\n onMenuAction={onFilterMenuAction}\n permissions={permissions}\n />\n ))}\n </div>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AAYA,MAAM,SAAY,GAAA,qBAAA;AAElB,MAAM,4BAAkD,GAAA;AAAA,EACtD,SAAW,EAAA,IAAA;AAAA,EACX,WAAa,EAAA,IAAA;AAAA,EACb,WAAa,EAAA;AACf,CAAA;AAYO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,qBAAwB,GAAA,4BAAA;AAAA,EACxB,GAAG;AACL,CAA6B,KAAA;AAC3B,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,wBAAA;AAAA,IACR,GAAK,EAAA,mBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA,WAAA,GAAc,QAA2B,MAAM;AACnD,IAAM,MAAA;AAAA,MACJ,aAAa,4BAA6B,CAAA,UAAA;AAAA,MAC1C,YAAY,4BAA6B,CAAA,SAAA;AAAA,MACzC,cAAc,4BAA6B,CAAA,WAAA;AAAA,MAC3C,cAAc,4BAA6B,CAAA;AAAA,KACzC,GAAA,qBAAA;AACJ,IAAA,OAAO,EAAE,UAAA,EAAY,SAAW,EAAA,WAAA,EAAa,WAAY,EAAA;AAAA,GAC3D,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,
|
|
1
|
+
{"version":3,"file":"SavedFilterPanel.js","sources":["../../../../packages/vuu-filters/src/saved-filters/SavedFilterPanel.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useMemo } from \"react\";\nimport { FilterPermissions } from \"../filter-pill/FilterMenu\";\nimport { FilterPillNext } from \"../filter-pill/FilterPillNext\";\nimport { filterDescriptorHasFilter } from \"../filter-provider/FilterProvider\";\nimport { useSavedFilterPanel } from \"./useSavedFilterPanel\";\n\nimport savedFilterPanelCss from \"./SavedFilterPanel.css\";\n\nconst classBase = \"vuuSavedFilterPanel\";\n\nconst defaultFilterPillPermissions: FilterPermissions = {\n allowEdit: true,\n allowRename: true,\n allowRemove: true,\n};\n\nexport interface SavedFilterPanelProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * ColumnDescriptors are not required but is passed will be\n * used to provide labels and correct value formatting for\n * displayed filters, e.g in tooltips\n */\n availableColumns?: ColumnDescriptor[];\n filterPillPermissions?: FilterPermissions;\n}\n\nexport const SavedFilterPanel = ({\n availableColumns,\n className,\n filterPillPermissions = defaultFilterPillPermissions,\n ...htmlAttributes\n}: SavedFilterPanelProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-saved-filter-panel\",\n css: savedFilterPanelCss,\n window: targetWindow,\n });\n\n const permissions = useMemo<FilterPermissions>(() => {\n const {\n allowClose = defaultFilterPillPermissions.allowClose,\n allowEdit = defaultFilterPillPermissions.allowEdit,\n allowRemove = defaultFilterPillPermissions.allowRename,\n allowRename = defaultFilterPillPermissions.allowRename,\n } = filterPillPermissions;\n return { allowClose, allowEdit, allowRemove, allowRename };\n }, [filterPillPermissions]);\n\n const { onClickFilter, onFilterMenuAction, savedFilters } =\n useSavedFilterPanel({ availableColumns });\n\n const filtersToDisplay = savedFilters.filter(filterDescriptorHasFilter);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, \"vuuScrollable\", className)}\n >\n <div className={`${classBase}-filterPill-container`}>\n {filtersToDisplay.map((filterDescriptor, i) => (\n <FilterPillNext\n {...filterDescriptor}\n columns={availableColumns}\n key={i}\n onClick={onClickFilter}\n onMenuAction={onFilterMenuAction}\n permissions={permissions}\n />\n ))}\n </div>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AAYA,MAAM,SAAY,GAAA,qBAAA;AAElB,MAAM,4BAAkD,GAAA;AAAA,EACtD,SAAW,EAAA,IAAA;AAAA,EACX,WAAa,EAAA,IAAA;AAAA,EACb,WAAa,EAAA;AACf,CAAA;AAYO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,qBAAwB,GAAA,4BAAA;AAAA,EACxB,GAAG;AACL,CAA6B,KAAA;AAC3B,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,wBAAA;AAAA,IACR,GAAK,EAAA,mBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA,WAAA,GAAc,QAA2B,MAAM;AACnD,IAAM,MAAA;AAAA,MACJ,aAAa,4BAA6B,CAAA,UAAA;AAAA,MAC1C,YAAY,4BAA6B,CAAA,SAAA;AAAA,MACzC,cAAc,4BAA6B,CAAA,WAAA;AAAA,MAC3C,cAAc,4BAA6B,CAAA;AAAA,KACzC,GAAA,qBAAA;AACJ,IAAA,OAAO,EAAE,UAAA,EAAY,SAAW,EAAA,WAAA,EAAa,WAAY,EAAA;AAAA,GAC3D,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,EAAM,MAAA,EAAE,eAAe,kBAAoB,EAAA,YAAA,KACzC,mBAAoB,CAAA,EAAE,kBAAkB,CAAA;AAE1C,EAAM,MAAA,gBAAA,GAAmB,YAAa,CAAA,MAAA,CAAO,yBAAyB,CAAA;AAEtE,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAW,EAAA,EAAA,CAAG,SAAW,EAAA,eAAA,EAAiB,SAAS,CAAA;AAAA,MAEnD,QAAA,kBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,yBACzB,QAAiB,EAAA,gBAAA,CAAA,GAAA,CAAI,CAAC,gBAAA,EAAkB,CACvC,qBAAA,aAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACE,GAAG,gBAAA;AAAA,UACJ,OAAS,EAAA,gBAAA;AAAA,UACT,GAAK,EAAA,CAAA;AAAA,UACL,OAAS,EAAA,aAAA;AAAA,UACT,YAAc,EAAA,kBAAA;AAAA,UACd;AAAA;AAAA,OAEH,CACH,EAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { useCallback } from 'react';
|
|
2
2
|
import { useSavedFilters } from '../filter-provider/FilterContext.js';
|
|
3
3
|
|
|
4
|
-
const useSavedFilterPanel = () => {
|
|
4
|
+
const useSavedFilterPanel = (props) => {
|
|
5
5
|
const {
|
|
6
6
|
savedFilters = [],
|
|
7
7
|
setCurrentFilter,
|
|
8
8
|
onFilterMenuAction
|
|
9
|
-
} = useSavedFilters();
|
|
9
|
+
} = useSavedFilters({ availableColumns: props?.availableColumns });
|
|
10
10
|
const handleClickFilter = useCallback(
|
|
11
11
|
(e) => {
|
|
12
12
|
const { id } = e.target;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSavedFilterPanel.js","sources":["../../../../packages/vuu-filters/src/saved-filters/useSavedFilterPanel.tsx"],"sourcesContent":["import { SyntheticEvent, useCallback } from \"react\";\nimport { useSavedFilters } from \"../filter-provider/FilterContext\";\n\nexport type FilterClickHandler = (filterId: string) => void;\n\nexport const useSavedFilterPanel = () => {\n const {\n savedFilters = [],\n setCurrentFilter,\n onFilterMenuAction,\n } = useSavedFilters();\n\n const handleClickFilter = useCallback(\n (e: SyntheticEvent) => {\n const { id } = e.target as HTMLElement;\n setCurrentFilter(id);\n },\n [setCurrentFilter],\n );\n\n return {\n onClickFilter: handleClickFilter,\n onFilterMenuAction,\n savedFilters,\n };\n};\n"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"useSavedFilterPanel.js","sources":["../../../../packages/vuu-filters/src/saved-filters/useSavedFilterPanel.tsx"],"sourcesContent":["import { SyntheticEvent, useCallback } from \"react\";\nimport { useSavedFilters } from \"../filter-provider/FilterContext\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport type FilterClickHandler = (filterId: string) => void;\n\ninterface SavedFilterPanelProps {\n availableColumns?: ColumnDescriptor[];\n}\n\nexport const useSavedFilterPanel = (props?: SavedFilterPanelProps) => {\n const {\n savedFilters = [],\n setCurrentFilter,\n onFilterMenuAction,\n } = useSavedFilters({ availableColumns: props?.availableColumns });\n\n const handleClickFilter = useCallback(\n (e: SyntheticEvent) => {\n const { id } = e.target as HTMLElement;\n setCurrentFilter(id);\n },\n [setCurrentFilter],\n );\n\n return {\n onClickFilter: handleClickFilter,\n onFilterMenuAction,\n savedFilters,\n };\n};\n"],"names":[],"mappings":";;;AAUa,MAAA,mBAAA,GAAsB,CAAC,KAAkC,KAAA;AACpE,EAAM,MAAA;AAAA,IACJ,eAAe,EAAC;AAAA,IAChB,gBAAA;AAAA,IACA;AAAA,MACE,eAAgB,CAAA,EAAE,gBAAkB,EAAA,KAAA,EAAO,kBAAkB,CAAA;AAEjE,EAAA,MAAM,iBAAoB,GAAA,WAAA;AAAA,IACxB,CAAC,CAAsB,KAAA;AACrB,MAAM,MAAA,EAAE,EAAG,EAAA,GAAI,CAAE,CAAA,MAAA;AACjB,MAAA,gBAAA,CAAiB,EAAE,CAAA;AAAA,KACrB;AAAA,IACA,CAAC,gBAAgB;AAAA,GACnB;AAEA,EAAO,OAAA;AAAA,IACL,aAAe,EAAA,iBAAA;AAAA,IACf,kBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -9,7 +9,7 @@ import tabbedFilterContainerCss from './TabbedFilterContainer.css.js';
|
|
|
9
9
|
|
|
10
10
|
const classBase = "vuuTabbedFilterContainer";
|
|
11
11
|
const TabbedFilterContainer = ({
|
|
12
|
-
|
|
12
|
+
SavedFilterPanelProps: SavedFilterPanelProps2,
|
|
13
13
|
children,
|
|
14
14
|
className,
|
|
15
15
|
filter,
|
|
@@ -37,7 +37,7 @@ const TabbedFilterContainer = ({
|
|
|
37
37
|
children
|
|
38
38
|
}
|
|
39
39
|
) }, "ad-hoc-filter"),
|
|
40
|
-
/* @__PURE__ */ jsx(TabNextPanel, { value: "saved-filters", children: /* @__PURE__ */ jsx(SavedFilterPanel, {
|
|
40
|
+
/* @__PURE__ */ jsx(TabNextPanel, { value: "saved-filters", children: /* @__PURE__ */ jsx(SavedFilterPanel, { ...SavedFilterPanelProps2 }) }, "saved-filters")
|
|
41
41
|
] }) });
|
|
42
42
|
};
|
|
43
43
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabbedFilterContainer.js","sources":["../../../../packages/vuu-filters/src/tabbed-filter-container/TabbedFilterContainer.tsx"],"sourcesContent":["import {\n TabListNext,\n TabNext,\n TabNextPanel,\n TabNextTrigger,\n TabsNext,\n} from \"@salt-ds/lab\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { FilterContainerProps } from \"../filter-container/FilterContainer\";\nimport { FilterPanel } from \"../filter-panel/FilterPanel\";\nimport {\n SavedFilterPanel,\n SavedFilterPanelProps,\n} from \"../saved-filters/SavedFilterPanel\";\nimport tabbedFilterContainerCss from \"./TabbedFilterContainer.css\";\n\nconst classBase = \"vuuTabbedFilterContainer\";\n\nexport interface TabbedFilterContainerProps\n extends HTMLAttributes<HTMLDivElement>,\n Pick<\n FilterContainerProps,\n \"filter\" | \"onFilterApplied\" | \"onFilterCleared\"\n
|
|
1
|
+
{"version":3,"file":"TabbedFilterContainer.js","sources":["../../../../packages/vuu-filters/src/tabbed-filter-container/TabbedFilterContainer.tsx"],"sourcesContent":["import {\n TabListNext,\n TabNext,\n TabNextPanel,\n TabNextTrigger,\n TabsNext,\n} from \"@salt-ds/lab\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { FilterContainerProps } from \"../filter-container/FilterContainer\";\nimport { FilterPanel } from \"../filter-panel/FilterPanel\";\nimport {\n SavedFilterPanel,\n SavedFilterPanelProps,\n} from \"../saved-filters/SavedFilterPanel\";\nimport tabbedFilterContainerCss from \"./TabbedFilterContainer.css\";\n\nconst classBase = \"vuuTabbedFilterContainer\";\n\nexport interface TabbedFilterContainerProps\n extends HTMLAttributes<HTMLDivElement>,\n Pick<\n FilterContainerProps,\n \"filter\" | \"onFilterApplied\" | \"onFilterCleared\"\n > {\n SavedFilterPanelProps?: Pick<\n SavedFilterPanelProps,\n \"availableColumns\" | \"filterPillPermissions\"\n >;\n children: ReactNode;\n}\n\nexport const TabbedFilterContainer = ({\n SavedFilterPanelProps,\n children,\n className,\n filter,\n onFilterApplied,\n onFilterCleared,\n ...htmlAttributes\n}: TabbedFilterContainerProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-tabbed-filter-container\",\n css: tabbedFilterContainerCss,\n window: targetWindow,\n });\n\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n <TabsNext defaultValue=\"ad-hoc-filter\">\n <TabListNext appearance=\"transparent\">\n <TabNext value=\"ad-hoc-filter\" key=\"ad-hoc-filter\">\n <TabNextTrigger>AD HOC</TabNextTrigger>\n </TabNext>\n <TabNext value=\"saved-filters\" key=\"saved-filters\">\n <TabNextTrigger>SAVED</TabNextTrigger>\n </TabNext>\n </TabListNext>\n <TabNextPanel value=\"ad-hoc-filter\" key=\"ad-hoc-filter\">\n <FilterPanel\n filter={filter}\n onFilterApplied={onFilterApplied}\n onFilterCleared={onFilterCleared}\n >\n {children}\n </FilterPanel>\n </TabNextPanel>\n <TabNextPanel value=\"saved-filters\" key=\"saved-filters\">\n <SavedFilterPanel {...SavedFilterPanelProps} />\n </TabNextPanel>\n </TabsNext>\n </div>\n );\n};\n"],"names":["SavedFilterPanelProps"],"mappings":";;;;;;;;;AAmBA,MAAM,SAAY,GAAA,0BAAA;AAeX,MAAM,wBAAwB,CAAC;AAAA,EACpC,qBAAAA,EAAAA,sBAAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,GAAG;AACL,CAAkC,KAAA;AAChC,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,6BAAA;AAAA,IACR,GAAK,EAAA,wBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,uBACG,GAAA,CAAA,KAAA,EAAA,EAAK,GAAG,cAAA,EAAgB,SAAW,EAAA,EAAA,CAAG,SAAW,EAAA,SAAS,CACzD,EAAA,QAAA,kBAAA,IAAA,CAAC,QAAS,EAAA,EAAA,YAAA,EAAa,eACrB,EAAA,QAAA,EAAA;AAAA,oBAAC,IAAA,CAAA,WAAA,EAAA,EAAY,YAAW,aACtB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,WAAQ,KAAM,EAAA,eAAA,EACb,8BAAC,cAAe,EAAA,EAAA,QAAA,EAAA,QAAA,EAAM,KADW,eAEnC,CAAA;AAAA,sBACA,GAAA,CAAC,WAAQ,KAAM,EAAA,eAAA,EACb,8BAAC,cAAe,EAAA,EAAA,QAAA,EAAA,OAAA,EAAK,KADY,eAEnC;AAAA,KACF,EAAA,CAAA;AAAA,oBACA,GAAA,CAAC,YAAa,EAAA,EAAA,KAAA,EAAM,eAClB,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,eAAA;AAAA,QACA,eAAA;AAAA,QAEC;AAAA;AAAA,SANmC,eAQxC,CAAA;AAAA,oBACA,GAAA,CAAC,gBAAa,KAAM,EAAA,eAAA,EAClB,8BAAC,gBAAkB,EAAA,EAAA,GAAGA,sBAAuB,EAAA,CAAA,EAAA,EADP,eAExC;AAAA,GAAA,EACF,CACF,EAAA,CAAA;AAEJ;;;;"}
|
package/package.json
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.13.
|
|
2
|
+
"version": "0.13.52",
|
|
3
3
|
"author": "heswell",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"devDependencies": {
|
|
7
|
-
"@vuu-ui/vuu-data-types": "0.13.
|
|
8
|
-
"@vuu-ui/vuu-protocol-types": "0.13.
|
|
9
|
-
"@vuu-ui/vuu-table-types": "0.13.
|
|
10
|
-
"@vuu-ui/vuu-filter-types": "0.13.
|
|
7
|
+
"@vuu-ui/vuu-data-types": "0.13.52",
|
|
8
|
+
"@vuu-ui/vuu-protocol-types": "0.13.52",
|
|
9
|
+
"@vuu-ui/vuu-table-types": "0.13.52",
|
|
10
|
+
"@vuu-ui/vuu-filter-types": "0.13.52"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@vuu-ui/vuu-data-react": "0.13.
|
|
14
|
-
"@vuu-ui/vuu-filter-parser": "0.13.
|
|
15
|
-
"@vuu-ui/vuu-popups": "0.13.
|
|
16
|
-
"@vuu-ui/vuu-ui-controls": "0.13.
|
|
17
|
-
"@vuu-ui/vuu-table": "0.13.
|
|
18
|
-
"@vuu-ui/vuu-utils": "0.13.
|
|
13
|
+
"@vuu-ui/vuu-data-react": "0.13.52",
|
|
14
|
+
"@vuu-ui/vuu-filter-parser": "0.13.52",
|
|
15
|
+
"@vuu-ui/vuu-popups": "0.13.52",
|
|
16
|
+
"@vuu-ui/vuu-ui-controls": "0.13.52",
|
|
17
|
+
"@vuu-ui/vuu-table": "0.13.52",
|
|
18
|
+
"@vuu-ui/vuu-utils": "0.13.52",
|
|
19
19
|
"@salt-ds/core": "1.48.0",
|
|
20
20
|
"@salt-ds/lab": "1.0.0-alpha.76",
|
|
21
21
|
"@salt-ds/styles": "0.2.1",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { MenuProps } from "@salt-ds/core";
|
|
2
|
+
import { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
|
|
2
3
|
export type FilterPermissions = {
|
|
3
4
|
/** Closing a filter removes it from current display, without deleting*/
|
|
4
5
|
allowClose?: boolean;
|
|
@@ -15,5 +16,9 @@ export interface FilterMenuProps extends Pick<MenuProps, "getVirtualElement" | "
|
|
|
15
16
|
permissions?: FilterPermissions;
|
|
16
17
|
}
|
|
17
18
|
export type FilterAction = "close" | "remove" | "edit" | "rename";
|
|
18
|
-
export type FilterMenuActionHandler = <T extends FilterAction = FilterAction>(filterId: string, filterAction: T
|
|
19
|
+
export type FilterMenuActionHandler = <T extends FilterAction = FilterAction>(filterId: string, filterAction: T,
|
|
20
|
+
/**
|
|
21
|
+
* SOme menu action handlers may use columns to enrich filter display
|
|
22
|
+
*/
|
|
23
|
+
columns?: ColumnDescriptor[]) => void;
|
|
19
24
|
export declare const FilterMenu: ({ filterId, getVirtualElement, onMenuAction, onOpenChange, open, permissions, }: FilterMenuProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { FilterChangeHandler, FilterContainerFilter, FilterContainerFilterDescriptor } from "@vuu-ui/vuu-filter-types";
|
|
2
2
|
import { FilterMenuActionHandler } from "../filter-pill/FilterMenu";
|
|
3
|
+
import { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
|
|
3
4
|
export interface FilterContextProps {
|
|
4
5
|
currentFilter: FilterContainerFilterDescriptor;
|
|
5
6
|
deleteFilter: (filterId: string) => void;
|
|
@@ -21,11 +22,15 @@ export declare function useCurrentFilter(): {
|
|
|
21
22
|
onApplyFilter: FilterChangeHandler;
|
|
22
23
|
setCurrentFilter: (filter: string | FilterContainerFilter) => void;
|
|
23
24
|
};
|
|
24
|
-
|
|
25
|
+
interface SavedFilterHookProps {
|
|
26
|
+
availableColumns?: ColumnDescriptor[];
|
|
27
|
+
}
|
|
28
|
+
export declare function useSavedFilters(props?: SavedFilterHookProps): {
|
|
25
29
|
currentFilter: FilterContainerFilterDescriptor;
|
|
26
30
|
onApplyFilter: FilterChangeHandler;
|
|
27
|
-
onFilterMenuAction: FilterMenuActionHandler
|
|
31
|
+
onFilterMenuAction: FilterMenuActionHandler;
|
|
28
32
|
savedFilters: FilterContainerFilterDescriptor[] | undefined;
|
|
29
33
|
saveFilter: (name: string) => void;
|
|
30
34
|
setCurrentFilter: (filter: string | FilterContainerFilter) => void;
|
|
31
35
|
};
|
|
36
|
+
export {};
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { FilterContainerFilterDescriptor } from "@vuu-ui/vuu-filter-types";
|
|
2
2
|
import { PromptProps } from "@vuu-ui/vuu-ui-controls";
|
|
3
3
|
import { HTMLAttributes } from "react";
|
|
4
|
+
import { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
|
|
4
5
|
export interface DeleteFilterPromptProps extends Pick<PromptProps, "onConfirm" | "onClose" | "open">, HTMLAttributes<HTMLDivElement> {
|
|
6
|
+
columns?: ColumnDescriptor[];
|
|
5
7
|
filterDescriptor: FilterContainerFilterDescriptor;
|
|
6
8
|
}
|
|
7
|
-
export declare const DeleteFilterPrompt: ({ children, className, filterDescriptor, onClose, onConfirm, open, ...htmlAttributes }: DeleteFilterPromptProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export declare const DeleteFilterPrompt: ({ children, className, columns, filterDescriptor, onClose, onConfirm, open, ...htmlAttributes }: DeleteFilterPromptProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { SyntheticEvent } from "react";
|
|
2
|
+
import { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
|
|
2
3
|
export type FilterClickHandler = (filterId: string) => void;
|
|
3
|
-
|
|
4
|
+
interface SavedFilterPanelProps {
|
|
5
|
+
availableColumns?: ColumnDescriptor[];
|
|
6
|
+
}
|
|
7
|
+
export declare const useSavedFilterPanel: (props?: SavedFilterPanelProps) => {
|
|
4
8
|
onClickFilter: (e: SyntheticEvent) => void;
|
|
5
|
-
onFilterMenuAction: import("../filter-pill/FilterMenu").FilterMenuActionHandler
|
|
9
|
+
onFilterMenuAction: import("../filter-pill/FilterMenu").FilterMenuActionHandler;
|
|
6
10
|
savedFilters: import("@vuu-ui/vuu-filter-types").FilterContainerFilterDescriptor[];
|
|
7
11
|
};
|
|
12
|
+
export {};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { HTMLAttributes, ReactNode } from "react";
|
|
2
2
|
import { FilterContainerProps } from "../filter-container/FilterContainer";
|
|
3
3
|
import { SavedFilterPanelProps } from "../saved-filters/SavedFilterPanel";
|
|
4
|
-
export interface TabbedFilterContainerProps extends HTMLAttributes<HTMLDivElement>, Pick<FilterContainerProps, "filter" | "onFilterApplied" | "onFilterCleared"
|
|
4
|
+
export interface TabbedFilterContainerProps extends HTMLAttributes<HTMLDivElement>, Pick<FilterContainerProps, "filter" | "onFilterApplied" | "onFilterCleared"> {
|
|
5
|
+
SavedFilterPanelProps?: Pick<SavedFilterPanelProps, "availableColumns" | "filterPillPermissions">;
|
|
5
6
|
children: ReactNode;
|
|
6
7
|
}
|
|
7
|
-
export declare const TabbedFilterContainer: ({
|
|
8
|
+
export declare const TabbedFilterContainer: ({ SavedFilterPanelProps, children, className, filter, onFilterApplied, onFilterCleared, ...htmlAttributes }: TabbedFilterContainerProps) => import("react/jsx-runtime").JSX.Element;
|