@cratis/components 4.21.0 → 4.22.0
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/MIGRATION.md +3 -3
- package/compat-manifest.json +16 -16
- package/dist/esm/Canvas/Canvas.d.ts +12 -81
- package/dist/esm/Canvas/Canvas.d.ts.map +1 -1
- package/dist/esm/Canvas/Canvas.js +83 -676
- package/dist/esm/Canvas/Canvas.js.map +1 -1
- package/dist/esm/Canvas/CanvasCaptureAttributes.d.ts +10 -0
- package/dist/esm/Canvas/CanvasCaptureAttributes.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasCaptureAttributes.js +4 -0
- package/dist/esm/Canvas/CanvasCaptureAttributes.js.map +1 -0
- package/dist/esm/Canvas/CanvasContext.d.ts +9 -0
- package/dist/esm/Canvas/CanvasContext.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasContext.js +4 -0
- package/dist/esm/Canvas/CanvasContext.js.map +1 -0
- package/dist/esm/Canvas/CanvasHandle.d.ts +13 -0
- package/dist/esm/Canvas/CanvasHandle.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasHandle.js +4 -0
- package/dist/esm/Canvas/CanvasHandle.js.map +1 -0
- package/dist/esm/Canvas/CanvasItem.js +4 -1
- package/dist/esm/Canvas/CanvasItem.js.map +1 -1
- package/dist/esm/Canvas/CanvasItemData.d.ts +10 -0
- package/dist/esm/Canvas/CanvasItemData.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasItemData.js +4 -0
- package/dist/esm/Canvas/CanvasItemData.js.map +1 -0
- package/dist/esm/Canvas/CanvasItemRegistryContext.d.ts +5 -0
- package/dist/esm/Canvas/CanvasItemRegistryContext.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasItemRegistryContext.js +6 -0
- package/dist/esm/Canvas/CanvasItemRegistryContext.js.map +1 -0
- package/dist/esm/Canvas/CanvasItemRegistryContextValue.d.ts +26 -0
- package/dist/esm/Canvas/CanvasItemRegistryContextValue.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasItemRegistryContextValue.js +4 -0
- package/dist/esm/Canvas/CanvasItemRegistryContextValue.js.map +1 -0
- package/dist/esm/Canvas/CanvasItemRegistryEntry.d.ts +19 -0
- package/dist/esm/Canvas/CanvasItemRegistryEntry.d.ts.map +1 -0
- package/dist/esm/Canvas/CanvasItemRegistryEntry.js +4 -0
- package/dist/esm/Canvas/CanvasItemRegistryEntry.js.map +1 -0
- package/dist/esm/Canvas/WebKitGestureEvent.d.ts +13 -0
- package/dist/esm/Canvas/WebKitGestureEvent.d.ts.map +1 -0
- package/dist/esm/Canvas/WebKitGestureEvent.js +4 -0
- package/dist/esm/Canvas/WebKitGestureEvent.js.map +1 -0
- package/dist/esm/Canvas/canvasEasing.d.ts +8 -0
- package/dist/esm/Canvas/canvasEasing.d.ts.map +1 -0
- package/dist/esm/Canvas/canvasEasing.js +8 -0
- package/dist/esm/Canvas/canvasEasing.js.map +1 -0
- package/dist/esm/Canvas/canvasGestureTuning.d.ts +6 -0
- package/dist/esm/Canvas/canvasGestureTuning.d.ts.map +1 -0
- package/dist/esm/Canvas/canvasGestureTuning.js +7 -0
- package/dist/esm/Canvas/canvasGestureTuning.js.map +1 -0
- package/dist/esm/Canvas/index.js +2 -1
- package/dist/esm/Canvas/index.js.map +1 -1
- package/dist/esm/Canvas/shapes/Region/Region.js +4 -1
- package/dist/esm/Canvas/shapes/Region/Region.js.map +1 -1
- package/dist/esm/Canvas/useCanvasCamera.d.ts +37 -0
- package/dist/esm/Canvas/useCanvasCamera.d.ts.map +1 -0
- package/dist/esm/Canvas/useCanvasCamera.js +79 -0
- package/dist/esm/Canvas/useCanvasCamera.js.map +1 -0
- package/dist/esm/Canvas/useCanvasItemRegistry.d.ts +14 -0
- package/dist/esm/Canvas/useCanvasItemRegistry.d.ts.map +1 -0
- package/dist/esm/Canvas/useCanvasItemRegistry.js +59 -0
- package/dist/esm/Canvas/useCanvasItemRegistry.js.map +1 -0
- package/dist/esm/Canvas/useCanvasNavigation.d.ts +36 -0
- package/dist/esm/Canvas/useCanvasNavigation.d.ts.map +1 -0
- package/dist/esm/Canvas/useCanvasNavigation.js +186 -0
- package/dist/esm/Canvas/useCanvasNavigation.js.map +1 -0
- package/dist/esm/Canvas/useCanvasPointerGestures.d.ts +34 -0
- package/dist/esm/Canvas/useCanvasPointerGestures.d.ts.map +1 -0
- package/dist/esm/Canvas/useCanvasPointerGestures.js +178 -0
- package/dist/esm/Canvas/useCanvasPointerGestures.js.map +1 -0
- package/dist/esm/Canvas/useCanvasWheelZoom.d.ts +23 -0
- package/dist/esm/Canvas/useCanvasWheelZoom.d.ts.map +1 -0
- package/dist/esm/Canvas/useCanvasWheelZoom.js +146 -0
- package/dist/esm/Canvas/useCanvasWheelZoom.js.map +1 -0
- package/dist/esm/Canvas/useLatestRef.d.ts +8 -0
- package/dist/esm/Canvas/useLatestRef.d.ts.map +1 -0
- package/dist/esm/Canvas/useLatestRef.js +12 -0
- package/dist/esm/Canvas/useLatestRef.js.map +1 -0
- package/dist/esm/Canvas/usePixiApplication.d.ts +32 -0
- package/dist/esm/Canvas/usePixiApplication.d.ts.map +1 -0
- package/dist/esm/Canvas/usePixiApplication.js +92 -0
- package/dist/esm/Canvas/usePixiApplication.js.map +1 -0
- package/dist/esm/Canvas/usePixiItems.d.ts +19 -0
- package/dist/esm/Canvas/usePixiItems.d.ts.map +1 -0
- package/dist/esm/Canvas/usePixiItems.js +49 -0
- package/dist/esm/Canvas/usePixiItems.js.map +1 -0
- package/dist/esm/Chat/ChatSidebar.d.ts.map +1 -1
- package/dist/esm/Chat/ChatSidebar.js +1 -1
- package/dist/esm/Chat/ChatSidebar.js.map +1 -1
- package/dist/esm/ClassNames/classNames.d.ts +7 -0
- package/dist/esm/ClassNames/classNames.d.ts.map +1 -0
- package/dist/esm/ClassNames/classNames.js +4 -0
- package/dist/esm/ClassNames/classNames.js.map +1 -0
- package/dist/esm/Common/Breadcrumbs.d.ts.map +1 -1
- package/dist/esm/Common/Breadcrumbs.js +1 -1
- package/dist/esm/Common/Breadcrumbs.js.map +1 -1
- package/dist/esm/Common/ComboBox.d.ts.map +1 -1
- package/dist/esm/Common/ComboBox.js +1 -1
- package/dist/esm/Common/ComboBox.js.map +1 -1
- package/dist/esm/Common/DatePickerInputImplementation.d.ts.map +1 -1
- package/dist/esm/Common/DatePickerInputImplementation.js +1 -1
- package/dist/esm/Common/DatePickerInputImplementation.js.map +1 -1
- package/dist/esm/Common/NumberInput.d.ts.map +1 -1
- package/dist/esm/Common/NumberInput.js +1 -1
- package/dist/esm/Common/NumberInput.js.map +1 -1
- package/dist/esm/Common/Tabs.d.ts.map +1 -1
- package/dist/esm/Common/Tabs.js +1 -1
- package/dist/esm/Common/Tabs.js.map +1 -1
- package/dist/esm/Common/TagGroup.d.ts.map +1 -1
- package/dist/esm/Common/TagGroup.js +1 -1
- package/dist/esm/Common/TagGroup.js.map +1 -1
- package/dist/esm/Common/ToggleGroup.d.ts.map +1 -1
- package/dist/esm/Common/ToggleGroup.js +1 -1
- package/dist/esm/Common/ToggleGroup.js.map +1 -1
- package/dist/esm/DataTables/ColumnFilterMenu.d.ts.map +1 -1
- package/dist/esm/DataTables/ColumnFilterMenu.js +1 -1
- package/dist/esm/DataTables/ColumnFilterMenu.js.map +1 -1
- package/dist/esm/DataTables/DataTableBody.d.ts +22 -0
- package/dist/esm/DataTables/DataTableBody.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableBody.js +10 -0
- package/dist/esm/DataTables/DataTableBody.js.map +1 -0
- package/dist/esm/DataTables/DataTableCore.d.ts +8 -48
- package/dist/esm/DataTables/DataTableCore.d.ts.map +1 -1
- package/dist/esm/DataTables/DataTableCore.js +50 -278
- package/dist/esm/DataTables/DataTableCore.js.map +1 -1
- package/dist/esm/DataTables/DataTableHeaderCell.d.ts +25 -0
- package/dist/esm/DataTables/DataTableHeaderCell.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableHeaderCell.js +26 -0
- package/dist/esm/DataTables/DataTableHeaderCell.js.map +1 -0
- package/dist/esm/DataTables/DataTableMessageOverrides.d.ts +12 -0
- package/dist/esm/DataTables/DataTableMessageOverrides.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableMessageOverrides.js +4 -0
- package/dist/esm/DataTables/DataTableMessageOverrides.js.map +1 -0
- package/dist/esm/DataTables/DataTableMessages.d.ts +12 -0
- package/dist/esm/DataTables/DataTableMessages.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableMessages.js +4 -0
- package/dist/esm/DataTables/DataTableMessages.js.map +1 -0
- package/dist/esm/DataTables/DataTableParts.d.ts +40 -0
- package/dist/esm/DataTables/DataTableParts.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableParts.js +4 -0
- package/dist/esm/DataTables/DataTableParts.js.map +1 -0
- package/dist/esm/DataTables/DataTableRow.d.ts +22 -0
- package/dist/esm/DataTables/DataTableRow.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableRow.js +25 -0
- package/dist/esm/DataTables/DataTableRow.js.map +1 -0
- package/dist/esm/DataTables/DataTableRowClickEvent.d.ts +8 -0
- package/dist/esm/DataTables/DataTableRowClickEvent.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableRowClickEvent.js +4 -0
- package/dist/esm/DataTables/DataTableRowClickEvent.js.map +1 -0
- package/dist/esm/DataTables/DataTableSearch.d.ts +13 -0
- package/dist/esm/DataTables/DataTableSearch.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableSearch.js +7 -0
- package/dist/esm/DataTables/DataTableSearch.js.map +1 -0
- package/dist/esm/DataTables/DataTableState.d.ts +18 -0
- package/dist/esm/DataTables/DataTableState.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableState.js +4 -0
- package/dist/esm/DataTables/DataTableState.js.map +1 -0
- package/dist/esm/DataTables/DataTableStateProps.d.ts +20 -0
- package/dist/esm/DataTables/DataTableStateProps.d.ts.map +1 -0
- package/dist/esm/DataTables/DataTableStateProps.js +4 -0
- package/dist/esm/DataTables/DataTableStateProps.js.map +1 -0
- package/dist/esm/DataTables/ProcessedRow.d.ts +8 -0
- package/dist/esm/DataTables/ProcessedRow.d.ts.map +1 -0
- package/dist/esm/DataTables/ProcessedRow.js +4 -0
- package/dist/esm/DataTables/ProcessedRow.js.map +1 -0
- package/dist/esm/DataTables/RowProcessingState.d.ts +17 -0
- package/dist/esm/DataTables/RowProcessingState.d.ts.map +1 -0
- package/dist/esm/DataTables/RowProcessingState.js +4 -0
- package/dist/esm/DataTables/RowProcessingState.js.map +1 -0
- package/dist/esm/DataTables/RowSelection.d.ts +19 -0
- package/dist/esm/DataTables/RowSelection.d.ts.map +1 -0
- package/dist/esm/DataTables/RowSelection.js +4 -0
- package/dist/esm/DataTables/RowSelection.js.map +1 -0
- package/dist/esm/DataTables/RowSelectionSource.d.ts +16 -0
- package/dist/esm/DataTables/RowSelectionSource.d.ts.map +1 -0
- package/dist/esm/DataTables/RowSelectionSource.js +4 -0
- package/dist/esm/DataTables/RowSelectionSource.js.map +1 -0
- package/dist/esm/DataTables/matchesFilterEntry.d.ts +15 -0
- package/dist/esm/DataTables/matchesFilterEntry.d.ts.map +1 -0
- package/dist/esm/DataTables/matchesFilterEntry.js +70 -0
- package/dist/esm/DataTables/matchesFilterEntry.js.map +1 -0
- package/dist/esm/DataTables/processRows.d.ts +10 -0
- package/dist/esm/DataTables/processRows.d.ts.map +1 -0
- package/dist/esm/DataTables/processRows.js +42 -0
- package/dist/esm/DataTables/processRows.js.map +1 -0
- package/dist/esm/DataTables/useDataTableMessages.d.ts +9 -0
- package/dist/esm/DataTables/useDataTableMessages.d.ts.map +1 -0
- package/dist/esm/DataTables/useDataTableMessages.js +33 -0
- package/dist/esm/DataTables/useDataTableMessages.js.map +1 -0
- package/dist/esm/DataTables/useDataTableState.d.ts +10 -0
- package/dist/esm/DataTables/useDataTableState.d.ts.map +1 -0
- package/dist/esm/DataTables/useDataTableState.js +19 -0
- package/dist/esm/DataTables/useDataTableState.js.map +1 -0
- package/dist/esm/DataTables/useRowSelection.d.ts +9 -0
- package/dist/esm/DataTables/useRowSelection.d.ts.map +1 -0
- package/dist/esm/DataTables/useRowSelection.js +87 -0
- package/dist/esm/DataTables/useRowSelection.js.map +1 -0
- package/dist/esm/DataTables/valueAtPath.d.ts +10 -0
- package/dist/esm/DataTables/valueAtPath.d.ts.map +1 -0
- package/dist/esm/DataTables/valueAtPath.js +18 -0
- package/dist/esm/DataTables/valueAtPath.js.map +1 -0
- package/dist/esm/Dialogs/DialogImplementation.d.ts.map +1 -1
- package/dist/esm/Dialogs/DialogImplementation.js +1 -1
- package/dist/esm/Dialogs/DialogImplementation.js.map +1 -1
- package/dist/esm/Display/Message.d.ts +8 -1
- package/dist/esm/Display/Message.d.ts.map +1 -1
- package/dist/esm/Display/Message.js +1 -1
- package/dist/esm/Display/Message.js.map +1 -1
- package/dist/esm/Dropdown/DropdownImplementation.d.ts.map +1 -1
- package/dist/esm/Dropdown/DropdownImplementation.js +1 -1
- package/dist/esm/Dropdown/DropdownImplementation.js.map +1 -1
- package/dist/esm/Notifications/Toaster.d.ts.map +1 -1
- package/dist/esm/Notifications/Toaster.js +1 -1
- package/dist/esm/Notifications/Toaster.js.map +1 -1
- package/dist/esm/PivotViewer/components/PivotCanvas.d.ts +7 -50
- package/dist/esm/PivotViewer/components/PivotCanvas.d.ts.map +1 -1
- package/dist/esm/PivotViewer/components/PivotCanvas.js +34 -433
- package/dist/esm/PivotViewer/components/PivotCanvas.js.map +1 -1
- package/dist/esm/PivotViewer/components/PivotCanvasProps.d.ts +51 -0
- package/dist/esm/PivotViewer/components/PivotCanvasProps.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/PivotCanvasProps.js +4 -0
- package/dist/esm/PivotViewer/components/PivotCanvasProps.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/PivotRenderContext.d.ts +16 -0
- package/dist/esm/PivotViewer/components/pivot/PivotRenderContext.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/PivotRenderContext.js +4 -0
- package/dist/esm/PivotViewer/components/pivot/PivotRenderContext.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/PivotStage.d.ts +19 -0
- package/dist/esm/PivotViewer/components/pivot/PivotStage.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/PivotStage.js +4 -0
- package/dist/esm/PivotViewer/components/pivot/PivotStage.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/PivotTransitionState.d.ts +21 -0
- package/dist/esm/PivotViewer/components/pivot/PivotTransitionState.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/PivotTransitionState.js +4 -0
- package/dist/esm/PivotViewer/components/pivot/PivotTransitionState.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/asReactMouseEvent.d.ts +8 -0
- package/dist/esm/PivotViewer/components/pivot/asReactMouseEvent.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/asReactMouseEvent.js +6 -0
- package/dist/esm/PivotViewer/components/pivot/asReactMouseEvent.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/sprites.js +1 -1
- package/dist/esm/PivotViewer/components/pivot/usePivotCardColors.d.ts +22 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotCardColors.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotCardColors.js +25 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotCardColors.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotGroupBackgrounds.d.ts +8 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotGroupBackgrounds.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotGroupBackgrounds.js +53 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotGroupBackgrounds.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotScrollSync.d.ts +8 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotScrollSync.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotScrollSync.js +100 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotScrollSync.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotSelectionHighlight.d.ts +7 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotSelectionHighlight.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotSelectionHighlight.js +35 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotSelectionHighlight.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotSpriteSync.d.ts +8 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotSpriteSync.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotSpriteSync.js +123 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotSpriteSync.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotStage.d.ts +21 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotStage.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotStage.js +171 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotStage.js.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotTransitionState.d.ts +13 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotTransitionState.d.ts.map +1 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotTransitionState.js +31 -0
- package/dist/esm/PivotViewer/components/pivot/usePivotTransitionState.js.map +1 -0
- package/dist/esm/TimeMachine/EventsView.d.ts.map +1 -1
- package/dist/esm/TimeMachine/EventsView.js +1 -1
- package/dist/esm/TimeMachine/EventsView.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matchesFilterEntry.js","sources":["../../../DataTables/matchesFilterEntry.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport {\n DataTableFilterMatchMode,\n type DataTableFilterConstraint,\n type DataTableFilterEntry,\n} from './DataTableFilterMeta';\nimport { resolveDataTableFilterMatcher } from './DataTableFilterMatcherRegistry';\n\nconst dateNumber = (value: unknown) => {\n // A cloned Date is normalized in place so caller-owned Date instances (row\n // values and filter constraints alike) are never mutated by comparison.\n const date =\n value instanceof Date ? new Date(value.getTime()) : new Date(String(value));\n return Number.isNaN(date.getTime()) ? undefined : date.setHours(0, 0, 0, 0);\n};\n\n/**\n * The first constraint of a filter entry, which is what the column filter menu edits.\n * @param entry The filter entry, if any.\n * @returns Its first constraint, or undefined.\n */\nexport const firstConstraint = (\n entry: DataTableFilterEntry | undefined,\n): DataTableFilterConstraint | undefined =>\n entry && 'constraints' in entry ? entry.constraints[0] : entry;\n\nconst builtInMatches = (\n value: unknown,\n constraint: DataTableFilterConstraint,\n): boolean => {\n const filter = constraint.value;\n const mode = constraint.matchMode ?? DataTableFilterMatchMode.Contains;\n if (filter === null || filter === undefined || filter === '') return true;\n\n const valueText = String(value ?? '').toLocaleLowerCase();\n const filterText = String(filter).toLocaleLowerCase();\n const valueNumber = typeof value === 'number' ? value : Number(value);\n const filterNumber = typeof filter === 'number' ? filter : Number(filter);\n\n switch (mode) {\n case DataTableFilterMatchMode.StartsWith:\n return valueText.startsWith(filterText);\n case DataTableFilterMatchMode.Contains:\n return valueText.includes(filterText);\n case DataTableFilterMatchMode.NotContains:\n return !valueText.includes(filterText);\n case DataTableFilterMatchMode.EndsWith:\n return valueText.endsWith(filterText);\n case DataTableFilterMatchMode.Equals:\n return Object.is(value, filter) || valueText === filterText;\n case DataTableFilterMatchMode.NotEquals:\n return !(Object.is(value, filter) || valueText === filterText);\n case DataTableFilterMatchMode.In:\n return Array.isArray(filter) && filter.some((item) => Object.is(item, value));\n case DataTableFilterMatchMode.Between:\n return (\n Array.isArray(filter) &&\n filter.length >= 2 &&\n valueNumber >= Number(filter[0]) &&\n valueNumber <= Number(filter[1])\n );\n case DataTableFilterMatchMode.LessThan:\n return valueNumber < filterNumber;\n case DataTableFilterMatchMode.LessThanOrEqual:\n return valueNumber <= filterNumber;\n case DataTableFilterMatchMode.GreaterThan:\n return valueNumber > filterNumber;\n case DataTableFilterMatchMode.GreaterThanOrEqual:\n return valueNumber >= filterNumber;\n case DataTableFilterMatchMode.DateIs:\n return dateNumber(value) === dateNumber(filter);\n case DataTableFilterMatchMode.DateIsNot:\n return dateNumber(value) !== dateNumber(filter);\n case DataTableFilterMatchMode.DateBefore:\n return (dateNumber(value) ?? Infinity) < (dateNumber(filter) ?? -Infinity);\n case DataTableFilterMatchMode.DateAfter:\n return (dateNumber(value) ?? -Infinity) > (dateNumber(filter) ?? Infinity);\n default:\n return resolveDataTableFilterMatcher(String(mode))?.(value, filter) ?? false;\n }\n};\n\n/**\n * Whether a value satisfies a filter entry, combining its constraints with the entry's operator.\n * @param value The row value.\n * @param entry The filter entry.\n * @returns True when the value matches.\n */\nexport const matchesFilterEntry = (value: unknown, entry: DataTableFilterEntry) => {\n if (!('constraints' in entry)) return builtInMatches(value, entry);\n if (entry.constraints.length === 0) return true;\n\n const matches = entry.constraints.map((constraint) =>\n builtInMatches(value, constraint),\n );\n return entry.operator?.toLowerCase() === 'or'\n ? matches.some(Boolean)\n : matches.every(Boolean);\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ProcessedRow } from './ProcessedRow.js';
|
|
2
|
+
import type { RowProcessingState } from './RowProcessingState.js';
|
|
3
|
+
/**
|
|
4
|
+
* Filters and sorts loaded rows by the table's state, or keeps them as given when row processing is off.
|
|
5
|
+
* @param data The loaded rows.
|
|
6
|
+
* @param state The filter, search and sort state.
|
|
7
|
+
* @returns The rows to render, each with its loaded-page index.
|
|
8
|
+
*/
|
|
9
|
+
export declare const processRows: <TData extends object>(data: TData[], { filters, globalFilter, globalFilterFields, sort, rowProcessing, }: RowProcessingState) => ProcessedRow<TData>[];
|
|
10
|
+
//# sourceMappingURL=processRows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processRows.d.ts","sourceRoot":"","sources":["../../../DataTables/processRows.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAsB,CAAC;AAa/D;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,KAAK,SAAS,MAAM,QACtC,KAAK,EAAE,uEAOV,kBAAkB,KACtB,YAAY,CAAC,KAAK,CAAC,EA6BrB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { DataTableRowProcessing } from './DataTableRowProcessing.js';
|
|
2
|
+
import { matchesFilterEntry } from './matchesFilterEntry.js';
|
|
3
|
+
import { valueAtPath } from './valueAtPath.js';
|
|
4
|
+
|
|
5
|
+
const compareValues = (left, right) => {
|
|
6
|
+
if (typeof left === 'number' && typeof right === 'number')
|
|
7
|
+
return left - right;
|
|
8
|
+
if (left instanceof Date && right instanceof Date)
|
|
9
|
+
return left.getTime() - right.getTime();
|
|
10
|
+
return String(left ?? '').localeCompare(String(right ?? ''), undefined, {
|
|
11
|
+
numeric: true,
|
|
12
|
+
sensitivity: 'base',
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
const processRows = (data, { filters, globalFilter, globalFilterFields, sort, rowProcessing, }) => {
|
|
16
|
+
if (rowProcessing === DataTableRowProcessing.None) {
|
|
17
|
+
return data.map((row, loadedIndex) => ({ row, loadedIndex }));
|
|
18
|
+
}
|
|
19
|
+
const term = globalFilter.trim().toLocaleLowerCase();
|
|
20
|
+
const rows = data
|
|
21
|
+
.map((row, loadedIndex) => ({ row, loadedIndex }))
|
|
22
|
+
.filter(({ row }) => {
|
|
23
|
+
const rowValues = row;
|
|
24
|
+
const matchesColumns = Object.entries(filters).every(([field, entry]) => matchesFilterEntry(valueAtPath(rowValues, field), entry));
|
|
25
|
+
if (!matchesColumns)
|
|
26
|
+
return false;
|
|
27
|
+
if (!term || !globalFilterFields?.length)
|
|
28
|
+
return true;
|
|
29
|
+
return globalFilterFields.some((field) => String(valueAtPath(rowValues, field) ?? '')
|
|
30
|
+
.toLocaleLowerCase()
|
|
31
|
+
.includes(term));
|
|
32
|
+
});
|
|
33
|
+
if (!sort)
|
|
34
|
+
return rows;
|
|
35
|
+
return [...rows].sort((left, right) => {
|
|
36
|
+
const comparison = compareValues(valueAtPath(left.row, sort.field), valueAtPath(right.row, sort.field));
|
|
37
|
+
return sort.direction === 'ascending' ? comparison : -comparison;
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export { processRows };
|
|
42
|
+
//# sourceMappingURL=processRows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processRows.js","sources":["../../../DataTables/processRows.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { DataTableRowProcessing } from './DataTableRowProcessing';\nimport { matchesFilterEntry } from './matchesFilterEntry';\nimport type { ProcessedRow } from './ProcessedRow';\nimport type { RowProcessingState } from './RowProcessingState';\nimport { valueAtPath } from './valueAtPath';\n\nconst compareValues = (left: unknown, right: unknown): number => {\n if (typeof left === 'number' && typeof right === 'number') return left - right;\n if (left instanceof Date && right instanceof Date)\n return left.getTime() - right.getTime();\n return String(left ?? '').localeCompare(String(right ?? ''), undefined, {\n numeric: true,\n sensitivity: 'base',\n });\n};\n\n/**\n * Filters and sorts loaded rows by the table's state, or keeps them as given when row processing is off.\n * @param data The loaded rows.\n * @param state The filter, search and sort state.\n * @returns The rows to render, each with its loaded-page index.\n */\nexport const processRows = <TData extends object>(\n data: TData[],\n {\n filters,\n globalFilter,\n globalFilterFields,\n sort,\n rowProcessing,\n }: RowProcessingState,\n): ProcessedRow<TData>[] => {\n if (rowProcessing === DataTableRowProcessing.None) {\n return data.map((row, loadedIndex) => ({ row, loadedIndex }));\n }\n const term = globalFilter.trim().toLocaleLowerCase();\n const rows = data\n .map((row, loadedIndex) => ({ row, loadedIndex }))\n .filter(({ row }) => {\n const rowValues = row as Record<string, unknown>;\n const matchesColumns = Object.entries(filters).every(([field, entry]) =>\n matchesFilterEntry(valueAtPath(rowValues, field), entry),\n );\n if (!matchesColumns) return false;\n if (!term || !globalFilterFields?.length) return true;\n return globalFilterFields.some((field) =>\n String(valueAtPath(rowValues, field) ?? '')\n .toLocaleLowerCase()\n .includes(term),\n );\n });\n\n if (!sort) return rows;\n return [...rows].sort((left, right) => {\n const comparison = compareValues(\n valueAtPath(left.row as Record<string, unknown>, sort.field),\n valueAtPath(right.row as Record<string, unknown>, sort.field),\n );\n return sort.direction === 'ascending' ? comparison : -comparison;\n });\n};\n"],"names":[],"mappings":";;;;AASA,MAAM,aAAa,GAAG,CAAC,IAAa,EAAE,KAAc,KAAY;IAC5D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,GAAG,KAAK;AAC9E,IAAA,IAAI,IAAI,YAAY,IAAI,IAAI,KAAK,YAAY,IAAI;QAC7C,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE;AAC3C,IAAA,OAAO,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE;AACpE,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,WAAW,EAAE,MAAM;AACtB,KAAA,CAAC;AACN,CAAC;AAQM,MAAM,WAAW,GAAG,CACvB,IAAa,EACb,EACI,OAAO,EACP,YAAY,EACZ,kBAAkB,EAClB,IAAI,EACJ,aAAa,GACI,KACE;AACvB,IAAA,IAAI,aAAa,KAAK,sBAAsB,CAAC,IAAI,EAAE;AAC/C,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,WAAW,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;IACjE;IACA,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,iBAAiB,EAAE;IACpD,MAAM,IAAI,GAAG;AACR,SAAA,GAAG,CAAC,CAAC,GAAG,EAAE,WAAW,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;AAChD,SAAA,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAI;QAChB,MAAM,SAAS,GAAG,GAA8B;AAChD,QAAA,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,KAChE,kBAAkB,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAC3D;AACD,QAAA,IAAI,CAAC,cAAc;AAAE,YAAA,OAAO,KAAK;AACjC,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,kBAAkB,EAAE,MAAM;AAAE,YAAA,OAAO,IAAI;AACrD,QAAA,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,KAAK,KACjC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE;AACrC,aAAA,iBAAiB;AACjB,aAAA,QAAQ,CAAC,IAAI,CAAC,CACtB;AACL,IAAA,CAAC,CAAC;AAEN,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;AACtB,IAAA,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;QAClC,MAAM,UAAU,GAAG,aAAa,CAC5B,WAAW,CAAC,IAAI,CAAC,GAA8B,EAAE,IAAI,CAAC,KAAK,CAAC,EAC5D,WAAW,CAAC,KAAK,CAAC,GAA8B,EAAE,IAAI,CAAC,KAAK,CAAC,CAChE;AACD,QAAA,OAAO,IAAI,CAAC,SAAS,KAAK,WAAW,GAAG,UAAU,GAAG,CAAC,UAAU;AACpE,IAAA,CAAC,CAAC;AACN;;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DataTableMessageOverrides } from './DataTableMessageOverrides.js';
|
|
2
|
+
import type { DataTableMessages } from './DataTableMessages.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolves each table message from its prop, then the provider's `dataTable` messages, then the default.
|
|
5
|
+
* @param overrides The messages passed as props.
|
|
6
|
+
* @returns The messages to show.
|
|
7
|
+
*/
|
|
8
|
+
export declare const useDataTableMessages: (overrides: DataTableMessageOverrides) => DataTableMessages;
|
|
9
|
+
//# sourceMappingURL=useDataTableMessages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDataTableMessages.d.ts","sourceRoot":"","sources":["../../../DataTables/useDataTableMessages.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAA6B,CAAC;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAqB,CAAC;AAE7D;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,cAClB,yBAAyB,KACrC,iBA2BF,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import 'react/jsx-runtime';
|
|
2
|
+
import 'react';
|
|
3
|
+
import 'react-aria-components/I18nProvider';
|
|
4
|
+
import 'ts-deepmerge';
|
|
5
|
+
import 'react-dom';
|
|
6
|
+
import { useCratisComponentsConfig } from '../configuration/CratisComponentsContext.js';
|
|
7
|
+
import '../Notifications/toast.js';
|
|
8
|
+
import '../renderer/RendererContext.js';
|
|
9
|
+
|
|
10
|
+
const useDataTableMessages = (overrides) => {
|
|
11
|
+
const { messages } = useCratisComponentsConfig();
|
|
12
|
+
const dataTableMessages = messages?.dataTable;
|
|
13
|
+
return {
|
|
14
|
+
resolvedSelectionAriaLabel: overrides.selectionAriaLabel ?? dataTableMessages?.selectRow ?? 'Select row',
|
|
15
|
+
resolvedSelectAllAriaLabel: overrides.selectAllAriaLabel ??
|
|
16
|
+
dataTableMessages?.selectAllRows ??
|
|
17
|
+
'Select all rows',
|
|
18
|
+
resolvedGlobalSearchPlaceholder: overrides.globalSearchPlaceholder ?? dataTableMessages?.search ?? 'Search…',
|
|
19
|
+
resolvedGlobalSearchAriaLabel: overrides.globalSearchAriaLabel ??
|
|
20
|
+
dataTableMessages?.searchAriaLabel ??
|
|
21
|
+
'Search table',
|
|
22
|
+
resolvedLoadingMessage: overrides.loadingMessage ?? dataTableMessages?.loading ?? 'Loading…',
|
|
23
|
+
resolvedFailureMessage: overrides.failureMessage ??
|
|
24
|
+
dataTableMessages?.failed ??
|
|
25
|
+
'Could not load data.',
|
|
26
|
+
resolvedUnauthorizedMessage: overrides.unauthorizedMessage ??
|
|
27
|
+
dataTableMessages?.unauthorized ??
|
|
28
|
+
'You are not authorized to view this data.',
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export { useDataTableMessages };
|
|
33
|
+
//# sourceMappingURL=useDataTableMessages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDataTableMessages.js","sources":["../../../DataTables/useDataTableMessages.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useCratisComponentsConfig } from '../Common/CratisComponentsProvider';\nimport type { DataTableMessageOverrides } from './DataTableMessageOverrides';\nimport type { DataTableMessages } from './DataTableMessages';\n\n/**\n * Resolves each table message from its prop, then the provider's `dataTable` messages, then the default.\n * @param overrides The messages passed as props.\n * @returns The messages to show.\n */\nexport const useDataTableMessages = (\n overrides: DataTableMessageOverrides,\n): DataTableMessages => {\n const { messages } = useCratisComponentsConfig();\n const dataTableMessages = messages?.dataTable;\n return {\n resolvedSelectionAriaLabel:\n overrides.selectionAriaLabel ?? dataTableMessages?.selectRow ?? 'Select row',\n resolvedSelectAllAriaLabel:\n overrides.selectAllAriaLabel ??\n dataTableMessages?.selectAllRows ??\n 'Select all rows',\n resolvedGlobalSearchPlaceholder:\n overrides.globalSearchPlaceholder ?? dataTableMessages?.search ?? 'Search…',\n resolvedGlobalSearchAriaLabel:\n overrides.globalSearchAriaLabel ??\n dataTableMessages?.searchAriaLabel ??\n 'Search table',\n resolvedLoadingMessage:\n overrides.loadingMessage ?? dataTableMessages?.loading ?? 'Loading…',\n resolvedFailureMessage:\n overrides.failureMessage ??\n dataTableMessages?.failed ??\n 'Could not load data.',\n resolvedUnauthorizedMessage:\n overrides.unauthorizedMessage ??\n dataTableMessages?.unauthorized ??\n 'You are not authorized to view this data.',\n };\n};\n"],"names":[],"mappings":";;;;;;;;;AAYO,MAAM,oBAAoB,GAAG,CAChC,SAAoC,KACjB;AACnB,IAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,yBAAyB,EAAE;AAChD,IAAA,MAAM,iBAAiB,GAAG,QAAQ,EAAE,SAAS;IAC7C,OAAO;QACH,0BAA0B,EACtB,SAAS,CAAC,kBAAkB,IAAI,iBAAiB,EAAE,SAAS,IAAI,YAAY;QAChF,0BAA0B,EACtB,SAAS,CAAC,kBAAkB;AAC5B,YAAA,iBAAiB,EAAE,aAAa;YAChC,iBAAiB;QACrB,+BAA+B,EAC3B,SAAS,CAAC,uBAAuB,IAAI,iBAAiB,EAAE,MAAM,IAAI,SAAS;QAC/E,6BAA6B,EACzB,SAAS,CAAC,qBAAqB;AAC/B,YAAA,iBAAiB,EAAE,eAAe;YAClC,cAAc;QAClB,sBAAsB,EAClB,SAAS,CAAC,cAAc,IAAI,iBAAiB,EAAE,OAAO,IAAI,UAAU;QACxE,sBAAsB,EAClB,SAAS,CAAC,cAAc;AACxB,YAAA,iBAAiB,EAAE,MAAM;YACzB,sBAAsB;QAC1B,2BAA2B,EACvB,SAAS,CAAC,mBAAmB;AAC7B,YAAA,iBAAiB,EAAE,YAAY;YAC/B,2CAA2C;KAClD;AACL;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { DataTableState } from './DataTableState.js';
|
|
2
|
+
import type { DataTableStateProps } from './DataTableStateProps.js';
|
|
3
|
+
/**
|
|
4
|
+
* The table's filter, search and sort state, each controlled by its prop when set and kept by the
|
|
5
|
+
* table otherwise. Every change is reported through its callback in both modes.
|
|
6
|
+
* @param props The state props of the table.
|
|
7
|
+
* @returns The current state and its setters.
|
|
8
|
+
*/
|
|
9
|
+
export declare const useDataTableState: ({ defaultFilters, filters: filtersProp, onFilter, globalFilter: globalFilterProp, onGlobalFilterChange, sort: sortProp, onSortChange, }: DataTableStateProps) => DataTableState;
|
|
10
|
+
//# sourceMappingURL=useDataTableState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDataTableState.d.ts","sourceRoot":"","sources":["../../../DataTables/useDataTableState.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAAuB,CAAC;AAGjE;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,4IAQ3B,mBAAmB,KAAG,cA0BxB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { useControllableState } from './useControllableState.js';
|
|
2
|
+
|
|
3
|
+
const useDataTableState = ({ defaultFilters, filters: filtersProp, onFilter, globalFilter: globalFilterProp, onGlobalFilterChange, sort: sortProp, onSortChange, }) => {
|
|
4
|
+
const [filters, setFilters] = useControllableState(filtersProp, defaultFilters ?? {}, onFilter);
|
|
5
|
+
const [globalFilter, setGlobalFilter] = useControllableState(globalFilterProp, '', onGlobalFilterChange);
|
|
6
|
+
const [sort, setSort] = useControllableState(sortProp, null, onSortChange);
|
|
7
|
+
const updateFilter = (field, constraint) => {
|
|
8
|
+
const next = { ...filters };
|
|
9
|
+
if (constraint)
|
|
10
|
+
next[field] = constraint;
|
|
11
|
+
else
|
|
12
|
+
delete next[field];
|
|
13
|
+
setFilters(next);
|
|
14
|
+
};
|
|
15
|
+
return { filters, updateFilter, globalFilter, setGlobalFilter, sort, setSort };
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export { useDataTableState };
|
|
19
|
+
//# sourceMappingURL=useDataTableState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDataTableState.js","sources":["../../../DataTables/useDataTableState.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type {\n DataTableFilterConstraint,\n DataTableFilterMeta,\n} from './DataTableFilterMeta';\nimport type { DataTableSort } from './DataTableSort';\nimport type { DataTableState } from './DataTableState';\nimport type { DataTableStateProps } from './DataTableStateProps';\nimport { useControllableState } from './useControllableState';\n\n/**\n * The table's filter, search and sort state, each controlled by its prop when set and kept by the\n * table otherwise. Every change is reported through its callback in both modes.\n * @param props The state props of the table.\n * @returns The current state and its setters.\n */\nexport const useDataTableState = ({\n defaultFilters,\n filters: filtersProp,\n onFilter,\n globalFilter: globalFilterProp,\n onGlobalFilterChange,\n sort: sortProp,\n onSortChange,\n}: DataTableStateProps): DataTableState => {\n const [filters, setFilters] = useControllableState<DataTableFilterMeta>(\n filtersProp,\n defaultFilters ?? {},\n onFilter,\n );\n const [globalFilter, setGlobalFilter] = useControllableState(\n globalFilterProp,\n '',\n onGlobalFilterChange,\n );\n const [sort, setSort] = useControllableState<DataTableSort | null>(\n sortProp,\n null,\n onSortChange,\n );\n const updateFilter = (\n field: string,\n constraint: DataTableFilterConstraint | undefined,\n ) => {\n const next = { ...filters };\n if (constraint) next[field] = constraint;\n else delete next[field];\n setFilters(next);\n };\n return { filters, updateFilter, globalFilter, setGlobalFilter, sort, setSort };\n};\n"],"names":[],"mappings":";;AAkBO,MAAM,iBAAiB,GAAG,CAAC,EAC9B,cAAc,EACd,OAAO,EAAE,WAAW,EACpB,QAAQ,EACR,YAAY,EAAE,gBAAgB,EAC9B,oBAAoB,EACpB,IAAI,EAAE,QAAQ,EACd,YAAY,GACM,KAAoB;AACtC,IAAA,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,oBAAoB,CAC9C,WAAW,EACX,cAAc,IAAI,EAAE,EACpB,QAAQ,CACX;AACD,IAAA,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,oBAAoB,CACxD,gBAAgB,EAChB,EAAE,EACF,oBAAoB,CACvB;AACD,IAAA,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,oBAAoB,CACxC,QAAQ,EACR,IAAI,EACJ,YAAY,CACf;AACD,IAAA,MAAM,YAAY,GAAG,CACjB,KAAa,EACb,UAAiD,KACjD;AACA,QAAA,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE;AAC3B,QAAA,IAAI,UAAU;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,UAAU;;AACnC,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC;QACvB,UAAU,CAAC,IAAI,CAAC;AACpB,IAAA,CAAC;AACD,IAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE;AAClF;;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { RowSelection } from './RowSelection.js';
|
|
2
|
+
import type { RowSelectionSource } from './RowSelectionSource.js';
|
|
3
|
+
/**
|
|
4
|
+
* Single and multiple row selection by data key, or by object identity without one.
|
|
5
|
+
* @param source The rows and the selection to work with.
|
|
6
|
+
* @returns The selection state and actions.
|
|
7
|
+
*/
|
|
8
|
+
export declare const useRowSelection: <TData extends object>({ data, visibleRows, dataKey, selection, selectedItems, onSelectedItemsChange, }: RowSelectionSource<TData>) => RowSelection<TData>;
|
|
9
|
+
//# sourceMappingURL=useRowSelection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRowSelection.d.ts","sourceRoot":"","sources":["../../../DataTables/useRowSelection.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAsB,CAAC;AAG/D;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,SAAS,MAAM,oFAOjD,kBAAkB,CAAC,KAAK,CAAC,KAAG,YAAY,CAAC,KAAK,CAiGhD,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { useMemo, useRef, useEffect } from 'react';
|
|
2
|
+
import { valueAtPath } from './valueAtPath.js';
|
|
3
|
+
|
|
4
|
+
const useRowSelection = ({ data, visibleRows, dataKey, selection, selectedItems, onSelectedItemsChange, }) => {
|
|
5
|
+
const dataKeyIdentity = (row) => String(valueAtPath(row, dataKey));
|
|
6
|
+
const dataKeyCounts = useMemo(() => {
|
|
7
|
+
const counts = new Map();
|
|
8
|
+
if (!dataKey)
|
|
9
|
+
return counts;
|
|
10
|
+
for (const row of data) {
|
|
11
|
+
const identity = String(valueAtPath(row, dataKey));
|
|
12
|
+
counts.set(identity, (counts.get(identity) ?? 0) + 1);
|
|
13
|
+
}
|
|
14
|
+
return counts;
|
|
15
|
+
}, [data, dataKey]);
|
|
16
|
+
const firstLoadedIndexByDataKey = useMemo(() => {
|
|
17
|
+
const indices = new Map();
|
|
18
|
+
if (!dataKey)
|
|
19
|
+
return indices;
|
|
20
|
+
data.forEach((row, loadedIndex) => {
|
|
21
|
+
const identity = String(valueAtPath(row, dataKey));
|
|
22
|
+
if (!indices.has(identity))
|
|
23
|
+
indices.set(identity, loadedIndex);
|
|
24
|
+
});
|
|
25
|
+
return indices;
|
|
26
|
+
}, [data, dataKey]);
|
|
27
|
+
const selectedLoadedIndex = selection ? data.indexOf(selection) : -1;
|
|
28
|
+
const selectedDataKey = selection && dataKey ? dataKeyIdentity(selection) : undefined;
|
|
29
|
+
const isSelectedRow = (row, loadedIndex) => {
|
|
30
|
+
if (!selection)
|
|
31
|
+
return false;
|
|
32
|
+
if (!dataKey)
|
|
33
|
+
return loadedIndex === selectedLoadedIndex;
|
|
34
|
+
const identity = dataKeyIdentity(row);
|
|
35
|
+
if (identity !== selectedDataKey)
|
|
36
|
+
return false;
|
|
37
|
+
if ((dataKeyCounts.get(identity) ?? 0) <= 1)
|
|
38
|
+
return true;
|
|
39
|
+
if (selectedLoadedIndex >= 0)
|
|
40
|
+
return loadedIndex === selectedLoadedIndex;
|
|
41
|
+
return loadedIndex === firstLoadedIndexByDataKey.get(identity);
|
|
42
|
+
};
|
|
43
|
+
const selectedItemsList = useMemo(() => selectedItems ?? [], [selectedItems]);
|
|
44
|
+
const isRowSelected = (row) => dataKey
|
|
45
|
+
? selectedItemsList.some((selected) => dataKeyIdentity(selected) === dataKeyIdentity(row))
|
|
46
|
+
: selectedItemsList.includes(row);
|
|
47
|
+
const toggleRowSelection = (row) => {
|
|
48
|
+
const next = isRowSelected(row)
|
|
49
|
+
? selectedItemsList.filter((selected) => dataKey
|
|
50
|
+
? dataKeyIdentity(selected) !== dataKeyIdentity(row)
|
|
51
|
+
: selected !== row)
|
|
52
|
+
: [...selectedItemsList, row];
|
|
53
|
+
onSelectedItemsChange?.(next);
|
|
54
|
+
};
|
|
55
|
+
const isVisibleRow = (row) => dataKey
|
|
56
|
+
? visibleRows.some((visible) => dataKeyIdentity(visible) === dataKeyIdentity(row))
|
|
57
|
+
: visibleRows.includes(row);
|
|
58
|
+
const selectedVisibleCount = visibleRows.filter((row) => isRowSelected(row)).length;
|
|
59
|
+
const allFilteredRowsSelected = visibleRows.length > 0 && selectedVisibleCount === visibleRows.length;
|
|
60
|
+
const someFilteredRowsSelected = selectedVisibleCount > 0 && !allFilteredRowsSelected;
|
|
61
|
+
const selectAllRef = useRef(null);
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
if (selectAllRef.current) {
|
|
64
|
+
selectAllRef.current.indeterminate = someFilteredRowsSelected;
|
|
65
|
+
}
|
|
66
|
+
}, [someFilteredRowsSelected]);
|
|
67
|
+
const toggleSelectAll = () => {
|
|
68
|
+
if (allFilteredRowsSelected) {
|
|
69
|
+
onSelectedItemsChange?.(selectedItemsList.filter((selected) => !isVisibleRow(selected)));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const additions = visibleRows.filter((row) => !isRowSelected(row));
|
|
73
|
+
onSelectedItemsChange?.([...selectedItemsList, ...additions]);
|
|
74
|
+
};
|
|
75
|
+
return {
|
|
76
|
+
dataKeyIdentity,
|
|
77
|
+
isSelectedRow,
|
|
78
|
+
isRowSelected,
|
|
79
|
+
toggleRowSelection,
|
|
80
|
+
allFilteredRowsSelected,
|
|
81
|
+
selectAllRef,
|
|
82
|
+
toggleSelectAll,
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export { useRowSelection };
|
|
87
|
+
//# sourceMappingURL=useRowSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRowSelection.js","sources":["../../../DataTables/useRowSelection.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useEffect, useMemo, useRef } from 'react';\nimport type { RowSelection } from './RowSelection';\nimport type { RowSelectionSource } from './RowSelectionSource';\nimport { valueAtPath } from './valueAtPath';\n\n/**\n * Single and multiple row selection by data key, or by object identity without one.\n * @param source The rows and the selection to work with.\n * @returns The selection state and actions.\n */\nexport const useRowSelection = <TData extends object>({\n data,\n visibleRows,\n dataKey,\n selection,\n selectedItems,\n onSelectedItemsChange,\n}: RowSelectionSource<TData>): RowSelection<TData> => {\n const dataKeyIdentity = (row: TData) =>\n String(valueAtPath(row as Record<string, unknown>, dataKey!));\n const dataKeyCounts = useMemo(() => {\n const counts = new Map<string, number>();\n if (!dataKey) return counts;\n for (const row of data) {\n const identity = String(valueAtPath(row as Record<string, unknown>, dataKey));\n counts.set(identity, (counts.get(identity) ?? 0) + 1);\n }\n return counts;\n }, [data, dataKey]);\n const firstLoadedIndexByDataKey = useMemo(() => {\n const indices = new Map<string, number>();\n if (!dataKey) return indices;\n data.forEach((row, loadedIndex) => {\n const identity = String(valueAtPath(row as Record<string, unknown>, dataKey));\n if (!indices.has(identity)) indices.set(identity, loadedIndex);\n });\n return indices;\n }, [data, dataKey]);\n const selectedLoadedIndex = selection ? data.indexOf(selection) : -1;\n const selectedDataKey = selection && dataKey ? dataKeyIdentity(selection) : undefined;\n const isSelectedRow = (row: TData, loadedIndex: number) => {\n if (!selection) return false;\n if (!dataKey) return loadedIndex === selectedLoadedIndex;\n\n const identity = dataKeyIdentity(row);\n if (identity !== selectedDataKey) return false;\n if ((dataKeyCounts.get(identity) ?? 0) <= 1) return true;\n if (selectedLoadedIndex >= 0) return loadedIndex === selectedLoadedIndex;\n return loadedIndex === firstLoadedIndexByDataKey.get(identity);\n };\n\n // Membership is by dataKey when there is one, and by object identity otherwise. A table whose\n // rows are replaced wholesale on every refresh - which is every observable query - keeps its\n // selection only in the first case, which is why dataKey matters here as much as it does for\n // single selection.\n const selectedItemsList = useMemo(() => selectedItems ?? [], [selectedItems]);\n const isRowSelected = (row: TData) =>\n dataKey\n ? selectedItemsList.some(\n (selected) => dataKeyIdentity(selected) === dataKeyIdentity(row),\n )\n : selectedItemsList.includes(row);\n\n const toggleRowSelection = (row: TData) => {\n const next = isRowSelected(row)\n ? selectedItemsList.filter((selected) =>\n dataKey\n ? dataKeyIdentity(selected) !== dataKeyIdentity(row)\n : selected !== row,\n )\n : [...selectedItemsList, row];\n onSelectedItemsChange?.(next);\n };\n\n // Select-all means the rows the user can currently see. A filtered table that silently selected\n // rows hidden behind the filter would act on more than it showed, which is the whole hazard of a\n // bulk action.\n const isVisibleRow = (row: TData) =>\n dataKey\n ? visibleRows.some(\n (visible) => dataKeyIdentity(visible) === dataKeyIdentity(row),\n )\n : visibleRows.includes(row);\n const selectedVisibleCount = visibleRows.filter((row) => isRowSelected(row)).length;\n const allFilteredRowsSelected =\n visibleRows.length > 0 && selectedVisibleCount === visibleRows.length;\n const someFilteredRowsSelected = selectedVisibleCount > 0 && !allFilteredRowsSelected;\n const selectAllRef = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (selectAllRef.current) {\n selectAllRef.current.indeterminate = someFilteredRowsSelected;\n }\n }, [someFilteredRowsSelected]);\n\n const toggleSelectAll = () => {\n if (allFilteredRowsSelected) {\n onSelectedItemsChange?.(\n selectedItemsList.filter((selected) => !isVisibleRow(selected)),\n );\n return;\n }\n const additions = visibleRows.filter((row) => !isRowSelected(row));\n onSelectedItemsChange?.([...selectedItemsList, ...additions]);\n };\n\n return {\n dataKeyIdentity,\n isSelectedRow,\n isRowSelected,\n toggleRowSelection,\n allFilteredRowsSelected,\n selectAllRef,\n toggleSelectAll,\n };\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** A value read from a row, with functions turned into their text. */
|
|
2
|
+
export type CellValue = string | number | boolean | bigint | symbol | Date | object | null | undefined;
|
|
3
|
+
/**
|
|
4
|
+
* Reads a dotted property path from a row, only through the row's own properties.
|
|
5
|
+
* @param row The row.
|
|
6
|
+
* @param path The dotted path, such as `address.city`.
|
|
7
|
+
* @returns The value, or undefined when any segment is missing.
|
|
8
|
+
*/
|
|
9
|
+
export declare const valueAtPath: (row: Record<string, unknown>, path: string | undefined) => CellValue;
|
|
10
|
+
//# sourceMappingURL=valueAtPath.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valueAtPath.d.ts","sourceRoot":"","sources":["../../../DataTables/valueAtPath.ts"],"names":[],"mappings":"AAGA,sEAAsE;AACtE,MAAM,MAAM,SAAS,GACjB,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAKnF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,QACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QACtB,MAAM,GAAG,SAAS,KACzB,SAUF,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const asCellValue = (value) => typeof value === 'function' ? String(value) : value;
|
|
2
|
+
const valueAtPath = (row, path) => {
|
|
3
|
+
if (!path)
|
|
4
|
+
return undefined;
|
|
5
|
+
let current = row;
|
|
6
|
+
for (const segment of path.split('.')) {
|
|
7
|
+
if (current === null || typeof current !== 'object')
|
|
8
|
+
return undefined;
|
|
9
|
+
const record = current;
|
|
10
|
+
if (!Object.hasOwn(record, segment))
|
|
11
|
+
return undefined;
|
|
12
|
+
current = asCellValue(record[segment]);
|
|
13
|
+
}
|
|
14
|
+
return current;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export { valueAtPath };
|
|
18
|
+
//# sourceMappingURL=valueAtPath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valueAtPath.js","sources":["../../../DataTables/valueAtPath.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n/** A value read from a row, with functions turned into their text. */\nexport type CellValue =\n string | number | boolean | bigint | symbol | Date | object | null | undefined;\n\nconst asCellValue = (value: unknown): CellValue =>\n typeof value === 'function' ? String(value) : (value as CellValue);\n\n/**\n * Reads a dotted property path from a row, only through the row's own properties.\n * @param row The row.\n * @param path The dotted path, such as `address.city`.\n * @returns The value, or undefined when any segment is missing.\n */\nexport const valueAtPath = (\n row: Record<string, unknown>,\n path: string | undefined,\n): CellValue => {\n if (!path) return undefined;\n let current: CellValue = row;\n for (const segment of path.split('.')) {\n if (current === null || typeof current !== 'object') return undefined;\n const record = current as Record<string, unknown>;\n if (!Object.hasOwn(record, segment)) return undefined;\n current = asCellValue(record[segment]);\n }\n return current;\n};\n"],"names":[],"mappings":"AAOA,MAAM,WAAW,GAAG,CAAC,KAAc,KAC/B,OAAO,KAAK,KAAK,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,GAAI,KAAmB;MAQzD,WAAW,GAAG,CACvB,GAA4B,EAC5B,IAAwB,KACb;AACX,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,SAAS;IAC3B,IAAI,OAAO,GAAc,GAAG;IAC5B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;AACnC,QAAA,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,YAAA,OAAO,SAAS;QACrE,MAAM,MAAM,GAAG,OAAkC;QACjD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;AAAE,YAAA,OAAO,SAAS;QACrD,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1C;AACA,IAAA,OAAO,OAAO;AAClB;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DialogImplementation.d.ts","sourceRoot":"","sources":["../../../Dialogs/DialogImplementation.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"DialogImplementation.d.ts","sourceRoot":"","sources":["../../../Dialogs/DialogImplementation.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAU,CAAC;AAoB5C;;;GAGG;AACH,eAAO,MAAM,oBAAoB,yPAyB9B,WAAW,uCAgZb,CAAC"}
|
|
@@ -12,10 +12,10 @@ import 'react-dom';
|
|
|
12
12
|
import { useCratisComponentsConfig } from '../configuration/CratisComponentsContext.js';
|
|
13
13
|
import { useCratisIcon } from '../configuration/useCratisIcon.js';
|
|
14
14
|
import '../Notifications/toast.js';
|
|
15
|
+
import { classNames } from '../ClassNames/classNames.js';
|
|
15
16
|
import { openDialogTier, closeDialogTier, DIALOG_ZINDEX_TOKEN, dialogZIndexForTier } from '../renderer/dialogStack.js';
|
|
16
17
|
import { DialogStackContext } from '../renderer/DialogStackContext.js';
|
|
17
18
|
|
|
18
|
-
const classNames = (...values) => values.filter(Boolean).join(' ');
|
|
19
19
|
const subscribeToBrowserEnvironment = () => () => undefined;
|
|
20
20
|
const useIsBrowser = () => useSyncExternalStore(subscribeToBrowserEnvironment, () => true, () => false);
|
|
21
21
|
const DialogImplementation = ({ title, subtitle, placement = 'center', closeIcon, visible = true, onClose, onConfirm, onCancel, buttons = DialogButtons.OkCancel, initialFocus = DialogInitialFocus.Confirm, children, width = '450px', style, contentStyle, isValid, isBusy = false, okLabel, cancelLabel, yesLabel, noLabel, closeAriaLabel, dismissable, className, pt, }) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DialogImplementation.js","sources":["../../../Dialogs/DialogImplementation.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { DialogResult, DialogButtons, useDialogContext } from '@cratis/arc.react/dialogs';\nimport { Dialog as AriaDialog, Heading } from 'react-aria-components/Dialog';\nimport { Modal, ModalOverlay } from 'react-aria-components/Modal';\nimport { UNSAFE_PortalProvider } from 'react-aria';\nimport { useEffect, useId, useLayoutEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport { unstable_useOverlayEnvironment } from '../renderer/RendererContext';\nimport { DialogInitialFocus } from './DialogInitialFocus';\nimport type { DialogProps } from './Dialog';\nimport { useCratisComponentsConfig } from '../Common/CratisComponentsProvider';\nimport { useCratisIcon } from '../configuration/useCratisIcon';\nimport {\n DIALOG_ZINDEX_TOKEN,\n closeDialogTier,\n dialogZIndexForTier,\n openDialogTier,\n} from '../renderer/dialogStack';\nimport { DialogStackContext } from '../renderer/DialogStackContext';\n\nconst classNames = (...values: Array<string | undefined>) =>\n values.filter(Boolean).join(' ');\n\nconst subscribeToBrowserEnvironment = () => () => undefined;\nconst useIsBrowser = () =>\n useSyncExternalStore(\n subscribeToBrowserEnvironment,\n () => true,\n () => false,\n );\n\n/**\n * A modal dialog with Arc host integration, typed footer actions, busy/validity\n * state, controlled dismissal, and stable Cratis-owned styling parts.\n */\nexport const DialogImplementation = ({\n title,\n subtitle,\n placement = 'center',\n closeIcon,\n visible = true,\n onClose,\n onConfirm,\n onCancel,\n buttons = DialogButtons.OkCancel,\n initialFocus = DialogInitialFocus.Confirm,\n children,\n width = '450px',\n style,\n contentStyle,\n isValid,\n isBusy = false,\n okLabel,\n cancelLabel,\n yesLabel,\n noLabel,\n closeAriaLabel,\n dismissable,\n className,\n pt,\n}: DialogProps) => {\n const overlayEnvironment = unstable_useOverlayEnvironment();\n const { messages } = useCratisComponentsConfig();\n const dialogMessages = messages?.dialog;\n const resolvedOkLabel = okLabel ?? dialogMessages?.ok ?? 'Ok';\n const resolvedCancelLabel = cancelLabel ?? dialogMessages?.cancel ?? 'Cancel';\n const resolvedYesLabel = yesLabel ?? dialogMessages?.yes ?? 'Yes';\n const resolvedNoLabel = noLabel ?? dialogMessages?.no ?? 'No';\n const resolvedCloseAriaLabel = closeAriaLabel ?? dialogMessages?.close ?? 'Close';\n const icon = useCratisIcon();\n const resolvedCloseIcon = icon('close', '×', closeIcon);\n let contextCloseDialog: ((result: DialogResult) => void) | undefined;\n try {\n const context = useDialogContext();\n contextCloseDialog = context?.closeDialog;\n } catch {\n contextCloseDialog = undefined;\n }\n\n const isBrowser = useIsBrowser();\n const subtitleId = useId();\n const hasSubtitle = subtitle !== undefined && subtitle !== null && subtitle !== false;\n const titleRef = useRef<HTMLHeadingElement>(null);\n const confirmRef = useRef<HTMLButtonElement>(null);\n const cancelRef = useRef<HTMLButtonElement>(null);\n\n const isDialogValid = isValid !== false;\n const hasDismissingButton =\n typeof buttons === 'number' && buttons !== DialogButtons.Ok;\n const resolvedInitialFocus =\n initialFocus === DialogInitialFocus.Cancel && !hasDismissingButton\n ? DialogInitialFocus.Content\n : initialFocus;\n const focusesConfirmButton = resolvedInitialFocus === DialogInitialFocus.Confirm;\n const focusesDismissingButton = resolvedInitialFocus === DialogInitialFocus.Cancel;\n const focusesTitle = resolvedInitialFocus === DialogInitialFocus.Content;\n const allowsDismissal = dismissable ?? typeof buttons === 'number';\n const isDismissable = allowsDismissal && !isBusy;\n\n // Assigns this dialog a strictly increasing tier for as long as it is visible, so a second\n // dialog opened while this one is still open - from anywhere, not necessarily as a React\n // child of this one - stacks above it rather than colliding on the same static z-index.\n const [dialogTier, setDialogTier] = useState<number | null>(null);\n useLayoutEffect(() => {\n if (!visible) {\n setDialogTier(null);\n return;\n }\n const tier = openDialogTier();\n setDialogTier(tier);\n return () => closeDialogTier(tier);\n }, [visible]);\n const resolvedZIndex = dialogTier === null ? undefined : dialogZIndexForTier(dialogTier);\n\n useEffect(() => {\n if (!visible) return;\n const target = focusesConfirmButton\n ? confirmRef.current\n : focusesDismissingButton\n ? cancelRef.current\n : titleRef.current;\n const frame = requestAnimationFrame(() => target?.focus());\n return () => cancelAnimationFrame(frame);\n }, [focusesConfirmButton, focusesDismissingButton, visible]);\n\n const handleClose = async (result: DialogResult) => {\n let shouldCloseThroughContext = true;\n\n if (result === DialogResult.Ok || result === DialogResult.Yes) {\n if (onConfirm) {\n const closeResult = await onConfirm();\n shouldCloseThroughContext = closeResult === true;\n } else if (onClose) {\n const closeResult = await onClose(result);\n shouldCloseThroughContext = closeResult !== false;\n }\n } else if (onCancel) {\n const closeResult = await onCancel();\n shouldCloseThroughContext = closeResult === true;\n } else if (onClose) {\n const closeResult = await onClose(result);\n shouldCloseThroughContext = closeResult !== false;\n }\n\n if (shouldCloseThroughContext) contextCloseDialog?.(result);\n };\n\n const footerButton = (\n result: DialogResult,\n label: string,\n primary: boolean,\n focused: boolean,\n ) => (\n <button\n key={`${result}-${label}`}\n {...(primary ? pt?.confirm : pt?.cancel)}\n type='button'\n className={classNames(\n 'cratis-dialog__button',\n primary\n ? 'cratis-dialog__button--primary'\n : 'cratis-dialog__button--secondary',\n primary ? pt?.confirm?.className : pt?.cancel?.className,\n )}\n data-cratis-part={primary ? 'confirm' : 'cancel'}\n data-disabled={(primary ? !isDialogValid || isBusy : isBusy) || undefined}\n data-busy={isBusy || undefined}\n ref={primary ? confirmRef : focused ? cancelRef : undefined}\n onClick={() => void handleClose(result)}\n disabled={primary ? !isDialogValid || isBusy : isBusy}\n autoFocus={focused}\n aria-busy={primary && isBusy ? true : undefined}\n >\n {primary && isBusy && (\n <span className='cratis-dialog__spinner' aria-hidden='true' />\n )}\n <span>{label}</span>\n </button>\n );\n\n const predefinedFooter = () => {\n if (typeof buttons !== 'number') return buttons;\n\n switch (buttons) {\n case DialogButtons.Ok:\n return footerButton(\n DialogResult.Ok,\n resolvedOkLabel,\n true,\n focusesConfirmButton,\n );\n case DialogButtons.OkCancel:\n return (\n <>\n {footerButton(\n DialogResult.Ok,\n resolvedOkLabel,\n true,\n focusesConfirmButton,\n )}\n {footerButton(\n DialogResult.Cancelled,\n resolvedCancelLabel,\n false,\n focusesDismissingButton,\n )}\n </>\n );\n case DialogButtons.YesNo:\n return (\n <>\n {footerButton(\n DialogResult.Yes,\n resolvedYesLabel,\n true,\n focusesConfirmButton,\n )}\n {footerButton(\n DialogResult.No,\n resolvedNoLabel,\n false,\n focusesDismissingButton,\n )}\n </>\n );\n case DialogButtons.YesNoCancel:\n return (\n <>\n {footerButton(\n DialogResult.Yes,\n resolvedYesLabel,\n true,\n focusesConfirmButton,\n )}\n {footerButton(DialogResult.No, resolvedNoLabel, false, false)}\n {footerButton(\n DialogResult.Cancelled,\n resolvedCancelLabel,\n false,\n focusesDismissingButton,\n )}\n </>\n );\n default:\n return null;\n }\n };\n\n const dialogDocument = (\n <DialogStackContext.Provider value={resolvedZIndex ?? DIALOG_ZINDEX_TOKEN}>\n <AriaDialog\n className='cratis-dialog__document'\n aria-describedby={hasSubtitle ? subtitleId : undefined}\n >\n <>\n <header\n {...pt?.header}\n className={classNames('cratis-dialog__header', pt?.header?.className)}\n style={pt?.header?.style}\n data-cratis-part='header'\n >\n <Heading\n {...pt?.title}\n slot='title'\n tabIndex={focusesTitle ? -1 : undefined}\n ref={titleRef}\n className={classNames(\n 'cratis-dialog__title',\n pt?.title?.className,\n )}\n style={pt?.title?.style}\n data-cratis-part='title'\n >\n {title}\n </Heading>\n {hasSubtitle && (\n <p\n {...pt?.subtitle}\n id={subtitleId}\n className={classNames(\n 'cratis-dialog__subtitle',\n pt?.subtitle?.className,\n )}\n style={pt?.subtitle?.style}\n data-cratis-part='subtitle'\n >\n {subtitle}\n </p>\n )}\n {allowsDismissal && (\n <button\n {...pt?.close}\n type='button'\n disabled={isBusy}\n className={classNames(\n 'cratis-dialog__close',\n pt?.close?.className,\n )}\n data-cratis-part='close'\n data-disabled={isBusy || undefined}\n data-busy={isBusy || undefined}\n aria-label={resolvedCloseAriaLabel}\n onClick={() => void handleClose(DialogResult.Cancelled)}\n >\n <span aria-hidden='true'>{resolvedCloseIcon}</span>\n </button>\n )}\n </header>\n <div\n {...pt?.content}\n className={classNames(\n 'cratis-dialog__content',\n pt?.content?.className,\n )}\n style={{ ...pt?.content?.style, ...contentStyle }}\n data-cratis-part='content'\n data-open={visible || undefined}\n data-busy={isBusy || undefined}\n >\n <fieldset\n className='cratis-dialog__busy-scope'\n data-cratis-part='busy-scope'\n data-busy={isBusy || undefined}\n disabled={isBusy}\n inert={isBusy}\n aria-busy={isBusy || undefined}\n >\n {children}\n </fieldset>\n </div>\n {buttons !== null && (\n <footer\n {...pt?.footer}\n className={classNames(\n 'cratis-dialog__footer',\n pt?.footer?.className,\n )}\n style={pt?.footer?.style}\n data-cratis-part='footer'\n >\n <fieldset\n className='cratis-dialog__busy-scope cratis-dialog__busy-scope--footer'\n data-cratis-part='busy-scope'\n data-busy={isBusy || undefined}\n disabled={isBusy}\n inert={isBusy}\n aria-busy={isBusy || undefined}\n >\n {predefinedFooter()}\n </fieldset>\n </footer>\n )}\n </>\n </AriaDialog>\n </DialogStackContext.Provider>\n );\n\n const dialogStyle = { width, ...pt?.root?.style, ...style };\n\n // useSyncExternalStore supplies the server snapshot during hydration, so this\n // fallback is identical on the server and on the client's first render. React\n // switches to the portaled React Aria modal only after hydration completes.\n if (!isBrowser) {\n if (!visible) return null;\n return (\n <div\n {...pt?.backdrop}\n className={classNames('cratis-dialog__backdrop', pt?.backdrop?.className)}\n style={{\n zIndex: resolvedZIndex ?? DIALOG_ZINDEX_TOKEN,\n ...pt?.backdrop?.style,\n }}\n data-cratis-part='backdrop'\n data-placement={placement}\n data-open={visible || undefined}\n data-busy={isBusy || undefined}\n >\n <div\n {...pt?.positioner}\n className={classNames(\n 'cratis-dialog__positioner',\n pt?.positioner?.className,\n )}\n style={pt?.positioner?.style}\n data-cratis-part='positioner'\n data-placement={placement}\n data-open={visible || undefined}\n data-busy={isBusy || undefined}\n >\n <section\n {...pt?.root}\n className={classNames(\n 'cratis-dialog',\n pt?.root?.className,\n className,\n )}\n style={dialogStyle}\n data-cratis-part='root'\n data-placement={placement}\n data-open={visible || undefined}\n data-busy={isBusy || undefined}\n >\n {dialogDocument}\n </section>\n </div>\n </div>\n );\n }\n\n return (\n <UNSAFE_PortalProvider getContainer={overlayEnvironment.getContainer}>\n <ModalOverlay\n {...pt?.backdrop}\n isOpen={visible}\n onOpenChange={(open) => {\n if (!open && !isBusy) void handleClose(DialogResult.Cancelled);\n }}\n isDismissable={isDismissable}\n isKeyboardDismissDisabled={!isDismissable}\n className={classNames('cratis-dialog__backdrop', pt?.backdrop?.className)}\n style={{\n zIndex: resolvedZIndex ?? DIALOG_ZINDEX_TOKEN,\n ...pt?.backdrop?.style,\n }}\n data-cratis-part='backdrop'\n data-placement={placement}\n data-open={visible || undefined}\n data-busy={isBusy || undefined}\n >\n <div\n {...pt?.positioner}\n className={classNames(\n 'cratis-dialog__positioner',\n pt?.positioner?.className,\n )}\n style={pt?.positioner?.style}\n data-cratis-part='positioner'\n data-placement={placement}\n data-open={visible || undefined}\n data-busy={isBusy || undefined}\n >\n <Modal\n {...pt?.root}\n className={classNames(\n 'cratis-dialog',\n pt?.root?.className,\n className,\n )}\n style={dialogStyle}\n data-cratis-part='root'\n data-placement={placement}\n data-open={visible || undefined}\n data-busy={isBusy || undefined}\n >\n {dialogDocument}\n </Modal>\n </div>\n </ModalOverlay>\n </UNSAFE_PortalProvider>\n );\n};\n"],"names":["_jsxs","_jsx","_Fragment","AriaDialog"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DialogImplementation.js","sources":["../../../Dialogs/DialogImplementation.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { DialogResult, DialogButtons, useDialogContext } from '@cratis/arc.react/dialogs';\nimport { Dialog as AriaDialog, Heading } from 'react-aria-components/Dialog';\nimport { Modal, ModalOverlay } from 'react-aria-components/Modal';\nimport { UNSAFE_PortalProvider } from 'react-aria';\nimport { useEffect, useId, useLayoutEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport { unstable_useOverlayEnvironment } from '../renderer/RendererContext';\nimport { DialogInitialFocus } from './DialogInitialFocus';\nimport type { DialogProps } from './Dialog';\nimport { useCratisComponentsConfig } from '../Common/CratisComponentsProvider';\nimport { useCratisIcon } from '../configuration/useCratisIcon';\nimport {\n DIALOG_ZINDEX_TOKEN,\n closeDialogTier,\n dialogZIndexForTier,\n openDialogTier,\n} from '../renderer/dialogStack';\nimport { DialogStackContext } from '../renderer/DialogStackContext';\nimport { classNames } from '../ClassNames/classNames';\n\nconst subscribeToBrowserEnvironment = () => () => undefined;\nconst useIsBrowser = () =>\n useSyncExternalStore(\n subscribeToBrowserEnvironment,\n () => true,\n () => false,\n );\n\n/**\n * A modal dialog with Arc host integration, typed footer actions, busy/validity\n * state, controlled dismissal, and stable Cratis-owned styling parts.\n */\nexport const DialogImplementation = ({\n title,\n subtitle,\n placement = 'center',\n closeIcon,\n visible = true,\n onClose,\n onConfirm,\n onCancel,\n buttons = DialogButtons.OkCancel,\n initialFocus = DialogInitialFocus.Confirm,\n children,\n width = '450px',\n style,\n contentStyle,\n isValid,\n isBusy = false,\n okLabel,\n cancelLabel,\n yesLabel,\n noLabel,\n closeAriaLabel,\n dismissable,\n className,\n pt,\n}: DialogProps) => {\n const overlayEnvironment = unstable_useOverlayEnvironment();\n const { messages } = useCratisComponentsConfig();\n const dialogMessages = messages?.dialog;\n const resolvedOkLabel = okLabel ?? dialogMessages?.ok ?? 'Ok';\n const resolvedCancelLabel = cancelLabel ?? dialogMessages?.cancel ?? 'Cancel';\n const resolvedYesLabel = yesLabel ?? dialogMessages?.yes ?? 'Yes';\n const resolvedNoLabel = noLabel ?? dialogMessages?.no ?? 'No';\n const resolvedCloseAriaLabel = closeAriaLabel ?? dialogMessages?.close ?? 'Close';\n const icon = useCratisIcon();\n const resolvedCloseIcon = icon('close', '×', closeIcon);\n let contextCloseDialog: ((result: DialogResult) => void) | undefined;\n try {\n const context = useDialogContext();\n contextCloseDialog = context?.closeDialog;\n } catch {\n contextCloseDialog = undefined;\n }\n\n const isBrowser = useIsBrowser();\n const subtitleId = useId();\n const hasSubtitle = subtitle !== undefined && subtitle !== null && subtitle !== false;\n const titleRef = useRef<HTMLHeadingElement>(null);\n const confirmRef = useRef<HTMLButtonElement>(null);\n const cancelRef = useRef<HTMLButtonElement>(null);\n\n const isDialogValid = isValid !== false;\n const hasDismissingButton =\n typeof buttons === 'number' && buttons !== DialogButtons.Ok;\n const resolvedInitialFocus =\n initialFocus === DialogInitialFocus.Cancel && !hasDismissingButton\n ? DialogInitialFocus.Content\n : initialFocus;\n const focusesConfirmButton = resolvedInitialFocus === DialogInitialFocus.Confirm;\n const focusesDismissingButton = resolvedInitialFocus === DialogInitialFocus.Cancel;\n const focusesTitle = resolvedInitialFocus === DialogInitialFocus.Content;\n const allowsDismissal = dismissable ?? typeof buttons === 'number';\n const isDismissable = allowsDismissal && !isBusy;\n\n // Assigns this dialog a strictly increasing tier for as long as it is visible, so a second\n // dialog opened while this one is still open - from anywhere, not necessarily as a React\n // child of this one - stacks above it rather than colliding on the same static z-index.\n const [dialogTier, setDialogTier] = useState<number | null>(null);\n useLayoutEffect(() => {\n if (!visible) {\n setDialogTier(null);\n return;\n }\n const tier = openDialogTier();\n setDialogTier(tier);\n return () => closeDialogTier(tier);\n }, [visible]);\n const resolvedZIndex = dialogTier === null ? undefined : dialogZIndexForTier(dialogTier);\n\n useEffect(() => {\n if (!visible) return;\n const target = focusesConfirmButton\n ? confirmRef.current\n : focusesDismissingButton\n ? cancelRef.current\n : titleRef.current;\n const frame = requestAnimationFrame(() => target?.focus());\n return () => cancelAnimationFrame(frame);\n }, [focusesConfirmButton, focusesDismissingButton, visible]);\n\n const handleClose = async (result: DialogResult) => {\n let shouldCloseThroughContext = true;\n\n if (result === DialogResult.Ok || result === DialogResult.Yes) {\n if (onConfirm) {\n const closeResult = await onConfirm();\n shouldCloseThroughContext = closeResult === true;\n } else if (onClose) {\n const closeResult = await onClose(result);\n shouldCloseThroughContext = closeResult !== false;\n }\n } else if (onCancel) {\n const closeResult = await onCancel();\n shouldCloseThroughContext = closeResult === true;\n } else if (onClose) {\n const closeResult = await onClose(result);\n shouldCloseThroughContext = closeResult !== false;\n }\n\n if (shouldCloseThroughContext) contextCloseDialog?.(result);\n };\n\n const footerButton = (\n result: DialogResult,\n label: string,\n primary: boolean,\n focused: boolean,\n ) => (\n <button\n key={`${result}-${label}`}\n {...(primary ? pt?.confirm : pt?.cancel)}\n type='button'\n className={classNames(\n 'cratis-dialog__button',\n primary\n ? 'cratis-dialog__button--primary'\n : 'cratis-dialog__button--secondary',\n primary ? pt?.confirm?.className : pt?.cancel?.className,\n )}\n data-cratis-part={primary ? 'confirm' : 'cancel'}\n data-disabled={(primary ? !isDialogValid || isBusy : isBusy) || undefined}\n data-busy={isBusy || undefined}\n ref={primary ? confirmRef : focused ? cancelRef : undefined}\n onClick={() => void handleClose(result)}\n disabled={primary ? !isDialogValid || isBusy : isBusy}\n autoFocus={focused}\n aria-busy={primary && isBusy ? true : undefined}\n >\n {primary && isBusy && (\n <span className='cratis-dialog__spinner' aria-hidden='true' />\n )}\n <span>{label}</span>\n </button>\n );\n\n const predefinedFooter = () => {\n if (typeof buttons !== 'number') return buttons;\n\n switch (buttons) {\n case DialogButtons.Ok:\n return footerButton(\n DialogResult.Ok,\n resolvedOkLabel,\n true,\n focusesConfirmButton,\n );\n case DialogButtons.OkCancel:\n return (\n <>\n {footerButton(\n DialogResult.Ok,\n resolvedOkLabel,\n true,\n focusesConfirmButton,\n )}\n {footerButton(\n DialogResult.Cancelled,\n resolvedCancelLabel,\n false,\n focusesDismissingButton,\n )}\n </>\n );\n case DialogButtons.YesNo:\n return (\n <>\n {footerButton(\n DialogResult.Yes,\n resolvedYesLabel,\n true,\n focusesConfirmButton,\n )}\n {footerButton(\n DialogResult.No,\n resolvedNoLabel,\n false,\n focusesDismissingButton,\n )}\n </>\n );\n case DialogButtons.YesNoCancel:\n return (\n <>\n {footerButton(\n DialogResult.Yes,\n resolvedYesLabel,\n true,\n focusesConfirmButton,\n )}\n {footerButton(DialogResult.No, resolvedNoLabel, false, false)}\n {footerButton(\n DialogResult.Cancelled,\n resolvedCancelLabel,\n false,\n focusesDismissingButton,\n )}\n </>\n );\n default:\n return null;\n }\n };\n\n const dialogDocument = (\n <DialogStackContext.Provider value={resolvedZIndex ?? DIALOG_ZINDEX_TOKEN}>\n <AriaDialog\n className='cratis-dialog__document'\n aria-describedby={hasSubtitle ? subtitleId : undefined}\n >\n <>\n <header\n {...pt?.header}\n className={classNames('cratis-dialog__header', pt?.header?.className)}\n style={pt?.header?.style}\n data-cratis-part='header'\n >\n <Heading\n {...pt?.title}\n slot='title'\n tabIndex={focusesTitle ? -1 : undefined}\n ref={titleRef}\n className={classNames(\n 'cratis-dialog__title',\n pt?.title?.className,\n )}\n style={pt?.title?.style}\n data-cratis-part='title'\n >\n {title}\n </Heading>\n {hasSubtitle && (\n <p\n {...pt?.subtitle}\n id={subtitleId}\n className={classNames(\n 'cratis-dialog__subtitle',\n pt?.subtitle?.className,\n )}\n style={pt?.subtitle?.style}\n data-cratis-part='subtitle'\n >\n {subtitle}\n </p>\n )}\n {allowsDismissal && (\n <button\n {...pt?.close}\n type='button'\n disabled={isBusy}\n className={classNames(\n 'cratis-dialog__close',\n pt?.close?.className,\n )}\n data-cratis-part='close'\n data-disabled={isBusy || undefined}\n data-busy={isBusy || undefined}\n aria-label={resolvedCloseAriaLabel}\n onClick={() => void handleClose(DialogResult.Cancelled)}\n >\n <span aria-hidden='true'>{resolvedCloseIcon}</span>\n </button>\n )}\n </header>\n <div\n {...pt?.content}\n className={classNames(\n 'cratis-dialog__content',\n pt?.content?.className,\n )}\n style={{ ...pt?.content?.style, ...contentStyle }}\n data-cratis-part='content'\n data-open={visible || undefined}\n data-busy={isBusy || undefined}\n >\n <fieldset\n className='cratis-dialog__busy-scope'\n data-cratis-part='busy-scope'\n data-busy={isBusy || undefined}\n disabled={isBusy}\n inert={isBusy}\n aria-busy={isBusy || undefined}\n >\n {children}\n </fieldset>\n </div>\n {buttons !== null && (\n <footer\n {...pt?.footer}\n className={classNames(\n 'cratis-dialog__footer',\n pt?.footer?.className,\n )}\n style={pt?.footer?.style}\n data-cratis-part='footer'\n >\n <fieldset\n className='cratis-dialog__busy-scope cratis-dialog__busy-scope--footer'\n data-cratis-part='busy-scope'\n data-busy={isBusy || undefined}\n disabled={isBusy}\n inert={isBusy}\n aria-busy={isBusy || undefined}\n >\n {predefinedFooter()}\n </fieldset>\n </footer>\n )}\n </>\n </AriaDialog>\n </DialogStackContext.Provider>\n );\n\n const dialogStyle = { width, ...pt?.root?.style, ...style };\n\n // useSyncExternalStore supplies the server snapshot during hydration, so this\n // fallback is identical on the server and on the client's first render. React\n // switches to the portaled React Aria modal only after hydration completes.\n if (!isBrowser) {\n if (!visible) return null;\n return (\n <div\n {...pt?.backdrop}\n className={classNames('cratis-dialog__backdrop', pt?.backdrop?.className)}\n style={{\n zIndex: resolvedZIndex ?? DIALOG_ZINDEX_TOKEN,\n ...pt?.backdrop?.style,\n }}\n data-cratis-part='backdrop'\n data-placement={placement}\n data-open={visible || undefined}\n data-busy={isBusy || undefined}\n >\n <div\n {...pt?.positioner}\n className={classNames(\n 'cratis-dialog__positioner',\n pt?.positioner?.className,\n )}\n style={pt?.positioner?.style}\n data-cratis-part='positioner'\n data-placement={placement}\n data-open={visible || undefined}\n data-busy={isBusy || undefined}\n >\n <section\n {...pt?.root}\n className={classNames(\n 'cratis-dialog',\n pt?.root?.className,\n className,\n )}\n style={dialogStyle}\n data-cratis-part='root'\n data-placement={placement}\n data-open={visible || undefined}\n data-busy={isBusy || undefined}\n >\n {dialogDocument}\n </section>\n </div>\n </div>\n );\n }\n\n return (\n <UNSAFE_PortalProvider getContainer={overlayEnvironment.getContainer}>\n <ModalOverlay\n {...pt?.backdrop}\n isOpen={visible}\n onOpenChange={(open) => {\n if (!open && !isBusy) void handleClose(DialogResult.Cancelled);\n }}\n isDismissable={isDismissable}\n isKeyboardDismissDisabled={!isDismissable}\n className={classNames('cratis-dialog__backdrop', pt?.backdrop?.className)}\n style={{\n zIndex: resolvedZIndex ?? DIALOG_ZINDEX_TOKEN,\n ...pt?.backdrop?.style,\n }}\n data-cratis-part='backdrop'\n data-placement={placement}\n data-open={visible || undefined}\n data-busy={isBusy || undefined}\n >\n <div\n {...pt?.positioner}\n className={classNames(\n 'cratis-dialog__positioner',\n pt?.positioner?.className,\n )}\n style={pt?.positioner?.style}\n data-cratis-part='positioner'\n data-placement={placement}\n data-open={visible || undefined}\n data-busy={isBusy || undefined}\n >\n <Modal\n {...pt?.root}\n className={classNames(\n 'cratis-dialog',\n pt?.root?.className,\n className,\n )}\n style={dialogStyle}\n data-cratis-part='root'\n data-placement={placement}\n data-open={visible || undefined}\n data-busy={isBusy || undefined}\n >\n {dialogDocument}\n </Modal>\n </div>\n </ModalOverlay>\n </UNSAFE_PortalProvider>\n );\n};\n"],"names":["_jsxs","_jsx","_Fragment","AriaDialog"],"mappings":"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"}
|
|
@@ -13,7 +13,14 @@ export interface MessageProps {
|
|
|
13
13
|
className?: string;
|
|
14
14
|
/** The icon shown ahead of the text. Pass `false` for no icon. */
|
|
15
15
|
icon?: ReactNode | false;
|
|
16
|
+
/**
|
|
17
|
+
* Whether the message is its own live region, announced by assistive technology when it
|
|
18
|
+
* appears. Defaults to `true`: `severity="error"` renders `role="alert"`, every other severity
|
|
19
|
+
* `role="status"`. Pass `false` to render a plain element with no role when the message sits
|
|
20
|
+
* inside a live region that already announces it, so it is not announced twice.
|
|
21
|
+
*/
|
|
22
|
+
live?: boolean;
|
|
16
23
|
}
|
|
17
24
|
/** A declarative inline status message. */
|
|
18
|
-
export declare const Message: ({ severity, text, children, className, icon, }: MessageProps) => import("react").JSX.Element;
|
|
25
|
+
export declare const Message: ({ severity, text, children, className, icon, live, }: MessageProps) => import("react").JSX.Element;
|
|
19
26
|
//# sourceMappingURL=Message.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Message.d.ts","sourceRoot":"","sources":["../../../Display/Message.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,0CAA0C;AAC1C,MAAM,MAAM,eAAe,GACvB,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC;AAErE,iCAAiC;AACjC,MAAM,WAAW,YAAY;IACzB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,wBAAwB;IACxB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,IAAI,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"Message.d.ts","sourceRoot":"","sources":["../../../Display/Message.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,0CAA0C;AAC1C,MAAM,MAAM,eAAe,GACvB,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC;AAErE,iCAAiC;AACjC,MAAM,WAAW,YAAY;IACzB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,wBAAwB;IACxB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,IAAI,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC;IACzB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB;AAWD,2CAA2C;AAC3C,eAAO,MAAM,OAAO,yDAOjB,YAAY,gCAoBd,CAAC"}
|
|
@@ -8,7 +8,7 @@ const severitySymbols = {
|
|
|
8
8
|
secondary: 'ⓘ',
|
|
9
9
|
contrast: 'ⓘ',
|
|
10
10
|
};
|
|
11
|
-
const Message = ({ severity = 'info', text, children, className, icon, }) => (jsxs("div", { className: ['cratis-message', className].filter(Boolean).join(' '), "data-cratis-part": 'root', "data-severity": severity, role: severity === 'error' ? 'alert' : 'status', children: [icon !== false && (jsx("span", { className: 'cratis-message__icon', "data-cratis-part": 'icon', "aria-hidden": 'true', children: icon ?? severitySymbols[severity] })), jsx("span", { className: 'cratis-message__text', "data-cratis-part": 'text', children: children ?? text })] }));
|
|
11
|
+
const Message = ({ severity = 'info', text, children, className, icon, live = true, }) => (jsxs("div", { className: ['cratis-message', className].filter(Boolean).join(' '), "data-cratis-part": 'root', "data-severity": severity, role: live ? (severity === 'error' ? 'alert' : 'status') : undefined, children: [icon !== false && (jsx("span", { className: 'cratis-message__icon', "data-cratis-part": 'icon', "aria-hidden": 'true', children: icon ?? severitySymbols[severity] })), jsx("span", { className: 'cratis-message__text', "data-cratis-part": 'text', children: children ?? text })] }));
|
|
12
12
|
|
|
13
13
|
export { Message };
|
|
14
14
|
//# sourceMappingURL=Message.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Message.js","sources":["../../../Display/Message.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { ReactNode } from 'react';\n\n/** Severity tone of a {@link Message}. */\nexport type MessageSeverity =\n 'info' | 'success' | 'warn' | 'error' | 'secondary' | 'contrast';\n\n/** Props for {@link Message}. */\nexport interface MessageProps {\n /** Severity tone (drives the color). */\n severity?: MessageSeverity;\n /** The message text. */\n text?: ReactNode;\n /** Message content (alternative to {@link text}). */\n children?: ReactNode;\n /** Extra class name applied to the message root. */\n className?: string;\n /** The icon shown ahead of the text. Pass `false` for no icon. */\n icon?: ReactNode | false;\n}\n\nconst severitySymbols: Record<MessageSeverity, string> = {\n info: 'ⓘ',\n success: '✓',\n warn: '⚠',\n error: '⨯',\n secondary: 'ⓘ',\n contrast: 'ⓘ',\n};\n\n/** A declarative inline status message. */\nexport const Message = ({\n severity = 'info',\n text,\n children,\n className,\n icon,\n}: MessageProps) => (\n <div\n className={['cratis-message', className].filter(Boolean).join(' ')}\n data-cratis-part='root'\n data-severity={severity}\n role={severity === 'error' ? 'alert' : 'status'}\n >\n {icon !== false && (\n <span\n className='cratis-message__icon'\n data-cratis-part='icon'\n aria-hidden='true'\n >\n {icon ?? severitySymbols[severity]}\n </span>\n )}\n <span className='cratis-message__text' data-cratis-part='text'>\n {children ?? text}\n </span>\n </div>\n);\n"],"names":["_jsxs","_jsx"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"Message.js","sources":["../../../Display/Message.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { ReactNode } from 'react';\n\n/** Severity tone of a {@link Message}. */\nexport type MessageSeverity =\n 'info' | 'success' | 'warn' | 'error' | 'secondary' | 'contrast';\n\n/** Props for {@link Message}. */\nexport interface MessageProps {\n /** Severity tone (drives the color). */\n severity?: MessageSeverity;\n /** The message text. */\n text?: ReactNode;\n /** Message content (alternative to {@link text}). */\n children?: ReactNode;\n /** Extra class name applied to the message root. */\n className?: string;\n /** The icon shown ahead of the text. Pass `false` for no icon. */\n icon?: ReactNode | false;\n /**\n * Whether the message is its own live region, announced by assistive technology when it\n * appears. Defaults to `true`: `severity=\"error\"` renders `role=\"alert\"`, every other severity\n * `role=\"status\"`. Pass `false` to render a plain element with no role when the message sits\n * inside a live region that already announces it, so it is not announced twice.\n */\n live?: boolean;\n}\n\nconst severitySymbols: Record<MessageSeverity, string> = {\n info: 'ⓘ',\n success: '✓',\n warn: '⚠',\n error: '⨯',\n secondary: 'ⓘ',\n contrast: 'ⓘ',\n};\n\n/** A declarative inline status message. */\nexport const Message = ({\n severity = 'info',\n text,\n children,\n className,\n icon,\n live = true,\n}: MessageProps) => (\n <div\n className={['cratis-message', className].filter(Boolean).join(' ')}\n data-cratis-part='root'\n data-severity={severity}\n role={live ? (severity === 'error' ? 'alert' : 'status') : undefined}\n >\n {icon !== false && (\n <span\n className='cratis-message__icon'\n data-cratis-part='icon'\n aria-hidden='true'\n >\n {icon ?? severitySymbols[severity]}\n </span>\n )}\n <span className='cratis-message__text' data-cratis-part='text'>\n {children ?? text}\n </span>\n </div>\n);\n"],"names":["_jsxs","_jsx"],"mappings":";;AA8BA,MAAM,eAAe,GAAoC;AACrD,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,OAAO,EAAE,GAAG;AACZ,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,KAAK,EAAE,GAAG;AACV,IAAA,SAAS,EAAE,GAAG;AACd,IAAA,QAAQ,EAAE,GAAG;CAChB;AAGM,MAAM,OAAO,GAAG,CAAC,EACpB,QAAQ,GAAG,MAAM,EACjB,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,IAAI,GAAG,IAAI,GACA,MACXA,cACI,SAAS,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAA,kBAAA,EACjD,MAAM,EAAA,eAAA,EACR,QAAQ,EACvB,IAAI,EAAE,IAAI,IAAI,QAAQ,KAAK,OAAO,GAAG,OAAO,GAAG,QAAQ,IAAI,SAAS,EAAA,QAAA,EAAA,CAEnE,IAAI,KAAK,KAAK,KACXC,GAAA,CAAA,MAAA,EAAA,EACI,SAAS,EAAC,sBAAsB,sBACf,MAAM,EAAA,aAAA,EACX,MAAM,EAAA,QAAA,EAEjB,IAAI,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAA,CAC/B,CACV,EACDA,cAAM,SAAS,EAAC,sBAAsB,EAAA,kBAAA,EAAkB,MAAM,EAAA,QAAA,EACzD,QAAQ,IAAI,IAAI,EAAA,CACd,CAAA,EAAA,CACL;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownImplementation.d.ts","sourceRoot":"","sources":["../../../Dropdown/DropdownImplementation.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAA8B,MAAM,OAAO,CAAC;AAyB7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAY,CAAC;+
|
|
1
|
+
{"version":3,"file":"DropdownImplementation.d.ts","sourceRoot":"","sources":["../../../Dropdown/DropdownImplementation.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAA8B,MAAM,OAAO,CAAC;AAyB7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAY,CAAC;+CAoGT,CAAC,GAAG,OAAO,EAAG,EACjD,KAAK,EACL,OAAO,EACP,WAAiD,EACjD,WAAiD,EACjD,WAAW,EACX,MAAM,EACN,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,OAAO,EACP,QAAQ,EACR,SAAS,EACT,KAAK,EACL,EAAE,EACF,OAAO,EACP,cAAc,EACd,IAAI,EACJ,QAAQ,EACR,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EACjC,kBAAkB,EAAE,eAAe,EACnC,SAAS,EAAE,cAAc,EACzB,cAAc,EACd,eAAe,EACf,WAAW,EACX,QAAQ,EACR,MAAM,EACN,EAAE,GACL,EAAE,aAAa,CAAC,CAAC,CAAC"}
|
|
@@ -10,6 +10,7 @@ import 'react-dom';
|
|
|
10
10
|
import { useCratisComponentsConfig } from '../configuration/CratisComponentsContext.js';
|
|
11
11
|
import { useCratisIcon } from '../configuration/useCratisIcon.js';
|
|
12
12
|
import '../Notifications/toast.js';
|
|
13
|
+
import { classNames } from '../ClassNames/classNames.js';
|
|
13
14
|
import { zIndexAboveDialog, OVERLAY_OFFSET } from '../renderer/dialogStack.js';
|
|
14
15
|
import { useNearestDialogZIndex } from '../renderer/DialogStackContext.js';
|
|
15
16
|
import { useExternalLabel } from './useExternalLabel.js';
|
|
@@ -47,7 +48,6 @@ const resolveOptions = (options, optionLabel, optionValue) => (options ?? []).ma
|
|
|
47
48
|
disabled,
|
|
48
49
|
};
|
|
49
50
|
});
|
|
50
|
-
const classNames = (...values) => values.filter(Boolean).join(' ');
|
|
51
51
|
const ComboBoxCommitBridge = ({ handle, }) => {
|
|
52
52
|
const state = useContext(ComboBoxStateContext);
|
|
53
53
|
useEffect(() => {
|