@petrarca/sonnet-playground 0.8.0 → 0.9.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 (76) hide show
  1. package/README.md +10 -8
  2. package/dist/{PlayAdvancedComponents-ZYK66UII.js → PlayAdvancedComponents-VMUI472R.js} +2 -2
  3. package/dist/PlayCodeEditor-AMTFE5SW.js +8 -0
  4. package/dist/PlayCodedValues-G2EVIVMO.js +9 -0
  5. package/dist/{PlayCoreComponents-YTEAS3GL.js → PlayCoreComponents-EQ2BMY2S.js} +2 -2
  6. package/dist/{PlayDataComponents-W44OITT5.js → PlayDataComponents-W2KQHOI7.js} +2 -2
  7. package/dist/PlayFhirQuestionnaire-TO35Q7CP.js +8 -0
  8. package/dist/{PlayFormWidgets-6JYFRTAL.js → PlayFormWidgets-HP3VF2LK.js} +2 -2
  9. package/dist/PlayForms-4CQNEBLS.js +7 -0
  10. package/dist/PlayGraph-25ZKQAQR.js +7 -0
  11. package/dist/PlayGraph-25ZKQAQR.js.map +1 -0
  12. package/dist/PlayMarkdownViewer-X6AIFO2U.js +8 -0
  13. package/dist/PlayMarkdownViewer-X6AIFO2U.js.map +1 -0
  14. package/dist/PlayQuestionnaireDesigner-IR7TKSOT.js +9 -0
  15. package/dist/PlayQuestionnaireDesigner-IR7TKSOT.js.map +1 -0
  16. package/dist/PlaySchemaDesigner-ZQBA7AYO.js +8 -0
  17. package/dist/PlaySchemaDesigner-ZQBA7AYO.js.map +1 -0
  18. package/dist/{PlayShellApi-5O6VYR2X.js → PlayShellApi-MMCQ2AKK.js} +2 -2
  19. package/dist/PlayShellApi-MMCQ2AKK.js.map +1 -0
  20. package/dist/chunk-3FYM6B3E.js +1163 -0
  21. package/dist/chunk-3FYM6B3E.js.map +1 -0
  22. package/dist/{chunk-CQ6PGFRV.js → chunk-3RZHYZRL.js} +57 -1
  23. package/dist/chunk-3RZHYZRL.js.map +1 -0
  24. package/dist/chunk-7IMCPUSI.js +100 -0
  25. package/dist/chunk-7IMCPUSI.js.map +1 -0
  26. package/dist/{chunk-2XMWOZ5O.js → chunk-EPCUUTBZ.js} +48 -41
  27. package/dist/chunk-EPCUUTBZ.js.map +1 -0
  28. package/dist/{chunk-BRH3FFFT.js → chunk-LDCNLHO2.js} +15 -1
  29. package/dist/chunk-LDCNLHO2.js.map +1 -0
  30. package/dist/chunk-LVV32F7G.js +104 -0
  31. package/dist/chunk-LVV32F7G.js.map +1 -0
  32. package/dist/chunk-OUL3DN2E.js +510 -0
  33. package/dist/chunk-OUL3DN2E.js.map +1 -0
  34. package/dist/chunk-QKFQI4VX.js +83 -0
  35. package/dist/chunk-QKFQI4VX.js.map +1 -0
  36. package/dist/{chunk-6WI3N7JI.js → chunk-RGBSHXS5.js} +145 -4
  37. package/dist/chunk-RGBSHXS5.js.map +1 -0
  38. package/dist/{chunk-UB7462QG.js → chunk-RLJI5VMP.js} +72 -1
  39. package/dist/chunk-RLJI5VMP.js.map +1 -0
  40. package/dist/chunk-VGAS5Z6X.js +543 -0
  41. package/dist/chunk-VGAS5Z6X.js.map +1 -0
  42. package/dist/chunk-VKZ2RJFL.js +647 -0
  43. package/dist/chunk-VKZ2RJFL.js.map +1 -0
  44. package/dist/chunk-WR74TMW4.js +219 -0
  45. package/dist/chunk-WR74TMW4.js.map +1 -0
  46. package/dist/{chunk-E5X7GVLU.js → chunk-XNDD4UN4.js} +2 -2
  47. package/dist/chunk-XNDD4UN4.js.map +1 -0
  48. package/dist/chunk-YTGQRDD2.js +343 -0
  49. package/dist/chunk-YTGQRDD2.js.map +1 -0
  50. package/dist/index.d.ts +13 -10
  51. package/dist/index.js +72 -11
  52. package/dist/index.js.map +1 -1
  53. package/dist/pages/index.d.ts +56 -20
  54. package/dist/pages/index.js +39 -17
  55. package/package.json +15 -14
  56. package/dist/PlayForms-U2TWUX5L.js +0 -7
  57. package/dist/PlayGraph-M4KQSFI7.js +0 -7
  58. package/dist/PlaySchemaDesigner-S4DBB53G.js +0 -7
  59. package/dist/chunk-2XMWOZ5O.js.map +0 -1
  60. package/dist/chunk-4Y4JFKAK.js +0 -240
  61. package/dist/chunk-4Y4JFKAK.js.map +0 -1
  62. package/dist/chunk-6WI3N7JI.js.map +0 -1
  63. package/dist/chunk-BRH3FFFT.js.map +0 -1
  64. package/dist/chunk-CQ6PGFRV.js.map +0 -1
  65. package/dist/chunk-E5X7GVLU.js.map +0 -1
  66. package/dist/chunk-O2QMWJZI.js +0 -881
  67. package/dist/chunk-O2QMWJZI.js.map +0 -1
  68. package/dist/chunk-UB7462QG.js.map +0 -1
  69. /package/dist/{PlayAdvancedComponents-ZYK66UII.js.map → PlayAdvancedComponents-VMUI472R.js.map} +0 -0
  70. /package/dist/{PlayCoreComponents-YTEAS3GL.js.map → PlayCodeEditor-AMTFE5SW.js.map} +0 -0
  71. /package/dist/{PlayDataComponents-W44OITT5.js.map → PlayCodedValues-G2EVIVMO.js.map} +0 -0
  72. /package/dist/{PlayFormWidgets-6JYFRTAL.js.map → PlayCoreComponents-EQ2BMY2S.js.map} +0 -0
  73. /package/dist/{PlayForms-U2TWUX5L.js.map → PlayDataComponents-W2KQHOI7.js.map} +0 -0
  74. /package/dist/{PlayGraph-M4KQSFI7.js.map → PlayFhirQuestionnaire-TO35Q7CP.js.map} +0 -0
  75. /package/dist/{PlaySchemaDesigner-S4DBB53G.js.map → PlayFormWidgets-HP3VF2LK.js.map} +0 -0
  76. /package/dist/{PlayShellApi-5O6VYR2X.js.map → PlayForms-4CQNEBLS.js.map} +0 -0
