@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
|
-
|
|
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
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
|
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.
|
|
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"
|
package/src/lib/FilterBar.d.ts
CHANGED
|
@@ -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";
|