@cratis/scene.primereact 4.6.0 → 4.8.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/.storybook/preview.tsx +8 -1
- package/EnumerationResolution.ts +7 -0
- package/README.md +22 -12
- package/data/DataGallery.stories.tsx +6 -0
- package/data/DataScrollerRow.tsx +35 -0
- package/data/PrimeDataScroller.tsx +84 -0
- package/data/PrimeTreeTable.tsx +145 -0
- package/data/TreeTableCheckState.ts +9 -0
- package/data/TreeTableRow.ts +22 -0
- package/data/TreeTableRowView.tsx +86 -0
- package/data/TreeTableSelectionMode.ts +10 -0
- package/data/checkboxSelection.ts +92 -0
- package/data/index.ts +4 -0
- package/data/isSerializedLegacyElement.ts +30 -0
- package/data/readableValue.ts +32 -0
- package/data/selectionKeysOf.ts +40 -0
- package/data/treeTableRows.ts +32 -0
- package/data/useIncrementalLoad.ts +36 -0
- package/data/useLoadOnReach.ts +31 -0
- package/data/useTreeGridNavigation.ts +81 -0
- package/dist/cjs/data/DataScrollerRow.js +50 -0
- package/dist/cjs/data/DataScrollerRow.js.map +1 -0
- package/dist/cjs/data/PrimeDataScroller.js +120 -0
- package/dist/cjs/data/PrimeDataScroller.js.map +1 -0
- package/dist/cjs/data/PrimeTreeTable.js +217 -0
- package/dist/cjs/data/PrimeTreeTable.js.map +1 -0
- package/dist/cjs/data/TreeTableCheckState.js +13 -0
- package/dist/cjs/data/TreeTableCheckState.js.map +1 -0
- package/dist/cjs/data/TreeTableRowView.js +76 -0
- package/dist/cjs/data/TreeTableRowView.js.map +1 -0
- package/dist/cjs/data/TreeTableSelectionMode.js +14 -0
- package/dist/cjs/data/TreeTableSelectionMode.js.map +1 -0
- package/dist/cjs/data/checkboxSelection.js +88 -0
- package/dist/cjs/data/checkboxSelection.js.map +1 -0
- package/dist/cjs/data/isSerializedLegacyElement.js +30 -0
- package/dist/cjs/data/isSerializedLegacyElement.js.map +1 -0
- package/dist/cjs/data/readableValue.js +31 -0
- package/dist/cjs/data/readableValue.js.map +1 -0
- package/dist/cjs/data/selectionKeysOf.js +40 -0
- package/dist/cjs/data/selectionKeysOf.js.map +1 -0
- package/dist/cjs/data/treeTableRows.js +42 -0
- package/dist/cjs/data/treeTableRows.js.map +1 -0
- package/dist/cjs/data/useIncrementalLoad.js +46 -0
- package/dist/cjs/data/useIncrementalLoad.js.map +1 -0
- package/dist/cjs/data/useLoadOnReach.js +42 -0
- package/dist/cjs/data/useLoadOnReach.js.map +1 -0
- package/dist/cjs/data/useTreeGridNavigation.js +75 -0
- package/dist/cjs/data/useTreeGridNavigation.js.map +1 -0
- package/dist/cjs/editor/PrimeEditor.js +96 -0
- package/dist/cjs/editor/PrimeEditor.js.map +1 -0
- package/dist/cjs/editor/QuillLoaderContext.js +10 -0
- package/dist/cjs/editor/QuillLoaderContext.js.map +1 -0
- package/dist/cjs/editor/QuillLoaderProvider.js +21 -0
- package/dist/cjs/editor/QuillLoaderProvider.js.map +1 -0
- package/dist/cjs/editor/applyHtml.js +25 -0
- package/dist/cjs/editor/applyHtml.js.map +1 -0
- package/dist/cjs/editor/characterCount.js +10 -0
- package/dist/cjs/editor/characterCount.js.map +1 -0
- package/dist/cjs/editor/htmlToPlainText.js +101 -0
- package/dist/cjs/editor/htmlToPlainText.js.map +1 -0
- package/dist/cjs/editor/renderSafeNodes.js +35 -0
- package/dist/cjs/editor/renderSafeNodes.js.map +1 -0
- package/dist/cjs/editor/safeUrls.js +44 -0
- package/dist/cjs/editor/safeUrls.js.map +1 -0
- package/dist/cjs/editor/sanitizeHtml.js +140 -0
- package/dist/cjs/editor/sanitizeHtml.js.map +1 -0
- package/dist/cjs/editor/serializeSafeNodes.js +33 -0
- package/dist/cjs/editor/serializeSafeNodes.js.map +1 -0
- package/dist/cjs/editor/toolbarLayout.js +35 -0
- package/dist/cjs/editor/toolbarLayout.js.map +1 -0
- package/dist/cjs/editor/useQuillEditor.js +137 -0
- package/dist/cjs/editor/useQuillEditor.js.map +1 -0
- package/dist/cjs/file/FileUploadContext.js +13 -0
- package/dist/cjs/file/FileUploadContext.js.map +1 -0
- package/dist/cjs/file/FileUploadHandlerProvider.js +25 -0
- package/dist/cjs/file/FileUploadHandlerProvider.js.map +1 -0
- package/dist/cjs/file/FileUploadMode.js +13 -0
- package/dist/cjs/file/FileUploadMode.js.map +1 -0
- package/dist/cjs/file/PrimeFileUpload.js +161 -0
- package/dist/cjs/file/PrimeFileUpload.js.map +1 -0
- package/dist/cjs/file/postFiles.js +31 -0
- package/dist/cjs/file/postFiles.js.map +1 -0
- package/dist/cjs/file/resolveUploadTarget.js +68 -0
- package/dist/cjs/file/resolveUploadTarget.js.map +1 -0
- package/dist/cjs/file/useUploadSession.js +62 -0
- package/dist/cjs/file/useUploadSession.js.map +1 -0
- package/dist/cjs/index.js +32 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legacyEnumerationChoices.js +39 -0
- package/dist/cjs/legacyEnumerationChoices.js.map +1 -0
- package/dist/cjs/loadQuill/index.js +22 -0
- package/dist/cjs/loadQuill/index.js.map +1 -0
- package/dist/cjs/primeReactComponents.js +10 -0
- package/dist/cjs/primeReactComponents.js.map +1 -1
- package/dist/cjs/primeReactDescriptors.js +243 -0
- package/dist/cjs/primeReactDescriptors.js.map +1 -1
- package/dist/cjs/primeReactPackage.js +4 -0
- package/dist/cjs/primeReactPackage.js.map +1 -1
- package/dist/cjs/resolveEnumeration.js +55 -0
- package/dist/cjs/resolveEnumeration.js.map +1 -0
- package/dist/cjs/treeNodes.js +42 -7
- package/dist/cjs/treeNodes.js.map +1 -1
- package/dist/cjs/useResettingState.js +47 -0
- package/dist/cjs/useResettingState.js.map +1 -0
- package/dist/esm/EnumerationResolution.d.ts +9 -0
- package/dist/esm/EnumerationResolution.d.ts.map +1 -0
- package/dist/esm/EnumerationResolution.js +2 -0
- package/dist/esm/EnumerationResolution.js.map +1 -0
- package/dist/esm/data/DataGallery.stories.d.ts.map +1 -1
- package/dist/esm/data/DataGallery.stories.js +6 -0
- package/dist/esm/data/DataGallery.stories.js.map +1 -1
- package/dist/esm/data/DataScrollerRow.d.ts +4 -0
- package/dist/esm/data/DataScrollerRow.d.ts.map +1 -0
- package/dist/esm/data/DataScrollerRow.js +48 -0
- package/dist/esm/data/DataScrollerRow.js.map +1 -0
- package/dist/esm/data/PrimeDataScroller.d.ts +3 -0
- package/dist/esm/data/PrimeDataScroller.d.ts.map +1 -0
- package/dist/esm/data/PrimeDataScroller.js +118 -0
- package/dist/esm/data/PrimeDataScroller.js.map +1 -0
- package/dist/esm/data/PrimeTreeTable.d.ts +3 -0
- package/dist/esm/data/PrimeTreeTable.d.ts.map +1 -0
- package/dist/esm/data/PrimeTreeTable.js +215 -0
- package/dist/esm/data/PrimeTreeTable.js.map +1 -0
- package/dist/esm/data/TreeTableCheckState.d.ts +6 -0
- package/dist/esm/data/TreeTableCheckState.d.ts.map +1 -0
- package/dist/esm/data/TreeTableCheckState.js +11 -0
- package/dist/esm/data/TreeTableCheckState.js.map +1 -0
- package/dist/esm/data/TreeTableRow.d.ts +10 -0
- package/dist/esm/data/TreeTableRow.d.ts.map +1 -0
- package/dist/esm/data/TreeTableRow.js +2 -0
- package/dist/esm/data/TreeTableRow.js.map +1 -0
- package/dist/esm/data/TreeTableRowView.d.ts +21 -0
- package/dist/esm/data/TreeTableRowView.d.ts.map +1 -0
- package/dist/esm/data/TreeTableRowView.js +74 -0
- package/dist/esm/data/TreeTableRowView.js.map +1 -0
- package/dist/esm/data/TreeTableSelectionMode.d.ts +7 -0
- package/dist/esm/data/TreeTableSelectionMode.d.ts.map +1 -0
- package/dist/esm/data/TreeTableSelectionMode.js +12 -0
- package/dist/esm/data/TreeTableSelectionMode.js.map +1 -0
- package/dist/esm/data/checkboxSelection.d.ts +9 -0
- package/dist/esm/data/checkboxSelection.d.ts.map +1 -0
- package/dist/esm/data/checkboxSelection.js +85 -0
- package/dist/esm/data/checkboxSelection.js.map +1 -0
- package/dist/esm/data/index.d.ts +4 -0
- package/dist/esm/data/index.d.ts.map +1 -1
- package/dist/esm/data/index.js +4 -0
- package/dist/esm/data/index.js.map +1 -1
- package/dist/esm/data/isSerializedLegacyElement.d.ts +3 -0
- package/dist/esm/data/isSerializedLegacyElement.d.ts.map +1 -0
- package/dist/esm/data/isSerializedLegacyElement.js +27 -0
- package/dist/esm/data/isSerializedLegacyElement.js.map +1 -0
- package/dist/esm/data/readableValue.d.ts +2 -0
- package/dist/esm/data/readableValue.d.ts.map +1 -0
- package/dist/esm/data/readableValue.js +29 -0
- package/dist/esm/data/readableValue.js.map +1 -0
- package/dist/esm/data/selectionKeysOf.d.ts +2 -0
- package/dist/esm/data/selectionKeysOf.d.ts.map +1 -0
- package/dist/esm/data/selectionKeysOf.js +38 -0
- package/dist/esm/data/selectionKeysOf.js.map +1 -0
- package/dist/esm/data/treeTableRows.d.ts +6 -0
- package/dist/esm/data/treeTableRows.d.ts.map +1 -0
- package/dist/esm/data/treeTableRows.js +38 -0
- package/dist/esm/data/treeTableRows.js.map +1 -0
- package/dist/esm/data/useIncrementalLoad.d.ts +6 -0
- package/dist/esm/data/useIncrementalLoad.d.ts.map +1 -0
- package/dist/esm/data/useIncrementalLoad.js +44 -0
- package/dist/esm/data/useIncrementalLoad.js.map +1 -0
- package/dist/esm/data/useLoadOnReach.d.ts +3 -0
- package/dist/esm/data/useLoadOnReach.d.ts.map +1 -0
- package/dist/esm/data/useLoadOnReach.js +40 -0
- package/dist/esm/data/useLoadOnReach.js.map +1 -0
- package/dist/esm/data/useTreeGridNavigation.d.ts +17 -0
- package/dist/esm/data/useTreeGridNavigation.d.ts.map +1 -0
- package/dist/esm/data/useTreeGridNavigation.js +73 -0
- package/dist/esm/data/useTreeGridNavigation.js.map +1 -0
- package/dist/esm/editor/PrimeEditor.d.ts +3 -0
- package/dist/esm/editor/PrimeEditor.d.ts.map +1 -0
- package/dist/esm/editor/PrimeEditor.js +94 -0
- package/dist/esm/editor/PrimeEditor.js.map +1 -0
- package/dist/esm/editor/QuillConstructor.d.ts +4 -0
- package/dist/esm/editor/QuillConstructor.d.ts.map +1 -0
- package/dist/esm/editor/QuillConstructor.js +2 -0
- package/dist/esm/editor/QuillConstructor.js.map +1 -0
- package/dist/esm/editor/QuillEditorOptions.d.ts +13 -0
- package/dist/esm/editor/QuillEditorOptions.d.ts.map +1 -0
- package/dist/esm/editor/QuillEditorOptions.js +2 -0
- package/dist/esm/editor/QuillEditorOptions.js.map +1 -0
- package/dist/esm/editor/QuillEditorState.d.ts +6 -0
- package/dist/esm/editor/QuillEditorState.d.ts.map +1 -0
- package/dist/esm/editor/QuillEditorState.js +2 -0
- package/dist/esm/editor/QuillEditorState.js.map +1 -0
- package/dist/esm/editor/QuillInstance.d.ts +16 -0
- package/dist/esm/editor/QuillInstance.d.ts.map +1 -0
- package/dist/esm/editor/QuillInstance.js +2 -0
- package/dist/esm/editor/QuillInstance.js.map +1 -0
- package/dist/esm/editor/QuillLoader.d.ts +5 -0
- package/dist/esm/editor/QuillLoader.d.ts.map +1 -0
- package/dist/esm/editor/QuillLoader.js +2 -0
- package/dist/esm/editor/QuillLoader.js.map +1 -0
- package/dist/esm/editor/QuillLoaderContext.d.ts +3 -0
- package/dist/esm/editor/QuillLoaderContext.d.ts.map +1 -0
- package/dist/esm/editor/QuillLoaderContext.js +8 -0
- package/dist/esm/editor/QuillLoaderContext.js.map +1 -0
- package/dist/esm/editor/QuillLoaderProvider.d.ts +8 -0
- package/dist/esm/editor/QuillLoaderProvider.d.ts.map +1 -0
- package/dist/esm/editor/QuillLoaderProvider.js +19 -0
- package/dist/esm/editor/QuillLoaderProvider.js.map +1 -0
- package/dist/esm/editor/QuillOptions.d.ts +9 -0
- package/dist/esm/editor/QuillOptions.d.ts.map +1 -0
- package/dist/esm/editor/QuillOptions.js +2 -0
- package/dist/esm/editor/QuillOptions.js.map +1 -0
- package/dist/esm/editor/SafeElement.d.ts +7 -0
- package/dist/esm/editor/SafeElement.d.ts.map +1 -0
- package/dist/esm/editor/SafeElement.js +2 -0
- package/dist/esm/editor/SafeElement.js.map +1 -0
- package/dist/esm/editor/SafeNode.d.ts +3 -0
- package/dist/esm/editor/SafeNode.d.ts.map +1 -0
- package/dist/esm/editor/SafeNode.js +2 -0
- package/dist/esm/editor/SafeNode.js.map +1 -0
- package/dist/esm/editor/applyHtml.d.ts +3 -0
- package/dist/esm/editor/applyHtml.d.ts.map +1 -0
- package/dist/esm/editor/applyHtml.js +23 -0
- package/dist/esm/editor/applyHtml.js.map +1 -0
- package/dist/esm/editor/characterCount.d.ts +3 -0
- package/dist/esm/editor/characterCount.d.ts.map +1 -0
- package/dist/esm/editor/characterCount.js +8 -0
- package/dist/esm/editor/characterCount.js.map +1 -0
- package/dist/esm/editor/htmlToPlainText.d.ts +2 -0
- package/dist/esm/editor/htmlToPlainText.d.ts.map +1 -0
- package/dist/esm/editor/htmlToPlainText.js +99 -0
- package/dist/esm/editor/htmlToPlainText.js.map +1 -0
- package/dist/esm/editor/index.d.ts +14 -0
- package/dist/esm/editor/index.d.ts.map +1 -0
- package/dist/esm/editor/index.js +14 -0
- package/dist/esm/editor/index.js.map +1 -0
- package/dist/esm/editor/renderSafeNodes.d.ts +4 -0
- package/dist/esm/editor/renderSafeNodes.d.ts.map +1 -0
- package/dist/esm/editor/renderSafeNodes.js +33 -0
- package/dist/esm/editor/renderSafeNodes.js.map +1 -0
- package/dist/esm/editor/safeUrls.d.ts +3 -0
- package/dist/esm/editor/safeUrls.d.ts.map +1 -0
- package/dist/esm/editor/safeUrls.js +41 -0
- package/dist/esm/editor/safeUrls.js.map +1 -0
- package/dist/esm/editor/sanitizeHtml.d.ts +3 -0
- package/dist/esm/editor/sanitizeHtml.d.ts.map +1 -0
- package/dist/esm/editor/sanitizeHtml.js +138 -0
- package/dist/esm/editor/sanitizeHtml.js.map +1 -0
- package/dist/esm/editor/serializeSafeNodes.d.ts +3 -0
- package/dist/esm/editor/serializeSafeNodes.d.ts.map +1 -0
- package/dist/esm/editor/serializeSafeNodes.js +31 -0
- package/dist/esm/editor/serializeSafeNodes.js.map +1 -0
- package/dist/esm/editor/toolbarLayout.d.ts +2 -0
- package/dist/esm/editor/toolbarLayout.d.ts.map +1 -0
- package/dist/esm/editor/toolbarLayout.js +33 -0
- package/dist/esm/editor/toolbarLayout.js.map +1 -0
- package/dist/esm/editor/useQuillEditor.d.ts +4 -0
- package/dist/esm/editor/useQuillEditor.d.ts.map +1 -0
- package/dist/esm/editor/useQuillEditor.js +135 -0
- package/dist/esm/editor/useQuillEditor.js.map +1 -0
- package/dist/esm/file/FileGallery.stories.d.ts +19 -0
- package/dist/esm/file/FileGallery.stories.d.ts.map +1 -0
- package/dist/esm/file/FileGallery.stories.js +23 -0
- package/dist/esm/file/FileGallery.stories.js.map +1 -0
- package/dist/esm/file/FileUploadContext.d.ts +7 -0
- package/dist/esm/file/FileUploadContext.d.ts.map +1 -0
- package/dist/esm/file/FileUploadContext.js +11 -0
- package/dist/esm/file/FileUploadContext.js.map +1 -0
- package/dist/esm/file/FileUploadHandler.d.ts +4 -0
- package/dist/esm/file/FileUploadHandler.d.ts.map +1 -0
- package/dist/esm/file/FileUploadHandler.js +2 -0
- package/dist/esm/file/FileUploadHandler.js.map +1 -0
- package/dist/esm/file/FileUploadHandlerProvider.d.ts +9 -0
- package/dist/esm/file/FileUploadHandlerProvider.d.ts.map +1 -0
- package/dist/esm/file/FileUploadHandlerProvider.js +23 -0
- package/dist/esm/file/FileUploadHandlerProvider.js.map +1 -0
- package/dist/esm/file/FileUploadMode.d.ts +6 -0
- package/dist/esm/file/FileUploadMode.d.ts.map +1 -0
- package/dist/esm/file/FileUploadMode.js +11 -0
- package/dist/esm/file/FileUploadMode.js.map +1 -0
- package/dist/esm/file/PrimeFileUpload.d.ts +3 -0
- package/dist/esm/file/PrimeFileUpload.d.ts.map +1 -0
- package/dist/esm/file/PrimeFileUpload.js +159 -0
- package/dist/esm/file/PrimeFileUpload.js.map +1 -0
- package/dist/esm/file/UploadStatus.d.ts +5 -0
- package/dist/esm/file/UploadStatus.d.ts.map +1 -0
- package/dist/esm/file/UploadStatus.js +2 -0
- package/dist/esm/file/UploadStatus.js.map +1 -0
- package/dist/esm/file/UploadTarget.d.ts +8 -0
- package/dist/esm/file/UploadTarget.d.ts.map +1 -0
- package/dist/esm/file/UploadTarget.js +2 -0
- package/dist/esm/file/UploadTarget.js.map +1 -0
- package/dist/esm/file/index.d.ts +7 -0
- package/dist/esm/file/index.d.ts.map +1 -0
- package/dist/esm/file/index.js +7 -0
- package/dist/esm/file/index.js.map +1 -0
- package/dist/esm/file/postFiles.d.ts +2 -0
- package/dist/esm/file/postFiles.d.ts.map +1 -0
- package/dist/esm/file/postFiles.js +29 -0
- package/dist/esm/file/postFiles.js.map +1 -0
- package/dist/esm/file/resolveUploadTarget.d.ts +3 -0
- package/dist/esm/file/resolveUploadTarget.d.ts.map +1 -0
- package/dist/esm/file/resolveUploadTarget.js +66 -0
- package/dist/esm/file/resolveUploadTarget.js.map +1 -0
- package/dist/esm/file/useUploadSession.d.ts +10 -0
- package/dist/esm/file/useUploadSession.d.ts.map +1 -0
- package/dist/esm/file/useUploadSession.js +60 -0
- package/dist/esm/file/useUploadSession.js.map +1 -0
- package/dist/esm/form/FormGallery.stories.d.ts.map +1 -1
- package/dist/esm/form/FormGallery.stories.js +1 -0
- package/dist/esm/form/FormGallery.stories.js.map +1 -1
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +16 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/legacyEnumerationChoices.d.ts +3 -0
- package/dist/esm/legacyEnumerationChoices.d.ts.map +1 -0
- package/dist/esm/legacyEnumerationChoices.js +37 -0
- package/dist/esm/legacyEnumerationChoices.js.map +1 -0
- package/dist/esm/loadQuill/index.d.ts +3 -0
- package/dist/esm/loadQuill/index.d.ts.map +1 -0
- package/dist/esm/loadQuill/index.js +20 -0
- package/dist/esm/loadQuill/index.js.map +1 -0
- package/dist/esm/primeReactComponents.d.ts.map +1 -1
- package/dist/esm/primeReactComponents.js +10 -0
- package/dist/esm/primeReactComponents.js.map +1 -1
- package/dist/esm/primeReactDescriptors.d.ts.map +1 -1
- package/dist/esm/primeReactDescriptors.js +243 -0
- package/dist/esm/primeReactDescriptors.js.map +1 -1
- package/dist/esm/primeReactPackage.js +4 -0
- package/dist/esm/primeReactPackage.js.map +1 -1
- package/dist/esm/resolveEnumeration.d.ts +3 -0
- package/dist/esm/resolveEnumeration.d.ts.map +1 -0
- package/dist/esm/resolveEnumeration.js +53 -0
- package/dist/esm/resolveEnumeration.js.map +1 -0
- package/dist/esm/treeNodes.d.ts +2 -1
- package/dist/esm/treeNodes.d.ts.map +1 -1
- package/dist/esm/treeNodes.js +42 -8
- package/dist/esm/treeNodes.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/useResettingState.d.ts +3 -0
- package/dist/esm/useResettingState.d.ts.map +1 -0
- package/dist/esm/useResettingState.js +45 -0
- package/dist/esm/useResettingState.js.map +1 -0
- package/editor/PrimeEditor.tsx +83 -0
- package/editor/QuillConstructor.ts +8 -0
- package/editor/QuillEditorOptions.ts +29 -0
- package/editor/QuillEditorState.ts +14 -0
- package/editor/QuillInstance.ts +27 -0
- package/editor/QuillLoader.ts +13 -0
- package/editor/QuillLoaderContext.ts +8 -0
- package/editor/QuillLoaderProvider.tsx +24 -0
- package/editor/QuillOptions.ts +10 -0
- package/editor/SafeElement.ts +15 -0
- package/editor/SafeNode.ts +7 -0
- package/editor/applyHtml.ts +21 -0
- package/editor/characterCount.ts +9 -0
- package/editor/htmlToPlainText.ts +74 -0
- package/editor/index.ts +16 -0
- package/editor/renderSafeNodes.tsx +26 -0
- package/editor/safeUrls.ts +43 -0
- package/editor/sanitizeHtml.ts +94 -0
- package/editor/serializeSafeNodes.ts +26 -0
- package/editor/toolbarLayout.ts +10 -0
- package/editor/useQuillEditor.ts +114 -0
- package/file/FileGallery.stories.tsx +32 -0
- package/file/FileUploadContext.ts +17 -0
- package/file/FileUploadHandler.ts +15 -0
- package/file/FileUploadHandlerProvider.tsx +33 -0
- package/file/FileUploadMode.ts +9 -0
- package/file/PrimeFileUpload.tsx +129 -0
- package/file/UploadStatus.ts +9 -0
- package/file/UploadTarget.ts +12 -0
- package/file/index.ts +9 -0
- package/file/postFiles.ts +23 -0
- package/file/resolveUploadTarget.ts +61 -0
- package/file/useUploadSession.ts +67 -0
- package/form/FormGallery.stories.tsx +1 -0
- package/index.ts +2 -0
- package/legacyEnumerationChoices.ts +35 -0
- package/loadQuill/index.ts +21 -0
- package/package.json +17 -7
- package/primeReactComponents.ts +8 -0
- package/primeReactDescriptors.ts +63 -0
- package/primeReactPackage.ts +2 -2
- package/primeReactTheme.css +69 -0
- package/resolveEnumeration.ts +50 -0
- package/treeNodes.ts +44 -6
- package/useResettingState.ts +34 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
/** Nested deeper than this is shown as an ellipsis, so a cyclic or enormous value cannot flood the page. */
|
|
5
|
+
const maximumDepth = 3;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Writes any authored value as text a person can read.
|
|
9
|
+
*
|
|
10
|
+
* Scalars are shown as they are. An array is its readable entries joined by commas, and an object is
|
|
11
|
+
* `name: value` pairs joined by semicolons - never `[object Object]`, and never a raw JSON document. `null`
|
|
12
|
+
* and `undefined` are empty.
|
|
13
|
+
*
|
|
14
|
+
* @param value The authored value.
|
|
15
|
+
* @param depth How deep the value is nested already; callers leave it out.
|
|
16
|
+
*/
|
|
17
|
+
export function readableValue(value: unknown, depth = 0): string {
|
|
18
|
+
if (value === undefined || value === null) return '';
|
|
19
|
+
if (typeof value === 'string') return value;
|
|
20
|
+
if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') return String(value);
|
|
21
|
+
if (depth >= maximumDepth) return '…';
|
|
22
|
+
if (Array.isArray(value)) return value.map(entry => readableValue(entry, depth + 1)).filter(text => text !== '').join(', ');
|
|
23
|
+
if (typeof value === 'object') {
|
|
24
|
+
return Object.entries(value)
|
|
25
|
+
.map(([name, entry]) => [name, readableValue(entry, depth + 1)])
|
|
26
|
+
.filter(([, text]) => text !== '')
|
|
27
|
+
.map(([name, text]) => `${name}: ${text}`)
|
|
28
|
+
.join('; ');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return '';
|
|
32
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
/** The keys of one node, whichever of the shapes a selection may use. */
|
|
5
|
+
function keyOf(value: unknown): string | undefined {
|
|
6
|
+
if (typeof value === 'string' && value !== '') return value;
|
|
7
|
+
return typeof value === 'number' && Number.isFinite(value) ? String(value) : undefined;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function nodeKeyOf(value: unknown): string | undefined {
|
|
11
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) return keyOf(value);
|
|
12
|
+
return keyOf((value as { key?: unknown }).key);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Reads the keys an authored `selection` selects.
|
|
17
|
+
*
|
|
18
|
+
* Every shape a legacy document may hold is accepted, and none is rewritten:
|
|
19
|
+
* - one key, string or number (`'b'`, `6`);
|
|
20
|
+
* - an array mixing keys and `{ key }` objects (`['a', 6, { key: 'c' }]`);
|
|
21
|
+
* - one `{ key }` object;
|
|
22
|
+
* - PrimeReact's key map (`{ b: { checked: true, partialChecked: false } }`), whose `checked` entries are
|
|
23
|
+
* selected. A `partialChecked` entry is derived state, not a selection, so it is ignored: the control
|
|
24
|
+
* computes it from the selected descendants.
|
|
25
|
+
*
|
|
26
|
+
* Numeric keys are matched as the strings the tree builds from them.
|
|
27
|
+
*
|
|
28
|
+
* @param value The authored selection.
|
|
29
|
+
*/
|
|
30
|
+
export function selectionKeysOf(value: unknown): Set<string> {
|
|
31
|
+
if (Array.isArray(value)) return new Set(value.flatMap(entry => nodeKeyOf(entry) ?? []));
|
|
32
|
+
const single = nodeKeyOf(value);
|
|
33
|
+
if (single !== undefined) return new Set([single]);
|
|
34
|
+
|
|
35
|
+
if (typeof value === 'object' && value !== null && keyOf((value as { key?: unknown }).key) === undefined) {
|
|
36
|
+
return new Set(Object.entries(value).filter(([, state]) => (state as { checked?: unknown } | null)?.checked === true).map(([key]) => key));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return new Set();
|
|
40
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { TreeNode } from '../TreeNode';
|
|
5
|
+
import { TreeTableRow } from './TreeTableRow';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Flattens the nodes into the rows that are visible: a node's children follow it only while it is expanded.
|
|
9
|
+
*
|
|
10
|
+
* @param nodes The sibling nodes to flatten.
|
|
11
|
+
* @param expanded The keys of the expanded nodes.
|
|
12
|
+
*/
|
|
13
|
+
export function visibleRows(nodes: TreeNode[], expanded: ReadonlySet<string>, depth = 0, parentKey?: string): TreeTableRow[] {
|
|
14
|
+
return nodes.flatMap((node, index) => {
|
|
15
|
+
const key = node.key ?? '';
|
|
16
|
+
const row: TreeTableRow = { node, key, depth, parentKey, position: index + 1, siblings: nodes.length };
|
|
17
|
+
return [row, ...(node.children !== undefined && expanded.has(key) ? visibleRows(node.children, expanded, depth + 1, key) : [])];
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** The keys of the nodes authored as expanded, at any depth, in tree order. */
|
|
22
|
+
export function expandedKeysOf(nodes: TreeNode[]): string[] {
|
|
23
|
+
return nodes.flatMap(node => [
|
|
24
|
+
...(node.expanded === true && node.key !== undefined ? [node.key] : []),
|
|
25
|
+
...expandedKeysOf(node.children ?? []),
|
|
26
|
+
]);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** A node's own text for naming it: its label, else its key. */
|
|
30
|
+
export function nodeLabel(node: TreeNode): string {
|
|
31
|
+
return node.label ?? node.key ?? '';
|
|
32
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { useCallback, useState } from 'react';
|
|
5
|
+
|
|
6
|
+
/** How much of a list is loaded and how to load more. */
|
|
7
|
+
export interface IncrementalLoad {
|
|
8
|
+
/** The number of entries loaded, never more than the total. */
|
|
9
|
+
loaded: number;
|
|
10
|
+
|
|
11
|
+
/** Loads the next chunk. */
|
|
12
|
+
loadMore(): void;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Tracks how many entries of a list are loaded, a chunk at a time.
|
|
17
|
+
*
|
|
18
|
+
* The count follows the authored properties: it starts over at one chunk when the chunk size changes or when
|
|
19
|
+
* `resetKey` does, so a document edit that replaces the items does not leave the old count behind. Pass a
|
|
20
|
+
* structurally stable `resetKey` (see `useStructuralValue`), or every render would reset it.
|
|
21
|
+
*
|
|
22
|
+
* @param total The number of entries there are.
|
|
23
|
+
* @param chunk The number of entries per load.
|
|
24
|
+
* @param resetKey Changes when the entries are replaced.
|
|
25
|
+
*/
|
|
26
|
+
export function useIncrementalLoad(total: number, chunk: number, resetKey: unknown): IncrementalLoad {
|
|
27
|
+
const [state, setState] = useState({ resetKey, chunk, loaded: chunk });
|
|
28
|
+
let loaded = state.loaded;
|
|
29
|
+
if (state.resetKey !== resetKey || state.chunk !== chunk) {
|
|
30
|
+
setState({ resetKey, chunk, loaded: chunk });
|
|
31
|
+
loaded = chunk;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const loadMore = useCallback(() => setState(current => ({ ...current, loaded: Math.min(current.loaded + chunk, total) })), [chunk, total]);
|
|
35
|
+
return { loaded: Math.min(loaded, total), loadMore };
|
|
36
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { RefObject, useEffect } from 'react';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Calls `onReach` while the sentinel is visible, which is what scrolling to the end of a list means.
|
|
8
|
+
*
|
|
9
|
+
* The observer is rebuilt whenever `revision` changes, so a sentinel that is still visible after a chunk was
|
|
10
|
+
* loaded loads the next one, until the viewport is filled or the list ends. `root` is the element that
|
|
11
|
+
* scrolls for an inline list; `null` observes the page's own viewport. Where there is no
|
|
12
|
+
* `IntersectionObserver` nothing is observed and the list's own button remains the way to load more.
|
|
13
|
+
*
|
|
14
|
+
* @param sentinel The element placed after the last loaded entry.
|
|
15
|
+
* @param root The scrolling container, or `null` for the page.
|
|
16
|
+
* @param active Whether reaching the end should load anything.
|
|
17
|
+
* @param revision A value that changes each time the list changed.
|
|
18
|
+
* @param onReach Loads the next chunk.
|
|
19
|
+
*/
|
|
20
|
+
export function useLoadOnReach(sentinel: RefObject<HTMLElement | null>, root: RefObject<HTMLElement | null> | null, active: boolean, revision: unknown, onReach: () => void): void {
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
const target = sentinel.current;
|
|
23
|
+
if (!active || target === null || typeof IntersectionObserver === 'undefined') return undefined;
|
|
24
|
+
|
|
25
|
+
const observer = new IntersectionObserver(entries => {
|
|
26
|
+
if (entries.some(entry => entry.isIntersecting)) onReach();
|
|
27
|
+
}, { root: root?.current ?? null, rootMargin: '0px 0px 48px 0px' });
|
|
28
|
+
observer.observe(target);
|
|
29
|
+
return () => observer.disconnect();
|
|
30
|
+
}, [sentinel, root, active, revision, onReach]);
|
|
31
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { KeyboardEvent, useCallback, useRef, useState } from 'react';
|
|
5
|
+
import { TreeTableRow } from './TreeTableRow';
|
|
6
|
+
|
|
7
|
+
/** What the keyboard navigation of a tree grid needs from the control. */
|
|
8
|
+
export interface TreeGridNavigationOptions {
|
|
9
|
+
rows: TreeTableRow[];
|
|
10
|
+
expanded: ReadonlySet<string>;
|
|
11
|
+
enabled: boolean;
|
|
12
|
+
toggle(key: string): void;
|
|
13
|
+
select(row: TreeTableRow): void;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** The wiring a tree grid applies to its rows. */
|
|
17
|
+
export interface TreeGridNavigation {
|
|
18
|
+
/** The one row that is in the tab order (roving tabindex). */
|
|
19
|
+
tabStopKey: string | undefined;
|
|
20
|
+
|
|
21
|
+
/** Gives the navigation the element of a row, so it can move focus there. */
|
|
22
|
+
register(key: string, element: HTMLElement | null): void;
|
|
23
|
+
|
|
24
|
+
/** Makes a row the tab stop, as a click does. */
|
|
25
|
+
activate(key: string): void;
|
|
26
|
+
|
|
27
|
+
/** The key handler of a row. */
|
|
28
|
+
onKeyDown(row: TreeTableRow, event: KeyboardEvent<HTMLElement>): void;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The keyboard model of an ARIA tree grid, with a roving tab index.
|
|
33
|
+
*
|
|
34
|
+
* Up and Down move between visible rows, Home and End to the first and last, Right expands a collapsed row or
|
|
35
|
+
* enters its first child, Left collapses an expanded row or goes to its parent, and Space or Enter selects.
|
|
36
|
+
* Keys pressed on a control inside the row (its expand button or checkbox) are left to that control.
|
|
37
|
+
*/
|
|
38
|
+
export function useTreeGridNavigation({ rows, expanded, enabled, toggle, select }: TreeGridNavigationOptions): TreeGridNavigation {
|
|
39
|
+
const [activeKey, setActiveKey] = useState<string | undefined>(undefined);
|
|
40
|
+
const elements = useRef(new Map<string, HTMLElement>());
|
|
41
|
+
const tabStopKey = rows.some(row => row.key === activeKey) ? activeKey : rows[0]?.key;
|
|
42
|
+
|
|
43
|
+
const register = useCallback((key: string, element: HTMLElement | null) => {
|
|
44
|
+
if (element === null) elements.current.delete(key); else elements.current.set(key, element);
|
|
45
|
+
}, []);
|
|
46
|
+
|
|
47
|
+
const moveTo = (row: TreeTableRow | undefined) => {
|
|
48
|
+
if (row === undefined) return;
|
|
49
|
+
setActiveKey(row.key);
|
|
50
|
+
elements.current.get(row.key)?.focus();
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const onKeyDown = (row: TreeTableRow, event: KeyboardEvent<HTMLElement>) => {
|
|
54
|
+
if (event.target !== event.currentTarget) return;
|
|
55
|
+
const index = rows.indexOf(row);
|
|
56
|
+
const hasChildren = (row.node.children?.length ?? 0) > 0;
|
|
57
|
+
const handled = (action: () => void) => { event.preventDefault(); action(); };
|
|
58
|
+
|
|
59
|
+
switch (event.key) {
|
|
60
|
+
case 'ArrowDown': handled(() => moveTo(rows[index + 1])); break;
|
|
61
|
+
case 'ArrowUp': handled(() => moveTo(rows[index - 1])); break;
|
|
62
|
+
case 'Home': handled(() => moveTo(rows[0])); break;
|
|
63
|
+
case 'End': handled(() => moveTo(rows[rows.length - 1])); break;
|
|
64
|
+
case 'ArrowRight':
|
|
65
|
+
if (hasChildren) handled(() => { if (!expanded.has(row.key)) { if (enabled) toggle(row.key); } else moveTo(rows[index + 1]); });
|
|
66
|
+
break;
|
|
67
|
+
case 'ArrowLeft':
|
|
68
|
+
if (hasChildren && expanded.has(row.key)) handled(() => { if (enabled) toggle(row.key); });
|
|
69
|
+
else if (row.parentKey !== undefined) handled(() => moveTo(rows.find(candidate => candidate.key === row.parentKey)));
|
|
70
|
+
break;
|
|
71
|
+
case ' ':
|
|
72
|
+
case 'Enter':
|
|
73
|
+
handled(() => select(row));
|
|
74
|
+
break;
|
|
75
|
+
default:
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
return { tabStopKey, register, activate: setActiveKey, onKeyDown };
|
|
81
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var readableValue = require('./readableValue.js');
|
|
5
|
+
|
|
6
|
+
/** The fields that, when present as text, name a record. */ const titleFields = [
|
|
7
|
+
'label',
|
|
8
|
+
'title',
|
|
9
|
+
'name',
|
|
10
|
+
'text',
|
|
11
|
+
'header'
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* One authored data row, shown readably.
|
|
15
|
+
*
|
|
16
|
+
* A scalar is its text. A record is titled by its first text field among `label`, `title`, `name`, `text` and
|
|
17
|
+
* `header`, and every other field follows as a name and a readable value. No row is ever dumped as JSON.
|
|
18
|
+
*/ function DataScrollerRow({ value }) {
|
|
19
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) return /*#__PURE__*/ jsxRuntime.jsx(jsxRuntime.Fragment, {
|
|
20
|
+
children: readableValue.readableValue(value)
|
|
21
|
+
});
|
|
22
|
+
const record = value;
|
|
23
|
+
const titleField = titleFields.find((field)=>typeof record[field] === 'string' && record[field] !== '');
|
|
24
|
+
const details = Object.entries(record).filter(([name])=>name !== titleField).map(([name, entry])=>[
|
|
25
|
+
name,
|
|
26
|
+
readableValue.readableValue(entry)
|
|
27
|
+
]).filter(([, text])=>text !== '');
|
|
28
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
29
|
+
children: [
|
|
30
|
+
titleField !== undefined && /*#__PURE__*/ jsxRuntime.jsx("strong", {
|
|
31
|
+
children: record[titleField]
|
|
32
|
+
}),
|
|
33
|
+
details.length > 0 && /*#__PURE__*/ jsxRuntime.jsx("dl", {
|
|
34
|
+
children: details.map(([name, text])=>/*#__PURE__*/ jsxRuntime.jsxs("div", {
|
|
35
|
+
children: [
|
|
36
|
+
/*#__PURE__*/ jsxRuntime.jsx("dt", {
|
|
37
|
+
children: name
|
|
38
|
+
}),
|
|
39
|
+
/*#__PURE__*/ jsxRuntime.jsx("dd", {
|
|
40
|
+
children: text
|
|
41
|
+
})
|
|
42
|
+
]
|
|
43
|
+
}, name))
|
|
44
|
+
})
|
|
45
|
+
]
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
exports.DataScrollerRow = DataScrollerRow;
|
|
50
|
+
//# sourceMappingURL=DataScrollerRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataScrollerRow.js","sources":["../../../data/DataScrollerRow.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 { readableValue } from './readableValue';\n\n/** The fields that, when present as text, name a record. */\nconst titleFields = ['label', 'title', 'name', 'text', 'header'];\n\n/**\n * One authored data row, shown readably.\n *\n * A scalar is its text. A record is titled by its first text field among `label`, `title`, `name`, `text` and\n * `header`, and every other field follows as a name and a readable value. No row is ever dumped as JSON.\n */\nexport function DataScrollerRow({ value }: { value: unknown }) {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return <>{readableValue(value)}</>;\n\n const record = value as Record<string, unknown>;\n const titleField = titleFields.find(field => typeof record[field] === 'string' && record[field] !== '');\n const details = Object.entries(record)\n .filter(([name]) => name !== titleField)\n .map(([name, entry]) => [name, readableValue(entry)] as const)\n .filter(([, text]) => text !== '');\n\n return (\n <>\n {titleField !== undefined && <strong>{record[titleField] as string}</strong>}\n {details.length > 0 && (\n <dl>\n {details.map(([name, text]) => <div key={name}><dt>{name}</dt><dd>{text}</dd></div>)}\n </dl>\n )}\n </>\n );\n}\n"],"names":["titleFields","DataScrollerRow","value","Array","isArray","_jsx","_Fragment","readableValue","record","titleField","find","field","details","Object","entries","filter","name","map","entry","text","_jsxs","undefined","strong","length","dl","div","dt","dd"],"mappings":";;;;;AAKA,6DACA,MAAMA,WAAAA,GAAc;AAAC,IAAA,OAAA;AAAS,IAAA,OAAA;AAAS,IAAA,MAAA;AAAQ,IAAA,MAAA;AAAQ,IAAA;AAAS,CAAA;AAEhE;;;;;AAKC,IACM,SAASC,eAAAA,CAAgB,EAAEC,KAAK,EAAsB,EAAA;IACzD,IAAI,OAAOA,UAAU,QAAA,IAAYA,KAAAA,KAAU,QAAQC,KAAAA,CAAMC,OAAO,CAACF,KAAAA,CAAAA,EAAQ,qBAAOG,cAAA,CAAAC,mBAAA,EAAA;kBAAGC,2BAAAA,CAAcL,KAAAA;;AAEjG,IAAA,MAAMM,MAAAA,GAASN,KAAAA;AACf,IAAA,MAAMO,UAAAA,GAAaT,WAAAA,CAAYU,IAAI,CAACC,CAAAA,KAAAA,GAAS,OAAOH,MAAM,CAACG,MAAM,KAAK,QAAA,IAAYH,MAAM,CAACG,MAAM,KAAK,EAAA,CAAA;AACpG,IAAA,MAAMC,UAAUC,MAAAA,CAAOC,OAAO,CAACN,MAAAA,CAAAA,CAC1BO,MAAM,CAAC,CAAC,CAACC,KAAK,GAAKA,IAAAA,KAASP,YAC5BQ,GAAG,CAAC,CAAC,CAACD,IAAAA,EAAME,MAAM,GAAK;AAACF,YAAAA,IAAAA;YAAMT,2BAAAA,CAAcW,KAAAA;AAAO,SAAA,CAAA,CACnDH,MAAM,CAAC,CAAC,GAAGI,IAAAA,CAAK,GAAKA,IAAAA,KAAS,EAAA,CAAA;IAEnC,qBACIC,eAAA,CAAAd,mBAAA,EAAA;;AACKG,YAAAA,UAAAA,KAAeY,2BAAahB,cAAA,CAACiB,QAAAA,EAAAA;AAAQd,gBAAAA,QAAAA,EAAAA,MAAM,CAACC,UAAAA;;YAC5CG,OAAAA,CAAQW,MAAM,GAAG,CAAA,kBACdlB,cAAA,CAACmB,IAAAA,EAAAA;AACIZ,gBAAAA,QAAAA,EAAAA,OAAAA,CAAQK,GAAG,CAAC,CAAC,CAACD,IAAAA,EAAMG,IAAAA,CAAK,iBAAKC,eAAA,CAACK,KAAAA,EAAAA;;0CAAepB,cAAA,CAACqB,IAAAA,EAAAA;AAAIV,gCAAAA,QAAAA,EAAAA;;0CAAUX,cAAA,CAACsB,IAAAA,EAAAA;AAAIR,gCAAAA,QAAAA,EAAAA;;;AAA1BH,qBAAAA,EAAAA,IAAAA,CAAAA;;;;AAK7D;;"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var properties = require('../properties.js');
|
|
6
|
+
var useStructuralValue = require('../useStructuralValue.js');
|
|
7
|
+
var DataScrollerRow = require('./DataScrollerRow.js');
|
|
8
|
+
var isSerializedLegacyElement = require('./isSerializedLegacyElement.js');
|
|
9
|
+
var useIncrementalLoad = require('./useIncrementalLoad.js');
|
|
10
|
+
var useLoadOnReach = require('./useLoadOnReach.js');
|
|
11
|
+
|
|
12
|
+
/** How tall an inline scroller is when no `scrollHeight` was authored: without a height it would never overflow. */ const defaultScrollHeight = 320;
|
|
13
|
+
/**
|
|
14
|
+
* The `PrimeReact:dataScroller` component, a list that loads a chunk at a time as its end is reached.
|
|
15
|
+
*
|
|
16
|
+
* The entries are read as data: strings, numbers and records (see {@link DataScrollerRow}) from `items`, then
|
|
17
|
+
* any child elements authored in the `items` (or `content`) slot, which render as themselves. Serialized
|
|
18
|
+
* legacy UI elements in `items` are refused with a visible message, not shown as JSON.
|
|
19
|
+
*
|
|
20
|
+
* - `inline: true` scrolls inside the control, `scrollHeight` pixels tall (320 when omitted). `inline: false`
|
|
21
|
+
* loads as the page scrolls the end of the list into view.
|
|
22
|
+
* - The "Load more" button remains for keyboard and assistive technology; focus moves to the first entry it
|
|
23
|
+
* loads, and the number shown is announced.
|
|
24
|
+
* - A disabled element loads nothing on scroll and its button is disabled.
|
|
25
|
+
* - The loaded count restarts when `rows` or the content of `items` changes.
|
|
26
|
+
*/ function PrimeDataScroller({ element, slots, interactions }) {
|
|
27
|
+
const authored = useStructuralValue.useStructuralValue(properties.arrayProperty(element, 'items'));
|
|
28
|
+
const data = react.useMemo(()=>authored.filter((entry)=>!isSerializedLegacyElement.isSerializedLegacyElement(entry) && entry !== null && entry !== undefined), [
|
|
29
|
+
authored
|
|
30
|
+
]);
|
|
31
|
+
const refusal = isSerializedLegacyElement.legacyElementMessage(authored, 'items', "Author them as child elements in the 'items' slot, or as data.");
|
|
32
|
+
const slotted = slots.items ?? slots.content ?? [];
|
|
33
|
+
const rows = react.useMemo(()=>[
|
|
34
|
+
...data.map((value, index)=>/*#__PURE__*/ jsxRuntime.jsx(DataScrollerRow.DataScrollerRow, {
|
|
35
|
+
value: value
|
|
36
|
+
}, index)),
|
|
37
|
+
...slotted
|
|
38
|
+
], [
|
|
39
|
+
data,
|
|
40
|
+
slotted
|
|
41
|
+
]);
|
|
42
|
+
const chunk = Math.max(Math.floor(properties.numberProperty(element, 'rows', 10)), 1);
|
|
43
|
+
const inline = properties.booleanProperty(element, 'inline', false);
|
|
44
|
+
const scrollHeight = properties.numberProperty(element, 'scrollHeight', defaultScrollHeight);
|
|
45
|
+
const enabled = element.isEnabled;
|
|
46
|
+
const { loaded, loadMore } = useIncrementalLoad.useIncrementalLoad(rows.length, chunk, data);
|
|
47
|
+
const canLoad = loaded < rows.length;
|
|
48
|
+
const scroller = react.useRef(null);
|
|
49
|
+
const sentinel = react.useRef(null);
|
|
50
|
+
const entries = react.useRef([]);
|
|
51
|
+
const focusIndex = react.useRef(undefined);
|
|
52
|
+
useLoadOnReach.useLoadOnReach(sentinel, inline ? scroller : null, enabled && canLoad, loaded, loadMore);
|
|
53
|
+
react.useEffect(()=>{
|
|
54
|
+
if (focusIndex.current === undefined) return;
|
|
55
|
+
entries.current[focusIndex.current]?.focus();
|
|
56
|
+
focusIndex.current = undefined;
|
|
57
|
+
}, [
|
|
58
|
+
loaded
|
|
59
|
+
]);
|
|
60
|
+
const loadByButton = ()=>{
|
|
61
|
+
focusIndex.current = loaded;
|
|
62
|
+
loadMore();
|
|
63
|
+
};
|
|
64
|
+
return /*#__PURE__*/ jsxRuntime.jsxs("div", {
|
|
65
|
+
"data-scene-id": element.id,
|
|
66
|
+
"data-scene-component": "dataScroller",
|
|
67
|
+
"aria-disabled": !enabled,
|
|
68
|
+
onClick: interactions?.onClick,
|
|
69
|
+
onDoubleClick: interactions?.onDoubleClick,
|
|
70
|
+
children: [
|
|
71
|
+
/*#__PURE__*/ jsxRuntime.jsxs("div", {
|
|
72
|
+
ref: scroller,
|
|
73
|
+
role: "region",
|
|
74
|
+
tabIndex: inline ? 0 : undefined,
|
|
75
|
+
"aria-label": properties.stringProperty(element, 'ariaLabel', 'Scrollable data'),
|
|
76
|
+
style: inline ? {
|
|
77
|
+
maxHeight: `${scrollHeight}px`,
|
|
78
|
+
overflowY: 'auto'
|
|
79
|
+
} : undefined,
|
|
80
|
+
children: [
|
|
81
|
+
/*#__PURE__*/ jsxRuntime.jsx("ol", {
|
|
82
|
+
children: rows.slice(0, loaded).map((row, index)=>/*#__PURE__*/ jsxRuntime.jsx("li", {
|
|
83
|
+
tabIndex: -1,
|
|
84
|
+
ref: (node)=>{
|
|
85
|
+
entries.current[index] = node;
|
|
86
|
+
},
|
|
87
|
+
children: row
|
|
88
|
+
}, index))
|
|
89
|
+
}),
|
|
90
|
+
canLoad && /*#__PURE__*/ jsxRuntime.jsx("div", {
|
|
91
|
+
ref: sentinel,
|
|
92
|
+
"aria-hidden": "true"
|
|
93
|
+
})
|
|
94
|
+
]
|
|
95
|
+
}),
|
|
96
|
+
rows.length === 0 && /*#__PURE__*/ jsxRuntime.jsx("p", {
|
|
97
|
+
role: "status",
|
|
98
|
+
children: properties.stringProperty(element, 'emptyLabel', 'No items to show')
|
|
99
|
+
}),
|
|
100
|
+
refusal !== undefined && /*#__PURE__*/ jsxRuntime.jsx("p", {
|
|
101
|
+
role: "alert",
|
|
102
|
+
"data-scene-state": "legacy-elements",
|
|
103
|
+
children: refusal
|
|
104
|
+
}),
|
|
105
|
+
canLoad && /*#__PURE__*/ jsxRuntime.jsx("button", {
|
|
106
|
+
type: "button",
|
|
107
|
+
disabled: !enabled,
|
|
108
|
+
onClick: loadByButton,
|
|
109
|
+
children: "Load more"
|
|
110
|
+
}),
|
|
111
|
+
rows.length > 0 && /*#__PURE__*/ jsxRuntime.jsx("output", {
|
|
112
|
+
"aria-live": "polite",
|
|
113
|
+
children: `Showing ${loaded} of ${rows.length} items`
|
|
114
|
+
})
|
|
115
|
+
]
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
exports.PrimeDataScroller = PrimeDataScroller;
|
|
120
|
+
//# sourceMappingURL=PrimeDataScroller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrimeDataScroller.js","sources":["../../../data/PrimeDataScroller.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 { ReactNode, useEffect, useMemo, useRef } from 'react';\nimport { RegisteredComponentProps } from '@cratis/scene.react';\nimport { arrayProperty, booleanProperty, numberProperty, stringProperty } from '../properties';\nimport { useStructuralValue } from '../useStructuralValue';\nimport { DataScrollerRow } from './DataScrollerRow';\nimport { isSerializedLegacyElement, legacyElementMessage } from './isSerializedLegacyElement';\nimport { useIncrementalLoad } from './useIncrementalLoad';\nimport { useLoadOnReach } from './useLoadOnReach';\n\n/** How tall an inline scroller is when no `scrollHeight` was authored: without a height it would never overflow. */\nconst defaultScrollHeight = 320;\n\n/**\n * The `PrimeReact:dataScroller` component, a list that loads a chunk at a time as its end is reached.\n *\n * The entries are read as data: strings, numbers and records (see {@link DataScrollerRow}) from `items`, then\n * any child elements authored in the `items` (or `content`) slot, which render as themselves. Serialized\n * legacy UI elements in `items` are refused with a visible message, not shown as JSON.\n *\n * - `inline: true` scrolls inside the control, `scrollHeight` pixels tall (320 when omitted). `inline: false`\n * loads as the page scrolls the end of the list into view.\n * - The \"Load more\" button remains for keyboard and assistive technology; focus moves to the first entry it\n * loads, and the number shown is announced.\n * - A disabled element loads nothing on scroll and its button is disabled.\n * - The loaded count restarts when `rows` or the content of `items` changes.\n */\nexport function PrimeDataScroller({ element, slots, interactions }: RegisteredComponentProps) {\n const authored = useStructuralValue(arrayProperty(element, 'items'));\n const data = useMemo(() => authored.filter(entry => !isSerializedLegacyElement(entry) && entry !== null && entry !== undefined), [authored]);\n const refusal = legacyElementMessage(authored, 'items', \"Author them as child elements in the 'items' slot, or as data.\");\n const slotted = slots.items ?? slots.content ?? [];\n const rows = useMemo<ReactNode[]>(() => [...data.map((value, index) => <DataScrollerRow key={index} value={value} />), ...slotted], [data, slotted]);\n const chunk = Math.max(Math.floor(numberProperty(element, 'rows', 10)), 1);\n const inline = booleanProperty(element, 'inline', false);\n const scrollHeight = numberProperty(element, 'scrollHeight', defaultScrollHeight);\n const enabled = element.isEnabled;\n const { loaded, loadMore } = useIncrementalLoad(rows.length, chunk, data);\n const canLoad = loaded < rows.length;\n const scroller = useRef<HTMLDivElement>(null);\n const sentinel = useRef<HTMLDivElement>(null);\n const entries = useRef<(HTMLLIElement | null)[]>([]);\n const focusIndex = useRef<number | undefined>(undefined);\n\n useLoadOnReach(sentinel, inline ? scroller : null, enabled && canLoad, loaded, loadMore);\n\n useEffect(() => {\n if (focusIndex.current === undefined) return;\n entries.current[focusIndex.current]?.focus();\n focusIndex.current = undefined;\n }, [loaded]);\n\n const loadByButton = () => {\n focusIndex.current = loaded;\n loadMore();\n };\n\n return (\n <div\n data-scene-id={element.id}\n data-scene-component='dataScroller'\n aria-disabled={!enabled}\n onClick={interactions?.onClick}\n onDoubleClick={interactions?.onDoubleClick}>\n <div\n ref={scroller}\n role='region'\n tabIndex={inline ? 0 : undefined}\n aria-label={stringProperty(element, 'ariaLabel', 'Scrollable data')}\n style={inline ? { maxHeight: `${scrollHeight}px`, overflowY: 'auto' } : undefined}>\n <ol>\n {rows.slice(0, loaded).map((row, index) => <li key={index} tabIndex={-1} ref={node => { entries.current[index] = node; }}>{row}</li>)}\n </ol>\n {canLoad && <div ref={sentinel} aria-hidden='true' />}\n </div>\n {rows.length === 0 && <p role='status'>{stringProperty(element, 'emptyLabel', 'No items to show')}</p>}\n {refusal !== undefined && <p role='alert' data-scene-state='legacy-elements'>{refusal}</p>}\n {canLoad && <button type='button' disabled={!enabled} onClick={loadByButton}>Load more</button>}\n {rows.length > 0 && <output aria-live='polite'>{`Showing ${loaded} of ${rows.length} items`}</output>}\n </div>\n );\n}\n"],"names":["defaultScrollHeight","PrimeDataScroller","element","slots","interactions","authored","useStructuralValue","arrayProperty","data","useMemo","filter","entry","isSerializedLegacyElement","undefined","refusal","legacyElementMessage","slotted","items","content","rows","map","value","index","_jsx","DataScrollerRow","chunk","Math","max","floor","numberProperty","inline","booleanProperty","scrollHeight","enabled","isEnabled","loaded","loadMore","useIncrementalLoad","length","canLoad","scroller","useRef","sentinel","entries","focusIndex","useLoadOnReach","useEffect","current","focus","loadByButton","_jsxs","div","data-scene-id","id","data-scene-component","aria-disabled","onClick","onDoubleClick","ref","role","tabIndex","aria-label","stringProperty","style","maxHeight","overflowY","ol","slice","row","li","node","aria-hidden","p","data-scene-state","button","type","disabled","output","aria-live"],"mappings":"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"}
|