@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,128 @@
|
|
|
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
|
+
import getGroupOperator from './getGroupOperator.js';
|
|
17
|
+
import textFilterOperators from './textFilterOperators.js';
|
|
18
|
+
function parseOptions(leaf) {
|
|
19
|
+
if (leaf.op === 'in' && type.isArray(leaf.value)) return {
|
|
20
|
+
selected: leaf.value
|
|
21
|
+
};
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
function parseText(leaf) {
|
|
25
|
+
if (!textFilterOperators.includes(leaf.op)) return null;
|
|
26
|
+
return {
|
|
27
|
+
op: leaf.op,
|
|
28
|
+
value: leaf.value
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function parseNumber(leaf) {
|
|
32
|
+
if (leaf.op === 'between' && type.isArray(leaf.value)) {
|
|
33
|
+
return {
|
|
34
|
+
min: leaf.value[0] ?? null,
|
|
35
|
+
max: leaf.value[1] ?? null
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
if (leaf.op === 'gte') return {
|
|
39
|
+
min: leaf.value,
|
|
40
|
+
max: null
|
|
41
|
+
};
|
|
42
|
+
if (leaf.op === 'lte') return {
|
|
43
|
+
min: null,
|
|
44
|
+
max: leaf.value
|
|
45
|
+
};
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
function parseDate(leaf) {
|
|
49
|
+
if (leaf.op === 'between' && type.isArray(leaf.value)) {
|
|
50
|
+
return {
|
|
51
|
+
mode: 'range',
|
|
52
|
+
from: leaf.value[0] ?? null,
|
|
53
|
+
to: leaf.value[1] ?? null
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if (leaf.op === 'within' && type.isObject(leaf.value)) {
|
|
57
|
+
return {
|
|
58
|
+
mode: 'relative',
|
|
59
|
+
relative: leaf.value
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
function parseChoice({ leaf, choices }) {
|
|
65
|
+
return choices.includes(leaf.op) ? {
|
|
66
|
+
choice: leaf.op
|
|
67
|
+
} : null;
|
|
68
|
+
}
|
|
69
|
+
const EMPTY_STATES = {
|
|
70
|
+
options: {
|
|
71
|
+
selected: []
|
|
72
|
+
},
|
|
73
|
+
text: {
|
|
74
|
+
op: 'contains',
|
|
75
|
+
value: undefined
|
|
76
|
+
},
|
|
77
|
+
number: {
|
|
78
|
+
min: null,
|
|
79
|
+
max: null
|
|
80
|
+
},
|
|
81
|
+
date: {
|
|
82
|
+
mode: 'range',
|
|
83
|
+
from: null,
|
|
84
|
+
to: null
|
|
85
|
+
},
|
|
86
|
+
boolean: {
|
|
87
|
+
choice: 'any'
|
|
88
|
+
},
|
|
89
|
+
presence: {
|
|
90
|
+
choice: 'any'
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
// The simple column filter's state from the column's conditions in `view.filter`, or null when
|
|
94
|
+
// they need the advanced builder (several conditions, a group, an operator the simple editor
|
|
95
|
+
// does not offer).
|
|
96
|
+
function parseColumnFilter({ kind, conditions }) {
|
|
97
|
+
if (conditions.length === 0) return EMPTY_STATES[kind];
|
|
98
|
+
if (conditions.length > 1) return null;
|
|
99
|
+
const leaf = conditions[0];
|
|
100
|
+
if (getGroupOperator(leaf) !== null) return null;
|
|
101
|
+
switch(kind){
|
|
102
|
+
case 'options':
|
|
103
|
+
return parseOptions(leaf);
|
|
104
|
+
case 'text':
|
|
105
|
+
return parseText(leaf);
|
|
106
|
+
case 'number':
|
|
107
|
+
return parseNumber(leaf);
|
|
108
|
+
case 'date':
|
|
109
|
+
return parseDate(leaf);
|
|
110
|
+
case 'boolean':
|
|
111
|
+
return parseChoice({
|
|
112
|
+
leaf,
|
|
113
|
+
choices: [
|
|
114
|
+
'isTrue',
|
|
115
|
+
'isFalse'
|
|
116
|
+
]
|
|
117
|
+
});
|
|
118
|
+
default:
|
|
119
|
+
return parseChoice({
|
|
120
|
+
leaf,
|
|
121
|
+
choices: [
|
|
122
|
+
'empty',
|
|
123
|
+
'notEmpty'
|
|
124
|
+
]
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
export default parseColumnFilter;
|
|
@@ -0,0 +1,24 @@
|
|
|
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 { type } from '@lowdefy/helpers';
|
|
17
|
+
import isEmptyValue from '@lowdefy/blocks-antd/table/isEmptyValue.js';
|
|
18
|
+
// A filter date value as the dayjs object antd pickers take; null when empty or unreadable.
|
|
19
|
+
function parseFilterDate(value) {
|
|
20
|
+
if (isEmptyValue(value) || type.isObject(value)) return null;
|
|
21
|
+
const date = dayjs(value);
|
|
22
|
+
return date.isValid() ? date : null;
|
|
23
|
+
}
|
|
24
|
+
export default parseFilterDate;
|
|
@@ -0,0 +1,63 @@
|
|
|
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 createRowTest from './createRowTest.js';
|
|
16
|
+
import getFilterResultKey from './getFilterResultKey.js';
|
|
17
|
+
import getFilterResults from './getFilterResults.js';
|
|
18
|
+
import yieldToMain from '../sorting/yieldToMain.js';
|
|
19
|
+
// Tests every row against a filter and search before they apply, yielding to the browser every
|
|
20
|
+
// `budgetMs`, so no filter (a nested condition over 100k rows, the first search formatting every
|
|
21
|
+
// searched cell) blocks input or paint. The flags are cached for the filtered row model, which
|
|
22
|
+
// then only gathers the kept rows. A search that extends an earlier one under the same filter
|
|
23
|
+
// (typing on) only tests the rows the earlier one kept.
|
|
24
|
+
async function prepareFilterResult({ rows, condition, search, context, searchColumns }) {
|
|
25
|
+
const test = createRowTest({
|
|
26
|
+
condition,
|
|
27
|
+
search,
|
|
28
|
+
context,
|
|
29
|
+
searchColumns
|
|
30
|
+
});
|
|
31
|
+
if (test === null) return;
|
|
32
|
+
const results = getFilterResults({
|
|
33
|
+
rows,
|
|
34
|
+
context,
|
|
35
|
+
searchColumns
|
|
36
|
+
});
|
|
37
|
+
const { key, filterKey, searchKey } = getFilterResultKey({
|
|
38
|
+
condition,
|
|
39
|
+
search
|
|
40
|
+
});
|
|
41
|
+
if (results.get(key)) return;
|
|
42
|
+
const candidates = results.narrowest({
|
|
43
|
+
filterKey,
|
|
44
|
+
searchKey
|
|
45
|
+
});
|
|
46
|
+
const flags = new Uint8Array(rows.length);
|
|
47
|
+
const budgetMs = 12;
|
|
48
|
+
let sliceStart = performance.now();
|
|
49
|
+
for(let i = 0; i < rows.length; i++){
|
|
50
|
+
if (candidates !== null && candidates[i] === 0) continue;
|
|
51
|
+
if (test(rows[i].original)) flags[i] = 1;
|
|
52
|
+
if ((i & 31) === 0 && performance.now() - sliceStart >= budgetMs) {
|
|
53
|
+
await yieldToMain();
|
|
54
|
+
sliceStart = performance.now();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
results.set(key, {
|
|
58
|
+
filterKey,
|
|
59
|
+
searchKey,
|
|
60
|
+
flags
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
export default prepareFilterResult;
|
|
@@ -0,0 +1,35 @@
|
|
|
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
|
+
import getGroupOperator from './getGroupOperator.js';
|
|
17
|
+
import isCompleteLeaf from './isCompleteLeaf.js';
|
|
18
|
+
// The part of a view filter that constrains rows: incomplete leaves and the groups they leave
|
|
19
|
+
// empty are dropped, so a filter that is being built shows every row until it says something.
|
|
20
|
+
// Malformed groups pass through unchanged, for compileCondition to report.
|
|
21
|
+
function pruneCondition(condition) {
|
|
22
|
+
if (!type.isObject(condition)) return null;
|
|
23
|
+
const operator = getGroupOperator(condition);
|
|
24
|
+
if (operator === null) {
|
|
25
|
+
return isCompleteLeaf(condition) ? condition : null;
|
|
26
|
+
}
|
|
27
|
+
const list = condition[operator];
|
|
28
|
+
if (!type.isArray(list)) return condition;
|
|
29
|
+
const children = list.map(pruneCondition).filter((child)=>child !== null);
|
|
30
|
+
if (children.length === 0) return null;
|
|
31
|
+
return {
|
|
32
|
+
[operator]: children
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export default pruneCondition;
|
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
import getTopLevelConditions from './getTopLevelConditions.js';
|
|
17
|
+
import isColumnCondition from './isColumnCondition.js';
|
|
18
|
+
// Replaces one column's conditions in a view filter. The filter is a top-level `and`: the
|
|
19
|
+
// column's existing conditions are removed and `condition` (a leaf or a group; the items of an
|
|
20
|
+
// `and` group are spread) takes the place of the first of them, so editing a column filter keeps
|
|
21
|
+
// its position. Conditions that mix columns are kept. No conditions left means no filter (null).
|
|
22
|
+
function setColumnFilter({ filter, key, condition }) {
|
|
23
|
+
const existing = getTopLevelConditions(filter);
|
|
24
|
+
let added = [];
|
|
25
|
+
if (type.isObject(condition)) {
|
|
26
|
+
added = type.isArray(condition.and) ? condition.and : [
|
|
27
|
+
condition
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
const items = [];
|
|
31
|
+
let inserted = false;
|
|
32
|
+
existing.forEach((item)=>{
|
|
33
|
+
if (!isColumnCondition({
|
|
34
|
+
condition: item,
|
|
35
|
+
key
|
|
36
|
+
})) {
|
|
37
|
+
items.push(item);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (!inserted) {
|
|
41
|
+
items.push(...added);
|
|
42
|
+
inserted = true;
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
if (!inserted) items.push(...added);
|
|
46
|
+
if (items.length === 0) return null;
|
|
47
|
+
return {
|
|
48
|
+
and: items
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export default setColumnFilter;
|
|
@@ -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
|
+
*/ // The operators the simple text filter offers, in menu order.
|
|
16
|
+
const textFilterOperators = [
|
|
17
|
+
'contains',
|
|
18
|
+
'notContains',
|
|
19
|
+
'startsWith',
|
|
20
|
+
'endsWith',
|
|
21
|
+
'eq',
|
|
22
|
+
'ne',
|
|
23
|
+
'empty',
|
|
24
|
+
'notEmpty'
|
|
25
|
+
];
|
|
26
|
+
export default textFilterOperators;
|
|
@@ -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
|
+
*/ import { type } from '@lowdefy/helpers';
|
|
16
|
+
import getGroupOperator from './getGroupOperator.js';
|
|
17
|
+
// The filter builder always edits a group: no filter is an empty `and`, a single leaf is an
|
|
18
|
+
// `and` of that leaf.
|
|
19
|
+
function toRootGroup(condition) {
|
|
20
|
+
if (!type.isObject(condition)) return {
|
|
21
|
+
and: []
|
|
22
|
+
};
|
|
23
|
+
const operator = getGroupOperator(condition);
|
|
24
|
+
if (operator === null) return {
|
|
25
|
+
and: [
|
|
26
|
+
condition
|
|
27
|
+
]
|
|
28
|
+
};
|
|
29
|
+
if (!type.isArray(condition[operator])) return {
|
|
30
|
+
and: []
|
|
31
|
+
};
|
|
32
|
+
return condition;
|
|
33
|
+
}
|
|
34
|
+
export default toRootGroup;
|
|
@@ -0,0 +1,65 @@
|
|
|
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 { useCallback, useEffect, useRef, useState } from 'react';
|
|
16
|
+
function same(a, b) {
|
|
17
|
+
return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);
|
|
18
|
+
}
|
|
19
|
+
// A typed value that applies after a pause (or at once on flush: Enter, blur, unmount), so a
|
|
20
|
+
// 100k-row filter is not re-run and committed on every keystroke. A new value from outside
|
|
21
|
+
// (SetState, another editor) replaces the draft.
|
|
22
|
+
function useDraft({ value, onChange, delay = 300 }) {
|
|
23
|
+
const [draft, setDraftState] = useState(value);
|
|
24
|
+
const sent = useRef(value);
|
|
25
|
+
const pending = useRef({
|
|
26
|
+
draft: value,
|
|
27
|
+
onChange,
|
|
28
|
+
timer: null
|
|
29
|
+
});
|
|
30
|
+
pending.current.onChange = onChange;
|
|
31
|
+
useEffect(()=>{
|
|
32
|
+
if (same(value, sent.current)) return;
|
|
33
|
+
sent.current = value;
|
|
34
|
+
pending.current.draft = value;
|
|
35
|
+
setDraftState(value);
|
|
36
|
+
}, [
|
|
37
|
+
value
|
|
38
|
+
]);
|
|
39
|
+
const flush = useCallback(()=>{
|
|
40
|
+
const current = pending.current;
|
|
41
|
+
clearTimeout(current.timer);
|
|
42
|
+
current.timer = null;
|
|
43
|
+
if (same(current.draft, sent.current)) return;
|
|
44
|
+
sent.current = current.draft;
|
|
45
|
+
current.onChange(current.draft);
|
|
46
|
+
}, []);
|
|
47
|
+
const setDraft = useCallback((next)=>{
|
|
48
|
+
pending.current.draft = next;
|
|
49
|
+
setDraftState(next);
|
|
50
|
+
clearTimeout(pending.current.timer);
|
|
51
|
+
pending.current.timer = setTimeout(flush, delay);
|
|
52
|
+
}, [
|
|
53
|
+
delay,
|
|
54
|
+
flush
|
|
55
|
+
]);
|
|
56
|
+
useEffect(()=>flush, [
|
|
57
|
+
flush
|
|
58
|
+
]);
|
|
59
|
+
return {
|
|
60
|
+
draft,
|
|
61
|
+
setDraft,
|
|
62
|
+
flush
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export default useDraft;
|
|
@@ -0,0 +1,32 @@
|
|
|
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 { useState } from 'react';
|
|
16
|
+
// Block-level UI state of the filtering feature: which column's filter popover is open, and the
|
|
17
|
+
// latest requested filter and search while they are prepared and applied (applyFiltering). The
|
|
18
|
+
// request is dropped once the committed state has caught up with it.
|
|
19
|
+
function useFilteringState({ api, state }) {
|
|
20
|
+
const [openKey, setOpenKey] = useState(null);
|
|
21
|
+
api.columnFilter = {
|
|
22
|
+
openKey,
|
|
23
|
+
setOpenKey
|
|
24
|
+
};
|
|
25
|
+
const target = api.filtering?.target ?? null;
|
|
26
|
+
const caughtUp = target !== null && target.filter === state.filter && target.search === state.search;
|
|
27
|
+
api.filtering = {
|
|
28
|
+
target: caughtUp ? null : target
|
|
29
|
+
};
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
export default useFilteringState;
|
|
@@ -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 { useRef, useState } from 'react';
|
|
16
|
+
function same(a, b) {
|
|
17
|
+
return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);
|
|
18
|
+
}
|
|
19
|
+
// Local state for an editor whose value round-trips through the table. Filter writes apply in a
|
|
20
|
+
// transition, so the committed value can lag several edits behind; an editor that re-read it
|
|
21
|
+
// after each edit would build the next edit on a stale condition. The editor keeps its own state
|
|
22
|
+
// and writes through `onChange`; a value that arrives from outside (SetState, another editor)
|
|
23
|
+
// replaces it.
|
|
24
|
+
function useSyncedState({ value, onChange }) {
|
|
25
|
+
const [local, setLocal] = useState(value);
|
|
26
|
+
const sent = useRef(value);
|
|
27
|
+
const [seen, setSeen] = useState(value);
|
|
28
|
+
if (!same(seen, value)) {
|
|
29
|
+
setSeen(value);
|
|
30
|
+
if (!same(value, sent.current)) {
|
|
31
|
+
sent.current = value;
|
|
32
|
+
setLocal(value);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function update(next) {
|
|
36
|
+
sent.current = next;
|
|
37
|
+
setLocal(next);
|
|
38
|
+
onChange(next);
|
|
39
|
+
}
|
|
40
|
+
return [
|
|
41
|
+
local,
|
|
42
|
+
update
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
export default useSyncedState;
|
|
@@ -0,0 +1,72 @@
|
|
|
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 AGGREGATE_LABELS from '@lowdefy/blocks-antd/table/aggregateLabels.js';
|
|
17
|
+
import getAggregateText from '@lowdefy/blocks-antd/table/getAggregateText.js';
|
|
18
|
+
import GroupCheckbox from './GroupCheckbox.js';
|
|
19
|
+
function renderContent({ api, col, item, selectionCount }) {
|
|
20
|
+
if (col.special === 'select') {
|
|
21
|
+
if (!selectionCount) return null;
|
|
22
|
+
return /*#__PURE__*/ React.createElement(GroupCheckbox, {
|
|
23
|
+
selected: selectionCount.selected,
|
|
24
|
+
total: selectionCount.total
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
if (col.special) return null;
|
|
28
|
+
const fn = api.grouping.aggregateFns.get(col.key);
|
|
29
|
+
if (!fn) return null;
|
|
30
|
+
const text = getAggregateText({
|
|
31
|
+
fn,
|
|
32
|
+
value: item.aggregates[col.key],
|
|
33
|
+
column: col.column
|
|
34
|
+
});
|
|
35
|
+
return /*#__PURE__*/ React.createElement("span", {
|
|
36
|
+
className: "lf-table-group-aggregate",
|
|
37
|
+
"data-aggregate": fn
|
|
38
|
+
}, /*#__PURE__*/ React.createElement("span", {
|
|
39
|
+
className: "lf-table-group-aggregate-fn"
|
|
40
|
+
}, AGGREGATE_LABELS[fn]), /*#__PURE__*/ React.createElement("span", {
|
|
41
|
+
className: "lf-table-group-aggregate-value"
|
|
42
|
+
}, text));
|
|
43
|
+
}
|
|
44
|
+
// One cell of a group header row, on the same layout column as the data cells below it, so the
|
|
45
|
+
// group's aggregates line up under their columns and keyboard navigation crosses group rows like
|
|
46
|
+
// any other. In the sticky overlay (a copy of a real row) the cells are not focus targets.
|
|
47
|
+
function GroupCell({ api, col, focused, item, overlay, selectionCount }) {
|
|
48
|
+
const selectCell = col.special === 'select' && Boolean(selectionCount);
|
|
49
|
+
let tabIndex;
|
|
50
|
+
if (!overlay) tabIndex = focused ? 0 : -1;
|
|
51
|
+
return /*#__PURE__*/ React.createElement("div", {
|
|
52
|
+
"aria-colindex": overlay ? undefined : col.ariaIndex,
|
|
53
|
+
className: col.special ? 'lf-table-gridcell lf-table-select' : 'lf-table-gridcell',
|
|
54
|
+
"data-align": col.column?.align,
|
|
55
|
+
"data-col-index": col.index,
|
|
56
|
+
"data-col-key": col.key,
|
|
57
|
+
"data-focused": focused ? '' : undefined,
|
|
58
|
+
"data-lf-cell": overlay ? undefined : '',
|
|
59
|
+
"data-lf-group-select": selectCell ? '' : undefined,
|
|
60
|
+
"data-pinned": col.region === 'center' ? undefined : col.region,
|
|
61
|
+
"data-pinned-edge": col.pinnedEdge ? '' : undefined,
|
|
62
|
+
role: overlay ? undefined : 'gridcell',
|
|
63
|
+
style: col.style,
|
|
64
|
+
tabIndex: tabIndex
|
|
65
|
+
}, renderContent({
|
|
66
|
+
api,
|
|
67
|
+
col,
|
|
68
|
+
item,
|
|
69
|
+
selectionCount
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
export default GroupCell;
|
|
@@ -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 React, { useEffect, useRef } from 'react';
|
|
16
|
+
function ignoreChange() {}
|
|
17
|
+
// The group's checkbox: checked when every leaf row is selected, indeterminate when some are.
|
|
18
|
+
// The delegated click handler does the toggling.
|
|
19
|
+
function GroupCheckbox({ selected, total }) {
|
|
20
|
+
const ref = useRef(null);
|
|
21
|
+
const checked = total > 0 && selected === total;
|
|
22
|
+
const indeterminate = selected > 0 && !checked;
|
|
23
|
+
useEffect(()=>{
|
|
24
|
+
if (ref.current) ref.current.indeterminate = indeterminate;
|
|
25
|
+
}, [
|
|
26
|
+
indeterminate
|
|
27
|
+
]);
|
|
28
|
+
return /*#__PURE__*/ React.createElement("input", {
|
|
29
|
+
"aria-label": "Select group rows",
|
|
30
|
+
checked: checked,
|
|
31
|
+
className: "lf-table-checkbox",
|
|
32
|
+
onChange: ignoreChange,
|
|
33
|
+
ref: ref,
|
|
34
|
+
tabIndex: -1,
|
|
35
|
+
type: "checkbox"
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
export default GroupCheckbox;
|