@ouestfrance/sipa-bms-ui 7.14.1
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 +280 -0
- package/dist/assets/animated-icons/AnimatedActivityIcon.vue.d.ts +133 -0
- package/dist/assets/animated-icons/AnimatedCircleHelpIcon.vue.d.ts +133 -0
- package/dist/assets/animated-icons/AnimatedHomeIcon.vue.d.ts +133 -0
- package/dist/components/button/BmsButton.spec.d.ts +1 -0
- package/dist/components/button/BmsButton.vue.d.ts +24 -0
- package/dist/components/button/BmsIconButton.vue.d.ts +23 -0
- package/dist/components/button/UiButton.vue.d.ts +26 -0
- package/dist/components/button/UiButtonLink.vue.d.ts +20 -0
- package/dist/components/feedback/BmsAlert.vue.d.ts +24 -0
- package/dist/components/feedback/BmsBadge.vue.d.ts +18 -0
- package/dist/components/feedback/BmsCaption.vue.d.ts +6 -0
- package/dist/components/feedback/BmsCircularProgress.spec.d.ts +1 -0
- package/dist/components/feedback/BmsCircularProgress.vue.d.ts +6 -0
- package/dist/components/feedback/BmsLoader.spec.d.ts +1 -0
- package/dist/components/feedback/BmsLoader.vue.d.ts +9 -0
- package/dist/components/feedback/BmsTooltip.vue.d.ts +28 -0
- package/dist/components/feedback/UiTooltip.spec.d.ts +1 -0
- package/dist/components/feedback/UiTooltip.vue.d.ts +27 -0
- package/dist/components/feedback/tooltip.helper.d.ts +45 -0
- package/dist/components/feedback/tooltip.helper.spec.d.ts +1 -0
- package/dist/components/form/BmsAutocomplete.vue.d.ts +31 -0
- package/dist/components/form/BmsBetweenInput.vue.d.ts +32 -0
- package/dist/components/form/BmsChip.vue.d.ts +15 -0
- package/dist/components/form/BmsFilePicker.spec.d.ts +1 -0
- package/dist/components/form/BmsFilePicker.vue.d.ts +12 -0
- package/dist/components/form/BmsInputBooleanCheckbox.vue.d.ts +30 -0
- package/dist/components/form/BmsInputCheckboxCaption.spec.d.ts +1 -0
- package/dist/components/form/BmsInputCheckboxCaption.vue.d.ts +31 -0
- package/dist/components/form/BmsInputCheckboxCaptionGroup.vue.d.ts +25 -0
- package/dist/components/form/BmsInputCheckboxGroup.vue.d.ts +24 -0
- package/dist/components/form/BmsInputCode.vue.d.ts +27 -0
- package/dist/components/form/BmsInputDateTime.vue.d.ts +24 -0
- package/dist/components/form/BmsInputFile.spec.d.ts +1 -0
- package/dist/components/form/BmsInputFile.vue.d.ts +27 -0
- package/dist/components/form/BmsInputNumber.spec.d.ts +1 -0
- package/dist/components/form/BmsInputNumber.vue.d.ts +26 -0
- package/dist/components/form/BmsInputRadio.vue.d.ts +28 -0
- package/dist/components/form/BmsInputRadioCaption.vue.d.ts +30 -0
- package/dist/components/form/BmsInputRadioCaptionGroup.vue.d.ts +30 -0
- package/dist/components/form/BmsInputRadioGroup.vue.d.ts +30 -0
- package/dist/components/form/BmsInputText.spec.d.ts +1 -0
- package/dist/components/form/BmsInputText.vue.d.ts +128 -0
- package/dist/components/form/BmsInputToggle.vue.d.ts +15 -0
- package/dist/components/form/BmsSearch.spec.d.ts +1 -0
- package/dist/components/form/BmsSearch.vue.d.ts +187 -0
- package/dist/components/form/BmsSelect.spec.d.ts +1 -0
- package/dist/components/form/BmsSelect.vue.d.ts +34 -0
- package/dist/components/form/BmsTag.vue.d.ts +25 -0
- package/dist/components/form/BmsTextArea.spec.d.ts +1 -0
- package/dist/components/form/BmsTextArea.vue.d.ts +26 -0
- package/dist/components/form/RawAutocomplete.spec.d.ts +1 -0
- package/dist/components/form/RawAutocomplete.vue.d.ts +130 -0
- package/dist/components/form/RawInputText.vue.d.ts +42 -0
- package/dist/components/form/UiBmsInputCheckbox.vue.d.ts +28 -0
- package/dist/components/form/UiBmsSwitch.vue.d.ts +14 -0
- package/dist/components/layout/BmsCard.vue.d.ts +21 -0
- package/dist/components/layout/BmsContentPageLayout.vue.d.ts +17 -0
- package/dist/components/layout/BmsForm.vue.d.ts +7 -0
- package/dist/components/layout/BmsHeader.vue.d.ts +9 -0
- package/dist/components/layout/BmsHeaderTitle.vue.d.ts +22 -0
- package/dist/components/layout/BmsModal.spec.d.ts +1 -0
- package/dist/components/layout/BmsModal.vue.d.ts +60 -0
- package/dist/components/layout/BmsOverlay.vue.d.ts +13 -0
- package/dist/components/layout/BmsSection.vue.d.ts +15 -0
- package/dist/components/layout/BmsStep.vue.d.ts +27 -0
- package/dist/components/layout/BmsStepper.vue.d.ts +13 -0
- package/dist/components/layout/UiPopoverMenu.vue.d.ts +23 -0
- package/dist/components/navigation/BmsBackButton.vue.d.ts +13 -0
- package/dist/components/navigation/BmsBreadcrumb.vue.d.ts +12 -0
- package/dist/components/navigation/BmsLink.spec.d.ts +1 -0
- package/dist/components/navigation/BmsLink.vue.d.ts +22 -0
- package/dist/components/navigation/BmsMenu.spec.d.ts +1 -0
- package/dist/components/navigation/BmsMenu.vue.d.ts +21 -0
- package/dist/components/navigation/BmsMenuNav.spec.d.ts +1 -0
- package/dist/components/navigation/BmsMenuNav.vue.d.ts +23 -0
- package/dist/components/navigation/BmsShortLinkMenu.vue.d.ts +20 -0
- package/dist/components/navigation/BmsTabs.vue.d.ts +7 -0
- package/dist/components/navigation/BmsTenantSwitcher.vue.d.ts +22 -0
- package/dist/components/navigation/UiMenuItem.vue.d.ts +11 -0
- package/dist/components/navigation/UiTab.vue.d.ts +15 -0
- package/dist/components/navigation/UiTenantImage.vue.d.ts +6 -0
- package/dist/components/navigation/UiTenantLabel.vue.d.ts +12 -0
- package/dist/components/navigation/UiTenantSwitcher.spec.d.ts +1 -0
- package/dist/components/navigation/UiTenantSwitcher.vue.d.ts +189 -0
- package/dist/components/table/BmsEmptyScreen.vue.d.ts +6 -0
- package/dist/components/table/BmsPagination.spec.d.ts +1 -0
- package/dist/components/table/BmsPagination.vue.d.ts +35 -0
- package/dist/components/table/BmsServerTable.vue.d.ts +74 -0
- package/dist/components/table/BmsTable.spec.d.ts +1 -0
- package/dist/components/table/BmsTable.vue.d.ts +53 -0
- package/dist/components/table/BmsTableFilters.spec.d.ts +1 -0
- package/dist/components/table/BmsTableFilters.vue.d.ts +188 -0
- package/dist/components/table/DraggableList.vue.d.ts +26 -0
- package/dist/components/table/UiBmsTable.spec.d.ts +1 -0
- package/dist/components/table/UiBmsTable.vue.d.ts +66 -0
- package/dist/components/table/UiFilterButton.vue.d.ts +13 -0
- package/dist/components/utils/BmsCocarde.vue.d.ts +11 -0
- package/dist/components/utils/BmsProblem.vue.d.ts +9 -0
- package/dist/components/utils/BmsRelativeTime.spec.d.ts +1 -0
- package/dist/components/utils/BmsRelativeTime.vue.d.ts +11 -0
- package/dist/composables/clipboard.composable.d.ts +3 -0
- package/dist/composables/index.d.ts +5 -0
- package/dist/composables/pagination.composable.d.ts +14 -0
- package/dist/composables/pagination.composable.spec.d.ts +1 -0
- package/dist/composables/search.composable.d.ts +52 -0
- package/dist/composables/search.composable.spec.d.ts +1 -0
- package/dist/composables/search.helper.d.ts +7 -0
- package/dist/composables/search.helper.spec.d.ts +1 -0
- package/dist/composables/sort.composable.d.ts +10 -0
- package/dist/composables/sort.composable.spec.d.ts +1 -0
- package/dist/composables/userPref.composable.d.ts +6 -0
- package/dist/composables/userPref.composable.spec.d.ts +1 -0
- package/dist/favicon.ico +0 -0
- package/dist/helpers/cocarde.helper.d.ts +1 -0
- package/dist/helpers/cocarde.helper.spec.d.ts +1 -0
- package/dist/helpers/date.helper.d.ts +26 -0
- package/dist/helpers/date.helper.spec.d.ts +1 -0
- package/dist/helpers/file.helper.d.ts +5 -0
- package/dist/helpers/file.helper.spec.d.ts +1 -0
- package/dist/helpers/index.d.ts +6 -0
- package/dist/helpers/location.helper.d.ts +10 -0
- package/dist/helpers/location.helper.spec.d.ts +1 -0
- package/dist/helpers/problem.helper.d.ts +1 -0
- package/dist/helpers/problem.helper.spec.d.ts +1 -0
- package/dist/helpers/string.helper.d.ts +9 -0
- package/dist/helpers/string.helper.spec.d.ts +1 -0
- package/dist/helpers/table.helper.d.ts +16 -0
- package/dist/helpers/table.helper.spec.d.ts +1 -0
- package/dist/index.d.ts +72 -0
- package/dist/logo.png +0 -0
- package/dist/main.d.ts +0 -0
- package/dist/mockServiceWorker.js +344 -0
- package/dist/models/breadcrumb.model.d.ts +5 -0
- package/dist/models/caption.model.d.ts +6 -0
- package/dist/models/chip.model.d.ts +8 -0
- package/dist/models/cocarde.model.d.ts +4 -0
- package/dist/models/form.model.d.ts +25 -0
- package/dist/models/index.d.ts +14 -0
- package/dist/models/menu.model.d.ts +18 -0
- package/dist/models/modal.model.d.ts +8 -0
- package/dist/models/problem.model.d.ts +14 -0
- package/dist/models/sort.model.d.ts +11 -0
- package/dist/models/status-type.model.d.ts +7 -0
- package/dist/models/tab.model.d.ts +7 -0
- package/dist/models/table.model.d.ts +53 -0
- package/dist/models/tenant.model.d.ts +7 -0
- package/dist/models/tooltip.model.d.ts +6 -0
- package/dist/plugins/confirm/index.d.ts +9 -0
- package/dist/plugins/feature-flipper/FeatureFlipper.vue.d.ts +9 -0
- package/dist/plugins/feature-flipper/FeatureFlipperIndicator.vue.d.ts +6 -0
- package/dist/plugins/feature-flipper/FeatureFlipperModal.vue.d.ts +16 -0
- package/dist/plugins/feature-flipper/featureFlipper.composable.d.ts +10 -0
- package/dist/plugins/feature-flipper/featureFlipper.composable.spec.d.ts +1 -0
- package/dist/plugins/feature-flipper/featureFlipper.model.d.ts +3 -0
- package/dist/plugins/feature-flipper/index.d.ts +4 -0
- package/dist/plugins/field/FieldComponent.spec.d.ts +1 -0
- package/dist/plugins/field/FieldComponent.vue.d.ts +25 -0
- package/dist/plugins/field/FieldDatalist.vue.d.ts +27 -0
- package/dist/plugins/field/index.d.ts +2 -0
- package/dist/plugins/keycloak-auth-adapter/index.d.ts +20 -0
- package/dist/plugins/notifications/NotificationItem.vue.d.ts +12 -0
- package/dist/plugins/notifications/NotificationWidget.vue.d.ts +2 -0
- package/dist/plugins/notifications/index.d.ts +11 -0
- package/dist/plugins/notifications/notification.model.d.ts +20 -0
- package/dist/plugins/router-history/index.d.ts +6 -0
- package/dist/plugins/router-history/router-history.composable.d.ts +7 -0
- package/dist/plugins/router-history/router-history.composable.spec.d.ts +1 -0
- package/dist/plugins/runtime-env/index.d.ts +7 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/services/konami.service.d.ts +2 -0
- package/dist/showroom/App.vue.d.ts +2 -0
- package/dist/showroom/router.d.ts +8 -0
- package/dist/sipa-bms-ui.css +3024 -0
- package/dist/sipa-bms-ui.es.js +102694 -0
- package/dist/sipa-bms-ui.es.js.map +1 -0
- package/dist/sipa-bms-ui.umd.js +102815 -0
- package/dist/sipa-bms-ui.umd.js.map +1 -0
- package/package.json +126 -0
- package/src/assets/animated-icons/AnimatedActivityIcon.vue +77 -0
- package/src/assets/animated-icons/AnimatedCircleHelpIcon.vue +67 -0
- package/src/assets/animated-icons/AnimatedHomeIcon.vue +69 -0
- package/src/assets/empty.svg +1 -0
- package/src/assets/scss/_conf.scss +203 -0
- package/src/assets/scss/_formkit.scss +353 -0
- package/src/assets/scss/app.scss +11 -0
- package/src/assets/scss/global-variables.scss +56 -0
- package/src/components/button/BmsAllButtons.stories.js +56 -0
- package/src/components/button/BmsButton.spec.ts +37 -0
- package/src/components/button/BmsButton.stories.js +84 -0
- package/src/components/button/BmsButton.vue +50 -0
- package/src/components/button/BmsIconButton.stories.js +67 -0
- package/src/components/button/BmsIconButton.vue +34 -0
- package/src/components/button/UiButton.stories.js +131 -0
- package/src/components/button/UiButton.vue +37 -0
- package/src/components/button/UiButtonLink.vue +186 -0
- package/src/components/feedback/BmsAlert.stories.js +75 -0
- package/src/components/feedback/BmsAlert.vue +91 -0
- package/src/components/feedback/BmsBadge.stories.js +34 -0
- package/src/components/feedback/BmsBadge.vue +76 -0
- package/src/components/feedback/BmsCaption.stories.js +59 -0
- package/src/components/feedback/BmsCaption.vue +88 -0
- package/src/components/feedback/BmsCircularProgress.spec.ts +14 -0
- package/src/components/feedback/BmsCircularProgress.stories.js +45 -0
- package/src/components/feedback/BmsCircularProgress.vue +64 -0
- package/src/components/feedback/BmsLoader.spec.ts +7 -0
- package/src/components/feedback/BmsLoader.stories.js +31 -0
- package/src/components/feedback/BmsLoader.vue +82 -0
- package/src/components/feedback/BmsTooltip.stories.js +65 -0
- package/src/components/feedback/BmsTooltip.vue +102 -0
- package/src/components/feedback/Notification.stories.js +37 -0
- package/src/components/feedback/UiTooltip.spec.ts +62 -0
- package/src/components/feedback/UiTooltip.stories.js +71 -0
- package/src/components/feedback/UiTooltip.vue +219 -0
- package/src/components/feedback/tooltip.helper.spec.ts +92 -0
- package/src/components/feedback/tooltip.helper.ts +121 -0
- package/src/components/form/BmsAutocomplete.stories.js +90 -0
- package/src/components/form/BmsAutocomplete.vue +100 -0
- package/src/components/form/BmsBetweenInput.stories.js +69 -0
- package/src/components/form/BmsBetweenInput.vue +146 -0
- package/src/components/form/BmsChip.stories.js +65 -0
- package/src/components/form/BmsChip.vue +92 -0
- package/src/components/form/BmsFilePicker.spec.ts +94 -0
- package/src/components/form/BmsFilePicker.stories.js +53 -0
- package/src/components/form/BmsFilePicker.vue +186 -0
- package/src/components/form/BmsInputBooleanCheckbox.stories.js +90 -0
- package/src/components/form/BmsInputBooleanCheckbox.vue +70 -0
- package/src/components/form/BmsInputCheckboxCaption.spec.ts +45 -0
- package/src/components/form/BmsInputCheckboxCaption.stories.js +92 -0
- package/src/components/form/BmsInputCheckboxCaption.vue +126 -0
- package/src/components/form/BmsInputCheckboxCaptionGroup.stories.js +153 -0
- package/src/components/form/BmsInputCheckboxCaptionGroup.vue +81 -0
- package/src/components/form/BmsInputCheckboxGroup.stories.js +94 -0
- package/src/components/form/BmsInputCheckboxGroup.vue +94 -0
- package/src/components/form/BmsInputCode.stories.js +43 -0
- package/src/components/form/BmsInputCode.vue +71 -0
- package/src/components/form/BmsInputDateTime.stories.js +71 -0
- package/src/components/form/BmsInputDateTime.vue +55 -0
- package/src/components/form/BmsInputFile.spec.ts +90 -0
- package/src/components/form/BmsInputFile.stories.js +156 -0
- package/src/components/form/BmsInputFile.vue +310 -0
- package/src/components/form/BmsInputNumber.spec.ts +40 -0
- package/src/components/form/BmsInputNumber.stories.js +79 -0
- package/src/components/form/BmsInputNumber.vue +67 -0
- package/src/components/form/BmsInputRadio.stories.js +79 -0
- package/src/components/form/BmsInputRadio.vue +121 -0
- package/src/components/form/BmsInputRadioCaption.stories.js +98 -0
- package/src/components/form/BmsInputRadioCaption.vue +110 -0
- package/src/components/form/BmsInputRadioCaptionGroup.stories.js +166 -0
- package/src/components/form/BmsInputRadioCaptionGroup.vue +81 -0
- package/src/components/form/BmsInputRadioGroup.stories.js +108 -0
- package/src/components/form/BmsInputRadioGroup.vue +93 -0
- package/src/components/form/BmsInputText.spec.ts +37 -0
- package/src/components/form/BmsInputText.stories.js +78 -0
- package/src/components/form/BmsInputText.vue +79 -0
- package/src/components/form/BmsInputToggle.stories.js +37 -0
- package/src/components/form/BmsInputToggle.vue +66 -0
- package/src/components/form/BmsSearch.spec.ts +41 -0
- package/src/components/form/BmsSearch.stories.js +70 -0
- package/src/components/form/BmsSearch.vue +62 -0
- package/src/components/form/BmsSelect.spec.ts +57 -0
- package/src/components/form/BmsSelect.stories.js +131 -0
- package/src/components/form/BmsSelect.vue +225 -0
- package/src/components/form/BmsTag.stories.js +64 -0
- package/src/components/form/BmsTag.vue +109 -0
- package/src/components/form/BmsTextArea.spec.ts +37 -0
- package/src/components/form/BmsTextArea.stories.js +74 -0
- package/src/components/form/BmsTextArea.vue +112 -0
- package/src/components/form/Form.stories.js +35 -0
- package/src/components/form/RawAutocomplete.spec.ts +103 -0
- package/src/components/form/RawAutocomplete.vue +218 -0
- package/src/components/form/RawInputText.vue +173 -0
- package/src/components/form/UiBmsInputCheckbox.stories.js +77 -0
- package/src/components/form/UiBmsInputCheckbox.vue +126 -0
- package/src/components/form/UiBmsSwitch.stories.js +40 -0
- package/src/components/form/UiBmsSwitch.vue +80 -0
- package/src/components/layout/BmsCard.stories.js +77 -0
- package/src/components/layout/BmsCard.vue +133 -0
- package/src/components/layout/BmsContentPageLayout.vue +92 -0
- package/src/components/layout/BmsForm.stories.js +30 -0
- package/src/components/layout/BmsForm.vue +42 -0
- package/src/components/layout/BmsHeader.stories.js +29 -0
- package/src/components/layout/BmsHeader.vue +16 -0
- package/src/components/layout/BmsHeaderTitle.stories.js +68 -0
- package/src/components/layout/BmsHeaderTitle.vue +76 -0
- package/src/components/layout/BmsModal.spec.ts +174 -0
- package/src/components/layout/BmsModal.stories.js +153 -0
- package/src/components/layout/BmsModal.vue +359 -0
- package/src/components/layout/BmsOverlay.stories.js +34 -0
- package/src/components/layout/BmsOverlay.vue +28 -0
- package/src/components/layout/BmsSection.stories.js +45 -0
- package/src/components/layout/BmsSection.vue +35 -0
- package/src/components/layout/BmsStep.stories.js +71 -0
- package/src/components/layout/BmsStep.vue +60 -0
- package/src/components/layout/BmsStepper.stories.js +57 -0
- package/src/components/layout/BmsStepper.vue +195 -0
- package/src/components/layout/UiPopoverMenu.vue +167 -0
- package/src/components/navigation/BmsBackButton.stories.js +27 -0
- package/src/components/navigation/BmsBackButton.vue +38 -0
- package/src/components/navigation/BmsBreadcrumb.stories.js +80 -0
- package/src/components/navigation/BmsBreadcrumb.vue +45 -0
- package/src/components/navigation/BmsLink.spec.ts +45 -0
- package/src/components/navigation/BmsLink.vue +59 -0
- package/src/components/navigation/BmsMenu.spec.ts +95 -0
- package/src/components/navigation/BmsMenu.stories.js +85 -0
- package/src/components/navigation/BmsMenu.vue +148 -0
- package/src/components/navigation/BmsMenuNav.spec.ts +140 -0
- package/src/components/navigation/BmsMenuNav.stories.js +187 -0
- package/src/components/navigation/BmsMenuNav.vue +217 -0
- package/src/components/navigation/BmsShortLinkMenu.stories.js +55 -0
- package/src/components/navigation/BmsShortLinkMenu.vue +59 -0
- package/src/components/navigation/BmsTabs.stories.js +30 -0
- package/src/components/navigation/BmsTabs.vue +46 -0
- package/src/components/navigation/BmsTenantSwitcher.stories.js +89 -0
- package/src/components/navigation/BmsTenantSwitcher.vue +135 -0
- package/src/components/navigation/UiMenuItem.stories.js +73 -0
- package/src/components/navigation/UiMenuItem.vue +116 -0
- package/src/components/navigation/UiMenuItemStatus.stories.js +58 -0
- package/src/components/navigation/UiTab.stories.js +56 -0
- package/src/components/navigation/UiTab.vue +71 -0
- package/src/components/navigation/UiTenantImage.vue +22 -0
- package/src/components/navigation/UiTenantLabel.vue +94 -0
- package/src/components/navigation/UiTenantSwitcher.spec.ts +167 -0
- package/src/components/navigation/UiTenantSwitcher.stories.js +70 -0
- package/src/components/navigation/UiTenantSwitcher.vue +161 -0
- package/src/components/table/BmsEmptyScreen.stories.js +32 -0
- package/src/components/table/BmsEmptyScreen.vue +54 -0
- package/src/components/table/BmsPagination.spec.ts +73 -0
- package/src/components/table/BmsPagination.stories.js +34 -0
- package/src/components/table/BmsPagination.vue +154 -0
- package/src/components/table/BmsServerTable.stories.js +422 -0
- package/src/components/table/BmsServerTable.vue +402 -0
- package/src/components/table/BmsTable.spec.ts +309 -0
- package/src/components/table/BmsTable.stories.js +930 -0
- package/src/components/table/BmsTable.vue +308 -0
- package/src/components/table/BmsTableFilters.spec.ts +494 -0
- package/src/components/table/BmsTableFilters.stories.js +114 -0
- package/src/components/table/BmsTableFilters.vue +268 -0
- package/src/components/table/DraggableList.stories.js +29 -0
- package/src/components/table/DraggableList.vue +179 -0
- package/src/components/table/UiBmsTable.spec.ts +373 -0
- package/src/components/table/UiBmsTable.stories.js +563 -0
- package/src/components/table/UiBmsTable.vue +617 -0
- package/src/components/table/UiFilterButton.stories.js +37 -0
- package/src/components/table/UiFilterButton.vue +85 -0
- package/src/components/utils/BmsCocarde.stories.js +47 -0
- package/src/components/utils/BmsCocarde.vue +66 -0
- package/src/components/utils/BmsProblem.stories.js +82 -0
- package/src/components/utils/BmsProblem.vue +223 -0
- package/src/components/utils/BmsRelativeTime.spec.ts +41 -0
- package/src/components/utils/BmsRelativeTime.stories.js +48 -0
- package/src/components/utils/BmsRelativeTime.vue +57 -0
- package/src/composables/clipboard.composable.ts +14 -0
- package/src/composables/index.ts +5 -0
- package/src/composables/pagination.composable.spec.ts +258 -0
- package/src/composables/pagination.composable.ts +111 -0
- package/src/composables/search.composable.spec.ts +1296 -0
- package/src/composables/search.composable.ts +316 -0
- package/src/composables/search.helper.spec.ts +339 -0
- package/src/composables/search.helper.ts +103 -0
- package/src/composables/sort.composable.spec.ts +349 -0
- package/src/composables/sort.composable.ts +129 -0
- package/src/composables/userPref.composable.spec.ts +115 -0
- package/src/composables/userPref.composable.ts +43 -0
- package/src/documentation/ColorTile.vue +23 -0
- package/src/documentation/assets/BmsIcon.png +0 -0
- package/src/documentation/assets/CoverBmsUI.png +0 -0
- package/src/documentation/assets/button/CoverPrimaryButton.png +0 -0
- package/src/documentation/assets/button/CoverSecondaryButton.png +0 -0
- package/src/documentation/assets/button/DoButtonLabel.png +0 -0
- package/src/documentation/assets/button/DontButtonLabel.png +0 -0
- package/src/documentation/assets/button/PrimaryButtonRepresentation.png +0 -0
- package/src/documentation/assets/cards/CardRepresentation.png +0 -0
- package/src/documentation/assets/cards/CoverCard.png +0 -0
- package/src/documentation/assets/chip/ChipRepresentation.png +0 -0
- package/src/documentation/assets/chip/CoverChips.png +0 -0
- package/src/documentation/assets/fields/Anatomy.png +0 -0
- package/src/documentation/assets/fields/CaptionRepresentation.png +0 -0
- package/src/documentation/assets/fields/CaptionTextRepresentation.png +0 -0
- package/src/documentation/assets/fields/CoverFieldsAnatomy.png +0 -0
- package/src/documentation/assets/fields/CoverInputFile.png +0 -0
- package/src/documentation/assets/fields/CoverInputText.png +0 -0
- package/src/documentation/assets/fields/CoverRadioCaptionGroup.png +0 -0
- package/src/documentation/assets/fields/CoverRadioGroup.png +0 -0
- package/src/documentation/assets/fields/CoverSearch.png +0 -0
- package/src/documentation/assets/fields/CoverSelect.png +0 -0
- package/src/documentation/assets/fields/CoverTextArea.png +0 -0
- package/src/documentation/assets/fields/FieldLabel.png +0 -0
- package/src/documentation/assets/fields/InputMediaRepresentation.png +0 -0
- package/src/documentation/assets/fields/InputRepresentation.png +0 -0
- package/src/documentation/assets/fields/InputSearchRepresentation.png +0 -0
- package/src/documentation/assets/fields/InputText.png +0 -0
- package/src/documentation/assets/fields/InputTextAreaRepresentation.png +0 -0
- package/src/documentation/assets/fields/LabelDo.png +0 -0
- package/src/documentation/assets/fields/LabelDont.png +0 -0
- package/src/documentation/assets/fields/LabelRepresentation.png +0 -0
- package/src/documentation/assets/fields/RadioCaptionGroupRepresentation.png +0 -0
- package/src/documentation/assets/fields/RadioGroupRepresentation.png +0 -0
- package/src/documentation/assets/fields/SelectRepresentation.png +0 -0
- package/src/documentation/assets/tag/CoverTag.png +0 -0
- package/src/documentation/assets/tag/TagRepresentation.png +0 -0
- package/src/documentation/button.mdx +24 -0
- package/src/documentation/card.mdx +28 -0
- package/src/documentation/chip.mdx +28 -0
- package/src/documentation/colors.mdx +118 -0
- package/src/documentation/fields.mdx +52 -0
- package/src/documentation/fields_text.mdx +31 -0
- package/src/documentation/icons.mdx +33 -0
- package/src/documentation/inputFile.mdx +28 -0
- package/src/documentation/primaryButton.mdx +20 -0
- package/src/documentation/principles.mdx +23 -0
- package/src/documentation/radioCaptionGroup.mdx +34 -0
- package/src/documentation/radioGroup.mdx +34 -0
- package/src/documentation/search.mdx +28 -0
- package/src/documentation/secondaryButton.mdx +17 -0
- package/src/documentation/select.mdx +31 -0
- package/src/documentation/tag.mdx +28 -0
- package/src/documentation/template_field_dependency.mdx +19 -0
- package/src/documentation/textArea.mdx +27 -0
- package/src/documentation/typography.mdx +93 -0
- package/src/documentation/typography.stories.js +26 -0
- package/src/helpers/cocarde.helper.spec.ts +14 -0
- package/src/helpers/cocarde.helper.ts +22 -0
- package/src/helpers/date.helper.spec.ts +91 -0
- package/src/helpers/date.helper.ts +105 -0
- package/src/helpers/file.helper.spec.ts +60 -0
- package/src/helpers/file.helper.ts +24 -0
- package/src/helpers/index.ts +6 -0
- package/src/helpers/location.helper.spec.ts +195 -0
- package/src/helpers/location.helper.ts +53 -0
- package/src/helpers/problem.helper.spec.ts +21 -0
- package/src/helpers/problem.helper.ts +4 -0
- package/src/helpers/string.helper.spec.ts +186 -0
- package/src/helpers/string.helper.ts +83 -0
- package/src/helpers/table.helper.spec.ts +141 -0
- package/src/helpers/table.helper.ts +88 -0
- package/src/index.ts +203 -0
- package/src/main.ts +25 -0
- package/src/models/breadcrumb.model.ts +6 -0
- package/src/models/caption.model.ts +7 -0
- package/src/models/chip.model.ts +8 -0
- package/src/models/cocarde.model.ts +4 -0
- package/src/models/form.model.ts +30 -0
- package/src/models/index.ts +14 -0
- package/src/models/menu.model.ts +20 -0
- package/src/models/modal.model.ts +9 -0
- package/src/models/problem.model.ts +10 -0
- package/src/models/sort.model.ts +13 -0
- package/src/models/status-type.model.ts +7 -0
- package/src/models/tab.model.ts +7 -0
- package/src/models/table.model.ts +58 -0
- package/src/models/tenant.model.ts +7 -0
- package/src/models/tooltip.model.ts +6 -0
- package/src/pages/Form.stories.js +83 -0
- package/src/pages/List.stories.js +88 -0
- package/src/plugins/confirm/index.ts +109 -0
- package/src/plugins/feature-flipper/FeatureFlipper.vue +23 -0
- package/src/plugins/feature-flipper/FeatureFlipperIndicator.vue +27 -0
- package/src/plugins/feature-flipper/FeatureFlipperModal.vue +68 -0
- package/src/plugins/feature-flipper/featureFlipper.composable.spec.ts +107 -0
- package/src/plugins/feature-flipper/featureFlipper.composable.ts +68 -0
- package/src/plugins/feature-flipper/featureFlipper.model.ts +1 -0
- package/src/plugins/feature-flipper/index.ts +15 -0
- package/src/plugins/field/FieldComponent.spec.ts +34 -0
- package/src/plugins/field/FieldComponent.stories.js +78 -0
- package/src/plugins/field/FieldComponent.vue +208 -0
- package/src/plugins/field/FieldDatalist.stories.js +35 -0
- package/src/plugins/field/FieldDatalist.vue +68 -0
- package/src/plugins/field/index.ts +31 -0
- package/src/plugins/keycloak-auth-adapter/index.ts +102 -0
- package/src/plugins/notifications/NotificationItem.stories.js +60 -0
- package/src/plugins/notifications/NotificationItem.vue +116 -0
- package/src/plugins/notifications/NotificationWidget.vue +129 -0
- package/src/plugins/notifications/index.ts +83 -0
- package/src/plugins/notifications/notification.model.ts +24 -0
- package/src/plugins/notifications/notifications.spec.js +78 -0
- package/src/plugins/router-history/index.ts +23 -0
- package/src/plugins/router-history/router-history.composable.spec.ts +323 -0
- package/src/plugins/router-history/router-history.composable.ts +47 -0
- package/src/plugins/runtime-env/index.ts +19 -0
- package/src/services/index.ts +1 -0
- package/src/services/konami.service.ts +28 -0
- package/src/showroom/App.vue +109 -0
- package/src/showroom/db.json +1967 -0
- package/src/showroom/pages/autocomplete.vue +54 -0
- package/src/showroom/pages/draggable-list.vue +20 -0
- package/src/showroom/pages/file-picker.vue +74 -0
- package/src/showroom/pages/forms.vue +389 -0
- package/src/showroom/pages/index.vue +209 -0
- package/src/showroom/pages/paginated-cards.vue +48 -0
- package/src/showroom/pages/server-table.vue +160 -0
- package/src/showroom/pages/stepper.vue +37 -0
- package/src/showroom/pages/table.vue +192 -0
- package/src/showroom/pages/tabs/[tabName].vue +28 -0
- package/src/showroom/router.ts +15 -0
- package/src/showroom/server.js +45 -0
- package/src/vite-env.d.ts +9 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getValueByPath,
|
|
3
|
+
isEmptyStringOrNotDefined,
|
|
4
|
+
searchString,
|
|
5
|
+
} from '@/helpers/string.helper';
|
|
6
|
+
import { Filter, SavedFilter } from '@/models';
|
|
7
|
+
import { computed, onMounted, Ref, ref, unref, watch } from 'vue';
|
|
8
|
+
import { useRoute } from 'vue-router';
|
|
9
|
+
import { useUserPref } from '@/composables/userPref.composable';
|
|
10
|
+
import _cloneDeep from 'lodash/cloneDeep';
|
|
11
|
+
import {
|
|
12
|
+
handleValueInSearchParams,
|
|
13
|
+
writeLocation,
|
|
14
|
+
} from '@/helpers/location.helper';
|
|
15
|
+
import {
|
|
16
|
+
dateFilterCompare,
|
|
17
|
+
dateIsBetween,
|
|
18
|
+
isBetweenFilter,
|
|
19
|
+
numberIsBetween,
|
|
20
|
+
} from '@/composables/search.helper';
|
|
21
|
+
|
|
22
|
+
const FILTER_KEY = 'bms-ui-filter';
|
|
23
|
+
const FILTER_SEARCH_KEY = `${FILTER_KEY}-search`;
|
|
24
|
+
|
|
25
|
+
export const useSearch = (
|
|
26
|
+
persistent: boolean | Ref<boolean> = true,
|
|
27
|
+
defaultFilters: Filter[] | Ref<Filter[]> = [],
|
|
28
|
+
defaultFiltersOpened: boolean | Ref<boolean> = false,
|
|
29
|
+
) => {
|
|
30
|
+
const route = useRoute();
|
|
31
|
+
const userPref = useUserPref();
|
|
32
|
+
const reflect = ref<boolean>(unref(persistent));
|
|
33
|
+
const search = ref<string>('');
|
|
34
|
+
const filters = ref<Filter[]>(unref(defaultFilters));
|
|
35
|
+
const isFilterVisible = ref<boolean>(unref(defaultFiltersOpened));
|
|
36
|
+
const isMounting = ref<boolean>(true);
|
|
37
|
+
|
|
38
|
+
const toggleFilters = () => {
|
|
39
|
+
isFilterVisible.value = !isFilterVisible.value;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const numberOfActiveFilters = computed(
|
|
43
|
+
() =>
|
|
44
|
+
filters.value?.filter(
|
|
45
|
+
(f) => f.value !== '' && f.value !== null && f.value !== undefined,
|
|
46
|
+
).length,
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const hydrateFiltersFromUrl = (requestedFilters: Filter[]): Filter[] => {
|
|
50
|
+
const searchParams = new URLSearchParams(window.location.search);
|
|
51
|
+
|
|
52
|
+
requestedFilters.forEach((filterOption) => {
|
|
53
|
+
const savedFilterName = convertFilterKeyForPath(filterOption);
|
|
54
|
+
let savedValue: string | boolean | null =
|
|
55
|
+
searchParams.get(savedFilterName);
|
|
56
|
+
if (savedValue) {
|
|
57
|
+
isFilterVisible.value = true;
|
|
58
|
+
if (filterOption.type === 'boolean') {
|
|
59
|
+
savedValue = savedValue === 'true';
|
|
60
|
+
}
|
|
61
|
+
if (isBetweenFilter(filterOption)) {
|
|
62
|
+
const betweenValue = (savedValue as string).split('|');
|
|
63
|
+
filterOption.valueFrom = betweenValue[0];
|
|
64
|
+
filterOption.valueTo = betweenValue[1] ? betweenValue[1] : '';
|
|
65
|
+
} else {
|
|
66
|
+
filterOption.value = savedValue;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
const filtersOpened = searchParams.get('bms-ui-filters-open');
|
|
72
|
+
if (filtersOpened === 'false') {
|
|
73
|
+
isFilterVisible.value = false;
|
|
74
|
+
} else if (filtersOpened === 'true') {
|
|
75
|
+
isFilterVisible.value = true;
|
|
76
|
+
}
|
|
77
|
+
return requestedFilters;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const hydrateFiltersFromLocalStorage = (
|
|
81
|
+
requestedFilters: Filter[],
|
|
82
|
+
): Filter[] => {
|
|
83
|
+
if (userPref) {
|
|
84
|
+
requestedFilters.forEach((filterOption) => {
|
|
85
|
+
const savedFilterName = convertFilterKeyForPath(filterOption);
|
|
86
|
+
const savedFilterPref = userPref.getUserPref(
|
|
87
|
+
savedFilterName,
|
|
88
|
+
route.path,
|
|
89
|
+
);
|
|
90
|
+
if (savedFilterPref !== undefined) {
|
|
91
|
+
filterOption.value = savedFilterPref;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return requestedFilters;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const hasFiltersInUrl = (): boolean => {
|
|
99
|
+
return (
|
|
100
|
+
Array.from(new URLSearchParams(window.location.search).keys()).filter(
|
|
101
|
+
(param: string) => param.includes(FILTER_KEY),
|
|
102
|
+
).length > 0
|
|
103
|
+
);
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const initFilters = (): void => {
|
|
107
|
+
const requestedFilters = _cloneDeep(filters.value);
|
|
108
|
+
let hydratedFilters = requestedFilters;
|
|
109
|
+
if (reflect.value) {
|
|
110
|
+
hydratedFilters = hasFiltersInUrl()
|
|
111
|
+
? hydrateFiltersFromUrl(requestedFilters)
|
|
112
|
+
: hydrateFiltersFromLocalStorage(requestedFilters);
|
|
113
|
+
}
|
|
114
|
+
filters.value = hydratedFilters.map((filter) => {
|
|
115
|
+
if (filter.value === undefined) {
|
|
116
|
+
filter.value = null;
|
|
117
|
+
}
|
|
118
|
+
return filter;
|
|
119
|
+
});
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
const filterItems = (items: any[]): any[] => {
|
|
123
|
+
const defaultTextFilterFunction = (
|
|
124
|
+
item: any,
|
|
125
|
+
value: any,
|
|
126
|
+
target: string,
|
|
127
|
+
) => {
|
|
128
|
+
return searchString(getValueByPath(item, target) + '', value + '');
|
|
129
|
+
};
|
|
130
|
+
return items.filter((item) => {
|
|
131
|
+
return filters.value.every((filter) => {
|
|
132
|
+
if (isBetweenFilter(filter)) {
|
|
133
|
+
if (
|
|
134
|
+
(!getfilterValue(filter, 'valueFrom') &&
|
|
135
|
+
!getfilterValue(filter, 'valueTo')) ||
|
|
136
|
+
(!filter.customFilter && item[filter.key] === undefined)
|
|
137
|
+
) {
|
|
138
|
+
return true;
|
|
139
|
+
} else {
|
|
140
|
+
try {
|
|
141
|
+
if (filter.type === 'betweenNumber') {
|
|
142
|
+
return numberIsBetween(item[filter.key], filter);
|
|
143
|
+
} else {
|
|
144
|
+
return dateIsBetween(item[filter.key], filter);
|
|
145
|
+
}
|
|
146
|
+
} catch (e: any) {
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (isEmptyStringOrNotDefined(filter.value)) {
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
if (filter.type === 'inputDate') {
|
|
155
|
+
const applyFilter = filter.customFilter
|
|
156
|
+
? filter.customFilter
|
|
157
|
+
: dateFilterCompare;
|
|
158
|
+
return applyFilter(item[filter.key], filter, true);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const applyFilter = filter.customFilter
|
|
162
|
+
? filter.customFilter
|
|
163
|
+
: defaultTextFilterFunction;
|
|
164
|
+
return applyFilter(item, filter.value, filter.key);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
const reflectSearchToUserPref = (str: string): void => {
|
|
170
|
+
userPref.saveUserPref(FILTER_SEARCH_KEY, str, route.path);
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const reflectFiltersToUserPref = (filters: Filter[]): void => {
|
|
174
|
+
filters.forEach((filter) => {
|
|
175
|
+
const savedFilterName = convertFilterKeyForPath(filter);
|
|
176
|
+
userPref.saveUserPref(savedFilterName, filter.value, route.path);
|
|
177
|
+
});
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
watch(search, () => {
|
|
181
|
+
if (reflect.value) {
|
|
182
|
+
reflectSearchToPath(search.value, FILTER_SEARCH_KEY);
|
|
183
|
+
reflectSearchToUserPref(search.value);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
watch(
|
|
187
|
+
() => filters,
|
|
188
|
+
() => {
|
|
189
|
+
if (reflect.value && filters.value) {
|
|
190
|
+
reflectFiltersToPath(filters.value);
|
|
191
|
+
reflectFiltersToUserPref(filters.value);
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
{ deep: true },
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
const initSearch = () => {
|
|
198
|
+
if (reflect.value) {
|
|
199
|
+
const searchParams = new URLSearchParams(window.location.search);
|
|
200
|
+
|
|
201
|
+
if (searchParams.get(FILTER_SEARCH_KEY)) {
|
|
202
|
+
search.value = searchParams.get(FILTER_SEARCH_KEY) || '';
|
|
203
|
+
}
|
|
204
|
+
if (!search.value && !hasFiltersInUrl()) {
|
|
205
|
+
search.value =
|
|
206
|
+
userPref.getUserPref(FILTER_SEARCH_KEY, route.path) || '';
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
const resetAllFilters = () => {
|
|
212
|
+
isMounting.value = true;
|
|
213
|
+
initSearch();
|
|
214
|
+
initFilters();
|
|
215
|
+
isMounting.value = false;
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
onMounted(() => {
|
|
219
|
+
resetAllFilters();
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
const isSavedFilterActive = (savedFilter: SavedFilter): boolean => {
|
|
223
|
+
return savedFilter.filters.every((saveF) => {
|
|
224
|
+
const targetFilter = filters.value.find((f) => f.key === saveF.target);
|
|
225
|
+
if (!targetFilter) {
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
return (
|
|
229
|
+
targetFilter.value === saveF.value ||
|
|
230
|
+
(targetFilter.value === '' && saveF.value === null) ||
|
|
231
|
+
(targetFilter.value === null && saveF.value === '')
|
|
232
|
+
);
|
|
233
|
+
});
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
const resetFilters = () => {
|
|
237
|
+
filters.value = filters.value.map((filter) => {
|
|
238
|
+
let resetFilter = { ...filter };
|
|
239
|
+
const valueKeys = ['value', 'valueFrom', 'valueTo'];
|
|
240
|
+
valueKeys.forEach((key) => {
|
|
241
|
+
if (
|
|
242
|
+
resetFilter[key as keyof Filter] !== null &&
|
|
243
|
+
resetFilter[key as keyof Filter] !== undefined
|
|
244
|
+
) {
|
|
245
|
+
resetFilter[key as keyof Filter] = null;
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
return resetFilter;
|
|
249
|
+
});
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
const selectSavedFilter = (savedFilter: SavedFilter) => {
|
|
253
|
+
if (isSavedFilterActive(savedFilter)) {
|
|
254
|
+
resetFilters();
|
|
255
|
+
} else {
|
|
256
|
+
filters.value.forEach((filter) => {
|
|
257
|
+
const foundSavedFilter = savedFilter.filters.find(
|
|
258
|
+
(f) => filter.key === f.target,
|
|
259
|
+
);
|
|
260
|
+
if (foundSavedFilter) {
|
|
261
|
+
filter.value = foundSavedFilter.value;
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
return {
|
|
268
|
+
search,
|
|
269
|
+
reflect,
|
|
270
|
+
filters,
|
|
271
|
+
isFilterVisible,
|
|
272
|
+
numberOfActiveFilters,
|
|
273
|
+
isMounting,
|
|
274
|
+
toggleFilters,
|
|
275
|
+
filterItems,
|
|
276
|
+
isSavedFilterActive,
|
|
277
|
+
resetFilters,
|
|
278
|
+
selectSavedFilter,
|
|
279
|
+
resetAllFilters,
|
|
280
|
+
};
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
export const reflectFiltersToPath = (filters: Filter[]): void => {
|
|
284
|
+
let searchParams = new URLSearchParams(window.location.search);
|
|
285
|
+
searchParams = filters.reduce((acc, filter) => {
|
|
286
|
+
const key = convertFilterKeyForPath(filter);
|
|
287
|
+
let value;
|
|
288
|
+
if (isBetweenFilter(filter)) {
|
|
289
|
+
const from = getfilterValue(filter, 'valueFrom').toString();
|
|
290
|
+
const to = getfilterValue(filter, 'valueTo').toString();
|
|
291
|
+
// escape "|" separator if end the string
|
|
292
|
+
value = `${from}|${to}`.replace(/\|$/g, '');
|
|
293
|
+
} else {
|
|
294
|
+
value = getfilterValue(filter).toString();
|
|
295
|
+
}
|
|
296
|
+
return handleValueInSearchParams(acc, key, value);
|
|
297
|
+
}, searchParams);
|
|
298
|
+
writeLocation(searchParams);
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
const convertFilterKeyForPath = (filter: Filter): string => {
|
|
302
|
+
return `${FILTER_KEY}-${filter.key}`;
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
const getfilterValue = (filter: Filter, key: string = 'value'): string => {
|
|
306
|
+
return filter[key as keyof Filter] === null ||
|
|
307
|
+
filter[key as keyof Filter] === undefined
|
|
308
|
+
? ''
|
|
309
|
+
: filter[key as keyof Filter];
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
export const reflectSearchToPath = (searchValue: string, key: string): void => {
|
|
313
|
+
let searchParams = new URLSearchParams(window.location.search);
|
|
314
|
+
searchParams = handleValueInSearchParams(searchParams, key, searchValue);
|
|
315
|
+
writeLocation(searchParams);
|
|
316
|
+
};
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
import {
|
|
3
|
+
dateFilterCompare,
|
|
4
|
+
dateIsBetween,
|
|
5
|
+
defaultIsAfterDateFilterFunction,
|
|
6
|
+
defaultNumberFilterFunction,
|
|
7
|
+
isBetweenFilter,
|
|
8
|
+
numberIsBetween,
|
|
9
|
+
} from './search.helper';
|
|
10
|
+
import { type Filter, FilterType, InputType } from '@/models';
|
|
11
|
+
import { vi, it, expect, afterEach } from 'vitest';
|
|
12
|
+
|
|
13
|
+
describe('isBetweenInput', () => {
|
|
14
|
+
test('should return true for filter type "betweenDate"', () => {
|
|
15
|
+
const filter = { type: 'betweenDate' } as Filter;
|
|
16
|
+
const result = isBetweenFilter(filter);
|
|
17
|
+
expect(result).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test('should return true for filter type "betweenNumber"', () => {
|
|
21
|
+
const filter = { type: 'betweenDate' } as Filter;
|
|
22
|
+
const result = isBetweenFilter(filter);
|
|
23
|
+
expect(result).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test('should return true for filter type "betweenDateTime"', () => {
|
|
27
|
+
const filter = { type: 'betweenDateTime' } as Filter;
|
|
28
|
+
const result = isBetweenFilter(filter);
|
|
29
|
+
expect(result).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test('should return false for filter type that is not "betweenDate", "betweenNumber", or "betweenDateTime"', () => {
|
|
33
|
+
const filter = { type: 'notBetween' as FilterType } as Filter;
|
|
34
|
+
const result = isBetweenFilter(filter);
|
|
35
|
+
expect(result).toBe(false);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
describe('dateFilterCompare', () => {
|
|
40
|
+
it('should compare two dates when the search date is defined', () => {
|
|
41
|
+
const filter: Filter = {
|
|
42
|
+
key: '',
|
|
43
|
+
label: '',
|
|
44
|
+
type: 'inputDate',
|
|
45
|
+
value: '2024-10-09',
|
|
46
|
+
inputType: InputType.DATE,
|
|
47
|
+
};
|
|
48
|
+
const result = dateFilterCompare('2024-10-10T12:00:00', filter);
|
|
49
|
+
expect(result).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('should handle empty or undefined search date', () => {
|
|
53
|
+
const filter: Filter = {
|
|
54
|
+
key: '',
|
|
55
|
+
label: '',
|
|
56
|
+
type: 'inputDate',
|
|
57
|
+
value: '',
|
|
58
|
+
inputType: InputType.DATE,
|
|
59
|
+
};
|
|
60
|
+
const result = dateFilterCompare('2024-10-10T12:00:00', filter);
|
|
61
|
+
expect(result).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('should correctly adjust the time in date mode', () => {
|
|
65
|
+
const filter: Filter = {
|
|
66
|
+
key: '',
|
|
67
|
+
label: '',
|
|
68
|
+
type: 'inputDate',
|
|
69
|
+
value: '2024-10-09',
|
|
70
|
+
inputType: InputType.DATE,
|
|
71
|
+
};
|
|
72
|
+
const result = dateFilterCompare('2024-10-09T23:59:59', filter);
|
|
73
|
+
expect(result).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('should return false if itemDate is before searchDate', () => {
|
|
77
|
+
const filter: Filter = {
|
|
78
|
+
key: '',
|
|
79
|
+
label: '',
|
|
80
|
+
type: 'inputDate',
|
|
81
|
+
value: '2024-10-10',
|
|
82
|
+
inputType: InputType.DATE,
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const result = dateFilterCompare('2024-10-09T12:00:00', filter);
|
|
86
|
+
expect(result).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('should compare with isGreaterThan = false', () => {
|
|
90
|
+
const filter: Filter = {
|
|
91
|
+
key: '',
|
|
92
|
+
label: '',
|
|
93
|
+
type: 'inputDate',
|
|
94
|
+
value: '2024-10-10',
|
|
95
|
+
inputType: InputType.DATE,
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const result = dateFilterCompare('2024-10-09T12:00:00', filter, false);
|
|
99
|
+
expect(result).toBe(true);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
describe('defaultIsAfterDateFilterFunction', () => {
|
|
104
|
+
test('should return true if dateItem is null', () => {
|
|
105
|
+
const result = defaultIsAfterDateFilterFunction(
|
|
106
|
+
// @ts-ignore
|
|
107
|
+
null,
|
|
108
|
+
new Date('2023-01-01'),
|
|
109
|
+
true,
|
|
110
|
+
);
|
|
111
|
+
expect(result).toBe(true);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
test('should return true if dateItem is after the search date and isAfterSearch is true', () => {
|
|
115
|
+
const dateItem = new Date('2024-01-01');
|
|
116
|
+
const search = new Date('2023-01-01');
|
|
117
|
+
const result = defaultIsAfterDateFilterFunction(dateItem, search, true);
|
|
118
|
+
expect(result).toBe(true);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
test('should return false if dateItem is before the search date and isAfterSearch is true', () => {
|
|
122
|
+
const dateItem = new Date('2022-01-01');
|
|
123
|
+
const search = new Date('2023-01-01');
|
|
124
|
+
const result = defaultIsAfterDateFilterFunction(dateItem, search, true);
|
|
125
|
+
expect(result).toBe(false);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test('should return true if dateItem is before the search date and isAfterSearch is false', () => {
|
|
129
|
+
const dateItem = new Date('2022-01-01');
|
|
130
|
+
const search = new Date('2023-01-01');
|
|
131
|
+
const result = defaultIsAfterDateFilterFunction(dateItem, search, false);
|
|
132
|
+
expect(result).toBe(true);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test('should return false if dateItem is after the search date and isAfterSearch is false', () => {
|
|
136
|
+
const dateItem = new Date('2024-01-01');
|
|
137
|
+
const search = new Date('2023-01-01');
|
|
138
|
+
const result = defaultIsAfterDateFilterFunction(dateItem, search, false);
|
|
139
|
+
expect(result).toBe(false);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
test('should return true if dateItem is the same as the search date and isAfterSearch is true', () => {
|
|
143
|
+
const dateItem = new Date('2023-01-01');
|
|
144
|
+
const search = new Date('2023-01-01');
|
|
145
|
+
const result = defaultIsAfterDateFilterFunction(dateItem, search, true);
|
|
146
|
+
expect(result).toBe(true);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
test('should return true if dateItem is the same as the search date and isAfterSearch is false', () => {
|
|
150
|
+
const dateItem = new Date('2023-01-01');
|
|
151
|
+
const search = new Date('2023-01-01');
|
|
152
|
+
const result = defaultIsAfterDateFilterFunction(dateItem, search, false);
|
|
153
|
+
expect(result).toBe(true);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
describe('defaultNumberFilterFunction', () => {
|
|
158
|
+
// Cas où itemNumber ou search sont null ou indéfinis
|
|
159
|
+
test('should return true if itemNumber is undefined or null', () => {
|
|
160
|
+
// @ts-ignore
|
|
161
|
+
const result = defaultNumberFilterFunction(null, 5, true);
|
|
162
|
+
expect(result).toBe(true);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
test('should return true if search is undefined or null', () => {
|
|
166
|
+
// @ts-ignore
|
|
167
|
+
const result = defaultNumberFilterFunction(5, null, true);
|
|
168
|
+
expect(result).toBe(true);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
test('should return true if both itemNumber and search are undefined or null', () => {
|
|
172
|
+
// @ts-ignore
|
|
173
|
+
const result = defaultNumberFilterFunction(null, null, true);
|
|
174
|
+
expect(result).toBe(true);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
// Cas où itemNumber ou search est égal à 0
|
|
178
|
+
test('should correctly handle 0 as itemNumber and return false if isAfterSearch is true and search is greater', () => {
|
|
179
|
+
const result = defaultNumberFilterFunction(0, 5, true);
|
|
180
|
+
expect(result).toBe(false);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test('should correctly handle 0 as search and return true if itemNumber is greater and isAfterSearch is true', () => {
|
|
184
|
+
const result = defaultNumberFilterFunction(5, 0, true);
|
|
185
|
+
expect(result).toBe(true);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
test('should correctly handle 0 as itemNumber and return true if isAfterSearch is false and search is greater', () => {
|
|
189
|
+
const result = defaultNumberFilterFunction(0, 5, false);
|
|
190
|
+
expect(result).toBe(true);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// Comparaisons normales
|
|
194
|
+
test('should return true if itemNumber is greater than search and isAfterSearch is true', () => {
|
|
195
|
+
const result = defaultNumberFilterFunction(10, 5, true);
|
|
196
|
+
expect(result).toBe(true);
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
test('should return false if itemNumber is less than search and isAfterSearch is true', () => {
|
|
200
|
+
const result = defaultNumberFilterFunction(3, 5, true);
|
|
201
|
+
expect(result).toBe(false);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test('should return true if itemNumber is less than search and isAfterSearch is false', () => {
|
|
205
|
+
const result = defaultNumberFilterFunction(3, 5, false);
|
|
206
|
+
expect(result).toBe(true);
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
test('should return false if itemNumber is greater than search and isAfterSearch is false', () => {
|
|
210
|
+
const result = defaultNumberFilterFunction(10, 5, false);
|
|
211
|
+
expect(result).toBe(false);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
// Cas d'égalité
|
|
215
|
+
test('should return true if itemNumber is equal to search regardless of isAfterSearch being true', () => {
|
|
216
|
+
const result = defaultNumberFilterFunction(5, 5, true);
|
|
217
|
+
expect(result).toBe(true);
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
test('should return true if itemNumber is equal to search regardless of isAfterSearch being false', () => {
|
|
221
|
+
const result = defaultNumberFilterFunction(5, 5, false);
|
|
222
|
+
expect(result).toBe(true);
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
describe('dateIsBetween', () => {
|
|
227
|
+
const validDate = '2024-01-19T08:27:12Z'; // Date de test
|
|
228
|
+
const filter: Filter = {
|
|
229
|
+
key: '',
|
|
230
|
+
label: '',
|
|
231
|
+
type: 'betweenDate',
|
|
232
|
+
valueFrom: '2024-01-18',
|
|
233
|
+
valueTo: '2024-01-20',
|
|
234
|
+
customFilter: undefined, // not our responsability
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
test('should return true if itemDate is within the filter range', () => {
|
|
238
|
+
const result = dateIsBetween(validDate, filter);
|
|
239
|
+
expect(result).toBe(true);
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
test('should return true if itemDate and the filter range in the same day', () => {
|
|
243
|
+
const filterOnOneDay = {
|
|
244
|
+
...filter,
|
|
245
|
+
valueFrom: '2024-01-19',
|
|
246
|
+
valueTo: '2024-01-19',
|
|
247
|
+
};
|
|
248
|
+
const result = dateIsBetween(validDate, filterOnOneDay);
|
|
249
|
+
expect(result).toBe(true);
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
test('should return false if itemDate is before the filter range', () => {
|
|
253
|
+
const filterBefore = { ...filter, valueFrom: '2024-01-20T09:00:00Z' };
|
|
254
|
+
const result = dateIsBetween(validDate, filterBefore);
|
|
255
|
+
expect(result).toBe(false);
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
test('should return false if itemDate is after the filter range', () => {
|
|
259
|
+
const filterAfter = { ...filter, valueTo: '2024-01-18T08:00:00Z' };
|
|
260
|
+
const result = dateIsBetween(validDate, filterAfter);
|
|
261
|
+
expect(result).toBe(false);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
test('should return true if filter valueFrom is undefined and valueTo in range', () => {
|
|
265
|
+
const filterUndefinedFrom = { ...filter, valueFrom: undefined };
|
|
266
|
+
const result = dateIsBetween(validDate, filterUndefinedFrom);
|
|
267
|
+
expect(result).toBe(true);
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
test('should return true if filter valueTo is undefined and valueFrom in range', () => {
|
|
271
|
+
const filterUndefinedTo = { ...filter, valueTo: undefined };
|
|
272
|
+
const result = dateIsBetween(validDate, filterUndefinedTo);
|
|
273
|
+
expect(result).toBe(true);
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
test('should return true if filter valueFrom and valueTo are both undefined', () => {
|
|
277
|
+
const filterBothUndefined = {
|
|
278
|
+
...filter,
|
|
279
|
+
valueFrom: undefined,
|
|
280
|
+
valueTo: undefined,
|
|
281
|
+
};
|
|
282
|
+
const result = dateIsBetween(validDate, filterBothUndefined);
|
|
283
|
+
expect(result).toBe(true); // Because both are undefined
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
describe('numberIsBetween', () => {
|
|
288
|
+
const filter: Filter = {
|
|
289
|
+
label: '',
|
|
290
|
+
type: 'betweenNumber',
|
|
291
|
+
key: 'value',
|
|
292
|
+
valueFrom: 10,
|
|
293
|
+
valueTo: 20,
|
|
294
|
+
customFilter: undefined,
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
const itemInRange = 15; // Un item dans la plage
|
|
298
|
+
const itemBelowRange = 5; // Un item en dessous de la plage
|
|
299
|
+
const itemAboveRange = 25; // Un item au-dessus de la plage
|
|
300
|
+
|
|
301
|
+
test('should return true if item value is within the filter range', () => {
|
|
302
|
+
const result = numberIsBetween(itemInRange, filter);
|
|
303
|
+
expect(result).toBe(true);
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
test('should return false if item value is below the filter range', () => {
|
|
307
|
+
const result = numberIsBetween(itemBelowRange, filter);
|
|
308
|
+
expect(result).toBe(false);
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
test('should return false if item value is above the filter range', () => {
|
|
312
|
+
const result = numberIsBetween(itemAboveRange, filter);
|
|
313
|
+
expect(result).toBe(false);
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
test('should return true if filter valueFrom is null', () => {
|
|
317
|
+
const filterNullFrom = { ...filter, valueFrom: null };
|
|
318
|
+
const result = numberIsBetween(itemInRange, filterNullFrom);
|
|
319
|
+
expect(result).toBe(true);
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
test('should return true if filter valueTo is null', () => {
|
|
323
|
+
const filterNullTo = { ...filter, valueTo: null };
|
|
324
|
+
const result = numberIsBetween(itemInRange, filterNullTo);
|
|
325
|
+
expect(result).toBe(true);
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
test('should return true if both filter valueFrom and valueTo are null', () => {
|
|
329
|
+
const filterBothNull = { ...filter, valueFrom: null, valueTo: null };
|
|
330
|
+
const result = numberIsBetween(itemInRange, filterBothNull);
|
|
331
|
+
expect(result).toBe(true); // Because both are null
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
test('should handle NaN gracefully', () => {
|
|
335
|
+
const invalidItemValue = NaN;
|
|
336
|
+
const result = numberIsBetween(invalidItemValue, filter);
|
|
337
|
+
expect(result).toBe(true); // all invalid input value is not filter
|
|
338
|
+
});
|
|
339
|
+
});
|