@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.
Files changed (388) hide show
  1. package/.storybook/preview.tsx +8 -1
  2. package/EnumerationResolution.ts +7 -0
  3. package/README.md +22 -12
  4. package/data/DataGallery.stories.tsx +6 -0
  5. package/data/DataScrollerRow.tsx +35 -0
  6. package/data/PrimeDataScroller.tsx +84 -0
  7. package/data/PrimeTreeTable.tsx +145 -0
  8. package/data/TreeTableCheckState.ts +9 -0
  9. package/data/TreeTableRow.ts +22 -0
  10. package/data/TreeTableRowView.tsx +86 -0
  11. package/data/TreeTableSelectionMode.ts +10 -0
  12. package/data/checkboxSelection.ts +92 -0
  13. package/data/index.ts +4 -0
  14. package/data/isSerializedLegacyElement.ts +30 -0
  15. package/data/readableValue.ts +32 -0
  16. package/data/selectionKeysOf.ts +40 -0
  17. package/data/treeTableRows.ts +32 -0
  18. package/data/useIncrementalLoad.ts +36 -0
  19. package/data/useLoadOnReach.ts +31 -0
  20. package/data/useTreeGridNavigation.ts +81 -0
  21. package/dist/cjs/data/DataScrollerRow.js +50 -0
  22. package/dist/cjs/data/DataScrollerRow.js.map +1 -0
  23. package/dist/cjs/data/PrimeDataScroller.js +120 -0
  24. package/dist/cjs/data/PrimeDataScroller.js.map +1 -0
  25. package/dist/cjs/data/PrimeTreeTable.js +217 -0
  26. package/dist/cjs/data/PrimeTreeTable.js.map +1 -0
  27. package/dist/cjs/data/TreeTableCheckState.js +13 -0
  28. package/dist/cjs/data/TreeTableCheckState.js.map +1 -0
  29. package/dist/cjs/data/TreeTableRowView.js +76 -0
  30. package/dist/cjs/data/TreeTableRowView.js.map +1 -0
  31. package/dist/cjs/data/TreeTableSelectionMode.js +14 -0
  32. package/dist/cjs/data/TreeTableSelectionMode.js.map +1 -0
  33. package/dist/cjs/data/checkboxSelection.js +88 -0
  34. package/dist/cjs/data/checkboxSelection.js.map +1 -0
  35. package/dist/cjs/data/isSerializedLegacyElement.js +30 -0
  36. package/dist/cjs/data/isSerializedLegacyElement.js.map +1 -0
  37. package/dist/cjs/data/readableValue.js +31 -0
  38. package/dist/cjs/data/readableValue.js.map +1 -0
  39. package/dist/cjs/data/selectionKeysOf.js +40 -0
  40. package/dist/cjs/data/selectionKeysOf.js.map +1 -0
  41. package/dist/cjs/data/treeTableRows.js +42 -0
  42. package/dist/cjs/data/treeTableRows.js.map +1 -0
  43. package/dist/cjs/data/useIncrementalLoad.js +46 -0
  44. package/dist/cjs/data/useIncrementalLoad.js.map +1 -0
  45. package/dist/cjs/data/useLoadOnReach.js +42 -0
  46. package/dist/cjs/data/useLoadOnReach.js.map +1 -0
  47. package/dist/cjs/data/useTreeGridNavigation.js +75 -0
  48. package/dist/cjs/data/useTreeGridNavigation.js.map +1 -0
  49. package/dist/cjs/editor/PrimeEditor.js +96 -0
  50. package/dist/cjs/editor/PrimeEditor.js.map +1 -0
  51. package/dist/cjs/editor/QuillLoaderContext.js +10 -0
  52. package/dist/cjs/editor/QuillLoaderContext.js.map +1 -0
  53. package/dist/cjs/editor/QuillLoaderProvider.js +21 -0
  54. package/dist/cjs/editor/QuillLoaderProvider.js.map +1 -0
  55. package/dist/cjs/editor/applyHtml.js +25 -0
  56. package/dist/cjs/editor/applyHtml.js.map +1 -0
  57. package/dist/cjs/editor/characterCount.js +10 -0
  58. package/dist/cjs/editor/characterCount.js.map +1 -0
  59. package/dist/cjs/editor/htmlToPlainText.js +101 -0
  60. package/dist/cjs/editor/htmlToPlainText.js.map +1 -0
  61. package/dist/cjs/editor/renderSafeNodes.js +35 -0
  62. package/dist/cjs/editor/renderSafeNodes.js.map +1 -0
  63. package/dist/cjs/editor/safeUrls.js +44 -0
  64. package/dist/cjs/editor/safeUrls.js.map +1 -0
  65. package/dist/cjs/editor/sanitizeHtml.js +140 -0
  66. package/dist/cjs/editor/sanitizeHtml.js.map +1 -0
  67. package/dist/cjs/editor/serializeSafeNodes.js +33 -0
  68. package/dist/cjs/editor/serializeSafeNodes.js.map +1 -0
  69. package/dist/cjs/editor/toolbarLayout.js +35 -0
  70. package/dist/cjs/editor/toolbarLayout.js.map +1 -0
  71. package/dist/cjs/editor/useQuillEditor.js +137 -0
  72. package/dist/cjs/editor/useQuillEditor.js.map +1 -0
  73. package/dist/cjs/file/FileUploadContext.js +13 -0
  74. package/dist/cjs/file/FileUploadContext.js.map +1 -0
  75. package/dist/cjs/file/FileUploadHandlerProvider.js +25 -0
  76. package/dist/cjs/file/FileUploadHandlerProvider.js.map +1 -0
  77. package/dist/cjs/file/FileUploadMode.js +13 -0
  78. package/dist/cjs/file/FileUploadMode.js.map +1 -0
  79. package/dist/cjs/file/PrimeFileUpload.js +161 -0
  80. package/dist/cjs/file/PrimeFileUpload.js.map +1 -0
  81. package/dist/cjs/file/postFiles.js +31 -0
  82. package/dist/cjs/file/postFiles.js.map +1 -0
  83. package/dist/cjs/file/resolveUploadTarget.js +68 -0
  84. package/dist/cjs/file/resolveUploadTarget.js.map +1 -0
  85. package/dist/cjs/file/useUploadSession.js +62 -0
  86. package/dist/cjs/file/useUploadSession.js.map +1 -0
  87. package/dist/cjs/index.js +32 -0
  88. package/dist/cjs/index.js.map +1 -1
  89. package/dist/cjs/legacyEnumerationChoices.js +39 -0
  90. package/dist/cjs/legacyEnumerationChoices.js.map +1 -0
  91. package/dist/cjs/loadQuill/index.js +22 -0
  92. package/dist/cjs/loadQuill/index.js.map +1 -0
  93. package/dist/cjs/primeReactComponents.js +10 -0
  94. package/dist/cjs/primeReactComponents.js.map +1 -1
  95. package/dist/cjs/primeReactDescriptors.js +243 -0
  96. package/dist/cjs/primeReactDescriptors.js.map +1 -1
  97. package/dist/cjs/primeReactPackage.js +4 -0
  98. package/dist/cjs/primeReactPackage.js.map +1 -1
  99. package/dist/cjs/resolveEnumeration.js +55 -0
  100. package/dist/cjs/resolveEnumeration.js.map +1 -0
  101. package/dist/cjs/treeNodes.js +42 -7
  102. package/dist/cjs/treeNodes.js.map +1 -1
  103. package/dist/cjs/useResettingState.js +47 -0
  104. package/dist/cjs/useResettingState.js.map +1 -0
  105. package/dist/esm/EnumerationResolution.d.ts +9 -0
  106. package/dist/esm/EnumerationResolution.d.ts.map +1 -0
  107. package/dist/esm/EnumerationResolution.js +2 -0
  108. package/dist/esm/EnumerationResolution.js.map +1 -0
  109. package/dist/esm/data/DataGallery.stories.d.ts.map +1 -1
  110. package/dist/esm/data/DataGallery.stories.js +6 -0
  111. package/dist/esm/data/DataGallery.stories.js.map +1 -1
  112. package/dist/esm/data/DataScrollerRow.d.ts +4 -0
  113. package/dist/esm/data/DataScrollerRow.d.ts.map +1 -0
  114. package/dist/esm/data/DataScrollerRow.js +48 -0
  115. package/dist/esm/data/DataScrollerRow.js.map +1 -0
  116. package/dist/esm/data/PrimeDataScroller.d.ts +3 -0
  117. package/dist/esm/data/PrimeDataScroller.d.ts.map +1 -0
  118. package/dist/esm/data/PrimeDataScroller.js +118 -0
  119. package/dist/esm/data/PrimeDataScroller.js.map +1 -0
  120. package/dist/esm/data/PrimeTreeTable.d.ts +3 -0
  121. package/dist/esm/data/PrimeTreeTable.d.ts.map +1 -0
  122. package/dist/esm/data/PrimeTreeTable.js +215 -0
  123. package/dist/esm/data/PrimeTreeTable.js.map +1 -0
  124. package/dist/esm/data/TreeTableCheckState.d.ts +6 -0
  125. package/dist/esm/data/TreeTableCheckState.d.ts.map +1 -0
  126. package/dist/esm/data/TreeTableCheckState.js +11 -0
  127. package/dist/esm/data/TreeTableCheckState.js.map +1 -0
  128. package/dist/esm/data/TreeTableRow.d.ts +10 -0
  129. package/dist/esm/data/TreeTableRow.d.ts.map +1 -0
  130. package/dist/esm/data/TreeTableRow.js +2 -0
  131. package/dist/esm/data/TreeTableRow.js.map +1 -0
  132. package/dist/esm/data/TreeTableRowView.d.ts +21 -0
  133. package/dist/esm/data/TreeTableRowView.d.ts.map +1 -0
  134. package/dist/esm/data/TreeTableRowView.js +74 -0
  135. package/dist/esm/data/TreeTableRowView.js.map +1 -0
  136. package/dist/esm/data/TreeTableSelectionMode.d.ts +7 -0
  137. package/dist/esm/data/TreeTableSelectionMode.d.ts.map +1 -0
  138. package/dist/esm/data/TreeTableSelectionMode.js +12 -0
  139. package/dist/esm/data/TreeTableSelectionMode.js.map +1 -0
  140. package/dist/esm/data/checkboxSelection.d.ts +9 -0
  141. package/dist/esm/data/checkboxSelection.d.ts.map +1 -0
  142. package/dist/esm/data/checkboxSelection.js +85 -0
  143. package/dist/esm/data/checkboxSelection.js.map +1 -0
  144. package/dist/esm/data/index.d.ts +4 -0
  145. package/dist/esm/data/index.d.ts.map +1 -1
  146. package/dist/esm/data/index.js +4 -0
  147. package/dist/esm/data/index.js.map +1 -1
  148. package/dist/esm/data/isSerializedLegacyElement.d.ts +3 -0
  149. package/dist/esm/data/isSerializedLegacyElement.d.ts.map +1 -0
  150. package/dist/esm/data/isSerializedLegacyElement.js +27 -0
  151. package/dist/esm/data/isSerializedLegacyElement.js.map +1 -0
  152. package/dist/esm/data/readableValue.d.ts +2 -0
  153. package/dist/esm/data/readableValue.d.ts.map +1 -0
  154. package/dist/esm/data/readableValue.js +29 -0
  155. package/dist/esm/data/readableValue.js.map +1 -0
  156. package/dist/esm/data/selectionKeysOf.d.ts +2 -0
  157. package/dist/esm/data/selectionKeysOf.d.ts.map +1 -0
  158. package/dist/esm/data/selectionKeysOf.js +38 -0
  159. package/dist/esm/data/selectionKeysOf.js.map +1 -0
  160. package/dist/esm/data/treeTableRows.d.ts +6 -0
  161. package/dist/esm/data/treeTableRows.d.ts.map +1 -0
  162. package/dist/esm/data/treeTableRows.js +38 -0
  163. package/dist/esm/data/treeTableRows.js.map +1 -0
  164. package/dist/esm/data/useIncrementalLoad.d.ts +6 -0
  165. package/dist/esm/data/useIncrementalLoad.d.ts.map +1 -0
  166. package/dist/esm/data/useIncrementalLoad.js +44 -0
  167. package/dist/esm/data/useIncrementalLoad.js.map +1 -0
  168. package/dist/esm/data/useLoadOnReach.d.ts +3 -0
  169. package/dist/esm/data/useLoadOnReach.d.ts.map +1 -0
  170. package/dist/esm/data/useLoadOnReach.js +40 -0
  171. package/dist/esm/data/useLoadOnReach.js.map +1 -0
  172. package/dist/esm/data/useTreeGridNavigation.d.ts +17 -0
  173. package/dist/esm/data/useTreeGridNavigation.d.ts.map +1 -0
  174. package/dist/esm/data/useTreeGridNavigation.js +73 -0
  175. package/dist/esm/data/useTreeGridNavigation.js.map +1 -0
  176. package/dist/esm/editor/PrimeEditor.d.ts +3 -0
  177. package/dist/esm/editor/PrimeEditor.d.ts.map +1 -0
  178. package/dist/esm/editor/PrimeEditor.js +94 -0
  179. package/dist/esm/editor/PrimeEditor.js.map +1 -0
  180. package/dist/esm/editor/QuillConstructor.d.ts +4 -0
  181. package/dist/esm/editor/QuillConstructor.d.ts.map +1 -0
  182. package/dist/esm/editor/QuillConstructor.js +2 -0
  183. package/dist/esm/editor/QuillConstructor.js.map +1 -0
  184. package/dist/esm/editor/QuillEditorOptions.d.ts +13 -0
  185. package/dist/esm/editor/QuillEditorOptions.d.ts.map +1 -0
  186. package/dist/esm/editor/QuillEditorOptions.js +2 -0
  187. package/dist/esm/editor/QuillEditorOptions.js.map +1 -0
  188. package/dist/esm/editor/QuillEditorState.d.ts +6 -0
  189. package/dist/esm/editor/QuillEditorState.d.ts.map +1 -0
  190. package/dist/esm/editor/QuillEditorState.js +2 -0
  191. package/dist/esm/editor/QuillEditorState.js.map +1 -0
  192. package/dist/esm/editor/QuillInstance.d.ts +16 -0
  193. package/dist/esm/editor/QuillInstance.d.ts.map +1 -0
  194. package/dist/esm/editor/QuillInstance.js +2 -0
  195. package/dist/esm/editor/QuillInstance.js.map +1 -0
  196. package/dist/esm/editor/QuillLoader.d.ts +5 -0
  197. package/dist/esm/editor/QuillLoader.d.ts.map +1 -0
  198. package/dist/esm/editor/QuillLoader.js +2 -0
  199. package/dist/esm/editor/QuillLoader.js.map +1 -0
  200. package/dist/esm/editor/QuillLoaderContext.d.ts +3 -0
  201. package/dist/esm/editor/QuillLoaderContext.d.ts.map +1 -0
  202. package/dist/esm/editor/QuillLoaderContext.js +8 -0
  203. package/dist/esm/editor/QuillLoaderContext.js.map +1 -0
  204. package/dist/esm/editor/QuillLoaderProvider.d.ts +8 -0
  205. package/dist/esm/editor/QuillLoaderProvider.d.ts.map +1 -0
  206. package/dist/esm/editor/QuillLoaderProvider.js +19 -0
  207. package/dist/esm/editor/QuillLoaderProvider.js.map +1 -0
  208. package/dist/esm/editor/QuillOptions.d.ts +9 -0
  209. package/dist/esm/editor/QuillOptions.d.ts.map +1 -0
  210. package/dist/esm/editor/QuillOptions.js +2 -0
  211. package/dist/esm/editor/QuillOptions.js.map +1 -0
  212. package/dist/esm/editor/SafeElement.d.ts +7 -0
  213. package/dist/esm/editor/SafeElement.d.ts.map +1 -0
  214. package/dist/esm/editor/SafeElement.js +2 -0
  215. package/dist/esm/editor/SafeElement.js.map +1 -0
  216. package/dist/esm/editor/SafeNode.d.ts +3 -0
  217. package/dist/esm/editor/SafeNode.d.ts.map +1 -0
  218. package/dist/esm/editor/SafeNode.js +2 -0
  219. package/dist/esm/editor/SafeNode.js.map +1 -0
  220. package/dist/esm/editor/applyHtml.d.ts +3 -0
  221. package/dist/esm/editor/applyHtml.d.ts.map +1 -0
  222. package/dist/esm/editor/applyHtml.js +23 -0
  223. package/dist/esm/editor/applyHtml.js.map +1 -0
  224. package/dist/esm/editor/characterCount.d.ts +3 -0
  225. package/dist/esm/editor/characterCount.d.ts.map +1 -0
  226. package/dist/esm/editor/characterCount.js +8 -0
  227. package/dist/esm/editor/characterCount.js.map +1 -0
  228. package/dist/esm/editor/htmlToPlainText.d.ts +2 -0
  229. package/dist/esm/editor/htmlToPlainText.d.ts.map +1 -0
  230. package/dist/esm/editor/htmlToPlainText.js +99 -0
  231. package/dist/esm/editor/htmlToPlainText.js.map +1 -0
  232. package/dist/esm/editor/index.d.ts +14 -0
  233. package/dist/esm/editor/index.d.ts.map +1 -0
  234. package/dist/esm/editor/index.js +14 -0
  235. package/dist/esm/editor/index.js.map +1 -0
  236. package/dist/esm/editor/renderSafeNodes.d.ts +4 -0
  237. package/dist/esm/editor/renderSafeNodes.d.ts.map +1 -0
  238. package/dist/esm/editor/renderSafeNodes.js +33 -0
  239. package/dist/esm/editor/renderSafeNodes.js.map +1 -0
  240. package/dist/esm/editor/safeUrls.d.ts +3 -0
  241. package/dist/esm/editor/safeUrls.d.ts.map +1 -0
  242. package/dist/esm/editor/safeUrls.js +41 -0
  243. package/dist/esm/editor/safeUrls.js.map +1 -0
  244. package/dist/esm/editor/sanitizeHtml.d.ts +3 -0
  245. package/dist/esm/editor/sanitizeHtml.d.ts.map +1 -0
  246. package/dist/esm/editor/sanitizeHtml.js +138 -0
  247. package/dist/esm/editor/sanitizeHtml.js.map +1 -0
  248. package/dist/esm/editor/serializeSafeNodes.d.ts +3 -0
  249. package/dist/esm/editor/serializeSafeNodes.d.ts.map +1 -0
  250. package/dist/esm/editor/serializeSafeNodes.js +31 -0
  251. package/dist/esm/editor/serializeSafeNodes.js.map +1 -0
  252. package/dist/esm/editor/toolbarLayout.d.ts +2 -0
  253. package/dist/esm/editor/toolbarLayout.d.ts.map +1 -0
  254. package/dist/esm/editor/toolbarLayout.js +33 -0
  255. package/dist/esm/editor/toolbarLayout.js.map +1 -0
  256. package/dist/esm/editor/useQuillEditor.d.ts +4 -0
  257. package/dist/esm/editor/useQuillEditor.d.ts.map +1 -0
  258. package/dist/esm/editor/useQuillEditor.js +135 -0
  259. package/dist/esm/editor/useQuillEditor.js.map +1 -0
  260. package/dist/esm/file/FileGallery.stories.d.ts +19 -0
  261. package/dist/esm/file/FileGallery.stories.d.ts.map +1 -0
  262. package/dist/esm/file/FileGallery.stories.js +23 -0
  263. package/dist/esm/file/FileGallery.stories.js.map +1 -0
  264. package/dist/esm/file/FileUploadContext.d.ts +7 -0
  265. package/dist/esm/file/FileUploadContext.d.ts.map +1 -0
  266. package/dist/esm/file/FileUploadContext.js +11 -0
  267. package/dist/esm/file/FileUploadContext.js.map +1 -0
  268. package/dist/esm/file/FileUploadHandler.d.ts +4 -0
  269. package/dist/esm/file/FileUploadHandler.d.ts.map +1 -0
  270. package/dist/esm/file/FileUploadHandler.js +2 -0
  271. package/dist/esm/file/FileUploadHandler.js.map +1 -0
  272. package/dist/esm/file/FileUploadHandlerProvider.d.ts +9 -0
  273. package/dist/esm/file/FileUploadHandlerProvider.d.ts.map +1 -0
  274. package/dist/esm/file/FileUploadHandlerProvider.js +23 -0
  275. package/dist/esm/file/FileUploadHandlerProvider.js.map +1 -0
  276. package/dist/esm/file/FileUploadMode.d.ts +6 -0
  277. package/dist/esm/file/FileUploadMode.d.ts.map +1 -0
  278. package/dist/esm/file/FileUploadMode.js +11 -0
  279. package/dist/esm/file/FileUploadMode.js.map +1 -0
  280. package/dist/esm/file/PrimeFileUpload.d.ts +3 -0
  281. package/dist/esm/file/PrimeFileUpload.d.ts.map +1 -0
  282. package/dist/esm/file/PrimeFileUpload.js +159 -0
  283. package/dist/esm/file/PrimeFileUpload.js.map +1 -0
  284. package/dist/esm/file/UploadStatus.d.ts +5 -0
  285. package/dist/esm/file/UploadStatus.d.ts.map +1 -0
  286. package/dist/esm/file/UploadStatus.js +2 -0
  287. package/dist/esm/file/UploadStatus.js.map +1 -0
  288. package/dist/esm/file/UploadTarget.d.ts +8 -0
  289. package/dist/esm/file/UploadTarget.d.ts.map +1 -0
  290. package/dist/esm/file/UploadTarget.js +2 -0
  291. package/dist/esm/file/UploadTarget.js.map +1 -0
  292. package/dist/esm/file/index.d.ts +7 -0
  293. package/dist/esm/file/index.d.ts.map +1 -0
  294. package/dist/esm/file/index.js +7 -0
  295. package/dist/esm/file/index.js.map +1 -0
  296. package/dist/esm/file/postFiles.d.ts +2 -0
  297. package/dist/esm/file/postFiles.d.ts.map +1 -0
  298. package/dist/esm/file/postFiles.js +29 -0
  299. package/dist/esm/file/postFiles.js.map +1 -0
  300. package/dist/esm/file/resolveUploadTarget.d.ts +3 -0
  301. package/dist/esm/file/resolveUploadTarget.d.ts.map +1 -0
  302. package/dist/esm/file/resolveUploadTarget.js +66 -0
  303. package/dist/esm/file/resolveUploadTarget.js.map +1 -0
  304. package/dist/esm/file/useUploadSession.d.ts +10 -0
  305. package/dist/esm/file/useUploadSession.d.ts.map +1 -0
  306. package/dist/esm/file/useUploadSession.js +60 -0
  307. package/dist/esm/file/useUploadSession.js.map +1 -0
  308. package/dist/esm/form/FormGallery.stories.d.ts.map +1 -1
  309. package/dist/esm/form/FormGallery.stories.js +1 -0
  310. package/dist/esm/form/FormGallery.stories.js.map +1 -1
  311. package/dist/esm/index.d.ts +2 -0
  312. package/dist/esm/index.d.ts.map +1 -1
  313. package/dist/esm/index.js +16 -1
  314. package/dist/esm/index.js.map +1 -1
  315. package/dist/esm/legacyEnumerationChoices.d.ts +3 -0
  316. package/dist/esm/legacyEnumerationChoices.d.ts.map +1 -0
  317. package/dist/esm/legacyEnumerationChoices.js +37 -0
  318. package/dist/esm/legacyEnumerationChoices.js.map +1 -0
  319. package/dist/esm/loadQuill/index.d.ts +3 -0
  320. package/dist/esm/loadQuill/index.d.ts.map +1 -0
  321. package/dist/esm/loadQuill/index.js +20 -0
  322. package/dist/esm/loadQuill/index.js.map +1 -0
  323. package/dist/esm/primeReactComponents.d.ts.map +1 -1
  324. package/dist/esm/primeReactComponents.js +10 -0
  325. package/dist/esm/primeReactComponents.js.map +1 -1
  326. package/dist/esm/primeReactDescriptors.d.ts.map +1 -1
  327. package/dist/esm/primeReactDescriptors.js +243 -0
  328. package/dist/esm/primeReactDescriptors.js.map +1 -1
  329. package/dist/esm/primeReactPackage.js +4 -0
  330. package/dist/esm/primeReactPackage.js.map +1 -1
  331. package/dist/esm/resolveEnumeration.d.ts +3 -0
  332. package/dist/esm/resolveEnumeration.d.ts.map +1 -0
  333. package/dist/esm/resolveEnumeration.js +53 -0
  334. package/dist/esm/resolveEnumeration.js.map +1 -0
  335. package/dist/esm/treeNodes.d.ts +2 -1
  336. package/dist/esm/treeNodes.d.ts.map +1 -1
  337. package/dist/esm/treeNodes.js +42 -8
  338. package/dist/esm/treeNodes.js.map +1 -1
  339. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  340. package/dist/esm/useResettingState.d.ts +3 -0
  341. package/dist/esm/useResettingState.d.ts.map +1 -0
  342. package/dist/esm/useResettingState.js +45 -0
  343. package/dist/esm/useResettingState.js.map +1 -0
  344. package/editor/PrimeEditor.tsx +83 -0
  345. package/editor/QuillConstructor.ts +8 -0
  346. package/editor/QuillEditorOptions.ts +29 -0
  347. package/editor/QuillEditorState.ts +14 -0
  348. package/editor/QuillInstance.ts +27 -0
  349. package/editor/QuillLoader.ts +13 -0
  350. package/editor/QuillLoaderContext.ts +8 -0
  351. package/editor/QuillLoaderProvider.tsx +24 -0
  352. package/editor/QuillOptions.ts +10 -0
  353. package/editor/SafeElement.ts +15 -0
  354. package/editor/SafeNode.ts +7 -0
  355. package/editor/applyHtml.ts +21 -0
  356. package/editor/characterCount.ts +9 -0
  357. package/editor/htmlToPlainText.ts +74 -0
  358. package/editor/index.ts +16 -0
  359. package/editor/renderSafeNodes.tsx +26 -0
  360. package/editor/safeUrls.ts +43 -0
  361. package/editor/sanitizeHtml.ts +94 -0
  362. package/editor/serializeSafeNodes.ts +26 -0
  363. package/editor/toolbarLayout.ts +10 -0
  364. package/editor/useQuillEditor.ts +114 -0
  365. package/file/FileGallery.stories.tsx +32 -0
  366. package/file/FileUploadContext.ts +17 -0
  367. package/file/FileUploadHandler.ts +15 -0
  368. package/file/FileUploadHandlerProvider.tsx +33 -0
  369. package/file/FileUploadMode.ts +9 -0
  370. package/file/PrimeFileUpload.tsx +129 -0
  371. package/file/UploadStatus.ts +9 -0
  372. package/file/UploadTarget.ts +12 -0
  373. package/file/index.ts +9 -0
  374. package/file/postFiles.ts +23 -0
  375. package/file/resolveUploadTarget.ts +61 -0
  376. package/file/useUploadSession.ts +67 -0
  377. package/form/FormGallery.stories.tsx +1 -0
  378. package/index.ts +2 -0
  379. package/legacyEnumerationChoices.ts +35 -0
  380. package/loadQuill/index.ts +21 -0
  381. package/package.json +17 -7
  382. package/primeReactComponents.ts +8 -0
  383. package/primeReactDescriptors.ts +63 -0
  384. package/primeReactPackage.ts +2 -2
  385. package/primeReactTheme.css +69 -0
  386. package/resolveEnumeration.ts +50 -0
  387. package/treeNodes.ts +44 -6
  388. package/useResettingState.ts +34 -0
