@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.
- package/Button.svelte +77 -0
- package/Button.svelte.d.ts +30 -0
- package/ButtonGroup.svelte.d.ts +3 -3
- package/Checkbox.svelte +2 -1
- package/Checkbox.svelte.d.ts +4 -3
- package/Container.svelte +18 -19
- package/Container.svelte.d.ts +5 -3
- package/Dialog.svelte +155 -0
- package/Dialog.svelte.d.ts +50 -0
- package/FieldAutocomplete.svelte +4 -7
- package/FieldAutocomplete.svelte.d.ts +4 -4
- package/FieldCheckbox.svelte +3 -2
- package/FieldCheckbox.svelte.d.ts +5 -4
- package/FieldChoices.svelte +3 -2
- package/FieldChoices.svelte.d.ts +4 -3
- package/FieldChooserLink.svelte +17 -13
- package/FieldChooserLink.svelte.d.ts +4 -5
- package/FieldDate.svelte +3 -2
- package/FieldDate.svelte.d.ts +4 -3
- package/FieldDateTime.svelte +3 -2
- package/FieldDateTime.svelte.d.ts +4 -3
- package/FieldDualListbox.svelte.d.ts +3 -3
- package/FieldHidden.svelte.d.ts +3 -3
- package/FieldIdentifier.svelte.d.ts +3 -3
- package/FieldMultiple.svelte +14 -7
- package/FieldMultiple.svelte.d.ts +6 -3
- package/FieldMultiselect.svelte +29 -22
- package/FieldMultiselect.svelte.d.ts +3 -3
- package/FieldNumber.svelte +3 -2
- package/FieldNumber.svelte.d.ts +4 -3
- package/FieldRadio.svelte +9 -4
- package/FieldRadio.svelte.d.ts +9 -3
- package/FieldSelect.svelte +9 -3
- package/FieldSelect.svelte.d.ts +9 -3
- package/FieldStandard.svelte +8 -3
- package/FieldStandard.svelte.d.ts +9 -3
- package/FieldText.svelte +3 -2
- package/FieldText.svelte.d.ts +4 -3
- package/FieldTextArea.svelte +5 -3
- package/FieldTextArea.svelte.d.ts +4 -3
- package/FileIcon.svelte.d.ts +3 -3
- package/Form.svelte +3 -3
- package/Form.svelte.d.ts +3 -3
- package/FormDialog.svelte +34 -0
- package/FormDialog.svelte.d.ts +38 -0
- package/Icon.svelte.d.ts +3 -3
- package/InlineMessage.svelte.d.ts +3 -3
- package/InlineMessages.svelte.d.ts +3 -3
- package/Input.svelte +4 -1
- package/Input.svelte.d.ts +4 -3
- package/Listbox.svelte.d.ts +3 -3
- package/Radio.svelte +5 -2
- package/Radio.svelte.d.ts +4 -3
- package/Tab.svelte +3 -2
- package/Tab.svelte.d.ts +3 -3
- package/TabStore.d.ts +11 -1
- package/TabStore.js +30 -3
- package/Tabs.svelte +66 -18
- package/Tabs.svelte.d.ts +5 -7
- package/chooser/Chooser.svelte +76 -99
- package/chooser/Chooser.svelte.d.ts +5 -5
- package/chooser/ChooserAPI.d.ts +10 -3
- package/chooser/ChooserStore.d.ts +15 -33
- package/chooser/ChooserStore.js +32 -149
- package/chooser/Details.svelte.d.ts +6 -5
- package/chooser/Thumbnail.svelte +9 -2
- package/chooser/Thumbnail.svelte.d.ts +6 -5
- package/colorpicker/FieldColorPicker.svelte +78 -24
- package/colorpicker/FieldColorPicker.svelte.d.ts +5 -6
- package/fileIcons.d.ts +2 -1
- package/helpers.d.ts +1 -0
- package/helpers.js +5 -0
- package/iconpicker/FieldIconPicker.svelte +4 -2
- package/iconpicker/FieldIconPicker.svelte.d.ts +4 -3
- package/index.d.ts +7 -0
- package/index.js +7 -0
- package/package.json +20 -13
- package/tree/LoadIcon.svelte +24 -0
- package/tree/LoadIcon.svelte.d.ts +23 -0
- package/tree/Tree.svelte +203 -0
- package/tree/Tree.svelte.d.ts +28 -0
- package/tree/TreeCell.svelte +18 -0
- package/tree/TreeCell.svelte.d.ts +18 -0
- package/tree/TreeNode.svelte +418 -0
- package/tree/TreeNode.svelte.d.ts +30 -0
- package/tree/index.d.ts +3 -0
- package/tree/index.js +3 -0
- package/tree/treestore.d.ts +117 -0
- package/tree/treestore.js +336 -0
- package/chooser/Asset.svelte +0 -83
- package/chooser/Asset.svelte.d.ts +0 -25
- package/chooser/AssetFolder.svelte +0 -127
- package/chooser/AssetFolder.svelte.d.ts +0 -25
- package/chooser/Page.svelte +0 -121
- package/chooser/Page.svelte.d.ts +0 -25
package/chooser/Thumbnail.svelte
CHANGED
|
@@ -25,12 +25,19 @@ export let item;
|
|
|
25
25
|
width: 100%;
|
|
26
26
|
padding-top: 75%;
|
|
27
27
|
}
|
|
28
|
-
img {
|
|
28
|
+
.dialog-chooser-thumbnail img {
|
|
29
29
|
width: 100%;
|
|
30
30
|
height: 100%;
|
|
31
31
|
object-fit: scale-down;
|
|
32
32
|
}
|
|
33
|
-
.dialog-chooser-thumbnail
|
|
33
|
+
.dialog-chooser-thumbnail :global(svg) {
|
|
34
|
+
width: 60%;
|
|
35
|
+
height: 60%;
|
|
36
|
+
min-width: 4.5em;
|
|
37
|
+
min-height: 4.5em;
|
|
38
|
+
object-fit: scale-down;
|
|
39
|
+
}
|
|
40
|
+
.dialog-chooser-thumbnail > :global(*) {
|
|
34
41
|
display: block;
|
|
35
42
|
position: absolute;
|
|
36
43
|
top: 50%;
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
|
-
import type {
|
|
2
|
+
import type { AnyItem } from './ChooserAPI';
|
|
3
|
+
import type { RawURL } from './ChooserStore';
|
|
3
4
|
declare const __propDef: {
|
|
4
5
|
props: {
|
|
5
|
-
item:
|
|
6
|
+
item: AnyItem | RawURL;
|
|
6
7
|
};
|
|
7
8
|
events: {
|
|
8
9
|
[evt: string]: CustomEvent<any>;
|
|
9
10
|
};
|
|
10
11
|
slots: {};
|
|
11
12
|
};
|
|
12
|
-
export
|
|
13
|
-
export
|
|
14
|
-
export
|
|
13
|
+
export type ThumbnailProps = typeof __propDef.props;
|
|
14
|
+
export type ThumbnailEvents = typeof __propDef.events;
|
|
15
|
+
export type ThumbnailSlots = typeof __propDef.slots;
|
|
15
16
|
export default class Thumbnail extends SvelteComponentTyped<ThumbnailProps, ThumbnailEvents, ThumbnailSlots> {
|
|
16
17
|
}
|
|
17
18
|
export {};
|
|
@@ -1,43 +1,97 @@
|
|
|
1
1
|
<script>import FieldStandard from '../FieldStandard.svelte';
|
|
2
|
-
import {
|
|
2
|
+
import { getDescribedBy, Radio } from '..';
|
|
3
|
+
import { randomid } from 'txstate-utils';
|
|
3
4
|
export let id = undefined;
|
|
4
5
|
let className = '';
|
|
5
6
|
export { className as class };
|
|
6
7
|
export let path;
|
|
7
8
|
export let options;
|
|
9
|
+
export let addAllOption = false;
|
|
8
10
|
export let label = '';
|
|
9
11
|
export let required = false;
|
|
10
|
-
export let disabled = false;
|
|
11
12
|
export let notNull = false;
|
|
12
|
-
export let defaultValue = notNull ? options[0].value : undefined;
|
|
13
|
+
export let defaultValue = notNull ? (addAllOption ? 'alternating' : options[0].value) : undefined;
|
|
13
14
|
export let conditional = undefined;
|
|
14
|
-
export let
|
|
15
|
-
|
|
16
|
-
const colorsByValue = keyby(options, 'value');
|
|
15
|
+
export let helptext = undefined;
|
|
16
|
+
const groupid = randomid();
|
|
17
17
|
</script>
|
|
18
18
|
|
|
19
|
-
<FieldStandard bind:id {path} {label} {required} {defaultValue} {conditional}
|
|
20
|
-
<div class="
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
19
|
+
<FieldStandard bind:id descid={groupid} {path} {label} {required} {defaultValue} {conditional} {helptext} let:value let:valid let:invalid let:onBlur let:onChange let:messagesid let:helptextid>
|
|
20
|
+
<div class="color-container {className}" role="radiogroup" aria-labelledby={groupid} class:invalid class:valid>
|
|
21
|
+
{#if addAllOption}
|
|
22
|
+
<label for={`${path}.alt`} class="colorsel alternating">
|
|
23
|
+
<Radio id={`${path}.alt`} name={path} value="alternating" selected={value === 'alternating'} {onChange} {onBlur} {helptextid}/>
|
|
24
|
+
<span class="alternating-bg">
|
|
25
|
+
{#each options as option}
|
|
26
|
+
<span style={`background-color: ${option.color}`}></span>
|
|
27
|
+
{/each}
|
|
28
|
+
</span>
|
|
29
|
+
<span class="alternating-text">Alternating</span>
|
|
30
|
+
</label>
|
|
31
|
+
{/if}
|
|
32
|
+
{#each options as option, idx (option.value) }
|
|
33
|
+
{@const radioid = `${path}.${idx}`}
|
|
34
|
+
<label for={radioid} class="colorsel">
|
|
35
|
+
<Radio id={radioid} name={path} value={option.value} selected={value === option.value} {onChange} {onBlur} {helptextid}/>
|
|
36
|
+
<span style={`background-color: ${option.color}`}>{option.name || option.value}</span>
|
|
37
|
+
</label>
|
|
38
|
+
{/each}
|
|
28
39
|
</div>
|
|
29
40
|
</FieldStandard>
|
|
30
41
|
|
|
31
42
|
<style>
|
|
32
|
-
.
|
|
43
|
+
.color-container {
|
|
44
|
+
display: grid;
|
|
45
|
+
grid-gap: 10px;
|
|
46
|
+
grid-template-columns: 1fr 1fr 1fr;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
label.colorsel :global(input[type="radio"]) {
|
|
50
|
+
border: 0;
|
|
51
|
+
clip: rect(0 0 0 0);
|
|
52
|
+
height: 1px;
|
|
53
|
+
margin: -1px;
|
|
54
|
+
overflow: hidden;
|
|
55
|
+
padding: 0;
|
|
56
|
+
position: absolute;
|
|
57
|
+
width: 1px;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
label.colorsel :global(input[type="radio"] + span) {
|
|
61
|
+
display: inline-block;
|
|
62
|
+
font-weight: bold;
|
|
63
|
+
padding: 1rem;
|
|
64
|
+
width: 100%;
|
|
65
|
+
text-align: center;
|
|
66
|
+
white-space: nowrap;
|
|
67
|
+
border: 1px solid #D1D1D1;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
label.colorsel :global(input[type="radio"]:checked + span) {
|
|
71
|
+
outline: 5px solid #93BBC4;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
label.colorsel.alternating {
|
|
75
|
+
position: relative;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
label.colorsel.alternating span.alternating-bg {
|
|
33
79
|
display: flex;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
80
|
+
padding: 0;
|
|
81
|
+
height: 100%;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
label.colorsel.alternating span.alternating-bg span {
|
|
85
|
+
width: 100%;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
label.colorsel.alternating span.alternating-text {
|
|
89
|
+
position: absolute;
|
|
90
|
+
left: 50%;
|
|
91
|
+
top: 50%;
|
|
92
|
+
transform: translate(-50%, -50%);
|
|
93
|
+
font-weight: bold;
|
|
94
|
+
color: white;
|
|
95
|
+
text-shadow: 1px 1px 0 #222, 1px -1px 0 #222, -1px 1px 0 #222, -1px -1px 0 #222;
|
|
42
96
|
}
|
|
43
97
|
</style>
|
|
@@ -6,23 +6,22 @@ declare const __propDef: {
|
|
|
6
6
|
class?: string;
|
|
7
7
|
path: string;
|
|
8
8
|
options: ColorPickerOption[];
|
|
9
|
+
addAllOption?: boolean;
|
|
9
10
|
label?: string;
|
|
10
11
|
required?: boolean;
|
|
11
|
-
disabled?: boolean;
|
|
12
12
|
notNull?: boolean;
|
|
13
13
|
defaultValue?: any;
|
|
14
14
|
conditional?: boolean | undefined;
|
|
15
|
-
|
|
16
|
-
inputelement?: HTMLSelectElement;
|
|
15
|
+
helptext?: string | undefined;
|
|
17
16
|
};
|
|
18
17
|
events: {
|
|
19
18
|
[evt: string]: CustomEvent<any>;
|
|
20
19
|
};
|
|
21
20
|
slots: {};
|
|
22
21
|
};
|
|
23
|
-
export
|
|
24
|
-
export
|
|
25
|
-
export
|
|
22
|
+
export type FieldColorPickerProps = typeof __propDef.props;
|
|
23
|
+
export type FieldColorPickerEvents = typeof __propDef.events;
|
|
24
|
+
export type FieldColorPickerSlots = typeof __propDef.slots;
|
|
26
25
|
export default class FieldColorPicker extends SvelteComponentTyped<FieldColorPickerProps, FieldColorPickerEvents, FieldColorPickerSlots> {
|
|
27
26
|
}
|
|
28
27
|
export {};
|
package/fileIcons.d.ts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import type { IconifyIcon } from '@iconify/svelte';
|
|
2
|
+
export declare function iconForMime(mime: string): IconifyIcon;
|
package/helpers.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getDescribedBy(ids: string[]): string;
|
package/helpers.js
ADDED
|
@@ -3,12 +3,14 @@ import { ScreenReaderOnly, Modal, modifierKey } from '@txstate-mws/svelte-compon
|
|
|
3
3
|
import { FontAwesomeIcons, IconCategories } from './iconpicker';
|
|
4
4
|
import Icon from '@iconify/svelte';
|
|
5
5
|
import { randomid, keyby } from 'txstate-utils';
|
|
6
|
+
import { getDescribedBy } from '../helpers';
|
|
6
7
|
export let id = undefined;
|
|
7
8
|
export let path;
|
|
8
9
|
export let label = '';
|
|
9
10
|
export let required = false;
|
|
10
11
|
export let defaultValue = { icon: 'fa-graduation-cap', prefix: 'fas' };
|
|
11
12
|
export let conditional = undefined;
|
|
13
|
+
export let helptext = undefined;
|
|
12
14
|
const labelid = randomid();
|
|
13
15
|
const descid = randomid();
|
|
14
16
|
let modalOpen = false;
|
|
@@ -101,9 +103,9 @@ function onKeyDown(e) {
|
|
|
101
103
|
}
|
|
102
104
|
</script>
|
|
103
105
|
|
|
104
|
-
<FieldStandard bind:id {path} {label} {required} {defaultValue} {conditional} let:value let:valid let:invalid let:id let:onBlur let:setVal>
|
|
106
|
+
<FieldStandard bind:id {path} {descid} {label} {required} {defaultValue} {conditional} {helptext} let:value let:valid let:invalid let:id let:onBlur let:setVal let:messagesid let:helptextid>
|
|
105
107
|
<Icon icon={`${value.prefix === 'fab' ? 'fa-brands' : 'fa-solid'}:${value.icon.slice(3)}`}/>
|
|
106
|
-
<button id="btnSelectIcon" on:click={() => { modalOpen = true }}>Select New Icon</button>
|
|
108
|
+
<button id="btnSelectIcon" on:click={() => { modalOpen = true }} aria-describedby={getDescribedBy([descid, messagesid, helptextid])}>Select New Icon</button>
|
|
107
109
|
{#if modalOpen}
|
|
108
110
|
<Modal>
|
|
109
111
|
<section>
|
|
@@ -10,15 +10,16 @@ declare const __propDef: {
|
|
|
10
10
|
prefix: string;
|
|
11
11
|
};
|
|
12
12
|
conditional?: boolean | undefined;
|
|
13
|
+
helptext?: string | undefined;
|
|
13
14
|
};
|
|
14
15
|
events: {
|
|
15
16
|
[evt: string]: CustomEvent<any>;
|
|
16
17
|
};
|
|
17
18
|
slots: {};
|
|
18
19
|
};
|
|
19
|
-
export
|
|
20
|
-
export
|
|
21
|
-
export
|
|
20
|
+
export type FieldIconPickerProps = typeof __propDef.props;
|
|
21
|
+
export type FieldIconPickerEvents = typeof __propDef.events;
|
|
22
|
+
export type FieldIconPickerSlots = typeof __propDef.slots;
|
|
22
23
|
export default class FieldIconPicker extends SvelteComponentTyped<FieldIconPickerProps, FieldIconPickerEvents, FieldIconPickerSlots> {
|
|
23
24
|
}
|
|
24
25
|
export {};
|
package/index.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
export { default as Button } from './Button.svelte';
|
|
2
|
+
export { default as ButtonGroup } from './ButtonGroup.svelte';
|
|
1
3
|
export { default as Checkbox } from './Checkbox.svelte';
|
|
2
4
|
export { default as Container } from './Container.svelte';
|
|
5
|
+
export { default as Dialog } from './Dialog.svelte';
|
|
3
6
|
export { default as FieldAutocomplete } from './FieldAutocomplete.svelte';
|
|
4
7
|
export { default as FieldCheckbox } from './FieldCheckbox.svelte';
|
|
5
8
|
export { default as FieldChoices } from './FieldChoices.svelte';
|
|
@@ -8,6 +11,7 @@ export { default as FieldDate } from './FieldDate.svelte';
|
|
|
8
11
|
export { default as FieldDateTime } from './FieldDateTime.svelte';
|
|
9
12
|
export { default as FieldDualListbox } from './FieldDualListbox.svelte';
|
|
10
13
|
export { default as FieldHidden } from './FieldHidden.svelte';
|
|
14
|
+
export { default as FieldIdentifier } from './FieldIdentifier.svelte';
|
|
11
15
|
export { default as FieldMultiple } from './FieldMultiple.svelte';
|
|
12
16
|
export { default as FieldMultiselect } from './FieldMultiselect.svelte';
|
|
13
17
|
export { default as FieldNumber } from './FieldNumber.svelte';
|
|
@@ -18,6 +22,7 @@ export { default as FieldText } from './FieldText.svelte';
|
|
|
18
22
|
export { default as FieldTextArea } from './FieldTextArea.svelte';
|
|
19
23
|
export { default as FileIcon } from './FileIcon.svelte';
|
|
20
24
|
export { default as Form } from './Form.svelte';
|
|
25
|
+
export { default as FormDialog } from './FormDialog.svelte';
|
|
21
26
|
export { default as Icon } from './Icon.svelte';
|
|
22
27
|
export { default as InlineMessage } from './InlineMessage.svelte';
|
|
23
28
|
export { default as InlineMessages } from './InlineMessages.svelte';
|
|
@@ -31,3 +36,5 @@ export * from './fileIcons.js';
|
|
|
31
36
|
export * from './TabStore.js';
|
|
32
37
|
export * from './iconpicker/index.js';
|
|
33
38
|
export * from './colorpicker/index.js';
|
|
39
|
+
export * from './helpers.js';
|
|
40
|
+
export * from './tree/index.js';
|
package/index.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
export { default as Button } from './Button.svelte';
|
|
2
|
+
export { default as ButtonGroup } from './ButtonGroup.svelte';
|
|
1
3
|
export { default as Checkbox } from './Checkbox.svelte';
|
|
2
4
|
export { default as Container } from './Container.svelte';
|
|
5
|
+
export { default as Dialog } from './Dialog.svelte';
|
|
3
6
|
export { default as FieldAutocomplete } from './FieldAutocomplete.svelte';
|
|
4
7
|
export { default as FieldCheckbox } from './FieldCheckbox.svelte';
|
|
5
8
|
export { default as FieldChoices } from './FieldChoices.svelte';
|
|
@@ -8,6 +11,7 @@ export { default as FieldDate } from './FieldDate.svelte';
|
|
|
8
11
|
export { default as FieldDateTime } from './FieldDateTime.svelte';
|
|
9
12
|
export { default as FieldDualListbox } from './FieldDualListbox.svelte';
|
|
10
13
|
export { default as FieldHidden } from './FieldHidden.svelte';
|
|
14
|
+
export { default as FieldIdentifier } from './FieldIdentifier.svelte';
|
|
11
15
|
export { default as FieldMultiple } from './FieldMultiple.svelte';
|
|
12
16
|
export { default as FieldMultiselect } from './FieldMultiselect.svelte';
|
|
13
17
|
export { default as FieldNumber } from './FieldNumber.svelte';
|
|
@@ -18,6 +22,7 @@ export { default as FieldText } from './FieldText.svelte';
|
|
|
18
22
|
export { default as FieldTextArea } from './FieldTextArea.svelte';
|
|
19
23
|
export { default as FileIcon } from './FileIcon.svelte';
|
|
20
24
|
export { default as Form } from './Form.svelte';
|
|
25
|
+
export { default as FormDialog } from './FormDialog.svelte';
|
|
21
26
|
export { default as Icon } from './Icon.svelte';
|
|
22
27
|
export { default as InlineMessage } from './InlineMessage.svelte';
|
|
23
28
|
export { default as InlineMessages } from './InlineMessages.svelte';
|
|
@@ -31,3 +36,5 @@ export * from './fileIcons.js';
|
|
|
31
36
|
export * from './TabStore.js';
|
|
32
37
|
export * from './iconpicker/index.js';
|
|
33
38
|
export * from './colorpicker/index.js';
|
|
39
|
+
export * from './helpers.js';
|
|
40
|
+
export * from './tree/index.js';
|
package/package.json
CHANGED
|
@@ -1,34 +1,36 @@
|
|
|
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.
|
|
4
|
+
"version": "0.0.21",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@txstate-mws/svelte-components": "^1.3.
|
|
7
|
-
"@txstate-mws/svelte-forms": "
|
|
8
|
-
"@iconify/svelte": "^
|
|
6
|
+
"@txstate-mws/svelte-components": "^1.3.5",
|
|
7
|
+
"@txstate-mws/svelte-forms": "^1.1.2",
|
|
8
|
+
"@iconify/svelte": "^3.0.0",
|
|
9
9
|
"@iconify-icons/mdi": "^1.2.22",
|
|
10
10
|
"@iconify-icons/ph": "^1.2.2",
|
|
11
|
-
"txstate-utils": "^1.7.
|
|
11
|
+
"txstate-utils": "^1.7.12"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {
|
|
14
14
|
"@sveltejs/adapter-auto": "next",
|
|
15
15
|
"@sveltejs/kit": "next",
|
|
16
|
-
"@sveltejs/package": "next",
|
|
17
|
-
"eslint-config-standard-with-typescript": "^
|
|
18
|
-
"eslint-plugin-svelte3": "^
|
|
16
|
+
"@sveltejs/package": "^1.0.0-next.5",
|
|
17
|
+
"eslint-config-standard-with-typescript": "^23.0.0",
|
|
18
|
+
"eslint-plugin-svelte3": "^4.0.0",
|
|
19
19
|
"svelte": "^3.44.0",
|
|
20
20
|
"svelte-check": "^2.2.6",
|
|
21
21
|
"svelte-preprocess": "^4.9.4",
|
|
22
|
-
"svelte2tsx": "^0.
|
|
22
|
+
"svelte2tsx": "^0.5.20",
|
|
23
23
|
"tslib": "^2.3.1",
|
|
24
24
|
"typescript": "^4.4.3"
|
|
25
25
|
},
|
|
26
26
|
"type": "module",
|
|
27
27
|
"exports": {
|
|
28
28
|
"./package.json": "./package.json",
|
|
29
|
+
"./Button.svelte": "./Button.svelte",
|
|
29
30
|
"./ButtonGroup.svelte": "./ButtonGroup.svelte",
|
|
30
31
|
"./Checkbox.svelte": "./Checkbox.svelte",
|
|
31
32
|
"./Container.svelte": "./Container.svelte",
|
|
33
|
+
"./Dialog.svelte": "./Dialog.svelte",
|
|
32
34
|
"./FieldAutocomplete.svelte": "./FieldAutocomplete.svelte",
|
|
33
35
|
"./FieldCheckbox.svelte": "./FieldCheckbox.svelte",
|
|
34
36
|
"./FieldChoices.svelte": "./FieldChoices.svelte",
|
|
@@ -48,6 +50,7 @@
|
|
|
48
50
|
"./FieldTextArea.svelte": "./FieldTextArea.svelte",
|
|
49
51
|
"./FileIcon.svelte": "./FileIcon.svelte",
|
|
50
52
|
"./Form.svelte": "./Form.svelte",
|
|
53
|
+
"./FormDialog.svelte": "./FormDialog.svelte",
|
|
51
54
|
"./Icon.svelte": "./Icon.svelte",
|
|
52
55
|
"./InlineMessage.svelte": "./InlineMessage.svelte",
|
|
53
56
|
"./InlineMessages.svelte": "./InlineMessages.svelte",
|
|
@@ -57,23 +60,27 @@
|
|
|
57
60
|
"./Tab.svelte": "./Tab.svelte",
|
|
58
61
|
"./TabStore": "./TabStore.js",
|
|
59
62
|
"./Tabs.svelte": "./Tabs.svelte",
|
|
60
|
-
"./chooser/Asset.svelte": "./chooser/Asset.svelte",
|
|
61
|
-
"./chooser/AssetFolder.svelte": "./chooser/AssetFolder.svelte",
|
|
62
63
|
"./chooser/Chooser.svelte": "./chooser/Chooser.svelte",
|
|
63
64
|
"./chooser/ChooserAPI": "./chooser/ChooserAPI.js",
|
|
64
65
|
"./chooser/ChooserStore": "./chooser/ChooserStore.js",
|
|
65
66
|
"./chooser/Details.svelte": "./chooser/Details.svelte",
|
|
66
|
-
"./chooser/Page.svelte": "./chooser/Page.svelte",
|
|
67
67
|
"./chooser/Thumbnail.svelte": "./chooser/Thumbnail.svelte",
|
|
68
68
|
"./chooser": "./chooser/index.js",
|
|
69
69
|
"./colorpicker/FieldColorPicker.svelte": "./colorpicker/FieldColorPicker.svelte",
|
|
70
70
|
"./colorpicker/colorpicker": "./colorpicker/colorpicker.js",
|
|
71
71
|
"./colorpicker": "./colorpicker/index.js",
|
|
72
72
|
"./fileIcons": "./fileIcons.js",
|
|
73
|
+
"./helpers": "./helpers.js",
|
|
73
74
|
"./iconpicker/FieldIconPicker.svelte": "./iconpicker/FieldIconPicker.svelte",
|
|
74
75
|
"./iconpicker/iconpicker": "./iconpicker/iconpicker.js",
|
|
75
76
|
"./iconpicker": "./iconpicker/index.js",
|
|
76
|
-
".": "./index.js"
|
|
77
|
+
".": "./index.js",
|
|
78
|
+
"./tree/LoadIcon.svelte": "./tree/LoadIcon.svelte",
|
|
79
|
+
"./tree/Tree.svelte": "./tree/Tree.svelte",
|
|
80
|
+
"./tree/TreeCell.svelte": "./tree/TreeCell.svelte",
|
|
81
|
+
"./tree/TreeNode.svelte": "./tree/TreeNode.svelte",
|
|
82
|
+
"./tree": "./tree/index.js",
|
|
83
|
+
"./tree/treestore": "./tree/treestore.js"
|
|
77
84
|
},
|
|
78
85
|
"svelte": "./index.js"
|
|
79
86
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
export let size = '1em'
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<i aria-hidden="true" style:width={size} style:padding-top={size}></i>
|
|
6
|
+
|
|
7
|
+
<style>
|
|
8
|
+
i {
|
|
9
|
+
display: inline-block;
|
|
10
|
+
box-sizing: content-box;
|
|
11
|
+
border-color: var(--loadicon-bg-color, #FFFFFF);
|
|
12
|
+
border-top-color: var(--loadicon-moving-color, #333333);
|
|
13
|
+
border-style: solid;
|
|
14
|
+
border-radius: 50%;
|
|
15
|
+
animation: spin 2s linear infinite;
|
|
16
|
+
margin-left: 0.3em;
|
|
17
|
+
vertical-align: middle;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@keyframes spin {
|
|
21
|
+
0% { transform: rotate(0deg); }
|
|
22
|
+
100% { transform: rotate(360deg); }
|
|
23
|
+
}
|
|
24
|
+
</style>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** @typedef {typeof __propDef.props} LoadIconProps */
|
|
2
|
+
/** @typedef {typeof __propDef.events} LoadIconEvents */
|
|
3
|
+
/** @typedef {typeof __propDef.slots} LoadIconSlots */
|
|
4
|
+
export default class LoadIcon extends SvelteComponentTyped<{
|
|
5
|
+
size?: string;
|
|
6
|
+
}, {
|
|
7
|
+
[evt: string]: CustomEvent<any>;
|
|
8
|
+
}, {}> {
|
|
9
|
+
}
|
|
10
|
+
export type LoadIconProps = typeof __propDef.props;
|
|
11
|
+
export type LoadIconEvents = typeof __propDef.events;
|
|
12
|
+
export type LoadIconSlots = typeof __propDef.slots;
|
|
13
|
+
import { SvelteComponentTyped } from "svelte";
|
|
14
|
+
declare const __propDef: {
|
|
15
|
+
props: {
|
|
16
|
+
size?: string;
|
|
17
|
+
};
|
|
18
|
+
events: {
|
|
19
|
+
[evt: string]: CustomEvent<any>;
|
|
20
|
+
};
|
|
21
|
+
slots: {};
|
|
22
|
+
};
|
|
23
|
+
export {};
|
package/tree/Tree.svelte
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
<script>import { resize } from '@txstate-mws/svelte-components';
|
|
2
|
+
import { derivedStore, Store } from '@txstate-mws/svelte-store';
|
|
3
|
+
import { afterUpdate, beforeUpdate, onDestroy, onMount, setContext } from 'svelte';
|
|
4
|
+
import { hashid } from 'txstate-utils';
|
|
5
|
+
import TreeNode from './TreeNode.svelte';
|
|
6
|
+
import { TreeStore, TREE_STORE_CONTEXT } from './treestore';
|
|
7
|
+
export let headers;
|
|
8
|
+
export let nodeClass = undefined;
|
|
9
|
+
export let singleSelect = undefined;
|
|
10
|
+
export let enableResize = false;
|
|
11
|
+
export let fetchChildren = undefined;
|
|
12
|
+
export let dragEligible = undefined;
|
|
13
|
+
export let moveHandler = undefined;
|
|
14
|
+
export let copyHandler = undefined;
|
|
15
|
+
export let dropEffect = undefined;
|
|
16
|
+
export let store = new TreeStore(fetchChildren, { copyHandler, dragEligible, dropEffect, moveHandler });
|
|
17
|
+
setContext(TREE_STORE_CONTEXT, store);
|
|
18
|
+
const { rootItems, headerOverride } = store;
|
|
19
|
+
let checkboxelement;
|
|
20
|
+
const headerelements = [];
|
|
21
|
+
const treeWidth = new Store({});
|
|
22
|
+
function calcHeaderSizes() {
|
|
23
|
+
const headerSizes = [];
|
|
24
|
+
let totalFixed = checkboxelement?.offsetWidth ?? 0;
|
|
25
|
+
for (let i = 0; i < headers.length; i++) {
|
|
26
|
+
const header = headers[i];
|
|
27
|
+
if (header.fixed || $headerOverride[header.id]) {
|
|
28
|
+
headerSizes[i] = $headerOverride[header.id] ?? header.fixed;
|
|
29
|
+
totalFixed += headerelements[i]?.offsetWidth ?? 0;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const remainingWidth = ($treeWidth.clientWidth ?? 1024) - totalFixed;
|
|
33
|
+
const growHeaders = headers.filter((h, i) => !h.fixed && !$headerOverride[h.id] && headerelements[i]?.offsetWidth);
|
|
34
|
+
const totalGrowShares = growHeaders.reduce((sum, h) => sum + (h.grow ?? 1), 0);
|
|
35
|
+
for (let i = 0; i < headers.length; i++) {
|
|
36
|
+
const header = headers[i];
|
|
37
|
+
if (!header.fixed && !$headerOverride[header.id] && headerelements[i]?.offsetWidth) {
|
|
38
|
+
headerSizes[i] = `${remainingWidth * (header.grow ?? 1) / totalGrowShares}px`;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return headerSizes;
|
|
42
|
+
}
|
|
43
|
+
const headerSizes = derivedStore([headerOverride, treeWidth], calcHeaderSizes);
|
|
44
|
+
$: store.singleSelect = singleSelect;
|
|
45
|
+
function onDragEnd() {
|
|
46
|
+
store.update(v => ({ ...v, dragging: false }));
|
|
47
|
+
}
|
|
48
|
+
let dragheaderid;
|
|
49
|
+
let dragheaderidx;
|
|
50
|
+
let dragtarget;
|
|
51
|
+
let widthStart;
|
|
52
|
+
let mouseStart;
|
|
53
|
+
function headerDragStart(header, idx) {
|
|
54
|
+
return (e) => {
|
|
55
|
+
if (!enableResize)
|
|
56
|
+
return;
|
|
57
|
+
dragtarget = headerelements[idx];
|
|
58
|
+
if (!dragtarget.isConnected)
|
|
59
|
+
dragtarget = undefined;
|
|
60
|
+
else {
|
|
61
|
+
e.preventDefault();
|
|
62
|
+
dragheaderid = header.id;
|
|
63
|
+
dragheaderidx = idx;
|
|
64
|
+
widthStart = dragtarget.clientWidth;
|
|
65
|
+
mouseStart = e instanceof TouchEvent ? e.touches[0].screenX : e.screenX;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function headerDrag(e) {
|
|
70
|
+
if (e instanceof TouchEvent && e.touches.length > 1)
|
|
71
|
+
return;
|
|
72
|
+
if (dragheaderid && dragheaderidx != null && dragtarget?.isConnected) {
|
|
73
|
+
for (let i = 0; i < dragheaderidx; i++) {
|
|
74
|
+
store.setHeaderOverride(headers[i].id, $headerSizes[i]);
|
|
75
|
+
}
|
|
76
|
+
const screenX = e instanceof TouchEvent ? e.touches[0].screenX : e.screenX;
|
|
77
|
+
store.setHeaderOverride(dragheaderid, `${widthStart - (mouseStart - screenX)}px`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function headerDragEnd() {
|
|
81
|
+
dragtarget = undefined;
|
|
82
|
+
dragheaderid = undefined;
|
|
83
|
+
}
|
|
84
|
+
function headerDragReset() {
|
|
85
|
+
store.resetHeaderOverride();
|
|
86
|
+
}
|
|
87
|
+
let mounted = false;
|
|
88
|
+
onMount(async () => {
|
|
89
|
+
document.addEventListener('dragend', onDragEnd);
|
|
90
|
+
await store.refresh();
|
|
91
|
+
if ($store.focused?.id) {
|
|
92
|
+
const el = document.getElementById(hashid($store.focused.id));
|
|
93
|
+
el?.scrollIntoView({ block: 'center' });
|
|
94
|
+
}
|
|
95
|
+
headerSizes.set(calcHeaderSizes()); // seems to need a kick on first mount
|
|
96
|
+
mounted = true;
|
|
97
|
+
});
|
|
98
|
+
onDestroy(() => {
|
|
99
|
+
document.removeEventListener('dragend', onDragEnd);
|
|
100
|
+
});
|
|
101
|
+
let hadFocus = false;
|
|
102
|
+
beforeUpdate(() => {
|
|
103
|
+
hadFocus = !!store.treeElement?.contains(document.activeElement);
|
|
104
|
+
});
|
|
105
|
+
afterUpdate(() => {
|
|
106
|
+
if ($store.focused?.id) {
|
|
107
|
+
const el = document.getElementById(hashid($store.focused.id));
|
|
108
|
+
if (el && hadFocus) {
|
|
109
|
+
if (el !== document.activeElement)
|
|
110
|
+
el.focus();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
</script>
|
|
115
|
+
|
|
116
|
+
<svelte:window on:mouseup={headerDragEnd} />
|
|
117
|
+
|
|
118
|
+
<div class="tree-header" class:mounted class:resizing={!!dragheaderid} use:resize={{ store: treeWidth }} aria-hidden="true" on:mouseup={headerDragEnd} on:touchend={headerDragEnd} on:mousemove={dragheaderid ? headerDrag : undefined} on:touchmove={dragheaderid ? headerDrag : undefined}>
|
|
119
|
+
<div class="checkbox" bind:this={checkboxelement}> </div>
|
|
120
|
+
{#each headers as header, i (header.label)}
|
|
121
|
+
<div bind:this={headerelements[i]} id={header.id} class="tree-header-cell {header.id}" style:width={$headerOverride[header.id] ?? $headerSizes?.[i]}>{header.label}</div>
|
|
122
|
+
{#if enableResize && i !== headers.length - 1}<div class="tree-separator" on:mousedown={headerDragStart(header, i)} on:touchstart={headerDragStart(header, i)} on:dblclick={headerDragReset}> </div>{/if}
|
|
123
|
+
{/each}
|
|
124
|
+
</div>
|
|
125
|
+
{#if $rootItems?.length}
|
|
126
|
+
<ul bind:this={store.treeElement} class:mounted role="tree" class:resizing={!!dragheaderid} on:mousemove={dragheaderid ? headerDrag : undefined} on:touchmove={dragheaderid ? headerDrag : undefined} on:mouseup={headerDragEnd} on:touchend={headerDragEnd}>
|
|
127
|
+
{#each $rootItems as item, i (item.id)}
|
|
128
|
+
<TreeNode
|
|
129
|
+
{item}
|
|
130
|
+
{headers}
|
|
131
|
+
{headerSizes}
|
|
132
|
+
{nodeClass}
|
|
133
|
+
posinset={i + 1}
|
|
134
|
+
setsize={$rootItems.length}
|
|
135
|
+
level={item.level}
|
|
136
|
+
prev={$rootItems[i - 1]}
|
|
137
|
+
next={$rootItems[i + 1]}
|
|
138
|
+
on:choose
|
|
139
|
+
on:deselect
|
|
140
|
+
/>
|
|
141
|
+
{/each}
|
|
142
|
+
</ul>
|
|
143
|
+
{/if}
|
|
144
|
+
|
|
145
|
+
<style>
|
|
146
|
+
.tree-header {
|
|
147
|
+
display: flex;
|
|
148
|
+
align-items: center;
|
|
149
|
+
background-color: var(--tree-head-bg, #555555);
|
|
150
|
+
color: var(--tree-head-text, white);
|
|
151
|
+
position: sticky;
|
|
152
|
+
top: 0;
|
|
153
|
+
left: 0;
|
|
154
|
+
z-index: 1;
|
|
155
|
+
font-size: 0.9em;
|
|
156
|
+
opacity: 0;
|
|
157
|
+
}
|
|
158
|
+
.tree-header.mounted {
|
|
159
|
+
opacity: 1;
|
|
160
|
+
}
|
|
161
|
+
.tree-header.resizing {
|
|
162
|
+
cursor: col-resize;
|
|
163
|
+
}
|
|
164
|
+
.tree-header > .tree-header-cell {
|
|
165
|
+
padding: 0.4em 0.3em;
|
|
166
|
+
}
|
|
167
|
+
.tree-header > .tree-separator {
|
|
168
|
+
position: relative;
|
|
169
|
+
width: 4px;
|
|
170
|
+
margin-left: -4px;
|
|
171
|
+
padding: 0.4em 0;
|
|
172
|
+
cursor: col-resize;
|
|
173
|
+
}
|
|
174
|
+
.tree-header > .tree-separator:before {
|
|
175
|
+
content: ' ';
|
|
176
|
+
position: absolute;
|
|
177
|
+
left: 1px;
|
|
178
|
+
top: 0;
|
|
179
|
+
width: 2px;
|
|
180
|
+
height: 100%;
|
|
181
|
+
background-color: var(--tree-head-text, white);
|
|
182
|
+
}
|
|
183
|
+
:global([data-eq~="650px"]) .tree-header {
|
|
184
|
+
font-size: 0.8em;
|
|
185
|
+
}
|
|
186
|
+
.checkbox {
|
|
187
|
+
min-width: 1.5em;
|
|
188
|
+
max-width: 1.5em;
|
|
189
|
+
}
|
|
190
|
+
ul {
|
|
191
|
+
padding: 0;
|
|
192
|
+
margin: 0;
|
|
193
|
+
list-style: none;
|
|
194
|
+
font-size: 0.9em;
|
|
195
|
+
opacity: 0;
|
|
196
|
+
}
|
|
197
|
+
ul.mounted {
|
|
198
|
+
opacity: 1;
|
|
199
|
+
}
|
|
200
|
+
:global([data-eq~="650px"]) ul {
|
|
201
|
+
font-size: 0.8em;
|
|
202
|
+
}
|
|
203
|
+
</style>
|