@payfit/unity-components 2.0.0 → 2.1.4
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/dist/esm/components/alert/Alert.js +41 -29
- package/dist/esm/components/alert/parts/AlertTitle.js +8 -8
- package/dist/esm/components/app-layout/AppLayout.d.ts +2 -0
- package/dist/esm/components/app-menu/parts/AppMenuFooter.js +23 -23
- package/dist/esm/components/app-menu/parts/AppMenuHeader.d.ts +1 -1
- package/dist/esm/components/app-menu/parts/AppMenuHeader.js +9 -9
- package/dist/esm/components/autocomplete/Autocomplete.d.ts +0 -9
- package/dist/esm/components/autocomplete/Autocomplete.js +54 -57
- package/dist/esm/components/autocomplete/parts/AutocompleteItem.js +8 -8
- package/dist/esm/components/avatar/Avatar.variants.js +1 -1
- package/dist/esm/components/avatar/parts/AvatarFallback.js +26 -27
- package/dist/esm/components/badge/Badge.js +1 -1
- package/dist/esm/components/breadcrumbs/Breadcrumbs.variant.js +1 -1
- package/dist/esm/components/button/Button.js +6 -6
- package/dist/esm/components/button/Button.variants.d.ts +1 -0
- package/dist/esm/components/button/Button.variants.js +22 -15
- package/dist/esm/components/card/Card.context.d.ts +5 -0
- package/dist/esm/components/card/Card.context.js +14 -0
- package/dist/esm/components/card/Card.d.ts +210 -0
- package/dist/esm/components/card/Card.js +93 -0
- package/dist/esm/components/card/parts/CardContent.d.ts +37 -0
- package/dist/esm/components/card/parts/CardContent.js +8 -0
- package/dist/esm/components/card/parts/CardTitle.d.ts +55 -0
- package/dist/esm/components/card/parts/CardTitle.js +33 -0
- package/dist/esm/components/checkbox/Checkbox.js +38 -30
- package/dist/esm/components/checkbox/Checkbox.variants.d.ts +9 -9
- package/dist/esm/components/checkbox/Checkbox.variants.js +23 -7
- package/dist/esm/components/checkbox/TanstackCheckbox.d.ts +28 -0
- package/dist/esm/components/checkbox/TanstackCheckbox.js +51 -0
- package/dist/esm/components/checkbox/parts/CheckboxIndicator.js +7 -7
- package/dist/esm/components/checkbox-field/CheckboxField.d.ts +2 -0
- package/dist/esm/components/checkbox-field/TanstackCheckboxField.d.ts +14 -0
- package/dist/esm/components/checkbox-field/TanstackCheckboxField.js +40 -0
- package/dist/esm/components/checkbox-group/TanstackCheckboxGroup.d.ts +4 -0
- package/dist/esm/components/checkbox-group/TanstackCheckboxGroup.js +37 -0
- package/dist/esm/components/checkbox-group-field/CheckboxGroupField.d.ts +2 -0
- package/dist/esm/components/checkbox-group-field/TanstackCheckGroupField.d.ts +72 -0
- package/dist/esm/components/checkbox-group-field/TanstackCheckGroupField.js +40 -0
- package/dist/esm/components/client-side-pagination/parts/PaginationNavButton.js +1 -1
- package/dist/esm/components/client-side-pagination/parts/RawPaginationLink.js +10 -10
- package/dist/esm/components/collapsible/parts/CollapsibleContent.js +5 -5
- package/dist/esm/components/collapsible/parts/CollapsibleTitle.js +8 -8
- package/dist/esm/components/data-table/DataTable.d.ts +109 -16
- package/dist/esm/components/data-table/DataTable.js +107 -93
- package/dist/esm/components/data-table/mocks/employee-data.d.ts +1 -0
- package/dist/esm/components/date-calendar/DateCalendar.js +1 -1
- package/dist/esm/components/date-calendar/parts/DateSegmentSelect.js +1 -1
- package/dist/esm/components/date-picker/DatePicker.d.ts +1 -1
- package/dist/esm/components/date-picker/DatePicker.js +59 -50
- package/dist/esm/components/date-picker/TanstackDatePicker.d.ts +22 -0
- package/dist/esm/components/date-picker/TanstackDatePicker.js +53 -0
- package/dist/esm/components/date-picker/parts/DateInput.js +4 -4
- package/dist/esm/components/date-picker-field/DatePickerField.d.ts +2 -0
- package/dist/esm/components/date-picker-field/TanstackDatePickerField.d.ts +71 -0
- package/dist/esm/components/date-picker-field/TanstackDatePickerField.js +41 -0
- package/dist/esm/components/definition-list/DefinitionList.context.d.ts +19 -0
- package/dist/esm/components/definition-list/DefinitionList.d.ts +24 -0
- package/dist/esm/components/definition-list/parts/DefinitionItem.d.ts +25 -0
- package/dist/esm/components/dialog/Dialog.d.ts +34 -22
- package/dist/esm/components/dialog/Dialog.js +90 -52
- package/dist/esm/components/dialog/parts/DialogActions.js +6 -6
- package/dist/esm/components/dialog/parts/DialogTitle.js +7 -4
- package/dist/esm/components/dialog/test-utils.d.ts +28 -0
- package/dist/esm/components/dialog/test-utils.js +78 -0
- package/dist/esm/components/error-state/ErrorState.js +7 -7
- package/dist/esm/components/filter/Filter.controls.d.ts +192 -0
- package/dist/esm/components/filter/Filter.controls.js +45 -0
- package/dist/esm/components/filter/Filter.d.ts +189 -0
- package/dist/esm/components/filter/Filter.js +147 -0
- package/dist/esm/components/filter/Filter.types.d.ts +121 -0
- package/dist/esm/components/filter/hooks/useFilterIds.d.ts +49 -0
- package/dist/esm/components/filter/hooks/useFilterIds.js +13 -0
- package/dist/esm/components/filter/hooks/useFilterState.d.ts +74 -0
- package/dist/esm/components/filter/hooks/useFilterState.js +23 -0
- package/dist/esm/components/filter/hooks/useFilterValue.d.ts +61 -0
- package/dist/esm/components/filter/hooks/useFilterValue.js +31 -0
- package/dist/esm/components/filter/parts/FilterButton.d.ts +75 -0
- package/dist/esm/components/filter/parts/FilterButton.js +55 -0
- package/dist/esm/components/filter/parts/FilterLabel.d.ts +96 -0
- package/dist/esm/components/filter/parts/FilterLabel.js +57 -0
- package/dist/esm/components/filter/parts/FilterPopover.d.ts +95 -0
- package/dist/esm/components/filter/parts/FilterPopover.js +79 -0
- package/dist/esm/components/filter/utils/value-formatters.d.ts +62 -0
- package/dist/esm/components/filter/utils/value-formatters.js +14 -0
- package/dist/esm/components/filter-toolbar/FilterToolbar.d.ts +110 -0
- package/dist/esm/components/filter-toolbar/FilterToolbar.js +172 -0
- package/dist/esm/components/filter-toolbar/FilterToolbar.types.d.ts +119 -0
- package/dist/esm/components/filter-toolbar/hooks/use-filter-toolbar-state.d.ts +96 -0
- package/dist/esm/components/filter-toolbar/hooks/use-filter-toolbar-state.js +132 -0
- package/dist/esm/components/filter-toolbar/parts/AddFilter.d.ts +63 -0
- package/dist/esm/components/filter-toolbar/parts/AddFilter.js +107 -0
- package/dist/esm/components/filter-toolbar/parts/AddFilterItem.d.ts +18 -0
- package/dist/esm/components/filter-toolbar/parts/AddFilterItem.js +18 -0
- package/dist/esm/components/filter-toolbar/utils/filter-adapters.d.ts +93 -0
- package/dist/esm/components/filter-toolbar/utils/filter-adapters.js +88 -0
- package/dist/esm/components/filter-toolbar/utils/normalize-filter-value.d.ts +24 -0
- package/dist/esm/components/filter-toolbar/utils/normalize-filter-value.js +19 -0
- package/dist/esm/components/form/Form.d.ts +2 -0
- package/dist/esm/components/form/TanstackForm.d.ts +24 -0
- package/dist/esm/components/form/TanstackForm.js +29 -0
- package/dist/esm/components/form-field/FormField.d.ts +2 -0
- package/dist/esm/components/form-field/TanstackFormField.context.d.ts +10 -0
- package/dist/esm/components/form-field/TanstackFormField.context.js +14 -0
- package/dist/esm/components/form-field/TanstackFormField.d.ts +49 -0
- package/dist/esm/components/form-field/TanstackFormField.js +46 -0
- package/dist/esm/components/form-field/parts/FormControl.d.ts +2 -0
- package/dist/esm/components/form-field/parts/FormFeedbackText.d.ts +2 -0
- package/dist/esm/components/form-field/parts/FormHelperText.d.ts +2 -0
- package/dist/esm/components/form-field/parts/FormLabel.d.ts +2 -0
- package/dist/esm/components/form-field/parts/RawFormContextualLink.d.ts +2 -0
- package/dist/esm/components/form-field/parts/TanstackFormFeedbackText.d.ts +12 -0
- package/dist/esm/components/form-field/parts/TanstackFormFeedbackText.js +32 -0
- package/dist/esm/components/form-field/parts/TanstackFormHelperText.d.ts +11 -0
- package/dist/esm/components/form-field/parts/TanstackFormHelperText.js +25 -0
- package/dist/esm/components/form-field/parts/TanstackFormLabel.d.ts +8 -0
- package/dist/esm/components/form-field/parts/TanstackFormLabel.js +26 -0
- package/dist/esm/components/form-field/parts/TanstackRawFormContextualLink.d.ts +26 -0
- package/dist/esm/components/form-field/parts/TanstackRawFormContextualLink.js +45 -0
- package/dist/esm/components/icon-button/CircularIconButton.d.ts +9 -9
- package/dist/esm/components/icon-button/CircularIconButton.js +53 -36
- package/dist/esm/components/icon-button/IconButton.variants.d.ts +1 -0
- package/dist/esm/components/icon-button/IconButton.variants.js +44 -28
- package/dist/esm/components/input/Input.js +36 -35
- package/dist/esm/components/input/TanstackInput.d.ts +22 -0
- package/dist/esm/components/input/TanstackInput.js +38 -0
- package/dist/esm/components/label/Label.js +12 -12
- package/dist/esm/components/link/RawLink.js +38 -31
- package/dist/esm/components/list-view/ListView.d.ts +56 -0
- package/dist/esm/components/list-view/ListView.fixtures.d.ts +20 -0
- package/dist/esm/components/list-view/ListView.js +44 -0
- package/dist/esm/components/list-view/parts/ListViewItemLabel.d.ts +34 -0
- package/dist/esm/components/list-view/parts/ListViewItemLabel.js +22 -0
- package/dist/esm/components/list-view/parts/ListViewItemText.d.ts +33 -0
- package/dist/esm/components/list-view/parts/ListViewItemText.js +22 -0
- package/dist/esm/components/list-view/parts/ListViewSection.d.ts +14 -0
- package/dist/esm/components/list-view/parts/ListViewSection.js +21 -0
- package/dist/esm/components/list-view/parts/RawListViewItem.d.ts +102 -0
- package/dist/esm/components/list-view/parts/RawListViewItem.js +80 -0
- package/dist/esm/components/multi-select/MultiSelect.d.ts +5 -7
- package/dist/esm/components/multi-select/MultiSelect.js +199 -176
- package/dist/esm/components/multi-select/MultiselectTypes.d.ts +114 -0
- package/dist/esm/components/multi-select/TanstackMultiSelect.d.ts +7 -0
- package/dist/esm/components/multi-select/TanstackMultiSelect.js +41 -0
- package/dist/esm/components/multi-select/parts/MultiSelectButton.d.ts +2 -0
- package/dist/esm/components/multi-select/parts/MultiSelectButton.js +62 -46
- package/dist/esm/components/multi-select/parts/MultiSelectPopover.js +15 -15
- package/dist/esm/components/multi-select-field/MultiSelectField.d.ts +45 -12
- package/dist/esm/components/multi-select-field/MultiSelectField.js +56 -66
- package/dist/esm/components/multi-select-field/TanstackMultiSelectField.d.ts +92 -0
- package/dist/esm/components/multi-select-field/TanstackMultiSelectField.js +48 -0
- package/dist/esm/components/multi-select-field/test-utils.d.ts +17 -0
- package/dist/esm/components/multi-select-field/test-utils.js +45 -0
- package/dist/esm/components/nav/parts/RawNavItem.js +6 -6
- package/dist/esm/components/navigation-card/NavigationCard.context.d.ts +31 -0
- package/dist/esm/components/navigation-card/NavigationCard.context.js +13 -0
- package/dist/esm/components/navigation-card/NavigationCard.d.ts +46 -0
- package/dist/esm/components/navigation-card/NavigationCard.js +62 -0
- package/dist/esm/components/navigation-card/NavigationCard.types.d.ts +37 -0
- package/dist/esm/components/navigation-card/NavigationCard.variants.d.ts +1147 -0
- package/dist/esm/components/navigation-card/NavigationCard.variants.js +164 -0
- package/dist/esm/components/navigation-card/parts/NavigationCardDescription.d.ts +39 -0
- package/dist/esm/components/navigation-card/parts/NavigationCardDescription.js +22 -0
- package/dist/esm/components/navigation-card/parts/NavigationCardGroup.d.ts +146 -0
- package/dist/esm/components/navigation-card/parts/NavigationCardGroup.js +93 -0
- package/dist/esm/components/navigation-card/parts/NavigationCardLabel.d.ts +32 -0
- package/dist/esm/components/navigation-card/parts/NavigationCardLabel.js +24 -0
- package/dist/esm/components/number-field/NumberField.d.ts +2 -0
- package/dist/esm/components/number-field/TanstackNumberField.d.ts +74 -0
- package/dist/esm/components/number-field/TanstackNumberField.js +44 -0
- package/dist/esm/components/number-input/NumberInput.js +31 -29
- package/dist/esm/components/number-input/TanstackNumberInput.d.ts +58 -0
- package/dist/esm/components/number-input/TanstackNumberInput.js +38 -0
- package/dist/esm/components/page/Page.js +12 -11
- package/dist/esm/components/pagination/parts/RawPaginationLink.js +22 -22
- package/dist/esm/components/pagination/parts/RawPaginationNext.js +13 -13
- package/dist/esm/components/pagination/parts/RawPaginationPrevious.js +10 -10
- package/dist/esm/components/payfit-brand/PayFitBrand.d.ts +4 -0
- package/dist/esm/components/payfit-brand/PayFitBrand.js +30 -22
- package/dist/esm/components/payfit-brand/PayFitPreprod.js +25 -25
- package/dist/esm/components/phone-number/PhoneNumberInput.d.ts +67 -0
- package/dist/esm/components/phone-number/PhoneNumberInput.js +322 -0
- package/dist/esm/components/phone-number/TanstackPhoneNumberInput.d.ts +64 -0
- package/dist/esm/components/phone-number/TanstackPhoneNumberInput.js +33 -0
- package/dist/esm/components/phone-number/parts/PhoneNumberItem.d.ts +42 -0
- package/dist/esm/components/phone-number/parts/PhoneNumberItem.js +68 -0
- package/dist/esm/components/phone-number/unknownFlag.svg.js +4 -0
- package/dist/esm/components/phone-number-field/TanstackPhoneNumberField.d.ts +15 -0
- package/dist/esm/components/phone-number-field/TanstackPhoneNumberField.js +32 -0
- package/dist/esm/components/pill/Pill.d.ts +2 -2
- package/dist/esm/components/pill/Pill.js +8 -8
- package/dist/esm/components/popover/Popover.js +6 -6
- package/dist/esm/components/promo-dialog/PromoDialog.d.ts +149 -0
- package/dist/esm/components/promo-dialog/PromoDialog.js +219 -0
- package/dist/esm/components/promo-dialog/parts/PromoDialogActions.d.ts +44 -0
- package/dist/esm/components/promo-dialog/parts/PromoDialogActions.js +29 -0
- package/dist/esm/components/promo-dialog/parts/PromoDialogContent.d.ts +43 -0
- package/dist/esm/components/promo-dialog/parts/PromoDialogContent.js +20 -0
- package/dist/esm/components/promo-dialog/parts/PromoDialogHero.d.ts +47 -0
- package/dist/esm/components/promo-dialog/parts/PromoDialogHero.js +25 -0
- package/dist/esm/components/promo-dialog/parts/PromoDialogSubtitle.d.ts +53 -0
- package/dist/esm/components/promo-dialog/parts/PromoDialogSubtitle.js +21 -0
- package/dist/esm/components/promo-dialog/parts/PromoDialogTitle.d.ts +6 -0
- package/dist/esm/components/promo-dialog/parts/PromoDialogTitle.js +18 -0
- package/dist/esm/components/radio-button-group/TanstackRadioButtonGroup.d.ts +13 -0
- package/dist/esm/components/radio-button-group/TanstackRadioButtonGroup.js +43 -0
- package/dist/esm/components/radio-button-group/parts/RadioButton.d.ts +29 -11
- package/dist/esm/components/radio-button-group/parts/RadioButton.js +53 -51
- package/dist/esm/components/radio-button-group-field/RadioButtonGroupField.d.ts +2 -0
- package/dist/esm/components/radio-button-group-field/TanstackRadioButtonGroupField.d.ts +13 -0
- package/dist/esm/components/radio-button-group-field/TanstackRadioButtonGroupField.js +38 -0
- package/dist/esm/components/search/Search.js +46 -46
- package/dist/esm/components/segmented-button-group/parts/ToggleButton.js +5 -5
- package/dist/esm/components/select/Select.d.ts +5 -4
- package/dist/esm/components/select/Select.js +53 -45
- package/dist/esm/components/select/TanstackSelect.d.ts +80 -0
- package/dist/esm/components/select/TanstackSelect.js +34 -0
- package/dist/esm/components/select/parts/SearchInput.d.ts +4 -1
- package/dist/esm/components/select/parts/SearchInput.js +49 -31
- package/dist/esm/components/select/parts/SelectButton.js +19 -17
- package/dist/esm/components/select-field/SelectField.d.ts +2 -0
- package/dist/esm/components/select-field/SelectField.js +8 -9
- package/dist/esm/components/select-field/TanstackSelectField.d.ts +124 -0
- package/dist/esm/components/select-field/TanstackSelectField.js +44 -0
- package/dist/esm/components/select-list/SelectList.d.ts +95 -0
- package/dist/esm/components/select-list/SelectList.js +79 -0
- package/dist/esm/components/select-list/SelectList.types.d.ts +29 -0
- package/dist/esm/components/select-list/constants.d.ts +36 -0
- package/dist/esm/components/select-list/constants.js +29 -0
- package/dist/esm/components/select-list/helpers.d.ts +42 -0
- package/dist/esm/components/select-list/helpers.js +48 -0
- package/dist/esm/components/select-list/hooks/useControlledSelection.d.ts +23 -0
- package/dist/esm/components/select-list/hooks/useControlledSelection.js +16 -0
- package/dist/esm/components/select-list/hooks/useSelectedFirstSorting.d.ts +23 -0
- package/dist/esm/components/select-list/hooks/useSelectedFirstSorting.js +31 -0
- package/dist/esm/components/select-list/parts/SelectListEmptyState.d.ts +8 -0
- package/dist/esm/components/select-list/parts/SelectListEmptyState.js +25 -0
- package/dist/esm/components/select-list/parts/SelectListOptGroup.d.ts +118 -0
- package/dist/esm/components/select-list/parts/SelectListOptGroup.js +28 -0
- package/dist/esm/components/select-list/parts/SelectListOption.d.ts +24 -0
- package/dist/esm/components/select-list/parts/SelectListOption.js +72 -0
- package/dist/esm/components/select-list/parts/SelectListSearchInput.d.ts +2 -0
- package/dist/esm/components/select-list/parts/SelectListSearchInput.js +43 -0
- package/dist/esm/components/select-list/parts/SelectedItemsSection.d.ts +54 -0
- package/dist/esm/components/select-list/parts/SelectedItemsSection.js +35 -0
- package/dist/esm/components/select-list/utils/partition.d.ts +13 -0
- package/dist/esm/components/select-list/utils/partition.js +9 -0
- package/dist/esm/components/selectable-button-group/SelectableButtonGroup.context.d.ts +1 -5
- package/dist/esm/components/selectable-button-group/SelectableButtonGroup.d.ts +6 -1
- package/dist/esm/components/selectable-button-group/SelectableButtonGroup.js +23 -23
- package/dist/esm/components/selectable-button-group/TanstackSelectableButtonGroup.d.ts +27 -0
- package/dist/esm/components/selectable-button-group/TanstackSelectableButtonGroup.js +34 -0
- package/dist/esm/components/selectable-button-group/parts/SelectableButton.d.ts +1 -16
- package/dist/esm/components/selectable-button-group/parts/SelectableButton.js +56 -57
- package/dist/esm/components/selectable-button-group-field/SelectableButtonGroupField.d.ts +2 -0
- package/dist/esm/components/selectable-button-group-field/TanstackSelectableButtonGroupField.d.ts +81 -0
- package/dist/esm/components/selectable-button-group-field/TanstackSelectableButtonGroupField.js +47 -0
- package/dist/esm/components/selectable-card/internals/Description.js +1 -1
- package/dist/esm/components/selectable-card/selectable-card-checkbox-group/SelectableCardCheckboxGroup.js +1 -1
- package/dist/esm/components/selectable-card/selectable-card-checkbox-group/TanstackSelectableCardCheckboxGroup.d.ts +26 -0
- package/dist/esm/components/selectable-card/selectable-card-checkbox-group/TanstackSelectableCardCheckboxGroup.js +32 -0
- package/dist/esm/components/selectable-card/selectable-card-checkbox-group/parts/SelectableCardCheckbox.js +24 -24
- package/dist/esm/components/selectable-card/selectable-card-radio-group/SelectableCardRadioGroup.d.ts +2 -0
- package/dist/esm/components/selectable-card/selectable-card-radio-group/SelectableCardRadioGroup.js +12 -14
- package/dist/esm/components/selectable-card/selectable-card-radio-group/TanstackSelectableCardRadioGroup.d.ts +28 -0
- package/dist/esm/components/selectable-card/selectable-card-radio-group/TanstackSelectableCardRadioGroup.js +32 -0
- package/dist/esm/components/selectable-card/selectable-card-radio-group/parts/RadioIndicator.js +14 -13
- package/dist/esm/components/selectable-card/selectable-card-radio-group/parts/SelectableCardRadio.js +27 -25
- package/dist/esm/components/selectable-card/selectableCard.variant.js +5 -5
- package/dist/esm/components/selectable-card-checkbox-group-field/SelectableCardCheckboxGroupField.d.ts +2 -0
- package/dist/esm/components/selectable-card-checkbox-group-field/TanstackSelectableCardCheckboxGroupField.d.ts +10 -0
- package/dist/esm/components/selectable-card-checkbox-group-field/TanstackSelectableCardCheckboxGroupField.js +38 -0
- package/dist/esm/components/selectable-card-radio-group-field/SelectableCardRadioGroupField.d.ts +2 -0
- package/dist/esm/components/selectable-card-radio-group-field/TanstackSelectableCardRadioGroupField.d.ts +10 -0
- package/dist/esm/components/selectable-card-radio-group-field/TanstackSelectableCardRadioGroupField.js +38 -0
- package/dist/esm/components/table/Table.context.d.ts +5 -0
- package/dist/esm/components/table/Table.context.js +14 -13
- package/dist/esm/components/table/Table.d.ts +93 -0
- package/dist/esm/components/table/Table.js +135 -107
- package/dist/esm/components/table/parts/TableBody.js +83 -21
- package/dist/esm/components/table/parts/TableEmptyState.js +6 -6
- package/dist/esm/components/table/parts/TableHeader.js +1 -1
- package/dist/esm/components/table/parts/TablePagination.js +1 -1
- package/dist/esm/components/table/parts/TableRow.js +1 -0
- package/dist/esm/components/tabs/Tabs.variant.d.ts +0 -6
- package/dist/esm/components/tabs/Tabs.variant.js +11 -12
- package/dist/esm/components/task-menu/parts/RawSubTask.js +26 -26
- package/dist/esm/components/task-menu/parts/RawTask.js +32 -28
- package/dist/esm/components/task-menu/parts/TaskGroup.js +30 -26
- package/dist/esm/components/task-menu/parts/task.variants.js +4 -2
- package/dist/esm/components/text/Text.d.ts +11 -1
- package/dist/esm/components/text/Text.js +41 -31
- package/dist/esm/components/text/Text.variants.d.ts +12 -0
- package/dist/esm/components/text/Text.variants.js +4 -0
- package/dist/esm/components/text-area/TanstackTextArea.d.ts +21 -0
- package/dist/esm/components/text-area/TanstackTextArea.js +35 -0
- package/dist/esm/components/text-area/TextArea.js +31 -29
- package/dist/esm/components/text-field/TanstackTextField.d.ts +79 -0
- package/dist/esm/components/text-field/TanstackTextField.js +60 -0
- package/dist/esm/components/text-field/TextField.d.ts +2 -0
- package/dist/esm/components/toast/UnityToast.js +5 -5
- package/dist/esm/components/toast/test-utils.d.ts +36 -0
- package/dist/esm/components/toast/test-utils.js +118 -0
- package/dist/esm/components/toggle-switch/TanstackToggleSwitch.d.ts +46 -0
- package/dist/esm/components/toggle-switch/TanstackToggleSwitch.js +25 -0
- package/dist/esm/components/toggle-switch/ToggleSwitch.d.ts +21 -9
- package/dist/esm/components/toggle-switch/ToggleSwitch.js +71 -32
- package/dist/esm/components/toggle-switch-field/TanstackToggleSwitchField.d.ts +11 -0
- package/dist/esm/components/toggle-switch-field/TanstackToggleSwitchField.js +34 -0
- package/dist/esm/components/toggle-switch-field/ToggleSwitchField.d.ts +2 -0
- package/dist/esm/components/toggle-switch-group/TanstackToggleSwitchGroup.d.ts +57 -0
- package/dist/esm/components/toggle-switch-group/TanstackToggleSwitchGroup.js +23 -0
- package/dist/esm/components/toggle-switch-group/ToggleSwitchGroup.js +1 -1
- package/dist/esm/components/toggle-switch-group-field/TanstackToggleSwitchGroupField.d.ts +19 -0
- package/dist/esm/components/toggle-switch-group-field/TanstackToggleSwitchGroupField.js +50 -0
- package/dist/esm/components/toggle-switch-group-field/ToggleSwitchGroupField.d.ts +2 -0
- package/dist/esm/docs/{table → examples/data}/mocks/employee-columns.d.ts +1 -1
- package/dist/esm/hooks/tanstack-form-context.d.ts +1 -0
- package/dist/esm/hooks/tanstack-form-context.js +8 -0
- package/dist/esm/hooks/use-form.d.ts +2 -0
- package/dist/esm/hooks/use-has-scroll.d.ts +71 -0
- package/dist/esm/hooks/use-has-scroll.js +75 -0
- package/dist/esm/hooks/use-tanstack-form.d.ts +369 -0
- package/dist/esm/hooks/use-tanstack-form.js +209 -0
- package/dist/esm/index.d.ts +44 -20
- package/dist/esm/index.js +457 -394
- package/dist/esm/index.storybook-testing.d.ts +3 -0
- package/dist/esm/integrations/tanstack-router/components/form-contextual-link/FormContextualLink.d.ts +6 -1
- package/dist/esm/integrations/tanstack-router/components/form-contextual-link/TanstackFormContextualLink.d.ts +43 -0
- package/dist/esm/integrations/tanstack-router/components/list-view/ListView.d.ts +34 -0
- package/dist/esm/integrations/tanstack-router/components/list-view/ListView.js +25 -0
- package/dist/esm/integrations/tanstack-router/components/list-view/parts/ListViewItem.d.ts +51 -0
- package/dist/esm/integrations/tanstack-router/components/list-view/parts/ListViewItem.js +32 -0
- package/dist/esm/integrations/tanstack-router/components/navigation-card/NavigationCard.d.ts +73 -0
- package/dist/esm/integrations/tanstack-router/components/navigation-card/NavigationCard.js +37 -0
- package/dist/esm/integrations/tanstack-router/index.d.ts +3 -0
- package/dist/esm/integrations/tanstack-router/utils/decorators.d.ts +1 -1
- package/dist/esm/integrations/tanstack-router.js +32 -26
- package/dist/esm/mocks/employees.d.ts +1 -5
- package/dist/esm/storybook-testing.js +8 -2
- package/dist/esm/storybook-utilities/previewTransform.d.ts +1 -0
- package/dist/esm/utils/scroll-detection.d.ts +77 -0
- package/dist/esm/utils/scroll-detection.js +33 -0
- package/dist/esm/utils/spacing.d.ts +63 -0
- package/dist/esm/utils/spacing.js +15 -0
- package/i18n/en-GB.json +21 -8
- package/i18n/es-ES.json +23 -10
- package/i18n/fr-FR.json +24 -11
- package/package.json +41 -42
- package/dist/esm/components/multi-select/Multiselect.types.d.ts +0 -109
- package/dist/esm/integrations/react-router/v5/UnityReactRouterV5Provider.d.ts +0 -6
- package/dist/esm/integrations/react-router/v5/UnityReactRouterV5Provider.js +0 -28
- package/dist/esm/integrations/react-router/v5/index.d.ts +0 -1
- package/dist/esm/integrations/react-router/v5.js +0 -4
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { jsxs as p, jsx as r } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as B, useState as G, useMemo as f } from "react";
|
|
3
|
+
import { uyTv as H } from "@payfit/unity-themes";
|
|
4
|
+
import { useId as W } from "react-aria";
|
|
5
|
+
import { Toolbar as Y, Group as k } from "react-aria-components";
|
|
6
|
+
import { useIntl as q, FormattedMessage as z } from "react-intl";
|
|
7
|
+
import { Button as J } from "../button/Button.js";
|
|
8
|
+
import { Filter as K } from "../filter/Filter.js";
|
|
9
|
+
import { useFilterToolbarState as Q } from "./hooks/use-filter-toolbar-state.js";
|
|
10
|
+
import { AddFilter as U } from "./parts/AddFilter.js";
|
|
11
|
+
const X = H({
|
|
12
|
+
slots: {
|
|
13
|
+
base: ["uy:flex uy:gap-100 uy:flex-wrap uy:items-center"],
|
|
14
|
+
filters: ["uy:list-none uy:contents"],
|
|
15
|
+
actions: ["uy:contents"]
|
|
16
|
+
}
|
|
17
|
+
}), Z = B(
|
|
18
|
+
({
|
|
19
|
+
filterDefs: a,
|
|
20
|
+
initialValue: F,
|
|
21
|
+
onChange: y,
|
|
22
|
+
onClearFiltersPress: g,
|
|
23
|
+
onAddFilterPress: h,
|
|
24
|
+
...C
|
|
25
|
+
}, L) => {
|
|
26
|
+
const i = q(), s = W(), [M, c] = G(
|
|
27
|
+
/* @__PURE__ */ new Set()
|
|
28
|
+
), {
|
|
29
|
+
appliedFilters: m,
|
|
30
|
+
availableFilterDefs: v,
|
|
31
|
+
filterValues: A,
|
|
32
|
+
status: u,
|
|
33
|
+
addFilter: S,
|
|
34
|
+
clearFilters: T,
|
|
35
|
+
removeFilter: w,
|
|
36
|
+
setFilterValue: n
|
|
37
|
+
} = Q({
|
|
38
|
+
filterDefs: a,
|
|
39
|
+
initialValue: F,
|
|
40
|
+
onChange: y
|
|
41
|
+
}), x = f(
|
|
42
|
+
() => new Map(a.map((t) => [t.id, t])),
|
|
43
|
+
[a]
|
|
44
|
+
), D = (t) => {
|
|
45
|
+
if (t === "all") return;
|
|
46
|
+
const l = Array.from(t).map(String);
|
|
47
|
+
S(l), c((e) => /* @__PURE__ */ new Set([...e, ...l])), h?.(l);
|
|
48
|
+
}, I = () => {
|
|
49
|
+
T(), g?.();
|
|
50
|
+
}, _ = (t, l) => {
|
|
51
|
+
n(t, l);
|
|
52
|
+
}, N = (t) => {
|
|
53
|
+
w(t);
|
|
54
|
+
}, P = (t) => {
|
|
55
|
+
c((l) => {
|
|
56
|
+
const e = new Set(l);
|
|
57
|
+
return e.delete(t), e;
|
|
58
|
+
});
|
|
59
|
+
}, E = u === "WITH_ALL_FILTERS_APPLIED", O = u !== "EMPTY", { base: V, filters: $, actions: j } = X(), d = f(() => ({
|
|
60
|
+
toolbar: i.formatMessage({
|
|
61
|
+
id: "unity:component:filter-toolbar:label",
|
|
62
|
+
defaultMessage: "Filter toolbar"
|
|
63
|
+
}),
|
|
64
|
+
filterList: i.formatMessage({
|
|
65
|
+
id: "unity:component:filter-toolbar:filter-list:label",
|
|
66
|
+
defaultMessage: "Applied filters"
|
|
67
|
+
}),
|
|
68
|
+
filterControls: i.formatMessage({
|
|
69
|
+
id: "unity:component:filter-toolbar:filter-controls:label",
|
|
70
|
+
defaultMessage: "Filter control"
|
|
71
|
+
})
|
|
72
|
+
}), [i]), o = f(() => ({
|
|
73
|
+
filterList: `filter-toolbar-${s}__filter-list`,
|
|
74
|
+
filterControls: `filter-toolbar-${s}__filter-controls`
|
|
75
|
+
}), [s]);
|
|
76
|
+
return /* @__PURE__ */ p(
|
|
77
|
+
Y,
|
|
78
|
+
{
|
|
79
|
+
ref: L,
|
|
80
|
+
className: V(),
|
|
81
|
+
"aria-label": d.toolbar,
|
|
82
|
+
...C,
|
|
83
|
+
children: [
|
|
84
|
+
m.length > 0 && /* @__PURE__ */ r(
|
|
85
|
+
"ul",
|
|
86
|
+
{
|
|
87
|
+
className: $(),
|
|
88
|
+
"aria-live": "polite",
|
|
89
|
+
"aria-atomic": "true",
|
|
90
|
+
"aria-relevant": "additions removals",
|
|
91
|
+
"aria-label": d.filterList,
|
|
92
|
+
id: o.filterList,
|
|
93
|
+
children: m.map((t, l) => {
|
|
94
|
+
const e = x.get(t);
|
|
95
|
+
if (!e) return null;
|
|
96
|
+
const b = A.get(t);
|
|
97
|
+
return /* @__PURE__ */ r("li", { role: "presentation", children: /* @__PURE__ */ r(
|
|
98
|
+
K,
|
|
99
|
+
{
|
|
100
|
+
id: e.id,
|
|
101
|
+
label: e.label,
|
|
102
|
+
value: b,
|
|
103
|
+
onChange: (R) => {
|
|
104
|
+
_(e.id, R);
|
|
105
|
+
},
|
|
106
|
+
renderControl: e.renderControl,
|
|
107
|
+
renderLabel: e.renderLabel,
|
|
108
|
+
isDismissable: !0,
|
|
109
|
+
isDefaultOpen: M.has(t),
|
|
110
|
+
onFilterOpen: () => {
|
|
111
|
+
P(e.id);
|
|
112
|
+
},
|
|
113
|
+
onDismiss: () => {
|
|
114
|
+
N(e.id);
|
|
115
|
+
},
|
|
116
|
+
onClearSelection: () => {
|
|
117
|
+
n(e.id, void 0);
|
|
118
|
+
},
|
|
119
|
+
onConfirmSelection: () => {
|
|
120
|
+
n(e.id, b);
|
|
121
|
+
},
|
|
122
|
+
...e.filterProps
|
|
123
|
+
}
|
|
124
|
+
) }, `filter-item-${l}`);
|
|
125
|
+
})
|
|
126
|
+
}
|
|
127
|
+
),
|
|
128
|
+
/* @__PURE__ */ p(
|
|
129
|
+
k,
|
|
130
|
+
{
|
|
131
|
+
className: j(),
|
|
132
|
+
"aria-label": d.filterControls,
|
|
133
|
+
id: o.filterControls,
|
|
134
|
+
children: [
|
|
135
|
+
/* @__PURE__ */ r(
|
|
136
|
+
U,
|
|
137
|
+
{
|
|
138
|
+
availableFilterDefs: [...v],
|
|
139
|
+
isDisabled: E,
|
|
140
|
+
onSelectionChange: D,
|
|
141
|
+
"aria-controls": o.filterControls
|
|
142
|
+
}
|
|
143
|
+
),
|
|
144
|
+
O && /* @__PURE__ */ r(
|
|
145
|
+
J,
|
|
146
|
+
{
|
|
147
|
+
variant: "ghost",
|
|
148
|
+
color: "neutral",
|
|
149
|
+
onPress: I,
|
|
150
|
+
"aria-controls": o.filterList,
|
|
151
|
+
children: /* @__PURE__ */ r(
|
|
152
|
+
z,
|
|
153
|
+
{
|
|
154
|
+
id: "unity:component:filter-toolbar:clear-filters:label",
|
|
155
|
+
defaultMessage: "Clear filters"
|
|
156
|
+
}
|
|
157
|
+
)
|
|
158
|
+
}
|
|
159
|
+
)
|
|
160
|
+
]
|
|
161
|
+
}
|
|
162
|
+
)
|
|
163
|
+
]
|
|
164
|
+
}
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
);
|
|
168
|
+
Z.displayName = "FilterToolbar";
|
|
169
|
+
export {
|
|
170
|
+
Z as FilterToolbar,
|
|
171
|
+
X as filterToolbar
|
|
172
|
+
};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { FilterDisplayProps, FilterEventProps, FilterProps } from '../filter/Filter.types.js';
|
|
2
|
+
import { AppliedFilter, SerializableAppliedFilter } from './hooks/use-filter-toolbar-state.js';
|
|
3
|
+
export type { AppliedFilter, SerializableAppliedFilter };
|
|
4
|
+
/**
|
|
5
|
+
* Defines the configuration for an individual filter within the FilterToolbar.
|
|
6
|
+
* Each FilterDef specifies how a filter should render its control UI, display selected values,
|
|
7
|
+
* and handle user interactions.
|
|
8
|
+
* @template TDataType - The type of data this filter works with (e.g., string, number, string[], etc.)
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* const statusFilterDef: FilterDef<string> = {
|
|
12
|
+
* id: 'status',
|
|
13
|
+
* label: 'Employee Status',
|
|
14
|
+
* renderControl: (value, onChange) => (
|
|
15
|
+
* <Select value={value} onChange={onChange}>
|
|
16
|
+
* <Option value="active">Active</Option>
|
|
17
|
+
* <Option value="inactive">Inactive</Option>
|
|
18
|
+
* </Select>
|
|
19
|
+
* ),
|
|
20
|
+
* renderLabel: (value) => value,
|
|
21
|
+
* filterProps: {
|
|
22
|
+
* prefixIcon: 'filter',
|
|
23
|
+
* maxVisibleValues: 2
|
|
24
|
+
* }
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export interface FilterDef<TDataType = unknown> {
|
|
29
|
+
/**
|
|
30
|
+
* Unique identifier for the filter. Used to track filter state and must be unique across all filters in the toolbar.
|
|
31
|
+
*/
|
|
32
|
+
id: string;
|
|
33
|
+
/**
|
|
34
|
+
* Display label shown on the filter button.
|
|
35
|
+
*/
|
|
36
|
+
label: string;
|
|
37
|
+
/**
|
|
38
|
+
* Render function that provides the control UI for selecting filter values.
|
|
39
|
+
* Receives the current value and an onChange callback to update the value.
|
|
40
|
+
* @param value - The current filter value
|
|
41
|
+
* @param onChange - Callback to update the filter value
|
|
42
|
+
* @returns ReactNode representing the filter control (e.g., Select, Checkbox group, DatePicker)
|
|
43
|
+
*/
|
|
44
|
+
renderControl: FilterProps<TDataType>['renderControl'];
|
|
45
|
+
/**
|
|
46
|
+
* render function to customize how selected values are displayed in the filter button.
|
|
47
|
+
* If not provided, values are rendered as strings or comma-separated lists for arrays.
|
|
48
|
+
* @param value - The current filter value
|
|
49
|
+
* @returns ReactNode representing the formatted value display
|
|
50
|
+
*/
|
|
51
|
+
renderLabel?: FilterProps<TDataType>['renderLabel'];
|
|
52
|
+
/**
|
|
53
|
+
* Optional additional props to customize the filter button appearance and behavior.
|
|
54
|
+
* Accepts a subset of Filter component props including display and event handler props.
|
|
55
|
+
*/
|
|
56
|
+
filterProps?: Partial<FilterDisplayProps & FilterEventProps>;
|
|
57
|
+
/**
|
|
58
|
+
* Index signature allowing additional custom properties for extended filter definitions.
|
|
59
|
+
*/
|
|
60
|
+
[key: string]: unknown;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Props for the FilterToolbar component.
|
|
64
|
+
* @example
|
|
65
|
+
* ```tsx
|
|
66
|
+
* const filterToolbarProps: FilterToolbarProps = {
|
|
67
|
+
* filterDefs: [
|
|
68
|
+
* { id: 'status', label: 'Status', renderControl: (v, onChange) => <Select value={v} onChange={onChange} /> }
|
|
69
|
+
* ],
|
|
70
|
+
* initialValue: [{ id: 'status', value: 'active' }],
|
|
71
|
+
* onChange: (filters) => console.log('Filters changed:', filters),
|
|
72
|
+
* onClearFiltersPress: () => console.log('Filters cleared'),
|
|
73
|
+
* onAddFilterPress: (filterIds) => console.log('Filters added:', filterIds)
|
|
74
|
+
* }
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export type FilterToolbarProps = {
|
|
78
|
+
/**
|
|
79
|
+
* Array of filter definitions that configure the available filters in the toolbar.
|
|
80
|
+
* Each definition specifies the filter's UI, behavior, and data type.
|
|
81
|
+
*/
|
|
82
|
+
filterDefs: FilterDef[];
|
|
83
|
+
/**
|
|
84
|
+
* Optional array of filters to prepopulate the toolbar on initial render.
|
|
85
|
+
* Use this to restore previously applied filters or set default filters.
|
|
86
|
+
* @default undefined
|
|
87
|
+
*/
|
|
88
|
+
initialValue?: AppliedFilter[];
|
|
89
|
+
/**
|
|
90
|
+
* Callback invoked whenever the filter state changes (filters added, removed, or values modified).
|
|
91
|
+
* Receives an array of serializable filter objects containing filter IDs and their current values.
|
|
92
|
+
* @param filters - Array of currently applied filters with their values
|
|
93
|
+
* @default undefined
|
|
94
|
+
*/
|
|
95
|
+
onChange?: (filters: SerializableAppliedFilter[]) => void;
|
|
96
|
+
/**
|
|
97
|
+
* Callback invoked when the user presses the "Clear filters" button.
|
|
98
|
+
* Use this to perform additional cleanup or analytics tracking.
|
|
99
|
+
* @default undefined
|
|
100
|
+
*/
|
|
101
|
+
onClearFiltersPress?: () => void;
|
|
102
|
+
/**
|
|
103
|
+
* Callback invoked when the user adds one or more filters using the "Add filter" button.
|
|
104
|
+
* Receives the ID(s) of the newly added filter(s).
|
|
105
|
+
* @param filterId - Single filter ID or array of filter IDs that were added
|
|
106
|
+
* @default undefined
|
|
107
|
+
*/
|
|
108
|
+
onAddFilterPress?: (filterId: string | string[]) => void;
|
|
109
|
+
/**
|
|
110
|
+
* Custom label for the "Add filter" button.
|
|
111
|
+
* @default "Add filter" (internationalized)
|
|
112
|
+
*/
|
|
113
|
+
addFilterLabel?: string;
|
|
114
|
+
/**
|
|
115
|
+
* Custom label for the "Clear filters" button.
|
|
116
|
+
* @default "Clear filters" (internationalized)
|
|
117
|
+
*/
|
|
118
|
+
clearAllLabel?: string;
|
|
119
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents a filter that has been added to the toolbar with an optional value.
|
|
3
|
+
* Used internally to track applied filters and their current state.
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export type AppliedFilter = {
|
|
7
|
+
/** Unique identifier matching a filter definition ID */
|
|
8
|
+
id: string;
|
|
9
|
+
/** Optional value for the filter, can be any type supported by the filter's control */
|
|
10
|
+
value?: unknown;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Serializable representation of an applied filter suitable for URL parameters or JSON storage.
|
|
14
|
+
* Filter values are normalized to strings or string arrays for consistent serialization.
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export type SerializableAppliedFilter = {
|
|
18
|
+
/** Unique identifier matching a filter definition ID */
|
|
19
|
+
id: string;
|
|
20
|
+
/** Normalized filter value as string or string array */
|
|
21
|
+
value?: string | string[];
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Minimal filter definition interface required for state management.
|
|
25
|
+
* Extends this interface to add additional properties specific to your filter implementation.
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
export type FilterDefBase = {
|
|
29
|
+
/** Unique identifier for the filter */
|
|
30
|
+
id: string;
|
|
31
|
+
/** Index signature allowing additional custom properties */
|
|
32
|
+
[key: string]: unknown;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Configuration parameters for the useFilterToolbarState hook.
|
|
36
|
+
* @template T - Filter definition type extending FilterDefBase
|
|
37
|
+
* @internal
|
|
38
|
+
*/
|
|
39
|
+
export type UseFilterToolbarStateParams<T extends FilterDefBase = FilterDefBase> = {
|
|
40
|
+
/** Array of available filter definitions */
|
|
41
|
+
filterDefs: T[];
|
|
42
|
+
/** Optional initial filters to prepopulate the toolbar */
|
|
43
|
+
initialValue?: AppliedFilter[];
|
|
44
|
+
/** Callback invoked when filter state changes */
|
|
45
|
+
onChange?: (appliedFilters: SerializableAppliedFilter[]) => void;
|
|
46
|
+
};
|
|
47
|
+
type FilterToolbarStatus = 'EMPTY' | 'WITH_SOME_FILTERS_APPLIED' | 'WITH_ALL_FILTERS_APPLIED';
|
|
48
|
+
/**
|
|
49
|
+
* Return value from the useFilterToolbarState hook providing state and actions.
|
|
50
|
+
* @template T - Filter definition type extending FilterDefBase
|
|
51
|
+
* @internal
|
|
52
|
+
*/
|
|
53
|
+
export type UseFilterToolbarStateReturn<T extends FilterDefBase = FilterDefBase> = {
|
|
54
|
+
/** Current status of the toolbar */
|
|
55
|
+
status: FilterToolbarStatus;
|
|
56
|
+
/** Array of currently applied filter IDs in order */
|
|
57
|
+
appliedFilters: readonly string[];
|
|
58
|
+
/** Array of filter IDs that haven't been applied yet */
|
|
59
|
+
remainingFilters: readonly string[];
|
|
60
|
+
/** Filter definitions for filters that haven't been applied */
|
|
61
|
+
availableFilterDefs: T[];
|
|
62
|
+
/** Map of filter IDs to their current values */
|
|
63
|
+
filterValues: ReadonlyMap<string, unknown>;
|
|
64
|
+
/** Add one or more filters to the toolbar */
|
|
65
|
+
addFilter: (filterId: string | string[]) => void;
|
|
66
|
+
/** Remove one or more filters from the toolbar */
|
|
67
|
+
removeFilter: (filterId: string | string[]) => void;
|
|
68
|
+
/** Clear all applied filters */
|
|
69
|
+
clearFilters: () => void;
|
|
70
|
+
/** Set the value for a specific filter */
|
|
71
|
+
setFilterValue: (filterId: string, value: unknown) => void;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Manages the state for a filter toolbar, handling filter application, removal, and value updates.
|
|
75
|
+
* This hook provides a complete state management solution for dynamic filter toolbars where users can
|
|
76
|
+
* add and remove filters on demand. It maintains an internal reducer for efficient state updates and
|
|
77
|
+
* provides serializable filter values through callbacks.
|
|
78
|
+
* @template T - Filter definition type extending FilterDefBase
|
|
79
|
+
* @param params - Configuration including filter definitions, initial values, and change callback
|
|
80
|
+
* @returns State and action handlers for the filter toolbar
|
|
81
|
+
* @example
|
|
82
|
+
* ```tsx
|
|
83
|
+
* const { appliedFilters, addFilter, setFilterValue } = useFilterToolbarState({
|
|
84
|
+
* filterDefs: [
|
|
85
|
+
* { id: 'status', label: 'Status' },
|
|
86
|
+
* { id: 'department', label: 'Department' }
|
|
87
|
+
* ],
|
|
88
|
+
* onChange: (filters) => {
|
|
89
|
+
* console.log('Filters changed:', filters)
|
|
90
|
+
* }
|
|
91
|
+
* })
|
|
92
|
+
* ```
|
|
93
|
+
* @internal
|
|
94
|
+
*/
|
|
95
|
+
export declare function useFilterToolbarState<T extends FilterDefBase = FilterDefBase>(params: UseFilterToolbarStateParams<T>): UseFilterToolbarStateReturn<T>;
|
|
96
|
+
export {};
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { useMemo as u, useReducer as g, useCallback as c } from "react";
|
|
2
|
+
import { normalizeFilterValue as M } from "../utils/normalize-filter-value.js";
|
|
3
|
+
function v(E) {
|
|
4
|
+
return (r, d) => {
|
|
5
|
+
switch (d.type) {
|
|
6
|
+
case "ADD_FILTERS": {
|
|
7
|
+
const t = new Set(r.appliedFilters);
|
|
8
|
+
let s = !1;
|
|
9
|
+
for (const a of d.payload)
|
|
10
|
+
E.has(a) && !t.has(a) && (t.add(a), s = !0);
|
|
11
|
+
return s ? { appliedFilters: t, filterValues: r.filterValues } : r;
|
|
12
|
+
}
|
|
13
|
+
case "REMOVE_FILTERS": {
|
|
14
|
+
const t = new Set(r.appliedFilters), s = new Map(r.filterValues);
|
|
15
|
+
let a = !1;
|
|
16
|
+
for (const F of d.payload)
|
|
17
|
+
t.delete(F) && (s.delete(F), a = !0);
|
|
18
|
+
return a ? { appliedFilters: t, filterValues: s } : r;
|
|
19
|
+
}
|
|
20
|
+
case "CLEAR_FILTERS":
|
|
21
|
+
return { appliedFilters: /* @__PURE__ */ new Set(), filterValues: /* @__PURE__ */ new Map() };
|
|
22
|
+
case "SET_FILTER_VALUE": {
|
|
23
|
+
const { filterId: t, value: s } = d.payload;
|
|
24
|
+
if (!r.appliedFilters.has(t))
|
|
25
|
+
return r;
|
|
26
|
+
const a = new Map(r.filterValues);
|
|
27
|
+
if (s == null) {
|
|
28
|
+
if (!a.has(t))
|
|
29
|
+
return r;
|
|
30
|
+
a.delete(t);
|
|
31
|
+
} else {
|
|
32
|
+
if (a.get(t) === s)
|
|
33
|
+
return r;
|
|
34
|
+
a.set(t, s);
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
appliedFilters: r.appliedFilters,
|
|
38
|
+
filterValues: a
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
default:
|
|
42
|
+
return r;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function D(E) {
|
|
47
|
+
const { filterDefs: r, initialValue: d, onChange: t } = E, s = u(
|
|
48
|
+
() => new Set(r.map((e) => e.id)),
|
|
49
|
+
[r]
|
|
50
|
+
), a = u(() => {
|
|
51
|
+
const e = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Map();
|
|
52
|
+
if (d)
|
|
53
|
+
for (const n of d) {
|
|
54
|
+
const o = n.id, p = n.value;
|
|
55
|
+
s.has(o) && (e.add(o), p != null && i.set(o, p));
|
|
56
|
+
}
|
|
57
|
+
return { appliedFilters: e, filterValues: i };
|
|
58
|
+
}, [d, s]), F = u(() => v(s), [s]), [l, V] = g(F, a), S = u(
|
|
59
|
+
() => Array.from(l.appliedFilters),
|
|
60
|
+
[l.appliedFilters]
|
|
61
|
+
), y = u(() => Array.from(s).filter(
|
|
62
|
+
(e) => !l.appliedFilters.has(e)
|
|
63
|
+
), [s, l.appliedFilters]), L = u(() => {
|
|
64
|
+
const e = [];
|
|
65
|
+
for (const i of r)
|
|
66
|
+
l.appliedFilters.has(i.id) || e.push(i);
|
|
67
|
+
return e;
|
|
68
|
+
}, [r, l.appliedFilters]), R = u(() => {
|
|
69
|
+
const e = l.appliedFilters.size, i = s.size;
|
|
70
|
+
return e === 0 ? "EMPTY" : i > 0 && e === i ? "WITH_ALL_FILTERS_APPLIED" : "WITH_SOME_FILTERS_APPLIED";
|
|
71
|
+
}, [l.appliedFilters.size, s.size]), f = c(
|
|
72
|
+
(e, i) => Array.from(e).map((n) => ({
|
|
73
|
+
id: n,
|
|
74
|
+
value: M(i.get(n))
|
|
75
|
+
})),
|
|
76
|
+
[]
|
|
77
|
+
), T = c(
|
|
78
|
+
(e) => {
|
|
79
|
+
const i = Array.isArray(e) ? e : [e], n = new Set(l.appliedFilters);
|
|
80
|
+
let o = !1;
|
|
81
|
+
for (const p of i)
|
|
82
|
+
s.has(p) && !n.has(p) && (n.add(p), o = !0);
|
|
83
|
+
o && (V({ type: "ADD_FILTERS", payload: i }), t && t(f(n, l.filterValues)));
|
|
84
|
+
},
|
|
85
|
+
[
|
|
86
|
+
t,
|
|
87
|
+
l.appliedFilters,
|
|
88
|
+
l.filterValues,
|
|
89
|
+
s,
|
|
90
|
+
f
|
|
91
|
+
]
|
|
92
|
+
), m = c(
|
|
93
|
+
(e) => {
|
|
94
|
+
const i = Array.isArray(e) ? e : [e], n = new Set(l.appliedFilters);
|
|
95
|
+
let o = !1;
|
|
96
|
+
for (const p of i)
|
|
97
|
+
n.delete(p) && (o = !0);
|
|
98
|
+
if (o && (V({ type: "REMOVE_FILTERS", payload: i }), t)) {
|
|
99
|
+
const p = new Map(l.filterValues);
|
|
100
|
+
for (const A of i)
|
|
101
|
+
p.delete(A);
|
|
102
|
+
t(f(n, p));
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
[t, l.appliedFilters, l.filterValues, f]
|
|
106
|
+
), w = c(() => {
|
|
107
|
+
l.appliedFilters.size > 0 && (V({ type: "CLEAR_FILTERS" }), t && t([]));
|
|
108
|
+
}, [t, l.appliedFilters.size]), _ = c(
|
|
109
|
+
(e, i) => {
|
|
110
|
+
const n = l.filterValues.get(e), o = i == null, p = l.filterValues.has(e);
|
|
111
|
+
if (l.appliedFilters.has(e) && (o ? p : n !== i) && (V({ type: "SET_FILTER_VALUE", payload: { filterId: e, value: i } }), t)) {
|
|
112
|
+
const h = new Map(l.filterValues);
|
|
113
|
+
o ? h.delete(e) : h.set(e, i), t(f(l.appliedFilters, h));
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
[t, l.appliedFilters, l.filterValues, f]
|
|
117
|
+
);
|
|
118
|
+
return {
|
|
119
|
+
status: R,
|
|
120
|
+
appliedFilters: S,
|
|
121
|
+
remainingFilters: y,
|
|
122
|
+
availableFilterDefs: L,
|
|
123
|
+
filterValues: l.filterValues,
|
|
124
|
+
addFilter: T,
|
|
125
|
+
removeFilter: m,
|
|
126
|
+
clearFilters: w,
|
|
127
|
+
setFilterValue: _
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
export {
|
|
131
|
+
D as useFilterToolbarState
|
|
132
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { VariantProps } from '@payfit/unity-themes';
|
|
2
|
+
import { Selection } from 'react-aria-components';
|
|
3
|
+
import { FilterDef } from '../FilterToolbar.types.js';
|
|
4
|
+
export interface AddFilterProps extends VariantProps<typeof addFilter> {
|
|
5
|
+
/** Available filter definitions that can be added */
|
|
6
|
+
availableFilterDefs: FilterDef[];
|
|
7
|
+
/** Callback invoked when user selects filters to add */
|
|
8
|
+
onSelectionChange?: (selection: Selection) => void;
|
|
9
|
+
/** Whether the add filter button is disabled */
|
|
10
|
+
isDisabled?: boolean;
|
|
11
|
+
}
|
|
12
|
+
declare const addFilter: import('tailwind-variants').TVReturnType<{
|
|
13
|
+
[key: string]: {
|
|
14
|
+
[key: string]: import('tailwind-merge').ClassNameValue | {
|
|
15
|
+
button?: import('tailwind-merge').ClassNameValue;
|
|
16
|
+
listbox?: import('tailwind-merge').ClassNameValue;
|
|
17
|
+
icon?: import('tailwind-merge').ClassNameValue;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
} | {
|
|
21
|
+
[x: string]: {
|
|
22
|
+
[x: string]: import('tailwind-merge').ClassNameValue | {
|
|
23
|
+
button?: import('tailwind-merge').ClassNameValue;
|
|
24
|
+
listbox?: import('tailwind-merge').ClassNameValue;
|
|
25
|
+
icon?: import('tailwind-merge').ClassNameValue;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
} | {}, {
|
|
29
|
+
button: string[];
|
|
30
|
+
icon: string[];
|
|
31
|
+
listbox: string[];
|
|
32
|
+
}, undefined, {
|
|
33
|
+
[key: string]: {
|
|
34
|
+
[key: string]: import('tailwind-merge').ClassNameValue | {
|
|
35
|
+
button?: import('tailwind-merge').ClassNameValue;
|
|
36
|
+
listbox?: import('tailwind-merge').ClassNameValue;
|
|
37
|
+
icon?: import('tailwind-merge').ClassNameValue;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
} | {}, {
|
|
41
|
+
button: string[];
|
|
42
|
+
icon: string[];
|
|
43
|
+
listbox: string[];
|
|
44
|
+
}, import('tailwind-variants').TVReturnType<unknown, {
|
|
45
|
+
button: string[];
|
|
46
|
+
icon: string[];
|
|
47
|
+
listbox: string[];
|
|
48
|
+
}, undefined, unknown, unknown, undefined>>;
|
|
49
|
+
/**
|
|
50
|
+
* Internal component that renders the "Add filter" button and popover menu.
|
|
51
|
+
* Displays a list of available filters that users can add to the toolbar.
|
|
52
|
+
* The popover closes automatically when a filter is selected.
|
|
53
|
+
* @param props - AddFilter component props
|
|
54
|
+
* @param props.availableFilterDefs - Available filter definitions that can be added
|
|
55
|
+
* @param props.onSelectionChange - Callback invoked when user selects filters to add
|
|
56
|
+
* @param props.isDisabled - Whether the add filter button is disabled
|
|
57
|
+
* @internal
|
|
58
|
+
*/
|
|
59
|
+
declare const AddFilter: {
|
|
60
|
+
({ availableFilterDefs, onSelectionChange, isDisabled, ...rest }: AddFilterProps): import("react/jsx-runtime").JSX.Element;
|
|
61
|
+
displayName: string;
|
|
62
|
+
};
|
|
63
|
+
export { AddFilter };
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { jsxs as s, Fragment as y, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { useState as g, useRef as h } from "react";
|
|
3
|
+
import { Icon as v } from "@payfit/unity-icons";
|
|
4
|
+
import { uyTv as x } from "@payfit/unity-themes";
|
|
5
|
+
import { Button as F, Popover as N, Dialog as M, ListBox as A } from "react-aria-components";
|
|
6
|
+
import { useIntl as O, FormattedMessage as P } from "react-intl";
|
|
7
|
+
import { filterPopover as w } from "../../filter/parts/FilterPopover.js";
|
|
8
|
+
import { AddFilterItem as I } from "./AddFilterItem.js";
|
|
9
|
+
const S = x({
|
|
10
|
+
slots: {
|
|
11
|
+
button: [
|
|
12
|
+
"uy:flex uy:group uy:items-center",
|
|
13
|
+
"uy:rounded-sm",
|
|
14
|
+
"uy:border uy:border-solid",
|
|
15
|
+
"uy:cursor-pointer uy:data-[disabled=true]:cursor-not-allowed",
|
|
16
|
+
"uy:w-fit uy:p-100 uy:pl-100 uy:pr-150",
|
|
17
|
+
"uy:typography-action",
|
|
18
|
+
"uy:border-border-form-enabled uy:bg-surface-form-enabled uy:text-content-form-enabled",
|
|
19
|
+
"uy:hover:border-border-form-hover uy:hover:bg-surface-form-hover",
|
|
20
|
+
"uy:data-[pressed=true]:border-border-form-pressed uy:data-[pressed=true]:bg-surface-form-pressed",
|
|
21
|
+
"uy:data-[disabled=true]:border-border-form-disabled uy:data-[disabled=true]:bg-surface-form-disabled uy:data-[disabled=true]:text-content-form-disabled",
|
|
22
|
+
"uy:focus-visible:outline-2 uy:focus-visible:outline-offset-2 uy:focus-visible:outline-utility-focus-ring"
|
|
23
|
+
],
|
|
24
|
+
icon: [
|
|
25
|
+
"uy:p-0.25",
|
|
26
|
+
"uy:text-content-neutral-low",
|
|
27
|
+
"uy:group-data-[status=active]:text-content-primary-enabled",
|
|
28
|
+
"uy:group-data-[disabled=true]:text-content-neutral-disabled"
|
|
29
|
+
],
|
|
30
|
+
listbox: ["uy:p-100"]
|
|
31
|
+
}
|
|
32
|
+
}), j = ({
|
|
33
|
+
availableFilterDefs: a,
|
|
34
|
+
onSelectionChange: l,
|
|
35
|
+
isDisabled: d = !1,
|
|
36
|
+
...i
|
|
37
|
+
}) => {
|
|
38
|
+
const u = O(), [n, r] = g(!1), o = h(null), { popover: c, dialog: f } = w(), { icon: m, button: b, listbox: p } = S();
|
|
39
|
+
return /* @__PURE__ */ s(y, { children: [
|
|
40
|
+
/* @__PURE__ */ s(
|
|
41
|
+
F,
|
|
42
|
+
{
|
|
43
|
+
className: b(),
|
|
44
|
+
ref: o,
|
|
45
|
+
onPress: () => {
|
|
46
|
+
r(!0);
|
|
47
|
+
},
|
|
48
|
+
isDisabled: d,
|
|
49
|
+
...i,
|
|
50
|
+
children: [
|
|
51
|
+
/* @__PURE__ */ e(
|
|
52
|
+
v,
|
|
53
|
+
{
|
|
54
|
+
src: "PlusOutlined",
|
|
55
|
+
role: "presentation",
|
|
56
|
+
size: 20,
|
|
57
|
+
className: m()
|
|
58
|
+
}
|
|
59
|
+
),
|
|
60
|
+
/* @__PURE__ */ e(
|
|
61
|
+
P,
|
|
62
|
+
{
|
|
63
|
+
id: "unity:component:filter-toolbar:add-filter:label",
|
|
64
|
+
defaultMessage: "Add filter"
|
|
65
|
+
}
|
|
66
|
+
)
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
),
|
|
70
|
+
/* @__PURE__ */ e(
|
|
71
|
+
N,
|
|
72
|
+
{
|
|
73
|
+
className: c(),
|
|
74
|
+
triggerRef: o,
|
|
75
|
+
isOpen: n,
|
|
76
|
+
onOpenChange: r,
|
|
77
|
+
placement: "bottom start",
|
|
78
|
+
children: /* @__PURE__ */ e(
|
|
79
|
+
M,
|
|
80
|
+
{
|
|
81
|
+
className: f(),
|
|
82
|
+
"aria-label": u.formatMessage({
|
|
83
|
+
id: "unity:component:filter-toolbar:add-filter:popover:label",
|
|
84
|
+
defaultMessage: "Select a filter to add"
|
|
85
|
+
}),
|
|
86
|
+
children: /* @__PURE__ */ e(
|
|
87
|
+
A,
|
|
88
|
+
{
|
|
89
|
+
className: p(),
|
|
90
|
+
selectionMode: "single",
|
|
91
|
+
items: a,
|
|
92
|
+
onSelectionChange: (t) => {
|
|
93
|
+
l?.(t), r(!1);
|
|
94
|
+
},
|
|
95
|
+
children: (t) => /* @__PURE__ */ e(I, { id: t.id, children: t.label })
|
|
96
|
+
}
|
|
97
|
+
)
|
|
98
|
+
}
|
|
99
|
+
)
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
] });
|
|
103
|
+
};
|
|
104
|
+
j.displayName = "AddFilter";
|
|
105
|
+
export {
|
|
106
|
+
j as AddFilter
|
|
107
|
+
};
|