@@ -0,0 +1,161 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var react = require('react');
5
+ var fileupload = require('primereact/fileupload');
6
+ var properties = require('../properties.js');
7
+ var resolveEnumeration = require('../resolveEnumeration.js');
8
+ var FileUploadContext = require('./FileUploadContext.js');
9
+ var FileUploadMode = require('./FileUploadMode.js');
10
+ var resolveUploadTarget = require('./resolveUploadTarget.js');
11
+ var useUploadSession = require('./useUploadSession.js');
12
+
13
+ const subscribeToNothing = ()=>()=>undefined;
14
+ const pageOrigin = ()=>window.location.origin;
15
+ const noPageOrigin = ()=>undefined;
16
+ /**
17
+ * The `PrimeReact:fileUpload` component.
18
+ *
19
+ * PrimeReact 11 provides the accessible file picker and drop zone; this adapter owns everything that has an
20
+ * effect or a policy:
21
+ * - The authored `url` is untrusted data. It is checked by {@link resolveUploadTarget} - same origin as the
22
+ * page unless the host allows more through {@link FileUploadHandlerProvider} - and a refused address is
23
+ * reported and blocks every upload, the host's handler included.
24
+ * - Nothing is requested on mount. A request starts only when the user selects or drops files (automatic and
25
+ * basic mode) or presses the upload button.
26
+ * - `multiple: false` is enforced before anything is sent, for the file input and for drag and drop.
27
+ * - One upload runs at a time (nothing can be selected or dropped while it runs), and a failure is shown
28
+ * rather than thrown.
29
+ * - A disabled element (`isEnabled: false`) disables the picker, the upload button and the drop zone.
30
+ *
31
+ * Without a host handler the control posts the files itself with `fetch`, sending cookies to the page's own
32
+ * origin only.
33
+ */ function PrimeFileUpload({ element, interactions }) {
34
+ const { handler, allowedOrigins } = react.useContext(FileUploadContext.FileUploadContext);
35
+ const origin = react.useSyncExternalStore(subscribeToNothing, pageOrigin, noPageOrigin);
36
+ const modeResolution = resolveEnumeration.resolveEnumeration('mode', element.properties.mode, FileUploadMode.FileUploadMode, FileUploadMode.FileUploadMode.Advanced);
37
+ const mode = modeResolution.isValid ? modeResolution.value : FileUploadMode.FileUploadMode.Advanced;
38
+ const authoredUrl = properties.stringProperty(element, 'url');
39
+ const target = react.useMemo(()=>resolveUploadTarget.resolveUploadTarget(authoredUrl, origin, allowedOrigins), [
40
+ authoredUrl,
41
+ origin,
42
+ allowedOrigins
43
+ ]);
44
+ const serverUrl = target.isValid ? target.url : undefined;
45
+ const multiple = properties.booleanProperty(element, 'multiple', false);
46
+ const enabled = element.isEnabled;
47
+ const canUpload = target.isValid && (handler !== undefined || serverUrl !== undefined);
48
+ const session = useUploadSession.useUploadSession(handler, serverUrl, properties.stringProperty(element, 'name', 'files'));
49
+ const uploaded = async (event)=>{
50
+ if (!enabled || !canUpload) return;
51
+ if (await session.upload(event.files)) event.options.clear();
52
+ };
53
+ const changed = (event)=>{
54
+ // Clearing the selection after an upload reports an empty change; it is not a new selection, and must not
55
+ // wipe the result of the upload that caused it.
56
+ if (event.acceptedFiles.length === 0 && event.rejectedFiles.length === 0) return;
57
+ const rejection = event.rejectedFiles.flatMap((rejected)=>rejected.errors.map((error)=>error.message)).join(' ');
58
+ session.setStatus(rejection === '' ? undefined : {
59
+ kind: 'error',
60
+ text: rejection
61
+ });
62
+ interactions?.onChange?.();
63
+ };
64
+ const refuseSeveralFromInput = (event)=>{
65
+ const input = event.target;
66
+ if (input.type !== 'file') return;
67
+ if (session.busy) {
68
+ event.stopPropagation();
69
+ input.value = '';
70
+ return;
71
+ }
72
+ if (multiple || (input.files?.length ?? 0) < 2) return;
73
+ event.stopPropagation();
74
+ input.value = '';
75
+ session.setStatus({
76
+ kind: 'error',
77
+ text: 'Only one file can be uploaded at a time.'
78
+ });
79
+ };
80
+ const refuseDrop = (event)=>{
81
+ if (!enabled) {
82
+ event.preventDefault();
83
+ return;
84
+ }
85
+ if (session.busy) {
86
+ event.preventDefault();
87
+ event.stopPropagation();
88
+ return;
89
+ }
90
+ if (multiple || (event.dataTransfer?.files.length ?? 0) < 2) return;
91
+ event.preventDefault();
92
+ event.stopPropagation();
93
+ session.setStatus({
94
+ kind: 'error',
95
+ text: 'Only one file can be uploaded at a time.'
96
+ });
97
+ };
98
+ return /*#__PURE__*/ jsxRuntime.jsx("div", {
99
+ "data-scene-id": element.id,
100
+ "data-scene-component": "fileUpload",
101
+ onClick: interactions?.onClick,
102
+ onDoubleClick: interactions?.onDoubleClick,
103
+ onChangeCapture: refuseSeveralFromInput,
104
+ onDropCapture: refuseDrop,
105
+ onDragOverCapture: (event)=>{
106
+ if (!enabled) event.preventDefault();
107
+ },
108
+ children: /*#__PURE__*/ jsxRuntime.jsx(fileupload.FileUpload.Root, {
109
+ accept: properties.stringProperty(element, 'accept'),
110
+ auto: (mode === FileUploadMode.FileUploadMode.Auto || mode === FileUploadMode.FileUploadMode.Basic) && canUpload,
111
+ customUpload: true,
112
+ disabled: !enabled,
113
+ maxFileSize: properties.numberProperty(element, 'maxFileSize'),
114
+ multiple: multiple,
115
+ name: properties.stringProperty(element, 'name', 'files'),
116
+ uploadHandler: uploaded,
117
+ onChange: changed,
118
+ children: /*#__PURE__*/ jsxRuntime.jsxs(fileupload.FileUpload.Content, {
119
+ "aria-label": properties.stringProperty(element, 'ariaLabel', 'File upload drop zone'),
120
+ children: [
121
+ /*#__PURE__*/ jsxRuntime.jsx("p", {
122
+ children: mode === FileUploadMode.FileUploadMode.Basic ? 'Choose a file to upload.' : 'Drop files here or choose files to upload.'
123
+ }),
124
+ /*#__PURE__*/ jsxRuntime.jsx(fileupload.FileUpload.Trigger, {
125
+ disabled: !enabled || session.busy,
126
+ children: mode === FileUploadMode.FileUploadMode.Basic ? 'Choose file' : 'Choose files'
127
+ }),
128
+ mode === FileUploadMode.FileUploadMode.Advanced && /*#__PURE__*/ jsxRuntime.jsx(fileupload.FileUpload.Upload, {
129
+ disabled: !enabled || !canUpload || session.busy,
130
+ children: "Upload selected files"
131
+ }),
132
+ !modeResolution.isValid && /*#__PURE__*/ jsxRuntime.jsx("p", {
133
+ role: "alert",
134
+ "data-scene-state": "unsupported-mode",
135
+ children: modeResolution.message
136
+ }),
137
+ !target.isValid && /*#__PURE__*/ jsxRuntime.jsx("p", {
138
+ role: "alert",
139
+ "data-scene-state": "refused-address",
140
+ children: target.message
141
+ }),
142
+ target.isValid && !canUpload && /*#__PURE__*/ jsxRuntime.jsx("p", {
143
+ role: "status",
144
+ children: "Configure a server URL or provide an upload handler to upload files."
145
+ }),
146
+ session.busy && /*#__PURE__*/ jsxRuntime.jsx("p", {
147
+ role: "status",
148
+ children: "Uploading…"
149
+ }),
150
+ session.status !== undefined && /*#__PURE__*/ jsxRuntime.jsx("p", {
151
+ role: session.status.kind === 'error' ? 'alert' : 'status',
152
+ children: session.status.text
153
+ })
154
+ ]
155
+ })
156
+ })
157
+ });
158
+ }
159
+
160
+ exports.PrimeFileUpload = PrimeFileUpload;
161
+ //# 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,31 @@
1
+ 'use strict';
2
+
3
+ // Copyright (c) Cratis. All rights reserved.
4
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
5
+ /**
6
+ * Sends files to an address as a `multipart/form-data` POST.
7
+ *
8
+ * Cookies are sent only to the page's own origin (`credentials: 'same-origin'`), so an upload to another
9
+ * origin the host allowed carries no credentials. A redirect fails the upload rather than being followed,
10
+ * because following one would send the files to an address the origin policy never checked.
11
+ *
12
+ * @param url The address, already checked by `resolveUploadTarget`.
13
+ * @param field The multipart field name each file is appended under.
14
+ * @param files The files to send.
15
+ * @param signal Cancels the request.
16
+ * @throws When the request fails or the server does not answer with a success status.
17
+ */ async function postFiles(url, field, files, signal) {
18
+ const body = new FormData();
19
+ for (const file of files)body.append(field, file, file.name);
20
+ const response = await fetch(url, {
21
+ method: 'POST',
22
+ body,
23
+ credentials: 'same-origin',
24
+ redirect: 'error',
25
+ signal
26
+ });
27
+ if (!response.ok) throw new Error(`The server answered ${response.status}${response.statusText === '' ? '' : ` ${response.statusText}`}.`);
28
+ }
29
+
30
+ exports.postFiles = postFiles;
31
+ //# 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,68 @@
1
+ 'use strict';
2
+
3
+ // Copyright (c) Cratis. All rights reserved.
4
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
5
+ /** A scheme (`https:`) or a protocol-relative prefix (`//host`): the address names its own host. */ const namesItsOwnHost = /^([a-z][a-z0-9+.-]*:|\/\/)/i;
6
+ /** 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 === '\\');
7
+ /** 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';
8
+ /**
9
+ * Checks the address an authored upload sends files to.
10
+ *
11
+ * The address comes from authored model data, so it is not trusted. By default an upload may only go to the
12
+ * origin the page was served from - a relative address, or an absolute one with the same origin. A host that
13
+ * needs another origin names it in `allowedOrigins` when it provides the upload handler. Whatever is accepted
14
+ * has the scheme `http:` or `https:`, carries no user information, and contains no whitespace, control
15
+ * characters or backslashes, because those are how an address is made to point somewhere other than where it
16
+ * reads.
17
+ *
18
+ * @param url The authored address, if any.
19
+ * @param pageOrigin The origin of the page, `undefined` where there is no page (server rendering).
20
+ * @param allowedOrigins The additional origins the host permits.
21
+ * @returns The address to send to, or why it cannot be used.
22
+ */ function resolveUploadTarget(url, pageOrigin, allowedOrigins) {
23
+ if (url === undefined || url === '') return {
24
+ isValid: true,
25
+ url: undefined
26
+ };
27
+ if (disguisesAHost(url)) return refused('it contains whitespace, control characters or a backslash');
28
+ let resolved;
29
+ try {
30
+ resolved = new URL(url, placeholderOrigin);
31
+ } catch {
32
+ return refused('it is not a valid address');
33
+ }
34
+ if (resolved.protocol !== 'http:' && resolved.protocol !== 'https:') return refused(`the ${resolved.protocol} scheme is not allowed`);
35
+ if (resolved.username !== '' || resolved.password !== '') return refused('it carries user information');
36
+ if (!namesItsOwnHost.test(url)) return {
37
+ isValid: true,
38
+ url
39
+ };
40
+ const permitted = [
41
+ ...pageOrigin === undefined ? [] : [
42
+ pageOrigin
43
+ ],
44
+ ...allowedOrigins.flatMap(originOf)
45
+ ];
46
+ return permitted.includes(resolved.origin) ? {
47
+ isValid: true,
48
+ url: resolved.href
49
+ } : refused(`${resolved.origin} is not the origin of this page or one the host allows`);
50
+ }
51
+ function originOf(address) {
52
+ try {
53
+ return [
54
+ new URL(address).origin
55
+ ];
56
+ } catch {
57
+ return [];
58
+ }
59
+ }
60
+ function refused(reason) {
61
+ return {
62
+ isValid: false,
63
+ message: `The upload address is not allowed: ${reason}.`
64
+ };
65
+ }
66
+
67
+ exports.resolveUploadTarget = resolveUploadTarget;
68
+ //# 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,62 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var postFiles = require('./postFiles.js');
5
+
6
+ // Copyright (c) Cratis. All rights reserved.
7
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
8
+ /**
9
+ * Runs one upload at a time for a control, through the host's handler or a POST to the checked address.
10
+ *
11
+ * Starting an upload while one runs is ignored rather than queued, so a double click cannot send the same
12
+ * files twice. Every failure ends in a visible `status`; none escapes as an unhandled rejection. An upload
13
+ * still running when the control unmounts is cancelled.
14
+ *
15
+ * @param handler The host's upload effect, if it owns the effect.
16
+ * @param url The checked address, if one was authored.
17
+ * @param field The multipart field name used when the control posts the files itself.
18
+ */ function useUploadSession(handler, url, field) {
19
+ const running = react.useRef(undefined);
20
+ const [busy, setBusy] = react.useState(false);
21
+ const [status, setStatus] = react.useState(undefined);
22
+ react.useEffect(()=>()=>running.current?.abort(), []);
23
+ const upload = react.useCallback(async (files)=>{
24
+ if (running.current !== undefined) return false;
25
+ const controller = new AbortController();
26
+ running.current = controller;
27
+ setBusy(true);
28
+ setStatus(undefined);
29
+ try {
30
+ if (handler !== undefined) await handler(files, url);
31
+ else if (url !== undefined) await postFiles.postFiles(url, field, files, controller.signal);
32
+ else throw new Error('There is nowhere to send the files.');
33
+ setStatus({
34
+ kind: 'success',
35
+ text: `${files.length} file${files.length === 1 ? '' : 's'} uploaded.`
36
+ });
37
+ return true;
38
+ } catch (error) {
39
+ if (!controller.signal.aborted) setStatus({
40
+ kind: 'error',
41
+ text: `Upload failed: ${error instanceof Error ? error.message : String(error)}`
42
+ });
43
+ return false;
44
+ } finally{
45
+ running.current = undefined;
46
+ setBusy(false);
47
+ }
48
+ }, [
49
+ handler,
50
+ url,
51
+ field
52
+ ]);
53
+ return {
54
+ busy,
55
+ status,
56
+ setStatus,
57
+ upload
58
+ };
59
+ }
60
+
61
+ exports.useUploadSession = useUploadSession;
62
+ //# 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,YAAAA,CAAoCC,SAAAA,CAAAA;AACpD,IAAA,MAAM,CAACC,IAAAA,EAAMC,OAAAA,CAAQ,GAAGC,cAAAA,CAAS,KAAA,CAAA;AACjC,IAAA,MAAM,CAACC,MAAAA,EAAQC,SAAAA,CAAU,GAAGF,cAAAA,CAAmCH,SAAAA,CAAAA;AAE/DM,IAAAA,eAAAA,CAAU,IAAM,IAAMR,OAAAA,CAAQS,OAAO,EAAEC,SAAS,EAAE,CAAA;IAElD,MAAMC,MAAAA,GAASC,kBAAY,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,mBAAAA,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;;"}
package/dist/cjs/index.js CHANGED
@@ -31,6 +31,17 @@ var PrimeChips = require('./form/PrimeChips.js');
31
31
  var PrimeAutoComplete = require('./form/PrimeAutoComplete.js');
