@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,340 @@
1
+ <script>
2
+ import { Form } from "../..";
3
+ import _ from "lodash-es";
4
+ import { selectableFieldtypes, definitions } from "../definitions/index.js";
5
+ import { syncStoreToStore } from "../../utils/syncing";
6
+ import { writable } from "svelte/store";
7
+ import { onMount, getContext } from "svelte";
8
+ import { deepEqual } from "fast-equals";
9
+ import FieldWrapper from "../component_parts/fieldbuilder/FieldWrapper.svelte";
10
+ import * as utils from "../../utils/index.js";
11
+
12
+ export let form;
13
+ export let field;
14
+
15
+ $: state_key = $field.state?.state_key;
16
+ $: label = $field.spec?.title;
17
+ $: hide_label = $field.spec?.hide_label;
18
+ $: isValid = !$field.state?.validation || $field.state?.validation?.valid;
19
+ $: validationMessage = $field.state?.validation?.message;
20
+ $: spec_fieldtype_editable = $field.spec?.params?.spec_fieldtype_editable ?? true;
21
+ $: spec_name_editable = $field.spec?.params?.spec_name_editable ?? true;
22
+ $: spec_fieldtype = $field.spec?.params?.spec_fieldtype;
23
+ $: spec_name = $field.spec?.params?.spec_name;
24
+
25
+ let views = {
26
+ demo: !$field.spec?.params?.hide_demo && !$field.spec?.params?.demo_collapsed,
27
+ settings: true,
28
+ };
29
+ let dependencies = form.dependencies;
30
+ let default_field_wrapper = getContext("stubber-form-fields-default-wrapper");
31
+
32
+ let all_form = writable();
33
+ let initial_all_form;
34
+ $: updateInitialAllForm(spec_fieldtype, spec_name, spec_fieldtype_editable, spec_name_editable);
35
+ function updateInitialAllForm(ft, n, fte, ne) {
36
+ let update_all_form = _.cloneDeep(initial_all_form || {});
37
+ _.set(update_all_form, "spec.fields.name", {
38
+ fieldtype: "dataindication",
39
+ });
40
+ _.set(update_all_form, "spec.fields.fieldtype", {
41
+ fieldtype: "dataindication",
42
+ });
43
+ if (ne) {
44
+ _.set(update_all_form, "spec.fields.name.fieldtype", "text");
45
+ }
46
+ if (fte) {
47
+ _.set(update_all_form, "spec.fields.fieldtype.fieldtype", "select");
48
+ _.set(update_all_form, "spec.fields.fieldtype.params.options", selectableFieldtypes);
49
+ }
50
+ if (!deepEqual(initial_all_form, update_all_form)) {
51
+ let fieldtype = $field?.data?.base?.fieldtype ?? ft;
52
+ if (!fte) fieldtype = ft ?? fieldtype ?? "text";
53
+ let name = $field?.data?.base?.name ?? n;
54
+ if (!ne) name = n ?? name ?? "field";
55
+ _.set(update_all_form, "data.name", name);
56
+ _.set(update_all_form, "data.fieldtype", fieldtype);
57
+ initial_all_form = _.cloneDeep(update_all_form);
58
+ }
59
+ }
60
+
61
+ let settings_form = writable();
62
+ let initial_settings_form;
63
+ $: updateInitialSettingsForm($all_form);
64
+ function updateInitialSettingsForm(af) {
65
+ let fieldtype = af?.data?.fieldtype;
66
+ let name = af?.data?.name;
67
+ if (!definitions[fieldtype]?.settings_form) return;
68
+
69
+ let update_settings_form = _.cloneDeep(initial_settings_form || {});
70
+
71
+ let settings_form_spec = _.cloneDeep(definitions[fieldtype]?.settings_form);
72
+ let valid_fieldtype_settings_form = _.cloneDeep(definitions?._valid_fieldtype?.settings_form);
73
+ let spec = _.merge({}, settings_form_spec, valid_fieldtype_settings_form);
74
+ _.set(update_settings_form, "spec", spec);
75
+
76
+ if (!deepEqual(initial_settings_form, update_settings_form)) {
77
+ let data = _.cloneDeep(_.cloneDeep($settings_form?.data));
78
+ _.set(data, "spec.fieldtype", fieldtype);
79
+ _.set(data, "spec.name", name);
80
+ _.set(update_settings_form, "data", data);
81
+ initial_settings_form = _.cloneDeep(update_settings_form);
82
+ }
83
+ }
84
+
85
+ let advanced_form = writable();
86
+ let initial_advanced_form = {
87
+ spec: {
88
+ fields: {
89
+ spec: {
90
+ fieldtype: "jsoneditor",
91
+ },
92
+ },
93
+ },
94
+ data: {
95
+ spec: $field?.data?.base,
96
+ },
97
+ };
98
+
99
+ let demo_data_form = writable();
100
+ let demo_form = writable();
101
+ let initial_demo_form;
102
+ $: debounceUpdateInitialDemoForm($settings_form?.data?.spec);
103
+ const debounceUpdateInitialDemoForm = utils.debounce(updateInitialDemoForm, 100);
104
+ function updateInitialDemoForm(s) {
105
+ let fieldname = s?.name ?? "";
106
+ let spec = _.cloneDeep(s);
107
+ _.unset(spec, "conditions");
108
+ let update = {
109
+ spec: {
110
+ fields: {
111
+ [fieldname]: spec,
112
+ },
113
+ },
114
+ };
115
+
116
+ if (!deepEqual(initial_demo_form, update)) initial_demo_form = update;
117
+ }
118
+
119
+ onMount(() => {
120
+ // set field values that aren't set yet
121
+ let f = _.cloneDeep($field);
122
+ let initial_value = !_.isObject(f?.data?.base) ? {} : f?.data?.base;
123
+ let initial_data = {
124
+ ...f?.data,
125
+ base: initial_value,
126
+ };
127
+ _.set(f, "data", initial_data);
128
+ if (!deepEqual(f, $field)) $field = f;
129
+
130
+ syncStoreToStore(
131
+ field,
132
+ all_form,
133
+ (a, b) => {
134
+ let _clone = _.cloneDeep(b) || {};
135
+ let spec = _.cloneDeep(a?.data?.base);
136
+
137
+ // lowercase and remove all whitespace and replace with _
138
+ let name = a?.data?.base?.name?.toLowerCase().replace(/\s/g, "_");
139
+ let fieldtype = a?.data?.base?.fieldtype?.toLowerCase().replace(/\s/g, "_");
140
+ if (name !== a?.data?.base?.name) $field.data.base.name = name;
141
+ if (fieldtype !== a?.data?.base?.fieldtype) $field.data.base.fieldtype = fieldtype;
142
+
143
+ _.set(_clone, "data.name", name);
144
+ _.set(_clone, "data.fieldtype", fieldtype);
145
+ return _clone;
146
+ },
147
+ (a, b) => {
148
+ let _clone = _.cloneDeep(a) || {};
149
+ _.set(_clone, "data.base.name", b?.data?.name);
150
+ _.set(_clone, "data.base.fieldtype", b?.data?.fieldtype);
151
+ return _clone;
152
+ }
153
+ );
154
+
155
+ syncStoreToStore(
156
+ field,
157
+ settings_form,
158
+ (a, b) => {
159
+ let _clone = _.cloneDeep(b) || {};
160
+ let spec = _.cloneDeep(a?.data?.base);
161
+ spec.__key = spec.name;
162
+ _.set(_clone, "data.spec", spec);
163
+ return _clone;
164
+ },
165
+ (a, b) => {
166
+ let _clone = _.cloneDeep(a) || {};
167
+ let spec = _.cloneDeep(b?.data?.spec);
168
+ spec.__key = spec.name;
169
+ _.set(_clone, "data.base", spec);
170
+ return _clone;
171
+ }
172
+ );
173
+
174
+ syncStoreToStore(
175
+ field,
176
+ advanced_form,
177
+ (a, b) => {
178
+ let _clone = _.cloneDeep(b) || {};
179
+ let spec = _.cloneDeep(a?.data?.base);
180
+ spec.__key = spec.name;
181
+ _.set(_clone, "data.spec", spec);
182
+ return _clone;
183
+ },
184
+ (a, b) => {
185
+ let _clone = _.cloneDeep(a) || {};
186
+ let spec = _.cloneDeep(b?.data?.spec);
187
+ spec.__key = spec.name;
188
+ if (spec.__key !== b?.data?.spec?.__key) {
189
+ $advanced_form.data.spec.__key = spec.__key;
190
+ }
191
+ _.set(_clone, "data.base", spec);
192
+ return _clone;
193
+ }
194
+ );
195
+
196
+ syncStoreToStore(
197
+ demo_form,
198
+ demo_data_form,
199
+ (a, b) => {
200
+ let _clone = _.cloneDeep(b) || {};
201
+ _.set(_clone, "data.data", a?.data);
202
+ return _clone;
203
+ },
204
+ (a, b) => {
205
+ return a;
206
+ }
207
+ );
208
+ });
209
+ </script>
210
+
211
+ <div class="flex flex-col w-full text-surface-900">
212
+ <label for="input_{state_key}" class="block text-label {hide_label ? 'hidden' : ''}">
213
+ {label}
214
+ </label>
215
+ <div class="border">
216
+ <div class="bg-surface-50">
217
+ {#if $field?.data?.base?.name}
218
+ <div class="text-xs text-surface-700 p-1 border-b">
219
+ {$field.data.base.name}
220
+ </div>
221
+ {/if}
222
+ <div class="flex items-center justify-start border-b bg-surface-50">
223
+ {#if !$field?.spec?.params?.hide_demo}
224
+ <button type="button" on:click={() => (views.demo = !views.demo)}>
225
+ <div class="p-2 hover:bg-primary-100">
226
+ <div class="text-sm italic text-surface-500 flex justify-between items-center">
227
+ <i class="fa-regular fa-input-pipe {views.demo ? 'text-primary-500' : ''}" />
228
+ </div>
229
+ </div>
230
+ </button>
231
+ {/if}
232
+ <button type="button" on:click={() => (views.settings = !views.settings)}>
233
+ <div class="p-2 hover:bg-primary-100">
234
+ <div class="text-sm italic text-surface-500 flex justify-between items-center">
235
+ <i class="fa-regular fa-gear {views.settings ? 'text-primary-500' : ''}" />
236
+ </div>
237
+ </div>
238
+ </button>
239
+ <button type="button" on:click={() => (views.demo_data = !views.demo_data)}>
240
+ <div class="p-2 hover:bg-primary-100">
241
+ <div class="text-sm italic text-surface-500 flex justify-between items-center">
242
+ <i class="fa-regular fa-database {views.demo_data ? 'text-primary-500' : ''}" />
243
+ </div>
244
+ </div>
245
+ </button>
246
+ <button type="button" on:click={() => (views.advanced = !views.advanced)}>
247
+ <div class="p-2 hover:bg-primary-100">
248
+ <div class="text-sm italic text-surface-500 flex justify-between items-center">
249
+ <i class="fa-regular fa-brackets-curly {views.advanced ? 'text-primary-500' : ''}" />
250
+ </div>
251
+ </div>
252
+ </button>
253
+ </div>
254
+ </div>
255
+ {#if initial_demo_form}
256
+ <div
257
+ class="{views.demo && !$field.spec?.params?.hide_demo
258
+ ? 'p-2'
259
+ : 'invisible absolute'} min-h-[100px]"
260
+ >
261
+ {#if !$settings_form?.data?.spec?.name || !$settings_form?.data?.spec?.fieldtype}
262
+ <div class="text-surface-500 text-xs italic">
263
+ Cannot show field without a field name and field type
264
+ </div>
265
+ {:else}
266
+ <div class="p-2">
267
+ <Form
268
+ bind:form={demo_form}
269
+ initial_form={initial_demo_form}
270
+ {dependencies}
271
+ field_wrapper={default_field_wrapper}
272
+ />
273
+ </div>
274
+ {/if}
275
+ </div>
276
+ {:else}
277
+ <div class="p-2 text-sm text-surface-500 italic min-h-[100px]">Initializing...</div>
278
+ {/if}
279
+ <div class={views.settings ? "border-t p-2" : "invisible absolute"}>
280
+ <div class="text-surface-500 text-xs pb-2 italic">
281
+ <button type="button" on:click={() => (views.settings = false)}
282
+ ><i class="fa-regular fa-circle-xmark text-sm" /></button
283
+ > Field Settings
284
+ </div>
285
+ <div class="p-2">
286
+ {#if initial_all_form}
287
+ <Form
288
+ bind:form={all_form}
289
+ initial_form={initial_all_form}
290
+ {dependencies}
291
+ field_wrapper={FieldWrapper}
292
+ />
293
+ {/if}
294
+ {#if initial_settings_form}
295
+ <Form
296
+ bind:form={settings_form}
297
+ initial_form={initial_settings_form}
298
+ {dependencies}
299
+ field_wrapper={FieldWrapper}
300
+ />
301
+ {/if}
302
+ </div>
303
+ </div>
304
+ <div class={views.demo_data ? "border-t p-2" : "invisible absolute"}>
305
+ <div class="text-surface-500 text-xs pb-2 italic">
306
+ <button type="button" on:click={() => (views.demo_data = false)}
307
+ ><i class="fa-regular fa-circle-xmark text-sm" /></button
308
+ > Demo Field Data
309
+ </div>
310
+ {#if initial_demo_form}
311
+ <Form
312
+ bind:form={demo_data_form}
313
+ initial_form={{
314
+ spec: {
315
+ fields: {
316
+ data: { fieldtype: "jsoneditor", hide_label: true, params: { readonly: true } },
317
+ },
318
+ },
319
+ }}
320
+ {dependencies}
321
+ />
322
+ {/if}
323
+ </div>
324
+ <div class={views.advanced ? "border-t p-2" : "invisible absolute"}>
325
+ <div class="text-surface-500 text-xs pb-2 italic">
326
+ <button type="button" on:click={() => (views.advanced = false)}
327
+ ><i class="fa-regular fa-circle-xmark text-sm" /></button
328
+ > Advanced Field Settings
329
+ </div>
330
+ {#if initial_advanced_form}
331
+ <Form bind:form={advanced_form} initial_form={initial_advanced_form} {dependencies} />
332
+ {/if}
333
+ </div>
334
+ </div>
335
+ {#if validationMessage}
336
+ <p class="text-label {!isValid ? `text-danger-500` : `text-success-500`}">
337
+ {validationMessage}
338
+ </p>
339
+ {/if}
340
+ </div>
@@ -0,0 +1,25 @@
1
+ /** @typedef {typeof __propDef.props} FieldbuilderProps */
2
+ /** @typedef {typeof __propDef.events} FieldbuilderEvents */
3
+ /** @typedef {typeof __propDef.slots} FieldbuilderSlots */
4
+ export default class Fieldbuilder extends SvelteComponentTyped<{
5
+ form: any;
6
+ field: any;
7
+ }, {
8
+ [evt: string]: CustomEvent<any>;
9
+ }, {}> {
10
+ }
11
+ export type FieldbuilderProps = typeof __propDef.props;
12
+ export type FieldbuilderEvents = typeof __propDef.events;
13
+ export type FieldbuilderSlots = 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,122 @@
1
+ <script>
2
+ import { Form } from "../..";
3
+ import _ from "lodash-es";
4
+ import { syncStoreToStore } from "../../utils/syncing";
5
+ import { writable } from "svelte/store";
6
+ import { onMount } from "svelte";
7
+ import { deepEqual } from "fast-equals";
8
+
9
+ export let form;
10
+ export let field;
11
+
12
+ let dependencies = form.dependencies;
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
+
20
+ let settings_form = writable();
21
+
22
+ let initial_form;
23
+
24
+ onMount(() => {
25
+ // set field values that aren't set yet
26
+ let f = _.cloneDeep($field);
27
+ let initial_value = f?.data?.base ?? {};
28
+ let initial_data = _.merge(
29
+ {
30
+ base: initial_value,
31
+ },
32
+ f?.data
33
+ );
34
+ _.set(f, "data", initial_data);
35
+ if (!deepEqual(f, $field)) $field = f;
36
+
37
+ initial_form = {
38
+ spec: {
39
+ fields: {
40
+ fields: {
41
+ fieldtype: "arraybuilder",
42
+ hide_label: true,
43
+ params: {
44
+ new_entry_field: {
45
+ fieldtype: "fieldbuilder",
46
+ params: {
47
+ spec_fieldtype_editable: true,
48
+ spec_name_editable: true,
49
+ hide_demo: f.spec?.params?.hide_demo,
50
+ demo_collapsed: f.spec?.params?.demo_collapsed,
51
+ },
52
+ },
53
+ },
54
+ },
55
+ },
56
+ },
57
+ data: {
58
+ fields: _.cloneDeep(
59
+ Object.entries(initial_value)
60
+ .sort((a, b) => a[1]?.__order - b[1]?.__order)
61
+ .map((e) => {
62
+ return {
63
+ ...e[1],
64
+ name: e[0],
65
+ __key: e[0],
66
+ };
67
+ })
68
+ ),
69
+ },
70
+ };
71
+
72
+ syncStoreToStore(
73
+ field,
74
+ settings_form,
75
+ (a, b) => {
76
+ let _clone = _.cloneDeep(b) || {};
77
+
78
+ let fields = Object.entries(a?.data?.base)
79
+ .sort((a, b) => a[1]?.__order - b[1]?.__order)
80
+ .map((e) => {
81
+ return {
82
+ ...e[1],
83
+ name: e[0],
84
+ __key: e[0],
85
+ };
86
+ });
87
+
88
+ _.set(_clone, "data.fields", fields);
89
+
90
+ return _clone;
91
+ },
92
+ (a, b) => {
93
+ let _clone = _.cloneDeep(a) || {};
94
+
95
+ let base = b.data.fields.reduce((acc, curr, index) => {
96
+ acc[curr.name] = {
97
+ ...curr,
98
+ __order: index,
99
+ };
100
+ return acc;
101
+ }, {});
102
+
103
+ _.set(_clone, "data.base", base);
104
+ return _clone;
105
+ }
106
+ );
107
+ });
108
+ </script>
109
+
110
+ <div class="flex flex-col w-full text-surface-900">
111
+ <label for="input_{state_key}" class="block text-label {hide_label ? 'hidden' : ''}">
112
+ {label}
113
+ </label>
114
+ {#if initial_form}
115
+ <Form bind:form={settings_form} {initial_form} {dependencies} />
116
+ {/if}
117
+ {#if validationMessage}
118
+ <p class="text-label {!isValid ? `text-danger-500` : `text-success-500`}">
119
+ {validationMessage}
120
+ </p>
121
+ {/if}
122
+ </div>
@@ -0,0 +1,25 @@
1
+ /** @typedef {typeof __propDef.props} FieldsbuilderProps */
2
+ /** @typedef {typeof __propDef.events} FieldsbuilderEvents */
3
+ /** @typedef {typeof __propDef.slots} FieldsbuilderSlots */
4
+ export default class Fieldsbuilder extends SvelteComponentTyped<{
5
+ form: any;
6
+ field: any;
7
+ }, {
8
+ [evt: string]: CustomEvent<any>;
9
+ }, {}> {
10
+ }
11
+ export type FieldsbuilderProps = typeof __propDef.props;
12
+ export type FieldsbuilderEvents = typeof __propDef.events;
13
+ export type FieldsbuilderSlots = 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 {};