@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,22 @@
|
|
|
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
|
+
// `expanded` in the value lists the row keys of expanded tree rows and expanded detail rows.
|
|
17
|
+
function initExpanded({ value }) {
|
|
18
|
+
const expanded = value?.expanded;
|
|
19
|
+
if (!type.isArray(expanded)) return [];
|
|
20
|
+
return expanded.filter((key)=>!type.isNone(key));
|
|
21
|
+
}
|
|
22
|
+
export default initExpanded;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2020-2026 Lowdefy, Inc
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
*/ import CELL_TYPE_FAMILIES from '@lowdefy/blocks-antd/table/cellTypeFamilies.js';
|
|
16
|
+
import getExportValue from '@lowdefy/blocks-antd/table/getExportValue.js';
|
|
17
|
+
import htmlToText from '@lowdefy/blocks-antd/table/htmlToText.js';
|
|
18
|
+
import toCsvField from './toCsvField.js';
|
|
19
|
+
// The current client view: visible data columns in their displayed order (start-pinned, centre,
|
|
20
|
+
// end-pinned) and the data rows in their current (sorted, grouped) order, every page and the
|
|
21
|
+
// rows of collapsed groups included (`api.dataRows`). Values come from the shared column core
|
|
22
|
+
// (`formatted` gives the text the cell shows). Header titles lose their HTML; action columns
|
|
23
|
+
// (buttons, menu) hold no data and are left out.
|
|
24
|
+
function buildCsv({ api, formatted }) {
|
|
25
|
+
const cols = api.layout.cols.filter((col)=>!col.special && CELL_TYPE_FAMILIES[col.column.type] !== 'action');
|
|
26
|
+
const lines = [
|
|
27
|
+
cols.map((col)=>toCsvField(htmlToText(col.column.title))).join(',')
|
|
28
|
+
];
|
|
29
|
+
api.dataRows.forEach((row)=>{
|
|
30
|
+
lines.push(cols.map((col)=>toCsvField(getExportValue({
|
|
31
|
+
column: col.column,
|
|
32
|
+
value: col.accessor(row.original),
|
|
33
|
+
row: row.original,
|
|
34
|
+
formatted
|
|
35
|
+
}))).join(','));
|
|
36
|
+
});
|
|
37
|
+
return lines.join('\r\n');
|
|
38
|
+
}
|
|
39
|
+
export default buildCsv;
|
|
@@ -0,0 +1,59 @@
|
|
|
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 buildCsv from './buildCsv.js';
|
|
16
|
+
import deriveValue from '../../core/deriveValue.js';
|
|
17
|
+
// Block method `exportCsv({ filename, formatted })`. `formatted` (default true) exports what the
|
|
18
|
+
// cells display; false exports raw values. In server mode the browser holds only the cached
|
|
19
|
+
// blocks, so the table fires `onExport { view }` for the app to produce the file (D12).
|
|
20
|
+
function createExportCsv(api) {
|
|
21
|
+
return function exportCsv({ filename, formatted } = {}) {
|
|
22
|
+
if (api.config.server) {
|
|
23
|
+
const { view } = deriveValue({
|
|
24
|
+
state: api.state,
|
|
25
|
+
api
|
|
26
|
+
});
|
|
27
|
+
api.methods.triggerEvent({
|
|
28
|
+
name: 'onExport',
|
|
29
|
+
event: {
|
|
30
|
+
view,
|
|
31
|
+
filename,
|
|
32
|
+
formatted
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
const csv = buildCsv({
|
|
38
|
+
api,
|
|
39
|
+
formatted: formatted !== false
|
|
40
|
+
});
|
|
41
|
+
// The byte order mark makes spreadsheet apps read the file as UTF-8.
|
|
42
|
+
const blob = new Blob([
|
|
43
|
+
'\ufeff',
|
|
44
|
+
csv
|
|
45
|
+
], {
|
|
46
|
+
type: 'text/csv;charset=utf-8'
|
|
47
|
+
});
|
|
48
|
+
const url = URL.createObjectURL(blob);
|
|
49
|
+
const anchor = document.createElement('a');
|
|
50
|
+
anchor.href = url;
|
|
51
|
+
anchor.download = filename ?? 'export.csv';
|
|
52
|
+
document.body.appendChild(anchor);
|
|
53
|
+
anchor.click();
|
|
54
|
+
anchor.remove();
|
|
55
|
+
setTimeout(()=>URL.revokeObjectURL(url), 0);
|
|
56
|
+
return csv;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export default createExportCsv;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2020-2026 Lowdefy, Inc
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
*/ import createExportCsv from './createExportCsv.js';
|
|
16
|
+
const exportFeature = {
|
|
17
|
+
name: 'export',
|
|
18
|
+
actions: {
|
|
19
|
+
exportCsv: createExportCsv
|
|
20
|
+
},
|
|
21
|
+
methods: {
|
|
22
|
+
exportCsv: createExportCsv
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
export default exportFeature;
|
|
@@ -0,0 +1,20 @@
|
|
|
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 toCsvField(text) {
|
|
16
|
+
const value = String(text);
|
|
17
|
+
if (/[",\r\n]/.test(value)) return `"${value.replace(/"/g, '""')}"`;
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
export default toCsvField;
|
|
@@ -0,0 +1,30 @@
|
|
|
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 { Radio } from 'antd';
|
|
17
|
+
// A one-of choice (boolean yes/no, or empty/not empty); `any` means no filter.
|
|
18
|
+
function ChoiceFilter({ choices, state, onChange }) {
|
|
19
|
+
return /*#__PURE__*/ React.createElement(Radio.Group, {
|
|
20
|
+
className: "lf-filter-simple",
|
|
21
|
+
onChange: (event)=>onChange({
|
|
22
|
+
choice: event.target.value
|
|
23
|
+
}),
|
|
24
|
+
optionType: "button",
|
|
25
|
+
options: choices,
|
|
26
|
+
size: "small",
|
|
27
|
+
value: state.choice
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
export default ChoiceFilter;
|
|
@@ -0,0 +1,29 @@
|
|
|
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 CloseIcon() {
|
|
17
|
+
return /*#__PURE__*/ React.createElement("svg", {
|
|
18
|
+
"aria-hidden": "true",
|
|
19
|
+
className: "lf-table-icon",
|
|
20
|
+
fill: "none",
|
|
21
|
+
viewBox: "0 0 16 16"
|
|
22
|
+
}, /*#__PURE__*/ React.createElement("path", {
|
|
23
|
+
d: "M4 4l8 8M12 4l-8 8",
|
|
24
|
+
stroke: "currentColor",
|
|
25
|
+
strokeLinecap: "round",
|
|
26
|
+
strokeWidth: "1.5"
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
export default CloseIcon;
|
|
@@ -0,0 +1,192 @@
|
|
|
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, { useMemo, useRef, useState } from 'react';
|
|
16
|
+
import { Button } from 'antd';
|
|
17
|
+
import buildColumnFilter from './buildColumnFilter.js';
|
|
18
|
+
import ChoiceFilter from './ChoiceFilter.js';
|
|
19
|
+
import DateFilter from './DateFilter.js';
|
|
20
|
+
import FilterBuilder from './FilterBuilder.js';
|
|
21
|
+
import getColumnConditions from './getColumnConditions.js';
|
|
22
|
+
import getDistinctOptions from './getDistinctOptions.js';
|
|
23
|
+
import getFilterKind from './getFilterKind.js';
|
|
24
|
+
import getPlainTitle from './getPlainTitle.js';
|
|
25
|
+
import getTopLevelConditions from './getTopLevelConditions.js';
|
|
26
|
+
import NumberFilter from './NumberFilter.js';
|
|
27
|
+
import OptionsFilter from './OptionsFilter.js';
|
|
28
|
+
import parseColumnFilter from './parseColumnFilter.js';
|
|
29
|
+
import TextFilter from './TextFilter.js';
|
|
30
|
+
import useSyncedState from './useSyncedState.js';
|
|
31
|
+
function booleanChoices(column) {
|
|
32
|
+
return [
|
|
33
|
+
{
|
|
34
|
+
value: 'any',
|
|
35
|
+
label: 'Any'
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
value: 'isTrue',
|
|
39
|
+
label: column.cell?.trueLabel ?? 'Yes'
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
value: 'isFalse',
|
|
43
|
+
label: column.cell?.falseLabel ?? 'No'
|
|
44
|
+
}
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
const PRESENCE_CHOICES = [
|
|
48
|
+
{
|
|
49
|
+
value: 'any',
|
|
50
|
+
label: 'Any'
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
value: 'notEmpty',
|
|
54
|
+
label: 'Not empty'
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
value: 'empty',
|
|
58
|
+
label: 'Empty'
|
|
59
|
+
}
|
|
60
|
+
];
|
|
61
|
+
function SimpleEditor({ api, column, kind, state, onChange }) {
|
|
62
|
+
const options = useMemo(()=>{
|
|
63
|
+
if (kind !== 'options') return null;
|
|
64
|
+
return column.options ?? getDistinctOptions({
|
|
65
|
+
rows: api.table.getCoreRowModel().rows,
|
|
66
|
+
column
|
|
67
|
+
});
|
|
68
|
+
}, [
|
|
69
|
+
kind,
|
|
70
|
+
column
|
|
71
|
+
]);
|
|
72
|
+
switch(kind){
|
|
73
|
+
case 'options':
|
|
74
|
+
return /*#__PURE__*/ React.createElement(OptionsFilter, {
|
|
75
|
+
onChange: (selected)=>onChange({
|
|
76
|
+
selected
|
|
77
|
+
}),
|
|
78
|
+
options: options,
|
|
79
|
+
selected: state.selected
|
|
80
|
+
});
|
|
81
|
+
case 'text':
|
|
82
|
+
return /*#__PURE__*/ React.createElement(TextFilter, {
|
|
83
|
+
onChange: onChange,
|
|
84
|
+
state: state
|
|
85
|
+
});
|
|
86
|
+
case 'number':
|
|
87
|
+
return /*#__PURE__*/ React.createElement(NumberFilter, {
|
|
88
|
+
onChange: onChange,
|
|
89
|
+
state: state
|
|
90
|
+
});
|
|
91
|
+
case 'date':
|
|
92
|
+
return /*#__PURE__*/ React.createElement(DateFilter, {
|
|
93
|
+
column: column,
|
|
94
|
+
onChange: onChange,
|
|
95
|
+
state: state
|
|
96
|
+
});
|
|
97
|
+
case 'boolean':
|
|
98
|
+
return /*#__PURE__*/ React.createElement(ChoiceFilter, {
|
|
99
|
+
choices: booleanChoices(column),
|
|
100
|
+
onChange: onChange,
|
|
101
|
+
state: state
|
|
102
|
+
});
|
|
103
|
+
default:
|
|
104
|
+
return /*#__PURE__*/ React.createElement(ChoiceFilter, {
|
|
105
|
+
choices: PRESENCE_CHOICES,
|
|
106
|
+
onChange: onChange,
|
|
107
|
+
state: state
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// The column filter popover body: a simple editor for the column's type, or the filter builder
|
|
112
|
+
// (limited to this column) for anything the simple editor cannot express. Either writes the
|
|
113
|
+
// column's conditions into `view.filter`, replacing the ones it had.
|
|
114
|
+
function ColumnFilter({ api, column }) {
|
|
115
|
+
const kind = getFilterKind(column);
|
|
116
|
+
const [conditions, setConditions] = useSyncedState({
|
|
117
|
+
value: getColumnConditions({
|
|
118
|
+
filter: api.state.filter,
|
|
119
|
+
key: column.key
|
|
120
|
+
}),
|
|
121
|
+
onChange: (next)=>api.actions.updateColumnFilter({
|
|
122
|
+
key: column.key,
|
|
123
|
+
condition: {
|
|
124
|
+
and: next
|
|
125
|
+
}
|
|
126
|
+
})
|
|
127
|
+
});
|
|
128
|
+
const simple = parseColumnFilter({
|
|
129
|
+
kind,
|
|
130
|
+
conditions
|
|
131
|
+
});
|
|
132
|
+
const [advanced, setAdvanced] = useState(simple === null);
|
|
133
|
+
const showAdvanced = advanced || simple === null;
|
|
134
|
+
// The builder gets back the condition it last wrote while that still says the same thing, so
|
|
135
|
+
// its own grouping (a root `or`, a single nested group) is not reshaped into a top-level `and`.
|
|
136
|
+
const builderCondition = useRef(null);
|
|
137
|
+
if (builderCondition.current === null || JSON.stringify(getTopLevelConditions(builderCondition.current)) !== JSON.stringify(conditions)) {
|
|
138
|
+
builderCondition.current = conditions.length ? {
|
|
139
|
+
and: conditions
|
|
140
|
+
} : null;
|
|
141
|
+
}
|
|
142
|
+
function write(condition) {
|
|
143
|
+
setConditions(getTopLevelConditions(condition));
|
|
144
|
+
}
|
|
145
|
+
function writeFromBuilder(condition) {
|
|
146
|
+
builderCondition.current = condition;
|
|
147
|
+
write(condition);
|
|
148
|
+
}
|
|
149
|
+
return /*#__PURE__*/ React.createElement("div", {
|
|
150
|
+
className: "lf-table-column-filter",
|
|
151
|
+
"data-col-key": column.key,
|
|
152
|
+
"data-lf-column-filter": "",
|
|
153
|
+
onKeyDown: (event)=>{
|
|
154
|
+
if (event.key !== 'Escape') return;
|
|
155
|
+
event.stopPropagation();
|
|
156
|
+
api.actions.closeColumnFilter({
|
|
157
|
+
restoreFocus: true
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}, /*#__PURE__*/ React.createElement("div", {
|
|
161
|
+
className: "lf-table-overlay-title"
|
|
162
|
+
}, getPlainTitle(column)), showAdvanced ? /*#__PURE__*/ React.createElement(FilterBuilder, {
|
|
163
|
+
columns: [
|
|
164
|
+
column
|
|
165
|
+
],
|
|
166
|
+
condition: builderCondition.current,
|
|
167
|
+
onChange: writeFromBuilder,
|
|
168
|
+
user: api.config.user
|
|
169
|
+
}) : /*#__PURE__*/ React.createElement(SimpleEditor, {
|
|
170
|
+
api: api,
|
|
171
|
+
column: column,
|
|
172
|
+
kind: kind,
|
|
173
|
+
onChange: (next)=>write(buildColumnFilter({
|
|
174
|
+
kind,
|
|
175
|
+
key: column.key,
|
|
176
|
+
state: next
|
|
177
|
+
})),
|
|
178
|
+
state: simple
|
|
179
|
+
}), /*#__PURE__*/ React.createElement("div", {
|
|
180
|
+
className: "lf-table-overlay-footer"
|
|
181
|
+
}, /*#__PURE__*/ React.createElement(Button, {
|
|
182
|
+
disabled: showAdvanced && simple === null,
|
|
183
|
+
onClick: ()=>setAdvanced(!showAdvanced),
|
|
184
|
+
size: "small",
|
|
185
|
+
type: "link"
|
|
186
|
+
}, showAdvanced ? 'Simple' : 'Advanced'), /*#__PURE__*/ React.createElement(Button, {
|
|
187
|
+
disabled: conditions.length === 0,
|
|
188
|
+
onClick: ()=>write(null),
|
|
189
|
+
size: "small"
|
|
190
|
+
}, "Clear")));
|
|
191
|
+
}
|
|
192
|
+
export default ColumnFilter;
|
|
@@ -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 from 'react';
|
|
16
|
+
import { Popover } from 'antd';
|
|
17
|
+
import ColumnFilter from './ColumnFilter.js';
|
|
18
|
+
// Mounted only while open, anchored to the bottom edge of the column's header cell.
|
|
19
|
+
function ColumnFilterPopover({ api, col }) {
|
|
20
|
+
return /*#__PURE__*/ React.createElement(Popover, {
|
|
21
|
+
arrow: false,
|
|
22
|
+
content: /*#__PURE__*/ React.createElement(ColumnFilter, {
|
|
23
|
+
api: api,
|
|
24
|
+
column: col.column
|
|
25
|
+
}),
|
|
26
|
+
onOpenChange: (open)=>{
|
|
27
|
+
if (!open) api.actions.closeColumnFilter();
|
|
28
|
+
},
|
|
29
|
+
open: true,
|
|
30
|
+
placement: "bottomLeft",
|
|
31
|
+
trigger: [
|
|
32
|
+
'click'
|
|
33
|
+
]
|
|
34
|
+
}, /*#__PURE__*/ React.createElement("span", {
|
|
35
|
+
className: "lf-table-header-anchor"
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
export default ColumnFilterPopover;
|
|
@@ -0,0 +1,80 @@
|
|
|
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 { DatePicker, Segmented } from 'antd';
|
|
17
|
+
import defaultRelativeDate from './defaultRelativeDate.js';
|
|
18
|
+
import formatFilterDate from './formatFilterDate.js';
|
|
19
|
+
import parseFilterDate from './parseFilterDate.js';
|
|
20
|
+
import RelativeDateEditor from './RelativeDateEditor.js';
|
|
21
|
+
const MODES = [
|
|
22
|
+
{
|
|
23
|
+
value: 'range',
|
|
24
|
+
label: 'Range'
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
value: 'relative',
|
|
28
|
+
label: 'Relative'
|
|
29
|
+
}
|
|
30
|
+
];
|
|
31
|
+
// A date range (either end open), or a relative period such as "within the last 7 days".
|
|
32
|
+
function DateFilter({ column, state, onChange }) {
|
|
33
|
+
return /*#__PURE__*/ React.createElement("div", {
|
|
34
|
+
className: "lf-filter-simple lf-filter-date"
|
|
35
|
+
}, /*#__PURE__*/ React.createElement(Segmented, {
|
|
36
|
+
block: true,
|
|
37
|
+
onChange: (mode)=>onChange(mode === 'relative' ? {
|
|
38
|
+
mode,
|
|
39
|
+
relative: state.relative ?? defaultRelativeDate
|
|
40
|
+
} : {
|
|
41
|
+
mode,
|
|
42
|
+
from: null,
|
|
43
|
+
to: null
|
|
44
|
+
}),
|
|
45
|
+
options: MODES,
|
|
46
|
+
size: "small",
|
|
47
|
+
value: state.mode
|
|
48
|
+
}), state.mode === 'relative' ? /*#__PURE__*/ React.createElement(RelativeDateEditor, {
|
|
49
|
+
onChange: (relative)=>onChange({
|
|
50
|
+
mode: 'relative',
|
|
51
|
+
relative
|
|
52
|
+
}),
|
|
53
|
+
size: "small",
|
|
54
|
+
value: state.relative
|
|
55
|
+
}) : /*#__PURE__*/ React.createElement(DatePicker.RangePicker, {
|
|
56
|
+
allowEmpty: [
|
|
57
|
+
true,
|
|
58
|
+
true
|
|
59
|
+
],
|
|
60
|
+
onChange: (dates)=>onChange({
|
|
61
|
+
mode: 'range',
|
|
62
|
+
from: formatFilterDate({
|
|
63
|
+
column,
|
|
64
|
+
date: dates?.[0],
|
|
65
|
+
edge: 'start'
|
|
66
|
+
}),
|
|
67
|
+
to: formatFilterDate({
|
|
68
|
+
column,
|
|
69
|
+
date: dates?.[1],
|
|
70
|
+
edge: 'end'
|
|
71
|
+
})
|
|
72
|
+
}),
|
|
73
|
+
size: "small",
|
|
74
|
+
value: [
|
|
75
|
+
parseFilterDate(state.from),
|
|
76
|
+
parseFilterDate(state.to)
|
|
77
|
+
]
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
export default DateFilter;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2020-2026 Lowdefy, Inc
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
*/ import React from 'react';
|
|
16
|
+
import { Input } from 'antd';
|
|
17
|
+
import useDraft from './useDraft.js';
|
|
18
|
+
// A text input whose value applies after a pause, on Enter or on blur.
|
|
19
|
+
function DraftInput({ 'aria-label': ariaLabel, autoFocus, className, onChange, placeholder, size, value }) {
|
|
20
|
+
const { draft, setDraft, flush } = useDraft({
|
|
21
|
+
value,
|
|
22
|
+
onChange
|
|
23
|
+
});
|
|
24
|
+
return /*#__PURE__*/ React.createElement(Input, {
|
|
25
|
+
"aria-label": ariaLabel,
|
|
26
|
+
autoFocus: autoFocus,
|
|
27
|
+
className: className,
|
|
28
|
+
placeholder: placeholder,
|
|
29
|
+
size: size,
|
|
30
|
+
allowClear: true,
|
|
31
|
+
onBlur: flush,
|
|
32
|
+
onChange: (event)=>setDraft(event.target.value === '' ? undefined : event.target.value),
|
|
33
|
+
onPressEnter: flush,
|
|
34
|
+
value: draft ?? ''
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export default DraftInput;
|
|
@@ -0,0 +1,36 @@
|
|
|
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 { InputNumber } from 'antd';
|
|
17
|
+
import useDraft from './useDraft.js';
|
|
18
|
+
// A number input whose value applies after a pause, on Enter or on blur.
|
|
19
|
+
function DraftInputNumber({ 'aria-label': ariaLabel, autoFocus, className, onChange, placeholder, size, value }) {
|
|
20
|
+
const { draft, setDraft, flush } = useDraft({
|
|
21
|
+
value,
|
|
22
|
+
onChange
|
|
23
|
+
});
|
|
24
|
+
return /*#__PURE__*/ React.createElement(InputNumber, {
|
|
25
|
+
"aria-label": ariaLabel,
|
|
26
|
+
autoFocus: autoFocus,
|
|
27
|
+
className: className,
|
|
28
|
+
placeholder: placeholder,
|
|
29
|
+
size: size,
|
|
30
|
+
onBlur: flush,
|
|
31
|
+
onChange: (next)=>setDraft(next ?? undefined),
|
|
32
|
+
onPressEnter: flush,
|
|
33
|
+
value: draft ?? null
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export default DraftInputNumber;
|
|
@@ -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 React from 'react';
|
|
16
|
+
import FilterGroup from './FilterGroup.js';
|
|
17
|
+
import getGroupOperator from './getGroupOperator.js';
|
|
18
|
+
import toRootGroup from './toRootGroup.js';
|
|
19
|
+
import useSyncedState from './useSyncedState.js';
|
|
20
|
+
// The nested And/Or condition editor (D6, D7), shared by the column filter popover ("Advanced")
|
|
21
|
+
// and the toolbar filter. Props:
|
|
22
|
+
// - `condition`: the Condition to edit (a group, a leaf, or null),
|
|
23
|
+
// - `columns`: the normalised columns conditions may use (pass the filterable ones),
|
|
24
|
+
// - `user`: the user object, to show what `{ $user: path }` values resolve to,
|
|
25
|
+
// - `onChange(condition)`: called with the edited condition; null once it has no conditions.
|
|
26
|
+
// Conditions still being built (no value yet) are written as they are; the table's filter
|
|
27
|
+
// ignores them until they are complete.
|
|
28
|
+
function FilterBuilder({ condition, columns, user, onChange }) {
|
|
29
|
+
const [local, setLocal] = useSyncedState({
|
|
30
|
+
value: condition ?? null,
|
|
31
|
+
onChange
|
|
32
|
+
});
|
|
33
|
+
const root = toRootGroup(local);
|
|
34
|
+
return /*#__PURE__*/ React.createElement("div", {
|
|
35
|
+
className: "lf-filter-builder",
|
|
36
|
+
"data-lf-filter-builder": ""
|
|
37
|
+
}, /*#__PURE__*/ React.createElement(FilterGroup, {
|
|
38
|
+
columns: columns,
|
|
39
|
+
depth: 1,
|
|
40
|
+
group: root,
|
|
41
|
+
onChange: (next)=>setLocal(next[getGroupOperator(next)].length ? next : null),
|
|
42
|
+
user: user
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
export default FilterBuilder;
|