@dosgato/dialog 0.0.46 → 0.0.48

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 (58) hide show
  1. package/dist/ButtonGroup.svelte +1 -0
  2. package/dist/Checkbox.svelte +1 -4
  3. package/dist/Checkbox.svelte.d.ts +0 -2
  4. package/dist/Container.svelte +77 -7
  5. package/dist/Container.svelte.d.ts +2 -0
  6. package/dist/Dialog.svelte +2 -2
  7. package/dist/FieldAutocomplete.svelte +4 -2
  8. package/dist/FieldAutocomplete.svelte.d.ts +2 -0
  9. package/dist/FieldCheckbox.svelte +5 -2
  10. package/dist/FieldCheckbox.svelte.d.ts +2 -0
  11. package/dist/FieldChoices.svelte +5 -2
  12. package/dist/FieldChoices.svelte.d.ts +2 -0
  13. package/dist/FieldChooserLink.svelte +4 -2
  14. package/dist/FieldChooserLink.svelte.d.ts +2 -0
  15. package/dist/FieldCodeEditor.svelte +4 -2
  16. package/dist/FieldCodeEditor.svelte.d.ts +2 -0
  17. package/dist/FieldDate.svelte +4 -2
  18. package/dist/FieldDate.svelte.d.ts +2 -0
  19. package/dist/FieldDateTime.svelte +4 -2
  20. package/dist/FieldDateTime.svelte.d.ts +2 -0
  21. package/dist/FieldDualListbox.svelte +9 -5
  22. package/dist/FieldDualListbox.svelte.d.ts +3 -0
  23. package/dist/FieldMultiple.svelte +11 -3
  24. package/dist/FieldMultiple.svelte.d.ts +3 -0
  25. package/dist/FieldMultiselect.svelte +7 -3
  26. package/dist/FieldMultiselect.svelte.d.ts +3 -0
  27. package/dist/FieldNumber.svelte +4 -2
  28. package/dist/FieldNumber.svelte.d.ts +2 -0
  29. package/dist/FieldRadio.svelte +3 -1
  30. package/dist/FieldRadio.svelte.d.ts +2 -0
  31. package/dist/FieldSelect.svelte +4 -2
  32. package/dist/FieldSelect.svelte.d.ts +2 -0
  33. package/dist/FieldStandard.svelte +2 -1
  34. package/dist/FieldStandard.svelte.d.ts +1 -0
  35. package/dist/FieldText.svelte +4 -2
  36. package/dist/FieldText.svelte.d.ts +2 -0
  37. package/dist/FieldTextArea.svelte +4 -2
  38. package/dist/FieldTextArea.svelte.d.ts +2 -0
  39. package/dist/Input.svelte +2 -1
  40. package/dist/Input.svelte.d.ts +1 -0
  41. package/dist/Listbox.svelte +1 -0
  42. package/dist/Radio.svelte +2 -1
  43. package/dist/Radio.svelte.d.ts +1 -0
  44. package/dist/Switcher.svelte +4 -2
  45. package/dist/Switcher.svelte.d.ts +2 -0
  46. package/dist/Tabs.svelte +1 -0
  47. package/dist/chooser/Chooser.svelte +1 -5
  48. package/dist/chooser/ChooserStore.d.ts +3 -3
  49. package/dist/chooser/ChooserStore.js +5 -3
  50. package/dist/chooser/Details.svelte +58 -12
  51. package/dist/chooser/Details.svelte.d.ts +2 -3
  52. package/dist/helpers.d.ts +1 -1
  53. package/dist/helpers.js +1 -1
  54. package/dist/tree/Tree.svelte +16 -11
  55. package/dist/tree/TreeNode.svelte +3 -3
  56. package/dist/tree/treestore.d.ts +3 -1
  57. package/dist/tree/treestore.js +21 -12
  58. package/package.json +2 -2
@@ -11,6 +11,8 @@ export let defaultValue = notNull ? choices[0].value : undefined;
11
11
  export let conditional = undefined;
12
12
  export let required = false;
13
13
  export let horizontal = false;
14
+ export let related = 0;
15
+ export let extradescid = undefined;
14
16
  export let helptext = undefined;
15
17
  export let number = false;
16
18
  export let date = false;
@@ -21,5 +23,5 @@ export let deserialize = undefined;
21
23
  </script>
22
24
 
