@cratis/scene.blueprint.default 4.35.0 → 4.37.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 (175) hide show
  1. package/ComponentName.ts +21 -0
  2. package/defaultBlueprintComponents.ts +8 -1
  3. package/dist/cjs/ComponentName.js +7 -0
  4. package/dist/cjs/ComponentName.js.map +1 -1
  5. package/dist/cjs/defaultBlueprint.js +2 -0
  6. package/dist/cjs/defaultBlueprint.js.map +1 -1
  7. package/dist/cjs/defaultBlueprintComponentMetadata.js +2 -0
  8. package/dist/cjs/defaultBlueprintComponentMetadata.js.map +1 -1
  9. package/dist/cjs/defaultBlueprintComponents.js +15 -1
  10. package/dist/cjs/defaultBlueprintComponents.js.map +1 -1
  11. package/dist/cjs/foundation/ActivityFeed.js +122 -0
  12. package/dist/cjs/foundation/ActivityFeed.js.map +1 -0
  13. package/dist/cjs/foundation/ApprovalChainStepper.js +130 -0
  14. package/dist/cjs/foundation/ApprovalChainStepper.js.map +1 -0
  15. package/dist/cjs/foundation/AvatarStack.js +73 -0
  16. package/dist/cjs/foundation/AvatarStack.js.map +1 -0
  17. package/dist/cjs/foundation/ChecklistSection.js +174 -0
  18. package/dist/cjs/foundation/ChecklistSection.js.map +1 -0
  19. package/dist/cjs/foundation/FileUploader.js +218 -0
  20. package/dist/cjs/foundation/FileUploader.js.map +1 -0
  21. package/dist/cjs/foundation/FileUploaderHandler.js +17 -0
  22. package/dist/cjs/foundation/FileUploaderHandler.js.map +1 -0
  23. package/dist/cjs/foundation/OrgTree.js +188 -0
  24. package/dist/cjs/foundation/OrgTree.js.map +1 -0
  25. package/dist/cjs/foundation/PermissionMatrix.js +136 -0
  26. package/dist/cjs/foundation/PermissionMatrix.js.map +1 -0
  27. package/dist/cjs/foundation/activityModel.js +63 -0
  28. package/dist/cjs/foundation/activityModel.js.map +1 -0
  29. package/dist/cjs/foundation/approvalModel.js +87 -0
  30. package/dist/cjs/foundation/approvalModel.js.map +1 -0
  31. package/dist/cjs/foundation/avatarModel.js +42 -0
  32. package/dist/cjs/foundation/avatarModel.js.map +1 -0
  33. package/dist/cjs/foundation/checklistModel.js +59 -0
  34. package/dist/cjs/foundation/checklistModel.js.map +1 -0
  35. package/dist/cjs/foundation/formatting.js +11 -0
  36. package/dist/cjs/foundation/formatting.js.map +1 -1
  37. package/dist/cjs/foundation/foundationComponentMetadata.js +47 -0
  38. package/dist/cjs/foundation/foundationComponentMetadata.js.map +1 -1
  39. package/dist/cjs/foundation/foundationDescriptors.js +246 -0
  40. package/dist/cjs/foundation/foundationDescriptors.js.map +1 -1
  41. package/dist/cjs/foundation/foundationSamples.js +230 -0
  42. package/dist/cjs/foundation/foundationSamples.js.map +1 -1
  43. package/dist/cjs/foundation/foundationStrings.js +27 -1
  44. package/dist/cjs/foundation/foundationStrings.js.map +1 -1
  45. package/dist/cjs/foundation/orgModel.js +106 -0
  46. package/dist/cjs/foundation/orgModel.js.map +1 -0
  47. package/dist/cjs/foundation/permissionModel.js +84 -0
  48. package/dist/cjs/foundation/permissionModel.js.map +1 -0
  49. package/dist/cjs/foundation/uploadModel.js +71 -0
  50. package/dist/cjs/foundation/uploadModel.js.map +1 -0
  51. package/dist/cjs/index.js +59 -0
  52. package/dist/cjs/index.js.map +1 -1
  53. package/dist/esm/ComponentName.d.ts +8 -1
  54. package/dist/esm/ComponentName.d.ts.map +1 -1
  55. package/dist/esm/ComponentName.js +7 -0
  56. package/dist/esm/ComponentName.js.map +1 -1
  57. package/dist/esm/defaultBlueprint.js +2 -0
  58. package/dist/esm/defaultBlueprint.js.map +1 -1
  59. package/dist/esm/defaultBlueprintComponentMetadata.js +2 -0
  60. package/dist/esm/defaultBlueprintComponentMetadata.js.map +1 -1
  61. package/dist/esm/defaultBlueprintComponents.d.ts.map +1 -1
  62. package/dist/esm/defaultBlueprintComponents.js +15 -1
  63. package/dist/esm/defaultBlueprintComponents.js.map +1 -1
  64. package/dist/esm/foundation/ActivityFeed.d.ts +3 -0
  65. package/dist/esm/foundation/ActivityFeed.d.ts.map +1 -0
  66. package/dist/esm/foundation/ActivityFeed.js +120 -0
  67. package/dist/esm/foundation/ActivityFeed.js.map +1 -0
  68. package/dist/esm/foundation/ApprovalChainStepper.d.ts +3 -0
  69. package/dist/esm/foundation/ApprovalChainStepper.d.ts.map +1 -0
  70. package/dist/esm/foundation/ApprovalChainStepper.js +128 -0
  71. package/dist/esm/foundation/ApprovalChainStepper.js.map +1 -0
  72. package/dist/esm/foundation/AvatarStack.d.ts +3 -0
  73. package/dist/esm/foundation/AvatarStack.d.ts.map +1 -0
  74. package/dist/esm/foundation/AvatarStack.js +71 -0
  75. package/dist/esm/foundation/AvatarStack.js.map +1 -0
  76. package/dist/esm/foundation/ChecklistSection.d.ts +3 -0
  77. package/dist/esm/foundation/ChecklistSection.d.ts.map +1 -0
  78. package/dist/esm/foundation/ChecklistSection.js +172 -0
  79. package/dist/esm/foundation/ChecklistSection.js.map +1 -0
  80. package/dist/esm/foundation/FileUploader.d.ts +3 -0
  81. package/dist/esm/foundation/FileUploader.d.ts.map +1 -0
  82. package/dist/esm/foundation/FileUploader.js +216 -0
  83. package/dist/esm/foundation/FileUploader.js.map +1 -0
  84. package/dist/esm/foundation/FileUploaderHandler.d.ts +8 -0
  85. package/dist/esm/foundation/FileUploaderHandler.d.ts.map +1 -0
  86. package/dist/esm/foundation/FileUploaderHandler.js +14 -0
  87. package/dist/esm/foundation/FileUploaderHandler.js.map +1 -0
  88. package/dist/esm/foundation/Foundation.stories.d.ts +16 -0
  89. package/dist/esm/foundation/Foundation.stories.d.ts.map +1 -1
  90. package/dist/esm/foundation/Foundation.stories.js +16 -0
  91. package/dist/esm/foundation/Foundation.stories.js.map +1 -1
  92. package/dist/esm/foundation/OrgTree.d.ts +3 -0
  93. package/dist/esm/foundation/OrgTree.d.ts.map +1 -0
  94. package/dist/esm/foundation/OrgTree.js +186 -0
  95. package/dist/esm/foundation/OrgTree.js.map +1 -0
  96. package/dist/esm/foundation/PermissionMatrix.d.ts +3 -0
  97. package/dist/esm/foundation/PermissionMatrix.d.ts.map +1 -0
  98. package/dist/esm/foundation/PermissionMatrix.js +134 -0
  99. package/dist/esm/foundation/PermissionMatrix.js.map +1 -0
  100. package/dist/esm/foundation/activityModel.d.ts +22 -0
  101. package/dist/esm/foundation/activityModel.d.ts.map +1 -0
  102. package/dist/esm/foundation/activityModel.js +58 -0
  103. package/dist/esm/foundation/activityModel.js.map +1 -0
  104. package/dist/esm/foundation/approvalModel.d.ts +27 -0
  105. package/dist/esm/foundation/approvalModel.d.ts.map +1 -0
  106. package/dist/esm/foundation/approvalModel.js +81 -0
  107. package/dist/esm/foundation/approvalModel.js.map +1 -0
  108. package/dist/esm/foundation/avatarModel.d.ts +11 -0
  109. package/dist/esm/foundation/avatarModel.d.ts.map +1 -0
  110. package/dist/esm/foundation/avatarModel.js +38 -0
  111. package/dist/esm/foundation/avatarModel.js.map +1 -0
  112. package/dist/esm/foundation/checklistModel.d.ts +17 -0
  113. package/dist/esm/foundation/checklistModel.d.ts.map +1 -0
  114. package/dist/esm/foundation/checklistModel.js +53 -0
  115. package/dist/esm/foundation/checklistModel.js.map +1 -0
  116. package/dist/esm/foundation/formatting.d.ts +1 -0
  117. package/dist/esm/foundation/formatting.d.ts.map +1 -1
  118. package/dist/esm/foundation/formatting.js +11 -1
  119. package/dist/esm/foundation/formatting.js.map +1 -1
  120. package/dist/esm/foundation/foundationComponentMetadata.d.ts.map +1 -1
  121. package/dist/esm/foundation/foundationComponentMetadata.js +47 -0
  122. package/dist/esm/foundation/foundationComponentMetadata.js.map +1 -1
  123. package/dist/esm/foundation/foundationDescriptors.d.ts.map +1 -1
  124. package/dist/esm/foundation/foundationDescriptors.js +246 -0
  125. package/dist/esm/foundation/foundationDescriptors.js.map +1 -1
  126. package/dist/esm/foundation/foundationSamples.d.ts.map +1 -1
  127. package/dist/esm/foundation/foundationSamples.js +230 -0
  128. package/dist/esm/foundation/foundationSamples.js.map +1 -1
  129. package/dist/esm/foundation/foundationStrings.d.ts +26 -0
  130. package/dist/esm/foundation/foundationStrings.d.ts.map +1 -1
  131. package/dist/esm/foundation/foundationStrings.js +27 -1
  132. package/dist/esm/foundation/foundationStrings.js.map +1 -1
  133. package/dist/esm/foundation/index.d.ts +15 -0
  134. package/dist/esm/foundation/index.d.ts.map +1 -1
  135. package/dist/esm/foundation/index.js +15 -0
  136. package/dist/esm/foundation/index.js.map +1 -1
  137. package/dist/esm/foundation/orgModel.d.ts +20 -0
  138. package/dist/esm/foundation/orgModel.d.ts.map +1 -0
  139. package/dist/esm/foundation/orgModel.js +99 -0
  140. package/dist/esm/foundation/orgModel.js.map +1 -0
  141. package/dist/esm/foundation/permissionModel.d.ts +24 -0
  142. package/dist/esm/foundation/permissionModel.d.ts.map +1 -0
  143. package/dist/esm/foundation/permissionModel.js +77 -0
  144. package/dist/esm/foundation/permissionModel.js.map +1 -0
  145. package/dist/esm/foundation/uploadModel.d.ts +31 -0
  146. package/dist/esm/foundation/uploadModel.d.ts.map +1 -0
  147. package/dist/esm/foundation/uploadModel.js +65 -0
  148. package/dist/esm/foundation/uploadModel.js.map +1 -0
  149. package/dist/esm/index.js +16 -1
  150. package/dist/esm/index.js.map +1 -1
  151. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  152. package/foundation/ActivityFeed.tsx +61 -0
  153. package/foundation/ApprovalChainStepper.tsx +66 -0
  154. package/foundation/AvatarStack.tsx +43 -0
  155. package/foundation/ChecklistSection.tsx +80 -0
  156. package/foundation/FileUploader.tsx +122 -0
  157. package/foundation/FileUploaderHandler.tsx +22 -0
  158. package/foundation/Foundation.stories.tsx +16 -0
  159. package/foundation/OrgTree.tsx +101 -0
  160. package/foundation/PermissionMatrix.tsx +82 -0
  161. package/foundation/activityModel.ts +65 -0
  162. package/foundation/approvalModel.ts +88 -0
  163. package/foundation/avatarModel.ts +36 -0
  164. package/foundation/checklistModel.ts +62 -0
  165. package/foundation/formatting.ts +9 -0
  166. package/foundation/foundationComponentMetadata.ts +7 -0
  167. package/foundation/foundationDescriptors.ts +153 -0
  168. package/foundation/foundationSamples.ts +59 -0
  169. package/foundation/foundationStrings.ts +26 -0
  170. package/foundation/index.ts +15 -0
  171. package/foundation/orgModel.ts +85 -0
  172. package/foundation/permissionModel.ts +85 -0
  173. package/foundation/uploadModel.ts +66 -0
  174. package/package.json +8 -8
  175. package/shell/layout.css +418 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarStack.js","sources":["../../../foundation/AvatarStack.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 { useMemo } from 'react';\nimport { RegisteredComponentProps } from '@cratis/scene.react';\nimport { initialsOf, readPeople, visiblePeople } from './avatarModel';\nimport { ComponentState, readComponentState } from './ComponentState';\nimport { formatText, readFoundationStrings } from './foundationStrings';\nimport { FoundationFrame } from './StateFrame';\n\n/**\n * The `avatarStack` component: overlapping avatars for the people on a record, with a \"+N\" chip for the rest.\n *\n * `people` are names with an optional picture; without one the avatar shows the person's initials. The stack is a labelled group (\"5 people\"),\n * each avatar is an image named after its person, and the overflow chip says how many more in words. `max` is how many are shown (4 by\n * default) and `size` is `small` or `medium`.\n */\nexport function AvatarStack({ element, interactions }: RegisteredComponentProps) {\n const people = useMemo(() => readPeople(element.properties.people), [element.properties.people]);\n const strings = readFoundationStrings(element);\n const { shown, hidden } = visiblePeople(people, typeof element.properties.max === 'number' ? element.properties.max : 4);\n const state = readComponentState(element, people.length > 0);\n const size = element.properties.size === 'small' ? 'small' : 'medium';\n\n return (\n <FoundationFrame element={element} interactions={interactions} name='avatar-stack' state={state} skeleton={[35]}>\n {(state === ComponentState.Ready || state === ComponentState.Partial) && (\n <ul className='foundation-avatars' role='group' aria-label={formatText(strings.avatarPeople, { count: people.length })} data-size={size}>\n {shown.map(person => (\n <li key={person.name} className='foundation-avatar' role='img' aria-label={person.name} title={person.name}>\n {person.imageUrl ? <img src={person.imageUrl} alt='' /> : <span aria-hidden='true'>{initialsOf(person.name)}</span>}\n </li>\n ))}\n {hidden > 0 && (\n <li className='foundation-avatar foundation-avatar-more' role='img' aria-label={formatText(strings.avatarOverflow, { count: hidden })}>\n <span aria-hidden='true'>+{hidden}</span>\n </li>\n )}\n </ul>\n )}\n </FoundationFrame>\n );\n}\n"],"names":["AvatarStack","element","interactions","people","useMemo","readPeople","properties","strings","readFoundationStrings","shown","hidden","visiblePeople","max","state","readComponentState","length","size","_jsx","FoundationFrame","name","skeleton","ComponentState","Ready","Partial","_jsxs","ul","className","role","aria-label","formatText","avatarPeople","count","data-size","map","person","li","title","imageUrl","img","src","alt","span","aria-hidden","initialsOf","avatarOverflow"],"mappings":";;;;;;;;;AAUA;;;;;;AAMC,IACM,SAASA,WAAAA,CAAY,EAAEC,OAAO,EAAEC,YAAY,EAA4B,EAAA;IAC3E,MAAMC,MAAAA,GAASC,cAAQ,IAAMC,sBAAAA,CAAWJ,QAAQK,UAAU,CAACH,MAAM,CAAA,EAAG;QAACF,OAAAA,CAAQK,UAAU,CAACH;AAAO,KAAA,CAAA;AAC/F,IAAA,MAAMI,UAAUC,uCAAAA,CAAsBP,OAAAA,CAAAA;AACtC,IAAA,MAAM,EAAEQ,KAAK,EAAEC,MAAM,EAAE,GAAGC,0BAAcR,MAAAA,EAAQ,OAAOF,QAAQK,UAAU,CAACM,GAAG,KAAK,QAAA,GAAWX,QAAQK,UAAU,CAACM,GAAG,GAAG,CAAA,CAAA;AACtH,IAAA,MAAMC,KAAAA,GAAQC,iCAAAA,CAAmBb,OAAAA,EAASE,MAAAA,CAAOY,MAAM,GAAG,CAAA,CAAA;AAC1D,IAAA,MAAMC,OAAOf,OAAAA,CAAQK,UAAU,CAACU,IAAI,KAAK,UAAU,OAAA,GAAU,QAAA;AAE7D,IAAA,qBACIC,cAAA,CAACC,0BAAAA,EAAAA;QAAgBjB,OAAAA,EAASA,OAAAA;QAASC,YAAAA,EAAcA,YAAAA;QAAciB,IAAAA,EAAK,cAAA;QAAeN,KAAAA,EAAOA,KAAAA;QAAOO,QAAAA,EAAU;AAAC,YAAA;AAAG,SAAA;kBAC1G,CAACP,KAAAA,KAAUQ,6BAAAA,CAAeC,KAAK,IAAIT,UAAUQ,6BAAAA,CAAeE,OAAO,mBAChEC,eAAA,CAACC,IAAAA,EAAAA;YAAGC,SAAAA,EAAU,oBAAA;YAAqBC,IAAAA,EAAK,OAAA;YAAQC,YAAAA,EAAYC,4BAAAA,CAAWtB,OAAAA,CAAQuB,YAAY,EAAE;AAAEC,gBAAAA,KAAAA,EAAO5B,OAAOY;AAAO,aAAA,CAAA;YAAIiB,WAAAA,EAAWhB,IAAAA;;AAC9HP,gBAAAA,KAAAA,CAAMwB,GAAG,CAACC,CAAAA,MAAAA,iBACPjB,cAAA,CAACkB,IAAAA,EAAAA;wBAAqBT,SAAAA,EAAU,mBAAA;wBAAoBC,IAAAA,EAAK,KAAA;AAAMC,wBAAAA,YAAAA,EAAYM,OAAOf,IAAI;AAAEiB,wBAAAA,KAAAA,EAAOF,OAAOf,IAAI;kCACrGe,MAAAA,CAAOG,QAAQ,iBAAGpB,cAAA,CAACqB,KAAAA,EAAAA;AAAIC,4BAAAA,GAAAA,EAAKL,OAAOG,QAAQ;4BAAEG,GAAAA,EAAI;2CAAQvB,cAAA,CAACwB,MAAAA,EAAAA;4BAAKC,aAAAA,EAAY,MAAA;AAAQC,4BAAAA,QAAAA,EAAAA,sBAAAA,CAAWT,OAAOf,IAAI;;AADrGe,qBAAAA,EAAAA,MAAAA,CAAOf,IAAI,CAAA,CAAA;AAIvBT,gBAAAA,MAAAA,GAAS,mBACNO,cAAA,CAACkB,IAAAA,EAAAA;oBAAGT,SAAAA,EAAU,0CAAA;oBAA2CC,IAAAA,EAAK,KAAA;oBAAMC,YAAAA,EAAYC,4BAAAA,CAAWtB,OAAAA,CAAQqC,cAAc,EAAE;wBAAEb,KAAAA,EAAOrB;AAAO,qBAAA,CAAA;AAC/H,oBAAA,QAAA,gBAAAc,eAAA,CAACiB,MAAAA,EAAAA;wBAAKC,aAAAA,EAAY,MAAA;;AAAO,4BAAA,GAAA;AAAEhC,4BAAAA;;;;;;;AAOvD;;"}
