@dosgato/dialog 0.0.19 → 0.0.21

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 (95) hide show
  1. package/Button.svelte +77 -0
  2. package/Button.svelte.d.ts +30 -0
  3. package/ButtonGroup.svelte.d.ts +3 -3
  4. package/Checkbox.svelte +2 -1
  5. package/Checkbox.svelte.d.ts +4 -3
  6. package/Container.svelte +18 -19
  7. package/Container.svelte.d.ts +5 -3
  8. package/Dialog.svelte +155 -0
  9. package/Dialog.svelte.d.ts +50 -0
  10. package/FieldAutocomplete.svelte +4 -7
  11. package/FieldAutocomplete.svelte.d.ts +4 -4
  12. package/FieldCheckbox.svelte +3 -2
  13. package/FieldCheckbox.svelte.d.ts +5 -4
  14. package/FieldChoices.svelte +3 -2
  15. package/FieldChoices.svelte.d.ts +4 -3
  16. package/FieldChooserLink.svelte +17 -13
  17. package/FieldChooserLink.svelte.d.ts +4 -5
  18. package/FieldDate.svelte +3 -2
  19. package/FieldDate.svelte.d.ts +4 -3
  20. package/FieldDateTime.svelte +3 -2
  21. package/FieldDateTime.svelte.d.ts +4 -3
  22. package/FieldDualListbox.svelte.d.ts +3 -3
  23. package/FieldHidden.svelte.d.ts +3 -3
  24. package/FieldIdentifier.svelte.d.ts +3 -3
  25. package/FieldMultiple.svelte +14 -7
  26. package/FieldMultiple.svelte.d.ts +6 -3
  27. package/FieldMultiselect.svelte +29 -22
  28. package/FieldMultiselect.svelte.d.ts +3 -3
  29. package/FieldNumber.svelte +3 -2
  30. package/FieldNumber.svelte.d.ts +4 -3
  31. package/FieldRadio.svelte +9 -4
  32. package/FieldRadio.svelte.d.ts +9 -3
  33. package/FieldSelect.svelte +9 -3
  34. package/FieldSelect.svelte.d.ts +9 -3
  35. package/FieldStandard.svelte +8 -3
  36. package/FieldStandard.svelte.d.ts +9 -3
  37. package/FieldText.svelte +3 -2
  38. package/FieldText.svelte.d.ts +4 -3
  39. package/FieldTextArea.svelte +5 -3
  40. package/FieldTextArea.svelte.d.ts +4 -3
  41. package/FileIcon.svelte.d.ts +3 -3
  42. package/Form.svelte +3 -3
  43. package/Form.svelte.d.ts +3 -3
  44. package/FormDialog.svelte +34 -0
  45. package/FormDialog.svelte.d.ts +38 -0
  46. package/Icon.svelte.d.ts +3 -3
  47. package/InlineMessage.svelte.d.ts +3 -3
  48. package/InlineMessages.svelte.d.ts +3 -3
  49. package/Input.svelte +4 -1
  50. package/Input.svelte.d.ts +4 -3
  51. package/Listbox.svelte.d.ts +3 -3
  52. package/Radio.svelte +5 -2
  53. package/Radio.svelte.d.ts +4 -3
  54. package/Tab.svelte +3 -2
  55. package/Tab.svelte.d.ts +3 -3
  56. package/TabStore.d.ts +11 -1
  57. package/TabStore.js +30 -3
  58. package/Tabs.svelte +66 -18
  59. package/Tabs.svelte.d.ts +5 -7
  60. package/chooser/Chooser.svelte +76 -99
  61. package/chooser/Chooser.svelte.d.ts +5 -5
  62. package/chooser/ChooserAPI.d.ts +10 -3
  63. package/chooser/ChooserStore.d.ts +15 -33
  64. package/chooser/ChooserStore.js +32 -149
  65. package/chooser/Details.svelte.d.ts +6 -5
  66. package/chooser/Thumbnail.svelte +9 -2
  67. package/chooser/Thumbnail.svelte.d.ts +6 -5
  68. package/colorpicker/FieldColorPicker.svelte +78 -24
  69. package/colorpicker/FieldColorPicker.svelte.d.ts +5 -6
  70. package/fileIcons.d.ts +2 -1
  71. package/helpers.d.ts +1 -0
  72. package/helpers.js +5 -0
  73. package/iconpicker/FieldIconPicker.svelte +4 -2
  74. package/iconpicker/FieldIconPicker.svelte.d.ts +4 -3
  75. package/index.d.ts +7 -0
  76. package/index.js +7 -0
  77. package/package.json +20 -13
  78. package/tree/LoadIcon.svelte +24 -0
  79. package/tree/LoadIcon.svelte.d.ts +23 -0
  80. package/tree/Tree.svelte +203 -0
  81. package/tree/Tree.svelte.d.ts +28 -0
  82. package/tree/TreeCell.svelte +18 -0
  83. package/tree/TreeCell.svelte.d.ts +18 -0
  84. package/tree/TreeNode.svelte +418 -0
  85. package/tree/TreeNode.svelte.d.ts +30 -0
  86. package/tree/index.d.ts +3 -0
  87. package/tree/index.js +3 -0
  88. package/tree/treestore.d.ts +117 -0
  89. package/tree/treestore.js +336 -0
  90. package/chooser/Asset.svelte +0 -83
  91. package/chooser/Asset.svelte.d.ts +0 -25
  92. package/chooser/AssetFolder.svelte +0 -127
  93. package/chooser/AssetFolder.svelte.d.ts +0 -25
  94. package/chooser/Page.svelte +0 -121
  95. package/chooser/Page.svelte.d.ts +0 -25
