@dosgato/dialog 1.2.8 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Button.svelte +15 -13
- package/dist/ButtonGroup.svelte +44 -40
- package/dist/Checkbox.svelte +13 -12
- package/dist/Container.svelte +50 -46
- package/dist/Dialog.svelte +56 -41
- package/dist/FieldAutocomplete.svelte +77 -70
- package/dist/FieldCheckbox.svelte +25 -22
- package/dist/FieldChoices.svelte +74 -68
- package/dist/FieldChooserLink.svelte +148 -150
- package/dist/FieldDate.svelte +19 -18
- package/dist/FieldDateTime.svelte +36 -34
- package/dist/FieldDualListbox.svelte +80 -79
- package/dist/FieldHidden.svelte +16 -15
- package/dist/FieldIdentifier.svelte +18 -17
- package/dist/FieldMultiple.svelte +71 -74
- package/dist/FieldMultiselect.svelte +81 -72
- package/dist/FieldNumber.svelte +20 -19
- package/dist/FieldRadio.svelte +42 -41
- package/dist/FieldSelect.svelte +45 -45
- package/dist/FieldStandard.svelte +28 -27
- package/dist/FieldText.svelte +27 -24
- package/dist/FieldTextArea.svelte +24 -24
- package/dist/FileIcon.svelte +10 -8
- package/dist/Form.svelte +40 -18
- package/dist/Form.svelte.d.ts +15 -13
- package/dist/FormDialog.svelte +40 -25
- package/dist/FormDialog.svelte.d.ts +23 -17
- package/dist/Icon.svelte +38 -33
- package/dist/InlineMessage.svelte +31 -29
- package/dist/InlineMessages.svelte +10 -7
- package/dist/Input.svelte +40 -39
- package/dist/Listbox.svelte +102 -109
- package/dist/MaxLength.svelte +19 -18
- package/dist/Radio.svelte +18 -15
- package/dist/Switcher.svelte +37 -33
- package/dist/Tab.svelte +23 -21
- package/dist/Tabs.svelte +111 -110
- package/dist/Tooltip.svelte +7 -7
- package/dist/chooser/Chooser.svelte +83 -76
- package/dist/chooser/ChooserPreview.svelte +16 -14
- package/dist/chooser/Details.svelte +6 -4
- package/dist/chooser/Thumbnail.svelte +20 -16
- package/dist/chooser/UploadUI.svelte +78 -69
- package/dist/code/CodeEditor.svelte +63 -66
- package/dist/code/FieldCodeEditor.svelte +21 -19
- package/dist/colorpicker/FieldColorPicker.svelte +36 -35
- package/dist/cropper/FieldCropper.svelte +142 -141
- package/dist/iconpicker/FieldIconPicker.svelte +102 -94
- package/dist/imageposition/FieldImagePosition.svelte +107 -98
- package/dist/tagpicker/FieldTagPicker.svelte +63 -54
- package/dist/tree/LoadIcon.svelte +0 -1
- package/dist/tree/Tree.svelte +198 -192
- package/dist/tree/Tree.svelte.d.ts +5 -5
- package/dist/tree/TreeCell.svelte +10 -6
- package/dist/tree/TreeCell.svelte.d.ts +5 -5
- package/dist/tree/TreeNode.svelte +213 -241
- package/dist/tree/TreeNode.svelte.d.ts +5 -5
- package/package.json +8 -9
package/dist/tree/Tree.svelte
CHANGED
|
@@ -1,209 +1,216 @@
|
|
|
1
|
-
<script
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import { isNotBlank } from 'txstate-utils'
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
export let
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
export
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
let
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
let
|
|
54
|
-
|
|
55
|
-
|
|
1
|
+
<script lang="ts" generics="T extends TreeItemFromDB = TreeItemFromDB">
|
|
2
|
+
import dotsIcon from '@iconify-icons/ph/dots-three-outline-vertical-fill'
|
|
3
|
+
import circleIcon from '@iconify-icons/ph/circle'
|
|
4
|
+
import radioSelectedIcon from '@iconify-icons/ph/radio-button-fill'
|
|
5
|
+
import { resize, type ElementSize, PopupMenu, type PopupMenuItem } from '@txstate-mws/svelte-components'
|
|
6
|
+
import { derivedStore, Store } from '@txstate-mws/svelte-store'
|
|
7
|
+
import { afterUpdate, beforeUpdate, onDestroy, onMount, setContext, tick } from 'svelte'
|
|
8
|
+
import { isNotBlank } from 'txstate-utils'
|
|
9
|
+
import { Icon } from '..'
|
|
10
|
+
import LoadIcon from './LoadIcon.svelte'
|
|
11
|
+
import TreeNode from './TreeNode.svelte'
|
|
12
|
+
import { getHashId, transformSearchable, TreeStore, TREE_STORE_CONTEXT } from './treestore'
|
|
13
|
+
import type { DragEligibleFn, CopyHandlerFn, DropEffectFn, FetchChildrenFn, MoveHandlerFn, TreeHeader, TreeItemFromDB, SearchableType } from './treestore'
|
|
14
|
+
|
|
15
|
+
interface $$Events {
|
|
16
|
+
choose: CustomEvent<T>
|
|
17
|
+
deselect: CustomEvent<T>
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export let headers: TreeHeader<T>[]
|
|
21
|
+
export let searchable: SearchableType<T> = undefined
|
|
22
|
+
export let filterable: SearchableType<T> = searchable
|
|
23
|
+
export let filter = ''
|
|
24
|
+
export let nodeClass: ((itm: T) => string) | undefined = undefined
|
|
25
|
+
export let singleSelect: boolean | undefined = undefined
|
|
26
|
+
export let enableResize = false
|
|
27
|
+
/**
|
|
28
|
+
* Takes the width of the tree, in pixels, and returns an array of TreeHeader IDs that should be
|
|
29
|
+
* displayed at that screen width. Any headers whose ID is not returned will be added to a dropdown, which allows
|
|
30
|
+
* the user to view them. The last ID returned by this function is the header that is replaced if the user chooses
|
|
31
|
+
* to view a different header. The headers will always appear in the order in which they are defined in the headers prop.
|
|
32
|
+
*/
|
|
33
|
+
export let responsiveHeaders: ((treeWidth: number) => string[]) | undefined = undefined
|
|
34
|
+
/**
|
|
35
|
+
* this `itemType` prop is here for typescript only
|
|
36
|
+
*
|
|
37
|
+
* it will allow users to specify T
|
|
38
|
+
*
|
|
39
|
+
* we are able to determine T from the store prop, but not everyone will use the store prop
|
|
40
|
+
*/
|
|
41
|
+
export const itemType: T | undefined = undefined
|
|
42
|
+
export let fetchChildren: FetchChildrenFn<T> | undefined = undefined
|
|
43
|
+
export let dragEligible: DragEligibleFn<T> | undefined = undefined
|
|
44
|
+
export let moveHandler: MoveHandlerFn<T> | undefined = undefined
|
|
45
|
+
export let copyHandler: CopyHandlerFn<T> | undefined = undefined
|
|
46
|
+
export let dropEffect: DropEffectFn<T> | undefined = undefined
|
|
47
|
+
export let store = new TreeStore<T>(fetchChildren!, { copyHandler, dragEligible, dropEffect, moveHandler })
|
|
48
|
+
if (searchable) store.searchableFn = transformSearchable(searchable)
|
|
49
|
+
if (filterable) store.filterableFn = transformSearchable(filterable)
|
|
50
|
+
setContext(TREE_STORE_CONTEXT, store)
|
|
51
|
+
const { filteredRootItems, headerOverride } = store
|
|
52
|
+
|
|
53
|
+
let checkboxelement: HTMLElement
|
|
54
|
+
const headerelements: HTMLElement[] = []
|
|
55
|
+
let showMoreButton: HTMLButtonElement
|
|
56
|
+
const treeWidth = new Store<ElementSize>({})
|
|
57
|
+
|
|
58
|
+
// Need to keep track of which headers are shown or hidden and which is selected
|
|
59
|
+
let shownHeaders: TreeHeader<T>[] = headers
|
|
60
|
+
let hiddenHeaders: TreeHeader<T>[] = []
|
|
61
|
+
let selectedHeader: TreeHeader<T> | undefined = undefined
|
|
62
|
+
let selectedHeaderValue: string
|
|
63
|
+
|
|
64
|
+
function updateShownHeaders () {
|
|
56
65
|
if (typeof responsiveHeaders === 'function') {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
hiddenHeaders.push(h);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
selectedHeaderValue = shown[shown.length - 1];
|
|
72
|
-
if (hiddenHeaders.length) {
|
|
73
|
-
const hideable = headers.find(h => h.id === selectedHeaderValue);
|
|
74
|
-
if (hideable)
|
|
75
|
-
hiddenHeaders.push(hideable);
|
|
66
|
+
shownHeaders = []
|
|
67
|
+
hiddenHeaders = []
|
|
68
|
+
const shown = responsiveHeaders($treeWidth.clientWidth ?? 1024)
|
|
69
|
+
if (selectedHeader && !shown.includes(selectedHeader.id)) {
|
|
70
|
+
shown[shown.length - 1] = selectedHeader.id
|
|
71
|
+
}
|
|
72
|
+
for (const h of headers) {
|
|
73
|
+
if (shown.includes(h.id)) {
|
|
74
|
+
shownHeaders.push(h)
|
|
75
|
+
} else {
|
|
76
|
+
hiddenHeaders.push(h)
|
|
76
77
|
}
|
|
78
|
+
}
|
|
79
|
+
selectedHeaderValue = shown[shown.length - 1]
|
|
80
|
+
if (hiddenHeaders.length) {
|
|
81
|
+
const hideable = headers.find(h => h.id === selectedHeaderValue)
|
|
82
|
+
if (hideable) hiddenHeaders.push(hideable)
|
|
83
|
+
}
|
|
77
84
|
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function calcHeaderSizes () {
|
|
88
|
+
updateShownHeaders()
|
|
89
|
+
const headerSizes: string[] = []
|
|
90
|
+
let totalFixed = checkboxelement?.offsetWidth ?? 0
|
|
91
|
+
if (hiddenHeaders.length) totalFixed += (showMoreButton?.offsetWidth ?? 0)
|
|
85
92
|
for (let i = 0; i < shownHeaders.length; i++) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
93
|
+
const header = shownHeaders[i]
|
|
94
|
+
if (header.fixed || $headerOverride[header.id]) {
|
|
95
|
+
headerSizes[i] = $headerOverride[header.id] ?? header.fixed
|
|
96
|
+
totalFixed += headerelements[i]?.offsetWidth ?? 0
|
|
97
|
+
}
|
|
91
98
|
}
|
|
92
|
-
const remainingWidth = ($treeWidth.clientWidth ?? 1024) - totalFixed
|
|
93
|
-
const growHeaders = shownHeaders.filter((h, i) => !h.fixed && !$headerOverride[h.id])
|
|
94
|
-
const totalGrowShares = growHeaders.reduce((sum, h) => sum + (h.grow ?? 1), 0)
|
|
99
|
+
const remainingWidth = ($treeWidth.clientWidth ?? 1024) - totalFixed
|
|
100
|
+
const growHeaders = shownHeaders.filter((h, i) => !h.fixed && !$headerOverride[h.id])
|
|
101
|
+
const totalGrowShares = growHeaders.reduce((sum, h) => sum + (h.grow ?? 1), 0)
|
|
95
102
|
for (let i = 0; i < shownHeaders.length; i++) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
103
|
+
const header = shownHeaders[i]
|
|
104
|
+
if (!header.fixed && !$headerOverride[header.id] && headerelements[i]?.offsetWidth) {
|
|
105
|
+
headerSizes[i] = `${remainingWidth * (header.grow ?? 1) / totalGrowShares}px`
|
|
106
|
+
}
|
|
100
107
|
}
|
|
101
|
-
return headerSizes
|
|
102
|
-
}
|
|
103
|
-
const headerSizes = derivedStore([headerOverride, treeWidth], calcHeaderSizes)
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
108
|
+
return headerSizes
|
|
109
|
+
}
|
|
110
|
+
const headerSizes = derivedStore([headerOverride, treeWidth], calcHeaderSizes)
|
|
111
|
+
|
|
112
|
+
$: store.singleSelect = singleSelect
|
|
113
|
+
|
|
114
|
+
function onDragEnd () {
|
|
115
|
+
store.update(v => ({ ...v, dragging: false }))
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
let search = ''
|
|
119
|
+
let searchTimer = 0
|
|
120
|
+
$: store.filter(filter)
|
|
121
|
+
function onKeyUp (e) {
|
|
122
|
+
if (!store.searchableFn) return
|
|
114
123
|
if (e.key.length === 1) {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
124
|
+
search += e.key.toLocaleLowerCase()
|
|
125
|
+
const searchItems = $store.focused?.parent ? $store.focused.parent.children : $store.rootItems
|
|
126
|
+
const newFocus = searchItems?.find(itm => store.searchableFn!(itm).some(str => str.toLocaleLowerCase().startsWith(search)))
|
|
127
|
+
if (newFocus) store.focus(newFocus)
|
|
128
|
+
clearTimeout(searchTimer)
|
|
129
|
+
searchTimer = setTimeout(() => { search = '' }, 4000)
|
|
130
|
+
} else if (e.key === 'Backspace') {
|
|
131
|
+
search = search.substring(0, search.length - 1)
|
|
132
|
+
} else if (e.key === 'Escape') {
|
|
133
|
+
search = ''
|
|
122
134
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
let dragtargetid: string | undefined
|
|
138
|
+
let rightoftargetid: string | undefined
|
|
139
|
+
let widthStart: number
|
|
140
|
+
let width2Start: number
|
|
141
|
+
let mouseStart: number
|
|
142
|
+
function headerDragStart (header: TreeHeader<T>, idx: number) {
|
|
143
|
+
return (e: MouseEvent | TouchEvent) => {
|
|
144
|
+
if (!enableResize) return
|
|
145
|
+
const dragtarget = headerelements[idx]
|
|
146
|
+
const rightoftarget = headerelements.find((e, i) => i > idx && e.isConnected)
|
|
147
|
+
if (!dragtarget?.isConnected || !rightoftarget) dragtargetid = undefined
|
|
148
|
+
else {
|
|
149
|
+
e.preventDefault()
|
|
150
|
+
dragtargetid = header.id
|
|
151
|
+
rightoftargetid = rightoftarget.getAttribute('id') ?? undefined
|
|
152
|
+
widthStart = dragtarget.clientWidth
|
|
153
|
+
width2Start = rightoftarget.clientWidth
|
|
154
|
+
mouseStart = 'touches' in e ? e.touches[0].screenX : e.screenX
|
|
155
|
+
}
|
|
128
156
|
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
let width2Start;
|
|
134
|
-
let mouseStart;
|
|
135
|
-
function headerDragStart(header, idx) {
|
|
136
|
-
return (e) => {
|
|
137
|
-
if (!enableResize)
|
|
138
|
-
return;
|
|
139
|
-
const dragtarget = headerelements[idx];
|
|
140
|
-
const rightoftarget = headerelements.find((e, i) => i > idx && e.isConnected);
|
|
141
|
-
if (!dragtarget?.isConnected || !rightoftarget)
|
|
142
|
-
dragtargetid = undefined;
|
|
143
|
-
else {
|
|
144
|
-
e.preventDefault();
|
|
145
|
-
dragtargetid = header.id;
|
|
146
|
-
rightoftargetid = rightoftarget.getAttribute('id') ?? undefined;
|
|
147
|
-
widthStart = dragtarget.clientWidth;
|
|
148
|
-
width2Start = rightoftarget.clientWidth;
|
|
149
|
-
mouseStart = 'touches' in e ? e.touches[0].screenX : e.screenX;
|
|
150
|
-
}
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
function headerDrag(e) {
|
|
154
|
-
if ('touches' in e && e.touches?.length > 1)
|
|
155
|
-
return;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function headerDrag (e: MouseEvent | TouchEvent) {
|
|
160
|
+
if ('touches' in e && e.touches?.length > 1) return
|
|
156
161
|
if (dragtargetid && rightoftargetid) {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
162
|
+
const screenX = 'touches' in e ? e.touches[0].screenX : e.screenX
|
|
163
|
+
store.setHeaderOverride(dragtargetid, `${widthStart - (mouseStart - screenX)}px`)
|
|
164
|
+
store.setHeaderOverride(rightoftargetid, `${width2Start + (mouseStart - screenX)}px`)
|
|
160
165
|
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function headerDragEnd () {
|
|
169
|
+
dragtargetid = undefined
|
|
170
|
+
rightoftargetid = undefined
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function headerDragReset () {
|
|
174
|
+
store.resetHeaderOverride()
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
let mounted = false
|
|
178
|
+
onMount(async () => {
|
|
179
|
+
document.addEventListener('dragend', onDragEnd)
|
|
180
|
+
headerSizes.set(calcHeaderSizes()) // seems to need a kick on first mount
|
|
181
|
+
await new Promise(resolve => requestAnimationFrame(resolve))
|
|
174
182
|
// need to wait long enough for headers to redraw before trying to mount the rows
|
|
175
|
-
await new Promise(resolve => requestAnimationFrame(resolve))
|
|
176
|
-
mounted = true
|
|
177
|
-
await store.refresh()
|
|
178
|
-
})
|
|
179
|
-
onDestroy(() => {
|
|
180
|
-
if (typeof document !== 'undefined')
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
afterUpdate(() => {
|
|
183
|
+
await new Promise(resolve => requestAnimationFrame(resolve))
|
|
184
|
+
mounted = true
|
|
185
|
+
await store.refresh()
|
|
186
|
+
})
|
|
187
|
+
onDestroy(() => {
|
|
188
|
+
if (typeof document !== 'undefined') document.removeEventListener('dragend', onDragEnd)
|
|
189
|
+
})
|
|
190
|
+
let hadFocus = false
|
|
191
|
+
beforeUpdate(() => {
|
|
192
|
+
hadFocus = !!store.treeElement?.contains(document.activeElement)
|
|
193
|
+
})
|
|
194
|
+
afterUpdate(() => {
|
|
188
195
|
if ($store.focused?.id) {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
}
|
|
196
|
+
const el = document.getElementById(getHashId($store.focused.id))
|
|
197
|
+
if (el && hadFocus) {
|
|
198
|
+
if (el !== document.activeElement) el.focus()
|
|
199
|
+
}
|
|
194
200
|
}
|
|
195
|
-
})
|
|
196
|
-
$: myRootItemIds = $store && $filteredRootItems
|
|
197
|
-
$: myRootItems = $store?.rootItems?.filter(r => myRootItemIds.has(r.id)) ?? []
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
201
|
+
})
|
|
202
|
+
$: myRootItemIds = $store && $filteredRootItems
|
|
203
|
+
$: myRootItems = $store?.rootItems?.filter(r => myRootItemIds.has(r.id)) ?? []
|
|
204
|
+
|
|
205
|
+
async function selectHeader (selected: PopupMenuItem) {
|
|
206
|
+
selectedHeader = headers.find(h => h.id === selected.value)
|
|
207
|
+
updateShownHeaders()
|
|
208
|
+
store.resetHeaderOverride()
|
|
209
|
+
const headersizes = shownHeaders.map(h => h.fixed ? h.fixed : '')
|
|
210
|
+
headerSizes.set(headersizes)
|
|
211
|
+
await tick()
|
|
212
|
+
headerSizes.set(calcHeaderSizes())
|
|
213
|
+
}
|
|
207
214
|
</script>
|
|
208
215
|
|
|
209
216
|
<svelte:window on:mouseup={headerDragEnd} />
|
|
@@ -326,5 +333,4 @@ async function selectHeader(selected) {
|
|
|
326
333
|
:global(div.hideable-container ul.hideable-headers li.selected-header::after) {
|
|
327
334
|
display: none;
|
|
328
335
|
}
|
|
329
|
-
|
|
330
336
|
</style>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
2
|
import { TreeStore } from './treestore';
|
|
3
3
|
import type { DragEligibleFn, CopyHandlerFn, DropEffectFn, FetchChildrenFn, MoveHandlerFn, TreeHeader, TreeItemFromDB, SearchableType } from './treestore';
|
|
4
|
-
declare class __sveltets_Render<T extends TreeItemFromDB> {
|
|
4
|
+
declare class __sveltets_Render<T extends TreeItemFromDB = TreeItemFromDB> {
|
|
5
5
|
props(): {
|
|
6
6
|
headers: TreeHeader<T>[];
|
|
7
7
|
searchable?: SearchableType<T>;
|
|
@@ -36,10 +36,10 @@ declare class __sveltets_Render<T extends TreeItemFromDB> {
|
|
|
36
36
|
};
|
|
37
37
|
slots(): {};
|
|
38
38
|
}
|
|
39
|
-
export type TreeProps<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['props']>;
|
|
40
|
-
export type TreeEvents<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['events']>;
|
|
41
|
-
export type TreeSlots<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['slots']>;
|
|
42
|
-
export default class Tree<T extends TreeItemFromDB> extends SvelteComponentTyped<TreeProps<T>, TreeEvents<T>, TreeSlots<T>> {
|
|
39
|
+
export type TreeProps<T extends TreeItemFromDB = TreeItemFromDB> = ReturnType<__sveltets_Render<T>['props']>;
|
|
40
|
+
export type TreeEvents<T extends TreeItemFromDB = TreeItemFromDB> = ReturnType<__sveltets_Render<T>['events']>;
|
|
41
|
+
export type TreeSlots<T extends TreeItemFromDB = TreeItemFromDB> = ReturnType<__sveltets_Render<T>['slots']>;
|
|
42
|
+
export default class Tree<T extends TreeItemFromDB = TreeItemFromDB> extends SvelteComponentTyped<TreeProps<T>, TreeEvents<T>, TreeSlots<T>> {
|
|
43
43
|
get itemType(): T & {};
|
|
44
44
|
}
|
|
45
45
|
export {};
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
<script
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
<script lang="ts" generics="T extends TreeItemFromDB = TreeItemFromDB">
|
|
2
|
+
import type { IconifyIcon } from '@iconify/svelte'
|
|
3
|
+
import { get } from 'txstate-utils'
|
|
4
|
+
import { Icon } from '..'
|
|
5
|
+
import type { TreeHeader, TreeItemFromDB, TypedTreeItem } from './treestore'
|
|
6
|
+
|
|
7
|
+
export let header: TreeHeader<T>
|
|
8
|
+
export let item: TypedTreeItem<T>
|
|
9
|
+
$: icon = (typeof header.icon === 'function' ? header.icon(item) : header.icon) as { icon: IconifyIcon, label: string } | undefined
|
|
10
|
+
$: headerComponent = header.component as any
|
|
7
11
|
</script>
|
|
8
12
|
|
|
9
13
|
{#if icon}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
2
|
import type { TreeHeader, TreeItemFromDB, TypedTreeItem } from './treestore';
|
|
3
|
-
declare class __sveltets_Render<T extends TreeItemFromDB> {
|
|
3
|
+
declare class __sveltets_Render<T extends TreeItemFromDB = TreeItemFromDB> {
|
|
4
4
|
props(): {
|
|
5
5
|
header: TreeHeader<T>;
|
|
6
6
|
item: TypedTreeItem<T>;
|
|
@@ -10,9 +10,9 @@ declare class __sveltets_Render<T extends TreeItemFromDB> {
|
|
|
10
10
|
};
|
|
11
11
|
slots(): {};
|
|
12
12
|
}
|
|
13
|
-
export type TreeCellProps<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['props']>;
|
|
14
|
-
export type TreeCellEvents<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['events']>;
|
|
15
|
-
export type TreeCellSlots<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['slots']>;
|
|
16
|
-
export default class TreeCell<T extends TreeItemFromDB> extends SvelteComponentTyped<TreeCellProps<T>, TreeCellEvents<T>, TreeCellSlots<T>> {
|
|
13
|
+
export type TreeCellProps<T extends TreeItemFromDB = TreeItemFromDB> = ReturnType<__sveltets_Render<T>['props']>;
|
|
14
|
+
export type TreeCellEvents<T extends TreeItemFromDB = TreeItemFromDB> = ReturnType<__sveltets_Render<T>['events']>;
|
|
15
|
+
export type TreeCellSlots<T extends TreeItemFromDB = TreeItemFromDB> = ReturnType<__sveltets_Render<T>['slots']>;
|
|
16
|
+
export default class TreeCell<T extends TreeItemFromDB = TreeItemFromDB> extends SvelteComponentTyped<TreeCellProps<T>, TreeCellEvents<T>, TreeCellSlots<T>> {
|
|
17
17
|
}
|
|
18
18
|
export {};
|