32
32
  var TreeSelect = require('./form/TreeSelect.js');
33
33
  var PrimeTreeSelect = require('./form/PrimeTreeSelect.js');
34
+ var PrimeEditor = require('./editor/PrimeEditor.js');
35
+ var QuillLoaderProvider = require('./editor/QuillLoaderProvider.js');
36
+ var htmlToPlainText = require('./editor/htmlToPlainText.js');
37
+ var renderSafeNodes = require('./editor/renderSafeNodes.js');
38
+ var safeUrls = require('./editor/safeUrls.js');
39
+ var sanitizeHtml = require('./editor/sanitizeHtml.js');
40
+ var serializeSafeNodes = require('./editor/serializeSafeNodes.js');
41
+ var FileUploadHandlerProvider = require('./file/FileUploadHandlerProvider.js');
42
+ var FileUploadMode = require('./file/FileUploadMode.js');
43
+ var PrimeFileUpload = require('./file/PrimeFileUpload.js');
44
+ var resolveUploadTarget = require('./file/resolveUploadTarget.js');
34
45
  var ChartType = require('./chart/ChartType.js');
35
46
  var PrimeChart = require('./chart/PrimeChart.js');
36
47
  var resolveChartType = require('./chart/resolveChartType.js');
@@ -45,6 +56,10 @@ var PrimePaginator = require('./data/PrimePaginator.js');
45
56
  var PrimeOrderList = require('./data/PrimeOrderList.js');