@@ -1,5 +1,3 @@
1
- <script context="module">export {};
2
- </script>
3
1
  <script>import { FORM_CONTEXT } from '@txstate-mws/svelte-forms';
4
2
  import { getContext } from 'svelte';
5
3
  import { randomid } from 'txstate-utils';
@@ -7,6 +5,7 @@ import { Chooser, ChooserStore, CHOOSER_API_CONTEXT } from './chooser';
7
5
  import Details from './chooser/Details.svelte';
8
6
  import Thumbnail from './chooser/Thumbnail.svelte';
9
7
  import FieldStandard from './FieldStandard.svelte';
8
+ import { getDescribedBy } from './';
10
9
  export let id = undefined;
11
10
  export let path;
12
11
  export let label = '';
@@ -18,9 +17,9 @@ export let pages = false;
18
17
  export let assets = images;
19
18
  export let folders = false;
20
19
  export let urlEntry = false;
21
- export let initialType = undefined;
22
20
  export let initialSource = undefined;
23
21
  export let initialPath = undefined;
22
+ export let helptext = undefined;
24
23
  const formStore = getContext(FORM_CONTEXT);
25
24
  const value = formStore.getField(path);
26
25
  const chooserClient = getContext(CHOOSER_API_CONTEXT);
@@ -29,7 +28,7 @@ const descid = randomid();
29
28
  let modalshown = false;
30
29
  async function show() {
31
30
  if (selectedAsset && selectedAsset.type !== 'raw')
32
- store.preview(selectedAsset);
31
+ store.setPreview(selectedAsset);
33
32
  modalshown = true;
34
33
  }
