|
1 | 1 | <script lang="ts"> |
2 | 2 | import type { JSONSchema7, JSONSchema7Definition } from "json-schema"; |
| 3 | + import Validator from "$lib/Validator"; |
3 | 4 | import UISchema from "$lib/UISchema"; |
4 | 5 | import deepEquals from "fast-deep-equal"; |
5 | 6 | import { isObjectSchema, omit, getLabel, isEmpty } from "$lib/utilities"; |
|
20 | 21 | const keys = new WeakMap<JSONSchema7, string>(); |
21 | 22 | let schemas: JSONSchema7[] = []; |
22 | 23 | let selected: JSONSchema7 | null = null; |
23 | | - let selectedProps: string[] | undefined; |
24 | 24 |
|
25 | 25 | $: uiOptions = UISchema.Options.get(uischema); |
26 | 26 | $: updateSchemas(anyOf); |
27 | 27 | $: resetSelected(schemas); |
28 | | - $: resetData(selected, type); |
29 | 28 |
|
30 | | - function isObjSchema() { |
31 | | - return isObjectSchema({ type: selected?.type ?? type }); |
| 29 | + function isObjSchema(schema: JSONSchema7 | null = selected) { |
| 30 | + return isObjectSchema({ type: schema?.type ?? type }); |
32 | 31 | } |
33 | 32 |
|
34 | 33 | function getKey(schema: JSONSchema7) { |
|
48 | 47 | } |
49 | 48 | } |
50 | 49 |
|
51 | | - function resetSelected(schemas: JSONSchema7[]) { |
52 | | - if ((selected == null) ? force : !schemas.includes(selected)) { |
53 | | - selected = force ? schemas[0] : null; |
54 | | - } |
55 | | - } |
56 | | -
|
57 | | - async function resetData(selected: JSONSchema7 | null, type: JSONSchema7['type']) { |
58 | | - await tick(); |
59 | | - let newData = data; |
60 | | - if (isObjSchema() && (selected != null)) { |
61 | | - if (selectedProps && data) { |
62 | | - newData = omit(data, selectedProps, { keepUnchanged: true }); |
| 50 | + async function setSelected(value: JSONSchema7 | null) { |
| 51 | + if (selected !== value) { |
| 52 | + let newData = data; |
| 53 | + if (isObjSchema(value) && (value != null)) { |
| 54 | + if ((selected != null) && isObjSchema() && !isEmpty(data ?? {})) { |
| 55 | + const selectedProps = Object.keys(selected?.properties ?? {}); |
| 56 | + newData = omit(data, selectedProps, { keepUnchanged: true }); |
| 57 | + } |
| 58 | + else if ((data == null) || !isEmpty(data)) { |
| 59 | + newData = {}; |
| 60 | + } |
63 | 61 | } |
64 | | - else if ((data == null) || !isEmpty(data)) { |
65 | | - newData = {}; |
| 62 | + else { |
| 63 | + newData = undefined; |
66 | 64 | } |
| 65 | + if (newData != data) { |
| 66 | + data = newData; |
| 67 | + } |
| 68 | + selected = value; |
67 | 69 | } |
68 | | - else { |
69 | | - newData = undefined; |
70 | | - } |
71 | | - if (newData !== data) { |
72 | | - data = newData; |
73 | | - } |
74 | | - resetSelectedProps(); |
75 | 70 | } |
76 | 71 |
|
77 | | - function resetSelectedProps() { |
78 | | - const newSelectedProps = isObjSchema() ? Object.keys(selected?.properties ?? {}) : undefined; |
79 | | - if (!deepEquals(newSelectedProps?.sort(), selectedProps?.sort())) { |
80 | | - selectedProps = newSelectedProps; |
| 72 | + function resetSelected(schemas: JSONSchema7[]) { |
| 73 | + let newSelected = schemas.find(schema => Validator.validate(schema, data)) ?? null; |
| 74 | + if (force && (newSelected == null)) { |
| 75 | + newSelected = schemas[0]; |
| 76 | + } |
| 77 | + if (newSelected !== selected) { |
| 78 | + selected = newSelected; |
81 | 79 | } |
82 | 80 | } |
| 81 | +
|
83 | 82 | </script> |
84 | 83 |
|
85 | 84 | <Paper variant="unelevated" class="jsonschema-form-control control-anyof"> |
|
93 | 92 | disabled={$uiOptions.readonly} |
94 | 93 | menu$class="control-anyof-menu" |
95 | 94 | menu$portal |
96 | | - bind:value={selected} |
| 95 | + value={selected} |
| 96 | + on:SMUISelect:change={(event) => setSelected(event.detail.value)} |
97 | 97 | > |
98 | 98 | {#if !force} |
99 | 99 | <Option value={null} /> |
|
0 commit comments