@trackunit/filters-filter-bar 0.0.162 → 0.0.164-alpha-52ec6ef4f8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.cjs.js CHANGED
@@ -4,10 +4,12 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var i18nLibraryTranslation = require('@trackunit/i18n-library-translation');
7
+ var cssClassVarianceUtilities = require('@trackunit/css-class-variance-utilities');
8
+ var reactComponents = require('@trackunit/react-components');
7
9
  var sharedUtils = require('@trackunit/shared-utils');
8
10
  var react = require('react');
11
+ var tailwindMerge = require('tailwind-merge');
9
12
  var reactFilterComponents = require('@trackunit/react-filter-components');
10
- var reactComponents = require('@trackunit/react-components');
11
13
  var reactRouterDom = require('react-router-dom');
12
14
  var reactCoreHooks = require('@trackunit/react-core-hooks');
13
15
  var reactCoreContextsApi = require('@trackunit/react-core-contexts-api');
@@ -395,7 +397,15 @@ const Filter = ({ filter, filterBarActions, filterState, }) => {
395
397
  };
396
398
  const text = filterText();
397
399
  const activeFilterText = Array.isArray(text) ? text.join(", ") : text;
398
- return (jsxRuntime.jsx(reactFilterComponents.Filter, { title: filter.title, dataTestId: `${filter.filterKey}-filter-button`, isActive: filterText().length > 0, activeLabel: activeFilterText, withStickyHeader: true, children: filter.component({
400
+ const showDirectly = filter.showDirectly || false;
401
+ return showDirectly ? (jsxRuntime.jsx(jsxRuntime.Fragment, { children: filter.component({
402
+ filterDefinition: filter,
403
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
404
+ value: values,
405
+ setValue,
406
+ filterBarActions,
407
+ filterState,
408
+ }) })) : (jsxRuntime.jsx(reactFilterComponents.Filter, { title: filter.title, dataTestId: `${filter.filterKey}-filter-button`, isActive: filterText().length > 0, activeLabel: activeFilterText, withStickyHeader: true, children: filter.component({
399
409
  filterDefinition: filter,
400
410
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
401
411
  value: values,
@@ -486,13 +496,30 @@ const StarredFiltersMenu = ({ filterBarDefinition, updateStarredFilters, starred
486
496
  }) }) }) })] }), starredFilterKeys.length > 0 ? jsxRuntime.jsx("div", { className: "h-7 w-[1px] bg-neutral-300" }) : null] }));
487
497
  };
488
498
 
499
+ const cvaCollapserHeader = cssClassVarianceUtilities.cvaMerge(["bg-inherit", "md:hidden"], {
500
+ variants: { expanded: { true: ["w-full", "flex-1", "border-solid"], false: ["max-w-[130px]", "w-auto"] } },
501
+ });
502
+ const cvaCollapse = cssClassVarianceUtilities.cvaMerge(["bg-inherit", "md:hidden"], {
503
+ variants: {
504
+ expanded: { true: "w-full", false: ["max-w-[130px]", "w-auto", "border-transparent"] },
505
+ disableCollapse: { true: "hidden" },
506
+ },
507
+ });
508
+ const cvaFilterWithoutCollapse = cssClassVarianceUtilities.cvaMerge([], {
509
+ variants: { disableCollapse: { true: "flex", false: ["hidden", "md:flex"] } },
510
+ });
489
511
  /**
490
512
  * StarredFilters is a React component that displays a list of starred filters based on the provided filter bar configuration.
491
513
  *
492
514
  * @template TFilterBarDefinition - The type representing the filter bar definition.
493
515
  * @returns {JSX.Element} - Returns the StarredFilters component.
494
516
  */
