@j2-health/design-system 0.2.0 → 0.3.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/README.md +38 -9
- package/dist/index.cjs +102 -3614
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +54 -3551
- package/dist/index.js.map +1 -1
- package/dist/src/AppConfigProvider.cjs +13 -0
- package/dist/src/AppConfigProvider.cjs.map +1 -0
- package/dist/src/AppConfigProvider.js +13 -0
- package/dist/src/AppConfigProvider.js.map +1 -0
- package/dist/src/appTheme.cjs +268 -0
- package/dist/src/appTheme.cjs.map +1 -0
- package/dist/src/appTheme.js +268 -0
- package/dist/src/appTheme.js.map +1 -0
- package/dist/src/components/alert/Alert.cjs +95 -0
- package/dist/src/components/alert/Alert.cjs.map +1 -0
- package/dist/src/components/alert/Alert.js +78 -0
- package/dist/src/components/alert/Alert.js.map +1 -0
- package/dist/src/components/alert/Alert.module.css.cjs +9 -0
- package/dist/src/components/alert/Alert.module.css.cjs.map +1 -0
- package/dist/src/components/alert/Alert.module.css.js +9 -0
- package/dist/src/components/alert/Alert.module.css.js.map +1 -0
- package/dist/src/components/barchart/BarChart.cjs +155 -0
- package/dist/src/components/barchart/BarChart.cjs.map +1 -0
- package/dist/src/components/barchart/BarChart.js +155 -0
- package/dist/src/components/barchart/BarChart.js.map +1 -0
- package/dist/src/components/barchart/chart.module.css.cjs +9 -0
- package/dist/src/components/barchart/chart.module.css.cjs.map +1 -0
- package/dist/src/components/barchart/chart.module.css.js +9 -0
- package/dist/src/components/barchart/chart.module.css.js.map +1 -0
- package/dist/src/components/breadcrumb/Breadcrumb.cjs +38 -0
- package/dist/src/components/breadcrumb/Breadcrumb.cjs.map +1 -0
- package/dist/src/components/breadcrumb/Breadcrumb.js +21 -0
- package/dist/src/components/breadcrumb/Breadcrumb.js.map +1 -0
- package/dist/src/components/bulkActionBar/BulkActionBar.cjs +81 -0
- package/dist/src/components/bulkActionBar/BulkActionBar.cjs.map +1 -0
- package/dist/src/components/bulkActionBar/BulkActionBar.js +81 -0
- package/dist/src/components/bulkActionBar/BulkActionBar.js.map +1 -0
- package/dist/src/components/button/Button.cjs +21 -0
- package/dist/src/components/button/Button.cjs.map +1 -0
- package/dist/src/components/button/Button.js +21 -0
- package/dist/src/components/button/Button.js.map +1 -0
- package/dist/src/components/card/Card.cjs +36 -0
- package/dist/src/components/card/Card.cjs.map +1 -0
- package/dist/src/components/card/Card.js +36 -0
- package/dist/src/components/card/Card.js.map +1 -0
- package/dist/src/components/checkbox/Checkbox.cjs +10 -0
- package/dist/src/components/checkbox/Checkbox.cjs.map +1 -0
- package/dist/src/components/checkbox/Checkbox.js +10 -0
- package/dist/src/components/checkbox/Checkbox.js.map +1 -0
- package/dist/src/components/checkboxTree/CheckboxTree.cjs +140 -0
- package/dist/src/components/checkboxTree/CheckboxTree.cjs.map +1 -0
- package/dist/src/components/checkboxTree/CheckboxTree.js +140 -0
- package/dist/src/components/checkboxTree/CheckboxTree.js.map +1 -0
- package/dist/src/components/checkboxTree/TreeNode.cjs +92 -0
- package/dist/src/components/checkboxTree/TreeNode.cjs.map +1 -0
- package/dist/src/components/checkboxTree/TreeNode.js +92 -0
- package/dist/src/components/checkboxTree/TreeNode.js.map +1 -0
- package/dist/src/components/checkboxTree/utils.cjs +59 -0
- package/dist/src/components/checkboxTree/utils.cjs.map +1 -0
- package/dist/src/components/checkboxTree/utils.js +59 -0
- package/dist/src/components/checkboxTree/utils.js.map +1 -0
- package/dist/src/components/collapse/Collapse.cjs +81 -0
- package/dist/src/components/collapse/Collapse.cjs.map +1 -0
- package/dist/src/components/collapse/Collapse.js +64 -0
- package/dist/src/components/collapse/Collapse.js.map +1 -0
- package/dist/src/components/collapse/Collapse.module.css.cjs +13 -0
- package/dist/src/components/collapse/Collapse.module.css.cjs.map +1 -0
- package/dist/src/components/collapse/Collapse.module.css.js +13 -0
- package/dist/src/components/collapse/Collapse.module.css.js.map +1 -0
- package/dist/src/components/drawer/Drawer.cjs +39 -0
- package/dist/src/components/drawer/Drawer.cjs.map +1 -0
- package/dist/src/components/drawer/Drawer.js +39 -0
- package/dist/src/components/drawer/Drawer.js.map +1 -0
- package/dist/src/components/dropdown/Dropdown.cjs +58 -0
- package/dist/src/components/dropdown/Dropdown.cjs.map +1 -0
- package/dist/src/components/dropdown/Dropdown.js +58 -0
- package/dist/src/components/dropdown/Dropdown.js.map +1 -0
- package/dist/src/components/filterform/FilterGroup.cjs +64 -0
- package/dist/src/components/filterform/FilterGroup.cjs.map +1 -0
- package/dist/src/components/filterform/FilterGroup.js +64 -0
- package/dist/src/components/filterform/FilterGroup.js.map +1 -0
- package/dist/src/components/filterform/FilterInput.cjs +238 -0
- package/dist/src/components/filterform/FilterInput.cjs.map +1 -0
- package/dist/src/components/filterform/FilterInput.d.ts +1 -0
- package/dist/src/components/filterform/FilterInput.js +221 -0
- package/dist/src/components/filterform/FilterInput.js.map +1 -0
- package/dist/src/components/filterform/FiltersForm.cjs +168 -0
- package/dist/src/components/filterform/FiltersForm.cjs.map +1 -0
- package/dist/src/components/filterform/FiltersForm.js +168 -0
- package/dist/src/components/filterform/FiltersForm.js.map +1 -0
- package/dist/src/components/filterform/FiltersForm.module.css.cjs +21 -0
- package/dist/src/components/filterform/FiltersForm.module.css.cjs.map +1 -0
- package/dist/src/components/filterform/FiltersForm.module.css.js +21 -0
- package/dist/src/components/filterform/FiltersForm.module.css.js.map +1 -0
- package/dist/src/components/filterform/filterHelpers.cjs +71 -0
- package/dist/src/components/filterform/filterHelpers.cjs.map +1 -0
- package/dist/src/components/filterform/filterHelpers.d.ts +18 -4
- package/dist/src/components/filterform/filterHelpers.js +71 -0
- package/dist/src/components/filterform/filterHelpers.js.map +1 -0
- package/dist/src/components/filterform/index.d.ts +3 -1
- package/dist/src/components/filterform/types.d.ts +4 -2
- package/dist/src/components/filterform/useFilterField.cjs +245 -0
- package/dist/src/components/filterform/useFilterField.cjs.map +1 -0
- package/dist/src/components/filterform/useFilterField.d.ts +17 -1
- package/dist/src/components/filterform/useFilterField.js +228 -0
- package/dist/src/components/filterform/useFilterField.js.map +1 -0
- package/dist/src/components/filterform/useFiltersForm.cjs +160 -0
- package/dist/src/components/filterform/useFiltersForm.cjs.map +1 -0
- package/dist/src/components/filterform/useFiltersForm.js +160 -0
- package/dist/src/components/filterform/useFiltersForm.js.map +1 -0
- package/dist/src/components/form/Form.cjs +11 -0
- package/dist/src/components/form/Form.cjs.map +1 -0
- package/dist/src/components/form/Form.js +11 -0
- package/dist/src/components/form/Form.js.map +1 -0
- package/dist/src/components/icons/index.cjs +27 -0
- package/dist/src/components/icons/index.cjs.map +1 -0
- package/dist/src/components/icons/index.js +3 -0
- package/dist/src/components/icons/index.js.map +1 -0
- package/dist/src/components/input/AntdInput.cjs +13 -0
- package/dist/src/components/input/AntdInput.cjs.map +1 -0
- package/dist/src/components/input/AntdInput.js +13 -0
- package/dist/src/components/input/AntdInput.js.map +1 -0
- package/dist/src/components/input/AntdSearchInput.cjs +13 -0
- package/dist/src/components/input/AntdSearchInput.cjs.map +1 -0
- package/dist/src/components/input/AntdSearchInput.js +13 -0
- package/dist/src/components/input/AntdSearchInput.js.map +1 -0
- package/dist/src/components/input/Input.cjs +9 -0
- package/dist/src/components/input/Input.cjs.map +1 -0
- package/dist/src/components/input/Input.js +9 -0
- package/dist/src/components/input/Input.js.map +1 -0
- package/dist/src/components/inputnumber/InputNumber.cjs +32 -0
- package/dist/src/components/inputnumber/InputNumber.cjs.map +1 -0
- package/dist/src/components/inputnumber/InputNumber.js +32 -0
- package/dist/src/components/inputnumber/InputNumber.js.map +1 -0
- package/dist/src/components/inputnumber/InputNumber.module.css.cjs +9 -0
- package/dist/src/components/inputnumber/InputNumber.module.css.cjs.map +1 -0
- package/dist/src/components/inputnumber/InputNumber.module.css.js +9 -0
- package/dist/src/components/inputnumber/InputNumber.module.css.js.map +1 -0
- package/dist/src/components/legacyNavMenu/LegacyNavMenu.cjs +52 -0
- package/dist/src/components/legacyNavMenu/LegacyNavMenu.cjs.map +1 -0
- package/dist/src/components/legacyNavMenu/LegacyNavMenu.js +52 -0
- package/dist/src/components/legacyNavMenu/LegacyNavMenu.js.map +1 -0
- package/dist/src/components/legacyNavMenu/LegacyNavMenu.module.css.cjs +48 -0
- package/dist/src/components/legacyNavMenu/LegacyNavMenu.module.css.cjs.map +1 -0
- package/dist/src/components/legacyNavMenu/LegacyNavMenu.module.css.js +48 -0
- package/dist/src/components/legacyNavMenu/LegacyNavMenu.module.css.js.map +1 -0
- package/dist/src/components/legacyNavMenu/UserProfile.cjs +78 -0
- package/dist/src/components/legacyNavMenu/UserProfile.cjs.map +1 -0
- package/dist/src/components/legacyNavMenu/UserProfile.js +78 -0
- package/dist/src/components/legacyNavMenu/UserProfile.js.map +1 -0
- package/dist/src/components/legacyNavMenu/UserProfile.module.css.cjs +42 -0
- package/dist/src/components/legacyNavMenu/UserProfile.module.css.cjs.map +1 -0
- package/dist/src/components/legacyNavMenu/UserProfile.module.css.js +42 -0
- package/dist/src/components/legacyNavMenu/UserProfile.module.css.js.map +1 -0
- package/dist/src/components/listpopover/ListPopover.cjs +125 -0
- package/dist/src/components/listpopover/ListPopover.cjs.map +1 -0
- package/dist/src/components/listpopover/ListPopover.js +125 -0
- package/dist/src/components/listpopover/ListPopover.js.map +1 -0
- package/dist/src/components/listpopover/ListPopover.module.css.cjs +9 -0
- package/dist/src/components/listpopover/ListPopover.module.css.cjs.map +1 -0
- package/dist/src/components/listpopover/ListPopover.module.css.js +9 -0
- package/dist/src/components/listpopover/ListPopover.module.css.js.map +1 -0
- package/dist/src/components/menu/Menu.cjs +18 -0
- package/dist/src/components/menu/Menu.cjs.map +1 -0
- package/dist/src/components/menu/Menu.js +18 -0
- package/dist/src/components/menu/Menu.js.map +1 -0
- package/dist/src/components/menu/Menu.module.css.cjs +12 -0
- package/dist/src/components/menu/Menu.module.css.cjs.map +1 -0
- package/dist/src/components/menu/Menu.module.css.js +12 -0
- package/dist/src/components/menu/Menu.module.css.js.map +1 -0
- package/dist/src/components/message/Message.module.css.cjs +9 -0
- package/dist/src/components/message/Message.module.css.cjs.map +1 -0
- package/dist/src/components/message/Message.module.css.js +9 -0
- package/dist/src/components/message/Message.module.css.js.map +1 -0
- package/dist/src/components/message/useMessage.cjs +55 -0
- package/dist/src/components/message/useMessage.cjs.map +1 -0
- package/dist/src/components/message/useMessage.js +55 -0
- package/dist/src/components/message/useMessage.js.map +1 -0
- package/dist/src/components/modal/Modal.cjs +32 -0
- package/dist/src/components/modal/Modal.cjs.map +1 -0
- package/dist/src/components/modal/Modal.js +32 -0
- package/dist/src/components/modal/Modal.js.map +1 -0
- package/dist/src/components/navMenu/NavMenu.cjs +132 -0
- package/dist/src/components/navMenu/NavMenu.cjs.map +1 -0
- package/dist/src/components/navMenu/NavMenu.js +115 -0
- package/dist/src/components/navMenu/NavMenu.js.map +1 -0
- package/dist/src/components/navMenu/NavMenu.module.css.cjs +18 -0
- package/dist/src/components/navMenu/NavMenu.module.css.cjs.map +1 -0
- package/dist/src/components/navMenu/NavMenu.module.css.js +18 -0
- package/dist/src/components/navMenu/NavMenu.module.css.js.map +1 -0
- package/dist/src/components/notification/Notification.module.css.cjs +9 -0
- package/dist/src/components/notification/Notification.module.css.cjs.map +1 -0
- package/dist/src/components/notification/Notification.module.css.js +9 -0
- package/dist/src/components/notification/Notification.module.css.js.map +1 -0
- package/dist/src/components/notification/useNotification.cjs +52 -0
- package/dist/src/components/notification/useNotification.cjs.map +1 -0
- package/dist/src/components/notification/useNotification.js +52 -0
- package/dist/src/components/notification/useNotification.js.map +1 -0
- package/dist/src/components/notificationModal/NotifcationModal.module.css.cjs +21 -0
- package/dist/src/components/notificationModal/NotifcationModal.module.css.cjs.map +1 -0
- package/dist/src/components/notificationModal/NotifcationModal.module.css.js +21 -0
- package/dist/src/components/notificationModal/NotifcationModal.module.css.js.map +1 -0
- package/dist/src/components/notificationModal/NotificationModal.cjs +57 -0
- package/dist/src/components/notificationModal/NotificationModal.cjs.map +1 -0
- package/dist/src/components/notificationModal/NotificationModal.js +57 -0
- package/dist/src/components/notificationModal/NotificationModal.js.map +1 -0
- package/dist/src/components/pagination/Pagination.cjs +65 -0
- package/dist/src/components/pagination/Pagination.cjs.map +1 -0
- package/dist/src/components/pagination/Pagination.js +65 -0
- package/dist/src/components/pagination/Pagination.js.map +1 -0
- package/dist/src/components/pagination/Pagination.module.css.cjs +6 -0
- package/dist/src/components/pagination/Pagination.module.css.cjs.map +1 -0
- package/dist/src/components/pagination/Pagination.module.css.js +7 -0
- package/dist/src/components/pagination/Pagination.module.css.js.map +1 -0
- package/dist/src/components/popover/Popover.cjs +41 -0
- package/dist/src/components/popover/Popover.cjs.map +1 -0
- package/dist/src/components/popover/Popover.js +41 -0
- package/dist/src/components/popover/Popover.js.map +1 -0
- package/dist/src/components/popover/Popover.module.css.cjs +33 -0
- package/dist/src/components/popover/Popover.module.css.cjs.map +1 -0
- package/dist/src/components/popover/Popover.module.css.js +33 -0
- package/dist/src/components/popover/Popover.module.css.js.map +1 -0
- package/dist/src/components/progress/Progress.cjs +9 -0
- package/dist/src/components/progress/Progress.cjs.map +1 -0
- package/dist/src/components/progress/Progress.js +9 -0
- package/dist/src/components/progress/Progress.js.map +1 -0
- package/dist/src/components/radio/Radio.cjs +24 -0
- package/dist/src/components/radio/Radio.cjs.map +1 -0
- package/dist/src/components/radio/Radio.js +24 -0
- package/dist/src/components/radio/Radio.js.map +1 -0
- package/dist/src/components/rate/Rate.cjs +22 -0
- package/dist/src/components/rate/Rate.cjs.map +1 -0
- package/dist/src/components/rate/Rate.js +22 -0
- package/dist/src/components/rate/Rate.js.map +1 -0
- package/dist/src/components/select/AntdSelect.cjs +76 -0
- package/dist/src/components/select/AntdSelect.cjs.map +1 -0
- package/dist/src/components/select/AntdSelect.js +60 -0
- package/dist/src/components/select/AntdSelect.js.map +1 -0
- package/dist/src/components/select/Select.cjs +107 -0
- package/dist/src/components/select/Select.cjs.map +1 -0
- package/dist/src/components/select/Select.js +107 -0
- package/dist/src/components/select/Select.js.map +1 -0
- package/dist/src/components/select/SummarizedSelect.cjs +455 -0
- package/dist/src/components/select/SummarizedSelect.cjs.map +1 -0
- package/dist/src/components/select/SummarizedSelect.js +455 -0
- package/dist/src/components/select/SummarizedSelect.js.map +1 -0
- package/dist/src/components/select/SummarizedSelect.module.css.cjs +30 -0
- package/dist/src/components/select/SummarizedSelect.module.css.cjs.map +1 -0
- package/dist/src/components/select/SummarizedSelect.module.css.js +30 -0
- package/dist/src/components/select/SummarizedSelect.module.css.js.map +1 -0
- package/dist/src/components/skeleton/Skeleton.cjs +14 -0
- package/dist/src/components/skeleton/Skeleton.cjs.map +1 -0
- package/dist/src/components/skeleton/Skeleton.js +14 -0
- package/dist/src/components/skeleton/Skeleton.js.map +1 -0
- package/dist/src/components/spinner/Spinner.cjs +20 -0
- package/dist/src/components/spinner/Spinner.cjs.map +1 -0
- package/dist/src/components/spinner/Spinner.js +20 -0
- package/dist/src/components/spinner/Spinner.js.map +1 -0
- package/dist/src/components/steps/Steps.cjs +50 -0
- package/dist/src/components/steps/Steps.cjs.map +1 -0
- package/dist/src/components/steps/Steps.js +50 -0
- package/dist/src/components/steps/Steps.js.map +1 -0
- package/dist/src/components/steps/useSteps.cjs +56 -0
- package/dist/src/components/steps/useSteps.cjs.map +1 -0
- package/dist/src/components/steps/useSteps.js +56 -0
- package/dist/src/components/steps/useSteps.js.map +1 -0
- package/dist/src/components/switch/Switch.cjs +28 -0
- package/dist/src/components/switch/Switch.cjs.map +1 -0
- package/dist/src/components/switch/Switch.js +28 -0
- package/dist/src/components/switch/Switch.js.map +1 -0
- package/dist/src/components/table/Table.cjs +117 -0
- package/dist/src/components/table/Table.cjs.map +1 -0
- package/dist/src/components/table/Table.js +117 -0
- package/dist/src/components/table/Table.js.map +1 -0
- package/dist/src/components/table/Table.module.css.cjs +12 -0
- package/dist/src/components/table/Table.module.css.cjs.map +1 -0
- package/dist/src/components/table/Table.module.css.js +12 -0
- package/dist/src/components/table/Table.module.css.js.map +1 -0
- package/dist/src/components/tabs/Tabs.cjs +10 -0
- package/dist/src/components/tabs/Tabs.cjs.map +1 -0
- package/dist/src/components/tabs/Tabs.js +10 -0
- package/dist/src/components/tabs/Tabs.js.map +1 -0
- package/dist/src/components/tag/Tag.cjs +74 -0
- package/dist/src/components/tag/Tag.cjs.map +1 -0
- package/dist/src/components/tag/Tag.js +57 -0
- package/dist/src/components/tag/Tag.js.map +1 -0
- package/dist/src/components/tooltip/Tooltip.cjs +14 -0
- package/dist/src/components/tooltip/Tooltip.cjs.map +1 -0
- package/dist/src/components/tooltip/Tooltip.js +14 -0
- package/dist/src/components/tooltip/Tooltip.js.map +1 -0
- package/dist/src/components/vennDiagram/VennDiagram.cjs +53 -0
- package/dist/src/components/vennDiagram/VennDiagram.cjs.map +1 -0
- package/dist/src/components/vennDiagram/VennDiagram.js +53 -0
- package/dist/src/components/vennDiagram/VennDiagram.js.map +1 -0
- package/dist/src/svgs/ProgressCircle.svg.cjs +22 -0
- package/dist/src/svgs/ProgressCircle.svg.cjs.map +1 -0
- package/dist/src/svgs/ProgressCircle.svg.js +6 -0
- package/dist/src/svgs/ProgressCircle.svg.js.map +1 -0
- package/dist/src/svgs/j2-logo-menu-collapse.svg.cjs +22 -0
- package/dist/src/svgs/j2-logo-menu-collapse.svg.cjs.map +1 -0
- package/dist/src/svgs/j2-logo-menu-collapse.svg.js +6 -0
- package/dist/src/svgs/j2-logo-menu-collapse.svg.js.map +1 -0
- package/dist/src/svgs/j2-logo-menu.svg.cjs +22 -0
- package/dist/src/svgs/j2-logo-menu.svg.cjs.map +1 -0
- package/dist/src/svgs/j2-logo-menu.svg.js +6 -0
- package/dist/src/svgs/j2-logo-menu.svg.js.map +1 -0
- package/dist/src/svgs/menu-sidebar-collapse.svg.cjs +22 -0
- package/dist/src/svgs/menu-sidebar-collapse.svg.cjs.map +1 -0
- package/dist/src/svgs/menu-sidebar-collapse.svg.js +6 -0
- package/dist/src/svgs/menu-sidebar-collapse.svg.js.map +1 -0
- package/dist/src/svgs/menu-sidebar-expand.svg.cjs +22 -0
- package/dist/src/svgs/menu-sidebar-expand.svg.cjs.map +1 -0
- package/dist/src/svgs/menu-sidebar-expand.svg.js +6 -0
- package/dist/src/svgs/menu-sidebar-expand.svg.js.map +1 -0
- package/dist/style.css +646 -646
- package/package.json +6 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FiltersForm.js","sources":["../../../../src/components/filterform/FiltersForm.tsx"],"sourcesContent":["import { Button } from '../button'\nimport { PlusCircleIcon, TrashIcon } from '@phosphor-icons/react'\nimport s from './FiltersForm.module.css'\nimport cx from 'classnames'\nimport { FilterForm, FilterConfig } from '.'\nimport { isEmptyFilter, isFilter } from './filterHelpers'\nimport { useMemo } from 'react'\nimport { FilterInput } from './FilterInput'\nimport { useFiltersForm } from './useFiltersForm'\nimport { FilterGroup } from './FilterGroup'\n\ntype Props = {\n filterConfigs: FilterConfig[]\n title?: string\n onSubmit: (values: FilterForm) => void\n initialValues?: FilterForm\n maxFiltersPerField?: number\n}\n\nexport const FiltersForm = ({\n title,\n filterConfigs,\n onSubmit,\n initialValues,\n maxFiltersPerField = 5,\n}: Props) => {\n const { dispatch, filterGroups, isNewFilterInputOpen, isValid, isEmpty } =\n useFiltersForm({\n initialValues,\n })\n\n const handleSubmit = () => {\n onSubmit({\n filters: filterGroups\n .flatMap((group) => group.filters)\n .filter((filter) => isFilter(filter))\n .filter((filter) => !isEmptyFilter(filter)),\n })\n }\n\n const availableFilterConfigs = useMemo(() => {\n const filterFieldCounts = filterGroups.reduce(\n (acc, filterGroup) => {\n acc[filterGroup.field] = filterGroup.filters.length\n return acc\n },\n {} as Record<string, number>\n )\n\n return filterConfigs.map((config) => ({\n ...config,\n disabled: (filterFieldCounts[config.field] || 0) >= maxFiltersPerField,\n }))\n }, [\n filterConfigs,\n filterGroups.map((g) => `${g.field}-${g.filters.length}`).join(','),\n maxFiltersPerField,\n ])\n\n return (\n <div className={cx(s.j2FilterForm)}>\n <div\n className={cx(\n s.filterFormFieldsContainer,\n 'flex flex-col gap-4',\n 'p-4 mb-6'\n )}\n >\n {title && <span className={s.filterFormTitle}>{title}</span>}\n {filterGroups.map((filterGroup, groupIndex) => (\n <div\n key={`filter-group-${filterGroup.field}-${filterGroup.filters.length}`}\n className={cx('flex gap-3', {\n 'items-center': filterGroup.filters.length === 1,\n })}\n >\n {groupIndex > 0 ? (\n <span\n className={cx(s.filterFormConjunction, {\n 'pt-4': filterGroup.filters.length > 1,\n })}\n >\n and\n </span>\n ) : null}\n <FilterGroup\n filterGroup={filterGroup}\n groupIndex={groupIndex}\n filterConfigs={availableFilterConfigs}\n className=\"grow\"\n onChange={(filter, filterIndex) => {\n dispatch({\n type: 'changeFilter',\n payload: { groupIndex, filterIndex, filter },\n })\n }}\n onDone={(filter, filterIndex) => {\n dispatch({\n type: 'updateFilter',\n payload: { groupIndex, filterIndex, filter },\n })\n }}\n onRemove={(filterIndex) => {\n dispatch({\n type: 'removeFilter',\n payload: { groupIndex, filterIndex },\n })\n }}\n />\n </div>\n ))}\n {isNewFilterInputOpen && (\n <div className={cx('flex gap-3 items-center')}>\n {filterGroups.length > 0 ? (\n <span className={cx(s.filterFormConjunction)}>and</span>\n ) : null}\n <div className={cx('flex items-center justify-between', 'grow')}>\n <FilterInput\n key={JSON.stringify(filterGroups)}\n filterConfigs={availableFilterConfigs}\n className=\"flex-1\"\n onChange={(filter) => {\n dispatch({ type: 'changeNewFilter', payload: filter })\n }}\n onBlur={(filter) => {\n dispatch({ type: 'addNewFilter', payload: filter })\n }}\n />\n <div className=\"mr-3\">\n {filterGroups.length > 0 ? (\n <Button\n type=\"text\"\n icon={<TrashIcon />}\n onClick={() => dispatch({ type: 'removeNewFilter' })}\n />\n ) : (\n <div className=\"w-8\" />\n )}\n </div>\n </div>\n </div>\n )}\n <div className=\"flex items-center\">\n <Button\n icon={<PlusCircleIcon />}\n onClick={() => dispatch({ type: 'openNewFilterInput' })}\n disabled={!isValid}\n >\n Add Rule\n </Button>\n <Button\n type=\"text\"\n onClick={() => {\n dispatch({\n type: 'clearAllFilters',\n })\n }}\n >\n Clear All Rules\n </Button>\n </div>\n </div>\n <div className=\"flex justify-end\">\n <Button\n onClick={handleSubmit}\n type=\"primary\"\n disabled={isEmpty ? false : !isValid}\n >\n Apply Filters\n </Button>\n </div>\n </div>\n )\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
const j2FilterForm = "_j2FilterForm_rdja9_1";
|
|
4
|
+
const filterFormTitle = "_filterFormTitle_rdja9_2";
|
|
5
|
+
const filterFormConjunction = "_filterFormConjunction_rdja9_6";
|
|
6
|
+
const filterFormFieldsContainer = "_filterFormFieldsContainer_rdja9_10";
|
|
7
|
+
const filterFormGroupContainer = "_filterFormGroupContainer_rdja9_15";
|
|
8
|
+
const s = {
|
|
9
|
+
j2FilterForm,
|
|
10
|
+
filterFormTitle,
|
|
11
|
+
filterFormConjunction,
|
|
12
|
+
filterFormFieldsContainer,
|
|
13
|
+
filterFormGroupContainer
|
|
14
|
+
};
|
|
15
|
+
exports.default = s;
|
|
16
|
+
exports.filterFormConjunction = filterFormConjunction;
|
|
17
|
+
exports.filterFormFieldsContainer = filterFormFieldsContainer;
|
|
18
|
+
exports.filterFormGroupContainer = filterFormGroupContainer;
|
|
19
|
+
exports.filterFormTitle = filterFormTitle;
|
|
20
|
+
exports.j2FilterForm = j2FilterForm;
|
|
21
|
+
//# sourceMappingURL=FiltersForm.module.css.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FiltersForm.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const j2FilterForm = "_j2FilterForm_rdja9_1";
|
|
2
|
+
const filterFormTitle = "_filterFormTitle_rdja9_2";
|
|
3
|
+
const filterFormConjunction = "_filterFormConjunction_rdja9_6";
|
|
4
|
+
const filterFormFieldsContainer = "_filterFormFieldsContainer_rdja9_10";
|
|
5
|
+
const filterFormGroupContainer = "_filterFormGroupContainer_rdja9_15";
|
|
6
|
+
const s = {
|
|
7
|
+
j2FilterForm,
|
|
8
|
+
filterFormTitle,
|
|
9
|
+
filterFormConjunction,
|
|
10
|
+
filterFormFieldsContainer,
|
|
11
|
+
filterFormGroupContainer
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
s as default,
|
|
15
|
+
filterFormConjunction,
|
|
16
|
+
filterFormFieldsContainer,
|
|
17
|
+
filterFormGroupContainer,
|
|
18
|
+
filterFormTitle,
|
|
19
|
+
j2FilterForm
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=FiltersForm.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FiltersForm.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const isMultiValueTextOperator = (operator) => operator === "isAnyOf" || operator === "isNoneOf";
|
|
4
|
+
const normalizeMultiValues = (raw) => {
|
|
5
|
+
const seen = /* @__PURE__ */ new Set();
|
|
6
|
+
const out = [];
|
|
7
|
+
for (const value of raw ?? []) {
|
|
8
|
+
if (value === null || value === void 0) continue;
|
|
9
|
+
const trimmed = String(value).trim();
|
|
10
|
+
if (trimmed === "") continue;
|
|
11
|
+
const key = trimmed.toLowerCase();
|
|
12
|
+
if (seen.has(key)) continue;
|
|
13
|
+
seen.add(key);
|
|
14
|
+
out.push(trimmed);
|
|
15
|
+
}
|
|
16
|
+
return out;
|
|
17
|
+
};
|
|
18
|
+
const tooManyValuesMessage = (maxValues) => `Up to ${maxValues} values`;
|
|
19
|
+
const exceedsMaxValues = (values, limits) => (limits == null ? void 0 : limits.maxValues) !== void 0 && values !== void 0 && values.length > limits.maxValues;
|
|
20
|
+
const isEmptyFilter = (filter) => {
|
|
21
|
+
if (filter.operator === "blank" || filter.operator === "notBlank") {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
if (filter.values && filter.values.length > 0 && filter.values.every(
|
|
25
|
+
(value) => value !== "" && value !== void 0 && value !== null
|
|
26
|
+
)) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
};
|
|
31
|
+
const isEmptyFormFilter = (filter) => {
|
|
32
|
+
if (filter.operator === "blank" || filter.operator === "notBlank") {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
if (filter.values && filter.values.length > 0 && filter.values.every(
|
|
36
|
+
(value) => value !== "" && value !== void 0 && value !== null
|
|
37
|
+
)) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
};
|
|
42
|
+
const validateFormFilter = (filter, limits) => {
|
|
43
|
+
const errors = [];
|
|
44
|
+
if (!filter.operator) {
|
|
45
|
+
errors.push("Operator is required");
|
|
46
|
+
return errors;
|
|
47
|
+
}
|
|
48
|
+
if (isEmptyFormFilter(filter)) {
|
|
49
|
+
errors.push("Value is required");
|
|
50
|
+
}
|
|
51
|
+
if (exceedsMaxValues(filter.values, limits)) {
|
|
52
|
+
errors.push(tooManyValuesMessage(limits.maxValues));
|
|
53
|
+
}
|
|
54
|
+
if (filter.type === "number" && filter.operator === "inRange") {
|
|
55
|
+
if (filter.values && filter.values.length !== 2) {
|
|
56
|
+
errors.push("Value is required");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return errors;
|
|
60
|
+
};
|
|
61
|
+
const isFilter = (filter) => {
|
|
62
|
+
return filter.operator !== void 0 && filter.field !== void 0 && filter.type !== void 0;
|
|
63
|
+
};
|
|
64
|
+
exports.isEmptyFilter = isEmptyFilter;
|
|
65
|
+
exports.isEmptyFormFilter = isEmptyFormFilter;
|
|
66
|
+
exports.isFilter = isFilter;
|
|
67
|
+
exports.isMultiValueTextOperator = isMultiValueTextOperator;
|
|
68
|
+
exports.normalizeMultiValues = normalizeMultiValues;
|
|
69
|
+
exports.tooManyValuesMessage = tooManyValuesMessage;
|
|
70
|
+
exports.validateFormFilter = validateFormFilter;
|
|
71
|
+
//# sourceMappingURL=filterHelpers.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filterHelpers.cjs","sources":["../../../../src/components/filterform/filterHelpers.ts"],"sourcesContent":["import { Filter } from './types'\n\n// Multi-value text operators — the value is a chip list, not a single string.\nexport const isMultiValueTextOperator = (\n operator: string | undefined\n): boolean => operator === 'isAnyOf' || operator === 'isNoneOf'\n\n/**\n * Normalize a chip list: trim, drop empties, dedupe case-insensitively (the\n * match is case-insensitive, so `ABC` and `abc` are the same rule). Keeps\n * first-seen casing and order so the chips read the way they were pasted.\n *\n * Applied when values enter reducer state (`useFilterField`), so the chips\n * on screen, the validation count and the submitted `values` are one array.\n */\nexport const normalizeMultiValues = (\n raw: (string | number | undefined | null)[] | undefined\n): string[] => {\n const seen = new Set<string>()\n const out: string[] = []\n for (const value of raw ?? []) {\n if (value === null || value === undefined) continue\n const trimmed = String(value).trim()\n if (trimmed === '') continue\n const key = trimmed.toLowerCase()\n if (seen.has(key)) continue\n seen.add(key)\n out.push(trimmed)\n }\n return out\n}\n\n// The only `FilterConfig` fields validation consults. Passed separately from\n// the filter because a submitted `Filter` doesn't carry its config.\nexport type FilterValueLimits = { maxValues?: number }\n\nexport const tooManyValuesMessage = (maxValues: number) =>\n `Up to ${maxValues} values`\n\nconst exceedsMaxValues = (\n values: unknown[] | undefined,\n limits: FilterValueLimits | undefined\n): limits is { maxValues: number } =>\n limits?.maxValues !== undefined &&\n values !== undefined &&\n values.length > limits.maxValues\n\nexport const isEmptyFilter = (filter: Filter) => {\n if (filter.operator === 'blank' || filter.operator === 'notBlank') {\n return false\n }\n\n if (\n filter.values &&\n filter.values.length > 0 &&\n filter.values.every(\n (value) => value !== '' && value !== undefined && value !== null\n )\n ) {\n return false\n }\n\n return true\n}\n\nexport const isValidFilter = (filter: Filter, limits?: FilterValueLimits) => {\n return validateFilterField(filter, limits).length === 0\n}\n\nexport const validateFilterField = (\n filter: Filter,\n limits?: FilterValueLimits\n): { field: string; message: string }[] => {\n const errors = []\n\n if (!filter.operator) {\n errors.push({ field: filter.field, message: 'Operator is required' })\n return errors\n }\n\n if (isEmptyFilter(filter)) {\n errors.push({ field: filter.field, message: 'Value is required' })\n }\n\n if (exceedsMaxValues(filter.values, limits)) {\n errors.push({\n field: filter.field,\n message: tooManyValuesMessage(limits.maxValues),\n })\n }\n\n if (filter.type === 'number' && filter.operator === 'inRange') {\n if (filter.values && filter.values.length !== 2) {\n errors.push({ field: filter.field, message: 'Value is required' })\n }\n }\n\n return errors\n}\n\nimport { FormFilter } from './types'\n\nexport const isEmptyFormFilter = (filter: FormFilter) => {\n if (filter.operator === 'blank' || filter.operator === 'notBlank') {\n return false\n }\n\n if (\n filter.values &&\n filter.values.length > 0 &&\n filter.values.every(\n (value) => value !== '' && value !== undefined && value !== null\n )\n ) {\n return false\n }\n\n return true\n}\n\nexport const isValidFormFilter = (\n filter: FormFilter,\n limits?: FilterValueLimits\n) => {\n return validateFormFilter(filter, limits).length === 0\n}\n\nexport const validateFormFilter = (\n filter: FormFilter,\n limits?: FilterValueLimits\n): string[] => {\n const errors = []\n\n if (!filter.operator) {\n errors.push('Operator is required')\n return errors\n }\n\n if (isEmptyFormFilter(filter)) {\n errors.push('Value is required')\n }\n\n if (exceedsMaxValues(filter.values, limits)) {\n errors.push(tooManyValuesMessage(limits.maxValues))\n }\n\n if (filter.type === 'number' && filter.operator === 'inRange') {\n if (filter.values && filter.values.length !== 2) {\n errors.push('Value is required')\n }\n }\n\n return errors\n}\n\nexport const isFilter = (filter: FormFilter): filter is Filter => {\n return (\n filter.operator !== undefined &&\n filter.field !== undefined &&\n filter.type !== undefined\n )\n}\n"],"names":[],"mappings":";;AAGO,MAAM,2BAA2B,CACtC,aACY,aAAa,aAAa,aAAa;AAU9C,MAAM,uBAAuB,CAClC,QACa;AACb,QAAM,2BAAW,IAAA;AACjB,QAAM,MAAgB,CAAA;AACtB,aAAW,SAAS,OAAO,IAAI;AAC7B,QAAI,UAAU,QAAQ,UAAU,OAAW;AAC3C,UAAM,UAAU,OAAO,KAAK,EAAE,KAAA;AAC9B,QAAI,YAAY,GAAI;AACpB,UAAM,MAAM,QAAQ,YAAA;AACpB,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AACZ,QAAI,KAAK,OAAO;AAAA,EAClB;AACA,SAAO;AACT;AAMO,MAAM,uBAAuB,CAAC,cACnC,SAAS,SAAS;AAEpB,MAAM,mBAAmB,CACvB,QACA,YAEA,iCAAQ,eAAc,UACtB,WAAW,UACX,OAAO,SAAS,OAAO;AAElB,MAAM,gBAAgB,CAAC,WAAmB;AAC/C,MAAI,OAAO,aAAa,WAAW,OAAO,aAAa,YAAY;AACjE,WAAO;AAAA,EACT;AAEA,MACE,OAAO,UACP,OAAO,OAAO,SAAS,KACvB,OAAO,OAAO;AAAA,IACZ,CAAC,UAAU,UAAU,MAAM,UAAU,UAAa,UAAU;AAAA,EAAA,GAE9D;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAuCO,MAAM,oBAAoB,CAAC,WAAuB;AACvD,MAAI,OAAO,aAAa,WAAW,OAAO,aAAa,YAAY;AACjE,WAAO;AAAA,EACT;AAEA,MACE,OAAO,UACP,OAAO,OAAO,SAAS,KACvB,OAAO,OAAO;AAAA,IACZ,CAAC,UAAU,UAAU,MAAM,UAAU,UAAa,UAAU;AAAA,EAAA,GAE9D;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AASO,MAAM,qBAAqB,CAChC,QACA,WACa;AACb,QAAM,SAAS,CAAA;AAEf,MAAI,CAAC,OAAO,UAAU;AACpB,WAAO,KAAK,sBAAsB;AAClC,WAAO;AAAA,EACT;AAEA,MAAI,kBAAkB,MAAM,GAAG;AAC7B,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAEA,MAAI,iBAAiB,OAAO,QAAQ,MAAM,GAAG;AAC3C,WAAO,KAAK,qBAAqB,OAAO,SAAS,CAAC;AAAA,EACpD;AAEA,MAAI,OAAO,SAAS,YAAY,OAAO,aAAa,WAAW;AAC7D,QAAI,OAAO,UAAU,OAAO,OAAO,WAAW,GAAG;AAC/C,aAAO,KAAK,mBAAmB;AAAA,IACjC;AAAA,EACF;AAEA,SAAO;AACT;AAEO,MAAM,WAAW,CAAC,WAAyC;AAChE,SACE,OAAO,aAAa,UACpB,OAAO,UAAU,UACjB,OAAO,SAAS;AAEpB;;;;;;;;"}
|
|
@@ -1,11 +1,25 @@
|
|
|
1
1
|
import { Filter, FormFilter } from './types.js';
|
|
2
|
+
export declare const isMultiValueTextOperator: (operator: string | undefined) => boolean;
|
|
3
|
+
/**
|
|
4
|
+
* Normalize a chip list: trim, drop empties, dedupe case-insensitively (the
|
|
5
|
+
* match is case-insensitive, so `ABC` and `abc` are the same rule). Keeps
|
|
6
|
+
* first-seen casing and order so the chips read the way they were pasted.
|
|
7
|
+
*
|
|
8
|
+
* Applied when values enter reducer state (`useFilterField`), so the chips
|
|
9
|
+
* on screen, the validation count and the submitted `values` are one array.
|
|
10
|
+
*/
|
|
11
|
+
export declare const normalizeMultiValues: (raw: (string | number | undefined | null)[] | undefined) => string[];
|
|
12
|
+
export type FilterValueLimits = {
|
|
13
|
+
maxValues?: number;
|
|
14
|
+
};
|
|
15
|
+
export declare const tooManyValuesMessage: (maxValues: number) => string;
|
|
2
16
|
export declare const isEmptyFilter: (filter: Filter) => boolean;
|
|
3
|
-
export declare const isValidFilter: (filter: Filter) => boolean;
|
|
4
|
-
export declare const validateFilterField: (filter: Filter) => {
|
|
17
|
+
export declare const isValidFilter: (filter: Filter, limits?: FilterValueLimits) => boolean;
|
|
18
|
+
export declare const validateFilterField: (filter: Filter, limits?: FilterValueLimits) => {
|
|
5
19
|
field: string;
|
|
6
20
|
message: string;
|
|
7
21
|
}[];
|
|
8
22
|
export declare const isEmptyFormFilter: (filter: FormFilter) => boolean;
|
|
9
|
-
export declare const isValidFormFilter: (filter: FormFilter) => boolean;
|
|
10
|
-
export declare const validateFormFilter: (filter: FormFilter) => string[];
|
|
23
|
+
export declare const isValidFormFilter: (filter: FormFilter, limits?: FilterValueLimits) => boolean;
|
|
24
|
+
export declare const validateFormFilter: (filter: FormFilter, limits?: FilterValueLimits) => string[];
|
|
11
25
|
export declare const isFilter: (filter: FormFilter) => filter is Filter;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
const isMultiValueTextOperator = (operator) => operator === "isAnyOf" || operator === "isNoneOf";
|
|
2
|
+
const normalizeMultiValues = (raw) => {
|
|
3
|
+
const seen = /* @__PURE__ */ new Set();
|
|
4
|
+
const out = [];
|
|
5
|
+
for (const value of raw ?? []) {
|
|
6
|
+
if (value === null || value === void 0) continue;
|
|
7
|
+
const trimmed = String(value).trim();
|
|
8
|
+
if (trimmed === "") continue;
|
|
9
|
+
const key = trimmed.toLowerCase();
|
|
10
|
+
if (seen.has(key)) continue;
|
|
11
|
+
seen.add(key);
|
|
12
|
+
out.push(trimmed);
|
|
13
|
+
}
|
|
14
|
+
return out;
|
|
15
|
+
};
|
|
16
|
+
const tooManyValuesMessage = (maxValues) => `Up to ${maxValues} values`;
|
|
17
|
+
const exceedsMaxValues = (values, limits) => (limits == null ? void 0 : limits.maxValues) !== void 0 && values !== void 0 && values.length > limits.maxValues;
|
|
18
|
+
const isEmptyFilter = (filter) => {
|
|
19
|
+
if (filter.operator === "blank" || filter.operator === "notBlank") {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
if (filter.values && filter.values.length > 0 && filter.values.every(
|
|
23
|
+
(value) => value !== "" && value !== void 0 && value !== null
|
|
24
|
+
)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
};
|
|
29
|
+
const isEmptyFormFilter = (filter) => {
|
|
30
|
+
if (filter.operator === "blank" || filter.operator === "notBlank") {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
if (filter.values && filter.values.length > 0 && filter.values.every(
|
|
34
|
+
(value) => value !== "" && value !== void 0 && value !== null
|
|
35
|
+
)) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
};
|
|
40
|
+
const validateFormFilter = (filter, limits) => {
|
|
41
|
+
const errors = [];
|
|
42
|
+
if (!filter.operator) {
|
|
43
|
+
errors.push("Operator is required");
|
|
44
|
+
return errors;
|
|
45
|
+
}
|
|
46
|
+
if (isEmptyFormFilter(filter)) {
|
|
47
|
+
errors.push("Value is required");
|
|
48
|
+
}
|
|
49
|
+
if (exceedsMaxValues(filter.values, limits)) {
|
|
50
|
+
errors.push(tooManyValuesMessage(limits.maxValues));
|
|
51
|
+
}
|
|
52
|
+
if (filter.type === "number" && filter.operator === "inRange") {
|
|
53
|
+
if (filter.values && filter.values.length !== 2) {
|
|
54
|
+
errors.push("Value is required");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return errors;
|
|
58
|
+
};
|
|
59
|
+
const isFilter = (filter) => {
|
|
60
|
+
return filter.operator !== void 0 && filter.field !== void 0 && filter.type !== void 0;
|
|
61
|
+
};
|
|
62
|
+
export {
|
|
63
|
+
isEmptyFilter,
|
|
64
|
+
isEmptyFormFilter,
|
|
65
|
+
isFilter,
|
|
66
|
+
isMultiValueTextOperator,
|
|
67
|
+
normalizeMultiValues,
|
|
68
|
+
tooManyValuesMessage,
|
|
69
|
+
validateFormFilter
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=filterHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filterHelpers.js","sources":["../../../../src/components/filterform/filterHelpers.ts"],"sourcesContent":["import { Filter } from './types'\n\n// Multi-value text operators — the value is a chip list, not a single string.\nexport const isMultiValueTextOperator = (\n operator: string | undefined\n): boolean => operator === 'isAnyOf' || operator === 'isNoneOf'\n\n/**\n * Normalize a chip list: trim, drop empties, dedupe case-insensitively (the\n * match is case-insensitive, so `ABC` and `abc` are the same rule). Keeps\n * first-seen casing and order so the chips read the way they were pasted.\n *\n * Applied when values enter reducer state (`useFilterField`), so the chips\n * on screen, the validation count and the submitted `values` are one array.\n */\nexport const normalizeMultiValues = (\n raw: (string | number | undefined | null)[] | undefined\n): string[] => {\n const seen = new Set<string>()\n const out: string[] = []\n for (const value of raw ?? []) {\n if (value === null || value === undefined) continue\n const trimmed = String(value).trim()\n if (trimmed === '') continue\n const key = trimmed.toLowerCase()\n if (seen.has(key)) continue\n seen.add(key)\n out.push(trimmed)\n }\n return out\n}\n\n// The only `FilterConfig` fields validation consults. Passed separately from\n// the filter because a submitted `Filter` doesn't carry its config.\nexport type FilterValueLimits = { maxValues?: number }\n\nexport const tooManyValuesMessage = (maxValues: number) =>\n `Up to ${maxValues} values`\n\nconst exceedsMaxValues = (\n values: unknown[] | undefined,\n limits: FilterValueLimits | undefined\n): limits is { maxValues: number } =>\n limits?.maxValues !== undefined &&\n values !== undefined &&\n values.length > limits.maxValues\n\nexport const isEmptyFilter = (filter: Filter) => {\n if (filter.operator === 'blank' || filter.operator === 'notBlank') {\n return false\n }\n\n if (\n filter.values &&\n filter.values.length > 0 &&\n filter.values.every(\n (value) => value !== '' && value !== undefined && value !== null\n )\n ) {\n return false\n }\n\n return true\n}\n\nexport const isValidFilter = (filter: Filter, limits?: FilterValueLimits) => {\n return validateFilterField(filter, limits).length === 0\n}\n\nexport const validateFilterField = (\n filter: Filter,\n limits?: FilterValueLimits\n): { field: string; message: string }[] => {\n const errors = []\n\n if (!filter.operator) {\n errors.push({ field: filter.field, message: 'Operator is required' })\n return errors\n }\n\n if (isEmptyFilter(filter)) {\n errors.push({ field: filter.field, message: 'Value is required' })\n }\n\n if (exceedsMaxValues(filter.values, limits)) {\n errors.push({\n field: filter.field,\n message: tooManyValuesMessage(limits.maxValues),\n })\n }\n\n if (filter.type === 'number' && filter.operator === 'inRange') {\n if (filter.values && filter.values.length !== 2) {\n errors.push({ field: filter.field, message: 'Value is required' })\n }\n }\n\n return errors\n}\n\nimport { FormFilter } from './types'\n\nexport const isEmptyFormFilter = (filter: FormFilter) => {\n if (filter.operator === 'blank' || filter.operator === 'notBlank') {\n return false\n }\n\n if (\n filter.values &&\n filter.values.length > 0 &&\n filter.values.every(\n (value) => value !== '' && value !== undefined && value !== null\n )\n ) {\n return false\n }\n\n return true\n}\n\nexport const isValidFormFilter = (\n filter: FormFilter,\n limits?: FilterValueLimits\n) => {\n return validateFormFilter(filter, limits).length === 0\n}\n\nexport const validateFormFilter = (\n filter: FormFilter,\n limits?: FilterValueLimits\n): string[] => {\n const errors = []\n\n if (!filter.operator) {\n errors.push('Operator is required')\n return errors\n }\n\n if (isEmptyFormFilter(filter)) {\n errors.push('Value is required')\n }\n\n if (exceedsMaxValues(filter.values, limits)) {\n errors.push(tooManyValuesMessage(limits.maxValues))\n }\n\n if (filter.type === 'number' && filter.operator === 'inRange') {\n if (filter.values && filter.values.length !== 2) {\n errors.push('Value is required')\n }\n }\n\n return errors\n}\n\nexport const isFilter = (filter: FormFilter): filter is Filter => {\n return (\n filter.operator !== undefined &&\n filter.field !== undefined &&\n filter.type !== undefined\n )\n}\n"],"names":[],"mappings":"AAGO,MAAM,2BAA2B,CACtC,aACY,aAAa,aAAa,aAAa;AAU9C,MAAM,uBAAuB,CAClC,QACa;AACb,QAAM,2BAAW,IAAA;AACjB,QAAM,MAAgB,CAAA;AACtB,aAAW,SAAS,OAAO,IAAI;AAC7B,QAAI,UAAU,QAAQ,UAAU,OAAW;AAC3C,UAAM,UAAU,OAAO,KAAK,EAAE,KAAA;AAC9B,QAAI,YAAY,GAAI;AACpB,UAAM,MAAM,QAAQ,YAAA;AACpB,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AACZ,QAAI,KAAK,OAAO;AAAA,EAClB;AACA,SAAO;AACT;AAMO,MAAM,uBAAuB,CAAC,cACnC,SAAS,SAAS;AAEpB,MAAM,mBAAmB,CACvB,QACA,YAEA,iCAAQ,eAAc,UACtB,WAAW,UACX,OAAO,SAAS,OAAO;AAElB,MAAM,gBAAgB,CAAC,WAAmB;AAC/C,MAAI,OAAO,aAAa,WAAW,OAAO,aAAa,YAAY;AACjE,WAAO;AAAA,EACT;AAEA,MACE,OAAO,UACP,OAAO,OAAO,SAAS,KACvB,OAAO,OAAO;AAAA,IACZ,CAAC,UAAU,UAAU,MAAM,UAAU,UAAa,UAAU;AAAA,EAAA,GAE9D;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAuCO,MAAM,oBAAoB,CAAC,WAAuB;AACvD,MAAI,OAAO,aAAa,WAAW,OAAO,aAAa,YAAY;AACjE,WAAO;AAAA,EACT;AAEA,MACE,OAAO,UACP,OAAO,OAAO,SAAS,KACvB,OAAO,OAAO;AAAA,IACZ,CAAC,UAAU,UAAU,MAAM,UAAU,UAAa,UAAU;AAAA,EAAA,GAE9D;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AASO,MAAM,qBAAqB,CAChC,QACA,WACa;AACb,QAAM,SAAS,CAAA;AAEf,MAAI,CAAC,OAAO,UAAU;AACpB,WAAO,KAAK,sBAAsB;AAClC,WAAO;AAAA,EACT;AAEA,MAAI,kBAAkB,MAAM,GAAG;AAC7B,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAEA,MAAI,iBAAiB,OAAO,QAAQ,MAAM,GAAG;AAC3C,WAAO,KAAK,qBAAqB,OAAO,SAAS,CAAC;AAAA,EACpD;AAEA,MAAI,OAAO,SAAS,YAAY,OAAO,aAAa,WAAW;AAC7D,QAAI,OAAO,UAAU,OAAO,OAAO,WAAW,GAAG;AAC/C,aAAO,KAAK,mBAAmB;AAAA,IACjC;AAAA,EACF;AAEA,SAAO;AACT;AAEO,MAAM,WAAW,CAAC,WAAyC;AAChE,SACE,OAAO,aAAa,UACpB,OAAO,UAAU,UACjB,OAAO,SAAS;AAEpB;"}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
export { FiltersForm } from './FiltersForm.js';
|
|
2
|
-
export type { FilterForm, FilterConfig, FilterType, Filter, FilterGroup, } from './types.js';
|
|
2
|
+
export type { FilterForm, FilterConfig, FilterType, Filter, FilterGroup, Operator, } from './types.js';
|
|
3
|
+
export { MultiValueTextOperatorOptions, operatorOptionsFor, } from './useFilterField.js';
|
|
4
|
+
export { isMultiValueTextOperator, normalizeMultiValues } from './filterHelpers.js';
|
|
@@ -28,8 +28,10 @@ export type FilterConfig = {
|
|
|
28
28
|
type: FilterType;
|
|
29
29
|
disabled?: boolean;
|
|
30
30
|
options?: SelectOptionsType | NumberOptionsType;
|
|
31
|
+
operators?: Operator[];
|
|
32
|
+
maxValues?: number;
|
|
31
33
|
};
|
|
32
|
-
export type Operator = 'equals' | 'notEqual' | 'blank' | 'notBlank' | 'greaterThan' | 'greaterThanOrEqual' | 'lessThan' | 'lessThanOrEqual' | 'inRange' | 'contains' | 'notContains' | 'startsWith' | 'endsWith';
|
|
34
|
+
export type Operator = 'equals' | 'notEqual' | 'blank' | 'notBlank' | 'greaterThan' | 'greaterThanOrEqual' | 'lessThan' | 'lessThanOrEqual' | 'inRange' | 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'isAnyOf' | 'isNoneOf';
|
|
33
35
|
type SelectFilter = {
|
|
34
36
|
field: string;
|
|
35
37
|
type: 'select';
|
|
@@ -45,7 +47,7 @@ type NumberFilter = {
|
|
|
45
47
|
type TextFilter = {
|
|
46
48
|
field: string;
|
|
47
49
|
type: 'text';
|
|
48
|
-
operator: Extract<Operator, 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'blank' | 'notBlank'> | undefined;
|
|
50
|
+
operator: Extract<Operator, 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'blank' | 'notBlank' | 'isAnyOf' | 'isNoneOf'> | undefined;
|
|
49
51
|
values: string[];
|
|
50
52
|
};
|
|
51
53
|
export type Filter = SelectFilter | NumberFilter | TextFilter;
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const React = require("react");
|
|
4
|
+
const filterHelpers = require("./filterHelpers.cjs");
|
|
5
|
+
function _interopNamespaceDefault(e) {
|
|
6
|
+
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
7
|
+
if (e) {
|
|
8
|
+
for (const k in e) {
|
|
9
|
+
if (k !== "default") {
|
|
10
|
+
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
11
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
get: () => e[k]
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
n.default = e;
|
|
19
|
+
return Object.freeze(n);
|
|
20
|
+
}
|
|
21
|
+
const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
|
|
22
|
+
const TypeToOperatorOptions = {
|
|
23
|
+
select: [
|
|
24
|
+
{ label: "is any of", value: "equals" },
|
|
25
|
+
{ label: "is not any of", value: "notEqual" },
|
|
26
|
+
{ label: "has no value", value: "blank" },
|
|
27
|
+
{ label: "has any value", value: "notBlank" }
|
|
28
|
+
],
|
|
29
|
+
number: [
|
|
30
|
+
{ label: "is", value: "equals" },
|
|
31
|
+
{ label: "is not", value: "notEqual" },
|
|
32
|
+
{ label: "is greater than", value: "greaterThan" },
|
|
33
|
+
{ label: "is greater than or equal to", value: "greaterThanOrEqual" },
|
|
34
|
+
{ label: "is less than", value: "lessThan" },
|
|
35
|
+
{ label: "is less than or equal to", value: "lessThanOrEqual" },
|
|
36
|
+
{ label: "has no value", value: "blank" },
|
|
37
|
+
{ label: "has any value", value: "notBlank" },
|
|
38
|
+
{ label: "is between", value: "inRange" }
|
|
39
|
+
],
|
|
40
|
+
text: [
|
|
41
|
+
{ label: "contains", value: "contains" },
|
|
42
|
+
{ label: "does not contain", value: "notContains" },
|
|
43
|
+
{ label: "starts with", value: "startsWith" },
|
|
44
|
+
{ label: "ends with", value: "endsWith" },
|
|
45
|
+
{ label: "has no value", value: "blank" },
|
|
46
|
+
{ label: "has any value", value: "notBlank" }
|
|
47
|
+
]
|
|
48
|
+
};
|
|
49
|
+
const MultiValueTextOperatorOptions = [
|
|
50
|
+
{ label: "is any of", value: "isAnyOf" },
|
|
51
|
+
{ label: "is not any of", value: "isNoneOf" }
|
|
52
|
+
];
|
|
53
|
+
const operatorOptionsFor = (config) => {
|
|
54
|
+
const defaults = TypeToOperatorOptions[config.type];
|
|
55
|
+
if (!config.operators) return defaults;
|
|
56
|
+
const known = config.type === "text" ? [...defaults, ...MultiValueTextOperatorOptions] : defaults;
|
|
57
|
+
return config.operators.flatMap((operator) => {
|
|
58
|
+
const option = known.find((candidate) => candidate.value === operator);
|
|
59
|
+
return option ? [option] : [];
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
const buildValueInputConfig = (config, operator) => {
|
|
63
|
+
if (config.type === "select") {
|
|
64
|
+
if (operator === "blank" || operator === "notBlank") return;
|
|
65
|
+
return {
|
|
66
|
+
type: "select",
|
|
67
|
+
valueOptions: config.options || []
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
if (config.type === "number") {
|
|
71
|
+
if (operator === "blank" || operator === "notBlank") return;
|
|
72
|
+
return {
|
|
73
|
+
type: "number",
|
|
74
|
+
inputCount: operator === "inRange" ? 2 : 1,
|
|
75
|
+
numberOptions: config.options
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
if (config.type === "text") {
|
|
79
|
+
if (operator === "blank" || operator === "notBlank") return;
|
|
80
|
+
return {
|
|
81
|
+
type: "text",
|
|
82
|
+
multiValue: filterHelpers.isMultiValueTextOperator(operator),
|
|
83
|
+
maxValues: config.maxValues
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const filterFieldReducer = (state, action) => {
|
|
88
|
+
var _a, _b, _c, _d, _e;
|
|
89
|
+
switch (action.type) {
|
|
90
|
+
case "setField": {
|
|
91
|
+
const config = state.filterConfigs.find(
|
|
92
|
+
(config2) => config2.field === action.payload
|
|
93
|
+
);
|
|
94
|
+
if (!config) return state;
|
|
95
|
+
const operatorOptions = operatorOptionsFor(config);
|
|
96
|
+
const newFilter = {
|
|
97
|
+
...state.filter,
|
|
98
|
+
type: config.type,
|
|
99
|
+
field: action.payload,
|
|
100
|
+
operator: (_a = operatorOptions[0]) == null ? void 0 : _a.value,
|
|
101
|
+
values: []
|
|
102
|
+
};
|
|
103
|
+
const pendingFilter = {
|
|
104
|
+
...newFilter,
|
|
105
|
+
errors: filterHelpers.validateFormFilter(newFilter, config)
|
|
106
|
+
};
|
|
107
|
+
return {
|
|
108
|
+
...state,
|
|
109
|
+
filter: pendingFilter,
|
|
110
|
+
config,
|
|
111
|
+
operatorOptions,
|
|
112
|
+
valueInputConfig: operatorOptions.length > 0 ? buildValueInputConfig(config, operatorOptions[0].value) : void 0
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
case "setOperator": {
|
|
116
|
+
if (!state.config) return state;
|
|
117
|
+
if (!action.payload) return state;
|
|
118
|
+
const pendingFilter = {
|
|
119
|
+
...state.filter,
|
|
120
|
+
operator: action.payload,
|
|
121
|
+
values: []
|
|
122
|
+
};
|
|
123
|
+
return {
|
|
124
|
+
...state,
|
|
125
|
+
filter: {
|
|
126
|
+
...pendingFilter,
|
|
127
|
+
errors: filterHelpers.validateFormFilter(pendingFilter, state.config)
|
|
128
|
+
},
|
|
129
|
+
valueInputConfig: buildValueInputConfig(state.config, action.payload)
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
case "setValues": {
|
|
133
|
+
if (!state.filter) return state;
|
|
134
|
+
const values = state.filter.type === "number" ? action.payload.map((value) => Number(value)) : filterHelpers.isMultiValueTextOperator(state.filter.operator) ? (
|
|
135
|
+
// Normalized on the way into state, not just for display —
|
|
136
|
+
// validation counts and `onSubmit` emit exactly these chips.
|
|
137
|
+
filterHelpers.normalizeMultiValues(action.payload)
|
|
138
|
+
) : action.payload.filter(
|
|
139
|
+
(value) => value !== null && value !== void 0
|
|
140
|
+
);
|
|
141
|
+
const pendingFilter = {
|
|
142
|
+
...state.filter,
|
|
143
|
+
values
|
|
144
|
+
};
|
|
145
|
+
pendingFilter.errors = filterHelpers.validateFormFilter(pendingFilter, state.config);
|
|
146
|
+
return {
|
|
147
|
+
...state,
|
|
148
|
+
filter: pendingFilter
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
case "initialize": {
|
|
152
|
+
const field = ((_b = state.filter) == null ? void 0 : _b.field) || ((_c = state.filterConfigs.find((config2) => !config2.disabled)) == null ? void 0 : _c.field);
|
|
153
|
+
const config = state.filterConfigs.find(
|
|
154
|
+
(config2) => config2.field === field
|
|
155
|
+
);
|
|
156
|
+
if (!config) return state;
|
|
157
|
+
const operatorOptions = operatorOptionsFor(config);
|
|
158
|
+
const persisted = (_d = state.filter) == null ? void 0 : _d.operator;
|
|
159
|
+
const persistedAllowed = persisted !== void 0 && operatorOptions.some((option) => option.value === persisted);
|
|
160
|
+
const operator = persistedAllowed ? persisted : (_e = operatorOptions[0]) == null ? void 0 : _e.value;
|
|
161
|
+
let filter;
|
|
162
|
+
if (!state.filter) {
|
|
163
|
+
filter = {
|
|
164
|
+
field,
|
|
165
|
+
type: config.type,
|
|
166
|
+
operator,
|
|
167
|
+
values: []
|
|
168
|
+
};
|
|
169
|
+
} else if (!persistedAllowed) {
|
|
170
|
+
filter = { ...state.filter, operator, values: [] };
|
|
171
|
+
} else if (filterHelpers.isMultiValueTextOperator(operator)) {
|
|
172
|
+
filter = {
|
|
173
|
+
...state.filter,
|
|
174
|
+
values: filterHelpers.normalizeMultiValues(state.filter.values)
|
|
175
|
+
};
|
|
176
|
+
} else {
|
|
177
|
+
filter = { ...state.filter };
|
|
178
|
+
}
|
|
179
|
+
filter.errors = filterHelpers.validateFormFilter(filter, config);
|
|
180
|
+
return {
|
|
181
|
+
...state,
|
|
182
|
+
config,
|
|
183
|
+
filter,
|
|
184
|
+
operatorOptions,
|
|
185
|
+
valueInputConfig: operatorOptions.length > 0 ? buildValueInputConfig(config, operator) : void 0
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
default:
|
|
189
|
+
return state;
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
const useFilterField = ({
|
|
193
|
+
filterConfigs,
|
|
194
|
+
filter: initialFilter
|
|
195
|
+
}) => {
|
|
196
|
+
const [{ filter, config, operatorOptions, valueInputConfig }, dispatch] = React__namespace.useReducer(
|
|
197
|
+
filterFieldReducer,
|
|
198
|
+
{
|
|
199
|
+
filter: initialFilter,
|
|
200
|
+
filterConfigs,
|
|
201
|
+
config: void 0,
|
|
202
|
+
operatorOptions: [],
|
|
203
|
+
valueInputConfig: void 0
|
|
204
|
+
},
|
|
205
|
+
(state) => {
|
|
206
|
+
return filterFieldReducer(state, {
|
|
207
|
+
type: "initialize",
|
|
208
|
+
payload: void 0
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
);
|
|
212
|
+
const handleFieldChange = (value) => {
|
|
213
|
+
dispatch({
|
|
214
|
+
type: "setField",
|
|
215
|
+
payload: value
|
|
216
|
+
});
|
|
217
|
+
};
|
|
218
|
+
const handleOperatorChange = (value) => {
|
|
219
|
+
dispatch({
|
|
220
|
+
type: "setOperator",
|
|
221
|
+
payload: value
|
|
222
|
+
});
|
|
223
|
+
};
|
|
224
|
+
const handleValuesChange = (value) => {
|
|
225
|
+
dispatch({
|
|
226
|
+
type: "setValues",
|
|
227
|
+
payload: value
|
|
228
|
+
});
|
|
229
|
+
};
|
|
230
|
+
return {
|
|
231
|
+
filter,
|
|
232
|
+
config,
|
|
233
|
+
operatorOptions,
|
|
234
|
+
valueInputConfig,
|
|
235
|
+
handleFieldChange,
|
|
236
|
+
handleOperatorChange,
|
|
237
|
+
handleValuesChange
|
|
238
|
+
};
|
|
239
|
+
};
|
|
240
|
+
exports.isMultiValueTextOperator = filterHelpers.isMultiValueTextOperator;
|
|
241
|
+
exports.MultiValueTextOperatorOptions = MultiValueTextOperatorOptions;
|
|
242
|
+
exports.TypeToOperatorOptions = TypeToOperatorOptions;
|
|
243
|
+
exports.operatorOptionsFor = operatorOptionsFor;
|
|
244
|
+
exports.useFilterField = useFilterField;
|
|
245
|
+
//# sourceMappingURL=useFilterField.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFilterField.cjs","sources":["../../../../src/components/filterform/useFilterField.tsx"],"sourcesContent":["import * as React from 'react'\nimport {\n FilterConfig,\n FilterType,\n FormFilter,\n NumberOptionsType,\n Operator,\n SelectOptionsType,\n} from './types'\nimport {\n isMultiValueTextOperator,\n normalizeMultiValues,\n validateFormFilter,\n} from './filterHelpers'\nexport { isMultiValueTextOperator } from './filterHelpers'\nexport type UseFilterFieldInputs = {\n filterConfigs: FilterConfig[]\n filter?: FormFilter\n}\n\ntype UseFilterFieldOutputs = {\n filter: FormFilter | undefined\n config: FilterConfig | undefined\n operatorOptions: { label: string; value: string }[]\n valueInputConfig: ValueInputConfig | undefined\n handleFieldChange: (value: string) => void\n handleOperatorChange: (value: string) => void\n handleValuesChange: (value: (string | number | undefined | null)[]) => void\n}\n\nexport const TypeToOperatorOptions: Record<\n FilterType,\n { label: string; value: Operator }[]\n> = {\n select: [\n { label: 'is any of', value: 'equals' },\n { label: 'is not any of', value: 'notEqual' },\n { label: 'has no value', value: 'blank' },\n { label: 'has any value', value: 'notBlank' },\n ],\n number: [\n { label: 'is', value: 'equals' },\n { label: 'is not', value: 'notEqual' },\n { label: 'is greater than', value: 'greaterThan' },\n { label: 'is greater than or equal to', value: 'greaterThanOrEqual' },\n { label: 'is less than', value: 'lessThan' },\n { label: 'is less than or equal to', value: 'lessThanOrEqual' },\n { label: 'has no value', value: 'blank' },\n { label: 'has any value', value: 'notBlank' },\n { label: 'is between', value: 'inRange' },\n ],\n text: [\n { label: 'contains', value: 'contains' },\n { label: 'does not contain', value: 'notContains' },\n { label: 'starts with', value: 'startsWith' },\n { label: 'ends with', value: 'endsWith' },\n { label: 'has no value', value: 'blank' },\n { label: 'has any value', value: 'notBlank' },\n ],\n}\n\n// Multi-value exact-match operators for text fields. Deliberately NOT part of\n// `TypeToOperatorOptions.text`: a field only offers them when its\n// `FilterConfig.operators` lists them, so every existing consumer keeps the\n// operator list it has today (see the `operators` doc in types.ts).\nexport const MultiValueTextOperatorOptions: {\n label: string\n value: Operator\n}[] = [\n { label: 'is any of', value: 'isAnyOf' },\n { label: 'is not any of', value: 'isNoneOf' },\n]\n\n/**\n * Operator options a field offers: its type's default list unless the config\n * names its own (`operators`), in which case that list — in the given order,\n * dropping anything the type can't express. `operators` may therefore both\n * narrow the defaults and add the opt-in multi-value text operators.\n */\nexport const operatorOptionsFor = (\n config: FilterConfig\n): { label: string; value: Operator }[] => {\n const defaults = TypeToOperatorOptions[config.type]\n if (!config.operators) return defaults\n const known =\n config.type === 'text'\n ? [...defaults, ...MultiValueTextOperatorOptions]\n : defaults\n return config.operators.flatMap((operator) => {\n const option = known.find((candidate) => candidate.value === operator)\n return option ? [option] : []\n })\n}\n\ntype SelectValueInputConfig = {\n type: 'select'\n valueOptions: { label: string; value: string }[]\n}\n\ntype NumberValueInputConfig = {\n type: 'number'\n inputCount: number\n numberOptions?: { max: number; min: number; step: number }\n}\n\ntype TextValueInputConfig = {\n type: 'text'\n // True for `isAnyOf` / `isNoneOf`: the value input is a chips list rather\n // than a single text box. `maxValues` is the config's cap, if any.\n multiValue?: boolean\n maxValues?: number\n}\n\nexport type ValueInputConfig =\n SelectValueInputConfig | NumberValueInputConfig | TextValueInputConfig\n\ntype FilterFieldState = {\n filter: FormFilter | undefined\n filterConfigs: FilterConfig[]\n config: FilterConfig | undefined\n operatorOptions: { label: string; value: string }[]\n valueInputConfig: ValueInputConfig | undefined\n}\n\ntype Action = {\n type: 'setField' | 'setOperator' | 'initialize'\n payload: string | undefined\n}\ntype SetValuesAction = {\n type: 'setValues'\n payload: (string | number | undefined | null)[]\n}\n\nconst buildValueInputConfig = (\n config: FilterConfig,\n operator: string\n): ValueInputConfig | undefined => {\n if (config.type === 'select') {\n if (operator === 'blank' || operator === 'notBlank') return\n\n return {\n type: 'select',\n valueOptions: (config.options as SelectOptionsType) || [],\n }\n }\n\n if (config.type === 'number') {\n if (operator === 'blank' || operator === 'notBlank') return\n\n return {\n type: 'number',\n inputCount: operator === 'inRange' ? 2 : 1,\n numberOptions: config.options as NumberOptionsType,\n }\n }\n\n if (config.type === 'text') {\n if (operator === 'blank' || operator === 'notBlank') return\n\n return {\n type: 'text',\n multiValue: isMultiValueTextOperator(operator),\n maxValues: config.maxValues,\n }\n }\n}\n\nconst filterFieldReducer = (\n state: FilterFieldState,\n action: Action | SetValuesAction\n) => {\n switch (action.type) {\n case 'setField': {\n const config = state.filterConfigs.find(\n (config) => config.field === action.payload\n )\n\n if (!config) return state\n\n const operatorOptions = operatorOptionsFor(config)\n\n const newFilter = {\n ...state.filter,\n type: config.type,\n field: action.payload,\n operator: operatorOptions[0]?.value,\n values: [],\n } as FormFilter\n\n const pendingFilter = {\n ...newFilter,\n errors: validateFormFilter(newFilter, config),\n }\n\n return {\n ...state,\n filter: pendingFilter,\n config,\n operatorOptions,\n valueInputConfig:\n operatorOptions.length > 0\n ? buildValueInputConfig(config, operatorOptions[0].value)\n : undefined,\n }\n }\n case 'setOperator': {\n if (!state.config) return state\n if (!action.payload) return state\n\n const pendingFilter = {\n ...state.filter,\n operator: action.payload,\n values: [],\n } as FormFilter\n\n return {\n ...state,\n filter: {\n ...pendingFilter,\n errors: validateFormFilter(pendingFilter, state.config),\n },\n valueInputConfig: buildValueInputConfig(state.config, action.payload),\n }\n }\n case 'setValues': {\n if (!state.filter) return state\n\n const values =\n state.filter.type === 'number'\n ? action.payload.map((value) => Number(value))\n : isMultiValueTextOperator(state.filter.operator)\n ? // Normalized on the way into state, not just for display —\n // validation counts and `onSubmit` emit exactly these chips.\n normalizeMultiValues(action.payload)\n : (action.payload.filter(\n (value) => value !== null && value !== undefined\n ) as string[])\n\n const pendingFilter = {\n ...state.filter,\n values: values,\n }\n\n pendingFilter.errors = validateFormFilter(pendingFilter, state.config)\n\n return {\n ...state,\n filter: pendingFilter,\n }\n }\n case 'initialize': {\n const field =\n state.filter?.field ||\n state.filterConfigs.find((config) => !config.disabled)?.field\n const config = state.filterConfigs.find(\n (config) => config.field === field\n )\n\n if (!config) return state\n\n const operatorOptions = operatorOptionsFor(config)\n\n // A persisted filter's operator must still be one this field offers.\n // Configs change between sessions (a field narrowed to `contains`, or\n // one that never opted into the multi-value operators), and the\n // backend may not understand a stale operator — so it falls back to\n // the field's first operator with its values cleared, rather than\n // re-submitting something the config no longer allows.\n const persisted = state.filter?.operator\n const persistedAllowed =\n persisted !== undefined &&\n operatorOptions.some((option) => option.value === persisted)\n const operator = persistedAllowed ? persisted : operatorOptions[0]?.value\n\n let filter: FormFilter\n if (!state.filter) {\n filter = {\n field,\n type: config.type,\n operator,\n values: [],\n } as FormFilter\n } else if (!persistedAllowed) {\n filter = { ...state.filter, operator, values: [] } as FormFilter\n } else if (isMultiValueTextOperator(operator)) {\n // Same normalization as `setValues`, so a persisted chip list that\n // predates it (or was hand-edited) can't show one chip and count two.\n filter = {\n ...state.filter,\n values: normalizeMultiValues(state.filter.values),\n }\n } else {\n // A copy: the incoming object is the caller's, and writing `errors`\n // onto it would hide the correction from `FilterInput`'s comparison\n // of what it was given against what it initialized to.\n filter = { ...state.filter }\n }\n\n filter.errors = validateFormFilter(filter, config)\n\n return {\n ...state,\n config,\n filter,\n operatorOptions,\n valueInputConfig:\n operatorOptions.length > 0\n ? buildValueInputConfig(config, operator)\n : undefined,\n }\n }\n default:\n return state\n }\n}\n\nexport const useFilterField = ({\n filterConfigs,\n filter: initialFilter,\n}: UseFilterFieldInputs): UseFilterFieldOutputs => {\n const [{ filter, config, operatorOptions, valueInputConfig }, dispatch] =\n React.useReducer(\n filterFieldReducer,\n {\n filter: initialFilter,\n filterConfigs,\n config: undefined,\n operatorOptions: [],\n valueInputConfig: undefined,\n },\n (state) => {\n return filterFieldReducer(state, {\n type: 'initialize',\n payload: undefined,\n })\n }\n )\n\n const handleFieldChange = (value: string) => {\n dispatch({\n type: 'setField',\n payload: value,\n })\n }\n\n const handleOperatorChange = (value: string) => {\n dispatch({\n type: 'setOperator',\n payload: value,\n })\n }\n\n const handleValuesChange = (\n value: (string | number | undefined | null)[]\n ) => {\n dispatch({\n type: 'setValues',\n payload: value,\n })\n }\n\n return {\n filter,\n config,\n operatorOptions,\n valueInputConfig,\n handleFieldChange,\n handleOperatorChange,\n handleValuesChange,\n }\n}\n"],"names":["isMultiValueTextOperator","config","validateFormFilter","normalizeMultiValues","React"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { FilterConfig, FilterType, FormFilter, Operator } from './types.js';
|
|
2
|
+
export { isMultiValueTextOperator } from './filterHelpers.js';
|
|
2
3
|
export type UseFilterFieldInputs = {
|
|
3
4
|
filterConfigs: FilterConfig[];
|
|
4
5
|
filter?: FormFilter;
|
|
@@ -19,6 +20,20 @@ export declare const TypeToOperatorOptions: Record<FilterType, {
|
|
|
19
20
|
label: string;
|
|
20
21
|
value: Operator;
|
|
21
22
|
}[]>;
|
|
23
|
+
export declare const MultiValueTextOperatorOptions: {
|
|
24
|
+
label: string;
|
|
25
|
+
value: Operator;
|
|
26
|
+
}[];
|
|
27
|
+
/**
|
|
28
|
+
* Operator options a field offers: its type's default list unless the config
|
|
29
|
+
* names its own (`operators`), in which case that list — in the given order,
|
|
30
|
+
* dropping anything the type can't express. `operators` may therefore both
|
|
31
|
+
* narrow the defaults and add the opt-in multi-value text operators.
|
|
32
|
+
*/
|
|
33
|
+
export declare const operatorOptionsFor: (config: FilterConfig) => {
|
|
34
|
+
label: string;
|
|
35
|
+
value: Operator;
|
|
36
|
+
}[];
|
|
22
37
|
type SelectValueInputConfig = {
|
|
23
38
|
type: 'select';
|
|
24
39
|
valueOptions: {
|
|
@@ -37,7 +52,8 @@ type NumberValueInputConfig = {
|
|
|
37
52
|
};
|
|
38
53
|
type TextValueInputConfig = {
|
|
39
54
|
type: 'text';
|
|
55
|
+
multiValue?: boolean;
|
|
56
|
+
maxValues?: number;
|
|
40
57
|
};
|
|
41
58
|
export type ValueInputConfig = SelectValueInputConfig | NumberValueInputConfig | TextValueInputConfig;
|
|
42
59
|
export declare const useFilterField: ({ filterConfigs, filter: initialFilter, }: UseFilterFieldInputs) => UseFilterFieldOutputs;
|
|
43
|
-
export {};
|