@cratis/scene.blueprint.default 4.38.0 → 4.40.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 (167) hide show
  1. package/ComponentName.ts +27 -0
  2. package/defaultBlueprintComponents.ts +10 -1
  3. package/dist/cjs/ComponentName.js +9 -0
  4. package/dist/cjs/ComponentName.js.map +1 -1
  5. package/dist/cjs/defaultBlueprintComponents.js +19 -1
  6. package/dist/cjs/defaultBlueprintComponents.js.map +1 -1
  7. package/dist/cjs/foundation/BulkBar.js +62 -0
  8. package/dist/cjs/foundation/BulkBar.js.map +1 -0
  9. package/dist/cjs/foundation/DataList.js +436 -0
  10. package/dist/cjs/foundation/DataList.js.map +1 -0
  11. package/dist/cjs/foundation/FormScreenBody.js +447 -0
  12. package/dist/cjs/foundation/FormScreenBody.js.map +1 -0
  13. package/dist/cjs/foundation/FoundationStates.js +2 -1
  14. package/dist/cjs/foundation/FoundationStates.js.map +1 -1
  15. package/dist/cjs/foundation/GlobalSearch.js +54 -0
  16. package/dist/cjs/foundation/GlobalSearch.js.map +1 -0
  17. package/dist/cjs/foundation/KanbanBoard.js +222 -0
  18. package/dist/cjs/foundation/KanbanBoard.js.map +1 -0
  19. package/dist/cjs/foundation/NotificationsButton.js +45 -0
  20. package/dist/cjs/foundation/NotificationsButton.js.map +1 -0
  21. package/dist/cjs/foundation/SubNavigation.js +72 -0
  22. package/dist/cjs/foundation/SubNavigation.js.map +1 -0
  23. package/dist/cjs/foundation/TabSet.js +101 -0
  24. package/dist/cjs/foundation/TabSet.js.map +1 -0
  25. package/dist/cjs/foundation/WizardProgress.js +185 -0
  26. package/dist/cjs/foundation/WizardProgress.js.map +1 -0
  27. package/dist/cjs/foundation/boardModel.js +67 -0
  28. package/dist/cjs/foundation/boardModel.js.map +1 -0
  29. package/dist/cjs/foundation/formModel.js +158 -0
  30. package/dist/cjs/foundation/formModel.js.map +1 -0
  31. package/dist/cjs/foundation/foundationComponentMetadata.js +54 -0
  32. package/dist/cjs/foundation/foundationComponentMetadata.js.map +1 -1
  33. package/dist/cjs/foundation/foundationDescriptors.js +400 -0
  34. package/dist/cjs/foundation/foundationDescriptors.js.map +1 -1
  35. package/dist/cjs/foundation/foundationSamples.js +303 -0
  36. package/dist/cjs/foundation/foundationSamples.js.map +1 -1
  37. package/dist/cjs/foundation/foundationStrings.js +72 -0
  38. package/dist/cjs/foundation/foundationStrings.js.map +1 -1
  39. package/dist/cjs/foundation/listModel.js +200 -0
  40. package/dist/cjs/foundation/listModel.js.map +1 -0
  41. package/dist/cjs/foundation/tabModel.js +41 -0
  42. package/dist/cjs/foundation/tabModel.js.map +1 -0
  43. package/dist/cjs/foundation/urlState.js +57 -0
  44. package/dist/cjs/foundation/urlState.js.map +1 -0
  45. package/dist/cjs/foundation/useCompactWidth.js +23 -0
  46. package/dist/cjs/foundation/useCompactWidth.js.map +1 -0
  47. package/dist/cjs/foundation/wizardModel.js +50 -0
  48. package/dist/cjs/foundation/wizardModel.js.map +1 -0
  49. package/dist/cjs/index.js +71 -0
  50. package/dist/cjs/index.js.map +1 -1
  51. package/dist/esm/ComponentName.d.ts +10 -1
  52. package/dist/esm/ComponentName.d.ts.map +1 -1
  53. package/dist/esm/ComponentName.js +9 -0
  54. package/dist/esm/ComponentName.js.map +1 -1
  55. package/dist/esm/defaultBlueprintComponents.d.ts.map +1 -1
  56. package/dist/esm/defaultBlueprintComponents.js +19 -1
  57. package/dist/esm/defaultBlueprintComponents.js.map +1 -1
  58. package/dist/esm/foundation/BulkBar.d.ts +4 -0
  59. package/dist/esm/foundation/BulkBar.d.ts.map +1 -0
  60. package/dist/esm/foundation/BulkBar.js +59 -0
  61. package/dist/esm/foundation/BulkBar.js.map +1 -0
  62. package/dist/esm/foundation/DataList.d.ts +3 -0
  63. package/dist/esm/foundation/DataList.d.ts.map +1 -0
  64. package/dist/esm/foundation/DataList.js +434 -0
  65. package/dist/esm/foundation/DataList.js.map +1 -0
  66. package/dist/esm/foundation/FormScreenBody.d.ts +3 -0
  67. package/dist/esm/foundation/FormScreenBody.d.ts.map +1 -0
  68. package/dist/esm/foundation/FormScreenBody.js +445 -0
  69. package/dist/esm/foundation/FormScreenBody.js.map +1 -0
  70. package/dist/esm/foundation/FoundationStates.js +2 -1
  71. package/dist/esm/foundation/FoundationStates.js.map +1 -1
  72. package/dist/esm/foundation/GlobalSearch.d.ts +3 -0
  73. package/dist/esm/foundation/GlobalSearch.d.ts.map +1 -0
  74. package/dist/esm/foundation/GlobalSearch.js +52 -0
  75. package/dist/esm/foundation/GlobalSearch.js.map +1 -0
  76. package/dist/esm/foundation/KanbanBoard.d.ts +3 -0
  77. package/dist/esm/foundation/KanbanBoard.d.ts.map +1 -0
  78. package/dist/esm/foundation/KanbanBoard.js +220 -0
  79. package/dist/esm/foundation/KanbanBoard.js.map +1 -0
  80. package/dist/esm/foundation/NotificationsButton.d.ts +3 -0
  81. package/dist/esm/foundation/NotificationsButton.d.ts.map +1 -0
  82. package/dist/esm/foundation/NotificationsButton.js +43 -0
  83. package/dist/esm/foundation/NotificationsButton.js.map +1 -0
  84. package/dist/esm/foundation/SubNavigation.d.ts +3 -0
  85. package/dist/esm/foundation/SubNavigation.d.ts.map +1 -0
  86. package/dist/esm/foundation/SubNavigation.js +70 -0
  87. package/dist/esm/foundation/SubNavigation.js.map +1 -0
  88. package/dist/esm/foundation/TabSet.d.ts +3 -0
  89. package/dist/esm/foundation/TabSet.d.ts.map +1 -0
  90. package/dist/esm/foundation/TabSet.js +99 -0
  91. package/dist/esm/foundation/TabSet.js.map +1 -0
  92. package/dist/esm/foundation/WizardProgress.d.ts +3 -0
  93. package/dist/esm/foundation/WizardProgress.d.ts.map +1 -0
  94. package/dist/esm/foundation/WizardProgress.js +183 -0
  95. package/dist/esm/foundation/WizardProgress.js.map +1 -0
  96. package/dist/esm/foundation/boardModel.d.ts +22 -0
  97. package/dist/esm/foundation/boardModel.d.ts.map +1 -0
  98. package/dist/esm/foundation/boardModel.js +61 -0
  99. package/dist/esm/foundation/boardModel.js.map +1 -0
  100. package/dist/esm/foundation/formModel.d.ts +48 -0
  101. package/dist/esm/foundation/formModel.d.ts.map +1 -0
  102. package/dist/esm/foundation/formModel.js +147 -0
  103. package/dist/esm/foundation/formModel.js.map +1 -0
  104. package/dist/esm/foundation/foundationComponentMetadata.d.ts.map +1 -1
  105. package/dist/esm/foundation/foundationComponentMetadata.js +54 -0
  106. package/dist/esm/foundation/foundationComponentMetadata.js.map +1 -1
  107. package/dist/esm/foundation/foundationDescriptors.d.ts.map +1 -1
  108. package/dist/esm/foundation/foundationDescriptors.js +400 -0
  109. package/dist/esm/foundation/foundationDescriptors.js.map +1 -1
  110. package/dist/esm/foundation/foundationSamples.d.ts.map +1 -1
  111. package/dist/esm/foundation/foundationSamples.js +303 -0
  112. package/dist/esm/foundation/foundationSamples.js.map +1 -1
  113. package/dist/esm/foundation/foundationStrings.d.ts +72 -0
  114. package/dist/esm/foundation/foundationStrings.d.ts.map +1 -1
  115. package/dist/esm/foundation/foundationStrings.js +72 -0
  116. package/dist/esm/foundation/foundationStrings.js.map +1 -1
  117. package/dist/esm/foundation/index.d.ts +16 -0
  118. package/dist/esm/foundation/index.d.ts.map +1 -1
  119. package/dist/esm/foundation/index.js +16 -0
  120. package/dist/esm/foundation/index.js.map +1 -1
  121. package/dist/esm/foundation/listModel.d.ts +49 -0
  122. package/dist/esm/foundation/listModel.d.ts.map +1 -0
  123. package/dist/esm/foundation/listModel.js +183 -0
  124. package/dist/esm/foundation/listModel.js.map +1 -0
  125. package/dist/esm/foundation/tabModel.d.ts +10 -0
  126. package/dist/esm/foundation/tabModel.d.ts.map +1 -0
  127. package/dist/esm/foundation/tabModel.js +37 -0
  128. package/dist/esm/foundation/tabModel.js.map +1 -0
  129. package/dist/esm/foundation/urlState.d.ts +4 -0
  130. package/dist/esm/foundation/urlState.d.ts.map +1 -0
  131. package/dist/esm/foundation/urlState.js +53 -0
  132. package/dist/esm/foundation/urlState.js.map +1 -0
  133. package/dist/esm/foundation/useCompactWidth.d.ts +3 -0
  134. package/dist/esm/foundation/useCompactWidth.d.ts.map +1 -0
  135. package/dist/esm/foundation/useCompactWidth.js +20 -0
  136. package/dist/esm/foundation/useCompactWidth.js.map +1 -0
  137. package/dist/esm/foundation/wizardModel.d.ts +16 -0
  138. package/dist/esm/foundation/wizardModel.d.ts.map +1 -0
  139. package/dist/esm/foundation/wizardModel.js +43 -0
  140. package/dist/esm/foundation/wizardModel.js.map +1 -0
  141. package/dist/esm/index.js +16 -0
  142. package/dist/esm/index.js.map +1 -1
  143. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  144. package/foundation/BulkBar.tsx +38 -0
  145. package/foundation/DataList.tsx +208 -0
  146. package/foundation/FormScreenBody.tsx +196 -0
  147. package/foundation/FoundationStates.tsx +1 -1
  148. package/foundation/GlobalSearch.tsx +33 -0
  149. package/foundation/KanbanBoard.tsx +97 -0
  150. package/foundation/NotificationsButton.tsx +28 -0
  151. package/foundation/SubNavigation.tsx +49 -0
  152. package/foundation/TabSet.tsx +65 -0
  153. package/foundation/WizardProgress.tsx +109 -0
  154. package/foundation/boardModel.ts +64 -0
  155. package/foundation/formModel.ts +146 -0
  156. package/foundation/foundationComponentMetadata.ts +9 -0
  157. package/foundation/foundationDescriptors.ts +195 -0
  158. package/foundation/foundationSamples.ts +56 -0
  159. package/foundation/foundationStrings.ts +72 -0
  160. package/foundation/index.ts +16 -0
  161. package/foundation/listModel.ts +190 -0
  162. package/foundation/tabModel.ts +41 -0
  163. package/foundation/urlState.ts +52 -0
  164. package/foundation/useCompactWidth.ts +23 -0
  165. package/foundation/wizardModel.ts +54 -0
  166. package/package.json +8 -8
  167. package/shell/layout.css +513 -0