35
34
  function hide() {
@@ -38,7 +37,7 @@ function hide() {
38
37
  function onChange(setVal) {
39
38
  return (e) => {
40
39
  selectedAsset = e.detail;
41
- setVal(e.detail.id);
40
+ setVal(selectedAsset?.id);
42
41
  hide();
43
42
  };
44
43
  }
@@ -47,7 +46,7 @@ async function userUrlEntry() {
47
46
  if (chooserClient.findByUrl) {
48
47
  const item = await chooserClient.findByUrl(url);
49
48
  if (item)
50
- return store.preview(item);
49
+ return store.setPreview(item);
51
50
  }
52
51
  store.clearPreview();
53
52
  const newVal = chooserClient.urlToValue?.(url) ?? url;
@@ -66,19 +65,21 @@ async function updateSelected(..._) {
66
65
  $: updateSelected($value);
67
66
  </script>
68
67
 
69
- <FieldStandard bind:id {path} {descid} {label} {defaultValue} {conditional} {required} let:value let:messagesid let:valid let:invalid let:id let:onBlur let:setVal>
68
+ <FieldStandard bind:id {path} {descid} {label} {defaultValue} {conditional} {required} {helptext} let:value let:messagesid let:helptextid let:valid let:invalid let:id let:onBlur let:setVal>
70
69
  {#if selectedAsset}
71
70
  <div class="dialog-chooser-container">
72
71
  <Thumbnail item={selectedAsset} />
73
72
  <Details item={selectedAsset} />
74
73
  </div>
75
74
  {/if}
76
- <button type="button" on:click={show} aria-describedby={messagesid}>Select {#if value}New{/if} {#if assets && pages}Link Target{:else if images}Image{:else if assets}Asset{:else}Page{/if}</button>
77
- {#if urlEntry && !folders && selectedAsset?.type !== 'folder'}
78
- <input type="text" value={selectedAsset?.url ?? ''} on:change={userUrlEntry}><br>
79
- {/if}
75
+ <div class="dialog-chooser-entry">
76
+ {#if urlEntry && !folders && selectedAsset?.type !== 'folder'}
77
+ <input type="text" value={selectedAsset?.url ?? ''} on:change={userUrlEntry}>
78
+ {/if}
79
+ <button type="button" on:click={show} aria-describedby={getDescribedBy([descid, messagesid, helptextid])}>Select {#if value}New{/if} {#if assets && pages}Link Target{:else if images}Image{:else if assets}Asset{:else}Page{/if}</button>
80
+ </div>
80
81
  {#if modalshown}
81
- <Chooser {store} {label} {initialType} {pages} {assets} {images} {initialSource} {initialPath} {folders} on:change={onChange(setVal)} on:escape={hide} />
82
+ <Chooser {store} {label} {pages} {assets} {images} {initialSource} {initialPath} {folders} {required} on:change={onChange(setVal)} on:escape={hide} />
82
83
  {/if}
83
84
  </FieldStandard>
84
85
 
@@ -93,7 +94,10 @@ $: updateSelected($value);
93
94
  padding-top: 0;
94
95
  height: 5em;
95
96
  }
97
+ .dialog-chooser-entry {
98
+ display: flex;
99
+ }
96
100
  input {
97
- width: 100%;
101
+ flex-grow: 1;
98
102
  }
99
103
  </style>
@@ -1,5 +1,4 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
- import type { ChooserType } from './chooser/ChooserAPI';
3
2
  declare const __propDef: {
4
3
  props: {
5
4
  id?: string | undefined;
@@ -13,18 +12,18 @@ declare const __propDef: {
13
12
  assets?: boolean;
14
13
  folders?: boolean;
15
14
  urlEntry?: boolean;
16
- initialType?: ChooserType | undefined;
17
15
  initialSource?: string | undefined;
18
16
  initialPath?: string | undefined;
17
+ helptext?: string | undefined;
19
18
  };
20
19
  events: {
21
20
  [evt: string]: CustomEvent<any>;
22
21
  };
23
22
  slots: {};
24
23
  };
25
- export declare type FieldChooserLinkProps = typeof __propDef.props;
26
- export declare type FieldChooserLinkEvents = typeof __propDef.events;
27
- export declare type FieldChooserLinkSlots = typeof __propDef.slots;
24
+ export type FieldChooserLinkProps = typeof __propDef.props;
25
+ export type FieldChooserLinkEvents = typeof __propDef.events;
26
+ export type FieldChooserLinkSlots = typeof __propDef.slots;
28
27
  export default class FieldChooserLink extends SvelteComponentTyped<FieldChooserLinkProps, FieldChooserLinkEvents, FieldChooserLinkSlots> {
29
28
  }
30
29
  export {};
package/FieldDate.svelte CHANGED
@@ -13,8 +13,9 @@ export let step = undefined;
13
13
  export let conditional = undefined;
14
14
  export let required = false;
15
15
  export let inputelement = undefined;
16
+ export let helptext = undefined;
16
17
  </script>
17
18
 
18
- <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} serialize={dateSerialize} deserialize={dateDeserialize} let:value let:valid let:invalid let:id let:onBlur let:onChange let:messagesid>
19
- <Input bind:inputelement type="date" name={path} {value} {id} class="dialog-input {className}" {onChange} {onBlur} {valid} {invalid} {min} {max} {step} {messagesid} />
19
+ <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} {helptext} serialize={dateSerialize} deserialize={dateDeserialize} let:value let:valid let:invalid let:id let:onBlur let:onChange let:messagesid let:helptextid>
20
+ <Input bind:inputelement type="date" name={path} {value} {id} class="dialog-input {className}" {onChange} {onBlur} {valid} {invalid} {min} {max} {step} {messagesid} {helptextid}/>
20
21
  </FieldStandard>
@@ -16,15 +16,16 @@ declare const __propDef: {
16
16
  conditional?: boolean | undefined;
17
17
  required?: boolean;
18
18
  inputelement?: HTMLInputElement;
19
+ helptext?: string | undefined;
19
20
  };
20
21
  events: {
21
22
  [evt: string]: CustomEvent<any>;
22
23
  };
23
24
  slots: {};
24
25
  };
25
- export declare type FieldDateProps = typeof __propDef.props;
26
- export declare type FieldDateEvents = typeof __propDef.events;
27
- export declare type FieldDateSlots = typeof __propDef.slots;
26
+ export type FieldDateProps = typeof __propDef.props;
27
+ export type FieldDateEvents = typeof __propDef.events;
28
+ export type FieldDateSlots = typeof __propDef.slots;
28
29
  export default class FieldDate extends SvelteComponentTyped<FieldDateProps, FieldDateEvents, FieldDateSlots> {
29
30
  }
30
31
  export {};
@@ -12,8 +12,9 @@ export let max = undefined;
12
12
  export let step = undefined;
13
13
  export let conditional = undefined;
14
14
  export let required = false;
15
+ export let helptext = undefined;
15
16
  </script>
16
17
 
17
- <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} serialize={datetimeSerialize} deserialize={datetimeDeserialize} let:value let:valid let:invalid let:id let:onBlur let:onChange>
18
- <Input type="datetime-local" name={path} {value} {id} class="dialog-input {className}" {onChange} {onBlur} {valid} {invalid} {min} {max} {step} />
18
+ <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} {helptext} serialize={datetimeSerialize} deserialize={datetimeDeserialize} let:value let:valid let:invalid let:id let:onBlur let:onChange let:helptextid>
19
+ <Input type="datetime-local" name={path} {value} {id} class="dialog-input {className}" {onChange} {onBlur} {valid} {invalid} {min} {max} {step} {helptextid}/>
19
20
  </FieldStandard>
@@ -15,15 +15,16 @@ declare const __propDef: {
15
15
  step?: number | undefined;
16
16
  conditional?: boolean | undefined;
17
17
  required?: boolean;
18
+ helptext?: string | undefined;
18
19
  };
19
20
  events: {
20
21
  [evt: string]: CustomEvent<any>;
21
22
  };
22
23
  slots: {};
23
24
  };
24
- export declare type FieldDateTimeProps = typeof __propDef.props;
25
- export declare type FieldDateTimeEvents = typeof __propDef.events;
26
- export declare type FieldDateTimeSlots = typeof __propDef.slots;
25
+ export type FieldDateTimeProps = typeof __propDef.props;
26
+ export type FieldDateTimeEvents = typeof __propDef.events;
27
+ export type FieldDateTimeSlots = typeof __propDef.slots;
27
28
  export default class FieldDateTime extends SvelteComponentTyped<FieldDateTimeProps, FieldDateTimeEvents, FieldDateTimeSlots> {
28
29
  }
29
30
  export {};
@@ -18,9 +18,9 @@ declare const __propDef: {
18
18
  };
19
19
  slots: {};
20
20
  };
21
- export declare type FieldDualListboxProps = typeof __propDef.props;
22
- export declare type FieldDualListboxEvents = typeof __propDef.events;
23
- export declare type FieldDualListboxSlots = typeof __propDef.slots;
21
+ export type FieldDualListboxProps = typeof __propDef.props;
22
+ export type FieldDualListboxEvents = typeof __propDef.events;
23
+ export type FieldDualListboxSlots = typeof __propDef.slots;
24
24
  export default class FieldDualListbox extends SvelteComponentTyped<FieldDualListboxProps, FieldDualListboxEvents, FieldDualListboxSlots> {
25
25
  }
26
26
  export {};
@@ -12,9 +12,9 @@ declare const __propDef: {
12
12
  };
13
13
  slots: {};
14
14
  };
15
- export declare type FieldHiddenProps = typeof __propDef.props;
16
- export declare type FieldHiddenEvents = typeof __propDef.events;
17
- export declare type FieldHiddenSlots = typeof __propDef.slots;
15
+ export type FieldHiddenProps = typeof __propDef.props;
16
+ export type FieldHiddenEvents = typeof __propDef.events;
17
+ export type FieldHiddenSlots = typeof __propDef.slots;
18
18
  export default class FieldHidden extends SvelteComponentTyped<FieldHiddenProps, FieldHiddenEvents, FieldHiddenSlots> {
19
19
  }
20
20
  export {};
@@ -9,9 +9,9 @@ declare const __propDef: {
9
9
  };
10
10
  slots: {};
11
11
  };
12
- export declare type FieldIdentifierProps = typeof __propDef.props;
13
- export declare type FieldIdentifierEvents = typeof __propDef.events;
14
- export declare type FieldIdentifierSlots = typeof __propDef.slots;
12
+ export type FieldIdentifierProps = typeof __propDef.props;
13
+ export type FieldIdentifierEvents = typeof __propDef.events;
14
+ export type FieldIdentifierSlots = typeof __propDef.slots;
15
15
  export default class FieldIdentifier extends SvelteComponentTyped<FieldIdentifierProps, FieldIdentifierEvents, FieldIdentifierSlots> {
16
16
  }
17
17
  export {};
@@ -1,7 +1,9 @@
1
- <script>import { AddMore, FORM_CONTEXT, FORM_INHERITED_PATH } from '@txstate-mws/svelte-forms';
1
+ <script>import plusCircleLight from '@iconify-icons/ph/plus-circle-light';
2
+ import { AddMore, FORM_CONTEXT, FORM_INHERITED_PATH } from '@txstate-mws/svelte-forms';
2
3
  import { derivedStore } from '@txstate-mws/svelte-store';
3
4
  import { getContext } from 'svelte';
4
5
  import { isNotNull } from 'txstate-utils';
6
+ import Button from './Button.svelte';
5
7
  import Container from './Container.svelte';
6
8
  export let path;
7
9
  export let label;
@@ -12,6 +14,9 @@ export let compact = false;
12
14
  export let removable = false;
13
15
  export let reorder = false;
14
16
  export let conditional = undefined;
17
+ export let addMoreText = 'Add';
18
+ export let maxedText = addMoreText;
19
+ export let addMoreClass = undefined;
15
20
  const inheritedPath = getContext(FORM_INHERITED_PATH);
16
21
  const finalPath = [inheritedPath, path].filter(isNotNull).join('.');
17
22
  const store = getContext(FORM_CONTEXT);
@@ -27,7 +32,7 @@ $: messages = compact ? $messageStore : [];
27
32
  </script>
28
33
 
29
34
  <Container {label} {messages}>
30
- <AddMore {path} {initialState} {minLength} {maxLength} {conditional} addMoreClass="dialog-multiple-button" let:path let:currentLength let:maxLength let:index let:minned let:maxed let:value let:onDelete let:onMoveUp>
35
+ <AddMore {path} {initialState} {minLength} {maxLength} {conditional} let:path let:currentLength let:maxLength let:index let:minned let:maxed let:value let:onDelete let:onMoveUp>
31
36
  {@const showDelete = removable && !minned}
32
37
  {@const showMove = reorder && index > 0}
33
38
  <div class="dialog-multiple" class:has-delete-icon={showDelete}>
@@ -39,29 +44,31 @@ $: messages = compact ? $messageStore : [];
39
44
  {#if showDelete}<button class="dialog-multiple-delete" type="button" on:click|preventDefault|stopPropagation={onDelete}>X</button>{/if}
40
45
  </div>{/if}
41
46
  </div>
47
+ <svelte:fragment slot="addbutton" let:maxed let:onClick>
48
+ <Button type="button" icon={plusCircleLight} class="{addMoreClass} dialog-multiple-button" disabled={maxed} on:click={onClick}>{maxed ? maxedText : addMoreText}</Button>
49
+ </svelte:fragment>
42
50
  </AddMore>
43
51
  </Container>
44
52
 
45
53
  <style>
46
54
  .dialog-multiple {
47
55
  position: relative;
48
- border: var(--dialog-container-border, 1px solid #999999);
56
+ border: var(--dialog-container-border, 0);
49
57
  padding: var(--dialog-container-padding, 1em);
50
58
  }
51
59
  .dialog-multiple:not(:first-child) {
52
60
  border-top: 0;
53
61
  }
54
62
  .dialog-multiple:nth-of-type(even) {
55
- background-color: var(--dialog-field-bg1, #e6e6e6);
63
+ background-color: var(--dialog-field-bg1, transparent);
56
64
  color: var(--dialog-field-text1, inherit);
57
65
  }
58
66
  .dialog-multiple:nth-of-type(odd) {
59
- background-color: var(--dialog-field-bg2, #ffffff);
67
+ background-color: var(--dialog-field-bg2, transparent);
60
68
  color: var(--dialog-field-text2, inherit);
61
69
  }
62
70
  :global(.dialog-multiple-button) {
63
- padding: 0.3em 0.4em;
64
- margin-top: 0.5em;
71
+ margin-left: var(--dialog-container-padding, 1em);
65
72
  }
66
73
  .dialog-multiple.has-delete-icon {
67
74
  display: flex;
@@ -10,6 +10,9 @@ declare const __propDef: {
10
10
  removable?: boolean;
11
11
  reorder?: boolean;
12
12
  conditional?: boolean | undefined;
13
+ addMoreText?: string;
14
+ maxedText?: string;
15
+ addMoreClass?: string;
13
16
  };
14
17
  events: {
15
18
  [evt: string]: CustomEvent<any>;
@@ -25,9 +28,9 @@ declare const __propDef: {
25
28
  };
26
29
  };
27
30
  };
28
- export declare type FieldMultipleProps = typeof __propDef.props;
29
- export declare type FieldMultipleEvents = typeof __propDef.events;
30
- export declare type FieldMultipleSlots = typeof __propDef.slots;
31
+ export type FieldMultipleProps = typeof __propDef.props;
32
+ export type FieldMultipleEvents = typeof __propDef.events;
33
+ export type FieldMultipleSlots = typeof __propDef.slots;
31
34
  export default class FieldMultiple extends SvelteComponentTyped<FieldMultipleProps, FieldMultipleEvents, FieldMultipleSlots> {
32
35
  }
33
36
  export {};
@@ -1,5 +1,8 @@
1
1
  <script>import { MultiSelect } from '@txstate-mws/svelte-components';
2
+ import { Store } from '@txstate-mws/svelte-store';
2
3
  import FieldStandard from './FieldStandard.svelte';
4
+ import { onMount } from 'svelte';
5
+ import { isNotBlank } from 'txstate-utils';
3
6
  export let id = undefined;
4
7
  export let path;
5
8
  export let label = '';
@@ -11,42 +14,46 @@ export let required = false;
11
14
  export let getOptions;
12
15
  // each time we run getOptions we will save the value -> label mappings
13
16
  // that it finds, so that we can display labels on pills
14
- let valueToLabel = {};
17
+ const valueToLabel = {};
15
18
  async function wrapGetOptions(search) {
16
- let opts = await getOptions(search);
19
+ const opts = await getOptions(search);
17
20
  // if no options are returned with the search term, we can end up with an infinite loop
18
21
  // the first time reactToValue calls wrapGetOptions
19
- if (opts.length === 0) {
20
- opts = await getOptions('');
21
- }
22
- for (const opt of opts)
22
+ // if (opts.length === 0) {
23
+ // opts = await getOptions('')
24
+ // }
25
+ for (const opt of opts) {
23
26
  valueToLabel[opt.value] = opt.label || opt.value;
24
- valueToLabel = valueToLabel;
27
+ }
25
28
  return opts;
26
29
  }
27
- function valueToSelected(value, valueToLabel) {
28
- return value.map(v => ({ value: v, label: valueToLabel[v] }));
29
- }
30
+ const selectedStore = new Store([]);
31
+ let hasInit = !defaultValue.length;
32
+ onMount(async () => {
33
+ await reactToValue(defaultValue);
34
+ hasInit = true;
35
+ });
30
36
  // if we get a value from the form that we haven't seen in the popup menu
31
37
  // yet, we won't have a label for it
32
38
  // this function runs getOptions on any selected values for which the label
33
39
  // is currently unknown
34
- function reactToValue(value) {
35
- if (value == null)
36
- return;
37
- for (const v of value) {
40
+ async function reactToValue(value) {
41
+ await Promise.all(value.map(async (v) => {
38
42
  if (!valueToLabel[v])
39
- wrapGetOptions(v).catch(console.debug);
40
- }
43
+ await wrapGetOptions(v);
44
+ }));
45
+ selectedStore.set(value.map(v => ({ value: v, label: valueToLabel[v] })).filter(v => isNotBlank(v.label)));
41
46
  }
42
47
  </script>
43
48
 
44
- <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} let:value let:valid let:invalid let:id let:onBlur let:setVal>
45
- {@const _ = reactToValue(value)}
46
- <div class:valid class:invalid>
47
- <MultiSelect {id} name={path} {disabled} selected={valueToSelected(value, valueToLabel)} {placeholder} getOptions={wrapGetOptions} on:change={e => setVal(e.detail.map(itm => itm.value))} on:blur={onBlur}></MultiSelect>
48
- </div>
49
- </FieldStandard>
49
+ {#if hasInit}
50
+ <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} let:value let:valid let:invalid let:id let:onBlur let:setVal>
51
+ {@const _ = reactToValue(value)}
52
+ <div class:valid class:invalid>
53
+ <MultiSelect {id} name={path} {disabled} selected={$selectedStore} {placeholder} getOptions={wrapGetOptions} on:change={e => setVal(e.detail.map(itm => itm.value))} on:blur={onBlur}></MultiSelect>
54
+ </div>
55
+ </FieldStandard>
56
+ {/if}
50
57
 
51
58
  <style>
52
59
  .invalid {
@@ -17,9 +17,9 @@ declare const __propDef: {
17
17
  };
18
18
  slots: {};
19
19
  };
20
- export declare type FieldMultiselectProps = typeof __propDef.props;
21
- export declare type FieldMultiselectEvents = typeof __propDef.events;
22
- export declare type FieldMultiselectSlots = typeof __propDef.slots;
20
+ export type FieldMultiselectProps = typeof __propDef.props;
21
+ export type FieldMultiselectEvents = typeof __propDef.events;
22
+ export type FieldMultiselectSlots = typeof __propDef.slots;
23
23
  export default class FieldMultiselect extends SvelteComponentTyped<FieldMultiselectProps, FieldMultiselectEvents, FieldMultiselectSlots> {
24
24
  }
25
25
  export {};
@@ -14,8 +14,9 @@ export let step = undefined;
14
14
  export let conditional = undefined;
15
15
  export let required = false;
16
16
  export let inputelement = undefined;
17
+ export let helptext = undefined;
17
18
  </script>
18
19
 
19
- <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} serialize={numberSerialize} deserialize={nullable ? numberNullableDeserialize : numberDeserialize} let:value let:valid let:invalid let:id let:onBlur let:onChange>
20
- <Input bind:inputelement type="number" name={path} {value} {id} class="dialog-input {className}" {onChange} {onBlur} {valid} {invalid} {min} {max} {step}></Input>
20
+ <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} {helptext} serialize={numberSerialize} deserialize={nullable ? numberNullableDeserialize : numberDeserialize} let:value let:valid let:invalid let:id let:onBlur let:onChange let:helptextid>
21
+ <Input bind:inputelement type="number" name={path} {value} {id} class="dialog-input {className}" {onChange} {onBlur} {valid} {invalid} {min} {max} {step} {helptextid}></Input>
21
22
  </FieldStandard>
@@ -13,15 +13,16 @@ declare const __propDef: {
13
13
  conditional?: boolean | undefined;
14
14
  required?: boolean;
15
15
  inputelement?: HTMLInputElement;
16
+ helptext?: string | undefined;
16
17
  };
17
18
  events: {
18
19
  [evt: string]: CustomEvent<any>;
19
20
  };
20
21
  slots: {};
21
22
  };
22
- export declare type FieldNumberProps = typeof __propDef.props;
23
- export declare type FieldNumberEvents = typeof __propDef.events;
24
- export declare type FieldNumberSlots = typeof __propDef.slots;
23
+ export type FieldNumberProps = typeof __propDef.props;
24
+ export type FieldNumberEvents = typeof __propDef.events;
25
+ export type FieldNumberSlots = typeof __propDef.slots;
25
26
  export default class FieldNumber extends SvelteComponentTyped<FieldNumberProps, FieldNumberEvents, FieldNumberSlots> {
26
27
  }
27
28
  export {};
package/FieldRadio.svelte CHANGED
@@ -1,5 +1,4 @@
1
- <script>import { nullableSerialize, nullableDeserialize } from '@txstate-mws/svelte-forms';
2
- import { randomid } from 'txstate-utils';
1
+ <script>import { randomid } from 'txstate-utils';
3
2
  import FieldStandard from './FieldStandard.svelte';
4
3
  import Radio from './Radio.svelte';
5
4
  let className = '';
@@ -13,16 +12,22 @@ export let defaultValue = notNull ? choices[0].value : undefined;
13
12
  export let conditional = undefined;
14
13
  export let required = false;
15
14
  export let horizontal = false;
15
+ export let helptext = undefined;
16
+ export let number = false;
17
+ export let date = false;
18
+ export let datetime = false;
19
+ export let serialize = undefined;
20
+ export let deserialize = undefined;
16
21
  const groupid = randomid();
17
22
  const width = '100%';
18
23
  </script>
19
24
 
20
- <FieldStandard bind:id descid={groupid} {label} {path} {required} {defaultValue} {conditional} serialize={!notNull && nullableSerialize} deserialize={!notNull && nullableDeserialize} let:value let:valid let:invalid let:onBlur let:onChange>
25
+ <FieldStandard bind:id descid={groupid} {label} {path} {required} {defaultValue} {conditional} {helptext} {notNull} {number} {date} {datetime} {serialize} {deserialize} let:value let:valid let:invalid let:onBlur let:onChange let:helptextid>
21
26
  <div class="dialog-radio {className}" class:horizontal role="radiogroup" aria-labelledby={groupid} class:invalid>
22
27
  {#each choices as choice, idx}
23
28
  {@const radioid = `${path}.${idx}`}
24
29
  <label for={radioid} style:width>
25
- <Radio id={radioid} name={path} value={choice.value} selected={value === choice.value} disabled={choice.disabled} {onChange} {onBlur} />
30
+ <Radio id={radioid} name={path} value={choice.value} selected={value === choice.value} disabled={choice.disabled} {onChange} {onBlur} {helptextid}/>
26
31
  <span>{choice.label || (typeof choice.value === 'string' ? choice.value : '')}</span>
27
32
  </label>
28
33
  {/each}
@@ -15,15 +15,21 @@ declare const __propDef: {
15
15
  conditional?: boolean | undefined;
16
16
  required?: boolean;
17
17
  horizontal?: boolean;
18
+ helptext?: string | undefined;
19
+ number?: boolean;
20
+ date?: boolean;
21
+ datetime?: boolean;
22
+ serialize?: (value: any) => string;
23
+ deserialize?: (value: string) => any;
18
24
  };
19
25
  events: {
20
26
  [evt: string]: CustomEvent<any>;
21
27
  };
22
28
  slots: {};
23
29
  };
24
- export declare type FieldRadioProps = typeof __propDef.props;
25
- export declare type FieldRadioEvents = typeof __propDef.events;
26
- export declare type FieldRadioSlots = typeof __propDef.slots;
30
+ export type FieldRadioProps = typeof __propDef.props;
31
+ export type FieldRadioEvents = typeof __propDef.events;
32
+ export type FieldRadioSlots = typeof __propDef.slots;
27
33
  export default class FieldRadio extends SvelteComponentTyped<FieldRadioProps, FieldRadioEvents, FieldRadioSlots> {
28
34
  }
29
35
  export {};
@@ -1,4 +1,4 @@
1
- <script>import { nullableSerialize, nullableDeserialize } from '@txstate-mws/svelte-forms';
1
+ <script>import { getDescribedBy } from './';
2
2
  import FieldStandard from './FieldStandard.svelte';
3
3
  let className = '';
4
4
  export { className as class };
@@ -13,10 +13,16 @@ export let defaultValue = notNull ? choices[0].value : undefined;
13
13
  export let conditional = undefined;
14
14
  export let required = false;
15
15
  export let inputelement = undefined;
16
+ export let helptext = undefined;
17
+ export let number = false;
18
+ export let date = false;
19
+ export let datetime = false;
20
+ export let serialize = undefined;
21
+ export let deserialize = undefined;
16
22
  </script>
17
23
 
18
- <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} serialize={!notNull && nullableSerialize} deserialize={!notNull && nullableDeserialize} let:value let:valid let:invalid let:id let:onBlur let:onChange let:messagesid>
19
- <select bind:this={inputelement} {id} name={path} {disabled} class="dialog-input dialog-select {className}" on:change={onChange} on:blur={onBlur} class:valid class:invalid aria-describedby={messagesid}>
24
+ <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} {helptext} {notNull} {number} {date} {datetime} {serialize} {deserialize} let:value let:valid let:invalid let:id let:onBlur let:onChange let:messagesid let:helptextid>
25
+ <select bind:this={inputelement} {id} name={path} {disabled} class="dialog-input dialog-select {className}" on:change={onChange} on:blur={onBlur} class:valid class:invalid aria-describedby={getDescribedBy([messagesid, helptextid])}>
20
26
  {#if !notNull}<option value="" selected={!value}>{placeholder}</option>{/if}
21
27
  {#each choices as choice (choice.value)}
22
28
  <option value={choice.value} disabled={choice.disabled} selected={value === choice.value}>{choice.label || choice.value}</option>
@@ -17,15 +17,21 @@ declare const __propDef: {
17
17
  conditional?: boolean | undefined;
18
18
  required?: boolean;
19
19
  inputelement?: HTMLSelectElement;
20
+ helptext?: string | undefined;
21
+ number?: boolean;
22
+ date?: boolean;
23
+ datetime?: boolean;
24
+ serialize?: (value: any) => string;
25
+ deserialize?: (value: string) => any;
20
26
  };
21
27
  events: {
22
28
  [evt: string]: CustomEvent<any>;
23
29
  };
24
30
  slots: {};
25
31
  };
26
- export declare type FieldSelectProps = typeof __propDef.props;
27
- export declare type FieldSelectEvents = typeof __propDef.events;
28
- export declare type FieldSelectSlots = typeof __propDef.slots;
32
+ export type FieldSelectProps = typeof __propDef.props;
33
+ export type FieldSelectEvents = typeof __propDef.events;
34
+ export type FieldSelectSlots = typeof __propDef.slots;
29
35
  export default class FieldSelect extends SvelteComponentTyped<FieldSelectProps, FieldSelectEvents, FieldSelectSlots> {
30
36
  }
31
37
  export {};
@@ -6,14 +6,19 @@ export let descid = undefined;
6
6
  export let path;
7
7
  export let defaultValue = undefined;
8
8
  export let label;
9
+ export let notNull = false;
10
+ export let number = false;
11
+ export let date = false;
12
+ export let datetime = false;
9
13
  export let serialize = undefined;
10
14
  export let deserialize = undefined;
11
15
  export let conditional = undefined;
12
16
  export let required = false;
17
+ export let helptext = undefined;
13
18
  </script>
14
19
 
15
- <Field {path} {defaultValue} {conditional} {serialize} {deserialize} let:path let:value let:onBlur let:onChange let:setVal let:messages let:valid let:invalid>
16
- <Container {id} {label} {messages} {descid} {required} let:messagesid>
17
- <slot {id} {path} {value} {onBlur} {onChange} {setVal} {valid} {invalid} {messagesid} />
20
+ <Field {path} {defaultValue} {conditional} {notNull} {number} {date} {datetime} {serialize} {deserialize} let:path let:value let:onBlur let:onChange let:setVal let:messages let:valid let:invalid>
21
+ <Container {id} {label} {messages} {descid} {required} {helptext} let:messagesid let:helptextid>
22
+ <slot {id} {path} {value} {onBlur} {onChange} {setVal} {valid} {invalid} {messagesid} {helptextid}/>
18
23
  </Container>
19
24
  </Field>
@@ -6,10 +6,15 @@ declare const __propDef: {
6
6
  path: string;
7
7
  defaultValue?: any;
8
8
  label: string;
9
+ notNull?: boolean;
10
+ number?: boolean;
11
+ date?: boolean;
12
+ datetime?: boolean;
9
13
  serialize?: (value: any) => string;
10
14
  deserialize?: (value: string) => any;
11
15
  conditional?: boolean | undefined;
12
16
  required?: boolean;
17
+ helptext?: string | undefined;
13
18
  };
14
19
  events: {
15
20
  [evt: string]: CustomEvent<any>;
@@ -25,12 +30,13 @@ declare const __propDef: {
25
30
  valid: boolean;
26
31
  invalid: boolean;
27
32
  messagesid: any;
33
+ helptextid: string;
28
34
  };
29
35
  };
30
36
  };