46
57
  var PrimePickList = require('./data/PrimePickList.js');
47
58
  var PrimeOrganizationChart = require('./data/PrimeOrganizationChart.js');
59
+ var PrimeDataScroller = require('./data/PrimeDataScroller.js');
60
+ var PrimeTreeTable = require('./data/PrimeTreeTable.js');
61
+ var TreeTableSelectionMode = require('./data/TreeTableSelectionMode.js');
62
+ var readableValue = require('./data/readableValue.js');
48
63
  var PrimeCard = require('./panel/PrimeCard.js');
49
64
  var PrimePanel = require('./panel/PrimePanel.js');
50
65
  var PrimeFieldset = require('./panel/PrimeFieldset.js');
@@ -129,6 +144,7 @@ exports.stringArrayProperty = properties.stringArrayProperty;
129
144
  exports.stringProperty = properties.stringProperty;
130
145
  exports.menuItemsProperty = menuItems.menuItemsProperty;
131
146
  exports.toMenuItems = menuItems.toMenuItems;
147
+ exports.countUnreadableEntries = treeNodes.countUnreadableEntries;
132
148
  exports.toTreeNodes = treeNodes.toTreeNodes;
133
149
  exports.treeNodesProperty = treeNodes.treeNodesProperty;
134
150
  exports.PrimeButton = PrimeButton.PrimeButton;