@@ -0,0 +1,185 @@
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 ComponentState = require('./ComponentState.js');
8
+ var FoundationIcon = require('./FoundationIcon.js');
9
+ var foundationStrings = require('./foundationStrings.js');
10
+ var StateFrame = require('./StateFrame.js');
11
+ var wizardModel = require('./wizardModel.js');
12
+ var ActionButton = require('./ActionButton.js');
13
+ var urlState = require('./urlState.js');
14
+
15
+ const storageKey = (element, key)=>`scene.wizard.${key ?? element.id}`;
16
+ /**
17
+ * The completed steps saved in the session, or none. Storage can be absent or refuse access - server rendering, a sandboxed frame, a browser in a
18
+ * private mode - and a wizard that cannot remember its progress is still a wizard, so every storage access is guarded and a failure only loses the memory.
19
+ */ function readSaved(key) {
20
+ try {
21
+ const saved = JSON.parse(window.sessionStorage.getItem(key) ?? '[]');
22
+ return new Set(Array.isArray(saved) ? saved.filter((id)=>typeof id === 'string') : []);
23
+ } catch {
24
+ return new Set();
25
+ }
26
+ }
27
+ /** Saves the completed steps for the session; a refusal by the browser is ignored (see {@link readSaved}). */ function writeSaved(key, completed) {
28
+ try {
29
+ window.sessionStorage.setItem(key, JSON.stringify([
30
+ ...completed
31
+ ]));
32
+ } catch {
33
+ // The progress is simply not remembered across a refresh.
34
+ }
35
+ }
36
+ /**
37
+ * The `wizardProgress` component: the steps of a linear wizard, the back/next/finish controls and the draft save, with the step's own content in
38
+ * the slot named by its id.
39
+ *
40
+ * `steps` (`id`, `label`, `valid`) are linear. Next is blocked while the current step is not `valid`, and says so. The final step is the review step: Finish
41
+ * replaces Next. Completed steps stay in a progress list and can be revisited; a step cannot be opened before the ones ahead of it are done. The current step
42
+ * (in the address under `urlKey`) and the completed steps (in the session) are restored on refresh, and a refresh can never land past a step that was not
43
+ * done. The id of the current step is the `value` output; "Save draft" runs the behaviors attached to the element and says so.
44
+ */ function WizardProgress({ element, interactions, slots, bindingOutputs }) {
45
+ const steps = react.useMemo(()=>wizardModel.readWizardSteps(element.properties.steps), [
46
+ element.properties.steps
47
+ ]);
48
+ const urlKey = elementProperties.readOptionalString(element, 'urlKey');
49
+ const [requested, setRequested] = urlState.useUrlState(urlKey, elementProperties.readOptionalString(element, 'currentStep'));
50
+ const key = storageKey(element, urlKey);
51
+ const [completed, setCompleted] = react.useState(()=>readSaved(key));
52
+ const [draftSaved, setDraftSaved] = react.useState(false);
53
+ const strings = foundationStrings.readFoundationStrings(element);
54
+ const state = ComponentState.readComponentState(element, steps.length > 0);
55
+ const current = wizardModel.reachableStep(steps, completed, requested);
56
+ const index = steps.findIndex((step)=>step.id === current);
57
+ const step = steps[index];
58
+ const last = index === steps.length - 1;
59
+ react.useEffect(()=>writeSaved(key, completed), [
60
+ key,
61
+ completed
62
+ ]);
63
+ scene_react.useValueOutput(bindingOutputs, current);
64
+ const go = (id)=>{
65
+ if (id === undefined) return;
66
+ setRequested(id);
67
+ setDraftSaved(false);
68
+ interactions?.onSelect?.();
69
+ };
70
+ const next = ()=>{
71
+ if (!step?.valid) return;
72
+ setCompleted((current_)=>new Set(current_).add(step.id));
73
+ go(wizardModel.neighbour(steps, current, 1)?.id);
74
+ };
75
+ const finish = ()=>{
76
+ if (!step?.valid) return;
77
+ setCompleted((current_)=>new Set(current_).add(step.id));
78
+ interactions?.onClick?.({
79
+ stopPropagation: ()=>undefined
80
+ });
81
+ };
82
+ return /*#__PURE__*/ jsxRuntime.jsx(StateFrame.FoundationFrame, {
83
+ element: element,
84
+ interactions: interactions,
85
+ name: "wizard",
86
+ state: state,
87
+ skeleton: [
88
+ 100,
89
+ 60,
90
+ 100
91
+ ],
92
+ children: state !== ComponentState.ComponentState.Loading && step && /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
93
+ children: [
94
+ /*#__PURE__*/ jsxRuntime.jsx("nav", {
95
+ "aria-label": strings.wizardProgress,
96
+ children: /*#__PURE__*/ jsxRuntime.jsx("ol", {
97
+ className: "foundation-wizard-steps",
98
+ children: steps.map((candidate, position)=>{
99
+ const status = wizardModel.statusOf(completed, current, candidate.id);
100
+ const open = wizardModel.canOpen(steps, completed, candidate.id);
101
+ const text = status === wizardModel.StepStatus.Completed ? strings.wizardComplete : status === wizardModel.StepStatus.Current ? strings.wizardCurrent : strings.wizardUpcoming;
102
+ return /*#__PURE__*/ jsxRuntime.jsx("li", {
103
+ className: "foundation-wizard-step",
104
+ "data-status": status,
105
+ children: /*#__PURE__*/ jsxRuntime.jsxs("button", {
106
+ type: "button",
107
+ "aria-current": status === wizardModel.StepStatus.Current ? 'step' : undefined,
108
+ disabled: !open,
109
+ onClick: ()=>go(candidate.id),
110
+ children: [
111
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
112
+ className: "foundation-wizard-marker",
113
+ children: status === wizardModel.StepStatus.Completed ? /*#__PURE__*/ jsxRuntime.jsx(FoundationIcon.FoundationIcon, {
114
+ name: "check"
115
+ }) : position + 1
116
+ }),
117
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
118
+ children: candidate.label
119
+ }),
120
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
121
+ className: "foundation-visually-hidden",
122
+ children: `, ${foundationStrings.formatText(strings.wizardStep, {
123
+ n: position + 1,
124
+ total: steps.length
125
+ })}, ${text}`
126
+ })
127
+ ]
128
+ })
129
+ }, candidate.id);
130
+ })
131
+ })
132
+ }),
133
+ /*#__PURE__*/ jsxRuntime.jsx("div", {
134
+ className: "foundation-wizard-body",
135
+ role: "group",
136
+ "aria-label": `${foundationStrings.formatText(strings.wizardStep, {
137
+ n: index + 1,
138
+ total: steps.length
139
+ })}: ${step.label}`,
140
+ children: slots?.[step.id]
141
+ }),
142
+ /*#__PURE__*/ jsxRuntime.jsxs("div", {
143
+ className: "foundation-wizard-actions",
144
+ children: [
145
+ /*#__PURE__*/ jsxRuntime.jsx(ActionButton.ActionButton, {
146
+ emphasis: "quiet",
147
+ disabledReason: strings.disabledNoPermission,
148
+ onClick: ()=>{
149
+ setDraftSaved(true);
150
+ interactions?.onClick?.({
151
+ stopPropagation: ()=>undefined
152
+ });
153
+ },
154
+ children: strings.wizardSaveDraft
155
+ }),
156
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
157
+ role: "status",
158
+ className: "foundation-count",
159
+ children: draftSaved ? strings.wizardDraftSaved : ''
160
+ }),
161
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
162
+ className: "foundation-wizard-spacer"
163
+ }),
164
+ index > 0 && /*#__PURE__*/ jsxRuntime.jsx(ActionButton.ActionButton, {
165
+ emphasis: "secondary",
166
+ disabledReason: strings.disabledNoPermission,
167
+ onClick: ()=>go(wizardModel.neighbour(steps, current, -1)?.id),
168
+ children: strings.wizardBack
169
+ }),
170
+ /*#__PURE__*/ jsxRuntime.jsx("button", {
171
+ type: "button",
172
+ className: "foundation-button",
173
+ "aria-disabled": !step.valid || undefined,
174
+ onClick: last ? finish : next,
175
+ children: last ? strings.wizardFinish : strings.wizardNext
176
+ })
177
+ ]
178
+ })
179
+ ]
180
+ })
181
+ });
182
+ }
183
+
184
+ exports.WizardProgress = WizardProgress;
185
+ //# sourceMappingURL=WizardProgress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WizardProgress.js","sources":["../../../foundation/WizardProgress.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 { readOptionalString } from '../shell/elementProperties';\nimport { ComponentState, readComponentState } from './ComponentState';\nimport { FoundationIcon } from './FoundationIcon';\nimport { formatText, readFoundationStrings } from './foundationStrings';\nimport { FoundationFrame } from './StateFrame';\nimport { StepStatus, canOpen, neighbour, readWizardSteps, reachableStep, statusOf } from './wizardModel';\nimport { ActionButton } from './ActionButton';\nimport { useUrlState } from './urlState';\n\nconst storageKey = (element: { id: string }, key: string | undefined) => `scene.wizard.${key ?? element.id}`;\n\n/**\n * The completed steps saved in the session, or none. Storage can be absent or refuse access - server rendering, a sandboxed frame, a browser in a\n * private mode - and a wizard that cannot remember its progress is still a wizard, so every storage access is guarded and a failure only loses the memory.\n */\nfunction readSaved(key: string): Set<string> {\n try {\n const saved = JSON.parse(window.sessionStorage.getItem(key) ?? '[]') as unknown;\n return new Set(Array.isArray(saved) ? saved.filter((id): id is string => typeof id === 'string') : []);\n } catch {\n return new Set();\n }\n}\n\n/** Saves the completed steps for the session; a refusal by the browser is ignored (see {@link readSaved}). */\nfunction writeSaved(key: string, completed: Set<string>): void {\n try {\n window.sessionStorage.setItem(key, JSON.stringify([...completed]));\n } catch {\n // The progress is simply not remembered across a refresh.\n }\n}\n\n/**\n * The `wizardProgress` component: the steps of a linear wizard, the back/next/finish controls and the draft save, with the step's own content in\n * the slot named by its id.\n *\n * `steps` (`id`, `label`, `valid`) are linear. Next is blocked while the current step is not `valid`, and says so. The final step is the review step: Finish\n * replaces Next. Completed steps stay in a progress list and can be revisited; a step cannot be opened before the ones ahead of it are done. The current step\n * (in the address under `urlKey`) and the completed steps (in the session) are restored on refresh, and a refresh can never land past a step that was not\n * done. The id of the current step is the `value` output; \"Save draft\" runs the behaviors attached to the element and says so.\n */\nexport function WizardProgress({ element, interactions, slots, bindingOutputs }: RegisteredComponentProps) {\n const steps = useMemo(() => readWizardSteps(element.properties.steps), [element.properties.steps]);\n const urlKey = readOptionalString(element, 'urlKey');\n const [requested, setRequested] = useUrlState(urlKey, readOptionalString(element, 'currentStep'));\n const key = storageKey(element, urlKey);\n const [completed, setCompleted] = useState<Set<string>>(() => readSaved(key));\n const [draftSaved, setDraftSaved] = useState(false);\n const strings = readFoundationStrings(element);\n const state = readComponentState(element, steps.length > 0);\n const current = reachableStep(steps, completed, requested);\n const index = steps.findIndex(step => step.id === current);\n const step = steps[index];\n const last = index === steps.length - 1;\n\n useEffect(() => writeSaved(key, completed), [key, completed]);\n useValueOutput(bindingOutputs, current);\n\n const go = (id: string | undefined) => { if (id === undefined) return; setRequested(id); setDraftSaved(false); interactions?.onSelect?.(); };\n const next = () => {\n if (!step?.valid) return;\n setCompleted(current_ => new Set(current_).add(step.id));\n go(neighbour(steps, current, 1)?.id);\n };\n const finish = () => { if (!step?.valid) return; setCompleted(current_ => new Set(current_).add(step.id)); interactions?.onClick?.({ stopPropagation: () => undefined }); };\n\n return (\n <FoundationFrame element={element} interactions={interactions} name='wizard' state={state} skeleton={[100, 60, 100]}>\n {state !== ComponentState.Loading && step && (\n <>\n <nav aria-label={strings.wizardProgress}>\n <ol className='foundation-wizard-steps'>\n {steps.map((candidate, position) => {\n const status = statusOf(completed, current, candidate.id);\n const open = canOpen(steps, completed, candidate.id);\n const text = status === StepStatus.Completed ? strings.wizardComplete : status === StepStatus.Current ? strings.wizardCurrent : strings.wizardUpcoming;\n return (\n <li key={candidate.id} className='foundation-wizard-step' data-status={status}>\n <button type='button' aria-current={status === StepStatus.Current ? 'step' : undefined} disabled={!open} onClick={() => go(candidate.id)}>\n <span className='foundation-wizard-marker'>{status === StepStatus.Completed ? <FoundationIcon name='check' /> : position + 1}</span>\n <span>{candidate.label}</span>\n <span className='foundation-visually-hidden'>{`, ${formatText(strings.wizardStep, { n: position + 1, total: steps.length })}, ${text}`}</span>\n </button>\n </li>\n );\n })}\n </ol>\n </nav>\n <div className='foundation-wizard-body' role='group' aria-label={`${formatText(strings.wizardStep, { n: index + 1, total: steps.length })}: ${step.label}`}>\n {slots?.[step.id]}\n </div>\n <div className='foundation-wizard-actions'>\n <ActionButton emphasis='quiet' disabledReason={strings.disabledNoPermission} onClick={() => { setDraftSaved(true); interactions?.onClick?.({ stopPropagation: () => undefined }); }}>{strings.wizardSaveDraft}</ActionButton>\n <span role='status' className='foundation-count'>{draftSaved ? strings.wizardDraftSaved : ''}</span>\n <span className='foundation-wizard-spacer' />\n {index > 0 && <ActionButton emphasis='secondary' disabledReason={strings.disabledNoPermission} onClick={() => go(neighbour(steps, current, -1)?.id)}>{strings.wizardBack}</ActionButton>}\n <button type='button' className='foundation-button' aria-disabled={!step.valid || undefined} onClick={last ? finish : next}>{last ? strings.wizardFinish : strings.wizardNext}</button>\n </div>\n </>\n )}\n </FoundationFrame>\n );\n}\n"],"names":["storageKey","element","key","id","readSaved","saved","JSON","parse","window","sessionStorage","getItem","Set","Array","isArray","filter","writeSaved","completed","setItem","stringify","WizardProgress","interactions","slots","bindingOutputs","steps","useMemo","readWizardSteps","properties","urlKey","readOptionalString","requested","setRequested","useUrlState","setCompleted","useState","draftSaved","setDraftSaved","strings","readFoundationStrings","state","readComponentState","length","current","reachableStep","index","findIndex","step","last","useEffect","useValueOutput","go","undefined","onSelect","next","valid","current_","add","neighbour","finish","onClick","stopPropagation","_jsx","FoundationFrame","name","skeleton","ComponentState","Loading","_jsxs","_Fragment","nav","aria-label","wizardProgress","ol","className","map","candidate","position","status","statusOf","open","canOpen","text","StepStatus","Completed","wizardComplete","Current","wizardCurrent","wizardUpcoming","li","data-status","button","type","aria-current","disabled","span","FoundationIcon","label","formatText","wizardStep","n","total","div","role","ActionButton","emphasis","disabledReason","disabledNoPermission","wizardSaveDraft","wizardDraftSaved","wizardBack","aria-disabled","wizardFinish","wizardNext"],"mappings":"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"}
@@ -0,0 +1,67 @@
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
+ /** One column of a board, mapped to a status or stage value. */ const records = (value)=>Array.isArray(value) ? value.filter((entry)=>typeof entry === 'object' && entry !== null && !Array.isArray(entry)) : [];
6
+ /** Reads columns, dropping those without an id and repeated ids. */ function readColumnsOfBoard(value) {
7
+ const seen = new Set();
8
+ return records(value).flatMap((entry)=>{
9
+ if (typeof entry.id !== 'string' || entry.id.length === 0 || seen.has(entry.id)) return [];
10
+ seen.add(entry.id);
11
+ return [
12
+ {
13
+ id: entry.id,
14
+ label: typeof entry.label === 'string' && entry.label.length > 0 ? entry.label : entry.id,
15
+ limit: typeof entry.limit === 'number' && entry.limit > 0 ? Math.floor(entry.limit) : 0
16
+ }
17
+ ];
18
+ });
19
+ }
20
+ /** Reads cards, dropping those without an id or a title, keeping at most three key fields. */ function readCards(value) {
21
+ const seen = new Set();
22
+ return records(value).flatMap((entry)=>{
23
+ if (typeof entry.id !== 'string' || entry.id.length === 0 || seen.has(entry.id) || typeof entry.title !== 'string') return [];
24
+ seen.add(entry.id);
25
+ const fields = records(entry.fields).flatMap((field)=>typeof field.label === 'string' && typeof field.value === 'string' ? [
26
+ {
27
+ label: field.label,
28
+ value: field.value
29
+ }
30
+ ] : []).slice(0, 3);
31
+ return [
32
+ {
33
+ id: entry.id,
34
+ title: entry.title,
35
+ column: typeof entry.column === 'string' ? entry.column : '',
36
+ fields,
37
+ badges: Array.isArray(entry.badges) ? entry.badges.filter((badge)=>typeof badge === 'string') : [],
38
+ ...typeof entry.assignee === 'string' ? {
39
+ assignee: entry.assignee
40
+ } : {}
41
+ }
42
+ ];
43
+ });
44
+ }
45
+ /** The cards of one column, in the order given. A card whose column does not exist is shown in the first column rather than lost. */ function cardsOf(columns, cards, column) {
46
+ const known = new Set(columns.map((candidate)=>candidate.id));
47
+ return cards.filter((card)=>card.column === column || column === columns[0]?.id && !known.has(card.column));
48
+ }
49
+ /** Moves a card to a column, at the end; moving to the column it is in, or to one that does not exist, changes nothing. */ function moveCard(columns, cards, id, to) {
50
+ const card = cards.find((candidate)=>candidate.id === id);
51
+ if (!card || !columns.some((column)=>column.id === to) || cardsOf(columns, cards, to).includes(card)) return cards;
52
+ return [
53
+ ...cards.filter((candidate)=>candidate.id !== id),
54
+ {
55
+ ...card,
56
+ column: to
57
+ }
58
+ ];
59
+ }
60
+ /** Whether a column holds more cards than its limit. */ const overLimit = (column, count)=>column.limit > 0 && count > column.limit;
61
+
62
+ exports.cardsOf = cardsOf;
63
+ exports.moveCard = moveCard;
64
+ exports.overLimit = overLimit;
65
+ exports.readCards = readCards;
66
+ exports.readColumnsOfBoard = readColumnsOfBoard;
67
+ //# sourceMappingURL=boardModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boardModel.js","sources":["../../../foundation/boardModel.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/** One column of a board, mapped to a status or stage value. */\nexport interface BoardColumn {\n id: string;\n label: string;\n /** The most cards the stage should hold; 0 means no limit. */\n limit: number;\n}\n\n/** One card: the title, an assignee, a few key fields and badges. */\nexport interface BoardCard {\n id: string;\n title: string;\n column: string;\n assignee?: string;\n fields: { label: string; value: string }[];\n badges: string[];\n}\n\nconst records = (value: unknown): Record<string, unknown>[] =>\n Array.isArray(value) ? value.filter((entry): entry is Record<string, unknown> => typeof entry === 'object' && entry !== null && !Array.isArray(entry)) : [];\n\n/** Reads columns, dropping those without an id and repeated ids. */\nexport function readColumnsOfBoard(value: unknown): BoardColumn[] {\n const seen = new Set<string>();\n return records(value).flatMap(entry => {\n if (typeof entry.id !== 'string' || entry.id.length === 0 || seen.has(entry.id)) return [];\n seen.add(entry.id);\n return [{ id: entry.id, label: typeof entry.label === 'string' && entry.label.length > 0 ? entry.label : entry.id, limit: typeof entry.limit === 'number' && entry.limit > 0 ? Math.floor(entry.limit) : 0 }];\n });\n}\n\n/** Reads cards, dropping those without an id or a title, keeping at most three key fields. */\nexport function readCards(value: unknown): BoardCard[] {\n const seen = new Set<string>();\n return records(value).flatMap(entry => {\n if (typeof entry.id !== 'string' || entry.id.length === 0 || seen.has(entry.id) || typeof entry.title !== 'string') return [];\n seen.add(entry.id);\n const fields = records(entry.fields).flatMap(field => (typeof field.label === 'string' && typeof field.value === 'string' ? [{ label: field.label, value: field.value }] : [])).slice(0, 3);\n return [{\n id: entry.id, title: entry.title, column: typeof entry.column === 'string' ? entry.column : '', fields,\n badges: Array.isArray(entry.badges) ? entry.badges.filter((badge): badge is string => typeof badge === 'string') : [],\n ...(typeof entry.assignee === 'string' ? { assignee: entry.assignee } : {}),\n }];\n });\n}\n\n/** The cards of one column, in the order given. A card whose column does not exist is shown in the first column rather than lost. */\nexport function cardsOf(columns: BoardColumn[], cards: BoardCard[], column: string): BoardCard[] {\n const known = new Set(columns.map(candidate => candidate.id));\n return cards.filter(card => card.column === column || (column === columns[0]?.id && !known.has(card.column)));\n}\n\n/** Moves a card to a column, at the end; moving to the column it is in, or to one that does not exist, changes nothing. */\nexport function moveCard(columns: BoardColumn[], cards: BoardCard[], id: string, to: string): BoardCard[] {\n const card = cards.find(candidate => candidate.id === id);\n if (!card || !columns.some(column => column.id === to) || cardsOf(columns, cards, to).includes(card)) return cards;\n return [...cards.filter(candidate => candidate.id !== id), { ...card, column: to }];\n}\n\n/** Whether a column holds more cards than its limit. */\nexport const overLimit = (column: BoardColumn, count: number): boolean => column.limit > 0 && count > column.limit;\n"],"names":["records","value","Array","isArray","filter","entry","readColumnsOfBoard","seen","Set","flatMap","id","length","has","add","label","limit","Math","floor","readCards","title","fields","field","slice","column","badges","badge","assignee","cardsOf","columns","cards","known","map","candidate","card","moveCard","to","find","some","includes","overLimit","count"],"mappings":";;AAAA;AACA;AAEA,iEAkBA,MAAMA,OAAAA,GAAU,CAACC,KAAAA,GACbC,MAAMC,OAAO,CAACF,KAAAA,CAAAA,GAASA,KAAAA,CAAMG,MAAM,CAAC,CAACC,KAAAA,GAA4C,OAAOA,KAAAA,KAAU,QAAA,IAAYA,KAAAA,KAAU,IAAA,IAAQ,CAACH,KAAAA,CAAMC,OAAO,CAACE,KAAAA,CAAAA,CAAAA,GAAU,EAAE;AAE/J,qEACO,SAASC,kBAAAA,CAAmBL,KAAc,EAAA;AAC7C,IAAA,MAAMM,OAAO,IAAIC,GAAAA,EAAAA;AACjB,IAAA,OAAOR,OAAAA,CAAQC,KAAAA,CAAAA,CAAOQ,OAAO,CAACJ,CAAAA,KAAAA,GAAAA;AAC1B,QAAA,IAAI,OAAOA,KAAAA,CAAMK,EAAE,KAAK,QAAA,IAAYL,KAAAA,CAAMK,EAAE,CAACC,MAAM,KAAK,CAAA,IAAKJ,KAAKK,GAAG,CAACP,MAAMK,EAAE,CAAA,EAAG,OAAO,EAAE;QAC1FH,IAAAA,CAAKM,GAAG,CAACR,KAAAA,CAAMK,EAAE,CAAA;QACjB,OAAO;AAAC,YAAA;AAAEA,gBAAAA,EAAAA,EAAIL,MAAMK,EAAE;AAAEI,gBAAAA,KAAAA,EAAO,OAAOT,KAAAA,CAAMS,KAAK,KAAK,YAAYT,KAAAA,CAAMS,KAAK,CAACH,MAAM,GAAG,CAAA,GAAIN,KAAAA,CAAMS,KAAK,GAAGT,MAAMK,EAAE;AAAEK,gBAAAA,KAAAA,EAAO,OAAOV,KAAAA,CAAMU,KAAK,KAAK,YAAYV,KAAAA,CAAMU,KAAK,GAAG,CAAA,GAAIC,IAAAA,CAAKC,KAAK,CAACZ,KAAAA,CAAMU,KAAK,CAAA,GAAI;AAAE;AAAE,SAAA;AACjN,IAAA,CAAA,CAAA;AACJ;AAEA,+FACO,SAASG,SAAAA,CAAUjB,KAAc,EAAA;AACpC,IAAA,MAAMM,OAAO,IAAIC,GAAAA,EAAAA;AACjB,IAAA,OAAOR,OAAAA,CAAQC,KAAAA,CAAAA,CAAOQ,OAAO,CAACJ,CAAAA,KAAAA,GAAAA;QAC1B,IAAI,OAAOA,MAAMK,EAAE,KAAK,YAAYL,KAAAA,CAAMK,EAAE,CAACC,MAAM,KAAK,CAAA,IAAKJ,KAAKK,GAAG,CAACP,KAAAA,CAAMK,EAAE,CAAA,IAAK,OAAOL,MAAMc,KAAK,KAAK,QAAA,EAAU,OAAO,EAAE;QAC7HZ,IAAAA,CAAKM,GAAG,CAACR,KAAAA,CAAMK,EAAE,CAAA;AACjB,QAAA,MAAMU,SAASpB,OAAAA,CAAQK,KAAAA,CAAMe,MAAM,CAAA,CAAEX,OAAO,CAACY,CAAAA,KAAAA,GAAU,OAAOA,KAAAA,CAAMP,KAAK,KAAK,QAAA,IAAY,OAAOO,KAAAA,CAAMpB,KAAK,KAAK,QAAA,GAAW;AAAC,gBAAA;AAAEa,oBAAAA,KAAAA,EAAOO,MAAMP,KAAK;AAAEb,oBAAAA,KAAAA,EAAOoB,MAAMpB;AAAM;AAAE,aAAA,GAAG,EAAE,CAAA,CAAGqB,KAAK,CAAC,CAAA,EAAG,CAAA,CAAA;QACzL,OAAO;AAAC,YAAA;AACJZ,gBAAAA,EAAAA,EAAIL,MAAMK,EAAE;AAAES,gBAAAA,KAAAA,EAAOd,MAAMc,KAAK;AAAEI,gBAAAA,MAAAA,EAAQ,OAAOlB,KAAAA,CAAMkB,MAAM,KAAK,QAAA,GAAWlB,KAAAA,CAAMkB,MAAM,GAAG,EAAA;AAAIH,gBAAAA,MAAAA;AAChGI,gBAAAA,MAAAA,EAAQtB,MAAMC,OAAO,CAACE,KAAAA,CAAMmB,MAAM,IAAInB,KAAAA,CAAMmB,MAAM,CAACpB,MAAM,CAAC,CAACqB,KAAAA,GAA2B,OAAOA,KAAAA,KAAU,YAAY,EAAE;AACrH,gBAAA,GAAI,OAAOpB,KAAAA,CAAMqB,QAAQ,KAAK,QAAA,GAAW;AAAEA,oBAAAA,QAAAA,EAAUrB,MAAMqB;AAAS,iBAAA,GAAI;AAC5E;AAAE,SAAA;AACN,IAAA,CAAA,CAAA;AACJ;AAEA,sIACO,SAASC,OAAAA,CAAQC,OAAsB,EAAEC,KAAkB,EAAEN,MAAc,EAAA;IAC9E,MAAMO,KAAAA,GAAQ,IAAItB,GAAAA,CAAIoB,OAAAA,CAAQG,GAAG,CAACC,CAAAA,SAAAA,GAAaA,SAAAA,CAAUtB,EAAE,CAAA,CAAA;IAC3D,OAAOmB,KAAAA,CAAMzB,MAAM,CAAC6B,CAAAA,OAAQA,IAAAA,CAAKV,MAAM,KAAKA,MAAAA,IAAWA,MAAAA,KAAWK,OAAO,CAAC,CAAA,CAAE,EAAElB,EAAAA,IAAM,CAACoB,MAAMlB,GAAG,CAACqB,KAAKV,MAAM,CAAA,CAAA;AAC9G;AAEA,4HACO,SAASW,QAAAA,CAASN,OAAsB,EAAEC,KAAkB,EAAEnB,EAAU,EAAEyB,EAAU,EAAA;IACvF,MAAMF,IAAAA,GAAOJ,MAAMO,IAAI,CAACJ,CAAAA,SAAAA,GAAaA,SAAAA,CAAUtB,EAAE,KAAKA,EAAAA,CAAAA;AACtD,IAAA,IAAI,CAACuB,IAAAA,IAAQ,CAACL,QAAQS,IAAI,CAACd,CAAAA,MAAAA,GAAUA,MAAAA,CAAOb,EAAE,KAAKyB,EAAAA,CAAAA,IAAOR,QAAQC,OAAAA,EAASC,KAAAA,EAAOM,IAAIG,QAAQ,CAACL,OAAO,OAAOJ,KAAAA;IAC7G,OAAO;AAAIA,QAAAA,GAAAA,KAAAA,CAAMzB,MAAM,CAAC4B,CAAAA,SAAAA,GAAaA,SAAAA,CAAUtB,EAAE,KAAKA,EAAAA,CAAAA;AAAK,QAAA;AAAE,YAAA,GAAGuB,IAAI;YAAEV,MAAAA,EAAQY;AAAG;AAAE,KAAA;AACvF;AAEA,yDACO,MAAMI,SAAAA,GAAY,CAAChB,MAAAA,EAAqBiB,KAAAA,GAA2BjB,MAAAA,CAAOR,KAAK,GAAG,CAAA,IAAKyB,KAAAA,GAAQjB,MAAAA,CAAOR;;;;;;"}
@@ -0,0 +1,158 @@
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
+ /** The field types a form offers (Part B 2.8). */ var FormFieldType = /*#__PURE__*/ function(FormFieldType) {
6
+ FormFieldType["Text"] = "text";
7
+ FormFieldType["Number"] = "number";
8
+ FormFieldType["Currency"] = "currency";
9
+ FormFieldType["Date"] = "date";
10
+ FormFieldType["Select"] = "select";
11
+ FormFieldType["MultiSelect"] = "multiSelect";
12
+ FormFieldType["Lookup"] = "lookup";
13
+ FormFieldType["Toggle"] = "toggle";
14
+ FormFieldType["File"] = "file";
15
+ FormFieldType["RichText"] = "richText";
16
+ FormFieldType["Address"] = "address";
17
+ return FormFieldType;
18
+ }({});
19
+ /** The ways the one form can be used (Part B 2.8). */ var FormMode = /*#__PURE__*/ function(FormMode) {
20
+ FormMode["Create"] = "create";
21
+ FormMode["Edit"] = "edit";
22
+ FormMode["ReadOnly"] = "readOnly";
23
+ FormMode["Settings"] = "settings";
24
+ return FormMode;
25
+ }({});
26
+ /** The lines of an address, in the order they are asked. */ const addressLines = [
27
+ 'street',
28
+ 'postalCode',
29
+ 'city',
30
+ 'country'
31
+ ];
32
+ const records = (value)=>Array.isArray(value) ? value.filter((entry)=>typeof entry === 'object' && entry !== null && !Array.isArray(entry)) : [];
33
+ /** Reads the mode, defaulting to create. */ const readFormMode = (value)=>Object.values(FormMode).includes(value) ? value : "create";
34
+ /** Reads sections, with their fields, dropping fields without a name and repeated names; a section grid is clamped to one to three columns. */ function readFormSections(value) {
35
+ const names = new Set();
36
+ return records(value).flatMap((section, index)=>{
37
+ const columns = typeof section.columns === 'number' ? Math.min(3, Math.max(1, Math.floor(section.columns))) : 1;
38
+ const fields = records(section.fields).flatMap((entry)=>{
39
+ if (typeof entry.name !== 'string' || entry.name.length === 0 || names.has(entry.name)) return [];
40
+ names.add(entry.name);
41
+ return [
42
+ {
43
+ name: entry.name,
44
+ label: typeof entry.label === 'string' && entry.label.length > 0 ? entry.label : entry.name,
45
+ type: Object.values(FormFieldType).includes(entry.type) ? entry.type : "text",
46
+ required: entry.required === true,
47
+ options: Array.isArray(entry.options) ? entry.options.filter((option)=>typeof option === 'string') : [],
48
+ span: typeof entry.span === 'number' ? Math.min(columns, Math.max(1, Math.floor(entry.span))) : 1,
49
+ ...typeof entry.placeholder === 'string' ? {
50
+ placeholder: entry.placeholder
51
+ } : {},
52
+ ...typeof entry.help === 'string' ? {
53
+ help: entry.help
54
+ } : {}
55
+ }
56
+ ];
57
+ });
58
+ return [
59
+ {
60
+ id: typeof section.id === 'string' && section.id.length > 0 ? section.id : `section-${index}`,
61
+ title: typeof section.title === 'string' ? section.title : '',
62
+ columns,
63
+ fields
64
+ }
65
+ ];
66
+ });
67
+ }
68
+ /** Whether a field holds a value: an empty or blank text, an empty list, a toggle left false (a required toggle must be on) or an address with no street and city are empty. */ function isFilled(field, value) {
69
+ switch(field.type){
70
+ case "toggle":
71
+ return value === true;
72
+ case "multiSelect":
73
+ return Array.isArray(value) && value.length > 0;
74
+ case "file":
75
+ return Array.isArray(value) ? value.length > 0 : typeof value === 'string' && value.trim().length > 0;
76
+ case "address":
77
+ return typeof value === 'object' && value !== null && [
78
+ 'street',
79
+ 'city'
80
+ ].every((line)=>typeof value[line] === 'string' && value[line].trim().length > 0);
81
+ case "number":
82
+ case "currency":
83
+ return typeof value === 'number' ? Number.isFinite(value) : typeof value === 'string' && value.trim().length > 0 && Number.isFinite(Number(value));
84
+ default:
85
+ return typeof value === 'string' ? value.trim().length > 0 : value !== undefined && value !== null && value !== '';
86
+ }
87
+ }
88
+ /** Why a field is invalid, as a kind the component words in the locale: `required`, `invalid`, or undefined when it is fine. An empty optional field is fine. */ function problemOf(field, value) {
89
+ if (!isFilled(field, value)) {
90
+ const empty = value === undefined || value === null || value === '' || typeof value === 'string' && value.trim() === '' || Array.isArray(value) && value.length === 0 || value === false;
91
+ return field.required ? 'required' : empty ? undefined : 'invalid';
92
+ }
93
+ if (field.type === "date" && typeof value === 'string' && Number.isNaN(new Date(value).getTime())) return 'invalid';
94
+ if ((field.type === "select" || field.type === "lookup") && field.options.length > 0 && typeof value === 'string' && !field.options.includes(value)) return 'invalid';
95
+ return undefined;
96
+ }
97
+ /** The problems of every field, by field name, for the fields in the given sections. */ function validate(sections, values) {
98
+ const problems = {};
99
+ for (const field of sections.flatMap((section)=>section.fields)){
100
+ const problem = problemOf(field, values[field.name]);
101
+ if (problem) problems[field.name] = problem;
102
+ }
103
+ return problems;
104
+ }
105
+ /** Whether two sets of values are the same, field by field and in depth, so the unsaved-changes guard compares what the person sees. */ function sameValues(left, right) {
106
+ const keys = new Set([
107
+ ...Object.keys(left),
108
+ ...Object.keys(right)
109
+ ]);
110
+ return [
111
+ ...keys
112
+ ].every((key)=>JSON.stringify(normalizeValue(left[key])) === JSON.stringify(normalizeValue(right[key])));
113
+ }
114
+ function normalizeValue(value) {
115
+ if (value === undefined || value === null || value === '' || value === false) return null;
116
+ if (Array.isArray(value)) return value.length === 0 ? null : value;
117
+ if (typeof value === 'object') {
118
+ const entries = Object.entries(value).filter(([, line])=>line !== '' && line !== undefined).sort(([a], [b])=>a.localeCompare(b));
119
+ return entries.length === 0 ? null : entries;
120
+ }
121
+ return value;
122
+ }
123
+ /** Maps a server's field errors (`{ field: message }` or `[{ field, message }]`) onto the fields of the form; an error for a field the form does not have is returned as a general one so it is never lost. */ function mapServerErrors(sections, errors) {
124
+ const known = new Set(sections.flatMap((section)=>section.fields.map((field)=>field.name)));
125
+ const pairs = Array.isArray(errors) ? records(errors).flatMap((entry)=>typeof entry.message === 'string' ? [
126
+ [
127
+ typeof entry.field === 'string' ? entry.field : '',
128
+ entry.message
129
+ ]
130
+ ] : []) : typeof errors === 'object' && errors !== null ? Object.entries(errors).flatMap(([field, message])=>typeof message === 'string' ? [
131
+ [
132
+ field,
133
+ message
134
+ ]
135
+ ] : []) : [];
136
+ const byField = {};
137
+ const general = [];
138
+ for (const [field, message] of pairs){
139
+ if (known.has(field) && byField[field] === undefined) byField[field] = message;
140
+ else general.push(field && !known.has(field) ? `${field}: ${message}` : message);
141
+ }
142
+ return {
143
+ byField,
144
+ general
145
+ };
146
+ }
147
+
148
+ exports.FormFieldType = FormFieldType;
149
+ exports.FormMode = FormMode;
150
+ exports.addressLines = addressLines;
151
+ exports.isFilled = isFilled;
152
+ exports.mapServerErrors = mapServerErrors;
153
+ exports.problemOf = problemOf;
154
+ exports.readFormMode = readFormMode;
155
+ exports.readFormSections = readFormSections;
156
+ exports.sameValues = sameValues;
157
+ exports.validate = validate;
158
+ //# sourceMappingURL=formModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formModel.js","sources":["../../../foundation/formModel.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/** The field types a form offers (Part B 2.8). */\nexport enum FormFieldType {\n Text = 'text',\n Number = 'number',\n Currency = 'currency',\n Date = 'date',\n Select = 'select',\n MultiSelect = 'multiSelect',\n Lookup = 'lookup',\n Toggle = 'toggle',\n File = 'file',\n RichText = 'richText',\n Address = 'address',\n}\n\n/** One field of a form section. */\nexport interface FormField {\n name: string;\n label: string;\n type: FormFieldType;\n required: boolean;\n options: string[];\n /** The columns of the section grid the field spans (1 to 3). */\n span: number;\n placeholder?: string;\n help?: string;\n}\n\n/** A titled group of fields in a grid of one to three columns. */\nexport interface FormSection {\n id: string;\n title: string;\n columns: number;\n fields: FormField[];\n}\n\n/** The values of a form by field name; a multi-select is an array, a toggle a boolean, an address an object of lines. */\nexport type FormValues = Record<string, unknown>;\n\n/** The ways the one form can be used (Part B 2.8). */\nexport enum FormMode {\n Create = 'create',\n Edit = 'edit',\n ReadOnly = 'readOnly',\n Settings = 'settings',\n}\n\n/** The lines of an address, in the order they are asked. */\nexport const addressLines = ['street', 'postalCode', 'city', 'country'] as const;\n\nconst records = (value: unknown): Record<string, unknown>[] =>\n Array.isArray(value) ? value.filter((entry): entry is Record<string, unknown> => typeof entry === 'object' && entry !== null && !Array.isArray(entry)) : [];\n\n/** Reads the mode, defaulting to create. */\nexport const readFormMode = (value: unknown): FormMode => ((Object.values(FormMode) as string[]).includes(value as string) ? (value as FormMode) : FormMode.Create);\n\n/** Reads sections, with their fields, dropping fields without a name and repeated names; a section grid is clamped to one to three columns. */\nexport function readFormSections(value: unknown): FormSection[] {\n const names = new Set<string>();\n return records(value).flatMap((section, index) => {\n const columns = typeof section.columns === 'number' ? Math.min(3, Math.max(1, Math.floor(section.columns))) : 1;\n const fields = records(section.fields).flatMap((entry): FormField[] => {\n if (typeof entry.name !== 'string' || entry.name.length === 0 || names.has(entry.name)) return [];\n names.add(entry.name);\n return [{\n name: entry.name,\n label: typeof entry.label === 'string' && entry.label.length > 0 ? entry.label : entry.name,\n type: (Object.values(FormFieldType) as string[]).includes(entry.type as string) ? (entry.type as FormFieldType) : FormFieldType.Text,\n required: entry.required === true,\n options: Array.isArray(entry.options) ? entry.options.filter((option): option is string => typeof option === 'string') : [],\n span: typeof entry.span === 'number' ? Math.min(columns, Math.max(1, Math.floor(entry.span))) : 1,\n ...(typeof entry.placeholder === 'string' ? { placeholder: entry.placeholder } : {}),\n ...(typeof entry.help === 'string' ? { help: entry.help } : {}),\n }];\n });\n return [{ id: typeof section.id === 'string' && section.id.length > 0 ? section.id : `section-${index}`, title: typeof section.title === 'string' ? section.title : '', columns, fields }];\n });\n}\n\n/** Whether a field holds a value: an empty or blank text, an empty list, a toggle left false (a required toggle must be on) or an address with no street and city are empty. */\nexport function isFilled(field: FormField, value: unknown): boolean {\n switch (field.type) {\n case FormFieldType.Toggle: return value === true;\n case FormFieldType.MultiSelect: return Array.isArray(value) && value.length > 0;\n case FormFieldType.File: return Array.isArray(value) ? value.length > 0 : typeof value === 'string' && value.trim().length > 0;\n case FormFieldType.Address: return typeof value === 'object' && value !== null && ['street', 'city'].every(line => typeof (value as Record<string, unknown>)[line] === 'string' && ((value as Record<string, unknown>)[line] as string).trim().length > 0);\n case FormFieldType.Number: case FormFieldType.Currency: return typeof value === 'number' ? Number.isFinite(value) : typeof value === 'string' && value.trim().length > 0 && Number.isFinite(Number(value));\n default: return typeof value === 'string' ? value.trim().length > 0 : value !== undefined && value !== null && value !== '';\n }\n}\n\n/** Why a field is invalid, as a kind the component words in the locale: `required`, `invalid`, or undefined when it is fine. An empty optional field is fine. */\nexport function problemOf(field: FormField, value: unknown): 'required' | 'invalid' | undefined {\n if (!isFilled(field, value)) {\n const empty = value === undefined || value === null || value === '' || (typeof value === 'string' && value.trim() === '') || (Array.isArray(value) && value.length === 0) || value === false;\n return field.required ? 'required' : empty ? undefined : 'invalid';\n }\n\n if (field.type === FormFieldType.Date && typeof value === 'string' && Number.isNaN(new Date(value).getTime())) return 'invalid';\n if ((field.type === FormFieldType.Select || field.type === FormFieldType.Lookup) && field.options.length > 0 && typeof value === 'string' && !field.options.includes(value)) return 'invalid';\n return undefined;\n}\n\n/** The problems of every field, by field name, for the fields in the given sections. */\nexport function validate(sections: FormSection[], values: FormValues): Record<string, 'required' | 'invalid'> {\n const problems: Record<string, 'required' | 'invalid'> = {};\n for (const field of sections.flatMap(section => section.fields)) {\n const problem = problemOf(field, values[field.name]);\n if (problem) problems[field.name] = problem;\n }\n\n return problems;\n}\n\n/** Whether two sets of values are the same, field by field and in depth, so the unsaved-changes guard compares what the person sees. */\nexport function sameValues(left: FormValues, right: FormValues): boolean {\n const keys = new Set([...Object.keys(left), ...Object.keys(right)]);\n return [...keys].every(key => JSON.stringify(normalizeValue(left[key])) === JSON.stringify(normalizeValue(right[key])));\n}\n\nfunction normalizeValue(value: unknown): unknown {\n if (value === undefined || value === null || value === '' || value === false) return null;\n if (Array.isArray(value)) return value.length === 0 ? null : value;\n if (typeof value === 'object') { const entries = Object.entries(value as Record<string, unknown>).filter(([, line]) => line !== '' && line !== undefined).sort(([a], [b]) => a.localeCompare(b)); return entries.length === 0 ? null : entries; }\n return value;\n}\n\n/** Maps a server's field errors (`{ field: message }` or `[{ field, message }]`) onto the fields of the form; an error for a field the form does not have is returned as a general one so it is never lost. */\nexport function mapServerErrors(sections: FormSection[], errors: unknown): { byField: Record<string, string>; general: string[] } {\n const known = new Set(sections.flatMap(section => section.fields.map(field => field.name)));\n const pairs: [string, string][] = Array.isArray(errors)\n ? records(errors).flatMap(entry => (typeof entry.message === 'string' ? [[typeof entry.field === 'string' ? entry.field : '', entry.message] as [string, string]] : []))\n : typeof errors === 'object' && errors !== null ? Object.entries(errors as Record<string, unknown>).flatMap(([field, message]) => (typeof message === 'string' ? [[field, message] as [string, string]] : [])) : [];\n\n const byField: Record<string, string> = {};\n const general: string[] = [];\n for (const [field, message] of pairs) {\n if (known.has(field) && byField[field] === undefined) byField[field] = message;\n else general.push(field && !known.has(field) ? `${field}: ${message}` : message);\n }\n\n return { byField, general };\n}\n"],"names":["FormFieldType","FormMode","addressLines","records","value","Array","isArray","filter","entry","readFormMode","Object","values","includes","readFormSections","names","Set","flatMap","section","index","columns","Math","min","max","floor","fields","name","length","has","add","label","type","required","options","option","span","placeholder","help","id","title","isFilled","field","trim","every","line","Number","isFinite","undefined","problemOf","empty","isNaN","Date","getTime","validate","sections","problems","problem","sameValues","left","right","keys","key","JSON","stringify","normalizeValue","entries","sort","a","b","localeCompare","mapServerErrors","errors","known","map","pairs","message","byField","general","push"],"mappings":"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"}
@@ -109,6 +109,60 @@ var ComponentName = require('../ComponentName.js');
109
109
  'access',