@@ -0,0 +1,174 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var react = require('react');
5
+ var scene_react = require('@cratis/scene.react');
6
+ var checklistModel = require('./checklistModel.js');
7
+ var ComponentState = require('./ComponentState.js');
8
+ var FoundationIcon = require('./FoundationIcon.js');
9
+ var formatting = require('./formatting.js');
10
+ var foundationStrings = require('./foundationStrings.js');
11
+ var PermissionRule = require('./PermissionRule.js');
12
+ var StateFrame = require('./StateFrame.js');
13
+
14
+ /**
15
+ * The `checklistSection` component: sections of tasks, each with its owner and due date, and a progress bar per section.
16
+ *
17
+ * `sections` give the structure (`title`, and `items` with `id`, `label`, `owner`, `due`, `done`). Ticking a task publishes the ids of all
18
+ * done tasks as the `value` output and runs the behaviors attached to the element. An open task past its due date says "Overdue" in
19
+ * words as well as in color. Progress is a labelled progress bar, so "2 of 5 complete" is read, not just seen. With `editPermission`
20
+ * not enabled the tasks are shown and cannot be changed.
21
+ */ function ChecklistSection({ element, interactions, bindingOutputs }) {
22
+ const supplied = react.useMemo(()=>checklistModel.readChecklist(element.properties.sections), [
23
+ element.properties.sections
24
+ ]);
25
+ const suppliedKey = JSON.stringify(supplied);
26
+ const [groups, setGroups] = react.useState(supplied);
27
+ const strings = foundationStrings.readFoundationStrings(element);
28
+ const locale = formatting.readLocale(element);
29
+ const state = ComponentState.readComponentState(element, supplied.some((group)=>group.items.length > 0));
30
+ const locked = PermissionRule.readPermissionRule(element, 'editPermission') !== 'enabled';
31
+ const now = react.useMemo(()=>typeof element.properties.today === 'string' ? new Date(element.properties.today) : new Date(), [
32
+ element.properties.today
33
+ ]);
34
+ react.useEffect(()=>setGroups(supplied), [
35
+ suppliedKey
36
+ ]);
37
+ scene_react.useValueOutput(bindingOutputs, checklistModel.doneTaskIds(groups));
38
+ return /*#__PURE__*/ jsxRuntime.jsx(StateFrame.FoundationFrame, {
39
+ element: element,
40
+ interactions: interactions,
41
+ name: "checklist",
42
+ state: state,
43
+ skeleton: [
44
+ 40,
45
+ 100,
46
+ 90,
47
+ 95
48
+ ],
49
+ children: (state === ComponentState.ComponentState.Ready || state === ComponentState.ComponentState.Partial) && groups.map((group, groupIndex)=>{
50
+ const done = checklistModel.completed(group);
51
+ const total = group.items.length;
52
+ return /*#__PURE__*/ jsxRuntime.jsxs("section", {
53
+ className: "foundation-checklist-group",
54
+ "aria-labelledby": `${element.id}-group-${groupIndex}`,
55
+ children: [
56
+ /*#__PURE__*/ jsxRuntime.jsxs("header", {
57
+ className: "foundation-checklist-header",
58
+ children: [
59
+ /*#__PURE__*/ jsxRuntime.jsx("h3", {
60
+ id: `${element.id}-group-${groupIndex}`,
61
+ children: group.title
62
+ }),
63
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
64
+ className: "foundation-count",
65
+ children: foundationStrings.formatText(strings.checklistProgress, {
66
+ done,
67
+ total
68
+ })
69
+ })
70
+ ]
71
+ }),
72
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
73
+ className: "foundation-progress",
74
+ role: "progressbar",
75
+ "aria-label": foundationStrings.formatText(strings.checklistItemProgress, {
76
+ title: group.title
77
+ }),
78
+ "aria-valuemin": 0,
79
+ "aria-valuemax": total,
80
+ "aria-valuenow": done,
81
+ "aria-valuetext": foundationStrings.formatText(strings.checklistProgress, {
82
+ done,
83
+ total
84
+ }),
85
+ children: /*#__PURE__*/ jsxRuntime.jsx("span", {
86
+ className: "foundation-progress-bar",
87
+ style: {
88
+ inlineSize: total === 0 ? '0%' : `${done / total * 100}%`
89
+ }
90
+ })
91
+ }),
92
+ total === 0 ? /*#__PURE__*/ jsxRuntime.jsx("p", {
93
+ className: "foundation-count",
94
+ children: strings.checklistNone
95
+ }) : /*#__PURE__*/ jsxRuntime.jsx("ul", {
96
+ className: "foundation-checklist-items",
97
+ children: group.items.map((item)=>{
98
+ const overdue = checklistModel.isOverdue(item, now);
99
+ return /*#__PURE__*/ jsxRuntime.jsxs("li", {
100
+ className: "foundation-checklist-item",
101
+ "data-done": item.done,
102
+ "data-overdue": overdue,
103
+ children: [
104
+ /*#__PURE__*/ jsxRuntime.jsxs("label", {
105
+ className: "foundation-check",
106
+ children: [
107
+ /*#__PURE__*/ jsxRuntime.jsx("input", {
108
+ type: "checkbox",
109
+ checked: item.done,
110
+ disabled: locked,
111
+ onChange: ()=>{
112
+ setGroups(checklistModel.toggleTask(groups, item.id));
113
+ interactions?.onChange?.();
114
+ }
115
+ }),
116
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
117
+ className: "foundation-checklist-label",
118
+ children: item.label
119
+ })
120
+ ]
121
+ }),
122
+ /*#__PURE__*/ jsxRuntime.jsxs("span", {
123
+ className: "foundation-checklist-meta",
124
+ children: [
125
+ item.owner && /*#__PURE__*/ jsxRuntime.jsxs("span", {
126
+ children: [
127
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
128
+ className: "foundation-visually-hidden",
129
+ children: `${strings.checklistOwner}: `
130
+ }),
131
+ /*#__PURE__*/ jsxRuntime.jsx(FoundationIcon.FoundationIcon, {
132
+ name: "user"
133
+ }),
134
+ " ",
135
+ item.owner
136
+ ]
137
+ }),
138
+ item.due && /*#__PURE__*/ jsxRuntime.jsxs("span", {
139
+ children: [
140
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
141
+ className: "foundation-visually-hidden",
142
+ children: `${strings.checklistDue}: `
143
+ }),
144
+ /*#__PURE__*/ jsxRuntime.jsx("time", {
145
+ dateTime: item.due,
146
+ children: formatting.formatDate(item.due, locale)
147
+ }),
148
+ overdue && /*#__PURE__*/ jsxRuntime.jsxs("strong", {
149
+ className: "foundation-overdue",
150
+ children: [
151
+ " · ",
152
+ /*#__PURE__*/ jsxRuntime.jsx(FoundationIcon.FoundationIcon, {
153
+ name: "alert"
154
+ }),
155
+ " ",
156
+ strings.checklistOverdue
157
+ ]
158
+ })
159
+ ]
160
+ })
161
+ ]
162
+ })
163
+ ]
164
+ }, item.id);
165
+ })
166
+ })
167
+ ]
168
+ }, group.title + groupIndex);
169
+ })
170
+ });
171
+ }
172
+
173
+ exports.ChecklistSection = ChecklistSection;
174
+ //# sourceMappingURL=ChecklistSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChecklistSection.js","sources":["../../../foundation/ChecklistSection.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 { useEffect, useMemo, useState } from 'react';\nimport { RegisteredComponentProps, useValueOutput } from '@cratis/scene.react';\nimport { ChecklistGroup, completed, doneTaskIds, isOverdue, readChecklist, toggleTask } from './checklistModel';\nimport { ComponentState, readComponentState } from './ComponentState';\nimport { FoundationIcon } from './FoundationIcon';\nimport { formatDate, readLocale } from './formatting';\nimport { formatText, readFoundationStrings } from './foundationStrings';\nimport { readPermissionRule } from './PermissionRule';\nimport { FoundationFrame } from './StateFrame';\n\n/**\n * The `checklistSection` component: sections of tasks, each with its owner and due date, and a progress bar per section.\n *\n * `sections` give the structure (`title`, and `items` with `id`, `label`, `owner`, `due`, `done`). Ticking a task publishes the ids of all\n * done tasks as the `value` output and runs the behaviors attached to the element. An open task past its due date says \"Overdue\" in\n * words as well as in color. Progress is a labelled progress bar, so \"2 of 5 complete\" is read, not just seen. With `editPermission`\n * not enabled the tasks are shown and cannot be changed.\n */\nexport function ChecklistSection({ element, interactions, bindingOutputs }: RegisteredComponentProps) {\n const supplied = useMemo(() => readChecklist(element.properties.sections), [element.properties.sections]);\n const suppliedKey = JSON.stringify(supplied);\n const [groups, setGroups] = useState<ChecklistGroup[]>(supplied);\n const strings = readFoundationStrings(element);\n const locale = readLocale(element);\n const state = readComponentState(element, supplied.some(group => group.items.length > 0));\n const locked = readPermissionRule(element, 'editPermission') !== 'enabled';\n const now = useMemo(() => (typeof element.properties.today === 'string' ? new Date(element.properties.today) : new Date()), [element.properties.today]);\n\n useEffect(() => setGroups(supplied), [suppliedKey]);\n useValueOutput(bindingOutputs, doneTaskIds(groups));\n\n return (\n <FoundationFrame element={element} interactions={interactions} name='checklist' state={state} skeleton={[40, 100, 90, 95]}>\n {(state === ComponentState.Ready || state === ComponentState.Partial) && groups.map((group, groupIndex) => {\n const done = completed(group);\n const total = group.items.length;\n return (\n <section key={group.title + groupIndex} className='foundation-checklist-group' aria-labelledby={`${element.id}-group-${groupIndex}`}>\n <header className='foundation-checklist-header'>\n <h3 id={`${element.id}-group-${groupIndex}`}>{group.title}</h3>\n <span className='foundation-count'>{formatText(strings.checklistProgress, { done, total })}</span>\n </header>\n <div className='foundation-progress' role='progressbar' aria-label={formatText(strings.checklistItemProgress, { title: group.title })}\n aria-valuemin={0} aria-valuemax={total} aria-valuenow={done} aria-valuetext={formatText(strings.checklistProgress, { done, total })}>\n <span className='foundation-progress-bar' style={{ inlineSize: total === 0 ? '0%' : `${(done / total) * 100}%` }} />\n </div>\n {total === 0 ? <p className='foundation-count'>{strings.checklistNone}</p> : (\n <ul className='foundation-checklist-items'>\n {group.items.map(item => {\n const overdue = isOverdue(item, now);\n return (\n <li key={item.id} className='foundation-checklist-item' data-done={item.done} data-overdue={overdue}>\n <label className='foundation-check'>\n <input type='checkbox' checked={item.done} disabled={locked} onChange={() => { setGroups(toggleTask(groups, item.id)); interactions?.onChange?.(); }} />\n <span className='foundation-checklist-label'>{item.label}</span>\n </label>\n <span className='foundation-checklist-meta'>\n {item.owner && <span><span className='foundation-visually-hidden'>{`${strings.checklistOwner}: `}</span><FoundationIcon name='user' /> {item.owner}</span>}\n {item.due && (\n <span>\n <span className='foundation-visually-hidden'>{`${strings.checklistDue}: `}</span>\n <time dateTime={item.due}>{formatDate(item.due, locale)}</time>\n {overdue && <strong className='foundation-overdue'> · <FoundationIcon name='alert' /> {strings.checklistOverdue}</strong>}\n </span>\n )}\n </span>\n </li>\n );\n })}\n </ul>\n )}\n </section>\n );\n })}\n </FoundationFrame>\n );\n}\n"],"names":["ChecklistSection","element","interactions","bindingOutputs","supplied","useMemo","readChecklist","properties","sections","suppliedKey","JSON","stringify","groups","setGroups","useState","strings","readFoundationStrings","locale","readLocale","state","readComponentState","some","group","items","length","locked","readPermissionRule","now","today","Date","useEffect","useValueOutput","doneTaskIds","_jsx","FoundationFrame","name","skeleton","ComponentState","Ready","Partial","map","groupIndex","done","completed","total","_jsxs","section","className","aria-labelledby","id","header","h3","title","span","formatText","checklistProgress","div","role","aria-label","checklistItemProgress","aria-valuemin","aria-valuemax","aria-valuenow","aria-valuetext","style","inlineSize","p","checklistNone","ul","item","overdue","isOverdue","li","data-done","data-overdue","label","input","type","checked","disabled","onChange","toggleTask","owner","checklistOwner","FoundationIcon","due","checklistDue","time","dateTime","formatDate","strong","checklistOverdue"],"mappings":"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"}
@@ -0,0 +1,218 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var react = require('react');
5
+ var scene_react = require('@cratis/scene.react');
6
+ var elementProperties = require('../shell/elementProperties.js');
7
+ var ActionButton = require('./ActionButton.js');
8
+ var ComponentState = require('./ComponentState.js');
9
+ var FileUploaderHandler = require('./FileUploaderHandler.js');
10
+ var FoundationIcon = require('./FoundationIcon.js');
11
+ var formatting = require('./formatting.js');
12
+ var foundationStrings = require('./foundationStrings.js');
13
+ var PermissionRule = require('./PermissionRule.js');
14
+ var StateFrame = require('./StateFrame.js');
15
+ var uploadModel = require('./uploadModel.js');
16
+
17
+ /**
18
+ * The `fileUploader` component: a drop zone and a button to choose files, checked against type and size before anything is sent.
19
+ *
20
+ * `accept` is an `accept` list, `maxSizeMb` the largest file, and `multiple` whether more than one is allowed. The zone is a real file
21
+ * input behind a labelled button, so it works from the keyboard and with a screen reader; dropping onto it does the same as choosing.
22
+ * Refusals are announced with their reason. Accepted files are listed with a remove button and a status in words; the selection
23
+ * (name, size, type) is published as the `value` output. With a `FileUploaderHandlerProvider` in scope the files are sent through it and
24
+ * marked uploading, done or failed; without one the component only collects. `actionPermission` gates choosing files.
25
+ */ function FileUploader({ element, interactions, bindingOutputs }) {
26
+ const strings = foundationStrings.readFoundationStrings(element);
27
+ const locale = formatting.readLocale(element);
28
+ const handler = FileUploaderHandler.useFileUploaderHandler();
29
+ const [entries, setEntries] = react.useState([]);
30
+ const [problems, setProblems] = react.useState([]);
31
+ const [dragging, setDragging] = react.useState(false);
32
+ const input = react.useRef(null);
33
+ const accept = elementProperties.readOptionalString(element, 'accept') ?? '';
34
+ const maximumBytes = (typeof element.properties.maxSizeMb === 'number' ? element.properties.maxSizeMb : 0) * 1024 * 1024;
35
+ const multiple = element.properties.multiple !== false;
36
+ const rule = PermissionRule.readPermissionRule(element, 'actionPermission');
37
+ const state = ComponentState.readComponentState(element, true);
38
+ const serverUrl = elementProperties.readOptionalString(element, 'serverUrl');
39
+ scene_react.useValueOutput(bindingOutputs, entries.map((entry)=>({
40
+ name: entry.file.name,
41
+ size: entry.file.size,
42
+ type: entry.file.type,
43
+ status: entry.status
44
+ })));
45
+ const send = async (files)=>{
46
+ if (!handler) return;
47
+ const mark = (status)=>setEntries((current)=>current.map((entry)=>files.includes(entry.file) ? {
48
+ ...entry,
49
+ status
50
+ } : entry));
51
+ mark(uploadModel.UploadStatus.Uploading);
52
+ try {
53
+ await handler(files, serverUrl);
54
+ mark(uploadModel.UploadStatus.Done);
55
+ } catch {
56
+ mark(uploadModel.UploadStatus.Failed);
57
+ }
58
+ };
59
+ const take = (chosen)=>{
60
+ const { accepted, refused } = uploadModel.checkSelection(chosen, {
61
+ accept,
62
+ maximumBytes,
63
+ multiple
64
+ }, entries.length);
65
+ setProblems(refused.map(({ file, reason })=>reason === uploadModel.UploadRefusal.WrongType ? foundationStrings.formatText(strings.uploadWrongType, {
66
+ name: file.name
67
+ }) : reason === uploadModel.UploadRefusal.TooLarge ? foundationStrings.formatText(strings.uploadTooLarge, {
68
+ name: file.name,
69
+ limit: uploadModel.formatBytes(maximumBytes, locale)
70
+ }) : strings.uploadSingle));
71
+ if (accepted.length === 0) return;
72
+ setEntries((current)=>[
73
+ ...current,
74
+ ...accepted.map((file)=>({
75
+ file,
76
+ status: uploadModel.UploadStatus.Queued
77
+ }))
78
+ ]);
79
+ interactions?.onChange?.();
80
+ void send(accepted);
81
+ };
82
+ const choose = (event)=>{
83
+ take(Array.from(event.target.files ?? []));
84
+ event.target.value = '';
85
+ };
86
+ const drop = (event)=>{
87
+ event.preventDefault();
88
+ setDragging(false);
89
+ if (rule === 'enabled') take(Array.from(event.dataTransfer.files));
90
+ };
91
+ const statusText = {
92
+ queued: strings.uploadQueued,
93
+ uploading: strings.uploadUploading,
94
+ done: strings.uploadDone,
95
+ failed: strings.uploadFailed
96
+ };
97
+ const limits = [
98
+ accept ? foundationStrings.formatText(strings.uploadAccepts, {
99
+ types: accept
100
+ }) : '',
101
+ maximumBytes > 0 ? foundationStrings.formatText(strings.uploadLimits, {
102
+ limit: uploadModel.formatBytes(maximumBytes, locale)
103
+ }) : ''
104
+ ].filter(Boolean).join(' · ');
105
+ return /*#__PURE__*/ jsxRuntime.jsx(StateFrame.FoundationFrame, {
106
+ element: element,
107
+ interactions: interactions,
108
+ name: "file-uploader",
109
+ state: state,
110
+ skeleton: [
111
+ 100,
112
+ 40
113
+ ],
114
+ children: state !== ComponentState.ComponentState.Loading && /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
115
+ children: [
116
+ /*#__PURE__*/ jsxRuntime.jsxs("div", {
117
+ className: "foundation-dropzone",
118
+ "data-dragging": dragging,
119
+ onDragOver: (event)=>{
120
+ event.preventDefault();
121
+ setDragging(true);
122
+ },
123
+ onDragLeave: ()=>setDragging(false),
124
+ onDrop: drop,
125
+ children: [
126
+ /*#__PURE__*/ jsxRuntime.jsx(FoundationIcon.FoundationIcon, {
127
+ name: "upload"
128
+ }),
129
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
130
+ children: strings.uploadDrop
131
+ }),
132
+ /*#__PURE__*/ jsxRuntime.jsx("input", {
133
+ ref: input,
134
+ className: "foundation-visually-hidden",
135
+ type: "file",
136
+ tabIndex: -1,
137
+ accept: accept || undefined,
138
+ multiple: multiple,
139
+ disabled: rule !== 'enabled',
140
+ onChange: choose,
141
+ "aria-hidden": "true"
142
+ }),
143
+ /*#__PURE__*/ jsxRuntime.jsx(ActionButton.ActionButton, {
144
+ rule: rule,
145
+ emphasis: "secondary",
146
+ disabledReason: strings.disabledNoPermission,
147
+ onClick: ()=>input.current?.click(),
148
+ children: strings.uploadBrowse
149
+ }),
150
+ limits && /*#__PURE__*/ jsxRuntime.jsx("span", {
151
+ className: "foundation-count",
152
+ children: limits
153
+ })
154
+ ]
155
+ }),
156
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
157
+ "aria-live": "polite",
158
+ className: "foundation-upload-problems",
159
+ children: problems.map((problem)=>/*#__PURE__*/ jsxRuntime.jsx("p", {
160
+ className: "foundation-message-text",
161
+ "data-tone": "danger",
162
+ children: problem
163
+ }, problem))
164
+ }),
165
+ entries.length > 0 && /*#__PURE__*/ jsxRuntime.jsx("ul", {
166
+ className: "foundation-upload-list",
167
+ "aria-label": strings.uploadSelected,
168
+ children: entries.map((entry, index)=>/*#__PURE__*/ jsxRuntime.jsxs("li", {
169
+ className: "foundation-upload-item",
170
+ "data-status": entry.status,
171
+ children: [
172
+ /*#__PURE__*/ jsxRuntime.jsx(FoundationIcon.FoundationIcon, {
173
+ name: "file"
174
+ }),
175
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
176
+ className: "foundation-upload-name",
177
+ children: entry.file.name
178
+ }),
179
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
180
+ className: "foundation-count",
181
+ children: uploadModel.formatBytes(entry.file.size, locale)
182
+ }),
183
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
184
+ className: "foundation-upload-status",
185
+ children: statusText[entry.status]
186
+ }),
187
+ entry.status === uploadModel.UploadStatus.Failed && /*#__PURE__*/ jsxRuntime.jsx("button", {
188
+ type: "button",
189
+ className: "foundation-link",
190
+ onClick: ()=>void send([
191
+ entry.file
192
+ ]),
193
+ children: strings.retry
194
+ }),
195
+ /*#__PURE__*/ jsxRuntime.jsx("button", {
196
+ type: "button",
197
+ className: "foundation-icon-button",
198
+ "aria-label": foundationStrings.formatText(strings.uploadRemove, {
199
+ name: entry.file.name
200
+ }),
201
+ onClick: ()=>{
202
+ setEntries((current)=>current.filter((existing)=>existing !== entry));
203
+ interactions?.onChange?.();
204
+ },
205
+ children: /*#__PURE__*/ jsxRuntime.jsx(FoundationIcon.FoundationIcon, {
206
+ name: "close"
207
+ })
208
+ })
209
+ ]
210
+ }, entry.file.name + index))
211
+ })
212
+ ]
213
+ })
214
+ });
215
+ }
216
+
217
+ exports.FileUploader = FileUploader;
218
+ //# sourceMappingURL=FileUploader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileUploader.js","sources":["../../../foundation/FileUploader.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, useRef, useState } from 'react';\nimport { RegisteredComponentProps, useValueOutput } from '@cratis/scene.react';\nimport { readOptionalString } from '../shell/elementProperties';\nimport { ActionButton } from './ActionButton';\nimport { ComponentState, readComponentState } from './ComponentState';\nimport { useFileUploaderHandler } from './FileUploaderHandler';\nimport { FoundationIcon } from './FoundationIcon';\nimport { readLocale } from './formatting';\nimport { formatText, readFoundationStrings } from './foundationStrings';\nimport { readPermissionRule } from './PermissionRule';\nimport { FoundationFrame } from './StateFrame';\nimport { UploadRefusal, UploadStatus, checkSelection, formatBytes } from './uploadModel';\n\ninterface Entry {\n file: File;\n status: UploadStatus;\n}\n\n/**\n * The `fileUploader` component: a drop zone and a button to choose files, checked against type and size before anything is sent.\n *\n * `accept` is an `accept` list, `maxSizeMb` the largest file, and `multiple` whether more than one is allowed. The zone is a real file\n * input behind a labelled button, so it works from the keyboard and with a screen reader; dropping onto it does the same as choosing.\n * Refusals are announced with their reason. Accepted files are listed with a remove button and a status in words; the selection\n * (name, size, type) is published as the `value` output. With a `FileUploaderHandlerProvider` in scope the files are sent through it and\n * marked uploading, done or failed; without one the component only collects. `actionPermission` gates choosing files.\n */\nexport function FileUploader({ element, interactions, bindingOutputs }: RegisteredComponentProps) {\n const strings = readFoundationStrings(element);\n const locale = readLocale(element);\n const handler = useFileUploaderHandler();\n const [entries, setEntries] = useState<Entry[]>([]);\n const [problems, setProblems] = useState<string[]>([]);\n const [dragging, setDragging] = useState(false);\n const input = useRef<HTMLInputElement>(null);\n const accept = readOptionalString(element, 'accept') ?? '';\n const maximumBytes = (typeof element.properties.maxSizeMb === 'number' ? element.properties.maxSizeMb : 0) * 1024 * 1024;\n const multiple = element.properties.multiple !== false;\n const rule = readPermissionRule(element, 'actionPermission');\n const state = readComponentState(element, true);\n const serverUrl = readOptionalString(element, 'serverUrl');\n\n useValueOutput(bindingOutputs, entries.map(entry => ({ name: entry.file.name, size: entry.file.size, type: entry.file.type, status: entry.status })));\n\n const send = async (files: File[]) => {\n if (!handler) return;\n const mark = (status: UploadStatus) => setEntries(current => current.map(entry => (files.includes(entry.file) ? { ...entry, status } : entry)));\n mark(UploadStatus.Uploading);\n try {\n await handler(files, serverUrl);\n mark(UploadStatus.Done);\n } catch {\n mark(UploadStatus.Failed);\n }\n };\n\n const take = (chosen: File[]) => {\n const { accepted, refused } = checkSelection(chosen, { accept, maximumBytes, multiple }, entries.length);\n setProblems(refused.map(({ file, reason }) => reason === UploadRefusal.WrongType ? formatText(strings.uploadWrongType, { name: file.name })\n : reason === UploadRefusal.TooLarge ? formatText(strings.uploadTooLarge, { name: file.name, limit: formatBytes(maximumBytes, locale) }) : strings.uploadSingle));\n if (accepted.length === 0) return;\n\n setEntries(current => [...current, ...accepted.map(file => ({ file, status: UploadStatus.Queued }))]);\n interactions?.onChange?.();\n void send(accepted);\n };\n\n const choose = (event: ChangeEvent<HTMLInputElement>) => {\n take(Array.from(event.target.files ?? []));\n event.target.value = '';\n };\n const drop = (event: DragEvent) => {\n event.preventDefault();\n setDragging(false);\n if (rule === 'enabled') take(Array.from(event.dataTransfer.files));\n };\n const statusText: Record<UploadStatus, string> = {\n queued: strings.uploadQueued, uploading: strings.uploadUploading, done: strings.uploadDone, failed: strings.uploadFailed,\n };\n const limits = [accept ? formatText(strings.uploadAccepts, { types: accept }) : '', maximumBytes > 0 ? formatText(strings.uploadLimits, { limit: formatBytes(maximumBytes, locale) }) : ''].filter(Boolean).join(' · ');\n\n return (\n <FoundationFrame element={element} interactions={interactions} name='file-uploader' state={state} skeleton={[100, 40]}>\n {state !== ComponentState.Loading && (\n <>\n <div className='foundation-dropzone' data-dragging={dragging} onDragOver={event => { event.preventDefault(); setDragging(true); }} onDragLeave={() => setDragging(false)} onDrop={drop}>\n <FoundationIcon name='upload' />\n <span>{strings.uploadDrop}</span>\n <input ref={input} className='foundation-visually-hidden' type='file' tabIndex={-1} accept={accept || undefined} multiple={multiple} disabled={rule !== 'enabled'} onChange={choose} aria-hidden='true' />\n <ActionButton rule={rule} emphasis='secondary' disabledReason={strings.disabledNoPermission} onClick={() => input.current?.click()}>\n {strings.uploadBrowse}\n </ActionButton>\n {limits && <span className='foundation-count'>{limits}</span>}\n </div>\n <div aria-live='polite' className='foundation-upload-problems'>\n {problems.map(problem => <p key={problem} className='foundation-message-text' data-tone='danger'>{problem}</p>)}\n </div>\n {entries.length > 0 && (\n <ul className='foundation-upload-list' aria-label={strings.uploadSelected}>\n {entries.map((entry, index) => (\n <li key={entry.file.name + index} className='foundation-upload-item' data-status={entry.status}>\n <FoundationIcon name='file' />\n <span className='foundation-upload-name'>{entry.file.name}</span>\n <span className='foundation-count'>{formatBytes(entry.file.size, locale)}</span>\n <span className='foundation-upload-status'>{statusText[entry.status]}</span>\n {entry.status === UploadStatus.Failed && <button type='button' className='foundation-link' onClick={() => void send([entry.file])}>{strings.retry}</button>}\n <button type='button' className='foundation-icon-button' aria-label={formatText(strings.uploadRemove, { name: entry.file.name })}\n onClick={() => { setEntries(current => current.filter(existing => existing !== entry)); interactions?.onChange?.(); }}>\n <FoundationIcon name='close' />\n </button>\n </li>\n ))}\n </ul>\n )}\n </>\n )}\n </FoundationFrame>\n );\n}\n"],"names":["FileUploader","element","interactions","bindingOutputs","strings","readFoundationStrings","locale","readLocale","handler","useFileUploaderHandler","entries","setEntries","useState","problems","setProblems","dragging","setDragging","input","useRef","accept","readOptionalString","maximumBytes","properties","maxSizeMb","multiple","rule","readPermissionRule","state","readComponentState","serverUrl","useValueOutput","map","entry","name","file","size","type","status","send","files","mark","current","includes","UploadStatus","Uploading","Done","Failed","take","chosen","accepted","refused","checkSelection","length","reason","UploadRefusal","WrongType","formatText","uploadWrongType","TooLarge","uploadTooLarge","limit","formatBytes","uploadSingle","Queued","onChange","choose","event","Array","from","target","value","drop","preventDefault","dataTransfer","statusText","queued","uploadQueued","uploading","uploadUploading","done","uploadDone","failed","uploadFailed","limits","uploadAccepts","types","uploadLimits","filter","Boolean","join","_jsx","FoundationFrame","skeleton","ComponentState","Loading","_jsxs","_Fragment","div","className","data-dragging","onDragOver","onDragLeave","onDrop","FoundationIcon","span","uploadDrop","ref","tabIndex","undefined","disabled","aria-hidden","ActionButton","emphasis","disabledReason","disabledNoPermission","onClick","click","uploadBrowse","aria-live","problem","p","data-tone","ul","aria-label","uploadSelected","index","li","data-status","button","retry","uploadRemove","existing"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var react = require('react');
5
+
6
+ const Context = /*#__PURE__*/ react.createContext(undefined);
7
+ /** Provides the upload handler to the file uploaders below it. */ function FileUploaderHandlerProvider({ handler, children }) {
8
+ return /*#__PURE__*/ jsxRuntime.jsx(Context.Provider, {
9
+ value: handler,
10
+ children: children
11
+ });
12
+ }
13
+ /** The handler in scope, if any. */ const useFileUploaderHandler = ()=>react.useContext(Context);
14
+
15
+ exports.FileUploaderHandlerProvider = FileUploaderHandlerProvider;
16
+ exports.useFileUploaderHandler = useFileUploaderHandler;
17
+ //# sourceMappingURL=FileUploaderHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileUploaderHandler.js","sources":["../../../foundation/FileUploaderHandler.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ReactNode, createContext, useContext } from 'react';\n\n/**\n * What sends the accepted files somewhere: a host's server client, kept out of the portable package.\n *\n * The signature is the one `@cratis/scene.primereact` uses for its `fileUpload`, so a host hands the same function to both. A handler that\n * rejects marks the files as failed, with a retry; without a handler the uploader only collects and publishes the selection.\n */\nexport type FileUploaderHandler = (files: File[], serverUrl?: string) => Promise<void>;\n\nconst Context = createContext<FileUploaderHandler | undefined>(undefined);\n\n/** Provides the upload handler to the file uploaders below it. */\nexport function FileUploaderHandlerProvider({ handler, children }: { handler?: FileUploaderHandler; children: ReactNode }) {\n return <Context.Provider value={handler}>{children}</Context.Provider>;\n}\n\n/** The handler in scope, if any. */\nexport const useFileUploaderHandler = (): FileUploaderHandler | undefined => useContext(Context);\n"],"names":["Context","createContext","undefined","FileUploaderHandlerProvider","handler","children","_jsx","Provider","value","useFileUploaderHandler","useContext"],"mappings":";;;;;AAaA,MAAMA,wBAAUC,mBAAAA,CAA+CC,SAAAA,CAAAA;AAE/D,mEACO,SAASC,2BAAAA,CAA4B,EAAEC,OAAO,EAAEC,QAAQ,EAA0D,EAAA;IACrH,qBAAOC,cAAA,CAACN,QAAQO,QAAQ,EAAA;QAACC,KAAAA,EAAOJ,OAAAA;AAAUC,QAAAA,QAAAA,EAAAA;;AAC9C;AAEA,qCACO,MAAMI,sBAAAA,GAAyB,IAAuCC,iBAAWV,OAAAA;;;"}