@stubber/form-fields 1.0.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 (151) hide show
  1. package/README.md +303 -0
  2. package/dist/Field.svelte +36 -0
  3. package/dist/Field.svelte.d.ts +31 -0
  4. package/dist/Form.svelte +34 -0
  5. package/dist/Form.svelte.d.ts +29 -0
  6. package/dist/NullFieldWrapper.svelte +6 -0
  7. package/dist/NullFieldWrapper.svelte.d.ts +25 -0
  8. package/dist/fields/component_parts/arraybuilder/FieldWrapper.svelte +69 -0
  9. package/dist/fields/component_parts/arraybuilder/FieldWrapper.svelte.d.ts +29 -0
  10. package/dist/fields/component_parts/fieldbuilder/FieldWrapper.svelte +8 -0
  11. package/dist/fields/component_parts/fieldbuilder/FieldWrapper.svelte.d.ts +25 -0
  12. package/dist/fields/components/AgGrid.svelte +53 -0
  13. package/dist/fields/components/AgGrid.svelte.d.ts +18 -0
  14. package/dist/fields/components/Arraybuilder.svelte +101 -0
  15. package/dist/fields/components/Arraybuilder.svelte.d.ts +25 -0
  16. package/dist/fields/components/Checkbox.svelte +100 -0
  17. package/dist/fields/components/Checkbox.svelte.d.ts +23 -0
  18. package/dist/fields/components/CheckboxAutocomplete.svelte +92 -0
  19. package/dist/fields/components/CheckboxAutocomplete.svelte.d.ts +23 -0
  20. package/dist/fields/components/Contactselector.svelte +348 -0
  21. package/dist/fields/components/Contactselector.svelte.d.ts +25 -0
  22. package/dist/fields/components/Currency.svelte +258 -0
  23. package/dist/fields/components/Currency.svelte.d.ts +23 -0
  24. package/dist/fields/components/Dataindication.svelte +35 -0
  25. package/dist/fields/components/Dataindication.svelte.d.ts +23 -0
  26. package/dist/fields/components/Date.svelte +94 -0
  27. package/dist/fields/components/Date.svelte.d.ts +23 -0
  28. package/dist/fields/components/Datetime.svelte +94 -0
  29. package/dist/fields/components/Datetime.svelte.d.ts +23 -0
  30. package/dist/fields/components/Email.svelte +124 -0
  31. package/dist/fields/components/Email.svelte.d.ts +23 -0
  32. package/dist/fields/components/Fieldbuilder.svelte +340 -0
  33. package/dist/fields/components/Fieldbuilder.svelte.d.ts +25 -0
  34. package/dist/fields/components/Fieldsbuilder.svelte +122 -0
  35. package/dist/fields/components/Fieldsbuilder.svelte.d.ts +25 -0
  36. package/dist/fields/components/File.svelte +230 -0
  37. package/dist/fields/components/File.svelte.d.ts +25 -0
  38. package/dist/fields/components/Heading.svelte +17 -0
  39. package/dist/fields/components/Heading.svelte.d.ts +23 -0
  40. package/dist/fields/components/Hidden.svelte +7 -0
  41. package/dist/fields/components/Hidden.svelte.d.ts +23 -0
  42. package/dist/fields/components/Hiddenlocation.svelte +28 -0
  43. package/dist/fields/components/Hiddenlocation.svelte.d.ts +23 -0
  44. package/dist/fields/components/Html.svelte +13 -0
  45. package/dist/fields/components/Html.svelte.d.ts +23 -0
  46. package/dist/fields/components/Jsoneditor.svelte +94 -0
  47. package/dist/fields/components/Jsoneditor.svelte.d.ts +23 -0
  48. package/dist/fields/components/Map.svelte +192 -0
  49. package/dist/fields/components/Map.svelte.d.ts +25 -0
  50. package/dist/fields/components/Multicheckbox.svelte +119 -0
  51. package/dist/fields/components/Multicheckbox.svelte.d.ts +23 -0
  52. package/dist/fields/components/Multistep.svelte +86 -0
  53. package/dist/fields/components/Multistep.svelte.d.ts +25 -0
  54. package/dist/fields/components/Note.svelte +92 -0
  55. package/dist/fields/components/Note.svelte.d.ts +23 -0
  56. package/dist/fields/components/Number.svelte +118 -0
  57. package/dist/fields/components/Number.svelte.d.ts +23 -0
  58. package/dist/fields/components/Objectbuilder.svelte +152 -0
  59. package/dist/fields/components/Objectbuilder.svelte.d.ts +25 -0
  60. package/dist/fields/components/Qrcodescanner.svelte +198 -0
  61. package/dist/fields/components/Qrcodescanner.svelte.d.ts +23 -0
  62. package/dist/fields/components/Radio.svelte +116 -0
  63. package/dist/fields/components/Radio.svelte.d.ts +23 -0
  64. package/dist/fields/components/Renderfield.svelte +58 -0
  65. package/dist/fields/components/Renderfield.svelte.d.ts +25 -0
  66. package/dist/fields/components/Screenrecorder.svelte +277 -0
  67. package/dist/fields/components/Screenrecorder.svelte.d.ts +25 -0
  68. package/dist/fields/components/Screenshot.svelte +270 -0
  69. package/dist/fields/components/Screenshot.svelte.d.ts +25 -0
  70. package/dist/fields/components/Scrollandreaddisplay.svelte +122 -0
  71. package/dist/fields/components/Scrollandreaddisplay.svelte.d.ts +23 -0
  72. package/dist/fields/components/Section.svelte +64 -0
  73. package/dist/fields/components/Section.svelte.d.ts +25 -0
  74. package/dist/fields/components/Select.svelte +229 -0
  75. package/dist/fields/components/Select.svelte.d.ts +23 -0
  76. package/dist/fields/components/Selectresource.svelte +291 -0
  77. package/dist/fields/components/Selectresource.svelte.d.ts +25 -0
  78. package/dist/fields/components/Signature.svelte +153 -0
  79. package/dist/fields/components/Signature.svelte.d.ts +25 -0
  80. package/dist/fields/components/Slider.svelte +101 -0
  81. package/dist/fields/components/Slider.svelte.d.ts +23 -0
  82. package/dist/fields/components/SmartText.svelte +330 -0
  83. package/dist/fields/components/SmartText.svelte.d.ts +23 -0
  84. package/dist/fields/components/Telephone.svelte +153 -0
  85. package/dist/fields/components/Telephone.svelte.d.ts +23 -0
  86. package/dist/fields/components/Text.svelte +106 -0
  87. package/dist/fields/components/Text.svelte.d.ts +23 -0
  88. package/dist/fields/components/Voicenote.svelte +268 -0
  89. package/dist/fields/components/Voicenote.svelte.d.ts +25 -0
  90. package/dist/fields/components/index.d.ts +81 -0
  91. package/dist/fields/components/index.js +82 -0
  92. package/dist/fields/definitions/_all.json +38 -0
  93. package/dist/fields/definitions/_valid_fieldtype.json +220 -0
  94. package/dist/fields/definitions/arraybuilder.json +39 -0
  95. package/dist/fields/definitions/checkbox.json +44 -0
  96. package/dist/fields/definitions/contactselector.json +15 -0
  97. package/dist/fields/definitions/currency.json +42 -0
  98. package/dist/fields/definitions/dataindication.json +16 -0
  99. package/dist/fields/definitions/date.json +16 -0
  100. package/dist/fields/definitions/datetime.json +15 -0
  101. package/dist/fields/definitions/email.json +16 -0
  102. package/dist/fields/definitions/fieldbuilder.json +64 -0
  103. package/dist/fields/definitions/fieldsbuilder.json +38 -0
  104. package/dist/fields/definitions/file.json +42 -0
  105. package/dist/fields/definitions/grid.json +47 -0
  106. package/dist/fields/definitions/heading.json +38 -0
  107. package/dist/fields/definitions/hidden.json +89 -0
  108. package/dist/fields/definitions/hiddenlocation.json +15 -0
  109. package/dist/fields/definitions/html.json +34 -0
  110. package/dist/fields/definitions/index.d.ts +86 -0
  111. package/dist/fields/definitions/index.js +96 -0
  112. package/dist/fields/definitions/jsoneditor.json +33 -0
  113. package/dist/fields/definitions/map.json +36 -0
  114. package/dist/fields/definitions/multicheckbox.json +47 -0
  115. package/dist/fields/definitions/multistep.json +35 -0
  116. package/dist/fields/definitions/note.json +16 -0
  117. package/dist/fields/definitions/number.json +42 -0
  118. package/dist/fields/definitions/objectbuilder.json +39 -0
  119. package/dist/fields/definitions/qrcodescanner.json +16 -0
  120. package/dist/fields/definitions/radio.json +47 -0
  121. package/dist/fields/definitions/renderfield.json +36 -0
  122. package/dist/fields/definitions/richtext.json +16 -0
  123. package/dist/fields/definitions/screenrecorder.json +42 -0
  124. package/dist/fields/definitions/screenshot.json +42 -0
  125. package/dist/fields/definitions/scrollandreaddisplay.json +49 -0
  126. package/dist/fields/definitions/section.json +50 -0
  127. package/dist/fields/definitions/select.json +47 -0
  128. package/dist/fields/definitions/selectresource.json +48 -0
  129. package/dist/fields/definitions/signature.json +16 -0
  130. package/dist/fields/definitions/slider.json +78 -0
  131. package/dist/fields/definitions/smart_text.json +101 -0
  132. package/dist/fields/definitions/telephone.json +16 -0
  133. package/dist/fields/definitions/text.json +35 -0
  134. package/dist/fields/definitions/voicenote.json +43 -0
  135. package/dist/index.d.ts +2 -0
  136. package/dist/index.js +3 -0
  137. package/dist/thirdparty/mapbox/GeoCoder.svelte +10 -0
  138. package/dist/thirdparty/mapbox/GeoCoder.svelte.d.ts +25 -0
  139. package/dist/thirdparty/mapbox/Map.svelte +30 -0
  140. package/dist/thirdparty/mapbox/Map.svelte.d.ts +20 -0
  141. package/dist/thirdparty/mapbox/MapMarker.svelte +13 -0
  142. package/dist/thirdparty/mapbox/MapMarker.svelte.d.ts +31 -0
  143. package/dist/utils/createField.d.ts +6 -0
  144. package/dist/utils/createField.js +33 -0
  145. package/dist/utils/createForm.d.ts +1 -0
  146. package/dist/utils/createForm.js +501 -0
  147. package/dist/utils/index.d.ts +18 -0
  148. package/dist/utils/index.js +126 -0
  149. package/dist/utils/syncing.d.ts +11 -0
  150. package/dist/utils/syncing.js +134 -0
  151. package/package.json +78 -0