31
- export declare type FieldStandardProps = typeof __propDef.props;
32
- export declare type FieldStandardEvents = typeof __propDef.events;
33
- export declare type FieldStandardSlots = typeof __propDef.slots;
37
+ export type FieldStandardProps = typeof __propDef.props;
38
+ export type FieldStandardEvents = typeof __propDef.events;
39
+ export type FieldStandardSlots = typeof __propDef.slots;
34
40
  export default class FieldStandard extends SvelteComponentTyped<FieldStandardProps, FieldStandardEvents, FieldStandardSlots> {
35
41
  }
36
42
  export {};
package/FieldText.svelte CHANGED
@@ -15,8 +15,9 @@ export let conditional = undefined;
15
15
  export let required = false;
16
16
  export let use = [];
17
17
  export let inputelement = undefined;
18
+ export let helptext = undefined;
18
19
  </script>
19
20
 
20
- <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} serialize={!notNull && nullableSerialize} deserialize={!notNull && nullableDeserialize} let:value let:valid let:invalid let:id let:onBlur let:onChange let:messagesid>
21
- <Input bind:inputelement {type} name={path} {value} {id} class="dialog-input {className}" {allowlastpass} {onChange} {onBlur} {valid} {invalid} {maxlength} {messagesid} {use}></Input>
21
+ <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} {helptext} serialize={!notNull && nullableSerialize} deserialize={!notNull && nullableDeserialize} let:value let:valid let:invalid let:id let:onBlur let:onChange let:messagesid let:helptextid>
22
+ <Input bind:inputelement {type} name={path} {value} {id} class="dialog-input {className}" {allowlastpass} {onChange} {onBlur} {valid} {invalid} {maxlength} {messagesid} {helptextid} {use}></Input>
22
23
  </FieldStandard>