495
- const StarredFilters = ({ filterBarDefinition, filterBarConfig, hiddenFilters = [], }) => {
517
+ const StarredFilters = ({ filterBarDefinition, filterBarConfig, disableCollapse, hiddenFilters = [], }) => {
518
+ const [expanded, setExpanded] = react.useState(false);
519
+ const [t] = useTranslation();
520
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(reactComponents.Collapse, { id: "storybook_collapsible", headerClassName: cvaCollapserHeader({ expanded }), className: cvaCollapse({ expanded, disableCollapse }), initialExpanded: expanded, onToggle: () => setExpanded(prev => !prev), label: t("filtersBar.filtersHeading") + (filterBarConfig.filtersHaveBeenApplied === true ? " *" : ""), children: jsxRuntime.jsx(FilterSelection, { filterBarConfig: filterBarConfig, filterBarDefinition: filterBarDefinition, hiddenFilters: hiddenFilters, className: "flex" }) }), jsxRuntime.jsx(FilterSelection, { className: cvaFilterWithoutCollapse({ disableCollapse }), filterBarConfig: filterBarConfig, filterBarDefinition: filterBarDefinition, hiddenFilters: hiddenFilters })] }));
521
+ };
522
+ const FilterSelection = ({ filterBarDefinition, filterBarConfig, hiddenFilters = [], className, disableCollapse, }) => {
496
523
  const hideInFilterBar = react.useMemo(() => {
497
524
  return Object.values(filterBarDefinition)
498
525
  .map(filter => {
@@ -505,7 +532,7 @@ const StarredFilters = ({ filterBarDefinition, filterBarConfig, hiddenFilters =
505
532
  ...hideInFilterBar,
506
533
  ...hiddenFilters,
507
534
  ]);
508
- return (jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-3", "data-testid": "starred-filters", children: [jsxRuntime.jsx(StarredFiltersMenu, { hiddenFilters: hiddenFilters, starredFilterKeys: filterBarConfig.starredFilterKeys, filterBarDefinition: filterBarDefinition, updateStarredFilters: filterBarConfig.updateStarredFilters }), filtersGrouped.map(group => group.filters
535
+ return (jsxRuntime.jsxs("div", { className: tailwindMerge.twMerge([className, "flex-wrap", "items-center", "gap-3"]), "data-testid": "starred-filters", children: [jsxRuntime.jsx(StarredFiltersMenu, { hiddenFilters: hiddenFilters, starredFilterKeys: filterBarConfig.starredFilterKeys, filterBarDefinition: filterBarDefinition, updateStarredFilters: filterBarConfig.updateStarredFilters }), filtersGrouped.map(group => group.filters
509
536
  .filter(filter => !hiddenFilters.includes(filter.filterKey))
510
537
  .map(filter => {
511
538
  const showMenuAnyway = filterBarConfig.filterHasChanged(filter.filterKey) &&
@@ -522,8 +549,8 @@ const StarredFilters = ({ filterBarDefinition, filterBarConfig, hiddenFilters =
522
549
  /**
523
550
  * The FilterBar component serves as a wrapper for managing filters.
524
551
  */
525
- const FilterBar = ({ hiddenFilters, className, filterBarDefinition, filterBarConfig, }) => {
526
- return (jsxRuntime.jsx("div", { className: `flex ${className}`, "data-testid": `${filterBarConfig.name}-filterbar`, children: jsxRuntime.jsx(StarredFilters, { hiddenFilters: hiddenFilters, filterBarDefinition: filterBarDefinition, filterBarConfig: filterBarConfig }) }));
552
+ const FilterBar = ({ hiddenFilters, className, filterBarDefinition, filterBarConfig, disableCollapse = false, }) => {
553
+ return (jsxRuntime.jsx("div", { className: `flex ${className}`, "data-testid": `${filterBarConfig.name}-filterbar`, children: jsxRuntime.jsx(StarredFilters, { hiddenFilters: hiddenFilters, filterBarDefinition: filterBarDefinition, filterBarConfig: filterBarConfig, disableCollapse: disableCollapse }) }));
527
554
  };
528
555
 
529
556
  /**
@@ -973,7 +1000,7 @@ const validateFilter = (filter, filterDefinitions) => {
973
1000
  }
974
1001
  }
975
1002
  filterDefinitions.forEach(filterDefinition => {
976
- const foundFilter = filter && filter.values[filterDefinition.filterKey];
1003
+ const foundFilter = (filter === null || filter === void 0 ? void 0 : filter.values) && filter.values[filterDefinition.filterKey];
977
1004
  if (filter) {
978
1005
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
979
1006
  if (foundFilter && hasValue(foundFilter) && isNotRightType(filterDefinition, foundFilter)) {
package/index.esm.js CHANGED
@@ -1,9 +1,11 @@
1
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
1
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
2
  import { registerTranslations, useNamespaceTranslation } from '@trackunit/i18n-library-translation';
3
+ import { cvaMerge } from '@trackunit/css-class-variance-utilities';
4
+ import { Button, Popover, PopoverTrigger, IconButton, Icon, PopoverContent, MenuList, Text, StarButton, Collapse, DayRangePicker } from '@trackunit/react-components';
3
5
  import { truthy, capitalize as capitalize$1, nonNullable } from '@trackunit/shared-utils';
4
- import { useMemo, Fragment as Fragment$1, useCallback, useEffect, useRef, useState } from 'react';
6
+ import { useMemo, useState, Fragment as Fragment$1, useCallback, useEffect, useRef } from 'react';
7
+ import { twMerge } from 'tailwind-merge';
5
8
  import { Filter as Filter$1, FilterBody, RadioFilterItem, CheckBoxFilterItem, FilterHeader as FilterHeader$1, FilterFooter } from '@trackunit/react-filter-components';
6
- import { Button, Popover, PopoverTrigger, IconButton, Icon, PopoverContent, MenuList, Text, StarButton, DayRangePicker } from '@trackunit/react-components';
7
9
  import { useLocation, useNavigate } from 'react-router-dom';
8
10
  import { useAnalytics, useTextSearch } from '@trackunit/react-core-hooks';
9
11
  import { createEvent } from '@trackunit/react-core-contexts-api';
@@ -387,7 +389,15 @@ const Filter = ({ filter, filterBarActions, filterState, }) => {
387
389
  };
388
390
  const text = filterText();
389
391
  const activeFilterText = Array.isArray(text) ? text.join(", ") : text;
390
- return (jsx(Filter$1, { title: filter.title, dataTestId: `${filter.filterKey}-filter-button`, isActive: filterText().length > 0, activeLabel: activeFilterText, withStickyHeader: true, children: filter.component({
392
+ const showDirectly = filter.showDirectly || false;
393
+ return showDirectly ? (jsx(Fragment, { children: filter.component({
394
+ filterDefinition: filter,
395
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
396
+ value: values,
397
+ setValue,
398
+ filterBarActions,
399
+ filterState,
400
+ }) })) : (jsx(Filter$1, { title: filter.title, dataTestId: `${filter.filterKey}-filter-button`, isActive: filterText().length > 0, activeLabel: activeFilterText, withStickyHeader: true, children: filter.component({
391
401
  filterDefinition: filter,
392
402
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
393
403
  value: values,
@@ -478,13 +488,30 @@ const StarredFiltersMenu = ({ filterBarDefinition, updateStarredFilters, starred
478
488
  }) }) }) })] }), starredFilterKeys.length > 0 ? jsx("div", { className: "h-7 w-[1px] bg-neutral-300" }) : null] }));
479
489
  };
480
490
 
491
+ const cvaCollapserHeader = cvaMerge(["bg-inherit", "md:hidden"], {
492
+ variants: { expanded: { true: ["w-full", "flex-1", "border-solid"], false: ["max-w-[130px]", "w-auto"] } },
493
+ });
494
+ const cvaCollapse = cvaMerge(["bg-inherit", "md:hidden"], {
495
+ variants: {
496
+ expanded: { true: "w-full", false: ["max-w-[130px]", "w-auto", "border-transparent"] },
497
+ disableCollapse: { true: "hidden" },
498
+ },
499
+ });
500
+ const cvaFilterWithoutCollapse = cvaMerge([], {
501
+ variants: { disableCollapse: { true: "flex", false: ["hidden", "md:flex"] } },
502
+ });
481
503
  /**
482
504
  * StarredFilters is a React component that displays a list of starred filters based on the provided filter bar configuration.
483
505
  *
484
506
  * @template TFilterBarDefinition - The type representing the filter bar definition.
485
507
  * @returns {JSX.Element} - Returns the StarredFilters component.
486
508
  */
487
- const StarredFilters = ({ filterBarDefinition, filterBarConfig, hiddenFilters = [], }) => {
509
+ const StarredFilters = ({ filterBarDefinition, filterBarConfig, disableCollapse, hiddenFilters = [], }) => {
510
+ const [expanded, setExpanded] = useState(false);
511
+ const [t] = useTranslation();
512
+ return (jsxs(Fragment, { children: [jsx(Collapse, { id: "storybook_collapsible", headerClassName: cvaCollapserHeader({ expanded }), className: cvaCollapse({ expanded, disableCollapse }), initialExpanded: expanded, onToggle: () => setExpanded(prev => !prev), label: t("filtersBar.filtersHeading") + (filterBarConfig.filtersHaveBeenApplied === true ? " *" : ""), children: jsx(FilterSelection, { filterBarConfig: filterBarConfig, filterBarDefinition: filterBarDefinition, hiddenFilters: hiddenFilters, className: "flex" }) }), jsx(FilterSelection, { className: cvaFilterWithoutCollapse({ disableCollapse }), filterBarConfig: filterBarConfig, filterBarDefinition: filterBarDefinition, hiddenFilters: hiddenFilters })] }));
513
+ };
514
+ const FilterSelection = ({ filterBarDefinition, filterBarConfig, hiddenFilters = [], className, disableCollapse, }) => {
488
515
  const hideInFilterBar = useMemo(() => {
489
516
  return Object.values(filterBarDefinition)
490
517
  .map(filter => {
@@ -497,7 +524,7 @@ const StarredFilters = ({ filterBarDefinition, filterBarConfig, hiddenFilters =
497
524
  ...hideInFilterBar,
498
525
  ...hiddenFilters,
499
526
  ]);
500
- return (jsxs("div", { className: "flex flex-wrap items-center gap-3", "data-testid": "starred-filters", children: [jsx(StarredFiltersMenu, { hiddenFilters: hiddenFilters, starredFilterKeys: filterBarConfig.starredFilterKeys, filterBarDefinition: filterBarDefinition, updateStarredFilters: filterBarConfig.updateStarredFilters }), filtersGrouped.map(group => group.filters
527
+ return (jsxs("div", { className: twMerge([className, "flex-wrap", "items-center", "gap-3"]), "data-testid": "starred-filters", children: [jsx(StarredFiltersMenu, { hiddenFilters: hiddenFilters, starredFilterKeys: filterBarConfig.starredFilterKeys, filterBarDefinition: filterBarDefinition, updateStarredFilters: filterBarConfig.updateStarredFilters }), filtersGrouped.map(group => group.filters
501
528
  .filter(filter => !hiddenFilters.includes(filter.filterKey))
502
529
  .map(filter => {
503
530
  const showMenuAnyway = filterBarConfig.filterHasChanged(filter.filterKey) &&
@@ -514,8 +541,8 @@ const StarredFilters = ({ filterBarDefinition, filterBarConfig, hiddenFilters =
514
541
  /**
515
542
  * The FilterBar component serves as a wrapper for managing filters.
516
543
  */
517
- const FilterBar = ({ hiddenFilters, className, filterBarDefinition, filterBarConfig, }) => {
518
- return (jsx("div", { className: `flex ${className}`, "data-testid": `${filterBarConfig.name}-filterbar`, children: jsx(StarredFilters, { hiddenFilters: hiddenFilters, filterBarDefinition: filterBarDefinition, filterBarConfig: filterBarConfig }) }));
544
+ const FilterBar = ({ hiddenFilters, className, filterBarDefinition, filterBarConfig, disableCollapse = false, }) => {
545
+ return (jsx("div", { className: `flex ${className}`, "data-testid": `${filterBarConfig.name}-filterbar`, children: jsx(StarredFilters, { hiddenFilters: hiddenFilters, filterBarDefinition: filterBarDefinition, filterBarConfig: filterBarConfig, disableCollapse: disableCollapse }) }));
519
546
  };
520
547
 
521
548
  /**
@@ -965,7 +992,7 @@ const validateFilter = (filter, filterDefinitions) => {
965
992
  }
966
993
  }
967
994
  filterDefinitions.forEach(filterDefinition => {
968
- const foundFilter = filter && filter.values[filterDefinition.filterKey];
995
+ const foundFilter = (filter === null || filter === void 0 ? void 0 : filter.values) && filter.values[filterDefinition.filterKey];
969
996
  if (filter) {
970
997
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
971
998
  if (foundFilter && hasValue(foundFilter) && isNotRightType(filterDefinition, foundFilter)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trackunit/filters-filter-bar",
3
- "version": "0.0.162",
3
+ "version": "0.0.164-alpha-52ec6ef4f8.0",
4
4
  "repository": "https://github.com/Trackunit/manager",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "engines": {
@@ -19,7 +19,9 @@
19
19
  "jest-fetch-mock": "^3.0.3",
20
20
  "@trackunit/react-core-contexts-api": "*",
21
21
  "@trackunit/i18n-library-translation": "*",
22
- "@tanstack/react-virtual": "3.0.0-beta.68"
22
+ "@tanstack/react-virtual": "3.0.0-beta.68",
23
+ "@trackunit/css-class-variance-utilities": "*",
24
+ "tailwind-merge": "^2.0.0"
23
25
  },
24
26
  "module": "./index.esm.js",
25
27
  "main": "./index.cjs.js"
@@ -19,9 +19,13 @@ interface FilterBarProps<TFilterBarDefinition extends FilterBarDefinition> {
19
19
  * @see FilterBarConfig
20
20
  */
21
21
  filterBarConfig: FilterBarConfig<TFilterBarDefinition> & FilterMapActions & FilterMapGetter;
22
+ /**
23
+ * If you want to disable the collapse functionality - if you filter only have 1 or 2 filters and it can fit on mobile screens.
24
+ */
25
+ disableCollapse?: boolean;
22
26
  }
23
27
  /**
24
28
  * The FilterBar component serves as a wrapper for managing filters.
25
29
  */
26
- export declare const FilterBar: <TFilterBarDefinition extends FilterBarDefinition>({ hiddenFilters, className, filterBarDefinition, filterBarConfig, }: FilterBarProps<TFilterBarDefinition>) => JSX.Element;
30
+ export declare const FilterBar: <TFilterBarDefinition extends FilterBarDefinition>({ hiddenFilters, className, filterBarDefinition, filterBarConfig, disableCollapse, }: FilterBarProps<TFilterBarDefinition>) => JSX.Element;
27
31
  export {};
@@ -13,6 +13,10 @@ interface StarredFiltersProps<TFilterBarDefinition extends FilterBarDefinition>
13
13
  * If you want some of the filters to be hidden, but still programmatically enabled
14
14
  */
15
15
  hiddenFilters?: string[];
16
+ /**
17
+ * If you want to disable the collapse functionality - if you filter only have 1 or 2 filters and it can fit on mobile screens.
18
+ */
19
+ disableCollapse?: boolean;
16
20
  }
17
21
  /**
18
22
  * StarredFilters is a React component that displays a list of starred filters based on the provided filter bar configuration.
@@ -20,5 +24,5 @@ interface StarredFiltersProps<TFilterBarDefinition extends FilterBarDefinition>
20
24
  * @template TFilterBarDefinition - The type representing the filter bar definition.
21
25
  * @returns {JSX.Element} - Returns the StarredFilters component.
22
26
  */
23
- export declare const StarredFilters: <TFilterBarDefinition extends FilterBarDefinition>({ filterBarDefinition, filterBarConfig, hiddenFilters, }: StarredFiltersProps<TFilterBarDefinition>) => JSX.Element;
27
+ export declare const StarredFilters: <TFilterBarDefinition extends FilterBarDefinition>({ filterBarDefinition, filterBarConfig, disableCollapse, hiddenFilters, }: StarredFiltersProps<TFilterBarDefinition>) => JSX.Element;
24
28
  export {};
@@ -86,6 +86,10 @@ export interface AbstractFilterDefinition {
86
86
  * A function that determines if the filter should be displayed in the filter bar.
87
87
  */
88
88
  showInFilterBar?: () => boolean;
89
+ /**
90
+ * A boolean that determines if the filter should be displayed in the filter bar without a menu, like a search field.
91
+ */
92
+ showDirectly?: boolean;
89
93
  }
90
94
  export interface BooleanFilterDefinition extends AbstractFilterDefinition {
91
95
  type: "boolean";