@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,89 @@
|
|
|
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, { useSyncExternalStore } from 'react';
|
|
16
|
+
function GripIcon() {
|
|
17
|
+
return /*#__PURE__*/ React.createElement("svg", {
|
|
18
|
+
"aria-hidden": "true",
|
|
19
|
+
fill: "currentColor",
|
|
20
|
+
height: "14",
|
|
21
|
+
viewBox: "0 0 10 16",
|
|
22
|
+
width: "9"
|
|
23
|
+
}, /*#__PURE__*/ React.createElement("circle", {
|
|
24
|
+
cx: "2.5",
|
|
25
|
+
cy: "3",
|
|
26
|
+
r: "1.5"
|
|
27
|
+
}), /*#__PURE__*/ React.createElement("circle", {
|
|
28
|
+
cx: "7.5",
|
|
29
|
+
cy: "3",
|
|
30
|
+
r: "1.5"
|
|
31
|
+
}), /*#__PURE__*/ React.createElement("circle", {
|
|
32
|
+
cx: "2.5",
|
|
33
|
+
cy: "8",
|
|
34
|
+
r: "1.5"
|
|
35
|
+
}), /*#__PURE__*/ React.createElement("circle", {
|
|
36
|
+
cx: "7.5",
|
|
37
|
+
cy: "8",
|
|
38
|
+
r: "1.5"
|
|
39
|
+
}), /*#__PURE__*/ React.createElement("circle", {
|
|
40
|
+
cx: "2.5",
|
|
41
|
+
cy: "13",
|
|
42
|
+
r: "1.5"
|
|
43
|
+
}), /*#__PURE__*/ React.createElement("circle", {
|
|
44
|
+
cx: "7.5",
|
|
45
|
+
cy: "13",
|
|
46
|
+
r: "1.5"
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
function DeleteIcon() {
|
|
50
|
+
return /*#__PURE__*/ React.createElement("svg", {
|
|
51
|
+
"aria-hidden": "true",
|
|
52
|
+
fill: "none",
|
|
53
|
+
height: "14",
|
|
54
|
+
stroke: "currentColor",
|
|
55
|
+
strokeLinecap: "round",
|
|
56
|
+
strokeWidth: "2",
|
|
57
|
+
viewBox: "0 0 24 24",
|
|
58
|
+
width: "14"
|
|
59
|
+
}, /*#__PURE__*/ React.createElement("path", {
|
|
60
|
+
d: "M18 6 6 18M6 6l12 12"
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
// The leading row controls: the drag handle (`rowDrag`, Table and TableInput) and TableInput's
|
|
64
|
+
// delete button (`rowActions.delete`). Plain DOM like every tier-0 cell; the delegated handlers
|
|
65
|
+
// do the work. Only the handle's disabled state is live (a sorted, filtered or grouped table
|
|
66
|
+
// cannot reorder; the tooltip says why), through a store, so a sort re-renders these cells and
|
|
67
|
+
// not the rows.
|
|
68
|
+
function RowControlsCell({ api }) {
|
|
69
|
+
const { options, reorderBlock } = api.editing;
|
|
70
|
+
const blocked = useSyncExternalStore(reorderBlock.subscribe, reorderBlock.get);
|
|
71
|
+
return /*#__PURE__*/ React.createElement("span", {
|
|
72
|
+
className: "lf-table-row-controls"
|
|
73
|
+
}, options.rowDrag ? /*#__PURE__*/ React.createElement("span", {
|
|
74
|
+
"aria-disabled": blocked ? true : undefined,
|
|
75
|
+
"aria-label": "Drag to reorder",
|
|
76
|
+
className: "lf-table-drag-handle",
|
|
77
|
+
"data-lf-drag-handle": "",
|
|
78
|
+
role: "button",
|
|
79
|
+
title: blocked ?? 'Drag to reorder (Alt+Shift+Arrow keys)'
|
|
80
|
+
}, /*#__PURE__*/ React.createElement(GripIcon, null)) : null, options.deleteButton ? /*#__PURE__*/ React.createElement("button", {
|
|
81
|
+
"aria-label": "Delete row",
|
|
82
|
+
className: "lf-table-row-delete",
|
|
83
|
+
"data-lf-row-delete": "",
|
|
84
|
+
tabIndex: -1,
|
|
85
|
+
title: "Delete row",
|
|
86
|
+
type: "button"
|
|
87
|
+
}, /*#__PURE__*/ React.createElement(DeleteIcon, null)) : null);
|
|
88
|
+
}
|
|
89
|
+
export default RowControlsCell;
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
*/ function RowControlsHeader() {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
export default RowControlsHeader;
|
|
@@ -0,0 +1,33 @@
|
|
|
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 keepFocus(event) {
|
|
17
|
+
event.preventDefault();
|
|
18
|
+
event.stopPropagation();
|
|
19
|
+
}
|
|
20
|
+
// A picked value in the tags editor (antd Select `tagRender`): the value's chip as the cell shows
|
|
21
|
+
// it, with a remove button, instead of antd's own tag around the chip.
|
|
22
|
+
function SelectedTag({ closable, label, onClose }) {
|
|
23
|
+
return /*#__PURE__*/ React.createElement("span", {
|
|
24
|
+
className: "lf-table-editor-tag",
|
|
25
|
+
onMouseDown: keepFocus
|
|
26
|
+
}, label, closable ? /*#__PURE__*/ React.createElement("button", {
|
|
27
|
+
"aria-label": "Remove",
|
|
28
|
+
className: "lf-table-editor-tag-remove",
|
|
29
|
+
onClick: onClose,
|
|
30
|
+
type: "button"
|
|
31
|
+
}, "×") : null);
|
|
32
|
+
}
|
|
33
|
+
export default SelectedTag;
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
*/ // A row added in TableInput: `{ rowKey, ...fields }` at the end of `added` (and of `order`, when a
|
|
16
|
+
// move recorded one).
|
|
17
|
+
function addChangeRow({ changes, rowKey, fields }) {
|
|
18
|
+
const next = {
|
|
19
|
+
...changes,
|
|
20
|
+
added: [
|
|
21
|
+
...changes.added,
|
|
22
|
+
{
|
|
23
|
+
rowKey,
|
|
24
|
+
...fields
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
};
|
|
28
|
+
if (changes.order) next.order = [
|
|
29
|
+
...changes.order,
|
|
30
|
+
rowKey
|
|
31
|
+
];
|
|
32
|
+
return next;
|
|
33
|
+
}
|
|
34
|
+
export default addChangeRow;
|
|
@@ -0,0 +1,28 @@
|
|
|
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 setChangeField from './setChangeField.js';
|
|
16
|
+
// Many cell writes (a paste) folded into one changeset, so they are one value write and one undo
|
|
17
|
+
// step. `updates` is [{ rowKey, field, value }]; `dataByKey` maps a row key (as a string) to its
|
|
18
|
+
// unchanged data row, and has no entry for rows added in the table.
|
|
19
|
+
function applyChangeUpdates({ changes, updates, dataByKey }) {
|
|
20
|
+
return updates.reduce((current, { rowKey, field, value })=>setChangeField({
|
|
21
|
+
changes: current,
|
|
22
|
+
rowKey,
|
|
23
|
+
field,
|
|
24
|
+
value,
|
|
25
|
+
dataRow: dataByKey.get(String(rowKey))
|
|
26
|
+
}), changes);
|
|
27
|
+
}
|
|
28
|
+
export default applyChangeUpdates;
|
|
@@ -0,0 +1,90 @@
|
|
|
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 { get, serializer, set, type } from '@lowdefy/helpers';
|
|
16
|
+
import reorderByKeys from './reorderByKeys.js';
|
|
17
|
+
import sortByPosition from './sortByPosition.js';
|
|
18
|
+
function patchRow({ row, patch, position, positionField, cache }) {
|
|
19
|
+
const cached = cache.get(row);
|
|
20
|
+
if (cached && cached.patch === patch && cached.position === position) return cached.result;
|
|
21
|
+
const result = serializer.copy(row);
|
|
22
|
+
Object.entries(patch ?? {}).forEach(([field, value])=>set(result, field, serializer.copy(value)));
|
|
23
|
+
if (!type.isUndefined(position)) set(result, positionField, position);
|
|
24
|
+
cache.set(row, {
|
|
25
|
+
patch,
|
|
26
|
+
position,
|
|
27
|
+
result
|
|
28
|
+
});
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
function addedRow({ entry, keyField, cache }) {
|
|
32
|
+
const cached = cache.get(entry);
|
|
33
|
+
if (cached) return cached;
|
|
34
|
+
const { rowKey, ...fields } = entry;
|
|
35
|
+
const result = serializer.copy(fields);
|
|
36
|
+
if (type.isNone(get(result, keyField))) set(result, keyField, rowKey);
|
|
37
|
+
cache.set(entry, result);
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
// The rows TableInput shows: `data` with its changeset applied. Removed rows leave, updated rows
|
|
41
|
+
// are copies with the changed fields set at their dot paths, added rows follow the data (with
|
|
42
|
+
// their key in the key field), and moves reorder (by `order`, or by the position field when
|
|
43
|
+
// positions changed). `data` is never written. Untouched rows keep their identity, and `cache`
|
|
44
|
+
// (a WeakMap owned by the table) keeps a touched row's copy while its patch object is the same,
|
|
45
|
+
// so an edit re-renders the rows it changed and no others.
|
|
46
|
+
function applyChanges({ rows, changes, getKey, keyField, positionField, cache }) {
|
|
47
|
+
const { added, moved, order, removed, updated } = changes;
|
|
48
|
+
const hasMoves = Boolean(moved) && Object.keys(moved).length > 0;
|
|
49
|
+
if (Object.keys(updated).length === 0 && removed.length === 0 && added.length === 0 && !hasMoves && !order) {
|
|
50
|
+
return rows;
|
|
51
|
+
}
|
|
52
|
+
const removedKeys = new Set(removed.map(String));
|
|
53
|
+
let result = [];
|
|
54
|
+
rows.forEach((row)=>{
|
|
55
|
+
const key = String(getKey(row));
|
|
56
|
+
if (removedKeys.has(key)) return;
|
|
57
|
+
const patch = updated[key];
|
|
58
|
+
const position = hasMoves && positionField ? moved[key] : undefined;
|
|
59
|
+
if (!patch && type.isUndefined(position)) {
|
|
60
|
+
result.push(row);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
result.push(patchRow({
|
|
64
|
+
row,
|
|
65
|
+
patch,
|
|
66
|
+
position,
|
|
67
|
+
positionField,
|
|
68
|
+
cache
|
|
69
|
+
}));
|
|
70
|
+
});
|
|
71
|
+
added.forEach((entry)=>result.push(addedRow({
|
|
72
|
+
entry,
|
|
73
|
+
keyField,
|
|
74
|
+
cache
|
|
75
|
+
})));
|
|
76
|
+
if (order) {
|
|
77
|
+
result = reorderByKeys({
|
|
78
|
+
rows: result,
|
|
79
|
+
order,
|
|
80
|
+
getKey
|
|
81
|
+
});
|
|
82
|
+
} else if (positionField && (hasMoves || added.length > 0)) {
|
|
83
|
+
result = sortByPosition({
|
|
84
|
+
rows: result,
|
|
85
|
+
positionField
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
export default applyChanges;
|
|
@@ -0,0 +1,44 @@
|
|
|
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 { serializer, set } from '@lowdefy/helpers';
|
|
16
|
+
import reorderByKeys from './reorderByKeys.js';
|
|
17
|
+
import sortByPosition from './sortByPosition.js';
|
|
18
|
+
// Table's optimistic row move (the onRowMove cycle, like onCellEdit's overlay): while the event
|
|
19
|
+
// runs, and after it succeeded until `data` changes, the rows show in the moved order. With a
|
|
20
|
+
// position field the moved rows get their new positions (on copies) and the rows are ordered by
|
|
21
|
+
// it; without one they follow the move's key order. `data` is the array the move was made on.
|
|
22
|
+
// Copies are mapped to their data rows in `sources`, as the cell overlay's are.
|
|
23
|
+
function applyMoveOverlay({ rows, move, data, getKey, positionField, sources }) {
|
|
24
|
+
if (!move || !move.hasValue) return rows;
|
|
25
|
+
if (move.status !== 'saving' && move.source !== data) return rows;
|
|
26
|
+
if (!positionField) return reorderByKeys({
|
|
27
|
+
rows,
|
|
28
|
+
order: move.order,
|
|
29
|
+
getKey
|
|
30
|
+
});
|
|
31
|
+
const positioned = rows.map((row)=>{
|
|
32
|
+
const position = move.positions[String(getKey(row))];
|
|
33
|
+
if (position === undefined) return row;
|
|
34
|
+
const copy = serializer.copy(row);
|
|
35
|
+
set(copy, positionField, position);
|
|
36
|
+
sources.set(copy, sources.get(row) ?? row);
|
|
37
|
+
return copy;
|
|
38
|
+
});
|
|
39
|
+
return sortByPosition({
|
|
40
|
+
rows: positioned,
|
|
41
|
+
positionField
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export default applyMoveOverlay;
|
|
@@ -0,0 +1,66 @@
|
|
|
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 { get, serializer, set } from '@lowdefy/helpers';
|
|
16
|
+
function applyPositions({ changes, positions, positionField, dataByKey }) {
|
|
17
|
+
const moved = {
|
|
18
|
+
...changes.moved ?? {}
|
|
19
|
+
};
|
|
20
|
+
let added = changes.added;
|
|
21
|
+
Object.entries(positions).forEach(([key, position])=>{
|
|
22
|
+
const addedIndex = added.findIndex((entry)=>String(entry.rowKey) === key);
|
|
23
|
+
if (addedIndex !== -1) {
|
|
24
|
+
// An added row carries its position in its own entry, like its other fields.
|
|
25
|
+
added = added.slice();
|
|
26
|
+
const entry = serializer.copy(added[addedIndex]);
|
|
27
|
+
set(entry, positionField, position);
|
|
28
|
+
added[addedIndex] = entry;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const dataRow = dataByKey.get(key);
|
|
32
|
+
if (dataRow !== undefined && get(dataRow, positionField) === position) {
|
|
33
|
+
delete moved[key];
|
|
34
|
+
} else {
|
|
35
|
+
moved[key] = position;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
const next = {
|
|
39
|
+
...changes,
|
|
40
|
+
added
|
|
41
|
+
};
|
|
42
|
+
if (Object.keys(moved).length > 0) {
|
|
43
|
+
next.moved = moved;
|
|
44
|
+
} else {
|
|
45
|
+
delete next.moved;
|
|
46
|
+
}
|
|
47
|
+
return next;
|
|
48
|
+
}
|
|
49
|
+
// A TableInput row move as a new changeset. With `positionField` the new positions go in
|
|
50
|
+
// `moved` (a data row moved back to its original position leaves it); without one, `order`
|
|
51
|
+
// records the full key order.
|
|
52
|
+
function applyMoveToChanges({ changes, move, positionField, dataByKey }) {
|
|
53
|
+
if (positionField) {
|
|
54
|
+
return applyPositions({
|
|
55
|
+
changes,
|
|
56
|
+
positions: move.positions,
|
|
57
|
+
positionField,
|
|
58
|
+
dataByKey
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
...changes,
|
|
63
|
+
order: move.order
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export default applyMoveToChanges;
|
|
@@ -0,0 +1,41 @@
|
|
|
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 { serializer, set } from '@lowdefy/helpers';
|
|
16
|
+
// The optimistic overlay (D8) over `data`: rows with an edit that is saving, or saved and not yet
|
|
17
|
+
// replaced by new data, are shown as copies with the edited values in. `data` itself is never
|
|
18
|
+
// written. A saved edit stops applying once its row in `data` is a different object than the one
|
|
19
|
+
// it was made on: the data has caught up (or moved on). `sources` maps each copy back to its data
|
|
20
|
+
// row, so the next edit of the same row records the data row, not the copy.
|
|
21
|
+
function applyOverlay({ rows, overlay, getKey, sources }) {
|
|
22
|
+
if (overlay.size === 0) return rows;
|
|
23
|
+
const byRow = new Map();
|
|
24
|
+
overlay.forEach((entry)=>{
|
|
25
|
+
if (!entry.hasValue) return;
|
|
26
|
+
if (!byRow.has(entry.rowKey)) byRow.set(entry.rowKey, []);
|
|
27
|
+
byRow.get(entry.rowKey).push(entry);
|
|
28
|
+
});
|
|
29
|
+
if (byRow.size === 0) return rows;
|
|
30
|
+
return rows.map((row)=>{
|
|
31
|
+
const entries = byRow.get(String(getKey(row)));
|
|
32
|
+
if (!entries) return row;
|
|
33
|
+
const live = entries.filter((entry)=>entry.status === 'saving' || entry.source === row);
|
|
34
|
+
if (live.length === 0) return row;
|
|
35
|
+
const copy = serializer.copy(row);
|
|
36
|
+
live.forEach((entry)=>set(copy, entry.field, serializer.copy(entry.value)));
|
|
37
|
+
sources.set(copy, row);
|
|
38
|
+
return copy;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export default applyOverlay;
|
|
@@ -0,0 +1,187 @@
|
|
|
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 dayjs from 'dayjs';
|
|
16
|
+
import matchOption from './matchOption.js';
|
|
17
|
+
import toDateValue from './toDateValue.js';
|
|
18
|
+
const TRUE_TEXTS = new Set([
|
|
19
|
+
'true',
|
|
20
|
+
'yes',
|
|
21
|
+
'y',
|
|
22
|
+
'1',
|
|
23
|
+
'on',
|
|
24
|
+
'checked',
|
|
25
|
+
'✓',
|
|
26
|
+
'✔'
|
|
27
|
+
]);
|
|
28
|
+
const FALSE_TEXTS = new Set([
|
|
29
|
+
'false',
|
|
30
|
+
'no',
|
|
31
|
+
'n',
|
|
32
|
+
'0',
|
|
33
|
+
'off',
|
|
34
|
+
'unchecked'
|
|
35
|
+
]);
|
|
36
|
+
function coerceNumber({ spec, text }) {
|
|
37
|
+
const trimmed = text.trim();
|
|
38
|
+
if (trimmed === '') return {
|
|
39
|
+
value: null
|
|
40
|
+
};
|
|
41
|
+
const isPercentText = trimmed.endsWith('%');
|
|
42
|
+
// Copied cells carry their display format: grouping separators, currency symbols, a % sign.
|
|
43
|
+
const cleaned = trimmed.replace(/[\s,_%]/g, '').replace(/^[^\d+\-.]+/, '');
|
|
44
|
+
const number = cleaned === '' ? NaN : Number(cleaned);
|
|
45
|
+
if (Number.isNaN(number)) return {
|
|
46
|
+
error: `"${text}" is not a number.`
|
|
47
|
+
};
|
|
48
|
+
if (spec.type === 'percent' && isPercentText) return {
|
|
49
|
+
value: number / 100
|
|
50
|
+
};
|
|
51
|
+
return {
|
|
52
|
+
value: number
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function coerceRating({ spec, text }) {
|
|
56
|
+
const result = coerceNumber({
|
|
57
|
+
spec,
|
|
58
|
+
text
|
|
59
|
+
});
|
|
60
|
+
if (result.error || result.value === null) return result;
|
|
61
|
+
const rounded = Math.round(result.value);
|
|
62
|
+
if (rounded < 0 || rounded > spec.max) {
|
|
63
|
+
return {
|
|
64
|
+
error: `"${text}" is not a rating from 0 to ${spec.max}.`
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
value: rounded
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function coerceDate({ spec, text, previous }) {
|
|
72
|
+
const trimmed = text.trim();
|
|
73
|
+
if (trimmed === '') return {
|
|
74
|
+
value: null
|
|
75
|
+
};
|
|
76
|
+
const parsed = dayjs(trimmed);
|
|
77
|
+
if (!parsed.isValid()) return {
|
|
78
|
+
error: `"${text}" is not a date.`
|
|
79
|
+
};
|
|
80
|
+
return {
|
|
81
|
+
value: toDateValue({
|
|
82
|
+
date: parsed,
|
|
83
|
+
kind: spec.kind,
|
|
84
|
+
previous
|
|
85
|
+
})
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function coerceBoolean({ text }) {
|
|
89
|
+
const lowered = text.trim().toLowerCase();
|
|
90
|
+
if (lowered === '') return {
|
|
91
|
+
value: null
|
|
92
|
+
};
|
|
93
|
+
if (TRUE_TEXTS.has(lowered)) return {
|
|
94
|
+
value: true
|
|
95
|
+
};
|
|
96
|
+
if (FALSE_TEXTS.has(lowered)) return {
|
|
97
|
+
value: false
|
|
98
|
+
};
|
|
99
|
+
return {
|
|
100
|
+
error: `"${text}" is not true or false.`
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function coerceSelect({ spec, text }) {
|
|
104
|
+
if (text.trim() === '') return {
|
|
105
|
+
value: null
|
|
106
|
+
};
|
|
107
|
+
if (!spec.options) return {
|
|
108
|
+
value: text.trim()
|
|
109
|
+
};
|
|
110
|
+
const option = matchOption({
|
|
111
|
+
options: spec.options,
|
|
112
|
+
text
|
|
113
|
+
});
|
|
114
|
+
if (!option) return {
|
|
115
|
+
error: `"${text}" is not one of the options.`
|
|
116
|
+
};
|
|
117
|
+
return {
|
|
118
|
+
value: option.value
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function coerceMultiSelect({ spec, text }) {
|
|
122
|
+
const parts = text.split(/[,;]/).map((part)=>part.trim()).filter((part)=>part !== '');
|
|
123
|
+
if (!spec.options) return {
|
|
124
|
+
value: parts
|
|
125
|
+
};
|
|
126
|
+
const values = [];
|
|
127
|
+
for (const part of parts){
|
|
128
|
+
const option = matchOption({
|
|
129
|
+
options: spec.options,
|
|
130
|
+
text: part
|
|
131
|
+
});
|
|
132
|
+
if (!option) return {
|
|
133
|
+
error: `"${part}" is not one of the options.`
|
|
134
|
+
};
|
|
135
|
+
values.push(option.value);
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
value: values
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// A pasted text as the column's value type. Returns `{ value }`, or `{ error }` with a message
|
|
142
|
+
// when the text does not fit the column (a word in a number column, an unknown option).
|
|
143
|
+
function coerceCellValue({ spec, text, previous }) {
|
|
144
|
+
const source = String(text ?? '');
|
|
145
|
+
switch(spec.kind){
|
|
146
|
+
case 'text':
|
|
147
|
+
return {
|
|
148
|
+
value: source
|
|
149
|
+
};
|
|
150
|
+
case 'number':
|
|
151
|
+
return coerceNumber({
|
|
152
|
+
spec,
|
|
153
|
+
text: source
|
|
154
|
+
});
|
|
155
|
+
case 'rating':
|
|
156
|
+
return coerceRating({
|
|
157
|
+
spec,
|
|
158
|
+
text: source
|
|
159
|
+
});
|
|
160
|
+
case 'date':
|
|
161
|
+
case 'datetime':
|
|
162
|
+
return coerceDate({
|
|
163
|
+
spec,
|
|
164
|
+
text: source,
|
|
165
|
+
previous
|
|
166
|
+
});
|
|
167
|
+
case 'boolean':
|
|
168
|
+
return coerceBoolean({
|
|
169
|
+
text: source
|
|
170
|
+
});
|
|
171
|
+
case 'select':
|
|
172
|
+
return coerceSelect({
|
|
173
|
+
spec,
|
|
174
|
+
text: source
|
|
175
|
+
});
|
|
176
|
+
case 'multiSelect':
|
|
177
|
+
return coerceMultiSelect({
|
|
178
|
+
spec,
|
|
179
|
+
text: source
|
|
180
|
+
});
|
|
181
|
+
default:
|
|
182
|
+
return {
|
|
183
|
+
error: 'This column is not editable.'
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
export default coerceCellValue;
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
// The leaf column configs as written, by column key (header groups flattened). Editing reads
|
|
17
|
+
// `editable: { when }`, `required` and `default` from here: the normalised column model keeps
|
|
18
|
+
// only the keys every table feature shares.
|
|
19
|
+
function collectRawColumns({ columns, byKey = new Map() }) {
|
|
20
|
+
(columns ?? []).forEach((entry)=>{
|
|
21
|
+
const column = type.isString(entry) ? {
|
|
22
|
+
key: entry
|
|
23
|
+
} : entry;
|
|
24
|
+
if (!type.isObject(column)) return;
|
|
25
|
+
if (type.isArray(column.children)) {
|
|
26
|
+
collectRawColumns({
|
|
27
|
+
columns: column.children,
|
|
28
|
+
byKey
|
|
29
|
+
});
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const key = column.key ?? column.field;
|
|
33
|
+
if (type.isNone(key)) return;
|
|
34
|
+
byKey.set(String(key), column);
|
|
35
|
+
});
|
|
36
|
+
return byKey;
|
|
37
|
+
}
|
|
38
|
+
export default collectRawColumns;
|