@@ -0,0 +1,230 @@
1
+ <script>
2
+ import { onMount } from "svelte";
3
+ import Dropzone from "svelte-file-dropzone";
4
+ import _ from "lodash-es";
5
+ import { deepEqual } from "fast-equals";
6
+ import { syncStoreToStore } from "../../utils/syncing";
7
+ import { writable } from "svelte/store";
8
+
9
+ export let form;
10
+ export let field;
11
+
12
+ const internal = writable({});
13
+
14
+ $: state_key = $field.state?.state_key;
15
+ $: label = $field.spec?.title;
16
+ $: hide_label = $field.spec?.hide_label;
17
+ $: isValid = !$field.state?.validation || $field.state?.validation?.valid;
18
+ $: validationMessage = $field.state?.validation?.message;
19
+ $: max_files = isNaN(parseInt($field.spec?.params?.max_files))
20
+ ? Infinity
21
+ : parseInt($field.spec?.params?.max_files);
22
+ $: limit_remaining =
23
+ max_files - ($internal?.selected_files?.length ?? 0) - ($internal?.uploaded_files?.length ?? 0);
24
+
25
+ onMount(() => {
26
+ // set field values that aren't set yet
27
+ let f = _.cloneDeep($field);
28
+ let initial_value = _.isArray(f?.data?.base) ? f?.data?.base : [];
29
+ let initial_data = {
30
+ ...f?.data,
31
+ base: initial_value,
32
+ };
33
+ let initial_state_internal = {
34
+ selected_files: [],
35
+ uploaded_files: initial_value,
36
+ failed_files: [],
37
+ };
38
+
39
+ _.set(f, "data", initial_data);
40
+ _.set(f, "state.internal", initial_state_internal);
41
+ if (!deepEqual(f, $field)) $field = f;
42
+
43
+ syncStoreToStore(
44
+ field,
45
+ internal,
46
+ (a, b) => {
47
+ let _clone = _.cloneDeep(a.state?.internal) || {};
48
+
49
+ // get parts from data
50
+ let files = _.isArray(a?.data?.base) ? a?.data?.base : [];
51
+ _clone.uploaded_files = files;
52
+
53
+ // set field state if changed
54
+ if (!deepEqual(a?.state?.internal, _clone)) {
55
+ $field.state.internal = _clone;
56
+ }
57
+ return _clone;
58
+ },
59
+ (a, b) => {
60
+ let _clone = _.cloneDeep(a) || {};
61
+ // update the state
62
+ _.set(_clone, "state.internal", _.cloneDeep(b));
63
+ // update the data
64
+ _.set(_clone, "data.base", b?.uploaded_files);
65
+ return _clone;
66
+ }
67
+ );
68
+ });
69
+
70
+ async function handleFilesSelect(e) {
71
+ const { acceptedFiles, fileRejections } = e.detail;
72
+ let comparison = _.cloneDeep($internal);
73
+ let batch = _.cloneDeep(
74
+ acceptedFiles.map((a) => {
75
+ return {
76
+ ...a,
77
+ f_id: Math.random().toString(36).substring(7),
78
+ };
79
+ })
80
+ );
81
+ if (limit_remaining < batch.length) {
82
+ alert("You have reached the maximum number of files allowed");
83
+ return;
84
+ }
85
+ comparison.selected_files = comparison.selected_files.concat(batch);
86
+ comparison.failed_files = comparison.failed_files.concat(_.cloneDeep(fileRejections));
87
+
88
+ if (!deepEqual(comparison, $internal)) {
89
+ $internal = comparison;
90
+ }
91
+
92
+ let upload_res = await form.uploadFiles(acceptedFiles);
93
+ let { uploaded_files, failed_files } = upload_res;
94
+
95
+ let comparison2 = _.cloneDeep($internal);
96
+ if (_.isArray(uploaded_files)) {
97
+ uploaded_files.forEach((a) => {
98
+ a.f_id = batch.find((f) => f.path === a.filename).f_id;
99
+ form.appendAttachment(a);
100
+ });
101
+ comparison2.uploaded_files = comparison2.uploaded_files.concat(uploaded_files);
102
+ }
103
+
104
+ if (_.isArray(failed_files)) {
105
+ failed_files.forEach((a) => {
106
+ a.f_id = batch.find((f) => f.path === a.filename).f_id;
107
+ });
108
+ comparison2.failed_files = comparison2.failed_files.concat(failed_files);
109
+ }
110
+
111
+ let batch_ids = batch.map((b) => b.f_id);
112
+
113
+ comparison2.selected_files = comparison2.selected_files.filter((f) => {
114
+ return !batch_ids.includes(f.f_id);
115
+ });
116
+
117
+ if (!deepEqual(comparison2, $internal)) {
118
+ $internal = comparison2;
119
+ }
120
+ }
121
+
122
+ function removeFile(item) {
123
+ let comparison = _.cloneDeep($internal);
124
+
125
+ comparison.selected_files = comparison.selected_files?.filter((f) => f.f_id !== item.file.f_id);
126
+ comparison.failed_files = comparison.failed_files?.filter((f) => f.f_id !== item.file.f_id);
127
+ comparison.uploaded_files = comparison.uploaded_files?.filter((f) => f.f_id !== item.file.f_id);
128
+
129
+ if (!deepEqual(comparison, $internal)) {
130
+ $internal = comparison;
131
+ }
132
+
133
+ if (item?.is_uploaded) {
134
+ form.removeAttachment(item?.file);
135
+ }
136
+ }
137
+
138
+ $: fileList = (
139
+ ($internal?.uploaded_files || [])?.map((f) => {
140
+ return {
141
+ file: f,
142
+ is_uploaded: true,
143
+ };
144
+ }) || []
145
+ )
146
+ .concat(
147
+ $internal?.selected_files?.map((f) => {
148
+ return {
149
+ file: f,
150
+ is_selected: true,
151
+ };
152
+ }) || []
153
+ )
154
+ .concat(
155
+ $internal?.failed_files?.map((f) => {
156
+ return {
157
+ file: f,
158
+ is_failed: true,
159
+ };
160
+ }) || []
161
+ );
162
+ </script>
163
+
164
+ {#if $internal}
165
+ <label
166
+ for="input_{state_key}"
167
+ class="block text-label text-surface-900 {hide_label ? 'hidden' : ''}"
168
+ >
169
+ {label}
170
+ </label>
171
+ <div class="w-full flex flex-col {!isValid ? 'border-b border-warning-500' : ''}">
172
+ <Dropzone on:drop={handleFilesSelect} disabled={limit_remaining <= 0}>
173
+ <div class="flex justify-center h-full flex-col text-center">
174
+ <div>
175
+ <p class="text-field text-surface-800">Drop files to upload</p>
176
+ <p class="text-field text-surface-800">
177
+ Or click <span
178
+ class="text-primary-500 hover:text-primary-400 hover:underline cursor-pointer"
179
+ >here</span
180
+ >
181
+ to browse
182
+ </p>
183
+ {#if limit_remaining <= 0}
184
+ <p class="text-field text-danger-600 text-sm italic">
185
+ You have reached the maximum number of files allowed
186
+ </p>
187
+ {/if}
188
+ </div>
189
+ </div>
190
+ </Dropzone>
191
+ <div class="w-full mt-2">
192
+ {#each fileList as item}
193
+ <div class="w-full flex flex-row">
194
+ {#if item.is_uploaded}
195
+ <div class="px-2">
196
+ <i class="fa fa-check text-success-500" />
197
+ </div>
198
+ {:else if item.is_failed}
199
+ <div class="px-2 space-x-2 flex items-center text-danger-400">
200
+ <i class="fa-regular fa-triangle-exclamation" />
201
+ <p class="hidden md:block text-fluid-md">Failed</p>
202
+ </div>
203
+ {:else}
204
+ <div class="px-2 space-x-2 flex items-center text-surface-500">
205
+ <p class="hidden md:block text-fluid-md" />
206
+ <i class="fa fa-pulse fa-spinner" />
207
+ </div>
208
+ {/if}
209
+ <div class="w-full shrink py-1 pl-2 truncate border border-surface-200 rounded-sm">
210
+ <p class="text-surface-800 text-fluid-md">
211
+ {item?.file?.filename ?? item?.file?.name ?? item?.file?.path}
212
+ </p>
213
+ </div>
214
+ <button
215
+ type="button"
216
+ class="shrink-0 ml-1 p-1 px-2 fa-solid fa-2xs fa-x bg-surface-0 rounded-full border border-surface-0 hover:border-warning-500 hover:text-warning-500"
217
+ on:click={() => {
218
+ removeFile(item);
219
+ }}
220
+ />
221
+ </div>
222
+ {/each}
223
+ </div>
224
+ </div>
225
+ {#if validationMessage}
226
+ <p class="text-label {!isValid ? `text-danger-500` : `text-success-500`}">
227
+ {validationMessage}
228
+ </p>
229
+ {/if}
230
+ {/if}
@@ -0,0 +1,25 @@
1
+ /** @typedef {typeof __propDef.props} FileProps */
2
+ /** @typedef {typeof __propDef.events} FileEvents */
3
+ /** @typedef {typeof __propDef.slots} FileSlots */
4
+ export default class File extends SvelteComponentTyped<{
5
+ form: any;
6
+ field: any;
7
+ }, {
8
+ [evt: string]: CustomEvent<any>;
9
+ }, {}> {
10
+ }
11
+ export type FileProps = typeof __propDef.props;
12
+ export type FileEvents = typeof __propDef.events;
13
+ export type FileSlots = typeof __propDef.slots;
14
+ import { SvelteComponentTyped } from "svelte";
15
+ declare const __propDef: {
16
+ props: {
17
+ form: any;
18
+ field: any;
19
+ };
20
+ events: {
21
+ [evt: string]: CustomEvent<any>;
22
+ };
23
+ slots: {};
24
+ };
25
+ export {};
@@ -0,0 +1,17 @@
1
+ <script>
2
+ import _ from "lodash-es";
3
+
4
+ export let field;
5
+
6
+ $: heading_text = $field?.spec?.params?.heading_text;
7
+ $: subheading_text = $field?.spec?.params?.subheading_text;
8
+ </script>
9
+
10
+ <div class="flex flex-col w-full mb-2">
11
+ {#if heading_text}
12
+ <h1 class="text-xl text-surface-700 mt-4">{heading_text}</h1>
13
+ {/if}
14
+ {#if subheading_text}
15
+ <h2 class="text-sm text-surface-500 whitespace-pre-wrap">{subheading_text}</h2>
16
+ {/if}
17
+ </div>
@@ -0,0 +1,23 @@
1
+ /** @typedef {typeof __propDef.props} HeadingProps */
2
+ /** @typedef {typeof __propDef.events} HeadingEvents */
3
+ /** @typedef {typeof __propDef.slots} HeadingSlots */
4
+ export default class Heading extends SvelteComponentTyped<{
5
+ field: any;
6
+ }, {
7
+ [evt: string]: CustomEvent<any>;
8
+ }, {}> {
9
+ }
10
+ export type HeadingProps = typeof __propDef.props;
11
+ export type HeadingEvents = typeof __propDef.events;
12
+ export type HeadingSlots = typeof __propDef.slots;
13
+ import { SvelteComponentTyped } from "svelte";
14
+ declare const __propDef: {
15
+ props: {
16
+ field: any;
17
+ };
18
+ events: {
19
+ [evt: string]: CustomEvent<any>;
20
+ };
21
+ slots: {};
22
+ };
23
+ export {};
@@ -0,0 +1,7 @@
1
+ <script>
2
+ export let field;
3
+
4
+ $: state_key = $field.state?.state_key;
5
+ </script>
6
+
7
+ <input name={state_key} bind:value={$field.data.base} hidden />
@@ -0,0 +1,23 @@
1
+ /** @typedef {typeof __propDef.props} HiddenProps */
2
+ /** @typedef {typeof __propDef.events} HiddenEvents */
3
+ /** @typedef {typeof __propDef.slots} HiddenSlots */
4
+ export default class Hidden extends SvelteComponentTyped<{
5
+ field: any;
6
+ }, {
7
+ [evt: string]: CustomEvent<any>;
8
+ }, {}> {
9
+ }
10
+ export type HiddenProps = typeof __propDef.props;
11
+ export type HiddenEvents = typeof __propDef.events;
12
+ export type HiddenSlots = typeof __propDef.slots;
13
+ import { SvelteComponentTyped } from "svelte";
14
+ declare const __propDef: {
15
+ props: {
16
+ field: any;
17
+ };
18
+ events: {
19
+ [evt: string]: CustomEvent<any>;
20
+ };
21
+ slots: {};
22
+ };
23
+ export {};
@@ -0,0 +1,28 @@
1
+ <script>
2
+ import { deepEqual } from "fast-equals";
3
+ import _ from "lodash-es";
4
+ import { onMount } from "svelte";
5
+
6
+ export let field;
7
+
8
+ $: state_key = $field.state?.state_key;
9
+
10
+ onMount(() => {
11
+ navigator.geolocation.getCurrentPosition((o) => {
12
+ let { latitude, longitude } = o?.coords || {};
13
+ if (!latitude || !longitude) return;
14
+
15
+ let base = {
16
+ lat: latitude,
17
+ lng: longitude,
18
+ latlng: `${latitude},${longitude}`,
19
+ };
20
+
21
+ if (!deepEqual(base, $field.data.base)) {
22
+ $field.data.base = base;
23
+ }
24
+ });
25
+ });
26
+ </script>
27
+
28
+ <input name={state_key} bind:value={$field.data.base} hidden />
@@ -0,0 +1,23 @@
1
+ /** @typedef {typeof __propDef.props} HiddenlocationProps */
2
+ /** @typedef {typeof __propDef.events} HiddenlocationEvents */
3
+ /** @typedef {typeof __propDef.slots} HiddenlocationSlots */
4
+ export default class Hiddenlocation extends SvelteComponentTyped<{
5
+ field: any;
6
+ }, {
7
+ [evt: string]: CustomEvent<any>;
8
+ }, {}> {
9
+ }
10
+ export type HiddenlocationProps = typeof __propDef.props;
11
+ export type HiddenlocationEvents = typeof __propDef.events;
12
+ export type HiddenlocationSlots = typeof __propDef.slots;
13
+ import { SvelteComponentTyped } from "svelte";
14
+ declare const __propDef: {
15
+ props: {
16
+ field: any;
17
+ };
18
+ events: {
19
+ [evt: string]: CustomEvent<any>;
20
+ };
21
+ slots: {};
22
+ };
23
+ export {};
@@ -0,0 +1,13 @@
1
+ <script>
2
+ import _ from "lodash-es";
3
+
4
+ export let field;
5
+
6
+ $: html = $field?.spec?.params?.html;
7
+ </script>
8
+
9
+ <div class="w-full">
10
+ {#if html}
11
+ {@html html}
12
+ {/if}
13
+ </div>
@@ -0,0 +1,23 @@
1
+ /** @typedef {typeof __propDef.props} HtmlProps */
2
+ /** @typedef {typeof __propDef.events} HtmlEvents */
3
+ /** @typedef {typeof __propDef.slots} HtmlSlots */
4
+ export default class Html extends SvelteComponentTyped<{
5
+ field: any;
6
+ }, {
7
+ [evt: string]: CustomEvent<any>;
8
+ }, {}> {
9
+ }
10
+ export type HtmlProps = typeof __propDef.props;
11
+ export type HtmlEvents = typeof __propDef.events;
12
+ export type HtmlSlots = typeof __propDef.slots;
13
+ import { SvelteComponentTyped } from "svelte";
14
+ declare const __propDef: {
15
+ props: {
16
+ field: any;
17
+ };
18
+ events: {
19
+ [evt: string]: CustomEvent<any>;
20
+ };
21
+ slots: {};
22
+ };
23
+ export {};
@@ -0,0 +1,94 @@
1
+ <script>
2
+ import { syncStoreToStore } from "../../utils/syncing";
3
+ import { deepEqual } from "fast-equals";
4
+ import _ from "lodash-es";
5
+ import { onMount } from "svelte";
6
+ import { writable } from "svelte/store";
7
+ import { JSONEditor } from "svelte-jsoneditor";
8
+
9
+ export let field;
10
+
11
+ const internal = writable();
12
+
13
+ $: state_key = $field.state?.state_key;
14
+ $: label = $field.spec?.title;
15
+ $: hide_label = $field.spec?.hide_label;
16
+ $: isValid = !$field.state?.validation || $field.state?.validation?.valid;
17
+ $: validationMessage = $field.state?.validation?.message;
18
+ $: readOnly = $field.spec?.params?.readonly;
19
+
20
+ onMount(() => {
21
+ // set field values that aren't set yet
22
+ let f = _.cloneDeep($field);
23
+ let initial_value = f?.data?.base ?? null;
24
+ let mode = f?.state?.internal?.mode ?? "tree";
25
+ let content =
26
+ mode === "text" ? { text: JSON.stringify(initial_value) } : { json: initial_value };
27
+ let initial_data = {
28
+ ...f?.data,
29
+ base: initial_value,
30
+ };
31
+ let initial_state_internal = {
32
+ ...f?.state?.internal,
33
+ mode,
34
+ content,
35
+ };
36
+ _.set(f, "data", initial_data);
37
+ _.set(f, "state.internal", initial_state_internal);
38
+ if (!deepEqual(f, $field)) $field = f;
39
+
40
+ syncStoreToStore(
41
+ field,
42
+ internal,
43
+ (a, b) => {
44
+ let _clone = _.cloneDeep(a.state?.internal) || {};
45
+
46
+ // get parts from data
47
+ _clone.content =
48
+ _clone.mode === "text"
49
+ ? { text: JSON.stringify(a?.data?.base) }
50
+ : { json: a?.data?.base };
51
+
52
+ // set field state if changed
53
+ if (!deepEqual(a?.state?.internal, _clone)) {
54
+ $field.state.internal = _clone;
55
+ }
56
+
57
+ return _clone;
58
+ },
59
+ (a, b) => {
60
+ let _clone = _.cloneDeep(a) || {};
61
+ // update the state
62
+ _.set(_clone, "state.internal", _.cloneDeep(b));
63
+ // update the data
64
+ try {
65
+ let base;
66
+ if (b?.mode === "text") base = JSON.parse(b?.content?.text);
67
+ else base = b?.content?.json;
68
+ _.set(_clone, "data.base", base);
69
+ } catch (err) {
70
+ console.warn("JSON parse error", err);
71
+ }
72
+ return _clone;
73
+ }
74
+ );
75
+ });
76
+ </script>
77
+
78
+ {#if $internal && $internal}
79
+ <div class="flex flex-col w-full text-surface-900 jse-theme-dark">
80
+ <label for="input_{state_key}" class="block text-label {hide_label ? 'hidden' : ''}">
81
+ {label}
82
+ </label>
83
+ <JSONEditor bind:content={$internal.content} {readOnly} bind:mode={$internal.mode} />
84
+ {#if validationMessage}
85
+ <p class="text-label {!isValid ? `text-danger-500` : `text-success-500`}">
86
+ {validationMessage}
87
+ </p>
88
+ {/if}
89
+ </div>
90
+ {/if}
91
+
92
+ <style>
93
+ @import "svelte-jsoneditor/themes/jse-theme-dark.css";
94
+ </style>
@@ -0,0 +1,23 @@
1
+ /** @typedef {typeof __propDef.props} JsoneditorProps */
2
+ /** @typedef {typeof __propDef.events} JsoneditorEvents */
3
+ /** @typedef {typeof __propDef.slots} JsoneditorSlots */
4
+ export default class Jsoneditor extends SvelteComponentTyped<{
5
+ field: any;
6
+ }, {
7
+ [evt: string]: CustomEvent<any>;
8
+ }, {}> {
9
+ }
10
+ export type JsoneditorProps = typeof __propDef.props;
11
+ export type JsoneditorEvents = typeof __propDef.events;
12
+ export type JsoneditorSlots = typeof __propDef.slots;
13
+ import { SvelteComponentTyped } from "svelte";
14
+ declare const __propDef: {
15
+ props: {
16
+ field: any;
17
+ };
18
+ events: {
19
+ [evt: string]: CustomEvent<any>;
20
+ };
21
+ slots: {};
22
+ };
23
+ export {};