@dosgato/dialog 0.0.47 → 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.
- package/dist/Container.svelte +38 -3
- package/dist/chooser/Chooser.svelte +14 -32
- package/dist/chooser/ChooserStore.d.ts +3 -3
- package/dist/chooser/ChooserStore.js +5 -3
- package/dist/chooser/Details.svelte +15 -11
- package/dist/chooser/Details.svelte.d.ts +2 -3
- package/dist/tree/Tree.svelte +3 -4
- package/package.json +1 -1
package/dist/Container.svelte
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script>import { eq } from '@txstate-mws/svelte-components';
|
|
1
|
+
<script>import { eq, resize, ScreenReaderOnly } from '@txstate-mws/svelte-components';
|
|
2
2
|
import { randomid } from 'txstate-utils';
|
|
3
3
|
import { getContext } from 'svelte';
|
|
4
4
|
import { DG_DIALOG_FIELD_MULTIPLE } from './FieldMultiple.svelte';
|
|
@@ -17,6 +17,14 @@ const dgMultipleContext = getContext(DG_DIALOG_FIELD_MULTIPLE);
|
|
|
17
17
|
const helptextid = randomid();
|
|
18
18
|
$: descids = getDescribedBy([helptext ? helptextid : undefined, dgMultipleContext?.helptextid]);
|
|
19
19
|
let showhelp = false;
|
|
20
|
+
let helpelement;
|
|
21
|
+
let needsShowHelp = false;
|
|
22
|
+
function setNeedsShowHelp(..._) {
|
|
23
|
+
needsShowHelp = (helpelement?.getClientRects().length ?? 0) > 1;
|
|
24
|
+
if (!needsShowHelp)
|
|
25
|
+
showhelp = false;
|
|
26
|
+
}
|
|
27
|
+
$: setNeedsShowHelp(helpelement);
|
|
20
28
|
</script>
|
|
21
29
|
|
|
22
30
|
{#if conditional !== false}
|
|
@@ -29,7 +37,12 @@ let showhelp = false;
|
|
|
29
37
|
<div class="dialog-field-content">
|
|
30
38
|
{#if helptext}
|
|
31
39
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
|
32
|
-
<div id={helptextid} class="dialog-field-help" class:expanded={showhelp} on:click={() => { showhelp = !showhelp }}>
|
|
40
|
+
<div use:resize={{ debounce: 10 }} on:resize={setNeedsShowHelp} id={helptextid} class="dialog-field-help" class:needsShowHelp class:expanded={showhelp} on:click={() => { if (needsShowHelp) showhelp = !showhelp }}>
|
|
41
|
+
<span bind:this={helpelement}>{helptext}</span>
|
|
42
|
+
{#if needsShowHelp}
|
|
43
|
+
<button type="button" class="dialog-field-help-expand">Show {#if showhelp}Less{:else}More{/if}<ScreenReaderOnly>, ignore this, the help text it controls will be read to you as input description</ScreenReaderOnly></button>
|
|
44
|
+
{/if}
|
|
45
|
+
</div>
|
|
33
46
|
{/if}
|
|
34
47
|
<slot {messagesid} helptextid={descids} />
|
|
35
48
|
</div>
|
|
@@ -115,11 +128,33 @@ let showhelp = false;
|
|
|
115
128
|
overflow: hidden;
|
|
116
129
|
text-overflow: ellipsis;
|
|
117
130
|
white-space: nowrap;
|
|
118
|
-
cursor: help;
|
|
119
131
|
}
|
|
120
132
|
.dialog-field-help.expanded {
|
|
121
133
|
white-space: normal;
|
|
122
134
|
max-height: fit-content;
|
|
123
135
|
}
|
|
136
|
+
.dialog-field-help.needsShowHelp {
|
|
137
|
+
padding-right: 6em;
|
|
138
|
+
cursor: help;
|
|
139
|
+
}
|
|
140
|
+
.dialog-field-help.expanded {
|
|
141
|
+
padding-right: 0;
|
|
142
|
+
}
|
|
143
|
+
.dialog-field-help:not(.expanded) .dialog-field-help-expand {
|
|
144
|
+
position: absolute;
|
|
145
|
+
top: 0;
|
|
146
|
+
right: 0.5em;
|
|
147
|
+
}
|
|
148
|
+
.dialog-field-help-expand {
|
|
149
|
+
background: none!important;
|
|
150
|
+
border: none;
|
|
151
|
+
padding: 0!important;
|
|
152
|
+
color: #069;
|
|
153
|
+
text-decoration: underline;
|
|
154
|
+
cursor: pointer;
|
|
155
|
+
}
|
|
156
|
+
.dialog-field-help-expand:hover {
|
|
157
|
+
text-decoration: none;
|
|
158
|
+
}
|
|
124
159
|
|
|
125
160
|
</style>
|
|
@@ -91,28 +91,19 @@ onMount(async () => {
|
|
|
91
91
|
<Tabs bind:store={tabStore} tabs={$sources.map(s => ({ name: s.name, title: s.label ?? s.name }))} />
|
|
92
92
|
{/if}
|
|
93
93
|
</header>
|
|
94
|
-
<
|
|
95
|
-
|
|
96
|
-
{
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
{
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
<div class="folder-info">
|
|
108
|
-
<dt>Contents:</dt>
|
|
109
|
-
<dd>{$selected?.children?.length ?? 0} sub-items</dd>
|
|
110
|
-
</div>
|
|
111
|
-
{/if}
|
|
112
|
-
</Details>
|
|
113
|
-
{/if}
|
|
114
|
-
</section>
|
|
115
|
-
</div>
|
|
94
|
+
<section class="dialog-chooser-chooser">
|
|
95
|
+
{#if $store.initialized}
|
|
96
|
+
<Tree headers={[
|
|
97
|
+
{ label: 'Path', id: 'name', grow: 4, icon: item => item.type === 'asset' ? iconForMime(item.mime) : (item.type === 'folder' ? (item.open ? folderNotchOpen : folderIcon) : applicationOutline), get: 'name' }
|
|
98
|
+
]} singleSelect store={treeStore} on:deselect={onDeselect} on:choose={onChoose} />
|
|
99
|
+
{/if}
|
|
100
|
+
</section>
|
|
101
|
+
<section class="dialog-chooser-preview" tabindex="-1">
|
|
102
|
+
{#if $preview}
|
|
103
|
+
<Thumbnail item={$preview} larger />
|
|
104
|
+
<Details item={$preview} />
|
|
105
|
+
{/if}
|
|
106
|
+
</section>
|
|
116
107
|
</section>
|
|
117
108
|
</Dialog>
|
|
118
109
|
|
|
@@ -120,6 +111,7 @@ onMount(async () => {
|
|
|
120
111
|
.dialog-chooser-window {
|
|
121
112
|
position: relative;
|
|
122
113
|
height: 80vh;
|
|
114
|
+
display: flex;
|
|
123
115
|
flex-wrap: wrap;
|
|
124
116
|
align-items: stretch;
|
|
125
117
|
justify-content: flex-end;
|
|
@@ -128,10 +120,6 @@ onMount(async () => {
|
|
|
128
120
|
.dialog-chooser-window * {
|
|
129
121
|
box-sizing: border-box;
|
|
130
122
|
}
|
|
131
|
-
|
|
132
|
-
.dialog-chooser-body {
|
|
133
|
-
display: flex;
|
|
134
|
-
}
|
|
135
123
|
.dialog-chooser-chooser {
|
|
136
124
|
position: relative;
|
|
137
125
|
width: 75%;
|
|
@@ -148,12 +136,6 @@ onMount(async () => {
|
|
|
148
136
|
padding: 1em;
|
|
149
137
|
overflow-y: auto;
|
|
150
138
|
}
|
|
151
|
-
.folder-info dt {
|
|
152
|
-
font-weight: bold;
|
|
153
|
-
}
|
|
154
|
-
.folder-info dd {
|
|
155
|
-
margin: 0;
|
|
156
|
-
}
|
|
157
139
|
header {
|
|
158
140
|
position: relative;
|
|
159
141
|
width: 100%;
|
|
@@ -18,7 +18,7 @@ export interface IAssetStore {
|
|
|
18
18
|
activetype: ChooserType;
|
|
19
19
|
activesource: number;
|
|
20
20
|
initialized: boolean;
|
|
21
|
-
preview?:
|
|
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<
|
|
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?:
|
|
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
|
-
|
|
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 }));
|
|
@@ -15,7 +15,7 @@ export let item;
|
|
|
15
15
|
</div>
|
|
16
16
|
{/if}
|
|
17
17
|
{#if item.type === 'asset'}
|
|
18
|
-
<div class="
|
|
18
|
+
<div class="horizontal-group">
|
|
19
19
|
{#if item.image}
|
|
20
20
|
<div>
|
|
21
21
|
<dt>Dimensions:</dt>
|
|
@@ -32,14 +32,18 @@ export let item;
|
|
|
32
32
|
</div>
|
|
33
33
|
</div>
|
|
34
34
|
{:else if item.type === 'page' && item.title}
|
|
35
|
-
<
|
|
36
|
-
|
|
37
|
-
<dd>{item.title}</dd>
|
|
38
|
-
</div>
|
|
35
|
+
<dt>Title:</dt>
|
|
36
|
+
<dd>{item.title}</dd>
|
|
39
37
|
{:else if item.type === 'folder'}
|
|
40
|
-
<div>
|
|
41
|
-
<
|
|
42
|
-
|
|
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>
|
|
43
47
|
</div>
|
|
44
48
|
{/if}
|
|
45
49
|
<slot />
|
|
@@ -60,14 +64,14 @@ export let item;
|
|
|
60
64
|
.top-row {
|
|
61
65
|
margin-bottom: 1em;
|
|
62
66
|
}
|
|
63
|
-
.
|
|
67
|
+
.horizontal-group {
|
|
64
68
|
display: flex;
|
|
65
69
|
justify-content: space-between;
|
|
66
70
|
}
|
|
67
|
-
:global([data-eq~="1400px"]) .
|
|
71
|
+
:global([data-eq~="1400px"]) .horizontal-group {
|
|
68
72
|
flex-direction: column;
|
|
69
73
|
}
|
|
70
|
-
:global([data-eq~="1400px"]) .
|
|
74
|
+
:global([data-eq~="1400px"]) .horizontal-group div:not(:last-child){
|
|
71
75
|
margin-bottom: 1em;
|
|
72
76
|
}
|
|
73
77
|
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
|
-
import type
|
|
3
|
-
import { type RawURL } from './ChooserStore';
|
|
2
|
+
import { type AnyUIItem, type RawURL } from './ChooserStore';
|
|
4
3
|
declare const __propDef: {
|
|
5
4
|
props: {
|
|
6
|
-
item:
|
|
5
|
+
item: AnyUIItem | RawURL;
|
|
7
6
|
};
|
|
8
7
|
events: {
|
|
9
8
|
[evt: string]: CustomEvent<any>;
|
package/dist/tree/Tree.svelte
CHANGED
|
@@ -101,11 +101,10 @@ onMount(async () => {
|
|
|
101
101
|
// need to wait long enough for headers to redraw before trying to mount the rows
|
|
102
102
|
await new Promise(resolve => requestAnimationFrame(resolve));
|
|
103
103
|
mounted = true;
|
|
104
|
-
|
|
105
|
-
if ($store.focused?.id && $store.focused.id === saveFocusId)
|
|
106
|
-
const el = document.getElementById(getHashId($store.focused.id));
|
|
104
|
+
const el = saveFocusId ? document.getElementById(getHashId(saveFocusId)) : undefined;
|
|
105
|
+
if ($store.focused?.id && $store.focused.id === saveFocusId)
|
|
107
106
|
el?.scrollIntoView({ block: 'center' });
|
|
108
|
-
|
|
107
|
+
await store.refresh();
|
|
109
108
|
});
|
|
110
109
|
onDestroy(() => {
|
|
111
110
|
if (typeof document !== 'undefined')
|
package/package.json
CHANGED