@@ -159,6 +175,18 @@ exports.PrimeChips = PrimeChips.PrimeChips;
159
175
  exports.PrimeAutoComplete = PrimeAutoComplete.PrimeAutoComplete;
160
176
  exports.TreeSelect = TreeSelect.TreeSelect;
161
177
  exports.PrimeTreeSelect = PrimeTreeSelect.PrimeTreeSelect;
178
+ exports.PrimeEditor = PrimeEditor.PrimeEditor;
179
+ exports.QuillLoaderProvider = QuillLoaderProvider.QuillLoaderProvider;
180
+ exports.htmlToPlainText = htmlToPlainText.htmlToPlainText;
181
+ exports.renderSafeNodes = renderSafeNodes.renderSafeNodes;
182
+ exports.safeImageUrl = safeUrls.safeImageUrl;
183
+ exports.safeLinkUrl = safeUrls.safeLinkUrl;
184
+ exports.sanitizeHtml = sanitizeHtml.sanitizeHtml;
185
+ exports.serializeSafeNodes = serializeSafeNodes.serializeSafeNodes;
186
+ exports.FileUploadHandlerProvider = FileUploadHandlerProvider.FileUploadHandlerProvider;
187
+ exports.FileUploadMode = FileUploadMode.FileUploadMode;
188
+ exports.PrimeFileUpload = PrimeFileUpload.PrimeFileUpload;
189
+ exports.resolveUploadTarget = resolveUploadTarget.resolveUploadTarget;
162
190
  exports.ChartType = ChartType.ChartType;
