@cratis/scene.primereact 4.5.0 → 4.7.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 +42 -10
- package/chart/ChartGallery.stories.tsx +63 -0
- package/chart/ChartType.ts +14 -0
- package/chart/ChartTypeResolution.ts +14 -0
- package/chart/PrimeChart.tsx +62 -0
- package/chart/chartHasData.ts +22 -0
- package/chart/chartTypeChoices.ts +32 -0
- package/chart/index.ts +7 -0
- package/chart/resolveChartType.ts +61 -0
- package/chart/useChart.ts +61 -0
- 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/chart/ChartType.js +18 -0
- package/dist/cjs/chart/ChartType.js.map +1 -0
- package/dist/cjs/chart/PrimeChart.js +92 -0
- package/dist/cjs/chart/PrimeChart.js.map +1 -0
- package/dist/cjs/chart/chartHasData.js +24 -0
- package/dist/cjs/chart/chartHasData.js.map +1 -0
- package/dist/cjs/chart/chartTypeChoices.js +43 -0
- package/dist/cjs/chart/chartTypeChoices.js.map +1 -0
- package/dist/cjs/chart/resolveChartType.js +69 -0
- package/dist/cjs/chart/resolveChartType.js.map +1 -0
- package/dist/cjs/chart/useChart.js +62 -0
- package/dist/cjs/chart/useChart.js.map +1 -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/form/MultiStateGlyph.js +59 -0
- package/dist/cjs/form/MultiStateGlyph.js.map +1 -0
- package/dist/cjs/form/PrimeMultiStateCheckbox.js +123 -0
- package/dist/cjs/form/PrimeMultiStateCheckbox.js.map +1 -0
- package/dist/cjs/form/multiStateOptions.js +77 -0
- package/dist/cjs/form/multiStateOptions.js.map +1 -0
- package/dist/cjs/form/multiStateStates.js +32 -0
- package/dist/cjs/form/multiStateStates.js.map +1 -0
- package/dist/cjs/form/useMultiStateSelection.js +51 -0
- package/dist/cjs/form/useMultiStateSelection.js.map +1 -0
- package/dist/cjs/index.js +44 -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 +15 -0
- package/dist/cjs/primeReactComponents.js.map +1 -1
- package/dist/cjs/primeReactDescriptors.js +400 -0
- package/dist/cjs/primeReactDescriptors.js.map +1 -0
- package/dist/cjs/primeReactPackage.js +8 -0
- package/dist/cjs/primeReactPackage.js.map +1 -1
- package/dist/cjs/properties.js +11 -0
- package/dist/cjs/properties.js.map +1 -1
- package/dist/cjs/resolveEnumeration.js +55 -0
- package/dist/cjs/resolveEnumeration.js.map +1 -0
- package/dist/cjs/structurallyEqual.js +27 -0
- package/dist/cjs/structurallyEqual.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/cjs/useStructuralValue.js +20 -0
- package/dist/cjs/useStructuralValue.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/chart/ChartGallery.stories.d.ts +14 -0
- package/dist/esm/chart/ChartGallery.stories.d.ts.map +1 -0
- package/dist/esm/chart/ChartGallery.stories.js +47 -0
- package/dist/esm/chart/ChartGallery.stories.js.map +1 -0
- package/dist/esm/chart/ChartType.d.ts +11 -0
- package/dist/esm/chart/ChartType.d.ts.map +1 -0
- package/dist/esm/chart/ChartType.js +16 -0
- package/dist/esm/chart/ChartType.js.map +1 -0
- package/dist/esm/chart/ChartTypeResolution.d.ts +10 -0
- package/dist/esm/chart/ChartTypeResolution.d.ts.map +1 -0
- package/dist/esm/chart/ChartTypeResolution.js +2 -0
- package/dist/esm/chart/ChartTypeResolution.js.map +1 -0
- package/dist/esm/chart/PrimeChart.d.ts +3 -0
- package/dist/esm/chart/PrimeChart.d.ts.map +1 -0
- package/dist/esm/chart/PrimeChart.js +90 -0
- package/dist/esm/chart/PrimeChart.js.map +1 -0
- package/dist/esm/chart/chartHasData.d.ts +2 -0
- package/dist/esm/chart/chartHasData.d.ts.map +1 -0
- package/dist/esm/chart/chartHasData.js +22 -0
- package/dist/esm/chart/chartHasData.js.map +1 -0
- package/dist/esm/chart/chartTypeChoices.d.ts +3 -0
- package/dist/esm/chart/chartTypeChoices.d.ts.map +1 -0
- package/dist/esm/chart/chartTypeChoices.js +41 -0
- package/dist/esm/chart/chartTypeChoices.js.map +1 -0
- package/dist/esm/chart/index.d.ts +5 -0
- package/dist/esm/chart/index.d.ts.map +1 -0
- package/dist/esm/chart/index.js +5 -0
- package/dist/esm/chart/index.js.map +1 -0
- package/dist/esm/chart/resolveChartType.d.ts +6 -0
- package/dist/esm/chart/resolveChartType.d.ts.map +1 -0
- package/dist/esm/chart/resolveChartType.js +66 -0
- package/dist/esm/chart/resolveChartType.js.map +1 -0
- package/dist/esm/chart/useChart.d.ts +4 -0
- package/dist/esm/chart/useChart.d.ts.map +1 -0
- package/dist/esm/chart/useChart.js +60 -0
- package/dist/esm/chart/useChart.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 +9 -0
- package/dist/esm/form/FormGallery.stories.js.map +1 -1
- package/dist/esm/form/MultiStateGlyph.d.ts +8 -0
- package/dist/esm/form/MultiStateGlyph.d.ts.map +1 -0
- package/dist/esm/form/MultiStateGlyph.js +57 -0
- package/dist/esm/form/MultiStateGlyph.js.map +1 -0
- package/dist/esm/form/MultiStateOption.d.ts +7 -0
- package/dist/esm/form/MultiStateOption.d.ts.map +1 -0
- package/dist/esm/form/MultiStateOption.js +2 -0
- package/dist/esm/form/MultiStateOption.js.map +1 -0
- package/dist/esm/form/PrimeMultiStateCheckbox.d.ts +3 -0
- package/dist/esm/form/PrimeMultiStateCheckbox.d.ts.map +1 -0
- package/dist/esm/form/PrimeMultiStateCheckbox.js +121 -0
- package/dist/esm/form/PrimeMultiStateCheckbox.js.map +1 -0
- package/dist/esm/form/index.d.ts +1 -0
- package/dist/esm/form/index.d.ts.map +1 -1
- package/dist/esm/form/index.js +1 -0
- package/dist/esm/form/index.js.map +1 -1
- package/dist/esm/form/multiStateOptions.d.ts +4 -0
- package/dist/esm/form/multiStateOptions.d.ts.map +1 -0
- package/dist/esm/form/multiStateOptions.js +75 -0
- package/dist/esm/form/multiStateOptions.js.map +1 -0
- package/dist/esm/form/multiStateStates.d.ts +4 -0
- package/dist/esm/form/multiStateStates.d.ts.map +1 -0
- package/dist/esm/form/multiStateStates.js +30 -0
- package/dist/esm/form/multiStateStates.js.map +1 -0
- package/dist/esm/form/useMultiStateSelection.d.ts +6 -0
- package/dist/esm/form/useMultiStateSelection.d.ts.map +1 -0
- package/dist/esm/form/useMultiStateSelection.js +49 -0
- package/dist/esm/form/useMultiStateSelection.js.map +1 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +22 -2
- 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 +15 -0
- package/dist/esm/primeReactComponents.js.map +1 -1
- package/dist/esm/primeReactDescriptors.d.ts +3 -0
- package/dist/esm/primeReactDescriptors.d.ts.map +1 -0
- package/dist/esm/primeReactDescriptors.js +398 -0
- package/dist/esm/primeReactDescriptors.js.map +1 -0
- package/dist/esm/primeReactPackage.d.ts.map +1 -1
- package/dist/esm/primeReactPackage.js +8 -0
- package/dist/esm/primeReactPackage.js.map +1 -1
- package/dist/esm/properties.d.ts +1 -0
- package/dist/esm/properties.d.ts.map +1 -1
- package/dist/esm/properties.js +11 -1
- package/dist/esm/properties.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/structurallyEqual.d.ts +2 -0
- package/dist/esm/structurallyEqual.d.ts.map +1 -0
- package/dist/esm/structurallyEqual.js +25 -0
- package/dist/esm/structurallyEqual.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/dist/esm/useStructuralValue.d.ts +2 -0
- package/dist/esm/useStructuralValue.d.ts.map +1 -0
- package/dist/esm/useStructuralValue.js +18 -0
- package/dist/esm/useStructuralValue.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 +9 -0
- package/form/MultiStateGlyph.tsx +55 -0
- package/form/MultiStateOption.ts +17 -0
- package/form/PrimeMultiStateCheckbox.tsx +101 -0
- package/form/index.ts +1 -0
- package/form/multiStateOptions.ts +78 -0
- package/form/multiStateStates.ts +23 -0
- package/form/useMultiStateSelection.ts +48 -0
- package/index.ts +4 -0
- package/legacyEnumerationChoices.ts +35 -0
- package/loadQuill/index.ts +21 -0
- package/package.json +27 -7
- package/primeReactComponents.ts +12 -0
- package/primeReactDescriptors.ts +111 -0
- package/primeReactPackage.ts +5 -3
- package/primeReactTheme.css +69 -0
- package/properties.ts +14 -0
- package/resolveEnumeration.ts +50 -0
- package/structurallyEqual.ts +29 -0
- package/treeNodes.ts +44 -6
- package/useResettingState.ts +34 -0
- package/useStructuralValue.ts +17 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useContext, useSyncExternalStore, useMemo } from 'react';
|
|
3
|
+
import { FileUpload } from 'primereact/fileupload';
|
|
4
|
+
import { stringProperty, booleanProperty, numberProperty } from '../properties.js';
|
|
5
|
+
import { resolveEnumeration } from '../resolveEnumeration.js';
|
|
6
|
+
import { FileUploadContext } from './FileUploadContext.js';
|
|
7
|
+
import { FileUploadMode } from './FileUploadMode.js';
|
|
8
|
+
import { resolveUploadTarget } from './resolveUploadTarget.js';
|
|
9
|
+
import { useUploadSession } from './useUploadSession.js';
|
|
10
|
+
|
|
11
|
+
const subscribeToNothing = ()=>()=>undefined;
|
|
12
|
+
const pageOrigin = ()=>window.location.origin;
|
|
13
|
+
const noPageOrigin = ()=>undefined;
|
|
14
|
+
/**
|
|
15
|
+
* The `PrimeReact:fileUpload` component.
|
|
16
|
+
*
|
|
17
|
+
* PrimeReact 11 provides the accessible file picker and drop zone; this adapter owns everything that has an
|
|
18
|
+
* effect or a policy:
|
|
19
|
+
* - The authored `url` is untrusted data. It is checked by {@link resolveUploadTarget} - same origin as the
|
|
20
|
+
* page unless the host allows more through {@link FileUploadHandlerProvider} - and a refused address is
|
|
21
|
+
* reported and blocks every upload, the host's handler included.
|
|
22
|
+
* - Nothing is requested on mount. A request starts only when the user selects or drops files (automatic and
|
|
23
|
+
* basic mode) or presses the upload button.
|
|
24
|
+
* - `multiple: false` is enforced before anything is sent, for the file input and for drag and drop.
|
|
25
|
+
* - One upload runs at a time (nothing can be selected or dropped while it runs), and a failure is shown
|
|
26
|
+
* rather than thrown.
|
|
27
|
+
* - A disabled element (`isEnabled: false`) disables the picker, the upload button and the drop zone.
|
|
28
|
+
*
|
|
29
|
+
* Without a host handler the control posts the files itself with `fetch`, sending cookies to the page's own
|
|
30
|
+
* origin only.
|
|
31
|
+
*/ function PrimeFileUpload({ element, interactions }) {
|
|
32
|
+
const { handler, allowedOrigins } = useContext(FileUploadContext);
|
|
33
|
+
const origin = useSyncExternalStore(subscribeToNothing, pageOrigin, noPageOrigin);
|
|
34
|
+
const modeResolution = resolveEnumeration('mode', element.properties.mode, FileUploadMode, FileUploadMode.Advanced);
|
|
35
|
+
const mode = modeResolution.isValid ? modeResolution.value : FileUploadMode.Advanced;
|
|
36
|
+
const authoredUrl = stringProperty(element, 'url');
|
|
37
|
+
const target = useMemo(()=>resolveUploadTarget(authoredUrl, origin, allowedOrigins), [
|
|
38
|
+
authoredUrl,
|
|
39
|
+
origin,
|
|
40
|
+
allowedOrigins
|
|
41
|
+
]);
|
|
42
|
+
const serverUrl = target.isValid ? target.url : undefined;
|
|
43
|
+
const multiple = booleanProperty(element, 'multiple', false);
|
|
44
|
+
const enabled = element.isEnabled;
|
|
45
|
+
const canUpload = target.isValid && (handler !== undefined || serverUrl !== undefined);
|
|
46
|
+
const session = useUploadSession(handler, serverUrl, stringProperty(element, 'name', 'files'));
|
|
47
|
+
const uploaded = async (event)=>{
|
|
48
|
+
if (!enabled || !canUpload) return;
|
|
49
|
+
if (await session.upload(event.files)) event.options.clear();
|
|
50
|
+
};
|
|
51
|
+
const changed = (event)=>{
|
|
52
|
+
// Clearing the selection after an upload reports an empty change; it is not a new selection, and must not
|
|
53
|
+
// wipe the result of the upload that caused it.
|
|
54
|
+
if (event.acceptedFiles.length === 0 && event.rejectedFiles.length === 0) return;
|
|
55
|
+
const rejection = event.rejectedFiles.flatMap((rejected)=>rejected.errors.map((error)=>error.message)).join(' ');
|
|
56
|
+
session.setStatus(rejection === '' ? undefined : {
|
|
57
|
+
kind: 'error',
|
|
58
|
+
text: rejection
|
|
59
|
+
});
|
|
60
|
+
interactions?.onChange?.();
|
|
61
|
+
};
|
|
62
|
+
const refuseSeveralFromInput = (event)=>{
|
|
63
|
+
const input = event.target;
|
|
64
|
+
if (input.type !== 'file') return;
|
|
65
|
+
if (session.busy) {
|
|
66
|
+
event.stopPropagation();
|
|
67
|
+
input.value = '';
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (multiple || (input.files?.length ?? 0) < 2) return;
|
|
71
|
+
event.stopPropagation();
|
|
72
|
+
input.value = '';
|
|
73
|
+
session.setStatus({
|
|
74
|
+
kind: 'error',
|
|
75
|
+
text: 'Only one file can be uploaded at a time.'
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
const refuseDrop = (event)=>{
|
|
79
|
+
if (!enabled) {
|
|
80
|
+
event.preventDefault();
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (session.busy) {
|
|
84
|
+
event.preventDefault();
|
|
85
|
+
event.stopPropagation();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (multiple || (event.dataTransfer?.files.length ?? 0) < 2) return;
|
|
89
|
+
event.preventDefault();
|
|
90
|
+
event.stopPropagation();
|
|
91
|
+
session.setStatus({
|
|
92
|
+
kind: 'error',
|
|
93
|
+
text: 'Only one file can be uploaded at a time.'
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
return /*#__PURE__*/ jsx("div", {
|
|
97
|
+
"data-scene-id": element.id,
|
|
98
|
+
"data-scene-component": "fileUpload",
|
|
99
|
+
onClick: interactions?.onClick,
|
|
100
|
+
onDoubleClick: interactions?.onDoubleClick,
|
|
101
|
+
onChangeCapture: refuseSeveralFromInput,
|
|
102
|
+
onDropCapture: refuseDrop,
|
|
103
|
+
onDragOverCapture: (event)=>{
|
|
104
|
+
if (!enabled) event.preventDefault();
|
|
105
|
+
},
|
|
106
|
+
children: /*#__PURE__*/ jsx(FileUpload.Root, {
|
|
107
|
+
accept: stringProperty(element, 'accept'),
|
|
108
|
+
auto: (mode === FileUploadMode.Auto || mode === FileUploadMode.Basic) && canUpload,
|
|
109
|
+
customUpload: true,
|
|
110
|
+
disabled: !enabled,
|
|
111
|
+
maxFileSize: numberProperty(element, 'maxFileSize'),
|
|
112
|
+
multiple: multiple,
|
|
113
|
+
name: stringProperty(element, 'name', 'files'),
|
|
114
|
+
uploadHandler: uploaded,
|
|
115
|
+
onChange: changed,
|
|
116
|
+
children: /*#__PURE__*/ jsxs(FileUpload.Content, {
|
|
117
|
+
"aria-label": stringProperty(element, 'ariaLabel', 'File upload drop zone'),
|
|
118
|
+
children: [
|
|
119
|
+
/*#__PURE__*/ jsx("p", {
|
|
120
|
+
children: mode === FileUploadMode.Basic ? 'Choose a file to upload.' : 'Drop files here or choose files to upload.'
|
|
121
|
+
}),
|
|
122
|
+
/*#__PURE__*/ jsx(FileUpload.Trigger, {
|
|
123
|
+
disabled: !enabled || session.busy,
|
|
124
|
+
children: mode === FileUploadMode.Basic ? 'Choose file' : 'Choose files'
|
|
125
|
+
}),
|
|
126
|
+
mode === FileUploadMode.Advanced && /*#__PURE__*/ jsx(FileUpload.Upload, {
|
|
127
|
+
disabled: !enabled || !canUpload || session.busy,
|
|
128
|
+
children: "Upload selected files"
|
|
129
|
+
}),
|
|
130
|
+
!modeResolution.isValid && /*#__PURE__*/ jsx("p", {
|
|
131
|
+
role: "alert",
|
|
132
|
+
"data-scene-state": "unsupported-mode",
|
|
133
|
+
children: modeResolution.message
|
|
134
|
+
}),
|
|
135
|
+
!target.isValid && /*#__PURE__*/ jsx("p", {
|
|
136
|
+
role: "alert",
|
|
137
|
+
"data-scene-state": "refused-address",
|
|
138
|
+
children: target.message
|
|
139
|
+
}),
|
|
140
|
+
target.isValid && !canUpload && /*#__PURE__*/ jsx("p", {
|
|
141
|
+
role: "status",
|
|
142
|
+
children: "Configure a server URL or provide an upload handler to upload files."
|
|
143
|
+
}),
|
|
144
|
+
session.busy && /*#__PURE__*/ jsx("p", {
|
|
145
|
+
role: "status",
|
|
146
|
+
children: "Uploading…"
|
|
147
|
+
}),
|
|
148
|
+
session.status !== undefined && /*#__PURE__*/ jsx("p", {
|
|
149
|
+
role: session.status.kind === 'error' ? 'alert' : 'status',
|
|
150
|
+
children: session.status.text
|
|
151
|
+
})
|
|
152
|
+
]
|
|
153
|
+
})
|
|
154
|
+
})
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export { PrimeFileUpload };
|
|
159
|
+
//# sourceMappingURL=PrimeFileUpload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrimeFileUpload.js","sources":["../../../file/PrimeFileUpload.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 { ChangeEvent, DragEvent, useContext, useMemo, useSyncExternalStore } from 'react';\nimport { FileUpload, type FileUploadChangeEvent, type FileUploadHandlerEvent } from 'primereact/fileupload';\nimport { RegisteredComponentProps } from '@cratis/scene.react';\nimport { booleanProperty, numberProperty, stringProperty } from '../properties';\nimport { resolveEnumeration } from '../resolveEnumeration';\nimport { FileUploadContext } from './FileUploadContext';\nimport { FileUploadMode } from './FileUploadMode';\nimport { resolveUploadTarget } from './resolveUploadTarget';\nimport { useUploadSession } from './useUploadSession';\n\nconst subscribeToNothing = () => () => undefined;\nconst pageOrigin = () => window.location.origin;\nconst noPageOrigin = () => undefined;\n\n/**\n * The `PrimeReact:fileUpload` component.\n *\n * PrimeReact 11 provides the accessible file picker and drop zone; this adapter owns everything that has an\n * effect or a policy:\n * - The authored `url` is untrusted data. It is checked by {@link resolveUploadTarget} - same origin as the\n * page unless the host allows more through {@link FileUploadHandlerProvider} - and a refused address is\n * reported and blocks every upload, the host's handler included.\n * - Nothing is requested on mount. A request starts only when the user selects or drops files (automatic and\n * basic mode) or presses the upload button.\n * - `multiple: false` is enforced before anything is sent, for the file input and for drag and drop.\n * - One upload runs at a time (nothing can be selected or dropped while it runs), and a failure is shown\n * rather than thrown.\n * - A disabled element (`isEnabled: false`) disables the picker, the upload button and the drop zone.\n *\n * Without a host handler the control posts the files itself with `fetch`, sending cookies to the page's own\n * origin only.\n */\nexport function PrimeFileUpload({ element, interactions }: RegisteredComponentProps) {\n const { handler, allowedOrigins } = useContext(FileUploadContext);\n const origin = useSyncExternalStore(subscribeToNothing, pageOrigin, noPageOrigin);\n const modeResolution = resolveEnumeration('mode', element.properties.mode, FileUploadMode, FileUploadMode.Advanced);\n const mode = modeResolution.isValid ? modeResolution.value : FileUploadMode.Advanced;\n const authoredUrl = stringProperty(element, 'url');\n const target = useMemo(() => resolveUploadTarget(authoredUrl, origin, allowedOrigins), [authoredUrl, origin, allowedOrigins]);\n const serverUrl = target.isValid ? target.url : undefined;\n const multiple = booleanProperty(element, 'multiple', false);\n const enabled = element.isEnabled;\n const canUpload = target.isValid && (handler !== undefined || serverUrl !== undefined);\n const session = useUploadSession(handler, serverUrl, stringProperty(element, 'name', 'files'));\n\n const uploaded = async (event: FileUploadHandlerEvent) => {\n if (!enabled || !canUpload) return;\n if (await session.upload(event.files)) event.options.clear();\n };\n\n const changed = (event: FileUploadChangeEvent) => {\n // Clearing the selection after an upload reports an empty change; it is not a new selection, and must not\n // wipe the result of the upload that caused it.\n if (event.acceptedFiles.length === 0 && event.rejectedFiles.length === 0) return;\n const rejection = event.rejectedFiles.flatMap(rejected => rejected.errors.map(error => error.message)).join(' ');\n session.setStatus(rejection === '' ? undefined : { kind: 'error', text: rejection });\n interactions?.onChange?.();\n };\n\n const refuseSeveralFromInput = (event: ChangeEvent<HTMLElement>) => {\n const input = event.target as HTMLInputElement;\n if (input.type !== 'file') return;\n if (session.busy) {\n event.stopPropagation();\n input.value = '';\n return;\n }\n\n if (multiple || (input.files?.length ?? 0) < 2) return;\n event.stopPropagation();\n input.value = '';\n session.setStatus({ kind: 'error', text: 'Only one file can be uploaded at a time.' });\n };\n\n const refuseDrop = (event: DragEvent<HTMLElement>) => {\n if (!enabled) {\n event.preventDefault();\n return;\n }\n if (session.busy) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (multiple || (event.dataTransfer?.files.length ?? 0) < 2) return;\n event.preventDefault();\n event.stopPropagation();\n session.setStatus({ kind: 'error', text: 'Only one file can be uploaded at a time.' });\n };\n\n return (\n <div\n data-scene-id={element.id}\n data-scene-component='fileUpload'\n onClick={interactions?.onClick}\n onDoubleClick={interactions?.onDoubleClick}\n onChangeCapture={refuseSeveralFromInput}\n onDropCapture={refuseDrop}\n onDragOverCapture={event => { if (!enabled) event.preventDefault(); }}>\n <FileUpload.Root\n accept={stringProperty(element, 'accept')}\n auto={(mode === FileUploadMode.Auto || mode === FileUploadMode.Basic) && canUpload}\n customUpload\n disabled={!enabled}\n maxFileSize={numberProperty(element, 'maxFileSize')}\n multiple={multiple}\n name={stringProperty(element, 'name', 'files')}\n uploadHandler={uploaded}\n onChange={changed}>\n <FileUpload.Content aria-label={stringProperty(element, 'ariaLabel', 'File upload drop zone')}>\n <p>{mode === FileUploadMode.Basic ? 'Choose a file to upload.' : 'Drop files here or choose files to upload.'}</p>\n <FileUpload.Trigger disabled={!enabled || session.busy}>{mode === FileUploadMode.Basic ? 'Choose file' : 'Choose files'}</FileUpload.Trigger>\n {mode === FileUploadMode.Advanced && (\n <FileUpload.Upload disabled={!enabled || !canUpload || session.busy}>Upload selected files</FileUpload.Upload>\n )}\n {!modeResolution.isValid && <p role='alert' data-scene-state='unsupported-mode'>{modeResolution.message}</p>}\n {!target.isValid && <p role='alert' data-scene-state='refused-address'>{target.message}</p>}\n {target.isValid && !canUpload && <p role='status'>Configure a server URL or provide an upload handler to upload files.</p>}\n {session.busy && <p role='status'>Uploading…</p>}\n {session.status !== undefined && <p role={session.status.kind === 'error' ? 'alert' : 'status'}>{session.status.text}</p>}\n </FileUpload.Content>\n </FileUpload.Root>\n </div>\n );\n}\n"],"names":["subscribeToNothing","undefined","pageOrigin","window","location","origin","noPageOrigin","PrimeFileUpload","element","interactions","handler","allowedOrigins","useContext","FileUploadContext","useSyncExternalStore","modeResolution","resolveEnumeration","properties","mode","FileUploadMode","Advanced","isValid","value","authoredUrl","stringProperty","target","useMemo","resolveUploadTarget","serverUrl","url","multiple","booleanProperty","enabled","isEnabled","canUpload","session","useUploadSession","uploaded","event","upload","files","options","clear","changed","acceptedFiles","length","rejectedFiles","rejection","flatMap","rejected","errors","map","error","message","join","setStatus","kind","text","onChange","refuseSeveralFromInput","input","type","busy","stopPropagation","refuseDrop","preventDefault","dataTransfer","_jsx","div","data-scene-id","id","data-scene-component","onClick","onDoubleClick","onChangeCapture","onDropCapture","onDragOverCapture","FileUpload","Root","accept","auto","Auto","Basic","customUpload","disabled","maxFileSize","numberProperty","name","uploadHandler","_jsxs","Content","aria-label","p","Trigger","Upload","role","data-scene-state","status"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UploadStatus.d.ts","sourceRoot":"","sources":["../../../file/UploadStatus.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAEzB,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UploadStatus.js","sourceRoot":"","sources":["../../../file/UploadStatus.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UploadTarget.d.ts","sourceRoot":"","sources":["../../../file/UploadTarget.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GAClB;IACE,OAAO,EAAE,IAAI,CAAC;IAGd,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,GACC;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UploadTarget.js","sourceRoot":"","sources":["../../../file/UploadTarget.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './FileUploadHandler';
|
|
2
|
+
export * from './FileUploadHandlerProvider';
|
|
3
|
+
export * from './FileUploadMode';
|
|
4
|
+
export * from './PrimeFileUpload';
|
|
5
|
+
export * from './resolveUploadTarget';
|
|
6
|
+
export * from './UploadTarget';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../file/index.ts"],"names":[],"mappings":"AAGA,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../file/index.ts"],"names":[],"mappings":"AAGA,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postFiles.d.ts","sourceRoot":"","sources":["../../../file/postFiles.ts"],"names":[],"mappings":"AAgBA,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7G"}
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
* Sends files to an address as a `multipart/form-data` POST.
|
|
5
|
+
*
|
|
6
|
+
* Cookies are sent only to the page's own origin (`credentials: 'same-origin'`), so an upload to another
|
|
7
|
+
* origin the host allowed carries no credentials. A redirect fails the upload rather than being followed,
|
|
8
|
+
* because following one would send the files to an address the origin policy never checked.
|
|
9
|
+
*
|
|
10
|
+
* @param url The address, already checked by `resolveUploadTarget`.
|
|
11
|
+
* @param field The multipart field name each file is appended under.
|
|
12
|
+
* @param files The files to send.
|
|
13
|
+
* @param signal Cancels the request.
|
|
14
|
+
* @throws When the request fails or the server does not answer with a success status.
|
|
15
|
+
*/ async function postFiles(url, field, files, signal) {
|
|
16
|
+
const body = new FormData();
|
|
17
|
+
for (const file of files)body.append(field, file, file.name);
|
|
18
|
+
const response = await fetch(url, {
|
|
19
|
+
method: 'POST',
|
|
20
|
+
body,
|
|
21
|
+
credentials: 'same-origin',
|
|
22
|
+
redirect: 'error',
|
|
23
|
+
signal
|
|
24
|
+
});
|
|
25
|
+
if (!response.ok) throw new Error(`The server answered ${response.status}${response.statusText === '' ? '' : ` ${response.statusText}`}.`);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export { postFiles };
|
|
29
|
+
//# sourceMappingURL=postFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postFiles.js","sources":["../../../file/postFiles.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/**\n * Sends files to an address as a `multipart/form-data` POST.\n *\n * Cookies are sent only to the page's own origin (`credentials: 'same-origin'`), so an upload to another\n * origin the host allowed carries no credentials. A redirect fails the upload rather than being followed,\n * because following one would send the files to an address the origin policy never checked.\n *\n * @param url The address, already checked by `resolveUploadTarget`.\n * @param field The multipart field name each file is appended under.\n * @param files The files to send.\n * @param signal Cancels the request.\n * @throws When the request fails or the server does not answer with a success status.\n */\nexport async function postFiles(url: string, field: string, files: File[], signal: AbortSignal): Promise<void> {\n const body = new FormData();\n for (const file of files) body.append(field, file, file.name);\n\n const response = await fetch(url, { method: 'POST', body, credentials: 'same-origin', redirect: 'error', signal });\n if (!response.ok) throw new Error(`The server answered ${response.status}${response.statusText === '' ? '' : ` ${response.statusText}`}.`);\n}\n"],"names":["postFiles","url","field","files","signal","body","FormData","file","append","name","response","fetch","method","credentials","redirect","ok","Error","status","statusText"],"mappings":"AAAA;AACA;AAEA;;;;;;;;;;;;IAaO,eAAeA,SAAAA,CAAUC,GAAW,EAAEC,KAAa,EAAEC,KAAa,EAAEC,MAAmB,EAAA;AAC1F,IAAA,MAAMC,OAAO,IAAIC,QAAAA,EAAAA;IACjB,KAAK,MAAMC,QAAQJ,KAAAA,CAAOE,IAAAA,CAAKG,MAAM,CAACN,KAAAA,EAAOK,IAAAA,EAAMA,IAAAA,CAAKE,IAAI,CAAA;IAE5D,MAAMC,QAAAA,GAAW,MAAMC,KAAAA,CAAMV,GAAAA,EAAK;QAAEW,MAAAA,EAAQ,MAAA;AAAQP,QAAAA,IAAAA;QAAMQ,WAAAA,EAAa,aAAA;QAAeC,QAAAA,EAAU,OAAA;AAASV,QAAAA;AAAO,KAAA,CAAA;IAChH,IAAI,CAACM,QAAAA,CAASK,EAAE,EAAE,MAAM,IAAIC,KAAAA,CAAM,CAAC,oBAAoB,EAAEN,QAAAA,CAASO,MAAM,CAAA,EAAGP,SAASQ,UAAU,KAAK,EAAA,GAAK,EAAA,GAAK,CAAC,CAAC,EAAER,QAAAA,CAASQ,UAAU,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAC7I;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveUploadTarget.d.ts","sourceRoot":"","sources":["../../../file/resolveUploadTarget.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA0B9C,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,SAAS,MAAM,EAAE,GAAG,YAAY,CAmB5I"}
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
/** A scheme (`https:`) or a protocol-relative prefix (`//host`): the address names its own host. */ const namesItsOwnHost = /^([a-z][a-z0-9+.-]*:|\/\/)/i;
|
|
4
|
+
/** Whitespace, control characters and backslashes, which browsers normalize in ways that disguise another host. */ const disguisesAHost = (address)=>Array.from(address).some((character)=>character <= ' ' || character === '\u007f' || character === '\\');
|
|
5
|
+
/** Resolved against, to read an address's own parts without depending on a page. It is never sent to. */ const placeholderOrigin = 'https://upload-target.invalid';
|
|
6
|
+
/**
|
|
7
|
+
* Checks the address an authored upload sends files to.
|
|
8
|
+
*
|
|
9
|
+
* The address comes from authored model data, so it is not trusted. By default an upload may only go to the
|
|
10
|
+
* origin the page was served from - a relative address, or an absolute one with the same origin. A host that
|
|
11
|
+
* needs another origin names it in `allowedOrigins` when it provides the upload handler. Whatever is accepted
|
|
12
|
+
* has the scheme `http:` or `https:`, carries no user information, and contains no whitespace, control
|
|
13
|
+
* characters or backslashes, because those are how an address is made to point somewhere other than where it
|
|
14
|
+
* reads.
|
|
15
|
+
*
|
|
16
|
+
* @param url The authored address, if any.
|
|
17
|
+
* @param pageOrigin The origin of the page, `undefined` where there is no page (server rendering).
|
|
18
|
+
* @param allowedOrigins The additional origins the host permits.
|
|
19
|
+
* @returns The address to send to, or why it cannot be used.
|
|
20
|
+
*/ function resolveUploadTarget(url, pageOrigin, allowedOrigins) {
|
|
21
|
+
if (url === undefined || url === '') return {
|
|
22
|
+
isValid: true,
|
|
23
|
+
url: undefined
|
|
24
|
+
};
|
|
25
|
+
if (disguisesAHost(url)) return refused('it contains whitespace, control characters or a backslash');
|
|
26
|
+
let resolved;
|
|
27
|
+
try {
|
|
28
|
+
resolved = new URL(url, placeholderOrigin);
|
|
29
|
+
} catch {
|
|
30
|
+
return refused('it is not a valid address');
|
|
31
|
+
}
|
|
32
|
+
if (resolved.protocol !== 'http:' && resolved.protocol !== 'https:') return refused(`the ${resolved.protocol} scheme is not allowed`);
|
|
33
|
+
if (resolved.username !== '' || resolved.password !== '') return refused('it carries user information');
|
|
34
|
+
if (!namesItsOwnHost.test(url)) return {
|
|
35
|
+
isValid: true,
|
|
36
|
+
url
|
|
37
|
+
};
|
|
38
|
+
const permitted = [
|
|
39
|
+
...pageOrigin === undefined ? [] : [
|
|
40
|
+
pageOrigin
|
|
41
|
+
],
|
|
42
|
+
...allowedOrigins.flatMap(originOf)
|
|
43
|
+
];
|
|
44
|
+
return permitted.includes(resolved.origin) ? {
|
|
45
|
+
isValid: true,
|
|
46
|
+
url: resolved.href
|
|
47
|
+
} : refused(`${resolved.origin} is not the origin of this page or one the host allows`);
|
|
48
|
+
}
|
|
49
|
+
function originOf(address) {
|
|
50
|
+
try {
|
|
51
|
+
return [
|
|
52
|
+
new URL(address).origin
|
|
53
|
+
];
|
|
54
|
+
} catch {
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function refused(reason) {
|
|
59
|
+
return {
|
|
60
|
+
isValid: false,
|
|
61
|
+
message: `The upload address is not allowed: ${reason}.`
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export { resolveUploadTarget };
|
|
66
|
+
//# sourceMappingURL=resolveUploadTarget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveUploadTarget.js","sources":["../../../file/resolveUploadTarget.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 { UploadTarget } from './UploadTarget';\n\n/** A scheme (`https:`) or a protocol-relative prefix (`//host`): the address names its own host. */\nconst namesItsOwnHost = /^([a-z][a-z0-9+.-]*:|\\/\\/)/i;\n\n/** Whitespace, control characters and backslashes, which browsers normalize in ways that disguise another host. */\nconst disguisesAHost = (address: string) => Array.from(address).some(character => character <= ' ' || character === '\\u007f' || character === '\\\\');\n\n/** Resolved against, to read an address's own parts without depending on a page. It is never sent to. */\nconst placeholderOrigin = 'https://upload-target.invalid';\n\n/**\n * Checks the address an authored upload sends files to.\n *\n * The address comes from authored model data, so it is not trusted. By default an upload may only go to the\n * origin the page was served from - a relative address, or an absolute one with the same origin. A host that\n * needs another origin names it in `allowedOrigins` when it provides the upload handler. Whatever is accepted\n * has the scheme `http:` or `https:`, carries no user information, and contains no whitespace, control\n * characters or backslashes, because those are how an address is made to point somewhere other than where it\n * reads.\n *\n * @param url The authored address, if any.\n * @param pageOrigin The origin of the page, `undefined` where there is no page (server rendering).\n * @param allowedOrigins The additional origins the host permits.\n * @returns The address to send to, or why it cannot be used.\n */\nexport function resolveUploadTarget(url: string | undefined, pageOrigin: string | undefined, allowedOrigins: readonly string[]): UploadTarget {\n if (url === undefined || url === '') return { isValid: true, url: undefined };\n if (disguisesAHost(url)) return refused('it contains whitespace, control characters or a backslash');\n\n let resolved: URL;\n try {\n resolved = new URL(url, placeholderOrigin);\n } catch {\n return refused('it is not a valid address');\n }\n\n if (resolved.protocol !== 'http:' && resolved.protocol !== 'https:') return refused(`the ${resolved.protocol} scheme is not allowed`);\n if (resolved.username !== '' || resolved.password !== '') return refused('it carries user information');\n if (!namesItsOwnHost.test(url)) return { isValid: true, url };\n\n const permitted = [...(pageOrigin === undefined ? [] : [pageOrigin]), ...allowedOrigins.flatMap(originOf)];\n return permitted.includes(resolved.origin)\n ? { isValid: true, url: resolved.href }\n : refused(`${resolved.origin} is not the origin of this page or one the host allows`);\n}\n\nfunction originOf(address: string): string[] {\n try {\n return [new URL(address).origin];\n } catch {\n return [];\n }\n}\n\nfunction refused(reason: string): UploadTarget {\n return { isValid: false, message: `The upload address is not allowed: ${reason}.` };\n}\n"],"names":["namesItsOwnHost","disguisesAHost","address","Array","from","some","character","placeholderOrigin","resolveUploadTarget","url","pageOrigin","allowedOrigins","undefined","isValid","refused","resolved","URL","protocol","username","password","test","permitted","flatMap","originOf","includes","origin","href","reason","message"],"mappings":"AAAA;AACA;AAIA,qGACA,MAAMA,eAAAA,GAAkB,6BAAA;AAExB,oHACA,MAAMC,cAAAA,GAAiB,CAACC,OAAAA,GAAoBC,MAAMC,IAAI,CAACF,OAAAA,CAAAA,CAASG,IAAI,CAACC,CAAAA,SAAAA,GAAaA,aAAa,GAAA,IAAOA,SAAAA,KAAc,YAAYA,SAAAA,KAAc,IAAA,CAAA;AAE9I,0GACA,MAAMC,iBAAAA,GAAoB,+BAAA;AAE1B;;;;;;;;;;;;;;AAcC,IACM,SAASC,mBAAAA,CAAoBC,GAAuB,EAAEC,UAA8B,EAAEC,cAAiC,EAAA;AAC1H,IAAA,IAAIF,GAAAA,KAAQG,SAAAA,IAAaH,GAAAA,KAAQ,EAAA,EAAI,OAAO;QAAEI,OAAAA,EAAS,IAAA;QAAMJ,GAAAA,EAAKG;AAAU,KAAA;IAC5E,IAAIX,cAAAA,CAAeQ,GAAAA,CAAAA,EAAM,OAAOK,OAAAA,CAAQ,2DAAA,CAAA;IAExC,IAAIC,QAAAA;IACJ,IAAI;QACAA,QAAAA,GAAW,IAAIC,IAAIP,GAAAA,EAAKF,iBAAAA,CAAAA;AAC5B,IAAA,CAAA,CAAE,OAAM;AACJ,QAAA,OAAOO,OAAAA,CAAQ,2BAAA,CAAA;AACnB,IAAA;AAEA,IAAA,IAAIC,SAASE,QAAQ,KAAK,OAAA,IAAWF,QAAAA,CAASE,QAAQ,KAAK,QAAA,EAAU,OAAOH,OAAAA,CAAQ,CAAC,IAAI,EAAEC,SAASE,QAAQ,CAAC,sBAAsB,CAAC,CAAA;IACpI,IAAIF,QAAAA,CAASG,QAAQ,KAAK,EAAA,IAAMH,SAASI,QAAQ,KAAK,EAAA,EAAI,OAAOL,OAAAA,CAAQ,6BAAA,CAAA;AACzE,IAAA,IAAI,CAACd,eAAAA,CAAgBoB,IAAI,CAACX,MAAM,OAAO;QAAEI,OAAAA,EAAS,IAAA;AAAMJ,QAAAA;AAAI,KAAA;AAE5D,IAAA,MAAMY,SAAAA,GAAY;WAAKX,UAAAA,KAAeE,SAAAA,GAAY,EAAE,GAAG;AAACF,YAAAA;AAAW,SAAA;AAAMC,QAAAA,GAAAA,cAAAA,CAAeW,OAAO,CAACC,QAAAA;AAAU,KAAA;AAC1G,IAAA,OAAOF,SAAAA,CAAUG,QAAQ,CAACT,QAAAA,CAASU,MAAM,CAAA,GACnC;QAAEZ,OAAAA,EAAS,IAAA;AAAMJ,QAAAA,GAAAA,EAAKM,SAASW;AAAK,KAAA,GACpCZ,QAAQ,CAAA,EAAGC,QAAAA,CAASU,MAAM,CAAC,sDAAsD,CAAC,CAAA;AAC5F;AAEA,SAASF,SAASrB,OAAe,EAAA;IAC7B,IAAI;QACA,OAAO;YAAC,IAAIc,GAAAA,CAAId,SAASuB;AAAO,SAAA;AACpC,IAAA,CAAA,CAAE,OAAM;AACJ,QAAA,OAAO,EAAE;AACb,IAAA;AACJ;AAEA,SAASX,QAAQa,MAAc,EAAA;IAC3B,OAAO;QAAEd,OAAAA,EAAS,KAAA;AAAOe,QAAAA,OAAAA,EAAS,CAAC,mCAAmC,EAAED,MAAAA,CAAO,CAAC;AAAE,KAAA;AACtF;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { FileUploadHandler } from './FileUploadHandler';
|
|
2
|
+
import { UploadStatus } from './UploadStatus';
|
|
3
|
+
export interface UploadSession {
|
|
4
|
+
busy: boolean;
|
|
5
|
+
status: UploadStatus | undefined;
|
|
6
|
+
setStatus(status: UploadStatus | undefined): void;
|
|
7
|
+
upload(files: File[]): Promise<boolean>;
|
|
8
|
+
}
|
|
9
|
+
export declare function useUploadSession(handler: FileUploadHandler | undefined, url: string | undefined, field: string): UploadSession;
|
|
10
|
+
//# sourceMappingURL=useUploadSession.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUploadSession.d.ts","sourceRoot":"","sources":["../../../file/useUploadSession.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAI9C,MAAM,WAAW,aAAa;IAE1B,IAAI,EAAE,OAAO,CAAC;IAGd,MAAM,EAAE,YAAY,GAAG,SAAS,CAAC;IACjC,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAAC;IAQlD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3C;AAaD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CA6B9H"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { useRef, useState, useEffect, useCallback } from 'react';
|
|
2
|
+
import { postFiles } from './postFiles.js';
|
|
3
|
+
|
|
4
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
5
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
6
|
+
/**
|
|
7
|
+
* Runs one upload at a time for a control, through the host's handler or a POST to the checked address.
|
|
8
|
+
*
|
|
9
|
+
* Starting an upload while one runs is ignored rather than queued, so a double click cannot send the same
|
|
10
|
+
* files twice. Every failure ends in a visible `status`; none escapes as an unhandled rejection. An upload
|
|
11
|
+
* still running when the control unmounts is cancelled.
|
|
12
|
+
*
|
|
13
|
+
* @param handler The host's upload effect, if it owns the effect.
|
|
14
|
+
* @param url The checked address, if one was authored.
|
|
15
|
+
* @param field The multipart field name used when the control posts the files itself.
|
|
16
|
+
*/ function useUploadSession(handler, url, field) {
|
|
17
|
+
const running = useRef(undefined);
|
|
18
|
+
const [busy, setBusy] = useState(false);
|
|
19
|
+
const [status, setStatus] = useState(undefined);
|
|
20
|
+
useEffect(()=>()=>running.current?.abort(), []);
|
|
21
|
+
const upload = useCallback(async (files)=>{
|
|
22
|
+
if (running.current !== undefined) return false;
|
|
23
|
+
const controller = new AbortController();
|
|
24
|
+
running.current = controller;
|
|
25
|
+
setBusy(true);
|
|
26
|
+
setStatus(undefined);
|
|
27
|
+
try {
|
|
28
|
+
if (handler !== undefined) await handler(files, url);
|
|
29
|
+
else if (url !== undefined) await postFiles(url, field, files, controller.signal);
|
|
30
|
+
else throw new Error('There is nowhere to send the files.');
|
|
31
|
+
setStatus({
|
|
32
|
+
kind: 'success',
|
|
33
|
+
text: `${files.length} file${files.length === 1 ? '' : 's'} uploaded.`
|
|
34
|
+
});
|
|
35
|
+
return true;
|
|
36
|
+
} catch (error) {
|
|
37
|
+
if (!controller.signal.aborted) setStatus({
|
|
38
|
+
kind: 'error',
|
|
39
|
+
text: `Upload failed: ${error instanceof Error ? error.message : String(error)}`
|
|
40
|
+
});
|
|
41
|
+
return false;
|
|
42
|
+
} finally{
|
|
43
|
+
running.current = undefined;
|
|
44
|
+
setBusy(false);
|
|
45
|
+
}
|
|
46
|
+
}, [
|
|
47
|
+
handler,
|
|
48
|
+
url,
|
|
49
|
+
field
|
|
50
|
+
]);
|
|
51
|
+
return {
|
|
52
|
+
busy,
|
|
53
|
+
status,
|
|
54
|
+
setStatus,
|
|
55
|
+
upload
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { useUploadSession };
|
|
60
|
+
//# sourceMappingURL=useUploadSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUploadSession.js","sources":["../../../file/useUploadSession.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 { useCallback, useEffect, useRef, useState } from 'react';\nimport { FileUploadHandler } from './FileUploadHandler';\nimport { UploadStatus } from './UploadStatus';\nimport { postFiles } from './postFiles';\n\n/** The state of the upload in flight, if any, and the action that starts one. */\nexport interface UploadSession {\n /** Whether an upload is running. */\n busy: boolean;\n\n /** The last result, or `undefined` before the first upload and after a new selection. */\n status: UploadStatus | undefined;\n setStatus(status: UploadStatus | undefined): void;\n\n /**\n * Sends the files, unless an upload is already running.\n *\n * @returns Whether the files were sent, so the caller knows to clear its selection. A failure is reported\n * through `status` and returns `false`: the selection stays so it can be retried.\n */\n upload(files: File[]): Promise<boolean>;\n}\n\n/**\n * Runs one upload at a time for a control, through the host's handler or a POST to the checked address.\n *\n * Starting an upload while one runs is ignored rather than queued, so a double click cannot send the same\n * files twice. Every failure ends in a visible `status`; none escapes as an unhandled rejection. An upload\n * still running when the control unmounts is cancelled.\n *\n * @param handler The host's upload effect, if it owns the effect.\n * @param url The checked address, if one was authored.\n * @param field The multipart field name used when the control posts the files itself.\n */\nexport function useUploadSession(handler: FileUploadHandler | undefined, url: string | undefined, field: string): UploadSession {\n const running = useRef<AbortController | undefined>(undefined);\n const [busy, setBusy] = useState(false);\n const [status, setStatus] = useState<UploadStatus | undefined>(undefined);\n\n useEffect(() => () => running.current?.abort(), []);\n\n const upload = useCallback(async (files: File[]): Promise<boolean> => {\n if (running.current !== undefined) return false;\n const controller = new AbortController();\n running.current = controller;\n setBusy(true);\n setStatus(undefined);\n try {\n if (handler !== undefined) await handler(files, url);\n else if (url !== undefined) await postFiles(url, field, files, controller.signal);\n else throw new Error('There is nowhere to send the files.');\n setStatus({ kind: 'success', text: `${files.length} file${files.length === 1 ? '' : 's'} uploaded.` });\n return true;\n } catch (error) {\n if (!controller.signal.aborted) setStatus({ kind: 'error', text: `Upload failed: ${error instanceof Error ? error.message : String(error)}` });\n return false;\n } finally {\n running.current = undefined;\n setBusy(false);\n }\n }, [handler, url, field]);\n\n return { busy, status, setStatus, upload };\n}\n"],"names":["useUploadSession","handler","url","field","running","useRef","undefined","busy","setBusy","useState","status","setStatus","useEffect","current","abort","upload","useCallback","files","controller","AbortController","postFiles","signal","Error","kind","text","length","error","aborted","message","String"],"mappings":";;;AAAA;AACA;AAyBA;;;;;;;;;;AAUC,IACM,SAASA,gBAAAA,CAAiBC,OAAsC,EAAEC,GAAuB,EAAEC,KAAa,EAAA;AAC3G,IAAA,MAAMC,UAAUC,MAAAA,CAAoCC,SAAAA,CAAAA;AACpD,IAAA,MAAM,CAACC,IAAAA,EAAMC,OAAAA,CAAQ,GAAGC,QAAAA,CAAS,KAAA,CAAA;AACjC,IAAA,MAAM,CAACC,MAAAA,EAAQC,SAAAA,CAAU,GAAGF,QAAAA,CAAmCH,SAAAA,CAAAA;AAE/DM,IAAAA,SAAAA,CAAU,IAAM,IAAMR,OAAAA,CAAQS,OAAO,EAAEC,SAAS,EAAE,CAAA;IAElD,MAAMC,MAAAA,GAASC,YAAY,OAAOC,KAAAA,GAAAA;AAC9B,QAAA,IAAIb,OAAAA,CAAQS,OAAO,KAAKP,SAAAA,EAAW,OAAO,KAAA;AAC1C,QAAA,MAAMY,aAAa,IAAIC,eAAAA,EAAAA;AACvBf,QAAAA,OAAAA,CAAQS,OAAO,GAAGK,UAAAA;QAClBV,OAAAA,CAAQ,IAAA,CAAA;QACRG,SAAAA,CAAUL,SAAAA,CAAAA;QACV,IAAI;AACA,YAAA,IAAIL,OAAAA,KAAYK,SAAAA,EAAW,MAAML,OAAAA,CAAQgB,KAAAA,EAAOf,GAAAA,CAAAA;iBAC3C,IAAIA,GAAAA,KAAQI,WAAW,MAAMc,SAAAA,CAAUlB,KAAKC,KAAAA,EAAOc,KAAAA,EAAOC,WAAWG,MAAM,CAAA;AAC3E,iBAAA,MAAM,IAAIC,KAAAA,CAAM,qCAAA,CAAA;YACrBX,SAAAA,CAAU;gBAAEY,IAAAA,EAAM,SAAA;AAAWC,gBAAAA,IAAAA,EAAM,CAAA,EAAGP,KAAAA,CAAMQ,MAAM,CAAC,KAAK,EAAER,KAAAA,CAAMQ,MAAM,KAAK,CAAA,GAAI,EAAA,GAAK,GAAA,CAAI,UAAU;AAAE,aAAA,CAAA;YACpG,OAAO,IAAA;AACX,QAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACZ,YAAA,IAAI,CAACR,UAAAA,CAAWG,MAAM,CAACM,OAAO,EAAEhB,SAAAA,CAAU;gBAAEY,IAAAA,EAAM,OAAA;gBAASC,IAAAA,EAAM,CAAC,eAAe,EAAEE,KAAAA,YAAiBJ,QAAQI,KAAAA,CAAME,OAAO,GAAGC,MAAAA,CAAOH,KAAAA,CAAAA,CAAAA;AAAS,aAAA,CAAA;YAC5I,OAAO,KAAA;QACX,CAAA,QAAU;AACNtB,YAAAA,OAAAA,CAAQS,OAAO,GAAGP,SAAAA;YAClBE,OAAAA,CAAQ,KAAA,CAAA;AACZ,QAAA;IACJ,CAAA,EAAG;AAACP,QAAAA,OAAAA;AAASC,QAAAA,GAAAA;AAAKC,QAAAA;AAAM,KAAA,CAAA;IAExB,OAAO;AAAEI,QAAAA,IAAAA;AAAMG,QAAAA,MAAAA;AAAQC,QAAAA,SAAAA;AAAWI,QAAAA;AAAO,KAAA;AAC7C;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormGallery.stories.d.ts","sourceRoot":"","sources":["../../../form/FormGallery.stories.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAIvD,QAAA,MAAM,IAAI;;;;;QAKF,MAAM;QACN,IAAI;YAAI,WAAW;gBAAI,SAAS;;;;CAEC,CAAC;eAE3B,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAGnC,eAAO,MAAM,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"FormGallery.stories.d.ts","sourceRoot":"","sources":["../../../form/FormGallery.stories.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAIvD,QAAA,MAAM,IAAI;;;;;QAKF,MAAM;QACN,IAAI;YAAI,WAAW;gBAAI,SAAS;;;;CAEC,CAAC;eAE3B,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAGnC,eAAO,MAAM,OAAO,EAAE,KAuCrB,CAAC"}
|
|
@@ -16,6 +16,7 @@ export const Gallery = {
|
|
|
16
16
|
element: sceneGallery('gallery', [
|
|
17
17
|
sceneComponent('inputText', 'inputText', { placeholder: 'Name' }),
|
|
18
18
|
sceneComponent('inputTextarea', 'inputTextarea', { placeholder: 'Notes', rows: 3 }),
|
|
19
|
+
sceneComponent('editor', 'editor', { value: '<p>Write a <strong>rich</strong> note.</p>' }),
|
|
19
20
|
sceneComponent('inputNumber', 'inputNumber', { value: 42, showButtons: true }),
|
|
20
21
|
sceneComponent('password', 'password', { placeholder: 'Password' }),
|
|
21
22
|
sceneComponent('floatLabel', 'floatLabel', { label: 'Project name' }),
|
|
@@ -25,6 +26,14 @@ export const Gallery = {
|
|
|
25
26
|
sceneComponent('listBox', 'listBox', { options: ['Daily', 'Weekly', 'Monthly'] }),
|
|
26
27
|
sceneComponent('selectButton', 'selectButton', { options: ['Day', 'Week', 'Month'], value: 'Week' }),
|
|
27
28
|
sceneComponent('checkbox', 'checkbox', { label: 'Notify me', checked: true }),
|
|
29
|
+
sceneComponent('multiStateCheckbox', 'multiStateCheckbox', {
|
|
30
|
+
value: null,
|
|
31
|
+
options: [
|
|
32
|
+
{ label: 'Approved', value: 'approved', icon: 'pi pi-check' },
|
|
33
|
+
{ label: 'Rejected', value: 'rejected', icon: 'pi pi-times' },
|
|
34
|
+
],
|
|
35
|
+
ariaLabel: 'Review state',
|
|
36
|
+
}),
|
|
28
37
|
sceneComponent('radioButton', 'radioButton', { options: ['Email', 'SMS'], value: 'Email' }),
|
|
29
38
|
sceneComponent('toggleSwitch', 'toggleSwitch', { label: 'Enabled', checked: true }),
|
|
30
39
|
sceneComponent('slider', 'slider', { value: 35 }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormGallery.stories.js","sourceRoot":"","sources":["../../../form/FormGallery.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhE,MAAM,IAAI,GAAG;IACT,KAAK,EAAE,iBAAiB;IACxB,SAAS,EAAE,gBAAgB;IAC3B,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,UAAU,EAAE;QACR,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,2PAA2P,EAAE,EAAE;KACpS;CACoC,CAAC;AAE1C,eAAe,IAAI,CAAC;AAKpB,MAAM,CAAC,MAAM,OAAO,GAAU;IAC1B,IAAI,EAAE;QACF,OAAO,EAAE,YAAY,CAAC,SAAS,EAAE;YAC7B,cAAc,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;YACjE,cAAc,CAAC,eAAe,EAAE,eAAe,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACnF,cAAc,CAAC,aAAa,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YAC9E,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;YACnE,cAAc,CAAC,YAAY,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;YACrE,cAAc,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;YACzF,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;YAC/G,cAAc,CAAC,aAAa,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;YACrH,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;YACjF,cAAc,CAAC,cAAc,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YACpG,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC7E,cAAc,CAAC,aAAa,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YAC3F,cAAc,CAAC,cAAc,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACnF,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YACjD,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YAChD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YAC7C,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;YAC/D,cAAc,CAAC,aAAa,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAClE,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;YAC9D,cAAc,CAAC,cAAc,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAChH,cAAc,CAAC,YAAY,EAAE,YAAY,EAAE;gBACvC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;aAChE,CAAC;SACL,CAAC;QACF,QAAQ,EAAE,oBAAoB;QAC9B,cAAc,EAAE,GAAG,EAAE,CAAC,SAAS;KAClC;CACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"FormGallery.stories.js","sourceRoot":"","sources":["../../../form/FormGallery.stories.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { MultiStateOption } from './MultiStateOption';
|
|
2
|
+
export interface MultiStateGlyphProps {
|
|
3
|
+
state: MultiStateOption | undefined;
|
|
4
|
+
isEmpty: boolean;
|
|
5
|
+
isInactive: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function MultiStateGlyph({ state, isEmpty, isInactive }: MultiStateGlyphProps): import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=MultiStateGlyph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiStateGlyph.d.ts","sourceRoot":"","sources":["../../../form/MultiStateGlyph.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IAEjC,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAGpC,OAAO,EAAE,OAAO,CAAC;IAGjB,UAAU,EAAE,OAAO,CAAC;CACvB;AAQD,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,oBAAoB,+BAkBnF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { SceneIcon } from '@cratis/scene.react';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The box a multi-state checkbox draws, themed with the PrimeReact checkbox tokens (`--p-checkbox-*`), so
|
|
6
|
+
* it follows the active Scene theme and looks like its sibling `checkbox`. It holds the state's icon - a
|
|
7
|
+
* PrimeIcons class or a qualified icon reference - or a check mark when the state has no icon of its own.
|
|
8
|
+
* An empty state draws only its own icon, if it has one. It is decorative: the state is announced through the control's text, not through this glyph.
|
|
9
|
+
*/ function MultiStateGlyph({ state, isEmpty, isInactive }) {
|
|
10
|
+
const icon = state?.icon;
|
|
11
|
+
return /*#__PURE__*/ jsx("span", {
|
|
12
|
+
"aria-hidden": "true",
|
|
13
|
+
"data-scene-part": "glyph",
|
|
14
|
+
style: {
|
|
15
|
+
display: 'inline-flex',
|
|
16
|
+
alignItems: 'center',
|
|
17
|
+
justifyContent: 'center',
|
|
18
|
+
flexShrink: 0,
|
|
19
|
+
boxSizing: 'border-box',
|
|
20
|
+
width: 'var(--p-checkbox-width, 1.125rem)',
|
|
21
|
+
height: 'var(--p-checkbox-height, 1.125rem)',
|
|
22
|
+
borderRadius: 'var(--p-checkbox-border-radius, 4px)',
|
|
23
|
+
border: `1px solid ${isEmpty ? 'var(--p-checkbox-border-color, currentColor)' : 'var(--p-checkbox-checked-border-color, currentColor)'}`,
|
|
24
|
+
backgroundColor: isEmpty ? 'var(--p-checkbox-background, transparent)' : 'var(--p-checkbox-checked-background, currentColor)',
|
|
25
|
+
color: glyphColor(isEmpty, isInactive),
|
|
26
|
+
fontSize: 'var(--p-checkbox-icon-size, 0.75rem)'
|
|
27
|
+
},
|
|
28
|
+
children: icon === undefined ? !isEmpty && /*#__PURE__*/ jsx(CheckMark, {}) : typeof icon === 'string' ? /*#__PURE__*/ jsx("i", {
|
|
29
|
+
className: icon
|
|
30
|
+
}) : /*#__PURE__*/ jsx(SceneIcon, {
|
|
31
|
+
reference: icon,
|
|
32
|
+
size: "var(--p-checkbox-icon-size, 0.75rem)"
|
|
33
|
+
})
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function glyphColor(isEmpty, isInactive) {
|
|
37
|
+
if (isInactive) return 'var(--p-checkbox-icon-disabled-color, currentColor)';
|
|
38
|
+
return isEmpty ? 'var(--p-checkbox-icon-color, currentColor)' : 'var(--p-checkbox-icon-checked-color, Canvas)';
|
|
39
|
+
}
|
|
40
|
+
function CheckMark() {
|
|
41
|
+
return /*#__PURE__*/ jsx("svg", {
|
|
42
|
+
viewBox: "0 0 12 12",
|
|
43
|
+
width: "1em",
|
|
44
|
+
height: "1em",
|
|
45
|
+
fill: "none",
|
|
46
|
+
stroke: "currentColor",
|
|
47
|
+
strokeWidth: "2",
|
|
48
|
+
strokeLinecap: "round",
|
|
49
|
+
strokeLinejoin: "round",
|
|
50
|
+
children: /*#__PURE__*/ jsx("path", {
|
|
51
|
+
d: "M2 6.5 5 9.5 10 3"
|
|
52
|
+
})
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export { MultiStateGlyph };
|
|
57
|
+
//# sourceMappingURL=MultiStateGlyph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiStateGlyph.js","sources":["../../../form/MultiStateGlyph.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 { SceneIcon } from '@cratis/scene.react';\nimport { MultiStateOption } from './MultiStateOption';\n\nexport interface MultiStateGlyphProps {\n /** The state being shown. */\n state: MultiStateOption | undefined;\n\n /** Whether the state is the empty (`null`) state, drawn as an empty box. */\n isEmpty: boolean;\n\n /** Whether the control is disabled or read only. */\n isInactive: boolean;\n}\n\n/**\n * The box a multi-state checkbox draws, themed with the PrimeReact checkbox tokens (`--p-checkbox-*`), so\n * it follows the active Scene theme and looks like its sibling `checkbox`. It holds the state's icon - a\n * PrimeIcons class or a qualified icon reference - or a check mark when the state has no icon of its own.\n * An empty state draws only its own icon, if it has one. It is decorative: the state is announced through the control's text, not through this glyph.\n */\nexport function MultiStateGlyph({ state, isEmpty, isInactive }: MultiStateGlyphProps) {\n const icon = state?.icon;\n return (\n <span\n aria-hidden='true'\n data-scene-part='glyph'\n style={{\n display: 'inline-flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0, boxSizing: 'border-box',\n width: 'var(--p-checkbox-width, 1.125rem)', height: 'var(--p-checkbox-height, 1.125rem)',\n borderRadius: 'var(--p-checkbox-border-radius, 4px)',\n border: `1px solid ${isEmpty ? 'var(--p-checkbox-border-color, currentColor)' : 'var(--p-checkbox-checked-border-color, currentColor)'}`,\n backgroundColor: isEmpty ? 'var(--p-checkbox-background, transparent)' : 'var(--p-checkbox-checked-background, currentColor)',\n color: glyphColor(isEmpty, isInactive),\n fontSize: 'var(--p-checkbox-icon-size, 0.75rem)',\n }}>\n {icon === undefined ? !isEmpty && <CheckMark /> : typeof icon === 'string' ? <i className={icon} /> : <SceneIcon reference={icon} size='var(--p-checkbox-icon-size, 0.75rem)' />}\n </span>\n );\n}\n\nfunction glyphColor(isEmpty: boolean, isInactive: boolean): string {\n if (isInactive) return 'var(--p-checkbox-icon-disabled-color, currentColor)';\n return isEmpty ? 'var(--p-checkbox-icon-color, currentColor)' : 'var(--p-checkbox-icon-checked-color, Canvas)';\n}\n\nfunction CheckMark() {\n return (\n <svg viewBox='0 0 12 12' width='1em' height='1em' fill='none' stroke='currentColor' strokeWidth='2' strokeLinecap='round' strokeLinejoin='round'>\n <path d='M2 6.5 5 9.5 10 3' />\n </svg>\n );\n}\n"],"names":["MultiStateGlyph","state","isEmpty","isInactive","icon","_jsx","span","aria-hidden","data-scene-part","style","display","alignItems","justifyContent","flexShrink","boxSizing","width","height","borderRadius","border","backgroundColor","color","glyphColor","fontSize","undefined","CheckMark","i","className","SceneIcon","reference","size","svg","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","path","d"],"mappings":";;;AAiBA;;;;;IAMO,SAASA,eAAAA,CAAgB,EAAEC,KAAK,EAAEC,OAAO,EAAEC,UAAU,EAAwB,EAAA;AAChF,IAAA,MAAMC,OAAOH,KAAAA,EAAOG,IAAAA;AACpB,IAAA,qBACIC,GAAA,CAACC,MAAAA,EAAAA;QACGC,aAAAA,EAAY,MAAA;QACZC,iBAAAA,EAAgB,OAAA;QAChBC,KAAAA,EAAO;YACHC,OAAAA,EAAS,aAAA;YAAeC,UAAAA,EAAY,QAAA;YAAUC,cAAAA,EAAgB,QAAA;YAAUC,UAAAA,EAAY,CAAA;YAAGC,SAAAA,EAAW,YAAA;YAClGC,KAAAA,EAAO,mCAAA;YAAqCC,MAAAA,EAAQ,oCAAA;YACpDC,YAAAA,EAAc,sCAAA;AACdC,YAAAA,MAAAA,EAAQ,CAAC,UAAU,EAAEhB,OAAAA,GAAU,iDAAiD,sDAAA,CAAA,CAAwD;AACxIiB,YAAAA,eAAAA,EAAiBjB,UAAU,2CAAA,GAA8C,oDAAA;AACzEkB,YAAAA,KAAAA,EAAOC,WAAWnB,OAAAA,EAASC,UAAAA,CAAAA;YAC3BmB,QAAAA,EAAU;AACd,SAAA;kBACClB,IAAAA,KAASmB,SAAAA,GAAY,CAACrB,OAAAA,kBAAWG,GAAA,CAACmB,iBAAe,OAAOpB,IAAAA,KAAS,yBAAWC,GAAA,CAACoB,GAAAA,EAAAA;YAAEC,SAAAA,EAAWtB;2BAAWC,GAAA,CAACsB,SAAAA,EAAAA;YAAUC,SAAAA,EAAWxB,IAAAA;YAAMyB,IAAAA,EAAK;;;AAGnJ;AAEA,SAASR,UAAAA,CAAWnB,OAAgB,EAAEC,UAAmB,EAAA;AACrD,IAAA,IAAIA,YAAY,OAAO,qDAAA;AACvB,IAAA,OAAOD,UAAU,4CAAA,GAA+C,8CAAA;AACpE;AAEA,SAASsB,SAAAA,GAAAA;AACL,IAAA,qBACInB,GAAA,CAACyB,KAAAA,EAAAA;QAAIC,OAAAA,EAAQ,WAAA;QAAYhB,KAAAA,EAAM,KAAA;QAAMC,MAAAA,EAAO,KAAA;QAAMgB,IAAAA,EAAK,MAAA;QAAOC,MAAAA,EAAO,cAAA;QAAeC,WAAAA,EAAY,GAAA;QAAIC,aAAAA,EAAc,OAAA;QAAQC,cAAAA,EAAe,OAAA;AACrI,QAAA,QAAA,gBAAA/B,GAAA,CAACgC,MAAAA,EAAAA;YAAKC,CAAAA,EAAE;;;AAGpB;;"}
|