@dosgato/dialog 1.2.7 → 1.3.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/dist/Button.svelte +15 -13
- package/dist/ButtonGroup.svelte +44 -40
- package/dist/Checkbox.svelte +13 -12
- package/dist/Container.svelte +50 -46
- package/dist/Dialog.svelte +56 -41
- package/dist/FieldAutocomplete.svelte +77 -70
- package/dist/FieldCheckbox.svelte +25 -22
- package/dist/FieldChoices.svelte +74 -68
- package/dist/FieldChooserLink.svelte +148 -150
- package/dist/FieldDate.svelte +19 -18
- package/dist/FieldDateTime.svelte +36 -34
- package/dist/FieldDualListbox.svelte +80 -79
- package/dist/FieldHidden.svelte +16 -15
- package/dist/FieldIdentifier.svelte +18 -17
- package/dist/FieldMultiple.svelte +71 -74
- package/dist/FieldMultiselect.svelte +86 -59
- package/dist/FieldMultiselect.svelte.d.ts +13 -1
- package/dist/FieldNumber.svelte +20 -19
- package/dist/FieldRadio.svelte +42 -41
- package/dist/FieldSelect.svelte +45 -45
- package/dist/FieldStandard.svelte +28 -27
- package/dist/FieldText.svelte +27 -24
- package/dist/FieldTextArea.svelte +24 -24
- package/dist/FileIcon.svelte +10 -8
- package/dist/Form.svelte +40 -18
- package/dist/Form.svelte.d.ts +15 -13
- package/dist/FormDialog.svelte +40 -25
- package/dist/FormDialog.svelte.d.ts +23 -17
- package/dist/Icon.svelte +38 -33
- package/dist/InlineMessage.svelte +31 -29
- package/dist/InlineMessages.svelte +10 -7
- package/dist/Input.svelte +40 -39
- package/dist/Listbox.svelte +102 -109
- package/dist/MaxLength.svelte +19 -18
- package/dist/Radio.svelte +18 -15
- package/dist/Switcher.svelte +37 -33
- package/dist/Tab.svelte +23 -21
- package/dist/Tabs.svelte +111 -110
- package/dist/Tooltip.svelte +7 -7
- package/dist/chooser/Chooser.svelte +83 -76
- package/dist/chooser/ChooserPreview.svelte +16 -14
- package/dist/chooser/Details.svelte +6 -4
- package/dist/chooser/Thumbnail.svelte +20 -16
- package/dist/chooser/UploadUI.svelte +78 -69
- package/dist/code/CodeEditor.svelte +63 -66
- package/dist/code/FieldCodeEditor.svelte +21 -19
- package/dist/colorpicker/FieldColorPicker.svelte +36 -35
- package/dist/cropper/FieldCropper.svelte +142 -141
- package/dist/iconpicker/FieldIconPicker.svelte +102 -94
- package/dist/imageposition/FieldImagePosition.svelte +107 -98
- package/dist/tagpicker/FieldTagPicker.svelte +104 -38
- package/dist/tagpicker/FieldTagPicker.svelte.d.ts +7 -0
- package/dist/tree/LoadIcon.svelte +0 -1
- package/dist/tree/Tree.svelte +198 -192
- package/dist/tree/Tree.svelte.d.ts +5 -5
- package/dist/tree/TreeCell.svelte +10 -6
- package/dist/tree/TreeCell.svelte.d.ts +5 -5
- package/dist/tree/TreeNode.svelte +213 -241
- package/dist/tree/TreeNode.svelte.d.ts +5 -5
- package/package.json +9 -10
package/dist/FieldChoices.svelte
CHANGED
|
@@ -4,76 +4,83 @@
|
|
|
4
4
|
flex. Ordering is top down by default but can be order horizontally by toggling `leftToRight`.
|
|
5
5
|
The value of the field will be an array corresponding to the values of the checkboxes that are checked.
|
|
6
6
|
-->
|
|
7
|
-
<script>
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
export
|
|
19
|
-
export let
|
|
20
|
-
export let
|
|
21
|
-
export let
|
|
22
|
-
export let
|
|
23
|
-
export let
|
|
24
|
-
export let
|
|
25
|
-
export let
|
|
26
|
-
export let
|
|
27
|
-
export let
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
7
|
+
<script lang="ts">
|
|
8
|
+
import { getContext, onMount } from 'svelte'
|
|
9
|
+
import { Field, FORM_CONTEXT, arraySerialize, FORM_INHERITED_PATH } from '@txstate-mws/svelte-forms'
|
|
10
|
+
import type { FormStore } from '@txstate-mws/svelte-forms'
|
|
11
|
+
import { derivedStore } from '@txstate-mws/svelte-store'
|
|
12
|
+
import { get, isNotBlank, randomid } from 'txstate-utils'
|
|
13
|
+
import Container from './Container.svelte'
|
|
14
|
+
import Checkbox from './Checkbox.svelte'
|
|
15
|
+
import { getDescribedBy } from './helpers'
|
|
16
|
+
|
|
17
|
+
let className = ''
|
|
18
|
+
export { className as class }
|
|
19
|
+
export let id: string | undefined = undefined
|
|
20
|
+
export let path: string
|
|
21
|
+
export let label: string = ''
|
|
22
|
+
export let choices: { label?: string, value: any, disabled?: boolean }[]
|
|
23
|
+
export let defaultValue: any = []
|
|
24
|
+
export let conditional: boolean | undefined = undefined
|
|
25
|
+
export let maxwidth = 250
|
|
26
|
+
export let leftToRight = false
|
|
27
|
+
export let related: true | number = 0
|
|
28
|
+
export let extradescid: string | undefined = undefined
|
|
29
|
+
export let helptext: string | undefined = undefined
|
|
30
|
+
export let selectAll: boolean = false
|
|
31
|
+
|
|
32
|
+
const store = getContext<FormStore>(FORM_CONTEXT)
|
|
33
|
+
const inheritedPath = getContext<string>(FORM_INHERITED_PATH)
|
|
34
|
+
const finalPath = [inheritedPath, path].filter(isNotBlank).join('.')
|
|
35
|
+
const valStore = store.getField<any[]>(finalPath)
|
|
36
|
+
const currentWidth = derivedStore(store, 'width')
|
|
37
|
+
$: cols = Math.min(Math.ceil($currentWidth / maxwidth), choices.length)
|
|
38
|
+
|
|
39
|
+
let orders: number[]
|
|
40
|
+
let width = '100%'
|
|
41
|
+
function redoLayout (..._: any) {
|
|
42
|
+
width = `${100 / cols}%`
|
|
43
|
+
const rows = Math.ceil(choices.length / cols)
|
|
44
|
+
orders = choices.map((_, i) => leftToRight ? i : Math.floor((i + 1) / cols) + rows * (i % cols))
|
|
45
|
+
}
|
|
46
|
+
$: redoLayout(choices, cols)
|
|
47
|
+
|
|
48
|
+
function onChangeCheckbox (setVal: (val: any) => void, choice: typeof choices[number], included: boolean) {
|
|
43
49
|
setVal(v => {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
$: selectAllChecked = choices.every(choice => choice.disabled || selected.has(choice.value))
|
|
56
|
-
|
|
50
|
+
if (v == null) return included ? [] : [choice.value]
|
|
51
|
+
if (included) return v.filter(s => s !== choice.value)
|
|
52
|
+
else return [...v, choice.value]
|
|
53
|
+
})
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
$: selected = new Set($valStore ?? [])
|
|
57
|
+
|
|
58
|
+
let selectAllElement: HTMLInputElement | undefined
|
|
59
|
+
const selectAllId = randomid()
|
|
60
|
+
|
|
61
|
+
$: selectAllChecked = choices.every(choice => choice.disabled || selected.has(choice.value))
|
|
62
|
+
|
|
63
|
+
function selectAllChanged () {
|
|
57
64
|
if (selectAllChecked) {
|
|
58
|
-
|
|
59
|
-
|
|
65
|
+
// it was checked and is now unchecked, clear it out
|
|
66
|
+
void store.setField(finalPath, [])
|
|
67
|
+
} else {
|
|
68
|
+
// it was not checked and now it is checked
|
|
69
|
+
void store.setField(finalPath, choices.filter(choice => !choice.disabled).map(choice => choice.value))
|
|
60
70
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
$: reactToChoices(choices);
|
|
76
|
-
onMount(reactToChoices);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const descid = randomid()
|
|
74
|
+
|
|
75
|
+
function reactToChoices (..._: any[]) {
|
|
76
|
+
const choiceSet = new Set(choices?.filter(c => !c.disabled).map(c => c.value))
|
|
77
|
+
selected = new Set(Array.from(selected).filter(v => choiceSet.has(v)))
|
|
78
|
+
const val = get($store.data, finalPath)
|
|
79
|
+
const filtered = val?.filter(v => choiceSet.has(v))
|
|
80
|
+
if (filtered?.length !== val?.length) store.setField(finalPath, filtered).catch(console.error)
|
|
81
|
+
}
|
|
82
|
+
$: reactToChoices(choices)
|
|
83
|
+
onMount(reactToChoices)
|
|
77
84
|
</script>
|
|
78
85
|
|
|
79
86
|
<Field {path} {defaultValue} {conditional} let:path let:value let:onBlur let:setVal let:messages let:valid let:invalid serialize={arraySerialize}>
|
|
@@ -116,5 +123,4 @@ onMount(reactToChoices);
|
|
|
116
123
|
label :global(input[type="checkbox"]) {
|
|
117
124
|
transform: none;
|
|
118
125
|
}
|
|
119
|
-
|
|
120
126
|
</style>
|
|
@@ -1,165 +1,164 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
export let
|
|
15
|
-
export let
|
|
16
|
-
export let
|
|
17
|
-
export let
|
|
18
|
-
export let
|
|
19
|
-
export let
|
|
20
|
-
export let
|
|
21
|
-
export let
|
|
22
|
-
export let
|
|
23
|
-
export let
|
|
24
|
-
export let
|
|
25
|
-
export let
|
|
26
|
-
export let
|
|
27
|
-
export let
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import arrowClockwiseFill from '@iconify-icons/ph/arrow-clockwise-fill'
|
|
3
|
+
import deleteOutline from '@iconify-icons/mdi/delete-outline'
|
|
4
|
+
import xCircle from '@iconify-icons/ph/x-circle'
|
|
5
|
+
import { FORM_CONTEXT, FORM_INHERITED_PATH, type FormStore } from '@txstate-mws/svelte-forms'
|
|
6
|
+
import { getContext } from 'svelte'
|
|
7
|
+
import { isBlank, isNotBlank, randomid } from 'txstate-utils'
|
|
8
|
+
import { Chooser, ChooserStore, CHOOSER_API_CONTEXT, cleanUrl, type BrokenURL, type RawURL } from './chooser'
|
|
9
|
+
import type { AnyItem, Client } from './chooser/ChooserAPI'
|
|
10
|
+
import Details from './chooser/Details.svelte'
|
|
11
|
+
import Thumbnail from './chooser/Thumbnail.svelte'
|
|
12
|
+
import { getDescribedBy, FieldStandard, InlineMessage, Icon } from './'
|
|
13
|
+
|
|
14
|
+
export let id: string | undefined = undefined
|
|
15
|
+
export let path: string
|
|
16
|
+
export let label: string = ''
|
|
17
|
+
export let defaultValue: boolean | undefined = undefined
|
|
18
|
+
export let conditional: boolean | undefined = undefined
|
|
19
|
+
export let required = false
|
|
20
|
+
export let images = false
|
|
21
|
+
export let pages = false
|
|
22
|
+
export let assets = images
|
|
23
|
+
export let folders = false
|
|
24
|
+
export let urlEntry = false
|
|
25
|
+
export let initialSource: string | undefined = undefined
|
|
26
|
+
export let initialPath: string | undefined = undefined
|
|
27
|
+
export let related: true | number = 0
|
|
28
|
+
export let extradescid: string | undefined = undefined
|
|
29
|
+
export let helptext: string | undefined = undefined
|
|
30
|
+
export let selectedAsset: AnyItem | RawURL | BrokenURL | undefined = undefined
|
|
31
|
+
|
|
32
|
+
// TODO: add a mime type acceptance prop, maybe a regex or function, to prevent users from
|
|
33
|
+
// choosing unacceptable mime types
|
|
34
|
+
|
|
35
|
+
const formStore = getContext<FormStore>(FORM_CONTEXT)
|
|
36
|
+
const inheritedPath = getContext<string>(FORM_INHERITED_PATH)
|
|
37
|
+
const finalPath = [inheritedPath, path].filter(isNotBlank).join('.')
|
|
38
|
+
const value = formStore.getField<string>(finalPath)
|
|
39
|
+
const chooserClient = getContext<Client>(CHOOSER_API_CONTEXT)
|
|
40
|
+
const store = new ChooserStore(chooserClient)
|
|
41
|
+
let urlEntryInput: HTMLInputElement | undefined
|
|
42
|
+
|
|
43
|
+
const descid = randomid()
|
|
44
|
+
let modalshown = false
|
|
45
|
+
async function show () {
|
|
46
|
+
if (selectedAsset && selectedAsset.type !== 'raw' && selectedAsset.type !== 'broken') store.setPreview(selectedAsset)
|
|
47
|
+
modalshown = true
|
|
48
|
+
}
|
|
49
|
+
function hide () {
|
|
50
|
+
modalshown = false
|
|
51
|
+
}
|
|
52
|
+
function onChange (setVal: any) {
|
|
48
53
|
return (e) => {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
function clearUrlEntry() {
|
|
55
|
-
urlEntryInput
|
|
56
|
-
urlEntryInput
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
timer
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
54
|
+
selectedAsset = e.detail
|
|
55
|
+
setVal(selectedAsset?.id)
|
|
56
|
+
hide()
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function clearUrlEntry () {
|
|
60
|
+
urlEntryInput!.value = ''
|
|
61
|
+
urlEntryInput!.dispatchEvent(new InputEvent('input'))
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let timer: ReturnType<typeof setTimeout>
|
|
65
|
+
function userUrlEntry () {
|
|
66
|
+
clearTimeout(timer)
|
|
67
|
+
timer = setTimeout(userUrlEntryDebounced.bind(this), 300)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function userUrlEntryDebounced () {
|
|
71
|
+
const url = this.value
|
|
72
|
+
const cleanedUrl = cleanUrl(url)
|
|
73
|
+
store.clearPreview()
|
|
67
74
|
if (isBlank(url)) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
75
|
+
selectedAsset = undefined
|
|
76
|
+
void formStore.setField(finalPath, undefined)
|
|
77
|
+
return
|
|
71
78
|
}
|
|
72
|
-
let found = false
|
|
79
|
+
let found = false
|
|
73
80
|
if (chooserClient.findByUrl) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if (
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
else {
|
|
96
|
-
selectedAsset = { ...item, url };
|
|
97
|
-
}
|
|
81
|
+
let item = await chooserClient.findByUrl(url)
|
|
82
|
+
if (!item && isNotBlank(cleanedUrl)) item = await chooserClient.findByUrl(cleanedUrl)
|
|
83
|
+
if (url !== this.value) return
|
|
84
|
+
if (item) {
|
|
85
|
+
found = true
|
|
86
|
+
if (
|
|
87
|
+
(item.type === 'page' && !pages) || // they typed the URL for a page but we don't allow pages right now
|
|
88
|
+
(item.type === 'folder' && !folders) || // they typed the URL for an asset folder but not allowed
|
|
89
|
+
(item.type === 'asset' && !assets) || // they typed the URL for an asset but not allowed
|
|
90
|
+
(item.type === 'asset' && !item.image && images) // they typed the URL for a non-image asset but we only want images
|
|
91
|
+
) {
|
|
92
|
+
// they entered something that is recognized but not allowed
|
|
93
|
+
// they can keep the typing they've done, but the id must be 'undefined' so that nothing
|
|
94
|
+
// is entered into the form data
|
|
95
|
+
selectedAsset = {
|
|
96
|
+
type: 'raw',
|
|
97
|
+
id: undefined,
|
|
98
|
+
url
|
|
99
|
+
}
|
|
100
|
+
} else {
|
|
101
|
+
selectedAsset = { ...item, url } as any
|
|
98
102
|
}
|
|
103
|
+
}
|
|
99
104
|
}
|
|
100
105
|
if (!found) {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
url
|
|
116
|
-
};
|
|
117
|
-
}
|
|
106
|
+
if (urlToValueCache[url]) {
|
|
107
|
+
selectedAsset = { type: 'raw', id: urlToValueCache[url], url }
|
|
108
|
+
} else {
|
|
109
|
+
if (isBlank(cleanedUrl) || cleanedUrl.startsWith('/')) {
|
|
110
|
+
// here we "select" a raw url so that we do not interrupt the users' typing, but
|
|
111
|
+
// we set its id to 'undefined' so that nothing makes it into the form until it's
|
|
112
|
+
// a valid URL
|
|
113
|
+
selectedAsset = { type: 'raw', id: undefined, url }
|
|
114
|
+
} else {
|
|
115
|
+
selectedAsset = {
|
|
116
|
+
type: 'raw',
|
|
117
|
+
id: chooserClient.urlToValue?.(cleanedUrl) ?? cleanedUrl,
|
|
118
|
+
url
|
|
119
|
+
}
|
|
118
120
|
}
|
|
121
|
+
}
|
|
119
122
|
}
|
|
120
|
-
void formStore.setField(finalPath, selectedAsset?.id)
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
const urlToValueCache = {}
|
|
124
|
-
async function updateSelected(..._) {
|
|
123
|
+
void formStore.setField(finalPath, selectedAsset?.id)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const urlToValueCache: Record<string, string> = {}
|
|
127
|
+
async function updateSelected (..._: any) {
|
|
125
128
|
if (selectedAsset?.id !== $value) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
else {
|
|
146
|
-
selectedAsset = { type: 'raw', id: $value, url: cleanedUrlFromValue };
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
if (selectedAsset) {
|
|
150
|
-
urlToValueCache[selectedAsset.url] = $value;
|
|
151
|
-
if (selectedAsset.type !== 'raw' && selectedAsset.type !== 'broken') {
|
|
152
|
-
initialPath = selectedAsset.path ?? initialPath;
|
|
153
|
-
initialSource = selectedAsset.source ?? initialSource;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
129
|
+
if (!$value) {
|
|
130
|
+
selectedAsset = undefined
|
|
131
|
+
return
|
|
132
|
+
}
|
|
133
|
+
const valueBeforeFind = $value
|
|
134
|
+
const asset = await chooserClient.findById($value)
|
|
135
|
+
if ($value !== valueBeforeFind) return
|
|
136
|
+
selectedAsset = asset
|
|
137
|
+
try {
|
|
138
|
+
if (!selectedAsset) {
|
|
139
|
+
const urlFromValue = chooserClient.valueToUrl?.($value) ?? $value
|
|
140
|
+
const cleanedUrlFromValue = cleanUrl(urlFromValue)
|
|
141
|
+
if (isBlank(cleanedUrlFromValue)) {
|
|
142
|
+
selectedAsset = undefined
|
|
143
|
+
} else if (cleanedUrlFromValue.startsWith('/')) {
|
|
144
|
+
selectedAsset = { type: 'broken', id: $value, url: cleanedUrlFromValue }
|
|
145
|
+
} else {
|
|
146
|
+
selectedAsset = { type: 'raw', id: $value, url: cleanedUrlFromValue }
|
|
147
|
+
}
|
|
156
148
|
}
|
|
157
|
-
|
|
158
|
-
|
|
149
|
+
if (selectedAsset) {
|
|
150
|
+
urlToValueCache[selectedAsset.url] = $value
|
|
151
|
+
if (selectedAsset.type !== 'raw' && selectedAsset.type !== 'broken') {
|
|
152
|
+
initialPath = selectedAsset.path ?? initialPath
|
|
153
|
+
initialSource = selectedAsset.source ?? initialSource
|
|
154
|
+
}
|
|
159
155
|
}
|
|
156
|
+
} catch (e: any) {
|
|
157
|
+
console.error(e)
|
|
158
|
+
}
|
|
160
159
|
}
|
|
161
|
-
}
|
|
162
|
-
$: void updateSelected($value)
|
|
160
|
+
}
|
|
161
|
+
$: void updateSelected($value)
|
|
163
162
|
</script>
|
|
164
163
|
|
|
165
164
|
<FieldStandard bind:id {path} {descid} {label} {defaultValue} {conditional} {required} {related} {helptext} let:value let:messagesid let:helptextid let:valid let:invalid let:id let:onBlur let:setVal>
|
|
@@ -282,5 +281,4 @@ $: void updateSelected($value);
|
|
|
282
281
|
:global([data-eq~="400px"] .dialog-chooser-container .dialog-chooser-thumbnail img) {
|
|
283
282
|
object-position: left;
|
|
284
283
|
}
|
|
285
|
-
|
|
286
284
|
</style>
|
package/dist/FieldDate.svelte
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export
|
|
7
|
-
export let
|
|
8
|
-
export let
|
|
9
|
-
export let
|
|
10
|
-
export let
|
|
11
|
-
export let
|
|
12
|
-
export let
|
|
13
|
-
export let
|
|
14
|
-
export let
|
|
15
|
-
export let
|
|
16
|
-
export let
|
|
17
|
-
export let
|
|
18
|
-
export let
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { dateSerialize, dateDeserialize } from '@txstate-mws/svelte-forms'
|
|
3
|
+
import FieldStandard from './FieldStandard.svelte'
|
|
4
|
+
import Input from './Input.svelte'
|
|
5
|
+
let className = ''
|
|
6
|
+
export { className as class }
|
|
7
|
+
export let id: string | undefined = undefined
|
|
8
|
+
export let path: string
|
|
9
|
+
export let label: string = ''
|
|
10
|
+
export let defaultValue: any = undefined
|
|
11
|
+
export let min: Date | { toJSDate: () => Date } | undefined = undefined
|
|
12
|
+
export let max: Date | { toJSDate: () => Date } | undefined = undefined
|
|
13
|
+
export let step: number | undefined = undefined
|
|
14
|
+
export let conditional: boolean | undefined = undefined
|
|
15
|
+
export let required = false
|
|
16
|
+
export let inputelement: HTMLInputElement = undefined as any
|
|
17
|
+
export let related: true | number = 0
|
|
18
|
+
export let extradescid: string | undefined = undefined
|
|
19
|
+
export let helptext: string | undefined = undefined
|
|
19
20
|
</script>
|
|
20
21
|
|
|
21
22
|
<FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} {related} {helptext} serialize={dateSerialize} deserialize={dateDeserialize} let:value let:valid let:invalid let:id let:onBlur let:onChange let:messagesid let:helptextid>
|
|
@@ -1,39 +1,41 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export
|
|
8
|
-
export let
|
|
9
|
-
export let
|
|
10
|
-
export let
|
|
11
|
-
export let
|
|
12
|
-
export let
|
|
13
|
-
export let
|
|
14
|
-
export let
|
|
15
|
-
export let
|
|
16
|
-
export let
|
|
17
|
-
export let
|
|
18
|
-
export let
|
|
19
|
-
export let
|
|
20
|
-
|
|
21
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { datetimeSerialize, datetimeDeserialize } from '@txstate-mws/svelte-forms'
|
|
3
|
+
import FieldStandard from './FieldStandard.svelte'
|
|
4
|
+
import Input from './Input.svelte'
|
|
5
|
+
import { createEventDispatcher } from 'svelte'
|
|
6
|
+
let className = ''
|
|
7
|
+
export { className as class }
|
|
8
|
+
export let id: string | undefined = undefined
|
|
9
|
+
export let path: string
|
|
10
|
+
export let label: string = ''
|
|
11
|
+
export let defaultValue: any = undefined
|
|
12
|
+
export let min: Date | { toJSDate: () => Date } | undefined = undefined
|
|
13
|
+
export let max: Date | { toJSDate: () => Date } | undefined = undefined
|
|
14
|
+
export let step: number | undefined = undefined
|
|
15
|
+
export let conditional: boolean | undefined = undefined
|
|
16
|
+
export let required = false
|
|
17
|
+
export let related: true | number = 0
|
|
18
|
+
export let extradescid: string | undefined = undefined
|
|
19
|
+
export let helptext: string | undefined = undefined
|
|
20
|
+
export let inputelement: HTMLInputElement = undefined!
|
|
21
|
+
|
|
22
|
+
const dispatch = createEventDispatcher()
|
|
23
|
+
|
|
24
|
+
function onChange (setVal) {
|
|
22
25
|
return () => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
dispatch('change', datetimeDeserialize(inputelement.value));
|
|
33
|
-
}
|
|
26
|
+
if (inputelement) {
|
|
27
|
+
const date = new Date(inputelement.value)
|
|
28
|
+
const invalid = inputelement.validity.badInput || !(date instanceof Date && !isNaN(date.valueOf()))
|
|
29
|
+
if (invalid) {
|
|
30
|
+
setVal(undefined)
|
|
31
|
+
dispatch('change', undefined)
|
|
32
|
+
} else {
|
|
33
|
+
setVal(datetimeDeserialize(inputelement.value))
|
|
34
|
+
dispatch('change', datetimeDeserialize(inputelement.value))
|
|
34
35
|
}
|
|
35
|
-
|
|
36
|
-
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
37
39
|
</script>
|
|
38
40
|
|
|
39
41
|
<FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} {related} {helptext} serialize={datetimeSerialize} deserialize={datetimeDeserialize} let:value let:valid let:invalid let:id let:onBlur let:helptextid let:messagesid let:setVal>
|