163
191
  exports.PrimeChart = PrimeChart.PrimeChart;
164
192
  exports.legacyChartTypes = resolveChartType.legacyChartTypes;
@@ -174,6 +202,10 @@ exports.PrimePaginator = PrimePaginator.PrimePaginator;
174
202
  exports.PrimeOrderList = PrimeOrderList.PrimeOrderList;
175
203
  exports.PrimePickList = PrimePickList.PrimePickList;
176
204
  exports.PrimeOrganizationChart = PrimeOrganizationChart.PrimeOrganizationChart;
205
+ exports.PrimeDataScroller = PrimeDataScroller.PrimeDataScroller;
206
+ exports.PrimeTreeTable = PrimeTreeTable.PrimeTreeTable;
207
+ exports.TreeTableSelectionMode = TreeTableSelectionMode.TreeTableSelectionMode;
208
+ exports.readableValue = readableValue.readableValue;
177
209
  exports.PrimeCard = PrimeCard.PrimeCard;
178
210
  exports.PrimePanel = PrimePanel.PrimePanel;
179
211
  exports.PrimeFieldset = PrimeFieldset.PrimeFieldset;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ // Copyright (c) Cratis. All rights reserved.
4
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
5
+ /**
6
+ * The choices for an enumeration property: the stable values new documents use, then the ordinals migrated
7
+ * documents carry, then the Pascal case member names a serialized .NET enum produces. These are the same forms
8
+ * the renderer accepts, so a stored value the control draws is never flagged invalid by descriptor validation.
9
+ *
10
+ * A migrated control stores the original numeric value. Offering those ordinals keeps the stored value valid
11
+ * against the descriptor (so an inspector shows it as the current choice) without rewriting it behind the
12
+ * author's back. The position of a member in `members` is its ordinal.
13
+ *
14
+ * @param members The enum object.
15
+ * @param labels The label of each member, by canonical value.
16
+ * @returns The canonical choices, then one legacy choice per ordinal, then one per Pascal case member name.
17
+ */ function legacyEnumerationChoices(members, labels) {
18
+ const canonical = Object.values(members);
19
+ const names = Object.keys(members);
20
+ return [
21
+ ...canonical.map((member)=>({
22
+ value: member,
23
+ label: labels[member]
24
+ })),
25
+ ...canonical.map((member, ordinal)=>({
26
+ value: ordinal,
27
+ label: `${labels[member]} (legacy ${ordinal})`,
28
+ description: `The ordinal ${ordinal} of the original enum, as stored by migrated documents.`
29
+ })),
30
+ ...names.map((name)=>({
31
+ value: name,
32
+ label: `${labels[members[name]]} (legacy name ${name})`,
33
+ description: `The member name ${name} of the original enum, as a serialized enum stores it.`
34
+ }))
35
+ ];
36
+ }
37
+
38
+ exports.legacyEnumerationChoices = legacyEnumerationChoices;
39
+ //# sourceMappingURL=legacyEnumerationChoices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacyEnumerationChoices.js","sources":["../../legacyEnumerationChoices.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 { PropertyChoice } from '@cratis/scene.model';\n\n/**\n * The choices for an enumeration property: the stable values new documents use, then the ordinals migrated\n * documents carry, then the Pascal case member names a serialized .NET enum produces. These are the same forms\n * the renderer accepts, so a stored value the control draws is never flagged invalid by descriptor validation.\n *\n * A migrated control stores the original numeric value. Offering those ordinals keeps the stored value valid\n * against the descriptor (so an inspector shows it as the current choice) without rewriting it behind the\n * author's back. The position of a member in `members` is its ordinal.\n *\n * @param members The enum object.\n * @param labels The label of each member, by canonical value.\n * @returns The canonical choices, then one legacy choice per ordinal, then one per Pascal case member name.\n */\nexport function legacyEnumerationChoices<TMember extends string>(members: Record<string, TMember>, labels: Record<TMember, string>): PropertyChoice[] {\n const canonical = Object.values(members);\n const names = Object.keys(members);\n return [\n ...canonical.map(member => ({ value: member, label: labels[member] })),\n ...canonical.map((member, ordinal) => ({\n value: ordinal,\n label: `${labels[member]} (legacy ${ordinal})`,\n description: `The ordinal ${ordinal} of the original enum, as stored by migrated documents.`,\n })),\n ...names.map(name => ({\n value: name,\n label: `${labels[members[name]]} (legacy name ${name})`,\n description: `The member name ${name} of the original enum, as a serialized enum stores it.`,\n })),\n ];\n}\n"],"names":["legacyEnumerationChoices","members","labels","canonical","Object","values","names","keys","map","member","value","label","ordinal","description","name"],"mappings":";;AAAA;AACA;AAIA;;;;;;;;;;;;AAYC,IACM,SAASA,wBAAAA,CAAiDC,OAAgC,EAAEC,MAA+B,EAAA;IAC9H,MAAMC,SAAAA,GAAYC,MAAAA,CAAOC,MAAM,CAACJ,OAAAA,CAAAA;IAChC,MAAMK,KAAAA,GAAQF,MAAAA,CAAOG,IAAI,CAACN,OAAAA,CAAAA;IAC1B,OAAO;AACAE,QAAAA,GAAAA,SAAAA,CAAUK,GAAG,CAACC,CAAAA,MAAAA,IAAW;gBAAEC,KAAAA,EAAOD,MAAAA;gBAAQE,KAAAA,EAAOT,MAAM,CAACO,MAAAA;aAAQ,CAAA,CAAA;AAChEN,QAAAA,GAAAA,SAAAA,CAAUK,GAAG,CAAC,CAACC,MAAAA,EAAQG,WAAa;gBACnCF,KAAAA,EAAOE,OAAAA;gBACPD,KAAAA,EAAO,CAAA,EAAGT,MAAM,CAACO,MAAAA,CAAO,CAAC,SAAS,EAAEG,OAAAA,CAAQ,CAAC,CAAC;AAC9CC,gBAAAA,WAAAA,EAAa,CAAC,YAAY,EAAED,OAAAA,CAAQ,uDAAuD;aAC/F,CAAA,CAAA;AACGN,QAAAA,GAAAA,KAAAA,CAAME,GAAG,CAACM,CAAAA,IAAAA,IAAS;gBAClBJ,KAAAA,EAAOI,IAAAA;AACPH,gBAAAA,KAAAA,EAAO,CAAA,EAAGT,MAAM,CAACD,OAAO,CAACa,IAAAA,CAAK,CAAC,CAAC,cAAc,EAAEA,IAAAA,CAAK,CAAC,CAAC;AACvDD,gBAAAA,WAAAA,EAAa,CAAC,gBAAgB,EAAEC,IAAAA,CAAK,sDAAsD;aAC/F,CAAA;AACH,KAAA;AACL;;"}
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ // Copyright (c) Cratis. All rights reserved.
4
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
5
+ /**
6
+ * The ready-made Quill loader: `() => import('quill')`.
7
+ *
8
+ * This entry point is the only place the package names `quill`, and it is separate from the package root on
9
+ * purpose. A host that renders editable rich text imports it, installs the `quill` peer dependency and
10
+ * Quill's stylesheet, and passes it to `QuillLoaderProvider`; every other host never resolves `quill`.
11
+ *
12
+ * ```tsx
13
+ * import 'quill/dist/quill.snow.css';
14
+ * import { QuillLoaderProvider } from '@cratis/scene.primereact';
15
+ * import { loadQuill } from '@cratis/scene.primereact/quill';
16
+ *
17
+ * <QuillLoaderProvider loader={loadQuill}>{screen}</QuillLoaderProvider>
18
+ * ```
19
+ */ const loadQuill = ()=>import('quill');
20
+
21
+ exports.loadQuill = loadQuill;
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../loadQuill/index.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { QuillLoader } from '../editor/QuillLoader';\n\n/**\n * The ready-made Quill loader: `() => import('quill')`.\n *\n * This entry point is the only place the package names `quill`, and it is separate from the package root on\n * purpose. A host that renders editable rich text imports it, installs the `quill` peer dependency and\n * Quill's stylesheet, and passes it to `QuillLoaderProvider`; every other host never resolves `quill`.\n *\n * ```tsx\n * import 'quill/dist/quill.snow.css';\n * import { QuillLoaderProvider } from '@cratis/scene.primereact';\n * import { loadQuill } from '@cratis/scene.primereact/quill';\n *\n * <QuillLoaderProvider loader={loadQuill}>{screen}</QuillLoaderProvider>\n * ```\n */\nexport const loadQuill: QuillLoader = () => import('quill') as unknown as ReturnType<QuillLoader>;\n"],"names":["loadQuill"],"mappings":";;AAAA;AACA;AAIA;;;;;;;;;;;;;;AAcC,IACM,MAAMA,SAAAA,GAAyB,IAAM,OAAO,OAAA;;"}
@@ -20,6 +20,8 @@ var PrimePaginator = require('./data/PrimePaginator.js');
20
20
  var PrimeOrderList = require('./data/PrimeOrderList.js');
