@trackunit/filters-filter-bar 1.3.224 → 1.3.227

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/index.cjs.js CHANGED
@@ -12,6 +12,7 @@ var reactFormComponents = require('@trackunit/react-form-components');
12
12
  var reactDateAndTimeComponents = require('@trackunit/react-date-and-time-components');
13
13
  var sharedUtils = require('@trackunit/shared-utils');
14
14
  var tailwindMerge = require('tailwind-merge');
15
+ var irisAppApi = require('@trackunit/iris-app-api');
15
16
  var cssClassVarianceUtilities = require('@trackunit/css-class-variance-utilities');
16
17
  var dequal = require('dequal');
17
18
  var isEqual = require('lodash/isEqual');
@@ -801,7 +802,7 @@ const FilterButtonTooltipLabel = ({ filterBarConfig, }) => {
801
802
  * Custom React hook for grouping and filtering a list of filters.
802
803
  *
803
804
  * @param {FilterDefinition[]} filterDefinitions - The list of filter definitions to group and filter.
804
- * @param {string[]} hiddenFilters - An array of filter keys representing filters to be hidden.
805
+ * @param {string[]} hiddenFilters - An array of filter keys representing filters to be hidden, if not provided, all filters will be shown
805
806
  * @returns {UseGroupFiltersReturnType} An object containing the grouped filters.
806
807
  */
807
808
  const useGroupFilters = (filterDefinitions, hiddenFilters) => {
@@ -812,7 +813,12 @@ const useGroupFilters = (filterDefinitions, hiddenFilters) => {
812
813
  .map(key => ({
813
814
  key,
814
815
  title: t(`filtersBar.groups.${key}`),
815
- filters: filterDefinitions.filter(rawFilter => rawFilter.group === key && hiddenFilters.includes(rawFilter.filterKey) === false),
816
+ filters: filterDefinitions.filter(rawFilter => {
817
+ const isInGroup = rawFilter.group === key;
818
+ const isHidden = hiddenFilters ? hiddenFilters.includes(rawFilter.filterKey) : false;
819
+ const shouldInclude = isInGroup && !isHidden;
820
+ return shouldInclude;
821
+ }),
816
822
  }))
817
823
  .filter(filter => filter.filters.length > 0);
818
824
  }, [filterDefinitions, hiddenFilters, t]);
@@ -825,21 +831,29 @@ const uniqueKeysFromGroups = (filters) => [...new Set(filters.map(filter => filt
825
831
  * It returns the filters that should be shown in the menu, the filters that should be shown directly in the filter bar,
826
832
  * and the filters that should be shown in the search results.
827
833
  */
828
- const useFiltersMenu = ({ filterBarDefinition, filterBarConfig, hiddenFilters = [], allowShowFiltersDirectly = true, }) => {
834
+ const useFiltersMenu = ({ filterBarDefinition, filterBarConfig, hiddenFilters = [], allowShowFiltersDirectly = true, includeFilterKeys, }) => {
829
835
  const hideInMenu = react.useMemo(() => {
830
- return sharedUtils.objectValues(filterBarDefinition)
836
+ const result = sharedUtils.objectValues(filterBarDefinition)
831
837
  .map(filter => {
832
838
  const showInFilterBar = filter.showInFilterBar ? filter.showInFilterBar() : true;
833
839
  const showInStarredMenu = filter.showInStarredMenu ? filter.showInStarredMenu() : true;
834
840
  const showMenuAnywayBecauseFilterHasChanged = filterBarConfig.appliedFilterKeys().includes(filter.filterKey);
835
- return (!showInFilterBar || !showInStarredMenu) && !showMenuAnywayBecauseFilterHasChanged
841
+ const showInMenu = includeFilterKeys
842
+ ? filter.filterKey.startsWith("cf__")
843
+ ? includeFilterKeys.includes(irisAppApi.customFieldFilterKey)
844
+ : includeFilterKeys.includes(filter.filterKey)
845
+ : true;
846
+ return ((!showInFilterBar || !showInStarredMenu) && !showMenuAnywayBecauseFilterHasChanged) || !showInMenu
836
847
  ? filter.filterKey
837
848
  : null;
838
849
  })
839
850
  .filter(sharedUtils.truthy);
840
- }, [filterBarConfig, filterBarDefinition]);
851
+ return result;
852
+ }, [filterBarConfig, filterBarDefinition, includeFilterKeys]);
841
853
  const removeCustomFieldsGroup = react.useCallback((groupOfFilters) => groupOfFilters.filter(group => group.key !== "CUSTOM_FIELDS"), []);
842
- const { filtersGrouped } = useGroupFilters(sharedUtils.objectValues(filterBarDefinition), [...hideInMenu, ...hiddenFilters]);
854
+ const filterBarDefinitionArray = react.useMemo(() => sharedUtils.objectValues(filterBarDefinition), [filterBarDefinition]);
855
+ const hiddenFiltersArray = react.useMemo(() => [...hideInMenu, ...hiddenFilters], [hideInMenu, hiddenFilters]);
856
+ const { filtersGrouped } = useGroupFilters(filterBarDefinitionArray, hiddenFiltersArray);
843
857
  const { appliedFilters, filtersToShow, showDirectlyFilters, hasCustomFields } = react.useMemo(() => {
844
858
  const allFilters = filtersGrouped.map(group => group.filters).flat();
845
859
  return {
@@ -849,9 +863,10 @@ const useFiltersMenu = ({ filterBarDefinition, filterBarConfig, hiddenFilters =
849
863
  hasCustomFields: allFilters.some(filter => filter.group === "CUSTOM_FIELDS"),
850
864
  };
851
865
  }, [filterBarConfig, filtersGrouped, allowShowFiltersDirectly]);
852
- const [searchResults, searchText, setSearchText] = reactCoreHooks.useTextSearch(filtersToShow, item => [item.title]);
853
- const { filtersGrouped: searchResultsGrouped } = useGroupFilters(searchResults, []);
854
- const { filtersGrouped: filtersToShowGrouped } = useGroupFilters(filtersToShow, []);
866
+ const textCallback = react.useCallback((item) => [item.title], []);
867
+ const [searchResults, searchText, setSearchText] = reactCoreHooks.useTextSearch(filtersToShow, textCallback);
868
+ const { filtersGrouped: searchResultsGrouped } = useGroupFilters(searchResults);
869
+ const { filtersGrouped: filtersToShowGrouped } = useGroupFilters(filtersToShow);
855
870
  const appliedCustomFields = react.useMemo(() => appliedFilters.filter(filter => filter.group === "CUSTOM_FIELDS"), [appliedFilters]);
856
871
  return react.useMemo(() => {
857
872
  return {
@@ -1023,7 +1038,7 @@ const MultipleFilterTooltipLabel = ({ filterBarConfig, filterKeys, filters, }) =
1023
1038
  * @template TFilterBarDefinition - The type representing the filter bar definition.
1024
1039
  * @returns {ReactElement} - Returns the FilterMenu component.
1025
1040
  */
1026
- const FiltersMenu = ({ filterBarDefinition, filterBarConfig, hiddenFilters = [], compact, title, dataTestId = "filters-menu", className, showAppliedFiltersCount = true, buttonProps, allowShowFiltersDirectly = true, }) => {
1041
+ const FiltersMenu = ({ filterBarDefinition, filterBarConfig, hiddenFilters = [], compact, title, dataTestId = "filters-menu", className, showAppliedFiltersCount = true, buttonProps, allowShowFiltersDirectly = true, includeFilterKeys, }) => {
1027
1042
  const [t] = useTranslation();
1028
1043
  const { isSm } = reactComponents.useViewportBreakpoints();
1029
1044
  const [showCustomFilters, setShowCustomFilters] = react.useState(false);
@@ -1032,6 +1047,7 @@ const FiltersMenu = ({ filterBarDefinition, filterBarConfig, hiddenFilters = [],
1032
1047
  filterBarDefinition,
1033
1048
  filterBarConfig,
1034
1049
  hiddenFilters,
1050
+ includeFilterKeys,
1035
1051
  allowShowFiltersDirectly,
1036
1052
  });
1037
1053
  return (jsxRuntime.jsxs("div", { className: tailwindMerge.twMerge("flex items-center gap-2", className), "data-testid": dataTestId, children: [jsxRuntime.jsx(reactComponents.Popover, { onOpenStateChange: open => {
package/index.esm.js CHANGED
@@ -10,6 +10,7 @@ import { Search, NumberField, RadioGroup } from '@trackunit/react-form-component
10
10
  import { DayRangePicker } from '@trackunit/react-date-and-time-components';
11
11
  import { nonNullable, capitalize as capitalize$1, objectValues, truthy, objectKeys } from '@trackunit/shared-utils';
12
12
  import { twMerge } from 'tailwind-merge';
13
+ import { customFieldFilterKey } from '@trackunit/iris-app-api';
13
14
  import { cvaMerge } from '@trackunit/css-class-variance-utilities';
14
15
  import { dequal } from 'dequal';
15
16
  import isEqual from 'lodash/isEqual';
@@ -799,7 +800,7 @@ const FilterButtonTooltipLabel = ({ filterBarConfig, }) => {
799
800
  * Custom React hook for grouping and filtering a list of filters.
800
801
  *
801
802
  * @param {FilterDefinition[]} filterDefinitions - The list of filter definitions to group and filter.
802
- * @param {string[]} hiddenFilters - An array of filter keys representing filters to be hidden.
803
+ * @param {string[]} hiddenFilters - An array of filter keys representing filters to be hidden, if not provided, all filters will be shown
803
804
  * @returns {UseGroupFiltersReturnType} An object containing the grouped filters.
804
805
  */
805
806
  const useGroupFilters = (filterDefinitions, hiddenFilters) => {
@@ -810,7 +811,12 @@ const useGroupFilters = (filterDefinitions, hiddenFilters) => {
810
811
  .map(key => ({
811
812
  key,
812
813
  title: t(`filtersBar.groups.${key}`),
813
- filters: filterDefinitions.filter(rawFilter => rawFilter.group === key && hiddenFilters.includes(rawFilter.filterKey) === false),
814
+ filters: filterDefinitions.filter(rawFilter => {
815
+ const isInGroup = rawFilter.group === key;
816
+ const isHidden = hiddenFilters ? hiddenFilters.includes(rawFilter.filterKey) : false;
817
+ const shouldInclude = isInGroup && !isHidden;
818
+ return shouldInclude;
819
+ }),
814
820
  }))
815
821
  .filter(filter => filter.filters.length > 0);
816
822
  }, [filterDefinitions, hiddenFilters, t]);
@@ -823,21 +829,29 @@ const uniqueKeysFromGroups = (filters) => [...new Set(filters.map(filter => filt
823
829
  * It returns the filters that should be shown in the menu, the filters that should be shown directly in the filter bar,
824
830
  * and the filters that should be shown in the search results.
825
831
  */
826
- const useFiltersMenu = ({ filterBarDefinition, filterBarConfig, hiddenFilters = [], allowShowFiltersDirectly = true, }) => {
832
+ const useFiltersMenu = ({ filterBarDefinition, filterBarConfig, hiddenFilters = [], allowShowFiltersDirectly = true, includeFilterKeys, }) => {
827
833
  const hideInMenu = useMemo(() => {
828
- return objectValues(filterBarDefinition)
834
+ const result = objectValues(filterBarDefinition)
829
835
  .map(filter => {
830
836
  const showInFilterBar = filter.showInFilterBar ? filter.showInFilterBar() : true;
831
837
  const showInStarredMenu = filter.showInStarredMenu ? filter.showInStarredMenu() : true;
832
838
  const showMenuAnywayBecauseFilterHasChanged = filterBarConfig.appliedFilterKeys().includes(filter.filterKey);
833
- return (!showInFilterBar || !showInStarredMenu) && !showMenuAnywayBecauseFilterHasChanged
839
+ const showInMenu = includeFilterKeys
840
+ ? filter.filterKey.startsWith("cf__")
841
+ ? includeFilterKeys.includes(customFieldFilterKey)
842
+ : includeFilterKeys.includes(filter.filterKey)
843
+ : true;
844
+ return ((!showInFilterBar || !showInStarredMenu) && !showMenuAnywayBecauseFilterHasChanged) || !showInMenu
834
845
  ? filter.filterKey
835
846
  : null;
836
847
  })
837
848
  .filter(truthy);
838
- }, [filterBarConfig, filterBarDefinition]);
849
+ return result;
850
+ }, [filterBarConfig, filterBarDefinition, includeFilterKeys]);
839
851
  const removeCustomFieldsGroup = useCallback((groupOfFilters) => groupOfFilters.filter(group => group.key !== "CUSTOM_FIELDS"), []);
840
- const { filtersGrouped } = useGroupFilters(objectValues(filterBarDefinition), [...hideInMenu, ...hiddenFilters]);
852
+ const filterBarDefinitionArray = useMemo(() => objectValues(filterBarDefinition), [filterBarDefinition]);
853
+ const hiddenFiltersArray = useMemo(() => [...hideInMenu, ...hiddenFilters], [hideInMenu, hiddenFilters]);
854
+ const { filtersGrouped } = useGroupFilters(filterBarDefinitionArray, hiddenFiltersArray);
841
855
  const { appliedFilters, filtersToShow, showDirectlyFilters, hasCustomFields } = useMemo(() => {
842
856
  const allFilters = filtersGrouped.map(group => group.filters).flat();
843
857
  return {
@@ -847,9 +861,10 @@ const useFiltersMenu = ({ filterBarDefinition, filterBarConfig, hiddenFilters =
847
861
  hasCustomFields: allFilters.some(filter => filter.group === "CUSTOM_FIELDS"),
848
862
  };
849
863
  }, [filterBarConfig, filtersGrouped, allowShowFiltersDirectly]);
850
- const [searchResults, searchText, setSearchText] = useTextSearch(filtersToShow, item => [item.title]);
851
- const { filtersGrouped: searchResultsGrouped } = useGroupFilters(searchResults, []);
852
- const { filtersGrouped: filtersToShowGrouped } = useGroupFilters(filtersToShow, []);
864
+ const textCallback = useCallback((item) => [item.title], []);
865
+ const [searchResults, searchText, setSearchText] = useTextSearch(filtersToShow, textCallback);
866
+ const { filtersGrouped: searchResultsGrouped } = useGroupFilters(searchResults);
867
+ const { filtersGrouped: filtersToShowGrouped } = useGroupFilters(filtersToShow);
853
868
  const appliedCustomFields = useMemo(() => appliedFilters.filter(filter => filter.group === "CUSTOM_FIELDS"), [appliedFilters]);
854
869
  return useMemo(() => {
855
870
  return {
@@ -1021,7 +1036,7 @@ const MultipleFilterTooltipLabel = ({ filterBarConfig, filterKeys, filters, }) =
1021
1036
  * @template TFilterBarDefinition - The type representing the filter bar definition.
1022
1037
  * @returns {ReactElement} - Returns the FilterMenu component.
1023
1038
  */
1024
- const FiltersMenu = ({ filterBarDefinition, filterBarConfig, hiddenFilters = [], compact, title, dataTestId = "filters-menu", className, showAppliedFiltersCount = true, buttonProps, allowShowFiltersDirectly = true, }) => {
1039
+ const FiltersMenu = ({ filterBarDefinition, filterBarConfig, hiddenFilters = [], compact, title, dataTestId = "filters-menu", className, showAppliedFiltersCount = true, buttonProps, allowShowFiltersDirectly = true, includeFilterKeys, }) => {
1025
1040
  const [t] = useTranslation();
1026
1041
  const { isSm } = useViewportBreakpoints();
1027
1042
  const [showCustomFilters, setShowCustomFilters] = useState(false);
@@ -1030,6 +1045,7 @@ const FiltersMenu = ({ filterBarDefinition, filterBarConfig, hiddenFilters = [],
1030
1045
  filterBarDefinition,
1031
1046
  filterBarConfig,
1032
1047
  hiddenFilters,
1048
+ includeFilterKeys,
1033
1049
  allowShowFiltersDirectly,
1034
1050
  });
1035
1051
  return (jsxs("div", { className: twMerge("flex items-center gap-2", className), "data-testid": dataTestId, children: [jsx(Popover, { onOpenStateChange: open => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trackunit/filters-filter-bar",
3
- "version": "1.3.224",
3
+ "version": "1.3.227",
4
4
  "repository": "https://github.com/Trackunit/manager",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "engines": {
@@ -14,18 +14,18 @@
14
14
  "tailwind-merge": "^2.0.0",
15
15
  "string-ts": "^2.0.0",
16
16
  "zod": "3.23.4",
17
- "@trackunit/iris-app-api": "1.3.138",
18
- "@trackunit/react-core-hooks": "1.3.141",
19
- "@trackunit/react-filter-components": "1.3.183",
20
- "@trackunit/react-date-and-time-components": "1.3.185",
21
- "@trackunit/shared-utils": "1.5.130",
22
- "@trackunit/react-form-components": "1.3.184",
23
- "@trackunit/react-core-contexts-api": "1.4.137",
24
- "@trackunit/geo-json-utils": "1.3.130",
25
- "@trackunit/i18n-library-translation": "1.3.148",
26
- "@trackunit/css-class-variance-utilities": "1.3.130",
27
- "@trackunit/react-components": "1.4.161",
28
- "@trackunit/react-test-setup": "1.0.20"
17
+ "@trackunit/iris-app-api": "1.3.141",
18
+ "@trackunit/react-core-hooks": "1.3.144",
19
+ "@trackunit/react-filter-components": "1.3.185",
20
+ "@trackunit/react-date-and-time-components": "1.3.188",
21
+ "@trackunit/shared-utils": "1.5.132",
22
+ "@trackunit/react-form-components": "1.3.187",
23
+ "@trackunit/react-core-contexts-api": "1.4.139",
24
+ "@trackunit/geo-json-utils": "1.3.132",
25
+ "@trackunit/i18n-library-translation": "1.3.151",
26
+ "@trackunit/css-class-variance-utilities": "1.3.132",
27
+ "@trackunit/react-components": "1.4.163",
28
+ "@trackunit/react-test-setup": "1.0.22"
29
29
  },
30
30
  "module": "./index.esm.js",
31
31
  "main": "./index.cjs.js",
@@ -34,6 +34,10 @@ interface FiltersMenuProps<TFilterBarDefinition extends FilterBarDefinition> ext
34
34
  * The icon props for the filter button to override the icon look and feel.
35
35
  */
36
36
  buttonProps?: ButtonProps;
37
+ /**
38
+ * The filter keys to include in the filter bar, if not defined all filters will be shown.
39
+ */
40
+ includeFilterKeys?: string[];
37
41
  }
38
42
  /**
39
43
  * FilterMenu is a React component that displays a list of filters in a popover menu based on the provided filter bar configuration.
@@ -41,5 +45,5 @@ interface FiltersMenuProps<TFilterBarDefinition extends FilterBarDefinition> ext
41
45
  * @template TFilterBarDefinition - The type representing the filter bar definition.
42
46
  * @returns {ReactElement} - Returns the FilterMenu component.
43
47
  */
44
- export declare const FiltersMenu: <TFilterBarDefinition extends FilterBarDefinition>({ filterBarDefinition, filterBarConfig, hiddenFilters, compact, title, dataTestId, className, showAppliedFiltersCount, buttonProps, allowShowFiltersDirectly, }: FiltersMenuProps<TFilterBarDefinition>) => ReactElement;
48
+ export declare const FiltersMenu: <TFilterBarDefinition extends FilterBarDefinition>({ filterBarDefinition, filterBarConfig, hiddenFilters, compact, title, dataTestId, className, showAppliedFiltersCount, buttonProps, allowShowFiltersDirectly, includeFilterKeys, }: FiltersMenuProps<TFilterBarDefinition>) => ReactElement;
45
49
  export {};
@@ -1,21 +1,22 @@
1
- import { FilterBarConfig, FilterBarDefinition, FilterMapActions, FilterMapGetter } from "../types/FilterTypes";
1
+ import { FilterBarConfig, FilterBarDefinition, FilterDefinition, FilterMapActions, FilterMapGetter } from "../types/FilterTypes";
2
2
  import { GroupOfFilters } from "./useGroupFilters";
3
3
  type UseFiltersMenuProps<TFilterBarDefinition extends FilterBarDefinition> = {
4
4
  filterBarDefinition: TFilterBarDefinition;
5
5
  filterBarConfig: FilterBarConfig<TFilterBarDefinition> & FilterMapActions & FilterMapGetter;
6
6
  hiddenFilters?: string[];
7
7
  allowShowFiltersDirectly?: boolean;
8
+ includeFilterKeys?: string[];
8
9
  };
9
10
  /**
10
11
  * This hook is used to manage the filters menu.
11
12
  * It returns the filters that should be shown in the menu, the filters that should be shown directly in the filter bar,
12
13
  * and the filters that should be shown in the search results.
13
14
  */
14
- export declare const useFiltersMenu: <TFilterBarDefinition extends FilterBarDefinition>({ filterBarDefinition, filterBarConfig, hiddenFilters, allowShowFiltersDirectly, }: UseFiltersMenuProps<TFilterBarDefinition>) => {
15
- appliedFilters: import("../types/FilterTypes").FilterDefinition[];
15
+ export declare const useFiltersMenu: <TFilterBarDefinition extends FilterBarDefinition>({ filterBarDefinition, filterBarConfig, hiddenFilters, allowShowFiltersDirectly, includeFilterKeys, }: UseFiltersMenuProps<TFilterBarDefinition>) => {
16
+ appliedFilters: FilterDefinition[];
16
17
  hasCustomFields: boolean;
17
- showDirectlyFilters: import("../types/FilterTypes").FilterDefinition[];
18
- appliedCustomFields: import("../types/FilterTypes").FilterDefinition[];
18
+ showDirectlyFilters: FilterDefinition[];
19
+ appliedCustomFields: FilterDefinition[];
19
20
  searchText: string;
20
21
  setSearchText: import("react").Dispatch<string>;
21
22
  filtersToShowGrouped: GroupOfFilters[];
@@ -20,8 +20,8 @@ interface UseGroupFiltersReturnType {
20
20
  * Custom React hook for grouping and filtering a list of filters.
21
21
  *
22
22
  * @param {FilterDefinition[]} filterDefinitions - The list of filter definitions to group and filter.
23
- * @param {string[]} hiddenFilters - An array of filter keys representing filters to be hidden.
23
+ * @param {string[]} hiddenFilters - An array of filter keys representing filters to be hidden, if not provided, all filters will be shown
24
24
  * @returns {UseGroupFiltersReturnType} An object containing the grouped filters.
25
25
  */
26
- export declare const useGroupFilters: (filterDefinitions: FilterDefinition[], hiddenFilters: string[]) => UseGroupFiltersReturnType;
26
+ export declare const useGroupFilters: (filterDefinitions: FilterDefinition[], hiddenFilters?: string[]) => UseGroupFiltersReturnType;
27
27
  export {};