110
110
  'grants',
111
111
  'rbac'
112
+ ]),
113
+ [ComponentName.ComponentName.DataList]: scene_react.componentMetadata('Data list', scene_model.ComponentCategory.DataDisplay, 'table', [
114
+ 'table',
115
+ 'grid',
116
+ 'records',
117
+ 'cards',
118
+ 'collection',
119
+ 'list'
120
+ ]),
121
+ [ComponentName.ComponentName.TabSet]: scene_react.componentMetadata('Tab set', scene_model.ComponentCategory.Navigation, 'panel-top', [
122
+ 'tabs',
123
+ 'sections',
124
+ 'panels'
125
+ ]),
126
+ [ComponentName.ComponentName.SubNavigation]: scene_react.componentMetadata('Sub-navigation', scene_model.ComponentCategory.Navigation, 'panel-left', [
127
+ 'module',
128
+ 'sections',
129
+ 'rail',
130
+ 'tabs'
131
+ ]),
132
+ [ComponentName.ComponentName.BulkBar]: scene_react.componentMetadata('Bulk bar', scene_model.ComponentCategory.Actions, 'check-check', [
133
+ 'selection',
134
+ 'bulk',
135
+ 'batch',
136
+ 'actions'
137
+ ]),
138
+ [ComponentName.ComponentName.GlobalSearch]: scene_react.componentMetadata('Search', scene_model.ComponentCategory.Input, 'search', [
139
+ 'search',
140
+ 'find',
141
+ 'query'
142
+ ]),
143
+ [ComponentName.ComponentName.NotificationsButton]: scene_react.componentMetadata('Notifications button', scene_model.ComponentCategory.Actions, 'bell', [
144
+ 'bell',
145
+ 'alerts',
146
+ 'unread'
147
+ ]),
148
+ [ComponentName.ComponentName.KanbanBoard]: scene_react.componentMetadata('Kanban board', scene_model.ComponentCategory.DataDisplay, 'kanban', [
149
+ 'board',
150
+ 'kanban',
151
+ 'columns',
152
+ 'pipeline',
153
+ 'cards'
154
+ ]),
155
+ [ComponentName.ComponentName.WizardProgress]: scene_react.componentMetadata('Wizard', scene_model.ComponentCategory.Navigation, 'footprints', [
156
+ 'wizard',
157
+ 'steps',
158
+ 'stepper',
159
+ 'multi-step'
160
+ ]),
161
+ [ComponentName.ComponentName.FormScreenBody]: scene_react.componentMetadata('Form', scene_model.ComponentCategory.Forms, 'text-cursor-input', [
162
+ 'form',
163
+ 'fields',
164
+ 'sections',
165
+ 'validation'
112
166
  ])