21
21
  var PrimePickList = require('./data/PrimePickList.js');
22
22
  var PrimeOrganizationChart = require('./data/PrimeOrganizationChart.js');
23
+ var PrimeDataScroller = require('./data/PrimeDataScroller.js');
24
+ var PrimeTreeTable = require('./data/PrimeTreeTable.js');
23
25
  var PrimeInputText = require('./form/PrimeInputText.js');
24
26
  var PrimeInputTextarea = require('./form/PrimeInputTextarea.js');
25
27
  var PrimeInputNumber = require('./form/PrimeInputNumber.js');
@@ -44,6 +46,10 @@ var PrimeAutoComplete = require('./form/PrimeAutoComplete.js');
44
46
  require('react');
45
47
  require('primereact/tree');
46
48
  var PrimeTreeSelect = require('./form/PrimeTreeSelect.js');
49
+ var PrimeEditor = require('./editor/PrimeEditor.js');
50
+ require('./editor/QuillLoaderContext.js');
51
+ require('./file/FileUploadContext.js');
52
+ var PrimeFileUpload = require('./file/PrimeFileUpload.js');
47
53
  var PrimeImage = require('./media/PrimeImage.js');
48
54
  var PrimeGalleria = require('./media/PrimeGalleria.js');
49
55
  var PrimeCarousel = require('./media/PrimeCarousel.js');
