slick-table 1.0.18 → 1.1.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/dist/index.cjs.js +31 -31
- package/dist/index.es.js +162 -157
- package/dist/types/shared/lib/slickgrid/lib/sorting/ColumnSorter.d.ts +1 -0
- package/dist/types/shared/lib/slickgrid/lib/sorting/ColumnSorter.d.ts.map +1 -1
- package/dist/types/shared/lib/sorting/Sort.d.ts +1 -0
- package/dist/types/shared/lib/sorting/Sort.d.ts.map +1 -1
- package/dist/types/shared/model/enums/ESortType.d.ts +3 -1
- package/dist/types/shared/model/enums/ESortType.d.ts.map +1 -1
- package/package.json +8 -3
- package/src/App.tsx +9 -0
- package/src/app/styles/global.scss +31 -0
- package/src/app/styles/slickgrid.scss +13 -0
- package/src/app/types/index.d.ts +9 -0
- package/src/entities/popup/index.ts +2 -0
- package/src/entities/popup/lib/index.ts +1 -0
- package/src/entities/popup/lib/visibility/index.ts +1 -0
- package/src/entities/popup/lib/visibility/makeVisible.ts +9 -0
- package/src/entities/popup/ui/Overlay/Overlay.style.ts +14 -0
- package/src/entities/popup/ui/Overlay/Overlay.test.tsx +19 -0
- package/src/entities/popup/ui/Overlay/Overlay.tsx +20 -0
- package/src/entities/popup/ui/Overlay/index.ts +1 -0
- package/src/entities/popup/ui/Popup.style.ts +17 -0
- package/src/entities/popup/ui/Popup.tsx +12 -0
- package/src/entities/popup/ui/index.ts +2 -0
- package/src/entities/skeleton/Skeleton.style.ts +10 -0
- package/src/entities/skeleton/Skeleton.tsx +11 -0
- package/src/entities/skeleton/index.ts +1 -0
- package/src/features/column-filters/index.ts +1 -0
- package/src/features/column-filters/lib/filter/applyFilter.ts +25 -0
- package/src/features/column-filters/lib/filter/index.ts +1 -0
- package/src/features/column-filters/lib/hooks/index.ts +2 -0
- package/src/features/column-filters/lib/hooks/useOpenMenu.ts +43 -0
- package/src/features/column-filters/lib/hooks/useSubscribeToEvent.ts +17 -0
- package/src/features/column-filters/lib/index.ts +4 -0
- package/src/features/column-filters/lib/props/datePickerProps.tsx +11 -0
- package/src/features/column-filters/lib/props/index.ts +1 -0
- package/src/features/column-filters/lib/select/firstIn.ts +22 -0
- package/src/features/column-filters/lib/select/index.ts +1 -0
- package/src/features/column-filters/model/consts/defaultValue.ts +6 -0
- package/src/features/column-filters/model/consts/id.ts +1 -0
- package/src/features/column-filters/model/consts/index.ts +3 -0
- package/src/features/column-filters/model/consts/label.ts +5 -0
- package/src/features/column-filters/model/index.ts +2 -0
- package/src/features/column-filters/model/types/IProps.ts +9 -0
- package/src/features/column-filters/model/types/index.ts +1 -0
- package/src/features/column-filters/ui/BooleanInput/BooleanInput.style.ts +10 -0
- package/src/features/column-filters/ui/BooleanInput/BooleanInput.tsx +53 -0
- package/src/features/column-filters/ui/BooleanInput/index.ts +1 -0
- package/src/features/column-filters/ui/ButtonReset/ButtonReset.style.ts +10 -0
- package/src/features/column-filters/ui/ButtonReset/ButtonReset.tsx +39 -0
- package/src/features/column-filters/ui/ButtonReset/index.ts +1 -0
- package/src/features/column-filters/ui/ColumnFilters.style.ts +12 -0
- package/src/features/column-filters/ui/ColumnFilters.tsx +44 -0
- package/src/features/column-filters/ui/DateBetween/DateBetween.tsx +52 -0
- package/src/features/column-filters/ui/DateBetween/index.ts +1 -0
- package/src/features/column-filters/ui/DateInput/DateInput.tsx +36 -0
- package/src/features/column-filters/ui/DateInput/index.ts +1 -0
- package/src/features/column-filters/ui/InputArea/InputArea.tsx +63 -0
- package/src/features/column-filters/ui/InputArea/index.ts +1 -0
- package/src/features/column-filters/ui/MultipleSelect/index.ts +1 -0
- package/src/features/column-filters/ui/MultipleSelect/lib/index.ts +2 -0
- package/src/features/column-filters/ui/MultipleSelect/lib/props/index.ts +1 -0
- package/src/features/column-filters/ui/MultipleSelect/lib/props/props.ts +36 -0
- package/src/features/column-filters/ui/MultipleSelect/lib/sorting/ascending.ts +17 -0
- package/src/features/column-filters/ui/MultipleSelect/lib/sorting/index.ts +1 -0
- package/src/features/column-filters/ui/MultipleSelect/model/IValue.ts +1 -0
- package/src/features/column-filters/ui/MultipleSelect/model/index.ts +1 -0
- package/src/features/column-filters/ui/MultipleSelect/ui/MultipleSelect.style.ts +9 -0
- package/src/features/column-filters/ui/MultipleSelect/ui/MultipleSelect.tsx +72 -0
- package/src/features/column-filters/ui/MultipleSelect/ui/index.ts +1 -0
- package/src/features/column-filters/ui/NumberBetween/NumberBetween.tsx +42 -0
- package/src/features/column-filters/ui/NumberBetween/index.ts +1 -0
- package/src/features/column-filters/ui/NumberInput/NumberInput.tsx +24 -0
- package/src/features/column-filters/ui/NumberInput/index.ts +1 -0
- package/src/features/column-filters/ui/SelectFilter/index.ts +1 -0
- package/src/features/column-filters/ui/SelectFilter/model/index.ts +1 -0
- package/src/features/column-filters/ui/SelectFilter/model/options/index.ts +1 -0
- package/src/features/column-filters/ui/SelectFilter/model/options/options.ts +66 -0
- package/src/features/column-filters/ui/SelectFilter/ui/SelectFilter.tsx +50 -0
- package/src/features/column-filters/ui/SelectFilter/ui/index.ts +1 -0
- package/src/features/column-filters/ui/TextInput/TextInput.tsx +23 -0
- package/src/features/column-filters/ui/TextInput/index.ts +1 -0
- package/src/features/column-filters/ui/index.ts +1 -0
- package/src/features/context-menu/index.ts +1 -0
- package/src/features/context-menu/lib/hooks/index.ts +1 -0
- package/src/features/context-menu/lib/hooks/useSubscribeToEvent.ts +27 -0
- package/src/features/context-menu/lib/index.ts +1 -0
- package/src/features/context-menu/model/consts/id.ts +1 -0
- package/src/features/context-menu/model/consts/index.ts +1 -0
- package/src/features/context-menu/model/index.ts +1 -0
- package/src/features/context-menu/ui/ButtonDownloadCSV/ButtonDownloadCSV.tsx +34 -0
- package/src/features/context-menu/ui/ButtonDownloadCSV/index.ts +1 -0
- package/src/features/context-menu/ui/ButtonGroup/ButtonGroup.tsx +28 -0
- package/src/features/context-menu/ui/ButtonGroup/index.ts +1 -0
- package/src/features/context-menu/ui/ButtonResetFilters/index.ts +1 -0
- package/src/features/context-menu/ui/ButtonResetFilters/lib/index.ts +1 -0
- package/src/features/context-menu/ui/ButtonResetFilters/lib/visibility/hasFiltersApplied.ts +8 -0
- package/src/features/context-menu/ui/ButtonResetFilters/lib/visibility/index.ts +1 -0
- package/src/features/context-menu/ui/ButtonResetFilters/ui/ButtonResetFilters.tsx +39 -0
- package/src/features/context-menu/ui/ButtonResetFilters/ui/index.ts +1 -0
- package/src/features/context-menu/ui/ButtonUngroup/ButtonUngroup.tsx +28 -0
- package/src/features/context-menu/ui/ButtonUngroup/index.ts +1 -0
- package/src/features/context-menu/ui/CollapseAll/CollapseAll.tsx +31 -0
- package/src/features/context-menu/ui/CollapseAll/index.ts +1 -0
- package/src/features/context-menu/ui/ContextMenu.style.ts +29 -0
- package/src/features/context-menu/ui/ContextMenu.tsx +55 -0
- package/src/features/context-menu/ui/CopyToClipboard/CopyToClipboard.tsx +42 -0
- package/src/features/context-menu/ui/CopyToClipboard/index.ts +1 -0
- package/src/features/context-menu/ui/ExpandAll/ExpandAll.tsx +30 -0
- package/src/features/context-menu/ui/ExpandAll/index.ts +1 -0
- package/src/features/context-menu/ui/Print/index.ts +1 -0
- package/src/features/context-menu/ui/Print/ui/Print.tsx +25 -0
- package/src/features/context-menu/ui/Print/ui/index.ts +1 -0
- package/src/features/context-menu/ui/index.ts +1 -0
- package/src/index.scss +2 -0
- package/src/index.ts +40 -0
- package/src/main.tsx +15 -0
- package/src/setupTests.ts +5 -0
- package/src/shared/lib/an-event/index.ts +31 -0
- package/src/shared/lib/datetime/dateToString.spec.ts +11 -0
- package/src/shared/lib/datetime/dateToString.ts +8 -0
- package/src/shared/lib/datetime/getTime.spec.ts +10 -0
- package/src/shared/lib/datetime/getTime.ts +3 -0
- package/src/shared/lib/datetime/index.ts +2 -0
- package/src/shared/lib/debounce/index.ts +11 -0
- package/src/shared/lib/dom/elementNotVisible.spec.ts +72 -0
- package/src/shared/lib/dom/elementNotVisible.ts +9 -0
- package/src/shared/lib/dom/index.ts +1 -0
- package/src/shared/lib/format/IOptions.ts +11 -0
- package/src/shared/lib/format/addParentheses.spec.ts +9 -0
- package/src/shared/lib/format/addParentheses.ts +7 -0
- package/src/shared/lib/format/formatNumber.spec.ts +50 -0
- package/src/shared/lib/format/formatNumber.ts +62 -0
- package/src/shared/lib/format/index.ts +2 -0
- package/src/shared/lib/localStrore/index.ts +1 -0
- package/src/shared/lib/localStrore/lib/getSlickTable.ts +5 -0
- package/src/shared/lib/localStrore/lib/getSorting.ts +5 -0
- package/src/shared/lib/localStrore/lib/index.ts +3 -0
- package/src/shared/lib/localStrore/lib/setSorting.ts +8 -0
- package/src/shared/lib/localStrore/model/enums/EStorageKey.ts +4 -0
- package/src/shared/lib/localStrore/model/enums/index.ts +1 -0
- package/src/shared/lib/localStrore/model/index.ts +3 -0
- package/src/shared/lib/localStrore/model/localStore.ts +28 -0
- package/src/shared/lib/localStrore/model/types/ILastSorting.ts +4 -0
- package/src/shared/lib/localStrore/model/types/ISlickTable.ts +1 -0
- package/src/shared/lib/localStrore/model/types/ISorting.ts +3 -0
- package/src/shared/lib/localStrore/model/types/index.ts +3 -0
- package/src/shared/lib/numbers/index.ts +1 -0
- package/src/shared/lib/numbers/toNumber.spec.ts +25 -0
- package/src/shared/lib/numbers/toNumber.ts +11 -0
- package/src/shared/lib/regexp/dates.spec.ts +23 -0
- package/src/shared/lib/regexp/dates.ts +6 -0
- package/src/shared/lib/regexp/escapeSpecialChar.spec.ts +24 -0
- package/src/shared/lib/regexp/escapeSpecialChar.ts +4 -0
- package/src/shared/lib/regexp/index.ts +2 -0
- package/src/shared/lib/slickgrid/index.ts +70 -0
- package/src/shared/lib/slickgrid/lib/callbacks/getOnKeyDownCallback.ts +12 -0
- package/src/shared/lib/slickgrid/lib/callbacks/index.ts +4 -0
- package/src/shared/lib/slickgrid/lib/callbacks/onCellChange.ts +13 -0
- package/src/shared/lib/slickgrid/lib/callbacks/onRowCountChanged.ts +12 -0
- package/src/shared/lib/slickgrid/lib/callbacks/onRowsChanged.ts +8 -0
- package/src/shared/lib/slickgrid/lib/contextMenu/index.ts +1 -0
- package/src/shared/lib/slickgrid/lib/contextMenu/openContextMenu.ts +17 -0
- package/src/shared/lib/slickgrid/lib/editors/Autocomplete/Autocomplete.ts +155 -0
- package/src/shared/lib/slickgrid/lib/editors/Autocomplete/EditorAutocomplete.ts +66 -0
- package/src/shared/lib/slickgrid/lib/editors/Autocomplete/EditorSelectWithSearch.ts +79 -0
- package/src/shared/lib/slickgrid/lib/editors/Autocomplete/index.ts +3 -0
- package/src/shared/lib/slickgrid/lib/editors/EditorAmount.ts +82 -0
- package/src/shared/lib/slickgrid/lib/editors/EditorDate.ts +127 -0
- package/src/shared/lib/slickgrid/lib/editors/EditorSelectNumber.ts +16 -0
- package/src/shared/lib/slickgrid/lib/editors/EditorSelectString.ts +95 -0
- package/src/shared/lib/slickgrid/lib/editors/index.ts +9 -0
- package/src/shared/lib/slickgrid/lib/formatters/DateFormatter.ts +9 -0
- package/src/shared/lib/slickgrid/lib/formatters/FormatterCheck.ts +11 -0
- package/src/shared/lib/slickgrid/lib/formatters/PercentFormatter.spec.ts +11 -0
- package/src/shared/lib/slickgrid/lib/formatters/PercentFormatter.ts +8 -0
- package/src/shared/lib/slickgrid/lib/formatters/StringFormatter.ts +2 -0
- package/src/shared/lib/slickgrid/lib/formatters/getFormatterNumber.ts +17 -0
- package/src/shared/lib/slickgrid/lib/formatters/index.ts +5 -0
- package/src/shared/lib/slickgrid/lib/functions/addNewRow.ts +22 -0
- package/src/shared/lib/slickgrid/lib/functions/commitCurrentEdit.ts +6 -0
- package/src/shared/lib/slickgrid/lib/functions/copySelectedRows.ts +34 -0
- package/src/shared/lib/slickgrid/lib/functions/deleteRows.ts +20 -0
- package/src/shared/lib/slickgrid/lib/functions/getActiveRowId.ts +16 -0
- package/src/shared/lib/slickgrid/lib/functions/getDisplayedRows.ts +13 -0
- package/src/shared/lib/slickgrid/lib/functions/getLastRow.ts +6 -0
- package/src/shared/lib/slickgrid/lib/functions/getNextId.ts +18 -0
- package/src/shared/lib/slickgrid/lib/functions/index.ts +10 -0
- package/src/shared/lib/slickgrid/lib/functions/isDeletionDangerous.ts +21 -0
- package/src/shared/lib/slickgrid/lib/functions/wereEdited.ts +12 -0
- package/src/shared/lib/slickgrid/lib/grouping/formatterGroupTotals.test.ts +59 -0
- package/src/shared/lib/slickgrid/lib/grouping/formatterGroupTotals.ts +21 -0
- package/src/shared/lib/slickgrid/lib/grouping/index.ts +1 -0
- package/src/shared/lib/slickgrid/lib/highlighting/getColumnsHash.ts +8 -0
- package/src/shared/lib/slickgrid/lib/highlighting/highlightCell.ts +21 -0
- package/src/shared/lib/slickgrid/lib/highlighting/highlightColumns.ts +24 -0
- package/src/shared/lib/slickgrid/lib/highlighting/index.ts +2 -0
- package/src/shared/lib/slickgrid/lib/hooks/eventClickOnTable.ts +17 -0
- package/src/shared/lib/slickgrid/lib/hooks/index.ts +4 -0
- package/src/shared/lib/slickgrid/lib/hooks/useHotKeys.ts +39 -0
- package/src/shared/lib/slickgrid/lib/hooks/useListenIfTablesWereEdited.ts +36 -0
- package/src/shared/lib/slickgrid/lib/hooks/useResizeCanvas.ts +18 -0
- package/src/shared/lib/slickgrid/lib/hooks/useUpdateTotal.ts +17 -0
- package/src/shared/lib/slickgrid/lib/hotKeys/hotKeysCopy.ts +7 -0
- package/src/shared/lib/slickgrid/lib/hotKeys/hotKeysDelete.ts +7 -0
- package/src/shared/lib/slickgrid/lib/hotKeys/hotKeysRedo.ts +7 -0
- package/src/shared/lib/slickgrid/lib/hotKeys/hotKeysReverse.ts +7 -0
- package/src/shared/lib/slickgrid/lib/hotKeys/hotKeysUndo.ts +7 -0
- package/src/shared/lib/slickgrid/lib/hotKeys/index.ts +7 -0
- package/src/shared/lib/slickgrid/lib/hotKeys/nothingToCopy.ts +14 -0
- package/src/shared/lib/slickgrid/lib/hotKeys/positionToPaste.ts +12 -0
- package/src/shared/lib/slickgrid/lib/index.ts +61 -0
- package/src/shared/lib/slickgrid/lib/selection/getUpdates.ts +41 -0
- package/src/shared/lib/slickgrid/lib/selection/index.ts +2 -0
- package/src/shared/lib/slickgrid/lib/selection/selectedRows.ts +17 -0
- package/src/shared/lib/slickgrid/lib/sorting/ColumnSorter.ts +166 -0
- package/src/shared/lib/slickgrid/lib/sorting/index.ts +1 -0
- package/src/shared/lib/slickgrid/lib/total-calculator/TotalCalculator.ts +71 -0
- package/src/shared/lib/slickgrid/lib/total-calculator/index.ts +1 -0
- package/src/shared/lib/slickgrid/lib/validators/DateValidator.ts +12 -0
- package/src/shared/lib/slickgrid/lib/validators/EmptyStringValidator.ts +5 -0
- package/src/shared/lib/slickgrid/lib/validators/LengthValidator.ts +7 -0
- package/src/shared/lib/slickgrid/lib/validators/index.ts +3 -0
- package/src/shared/lib/slickgrid/model/SlickTable/csvDownloadManager/DownloadManager.ts +110 -0
- package/src/shared/lib/slickgrid/model/SlickTable/csvDownloadManager/index.ts +1 -0
- package/src/shared/lib/slickgrid/model/SlickTable/filters/DeletedRowsFilter.test.ts +36 -0
- package/src/shared/lib/slickgrid/model/SlickTable/filters/DeletedRowsFilter.ts +12 -0
- package/src/shared/lib/slickgrid/model/SlickTable/filters/Filter.test.ts +80 -0
- package/src/shared/lib/slickgrid/model/SlickTable/filters/Filter.ts +52 -0
- package/src/shared/lib/slickgrid/model/SlickTable/filters/WithoutFilter.ts +30 -0
- package/src/shared/lib/slickgrid/model/SlickTable/filters/decorators/ColumnFilter/DecoratorColumnFilter.test.ts +216 -0
- package/src/shared/lib/slickgrid/model/SlickTable/filters/decorators/ColumnFilter/DecoratorColumnFilter.ts +53 -0
- package/src/shared/lib/slickgrid/model/SlickTable/filters/decorators/ColumnFilter/Filter.test.ts +264 -0
- package/src/shared/lib/slickgrid/model/SlickTable/filters/decorators/ColumnFilter/Filter.ts +108 -0
- package/src/shared/lib/slickgrid/model/SlickTable/filters/decorators/ColumnFilter/index.ts +1 -0
- package/src/shared/lib/slickgrid/model/SlickTable/filters/decorators/DecoratorEndingDate.ts +16 -0
- package/src/shared/lib/slickgrid/model/SlickTable/filters/decorators/DecoratorFilter.test.ts +139 -0
- package/src/shared/lib/slickgrid/model/SlickTable/filters/decorators/DecoratorFilter.ts +55 -0
- package/src/shared/lib/slickgrid/model/SlickTable/filters/decorators/DecoratorPeriod.ts +24 -0
- package/src/shared/lib/slickgrid/model/SlickTable/filters/decorators/index.ts +4 -0
- package/src/shared/lib/slickgrid/model/SlickTable/filters/index.ts +9 -0
- package/src/shared/lib/slickgrid/model/SlickTable/hotKeys/DefaultHotKeys.ts +116 -0
- package/src/shared/lib/slickgrid/model/SlickTable/hotKeys/WithoutHotKeys.ts +20 -0
- package/src/shared/lib/slickgrid/model/SlickTable/hotKeys/decorators/HotKeysDecorator.ts +32 -0
- package/src/shared/lib/slickgrid/model/SlickTable/hotKeys/decorators/PreventCopying.ts +18 -0
- package/src/shared/lib/slickgrid/model/SlickTable/hotKeys/decorators/RedoUndoOnly.ts +18 -0
- package/src/shared/lib/slickgrid/model/SlickTable/hotKeys/decorators/WithConfirmationOfDeletion.ts +33 -0
- package/src/shared/lib/slickgrid/model/SlickTable/hotKeys/decorators/index.ts +4 -0
- package/src/shared/lib/slickgrid/model/SlickTable/hotKeys/index.ts +8 -0
- package/src/shared/lib/slickgrid/model/SlickTable/index.ts +19 -0
- package/src/shared/lib/slickgrid/model/SlickTable/printer/DefaultPrinter.test.ts +226 -0
- package/src/shared/lib/slickgrid/model/SlickTable/printer/DefaultPrinter.ts +179 -0
- package/src/shared/lib/slickgrid/model/SlickTable/printer/index.ts +1 -0
- package/src/shared/lib/slickgrid/model/SlickTable/printer/model/consts/cssStyles.ts +46 -0
- package/src/shared/lib/slickgrid/model/SlickTable/printer/model/consts/index.ts +1 -0
- package/src/shared/lib/slickgrid/model/SlickTable/printer/model/index.ts +1 -0
- package/src/shared/lib/slickgrid/model/SlickTable/table/SlickTable.test.ts +72 -0
- package/src/shared/lib/slickgrid/model/SlickTable/table/SlickTable.ts +168 -0
- package/src/shared/lib/slickgrid/model/SlickTable/table/index.ts +1 -0
- package/src/shared/lib/slickgrid/model/events/eventContextMenu.ts +10 -0
- package/src/shared/lib/slickgrid/model/events/index.ts +1 -0
- package/src/shared/lib/slickgrid/model/index.ts +18 -0
- package/src/shared/lib/slickgrid/ui/HeaderButtons/index.ts +2 -0
- package/src/shared/lib/slickgrid/ui/HeaderButtons/lib/handleClick/handleHeaderButtons.ts +27 -0
- package/src/shared/lib/slickgrid/ui/HeaderButtons/lib/handleClick/index.ts +1 -0
- package/src/shared/lib/slickgrid/ui/HeaderButtons/lib/highlighting/headerButtons.ts +45 -0
- package/src/shared/lib/slickgrid/ui/HeaderButtons/lib/highlighting/index.ts +1 -0
- package/src/shared/lib/slickgrid/ui/HeaderButtons/lib/index.ts +2 -0
- package/src/shared/lib/slickgrid/ui/HeaderButtons/model/buttons/index.ts +1 -0
- package/src/shared/lib/slickgrid/ui/HeaderButtons/model/buttons/openColumnFilter.ts +10 -0
- package/src/shared/lib/slickgrid/ui/HeaderButtons/model/event/eventOpenColumnFilters.ts +13 -0
- package/src/shared/lib/slickgrid/ui/HeaderButtons/model/event/index.ts +1 -0
- package/src/shared/lib/slickgrid/ui/HeaderButtons/model/index.ts +2 -0
- package/src/shared/lib/slickgrid/ui/SlickgridTable/index.ts +1 -0
- package/src/shared/lib/slickgrid/ui/SlickgridTable/lib/callbacks/index.ts +1 -0
- package/src/shared/lib/slickgrid/ui/SlickgridTable/lib/callbacks/onAddNewRow.ts +34 -0
- package/src/shared/lib/slickgrid/ui/SlickgridTable/lib/hooks/index.ts +1 -0
- package/src/shared/lib/slickgrid/ui/SlickgridTable/lib/hooks/useGrid.ts +142 -0
- package/src/shared/lib/slickgrid/ui/SlickgridTable/lib/index.ts +2 -0
- package/src/shared/lib/slickgrid/ui/SlickgridTable/model/defaultOptions.ts +8 -0
- package/src/shared/lib/slickgrid/ui/SlickgridTable/model/index.ts +2 -0
- package/src/shared/lib/slickgrid/ui/SlickgridTable/model/types/Props.ts +46 -0
- package/src/shared/lib/slickgrid/ui/SlickgridTable/model/types/index.ts +1 -0
- package/src/shared/lib/slickgrid/ui/SlickgridTable/ui/SlickgridTable.tsx +57 -0
- package/src/shared/lib/slickgrid/ui/SlickgridTable/ui/index.ts +1 -0
- package/src/shared/lib/slickgrid/ui/columns/columnCheckboxSelector/columnCheckboxSelector.ts +7 -0
- package/src/shared/lib/slickgrid/ui/columns/columnCheckboxSelector/index.ts +1 -0
- package/src/shared/lib/slickgrid/ui/columns/columnIsEdited/index.ts +1 -0
- package/src/shared/lib/slickgrid/ui/columns/columnIsEdited/lib/index.ts +1 -0
- package/src/shared/lib/slickgrid/ui/columns/columnIsEdited/lib/setEditedMark.spec.ts +11 -0
- package/src/shared/lib/slickgrid/ui/columns/columnIsEdited/lib/setEditedMark.ts +7 -0
- package/src/shared/lib/slickgrid/ui/columns/columnIsEdited/ui/columnIsEdited.ts +16 -0
- package/src/shared/lib/slickgrid/ui/columns/columnIsEdited/ui/index.ts +1 -0
- package/src/shared/lib/slickgrid/ui/columns/index.ts +2 -0
- package/src/shared/lib/slickgrid/ui/index.ts +9 -0
- package/src/shared/lib/slickgrid/ui/styles/WithTableStyles/WithTableStyles.style.ts +157 -0
- package/src/shared/lib/slickgrid/ui/styles/WithTableStyles/WithTableStyles.tsx +11 -0
- package/src/shared/lib/slickgrid/ui/styles/WithTableStyles/index.ts +1 -0
- package/src/shared/lib/slickgrid/ui/styles/index.ts +1 -0
- package/src/shared/lib/slickgrid/ui/styles/keyframes/index.ts +1 -0
- package/src/shared/lib/slickgrid/ui/styles/keyframes/wink.ts +7 -0
- package/src/shared/lib/sorting/Sort.ts +37 -0
- package/src/shared/lib/sorting/index.ts +1 -0
- package/src/shared/lib/stringCalculator/index.ts +2 -0
- package/src/shared/lib/stringCalculator/stringCalculator.js +834 -0
- package/src/shared/lib/stringCalculator/stringCalculator.spec.ts +16 -0
- package/src/shared/lib/strings/deleteDoubleQuotes.spec.ts +11 -0
- package/src/shared/lib/strings/deleteDoubleQuotes.ts +5 -0
- package/src/shared/lib/strings/index.ts +3 -0
- package/src/shared/lib/strings/removeHtml.spec.ts +29 -0
- package/src/shared/lib/strings/removeHtml.ts +5 -0
- package/src/shared/lib/strings/toStringWithCommas.spec.ts +16 -0
- package/src/shared/lib/strings/toStringWithCommas.ts +15 -0
- package/src/shared/model/consts/columnId.ts +1 -0
- package/src/shared/model/consts/dateFormats.ts +5 -0
- package/src/shared/model/consts/index.ts +4 -0
- package/src/shared/model/consts/invalidDate.ts +1 -0
- package/src/shared/model/consts/noPrivilegesMessage.ts +1 -0
- package/src/shared/model/enums/EColumnFilter.ts +16 -0
- package/src/shared/model/enums/EColumnFiltersGroup.ts +10 -0
- package/src/shared/model/enums/EDateFormat.ts +11 -0
- package/src/shared/model/enums/EKey.ts +9 -0
- package/src/shared/model/enums/EKeyCode.ts +8 -0
- package/src/shared/model/enums/ESortType.ts +17 -0
- package/src/shared/model/enums/index.ts +6 -0
- package/src/shared/model/types/IColumn.ts +11 -0
- package/src/shared/model/types/IColumnFilterValue.ts +4 -0
- package/src/shared/model/types/IDownloadManager.ts +6 -0
- package/src/shared/model/types/IEditedRow.ts +5 -0
- package/src/shared/model/types/IExternalVariables.ts +1 -0
- package/src/shared/model/types/IFilter.ts +17 -0
- package/src/shared/model/types/IFilterArguments.ts +14 -0
- package/src/shared/model/types/IGrouping.ts +12 -0
- package/src/shared/model/types/IHotKeysBehavior.ts +15 -0
- package/src/shared/model/types/IObserver.ts +3 -0
- package/src/shared/model/types/IPrinter.ts +24 -0
- package/src/shared/model/types/ISlickRow.ts +1 -0
- package/src/shared/model/types/ISlickTable.ts +41 -0
- package/src/shared/model/types/ITotalCalculator.ts +5 -0
- package/src/shared/model/types/TGridRow.ts +6 -0
- package/src/shared/model/types/index.ts +15 -0
- package/src/shared/ui/ContextSelect/ContextSelect.style.ts +9 -0
- package/src/shared/ui/ContextSelect/ContextSelect.tsx +87 -0
- package/src/shared/ui/ContextSelect/index.ts +2 -0
- package/src/shared/ui/notification/index.ts +1 -0
- package/src/shared/ui/notification/model/index.ts +1 -0
- package/src/shared/ui/notification/ui/index.style.ts +13 -0
- package/src/shared/ui/notification/ui/index.tsx +41 -0
- package/src/shared/ui/styles/WithDatePickerStyles.ts +11 -0
- package/src/shared/ui/styles/index.ts +1 -0
- package/src/vite-env.d.ts +1 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { SlickGrid } from "slickgrid";
|
|
2
|
+
|
|
3
|
+
import { headerButtons } from "shared/lib/slickgrid";
|
|
4
|
+
import { EColumnFilter, EColumnFiltersGroup } from "shared/model/enums";
|
|
5
|
+
import { IFilter } from "shared/model/types";
|
|
6
|
+
|
|
7
|
+
import { DecoratorColumnFilter } from "./DecoratorColumnFilter";
|
|
8
|
+
import { filter } from "./Filter";
|
|
9
|
+
|
|
10
|
+
jest.mock("app/store/store");
|
|
11
|
+
|
|
12
|
+
describe("DecoratorColumnFilter", () => {
|
|
13
|
+
let decoratorColumnFilter: DecoratorColumnFilter;
|
|
14
|
+
let mockFilter: IFilter;
|
|
15
|
+
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
mockFilter = {
|
|
18
|
+
getFilterFn: jest.fn(),
|
|
19
|
+
reset: jest.fn(),
|
|
20
|
+
print: jest.fn(),
|
|
21
|
+
args: {},
|
|
22
|
+
grid: {} as SlickGrid,
|
|
23
|
+
tableId: "test-table",
|
|
24
|
+
} as unknown as IFilter;
|
|
25
|
+
decoratorColumnFilter = new DecoratorColumnFilter(mockFilter);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("should return true when args.columnFilters is undefined", () => {
|
|
29
|
+
const item = { id: 1, name: "Test" };
|
|
30
|
+
const args: any = {};
|
|
31
|
+
|
|
32
|
+
const result = decoratorColumnFilter.filterFn(item, args);
|
|
33
|
+
|
|
34
|
+
expect(result).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("should return true when the grid is not available", () => {
|
|
38
|
+
const item = { id: 1, name: "Test" };
|
|
39
|
+
const args = {
|
|
40
|
+
columnFilters: {
|
|
41
|
+
name: {
|
|
42
|
+
filterId: EColumnFilter.TextContain,
|
|
43
|
+
group: EColumnFiltersGroup.Text,
|
|
44
|
+
value: { 1: "Test", 2: "" },
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
decoratorColumnFilter.grid = null;
|
|
49
|
+
|
|
50
|
+
const result = decoratorColumnFilter.filterFn(item, args);
|
|
51
|
+
|
|
52
|
+
expect(result).toBe(true);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("should correctly apply filters for boolean column types", () => {
|
|
56
|
+
const mockGrid = {
|
|
57
|
+
getColumns: jest.fn(() => [{ id: "isActive", field: "isActive" }]),
|
|
58
|
+
getColumnIndex: jest.fn(() => 0),
|
|
59
|
+
} as unknown as SlickGrid;
|
|
60
|
+
decoratorColumnFilter.grid = mockGrid;
|
|
61
|
+
|
|
62
|
+
const item = { isActive: true };
|
|
63
|
+
const args = {
|
|
64
|
+
columnFilters: {
|
|
65
|
+
isActive: {
|
|
66
|
+
filterId: EColumnFilter.Boolean,
|
|
67
|
+
group: EColumnFiltersGroup.Boolean,
|
|
68
|
+
value: { 1: "true", 2: "" },
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const result = decoratorColumnFilter.filterFn(item, args);
|
|
74
|
+
|
|
75
|
+
expect(result).toBe(true);
|
|
76
|
+
expect(mockGrid.getColumns).toHaveBeenCalled();
|
|
77
|
+
expect(mockGrid.getColumnIndex).toHaveBeenCalledWith("isActive");
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("should return false if any column filter fails", () => {
|
|
81
|
+
const mockGrid = {
|
|
82
|
+
getColumns: jest.fn(() => [
|
|
83
|
+
{ id: "name", field: "name" },
|
|
84
|
+
{ id: "age", field: "age" },
|
|
85
|
+
]),
|
|
86
|
+
getColumnIndex: jest.fn((id) => (id === "name" ? 0 : 1)),
|
|
87
|
+
} as unknown as SlickGrid;
|
|
88
|
+
decoratorColumnFilter.grid = mockGrid;
|
|
89
|
+
|
|
90
|
+
const item = { name: "John", age: 30 };
|
|
91
|
+
const args = {
|
|
92
|
+
columnFilters: {
|
|
93
|
+
name: {
|
|
94
|
+
filterId: EColumnFilter.TextContain,
|
|
95
|
+
group: EColumnFiltersGroup.Text,
|
|
96
|
+
value: { 1: "John", 2: "" },
|
|
97
|
+
},
|
|
98
|
+
age: {
|
|
99
|
+
filterId: EColumnFilter.NumberFrom,
|
|
100
|
+
group: EColumnFiltersGroup.Number,
|
|
101
|
+
value: { 1: "40", 2: "" },
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
jest
|
|
107
|
+
.spyOn(filter, "passed")
|
|
108
|
+
.mockReturnValueOnce(true) // For name filter
|
|
109
|
+
.mockReturnValueOnce(false); // For age filter
|
|
110
|
+
|
|
111
|
+
const result = decoratorColumnFilter.filterFn(item, args);
|
|
112
|
+
|
|
113
|
+
expect(result).toBe(false);
|
|
114
|
+
expect(mockGrid.getColumns).toHaveBeenCalled();
|
|
115
|
+
expect(mockGrid.getColumnIndex).toHaveBeenCalledWith("name");
|
|
116
|
+
expect(mockGrid.getColumnIndex).toHaveBeenCalledWith("age");
|
|
117
|
+
expect(filter.passed).toHaveBeenCalledTimes(2);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it("should use the formatter function for non-boolean and non-number column types", () => {
|
|
121
|
+
const mockGrid = {
|
|
122
|
+
getColumns: jest.fn(() => [
|
|
123
|
+
{
|
|
124
|
+
id: "name",
|
|
125
|
+
field: "name",
|
|
126
|
+
formatter: (_row: number, _cell: number, value: string) =>
|
|
127
|
+
`Formatted: ${value}`,
|
|
128
|
+
},
|
|
129
|
+
{ id: "age", field: "age" },
|
|
130
|
+
]),
|
|
131
|
+
getColumnIndex: jest.fn((id) => (id === "name" ? 0 : 1)),
|
|
132
|
+
} as unknown as SlickGrid;
|
|
133
|
+
decoratorColumnFilter.grid = mockGrid;
|
|
134
|
+
|
|
135
|
+
const item = { name: "John", age: 30 };
|
|
136
|
+
const args = {
|
|
137
|
+
columnFilters: {
|
|
138
|
+
name: {
|
|
139
|
+
filterId: EColumnFilter.TextContain,
|
|
140
|
+
group: EColumnFiltersGroup.Text,
|
|
141
|
+
value: { 1: "Formatted: John", 2: "" },
|
|
142
|
+
},
|
|
143
|
+
age: {
|
|
144
|
+
filterId: EColumnFilter.NumberFrom,
|
|
145
|
+
group: EColumnFiltersGroup.Number,
|
|
146
|
+
value: { 1: "30", 2: "" },
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
jest.spyOn(filter, "passed").mockReturnValue(true);
|
|
152
|
+
|
|
153
|
+
decoratorColumnFilter.filterFn(item, args);
|
|
154
|
+
|
|
155
|
+
expect(filter.passed).toHaveBeenCalledWith(
|
|
156
|
+
"Formatted: John",
|
|
157
|
+
{ 1: "Formatted: John", 2: "" },
|
|
158
|
+
EColumnFilter.TextContain,
|
|
159
|
+
);
|
|
160
|
+
expect(filter.passed).toHaveBeenCalledWith(
|
|
161
|
+
30,
|
|
162
|
+
{ 1: "30", 2: "" },
|
|
163
|
+
EColumnFilter.NumberFrom,
|
|
164
|
+
);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it("should correctly reset filters and highlight all columns", () => {
|
|
168
|
+
const mockFilter = {
|
|
169
|
+
reset: jest.fn(),
|
|
170
|
+
};
|
|
171
|
+
const mockHeaderButtons = {
|
|
172
|
+
highlightAllColumns: jest.fn(),
|
|
173
|
+
};
|
|
174
|
+
const mockArgs = { someArg: "value" };
|
|
175
|
+
const mockTableId = "test-table";
|
|
176
|
+
|
|
177
|
+
jest
|
|
178
|
+
.spyOn(headerButtons, "highlightAllColumns")
|
|
179
|
+
.mockImplementation(mockHeaderButtons.highlightAllColumns);
|
|
180
|
+
|
|
181
|
+
const decoratorColumnFilter = new DecoratorColumnFilter(mockFilter as any);
|
|
182
|
+
decoratorColumnFilter.args = mockArgs;
|
|
183
|
+
decoratorColumnFilter.tableId = mockTableId;
|
|
184
|
+
|
|
185
|
+
decoratorColumnFilter.reset();
|
|
186
|
+
|
|
187
|
+
expect(mockFilter.reset).toHaveBeenCalled();
|
|
188
|
+
expect(mockHeaderButtons.highlightAllColumns).toHaveBeenCalledWith(
|
|
189
|
+
mockArgs,
|
|
190
|
+
mockTableId,
|
|
191
|
+
);
|
|
192
|
+
});
|
|
193
|
+
it("should correctly reset filters and highlight all columns", () => {
|
|
194
|
+
const mockFilter = {
|
|
195
|
+
reset: jest.fn(),
|
|
196
|
+
};
|
|
197
|
+
const mockHeaderButtons = {
|
|
198
|
+
highlightAllColumns: jest.fn(),
|
|
199
|
+
};
|
|
200
|
+
const mockArgs = { someArg: "value" };
|
|
201
|
+
const mockTableId = "";
|
|
202
|
+
|
|
203
|
+
jest
|
|
204
|
+
.spyOn(headerButtons, "highlightAllColumns")
|
|
205
|
+
.mockImplementation(mockHeaderButtons.highlightAllColumns);
|
|
206
|
+
|
|
207
|
+
const decoratorColumnFilter = new DecoratorColumnFilter(mockFilter as any);
|
|
208
|
+
decoratorColumnFilter.args = mockArgs;
|
|
209
|
+
decoratorColumnFilter.tableId = mockTableId;
|
|
210
|
+
|
|
211
|
+
decoratorColumnFilter.reset();
|
|
212
|
+
|
|
213
|
+
expect(mockFilter.reset).toHaveBeenCalled();
|
|
214
|
+
expect(mockHeaderButtons.highlightAllColumns).not.toHaveBeenCalled();
|
|
215
|
+
});
|
|
216
|
+
});
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { EColumnFilter, EColumnFiltersGroup } from "shared/model/enums";
|
|
2
|
+
import { IColumnFilterValue } from "shared/model/types";
|
|
3
|
+
|
|
4
|
+
import { headerButtons } from "../../../../../ui";
|
|
5
|
+
import { DecoratorFilter } from "../DecoratorFilter";
|
|
6
|
+
import { filter } from "./Filter";
|
|
7
|
+
|
|
8
|
+
const formatterNotNeeded: EColumnFiltersGroup[] = [
|
|
9
|
+
EColumnFiltersGroup.Date,
|
|
10
|
+
EColumnFiltersGroup.Boolean,
|
|
11
|
+
EColumnFiltersGroup.Number,
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
export class DecoratorColumnFilter extends DecoratorFilter {
|
|
15
|
+
public filterFn(item: Record<string, any>, args: IArgs) {
|
|
16
|
+
if (!args.columnFilters) return true;
|
|
17
|
+
const grid = this.grid;
|
|
18
|
+
if (!grid) return true;
|
|
19
|
+
const columns = grid.getColumns();
|
|
20
|
+
const columnIds = Object.keys(args.columnFilters);
|
|
21
|
+
for (let i = 0; i < columnIds.length; i++) {
|
|
22
|
+
const columnId = columnIds[i];
|
|
23
|
+
const column = columns[grid.getColumnIndex(columnId)];
|
|
24
|
+
const { filterId, group, value } = args.columnFilters[columnId];
|
|
25
|
+
let cellValue = item[column?.field];
|
|
26
|
+
if (!formatterNotNeeded.includes(group)) {
|
|
27
|
+
const formatter = column?.formatter;
|
|
28
|
+
if (formatter)
|
|
29
|
+
cellValue = formatter(0, 0, cellValue, column, item, grid);
|
|
30
|
+
}
|
|
31
|
+
if (!filter.passed(cellValue, value, filterId)) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
public reset() {
|
|
38
|
+
this.filter.reset();
|
|
39
|
+
if (this.tableId)
|
|
40
|
+
headerButtons.highlightAllColumns(this.args, this.tableId);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
interface IArgs {
|
|
45
|
+
columnFilters?: Record<
|
|
46
|
+
string,
|
|
47
|
+
{
|
|
48
|
+
filterId: EColumnFilter;
|
|
49
|
+
group: EColumnFiltersGroup;
|
|
50
|
+
value: IColumnFilterValue;
|
|
51
|
+
}
|
|
52
|
+
>;
|
|
53
|
+
}
|
package/src/shared/lib/slickgrid/model/SlickTable/filters/decorators/ColumnFilter/Filter.test.ts
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { EColumnFilter } from "shared/model/enums";
|
|
2
|
+
|
|
3
|
+
import { filter } from "./Filter";
|
|
4
|
+
|
|
5
|
+
describe("Filter", () => {
|
|
6
|
+
const spring = "2024-03-20",
|
|
7
|
+
summer = "2024-06-21",
|
|
8
|
+
automn = "2024-09-23",
|
|
9
|
+
winter = "2024-12-21";
|
|
10
|
+
|
|
11
|
+
it("should filter EColumnFilter.Boolean", () => {
|
|
12
|
+
const trueResult = filter.passed(
|
|
13
|
+
"1",
|
|
14
|
+
{ 1: "true", 2: "" },
|
|
15
|
+
EColumnFilter.Boolean,
|
|
16
|
+
);
|
|
17
|
+
const falseResult = filter.passed(
|
|
18
|
+
"0",
|
|
19
|
+
{ 1: "", 2: "false" },
|
|
20
|
+
EColumnFilter.Boolean,
|
|
21
|
+
);
|
|
22
|
+
const falseResult_ = filter.passed(
|
|
23
|
+
"10",
|
|
24
|
+
{ 1: "", 2: "false" },
|
|
25
|
+
EColumnFilter.Boolean,
|
|
26
|
+
);
|
|
27
|
+
const emptyResult = filter.passed(
|
|
28
|
+
"",
|
|
29
|
+
{ 1: "", 2: "false" },
|
|
30
|
+
EColumnFilter.Boolean,
|
|
31
|
+
);
|
|
32
|
+
const defaultResult = filter.passed(
|
|
33
|
+
"0",
|
|
34
|
+
{ 1: "", 2: "" },
|
|
35
|
+
EColumnFilter.Boolean,
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
expect(trueResult).toBe(true);
|
|
39
|
+
expect(falseResult).toBe(true);
|
|
40
|
+
expect(falseResult_).toBe(false);
|
|
41
|
+
expect(emptyResult).toBe(true);
|
|
42
|
+
expect(defaultResult).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("should filter EColumnFilter.DateBetween", () => {
|
|
46
|
+
const between = filter.passed(
|
|
47
|
+
summer,
|
|
48
|
+
{ 1: spring, 2: automn },
|
|
49
|
+
EColumnFilter.DateBetween,
|
|
50
|
+
);
|
|
51
|
+
const before = filter.passed(
|
|
52
|
+
summer,
|
|
53
|
+
{ 1: automn, 2: winter },
|
|
54
|
+
EColumnFilter.DateBetween,
|
|
55
|
+
);
|
|
56
|
+
const after = filter.passed(
|
|
57
|
+
winter,
|
|
58
|
+
{ 1: spring, 2: automn },
|
|
59
|
+
EColumnFilter.DateBetween,
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
const before2 = filter.passed(
|
|
63
|
+
winter,
|
|
64
|
+
{ 1: spring, 2: "" },
|
|
65
|
+
EColumnFilter.DateBetween,
|
|
66
|
+
);
|
|
67
|
+
const after2 = filter.passed(
|
|
68
|
+
winter,
|
|
69
|
+
{ 1: "", 2: automn },
|
|
70
|
+
EColumnFilter.DateBetween,
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
expect(between).toBe(true);
|
|
74
|
+
expect(before).toBe(false);
|
|
75
|
+
expect(after).toBe(false);
|
|
76
|
+
expect(before2).toBe(true);
|
|
77
|
+
expect(after2).toBe(false);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("should filter EColumnFilter.DateEqual", () => {
|
|
81
|
+
const dateEqual = filter.passed(
|
|
82
|
+
summer,
|
|
83
|
+
{ 1: summer, 2: "" },
|
|
84
|
+
EColumnFilter.DateEqual,
|
|
85
|
+
);
|
|
86
|
+
const dateNotEqual = filter.passed(
|
|
87
|
+
summer,
|
|
88
|
+
{ 1: winter, 2: "" },
|
|
89
|
+
EColumnFilter.DateEqual,
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
expect(dateEqual).toBe(true);
|
|
93
|
+
expect(dateNotEqual).toBe(false);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it("should filter EColumnFilter.DateTo", () => {
|
|
97
|
+
const dateBefore = filter.passed(
|
|
98
|
+
spring,
|
|
99
|
+
{ 1: summer, 2: "" },
|
|
100
|
+
EColumnFilter.DateTo,
|
|
101
|
+
);
|
|
102
|
+
const sameDay = filter.passed(
|
|
103
|
+
summer,
|
|
104
|
+
{ 1: summer, 2: "" },
|
|
105
|
+
EColumnFilter.DateTo,
|
|
106
|
+
);
|
|
107
|
+
const dateAfter = filter.passed(
|
|
108
|
+
summer,
|
|
109
|
+
{ 1: spring, 2: "" },
|
|
110
|
+
EColumnFilter.DateTo,
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
expect(dateBefore).toBe(true);
|
|
114
|
+
expect(sameDay).toBe(true);
|
|
115
|
+
expect(dateAfter).toBe(false);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it("should filter EColumnFilter.DateFrom", () => {
|
|
119
|
+
const dateBefore = filter.passed(
|
|
120
|
+
spring,
|
|
121
|
+
{ 1: summer, 2: "" },
|
|
122
|
+
EColumnFilter.DateFrom,
|
|
123
|
+
);
|
|
124
|
+
const sameDay = filter.passed(
|
|
125
|
+
summer,
|
|
126
|
+
{ 1: summer, 2: "" },
|
|
127
|
+
EColumnFilter.DateFrom,
|
|
128
|
+
);
|
|
129
|
+
const dateAfter = filter.passed(
|
|
130
|
+
summer,
|
|
131
|
+
{ 1: spring, 2: "" },
|
|
132
|
+
EColumnFilter.DateFrom,
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
expect(dateBefore).toBe(false);
|
|
136
|
+
expect(sameDay).toBe(true);
|
|
137
|
+
expect(dateAfter).toBe(true);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it("should filter EColumnFilter.NumberBetween", () => {
|
|
141
|
+
const value = { 1: "25", 2: "75" };
|
|
142
|
+
const result1 = filter.passed("50", value, EColumnFilter.NumberBetween);
|
|
143
|
+
const result2 = filter.passed("20", value, EColumnFilter.NumberBetween);
|
|
144
|
+
const result3 = filter.passed("80", value, EColumnFilter.NumberBetween);
|
|
145
|
+
|
|
146
|
+
const result4 = filter.passed(
|
|
147
|
+
"20",
|
|
148
|
+
{ 1: "", 2: "50" },
|
|
149
|
+
EColumnFilter.NumberBetween,
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
const result5 = filter.passed(
|
|
153
|
+
"20",
|
|
154
|
+
{ 1: "10", 2: "" },
|
|
155
|
+
EColumnFilter.NumberBetween,
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
expect(result1).toBe(true);
|
|
159
|
+
expect(result2).toBe(false);
|
|
160
|
+
expect(result3).toBe(false);
|
|
161
|
+
expect(result4).toBe(true);
|
|
162
|
+
expect(result5).toBe(true);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it("should filter EColumnFilter.NumberFrom", () => {
|
|
166
|
+
const value = { 1: "25", 2: "" };
|
|
167
|
+
const result1 = filter.passed("50", value, EColumnFilter.NumberFrom);
|
|
168
|
+
const result2 = filter.passed("25", value, EColumnFilter.NumberFrom);
|
|
169
|
+
const result3 = filter.passed("20", value, EColumnFilter.NumberFrom);
|
|
170
|
+
|
|
171
|
+
expect(result1).toBe(true);
|
|
172
|
+
expect(result2).toBe(true);
|
|
173
|
+
expect(result3).toBe(false);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it("should filter EColumnFilter.NumberTo", () => {
|
|
177
|
+
const value = { 1: "25", 2: "" };
|
|
178
|
+
const result1 = filter.passed("50", value, EColumnFilter.NumberTo);
|
|
179
|
+
const result2 = filter.passed("25", value, EColumnFilter.NumberTo);
|
|
180
|
+
const result3 = filter.passed("20", value, EColumnFilter.NumberTo);
|
|
181
|
+
|
|
182
|
+
expect(result1).toBe(false);
|
|
183
|
+
expect(result2).toBe(true);
|
|
184
|
+
expect(result3).toBe(true);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it("should filter EColumnFilter.NumberEqual", () => {
|
|
188
|
+
const value = { 1: "25", 2: "" };
|
|
189
|
+
const result1 = filter.passed("50", value, EColumnFilter.NumberEqual);
|
|
190
|
+
const result2 = filter.passed("25", value, EColumnFilter.NumberEqual);
|
|
191
|
+
const result3 = filter.passed("20", value, EColumnFilter.NumberEqual);
|
|
192
|
+
|
|
193
|
+
expect(result1).toBe(false);
|
|
194
|
+
expect(result2).toBe(true);
|
|
195
|
+
expect(result3).toBe(false);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it("should filter EColumnFilter.TextEqual", () => {
|
|
199
|
+
const value = { 1: "hello world", 2: "" };
|
|
200
|
+
const result1 = filter.passed(
|
|
201
|
+
"Hello World",
|
|
202
|
+
value,
|
|
203
|
+
EColumnFilter.TextEqual,
|
|
204
|
+
);
|
|
205
|
+
const result2 = filter.passed(
|
|
206
|
+
"HELLO WORLD",
|
|
207
|
+
value,
|
|
208
|
+
EColumnFilter.TextEqual,
|
|
209
|
+
);
|
|
210
|
+
const result3 = filter.passed(
|
|
211
|
+
"Goodbye World",
|
|
212
|
+
value,
|
|
213
|
+
EColumnFilter.TextEqual,
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
expect(result1).toBe(true);
|
|
217
|
+
expect(result2).toBe(true);
|
|
218
|
+
expect(result3).toBe(false);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
it("should filter EColumnFilter.TextNotEqual", () => {
|
|
222
|
+
const value = { 1: "hello world", 2: "" };
|
|
223
|
+
const result1 = filter.passed(
|
|
224
|
+
"Hello World",
|
|
225
|
+
value,
|
|
226
|
+
EColumnFilter.TextNotEqual,
|
|
227
|
+
);
|
|
228
|
+
const result2 = filter.passed(
|
|
229
|
+
"HELLO WORLD",
|
|
230
|
+
value,
|
|
231
|
+
EColumnFilter.TextNotEqual,
|
|
232
|
+
);
|
|
233
|
+
const result3 = filter.passed(
|
|
234
|
+
"Goodbye World",
|
|
235
|
+
value,
|
|
236
|
+
EColumnFilter.TextNotEqual,
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
expect(result1).toBe(false);
|
|
240
|
+
expect(result2).toBe(false);
|
|
241
|
+
expect(result3).toBe(true);
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it("should filter EColumnFilter.TextContain (returns an array of matching string)", () => {
|
|
245
|
+
const string = "any value",
|
|
246
|
+
matching = "an";
|
|
247
|
+
const result = filter.passed(
|
|
248
|
+
string,
|
|
249
|
+
{ 1: matching, 2: "" },
|
|
250
|
+
EColumnFilter.TextContain,
|
|
251
|
+
);
|
|
252
|
+
|
|
253
|
+
expect(result).toBeTruthy();
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
it("should filter EColumnFilter.TextNotContain", () => {
|
|
257
|
+
const result = filter.passed(
|
|
258
|
+
"any value",
|
|
259
|
+
{ 1: " val", 2: "" },
|
|
260
|
+
EColumnFilter.TextNotContain,
|
|
261
|
+
);
|
|
262
|
+
expect(result).toBe(false);
|
|
263
|
+
});
|
|
264
|
+
});
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { getTime } from "shared/lib/datetime";
|
|
2
|
+
import { EColumnFilter } from "shared/model/enums";
|
|
3
|
+
import { IColumnFilterValue } from "shared/model/types";
|
|
4
|
+
|
|
5
|
+
class Filter {
|
|
6
|
+
passed(
|
|
7
|
+
cellValue: string,
|
|
8
|
+
value: IColumnFilterValue,
|
|
9
|
+
filterId: EColumnFilter,
|
|
10
|
+
) {
|
|
11
|
+
if (!value[1] && !value[2]) return true;
|
|
12
|
+
switch (filterId) {
|
|
13
|
+
case EColumnFilter.Boolean: {
|
|
14
|
+
return this.boolean(cellValue, value);
|
|
15
|
+
}
|
|
16
|
+
case EColumnFilter.DateBetween: {
|
|
17
|
+
return this.dateBetween(cellValue, value);
|
|
18
|
+
}
|
|
19
|
+
case EColumnFilter.DateEqual: {
|
|
20
|
+
return this.dateEqual(cellValue, value[1]);
|
|
21
|
+
}
|
|
22
|
+
case EColumnFilter.DateFrom: {
|
|
23
|
+
return this.dateFrom(cellValue, value[1]);
|
|
24
|
+
}
|
|
25
|
+
case EColumnFilter.DateTo: {
|
|
26
|
+
return this.dateTo(cellValue, value[1]);
|
|
27
|
+
}
|
|
28
|
+
case EColumnFilter.MultipleSelect: {
|
|
29
|
+
return this.multipleSelect(cellValue, value[1]);
|
|
30
|
+
}
|
|
31
|
+
case EColumnFilter.NumberBetween: {
|
|
32
|
+
return this.numberBetween(cellValue, value);
|
|
33
|
+
}
|
|
34
|
+
case EColumnFilter.NumberEqual: {
|
|
35
|
+
return this.numberEqual(cellValue, value[1]);
|
|
36
|
+
}
|
|
37
|
+
case EColumnFilter.NumberFrom: {
|
|
38
|
+
return this.numberFrom(cellValue, value[1]);
|
|
39
|
+
}
|
|
40
|
+
case EColumnFilter.NumberTo: {
|
|
41
|
+
return this.numberTo(cellValue, value[1]);
|
|
42
|
+
}
|
|
43
|
+
case EColumnFilter.TextContain: {
|
|
44
|
+
return this.textContain(cellValue, value[1]);
|
|
45
|
+
}
|
|
46
|
+
case EColumnFilter.TextEqual: {
|
|
47
|
+
return this.textEqual(cellValue, value[1]);
|
|
48
|
+
}
|
|
49
|
+
case EColumnFilter.TextNotContain: {
|
|
50
|
+
return !this.textContain(cellValue, value[1]);
|
|
51
|
+
}
|
|
52
|
+
case EColumnFilter.TextNotEqual: {
|
|
53
|
+
return !this.textEqual(cellValue, value[1]);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
boolean(cellValue: string, value: IColumnFilterValue) {
|
|
59
|
+
if (value[1]) return Boolean(cellValue);
|
|
60
|
+
if (value[2]) return !cellValue;
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
dateBetween(cellValue: string, value: IColumnFilterValue) {
|
|
64
|
+
const from = value[1];
|
|
65
|
+
const to = value[2];
|
|
66
|
+
if (!from) return this.dateTo(cellValue, to);
|
|
67
|
+
if (!to) return this.dateFrom(cellValue, from);
|
|
68
|
+
return this.dateFrom(cellValue, from) && this.dateTo(cellValue, to);
|
|
69
|
+
}
|
|
70
|
+
dateEqual(cellValue: string, filter: string) {
|
|
71
|
+
return filter === cellValue;
|
|
72
|
+
}
|
|
73
|
+
dateFrom(cellValue: string, filter: string) {
|
|
74
|
+
return getTime(cellValue) >= getTime(filter);
|
|
75
|
+
}
|
|
76
|
+
dateTo(cellValue: string, filter: string) {
|
|
77
|
+
return getTime(cellValue) <= getTime(filter);
|
|
78
|
+
}
|
|
79
|
+
multipleSelect(cellValue: string, filter: string) {
|
|
80
|
+
const array = JSON.parse(filter) as (number | string)[];
|
|
81
|
+
if (array.includes("All")) return true;
|
|
82
|
+
return array.includes(cellValue);
|
|
83
|
+
}
|
|
84
|
+
numberBetween(cellValue: string, value: IColumnFilterValue) {
|
|
85
|
+
const from = value[1] || 0;
|
|
86
|
+
const to = value[2] || 0;
|
|
87
|
+
if (!from) return Number(cellValue) <= Number(to);
|
|
88
|
+
if (!to) return Number(cellValue) >= Number(from);
|
|
89
|
+
return this.numberFrom(cellValue, from) && this.numberTo(cellValue, to);
|
|
90
|
+
}
|
|
91
|
+
numberEqual(cellValue: string, filter: string) {
|
|
92
|
+
return Number(filter) === Number(cellValue);
|
|
93
|
+
}
|
|
94
|
+
numberFrom(cellValue: string, filter: string) {
|
|
95
|
+
return Number(cellValue) >= Number(filter);
|
|
96
|
+
}
|
|
97
|
+
numberTo(cellValue: string, filter: string) {
|
|
98
|
+
return Number(cellValue) <= Number(filter);
|
|
99
|
+
}
|
|
100
|
+
textEqual(cellValue: string, filter: string) {
|
|
101
|
+
return (cellValue || "").toLowerCase() === filter.toLowerCase();
|
|
102
|
+
}
|
|
103
|
+
textContain(cellValue: string, filter: string) {
|
|
104
|
+
return (cellValue || "").toLowerCase().match(filter.toLowerCase());
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export const filter = new Filter();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DecoratorColumnFilter } from "./DecoratorColumnFilter";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { getTime } from "shared/lib/datetime";
|
|
2
|
+
import { ISlickRow } from "shared/model/types";
|
|
3
|
+
|
|
4
|
+
import { DecoratorFilter } from "./DecoratorFilter";
|
|
5
|
+
|
|
6
|
+
export class DecoratorEndingDate extends DecoratorFilter {
|
|
7
|
+
filterFn(row: ISlickRow, args: IArguments): boolean {
|
|
8
|
+
const { endingDate } = args;
|
|
9
|
+
if (!endingDate) return true;
|
|
10
|
+
return getTime(row.date) <= getTime(endingDate);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
interface IArguments {
|
|
15
|
+
endingDate?: string;
|
|
16
|
+
}
|