@lavalogic/scoria 0.0.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 +58 -0
- package/dist/Components/Action.svelte +258 -0
- package/dist/Components/Action.svelte.d.ts +30 -0
- package/dist/Components/AlertModal.svelte +373 -0
- package/dist/Components/AlertModal.svelte.d.ts +3 -0
- package/dist/Components/BigRadioSet.svelte +88 -0
- package/dist/Components/BigRadioSet.svelte.d.ts +30 -0
- package/dist/Components/Bubble.svelte +115 -0
- package/dist/Components/Bubble.svelte.d.ts +21 -0
- package/dist/Components/Button.svelte +540 -0
- package/dist/Components/Button.svelte.d.ts +32 -0
- package/dist/Components/Checkbox.svelte +168 -0
- package/dist/Components/Checkbox.svelte.d.ts +15 -0
- package/dist/Components/CollapsibleCard.svelte +136 -0
- package/dist/Components/CollapsibleCard.svelte.d.ts +11 -0
- package/dist/Components/Contexts/ContextMenu.svelte +73 -0
- package/dist/Components/Contexts/ContextMenu.svelte.d.ts +3 -0
- package/dist/Components/Contexts/ContextMenuDivider.svelte +11 -0
- package/dist/Components/Contexts/ContextMenuDivider.svelte.d.ts +6 -0
- package/dist/Components/Contexts/ContextMenuOption.svelte +65 -0
- package/dist/Components/Contexts/ContextMenuOption.svelte.d.ts +10 -0
- package/dist/Components/Contexts/Toast.svelte +89 -0
- package/dist/Components/Contexts/Toast.svelte.d.ts +8 -0
- package/dist/Components/Contexts/ToastContainer.svelte +54 -0
- package/dist/Components/Contexts/ToastContainer.svelte.d.ts +3 -0
- package/dist/Components/Contexts/Tooltip.svelte +116 -0
- package/dist/Components/Contexts/Tooltip.svelte.d.ts +3 -0
- package/dist/Components/DataMatrixIcon.svelte +58 -0
- package/dist/Components/DataMatrixIcon.svelte.d.ts +9 -0
- package/dist/Components/DateInput.svelte +356 -0
- package/dist/Components/DateInput.svelte.d.ts +24 -0
- package/dist/Components/DatePicker.svelte +346 -0
- package/dist/Components/DatePicker.svelte.d.ts +11 -0
- package/dist/Components/DesktopModal.svelte +235 -0
- package/dist/Components/DesktopModal.svelte.d.ts +23 -0
- package/dist/Components/Dial.svelte +219 -0
- package/dist/Components/Dial.svelte.d.ts +37 -0
- package/dist/Components/DimensionInput.svelte +486 -0
- package/dist/Components/DimensionInput.svelte.d.ts +32 -0
- package/dist/Components/FileCard.svelte +32 -0
- package/dist/Components/FileCard.svelte.d.ts +7 -0
- package/dist/Components/FileUpload.svelte +413 -0
- package/dist/Components/FileUpload.svelte.d.ts +27 -0
- package/dist/Components/GridInput.svelte +187 -0
- package/dist/Components/GridInput.svelte.d.ts +30 -0
- package/dist/Components/GridInputSet.svelte +37 -0
- package/dist/Components/GridInputSet.svelte.d.ts +30 -0
- package/dist/Components/HorizontalTabGroup.svelte +81 -0
- package/dist/Components/HorizontalTabGroup.svelte.d.ts +34 -0
- package/dist/Components/HorizontalTabGroupButton.svelte +85 -0
- package/dist/Components/HorizontalTabGroupButton.svelte.d.ts +29 -0
- package/dist/Components/Icon.svelte +1412 -0
- package/dist/Components/Icon.svelte.d.ts +887 -0
- package/dist/Components/LoadingAnimation.svelte +129 -0
- package/dist/Components/LoadingAnimation.svelte.d.ts +6 -0
- package/dist/Components/LoadingModal.svelte +316 -0
- package/dist/Components/LoadingModal.svelte.d.ts +7 -0
- package/dist/Components/LoadingOverlay.svelte +58 -0
- package/dist/Components/LoadingOverlay.svelte.d.ts +8 -0
- package/dist/Components/Modal.svelte +577 -0
- package/dist/Components/Modal.svelte.d.ts +31 -0
- package/dist/Components/MultiSelect.svelte +412 -0
- package/dist/Components/MultiSelect.svelte.d.ts +49 -0
- package/dist/Components/NumberInput.svelte +407 -0
- package/dist/Components/NumberInput.svelte.d.ts +32 -0
- package/dist/Components/PasswordInput.svelte +324 -0
- package/dist/Components/PasswordInput.svelte.d.ts +18 -0
- package/dist/Components/Portal.svelte +31 -0
- package/dist/Components/Portal.svelte.d.ts +8 -0
- package/dist/Components/ProgressBubble.svelte +134 -0
- package/dist/Components/ProgressBubble.svelte.d.ts +8 -0
- package/dist/Components/QuerySelect.svelte +556 -0
- package/dist/Components/QuerySelect.svelte.d.ts +52 -0
- package/dist/Components/SingleSelect.svelte +480 -0
- package/dist/Components/SingleSelect.svelte.d.ts +61 -0
- package/dist/Components/Switch.svelte +151 -0
- package/dist/Components/Switch.svelte.d.ts +12 -0
- package/dist/Components/Table/Body/QuickSearchCell.svelte +527 -0
- package/dist/Components/Table/Body/QuickSearchCell.svelte.d.ts +30 -0
- package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +67 -0
- package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte.d.ts +8 -0
- package/dist/Components/Table/Body/Rows/ColumnList.svelte +67 -0
- package/dist/Components/Table/Body/Rows/ColumnList.svelte.d.ts +27 -0
- package/dist/Components/Table/Body/Rows/ColumnListRow.svelte +187 -0
- package/dist/Components/Table/Body/Rows/ColumnListRow.svelte.d.ts +28 -0
- package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte +305 -0
- package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte.d.ts +29 -0
- package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte +171 -0
- package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte.d.ts +28 -0
- package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +149 -0
- package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte.d.ts +31 -0
- package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte +156 -0
- package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte.d.ts +31 -0
- package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +161 -0
- package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte.d.ts +28 -0
- package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +62 -0
- package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte.d.ts +30 -0
- package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +155 -0
- package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte.d.ts +30 -0
- package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +140 -0
- package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte.d.ts +31 -0
- package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +290 -0
- package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte.d.ts +28 -0
- package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +359 -0
- package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte.d.ts +28 -0
- package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +331 -0
- package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte.d.ts +28 -0
- package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +157 -0
- package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte.d.ts +30 -0
- package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +354 -0
- package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte.d.ts +28 -0
- package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +375 -0
- package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte.d.ts +28 -0
- package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +227 -0
- package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte.d.ts +33 -0
- package/dist/Components/Table/Body/Rows/TableRow.svelte +201 -0
- package/dist/Components/Table/Body/Rows/TableRow.svelte.d.ts +30 -0
- package/dist/Components/Table/Body/TableBody.svelte +74 -0
- package/dist/Components/Table/Body/TableBody.svelte.d.ts +27 -0
- package/dist/Components/Table/ColumnDefinitions/ExampleItemColumnDef.svelte.d.ts +7 -0
- package/dist/Components/Table/ColumnDefinitions/ExampleItemColumnDef.svelte.js +139 -0
- package/dist/Components/Table/Headers/HighlightAllHeader.svelte +52 -0
- package/dist/Components/Table/Headers/HighlightAllHeader.svelte.d.ts +24 -0
- package/dist/Components/Table/Headers/SelectAllHeader.svelte +62 -0
- package/dist/Components/Table/Headers/SelectAllHeader.svelte.d.ts +24 -0
- package/dist/Components/Table/Headers/TableHead.svelte +366 -0
- package/dist/Components/Table/Headers/TableHead.svelte.d.ts +29 -0
- package/dist/Components/Table/Misc/ColumnPanel.svelte +96 -0
- package/dist/Components/Table/Misc/ColumnPanel.svelte.d.ts +24 -0
- package/dist/Components/Table/Misc/ColumnPanelModal.svelte +137 -0
- package/dist/Components/Table/Misc/ColumnPanelModal.svelte.d.ts +27 -0
- package/dist/Components/Table/Misc/FilterInput.svelte +635 -0
- package/dist/Components/Table/Misc/FilterInput.svelte.d.ts +45 -0
- package/dist/Components/Table/Misc/FilterPanel.svelte +49 -0
- package/dist/Components/Table/Misc/FilterPanel.svelte.d.ts +24 -0
- package/dist/Components/Table/Misc/FilterPanelModal.svelte +74 -0
- package/dist/Components/Table/Misc/FilterPanelModal.svelte.d.ts +27 -0
- package/dist/Components/Table/Misc/SidePanel.svelte +51 -0
- package/dist/Components/Table/Misc/SidePanel.svelte.d.ts +10 -0
- package/dist/Components/Table/Misc/TableFooter.svelte +364 -0
- package/dist/Components/Table/Misc/TableFooter.svelte.d.ts +27 -0
- package/dist/Components/Table/Misc/TableHorizontalBar.svelte +171 -0
- package/dist/Components/Table/Misc/TableHorizontalBar.svelte.d.ts +24 -0
- package/dist/Components/Table/Misc/TableSidebar.svelte +186 -0
- package/dist/Components/Table/Misc/TableSidebar.svelte.d.ts +24 -0
- package/dist/Components/Table/Misc/ToolboxPanel.svelte +84 -0
- package/dist/Components/Table/Misc/ToolboxPanel.svelte.d.ts +24 -0
- package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +108 -0
- package/dist/Components/Table/Misc/ToolboxPanelModal.svelte.d.ts +27 -0
- package/dist/Components/Table/NestedTable.svelte +86 -0
- package/dist/Components/Table/NestedTable.svelte.d.ts +34 -0
- package/dist/Components/Table/Table.svelte +555 -0
- package/dist/Components/Table/Table.svelte.d.ts +37 -0
- package/dist/Components/Table/Types/Columns/AbstractDisplayDef.svelte.d.ts +19 -0
- package/dist/Components/Table/Types/Columns/AbstractDisplayDef.svelte.js +10 -0
- package/dist/Components/Table/Types/Columns/Column.d.ts +10 -0
- package/dist/Components/Table/Types/Columns/Column.js +1 -0
- package/dist/Components/Table/Types/Columns/ColumnDefPreset.d.ts +11 -0
- package/dist/Components/Table/Types/Columns/ColumnDefPreset.js +1 -0
- package/dist/Components/Table/Types/Columns/ColumnPinningState.d.ts +4 -0
- package/dist/Components/Table/Types/Columns/ColumnPinningState.js +1 -0
- package/dist/Components/Table/Types/Columns/ColumnSizingState.d.ts +1 -0
- package/dist/Components/Table/Types/Columns/ColumnSizingState.js +1 -0
- package/dist/Components/Table/Types/Columns/ColumnType.d.ts +9 -0
- package/dist/Components/Table/Types/Columns/ColumnType.js +10 -0
- package/dist/Components/Table/Types/Columns/DateColumn.d.ts +10 -0
- package/dist/Components/Table/Types/Columns/DateColumn.js +1 -0
- package/dist/Components/Table/Types/Columns/DateTableCell.d.ts +8 -0
- package/dist/Components/Table/Types/Columns/DateTableCell.js +1 -0
- package/dist/Components/Table/Types/Columns/Definitions/AccessorFn.d.ts +1 -0
- package/dist/Components/Table/Types/Columns/Definitions/AccessorFn.js +1 -0
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/AccessorDef.svelte.d.ts +10 -0
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/AccessorDef.svelte.js +5 -0
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/AccessorType.d.ts +8 -0
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/AccessorType.js +9 -0
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/CheckboxDef.d.ts +9 -0
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/CheckboxDef.js +8 -0
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/DateInputDef.svelte.d.ts +11 -0
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/DateInputDef.svelte.js +10 -0
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/NumberInputDef.svelte.d.ts +14 -0
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/NumberInputDef.svelte.js +13 -0
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/QueryDef.d.ts +15 -0
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/QueryDef.js +12 -0
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/SelectDef.svelte.d.ts +18 -0
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/SelectDef.svelte.js +16 -0
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/TextInputDef.d.ts +9 -0
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/TextInputDef.js +8 -0
- package/dist/Components/Table/Types/Columns/Definitions/Actions/ActionsDef.svelte.d.ts +16 -0
- package/dist/Components/Table/Types/Columns/Definitions/Actions/ActionsDef.svelte.js +19 -0
- package/dist/Components/Table/Types/Columns/Definitions/ColumnDef.svelte.d.ts +52 -0
- package/dist/Components/Table/Types/Columns/Definitions/ColumnDef.svelte.js +77 -0
- package/dist/Components/Table/Types/Columns/Definitions/ColumnDefSet.d.ts +11 -0
- package/dist/Components/Table/Types/Columns/Definitions/ColumnDefSet.js +1 -0
- package/dist/Components/Table/Types/Columns/Definitions/Display/BubbleDef.svelte.d.ts +11 -0
- package/dist/Components/Table/Types/Columns/Definitions/Display/BubbleDef.svelte.js +10 -0
- package/dist/Components/Table/Types/Columns/Definitions/Display/DisplayDef.d.ts +8 -0
- package/dist/Components/Table/Types/Columns/Definitions/Display/DisplayDef.js +8 -0
- package/dist/Components/Table/Types/Columns/Definitions/Display/ProgressBarDef.svelte.d.ts +11 -0
- package/dist/Components/Table/Types/Columns/Definitions/Display/ProgressBarDef.svelte.js +10 -0
- package/dist/Components/Table/Types/Columns/Definitions/Display/ValidityDef.svelte.d.ts +11 -0
- package/dist/Components/Table/Types/Columns/Definitions/Display/ValidityDef.svelte.js +11 -0
- package/dist/Components/Table/Types/Columns/Definitions/Expand/ExpandDef.svelte.d.ts +21 -0
- package/dist/Components/Table/Types/Columns/Definitions/Expand/ExpandDef.svelte.js +18 -0
- package/dist/Components/Table/Types/Columns/Definitions/FilterOnly/FilterOnlyDef.d.ts +6 -0
- package/dist/Components/Table/Types/Columns/Definitions/FilterOnly/FilterOnlyDef.js +5 -0
- package/dist/Components/Table/Types/Columns/Definitions/RowSelection/RowSelectionDef.svelte.d.ts +7 -0
- package/dist/Components/Table/Types/Columns/Definitions/RowSelection/RowSelectionDef.svelte.js +15 -0
- package/dist/Components/Table/Types/Columns/Definitions/ValidationFn.d.ts +3 -0
- package/dist/Components/Table/Types/Columns/Definitions/ValidationFn.js +1 -0
- package/dist/Components/Table/Types/Columns/DefsWrapper.d.ts +6 -0
- package/dist/Components/Table/Types/Columns/DefsWrapper.js +1 -0
- package/dist/Components/Table/Types/Columns/DisplayType.d.ts +7 -0
- package/dist/Components/Table/Types/Columns/DisplayType.js +8 -0
- package/dist/Components/Table/Types/Columns/ExpandColumn.d.ts +10 -0
- package/dist/Components/Table/Types/Columns/ExpandColumn.js +1 -0
- package/dist/Components/Table/Types/Columns/ExpandTableCell.d.ts +8 -0
- package/dist/Components/Table/Types/Columns/ExpandTableCell.js +1 -0
- package/dist/Components/Table/Types/Columns/ProgressBarColumn.d.ts +10 -0
- package/dist/Components/Table/Types/Columns/ProgressBarColumn.js +1 -0
- package/dist/Components/Table/Types/Columns/ProgressBarTableCell.d.ts +8 -0
- package/dist/Components/Table/Types/Columns/ProgressBarTableCell.js +1 -0
- package/dist/Components/Table/Types/Columns/TableActionButton.d.ts +8 -0
- package/dist/Components/Table/Types/Columns/TableActionButton.js +1 -0
- package/dist/Components/Table/Types/Columns/TableCell.d.ts +8 -0
- package/dist/Components/Table/Types/Columns/TableCell.js +1 -0
- package/dist/Components/Table/Types/Columns/VisibilityState.d.ts +1 -0
- package/dist/Components/Table/Types/Columns/VisibilityState.js +1 -0
- package/dist/Components/Table/Types/Context/ReadonlyRowModel.d.ts +6 -0
- package/dist/Components/Table/Types/Context/ReadonlyRowModel.js +1 -0
- package/dist/Components/Table/Types/Context/Row.d.ts +10 -0
- package/dist/Components/Table/Types/Context/Row.js +1 -0
- package/dist/Components/Table/Types/Context/RowModel.d.ts +5 -0
- package/dist/Components/Table/Types/Context/RowModel.js +1 -0
- package/dist/Components/Table/Types/Context/Table.d.ts +33 -0
- package/dist/Components/Table/Types/Context/Table.js +1 -0
- package/dist/Components/Table/Types/Context/TableContext.svelte.d.ts +232 -0
- package/dist/Components/Table/Types/Context/TableContext.svelte.js +2317 -0
- package/dist/Components/Table/Types/Context/TableInitOptions.d.ts +14 -0
- package/dist/Components/Table/Types/Context/TableInitOptions.js +1 -0
- package/dist/Components/Table/Types/Context/TableSettings.d.ts +8 -0
- package/dist/Components/Table/Types/Context/TableSettings.js +1 -0
- package/dist/Components/Table/Types/Coordinates/CellCoordinates.d.ts +5 -0
- package/dist/Components/Table/Types/Coordinates/CellCoordinates.js +1 -0
- package/dist/Components/Table/Types/Coordinates/CellCoordinatesWithoutColumn.d.ts +2 -0
- package/dist/Components/Table/Types/Coordinates/CellCoordinatesWithoutColumn.js +1 -0
- package/dist/Components/Table/Types/DataRepository/DataRepository.d.ts +40 -0
- package/dist/Components/Table/Types/DataRepository/DataRepository.js +1 -0
- package/dist/Components/Table/Types/DataRepository/LocalDataRepository.d.ts +24 -0
- package/dist/Components/Table/Types/DataRepository/LocalDataRepository.js +1 -0
- package/dist/Components/Table/Types/DataRepository/LocalTableDataRepository.svelte.d.ts +55 -0
- package/dist/Components/Table/Types/DataRepository/LocalTableDataRepository.svelte.js +311 -0
- package/dist/Components/Table/Types/DataRepository/RemoteDataRepository.d.ts +19 -0
- package/dist/Components/Table/Types/DataRepository/RemoteDataRepository.js +1 -0
- package/dist/Components/Table/Types/DataRepository/RemoteTableDataRepository.svelte.d.ts +92 -0
- package/dist/Components/Table/Types/DataRepository/RemoteTableDataRepository.svelte.js +521 -0
- package/dist/Components/Table/Types/DataRepository/SortingState.d.ts +5 -0
- package/dist/Components/Table/Types/DataRepository/SortingState.js +1 -0
- package/dist/Components/Table/Types/DataRepository/TableDataRepository.svelte.d.ts +47 -0
- package/dist/Components/Table/Types/DataRepository/TableDataRepository.svelte.js +75 -0
- package/dist/Components/Table/Types/ExpandedPanel.d.ts +6 -0
- package/dist/Components/Table/Types/ExpandedPanel.js +7 -0
- package/dist/Components/Table/Types/Filtering/ColumnFiltersState.d.ts +5 -0
- package/dist/Components/Table/Types/Filtering/ColumnFiltersState.js +1 -0
- package/dist/Components/Table/Types/Filtering/CustomFilter.d.ts +12 -0
- package/dist/Components/Table/Types/Filtering/CustomFilter.js +1 -0
- package/dist/Components/Table/Types/Filtering/CustomFilterType.d.ts +6 -0
- package/dist/Components/Table/Types/Filtering/CustomFilterType.js +7 -0
- package/dist/Components/Table/Types/Filtering/CustomFlterFn.d.ts +2 -0
- package/dist/Components/Table/Types/Filtering/CustomFlterFn.js +1 -0
- package/dist/Components/Table/Types/Filtering/CustomProxyFIlter.d.ts +10 -0
- package/dist/Components/Table/Types/Filtering/CustomProxyFIlter.js +1 -0
- package/dist/Components/Table/Types/Filtering/CustomRemoteFilters.d.ts +3 -0
- package/dist/Components/Table/Types/Filtering/CustomRemoteFilters.js +1 -0
- package/dist/Components/Table/Types/Filtering/FilterFn.d.ts +9 -0
- package/dist/Components/Table/Types/Filtering/FilterFn.js +1 -0
- package/dist/Components/Table/Types/Filtering/FilterMode.d.ts +3 -0
- package/dist/Components/Table/Types/Filtering/FilterMode.js +1 -0
- package/dist/Components/Table/Types/Filtering/FilterType.d.ts +4 -0
- package/dist/Components/Table/Types/Filtering/FilterType.js +5 -0
- package/dist/Components/Table/Types/Filtering/HasCustomFilterFunction.d.ts +3 -0
- package/dist/Components/Table/Types/Filtering/HasCustomFilterFunction.js +1 -0
- package/dist/Components/Table/Types/Filtering/NumberDateFilterMode.d.ts +13 -0
- package/dist/Components/Table/Types/Filtering/NumberDateFilterMode.js +14 -0
- package/dist/Components/Table/Types/Filtering/StringFilterMode.d.ts +15 -0
- package/dist/Components/Table/Types/Filtering/StringFilterMode.js +16 -0
- package/dist/Components/Table/Types/Focus/MultiFocusEdge.d.ts +10 -0
- package/dist/Components/Table/Types/Focus/MultiFocusEdge.js +11 -0
- package/dist/Components/Table/Types/Focus/TableFocusDetails.svelte.d.ts +40 -0
- package/dist/Components/Table/Types/Focus/TableFocusDetails.svelte.js +174 -0
- package/dist/Components/Table/Types/Header.d.ts +9 -0
- package/dist/Components/Table/Types/Header.js +1 -0
- package/dist/Components/Table/Types/HeaderGroup.d.ts +5 -0
- package/dist/Components/Table/Types/HeaderGroup.js +1 -0
- package/dist/Components/Table/Types/OnChangeFn.d.ts +3 -0
- package/dist/Components/Table/Types/OnChangeFn.js +1 -0
- package/dist/Components/Table/Types/Pagination/PaginationState.d.ts +4 -0
- package/dist/Components/Table/Types/Pagination/PaginationState.js +1 -0
- package/dist/Components/Table/Types/Pagination/PaginationType.d.ts +5 -0
- package/dist/Components/Table/Types/Pagination/PaginationType.js +6 -0
- package/dist/Components/Table/Types/Toolbar/ToolbarPosition.d.ts +6 -0
- package/dist/Components/Table/Types/Toolbar/ToolbarPosition.js +7 -0
- package/dist/Components/TextArea.svelte +349 -0
- package/dist/Components/TextArea.svelte.d.ts +29 -0
- package/dist/Components/TextInput.svelte +407 -0
- package/dist/Components/TextInput.svelte.d.ts +34 -0
- package/dist/Components/ThreeStateRadio.svelte +202 -0
- package/dist/Components/ThreeStateRadio.svelte.d.ts +16 -0
- package/dist/Components/Touch/BoolCard.svelte +180 -0
- package/dist/Components/Touch/BoolCard.svelte.d.ts +13 -0
- package/dist/Components/Touch/DateModal.svelte +256 -0
- package/dist/Components/Touch/DateModal.svelte.d.ts +22 -0
- package/dist/Components/Touch/EditCard.svelte +223 -0
- package/dist/Components/Touch/EditCard.svelte.d.ts +15 -0
- package/dist/Components/Touch/InfoCard.svelte +82 -0
- package/dist/Components/Touch/InfoCard.svelte.d.ts +11 -0
- package/dist/Components/Touch/InfoTextCard.svelte +55 -0
- package/dist/Components/Touch/InfoTextCard.svelte.d.ts +10 -0
- package/dist/Components/Touch/ModalExplanation.svelte +27 -0
- package/dist/Components/Touch/ModalExplanation.svelte.d.ts +9 -0
- package/dist/Components/Touch/NumberKeyboard.svelte +299 -0
- package/dist/Components/Touch/NumberKeyboard.svelte.d.ts +14 -0
- package/dist/Components/Touch/NumberModal.svelte +336 -0
- package/dist/Components/Touch/NumberModal.svelte.d.ts +18 -0
- package/dist/Components/Touch/PlusMinusCard.svelte +94 -0
- package/dist/Components/Touch/PlusMinusCard.svelte.d.ts +9 -0
- package/dist/Components/Touch/SelectModal.svelte +351 -0
- package/dist/Components/Touch/SelectModal.svelte.d.ts +11 -0
- package/dist/Components/Touch/SummaryCard.svelte +348 -0
- package/dist/Components/Touch/SummaryCard.svelte.d.ts +18 -0
- package/dist/Components/Touch/TextAreaModal.svelte +330 -0
- package/dist/Components/Touch/TextAreaModal.svelte.d.ts +15 -0
- package/dist/Components/Touch/TextModal.svelte +377 -0
- package/dist/Components/Touch/TextModal.svelte.d.ts +22 -0
- package/dist/Components/Touch/TouchCard.svelte +169 -0
- package/dist/Components/Touch/TouchCard.svelte.d.ts +9 -0
- package/dist/Components/Touch/TouchModal.svelte +516 -0
- package/dist/Components/Touch/TouchModal.svelte.d.ts +34 -0
- package/dist/Components/Touch/UtilityButton.svelte +192 -0
- package/dist/Components/Touch/UtilityButton.svelte.d.ts +23 -0
- package/dist/Components/VerticalTabGroup.svelte +129 -0
- package/dist/Components/VerticalTabGroup.svelte.d.ts +12 -0
- package/dist/Components/VerticalTabGroupButton.svelte +108 -0
- package/dist/Components/VerticalTabGroupButton.svelte.d.ts +8 -0
- package/dist/Contexts/AlertContext.svelte.d.ts +46 -0
- package/dist/Contexts/AlertContext.svelte.js +118 -0
- package/dist/Contexts/ContextMenuContext.svelte.d.ts +22 -0
- package/dist/Contexts/ContextMenuContext.svelte.js +45 -0
- package/dist/Contexts/ToastContext.svelte.d.ts +9 -0
- package/dist/Contexts/ToastContext.svelte.js +82 -0
- package/dist/Contexts/TooltipContext.svelte.d.ts +31 -0
- package/dist/Contexts/TooltipContext.svelte.js +78 -0
- package/dist/Contexts/UntypedInputContext.svelte.d.ts +13 -0
- package/dist/Contexts/UntypedInputContext.svelte.js +78 -0
- package/dist/Delay/Delay.d.ts +3 -0
- package/dist/Delay/Delay.js +4 -0
- package/dist/Helpers/Datamatrix.d.ts +11 -0
- package/dist/Helpers/Datamatrix.js +2 -0
- package/dist/Helpers/Helpers.svelte.d.ts +102 -0
- package/dist/Helpers/Helpers.svelte.js +490 -0
- package/dist/Helpers/INamed.d.ts +3 -0
- package/dist/Helpers/INamed.js +1 -0
- package/dist/Helpers/skata.d.ts +1 -0
- package/dist/Helpers/skata.js +1 -0
- package/dist/Types/Examples/ExampleItem.d.ts +15 -0
- package/dist/Types/Examples/ExampleItem.js +1 -0
- package/dist/Types/Examples/ExampleModal.svelte +38 -0
- package/dist/Types/Examples/ExampleModal.svelte.d.ts +5 -0
- package/dist/Types/Examples/ExampleSelectEnum.d.ts +6 -0
- package/dist/Types/Examples/ExampleSelectEnum.js +7 -0
- package/dist/Types/Internal/ApplicationIdentifier.d.ts +37 -0
- package/dist/Types/Internal/ApplicationIdentifier.js +2080 -0
- package/dist/Types/Internal/AttributeOperation.d.ts +30 -0
- package/dist/Types/Internal/AttributeOperation.js +33 -0
- package/dist/Types/Internal/BigRadioOption.d.ts +5 -0
- package/dist/Types/Internal/BigRadioOption.js +1 -0
- package/dist/Types/Internal/ButtonProp.d.ts +11 -0
- package/dist/Types/Internal/ButtonProp.js +1 -0
- package/dist/Types/Internal/CallbackButton.d.ts +10 -0
- package/dist/Types/Internal/CallbackButton.js +1 -0
- package/dist/Types/Internal/DateChange.d.ts +5 -0
- package/dist/Types/Internal/DateChange.js +1 -0
- package/dist/Types/Internal/DatePickerType.d.ts +8 -0
- package/dist/Types/Internal/DatePickerType.js +9 -0
- package/dist/Types/Internal/FloService.d.ts +7 -0
- package/dist/Types/Internal/FloService.js +30 -0
- package/dist/Types/Internal/GridItem.d.ts +4 -0
- package/dist/Types/Internal/GridItem.js +1 -0
- package/dist/Types/Internal/GridMultiSelectItem.d.ts +4 -0
- package/dist/Types/Internal/GridMultiSelectItem.js +1 -0
- package/dist/Types/Internal/GridMultiSelectItemAsObject.d.ts +5 -0
- package/dist/Types/Internal/GridMultiSelectItemAsObject.js +1 -0
- package/dist/Types/Internal/GridMultiSelectItemAsPrimitive.d.ts +5 -0
- package/dist/Types/Internal/GridMultiSelectItemAsPrimitive.js +1 -0
- package/dist/Types/Internal/GridNumberItem.d.ts +4 -0
- package/dist/Types/Internal/GridNumberItem.js +1 -0
- package/dist/Types/Internal/GridSelectItem.d.ts +12 -0
- package/dist/Types/Internal/GridSelectItem.js +1 -0
- package/dist/Types/Internal/GridSingleSelectItem.d.ts +5 -0
- package/dist/Types/Internal/GridSingleSelectItem.js +1 -0
- package/dist/Types/Internal/GridSingleSelectItemAsObject.d.ts +5 -0
- package/dist/Types/Internal/GridSingleSelectItemAsObject.js +1 -0
- package/dist/Types/Internal/GridSingleSelectItemAsPrimitive.d.ts +5 -0
- package/dist/Types/Internal/GridSingleSelectItemAsPrimitive.js +1 -0
- package/dist/Types/Internal/GridStringItem.d.ts +9 -0
- package/dist/Types/Internal/GridStringItem.js +1 -0
- package/dist/Types/Internal/GridTextItem.d.ts +4 -0
- package/dist/Types/Internal/GridTextItem.js +1 -0
- package/dist/Types/Internal/IdentifiableToastMessage.d.ts +5 -0
- package/dist/Types/Internal/IdentifiableToastMessage.js +1 -0
- package/dist/Types/Internal/InputVariant.d.ts +6 -0
- package/dist/Types/Internal/InputVariant.js +7 -0
- package/dist/Types/Internal/Misc.d.ts +271 -0
- package/dist/Types/Internal/Misc.js +129 -0
- package/dist/Types/Internal/RefWrapper.d.ts +3 -0
- package/dist/Types/Internal/RefWrapper.js +1 -0
- package/dist/Types/Internal/SelectOption.d.ts +4 -0
- package/dist/Types/Internal/SelectOption.js +1 -0
- package/dist/Types/Internal/Shape.d.ts +4 -0
- package/dist/Types/Internal/Shape.js +5 -0
- package/dist/Types/Internal/Side.d.ts +6 -0
- package/dist/Types/Internal/Side.js +7 -0
- package/dist/Types/Internal/Size.d.ts +13 -0
- package/dist/Types/Internal/Size.js +14 -0
- package/dist/Types/Internal/TabOption.d.ts +12 -0
- package/dist/Types/Internal/TabOption.js +1 -0
- package/dist/Types/Internal/Ternary.d.ts +5 -0
- package/dist/Types/Internal/Ternary.js +6 -0
- package/dist/Types/Internal/ToastMessage.d.ts +10 -0
- package/dist/Types/Internal/ToastMessage.js +1 -0
- package/dist/Types/Internal/Validity.d.ts +7 -0
- package/dist/Types/Internal/Validity.js +8 -0
- package/dist/Types/Internal/ValidityWrapper.d.ts +5 -0
- package/dist/Types/Internal/ValidityWrapper.js +1 -0
- package/dist/Types/Internal/Variant.d.ts +10 -0
- package/dist/Types/Internal/Variant.js +11 -0
- package/dist/Types/Requests/IFillablePodLineDateRequestBody.d.ts +11 -0
- package/dist/Types/Requests/IFillablePodLineDateRequestBody.js +10 -0
- package/dist/Types/Requests/IRequiredPodLineDateRequestBody.d.ts +12 -0
- package/dist/Types/Requests/IRequiredPodLineDateRequestBody.js +8 -0
- package/dist/Types/Requests/IValidatedPodLineDateRequestBody.d.ts +14 -0
- package/dist/Types/Requests/IValidatedPodLineDateRequestBody.js +10 -0
- package/dist/Types/Responses/AddressType.d.ts +3 -0
- package/dist/Types/Responses/AddressType.js +2 -0
- package/dist/Types/Responses/IAddress.d.ts +39 -0
- package/dist/Types/Responses/IAddress.js +30 -0
- package/dist/Types/Responses/IBaseAddress.d.ts +17 -0
- package/dist/Types/Responses/IBaseAddress.js +15 -0
- package/dist/Types/Responses/ICountry.d.ts +16 -0
- package/dist/Types/Responses/ICountry.js +1 -0
- package/dist/Types/Responses/IDBEntry.d.ts +13 -0
- package/dist/Types/Responses/IDBEntry.js +12 -0
- package/dist/Types/Responses/IErrorResponse.d.ts +10 -0
- package/dist/Types/Responses/IErrorResponse.js +1 -0
- package/dist/Types/Responses/ILabelPrinter.d.ts +4 -0
- package/dist/Types/Responses/ILabelPrinter.js +1 -0
- package/dist/Types/Responses/ILaserPrinter.d.ts +4 -0
- package/dist/Types/Responses/ILaserPrinter.js +1 -0
- package/dist/Types/Responses/ILoginResponse.d.ts +8 -0
- package/dist/Types/Responses/ILoginResponse.js +1 -0
- package/dist/Types/Responses/IPaginatedPayload.d.ts +5 -0
- package/dist/Types/Responses/IPaginatedPayload.js +1 -0
- package/dist/Types/Responses/IPaginatedResponse.d.ts +5 -0
- package/dist/Types/Responses/IPaginatedResponse.js +1 -0
- package/dist/Types/Responses/IPagination.d.ts +9 -0
- package/dist/Types/Responses/IPagination.js +1 -0
- package/dist/Types/Responses/IPayload.d.ts +3 -0
- package/dist/Types/Responses/IPayload.js +1 -0
- package/dist/Types/Responses/IPrinter.d.ts +11 -0
- package/dist/Types/Responses/IPrinter.js +1 -0
- package/dist/Types/Responses/IProcessTypeSelectionMethodOutboundType.d.ts +18 -0
- package/dist/Types/Responses/IProcessTypeSelectionMethodOutboundType.js +12 -0
- package/dist/Types/Responses/IProcessTypeSelectionMethodWarehouseCustomer.d.ts +20 -0
- package/dist/Types/Responses/IProcessTypeSelectionMethodWarehouseCustomer.js +14 -0
- package/dist/Types/Responses/IProcessTypeSelectionMethodWarehouseCustomerType.d.ts +20 -0
- package/dist/Types/Responses/IProcessTypeSelectionMethodWarehouseCustomerType.js +14 -0
- package/dist/Types/Responses/IProductCategory.d.ts +19 -0
- package/dist/Types/Responses/IProductCategory.js +13 -0
- package/dist/Types/Responses/IProductCategoryDetails.d.ts +33 -0
- package/dist/Types/Responses/IProductCategoryDetails.js +13 -0
- package/dist/Types/Responses/IProductIgnoreOnAllocationOutboundType.d.ts +17 -0
- package/dist/Types/Responses/IProductIgnoreOnAllocationOutboundType.js +11 -0
- package/dist/Types/Responses/IProductLocation.d.ts +23 -0
- package/dist/Types/Responses/IProductLocation.js +17 -0
- package/dist/Types/Responses/IResponse.d.ts +8 -0
- package/dist/Types/Responses/IResponse.js +1 -0
- package/dist/Types/Responses/IStockSortationMethodCustomer.d.ts +18 -0
- package/dist/Types/Responses/IStockSortationMethodCustomer.js +12 -0
- package/dist/Types/Responses/Pods/IAttributeTypeWithAI.d.ts +8 -0
- package/dist/Types/Responses/Pods/IAttributeTypeWithAI.js +1 -0
- package/dist/Types/Responses/Pods/IBatchType.d.ts +5 -0
- package/dist/Types/Responses/Pods/IBatchType.js +1 -0
- package/dist/Types/Responses/Pods/IDateType.d.ts +6 -0
- package/dist/Types/Responses/Pods/IDateType.js +1 -0
- package/dist/Types/Responses/Pods/IFillablePodLineAttribute.d.ts +10 -0
- package/dist/Types/Responses/Pods/IFillablePodLineAttribute.js +9 -0
- package/dist/Types/Responses/Pods/IFillablePodLineBatch.d.ts +18 -0
- package/dist/Types/Responses/Pods/IFillablePodLineBatch.js +12 -0
- package/dist/Types/Responses/Pods/IFillablePodLineDate.d.ts +19 -0
- package/dist/Types/Responses/Pods/IFillablePodLineDate.js +13 -0
- package/dist/Types/Responses/Pods/IFillablePodLinePurchaseOrder.d.ts +18 -0
- package/dist/Types/Responses/Pods/IFillablePodLinePurchaseOrder.js +12 -0
- package/dist/Types/Responses/Pods/IFillablePodLineSerial.d.ts +18 -0
- package/dist/Types/Responses/Pods/IFillablePodLineSerial.js +12 -0
- package/dist/Types/Responses/Pods/IFillablePodLineTag.d.ts +18 -0
- package/dist/Types/Responses/Pods/IFillablePodLineTag.js +12 -0
- package/dist/Types/Responses/Pods/IPurchaseOrderType.d.ts +5 -0
- package/dist/Types/Responses/Pods/IPurchaseOrderType.js +1 -0
- package/dist/Types/Responses/Pods/IRequiredOrValidatedAttribute.d.ts +5 -0
- package/dist/Types/Responses/Pods/IRequiredOrValidatedAttribute.js +7 -0
- package/dist/Types/Responses/Pods/IRequiredPodLineBatch.d.ts +16 -0
- package/dist/Types/Responses/Pods/IRequiredPodLineBatch.js +8 -0
- package/dist/Types/Responses/Pods/IRequiredPodLineDate.d.ts +17 -0
- package/dist/Types/Responses/Pods/IRequiredPodLineDate.js +8 -0
- package/dist/Types/Responses/Pods/IRequiredPodLinePurchaseOrder.d.ts +19 -0
- package/dist/Types/Responses/Pods/IRequiredPodLinePurchaseOrder.js +8 -0
- package/dist/Types/Responses/Pods/IRequiredPodLineSerial.d.ts +19 -0
- package/dist/Types/Responses/Pods/IRequiredPodLineSerial.js +8 -0
- package/dist/Types/Responses/Pods/IRequiredPodLineTag.d.ts +19 -0
- package/dist/Types/Responses/Pods/IRequiredPodLineTag.js +8 -0
- package/dist/Types/Responses/Pods/ISerialType.d.ts +6 -0
- package/dist/Types/Responses/Pods/ISerialType.js +1 -0
- package/dist/Types/Responses/Pods/ITagType.d.ts +6 -0
- package/dist/Types/Responses/Pods/ITagType.js +1 -0
- package/dist/Types/Responses/Pods/IValidatedPodLineAttribute.d.ts +13 -0
- package/dist/Types/Responses/Pods/IValidatedPodLineAttribute.js +10 -0
- package/dist/Types/Responses/Pods/IValidatedPodLineBatch.d.ts +17 -0
- package/dist/Types/Responses/Pods/IValidatedPodLineBatch.js +10 -0
- package/dist/Types/Responses/Pods/IValidatedPodLineDate.d.ts +19 -0
- package/dist/Types/Responses/Pods/IValidatedPodLineDate.js +10 -0
- package/dist/Types/Responses/Pods/IValidatedPodLinePurchaseOrder.d.ts +20 -0
- package/dist/Types/Responses/Pods/IValidatedPodLinePurchaseOrder.js +10 -0
- package/dist/Types/Responses/Pods/IValidatedPodLineSerial.d.ts +20 -0
- package/dist/Types/Responses/Pods/IValidatedPodLineSerial.js +10 -0
- package/dist/Types/Responses/Pods/IValidatedPodLineTag.d.ts +20 -0
- package/dist/Types/Responses/Pods/IValidatedPodLineTag.js +10 -0
- package/dist/Types/Responses/Products/IAttributeRule.d.ts +34 -0
- package/dist/Types/Responses/Products/IAttributeRule.js +28 -0
- package/dist/Types/Responses/Products/IBarcode.d.ts +18 -0
- package/dist/Types/Responses/Products/IBarcode.js +12 -0
- package/dist/Types/Responses/Products/IBatchRule.d.ts +36 -0
- package/dist/Types/Responses/Products/IBatchRule.js +9 -0
- package/dist/Types/Responses/Products/ICustomerRule.d.ts +23 -0
- package/dist/Types/Responses/Products/ICustomerRule.js +17 -0
- package/dist/Types/Responses/Products/IDateRule.d.ts +36 -0
- package/dist/Types/Responses/Products/IDateRule.js +9 -0
- package/dist/Types/Responses/Products/IPrice.d.ts +19 -0
- package/dist/Types/Responses/Products/IPrice.js +12 -0
- package/dist/Types/Responses/Products/IProduct.d.ts +436 -0
- package/dist/Types/Responses/Products/IProduct.js +77 -0
- package/dist/Types/Responses/Products/IProductKit.d.ts +24 -0
- package/dist/Types/Responses/Products/IProductKit.js +18 -0
- package/dist/Types/Responses/Products/IProductKitMatrix.d.ts +13 -0
- package/dist/Types/Responses/Products/IProductKitMatrix.js +1 -0
- package/dist/Types/Responses/Products/IProductSupplier.d.ts +18 -0
- package/dist/Types/Responses/Products/IProductSupplier.js +12 -0
- package/dist/Types/Responses/Products/IProductTag.d.ts +33 -0
- package/dist/Types/Responses/Products/IProductTag.js +14 -0
- package/dist/Types/Responses/Products/IProductTagType.d.ts +18 -0
- package/dist/Types/Responses/Products/IProductTagType.js +12 -0
- package/dist/Types/Responses/Products/IProductUnitOfMeasure.d.ts +97 -0
- package/dist/Types/Responses/Products/IProductUnitOfMeasure.js +35 -0
- package/dist/Types/Responses/Products/IProductUnitOfMeasurePrice.d.ts +36 -0
- package/dist/Types/Responses/Products/IProductUnitOfMeasurePrice.js +17 -0
- package/dist/Types/Responses/Products/IPurchaseOrderRule.d.ts +36 -0
- package/dist/Types/Responses/Products/IPurchaseOrderRule.js +9 -0
- package/dist/Types/Responses/Products/ISerialRule.d.ts +36 -0
- package/dist/Types/Responses/Products/ISerialRule.js +9 -0
- package/dist/Types/Responses/Products/ITagRule.d.ts +36 -0
- package/dist/Types/Responses/Products/ITagRule.js +9 -0
- package/dist/Types/Responses/Products/IUnitOfMeasure.d.ts +18 -0
- package/dist/Types/Responses/Products/IUnitOfMeasure.js +12 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/scss/basics.scss +12 -0
- package/dist/scss/colours.d.ts +94 -0
- package/dist/scss/colours.js +138 -0
- package/dist/scss/colours.scss +134 -0
- package/dist/scss/mixins.scss +2778 -0
- package/dist/scss/sizing.scss +72 -0
- package/dist/scss/transitions.scss +8 -0
- package/package.json +92 -0
|
@@ -0,0 +1,2317 @@
|
|
|
1
|
+
import { browser, dev } from '$app/environment';
|
|
2
|
+
import { SvelteMap, SvelteSet } from 'svelte/reactivity';
|
|
3
|
+
import { ColumnType } from '../Columns/ColumnType.js';
|
|
4
|
+
import { ToolbarPosition } from '../Toolbar/ToolbarPosition.js';
|
|
5
|
+
import { RowSelectionDef } from '../Columns/Definitions/RowSelection/RowSelectionDef.svelte.js';
|
|
6
|
+
import { tick } from 'svelte';
|
|
7
|
+
import { PaginationType } from '../Pagination/PaginationType.js';
|
|
8
|
+
import { getCanvasContext } from '../../../../Helpers/Helpers.svelte.js';
|
|
9
|
+
import { AccessorDef } from '../Columns/Definitions/Accessors/AccessorDef.svelte.js';
|
|
10
|
+
import { NumberInputDef } from '../Columns/Definitions/Accessors/NumberInputDef.svelte.js';
|
|
11
|
+
import { SelectDef } from '../Columns/Definitions/Accessors/SelectDef.svelte.js';
|
|
12
|
+
import { TextInputDef } from '../Columns/Definitions/Accessors/TextInputDef.js';
|
|
13
|
+
import { CheckboxDef } from '../Columns/Definitions/Accessors/CheckboxDef.js';
|
|
14
|
+
import { DateInputDef } from '../Columns/Definitions/Accessors/DateInputDef.svelte.js';
|
|
15
|
+
import { ProgressBarDef } from '../Columns/Definitions/Display/ProgressBarDef.svelte.js';
|
|
16
|
+
import { DisplayDef } from '../Columns/Definitions/Display/DisplayDef.js';
|
|
17
|
+
const SORTING_ICON_WIDTH = 24;
|
|
18
|
+
const InternalSymbol = Symbol();
|
|
19
|
+
export class TableContext {
|
|
20
|
+
defaultColumnDefs;
|
|
21
|
+
tableName;
|
|
22
|
+
allowCopy;
|
|
23
|
+
enableResize;
|
|
24
|
+
allowColumnReordering;
|
|
25
|
+
allowQuickFiltering;
|
|
26
|
+
allowAdvancedFiltering;
|
|
27
|
+
toolbarPosition;
|
|
28
|
+
displayFooter;
|
|
29
|
+
selectionExtractor;
|
|
30
|
+
getUserId;
|
|
31
|
+
_onEditCell;
|
|
32
|
+
static identifier = Symbol();
|
|
33
|
+
static init(defaultColumnDefs, tableName, dataRepo, options) {
|
|
34
|
+
const context = new this(InternalSymbol, defaultColumnDefs, tableName, dataRepo, options.allowCopy ?? true, options.enableResize ?? true, options.allowColumnReordering ?? true, options.allowQuickFiltering ?? true, options.allowAdvancedFiltering ?? true, options.toolbar ?? ToolbarPosition.Right, options.displayFooter ?? true, options.selectionExtractor, options.getUserId, options.onEditCell);
|
|
35
|
+
return context;
|
|
36
|
+
}
|
|
37
|
+
// #region constructor
|
|
38
|
+
constructor(INTERNAL_ONLY, defaultColumnDefs, tableName, dataRepo, allowCopy, enableResize, allowColumnReordering, allowQuickFiltering, allowAdvancedFiltering, toolbarPosition, displayFooter, selectionExtractor, getUserId, _onEditCell = async () => {
|
|
39
|
+
if (dev) {
|
|
40
|
+
throw new Error('Cannot edit immutable table');
|
|
41
|
+
}
|
|
42
|
+
}) {
|
|
43
|
+
this.defaultColumnDefs = defaultColumnDefs;
|
|
44
|
+
this.tableName = tableName;
|
|
45
|
+
this.allowCopy = allowCopy;
|
|
46
|
+
this.enableResize = enableResize;
|
|
47
|
+
this.allowColumnReordering = allowColumnReordering;
|
|
48
|
+
this.allowQuickFiltering = allowQuickFiltering;
|
|
49
|
+
this.allowAdvancedFiltering = allowAdvancedFiltering;
|
|
50
|
+
this.toolbarPosition = toolbarPosition;
|
|
51
|
+
this.displayFooter = displayFooter;
|
|
52
|
+
this.selectionExtractor = selectionExtractor;
|
|
53
|
+
this.getUserId = getUserId;
|
|
54
|
+
this._onEditCell = _onEditCell;
|
|
55
|
+
if (INTERNAL_ONLY != InternalSymbol) {
|
|
56
|
+
throw new Error('This class may only be instantiated through the static init() method');
|
|
57
|
+
}
|
|
58
|
+
this.dataRepo = dataRepo;
|
|
59
|
+
// this.dataRepo.forceRefresh = this.forceVisibilityUpdate;
|
|
60
|
+
if (defaultColumnDefs.remoteFilters) {
|
|
61
|
+
this.remoteFilters = defaultColumnDefs.remoteFilters;
|
|
62
|
+
}
|
|
63
|
+
if (hasPagination(dataRepo)) {
|
|
64
|
+
this.paginationRepo = dataRepo;
|
|
65
|
+
// this.tableOptions.onSortingChange = dataRepo.updateSorting;
|
|
66
|
+
// this.tableOptions.manualSorting = dataRepo.manualSorting;
|
|
67
|
+
}
|
|
68
|
+
this.userId = $derived(getUserId());
|
|
69
|
+
if (browser) {
|
|
70
|
+
this._getUserDefaults();
|
|
71
|
+
const removeInvalidPresets = () => {
|
|
72
|
+
if (dev) {
|
|
73
|
+
console.warn('invalid presets');
|
|
74
|
+
}
|
|
75
|
+
localStorage.removeItem(`${this.userId}-${tableName}-presets`);
|
|
76
|
+
localStorage.removeItem(`${this.userId}-${tableName}-selected-preset-name`);
|
|
77
|
+
const visibilityState = {};
|
|
78
|
+
this.columnDefs.forEach((def) => {
|
|
79
|
+
if (def.defaultHidden || def.columnType === ColumnType.FilterOnly) {
|
|
80
|
+
visibilityState[def.id] = false;
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
const defaultPreset = {
|
|
84
|
+
name: 'default',
|
|
85
|
+
columnDefs: this.columnDefs,
|
|
86
|
+
sortingState: [],
|
|
87
|
+
visibilityState,
|
|
88
|
+
columnPinningState: {}
|
|
89
|
+
};
|
|
90
|
+
this.selectedPreset = defaultPreset;
|
|
91
|
+
this.columnVisibility = visibilityState;
|
|
92
|
+
this.columnPresets = [...this.columnPresets, defaultPreset];
|
|
93
|
+
};
|
|
94
|
+
this.setupDefaultColumnDefs()
|
|
95
|
+
.then(() => {
|
|
96
|
+
if (this.allowColumnReordering) {
|
|
97
|
+
const savedPresets = localStorage.getItem(`${this.userId}-${tableName}-presets`);
|
|
98
|
+
if (savedPresets) {
|
|
99
|
+
const presets = JSON.parse(savedPresets);
|
|
100
|
+
if (presets[0] && areDefsEquivalent(this.columnDefs, presets[0].columnDefs)) {
|
|
101
|
+
return this.reassignDefsToPresets(presets).then(() => presets);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
throw new Error('Invalid Presets');
|
|
106
|
+
})
|
|
107
|
+
.then((presets) => {
|
|
108
|
+
const savedPresetName = localStorage.getItem(`${this.userId}-${tableName}-selected-preset-name`);
|
|
109
|
+
if (savedPresetName) {
|
|
110
|
+
const preset = presets.find((it) => it.name === savedPresetName);
|
|
111
|
+
if (preset && areDefsEquivalent(this.columnDefs, preset.columnDefs)) {
|
|
112
|
+
this.columnDefs = preset.columnDefs;
|
|
113
|
+
if (preset.visibilityState) {
|
|
114
|
+
this.columnVisibility = preset.visibilityState;
|
|
115
|
+
}
|
|
116
|
+
if (preset.columnPinningState) {
|
|
117
|
+
this.columnPinning = preset.columnPinningState;
|
|
118
|
+
}
|
|
119
|
+
this.selectedPreset = preset;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
localStorage.removeItem(`${this.userId}-${tableName}-selected-preset-name`);
|
|
123
|
+
this.selectedPreset = presets[0];
|
|
124
|
+
if (presets[0].visibilityState) {
|
|
125
|
+
this.columnVisibility = presets[0].visibilityState;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
this.columnPresets = presets;
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
})
|
|
132
|
+
.catch(() => {
|
|
133
|
+
removeInvalidPresets();
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// #endregion
|
|
138
|
+
// #region stores
|
|
139
|
+
userId;
|
|
140
|
+
isSelectable = $derived(this.columnDefs.some((it) => it.id.includes('is-selectable-')));
|
|
141
|
+
__queryValues = new SvelteMap();
|
|
142
|
+
_paginationRepo = $state();
|
|
143
|
+
get paginationRepo() {
|
|
144
|
+
return this._paginationRepo;
|
|
145
|
+
}
|
|
146
|
+
set paginationRepo(v) {
|
|
147
|
+
this._paginationRepo = v;
|
|
148
|
+
}
|
|
149
|
+
_showQuickFiltering = $state(false);
|
|
150
|
+
get showQuickFiltering() {
|
|
151
|
+
return this._showQuickFiltering;
|
|
152
|
+
}
|
|
153
|
+
set showQuickFiltering(v) {
|
|
154
|
+
this._showQuickFiltering = this.allowQuickFiltering && v;
|
|
155
|
+
}
|
|
156
|
+
_dataRepo = $state();
|
|
157
|
+
get dataRepo() {
|
|
158
|
+
return this._dataRepo;
|
|
159
|
+
}
|
|
160
|
+
set dataRepo(v) {
|
|
161
|
+
this._dataRepo = v;
|
|
162
|
+
}
|
|
163
|
+
_remoteFilters = $state();
|
|
164
|
+
get remoteFilters() {
|
|
165
|
+
return this._remoteFilters;
|
|
166
|
+
}
|
|
167
|
+
set remoteFilters(v) {
|
|
168
|
+
this._remoteFilters = v;
|
|
169
|
+
}
|
|
170
|
+
_showSelectedOnly = $state(false);
|
|
171
|
+
get showSelectedOnly() {
|
|
172
|
+
return this._showSelectedOnly;
|
|
173
|
+
}
|
|
174
|
+
set showSelectedOnly(v) {
|
|
175
|
+
this._showSelectedOnly = v;
|
|
176
|
+
}
|
|
177
|
+
_dateFilter = $derived(this.paginationRepo?.dateFilter);
|
|
178
|
+
get dateFilter() {
|
|
179
|
+
return this._dateFilter;
|
|
180
|
+
}
|
|
181
|
+
_numberFilter = $derived(this.paginationRepo?.numberFilter);
|
|
182
|
+
get numberFilter() {
|
|
183
|
+
return this._numberFilter;
|
|
184
|
+
}
|
|
185
|
+
_selectFilter = $derived(this.paginationRepo?.selectFilter);
|
|
186
|
+
get selectFilter() {
|
|
187
|
+
return this._selectFilter;
|
|
188
|
+
}
|
|
189
|
+
_boolFilter = $derived(this.paginationRepo?.boolFilter);
|
|
190
|
+
get boolFilter() {
|
|
191
|
+
return this._boolFilter;
|
|
192
|
+
}
|
|
193
|
+
_stringFilter = $derived(this.paginationRepo?.stringFilter);
|
|
194
|
+
get stringFilter() {
|
|
195
|
+
return this._stringFilter;
|
|
196
|
+
}
|
|
197
|
+
_limitFooter = $state(false);
|
|
198
|
+
get limitFooter() {
|
|
199
|
+
return this._limitFooter;
|
|
200
|
+
}
|
|
201
|
+
set limitFooter(v) {
|
|
202
|
+
this._limitFooter = v;
|
|
203
|
+
}
|
|
204
|
+
_dragTarget = $state(null);
|
|
205
|
+
get dragTarget() {
|
|
206
|
+
return this._dragTarget;
|
|
207
|
+
}
|
|
208
|
+
set dragTarget(v) {
|
|
209
|
+
this._dragTarget = v;
|
|
210
|
+
}
|
|
211
|
+
_columnDefs = $state([]);
|
|
212
|
+
get columnDefs() {
|
|
213
|
+
return this._columnDefs;
|
|
214
|
+
}
|
|
215
|
+
set columnDefs(v) {
|
|
216
|
+
// if (this._columnDefs.length > 0 && v != this._columnDefs) {
|
|
217
|
+
// debugger;
|
|
218
|
+
// }
|
|
219
|
+
this._columnDefs = v;
|
|
220
|
+
// this causes an error...?
|
|
221
|
+
// this.table = createTable(this.tableOptions);
|
|
222
|
+
}
|
|
223
|
+
_columnPresets = $state([]);
|
|
224
|
+
get columnPresets() {
|
|
225
|
+
return this._columnPresets;
|
|
226
|
+
}
|
|
227
|
+
set columnPresets(v) {
|
|
228
|
+
this._columnPresets = v;
|
|
229
|
+
}
|
|
230
|
+
//FIXME why was this allowed to be undefined?
|
|
231
|
+
_selectedPreset = $state();
|
|
232
|
+
get selectedPreset() {
|
|
233
|
+
return this._selectedPreset;
|
|
234
|
+
}
|
|
235
|
+
set selectedPreset(v) {
|
|
236
|
+
this._selectedPreset = v;
|
|
237
|
+
}
|
|
238
|
+
_focusedRowIndexIds = $state(new SvelteSet());
|
|
239
|
+
get focusedRowIndexIds() {
|
|
240
|
+
return this._focusedRowIndexIds;
|
|
241
|
+
}
|
|
242
|
+
set focusedRowIndexIds(v) {
|
|
243
|
+
this._focusedRowIndexIds = v;
|
|
244
|
+
}
|
|
245
|
+
_highlightedItems = $state(new SvelteMap());
|
|
246
|
+
get highlightedItems() {
|
|
247
|
+
return this._highlightedItems;
|
|
248
|
+
}
|
|
249
|
+
_focusedColumnIds = $state(new SvelteSet());
|
|
250
|
+
get focusedColumnIds() {
|
|
251
|
+
return this._focusedColumnIds;
|
|
252
|
+
}
|
|
253
|
+
set focusedColumnIds(v) {
|
|
254
|
+
this._focusedColumnIds = v;
|
|
255
|
+
}
|
|
256
|
+
_isMousingDown = $state(false);
|
|
257
|
+
get isMousingDown() {
|
|
258
|
+
return this._isMousingDown;
|
|
259
|
+
}
|
|
260
|
+
set isMousingDown(v) {
|
|
261
|
+
this._isMousingDown = v;
|
|
262
|
+
}
|
|
263
|
+
_focusStart = $state(null);
|
|
264
|
+
get focusStart() {
|
|
265
|
+
return this._focusStart;
|
|
266
|
+
}
|
|
267
|
+
set focusStart(v) {
|
|
268
|
+
this._focusStart = v;
|
|
269
|
+
this._recalculateFocusedElements();
|
|
270
|
+
}
|
|
271
|
+
_focusStartIsBeingEdited = $state(false);
|
|
272
|
+
get focusStartIsBeingEdited() {
|
|
273
|
+
return this._focusStartIsBeingEdited;
|
|
274
|
+
}
|
|
275
|
+
set focusStartIsBeingEdited(v) {
|
|
276
|
+
this._focusStartIsBeingEdited = v;
|
|
277
|
+
}
|
|
278
|
+
_focusEnd = $state(null);
|
|
279
|
+
get focusEnd() {
|
|
280
|
+
return this._focusEnd;
|
|
281
|
+
}
|
|
282
|
+
set focusEnd(v) {
|
|
283
|
+
this._focusEnd = v;
|
|
284
|
+
this._recalculateFocusedElements();
|
|
285
|
+
}
|
|
286
|
+
_singleClickEditing = $state(false);
|
|
287
|
+
get singleClickEditing() {
|
|
288
|
+
return this._singleClickEditing;
|
|
289
|
+
}
|
|
290
|
+
set singleClickEditing(v) {
|
|
291
|
+
this._singleClickEditing = v;
|
|
292
|
+
}
|
|
293
|
+
_changeColourOnHover = $state(true);
|
|
294
|
+
get changeColourOnHover() {
|
|
295
|
+
return this._changeColourOnHover;
|
|
296
|
+
}
|
|
297
|
+
set changeColourOnHover(v) {
|
|
298
|
+
this._changeColourOnHover = v;
|
|
299
|
+
}
|
|
300
|
+
_isCompact = $state(true);
|
|
301
|
+
get isCompact() {
|
|
302
|
+
return this._isCompact;
|
|
303
|
+
}
|
|
304
|
+
set isCompact(v) {
|
|
305
|
+
this._isCompact = v;
|
|
306
|
+
}
|
|
307
|
+
_alternateRowColours = $state(false);
|
|
308
|
+
get alternateRowColours() {
|
|
309
|
+
return this._alternateRowColours;
|
|
310
|
+
}
|
|
311
|
+
set alternateRowColours(v) {
|
|
312
|
+
this._alternateRowColours = v;
|
|
313
|
+
}
|
|
314
|
+
_copyWithHeaders = $state(true);
|
|
315
|
+
get copyWithHeaders() {
|
|
316
|
+
return this._copyWithHeaders;
|
|
317
|
+
}
|
|
318
|
+
set copyWithHeaders(v) {
|
|
319
|
+
this._copyWithHeaders = v;
|
|
320
|
+
}
|
|
321
|
+
_commaSeparatedCopy = $state(false);
|
|
322
|
+
get commaSeparatedCopy() {
|
|
323
|
+
return this._commaSeparatedCopy;
|
|
324
|
+
}
|
|
325
|
+
set commaSeparatedCopy(v) {
|
|
326
|
+
this._commaSeparatedCopy = v;
|
|
327
|
+
}
|
|
328
|
+
_columnSizing = $state({});
|
|
329
|
+
get columnSizing() {
|
|
330
|
+
return this._columnSizing;
|
|
331
|
+
}
|
|
332
|
+
set columnSizing(v) {
|
|
333
|
+
this._columnSizing = v;
|
|
334
|
+
}
|
|
335
|
+
_columnPinning = $state({});
|
|
336
|
+
get columnPinning() {
|
|
337
|
+
return this._columnPinning;
|
|
338
|
+
}
|
|
339
|
+
set columnPinning(v) {
|
|
340
|
+
this._columnPinning = v;
|
|
341
|
+
}
|
|
342
|
+
_columnVisibility = $state({});
|
|
343
|
+
get columnVisibility() {
|
|
344
|
+
return this._columnVisibility;
|
|
345
|
+
}
|
|
346
|
+
set columnVisibility(v) {
|
|
347
|
+
this._columnVisibility = v;
|
|
348
|
+
}
|
|
349
|
+
_openModalCoordinates = $state(null);
|
|
350
|
+
get openModalCoordinates() {
|
|
351
|
+
return this._openModalCoordinates;
|
|
352
|
+
}
|
|
353
|
+
set openModalCoordinates(v) {
|
|
354
|
+
this._openModalCoordinates = v;
|
|
355
|
+
}
|
|
356
|
+
_allSelectedInCurrentPage = $derived.by(() => {
|
|
357
|
+
if (!this.dataRepo || this.selectedItems.size === 0) {
|
|
358
|
+
return Promise.resolve(false);
|
|
359
|
+
}
|
|
360
|
+
const pageStartIndex = this.paginationRepo ? this.paginationRepo.pageStartIndex : 0;
|
|
361
|
+
const pageEndIndexExclusive = this.paginationRepo
|
|
362
|
+
? Math.min(this.paginationRepo.pageEndIndexExclusive, this.sortedData.length)
|
|
363
|
+
: this.sortedData.length;
|
|
364
|
+
if (pageStartIndex == undefined || pageEndIndexExclusive == undefined) {
|
|
365
|
+
return Promise.resolve(false);
|
|
366
|
+
}
|
|
367
|
+
const selectableMethod = this.columnDefs.find((it) => it instanceof RowSelectionDef)?.isSelectable;
|
|
368
|
+
return this.allSelectedBySelectableMethod(pageStartIndex, pageEndIndexExclusive, selectableMethod);
|
|
369
|
+
});
|
|
370
|
+
get allSelectedInCurrentPage() {
|
|
371
|
+
return this._allSelectedInCurrentPage;
|
|
372
|
+
}
|
|
373
|
+
async allSelectedBySelectableMethod(pageStartIndex, pageEndIndexExclusive, selectableMethod) {
|
|
374
|
+
if (!this.dataRepo) {
|
|
375
|
+
return Promise.resolve(false);
|
|
376
|
+
}
|
|
377
|
+
if (selectableMethod) {
|
|
378
|
+
for (let index = pageStartIndex; index < pageEndIndexExclusive; index++) {
|
|
379
|
+
const item = this.sortedData[index];
|
|
380
|
+
if ((await selectableMethod(item, index)) &&
|
|
381
|
+
!this.selectedItems.has(this.selectionExtractor(item))) {
|
|
382
|
+
return Promise.resolve(false);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
for (let index = pageStartIndex; index < pageEndIndexExclusive; index++) {
|
|
388
|
+
const item = this.sortedData[index];
|
|
389
|
+
if (!this.selectedItems.has(this.selectionExtractor(item))) {
|
|
390
|
+
return Promise.resolve(false);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return Promise.resolve(true);
|
|
395
|
+
}
|
|
396
|
+
async _areAllHighlighted(pageStartIndex, pageEndIndexExclusive) {
|
|
397
|
+
if (!this.dataRepo) {
|
|
398
|
+
return Promise.resolve(false);
|
|
399
|
+
}
|
|
400
|
+
for (let index = pageStartIndex; index < pageEndIndexExclusive; index++) {
|
|
401
|
+
const item = this.sortedData[index];
|
|
402
|
+
if (!this.highlightedItems.has(this.selectionExtractor(item))) {
|
|
403
|
+
return Promise.resolve(false);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
return Promise.resolve(true);
|
|
407
|
+
}
|
|
408
|
+
_allHighlighted = $derived.by(() => {
|
|
409
|
+
if (!this.dataRepo || this.highlightedItems.size === 0) {
|
|
410
|
+
return Promise.resolve(false);
|
|
411
|
+
}
|
|
412
|
+
const pageStartIndex = this.paginationRepo ? this.paginationRepo.pageStartIndex : 0;
|
|
413
|
+
const pageEndIndexExclusive = this.paginationRepo
|
|
414
|
+
? Math.min(this.paginationRepo.pageEndIndexExclusive, this.sortedData.length)
|
|
415
|
+
: this.sortedData.length;
|
|
416
|
+
if (pageStartIndex == undefined || pageEndIndexExclusive == undefined) {
|
|
417
|
+
return Promise.resolve(false);
|
|
418
|
+
}
|
|
419
|
+
return this._areAllHighlighted(pageStartIndex, pageEndIndexExclusive);
|
|
420
|
+
});
|
|
421
|
+
get allHighlighted() {
|
|
422
|
+
return this._allHighlighted;
|
|
423
|
+
}
|
|
424
|
+
// private _allHighlighted: boolean = $derived.by(() => {
|
|
425
|
+
// if (!this.dataRepo || this.highlightedItems.size === 0) {
|
|
426
|
+
// return false;
|
|
427
|
+
// }
|
|
428
|
+
// const pageStartIndex = this.paginationRepo ? this.paginationRepo.pageStartIndex : 0;
|
|
429
|
+
// const pageEndIndexExclusive = this.paginationRepo
|
|
430
|
+
// ? Math.min(this.paginationRepo.pageEndIndexExclusive, this.sortedData.length)
|
|
431
|
+
// : this.sortedData.length;
|
|
432
|
+
// if (pageStartIndex == undefined || pageEndIndexExclusive == undefined) {
|
|
433
|
+
// return false;
|
|
434
|
+
// }
|
|
435
|
+
// for (let index = pageStartIndex; index < pageEndIndexExclusive; index++) {
|
|
436
|
+
// if (!this.highlightedItems.has(index)) {
|
|
437
|
+
// return false;
|
|
438
|
+
// }
|
|
439
|
+
// }
|
|
440
|
+
// return true;
|
|
441
|
+
// });
|
|
442
|
+
// public get allHighlighted(): boolean {
|
|
443
|
+
// return this._allHighlighted;
|
|
444
|
+
// }
|
|
445
|
+
_hasHighlightedItems = $derived(this.highlightedItems.size > 0);
|
|
446
|
+
get hasHighlightedItems() {
|
|
447
|
+
return this._hasHighlightedItems;
|
|
448
|
+
}
|
|
449
|
+
//type of entries depends on the value extractor in the column def
|
|
450
|
+
_selectedItems = $state(new SvelteMap());
|
|
451
|
+
get selectedItems() {
|
|
452
|
+
return this._selectedItems;
|
|
453
|
+
}
|
|
454
|
+
set selectedItems(v) {
|
|
455
|
+
this._selectedItems = v;
|
|
456
|
+
}
|
|
457
|
+
// HACK this is lazily loaded. it will not be used before initialisation.
|
|
458
|
+
// public getSelectedItemsAsObjects = (): T[] => {
|
|
459
|
+
// if (!this.selectionExtractor) {
|
|
460
|
+
// throw new Error("No selection extractor was supplied.")
|
|
461
|
+
// };
|
|
462
|
+
// return this.sortedData.filter((item) => {
|
|
463
|
+
// return this._selectedIdentifiers.has(this.selectionExtractor(item));
|
|
464
|
+
// }) ?? []
|
|
465
|
+
// }
|
|
466
|
+
// public get selectedItemsAsObjects(): T[] {
|
|
467
|
+
// return this._selectedItemsAsObjects;
|
|
468
|
+
// }
|
|
469
|
+
_invalidValues = $state(new SvelteMap());
|
|
470
|
+
get invalidValues() {
|
|
471
|
+
return this._invalidValues;
|
|
472
|
+
}
|
|
473
|
+
set invalidValues(v) {
|
|
474
|
+
this._invalidValues = v;
|
|
475
|
+
}
|
|
476
|
+
_hasInvalidSelectedItems = $state(false);
|
|
477
|
+
get hasInvalidSelectedItems() {
|
|
478
|
+
return this._hasInvalidSelectedItems;
|
|
479
|
+
}
|
|
480
|
+
set hasInvalidSelectedItems(v) {
|
|
481
|
+
this._hasInvalidSelectedItems = v;
|
|
482
|
+
}
|
|
483
|
+
columnDefsById = $derived(new Map(this.columnDefs.map((it) => [it.id, it])));
|
|
484
|
+
getSortingFn = (id, desc) => {
|
|
485
|
+
if (this.dataRepo?.data.length == 0) {
|
|
486
|
+
return undefined;
|
|
487
|
+
}
|
|
488
|
+
const def = this.columnDefsById?.get(id);
|
|
489
|
+
if (!def) {
|
|
490
|
+
return undefined;
|
|
491
|
+
}
|
|
492
|
+
if (def instanceof DisplayDef ||
|
|
493
|
+
def instanceof TextInputDef ||
|
|
494
|
+
def instanceof NumberInputDef ||
|
|
495
|
+
def instanceof DateInputDef) {
|
|
496
|
+
return comparableSortingFn(id, desc);
|
|
497
|
+
}
|
|
498
|
+
if (def instanceof CheckboxDef) {
|
|
499
|
+
return checkboxSortingFn(id, desc);
|
|
500
|
+
}
|
|
501
|
+
if (def instanceof SelectDef) {
|
|
502
|
+
return def.sortingFn ?? comparableSortingFn(id, desc);
|
|
503
|
+
}
|
|
504
|
+
if (def instanceof ProgressBarDef) {
|
|
505
|
+
return progressSortingFn(id, desc);
|
|
506
|
+
}
|
|
507
|
+
// if (dev) {
|
|
508
|
+
// console.warn('Unhandled def type ' + id, def);
|
|
509
|
+
// }
|
|
510
|
+
return comparableSortingFn(id, desc);
|
|
511
|
+
};
|
|
512
|
+
// eslint-disable-next-line svelte/prefer-svelte-reactivity
|
|
513
|
+
originalRowIndices = $derived(new Map((this.dataRepo?.data ?? []).map((item, index) => [item, index])));
|
|
514
|
+
sortedData = $derived.by(() => {
|
|
515
|
+
if (this.paginationRepo?.paginationType == PaginationType.Local) {
|
|
516
|
+
const state = this.dataRepo?.sorting ?? [];
|
|
517
|
+
const sortedData = this.showSelectedOnly
|
|
518
|
+
? // FIXME this will show the selected items by order of insertion to the selectedItems map.
|
|
519
|
+
[...this.selectedItems.values()]
|
|
520
|
+
: (this.dataRepo?.data.concat() ?? []);
|
|
521
|
+
sortedData.sort((a, b) => {
|
|
522
|
+
const end = state.length;
|
|
523
|
+
for (let i = 0; i < end; i++) {
|
|
524
|
+
const { id, desc } = state[i];
|
|
525
|
+
const sortingFn = this.getSortingFn(id, desc);
|
|
526
|
+
if (sortingFn) {
|
|
527
|
+
const result = sortingFn(a, b);
|
|
528
|
+
if (result != 0) {
|
|
529
|
+
return result;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
else {
|
|
533
|
+
console.warn('no sorting fn found for ' + id);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
return 0;
|
|
537
|
+
});
|
|
538
|
+
return sortedData;
|
|
539
|
+
}
|
|
540
|
+
return this.dataRepo?.data ?? [];
|
|
541
|
+
});
|
|
542
|
+
sortedRowModel = $derived.by(() => {
|
|
543
|
+
const rows = this.sortedData.map((item, index) => {
|
|
544
|
+
const unsortedIndex = this.originalRowIndices.get(item) ?? index;
|
|
545
|
+
const row = {
|
|
546
|
+
getValue: (key) => this.columnDefsById.get(key).accessorFn?.(item, unsortedIndex) ?? item[key],
|
|
547
|
+
original: item,
|
|
548
|
+
index,
|
|
549
|
+
id: index.toString(),
|
|
550
|
+
getLeftVisibleCells: () => leftVisibleCells,
|
|
551
|
+
getRightVisibleCells: () => rightVisibleCells,
|
|
552
|
+
getCenterVisibleCells: () => centerVisibleCells
|
|
553
|
+
};
|
|
554
|
+
const makeRow = (def) => {
|
|
555
|
+
const isVisible = $derived(this.columnVisibility[def.id] != false);
|
|
556
|
+
const isSorted = $derived.by(() => {
|
|
557
|
+
const sortState = this.paginationRepo?.sorting.find((it) => it.id == def.id);
|
|
558
|
+
if (!sortState) {
|
|
559
|
+
return 'none';
|
|
560
|
+
}
|
|
561
|
+
if (sortState.desc) {
|
|
562
|
+
return 'desc';
|
|
563
|
+
}
|
|
564
|
+
return 'asc';
|
|
565
|
+
});
|
|
566
|
+
return {
|
|
567
|
+
column: {
|
|
568
|
+
columnDef: def,
|
|
569
|
+
getCanSort: () => def.enableSorting,
|
|
570
|
+
getIsResizing: () => def.isResizing,
|
|
571
|
+
getIsSorted: () => isSorted,
|
|
572
|
+
getIsVisible: () => isVisible,
|
|
573
|
+
getToggleSortingHandler: () => def.enableSorting ? this.getToggleSortingHandler(def) : undefined,
|
|
574
|
+
id: def.id
|
|
575
|
+
},
|
|
576
|
+
id: `${index}_${def.id}`,
|
|
577
|
+
row: row,
|
|
578
|
+
getValue: () => def.accessorFn?.(item, index) ?? item[def.id] // TODO
|
|
579
|
+
};
|
|
580
|
+
};
|
|
581
|
+
const makeCellFromId = (columnId) => {
|
|
582
|
+
const def = this.columnDefsById.get(columnId);
|
|
583
|
+
return makeRow(def);
|
|
584
|
+
};
|
|
585
|
+
const leftVisibleCells = $derived(this.columnPinning.left?.map(makeCellFromId) ?? []);
|
|
586
|
+
const rightVisibleCells = $derived(this.columnPinning.right?.map(makeCellFromId) ?? []);
|
|
587
|
+
const centerVisibleCells = $derived(this.columnDefs
|
|
588
|
+
.filter((it) => !(this.columnPinning.left?.includes(it.id) ||
|
|
589
|
+
this.columnPinning.right?.includes(it.id)))
|
|
590
|
+
.map(makeRow));
|
|
591
|
+
return row;
|
|
592
|
+
});
|
|
593
|
+
return {
|
|
594
|
+
rows,
|
|
595
|
+
// eslint-disable-next-line svelte/prefer-svelte-reactivity
|
|
596
|
+
rowsById: new Map(rows.map((it, index) => [index.toString(), it])) //FIXME should this be by sorted id or by original id?
|
|
597
|
+
};
|
|
598
|
+
});
|
|
599
|
+
_currentPageData = $derived(this.dataRepo?.paginationType == PaginationType.Local
|
|
600
|
+
? this.sortedData.slice(this.dataRepo.pageStartIndex, this.dataRepo.pageEndIndexExclusive)
|
|
601
|
+
: (this.sortedData ?? []));
|
|
602
|
+
paginationRowModel = $derived.by(() => {
|
|
603
|
+
const sortedData = this._currentPageData;
|
|
604
|
+
const rows = sortedData.map((item, index) => {
|
|
605
|
+
const row = {
|
|
606
|
+
getValue: (key) => this.columnDefsById.get(key).accessorFn?.(item, index) ?? item[key],
|
|
607
|
+
original: item,
|
|
608
|
+
index,
|
|
609
|
+
id: index.toString(),
|
|
610
|
+
getLeftVisibleCells: () => leftVisibleCells,
|
|
611
|
+
getRightVisibleCells: () => rightVisibleCells,
|
|
612
|
+
getCenterVisibleCells: () => centerVisibleCells
|
|
613
|
+
};
|
|
614
|
+
const makeRow = (def) => {
|
|
615
|
+
const isSorted = $derived.by(() => {
|
|
616
|
+
const sortState = this.paginationRepo?.sorting.find((it) => it.id == def.id);
|
|
617
|
+
if (!sortState) {
|
|
618
|
+
return 'none';
|
|
619
|
+
}
|
|
620
|
+
if (sortState.desc) {
|
|
621
|
+
return 'desc';
|
|
622
|
+
}
|
|
623
|
+
return 'asc';
|
|
624
|
+
});
|
|
625
|
+
const isVisible = $derived(this.columnVisibility[def.id] != false);
|
|
626
|
+
return {
|
|
627
|
+
column: {
|
|
628
|
+
columnDef: def,
|
|
629
|
+
getCanSort: () => def.enableSorting,
|
|
630
|
+
getIsResizing: () => def.isResizing,
|
|
631
|
+
getIsSorted: () => isSorted,
|
|
632
|
+
getIsVisible: () => isVisible,
|
|
633
|
+
getToggleSortingHandler: () => def.enableSorting ? this.getToggleSortingHandler(def) : undefined,
|
|
634
|
+
id: def.id
|
|
635
|
+
},
|
|
636
|
+
id: `${index}_${def.id}`,
|
|
637
|
+
row: row,
|
|
638
|
+
getValue: () => def.accessorFn?.(item, index) ?? item[def.id] // TODO
|
|
639
|
+
};
|
|
640
|
+
};
|
|
641
|
+
const makeCellFromId = (columnId) => {
|
|
642
|
+
const def = this.columnDefsById.get(columnId);
|
|
643
|
+
return makeRow(def);
|
|
644
|
+
};
|
|
645
|
+
const leftVisibleCells = $derived(this.columnPinning.left?.map(makeCellFromId) ?? []);
|
|
646
|
+
const rightVisibleCells = $derived(this.columnPinning.right?.map(makeCellFromId) ?? []);
|
|
647
|
+
const centerVisibleCells = $derived(this.columnDefs
|
|
648
|
+
.filter((it) => !(this.columnPinning.left?.includes(it.id) ||
|
|
649
|
+
this.columnPinning.right?.includes(it.id)))
|
|
650
|
+
.map(makeRow));
|
|
651
|
+
return row;
|
|
652
|
+
});
|
|
653
|
+
return {
|
|
654
|
+
rows,
|
|
655
|
+
// eslint-disable-next-line svelte/prefer-svelte-reactivity
|
|
656
|
+
rowsById: new Map(rows.map((it, index) => [index.toString(), it])) //FIXME should this be by sorted id or by original id?
|
|
657
|
+
};
|
|
658
|
+
});
|
|
659
|
+
get currentPageData() {
|
|
660
|
+
return this._currentPageData;
|
|
661
|
+
}
|
|
662
|
+
// #endregion
|
|
663
|
+
// #region public methods
|
|
664
|
+
selectionContains = (item) => {
|
|
665
|
+
if (!this.selectionExtractor) {
|
|
666
|
+
throw new Error('No selection extractor was supplied');
|
|
667
|
+
}
|
|
668
|
+
if (!this.isSelectable) {
|
|
669
|
+
return true;
|
|
670
|
+
}
|
|
671
|
+
return this.selectedItems.has(this.selectionExtractor(item));
|
|
672
|
+
};
|
|
673
|
+
// public readonly HACK__reselectItem = (item: T) => {
|
|
674
|
+
// if (!this.selectionExtractor) {
|
|
675
|
+
// throw new Error('No selection extractor was supplied');
|
|
676
|
+
// }
|
|
677
|
+
// if (!this.isSelectable) {
|
|
678
|
+
// return true;
|
|
679
|
+
// }
|
|
680
|
+
// const key = this.selectionExtractor(item);
|
|
681
|
+
// if (this.selectedItems.has(key)) {
|
|
682
|
+
// this.selectedItems.delete(key);
|
|
683
|
+
// this.selectedItems.set(key, item);
|
|
684
|
+
// } else {
|
|
685
|
+
// this.selectedItems.set(key, item);
|
|
686
|
+
// this.selectedItems.delete(key);
|
|
687
|
+
// }
|
|
688
|
+
// };
|
|
689
|
+
addInvalidValue = (item) => {
|
|
690
|
+
this.invalidValues.set(this.selectionExtractor(item), item);
|
|
691
|
+
};
|
|
692
|
+
removeInvalidValue = (item) => {
|
|
693
|
+
this.invalidValues.delete(this.selectionExtractor(item));
|
|
694
|
+
};
|
|
695
|
+
setOpenModalCoordinates = (coordinates) => {
|
|
696
|
+
this.openModalCoordinates = coordinates ? { ...coordinates } : null;
|
|
697
|
+
};
|
|
698
|
+
toggleHighlightedRow = (item) => {
|
|
699
|
+
const key = this.selectionExtractor(item);
|
|
700
|
+
if (this.highlightedItems.has(key)) {
|
|
701
|
+
this.highlightedItems.delete(key);
|
|
702
|
+
}
|
|
703
|
+
else {
|
|
704
|
+
this.highlightedItems.set(key, item);
|
|
705
|
+
}
|
|
706
|
+
};
|
|
707
|
+
// public readonly toggleHighlightedRow = (rowIndex: number) => {
|
|
708
|
+
// if (this.highlightedRowIndexIds.has(rowIndex)) {
|
|
709
|
+
// this.highlightedRowIndexIds.delete(rowIndex);
|
|
710
|
+
// } else {
|
|
711
|
+
// this.highlightedRowIndexIds.add(rowIndex);
|
|
712
|
+
// }
|
|
713
|
+
// };
|
|
714
|
+
resetHighlightedRows = () => {
|
|
715
|
+
this.highlightedItems.clear();
|
|
716
|
+
};
|
|
717
|
+
toggleSelected = (item, selected) => {
|
|
718
|
+
const key = this.selectionExtractor(item);
|
|
719
|
+
if (selected) {
|
|
720
|
+
this.selectedItems.set(key, item);
|
|
721
|
+
}
|
|
722
|
+
else {
|
|
723
|
+
this.selectedItems.delete(key);
|
|
724
|
+
}
|
|
725
|
+
this.recalculateAllSelectedInCurrentPage();
|
|
726
|
+
};
|
|
727
|
+
setSelectionMap = (set) => {
|
|
728
|
+
this.selectedItems = set;
|
|
729
|
+
};
|
|
730
|
+
updateSelectedItems = async () => {
|
|
731
|
+
if (!this.dataRepo) {
|
|
732
|
+
return;
|
|
733
|
+
}
|
|
734
|
+
const pageStartIndex = this.paginationRepo ? this.paginationRepo.pageStartIndex : 0;
|
|
735
|
+
const pageEndIndexExclusive = this.paginationRepo
|
|
736
|
+
? Math.min(this.paginationRepo.pageEndIndexExclusive, this.sortedData.length)
|
|
737
|
+
: this.sortedData.length;
|
|
738
|
+
const selectableMethod = this.columnDefs.find((it) => it instanceof RowSelectionDef)?.isSelectable;
|
|
739
|
+
if (selectableMethod) {
|
|
740
|
+
for (let index = pageStartIndex; index < pageEndIndexExclusive; index++) {
|
|
741
|
+
const item = this.sortedData[index];
|
|
742
|
+
if (await selectableMethod(item, index)) {
|
|
743
|
+
const key = this.selectionExtractor(item);
|
|
744
|
+
if (this.selectedItems.has(key)) {
|
|
745
|
+
//replace selected item with newer version of the same identity
|
|
746
|
+
this.selectedItems.set(key, item);
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
else {
|
|
752
|
+
for (let index = pageStartIndex; index < pageEndIndexExclusive; index++) {
|
|
753
|
+
const item = this.sortedData[index];
|
|
754
|
+
const key = this.selectionExtractor(item);
|
|
755
|
+
if (this.selectedItems.has(key)) {
|
|
756
|
+
//replace selected item with newer version of the same identity
|
|
757
|
+
this.selectedItems.set(key, item);
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
this.recalculateAllSelectedInCurrentPage();
|
|
762
|
+
};
|
|
763
|
+
resetSelectedItems = () => {
|
|
764
|
+
for (const key of this.selectedItems.keys()) {
|
|
765
|
+
this.selectedItems.delete(key);
|
|
766
|
+
}
|
|
767
|
+
this.recalculateAllSelectedInCurrentPage();
|
|
768
|
+
};
|
|
769
|
+
recalculateAllSelectedInCurrentPage = () => {
|
|
770
|
+
tick().then(() => {
|
|
771
|
+
this.allSelectedInCurrentPage?.then(() => {
|
|
772
|
+
this.hasInvalidSelectedItems = [...this.selectedItems.keys()].some((key) => this._invalidValues.has(key));
|
|
773
|
+
});
|
|
774
|
+
});
|
|
775
|
+
};
|
|
776
|
+
onSelectAllInCurrentPage = async () => {
|
|
777
|
+
if (!this.dataRepo) {
|
|
778
|
+
return;
|
|
779
|
+
}
|
|
780
|
+
if (await this.allSelectedInCurrentPage) {
|
|
781
|
+
// this.resetSelectedItems();
|
|
782
|
+
const pageStartIndex = this.paginationRepo ? this.paginationRepo.pageStartIndex : 0;
|
|
783
|
+
const pageEndIndexExclusive = this.paginationRepo
|
|
784
|
+
? Math.min(this.paginationRepo.pageEndIndexExclusive, this.sortedData.length)
|
|
785
|
+
: this.sortedData.length;
|
|
786
|
+
for (let index = pageStartIndex; index < pageEndIndexExclusive; index++) {
|
|
787
|
+
const item = this.sortedData[index];
|
|
788
|
+
this.selectedItems.delete(this.selectionExtractor(item));
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
else {
|
|
792
|
+
// this.resetSelectedItems();
|
|
793
|
+
// const selectedItems = new SvelteSet<number>();
|
|
794
|
+
const pageStartIndex = this.paginationRepo ? this.paginationRepo.pageStartIndex : 0;
|
|
795
|
+
const pageEndIndexExclusive = this.paginationRepo
|
|
796
|
+
? Math.min(this.paginationRepo.pageEndIndexExclusive, this.sortedData.length)
|
|
797
|
+
: this.sortedData.length;
|
|
798
|
+
const selectableMethod = this.columnDefs.find((it) => it instanceof RowSelectionDef)?.isSelectable;
|
|
799
|
+
if (selectableMethod) {
|
|
800
|
+
for (let index = pageStartIndex; index < pageEndIndexExclusive; index++) {
|
|
801
|
+
const item = this.sortedData[index];
|
|
802
|
+
if (await selectableMethod(item, index)) {
|
|
803
|
+
this.selectedItems.set(this.selectionExtractor(item), item);
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
else {
|
|
808
|
+
for (let index = pageStartIndex; index < pageEndIndexExclusive; index++) {
|
|
809
|
+
const item = this.sortedData[index];
|
|
810
|
+
this.selectedItems.set(this.selectionExtractor(item), item);
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
this.recalculateAllSelectedInCurrentPage();
|
|
815
|
+
};
|
|
816
|
+
onHighlightAll = () => {
|
|
817
|
+
if (!this.dataRepo) {
|
|
818
|
+
return;
|
|
819
|
+
}
|
|
820
|
+
this.allHighlighted.then((areAllHighlighted) => {
|
|
821
|
+
if (areAllHighlighted) {
|
|
822
|
+
this.highlightedItems.clear();
|
|
823
|
+
}
|
|
824
|
+
else {
|
|
825
|
+
this._currentPageData.forEach((item) => {
|
|
826
|
+
this.highlightedItems.set(this.selectionExtractor(item), item);
|
|
827
|
+
});
|
|
828
|
+
}
|
|
829
|
+
});
|
|
830
|
+
};
|
|
831
|
+
onEditCell = async (item, coords, value) => {
|
|
832
|
+
const oldKey = this.selectionExtractor?.(item);
|
|
833
|
+
const wasSelected = oldKey != null && this.selectedItems.has(oldKey);
|
|
834
|
+
// debugger;
|
|
835
|
+
if (wasSelected) {
|
|
836
|
+
this.selectedItems.delete(oldKey);
|
|
837
|
+
}
|
|
838
|
+
await this._onEditCell(item, coords, value);
|
|
839
|
+
if (wasSelected && this.isSelectable) {
|
|
840
|
+
const newKey = this.selectionExtractor?.(item);
|
|
841
|
+
if (newKey) {
|
|
842
|
+
this.selectedItems.set(newKey, item);
|
|
843
|
+
}
|
|
844
|
+
this.recalculateAllSelectedInCurrentPage();
|
|
845
|
+
}
|
|
846
|
+
};
|
|
847
|
+
handleTdKeydown = (e) => {
|
|
848
|
+
e.stopPropagation();
|
|
849
|
+
if (e.key.toLocaleUpperCase() === 'F' && e.ctrlKey && this.allowQuickFiltering) {
|
|
850
|
+
e.preventDefault();
|
|
851
|
+
this.toggleQuickFiltering();
|
|
852
|
+
}
|
|
853
|
+
else if (e.key === 'Escape') {
|
|
854
|
+
e.preventDefault();
|
|
855
|
+
this.focusStartIsBeingEdited = false;
|
|
856
|
+
}
|
|
857
|
+
else if (e.key === 'Tab') {
|
|
858
|
+
//allow regular operation in side panels
|
|
859
|
+
const target = e.target;
|
|
860
|
+
if (target?.closest('.side-panel') != null ||
|
|
861
|
+
target?.attributes.getNamedItem('data-type')?.value === 'quicksearch') {
|
|
862
|
+
return;
|
|
863
|
+
}
|
|
864
|
+
e.preventDefault();
|
|
865
|
+
if (e.getModifierState('Shift')) {
|
|
866
|
+
this.tabBackward();
|
|
867
|
+
}
|
|
868
|
+
else {
|
|
869
|
+
this.tabForward();
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
if (e.target.tagName === 'INPUT' &&
|
|
873
|
+
e.target.attributes.getNamedItem('type')?.value !== 'checkbox') {
|
|
874
|
+
return;
|
|
875
|
+
}
|
|
876
|
+
switch (e.key) {
|
|
877
|
+
case 'Enter':
|
|
878
|
+
case 'F2':
|
|
879
|
+
if (!e.target?.classList?.contains('editable')) {
|
|
880
|
+
if (dev) {
|
|
881
|
+
console.log('not editable. cancelling...');
|
|
882
|
+
}
|
|
883
|
+
break;
|
|
884
|
+
}
|
|
885
|
+
e.preventDefault();
|
|
886
|
+
e.stopPropagation();
|
|
887
|
+
e.target?.dispatchEvent(new CustomEvent('edit', { detail: { selectAll: e.key === 'Enter' } }));
|
|
888
|
+
// focusStartIsBeingEdited.set(true);
|
|
889
|
+
break;
|
|
890
|
+
case 'ArrowUp': {
|
|
891
|
+
e.preventDefault();
|
|
892
|
+
if (e.getModifierState('Control')) {
|
|
893
|
+
if (e.getModifierState('Shift')) {
|
|
894
|
+
if (!this.allowCopy) {
|
|
895
|
+
return;
|
|
896
|
+
}
|
|
897
|
+
this.focusToTop();
|
|
898
|
+
}
|
|
899
|
+
else {
|
|
900
|
+
this.moveToTop();
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
else if (e.getModifierState('Shift')) {
|
|
904
|
+
if (!this.allowCopy) {
|
|
905
|
+
return;
|
|
906
|
+
}
|
|
907
|
+
this.moveFocusUp();
|
|
908
|
+
}
|
|
909
|
+
else {
|
|
910
|
+
this.setFocusUp();
|
|
911
|
+
}
|
|
912
|
+
return;
|
|
913
|
+
}
|
|
914
|
+
case 'ArrowDown': {
|
|
915
|
+
e.preventDefault();
|
|
916
|
+
if (e.getModifierState('Control')) {
|
|
917
|
+
if (e.getModifierState('Shift')) {
|
|
918
|
+
if (!this.allowCopy) {
|
|
919
|
+
return;
|
|
920
|
+
}
|
|
921
|
+
this.focusToBottom();
|
|
922
|
+
}
|
|
923
|
+
else {
|
|
924
|
+
this.moveToBottom();
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
else if (e.getModifierState('Shift')) {
|
|
928
|
+
if (!this.allowCopy) {
|
|
929
|
+
return;
|
|
930
|
+
}
|
|
931
|
+
this.moveFocusDown();
|
|
932
|
+
}
|
|
933
|
+
else {
|
|
934
|
+
this.setFocusDown();
|
|
935
|
+
}
|
|
936
|
+
return;
|
|
937
|
+
}
|
|
938
|
+
// TODO add ctrl-home and ctrl-end as ways to get to top-left/bottom-right
|
|
939
|
+
case 'ArrowLeft':
|
|
940
|
+
case 'Home': {
|
|
941
|
+
e.preventDefault();
|
|
942
|
+
if (e.getModifierState('Control') || e.key === 'Home') {
|
|
943
|
+
if (e.getModifierState('Shift')) {
|
|
944
|
+
if (!this.allowCopy) {
|
|
945
|
+
return;
|
|
946
|
+
}
|
|
947
|
+
this.focusToStart();
|
|
948
|
+
}
|
|
949
|
+
else {
|
|
950
|
+
this.moveToStart();
|
|
951
|
+
}
|
|
952
|
+
//these two at the bottom shouldn't happen on a home press
|
|
953
|
+
}
|
|
954
|
+
else if (e.getModifierState('Shift') && this.allowCopy && e.key === 'ArrowLeft') {
|
|
955
|
+
this.moveFocusLeft();
|
|
956
|
+
}
|
|
957
|
+
else if (e.key === 'ArrowLeft') {
|
|
958
|
+
this.setFocusLeft();
|
|
959
|
+
}
|
|
960
|
+
return;
|
|
961
|
+
}
|
|
962
|
+
case 'ArrowRight':
|
|
963
|
+
case 'End': {
|
|
964
|
+
e.preventDefault();
|
|
965
|
+
if (e.getModifierState('Control') || e.key === 'End') {
|
|
966
|
+
if (e.getModifierState('Shift')) {
|
|
967
|
+
if (!this.allowCopy) {
|
|
968
|
+
return;
|
|
969
|
+
}
|
|
970
|
+
this.focusToEnd();
|
|
971
|
+
}
|
|
972
|
+
else {
|
|
973
|
+
this.moveToEnd();
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
else if (e.getModifierState('Shift') && this.allowCopy && e.key === 'ArrowRight') {
|
|
977
|
+
this.moveFocusRight();
|
|
978
|
+
}
|
|
979
|
+
else if (e.key === 'ArrowRight') {
|
|
980
|
+
this.setFocusRight();
|
|
981
|
+
}
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
if (this.allowCopy) {
|
|
985
|
+
switch (e.key) {
|
|
986
|
+
case 'a': {
|
|
987
|
+
if (e.ctrlKey) {
|
|
988
|
+
e.preventDefault();
|
|
989
|
+
this.moveToTop();
|
|
990
|
+
this.moveToStart();
|
|
991
|
+
this.focusToBottom();
|
|
992
|
+
this.focusToEnd();
|
|
993
|
+
}
|
|
994
|
+
break;
|
|
995
|
+
}
|
|
996
|
+
case 'c':
|
|
997
|
+
case 'C':
|
|
998
|
+
if (e.getModifierState('Control')) {
|
|
999
|
+
e.preventDefault();
|
|
1000
|
+
if (this.allowCopy) {
|
|
1001
|
+
this.copyDataToClipboard();
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
break;
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
};
|
|
1008
|
+
toggleQuickFiltering = () => {
|
|
1009
|
+
if (this.allowQuickFiltering) {
|
|
1010
|
+
const fs = this.focusStart;
|
|
1011
|
+
const idToFocusTo = fs &&
|
|
1012
|
+
(this.showQuickFiltering
|
|
1013
|
+
? `#${this.tableName}-cell-${fs.row}-${fs.id}`
|
|
1014
|
+
: `#${this.tableName}-cell-quicksearch-${fs.id}`);
|
|
1015
|
+
this.showQuickFiltering = !this.showQuickFiltering;
|
|
1016
|
+
tick().then(() => {
|
|
1017
|
+
if (idToFocusTo && browser) {
|
|
1018
|
+
document.querySelector(idToFocusTo)?.focus();
|
|
1019
|
+
}
|
|
1020
|
+
});
|
|
1021
|
+
}
|
|
1022
|
+
};
|
|
1023
|
+
setColumnPinning = (updater) => {
|
|
1024
|
+
if (!this.allowColumnReordering) {
|
|
1025
|
+
return;
|
|
1026
|
+
}
|
|
1027
|
+
this.columnPinning = updater(this.columnPinning);
|
|
1028
|
+
};
|
|
1029
|
+
updateFilters = $state();
|
|
1030
|
+
updateVisibility = (stateOrCallback) => {
|
|
1031
|
+
if (typeof stateOrCallback == 'function') {
|
|
1032
|
+
this.columnVisibility = stateOrCallback(this.columnVisibility);
|
|
1033
|
+
}
|
|
1034
|
+
else {
|
|
1035
|
+
this.columnVisibility = stateOrCallback;
|
|
1036
|
+
}
|
|
1037
|
+
// this.forceVisibilityUpdate();
|
|
1038
|
+
};
|
|
1039
|
+
updateColumnSizing = (stateOrCallback) => {
|
|
1040
|
+
if (typeof stateOrCallback == 'function') {
|
|
1041
|
+
this.columnSizing = stateOrCallback(this.columnSizing);
|
|
1042
|
+
}
|
|
1043
|
+
else {
|
|
1044
|
+
this.columnSizing = stateOrCallback;
|
|
1045
|
+
}
|
|
1046
|
+
};
|
|
1047
|
+
table = $derived(generateTableOptions(this));
|
|
1048
|
+
// private _rowModel = $derived<RowModel<T> | undefined>(this.dataRepo?.data && this.table.rowModel);
|
|
1049
|
+
// public get rowModel() {
|
|
1050
|
+
// return this._rowModel;
|
|
1051
|
+
// }
|
|
1052
|
+
lastPage = $derived(this.dataRepo?.lastPage ?? 0);
|
|
1053
|
+
measureHeaderWidth = (columnDef) => {
|
|
1054
|
+
const label = columnDef.header;
|
|
1055
|
+
if (typeof label === 'string' && browser) {
|
|
1056
|
+
const extraWidth = columnDef.enableSorting ? SORTING_ICON_WIDTH : 0;
|
|
1057
|
+
const canvasContext = getCanvasContext();
|
|
1058
|
+
if (canvasContext) {
|
|
1059
|
+
const headerWidth = Math.ceil(extraWidth + canvasContext.measureText(`pad${label}pad`).width);
|
|
1060
|
+
if (this.allowQuickFiltering && columnDef instanceof AccessorDef) {
|
|
1061
|
+
if (columnDef instanceof NumberInputDef) {
|
|
1062
|
+
return Math.max(headerWidth, Math.ceil(extraWidth + canvasContext.measureText(`Lorem Ipsum Dolor`).width)
|
|
1063
|
+
// HACK this is correct for quick filtering between min and max but it may be too large for a minimum.
|
|
1064
|
+
// Math.ceil(extraWidth + ctx.measureText(`Lorem Ipsum Dolor Sit Amet`).width)
|
|
1065
|
+
);
|
|
1066
|
+
}
|
|
1067
|
+
return Math.max(headerWidth, Math.ceil(extraWidth + canvasContext.measureText(`Lorem Ipsum Dolor`).width));
|
|
1068
|
+
}
|
|
1069
|
+
return headerWidth;
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
return 0;
|
|
1073
|
+
};
|
|
1074
|
+
autoResize = async (columnDef) => {
|
|
1075
|
+
if (!browser) {
|
|
1076
|
+
return;
|
|
1077
|
+
}
|
|
1078
|
+
const ctx = getCanvasContext();
|
|
1079
|
+
const currentPageContents = this.currentPageData;
|
|
1080
|
+
const colId = columnDef.id;
|
|
1081
|
+
if (!colId) {
|
|
1082
|
+
return;
|
|
1083
|
+
}
|
|
1084
|
+
let maxWidth = 0;
|
|
1085
|
+
if (columnDef.accessorFn) {
|
|
1086
|
+
for (let i = currentPageContents.length - 1; i > -1; i--) {
|
|
1087
|
+
const row = currentPageContents[i];
|
|
1088
|
+
const label = ((await columnDef.accessorFn?.(row, i)) ?? Promise.resolve())?.toString() ?? '';
|
|
1089
|
+
const currentWidth = ctx.measureText(label).width;
|
|
1090
|
+
maxWidth = Math.max(maxWidth, currentWidth);
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
else {
|
|
1094
|
+
const currentWidth = columnDef.width ??
|
|
1095
|
+
ctx.measureText(
|
|
1096
|
+
// TODO
|
|
1097
|
+
(typeof columnDef.header == 'string' ? columnDef.header : 'TODO') ?? '-').width;
|
|
1098
|
+
maxWidth = Math.max(maxWidth, currentWidth);
|
|
1099
|
+
}
|
|
1100
|
+
this.columnSizing[colId] = maxWidth + 32; //standard extra cell padding
|
|
1101
|
+
};
|
|
1102
|
+
reorderColumn = (dropTarget) => {
|
|
1103
|
+
if (!this.allowColumnReordering) {
|
|
1104
|
+
return;
|
|
1105
|
+
}
|
|
1106
|
+
if (!this.dragTarget || !dropTarget) {
|
|
1107
|
+
return;
|
|
1108
|
+
}
|
|
1109
|
+
const newDefs = this.columnDefs.concat();
|
|
1110
|
+
newDefs
|
|
1111
|
+
.sort((a, b) => a.index - b.index)
|
|
1112
|
+
.forEach((element, index) => {
|
|
1113
|
+
element.index = index;
|
|
1114
|
+
});
|
|
1115
|
+
const originalIndex = newDefs.findIndex((it) => it.id === this.dragTarget?.id);
|
|
1116
|
+
if (originalIndex === -1) {
|
|
1117
|
+
if (dev) {
|
|
1118
|
+
alert("couldn't find target's original index");
|
|
1119
|
+
}
|
|
1120
|
+
return newDefs;
|
|
1121
|
+
}
|
|
1122
|
+
newDefs.splice(originalIndex, 1);
|
|
1123
|
+
const isDraggedToFirst = dropTarget.id === `${this.tableName}-column-settings-top-anchor` ||
|
|
1124
|
+
dropTarget.id === `${this.tableName}-header-anchor`;
|
|
1125
|
+
if (isDraggedToFirst) {
|
|
1126
|
+
this.dragTarget.index = -9999;
|
|
1127
|
+
newDefs.push(this.dragTarget);
|
|
1128
|
+
}
|
|
1129
|
+
else {
|
|
1130
|
+
const dropTargetIndex = targetIsLI(dropTarget)
|
|
1131
|
+
? newDefs.findIndex((col) => `${this.tableName}-column-settings-${col.id}` === dropTarget.id)
|
|
1132
|
+
: newDefs.findIndex((col) => `${this.tableName}-header-${col.id}` === dropTarget.id);
|
|
1133
|
+
if (dropTargetIndex === -1) {
|
|
1134
|
+
newDefs.push(this.dragTarget);
|
|
1135
|
+
newDefs.sort((a, b) => a.index - b.index);
|
|
1136
|
+
return;
|
|
1137
|
+
}
|
|
1138
|
+
// this will require changes if you want to swap two
|
|
1139
|
+
// for (let i = newColumns.length - 1; i > dropTargetIndex; i--) {
|
|
1140
|
+
// newColumns[i].index += 1;
|
|
1141
|
+
// }
|
|
1142
|
+
if (originalIndex > dropTargetIndex && !targetIsLI(dropTarget)) {
|
|
1143
|
+
newDefs[dropTargetIndex].index += 1;
|
|
1144
|
+
this.dragTarget.index = newDefs[dropTargetIndex].index - 1;
|
|
1145
|
+
newDefs.push(this.dragTarget);
|
|
1146
|
+
}
|
|
1147
|
+
else {
|
|
1148
|
+
this.dragTarget.index = newDefs[dropTargetIndex].index; // + 1
|
|
1149
|
+
newDefs.push(this.dragTarget);
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
newDefs
|
|
1153
|
+
.sort((a, b) => a.index - b.index)
|
|
1154
|
+
.forEach((element, index) => {
|
|
1155
|
+
element.index = index;
|
|
1156
|
+
});
|
|
1157
|
+
this.dragTarget = null;
|
|
1158
|
+
this._setNewPinningState();
|
|
1159
|
+
this.updateDefsBasedOnPinning();
|
|
1160
|
+
this.unfocus();
|
|
1161
|
+
this.columnDefs = newDefs;
|
|
1162
|
+
// this.forceVisibilityUpdate();
|
|
1163
|
+
};
|
|
1164
|
+
copyHighlightedRowsToClipboard = async () => {
|
|
1165
|
+
if (!navigator.clipboard) {
|
|
1166
|
+
alert('cannot copy in an insecure connection');
|
|
1167
|
+
return;
|
|
1168
|
+
}
|
|
1169
|
+
return this._performRowCopy(await this.getHighlightedRowData());
|
|
1170
|
+
};
|
|
1171
|
+
copyDataToClipboard = async () => {
|
|
1172
|
+
if (!navigator.clipboard) {
|
|
1173
|
+
alert('cannot copy in an insecure connection');
|
|
1174
|
+
return;
|
|
1175
|
+
}
|
|
1176
|
+
return this._performRowCopy(await this.getFocusElementData());
|
|
1177
|
+
};
|
|
1178
|
+
_performRowCopy = async ({ items, indicesByItem, focusedElementData, affectedColumns }) => {
|
|
1179
|
+
const focusedColumnIds = affectedColumns.map((it) => encapsulate(typeof it.header === 'string' ? it.header : it.id));
|
|
1180
|
+
const value = await (async () => {
|
|
1181
|
+
const selectColumns = new Map();
|
|
1182
|
+
for (let i = affectedColumns.length - 1; i > -1; i--) {
|
|
1183
|
+
const col = affectedColumns[i];
|
|
1184
|
+
if (col instanceof SelectDef) {
|
|
1185
|
+
const item = items[i];
|
|
1186
|
+
selectColumns.set(i, await col.getOptions(item, indicesByItem.get(item)));
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
const separator = this.commaSeparatedCopy ? ',' : '\t';
|
|
1190
|
+
const shouldCopyHeaders = this.copyWithHeaders &&
|
|
1191
|
+
(focusedElementData.length !== 1 || focusedElementData[0].length !== 1);
|
|
1192
|
+
// transform to TSV
|
|
1193
|
+
if (focusedElementData.length === 1 && focusedElementData[0].length === 1) {
|
|
1194
|
+
if (selectColumns.has(0)) {
|
|
1195
|
+
const columnOptions = selectColumns.get(0);
|
|
1196
|
+
const value = columnOptions.find((it) => it.value === focusedElementData[0][0])?.label ??
|
|
1197
|
+
focusedElementData[0][0]?.toString() ??
|
|
1198
|
+
'';
|
|
1199
|
+
return value;
|
|
1200
|
+
}
|
|
1201
|
+
else {
|
|
1202
|
+
const value = focusedElementData[0][0]?.toString().trim() ?? '';
|
|
1203
|
+
return value;
|
|
1204
|
+
}
|
|
1205
|
+
}
|
|
1206
|
+
return `${shouldCopyHeaders ? `${focusedColumnIds.join(separator)}\n` : ''}${focusedElementData
|
|
1207
|
+
.map((it) => it
|
|
1208
|
+
.map((toCopy, i) => {
|
|
1209
|
+
if (toCopy instanceof Date) {
|
|
1210
|
+
return toCopy.toLocaleDateString();
|
|
1211
|
+
}
|
|
1212
|
+
if (selectColumns.has(i)) {
|
|
1213
|
+
const columnOptions = selectColumns.get(i);
|
|
1214
|
+
const value = columnOptions.find((it) => it.value === toCopy)?.label ??
|
|
1215
|
+
toCopy?.toString() ??
|
|
1216
|
+
'';
|
|
1217
|
+
return encapsulate(value);
|
|
1218
|
+
}
|
|
1219
|
+
else {
|
|
1220
|
+
const value = toCopy?.toString().trim() ?? '';
|
|
1221
|
+
return encapsulate(value);
|
|
1222
|
+
}
|
|
1223
|
+
})
|
|
1224
|
+
.join(separator))
|
|
1225
|
+
.join('\n')}`;
|
|
1226
|
+
})();
|
|
1227
|
+
navigator.clipboard.writeText(value ?? '');
|
|
1228
|
+
};
|
|
1229
|
+
startFocus = (coords) => {
|
|
1230
|
+
this.isMousingDown = true;
|
|
1231
|
+
this.moveFocus(coords);
|
|
1232
|
+
};
|
|
1233
|
+
moveFocus = (coords, startEditing = false) => {
|
|
1234
|
+
this.focusStart = { ...coords };
|
|
1235
|
+
this.focusEnd = { ...coords };
|
|
1236
|
+
if (startEditing) {
|
|
1237
|
+
tick().then(() => {
|
|
1238
|
+
this.focusStartIsBeingEdited = true;
|
|
1239
|
+
});
|
|
1240
|
+
}
|
|
1241
|
+
};
|
|
1242
|
+
unfocus = () => {
|
|
1243
|
+
this.focusStartIsBeingEdited = false;
|
|
1244
|
+
this.focusStart = null;
|
|
1245
|
+
this.focusEnd = null;
|
|
1246
|
+
};
|
|
1247
|
+
focusToTop = () => {
|
|
1248
|
+
if (!this.allowCopy) {
|
|
1249
|
+
return;
|
|
1250
|
+
}
|
|
1251
|
+
this._moveFocusEndRow(-Infinity);
|
|
1252
|
+
};
|
|
1253
|
+
focusToBottom = () => {
|
|
1254
|
+
if (!this.allowCopy) {
|
|
1255
|
+
return;
|
|
1256
|
+
}
|
|
1257
|
+
this._moveFocusEndRow(Infinity);
|
|
1258
|
+
};
|
|
1259
|
+
moveToBottom = () => {
|
|
1260
|
+
this._moveFocusRow(Infinity);
|
|
1261
|
+
};
|
|
1262
|
+
moveToTop = () => {
|
|
1263
|
+
this._moveFocusRow(-Infinity);
|
|
1264
|
+
};
|
|
1265
|
+
moveFocusUp = () => {
|
|
1266
|
+
if (!this.allowCopy) {
|
|
1267
|
+
return;
|
|
1268
|
+
}
|
|
1269
|
+
this._moveFocusEndRow(-1);
|
|
1270
|
+
};
|
|
1271
|
+
setFocusUp = () => {
|
|
1272
|
+
this._moveFocusRow(-1);
|
|
1273
|
+
};
|
|
1274
|
+
tabForward = () => {
|
|
1275
|
+
if (!this.allowCopy) {
|
|
1276
|
+
return;
|
|
1277
|
+
}
|
|
1278
|
+
const defs = this.columnDefs;
|
|
1279
|
+
const visibility = this.columnVisibility;
|
|
1280
|
+
const indexBounds = defs.length;
|
|
1281
|
+
const rowBounds = this.sortedData.length;
|
|
1282
|
+
if (!this.focusStart || !rowBounds) {
|
|
1283
|
+
return;
|
|
1284
|
+
}
|
|
1285
|
+
let { column: index, row } = this.focusStart;
|
|
1286
|
+
++index;
|
|
1287
|
+
while (row < rowBounds) {
|
|
1288
|
+
while (index < indexBounds) {
|
|
1289
|
+
const newId = defs[index].id;
|
|
1290
|
+
if (newId && visibility[newId] !== false) {
|
|
1291
|
+
this.moveFocus({ id: newId, row, column: index }, this.focusStartIsBeingEdited);
|
|
1292
|
+
return;
|
|
1293
|
+
}
|
|
1294
|
+
++index;
|
|
1295
|
+
}
|
|
1296
|
+
index = 0;
|
|
1297
|
+
++row;
|
|
1298
|
+
}
|
|
1299
|
+
};
|
|
1300
|
+
tabBackward = () => {
|
|
1301
|
+
if (!this.allowCopy) {
|
|
1302
|
+
return;
|
|
1303
|
+
}
|
|
1304
|
+
const maxIndexRight = this.columnDefs.length - 1;
|
|
1305
|
+
const defs = this.columnDefs;
|
|
1306
|
+
const visibility = this.columnVisibility;
|
|
1307
|
+
if (!this.focusStart) {
|
|
1308
|
+
return;
|
|
1309
|
+
}
|
|
1310
|
+
let { column: index, row } = this.focusStart;
|
|
1311
|
+
--index;
|
|
1312
|
+
while (row > -1) {
|
|
1313
|
+
while (index > -1) {
|
|
1314
|
+
const newId = defs[index].id;
|
|
1315
|
+
if (newId && visibility[newId] !== false) {
|
|
1316
|
+
this.moveFocus({ id: newId, row, column: index }, this.focusStartIsBeingEdited);
|
|
1317
|
+
return;
|
|
1318
|
+
}
|
|
1319
|
+
--index;
|
|
1320
|
+
}
|
|
1321
|
+
index = maxIndexRight;
|
|
1322
|
+
--row;
|
|
1323
|
+
}
|
|
1324
|
+
};
|
|
1325
|
+
focusToStart = () => {
|
|
1326
|
+
if (!this.allowCopy) {
|
|
1327
|
+
return;
|
|
1328
|
+
}
|
|
1329
|
+
if (!this.focusEnd) {
|
|
1330
|
+
return null;
|
|
1331
|
+
}
|
|
1332
|
+
const visibility = this.columnVisibility;
|
|
1333
|
+
const columnDefs = this.columnDefs;
|
|
1334
|
+
const currentIndex = this.focusEnd.column;
|
|
1335
|
+
let index = 0;
|
|
1336
|
+
while (index < currentIndex) {
|
|
1337
|
+
const newId = columnDefs[index].id;
|
|
1338
|
+
if (newId && visibility[newId] !== false) {
|
|
1339
|
+
this.focusEnd = { ...this.focusEnd, column: index };
|
|
1340
|
+
return;
|
|
1341
|
+
}
|
|
1342
|
+
++index;
|
|
1343
|
+
}
|
|
1344
|
+
};
|
|
1345
|
+
moveToStart = () => {
|
|
1346
|
+
if (!this.focusStart)
|
|
1347
|
+
return;
|
|
1348
|
+
const visibility = this.columnVisibility;
|
|
1349
|
+
const columnDefs = this.columnDefs;
|
|
1350
|
+
const current = this.focusStart.column;
|
|
1351
|
+
let index = 0;
|
|
1352
|
+
while (index < current) {
|
|
1353
|
+
const newId = columnDefs[index].id;
|
|
1354
|
+
if (newId && visibility[newId] !== false) {
|
|
1355
|
+
this.moveFocus({ ...this.focusStart, id: newId, column: index });
|
|
1356
|
+
return;
|
|
1357
|
+
}
|
|
1358
|
+
++index;
|
|
1359
|
+
}
|
|
1360
|
+
//otherwise return without doing anything
|
|
1361
|
+
};
|
|
1362
|
+
focusToEnd = () => {
|
|
1363
|
+
if (!this.allowCopy) {
|
|
1364
|
+
return;
|
|
1365
|
+
}
|
|
1366
|
+
if (!this.focusEnd)
|
|
1367
|
+
return null;
|
|
1368
|
+
const current = this.focusEnd;
|
|
1369
|
+
const visibility = this.columnVisibility;
|
|
1370
|
+
const columnDefs = this.columnDefs;
|
|
1371
|
+
const currentIndex = current.column;
|
|
1372
|
+
let index = columnDefs.length - 1;
|
|
1373
|
+
while (index > currentIndex) {
|
|
1374
|
+
const newId = columnDefs[index].id;
|
|
1375
|
+
if (newId && visibility[newId] !== false) {
|
|
1376
|
+
this.focusEnd = { ...this.focusEnd, column: index };
|
|
1377
|
+
return;
|
|
1378
|
+
}
|
|
1379
|
+
--index;
|
|
1380
|
+
}
|
|
1381
|
+
this.focusEnd = current;
|
|
1382
|
+
};
|
|
1383
|
+
moveToEnd = () => {
|
|
1384
|
+
if (!this.focusStart)
|
|
1385
|
+
return;
|
|
1386
|
+
const visibility = this.columnVisibility;
|
|
1387
|
+
const columnDefs = this.columnDefs;
|
|
1388
|
+
const current = this.focusStart.column;
|
|
1389
|
+
let index = columnDefs.length - 1;
|
|
1390
|
+
while (index > current) {
|
|
1391
|
+
const newId = columnDefs[index].id;
|
|
1392
|
+
if (newId && visibility[newId] !== false) {
|
|
1393
|
+
this.moveFocus({ ...this.focusStart, id: newId, column: index });
|
|
1394
|
+
return;
|
|
1395
|
+
}
|
|
1396
|
+
--index;
|
|
1397
|
+
}
|
|
1398
|
+
//otherwise return without doing anything
|
|
1399
|
+
};
|
|
1400
|
+
moveFocusDown = () => {
|
|
1401
|
+
if (!this.allowCopy) {
|
|
1402
|
+
return;
|
|
1403
|
+
}
|
|
1404
|
+
this._moveFocusEndRow(1);
|
|
1405
|
+
};
|
|
1406
|
+
setFocusDown = () => {
|
|
1407
|
+
this._moveFocusRow(1);
|
|
1408
|
+
};
|
|
1409
|
+
moveFocusLeft = () => {
|
|
1410
|
+
if (!this.allowCopy) {
|
|
1411
|
+
return;
|
|
1412
|
+
}
|
|
1413
|
+
if (this.focusEnd != null) {
|
|
1414
|
+
const visibility = this.columnVisibility;
|
|
1415
|
+
let index = this.focusEnd.column - 1;
|
|
1416
|
+
while (index > -1) {
|
|
1417
|
+
const newId = this.columnDefs[index].id;
|
|
1418
|
+
if (newId && visibility[newId] !== false) {
|
|
1419
|
+
this.focusEnd = { ...this.focusEnd, column: index };
|
|
1420
|
+
return;
|
|
1421
|
+
}
|
|
1422
|
+
--index;
|
|
1423
|
+
}
|
|
1424
|
+
}
|
|
1425
|
+
};
|
|
1426
|
+
setFocusLeft = () => {
|
|
1427
|
+
if (!this.focusStart)
|
|
1428
|
+
return;
|
|
1429
|
+
if (this.focusStart != null) {
|
|
1430
|
+
const visibility = this.columnVisibility;
|
|
1431
|
+
const columnDefs = this.columnDefs;
|
|
1432
|
+
let index = this.focusStart.column - 1;
|
|
1433
|
+
while (index > -1) {
|
|
1434
|
+
const newId = columnDefs[index].id;
|
|
1435
|
+
if (newId && visibility[newId] !== false) {
|
|
1436
|
+
this.moveFocus({ ...this.focusStart, id: newId, column: index });
|
|
1437
|
+
return;
|
|
1438
|
+
}
|
|
1439
|
+
--index;
|
|
1440
|
+
}
|
|
1441
|
+
//otherwise return without doing anything
|
|
1442
|
+
}
|
|
1443
|
+
};
|
|
1444
|
+
moveFocusRight = () => {
|
|
1445
|
+
if (!this.allowCopy) {
|
|
1446
|
+
return;
|
|
1447
|
+
}
|
|
1448
|
+
if (this.focusEnd != null) {
|
|
1449
|
+
const visibility = this.columnVisibility;
|
|
1450
|
+
const columnDefs = this.columnDefs;
|
|
1451
|
+
const upperBounds = columnDefs.length;
|
|
1452
|
+
let index = this.focusEnd.column + 1;
|
|
1453
|
+
while (index < upperBounds) {
|
|
1454
|
+
const newId = columnDefs[index].id;
|
|
1455
|
+
if (newId && visibility[newId] !== false) {
|
|
1456
|
+
this.focusEnd = { ...this.focusEnd, column: index };
|
|
1457
|
+
return;
|
|
1458
|
+
}
|
|
1459
|
+
++index;
|
|
1460
|
+
}
|
|
1461
|
+
}
|
|
1462
|
+
};
|
|
1463
|
+
setFocusRight = () => {
|
|
1464
|
+
if (!this.focusStart)
|
|
1465
|
+
return;
|
|
1466
|
+
if (this.focusStart != null) {
|
|
1467
|
+
const visibility = this.columnVisibility;
|
|
1468
|
+
const columnDefs = this.columnDefs;
|
|
1469
|
+
const upperBounds = columnDefs.length;
|
|
1470
|
+
let index = this.focusStart.column + 1;
|
|
1471
|
+
while (index < upperBounds) {
|
|
1472
|
+
const newId = columnDefs[index].id;
|
|
1473
|
+
if (newId && visibility[newId] !== false) {
|
|
1474
|
+
this.moveFocus({ ...this.focusStart, id: newId, column: index });
|
|
1475
|
+
return;
|
|
1476
|
+
}
|
|
1477
|
+
++index;
|
|
1478
|
+
}
|
|
1479
|
+
//otherwise return without doing anything
|
|
1480
|
+
}
|
|
1481
|
+
};
|
|
1482
|
+
endFocus = (coords) => {
|
|
1483
|
+
if (this.isMousingDown) {
|
|
1484
|
+
this.isMousingDown = false;
|
|
1485
|
+
if (!this.allowCopy) {
|
|
1486
|
+
return;
|
|
1487
|
+
}
|
|
1488
|
+
this.focusEnd = { ...coords };
|
|
1489
|
+
}
|
|
1490
|
+
};
|
|
1491
|
+
setIsCompact = (value) => {
|
|
1492
|
+
this.isCompact = value;
|
|
1493
|
+
this._updateLocalStorageSettings();
|
|
1494
|
+
};
|
|
1495
|
+
setAlternateRowColours = (value) => {
|
|
1496
|
+
this.alternateRowColours = value;
|
|
1497
|
+
this._updateLocalStorageSettings();
|
|
1498
|
+
};
|
|
1499
|
+
setSingleClickEditing = (value) => {
|
|
1500
|
+
this.singleClickEditing = value;
|
|
1501
|
+
this._updateLocalStorageSettings();
|
|
1502
|
+
};
|
|
1503
|
+
setChangeColourOnHover = (value) => {
|
|
1504
|
+
this.changeColourOnHover = value;
|
|
1505
|
+
this._updateLocalStorageSettings();
|
|
1506
|
+
};
|
|
1507
|
+
setCopyWithHeaders = (value) => {
|
|
1508
|
+
if (this.allowCopy) {
|
|
1509
|
+
this.copyWithHeaders = value;
|
|
1510
|
+
this._updateLocalStorageSettings();
|
|
1511
|
+
}
|
|
1512
|
+
};
|
|
1513
|
+
setCommaSeparatedCopy = (value) => {
|
|
1514
|
+
if (this.allowCopy) {
|
|
1515
|
+
this.commaSeparatedCopy = value;
|
|
1516
|
+
this._updateLocalStorageSettings();
|
|
1517
|
+
}
|
|
1518
|
+
};
|
|
1519
|
+
// /**
|
|
1520
|
+
// * HACK no idea why but this is necessary in order to fix columns that start out as invisibile
|
|
1521
|
+
// */
|
|
1522
|
+
// public readonly forceVisibilityUpdate = () => {
|
|
1523
|
+
// // alert('force visibility update');
|
|
1524
|
+
// if (browser) {
|
|
1525
|
+
// tick().then(() => {
|
|
1526
|
+
// this.showSelectedOnly = !this.showSelectedOnly;
|
|
1527
|
+
// this.showSelectedOnly = !this.showSelectedOnly;
|
|
1528
|
+
// // this.columnDefs = this.columnDefs.concat();
|
|
1529
|
+
// });
|
|
1530
|
+
// }
|
|
1531
|
+
// };
|
|
1532
|
+
setSelectedPreset = (preset) => {
|
|
1533
|
+
this.columnDefs = preset.columnDefs;
|
|
1534
|
+
if (preset.sortingState) {
|
|
1535
|
+
if (!this.paginationRepo?.updateSorting && dev) {
|
|
1536
|
+
alert('no sorting state found');
|
|
1537
|
+
}
|
|
1538
|
+
this.paginationRepo?.updateSorting?.(preset.sortingState);
|
|
1539
|
+
}
|
|
1540
|
+
if (preset.visibilityState) {
|
|
1541
|
+
this.columnVisibility = preset.visibilityState;
|
|
1542
|
+
}
|
|
1543
|
+
if (preset.columnPinningState) {
|
|
1544
|
+
this.columnPinning = preset.columnPinningState;
|
|
1545
|
+
}
|
|
1546
|
+
this.selectedPreset = preset;
|
|
1547
|
+
localStorage.setItem(`${this.userId}-${this.tableName}-selected-preset-name`, preset.name);
|
|
1548
|
+
};
|
|
1549
|
+
saveColumnPreset = (name) => {
|
|
1550
|
+
if (!name) {
|
|
1551
|
+
return;
|
|
1552
|
+
}
|
|
1553
|
+
const visibilityState = this.columnVisibility;
|
|
1554
|
+
const columnPinningState = this.columnPinning;
|
|
1555
|
+
const columnDefs = this.columnDefs;
|
|
1556
|
+
const sortingState = (this.paginationRepo && this.paginationRepo.sorting) || [];
|
|
1557
|
+
const newPreset = { columnDefs, name, visibilityState, columnPinningState, sortingState };
|
|
1558
|
+
const lowercasePresetname = name.toLocaleLowerCase();
|
|
1559
|
+
const indexToReplace = this.columnPresets.findIndex((oldPreset) => oldPreset.name.toLocaleLowerCase() === lowercasePresetname);
|
|
1560
|
+
const newPresets = this.columnPresets.concat();
|
|
1561
|
+
if (indexToReplace > -1) {
|
|
1562
|
+
newPresets[indexToReplace] = newPreset;
|
|
1563
|
+
}
|
|
1564
|
+
else {
|
|
1565
|
+
newPresets.push(newPreset);
|
|
1566
|
+
}
|
|
1567
|
+
this.columnPresets = newPresets;
|
|
1568
|
+
const stringified = JSON.stringify(newPresets);
|
|
1569
|
+
localStorage.setItem(`${this.userId}-${this.tableName}-presets`, stringified);
|
|
1570
|
+
this.setSelectedPreset(newPreset);
|
|
1571
|
+
};
|
|
1572
|
+
/**
|
|
1573
|
+
* This listener should be added and removed based on isMousingDown
|
|
1574
|
+
*/
|
|
1575
|
+
setFocusEnd = (coords) => {
|
|
1576
|
+
if (!this.allowCopy) {
|
|
1577
|
+
return;
|
|
1578
|
+
}
|
|
1579
|
+
this.focusEnd = coords;
|
|
1580
|
+
};
|
|
1581
|
+
// #region private methods
|
|
1582
|
+
columnDefReturnsTextValue = (it) => {
|
|
1583
|
+
if (!this.dataRepo) {
|
|
1584
|
+
return false;
|
|
1585
|
+
}
|
|
1586
|
+
return ('index' in it &&
|
|
1587
|
+
this.columnVisibility[it.id] !== false &&
|
|
1588
|
+
(it.columnType === undefined ||
|
|
1589
|
+
it.columnType === 'Accessor' ||
|
|
1590
|
+
//only include it if it returns some kind of tangible value instead of a custom component
|
|
1591
|
+
('accessorFn' in it && typeof it.accessorFn?.(this.sortedData[0], 0) != 'function')));
|
|
1592
|
+
};
|
|
1593
|
+
_updateLocalStorageSettings() {
|
|
1594
|
+
const isCompact = this.isCompact;
|
|
1595
|
+
const singleClickEditing = this.singleClickEditing;
|
|
1596
|
+
const alternateRowColours = this.alternateRowColours;
|
|
1597
|
+
const copyWithHeaders = this.copyWithHeaders;
|
|
1598
|
+
const commaSeparatedCopy = this.commaSeparatedCopy;
|
|
1599
|
+
const changeColourOnHover = this.changeColourOnHover;
|
|
1600
|
+
const settingsObject = {
|
|
1601
|
+
isCompact,
|
|
1602
|
+
singleClickEditing,
|
|
1603
|
+
alternateRowColours,
|
|
1604
|
+
changeColourOnHover,
|
|
1605
|
+
copyWithHeaders,
|
|
1606
|
+
commaSeparatedCopy
|
|
1607
|
+
};
|
|
1608
|
+
localStorage.setItem(`${this.userId}-${this.tableName}-settings`, JSON.stringify(settingsObject));
|
|
1609
|
+
}
|
|
1610
|
+
_moveFocusEndRow(offset) {
|
|
1611
|
+
if (!this.allowCopy) {
|
|
1612
|
+
return;
|
|
1613
|
+
}
|
|
1614
|
+
if (!this.focusEnd) {
|
|
1615
|
+
if (dev) {
|
|
1616
|
+
console.warn('no current found');
|
|
1617
|
+
}
|
|
1618
|
+
return;
|
|
1619
|
+
}
|
|
1620
|
+
const rows = this.paginationRowModel.rows;
|
|
1621
|
+
const endRowIndex = rows.findIndex((row) => row.index === this.focusEnd.row);
|
|
1622
|
+
this.focusEnd = {
|
|
1623
|
+
...this.focusEnd,
|
|
1624
|
+
row: rows[Math.max(Math.min(endRowIndex + offset, rows.length - 1), 0)].index
|
|
1625
|
+
};
|
|
1626
|
+
}
|
|
1627
|
+
_moveFocusRow(offset) {
|
|
1628
|
+
if (!this.focusStart) {
|
|
1629
|
+
if (dev) {
|
|
1630
|
+
console.warn('no this.focusStart found');
|
|
1631
|
+
}
|
|
1632
|
+
return null;
|
|
1633
|
+
}
|
|
1634
|
+
const newEndRowIndex = (() => {
|
|
1635
|
+
const rows = this.paginationRowModel.rows;
|
|
1636
|
+
const endRowIndex = rows.findIndex((row) => row.index === this.focusStart.row);
|
|
1637
|
+
return rows[Math.max(Math.min(endRowIndex + offset, rows.length - 1), 0)].index;
|
|
1638
|
+
})();
|
|
1639
|
+
this.moveFocus({ ...this.focusStart, row: newEndRowIndex });
|
|
1640
|
+
}
|
|
1641
|
+
_recalculateFocusedElements() {
|
|
1642
|
+
if (!this.focusStart || !this.focusEnd) {
|
|
1643
|
+
this.focusedRowIndexIds = new SvelteSet();
|
|
1644
|
+
this.focusedColumnIds = new SvelteSet();
|
|
1645
|
+
return;
|
|
1646
|
+
}
|
|
1647
|
+
const { row: startRowIndexId, column: startColumnIndex } = this.focusStart;
|
|
1648
|
+
const { row: endRowIndexId, column: endColumnIndex } = this.focusEnd;
|
|
1649
|
+
const model = this.sortedRowModel;
|
|
1650
|
+
const startRowIndex = model?.rows.findIndex((row) => row.index === startRowIndexId) ?? -1;
|
|
1651
|
+
const endRowIndex = model?.rows.findIndex((row) => row.index === endRowIndexId) ?? -1;
|
|
1652
|
+
if (!model || startRowIndex == -1 || endRowIndex == -1) {
|
|
1653
|
+
return;
|
|
1654
|
+
}
|
|
1655
|
+
const minRowIndex = Math.min(startRowIndex, endRowIndex);
|
|
1656
|
+
const maxRowIndex = Math.max(startRowIndex, endRowIndex);
|
|
1657
|
+
const minColumnIndex = Math.min(startColumnIndex, endColumnIndex);
|
|
1658
|
+
const maxColumnIndex = Math.max(startColumnIndex, endColumnIndex);
|
|
1659
|
+
const affectedColumns = new SvelteSet();
|
|
1660
|
+
const visibility = this.columnVisibility;
|
|
1661
|
+
this.columnDefs
|
|
1662
|
+
.filter((it) => 'index' in it &&
|
|
1663
|
+
visibility[it.id] !== false &&
|
|
1664
|
+
// TODO handle pinning behaviour
|
|
1665
|
+
// !columnPinning.left?.includes(it.id) &&
|
|
1666
|
+
// !columnPinning.right?.includes(it.id) &&
|
|
1667
|
+
// (!('columnType' in it) || it.columnType === undefined || it.columnType === 'Accessor') &&
|
|
1668
|
+
it.index >= minColumnIndex &&
|
|
1669
|
+
it.index <= maxColumnIndex)
|
|
1670
|
+
.forEach((it) => affectedColumns.add(it.id));
|
|
1671
|
+
const indeces = new SvelteSet();
|
|
1672
|
+
for (let i = minRowIndex; i <= maxRowIndex; i++) {
|
|
1673
|
+
indeces.add(parseInt(model.rows[i].id));
|
|
1674
|
+
}
|
|
1675
|
+
this.focusedRowIndexIds = indeces;
|
|
1676
|
+
this.focusedColumnIds = affectedColumns;
|
|
1677
|
+
}
|
|
1678
|
+
async getHighlightedRowData() {
|
|
1679
|
+
if (!this.dataRepo) {
|
|
1680
|
+
throw new Error('No data found');
|
|
1681
|
+
}
|
|
1682
|
+
const affectedColumns = this.columnDefs.filter(this.columnDefReturnsTextValue);
|
|
1683
|
+
const indices = new Map();
|
|
1684
|
+
const selectedRows = [...this.highlightedItems.values()];
|
|
1685
|
+
for (const item of selectedRows) {
|
|
1686
|
+
const rowIndex = this.sortedData.indexOf(item);
|
|
1687
|
+
if (rowIndex == -1) {
|
|
1688
|
+
// eslint-disable-next-line no-debugger
|
|
1689
|
+
debugger;
|
|
1690
|
+
}
|
|
1691
|
+
indices.set(item, rowIndex);
|
|
1692
|
+
}
|
|
1693
|
+
// TODO somewhere between here and the ending of the copy functionality, we end up with issues where instead of it using the accessor fn, it tries to pick up the select option, and ends up using the value ("1", etc)
|
|
1694
|
+
const selectedCells = [];
|
|
1695
|
+
const rowLength = selectedRows.length;
|
|
1696
|
+
for (let rowIndex = 0; rowIndex < rowLength; rowIndex++) {
|
|
1697
|
+
const item = selectedRows[rowIndex];
|
|
1698
|
+
const key = this.selectionExtractor?.(item);
|
|
1699
|
+
selectedCells[rowIndex] = [];
|
|
1700
|
+
const targetRow = selectedCells[rowIndex];
|
|
1701
|
+
const colLength = affectedColumns.length;
|
|
1702
|
+
for (let colIndex = 0; colIndex < colLength; colIndex++) {
|
|
1703
|
+
const col = affectedColumns[colIndex];
|
|
1704
|
+
if (col instanceof RowSelectionDef) {
|
|
1705
|
+
targetRow.push(key !== undefined && this.selectedItems.has(key) ? 'true' : 'false');
|
|
1706
|
+
continue;
|
|
1707
|
+
}
|
|
1708
|
+
const x = 'accessorFn' in col && (await col.accessorFn?.(item, this.sortedData.indexOf(item)));
|
|
1709
|
+
if (x && typeof x === 'string') {
|
|
1710
|
+
targetRow.push(x);
|
|
1711
|
+
continue;
|
|
1712
|
+
}
|
|
1713
|
+
if (x && Array.isArray(x) && typeof x[0] === 'string') {
|
|
1714
|
+
targetRow.push(x.join(', '));
|
|
1715
|
+
continue;
|
|
1716
|
+
}
|
|
1717
|
+
const toCopy = col.id && col.id in item ? item[col.id] : null;
|
|
1718
|
+
const y = toCopy && typeof toCopy === 'object' && toCopy instanceof Date
|
|
1719
|
+
? toCopy.toLocaleDateString()
|
|
1720
|
+
: (toCopy?.toString() ?? '');
|
|
1721
|
+
targetRow.push(y);
|
|
1722
|
+
}
|
|
1723
|
+
}
|
|
1724
|
+
return {
|
|
1725
|
+
items: selectedRows,
|
|
1726
|
+
indicesByItem: indices,
|
|
1727
|
+
focusedElementData: selectedCells,
|
|
1728
|
+
affectedColumns
|
|
1729
|
+
};
|
|
1730
|
+
}
|
|
1731
|
+
async getFocusElementData() {
|
|
1732
|
+
if (this.focusStart && this.focusEnd) {
|
|
1733
|
+
const { row: startRowIndexId, column: startColumnIndex } = this.focusStart;
|
|
1734
|
+
const { row: endRowIndexId, column: endColumnIndex } = this.focusEnd;
|
|
1735
|
+
const model = this.sortedRowModel;
|
|
1736
|
+
const startRowIndex = model?.rows.findIndex((row) => row.index === startRowIndexId) ?? -1;
|
|
1737
|
+
const endRowIndex = model?.rows.findIndex((row) => row.index === endRowIndexId) ?? -1;
|
|
1738
|
+
if (!this.dataRepo || startRowIndex == -1 || endRowIndex == -1) {
|
|
1739
|
+
if (dev) {
|
|
1740
|
+
console.warn('was missing one of the two indices');
|
|
1741
|
+
// eslint-disable-next-line no-debugger
|
|
1742
|
+
debugger;
|
|
1743
|
+
}
|
|
1744
|
+
throw new Error(`copy was missing one of the two indices. First: ${startRowIndex}, second: ${endRowIndex}`);
|
|
1745
|
+
}
|
|
1746
|
+
const minRowIndex = Math.min(startRowIndex, endRowIndex);
|
|
1747
|
+
const maxRowIndex = Math.max(startRowIndex, endRowIndex);
|
|
1748
|
+
const minColumnIndex = Math.min(startColumnIndex, endColumnIndex);
|
|
1749
|
+
const maxColumnIndex = Math.max(startColumnIndex, endColumnIndex);
|
|
1750
|
+
const affectedColumns = this.columnDefs.filter((it) => {
|
|
1751
|
+
return (it.index >= minColumnIndex &&
|
|
1752
|
+
it.index <= maxColumnIndex &&
|
|
1753
|
+
this.columnDefReturnsTextValue(it));
|
|
1754
|
+
});
|
|
1755
|
+
const selectedRows = [];
|
|
1756
|
+
// eslint-disable-next-line svelte/prefer-svelte-reactivity
|
|
1757
|
+
const indices = new Map();
|
|
1758
|
+
for (let i = minRowIndex; i <= maxRowIndex; i++) {
|
|
1759
|
+
const itemIndex = model.rows[i].index;
|
|
1760
|
+
const item = this.sortedData[itemIndex];
|
|
1761
|
+
selectedRows.push(item);
|
|
1762
|
+
indices.set(item, itemIndex);
|
|
1763
|
+
}
|
|
1764
|
+
// TODO somewhere between here and the ending of the copy functionality, we end up with issues where instead of it using the accessor fn, it tries to pick up the select option, and ends up using the value ("1", etc)
|
|
1765
|
+
const selectedCells = [];
|
|
1766
|
+
const rowLength = selectedRows.length;
|
|
1767
|
+
for (let rowIndex = 0; rowIndex < rowLength; rowIndex++) {
|
|
1768
|
+
const item = selectedRows[rowIndex];
|
|
1769
|
+
const key = this.selectionExtractor?.(item);
|
|
1770
|
+
selectedCells[rowIndex] = [];
|
|
1771
|
+
const targetRow = selectedCells[rowIndex];
|
|
1772
|
+
const colLength = affectedColumns.length;
|
|
1773
|
+
for (let colIndex = 0; colIndex < colLength; colIndex++) {
|
|
1774
|
+
const col = affectedColumns[colIndex];
|
|
1775
|
+
if (col.columnType === ColumnType.RowSelect) {
|
|
1776
|
+
targetRow.push(key !== undefined && this.selectedItems.has(key) ? 'true' : 'false');
|
|
1777
|
+
continue;
|
|
1778
|
+
}
|
|
1779
|
+
const x = 'accessorFn' in col && (await col.accessorFn?.(item, this.sortedData.indexOf(item)));
|
|
1780
|
+
if (x && typeof x === 'string') {
|
|
1781
|
+
targetRow.push(x);
|
|
1782
|
+
continue;
|
|
1783
|
+
}
|
|
1784
|
+
if (x && Array.isArray(x) && typeof x[0] === 'string') {
|
|
1785
|
+
targetRow.push(x.join(', '));
|
|
1786
|
+
continue;
|
|
1787
|
+
}
|
|
1788
|
+
const toCopy = col.id && col.id in item ? item[col.id] : null;
|
|
1789
|
+
const y = toCopy && typeof toCopy === 'object' && toCopy instanceof Date
|
|
1790
|
+
? toCopy.toLocaleDateString()
|
|
1791
|
+
: (toCopy?.toString() ?? '');
|
|
1792
|
+
targetRow.push(y);
|
|
1793
|
+
}
|
|
1794
|
+
}
|
|
1795
|
+
return {
|
|
1796
|
+
items: selectedRows,
|
|
1797
|
+
indicesByItem: indices,
|
|
1798
|
+
focusedElementData: selectedCells,
|
|
1799
|
+
affectedColumns
|
|
1800
|
+
};
|
|
1801
|
+
}
|
|
1802
|
+
return { items: [], indicesByItem: new Map(), focusedElementData: [], affectedColumns: [] };
|
|
1803
|
+
}
|
|
1804
|
+
updateDefsBasedOnPinning = () => {
|
|
1805
|
+
const leftDefs = [];
|
|
1806
|
+
const midDefs = [];
|
|
1807
|
+
const rightDefs = [];
|
|
1808
|
+
this.columnDefs.forEach((def) => {
|
|
1809
|
+
if (this.columnPinning.left?.includes(def.id)) {
|
|
1810
|
+
leftDefs.push(def);
|
|
1811
|
+
}
|
|
1812
|
+
else if (this.columnPinning.right?.includes(def.id)) {
|
|
1813
|
+
rightDefs.push(def);
|
|
1814
|
+
}
|
|
1815
|
+
else {
|
|
1816
|
+
midDefs.push(def);
|
|
1817
|
+
}
|
|
1818
|
+
});
|
|
1819
|
+
leftDefs.sort((a, b) => a.index - b.index);
|
|
1820
|
+
midDefs.sort((a, b) => a.index - b.index);
|
|
1821
|
+
rightDefs.sort((a, b) => a.index - b.index);
|
|
1822
|
+
const allDefs = leftDefs.concat(midDefs, rightDefs);
|
|
1823
|
+
allDefs.forEach((def, index) => {
|
|
1824
|
+
def.index = index;
|
|
1825
|
+
});
|
|
1826
|
+
return allDefs;
|
|
1827
|
+
};
|
|
1828
|
+
assertNoDuplicateIds() {
|
|
1829
|
+
const foundIds = new Set();
|
|
1830
|
+
this.defaultColumnDefs.defs.forEach((def) => {
|
|
1831
|
+
if (foundIds.has(def.id)) {
|
|
1832
|
+
throw new Error(`Duplicate Column Definition ID ${def.id} in table ${this.tableName}`);
|
|
1833
|
+
}
|
|
1834
|
+
foundIds.add(def.id);
|
|
1835
|
+
});
|
|
1836
|
+
}
|
|
1837
|
+
async setupDefaultColumnDefs() {
|
|
1838
|
+
// const helper = createColumnHelper<T>();
|
|
1839
|
+
this.assertNoDuplicateIds();
|
|
1840
|
+
const adjustedDefsPromises = this.defaultColumnDefs.defs.map(async (def) => {
|
|
1841
|
+
// extra width for when filtering between values
|
|
1842
|
+
const needsExtraWidth = this.allowQuickFiltering && 'type' in def && def.type === 'Number';
|
|
1843
|
+
const hasNoText = !needsExtraWidth &&
|
|
1844
|
+
(def.columnType === ColumnType.Expand || def.columnType === ColumnType.RowSelect);
|
|
1845
|
+
if (def instanceof AccessorDef) {
|
|
1846
|
+
// if (hasNoDefaultAccessor(temporary)) {
|
|
1847
|
+
// temporary.accessorKey = def.id as string & keyof T;
|
|
1848
|
+
// }
|
|
1849
|
+
if (!('minSize' in def) || !def.minSize) {
|
|
1850
|
+
if (typeof def.header === 'string') {
|
|
1851
|
+
const minWidth = this.measureHeaderWidth(def);
|
|
1852
|
+
def.minSize = minWidth;
|
|
1853
|
+
def.width = Math.max(def.width, minWidth);
|
|
1854
|
+
}
|
|
1855
|
+
else {
|
|
1856
|
+
def.minSize = 120;
|
|
1857
|
+
}
|
|
1858
|
+
}
|
|
1859
|
+
// code smell...
|
|
1860
|
+
if (def instanceof TextInputDef) {
|
|
1861
|
+
def.filterFn = this.stringFilter;
|
|
1862
|
+
}
|
|
1863
|
+
else if (def instanceof NumberInputDef) {
|
|
1864
|
+
def.filterFn = this.numberFilter;
|
|
1865
|
+
}
|
|
1866
|
+
else if (def instanceof SelectDef) {
|
|
1867
|
+
def.filterFn = this.selectFilter;
|
|
1868
|
+
}
|
|
1869
|
+
else if (def instanceof CheckboxDef) {
|
|
1870
|
+
def.filterFn = this.boolFilter;
|
|
1871
|
+
}
|
|
1872
|
+
else if (def instanceof DateInputDef) {
|
|
1873
|
+
def.filterFn = this.dateFilter;
|
|
1874
|
+
}
|
|
1875
|
+
}
|
|
1876
|
+
return def;
|
|
1877
|
+
});
|
|
1878
|
+
const adjustedDefs = (await Promise.all(adjustedDefsPromises))
|
|
1879
|
+
.sort((a, b) => a.index - b.index)
|
|
1880
|
+
.map((def, index) => {
|
|
1881
|
+
def.index = index;
|
|
1882
|
+
return def;
|
|
1883
|
+
});
|
|
1884
|
+
this.columnDefs = adjustedDefs;
|
|
1885
|
+
return adjustedDefs;
|
|
1886
|
+
}
|
|
1887
|
+
_getUserDefaults() {
|
|
1888
|
+
const savedSettings = localStorage.getItem(`${this.userId}-${this.tableName}-settings`);
|
|
1889
|
+
if (savedSettings) {
|
|
1890
|
+
const saved = JSON.parse(savedSettings);
|
|
1891
|
+
this.singleClickEditing = saved.singleClickEditing ?? true;
|
|
1892
|
+
if (saved.alternateRowColours) {
|
|
1893
|
+
this.alternateRowColours = true;
|
|
1894
|
+
}
|
|
1895
|
+
if (saved.commaSeparatedCopy) {
|
|
1896
|
+
this.commaSeparatedCopy = true;
|
|
1897
|
+
}
|
|
1898
|
+
// these are true by default so we only want to alter them if the user wants them disabled
|
|
1899
|
+
if (saved.isCompact === false) {
|
|
1900
|
+
this.isCompact = false;
|
|
1901
|
+
}
|
|
1902
|
+
if (saved.copyWithHeaders === false) {
|
|
1903
|
+
this.copyWithHeaders = false;
|
|
1904
|
+
}
|
|
1905
|
+
if (saved.changeColourOnHover === false) {
|
|
1906
|
+
this.changeColourOnHover = false;
|
|
1907
|
+
}
|
|
1908
|
+
}
|
|
1909
|
+
else {
|
|
1910
|
+
this.singleClickEditing = true;
|
|
1911
|
+
}
|
|
1912
|
+
}
|
|
1913
|
+
_setNewPinningState() {
|
|
1914
|
+
this.columnPinning = {
|
|
1915
|
+
left: this.columnPinning.left &&
|
|
1916
|
+
this.columnDefs
|
|
1917
|
+
.filter((col) => this.columnPinning.left?.includes(col.id))
|
|
1918
|
+
.map((col) => col.id),
|
|
1919
|
+
right: this.columnPinning.right &&
|
|
1920
|
+
this.columnDefs
|
|
1921
|
+
.filter((col) => this.columnPinning.right?.includes(col.id))
|
|
1922
|
+
.map((col) => col.id)
|
|
1923
|
+
}; // TODO
|
|
1924
|
+
}
|
|
1925
|
+
getToggleSortingHandler = (def) => (e) => {
|
|
1926
|
+
this.paginationRepo?.updateSorting?.((state) => {
|
|
1927
|
+
const newState = state.concat();
|
|
1928
|
+
const index = newState.findIndex((it) => it.id === def.id);
|
|
1929
|
+
if (index > -1) {
|
|
1930
|
+
const found = newState[index];
|
|
1931
|
+
if (found.desc) {
|
|
1932
|
+
newState.splice(index, 1);
|
|
1933
|
+
}
|
|
1934
|
+
else {
|
|
1935
|
+
newState[index] = { ...newState[index], desc: true };
|
|
1936
|
+
}
|
|
1937
|
+
}
|
|
1938
|
+
else {
|
|
1939
|
+
newState.push({
|
|
1940
|
+
desc: false,
|
|
1941
|
+
id: def.id
|
|
1942
|
+
});
|
|
1943
|
+
}
|
|
1944
|
+
return newState;
|
|
1945
|
+
});
|
|
1946
|
+
};
|
|
1947
|
+
async reassignDefsToPresets(presets) {
|
|
1948
|
+
const adjustedDefs = this.columnDefs;
|
|
1949
|
+
const asMap = columnDefsToMap(adjustedDefs);
|
|
1950
|
+
console.log('reassigning presets');
|
|
1951
|
+
presets.forEach((preset) => {
|
|
1952
|
+
preset.columnDefs.forEach((def, index) => {
|
|
1953
|
+
const realDef = def.columnType == ColumnType.RowSelect || def.columnType == ColumnType.Actions
|
|
1954
|
+
? adjustedDefs.find((it) => it.columnType === def.columnType)
|
|
1955
|
+
: asMap.get(def.id);
|
|
1956
|
+
if (!realDef) {
|
|
1957
|
+
throw new Error('Could not find equivalent column def:', { cause: def });
|
|
1958
|
+
}
|
|
1959
|
+
preset.columnDefs[index] = realDef;
|
|
1960
|
+
});
|
|
1961
|
+
});
|
|
1962
|
+
}
|
|
1963
|
+
}
|
|
1964
|
+
// #region static functions
|
|
1965
|
+
function areDefsEquivalent(newColumnDefs, oldColumnDefs) {
|
|
1966
|
+
const defKeys = newColumnDefs.map((def) => def.id);
|
|
1967
|
+
const presetKeys = oldColumnDefs.map((def) => def.id);
|
|
1968
|
+
if (defKeys.length !== presetKeys.length) {
|
|
1969
|
+
return false;
|
|
1970
|
+
}
|
|
1971
|
+
return newColumnDefs.every((newDef) => {
|
|
1972
|
+
if (newDef.columnType == ColumnType.RowSelect || newDef.columnType == ColumnType.Actions) {
|
|
1973
|
+
return true;
|
|
1974
|
+
}
|
|
1975
|
+
const oldDef = oldColumnDefs.find((d) => d.id === newDef.id);
|
|
1976
|
+
if (oldDef === undefined ||
|
|
1977
|
+
newDef.header !== oldDef.header ||
|
|
1978
|
+
newDef.columnType !== oldDef.columnType
|
|
1979
|
+
// ||
|
|
1980
|
+
// newDef.defaultHidden !== oldDef.defaultHidden ||
|
|
1981
|
+
// newDef.enableHiding !== oldDef.enableHiding ||
|
|
1982
|
+
// newDef.enablePinning !== oldDef.enablePinning ||
|
|
1983
|
+
// newDef.enableResizing !== oldDef.enableResizing
|
|
1984
|
+
) {
|
|
1985
|
+
return false;
|
|
1986
|
+
}
|
|
1987
|
+
return true;
|
|
1988
|
+
});
|
|
1989
|
+
}
|
|
1990
|
+
function columnDefsToMap(defs) {
|
|
1991
|
+
const map = new Map();
|
|
1992
|
+
defs.forEach((def) => {
|
|
1993
|
+
map.set(def.id, def);
|
|
1994
|
+
});
|
|
1995
|
+
return map;
|
|
1996
|
+
}
|
|
1997
|
+
function targetIsLI(target) {
|
|
1998
|
+
return target.id.includes('-column-settings-');
|
|
1999
|
+
}
|
|
2000
|
+
export function isSearchable(def) {
|
|
2001
|
+
return def instanceof AccessorDef || (!!def.filterFn && typeof def.filterFn == 'function');
|
|
2002
|
+
}
|
|
2003
|
+
function hasPagination(repository) {
|
|
2004
|
+
return 'setPage' in repository;
|
|
2005
|
+
}
|
|
2006
|
+
function encapsulate(value) {
|
|
2007
|
+
return `"${value.replace(/[\n]/gm, ' ').replace(/["]/g, '""')}"`;
|
|
2008
|
+
}
|
|
2009
|
+
function generateTableOptions(contextObj) {
|
|
2010
|
+
const _pageCount = $derived(contextObj.paginationRepo?.lastPage ?? 1);
|
|
2011
|
+
const _prm = $derived.by(() => {
|
|
2012
|
+
return contextObj.dataRepo?.paginationType === PaginationType.Local
|
|
2013
|
+
? contextObj.paginationRowModel // TODO getPaginationRowModel()
|
|
2014
|
+
: undefined;
|
|
2015
|
+
});
|
|
2016
|
+
const _pagination = $derived.by(() => {
|
|
2017
|
+
void contextObj.paginationRepo?.paginationState?.pageSize;
|
|
2018
|
+
void contextObj.paginationRepo?.paginationState?.pageIndex;
|
|
2019
|
+
return contextObj.paginationRepo?.paginationState;
|
|
2020
|
+
});
|
|
2021
|
+
// TODO
|
|
2022
|
+
function todo(fnName) {
|
|
2023
|
+
return () => {
|
|
2024
|
+
throw new Error('TODO ' + fnName);
|
|
2025
|
+
};
|
|
2026
|
+
}
|
|
2027
|
+
// const leftSizePx = $derived.by(() => {
|
|
2028
|
+
// if (contextObj.columnPinning.left?.length) {
|
|
2029
|
+
// return contextObj.columnDefs.reduce((total, current) => {
|
|
2030
|
+
// if (contextObj.columnPinning.left!.includes(current.id)) {
|
|
2031
|
+
// return total + contextObj.measureHeaderWidth(current);
|
|
2032
|
+
// }
|
|
2033
|
+
// return total;
|
|
2034
|
+
// }, 0);
|
|
2035
|
+
// }
|
|
2036
|
+
// return 0;
|
|
2037
|
+
// });
|
|
2038
|
+
// const rightSizePx = $derived.by(() => {
|
|
2039
|
+
// if (contextObj.columnPinning.right?.length) {
|
|
2040
|
+
// return contextObj.columnDefs.reduce((total, current) => {
|
|
2041
|
+
// if (contextObj.columnPinning.right!.includes(current.id)) {
|
|
2042
|
+
// return total + contextObj.measureHeaderWidth(current);
|
|
2043
|
+
// }
|
|
2044
|
+
// return total;
|
|
2045
|
+
// }, 0);
|
|
2046
|
+
// }
|
|
2047
|
+
// return 0;
|
|
2048
|
+
// });
|
|
2049
|
+
// const centerSizePx = $derived.by(() => {
|
|
2050
|
+
// if (contextObj.columnPinning.right?.length) {
|
|
2051
|
+
// return contextObj.columnDefs.reduce((total, current) => {
|
|
2052
|
+
// if (
|
|
2053
|
+
// contextObj.columnPinning.left?.includes(current.id) ||
|
|
2054
|
+
// contextObj.columnPinning.right?.includes(current.id)
|
|
2055
|
+
// ) {
|
|
2056
|
+
// return total;
|
|
2057
|
+
// }
|
|
2058
|
+
// return total + contextObj.measureHeaderWidth(current);
|
|
2059
|
+
// }, 0);
|
|
2060
|
+
// }
|
|
2061
|
+
// return 0;
|
|
2062
|
+
// });
|
|
2063
|
+
const makeHeader = (def) => {
|
|
2064
|
+
// const size = $derived(contextObj.measureHeaderWidth(def));
|
|
2065
|
+
const isVisible = $derived(contextObj.columnVisibility[def.id] != false);
|
|
2066
|
+
const isSorted = $derived.by(() => {
|
|
2067
|
+
const sortState = contextObj.paginationRepo?.sorting.find((it) => it.id == def.id);
|
|
2068
|
+
if (!sortState) {
|
|
2069
|
+
return 'none';
|
|
2070
|
+
}
|
|
2071
|
+
if (sortState.desc) {
|
|
2072
|
+
return 'desc';
|
|
2073
|
+
}
|
|
2074
|
+
return 'asc';
|
|
2075
|
+
});
|
|
2076
|
+
let originalWidth = 0;
|
|
2077
|
+
let mouseStartingPoint = 0;
|
|
2078
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2079
|
+
function addOverrideResizeHandler(e) {
|
|
2080
|
+
originalWidth = def.width;
|
|
2081
|
+
mouseStartingPoint = e.clientX;
|
|
2082
|
+
def.isResizing = true;
|
|
2083
|
+
window.addEventListener('mousemove', onResize);
|
|
2084
|
+
window.addEventListener('mouseup', removeOverrideResizeHandler);
|
|
2085
|
+
}
|
|
2086
|
+
function onResize(e) {
|
|
2087
|
+
def.width = originalWidth - (mouseStartingPoint - e.clientX);
|
|
2088
|
+
}
|
|
2089
|
+
function removeOverrideResizeHandler(e) {
|
|
2090
|
+
def.isResizing = false;
|
|
2091
|
+
window.removeEventListener('mousemove', onResize);
|
|
2092
|
+
}
|
|
2093
|
+
return {
|
|
2094
|
+
id: def.id,
|
|
2095
|
+
colSpan: 1,
|
|
2096
|
+
column: {
|
|
2097
|
+
id: def.id,
|
|
2098
|
+
getIsResizing: () => def.isResizing,
|
|
2099
|
+
columnDef: def,
|
|
2100
|
+
getCanSort: () => def.enableSorting,
|
|
2101
|
+
getToggleSortingHandler: () => def.enableSorting ? contextObj.getToggleSortingHandler(def) : undefined,
|
|
2102
|
+
getIsSorted: () => isSorted,
|
|
2103
|
+
getIsVisible: () => isVisible
|
|
2104
|
+
},
|
|
2105
|
+
getResizeHandler: () => {
|
|
2106
|
+
return (e) => {
|
|
2107
|
+
addOverrideResizeHandler(e);
|
|
2108
|
+
};
|
|
2109
|
+
},
|
|
2110
|
+
isPlaceholder: false,
|
|
2111
|
+
getSize: () => def.width
|
|
2112
|
+
};
|
|
2113
|
+
};
|
|
2114
|
+
const leftHeaderGroups = $derived.by(() => {
|
|
2115
|
+
const headers = contextObj.columnDefs
|
|
2116
|
+
.filter((it) => contextObj.columnVisibility[it.id] != false &&
|
|
2117
|
+
contextObj.columnPinning.left?.includes(it.id))
|
|
2118
|
+
.map(makeHeader);
|
|
2119
|
+
return [
|
|
2120
|
+
{
|
|
2121
|
+
depth: 0,
|
|
2122
|
+
id: 'left_0',
|
|
2123
|
+
headers
|
|
2124
|
+
}
|
|
2125
|
+
];
|
|
2126
|
+
});
|
|
2127
|
+
const rightHeaderGroups = $derived.by(() => {
|
|
2128
|
+
const headers = contextObj.columnDefs
|
|
2129
|
+
.filter((it) => contextObj.columnVisibility[it.id] != false &&
|
|
2130
|
+
contextObj.columnPinning.right?.includes(it.id))
|
|
2131
|
+
.map(makeHeader);
|
|
2132
|
+
return [
|
|
2133
|
+
{
|
|
2134
|
+
depth: 0,
|
|
2135
|
+
id: 'right_0',
|
|
2136
|
+
headers
|
|
2137
|
+
}
|
|
2138
|
+
];
|
|
2139
|
+
});
|
|
2140
|
+
const centerHeaderGroups = $derived.by(() => {
|
|
2141
|
+
const headers = contextObj.columnDefs
|
|
2142
|
+
.filter((it) => contextObj.columnVisibility[it.id] != false &&
|
|
2143
|
+
!(contextObj.columnPinning.left?.includes(it.id) ||
|
|
2144
|
+
contextObj.columnPinning.right?.includes(it.id)))
|
|
2145
|
+
.map(makeHeader);
|
|
2146
|
+
return [
|
|
2147
|
+
{
|
|
2148
|
+
depth: 0,
|
|
2149
|
+
id: 'center_0',
|
|
2150
|
+
headers
|
|
2151
|
+
}
|
|
2152
|
+
];
|
|
2153
|
+
});
|
|
2154
|
+
const leftSizePx = $derived(leftHeaderGroups.reduce((total, grp) => total + grp.headers.reduce((total, header) => total + header.getSize(), 0), 0));
|
|
2155
|
+
const centerSizePx = $derived(centerHeaderGroups.reduce((total, grp) => total + grp.headers.reduce((total, header) => total + header.getSize(), 0), 0));
|
|
2156
|
+
const rightSizePx = $derived(rightHeaderGroups.reduce((total, grp) => total + grp.headers.reduce((total, header) => total + header.getSize(), 0), 0));
|
|
2157
|
+
const leftVisibleLeafColumns = $derived(leftHeaderGroups.flatMap((grp) => grp.headers.map((it) => it.column)));
|
|
2158
|
+
const rightVisibleLeafColumns = $derived(rightHeaderGroups.flatMap((grp) => grp.headers.map((it) => it.column)));
|
|
2159
|
+
const centerVisibleLeafColumns = $derived(centerHeaderGroups.flatMap((grp) => grp.headers.map((it) => it.column)));
|
|
2160
|
+
return {
|
|
2161
|
+
getLeftTotalSize: () => leftSizePx,
|
|
2162
|
+
getCenterTotalSize: () => centerSizePx,
|
|
2163
|
+
getRightTotalSize: () => rightSizePx,
|
|
2164
|
+
getLeftHeaderGroups: () => leftHeaderGroups,
|
|
2165
|
+
getRightHeaderGroups: () => rightHeaderGroups,
|
|
2166
|
+
getCenterHeaderGroups: () => centerHeaderGroups,
|
|
2167
|
+
getLeftVisibleLeafColumns: () => leftVisibleLeafColumns,
|
|
2168
|
+
getRightVisibleLeafColumns: () => rightVisibleLeafColumns,
|
|
2169
|
+
getCenterVisibleLeafColumns: () => centerVisibleLeafColumns,
|
|
2170
|
+
// manualPagination: true,
|
|
2171
|
+
get data() {
|
|
2172
|
+
return contextObj.sortedData;
|
|
2173
|
+
},
|
|
2174
|
+
get columns() {
|
|
2175
|
+
return contextObj.columnDefs;
|
|
2176
|
+
},
|
|
2177
|
+
get columnSizing() {
|
|
2178
|
+
return contextObj.columnSizing;
|
|
2179
|
+
},
|
|
2180
|
+
get columnVisibility() {
|
|
2181
|
+
return contextObj.columnVisibility;
|
|
2182
|
+
},
|
|
2183
|
+
get sorting() {
|
|
2184
|
+
return contextObj.paginationRepo?.sorting;
|
|
2185
|
+
},
|
|
2186
|
+
get pagination() {
|
|
2187
|
+
return _pagination;
|
|
2188
|
+
},
|
|
2189
|
+
get columnPinning() {
|
|
2190
|
+
return contextObj.columnPinning;
|
|
2191
|
+
},
|
|
2192
|
+
get columnFilters() {
|
|
2193
|
+
return contextObj.paginationRepo?.filtering;
|
|
2194
|
+
},
|
|
2195
|
+
get enableMultiSort() {
|
|
2196
|
+
return true;
|
|
2197
|
+
},
|
|
2198
|
+
get onColumnVisibilityChange() {
|
|
2199
|
+
return contextObj.updateVisibility;
|
|
2200
|
+
},
|
|
2201
|
+
get onColumnSizingChange() {
|
|
2202
|
+
return contextObj.updateColumnSizing;
|
|
2203
|
+
},
|
|
2204
|
+
get onColumnFiltersChange() {
|
|
2205
|
+
return contextObj.updateFilters;
|
|
2206
|
+
}
|
|
2207
|
+
// get pageCount() {
|
|
2208
|
+
// return _pageCount;
|
|
2209
|
+
// }
|
|
2210
|
+
};
|
|
2211
|
+
}
|
|
2212
|
+
function checkboxSortingFn(id, desc) {
|
|
2213
|
+
return desc
|
|
2214
|
+
? (a, b) => {
|
|
2215
|
+
if (a[id] && !b[id]) {
|
|
2216
|
+
return 1;
|
|
2217
|
+
}
|
|
2218
|
+
if (!a[id] && b[id]) {
|
|
2219
|
+
return -1;
|
|
2220
|
+
}
|
|
2221
|
+
return 0;
|
|
2222
|
+
}
|
|
2223
|
+
: (a, b) => {
|
|
2224
|
+
if (a[id] && !b[id]) {
|
|
2225
|
+
return -1;
|
|
2226
|
+
}
|
|
2227
|
+
if (!a[id] && b[id]) {
|
|
2228
|
+
return 1;
|
|
2229
|
+
}
|
|
2230
|
+
return 0;
|
|
2231
|
+
};
|
|
2232
|
+
}
|
|
2233
|
+
function comparableSortingFn(id, desc) {
|
|
2234
|
+
return desc
|
|
2235
|
+
? (a, b) => {
|
|
2236
|
+
if (a[id] == undefined && b[id] != undefined) {
|
|
2237
|
+
return 1;
|
|
2238
|
+
}
|
|
2239
|
+
if (b[id] == undefined && a[id] != undefined) {
|
|
2240
|
+
return -1;
|
|
2241
|
+
}
|
|
2242
|
+
if (a[id] < b[id]) {
|
|
2243
|
+
return 1;
|
|
2244
|
+
}
|
|
2245
|
+
if (a[id] > b[id]) {
|
|
2246
|
+
return -1;
|
|
2247
|
+
}
|
|
2248
|
+
return 0;
|
|
2249
|
+
}
|
|
2250
|
+
: (a, b) => {
|
|
2251
|
+
if (a[id] == undefined && b[id] != undefined) {
|
|
2252
|
+
return 1;
|
|
2253
|
+
}
|
|
2254
|
+
if (b[id] == undefined && a[id] != undefined) {
|
|
2255
|
+
return -1;
|
|
2256
|
+
}
|
|
2257
|
+
if (a[id] < b[id]) {
|
|
2258
|
+
return -1;
|
|
2259
|
+
}
|
|
2260
|
+
if (a[id] > b[id]) {
|
|
2261
|
+
return 1;
|
|
2262
|
+
}
|
|
2263
|
+
return 0;
|
|
2264
|
+
};
|
|
2265
|
+
}
|
|
2266
|
+
function progressSortingFn(id, desc) {
|
|
2267
|
+
return desc
|
|
2268
|
+
? (a, b) => {
|
|
2269
|
+
const [minA, maxA] = a[id];
|
|
2270
|
+
const [minB, maxB] = b[id];
|
|
2271
|
+
if (minA == undefined || maxA == undefined || maxA == 0) {
|
|
2272
|
+
if (maxB != undefined && maxB != 0) {
|
|
2273
|
+
return 1;
|
|
2274
|
+
}
|
|
2275
|
+
else {
|
|
2276
|
+
return 0;
|
|
2277
|
+
}
|
|
2278
|
+
}
|
|
2279
|
+
if (minB == undefined || maxB == undefined || maxB == 0) {
|
|
2280
|
+
return -1;
|
|
2281
|
+
}
|
|
2282
|
+
const valueA = minA / maxA;
|
|
2283
|
+
const valueB = minB / maxB;
|
|
2284
|
+
if (valueA < valueB) {
|
|
2285
|
+
return 1;
|
|
2286
|
+
}
|
|
2287
|
+
if (valueB < valueA) {
|
|
2288
|
+
return -1;
|
|
2289
|
+
}
|
|
2290
|
+
return 0;
|
|
2291
|
+
}
|
|
2292
|
+
: (a, b) => {
|
|
2293
|
+
const [minA, maxA] = a[id];
|
|
2294
|
+
const [minB, maxB] = b[id];
|
|
2295
|
+
if (minA == undefined || maxA == undefined || maxA == 0) {
|
|
2296
|
+
if (maxB != undefined && maxB != 0) {
|
|
2297
|
+
return -1;
|
|
2298
|
+
}
|
|
2299
|
+
else {
|
|
2300
|
+
return 0;
|
|
2301
|
+
}
|
|
2302
|
+
}
|
|
2303
|
+
if (minB == undefined || maxB == undefined || maxB == 0) {
|
|
2304
|
+
return 1;
|
|
2305
|
+
}
|
|
2306
|
+
const valueA = minA / maxA;
|
|
2307
|
+
const valueB = minB / maxB;
|
|
2308
|
+
if (valueA < valueB) {
|
|
2309
|
+
return -1;
|
|
2310
|
+
}
|
|
2311
|
+
if (valueB < valueA) {
|
|
2312
|
+
return 1;
|
|
2313
|
+
}
|
|
2314
|
+
return 0;
|
|
2315
|
+
};
|
|
2316
|
+
}
|
|
2317
|
+
// #endregion
|