@@ -140,6 +146,8 @@ var PrimeAction = require('./screen/PrimeAction.js');
140
146
  [scene_react.componentRegistryKey('PrimeReact', 'chips')]: PrimeChips.PrimeChips,
141
147
  [scene_react.componentRegistryKey('PrimeReact', 'autoComplete')]: PrimeAutoComplete.PrimeAutoComplete,
142
148
  [scene_react.componentRegistryKey('PrimeReact', 'treeSelect')]: PrimeTreeSelect.PrimeTreeSelect,
149
+ [scene_react.componentRegistryKey('PrimeReact', 'editor')]: PrimeEditor.PrimeEditor,
150
+ [scene_react.componentRegistryKey('PrimeReact', 'fileUpload')]: PrimeFileUpload.PrimeFileUpload,
143
151
  [scene_react.componentRegistryKey('PrimeReact', 'button')]: PrimeButton.PrimeButton,
144
152
  [scene_react.componentRegistryKey('PrimeReact', 'splitButton')]: PrimeSplitButton.PrimeSplitButton,
145
153
  [scene_react.componentRegistryKey('PrimeReact', 'speedDial')]: PrimeSpeedDial.PrimeSpeedDial,
@@ -148,7 +156,9 @@ var PrimeAction = require('./screen/PrimeAction.js');
148
156
  [scene_react.componentRegistryKey('PrimeReact', 'table')]: PrimeDataTable.PrimeDataTable,
149
157
  [scene_react.componentRegistryKey('PrimeReact', 'column')]: PrimeColumn.PrimeColumn,
150
158
  [scene_react.componentRegistryKey('PrimeReact', 'dataView')]: PrimeDataView.PrimeDataView,
159
+ [scene_react.componentRegistryKey('PrimeReact', 'dataScroller')]: PrimeDataScroller.PrimeDataScroller,
151
160
  [scene_react.componentRegistryKey('PrimeReact', 'tree')]: PrimeTree.PrimeTree,
161
+ [scene_react.componentRegistryKey('PrimeReact', 'treeTable')]: PrimeTreeTable.PrimeTreeTable,
152
162
  [scene_react.componentRegistryKey('PrimeReact', 'timeline')]: PrimeTimeline.PrimeTimeline,
153
163
  [scene_react.componentRegistryKey('PrimeReact', 'paginator')]: PrimePaginator.PrimePaginator,
154
164
  [scene_react.componentRegistryKey('PrimeReact', 'orderList')]: PrimeOrderList.PrimeOrderList,