23
25
  <Field {path} {defaultValue} {conditional} {notNull} {number} {date} {datetime} {boolean} {serialize} {deserialize} let:value let:valid let:invalid let:onBlur let:onChange let:messages let:serialize>
24
- <Switcher bind:id class={className} name={path} {horizontal} {label} iptValue={value} {valid} {invalid} {required} {helptext} {messages} on:change={onChange} {onBlur} choices={choices.map(c => ({ ...c, value: serialize(c.value) }))} />
26
+ <Switcher bind:id class={className} name={path} {horizontal} {label} iptValue={value} {valid} {invalid} {required} {related} {extradescid} {helptext} {messages} on:change={onChange} {onBlur} choices={choices.map(c => ({ ...c, value: serialize(c.value) }))} />
25
27
  </Field>
@@ -15,6 +15,8 @@ declare const __propDef: {
15
15
  conditional?: boolean | undefined;
16
16
  required?: boolean | undefined;
17
17
  horizontal?: boolean | undefined;
18
+ related?: number | true | undefined;
19
+ extradescid?: string | undefined;
18
20
  helptext?: string | undefined;
19
21
  number?: boolean | undefined;
20
22
  date?: boolean | undefined;
@@ -13,6 +13,8 @@ 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 related = 0;
17
+ export let extradescid = undefined;
16
18
  export let helptext = undefined;
17
19
  export let number = false;
18
20
  export let date = false;
@@ -22,8 +24,8 @@ export let serialize = undefined;
22
24
  export let deserialize = undefined;
23
25
  </script>
24
26
 
25
- <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} {helptext} {notNull} {number} {date} {datetime} {boolean} {serialize} {deserialize} let:value let:valid let:invalid let:id let:onBlur let:onChange let:messagesid let:helptextid let:serialize>
26
- <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])}>
27
+ <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} {related} {helptext} {notNull} {number} {date} {datetime} {boolean} {serialize} {deserialize} let:value let:valid let:invalid let:id let:onBlur let:onChange let:messagesid let:helptextid let:serialize>
28
+ <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, extradescid])}>
27
29
  {#if !notNull}<option value="" selected={!value}>{placeholder}</option>{/if}
28
30
  {#each choices as choice (choice.value)}
29
31
  {@const serializedValue = serialize(choice.value)}
@@ -17,6 +17,8 @@ declare const __propDef: {
17
17
  conditional?: boolean | undefined;
18
18
  required?: boolean | undefined;
19
19
  inputelement?: HTMLSelectElement | undefined;
20
+ related?: number | true | undefined;
21
+ extradescid?: string | undefined;
20
22
  helptext?: string | undefined;
21
23
  number?: boolean | undefined;
22
24
  date?: boolean | undefined;
@@ -16,11 +16,12 @@ export let deserialize = undefined;
16
16
  export let finalize = undefined;
17
17
  export let conditional = undefined;
18
18
  export let required = false;
19
+ export let related = 0;
19
20
  export let helptext = undefined;
20
21
  </script>
21
22
 
22
23
  <Field {path} {defaultValue} {conditional} {notNull} {number} {date} {datetime} {boolean} {serialize} {deserialize} {finalize} let:path let:value let:onBlur let:onChange let:setVal let:messages let:valid let:invalid let:serialize let:deserialize>
23
- <Container {id} {label} {messages} {descid} {required} {helptext} let:messagesid let:helptextid>
24
+ <Container {id} {label} {messages} {descid} {required} {related} {helptext} let:messagesid let:helptextid>
24
25
  <slot {id} {path} {value} {onBlur} {onChange} {setVal} {valid} {invalid} {messagesid} {helptextid} {serialize} {deserialize} />
25
26
  </Container>
26
27
  </Field>
@@ -16,6 +16,7 @@ declare const __propDef: {
16
16
  finalize?: ((value: any) => any) | undefined;
17
17
  conditional?: boolean | undefined;
18
18
  required?: boolean | undefined;
19
+ related?: number | true | undefined;
19
20
  helptext?: string | undefined;
20
21
  };
21
22
  events: {
@@ -15,9 +15,11 @@ export let conditional = undefined;
15
15
  export let required = false;
16
16
  export let use = [];
17
17
  export let inputelement = undefined;
18
+ export let related = 0;
19
+ export let extradescid = undefined;
18
20
  export let helptext = undefined;
19
21
  </script>
20
22
 
21
- <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} {helptext} serialize={!notNull ? nullableSerialize : undefined} deserialize={!notNull ? nullableDeserialize : undefined} 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>
23
+ <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} {related} {helptext} serialize={!notNull ? nullableSerialize : undefined} deserialize={!notNull ? nullableDeserialize : undefined} let:value let:valid let:invalid let:id let:onBlur let:onChange let:messagesid let:helptextid>
24
+ <Input bind:inputelement {type} name={path} {value} {id} class="dialog-input {className}" {allowlastpass} {onChange} {onBlur} {valid} {invalid} {maxlength} {messagesid} {helptextid} {extradescid} {use}></Input>
23
25
  </FieldStandard>
@@ -15,6 +15,8 @@ declare const __propDef: {
15
15
  required?: boolean | undefined;
16
16
  use?: HTMLActionEntry<any>[] | undefined;
17
17
  inputelement?: HTMLInputElement | undefined;
18
+ related?: number | true | undefined;
19
+ extradescid?: string | undefined;
18
20
  helptext?: string | undefined;
19
21
  };
20
22
  events: {
@@ -15,11 +15,13 @@ export let conditional = undefined;
15
15
  export let required = false;
16
16
  export let use = [];
17
17
  export let inputelement = undefined;
18
+ export let related = 0;
19
+ export let extradescid = undefined;
18
20
  export let helptext = undefined;
19
21
  </script>
20
22
 
21
- <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} {helptext} serialize={!notNull ? nullableSerialize : undefined} deserialize={!notNull ? nullableDeserialize : undefined} let:value let:valid let:invalid let:id let:onBlur let:onChange let:messagesid let:helptextid>
22
- <textarea bind:this={inputelement} name={path} {value} {id} {rows} class="dialog-input dialog-textarea {className}" class:valid class:invalid aria-invalid={invalid} aria-describedby={getDescribedBy([messagesid, helptextid])} on:change={onChange} on:blur={onBlur} on:keyup={onChange} on:paste {maxlength} use:passActions={use}></textarea>
23
+ <FieldStandard bind:id {label} {path} {required} {defaultValue} {conditional} {related} {helptext} serialize={!notNull ? nullableSerialize : undefined} deserialize={!notNull ? nullableDeserialize : undefined} let:value let:valid let:invalid let:id let:onBlur let:onChange let:messagesid let:helptextid>
24
+ <textarea bind:this={inputelement} name={path} {value} {id} {rows} class="dialog-input dialog-textarea {className}" class:valid class:invalid aria-invalid={invalid} aria-describedby={getDescribedBy([messagesid, helptextid, extradescid])} on:change={onChange} on:blur={onBlur} on:keyup={onChange} on:paste {maxlength} use:passActions={use}></textarea>
23
25
  </FieldStandard>
24
26
 
25
27
  <style>
@@ -14,6 +14,8 @@ declare const __propDef: {
14
14
  required?: boolean | undefined;
15
15
  use?: HTMLActionEntry<any>[] | undefined;
16
16
  inputelement?: HTMLTextAreaElement | undefined;
17
+ related?: number | true | undefined;
18
+ extradescid?: string | undefined;
17
19
  helptext?: string | undefined;
18
20
  };
19
21
  events: {
package/dist/Input.svelte CHANGED
@@ -13,6 +13,7 @@ export let max = undefined;
13
13
  export let step = undefined;
14
14
  export let id = undefined;
15
15
  export let disabled = false;
16
+ export let extradescid = undefined;
16
17
  export let messagesid = undefined;
17
18
  export let helptextid = undefined;
18
19
  export let valid = false;
@@ -22,7 +23,7 @@ export let onBlur;
22
23
  export let onSelect = undefined;
23
24
  export let use = [];
24
25
  export let inputelement = undefined;
25
- $: descby = [helptextid, messagesid].filter(isNotBlank).join(' ');
26
+ $: descby = [messagesid, helptextid, extradescid].filter(isNotBlank).join(' ');
26
27
  function resolveMinMax(dt) {
27
28
  if (typeof dt === 'undefined')
28
29
  return undefined;
@@ -17,6 +17,7 @@ declare const __propDef: {
17
17
  step?: number | undefined;
18
18
  id?: string | undefined;
19
19
  disabled?: boolean | undefined;
20
+ extradescid?: string | undefined;
20
21
  messagesid?: string | undefined;
21
22
  helptextid?: string | undefined;
22
23
  valid?: boolean | undefined;
@@ -120,6 +120,7 @@ function focusListbox() {
120
120
 
121
121
  <div class="listbox-container" class:valid class:invalid>
122
122
  <span id={labelId}>{label}</span>
123
+ <!-- svelte-ignore a11y-no-noninteractive-element-to-interactive-role -->
123
124
  <ul bind:this={listboxElement} role="listbox" id={listId} class="listbox-items" tabindex="0" aria-describedby={descid} aria-labelledby={labelId} aria-multiselectable={multiselect} on:keydown={onkeydown} on:focus={focusListbox}>
124
125
  {#each items as item, i (item.value)}
125
126
  <!-- svelte-ignore a11y-click-events-have-key-events -->
package/dist/Radio.svelte CHANGED
@@ -7,10 +7,11 @@ export let onChange = undefined;
7
7
  export let onBlur = undefined;
8
8
  export let messagesid = undefined;
9
9
  export let helptextid = undefined;
10
+ export let extradescid = undefined;
10
11
  export let disabled = false;
11
12
  export let valid = false;
12
13
  export let invalid = false;
13
- $: descby = [messagesid, helptextid].filter(isNotBlank).join(' ');
14
+ $: descby = [messagesid, helptextid, extradescid].filter(isNotBlank).join(' ');
14
15
  </script>
15
16
 
16
17
  <input {id} type="radio" {name} class:valid class:invalid checked={selected} {disabled} aria-describedby={descby} {value} on:change={onChange} on:blur={onBlur}>
@@ -9,6 +9,7 @@ declare const __propDef: {
9
9
  onBlur?: any;
10
10
  messagesid?: string | undefined;
11
11
  helptextid?: string | undefined;
12
+ extradescid?: string | undefined;
12
13
  disabled?: boolean | undefined;
13
14
  valid?: boolean | undefined;
14
15
  invalid?: boolean | undefined;
@@ -12,6 +12,8 @@ export let choices;
12
12
  export let horizontal = false;
13
13
  export let label;
14
14
  export let required = false;
15
+ export let related = 0;
16
+ export let extradescid = undefined;
15
17
  export let helptext = undefined;
16
18
  export let messages = [];
17
19
  export let iptValue = choices[0].value;
@@ -28,12 +30,12 @@ function onChange(e) {
28
30
  $: columns = Math.floor($store.width / 250);
29
31
  $: width = (horizontal ? 100 / Math.min(choices.length, choices.length === 4 && columns === 3 ? 2 : columns) : 100) + '%';
30
32
  </script>
31
- <Container {id} {label} {messages} descid={groupid} {required} {helptext} let:helptextid>
33
+ <Container {id} {label} {messages} descid={groupid} {required} {related} {helptext} let:helptextid>
32
34
  <div class="dialog-radio {className}" use:eq={{ store }} class:horizontal role="radiogroup" aria-labelledby={groupid} class:valid class:invalid>
33
35
  {#each choices as choice, idx}
34
36
  {@const radioid = `${groupid}.${idx}`}
35
37
  <label for={radioid} style:width>
36
- <Radio id={radioid} {name} value={choice.value} selected={iptValue === choice.value} disabled={choice.disabled} {onChange} {onBlur} {helptextid}/>
38
+ <Radio id={radioid} {name} value={choice.value} selected={iptValue === choice.value} disabled={choice.disabled} {onChange} {onBlur} {helptextid} {extradescid} />
37
39
  <span>{choice.label || choice.value}</span>
38
40
  </label>
39
41
  {/each}
@@ -13,6 +13,8 @@ declare const __propDef: {
13
13
  horizontal?: boolean | undefined;
14
14
  label: string;
15
15
  required?: boolean | undefined;
16
+ related?: number | true | undefined;
17
+ extradescid?: string | undefined;
16
18
  helptext?: string | undefined;
17
19
  messages?: Feedback[] | undefined;
18
20
  iptValue?: string | undefined;
package/dist/Tabs.svelte CHANGED
@@ -87,6 +87,7 @@ onMount(reactToCurrent);
87
87
 
88
88
  {#if $store.tabs.length > 1}
89
89
  {#if !$accordion}
90
+ <!-- svelte-ignore a11y-no-noninteractive-element-to-interactive-role -->
90
91
  <ul use:resize={{ store }} class="tabs-buttons" role="tablist">
91
92
  {#each $store.tabs as tab, idx (tab.name)}
92
93
  {@const active = isActive(idx, $store.current)}
@@ -101,11 +101,7 @@ onMount(async () => {
101
101
  <section class="dialog-chooser-preview" tabindex="-1">
102
102
  {#if $preview}
103
103
  <Thumbnail item={$preview} larger />
104
- <Details item={$preview}>
105
- {#if $preview.type === 'folder'}
106
- <li>{$selected?.children?.length ?? 0} sub-items</li>
107
- {/if}
108
- </Details>
104
+ <Details item={$preview} />
109
105
  {/if}
110
106
  </section>
111
107
  </section>
@@ -18,7 +18,7 @@ export interface IAssetStore {
18
18
  activetype: ChooserType;
19
19
  activesource: number;
20
20
  initialized: boolean;
21
- preview?: AnyItem;
21
+ preview?: AnyUIItem;
22
22
  }
23
23
  export interface ChooserStoreOptions<F> {
24
24
  pages?: boolean;
@@ -44,11 +44,11 @@ export declare class ChooserStore<F = any> extends Store<IAssetStore> {
44
44
  setOptions(options: ChooserStoreOptions<F>): void;
45
45
  sources: import("@txstate-mws/svelte-store").DerivedStore<UISource[], IAssetStore>;
46
46
  source: import("@txstate-mws/svelte-store").DerivedStore<UISource | undefined, IAssetStore>;
47
- preview: import("@txstate-mws/svelte-store").DerivedStore<AnyItem | undefined, IAssetStore>;
47
+ preview: import("@txstate-mws/svelte-store").DerivedStore<AnyUIItem | undefined, IAssetStore>;
48
48
  getSource(state?: IAssetStore): UISource | undefined;
49
49
  getSourceIndex(name: string, state?: IAssetStore, type?: ChooserType): number;
50
50
  init(options: ChooserStoreOptions<F>): Promise<void>;
51
- setPreview(item?: AnyItem): void;
51
+ setPreview(item?: AnyUIItem): void;
52
52
  clearPreview(): void;
53
53
  setSource(name?: string, init?: boolean): void;
54
54
  }
@@ -24,7 +24,7 @@ export class ChooserStore extends Store {
24
24
  setOptions(options) {
25
25
  const userFilter = options.filter ?? nofilter;
26
26
  const filter = options.images
27
- ? (itm) => ((itm.type === 'asset' && !!itm.image) || itm.type === 'folder') && userFilter(itm)
27
+ ? async (itm) => ((itm.type === 'asset' && !!itm.image) || itm.type === 'folder') && await userFilter(itm)
28
28
  : userFilter;
29
29
  this.options = {
30
30
  ...options,
@@ -58,8 +58,10 @@ export class ChooserStore extends Store {
58
58
  this.update(v => ({ ...v, initialized: true }));
59
59
  }
60
60
  setPreview(item) {
61
- if (!item)
62
- return this.clearPreview();
61
+ if (!item) {
62
+ this.clearPreview();
63
+ return;
64
+ }
63
65
  if (item.type === 'folder' && !this.options.folders)
64
66
  return;
65
67
  this.update(v => ({ ...v, preview: item }));
@@ -2,25 +2,52 @@
2
2
  export let item;
3
3
  </script>
4
4
 
5
- <ul class="dialog-chooser-info" aria-live="polite">
5
+ <dl class="dialog-chooser-info" aria-live="polite">
6
6
  {#if item.type !== 'raw'}
7
- <li>{item.path}</li>
7
+ <div class="top-row">
8
+ <dt>Name:</dt>
9
+ <dd>{item.path}</dd>
10
+ </div>
8
11
  {:else if item.id}
9
- <li>External Link<br>{item.url}</li>
12
+ <div>
13
+ <dt>External Link:</dt>
14
+ <dd>{item.url}</dd>
15
+ </div>
10
16
  {/if}
11
- {#if item.type === 'asset' && item.image}
12
- <li>{item.image.width}x{item.image.height}</li>
17
+ {#if item.type === 'asset'}
18
+ <div class="horizontal-group">
19
+ {#if item.image}
20
+ <div>
21
+ <dt>Dimensions:</dt>
22
+ <dd>{item.image.width}x{item.image.height}</dd>
23
+ </div>
24
+ {/if}
25
+ <div>
26
+ <dt>File Type:</dt>
27
+ <dd>{item.mime}</dd>
28
+ </div>
29
+ <div>
30
+ <dt>File Size:</dt>
31
+ <dd>{bytesToHuman(item.bytes)}</dd>
32
+ </div>
33
+ </div>
13
34
  {:else if item.type === 'page' && item.title}
14
- <li>{item.title}</li>
35
+ <dt>Title:</dt>
36
+ <dd>{item.title}</dd>
15
37
  {:else if item.type === 'folder'}
16
- <li>{item.path}</li>
17
- {/if}
18
- {#if item.type === 'asset'}
19
- <li>{item.mime}</li>
20
- <li>{bytesToHuman(item.bytes)}</li>
38
+ <div class="horizontal-group">
39
+ <div>
40
+ <dt>Path:</dt>
41
+ <dd>{item.path}</dd>
42
+ </div>
43
+ <div>
44
+ <dt>Contents:</dt>
45
+ <dd>{item.children?.length ?? 0} sub-items</dd>
46
+ </div>
47
+ </div>
21
48
  {/if}
22
49
  <slot />
23
- </ul>
50
+ </dl>
24
51
 
25
52
  <style>
26
53
  .dialog-chooser-info {
@@ -28,5 +55,24 @@ export let item;
28
55
  margin: 0;
29
56
  list-style: none;
30
57
  }
58
+ .dialog-chooser-info dt {
59
+ font-weight: bold;
60
+ }
61
+ .dialog-chooser-info dd {
62
+ margin: 0;
63
+ }
64
+ .top-row {
65
+ margin-bottom: 1em;
66
+ }
67
+ .horizontal-group {
68
+ display: flex;
69
+ justify-content: space-between;
70
+ }
71
+ :global([data-eq~="1400px"]) .horizontal-group {
72
+ flex-direction: column;
73
+ }
74
+ :global([data-eq~="1400px"]) .horizontal-group div:not(:last-child){
75
+ margin-bottom: 1em;
76
+ }
31
77
 
32
78
  </style>
@@ -1,9 +1,8 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
- import type { AnyItem } from './ChooserAPI';
3
- import { type RawURL } from './ChooserStore';
2
+ import { type AnyUIItem, type RawURL } from './ChooserStore';
4
3
  declare const __propDef: {
5
4
  props: {
6
- item: AnyItem | RawURL;
5
+ item: AnyUIItem | RawURL;
7
6
  };
8
7
  events: {
9
8
  [evt: string]: CustomEvent<any>;
package/dist/helpers.d.ts CHANGED
@@ -1 +1 @@
1
- export declare function getDescribedBy(ids: (string | undefined)[]): string | null;
1
+ export declare function getDescribedBy(ids: (string | undefined)[]): string | undefined;
package/dist/helpers.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { isNotBlank } from 'txstate-utils';
2
2
  export function getDescribedBy(ids) {
3
3
  const descby = ids.filter(isNotBlank).join(' ');
4
- return isNotBlank(descby) ? descby : null;
4
+ return isNotBlank(descby) ? descby : undefined;
5
5
  }
@@ -1,10 +1,9 @@
1
1
  <script>import { resize } from '@txstate-mws/svelte-components';
2
2
  import { derivedStore, Store } from '@txstate-mws/svelte-store';
3
- import { afterUpdate, beforeUpdate, onDestroy, onMount, setContext } from 'svelte';
4
- import { hashid } from 'txstate-utils';
3
+ import { afterUpdate, beforeUpdate, onDestroy, onMount, setContext, tick } from 'svelte';
5
4
  import LoadIcon from './LoadIcon.svelte';
6
5
  import TreeNode from './TreeNode.svelte';
7
- import { TreeStore, TREE_STORE_CONTEXT } from './treestore';
6
+ import { getHashId, TreeStore, TREE_STORE_CONTEXT } from './treestore';
8
7
  export let headers;
9
8
  export let nodeClass = undefined;
10
9
  export let singleSelect = undefined;
@@ -93,18 +92,23 @@ function headerDragEnd() {
93
92
  function headerDragReset() {
94
93
  store.resetHeaderOverride();
95
94
  }
95
+ let mounted = false;
96
96
  onMount(async () => {
97
97
  document.addEventListener('dragend', onDragEnd);
98
98
  const saveFocusId = $store.focused?.id;
99
- await store.refresh();
100
- if ($store.focused?.id && $store.focused.id === saveFocusId) {
101
- const el = document.getElementById(hashid($store.focused.id));
102
- el?.scrollIntoView({ block: 'center' });
103
- }
104
99
  headerSizes.set(calcHeaderSizes()); // seems to need a kick on first mount
100
+ await new Promise(resolve => requestAnimationFrame(resolve));
101
+ // need to wait long enough for headers to redraw before trying to mount the rows
102
+ await new Promise(resolve => requestAnimationFrame(resolve));
103
+ mounted = true;
104
+ const el = saveFocusId ? document.getElementById(getHashId(saveFocusId)) : undefined;
105
+ if ($store.focused?.id && $store.focused.id === saveFocusId)
106
+ el?.scrollIntoView({ block: 'center' });
107
+ await store.refresh();
105
108
  });
106
109
  onDestroy(() => {
107
- document.removeEventListener('dragend', onDragEnd);
110
+ if (typeof document !== 'undefined')
111
+ document.removeEventListener('dragend', onDragEnd);
108
112
  });
109
113
  let hadFocus = false;
110
114
  beforeUpdate(() => {
@@ -112,7 +116,7 @@ beforeUpdate(() => {
112
116
  });
113
117
  afterUpdate(() => {
114
118
  if ($store.focused?.id) {
115
- const el = document.getElementById(hashid($store.focused.id));
119
+ const el = document.getElementById(getHashId($store.focused.id));
116
120
  if (el && hadFocus) {
117
121
  if (el !== document.activeElement)
118
122
  el.focus();
@@ -130,7 +134,8 @@ afterUpdate(() => {
130
134
  {#if enableResize && i !== headers.length - 1}<div class="tree-separator" on:mousedown={headerDragStart(header, i)} on:touchstart={headerDragStart(header, i)} on:dblclick={headerDragReset}>&nbsp;</div>{/if}
131
135
  {/each}
132
136
  </div>
133
- {#if $rootItems?.length}
137
+ {#if mounted && $rootItems?.length}
138
+ <!-- svelte-ignore a11y-no-noninteractive-element-to-interactive-role -->
134
139
  <ul bind:this={store.treeElement} role="tree" class:resizing={!!dragheaderid} on:mousemove={dragheaderid ? headerDrag : undefined} on:touchmove={dragheaderid ? headerDrag : undefined} on:mouseup={headerDragEnd} on:touchend={headerDragEnd}>
135
140
  {#each $rootItems as item, i (item.id)}
136
141
  <TreeNode
@@ -4,9 +4,9 @@ import menuDown from '@iconify-icons/mdi/menu-down';
4
4
  import menuRight from '@iconify-icons/mdi/menu-right';
5
5
  import { modifierKey, ScreenReaderOnly } from '@txstate-mws/svelte-components';
6
6
  import { createEventDispatcher, getContext } from 'svelte';
7
- import { hashid, isNotBlank, toArray } from 'txstate-utils';
7
+ import { isNotBlank, toArray } from 'txstate-utils';
8
8
  import { Icon } from '..';
9
- import { TREE_STORE_CONTEXT } from './treestore';
9
+ import { TREE_STORE_CONTEXT, getHashId } from './treestore';
10
10
  import LoadIcon from './LoadIcon.svelte';
11
11
  import TreeCell from './TreeCell.svelte';
12
12
  export let headers;
@@ -26,7 +26,7 @@ let nodeelement;
26
26
  let userWantsCopy = false;
27
27
  $: isSelected = $selected.has(item.id);
28
28
  $: showChildren = !!item.open && !!item.children?.length;
29
- $: hashedId = hashid(item.id);
29
+ $: hashedId = getHashId(item.id);
30
30
  $: isDraggable = $draggable && ((isSelected && !$selectedUndraggable) || store.dragEligible([item], true) || store.dragEligible([item], false));
31
31
  $: dropZone = $dragging && store.dropEffect(item, false, userWantsCopy) !== 'none';
32
32
  $: dropDisabled = $dragging && !dropZone;
@@ -48,7 +48,7 @@ export declare class TreeStore<T extends TreeItemFromDB> extends ActiveStore<ITr
48
48
  #private;
49
49
  fetchChildren: FetchChildrenFn<T>;
50
50
  treeElement?: HTMLElement;
51
- rootItems: import("@txstate-mws/svelte-store").DerivedStore<TypedTreeItem<T>[] | undefined, ITreeStore<T>>;
51
+ rootItems: import("svelte/store").Readable<any>;
52
52
  draggable: import("@txstate-mws/svelte-store").DerivedStore<boolean, ITreeStore<T>>;
53
53
  dragging: import("@txstate-mws/svelte-store").DerivedStore<boolean, ITreeStore<T>>;
54
54
  selectedUndraggable: import("@txstate-mws/svelte-store").DerivedStore<boolean | undefined, ITreeStore<T>>;
@@ -115,3 +115,5 @@ export declare class TreeStore<T extends TreeItemFromDB> extends ActiveStore<ITr
115
115
  setHeaderOverride(id: string, width: string): void;
116
116
  resetHeaderOverride(): void;
117
117
  }
118
+ export declare const hashedIds: Record<string, string>;
119
+ export declare function getHashId(str: string): string;
@@ -1,10 +1,12 @@
1
1
  import { ActiveStore, derivedStore } from '@txstate-mws/svelte-store';
2
- import { keyby } from 'txstate-utils';
2
+ import { derived } from 'svelte/store';
3
+ import { hashid, keyby } from 'txstate-utils';
3
4
  export const TREE_STORE_CONTEXT = {};
5
+ const rootItems = v => v.rootItems;
4
6
  export class TreeStore extends ActiveStore {
5
7
  fetchChildren;
6
8
  treeElement;
7
- rootItems = derivedStore(this, 'rootItems');
9
+ rootItems = derived(this, rootItems);
8
10
  draggable = derivedStore(this, v => v.draggable && !v.loading);
9
11
  dragging = derivedStore(this, 'dragging');
10
12
  selectedUndraggable = derivedStore(this, 'selectedUndraggable');
@@ -29,7 +31,7 @@ export class TreeStore extends ActiveStore {
29
31
  }
30
32
  async visit(item, cb) {
31
33
  await cb(item);
32
- await Promise.all((item.children ?? []).map(async (child) => await this.visit(child, cb)));
34
+ await Promise.all((item.children ?? []).map(async (child) => { await this.visit(child, cb); }));
33
35
  }
34
36
  visitSync(item, cb) {
35
37
  cb(item);
@@ -77,15 +79,17 @@ export class TreeStore extends ActiveStore {
77
79
  try {
78
80
  const children = await this.fetch(item);
79
81
  // re-open any open children
80
- await Promise.all(children.map(async (child) => await this.visit(child, async (child) => {
81
- child.open = this.value.itemsById[child.id]?.open;
82
- if (child.open) {
83
- child.children = await this.fetch(child);
84
- child.hasChildren = child.children.length > 0;
85
- if (!child.hasChildren)
86
- child.open = false;
87
- }
88
- })));
82
+ await Promise.all(children.map(async (child) => {
83
+ await this.visit(child, async (child) => {
84
+ child.open = this.value.itemsById[child.id]?.open;
85
+ if (child.open) {
86
+ child.children = await this.fetch(child);
87
+ child.hasChildren = child.children.length > 0;
88
+ if (!child.hasChildren)
89
+ child.open = false;
90
+ }
91
+ });
92
+ }));
89
93
  if (item) {
90
94
  this.visitSync(item, itm => { if (itm.id !== item.id)
91
95
  this.value.itemsById[itm.id] = undefined; });
@@ -336,3 +340,8 @@ export class TreeStore extends ActiveStore {
336
340
  this.trigger();
337
341
  }
338
342
  }
343
+ export const hashedIds = {};
344
+ export function getHashId(str) {
345
+ hashedIds[str] ??= hashid(str);
346
+ return hashedIds[str];
347
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dosgato/dialog",
3
3
  "description": "A component library for building forms that edit a JSON document.",
4
- "version": "0.0.46",
4
+ "version": "0.0.48",
5
5
  "scripts": {
6
6
  "prepublishOnly": "svelte-package",
7
7
  "dev": "vite dev --force",
@@ -20,7 +20,7 @@
20
20
  "./package.json": "./package.json"
21
21
  },
22
22
  "dependencies": {
23
- "@txstate-mws/svelte-components": "^1.3.9",
23
+ "@txstate-mws/svelte-components": "^1.4.5",
24
24
  "@txstate-mws/svelte-forms": "^1.3.4",
25
25
  "@iconify/svelte": "^3.0.0",
26
26
  "@iconify-icons/mdi": "^1.2.22",