113
167
  };
114
168
 
@@ -1 +1 @@
1
- {"version":3,"file":"foundationComponentMetadata.js","sources":["../../../foundation/foundationComponentMetadata.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 { ComponentCategory } from '@cratis/scene.model';\nimport { ComponentMetadata, componentMetadata as m } from '@cratis/scene.react';\nimport { ComponentName } from '../ComponentName';\n\n/**\n * The category, icon, keywords and picker badge of every foundation component (CMP1), keyed by bare component name.\n * The names are those of `ComponentName`; the metadata of the rest of the package lives in `defaultBlueprintComponentMetadata`.\n */\nexport const foundationComponentMetadata: Record<string, ComponentMetadata> = {\n [ComponentName.EmptyState]: m('Empty state', ComponentCategory.Feedback, 'inbox', ['no data', 'nothing', 'blank slate', 'zero state']),\n [ComponentName.StatCard]: m('Stat card', ComponentCategory.DataDisplay, 'gauge', ['kpi', 'metric', 'figure', 'number', 'dashboard']),\n [ComponentName.TrendChip]: m('Trend chip', ComponentCategory.DataDisplay, 'trending-up', ['delta', 'change', 'arrow', 'comparison']),\n [ComponentName.StatusChip]: m('Status chip', ComponentCategory.DataDisplay, 'badge-check', ['badge', 'state', 'tag', 'label']),\n [ComponentName.ChartWrapper]: m('Chart', ComponentCategory.DataDisplay, 'chart-line', ['graph', 'line', 'bar', 'stacked', 'donut', 'pie', 'funnel', 'plot']),\n [ComponentName.FilterBuilder]: m('Filter builder', ComponentCategory.Input, 'list-filter', ['filter', 'query', 'conditions', 'and or', 'search']),\n [ComponentName.ColumnChooser]: m('Column chooser', ComponentCategory.Actions, 'columns-3', ['columns', 'fields', 'show hide', 'table']),\n [ComponentName.SavedViewsMenu]: m('Saved views menu', ComponentCategory.Actions, 'bookmark', ['views', 'presets', 'saved filters']),\n [ComponentName.ChecklistSection]: m('Checklist', ComponentCategory.DataDisplay, 'list-checks', ['tasks', 'todo', 'onboarding', 'progress', 'steps']),\n [ComponentName.ActivityFeed]: m('Activity feed', ComponentCategory.DataDisplay, 'activity', ['timeline', 'history', 'comments', 'audit', 'log']),\n [ComponentName.AvatarStack]: m('Avatar stack', ComponentCategory.DataDisplay, 'users', ['people', 'members', 'assignees', 'team']),\n [ComponentName.FileUploader]: m('File uploader', ComponentCategory.Input, 'upload', ['attachments', 'files', 'drop zone', 'documents']),\n [ComponentName.ApprovalChainStepper]: m('Approval chain', ComponentCategory.Navigation, 'workflow', ['approvals', 'steps', 'workflow', 'sign off', 'stepper']),\n [ComponentName.OrgTree]: m('Org tree', ComponentCategory.DataDisplay, 'network', ['organization', 'hierarchy', 'org chart', 'reports to', 'tree']),\n [ComponentName.PermissionMatrix]: m('Permission matrix', ComponentCategory.Input, 'shield-check', ['roles', 'permissions', 'access', 'grants', 'rbac']),\n};\n"],"names":["foundationComponentMetadata","ComponentName","EmptyState","m","ComponentCategory","Feedback","StatCard","DataDisplay","TrendChip","StatusChip","ChartWrapper","FilterBuilder","Input","ColumnChooser","Actions","SavedViewsMenu","ChecklistSection","ActivityFeed","AvatarStack","FileUploader","ApprovalChainStepper","Navigation","OrgTree","PermissionMatrix"],"mappings":"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"}
1
+ {"version":3,"file":"foundationComponentMetadata.js","sources":["../../../foundation/foundationComponentMetadata.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 { ComponentCategory } from '@cratis/scene.model';\nimport { ComponentMetadata, componentMetadata as m } from '@cratis/scene.react';\nimport { ComponentName } from '../ComponentName';\n\n/**\n * The category, icon, keywords and picker badge of every foundation component (CMP1), keyed by bare component name.\n * The names are those of `ComponentName`; the metadata of the rest of the package lives in `defaultBlueprintComponentMetadata`.\n */\nexport const foundationComponentMetadata: Record<string, ComponentMetadata> = {\n [ComponentName.EmptyState]: m('Empty state', ComponentCategory.Feedback, 'inbox', ['no data', 'nothing', 'blank slate', 'zero state']),\n [ComponentName.StatCard]: m('Stat card', ComponentCategory.DataDisplay, 'gauge', ['kpi', 'metric', 'figure', 'number', 'dashboard']),\n [ComponentName.TrendChip]: m('Trend chip', ComponentCategory.DataDisplay, 'trending-up', ['delta', 'change', 'arrow', 'comparison']),\n [ComponentName.StatusChip]: m('Status chip', ComponentCategory.DataDisplay, 'badge-check', ['badge', 'state', 'tag', 'label']),\n [ComponentName.ChartWrapper]: m('Chart', ComponentCategory.DataDisplay, 'chart-line', ['graph', 'line', 'bar', 'stacked', 'donut', 'pie', 'funnel', 'plot']),\n [ComponentName.FilterBuilder]: m('Filter builder', ComponentCategory.Input, 'list-filter', ['filter', 'query', 'conditions', 'and or', 'search']),\n [ComponentName.ColumnChooser]: m('Column chooser', ComponentCategory.Actions, 'columns-3', ['columns', 'fields', 'show hide', 'table']),\n [ComponentName.SavedViewsMenu]: m('Saved views menu', ComponentCategory.Actions, 'bookmark', ['views', 'presets', 'saved filters']),\n [ComponentName.ChecklistSection]: m('Checklist', ComponentCategory.DataDisplay, 'list-checks', ['tasks', 'todo', 'onboarding', 'progress', 'steps']),\n [ComponentName.ActivityFeed]: m('Activity feed', ComponentCategory.DataDisplay, 'activity', ['timeline', 'history', 'comments', 'audit', 'log']),\n [ComponentName.AvatarStack]: m('Avatar stack', ComponentCategory.DataDisplay, 'users', ['people', 'members', 'assignees', 'team']),\n [ComponentName.FileUploader]: m('File uploader', ComponentCategory.Input, 'upload', ['attachments', 'files', 'drop zone', 'documents']),\n [ComponentName.ApprovalChainStepper]: m('Approval chain', ComponentCategory.Navigation, 'workflow', ['approvals', 'steps', 'workflow', 'sign off', 'stepper']),\n [ComponentName.OrgTree]: m('Org tree', ComponentCategory.DataDisplay, 'network', ['organization', 'hierarchy', 'org chart', 'reports to', 'tree']),\n [ComponentName.PermissionMatrix]: m('Permission matrix', ComponentCategory.Input, 'shield-check', ['roles', 'permissions', 'access', 'grants', 'rbac']),\n [ComponentName.DataList]: m('Data list', ComponentCategory.DataDisplay, 'table', ['table', 'grid', 'records', 'cards', 'collection', 'list']),\n [ComponentName.TabSet]: m('Tab set', ComponentCategory.Navigation, 'panel-top', ['tabs', 'sections', 'panels']),\n [ComponentName.SubNavigation]: m('Sub-navigation', ComponentCategory.Navigation, 'panel-left', ['module', 'sections', 'rail', 'tabs']),\n [ComponentName.BulkBar]: m('Bulk bar', ComponentCategory.Actions, 'check-check', ['selection', 'bulk', 'batch', 'actions']),\n [ComponentName.GlobalSearch]: m('Search', ComponentCategory.Input, 'search', ['search', 'find', 'query']),\n [ComponentName.NotificationsButton]: m('Notifications button', ComponentCategory.Actions, 'bell', ['bell', 'alerts', 'unread']),\n [ComponentName.KanbanBoard]: m('Kanban board', ComponentCategory.DataDisplay, 'kanban', ['board', 'kanban', 'columns', 'pipeline', 'cards']),\n [ComponentName.WizardProgress]: m('Wizard', ComponentCategory.Navigation, 'footprints', ['wizard', 'steps', 'stepper', 'multi-step']),\n [ComponentName.FormScreenBody]: m('Form', ComponentCategory.Forms, 'text-cursor-input', ['form', 'fields', 'sections', 'validation']),\n};\n"],"names":["foundationComponentMetadata","ComponentName","EmptyState","m","ComponentCategory","Feedback","StatCard","DataDisplay","TrendChip","StatusChip","ChartWrapper","FilterBuilder","Input","ColumnChooser","Actions","SavedViewsMenu","ChecklistSection","ActivityFeed","AvatarStack","FileUploader","ApprovalChainStepper","Navigation","OrgTree","PermissionMatrix","DataList","TabSet","SubNavigation","BulkBar","GlobalSearch","NotificationsButton","KanbanBoard","WizardProgress","FormScreenBody","Forms"],"mappings":"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"}