@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.
- package/README.md +303 -0
- package/dist/Field.svelte +36 -0
- package/dist/Field.svelte.d.ts +31 -0
- package/dist/Form.svelte +34 -0
- package/dist/Form.svelte.d.ts +29 -0
- package/dist/NullFieldWrapper.svelte +6 -0
- package/dist/NullFieldWrapper.svelte.d.ts +25 -0
- package/dist/fields/component_parts/arraybuilder/FieldWrapper.svelte +69 -0
- package/dist/fields/component_parts/arraybuilder/FieldWrapper.svelte.d.ts +29 -0
- package/dist/fields/component_parts/fieldbuilder/FieldWrapper.svelte +8 -0
- package/dist/fields/component_parts/fieldbuilder/FieldWrapper.svelte.d.ts +25 -0
- package/dist/fields/components/AgGrid.svelte +53 -0
- package/dist/fields/components/AgGrid.svelte.d.ts +18 -0
- package/dist/fields/components/Arraybuilder.svelte +101 -0
- package/dist/fields/components/Arraybuilder.svelte.d.ts +25 -0
- package/dist/fields/components/Checkbox.svelte +100 -0
- package/dist/fields/components/Checkbox.svelte.d.ts +23 -0
- package/dist/fields/components/CheckboxAutocomplete.svelte +92 -0
- package/dist/fields/components/CheckboxAutocomplete.svelte.d.ts +23 -0
- package/dist/fields/components/Contactselector.svelte +348 -0
- package/dist/fields/components/Contactselector.svelte.d.ts +25 -0
- package/dist/fields/components/Currency.svelte +258 -0
- package/dist/fields/components/Currency.svelte.d.ts +23 -0
- package/dist/fields/components/Dataindication.svelte +35 -0
- package/dist/fields/components/Dataindication.svelte.d.ts +23 -0
- package/dist/fields/components/Date.svelte +94 -0
- package/dist/fields/components/Date.svelte.d.ts +23 -0
- package/dist/fields/components/Datetime.svelte +94 -0
- package/dist/fields/components/Datetime.svelte.d.ts +23 -0
- package/dist/fields/components/Email.svelte +124 -0
- package/dist/fields/components/Email.svelte.d.ts +23 -0
- package/dist/fields/components/Fieldbuilder.svelte +340 -0
- package/dist/fields/components/Fieldbuilder.svelte.d.ts +25 -0
- package/dist/fields/components/Fieldsbuilder.svelte +122 -0
- package/dist/fields/components/Fieldsbuilder.svelte.d.ts +25 -0
- package/dist/fields/components/File.svelte +230 -0
- package/dist/fields/components/File.svelte.d.ts +25 -0
- package/dist/fields/components/Heading.svelte +17 -0
- package/dist/fields/components/Heading.svelte.d.ts +23 -0
- package/dist/fields/components/Hidden.svelte +7 -0
- package/dist/fields/components/Hidden.svelte.d.ts +23 -0
- package/dist/fields/components/Hiddenlocation.svelte +28 -0
- package/dist/fields/components/Hiddenlocation.svelte.d.ts +23 -0
- package/dist/fields/components/Html.svelte +13 -0
- package/dist/fields/components/Html.svelte.d.ts +23 -0
- package/dist/fields/components/Jsoneditor.svelte +94 -0
- package/dist/fields/components/Jsoneditor.svelte.d.ts +23 -0
- package/dist/fields/components/Map.svelte +192 -0
- package/dist/fields/components/Map.svelte.d.ts +25 -0
- package/dist/fields/components/Multicheckbox.svelte +119 -0
- package/dist/fields/components/Multicheckbox.svelte.d.ts +23 -0
- package/dist/fields/components/Multistep.svelte +86 -0
- package/dist/fields/components/Multistep.svelte.d.ts +25 -0
- package/dist/fields/components/Note.svelte +92 -0
- package/dist/fields/components/Note.svelte.d.ts +23 -0
- package/dist/fields/components/Number.svelte +118 -0
- package/dist/fields/components/Number.svelte.d.ts +23 -0
- package/dist/fields/components/Objectbuilder.svelte +152 -0
- package/dist/fields/components/Objectbuilder.svelte.d.ts +25 -0
- package/dist/fields/components/Qrcodescanner.svelte +198 -0
- package/dist/fields/components/Qrcodescanner.svelte.d.ts +23 -0
- package/dist/fields/components/Radio.svelte +116 -0
- package/dist/fields/components/Radio.svelte.d.ts +23 -0
- package/dist/fields/components/Renderfield.svelte +58 -0
- package/dist/fields/components/Renderfield.svelte.d.ts +25 -0
- package/dist/fields/components/Screenrecorder.svelte +277 -0
- package/dist/fields/components/Screenrecorder.svelte.d.ts +25 -0
- package/dist/fields/components/Screenshot.svelte +270 -0
- package/dist/fields/components/Screenshot.svelte.d.ts +25 -0
- package/dist/fields/components/Scrollandreaddisplay.svelte +122 -0
- package/dist/fields/components/Scrollandreaddisplay.svelte.d.ts +23 -0
- package/dist/fields/components/Section.svelte +64 -0
- package/dist/fields/components/Section.svelte.d.ts +25 -0
- package/dist/fields/components/Select.svelte +229 -0
- package/dist/fields/components/Select.svelte.d.ts +23 -0
- package/dist/fields/components/Selectresource.svelte +291 -0
- package/dist/fields/components/Selectresource.svelte.d.ts +25 -0
- package/dist/fields/components/Signature.svelte +153 -0
- package/dist/fields/components/Signature.svelte.d.ts +25 -0
- package/dist/fields/components/Slider.svelte +101 -0
- package/dist/fields/components/Slider.svelte.d.ts +23 -0
- package/dist/fields/components/SmartText.svelte +330 -0
- package/dist/fields/components/SmartText.svelte.d.ts +23 -0
- package/dist/fields/components/Telephone.svelte +153 -0
- package/dist/fields/components/Telephone.svelte.d.ts +23 -0
- package/dist/fields/components/Text.svelte +106 -0
- package/dist/fields/components/Text.svelte.d.ts +23 -0
- package/dist/fields/components/Voicenote.svelte +268 -0
- package/dist/fields/components/Voicenote.svelte.d.ts +25 -0
- package/dist/fields/components/index.d.ts +81 -0
- package/dist/fields/components/index.js +82 -0
- package/dist/fields/definitions/_all.json +38 -0
- package/dist/fields/definitions/_valid_fieldtype.json +220 -0
- package/dist/fields/definitions/arraybuilder.json +39 -0
- package/dist/fields/definitions/checkbox.json +44 -0
- package/dist/fields/definitions/contactselector.json +15 -0
- package/dist/fields/definitions/currency.json +42 -0
- package/dist/fields/definitions/dataindication.json +16 -0
- package/dist/fields/definitions/date.json +16 -0
- package/dist/fields/definitions/datetime.json +15 -0
- package/dist/fields/definitions/email.json +16 -0
- package/dist/fields/definitions/fieldbuilder.json +64 -0
- package/dist/fields/definitions/fieldsbuilder.json +38 -0
- package/dist/fields/definitions/file.json +42 -0
- package/dist/fields/definitions/grid.json +47 -0
- package/dist/fields/definitions/heading.json +38 -0
- package/dist/fields/definitions/hidden.json +89 -0
- package/dist/fields/definitions/hiddenlocation.json +15 -0
- package/dist/fields/definitions/html.json +34 -0
- package/dist/fields/definitions/index.d.ts +86 -0
- package/dist/fields/definitions/index.js +96 -0
- package/dist/fields/definitions/jsoneditor.json +33 -0
- package/dist/fields/definitions/map.json +36 -0
- package/dist/fields/definitions/multicheckbox.json +47 -0
- package/dist/fields/definitions/multistep.json +35 -0
- package/dist/fields/definitions/note.json +16 -0
- package/dist/fields/definitions/number.json +42 -0
- package/dist/fields/definitions/objectbuilder.json +39 -0
- package/dist/fields/definitions/qrcodescanner.json +16 -0
- package/dist/fields/definitions/radio.json +47 -0
- package/dist/fields/definitions/renderfield.json +36 -0
- package/dist/fields/definitions/richtext.json +16 -0
- package/dist/fields/definitions/screenrecorder.json +42 -0
- package/dist/fields/definitions/screenshot.json +42 -0
- package/dist/fields/definitions/scrollandreaddisplay.json +49 -0
- package/dist/fields/definitions/section.json +50 -0
- package/dist/fields/definitions/select.json +47 -0
- package/dist/fields/definitions/selectresource.json +48 -0
- package/dist/fields/definitions/signature.json +16 -0
- package/dist/fields/definitions/slider.json +78 -0
- package/dist/fields/definitions/smart_text.json +101 -0
- package/dist/fields/definitions/telephone.json +16 -0
- package/dist/fields/definitions/text.json +35 -0
- package/dist/fields/definitions/voicenote.json +43 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/thirdparty/mapbox/GeoCoder.svelte +10 -0
- package/dist/thirdparty/mapbox/GeoCoder.svelte.d.ts +25 -0
- package/dist/thirdparty/mapbox/Map.svelte +30 -0
- package/dist/thirdparty/mapbox/Map.svelte.d.ts +20 -0
- package/dist/thirdparty/mapbox/MapMarker.svelte +13 -0
- package/dist/thirdparty/mapbox/MapMarker.svelte.d.ts +31 -0
- package/dist/utils/createField.d.ts +6 -0
- package/dist/utils/createField.js +33 -0
- package/dist/utils/createForm.d.ts +1 -0
- package/dist/utils/createForm.js +501 -0
- package/dist/utils/index.d.ts +18 -0
- package/dist/utils/index.js +126 -0
- package/dist/utils/syncing.d.ts +11 -0
- package/dist/utils/syncing.js +134 -0
- package/package.json +78 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** @typedef {typeof __propDef.props} DataindicationProps */
|
|
2
|
+
/** @typedef {typeof __propDef.events} DataindicationEvents */
|
|
3
|
+
/** @typedef {typeof __propDef.slots} DataindicationSlots */
|
|
4
|
+
export default class Dataindication extends SvelteComponentTyped<{
|
|
5
|
+
field: any;
|
|
6
|
+
}, {
|
|
7
|
+
[evt: string]: CustomEvent<any>;
|
|
8
|
+
}, {}> {
|
|
9
|
+
}
|
|
10
|
+
export type DataindicationProps = typeof __propDef.props;
|
|
11
|
+
export type DataindicationEvents = typeof __propDef.events;
|
|
12
|
+
export type DataindicationSlots = 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
|
+
|
|
8
|
+
export let field;
|
|
9
|
+
|
|
10
|
+
const internal = writable();
|
|
11
|
+
|
|
12
|
+
$: state_key = $field.state?.state_key;
|
|
13
|
+
$: label = $field.spec?.title;
|
|
14
|
+
$: hide_label = $field.spec?.hide_label;
|
|
15
|
+
$: isValid = !$field.state?.validation || $field.state?.validation?.valid;
|
|
16
|
+
$: validationMessage = $field.state?.validation?.message;
|
|
17
|
+
|
|
18
|
+
onMount(() => {
|
|
19
|
+
// set field values that aren't set yet
|
|
20
|
+
let f = _.cloneDeep($field);
|
|
21
|
+
let initial_value = f?.data?.base ?? "";
|
|
22
|
+
let initial_data = {
|
|
23
|
+
...f?.data,
|
|
24
|
+
base: initial_value,
|
|
25
|
+
};
|
|
26
|
+
let initial_state_internal = _.merge(
|
|
27
|
+
{
|
|
28
|
+
raw: initial_value,
|
|
29
|
+
},
|
|
30
|
+
f?.state?.internal
|
|
31
|
+
);
|
|
32
|
+
_.set(f, "data", initial_data);
|
|
33
|
+
_.set(f, "state.internal", initial_state_internal);
|
|
34
|
+
if (!deepEqual(f, $field)) $field = f;
|
|
35
|
+
|
|
36
|
+
syncStoreToStore(
|
|
37
|
+
field,
|
|
38
|
+
internal,
|
|
39
|
+
(a, b) => {
|
|
40
|
+
let _clone = _.cloneDeep(a.state?.internal) || {};
|
|
41
|
+
|
|
42
|
+
// get parts from data
|
|
43
|
+
_clone.raw = a?.data?.base;
|
|
44
|
+
|
|
45
|
+
// set field state if changed
|
|
46
|
+
if (!deepEqual(a?.state?.internal, _clone)) {
|
|
47
|
+
$field.state.internal = _clone;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return _clone;
|
|
51
|
+
},
|
|
52
|
+
(a, b) => {
|
|
53
|
+
let _clone = _.cloneDeep(a) || {};
|
|
54
|
+
// update the state
|
|
55
|
+
_.set(_clone, "state.internal", _.cloneDeep(b));
|
|
56
|
+
// update the data
|
|
57
|
+
_.set(_clone, "data.base", b?.raw);
|
|
58
|
+
return _clone;
|
|
59
|
+
},
|
|
60
|
+
null,
|
|
61
|
+
300
|
|
62
|
+
);
|
|
63
|
+
});
|
|
64
|
+
</script>
|
|
65
|
+
|
|
66
|
+
{#if $internal}
|
|
67
|
+
<div class="flex flex-col w-full text-surface-900">
|
|
68
|
+
<label for="input_{state_key}" class="block text-label {hide_label ? 'hidden' : ''}">
|
|
69
|
+
{label}
|
|
70
|
+
</label>
|
|
71
|
+
<div class="relative mt-2 rounded-md">
|
|
72
|
+
<input
|
|
73
|
+
on:keydown={(e) => {
|
|
74
|
+
if (e.key === "Enter") {
|
|
75
|
+
e.preventDefault();
|
|
76
|
+
}
|
|
77
|
+
}}
|
|
78
|
+
type="date"
|
|
79
|
+
id="input_{state_key}"
|
|
80
|
+
placeholder={label}
|
|
81
|
+
class="block w-full rounded-md border-0 py-2 pl-3 pr-2 text-surface-900 ring-1 ring-inset {!isValid
|
|
82
|
+
? 'ring-danger-500'
|
|
83
|
+
: 'ring-surface-300 focus:ring-primary-400'} focus:outline-none placeholder:text-surface-400 focus:ring-2 focus:ring-inset"
|
|
84
|
+
name={state_key}
|
|
85
|
+
bind:value={$internal.raw}
|
|
86
|
+
/>
|
|
87
|
+
</div>
|
|
88
|
+
{#if validationMessage}
|
|
89
|
+
<p class="text-label {!isValid ? `text-danger-500` : `text-success-500`}">
|
|
90
|
+
{validationMessage}
|
|
91
|
+
</p>
|
|
92
|
+
{/if}
|
|
93
|
+
</div>
|
|
94
|
+
{/if}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** @typedef {typeof __propDef.props} DateProps */
|
|
2
|
+
/** @typedef {typeof __propDef.events} DateEvents */
|
|
3
|
+
/** @typedef {typeof __propDef.slots} DateSlots */
|
|
4
|
+
export default class Date extends SvelteComponentTyped<{
|
|
5
|
+
field: any;
|
|
6
|
+
}, {
|
|
7
|
+
[evt: string]: CustomEvent<any>;
|
|
8
|
+
}, {}> {
|
|
9
|
+
}
|
|
10
|
+
export type DateProps = typeof __propDef.props;
|
|
11
|
+
export type DateEvents = typeof __propDef.events;
|
|
12
|
+
export type DateSlots = 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
|
+
|
|
8
|
+
export let field;
|
|
9
|
+
|
|
10
|
+
const internal = writable();
|
|
11
|
+
|
|
12
|
+
$: state_key = $field.state?.state_key;
|
|
13
|
+
$: label = $field.spec?.title;
|
|
14
|
+
$: hide_label = $field.spec?.hide_label;
|
|
15
|
+
$: isValid = !$field.state?.validation || $field.state?.validation?.valid;
|
|
16
|
+
$: validationMessage = $field.state?.validation?.message;
|
|
17
|
+
|
|
18
|
+
onMount(() => {
|
|
19
|
+
// set field values that aren't set yet
|
|
20
|
+
let f = _.cloneDeep($field);
|
|
21
|
+
let initial_value = f?.data?.base ?? "";
|
|
22
|
+
let initial_data = {
|
|
23
|
+
...f?.data,
|
|
24
|
+
base: initial_value,
|
|
25
|
+
};
|
|
26
|
+
let initial_state_internal = _.merge(
|
|
27
|
+
{
|
|
28
|
+
raw: initial_value,
|
|
29
|
+
},
|
|
30
|
+
f?.state?.internal
|
|
31
|
+
);
|
|
32
|
+
_.set(f, "data", initial_data);
|
|
33
|
+
_.set(f, "state.internal", initial_state_internal);
|
|
34
|
+
if (!deepEqual(f, $field)) $field = f;
|
|
35
|
+
|
|
36
|
+
syncStoreToStore(
|
|
37
|
+
field,
|
|
38
|
+
internal,
|
|
39
|
+
(a, b) => {
|
|
40
|
+
let _clone = _.cloneDeep(a.state?.internal) || {};
|
|
41
|
+
|
|
42
|
+
// get parts from data
|
|
43
|
+
_clone.raw = a?.data?.base;
|
|
44
|
+
|
|
45
|
+
// set field state if changed
|
|
46
|
+
if (!deepEqual(a?.state?.internal, _clone)) {
|
|
47
|
+
$field.state.internal = _clone;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return _clone;
|
|
51
|
+
},
|
|
52
|
+
(a, b) => {
|
|
53
|
+
let _clone = _.cloneDeep(a) || {};
|
|
54
|
+
// update the state
|
|
55
|
+
_.set(_clone, "state.internal", _.cloneDeep(b));
|
|
56
|
+
// update the data
|
|
57
|
+
_.set(_clone, "data.base", b?.raw);
|
|
58
|
+
return _clone;
|
|
59
|
+
},
|
|
60
|
+
null,
|
|
61
|
+
300
|
|
62
|
+
);
|
|
63
|
+
});
|
|
64
|
+
</script>
|
|
65
|
+
|
|
66
|
+
{#if $internal}
|
|
67
|
+
<div class="flex flex-col w-full text-surface-900">
|
|
68
|
+
<label for="input_{state_key}" class="block text-label {hide_label ? 'hidden' : ''}">
|
|
69
|
+
{label}
|
|
70
|
+
</label>
|
|
71
|
+
<div class="relative mt-2 rounded-md">
|
|
72
|
+
<input
|
|
73
|
+
on:keydown={(e) => {
|
|
74
|
+
if (e.key === "Enter") {
|
|
75
|
+
e.preventDefault();
|
|
76
|
+
}
|
|
77
|
+
}}
|
|
78
|
+
type="datetime-local"
|
|
79
|
+
id="input_{state_key}"
|
|
80
|
+
placeholder={label}
|
|
81
|
+
class="block w-full text-field rounded-md border-0 py-2 pl-3 pr-2 text-surface-900 ring-1 ring-inset {!isValid
|
|
82
|
+
? 'ring-danger-500'
|
|
83
|
+
: 'ring-surface-300 focus:ring-primary-400'} focus:outline-none placeholder:text-surface-400 focus:ring-2 focus:ring-inset"
|
|
84
|
+
name={state_key}
|
|
85
|
+
bind:value={$internal.raw}
|
|
86
|
+
/>
|
|
87
|
+
</div>
|
|
88
|
+
{#if validationMessage}
|
|
89
|
+
<p class="text-label {!isValid ? `text-danger-500` : `text-success-500`}">
|
|
90
|
+
{validationMessage}
|
|
91
|
+
</p>
|
|
92
|
+
{/if}
|
|
93
|
+
</div>
|
|
94
|
+
{/if}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** @typedef {typeof __propDef.props} DatetimeProps */
|
|
2
|
+
/** @typedef {typeof __propDef.events} DatetimeEvents */
|
|
3
|
+
/** @typedef {typeof __propDef.slots} DatetimeSlots */
|
|
4
|
+
export default class Datetime extends SvelteComponentTyped<{
|
|
5
|
+
field: any;
|
|
6
|
+
}, {
|
|
7
|
+
[evt: string]: CustomEvent<any>;
|
|
8
|
+
}, {}> {
|
|
9
|
+
}
|
|
10
|
+
export type DatetimeProps = typeof __propDef.props;
|
|
11
|
+
export type DatetimeEvents = typeof __propDef.events;
|
|
12
|
+
export type DatetimeSlots = 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,124 @@
|
|
|
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
|
+
|
|
8
|
+
export let field;
|
|
9
|
+
|
|
10
|
+
const internal = writable();
|
|
11
|
+
|
|
12
|
+
$: state_key = $field.state?.state_key;
|
|
13
|
+
$: label = $field.spec?.title;
|
|
14
|
+
$: hide_label = $field.spec?.hide_label;
|
|
15
|
+
$: isValid = !$field.state?.validation || $field.state?.validation?.valid;
|
|
16
|
+
$: validationMessage = $field.state?.validation?.message;
|
|
17
|
+
|
|
18
|
+
$: onRawChange($internal?.raw);
|
|
19
|
+
function onRawChange(r) {
|
|
20
|
+
let _clone = _.cloneDeep($internal) || {};
|
|
21
|
+
let formatted = r?.toLowerCase()?.trim();
|
|
22
|
+
|
|
23
|
+
// use regex to check valid email address and to get the username and domain parts
|
|
24
|
+
let regex =
|
|
25
|
+
/^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
|
|
26
|
+
let is_valid_email = regex.test(formatted);
|
|
27
|
+
let username = is_valid_email ? formatted.split("@")[0] : null;
|
|
28
|
+
let domain = is_valid_email ? formatted.split("@")[1] : null;
|
|
29
|
+
_.set(_clone, "formatted", formatted);
|
|
30
|
+
_.set(_clone, "is_valid_email", is_valid_email);
|
|
31
|
+
_.set(_clone, "username", username);
|
|
32
|
+
_.set(_clone, "domain", domain);
|
|
33
|
+
$internal = _clone;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
onMount(() => {
|
|
37
|
+
// set field values that aren't set yet
|
|
38
|
+
let f = _.cloneDeep($field);
|
|
39
|
+
let raw = f?.data?.base ?? "";
|
|
40
|
+
let formatted = raw?.toLowerCase()?.trim();
|
|
41
|
+
let initial_data = {
|
|
42
|
+
...f?.data,
|
|
43
|
+
base: formatted,
|
|
44
|
+
};
|
|
45
|
+
let initial_state_internal = {
|
|
46
|
+
...f?.state?.internal,
|
|
47
|
+
raw,
|
|
48
|
+
formatted,
|
|
49
|
+
};
|
|
50
|
+
_.set(f, "data", initial_data);
|
|
51
|
+
_.set(f, "state.internal", initial_state_internal);
|
|
52
|
+
if (!deepEqual(f, $field)) $field = f;
|
|
53
|
+
|
|
54
|
+
syncStoreToStore(
|
|
55
|
+
field,
|
|
56
|
+
internal,
|
|
57
|
+
(a, b) => {
|
|
58
|
+
let _clone = _.cloneDeep(a.state?.internal) || {};
|
|
59
|
+
|
|
60
|
+
// get parts from data
|
|
61
|
+
_clone.formatted = a?.data?.base;
|
|
62
|
+
_clone.raw = _clone.formatted;
|
|
63
|
+
if (!a?.spec?.without_value_details) {
|
|
64
|
+
_clone.is_valid_email = a?.data?.base_details?.is_valid_email ?? _clone?.is_valid_email;
|
|
65
|
+
_clone.username = a?.data?.base_details?.username ?? _clone?.username;
|
|
66
|
+
_clone.domain = a?.data?.base_details?.domain ?? _clone?.domain;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// set field state if changed
|
|
70
|
+
if (!deepEqual(a?.state?.internal, _clone)) {
|
|
71
|
+
$field.state.internal = _clone;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return _clone;
|
|
75
|
+
},
|
|
76
|
+
(a, b) => {
|
|
77
|
+
let _clone = _.cloneDeep(a) || {};
|
|
78
|
+
// update the state
|
|
79
|
+
_.set(_clone, "state.internal", _.cloneDeep(b));
|
|
80
|
+
// update the data
|
|
81
|
+
_.set(_clone, "data.base", b?.formatted);
|
|
82
|
+
if (!a?.spec?.without_value_details) {
|
|
83
|
+
_.set(_clone, "data.base_details.is_valid_email", b?.is_valid_email);
|
|
84
|
+
_.set(_clone, "data.base_details.domain", b?.domain);
|
|
85
|
+
_.set(_clone, "data.base_details.username", b?.username);
|
|
86
|
+
_.set(_clone, "data.base_details.raw", b?.raw);
|
|
87
|
+
}
|
|
88
|
+
return _clone;
|
|
89
|
+
},
|
|
90
|
+
null,
|
|
91
|
+
300
|
|
92
|
+
);
|
|
93
|
+
});
|
|
94
|
+
</script>
|
|
95
|
+
|
|
96
|
+
{#if $internal}
|
|
97
|
+
<div class="flex flex-col w-full text-surface-900">
|
|
98
|
+
<label for="input_{state_key}" class="block text-label {hide_label ? 'hidden' : ''}">
|
|
99
|
+
{label}
|
|
100
|
+
</label>
|
|
101
|
+
<div class="relative rounded-md">
|
|
102
|
+
<input
|
|
103
|
+
on:keydown={(e) => {
|
|
104
|
+
if (e.key === "Enter") {
|
|
105
|
+
e.preventDefault();
|
|
106
|
+
}
|
|
107
|
+
}}
|
|
108
|
+
type="text"
|
|
109
|
+
id="input_{state_key}"
|
|
110
|
+
placeholder={label}
|
|
111
|
+
class="block w-full text-field rounded-md border-0 py-2 pl-3 text-surface-900 ring-1 ring-inset {!isValid
|
|
112
|
+
? 'ring-danger-500'
|
|
113
|
+
: 'ring-surface-300 focus:ring-primary-400'} focus:outline-none placeholder:text-surface-400 focus:ring-2 focus:ring-inset"
|
|
114
|
+
name={state_key}
|
|
115
|
+
bind:value={$internal.raw}
|
|
116
|
+
/>
|
|
117
|
+
</div>
|
|
118
|
+
{#if validationMessage}
|
|
119
|
+
<p class="text-label {!isValid ? `text-danger-500` : `text-success-500`}">
|
|
120
|
+
{validationMessage}
|
|
121
|
+
</p>
|
|
122
|
+
{/if}
|
|
123
|
+
</div>
|
|
124
|
+
{/if}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** @typedef {typeof __propDef.props} EmailProps */
|
|
2
|
+
/** @typedef {typeof __propDef.events} EmailEvents */
|
|
3
|
+
/** @typedef {typeof __propDef.slots} EmailSlots */
|
|
4
|
+
export default class Email extends SvelteComponentTyped<{
|
|
5
|
+
field: any;
|
|
6
|
+
}, {
|
|
7
|
+
[evt: string]: CustomEvent<any>;
|
|
8
|
+
}, {}> {
|
|
9
|
+
}
|
|
10
|
+
export type EmailProps = typeof __propDef.props;
|
|
11
|
+
export type EmailEvents = typeof __propDef.events;
|
|
12
|
+
export type EmailSlots = 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 {};
|