@@ -0,0 +1,543 @@
1
+ import {
2
+ ACME_ERRORS,
3
+ CWE,
4
+ HTTP_STATUS,
5
+ LISTS,
6
+ PLAYGROUND_TERMINOLOGY,
7
+ SPDX
8
+ } from "./chunk-WR74TMW4.js";
9
+ import {
10
+ PlaygroundSection
11
+ } from "./chunk-C2EZ2ECG.js";
12
+
13
+ // src/pages/PlayCodedValues.tsx
14
+ import { useMemo, useState } from "react";
15
+ import { ArrowRight } from "lucide-react";
16
+ import {
17
+ CODEABLE_CONCEPT_TYPE_ID,
18
+ CODING_TYPE_ID
19
+ } from "@petrarca/sonnet-core/schema";
20
+ import {
21
+ TerminologyProvider
22
+ } from "@petrarca/sonnet-core/terminology";
23
+ import {
24
+ FormCheckbox,
25
+ FormSelect,
26
+ JsonSchemaFormRenderer
27
+ } from "@petrarca/sonnet-forms";
28
+ import {
29
+ Badge,
30
+ Button,
31
+ Card,
32
+ CodeableConceptDisplay,
33
+ CodedValueDisplay,
34
+ EntityTable,
35
+ SimpleTooltip
36
+ } from "@petrarca/sonnet-ui";
37
+ import { CodeEditor } from "@petrarca/sonnet-ui/code-editor";
38
+ import { JsonEditor } from "@petrarca/sonnet-ui/json-editor";
39
+ import { jsx, jsxs } from "react/jsx-runtime";
40
+ var STORED_OPTIONS = [
41
+ { value: "coding", label: "Stored as a coding" },
42
+ { value: "code", label: "Stored as its code" }
43
+ ];
44
+ var STRENGTH_OPTIONS = [
45
+ { value: "required", label: "Only the list's codes" },
46
+ { value: "extensible", label: "The list's codes, or another answer" }
47
+ ];
48
+ var MODE_OPTIONS = [
49
+ { value: "auto", label: "Shown as the list's size decides" },
50
+ { value: "list", label: "Shown as the whole list" },
51
+ { value: "search", label: "Shown as a search" }
52
+ ];
53
+ function answerSchema(c) {
54
+ if (c.stored === "code") return { type: "string" };
55
+ return c.strength === "extensible" ? { anyOf: [{ $ref: CODING_TYPE_ID }, { type: "string" }] } : { $ref: CODING_TYPE_ID };
56
+ }
57
+ function buildSchema(c, lists) {
58
+ const kind = lists.find((l) => l.id === c.list)?.kind ?? "valueSet";
59
+ const answer = answerSchema(c);
60
+ const field = {
61
+ title: c.multiple ? "Answers" : "Answer",
62
+ ...c.multiple ? { type: "array", items: answer } : answer,
63
+ "x-binding": { [kind]: c.list, strength: c.strength },
64
+ ...c.mode !== "auto" ? { "x-ui-options": { mode: c.mode } } : {}
65
+ };
66
+ return {
67
+ title: "Coded value",
68
+ type: "object",
69
+ properties: { answer: field }
70
+ };
71
+ }
72
+ var pretty = (v) => JSON.stringify(v, null, 2);
73
+ function ConfigControls({
74
+ config,
75
+ set,
76
+ lists
77
+ }) {
78
+ return /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-2", children: [
79
+ /* @__PURE__ */ jsx(
80
+ FormSelect,
81
+ {
82
+ options: lists.map((l) => ({ value: l.id, label: l.label })),
83
+ value: config.list,
84
+ onChange: (v) => v && set({ list: v }),
85
+ clearable: false,
86
+ wrapperClassName: "col-span-2"
87
+ }
88
+ ),
89
+ /* @__PURE__ */ jsx(
90
+ FormSelect,
91
+ {
92
+ options: STORED_OPTIONS,
93
+ value: config.stored,
94
+ onChange: (v) => v && set({ stored: v }),
95
+ clearable: false
96
+ }
97
+ ),
98
+ /* @__PURE__ */ jsx(
99
+ FormSelect,
100
+ {
101
+ options: STRENGTH_OPTIONS,
102
+ value: config.strength,
103
+ onChange: (v) => v && set({ strength: v }),
104
+ clearable: false
105
+ }
106
+ ),
107
+ /* @__PURE__ */ jsx(
108
+ FormSelect,
109
+ {
110
+ options: MODE_OPTIONS,
111
+ value: config.mode,
112
+ onChange: (v) => v && set({ mode: v }),
113
+ clearable: false
114
+ }
115
+ ),
116
+ /* @__PURE__ */ jsx(
117
+ FormCheckbox,
118
+ {
119
+ label: "Several answers",
120
+ checked: config.multiple,
121
+ onChange: (v) => set({ multiple: v === true }),
122
+ wrapperClassName: "self-center"
123
+ }
124
+ )
125
+ ] });
126
+ }
127
+ function useSchemaState(lists) {
128
+ const [config, setConfig] = useState({
129
+ list: lists[0]?.id ?? "",
130
+ stored: "coding",
131
+ strength: "required",
132
+ multiple: false,
133
+ mode: "auto"
134
+ });
135
+ const [schemaText, setSchemaText] = useState(
136
+ () => pretty(buildSchema(config, lists))
137
+ );
138
+ const [schema, setSchema] = useState(
139
+ () => buildSchema(config, lists)
140
+ );
141
+ const [error, setError] = useState(null);
142
+ const [data, setData] = useState({});
143
+ const show = (next) => {
144
+ setSchema(next);
145
+ setData({});
146
+ setError(null);
147
+ };
148
+ const set = (change) => {
149
+ const next = { ...config, ...change };
150
+ setConfig(next);
151
+ const built = buildSchema(next, lists);
152
+ setSchemaText(pretty(built));
153
+ show(built);
154
+ };
155
+ const apply = () => {
156
+ try {
157
+ show(JSON.parse(schemaText));
158
+ } catch {
159
+ setError("Invalid JSON");
160
+ }
161
+ };
162
+ return {
163
+ config,
164
+ set,
165
+ schemaText,
166
+ setSchemaText,
167
+ schema,
168
+ error,
169
+ apply,
170
+ data,
171
+ setData
172
+ };
173
+ }
174
+ function WidgetSection({ lists }) {
175
+ const s = useSchemaState(lists);
176
+ return /* @__PURE__ */ jsx(
177
+ PlaygroundSection,
178
+ {
179
+ title: "CodedValueWidget",
180
+ description: 'The form widget for a code from a list: x-ui-widget "coded-value", chosen by itself for the core coding type and for a string, a coding or a text, or an array bound to a list (x-binding). Pick a list and how its answers are stored; edit the schema and press the arrow to try anything else.',
181
+ children: /* @__PURE__ */ jsxs("div", { className: "flex gap-6 items-start", children: [
182
+ /* @__PURE__ */ jsxs("div", { className: "w-1/2 relative flex flex-col", children: [
183
+ /* @__PURE__ */ jsxs(Card, { className: "border shadow-sm p-4 flex flex-col gap-2", children: [
184
+ /* @__PURE__ */ jsx(ConfigControls, { config: s.config, set: s.set, lists }),
185
+ s.error && /* @__PURE__ */ jsx(Badge, { variant: "destructive", className: "text-xs self-start", children: s.error }),
186
+ /* @__PURE__ */ jsx(
187
+ JsonEditor,
188
+ {
189
+ value: s.schemaText,
190
+ editablePaths: ["/"],
191
+ onChange: s.setSchemaText,
192
+ height: "320px",
193
+ className: "rounded-md border overflow-hidden"
194
+ }
195
+ )
196
+ ] }),
197
+ /* @__PURE__ */ jsx(SimpleTooltip, { label: "Apply schema to form", children: /* @__PURE__ */ jsx(
198
+ Button,
199
+ {
200
+ variant: "default",
201
+ size: "icon",
202
+ className: "absolute -right-5 top-1/2 -translate-y-1/2 z-[100]",
203
+ onClick: s.apply,
204
+ children: /* @__PURE__ */ jsx(ArrowRight, { size: 20 })
205
+ }
206
+ ) })
207
+ ] }),
208
+ /* @__PURE__ */ jsxs("div", { className: "w-1/2 flex flex-col gap-4", children: [
209
+ /* @__PURE__ */ jsx(Card, { className: "border shadow-sm p-4", children: /* @__PURE__ */ jsx(
210
+ JsonSchemaFormRenderer,
211
+ {
212
+ schema: s.schema,
213
+ data: s.data,
214
+ onChange: s.setData,
215
+ showActions: false,
216
+ showExtraProperties: false
217
+ },
218
+ JSON.stringify(s.schema)
219
+ ) }),
220
+ /* @__PURE__ */ jsxs(Card, { className: "border shadow-sm p-4", children: [
221
+ /* @__PURE__ */ jsx("p", { className: "text-xs font-medium text-muted-foreground mb-2", children: "Form data" }),
222
+ /* @__PURE__ */ jsx(
223
+ CodeEditor,
224
+ {
225
+ value: pretty(s.data),
226
+ language: "json",
227
+ readOnly: true,
228
+ variant: "compact"
229
+ }
230
+ )
231
+ ] })
232
+ ] })
233
+ ] })
234
+ }
235
+ );
236
+ }
237
+ function conceptSchema(c, lists) {
238
+ const list = (id) => {
239
+ const l = lists.find((x) => x.id === id);
240
+ return { [l?.kind ?? "system"]: id, ...l ? { title: l.label } : {} };
241
+ };
242
+ return {
243
+ title: "Codeable concept",
244
+ type: "object",
245
+ properties: {
246
+ answer: {
247
+ title: "Answer",
248
+ $ref: CODEABLE_CONCEPT_TYPE_ID,
249
+ "x-binding": {
250
+ ...list(c.first),
251
+ strength: "required",
252
+ additional: [{ ...list(c.further), required: c.required }]
253
+ },
254
+ "x-ui-options": { text: c.text }
255
+ }
256
+ }
257
+ };
258
+ }
259
+ function ConceptSection({ lists }) {
260
+ const [config, setConfig] = useState(() => ({
261
+ first: lists[0]?.id ?? "",
262
+ further: lists.find((l) => l.id === ACME_ERRORS)?.id ?? lists[1]?.id ?? "",
263
+ required: false,
264
+ text: true
265
+ }));
266
+ const [data, setData] = useState({});
267
+ const set = (change) => {
268
+ setConfig({ ...config, ...change });
269
+ setData({});
270
+ };
271
+ const schema = useMemo(() => conceptSchema(config, lists), [config, lists]);
272
+ const options = lists.map((l) => ({ value: l.id, label: l.label }));
273
+ return /* @__PURE__ */ jsx(
274
+ PlaygroundSection,
275
+ {
276
+ title: "CodeableConceptWidget",
277
+ description: 'One concept coded in several lists, as the core codeable concept type stores it (x-ui-widget "codeable-concept"): the coded-value picker on the first list, the other lists as chips under it -- a chip, or "+ Coding", opens the same search on its list. A required list without a coding shows as an empty chip.',
278
+ children: /* @__PURE__ */ jsxs("div", { className: "flex gap-6 items-start", children: [
279
+ /* @__PURE__ */ jsxs(Card, { className: "w-1/2 border shadow-sm p-4 grid grid-cols-2 gap-2", children: [
280
+ /* @__PURE__ */ jsx(
281
+ FormSelect,
282
+ {
283
+ label: "First list",
284
+ options,
285
+ value: config.first,
286
+ onChange: (v) => v && set({ first: v }),
287
+ clearable: false
288
+ }
289
+ ),
290
+ /* @__PURE__ */ jsx(
291
+ FormSelect,
292
+ {
293
+ label: "Further list",
294
+ options,
295
+ value: config.further,
296
+ onChange: (v) => v && set({ further: v }),
297
+ clearable: false
298
+ }
299
+ ),
300
+ /* @__PURE__ */ jsx(
301
+ FormCheckbox,
302
+ {
303
+ label: "The further list is required",
304
+ checked: config.required,
305
+ onChange: (v) => set({ required: v === true })
306
+ }
307
+ ),
308
+ /* @__PURE__ */ jsx(
309
+ FormCheckbox,
310
+ {
311
+ label: "Offer a text",
312
+ checked: config.text,
313
+ onChange: (v) => set({ text: v === true })
314
+ }
315
+ )
316
+ ] }),
317
+ /* @__PURE__ */ jsxs("div", { className: "w-1/2 flex flex-col gap-4", children: [
318
+ /* @__PURE__ */ jsx(Card, { className: "border shadow-sm p-4", children: /* @__PURE__ */ jsx(
319
+ JsonSchemaFormRenderer,
320
+ {
321
+ schema,
322
+ data,
323
+ onChange: setData,
324
+ showActions: false,
325
+ showExtraProperties: false
326
+ },
327
+ JSON.stringify(config)
328
+ ) }),
329
+ /* @__PURE__ */ jsxs(Card, { className: "border shadow-sm p-4", children: [
330
+ /* @__PURE__ */ jsx("p", { className: "text-xs font-medium text-muted-foreground mb-2", children: "Form data" }),
331
+ /* @__PURE__ */ jsx(
332
+ CodeEditor,
333
+ {
334
+ value: pretty(data),
335
+ language: "json",
336
+ readOnly: true,
337
+ variant: "compact"
338
+ }
339
+ )
340
+ ] })
341
+ ] })
342
+ ] })
343
+ }
344
+ );
345
+ }
346
+ var DISPLAY_SAMPLES = [
347
+ {
348
+ label: "Label and code",
349
+ code: "Apache-2.0",
350
+ display: "Apache License 2.0",
351
+ system: SPDX
352
+ },
353
+ { label: "No system", code: "404", display: "Not Found", system: null },
354
+ { label: "Code only", code: "CWE-1321", display: null, system: CWE },
355
+ {
356
+ label: "A long label",
357
+ code: "CWE-119",
358
+ display: "Improper Restriction of Operations within the Bounds of a Memory Buffer",
359
+ system: CWE
360
+ }
361
+ ];
362
+ var STATUS_CONCEPT = {
363
+ codings: [
364
+ {
365
+ system: HTTP_STATUS,
366
+ code: "404",
367
+ display: "Not Found",
368
+ userSelected: true
369
+ },
370
+ {
371
+ system: ACME_ERRORS,
372
+ code: "NOT_FOUND",
373
+ display: "Not found",
374
+ userSelected: true
375
+ }
376
+ ],
377
+ text: "Page missing"
378
+ };
379
+ function DisplaySection() {
380
+ return /* @__PURE__ */ jsx(
381
+ PlaygroundSection,
382
+ {
383
+ title: "CodedValueDisplay",
384
+ description: "A coded value as text: its label, its code muted beside it; the code alone without a label. Hover for the code system. A codeable concept (CodeableConceptDisplay) shows its first coding and how many more -- hover them for the others and the person's text.",
385
+ children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 max-w-md", children: [
386
+ DISPLAY_SAMPLES.map((s) => /* @__PURE__ */ jsxs(
387
+ "div",
388
+ {
389
+ className: "flex items-center justify-between gap-4 rounded-md border px-4 py-3",
390
+ children: [
391
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground w-28 shrink-0", children: s.label }),
392
+ /* @__PURE__ */ jsx(
393
+ CodedValueDisplay,
394
+ {
395
+ code: s.code,
396
+ display: s.display,
397
+ system: s.system
398
+ }
399
+ )
400
+ ]
401
+ },
402
+ s.code
403
+ )),
404
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-4 rounded-md border px-4 py-3", children: [
405
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground w-28 shrink-0", children: "A codeable concept" }),
406
+ /* @__PURE__ */ jsx(CodeableConceptDisplay, { value: STATUS_CONCEPT })
407
+ ] })
408
+ ] })
409
+ }
410
+ );
411
+ }
412
+ var TABLE_SCHEMA = {
413
+ title: "Dependencies",
414
+ type: "object",
415
+ properties: {
416
+ name: { type: "string", title: "Package" },
417
+ license: {
418
+ $ref: CODING_TYPE_ID,
419
+ title: "License",
420
+ "x-ui-cell": "coding"
421
+ },
422
+ weakness: {
423
+ type: "string",
424
+ title: "Worst weakness",
425
+ "x-ui-cell": "coding",
426
+ "x-ui-cell-options": {
427
+ displayField: "weakness_name",
428
+ systemField: "weakness_system"
429
+ }
430
+ },
431
+ findings: {
432
+ type: "array",
433
+ title: "Findings",
434
+ items: { $ref: CODING_TYPE_ID },
435
+ "x-ui-cell": "coding"
436
+ },
437
+ registry: {
438
+ $ref: CODEABLE_CONCEPT_TYPE_ID,
439
+ title: "Registry answer",
440
+ "x-ui-cell": "coding"
441
+ }
442
+ }
443
+ };
444
+ var TABLE_ROWS = [
445
+ {
446
+ id: "1",
447
+ name: "acme-http",
448
+ license: { system: SPDX, code: "MIT", display: "MIT License" },
449
+ weakness: "CWE-79",
450
+ weakness_name: "Cross-site Scripting",
451
+ weakness_system: CWE,
452
+ findings: [
453
+ { system: CWE, code: "CWE-79", display: "Cross-site Scripting" },
454
+ { system: CWE, code: "CWE-20", display: "Improper Input Validation" }
455
+ ],
456
+ registry: {
457
+ codings: [
458
+ { system: HTTP_STATUS, code: "200", display: "OK" },
459
+ { system: ACME_ERRORS, code: "OK", display: "Done" }
460
+ ]
461
+ }
462
+ },
463
+ {
464
+ id: "2",
465
+ name: "acme-parser",
466
+ license: {
467
+ system: SPDX,
468
+ code: "Apache-2.0",
469
+ display: "Apache License 2.0"
470
+ },
471
+ weakness: "CWE-787",
472
+ weakness_name: "Out-of-bounds Write",
473
+ weakness_system: CWE,
474
+ // Code only: a coding without its label.
475
+ findings: [{ system: CWE, code: "CWE-787" }],
476
+ registry: STATUS_CONCEPT
477
+ },
478
+ {
479
+ id: "3",
480
+ name: "acme-utils",
481
+ license: null,
482
+ weakness: "CWE-1321",
483
+ weakness_name: null,
484
+ weakness_system: null,
485
+ findings: [],
486
+ registry: { text: "No answer yet" }
487
+ }
488
+ ];
489
+ function CellSection() {
490
+ const data = useMemo(
491
+ () => ({
492
+ data: TABLE_ROWS,
493
+ meta: {
494
+ total: TABLE_ROWS.length,
495
+ limit: TABLE_ROWS.length,
496
+ offset: 0,
497
+ has_next: false,
498
+ has_prev: false
499
+ }
500
+ }),
501
+ []
502
+ );
503
+ return /* @__PURE__ */ jsx(
504
+ PlaygroundSection,
505
+ {
506
+ title: "The coding cell",
507
+ description: 'An EntityTable column with x-ui-cell "coding": a coding, an array of codings, a code whose label and system are other fields of the row (displayField, systemField) -- or a codeable concept, its first coding shown and the others on hover.',
508
+ children: /* @__PURE__ */ jsx("div", { className: "max-w-5xl", children: /* @__PURE__ */ jsx(
509
+ EntityTable,
510
+ {
511
+ schema: TABLE_SCHEMA,
512
+ data,
513
+ isLoading: false,
514
+ isError: false,
515
+ entityLabel: "dependencies"
516
+ }
517
+ ) })
518
+ }
519
+ );
520
+ }
521
+ function PlayCodedValues({
522
+ service,
523
+ lists = LISTS
524
+ } = {}) {
525
+ return /* @__PURE__ */ jsx(TerminologyProvider, { service: service ?? PLAYGROUND_TERMINOLOGY, children: /* @__PURE__ */ jsxs("div", { className: "w-full py-12 px-4 space-y-12", children: [
526
+ /* @__PURE__ */ jsxs("div", { children: [
527
+ /* @__PURE__ */ jsx("h1", { className: "mb-1", children: "Coded Values" }),
528
+ /* @__PURE__ */ jsxs("p", { className: "text-lg text-muted-foreground", children: [
529
+ "The primitives to work with a terminology: a code from a list, its display, a table cell. The codes come from a terminology service the application supplies",
530
+ service ? "." : " -- here, lists in memory (staticTerminology)."
531
+ ] })
532
+ ] }),
533
+ /* @__PURE__ */ jsx(WidgetSection, { lists }),
534
+ /* @__PURE__ */ jsx(ConceptSection, { lists }),
535
+ /* @__PURE__ */ jsx(DisplaySection, {}),
536
+ /* @__PURE__ */ jsx(CellSection, {})
537
+ ] }) });
538
+ }
539
+
540
+ export {
541
+ PlayCodedValues
542
+ };
543
+ //# sourceMappingURL=chunk-VGAS5Z6X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pages/PlayCodedValues.tsx"],"sourcesContent":["/**\n * Playground page for coded values -- the primitives to work with a\n * terminology: the coded-value widget, CodedValueDisplay and the `coding` cell\n * renderer, on a static terminology (lists in memory). An application supplies\n * its own service through TerminologyProvider; nothing else changes.\n * Accessible at /playground/coded-values\n */\n\nimport { useMemo, useState } from \"react\";\nimport { ArrowRight } from \"lucide-react\";\nimport type { PageResult } from \"@petrarca/sonnet-core\";\nimport {\n CODEABLE_CONCEPT_TYPE_ID,\n CODING_TYPE_ID,\n type JsonSchema,\n type JsonSchemaProperty,\n} from \"@petrarca/sonnet-core/schema\";\nimport {\n TerminologyProvider,\n type TerminologyService,\n} from \"@petrarca/sonnet-core/terminology\";\nimport {\n FormCheckbox,\n FormSelect,\n JsonSchemaFormRenderer,\n} from \"@petrarca/sonnet-forms\";\nimport {\n Badge,\n Button,\n Card,\n CodeableConceptDisplay,\n CodedValueDisplay,\n EntityTable,\n SimpleTooltip,\n} from \"@petrarca/sonnet-ui\";\nimport { CodeEditor } from \"@petrarca/sonnet-ui/code-editor\";\nimport { JsonEditor } from \"@petrarca/sonnet-ui/json-editor\";\nimport { PlaygroundSection as Section } from \"../PlaygroundSection\";\nimport {\n ACME_ERRORS,\n CWE,\n HTTP_STATUS,\n LISTS,\n PLAYGROUND_TERMINOLOGY,\n SPDX,\n type CodedValueList,\n} from \"./codedValues/lists\";\n\n// -- The widget ------------------------------------------------------------\n\ntype Stored = \"code\" | \"coding\";\ntype Strength = \"required\" | \"extensible\";\ntype Mode = \"auto\" | \"list\" | \"search\";\n\ninterface Config {\n list: string;\n stored: Stored;\n strength: Strength;\n multiple: boolean;\n mode: Mode;\n}\n\nconst STORED_OPTIONS = [\n { value: \"coding\", label: \"Stored as a coding\" },\n { value: \"code\", label: \"Stored as its code\" },\n];\nconst STRENGTH_OPTIONS = [\n { value: \"required\", label: \"Only the list's codes\" },\n { value: \"extensible\", label: \"The list's codes, or another answer\" },\n];\nconst MODE_OPTIONS = [\n { value: \"auto\", label: \"Shown as the list's size decides\" },\n { value: \"list\", label: \"Shown as the whole list\" },\n { value: \"search\", label: \"Shown as a search\" },\n];\n\n// One answer's schema: a code, a coding, or -- an open list -- a coding or a text.\nfunction answerSchema(c: Config): JsonSchemaProperty {\n if (c.stored === \"code\") return { type: \"string\" };\n return c.strength === \"extensible\"\n ? { anyOf: [{ $ref: CODING_TYPE_ID }, { type: \"string\" }] }\n : { $ref: CODING_TYPE_ID };\n}\n\n// The form's schema: one question bound to the chosen list, as configured.\nfunction buildSchema(c: Config, lists: CodedValueList[]): JsonSchema {\n const kind = lists.find((l) => l.id === c.list)?.kind ?? \"valueSet\";\n const answer = answerSchema(c);\n const field: JsonSchemaProperty = {\n title: c.multiple ? \"Answers\" : \"Answer\",\n ...(c.multiple ? { type: \"array\", items: answer } : answer),\n \"x-binding\": { [kind]: c.list, strength: c.strength },\n ...(c.mode !== \"auto\" ? { \"x-ui-options\": { mode: c.mode } } : {}),\n };\n return {\n title: \"Coded value\",\n type: \"object\",\n properties: { answer: field },\n };\n}\n\nconst pretty = (v: unknown) => JSON.stringify(v, null, 2);\n\nfunction ConfigControls({\n config,\n set,\n lists,\n}: {\n config: Config;\n set: (next: Partial<Config>) => void;\n lists: CodedValueList[];\n}) {\n return (\n <div className=\"grid grid-cols-2 gap-2\">\n <FormSelect\n options={lists.map((l) => ({ value: l.id, label: l.label }))}\n value={config.list}\n onChange={(v) => v && set({ list: v })}\n clearable={false}\n wrapperClassName=\"col-span-2\"\n />\n <FormSelect\n options={STORED_OPTIONS}\n value={config.stored}\n onChange={(v) => v && set({ stored: v as Stored })}\n clearable={false}\n />\n <FormSelect\n options={STRENGTH_OPTIONS}\n value={config.strength}\n onChange={(v) => v && set({ strength: v as Strength })}\n clearable={false}\n />\n <FormSelect\n options={MODE_OPTIONS}\n value={config.mode}\n onChange={(v) => v && set({ mode: v as Mode })}\n clearable={false}\n />\n <FormCheckbox\n label=\"Several answers\"\n checked={config.multiple}\n onChange={(v) => set({ multiple: v === true })}\n wrapperClassName=\"self-center\"\n />\n </div>\n );\n}\n\n// The schema's text, editable; the arrow puts it into the form.\nfunction useSchemaState(lists: CodedValueList[]) {\n const [config, setConfig] = useState<Config>({\n list: lists[0]?.id ?? \"\",\n stored: \"coding\",\n strength: \"required\",\n multiple: false,\n mode: \"auto\",\n });\n const [schemaText, setSchemaText] = useState(() =>\n pretty(buildSchema(config, lists)),\n );\n const [schema, setSchema] = useState<JsonSchema>(() =>\n buildSchema(config, lists),\n );\n const [error, setError] = useState<string | null>(null);\n const [data, setData] = useState<Record<string, unknown>>({});\n\n const show = (next: JsonSchema) => {\n setSchema(next);\n setData({});\n setError(null);\n };\n // A control changes the schema, and the form with it.\n const set = (change: Partial<Config>) => {\n const next = { ...config, ...change };\n setConfig(next);\n const built = buildSchema(next, lists);\n setSchemaText(pretty(built));\n show(built);\n };\n const apply = () => {\n try {\n show(JSON.parse(schemaText) as JsonSchema);\n } catch {\n setError(\"Invalid JSON\");\n }\n };\n return {\n config,\n set,\n schemaText,\n setSchemaText,\n schema,\n error,\n apply,\n data,\n setData,\n };\n}\n\nfunction WidgetSection({ lists }: { lists: CodedValueList[] }) {\n const s = useSchemaState(lists);\n return (\n <Section\n title=\"CodedValueWidget\"\n description='The form widget for a code from a list: x-ui-widget \"coded-value\", chosen by itself for the core coding type and for a string, a coding or a text, or an array bound to a list (x-binding). Pick a list and how its answers are stored; edit the schema and press the arrow to try anything else.'\n >\n <div className=\"flex gap-6 items-start\">\n <div className=\"w-1/2 relative flex flex-col\">\n <Card className=\"border shadow-sm p-4 flex flex-col gap-2\">\n <ConfigControls config={s.config} set={s.set} lists={lists} />\n {s.error && (\n <Badge variant=\"destructive\" className=\"text-xs self-start\">\n {s.error}\n </Badge>\n )}\n <JsonEditor\n value={s.schemaText}\n editablePaths={[\"/\"]}\n onChange={s.setSchemaText}\n height=\"320px\"\n className=\"rounded-md border overflow-hidden\"\n />\n </Card>\n <SimpleTooltip label=\"Apply schema to form\">\n <Button\n variant=\"default\"\n size=\"icon\"\n className=\"absolute -right-5 top-1/2 -translate-y-1/2 z-[100]\"\n onClick={s.apply}\n >\n <ArrowRight size={20} />\n </Button>\n </SimpleTooltip>\n </div>\n <div className=\"w-1/2 flex flex-col gap-4\">\n <Card className=\"border shadow-sm p-4\">\n <JsonSchemaFormRenderer\n key={JSON.stringify(s.schema)}\n schema={s.schema}\n data={s.data}\n onChange={s.setData}\n showActions={false}\n showExtraProperties={false}\n />\n </Card>\n <Card className=\"border shadow-sm p-4\">\n <p className=\"text-xs font-medium text-muted-foreground mb-2\">\n Form data\n </p>\n <CodeEditor\n value={pretty(s.data)}\n language=\"json\"\n readOnly\n variant=\"compact\"\n />\n </Card>\n </div>\n </div>\n </Section>\n );\n}\n\n// -- CodeableConceptWidget -------------------------------------------------\n\ninterface ConceptConfig {\n first: string;\n further: string;\n required: boolean;\n text: boolean;\n}\n\n// The form's schema: one concept coded in the first list, and in a further one.\nfunction conceptSchema(c: ConceptConfig, lists: CodedValueList[]): JsonSchema {\n const list = (id: string) => {\n const l = lists.find((x) => x.id === id);\n return { [l?.kind ?? \"system\"]: id, ...(l ? { title: l.label } : {}) };\n };\n return {\n title: \"Codeable concept\",\n type: \"object\",\n properties: {\n answer: {\n title: \"Answer\",\n $ref: CODEABLE_CONCEPT_TYPE_ID,\n \"x-binding\": {\n ...list(c.first),\n strength: \"required\",\n additional: [{ ...list(c.further), required: c.required }],\n },\n \"x-ui-options\": { text: c.text },\n } as JsonSchemaProperty,\n },\n };\n}\n\nfunction ConceptSection({ lists }: { lists: CodedValueList[] }) {\n const [config, setConfig] = useState<ConceptConfig>(() => ({\n first: lists[0]?.id ?? \"\",\n further: lists.find((l) => l.id === ACME_ERRORS)?.id ?? lists[1]?.id ?? \"\",\n required: false,\n text: true,\n }));\n const [data, setData] = useState<Record<string, unknown>>({});\n const set = (change: Partial<ConceptConfig>) => {\n setConfig({ ...config, ...change });\n setData({});\n };\n const schema = useMemo(() => conceptSchema(config, lists), [config, lists]);\n const options = lists.map((l) => ({ value: l.id, label: l.label }));\n return (\n <Section\n title=\"CodeableConceptWidget\"\n description='One concept coded in several lists, as the core codeable concept type stores it (x-ui-widget \"codeable-concept\"): the coded-value picker on the first list, the other lists as chips under it -- a chip, or \"+ Coding\", opens the same search on its list. A required list without a coding shows as an empty chip.'\n >\n <div className=\"flex gap-6 items-start\">\n <Card className=\"w-1/2 border shadow-sm p-4 grid grid-cols-2 gap-2\">\n <FormSelect\n label=\"First list\"\n options={options}\n value={config.first}\n onChange={(v) => v && set({ first: v })}\n clearable={false}\n />\n <FormSelect\n label=\"Further list\"\n options={options}\n value={config.further}\n onChange={(v) => v && set({ further: v })}\n clearable={false}\n />\n <FormCheckbox\n label=\"The further list is required\"\n checked={config.required}\n onChange={(v) => set({ required: v === true })}\n />\n <FormCheckbox\n label=\"Offer a text\"\n checked={config.text}\n onChange={(v) => set({ text: v === true })}\n />\n </Card>\n <div className=\"w-1/2 flex flex-col gap-4\">\n <Card className=\"border shadow-sm p-4\">\n <JsonSchemaFormRenderer\n key={JSON.stringify(config)}\n schema={schema}\n data={data}\n onChange={setData}\n showActions={false}\n showExtraProperties={false}\n />\n </Card>\n <Card className=\"border shadow-sm p-4\">\n <p className=\"text-xs font-medium text-muted-foreground mb-2\">\n Form data\n </p>\n <CodeEditor\n value={pretty(data)}\n language=\"json\"\n readOnly\n variant=\"compact\"\n />\n </Card>\n </div>\n </div>\n </Section>\n );\n}\n\n// -- CodedValueDisplay -----------------------------------------------------\n\nconst DISPLAY_SAMPLES = [\n {\n label: \"Label and code\",\n code: \"Apache-2.0\",\n display: \"Apache License 2.0\",\n system: SPDX,\n },\n { label: \"No system\", code: \"404\", display: \"Not Found\", system: null },\n { label: \"Code only\", code: \"CWE-1321\", display: null, system: CWE },\n {\n label: \"A long label\",\n code: \"CWE-119\",\n display:\n \"Improper Restriction of Operations within the Bounds of a Memory Buffer\",\n system: CWE,\n },\n];\n\n// A codeable concept: one status, as HTTP says it and as the application's own codes do.\nconst STATUS_CONCEPT = {\n codings: [\n {\n system: HTTP_STATUS,\n code: \"404\",\n display: \"Not Found\",\n userSelected: true,\n },\n {\n system: ACME_ERRORS,\n code: \"NOT_FOUND\",\n display: \"Not found\",\n userSelected: true,\n },\n ],\n text: \"Page missing\",\n};\n\nfunction DisplaySection() {\n return (\n <Section\n title=\"CodedValueDisplay\"\n description=\"A coded value as text: its label, its code muted beside it; the code alone without a label. Hover for the code system. A codeable concept (CodeableConceptDisplay) shows its first coding and how many more -- hover them for the others and the person's text.\"\n >\n <div className=\"flex flex-col gap-3 max-w-md\">\n {DISPLAY_SAMPLES.map((s) => (\n <div\n key={s.code}\n className=\"flex items-center justify-between gap-4 rounded-md border px-4 py-3\"\n >\n <span className=\"text-xs text-muted-foreground w-28 shrink-0\">\n {s.label}\n </span>\n <CodedValueDisplay\n code={s.code}\n display={s.display}\n system={s.system}\n />\n </div>\n ))}\n <div className=\"flex items-center justify-between gap-4 rounded-md border px-4 py-3\">\n <span className=\"text-xs text-muted-foreground w-28 shrink-0\">\n A codeable concept\n </span>\n <CodeableConceptDisplay value={STATUS_CONCEPT} />\n </div>\n </div>\n </Section>\n );\n}\n\n// -- The coding cell -------------------------------------------------------\n\nconst TABLE_SCHEMA: JsonSchema = {\n title: \"Dependencies\",\n type: \"object\",\n properties: {\n name: { type: \"string\", title: \"Package\" },\n license: {\n $ref: CODING_TYPE_ID,\n title: \"License\",\n \"x-ui-cell\": \"coding\",\n },\n weakness: {\n type: \"string\",\n title: \"Worst weakness\",\n \"x-ui-cell\": \"coding\",\n \"x-ui-cell-options\": {\n displayField: \"weakness_name\",\n systemField: \"weakness_system\",\n },\n },\n findings: {\n type: \"array\",\n title: \"Findings\",\n items: { $ref: CODING_TYPE_ID },\n \"x-ui-cell\": \"coding\",\n },\n registry: {\n $ref: CODEABLE_CONCEPT_TYPE_ID,\n title: \"Registry answer\",\n \"x-ui-cell\": \"coding\",\n },\n },\n};\n\nconst TABLE_ROWS = [\n {\n id: \"1\",\n name: \"acme-http\",\n license: { system: SPDX, code: \"MIT\", display: \"MIT License\" },\n weakness: \"CWE-79\",\n weakness_name: \"Cross-site Scripting\",\n weakness_system: CWE,\n findings: [\n { system: CWE, code: \"CWE-79\", display: \"Cross-site Scripting\" },\n { system: CWE, code: \"CWE-20\", display: \"Improper Input Validation\" },\n ],\n registry: {\n codings: [\n { system: HTTP_STATUS, code: \"200\", display: \"OK\" },\n { system: ACME_ERRORS, code: \"OK\", display: \"Done\" },\n ],\n },\n },\n {\n id: \"2\",\n name: \"acme-parser\",\n license: {\n system: SPDX,\n code: \"Apache-2.0\",\n display: \"Apache License 2.0\",\n },\n weakness: \"CWE-787\",\n weakness_name: \"Out-of-bounds Write\",\n weakness_system: CWE,\n // Code only: a coding without its label.\n findings: [{ system: CWE, code: \"CWE-787\" }],\n registry: STATUS_CONCEPT,\n },\n {\n id: \"3\",\n name: \"acme-utils\",\n license: null,\n weakness: \"CWE-1321\",\n weakness_name: null,\n weakness_system: null,\n findings: [],\n registry: { text: \"No answer yet\" },\n },\n];\n\nfunction CellSection() {\n const data = useMemo(\n (): PageResult<(typeof TABLE_ROWS)[number]> => ({\n data: TABLE_ROWS,\n meta: {\n total: TABLE_ROWS.length,\n limit: TABLE_ROWS.length,\n offset: 0,\n has_next: false,\n has_prev: false,\n },\n }),\n [],\n );\n return (\n <Section\n title=\"The coding cell\"\n description='An EntityTable column with x-ui-cell \"coding\": a coding, an array of codings, a code whose label and system are other fields of the row (displayField, systemField) -- or a codeable concept, its first coding shown and the others on hover.'\n >\n <div className=\"max-w-5xl\">\n <EntityTable\n schema={TABLE_SCHEMA}\n data={data}\n isLoading={false}\n isError={false}\n entityLabel=\"dependencies\"\n />\n </div>\n </Section>\n );\n}\n\n// -- Page ------------------------------------------------------------------\n\nexport interface PlayCodedValuesProps {\n /** The terminology service the page asks; default: lists in memory (staticTerminology). */\n service?: TerminologyService;\n /** The lists the widget offers, the first chosen; default: the in-memory lists'. */\n lists?: CodedValueList[];\n}\n\nexport default function PlayCodedValues({\n service,\n lists = LISTS,\n}: PlayCodedValuesProps = {}) {\n return (\n <TerminologyProvider service={service ?? PLAYGROUND_TERMINOLOGY}>\n <div className=\"w-full py-12 px-4 space-y-12\">\n <div>\n <h1 className=\"mb-1\">Coded Values</h1>\n <p className=\"text-lg text-muted-foreground\">\n The primitives to work with a terminology: a code from a list, its\n display, a table cell. The codes come from a terminology service the\n application supplies\n {service ? \".\" : \" -- here, lists in memory (staticTerminology).\"}\n </p>\n </div>\n <WidgetSection lists={lists} />\n <ConceptSection lists={lists} />\n <DisplaySection />\n <CellSection />\n </div>\n </TerminologyProvider>\n );\n}\n"],"mappings":"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","names":[]}