@lowdefy/blocks-table 0.0.0-experimental-20260929110023
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/LICENSE +201 -0
- package/README.md +12 -0
- package/dist/blocks/Table/Table.js +25 -0
- package/dist/blocks/Table/Table.lazy.js +33 -0
- package/dist/blocks/Table/TableFallback.js +35 -0
- package/dist/blocks/Table/e2e.js +47 -0
- package/dist/blocks/Table/gallery.yaml +836 -0
- package/dist/blocks/Table/meta.js +964 -0
- package/dist/blocks/Table/tests/Table.e2e.yaml +434 -0
- package/dist/blocks/Table/tests/TableFeatures.e2e.yaml +291 -0
- package/dist/blocks/Table/tests/TableLinkTarget.e2e.yaml +25 -0
- package/dist/blocks/Table/tests/TableParity.e2e.yaml +101 -0
- package/dist/blocks/Table/tests/bulk.e2e.yaml +271 -0
- package/dist/blocks/Table/tests/deals.yaml +30 -0
- package/dist/blocks/Table/tests/deals_columns.yaml +37 -0
- package/dist/blocks/Table/tests/editing.e2e.yaml +501 -0
- package/dist/blocks/Table/tests/expandable.e2e.yaml +87 -0
- package/dist/blocks/Table/tests/filtering.e2e.yaml +251 -0
- package/dist/blocks/Table/tests/grouping.e2e.yaml +272 -0
- package/dist/blocks/Table/tests/grouping_deals.yaml +24 -0
- package/dist/blocks/Table/tests/grouping_deals_columns.yaml +32 -0
- package/dist/blocks/Table/tests/headerMenu.e2e.yaml +134 -0
- package/dist/blocks/Table/tests/parity_properties.yaml +144 -0
- package/dist/blocks/Table/tests/people.yaml +39 -0
- package/dist/blocks/Table/tests/people_columns.yaml +22 -0
- package/dist/blocks/Table/tests/polish.e2e.yaml +372 -0
- package/dist/blocks/Table/tests/server-mongodb.e2e.yaml +169 -0
- package/dist/blocks/Table/tests/server.e2e.yaml +267 -0
- package/dist/blocks/Table/tests/toolbar.e2e.yaml +140 -0
- package/dist/blocks/Table/tests/tree.e2e.yaml +245 -0
- package/dist/blocks/Table/tests/views.e2e.yaml +235 -0
- package/dist/blocks/TableInput/TableInput.js +24 -0
- package/dist/blocks/TableInput/TableInput.lazy.js +17 -0
- package/dist/blocks/TableInput/TableInputRoot.js +65 -0
- package/dist/blocks/TableInput/e2e.js +16 -0
- package/dist/blocks/TableInput/gallery.yaml +153 -0
- package/dist/blocks/TableInput/meta.js +93 -0
- package/dist/blocks/TableInput/tests/TableInput.e2e.yaml +272 -0
- package/dist/blocks.js +16 -0
- package/dist/core/Body.js +112 -0
- package/dist/core/Cell.js +86 -0
- package/dist/core/Chevron.js +32 -0
- package/dist/core/EmptyState.js +32 -0
- package/dist/core/Grid.js +219 -0
- package/dist/core/GroupHeaderRow.js +81 -0
- package/dist/core/HeaderCell.js +58 -0
- package/dist/core/HeaderRow.js +76 -0
- package/dist/core/HeaderTitle.js +49 -0
- package/dist/core/LazyCell.js +71 -0
- package/dist/core/LoadingRows.js +38 -0
- package/dist/core/RenderProbeContext.js +19 -0
- package/dist/core/Row.js +98 -0
- package/dist/core/SkeletonRow.js +42 -0
- package/dist/core/SummaryRow.js +86 -0
- package/dist/core/TableRoot.js +195 -0
- package/dist/core/aggregateShortLabels.js +25 -0
- package/dist/core/applyLayoutVars.js +22 -0
- package/dist/core/buildGroupSegments.js +36 -0
- package/dist/core/collectBodyOverlays.js +20 -0
- package/dist/core/collectCellLeads.js +21 -0
- package/dist/core/collectClaimedViewKeys.js +26 -0
- package/dist/core/collectGridHandlers.js +29 -0
- package/dist/core/collectHeaderParts.js +20 -0
- package/dist/core/collectRowRenderers.js +21 -0
- package/dist/core/collectSliceDefinitions.js +29 -0
- package/dist/core/computeLayout.js +133 -0
- package/dist/core/createAccessor.js +39 -0
- package/dist/core/createApi.js +86 -0
- package/dist/core/createCellActivity.js +47 -0
- package/dist/core/createColumnDefs.js +42 -0
- package/dist/core/createFeatureActions.js +24 -0
- package/dist/core/createFeatureSet.js +39 -0
- package/dist/core/createInitialState.js +63 -0
- package/dist/core/createKeyIndex.js +26 -0
- package/dist/core/createMethodStubs.js +30 -0
- package/dist/core/createSliceHandlers.js +26 -0
- package/dist/core/createStableCoreRowModel.js +91 -0
- package/dist/core/createTanstackFeatures.js +24 -0
- package/dist/core/createTextMeasure.js +106 -0
- package/dist/core/densityHeights.js +20 -0
- package/dist/core/deriveValue.js +53 -0
- package/dist/core/dispatchGridEvent.js +21 -0
- package/dist/core/distributeFlex.js +28 -0
- package/dist/core/getCellFit.js +34 -0
- package/dist/core/getHeaderCellProps.js +21 -0
- package/dist/core/getHeaderLevels.js +50 -0
- package/dist/core/getRecordCount.js +23 -0
- package/dist/core/getSummaryLabel.js +35 -0
- package/dist/core/getValueSignature.js +26 -0
- package/dist/core/isDataItem.js +21 -0
- package/dist/core/isDefaultViewColumns.js +36 -0
- package/dist/core/isRowEqual.js +40 -0
- package/dist/core/isSameSignature.js +19 -0
- package/dist/core/lazyCellTypes.js +33 -0
- package/dist/core/lazyComponent.js +30 -0
- package/dist/core/loadOptionalFeature.js +35 -0
- package/dist/core/normalizeViewColumn.js +29 -0
- package/dist/core/pickViewPart.js +23 -0
- package/dist/core/renderRegion.js +21 -0
- package/dist/core/resolveMountValue.js +31 -0
- package/dist/core/resolveViewColumns.js +65 -0
- package/dist/core/someColumnConfig.js +30 -0
- package/dist/core/stabilizeData.js +90 -0
- package/dist/core/table.css +557 -0
- package/dist/core/useFeatureData.js +35 -0
- package/dist/core/useFeatureFragments.js +55 -0
- package/dist/core/useFeatureItems.js +78 -0
- package/dist/core/useFeatureMethods.js +29 -0
- package/dist/core/useFeatureRows.js +36 -0
- package/dist/core/useFeatureSet.js +54 -0
- package/dist/core/useForeignKeys.js +38 -0
- package/dist/core/useGridFeatures.js +26 -0
- package/dist/core/useStableConfig.js +34 -0
- package/dist/core/useSummary.js +73 -0
- package/dist/core/useTableConfig.js +189 -0
- package/dist/core/useTableState.js +150 -0
- package/dist/core/useViewportSize.js +40 -0
- package/dist/e2e.js +16 -0
- package/dist/features/bulk/BulkBar.js +46 -0
- package/dist/features/bulk/bulk.css +57 -0
- package/dist/features/bulk/bulkFeature.js +28 -0
- package/dist/features/bulk/countSelection.js +27 -0
- package/dist/features/bulk/createSelectAllMatching.js +43 -0
- package/dist/features/bulk/useBulkBar.js +42 -0
- package/dist/features/clipboard/clipboardFeature.js +24 -0
- package/dist/features/clipboard/createPasteCells.js +61 -0
- package/dist/features/clipboard/getCopyText.js +57 -0
- package/dist/features/clipboard/handleCopyKeyDown.js +37 -0
- package/dist/features/clipboard/parseTsv.js +70 -0
- package/dist/features/clipboard/pasteFeature.js +26 -0
- package/dist/features/clipboard/planPaste.js +101 -0
- package/dist/features/clipboard/serializeTsv.js +25 -0
- package/dist/features/clipboard/usePasteListener.js +45 -0
- package/dist/features/columnManager/ColumnManager.js +253 -0
- package/dist/features/columnManager/ColumnManagerPopover.js +37 -0
- package/dist/features/columnManager/DragHandleIcon.js +39 -0
- package/dist/features/columnManager/LazyColumnManagerPopover.js +19 -0
- package/dist/features/columnManager/applyManagerRegions.js +43 -0
- package/dist/features/columnManager/boundaryIds.js +21 -0
- package/dist/features/columnManager/buildManagerSequence.js +38 -0
- package/dist/features/columnManager/columnManager.css +155 -0
- package/dist/features/columnManager/columnManagerFeature.js +37 -0
- package/dist/features/columnManager/createCloseColumnManager.js +21 -0
- package/dist/features/columnManager/createOpenColumnManager.js +21 -0
- package/dist/features/columnManager/createResetColumns.js +43 -0
- package/dist/features/columnManager/getColumnManagerMenuItems.js +26 -0
- package/dist/features/columnManager/getListRoom.js +31 -0
- package/dist/features/columnManager/getManagerEntries.js +31 -0
- package/dist/features/columnManager/moveSequenceEntry.js +25 -0
- package/dist/features/columnManager/sequenceToRegions.js +38 -0
- package/dist/features/columnManager/snapListHeight.js +35 -0
- package/dist/features/columnManager/updateScrollHints.js +23 -0
- package/dist/features/columnManager/useColumnManager.js +36 -0
- package/dist/features/density/densityFeature.js +39 -0
- package/dist/features/density/densityToValue.js +23 -0
- package/dist/features/density/getViewWrapColumn.js +53 -0
- package/dist/features/density/initDensity.js +27 -0
- package/dist/features/density/initWrap.js +23 -0
- package/dist/features/editing/AddRowButton.js +28 -0
- package/dist/features/editing/CellEditor.js +284 -0
- package/dist/features/editing/EditMarker.js +38 -0
- package/dist/features/editing/EditingLayer.js +148 -0
- package/dist/features/editing/RowControlsCell.js +89 -0
- package/dist/features/editing/RowControlsHeader.js +18 -0
- package/dist/features/editing/SelectedTag.js +33 -0
- package/dist/features/editing/addChangeRow.js +34 -0
- package/dist/features/editing/applyChangeUpdates.js +28 -0
- package/dist/features/editing/applyChanges.js +90 -0
- package/dist/features/editing/applyMoveOverlay.js +44 -0
- package/dist/features/editing/applyMoveToChanges.js +66 -0
- package/dist/features/editing/applyOverlay.js +41 -0
- package/dist/features/editing/coerceCellValue.js +187 -0
- package/dist/features/editing/collectRawColumns.js +38 -0
- package/dist/features/editing/computeEditTargets.js +108 -0
- package/dist/features/editing/computeRowMove.js +78 -0
- package/dist/features/editing/createAddRow.js +68 -0
- package/dist/features/editing/createCancelEdit.js +29 -0
- package/dist/features/editing/createCommitEdit.js +124 -0
- package/dist/features/editing/createDeleteRow.js +39 -0
- package/dist/features/editing/createEditSpecs.js +80 -0
- package/dist/features/editing/createEmptyChanges.js +23 -0
- package/dist/features/editing/createMoveRow.js +65 -0
- package/dist/features/editing/createNewRow.js +32 -0
- package/dist/features/editing/createResetChanges.js +29 -0
- package/dist/features/editing/createSaveCellEdit.js +113 -0
- package/dist/features/editing/createSaveRowMove.js +90 -0
- package/dist/features/editing/createStartEdit.js +57 -0
- package/dist/features/editing/createStepHistory.js +33 -0
- package/dist/features/editing/createUndoStack.js +67 -0
- package/dist/features/editing/createValueStore.js +34 -0
- package/dist/features/editing/createWriteCell.js +34 -0
- package/dist/features/editing/createWriteChanges.js +43 -0
- package/dist/features/editing/editing.css +223 -0
- package/dist/features/editing/editingFeature.js +66 -0
- package/dist/features/editing/findCellByKey.js +23 -0
- package/dist/features/editing/findInvalidCells.js +41 -0
- package/dist/features/editing/findNextEditableCell.js +54 -0
- package/dist/features/editing/focusCell.js +28 -0
- package/dist/features/editing/fromDateValue.js +29 -0
- package/dist/features/editing/fromEditorDraft.js +45 -0
- package/dist/features/editing/generateRowKey.js +25 -0
- package/dist/features/editing/getDataGap.js +28 -0
- package/dist/features/editing/getEditOptions.js +33 -0
- package/dist/features/editing/getEditorKind.js +36 -0
- package/dist/features/editing/getEventError.js +24 -0
- package/dist/features/editing/getKeyField.js +23 -0
- package/dist/features/editing/getReorderBlock.js +33 -0
- package/dist/features/editing/handleEditDoubleClick.js +34 -0
- package/dist/features/editing/handleEditKeyDown.js +123 -0
- package/dist/features/editing/handleRowControlsClick.js +29 -0
- package/dist/features/editing/handleRowDragPointerDown.js +95 -0
- package/dist/features/editing/isCellEditable.js +20 -0
- package/dist/features/editing/isPrintableKey.js +22 -0
- package/dist/features/editing/isSameTargets.js +19 -0
- package/dist/features/editing/matchOption.js +21 -0
- package/dist/features/editing/needsEditing.js +26 -0
- package/dist/features/editing/normalizeChanges.js +37 -0
- package/dist/features/editing/positionBetween.js +30 -0
- package/dist/features/editing/pruneOverlay.js +39 -0
- package/dist/features/editing/removeChangeRow.js +48 -0
- package/dist/features/editing/reorderByKeys.js +34 -0
- package/dist/features/editing/rowControlsColumn.js +33 -0
- package/dist/features/editing/setChangeField.js +72 -0
- package/dist/features/editing/setRowField.js +23 -0
- package/dist/features/editing/sortByPosition.js +31 -0
- package/dist/features/editing/toDateValue.js +38 -0
- package/dist/features/editing/toEditorDraft.js +56 -0
- package/dist/features/editing/toSelectOptions.js +39 -0
- package/dist/features/editing/useEditingData.js +199 -0
- package/dist/features/editing/useEditingFragments.js +77 -0
- package/dist/features/editing/useEditingGrid.js +25 -0
- package/dist/features/editing/validateCellValue.js +25 -0
- package/dist/features/editing/valuesEqual.js +31 -0
- package/dist/features/editing/warnMissingEvent.js +23 -0
- package/dist/features/events/createActivateRow.js +54 -0
- package/dist/features/events/eventsFeature.js +35 -0
- package/dist/features/events/getBodyTarget.js +27 -0
- package/dist/features/events/getRowIndex.js +24 -0
- package/dist/features/events/handleAuxClick.js +38 -0
- package/dist/features/events/handlePointerDown.js +22 -0
- package/dist/features/events/handleRowClick.js +57 -0
- package/dist/features/events/handleRowDoubleClick.js +45 -0
- package/dist/features/events/isTextDrag.js +30 -0
- package/dist/features/events/openRowLink.js +29 -0
- package/dist/features/expandable/DetailRow.js +57 -0
- package/dist/features/expandable/ExpandToggle.js +34 -0
- package/dist/features/expandable/expandable.css +40 -0
- package/dist/features/expandable/expandableFeature.js +34 -0
- package/dist/features/expandable/handleExpandClick.js +25 -0
- package/dist/features/expandable/needsExpandable.js +20 -0
- package/dist/features/expandable/normalizeExpandable.js +52 -0
- package/dist/features/expandable/useExpandableItems.js +101 -0
- package/dist/features/expansion/createToggleRowExpanded.js +52 -0
- package/dist/features/expansion/expansionFeature.js +31 -0
- package/dist/features/expansion/getExpandedIds.js +26 -0
- package/dist/features/expansion/initExpanded.js +22 -0
- package/dist/features/export/buildCsv.js +39 -0
- package/dist/features/export/createExportCsv.js +59 -0
- package/dist/features/export/exportFeature.js +25 -0
- package/dist/features/export/toCsvField.js +20 -0
- package/dist/features/filtering/ChoiceFilter.js +30 -0
- package/dist/features/filtering/CloseIcon.js +29 -0
- package/dist/features/filtering/ColumnFilter.js +192 -0
- package/dist/features/filtering/ColumnFilterPopover.js +38 -0
- package/dist/features/filtering/DateFilter.js +80 -0
- package/dist/features/filtering/DraftInput.js +37 -0
- package/dist/features/filtering/DraftInputNumber.js +36 -0
- package/dist/features/filtering/FilterBuilder.js +45 -0
- package/dist/features/filtering/FilterGroup.js +116 -0
- package/dist/features/filtering/FilterIcon.js +26 -0
- package/dist/features/filtering/FilterIndicator.js +40 -0
- package/dist/features/filtering/FilterLeaf.js +86 -0
- package/dist/features/filtering/LazyColumnFilterPopover.js +19 -0
- package/dist/features/filtering/LazyFilterBuilder.js +19 -0
- package/dist/features/filtering/NumberFilter.js +43 -0
- package/dist/features/filtering/OptionsFilter.js +72 -0
- package/dist/features/filtering/RelativeDateEditor.js +90 -0
- package/dist/features/filtering/TextFilter.js +51 -0
- package/dist/features/filtering/ValueEditor.js +210 -0
- package/dist/features/filtering/buildColumnFilter.js +95 -0
- package/dist/features/filtering/changeLeafOperator.js +46 -0
- package/dist/features/filtering/createApplyFiltering.js +78 -0
- package/dist/features/filtering/createClearFilters.js +24 -0
- package/dist/features/filtering/createCloseColumnFilter.js +28 -0
- package/dist/features/filtering/createConditionFilteredRowModel.js +40 -0
- package/dist/features/filtering/createDefaultLeaf.js +31 -0
- package/dist/features/filtering/createOpenColumnFilter.js +25 -0
- package/dist/features/filtering/createRowTest.js +32 -0
- package/dist/features/filtering/createSearchMatcher.js +35 -0
- package/dist/features/filtering/createSetFilter.js +27 -0
- package/dist/features/filtering/createSetSearch.js +29 -0
- package/dist/features/filtering/createUpdateColumnFilter.js +29 -0
- package/dist/features/filtering/defaultRelativeDate.js +20 -0
- package/dist/features/filtering/filterRowModel.js +66 -0
- package/dist/features/filtering/filtering.css +151 -0
- package/dist/features/filtering/filteringFeature.js +82 -0
- package/dist/features/filtering/filteringToValue.js +23 -0
- package/dist/features/filtering/formatFilterDate.js +24 -0
- package/dist/features/filtering/getColumnConditions.js +24 -0
- package/dist/features/filtering/getConditionKeys.js +31 -0
- package/dist/features/filtering/getDistinctOptions.js +52 -0
- package/dist/features/filtering/getFilterKind.js +37 -0
- package/dist/features/filtering/getFilterResultKey.js +26 -0
- package/dist/features/filtering/getFilterResults.js +53 -0
- package/dist/features/filtering/getFilteredKeys.js +31 -0
- package/dist/features/filtering/getFilteringHeaderProps.js +22 -0
- package/dist/features/filtering/getFilteringMenuItems.js +42 -0
- package/dist/features/filtering/getFilteringTableOptions.js +33 -0
- package/dist/features/filtering/getGroupOperator.js +23 -0
- package/dist/features/filtering/getOperatorLabel.js +50 -0
- package/dist/features/filtering/getPlainTitle.js +26 -0
- package/dist/features/filtering/getSearchColumns.js +23 -0
- package/dist/features/filtering/getSearchKey.js +19 -0
- package/dist/features/filtering/getSearchText.js +57 -0
- package/dist/features/filtering/getTopLevelConditions.js +25 -0
- package/dist/features/filtering/getValueShape.js +30 -0
- package/dist/features/filtering/handleFilterIndicatorClick.js +25 -0
- package/dist/features/filtering/initFilter.js +25 -0
- package/dist/features/filtering/initSearch.js +24 -0
- package/dist/features/filtering/isColumnCondition.js +22 -0
- package/dist/features/filtering/isCompleteLeaf.js +45 -0
- package/dist/features/filtering/isServerMode.js +21 -0
- package/dist/features/filtering/normalizeSearch.js +21 -0
- package/dist/features/filtering/parseColumnFilter.js +128 -0
- package/dist/features/filtering/parseFilterDate.js +24 -0
- package/dist/features/filtering/prepareFilterResult.js +63 -0
- package/dist/features/filtering/pruneCondition.js +35 -0
- package/dist/features/filtering/setColumnFilter.js +51 -0
- package/dist/features/filtering/textFilterOperators.js +26 -0
- package/dist/features/filtering/toRootGroup.js +34 -0
- package/dist/features/filtering/useDraft.js +65 -0
- package/dist/features/filtering/useFilteringState.js +32 -0
- package/dist/features/filtering/useSyncedState.js +45 -0
- package/dist/features/grouping/GroupCell.js +72 -0
- package/dist/features/grouping/GroupCheckbox.js +38 -0
- package/dist/features/grouping/GroupLabel.js +73 -0
- package/dist/features/grouping/GroupRow.js +103 -0
- package/dist/features/grouping/StickyGroupRow.js +136 -0
- package/dist/features/grouping/buildGroupTree.js +138 -0
- package/dist/features/grouping/buildStickyLevels.js +35 -0
- package/dist/features/grouping/countGroupSelection.js +26 -0
- package/dist/features/grouping/createAggregateColumns.js +38 -0
- package/dist/features/grouping/createCollapseAllGroups.js +26 -0
- package/dist/features/grouping/createExpandAllGroups.js +23 -0
- package/dist/features/grouping/createGroupLevels.js +46 -0
- package/dist/features/grouping/createSetCollapsedGroups.js +27 -0
- package/dist/features/grouping/createSetGroup.js +35 -0
- package/dist/features/grouping/createSetGroupKeys.js +27 -0
- package/dist/features/grouping/createToggleGroup.js +38 -0
- package/dist/features/grouping/createToggleGroupSelected.js +49 -0
- package/dist/features/grouping/findGroupIndices.js +25 -0
- package/dist/features/grouping/flattenGroups.js +58 -0
- package/dist/features/grouping/getGroupLabel.js +34 -0
- package/dist/features/grouping/getStickyGroups.js +60 -0
- package/dist/features/grouping/groupRowsFeature.js +57 -0
- package/dist/features/grouping/grouping.css +128 -0
- package/dist/features/grouping/groupingFeature.js +48 -0
- package/dist/features/grouping/groupingHeaderMenuItems.js +44 -0
- package/dist/features/grouping/groupingToValue.js +26 -0
- package/dist/features/grouping/handleGroupClick.js +51 -0
- package/dist/features/grouping/handleGroupKeyDown.js +60 -0
- package/dist/features/grouping/initAggregates.js +36 -0
- package/dist/features/grouping/initCollapsedGroups.js +29 -0
- package/dist/features/grouping/initGrouping.js +34 -0
- package/dist/features/grouping/needsGroupRows.js +23 -0
- package/dist/features/grouping/orderGroups.js +49 -0
- package/dist/features/grouping/resolveAggregates.js +29 -0
- package/dist/features/grouping/toGroupIdentity.js +24 -0
- package/dist/features/grouping/toGroupKeys.js +24 -0
- package/dist/features/grouping/useGrouping.js +91 -0
- package/dist/features/headerMenu/HeaderMenuDropdown.js +86 -0
- package/dist/features/headerMenu/HeaderMenuTrigger.js +44 -0
- package/dist/features/headerMenu/LazyHeaderMenuDropdown.js +19 -0
- package/dist/features/headerMenu/MenuIcon.js +38 -0
- package/dist/features/headerMenu/collectHeaderMenuItems.js +69 -0
- package/dist/features/headerMenu/createAutosizeColumn.js +35 -0
- package/dist/features/headerMenu/createCloseHeaderMenu.js +28 -0
- package/dist/features/headerMenu/createOpenHeaderMenu.js +30 -0
- package/dist/features/headerMenu/focusHeaderControl.js +31 -0
- package/dist/features/headerMenu/freezeColumns.js +31 -0
- package/dist/features/headerMenu/getChromeMenuItems.js +144 -0
- package/dist/features/headerMenu/getVisibleOrder.js +19 -0
- package/dist/features/headerMenu/handleHeaderButtonPointerDown.js +27 -0
- package/dist/features/headerMenu/handleHeaderMenuClick.js +26 -0
- package/dist/features/headerMenu/handleHeaderMenuKeyDown.js +28 -0
- package/dist/features/headerMenu/headerMenu.css +122 -0
- package/dist/features/headerMenu/headerMenuFeature.js +46 -0
- package/dist/features/headerMenu/measureColumnWidth.js +51 -0
- package/dist/features/headerMenu/pinColumn.js +27 -0
- package/dist/features/headerMenu/sectionOrder.js +25 -0
- package/dist/features/headerMenu/useHeaderMenuState.js +27 -0
- package/dist/features/index.js +149 -0
- package/dist/features/keyboard/findCellElement.js +21 -0
- package/dist/features/keyboard/getNextCell.js +74 -0
- package/dist/features/keyboard/handleGridFocus.js +31 -0
- package/dist/features/keyboard/handleGridKeyDown.js +72 -0
- package/dist/features/keyboard/isCellRendered.js +22 -0
- package/dist/features/keyboard/keyboardFeature.js +26 -0
- package/dist/features/keyboard/useKeyboard.js +84 -0
- package/dist/features/lazyCells/getBodyRowKey.js +19 -0
- package/dist/features/lazyCells/handlePointerLeave.js +21 -0
- package/dist/features/lazyCells/handlePointerOver.js +22 -0
- package/dist/features/lazyCells/handleRowBlur.js +22 -0
- package/dist/features/lazyCells/handleRowFocus.js +26 -0
- package/dist/features/lazyCells/lazyCellsFeature.js +33 -0
- package/dist/features/lazyCells/useFastScroll.js +57 -0
- package/dist/features/ordering/getColumnClientBounds.js +32 -0
- package/dist/features/ordering/handleReorderPointerDown.js +137 -0
- package/dist/features/ordering/initColumnOrder.js +18 -0
- package/dist/features/ordering/moveKeys.js +27 -0
- package/dist/features/ordering/orderingFeature.js +35 -0
- package/dist/features/pagination/TablePagination.js +31 -0
- package/dist/features/pagination/initPageSize.js +28 -0
- package/dist/features/pagination/paginationFeature.js +36 -0
- package/dist/features/pagination/paginationToValue.js +24 -0
- package/dist/features/pagination/usePager.js +32 -0
- package/dist/features/pagination/usePagination.js +58 -0
- package/dist/features/pinning/initColumnPinning.js +21 -0
- package/dist/features/pinning/pinningFeature.js +33 -0
- package/dist/features/pinning/pinningToViewColumn.js +24 -0
- package/dist/features/queue/createAfterRowAction.js +40 -0
- package/dist/features/queue/findNextRowId.js +26 -0
- package/dist/features/queue/findRowAction.js +77 -0
- package/dist/features/queue/handleRowActionKey.js +44 -0
- package/dist/features/queue/queueFeature.js +27 -0
- package/dist/features/selection/SelectAllHeader.js +40 -0
- package/dist/features/selection/SelectCell.js +30 -0
- package/dist/features/selection/countSelectedRows.js +31 -0
- package/dist/features/selection/createClearSelection.js +29 -0
- package/dist/features/selection/createToggleAllRowsSelected.js +60 -0
- package/dist/features/selection/createToggleRowSelected.js +86 -0
- package/dist/features/selection/getRawRowKey.js +23 -0
- package/dist/features/selection/getSelectAllExcept.js +23 -0
- package/dist/features/selection/getSelectAllState.js +42 -0
- package/dist/features/selection/handleSelectionClick.js +30 -0
- package/dist/features/selection/initRowSelection.js +36 -0
- package/dist/features/selection/initSelectionMode.js +19 -0
- package/dist/features/selection/initSelectionView.js +35 -0
- package/dist/features/selection/isSelectAllValue.js +19 -0
- package/dist/features/selection/isSelectionViewCurrent.js +22 -0
- package/dist/features/selection/notifySelectionChange.js +32 -0
- package/dist/features/selection/pruneRowSelection.js +26 -0
- package/dist/features/selection/selectionFeature.js +69 -0
- package/dist/features/selection/selectionToValue.js +48 -0
- package/dist/features/selection/useSelection.js +77 -0
- package/dist/features/serverData/buildServerItems.js +109 -0
- package/dist/features/serverData/createBlockCache.js +205 -0
- package/dist/features/serverData/createRefresh.js +23 -0
- package/dist/features/serverData/createServerStore.js +360 -0
- package/dist/features/serverData/getBlockRange.js +29 -0
- package/dist/features/serverData/getListKey.js +20 -0
- package/dist/features/serverData/getNeededBlocks.js +45 -0
- package/dist/features/serverData/needsServerData.js +20 -0
- package/dist/features/serverData/normalizeServerData.js +41 -0
- package/dist/features/serverData/pickServerView.js +43 -0
- package/dist/features/serverData/readFetchResult.js +36 -0
- package/dist/features/serverData/serverData.css +21 -0
- package/dist/features/serverData/serverDataFeature.js +38 -0
- package/dist/features/serverData/serverRangeFeature.js +22 -0
- package/dist/features/serverData/useServerData.js +48 -0
- package/dist/features/serverData/useServerItems.js +35 -0
- package/dist/features/serverData/useServerRange.js +35 -0
- package/dist/features/serverData/useServerView.js +70 -0
- package/dist/features/sizing/ResizeHandle.js +24 -0
- package/dist/features/sizing/handleResizePointerDown.js +66 -0
- package/dist/features/sizing/initColumnSizing.js +23 -0
- package/dist/features/sizing/sizingFeature.js +39 -0
- package/dist/features/sizing/sizingToViewColumn.js +24 -0
- package/dist/features/sorting/SortIndicator.js +37 -0
- package/dist/features/sorting/buildSortKeys.js +52 -0
- package/dist/features/sorting/collectSortKeys.js +30 -0
- package/dist/features/sorting/createClearSort.js +21 -0
- package/dist/features/sorting/createIndexSortedRowModel.js +33 -0
- package/dist/features/sorting/createSetSort.js +43 -0
- package/dist/features/sorting/createSortKeyCollector.js +59 -0
- package/dist/features/sorting/createToggleSort.js +42 -0
- package/dist/features/sorting/getCachedSortKeys.js +19 -0
- package/dist/features/sorting/getSortHeaderProps.js +25 -0
- package/dist/features/sorting/getSortKeys.js +38 -0
- package/dist/features/sorting/handleSortClick.js +27 -0
- package/dist/features/sorting/initSorting.js +37 -0
- package/dist/features/sorting/isNumericSortType.js +21 -0
- package/dist/features/sorting/prepareSortKeys.js +92 -0
- package/dist/features/sorting/rankSortKeys.js +33 -0
- package/dist/features/sorting/setCachedSortKeys.js +24 -0
- package/dist/features/sorting/sortInSlices.js +69 -0
- package/dist/features/sorting/sortIndices.js +40 -0
- package/dist/features/sorting/sortKeysCache.js +19 -0
- package/dist/features/sorting/sortRowModel.js +84 -0
- package/dist/features/sorting/sortingFeature.js +62 -0
- package/dist/features/sorting/sortingToValue.js +27 -0
- package/dist/features/sorting/toFloatSortKeys.js +24 -0
- package/dist/features/sorting/yieldToMain.js +27 -0
- package/dist/features/toolbar/ColumnTitle.js +28 -0
- package/dist/features/toolbar/DensityToggle.js +53 -0
- package/dist/features/toolbar/FilterButton.js +56 -0
- package/dist/features/toolbar/GroupButton.js +51 -0
- package/dist/features/toolbar/OptionsQuickFilter.js +72 -0
- package/dist/features/toolbar/QuickFilter.js +46 -0
- package/dist/features/toolbar/RecordCount.js +27 -0
- package/dist/features/toolbar/SaveViewAs.js +66 -0
- package/dist/features/toolbar/SortButton.js +94 -0
- package/dist/features/toolbar/Toolbar.js +88 -0
- package/dist/features/toolbar/ToolbarCount.js +25 -0
- package/dist/features/toolbar/ToolbarIcon.js +28 -0
- package/dist/features/toolbar/ToolbarList.js +100 -0
- package/dist/features/toolbar/ToolbarSearch.js +63 -0
- package/dist/features/toolbar/ViewActions.js +41 -0
- package/dist/features/toolbar/ViewTabLabel.js +39 -0
- package/dist/features/toolbar/ViewTabMenu.js +48 -0
- package/dist/features/toolbar/ViewTabs.js +44 -0
- package/dist/features/toolbar/countConditions.js +25 -0
- package/dist/features/toolbar/formatRecordCount.js +19 -0
- package/dist/features/toolbar/getQuickFilterValues.js +25 -0
- package/dist/features/toolbar/getRootConditions.js +25 -0
- package/dist/features/toolbar/handleToolbarKeyDown.js +28 -0
- package/dist/features/toolbar/isDefaultSorting.js +26 -0
- package/dist/features/toolbar/isQuickFilterLeaf.js +20 -0
- package/dist/features/toolbar/moveItem.js +25 -0
- package/dist/features/toolbar/needsToolbar.js +21 -0
- package/dist/features/toolbar/normalizeToolbar.js +61 -0
- package/dist/features/toolbar/setQuickFilterValues.js +35 -0
- package/dist/features/toolbar/toolbar.css +185 -0
- package/dist/features/toolbar/toolbarFeature.js +27 -0
- package/dist/features/toolbar/useToolbar.js +41 -0
- package/dist/features/toolbar/validateQuickFilters.js +28 -0
- package/dist/features/transactions/applyTransactionToRows.js +56 -0
- package/dist/features/transactions/createApplyTransaction.js +26 -0
- package/dist/features/transactions/normalizeTransaction.js +49 -0
- package/dist/features/transactions/transactionsFeature.js +24 -0
- package/dist/features/transactions/useTransactionData.js +44 -0
- package/dist/features/tree/TreeToggle.js +39 -0
- package/dist/features/tree/buildTreeIndex.js +60 -0
- package/dist/features/tree/buildTreeItems.js +96 -0
- package/dist/features/tree/flattenTreeData.js +45 -0
- package/dist/features/tree/getDescendantIds.js +28 -0
- package/dist/features/tree/handleTreeClick.js +25 -0
- package/dist/features/tree/handleTreeKeyDown.js +58 -0
- package/dist/features/tree/needsTree.js +20 -0
- package/dist/features/tree/normalizeTree.js +41 -0
- package/dist/features/tree/rowNeedsChildren.js +25 -0
- package/dist/features/tree/tree.css +55 -0
- package/dist/features/tree/treeFeature.js +35 -0
- package/dist/features/tree/useTreeData.js +33 -0
- package/dist/features/tree/useTreeItems.js +61 -0
- package/dist/features/views/compactView.js +30 -0
- package/dist/features/views/createViewsApi.js +74 -0
- package/dist/features/views/decodeViewParam.js +30 -0
- package/dist/features/views/encodeViewParam.js +25 -0
- package/dist/features/views/findActiveView.js +23 -0
- package/dist/features/views/getStorageKey.js +20 -0
- package/dist/features/views/getViewKey.js +27 -0
- package/dist/features/views/getViewSliceDeps.js +27 -0
- package/dist/features/views/isViewDirty.js +34 -0
- package/dist/features/views/mountViewValue.js +36 -0
- package/dist/features/views/needsViews.js +23 -0
- package/dist/features/views/normalizePersist.js +27 -0
- package/dist/features/views/normalizeViews.js +41 -0
- package/dist/features/views/notifyViewSelect.js +29 -0
- package/dist/features/views/readMountPayload.js +31 -0
- package/dist/features/views/readPersistedView.js +45 -0
- package/dist/features/views/sanitizePersistedView.js +49 -0
- package/dist/features/views/stableStringify.js +27 -0
- package/dist/features/views/useViews.js +136 -0
- package/dist/features/views/viewKeys.js +28 -0
- package/dist/features/views/viewsFeature.js +26 -0
- package/dist/features/views/writePersistedView.js +42 -0
- package/dist/features/virtualization/computeRowOffsets.js +29 -0
- package/dist/features/virtualization/computeWindow.js +92 -0
- package/dist/features/virtualization/createScrollToRow.js +36 -0
- package/dist/features/virtualization/firstIndexAbove.js +30 -0
- package/dist/features/virtualization/getMeasureKey.js +23 -0
- package/dist/features/virtualization/isMeasuredColumn.js +20 -0
- package/dist/features/virtualization/isSameRange.js +18 -0
- package/dist/features/virtualization/positionedRowsFeature.js +22 -0
- package/dist/features/virtualization/scrollToCell.js +49 -0
- package/dist/features/virtualization/shiftRowOffsets.js +35 -0
- package/dist/features/virtualization/usePositionedRows.js +37 -0
- package/dist/features/virtualization/useRowOffsets.js +123 -0
- package/dist/features/virtualization/useScrollWindow.js +114 -0
- package/dist/features/virtualization/useTanstackRowWindow.js +43 -0
- package/dist/features/virtualization/useVirtualization.js +64 -0
- package/dist/features/virtualization/virtualizationFeature.js +24 -0
- package/dist/features/virtualization/writeScrollEdges.js +33 -0
- package/dist/features/visibility/initColumnVisibility.js +22 -0
- package/dist/features/visibility/visibilityFeature.js +31 -0
- package/dist/features/visibility/visibilityToViewColumn.js +20 -0
- package/dist/metas.js +16 -0
- package/dist/types.js +17 -0
- package/package.json +91 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2020-2026 Lowdefy, Inc
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
*/ // Clipboard TSV as spreadsheets write it: tabs between fields, CRLF or LF between rows, and a
|
|
16
|
+
// field that holds a tab, newline or quote wrapped in quotes with inner quotes doubled. The
|
|
17
|
+
// trailing newline Excel and Sheets add after the last row does not make an extra empty row.
|
|
18
|
+
function parseTsv(text) {
|
|
19
|
+
const source = String(text ?? '');
|
|
20
|
+
const rows = [];
|
|
21
|
+
let row = [];
|
|
22
|
+
let field = '';
|
|
23
|
+
let quoted = false;
|
|
24
|
+
let i = 0;
|
|
25
|
+
while(i < source.length){
|
|
26
|
+
const char = source[i];
|
|
27
|
+
if (quoted) {
|
|
28
|
+
if (char === '"' && source[i + 1] === '"') {
|
|
29
|
+
field += '"';
|
|
30
|
+
i += 2;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (char === '"') {
|
|
34
|
+
quoted = false;
|
|
35
|
+
i += 1;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
field += char;
|
|
39
|
+
i += 1;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (char === '"' && field === '') {
|
|
43
|
+
quoted = true;
|
|
44
|
+
i += 1;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (char === '\t') {
|
|
48
|
+
row.push(field);
|
|
49
|
+
field = '';
|
|
50
|
+
i += 1;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (char === '\r' || char === '\n') {
|
|
54
|
+
row.push(field);
|
|
55
|
+
rows.push(row);
|
|
56
|
+
row = [];
|
|
57
|
+
field = '';
|
|
58
|
+
i += char === '\r' && source[i + 1] === '\n' ? 2 : 1;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
field += char;
|
|
62
|
+
i += 1;
|
|
63
|
+
}
|
|
64
|
+
if (field !== '' || row.length > 0) {
|
|
65
|
+
row.push(field);
|
|
66
|
+
rows.push(row);
|
|
67
|
+
}
|
|
68
|
+
return rows;
|
|
69
|
+
}
|
|
70
|
+
export default parseTsv;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2020-2026 Lowdefy, Inc
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
*/ import createPasteCells from './createPasteCells.js';
|
|
16
|
+
import usePasteListener from './usePasteListener.js';
|
|
17
|
+
// Paste (TableInput): TSV from the clipboard into editable cells from the focused cell, planned by
|
|
18
|
+
// row key (planPaste) and written as one changeset. Loaded with TableInput only.
|
|
19
|
+
const pasteFeature = {
|
|
20
|
+
name: 'paste',
|
|
21
|
+
actions: {
|
|
22
|
+
pasteCells: createPasteCells
|
|
23
|
+
},
|
|
24
|
+
useGridFeature: usePasteListener
|
|
25
|
+
};
|
|
26
|
+
export default pasteFeature;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2020-2026 Lowdefy, Inc
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
*/ import coerceCellValue from '../editing/coerceCellValue.js';
|
|
16
|
+
import isCellEditable from '../editing/isCellEditable.js';
|
|
17
|
+
import setRowField from '../editing/setRowField.js';
|
|
18
|
+
import validateCellValue from '../editing/validateCellValue.js';
|
|
19
|
+
// Maps a pasted TSV grid onto the table from the focused cell: row i of the grid lands on the
|
|
20
|
+
// i-th display row below it, column j on the j-th layout column to its right. Each target is
|
|
21
|
+
// resolved to its row key (never its display index), coerced to the column's type and
|
|
22
|
+
// validated. Cells that cannot take their text are skipped with the reason, never half-written.
|
|
23
|
+
// Returns { updates: [{ rowKey, field, value }], skipped: [{ rowKey, column, text, reason }] }.
|
|
24
|
+
function planPaste({ grid, rows, cols, specs, getKey, startRow, startCol }) {
|
|
25
|
+
const updates = [];
|
|
26
|
+
const skipped = [];
|
|
27
|
+
grid.forEach((line, i)=>{
|
|
28
|
+
const row = rows[startRow + i];
|
|
29
|
+
line.forEach((text, j)=>{
|
|
30
|
+
const col = cols[startCol + j];
|
|
31
|
+
if (!row || !col || col.special) {
|
|
32
|
+
skipped.push({
|
|
33
|
+
rowKey: null,
|
|
34
|
+
column: col?.key ?? null,
|
|
35
|
+
text,
|
|
36
|
+
reason: 'Outside the table.'
|
|
37
|
+
});
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const rowKey = getKey(row.original);
|
|
41
|
+
const spec = specs.get(col.key);
|
|
42
|
+
const previous = col.accessor(row.original);
|
|
43
|
+
if (!isCellEditable({
|
|
44
|
+
spec,
|
|
45
|
+
row: row.original,
|
|
46
|
+
value: previous
|
|
47
|
+
})) {
|
|
48
|
+
skipped.push({
|
|
49
|
+
rowKey,
|
|
50
|
+
column: col.key,
|
|
51
|
+
text,
|
|
52
|
+
reason: 'Not editable.'
|
|
53
|
+
});
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const coerced = coerceCellValue({
|
|
57
|
+
spec,
|
|
58
|
+
text,
|
|
59
|
+
previous
|
|
60
|
+
});
|
|
61
|
+
if (coerced.error) {
|
|
62
|
+
skipped.push({
|
|
63
|
+
rowKey,
|
|
64
|
+
column: col.key,
|
|
65
|
+
text,
|
|
66
|
+
reason: coerced.error
|
|
67
|
+
});
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const nextRow = setRowField({
|
|
71
|
+
row: row.original,
|
|
72
|
+
field: spec.field,
|
|
73
|
+
value: coerced.value
|
|
74
|
+
});
|
|
75
|
+
const message = validateCellValue({
|
|
76
|
+
spec,
|
|
77
|
+
row: nextRow,
|
|
78
|
+
value: coerced.value
|
|
79
|
+
});
|
|
80
|
+
if (message !== null) {
|
|
81
|
+
skipped.push({
|
|
82
|
+
rowKey,
|
|
83
|
+
column: col.key,
|
|
84
|
+
text,
|
|
85
|
+
reason: message
|
|
86
|
+
});
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
updates.push({
|
|
90
|
+
rowKey,
|
|
91
|
+
field: spec.field,
|
|
92
|
+
value: coerced.value
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
return {
|
|
97
|
+
updates,
|
|
98
|
+
skipped
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
export default planPaste;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2020-2026 Lowdefy, Inc
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
*/ import { type } from '@lowdefy/helpers';
|
|
16
|
+
function toField(value) {
|
|
17
|
+
const text = type.isNone(value) ? '' : String(value);
|
|
18
|
+
if (!/[\t\r\n"]/.test(text)) return text;
|
|
19
|
+
return `"${text.replace(/"/g, '""')}"`;
|
|
20
|
+
}
|
|
21
|
+
// The inverse of parseTsv: a grid of values as TSV a spreadsheet pastes into cells.
|
|
22
|
+
function serializeTsv(grid) {
|
|
23
|
+
return grid.map((row)=>row.map(toField).join('\t')).join('\n');
|
|
24
|
+
}
|
|
25
|
+
export default serializeTsv;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2020-2026 Lowdefy, Inc
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
*/ import { useEffect } from 'react';
|
|
16
|
+
const NONE = {};
|
|
17
|
+
// Ctrl/Cmd+V is read from the `paste` event, not the key: the event carries the clipboard text
|
|
18
|
+
// without a permission prompt. It is fired at the focused cell and delegated from the root (one
|
|
19
|
+
// listener per table, like the grid's other events). Pastes into an open editor are the editor's.
|
|
20
|
+
function usePasteListener({ api }) {
|
|
21
|
+
useEffect(()=>{
|
|
22
|
+
const root = api.rootRef.current;
|
|
23
|
+
if (!root) return undefined;
|
|
24
|
+
function onPaste(event) {
|
|
25
|
+
if (!api.editing?.input || !api.config.keyboard) return;
|
|
26
|
+
const cell = event.target.closest?.('[data-lf-cell]');
|
|
27
|
+
if (!cell || !api.contains(cell) || event.target.closest('[data-lf-editor]')) return;
|
|
28
|
+
const rowElement = cell.closest('[data-row-index]');
|
|
29
|
+
const rowIndex = Number(rowElement?.dataset.rowIndex);
|
|
30
|
+
if (!(rowIndex >= 0)) return;
|
|
31
|
+
const text = event.clipboardData?.getData('text/plain');
|
|
32
|
+
if (!text) return;
|
|
33
|
+
event.preventDefault();
|
|
34
|
+
api.actions.pasteCells({
|
|
35
|
+
text,
|
|
36
|
+
rowIndex,
|
|
37
|
+
colIndex: Number(cell.dataset.colIndex)
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
root.addEventListener('paste', onPaste);
|
|
41
|
+
return ()=>root.removeEventListener('paste', onPaste);
|
|
42
|
+
}, []);
|
|
43
|
+
return NONE;
|
|
44
|
+
}
|
|
45
|
+
export default usePasteListener;
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2020-2026 Lowdefy, Inc
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
*/ import React, { useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
16
|
+
import { Button, Checkbox, Input } from 'antd';
|
|
17
|
+
import applyManagerRegions from './applyManagerRegions.js';
|
|
18
|
+
import buildManagerSequence from './buildManagerSequence.js';
|
|
19
|
+
import DragHandleIcon from './DragHandleIcon.js';
|
|
20
|
+
import getManagerEntries from './getManagerEntries.js';
|
|
21
|
+
import getPlainTitle from '../filtering/getPlainTitle.js';
|
|
22
|
+
import moveSequenceEntry from './moveSequenceEntry.js';
|
|
23
|
+
import sequenceToRegions from './sequenceToRegions.js';
|
|
24
|
+
import snapListHeight from './snapListHeight.js';
|
|
25
|
+
import getListRoom from './getListRoom.js';
|
|
26
|
+
import updateScrollHints from './updateScrollHints.js';
|
|
27
|
+
const BOUNDARY_LABELS = {
|
|
28
|
+
start: 'Pinned to start above',
|
|
29
|
+
end: 'Pinned to end below'
|
|
30
|
+
};
|
|
31
|
+
function commitSequence({ api, sequence }) {
|
|
32
|
+
const next = applyManagerRegions({
|
|
33
|
+
state: api.state,
|
|
34
|
+
regions: sequenceToRegions(sequence)
|
|
35
|
+
});
|
|
36
|
+
api.updateSlice('columnOrder', ()=>next.columnOrder);
|
|
37
|
+
api.updateSlice('columnPinning', ()=>next.columnPinning);
|
|
38
|
+
}
|
|
39
|
+
function setVisible({ api, key, visible }) {
|
|
40
|
+
api.updateSlice('columnVisibility', (visibility)=>({
|
|
41
|
+
...visibility,
|
|
42
|
+
[key]: visible
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
// The column manager list. Visible columns show in table order with the two pinned boundaries
|
|
46
|
+
// between them; drag a handle (or press Alt+ArrowUp / Alt+ArrowDown on it) to move a column or a
|
|
47
|
+
// boundary. Each drop, checkbox or reset is one `columns` change. Searching filters the list and
|
|
48
|
+
// turns reordering off, since positions in a filtered list are ambiguous.
|
|
49
|
+
function ColumnManager({ api }) {
|
|
50
|
+
const [search, setSearch] = useState('');
|
|
51
|
+
const [drag, setDrag] = useState(null);
|
|
52
|
+
const [drop, setDrop] = useState(null);
|
|
53
|
+
const focusAfterMove = useRef(null);
|
|
54
|
+
const listRef = useRef(null);
|
|
55
|
+
const columnsByKey = new Map(api.config.columns.map((column)=>[
|
|
56
|
+
column.key,
|
|
57
|
+
column
|
|
58
|
+
]));
|
|
59
|
+
const entries = getManagerEntries({
|
|
60
|
+
state: api.state
|
|
61
|
+
});
|
|
62
|
+
const sequence = buildManagerSequence(entries);
|
|
63
|
+
const visibleCount = entries.start.length + entries.center.length + entries.end.length;
|
|
64
|
+
const term = search.trim().toLowerCase();
|
|
65
|
+
const searching = term !== '';
|
|
66
|
+
const matches = (key)=>{
|
|
67
|
+
const column = columnsByKey.get(key);
|
|
68
|
+
return getPlainTitle(column).toLowerCase().includes(term) || column.key.toLowerCase().includes(term);
|
|
69
|
+
};
|
|
70
|
+
function sizeList() {
|
|
71
|
+
const list = listRef.current;
|
|
72
|
+
const anchor = api.rootRef.current?.querySelector('.lf-table-manager-anchor');
|
|
73
|
+
snapListHeight({
|
|
74
|
+
limit: getListRoom({
|
|
75
|
+
anchor,
|
|
76
|
+
list
|
|
77
|
+
}),
|
|
78
|
+
list
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
useLayoutEffect(sizeList);
|
|
82
|
+
// The popover lays its content out hidden first, so size the list again once it has a size, and
|
|
83
|
+
// when the viewport changes.
|
|
84
|
+
useEffect(()=>{
|
|
85
|
+
const observer = new ResizeObserver(sizeList);
|
|
86
|
+
observer.observe(listRef.current);
|
|
87
|
+
window.addEventListener('resize', sizeList);
|
|
88
|
+
return ()=>{
|
|
89
|
+
observer.disconnect();
|
|
90
|
+
window.removeEventListener('resize', sizeList);
|
|
91
|
+
};
|
|
92
|
+
}, []);
|
|
93
|
+
useEffect(()=>{
|
|
94
|
+
if (focusAfterMove.current === null) return;
|
|
95
|
+
const handle = listRef.current?.querySelector(`[data-drag-id="${CSS.escape(focusAfterMove.current)}"]`);
|
|
96
|
+
focusAfterMove.current = null;
|
|
97
|
+
handle?.focus();
|
|
98
|
+
});
|
|
99
|
+
function move({ from, to }) {
|
|
100
|
+
const next = moveSequenceEntry({
|
|
101
|
+
sequence,
|
|
102
|
+
from,
|
|
103
|
+
to
|
|
104
|
+
});
|
|
105
|
+
if (next !== sequence) commitSequence({
|
|
106
|
+
api,
|
|
107
|
+
sequence: next
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
function onHandleKeyDown(event, index) {
|
|
111
|
+
if (!event.altKey || event.key !== 'ArrowUp' && event.key !== 'ArrowDown') return;
|
|
112
|
+
event.preventDefault();
|
|
113
|
+
const to = event.key === 'ArrowUp' ? index - 1 : index + 2;
|
|
114
|
+
if (to < 0 || to > sequence.length) return;
|
|
115
|
+
focusAfterMove.current = sequence[index].id;
|
|
116
|
+
move({
|
|
117
|
+
from: index,
|
|
118
|
+
to
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
function onDragOver(event, index) {
|
|
122
|
+
if (drag === null) return;
|
|
123
|
+
event.preventDefault();
|
|
124
|
+
const rect = event.currentTarget.getBoundingClientRect();
|
|
125
|
+
const after = event.clientY > rect.top + rect.height / 2;
|
|
126
|
+
const position = after ? index + 1 : index;
|
|
127
|
+
if (drop !== position) setDrop(position);
|
|
128
|
+
}
|
|
129
|
+
function onDrop(event) {
|
|
130
|
+
event.preventDefault();
|
|
131
|
+
if (drag !== null && drop !== null) move({
|
|
132
|
+
from: drag,
|
|
133
|
+
to: drop
|
|
134
|
+
});
|
|
135
|
+
setDrag(null);
|
|
136
|
+
setDrop(null);
|
|
137
|
+
}
|
|
138
|
+
function renderHandle({ entry, index, label }) {
|
|
139
|
+
return /*#__PURE__*/ React.createElement("button", {
|
|
140
|
+
"aria-label": `Move ${label}`,
|
|
141
|
+
className: "lf-table-manager-handle",
|
|
142
|
+
"data-drag-id": entry.id,
|
|
143
|
+
draggable: true,
|
|
144
|
+
onDragEnd: ()=>{
|
|
145
|
+
setDrag(null);
|
|
146
|
+
setDrop(null);
|
|
147
|
+
},
|
|
148
|
+
onDragStart: (event)=>{
|
|
149
|
+
event.dataTransfer.effectAllowed = 'move';
|
|
150
|
+
event.dataTransfer.setData('text/plain', entry.id);
|
|
151
|
+
setDrag(index);
|
|
152
|
+
},
|
|
153
|
+
onKeyDown: (event)=>onHandleKeyDown(event, index),
|
|
154
|
+
type: "button"
|
|
155
|
+
}, /*#__PURE__*/ React.createElement(DragHandleIcon, null));
|
|
156
|
+
}
|
|
157
|
+
function dropSide(index) {
|
|
158
|
+
if (drop === index) return 'before';
|
|
159
|
+
if (drop === index + 1 && index === sequence.length - 1) return 'after';
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
function renderVisible(entry, index) {
|
|
163
|
+
if (entry.boundary) {
|
|
164
|
+
if (searching) return null;
|
|
165
|
+
return /*#__PURE__*/ React.createElement("div", {
|
|
166
|
+
className: "lf-table-manager-boundary",
|
|
167
|
+
"data-boundary": entry.boundary,
|
|
168
|
+
"data-lf-manager-boundary": "",
|
|
169
|
+
key: entry.id,
|
|
170
|
+
"data-drop": dropSide(index),
|
|
171
|
+
onDragOver: (event)=>onDragOver(event, index),
|
|
172
|
+
onDrop: onDrop
|
|
173
|
+
}, renderHandle({
|
|
174
|
+
entry,
|
|
175
|
+
index,
|
|
176
|
+
label: `${entry.boundary} pinned boundary`
|
|
177
|
+
}), /*#__PURE__*/ React.createElement("span", {
|
|
178
|
+
className: "lf-table-manager-boundary-label"
|
|
179
|
+
}, BOUNDARY_LABELS[entry.boundary]));
|
|
180
|
+
}
|
|
181
|
+
if (searching && !matches(entry.key)) return null;
|
|
182
|
+
const column = columnsByKey.get(entry.key);
|
|
183
|
+
const title = getPlainTitle(column);
|
|
184
|
+
return /*#__PURE__*/ React.createElement("div", {
|
|
185
|
+
className: "lf-table-manager-item",
|
|
186
|
+
"data-col-key": entry.key,
|
|
187
|
+
"data-lf-manager-item": "",
|
|
188
|
+
"data-visible": "",
|
|
189
|
+
key: entry.id,
|
|
190
|
+
"data-drop": dropSide(index),
|
|
191
|
+
onDragOver: (event)=>onDragOver(event, index),
|
|
192
|
+
onDrop: onDrop
|
|
193
|
+
}, searching ? null : renderHandle({
|
|
194
|
+
entry,
|
|
195
|
+
index,
|
|
196
|
+
label: title
|
|
197
|
+
}), /*#__PURE__*/ React.createElement(Checkbox, {
|
|
198
|
+
checked: true,
|
|
199
|
+
disabled: visibleCount <= 1,
|
|
200
|
+
onChange: ()=>setVisible({
|
|
201
|
+
api,
|
|
202
|
+
key: entry.key,
|
|
203
|
+
visible: false
|
|
204
|
+
})
|
|
205
|
+
}, title));
|
|
206
|
+
}
|
|
207
|
+
const hidden = entries.hidden.filter((key)=>!searching || matches(key));
|
|
208
|
+
return /*#__PURE__*/ React.createElement("div", {
|
|
209
|
+
className: "lf-table-column-manager",
|
|
210
|
+
"data-lf-column-manager": "",
|
|
211
|
+
onKeyDown: (event)=>{
|
|
212
|
+
if (event.key !== 'Escape') return;
|
|
213
|
+
event.stopPropagation();
|
|
214
|
+
api.actions.closeColumnManager();
|
|
215
|
+
}
|
|
216
|
+
}, /*#__PURE__*/ React.createElement("div", {
|
|
217
|
+
className: "lf-table-overlay-title"
|
|
218
|
+
}, "Columns"), /*#__PURE__*/ React.createElement(Input, {
|
|
219
|
+
allowClear: true,
|
|
220
|
+
"aria-label": "Search columns",
|
|
221
|
+
autoFocus: true,
|
|
222
|
+
onChange: (event)=>setSearch(event.target.value),
|
|
223
|
+
placeholder: "Search columns",
|
|
224
|
+
size: "small",
|
|
225
|
+
value: search
|
|
226
|
+
}), /*#__PURE__*/ React.createElement("div", {
|
|
227
|
+
className: "lf-table-manager-list",
|
|
228
|
+
onScroll: (event)=>updateScrollHints(event.currentTarget),
|
|
229
|
+
ref: listRef
|
|
230
|
+
}, sequence.map(renderVisible), hidden.length ? /*#__PURE__*/ React.createElement("div", {
|
|
231
|
+
className: "lf-table-manager-heading"
|
|
232
|
+
}, "Hidden") : null, hidden.map((key)=>/*#__PURE__*/ React.createElement("div", {
|
|
233
|
+
className: "lf-table-manager-item",
|
|
234
|
+
"data-col-key": key,
|
|
235
|
+
"data-lf-manager-item": "",
|
|
236
|
+
key: `hidden:${key}`
|
|
237
|
+
}, /*#__PURE__*/ React.createElement("span", {
|
|
238
|
+
className: "lf-table-manager-handle-spacer"
|
|
239
|
+
}), /*#__PURE__*/ React.createElement(Checkbox, {
|
|
240
|
+
checked: false,
|
|
241
|
+
onChange: ()=>setVisible({
|
|
242
|
+
api,
|
|
243
|
+
key,
|
|
244
|
+
visible: true
|
|
245
|
+
})
|
|
246
|
+
}, getPlainTitle(columnsByKey.get(key)))))), /*#__PURE__*/ React.createElement("div", {
|
|
247
|
+
className: "lf-table-overlay-footer"
|
|
248
|
+
}, /*#__PURE__*/ React.createElement(Button, {
|
|
249
|
+
onClick: ()=>api.actions.resetColumns(),
|
|
250
|
+
size: "small"
|
|
251
|
+
}, "Reset to default")));
|
|
252
|
+
}
|
|
253
|
+
export default ColumnManager;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2020-2026 Lowdefy, Inc
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
*/ import React from 'react';
|
|
16
|
+
import { Popover } from 'antd';
|
|
17
|
+
import ColumnManager from './ColumnManager.js';
|
|
18
|
+
// Anchored to the table's top end corner, below the header.
|
|
19
|
+
function ColumnManagerPopover({ api }) {
|
|
20
|
+
return /*#__PURE__*/ React.createElement(Popover, {
|
|
21
|
+
arrow: false,
|
|
22
|
+
content: /*#__PURE__*/ React.createElement(ColumnManager, {
|
|
23
|
+
api: api
|
|
24
|
+
}),
|
|
25
|
+
onOpenChange: (open)=>{
|
|
26
|
+
if (!open) api.actions.closeColumnManager();
|
|
27
|
+
},
|
|
28
|
+
open: true,
|
|
29
|
+
placement: "bottomRight",
|
|
30
|
+
trigger: [
|
|
31
|
+
'click'
|
|
32
|
+
]
|
|
33
|
+
}, /*#__PURE__*/ React.createElement("span", {
|
|
34
|
+
className: "lf-table-manager-anchor"
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
export default ColumnManagerPopover;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2020-2026 Lowdefy, Inc
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
*/ import React from 'react';
|
|
16
|
+
function DragHandleIcon() {
|
|
17
|
+
return /*#__PURE__*/ React.createElement("svg", {
|
|
18
|
+
"aria-hidden": "true",
|
|
19
|
+
className: "lf-table-icon",
|
|
20
|
+
viewBox: "0 0 16 16"
|
|
21
|
+
}, [
|
|
22
|
+
4,
|
|
23
|
+
8,
|
|
24
|
+
12
|
|
25
|
+
].map((y)=>/*#__PURE__*/ React.createElement(React.Fragment, {
|
|
26
|
+
key: y
|
|
27
|
+
}, /*#__PURE__*/ React.createElement("circle", {
|
|
28
|
+
cx: "6",
|
|
29
|
+
cy: y,
|
|
30
|
+
fill: "currentColor",
|
|
31
|
+
r: "1.1"
|
|
32
|
+
}), /*#__PURE__*/ React.createElement("circle", {
|
|
33
|
+
cx: "10",
|
|
34
|
+
cy: y,
|
|
35
|
+
fill: "currentColor",
|
|
36
|
+
r: "1.1"
|
|
37
|
+
}))));
|
|
38
|
+
}
|
|
39
|
+
export default DragHandleIcon;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2020-2026 Lowdefy, Inc
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
*/ import lazyComponent from '../../core/lazyComponent.js';
|
|
16
|
+
// The column manager, loaded when it first opens (the Columns button and the header menu preload
|
|
17
|
+
// it).
|
|
18
|
+
const LazyColumnManagerPopover = lazyComponent(()=>import('./ColumnManagerPopover.js'));
|
|
19
|
+
export default LazyColumnManagerPopover;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2020-2026 Lowdefy, Inc
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
*/ import moveKeys from '../ordering/moveKeys.js';
|
|
16
|
+
// The column state for a reordered manager list: visible columns take the view-order slots they
|
|
17
|
+
// already held in their new order (hidden columns keep theirs), and the pinned regions follow the
|
|
18
|
+
// boundaries. Hidden pinned columns stay pinned.
|
|
19
|
+
function applyManagerRegions({ state, regions }) {
|
|
20
|
+
const { columnOrder, columnPinning, columnVisibility } = state;
|
|
21
|
+
const isHidden = (key)=>columnVisibility[key] === false;
|
|
22
|
+
return {
|
|
23
|
+
columnOrder: moveKeys({
|
|
24
|
+
order: columnOrder,
|
|
25
|
+
sequence: [
|
|
26
|
+
...regions.start,
|
|
27
|
+
...regions.center,
|
|
28
|
+
...regions.end
|
|
29
|
+
]
|
|
30
|
+
}),
|
|
31
|
+
columnPinning: {
|
|
32
|
+
start: [
|
|
33
|
+
...columnPinning.start.filter(isHidden),
|
|
34
|
+
...regions.start
|
|
35
|
+
],
|
|
36
|
+
end: [
|
|
37
|
+
...regions.end,
|
|
38
|
+
...columnPinning.end.filter(isHidden)
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export default applyManagerRegions;
|