@medyll/idae-slotui-svelte 0.122.1 → 0.124.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/README.md +47 -47
- package/dist/base/alert/Alert.demo.svelte +62 -62
- package/dist/base/alert/Alert.svelte +121 -121
- package/dist/base/alert/alert.scss +93 -93
- package/dist/base/avatar/Avatar.demo.svelte +41 -41
- package/dist/base/avatar/Avatar.preview.svelte +6 -6
- package/dist/base/avatar/Avatar.svelte +65 -65
- package/dist/base/avatar/avatar.scss +17 -17
- package/dist/base/backdrop/Backdrop.demo.svelte +49 -49
- package/dist/base/backdrop/Backdrop.svelte +78 -78
- package/dist/base/backdrop/backdrop.scss +34 -34
- package/dist/base/badge/Badge.svelte +31 -31
- package/dist/base/badge/badge.scss +19 -19
- package/dist/base/box/Box.demo.svelte +54 -54
- package/dist/base/box/Box.svelte +72 -72
- package/dist/base/box/box.scss +33 -33
- package/dist/base/breadCrumb/BreadCrumb.svelte +23 -23
- package/dist/base/breadCrumb/breadcrumb.scss +11 -11
- package/dist/base/cartouche/Cartouche.demo.svelte +108 -108
- package/dist/base/cartouche/Cartouche.svelte +114 -114
- package/dist/base/cartouche/cartouche.scss +114 -114
- package/dist/base/chipper/Chipper.demo.svelte +45 -45
- package/dist/base/chipper/Chipper.svelte +36 -36
- package/dist/base/chipper/chipper.scss +65 -65
- package/dist/base/columner/Column.svelte +62 -62
- package/dist/base/columner/Columner.demo.svelte +15 -15
- package/dist/base/columner/Columner.svelte +21 -21
- package/dist/base/contentSwitcher/ContentSwitcher.demo.svelte +45 -45
- package/dist/base/contentSwitcher/ContentSwitcher.svelte +63 -63
- package/dist/base/contentSwitcher/content-switcher.scss +22 -22
- package/dist/base/debug/Debug.svelte +21 -21
- package/dist/base/demoer/DemoPage.svelte +40 -40
- package/dist/base/demoer/Demoer.svelte +170 -170
- package/dist/base/demoer/DemoerCode.svelte +45 -45
- package/dist/base/demoer/DemoerComponent.svelte +50 -50
- package/dist/base/divider/Divider.demo.svelte +34 -34
- package/dist/base/divider/Divider.svelte +68 -68
- package/dist/base/divider/divider.scss +19 -19
- package/dist/base/icon/Icon.demo.svelte +24 -24
- package/dist/base/icon/Icon.svelte +117 -117
- package/dist/base/icon/icon.scss +17 -17
- package/dist/base/paper/Paper.demo.svelte +31 -31
- package/dist/base/paper/Paper.svelte +20 -20
- package/dist/base/paper/paper.scss +15 -15
- package/dist/base/titleBar/TitleBar.demo.svelte +30 -30
- package/dist/base/titleBar/TitleBar.svelte +40 -40
- package/dist/base/titleBar/title-bar.scss +29 -29
- package/dist/controls/autocomplete/AutoComplete.demo.svelte +88 -88
- package/dist/controls/autocomplete/AutoComplete.svelte +152 -152
- package/dist/controls/autocomplete/auto-complete.scss +15 -15
- package/dist/controls/button/Button.demo.svelte +165 -165
- package/dist/controls/button/Button.svelte +95 -95
- package/dist/controls/button/ButtonAction.svelte +55 -55
- package/dist/controls/button/ButtonMenu.svelte +55 -55
- package/dist/controls/button/IconButton.svelte +45 -45
- package/dist/controls/button/button-action.scss +8 -8
- package/dist/controls/button/button-menu.scss +36 -36
- package/dist/controls/button/button.scss +293 -293
- package/dist/controls/checkbox/Checkbox.demo.svelte +29 -29
- package/dist/controls/checkbox/Checkbox.svelte +59 -59
- package/dist/controls/checkbox/checkbox.scss +115 -115
- package/dist/controls/confirm/Confirm.demo.svelte +60 -60
- package/dist/controls/confirm/Confirm.preview.svelte +14 -14
- package/dist/controls/confirm/Confirm.svelte +156 -156
- package/dist/controls/confirm/confirm.scss +12 -12
- package/dist/controls/inplaceedit/InPlaceEdit.demo.svelte +41 -41
- package/dist/controls/inplaceedit/InPlaceEdit.svelte +109 -109
- package/dist/controls/progress/Progress.demo.svelte +30 -30
- package/dist/controls/progress/Progress.svelte +26 -26
- package/dist/controls/progress/progress.scss +23 -23
- package/dist/controls/rating/Rating.demo.svelte +45 -45
- package/dist/controls/rating/Rating.svelte +44 -44
- package/dist/controls/rating/rating.scss +9 -9
- package/dist/controls/select/Select.demo.svelte +101 -101
- package/dist/controls/select/Select.svelte +125 -125
- package/dist/controls/select/select.scss +13 -13
- package/dist/controls/slider/Slider.demo.svelte +34 -34
- package/dist/controls/slider/Slider.svelte +153 -153
- package/dist/controls/slider/slider.scss +51 -51
- package/dist/controls/stepper/Stepper.demo.svelte +32 -32
- package/dist/controls/stepper/Stepper.svelte +30 -30
- package/dist/controls/stepper/stepper.scss +23 -23
- package/dist/controls/switch/Switch.demo.svelte +61 -61
- package/dist/controls/switch/Switch.svelte +45 -45
- package/dist/controls/switch/switch.scss +73 -73
- package/dist/controls/textfield/TextField.demo.svelte +79 -79
- package/dist/controls/textfield/TextField.svelte +86 -86
- package/dist/controls/textfield/textfield.scss +68 -68
- package/dist/csss/csss.scss +10 -10
- package/dist/data/dataList/DataList.demo.svelte +151 -151
- package/dist/data/dataList/DataList.preview.svelte +23 -23
- package/dist/data/dataList/DataList.svelte +233 -233
- package/dist/data/dataList/DataListCell.svelte +212 -212
- package/dist/data/dataList/DataListHead.svelte +75 -75
- package/dist/data/dataList/DataListRow.svelte +93 -93
- package/dist/data/dataList/datalist.scss +157 -157
- package/dist/data/finder/Finder.demo.svelte +55 -55
- package/dist/data/finder/Finder.svelte +166 -166
- package/dist/data/finder/finder.scss +14 -14
- package/dist/data/grouper/Grouper.demo.svelte +36 -36
- package/dist/data/grouper/Grouper.svelte +85 -85
- package/dist/data/jsoner/Jsoner.svelte +40 -40
- package/dist/data/list/List.svelte +16 -16
- package/dist/data/list/ListItem.svelte +10 -10
- package/dist/data/list/ListTitle.svelte +8 -8
- package/dist/data/loader/Loader.demo.svelte +95 -95
- package/dist/data/loader/Loader.preview.svelte +7 -7
- package/dist/data/loader/Loader.svelte +99 -99
- package/dist/data/loader/loader.scss +50 -50
- package/dist/data/sorter/Sorter.demo.svelte +62 -62
- package/dist/data/sorter/Sorter.svelte +80 -80
- package/dist/data/sorter/Sorterer.svelte +27 -27
- package/dist/data/sorter/sorterer.scss +11 -11
- package/dist/index.d.ts +58 -57
- package/dist/index.js +58 -57
- package/dist/navigation/drawer/Drawer.demo.svelte +52 -52
- package/dist/navigation/drawer/Drawer.svelte +163 -163
- package/dist/navigation/drawer/drawer.scss +69 -69
- package/dist/navigation/tabs/Tabs.demo.svelte +83 -83
- package/dist/navigation/tabs/Tabs.preview.svelte +22 -22
- package/dist/navigation/tabs/Tabs.svelte +158 -158
- package/dist/navigation/tabs/tabs.scss +92 -92
- package/dist/slotui-css/slotui-css.css +141 -141
- package/dist/slotui-css/slotui-min-css.css +141 -141
- package/dist/styles/slotui-mixins.scss +168 -168
- package/dist/styles/slotui-presets.scss +56 -56
- package/dist/styles/slotuisheet/SlotuiSheet.svelte +36 -36
- package/dist/styles/slotuisheet/SlotyuiSheet.demo.svelte +28 -28
- package/dist/styles/slotuisheet/sheetConfig.scss +7 -7
- package/dist/styles/slotuisheet/slotui-sheet.scss +192 -192
- package/dist/styles/slotuisheet/stylesheet-container.scss +147 -147
- package/dist/styles/slotuisheet/stylesheet.scss +156 -156
- package/dist/types/slotui-ambient.d.ts +27 -27
- package/dist/ui/bootstrapp/BootStrApp.svelte +92 -92
- package/dist/ui/chromeFrame/ChromeFrame.svelte +43 -43
- package/dist/ui/chromeFrame/ChromeFrameButtonList.svelte +33 -33
- package/dist/ui/chromeFrame/ChromeFrameList.svelte +106 -106
- package/dist/ui/chromeFrame/chrome-frame.scss +34 -34
- package/dist/ui/frame/Frame.demo.svelte +48 -48
- package/dist/ui/frame/Frame.svelte +90 -90
- package/dist/ui/frame/frame.scss +46 -46
- package/dist/ui/login/Login.demo.svelte +62 -62
- package/dist/ui/login/Login.svelte +102 -102
- package/dist/ui/marquee/Marquee.demo.svelte +33 -33
- package/dist/ui/marquee/Marquee.svelte +97 -97
- package/dist/ui/marquee/marquee.scss +34 -34
- package/dist/ui/menu/Menu.svelte +9 -9
- package/dist/ui/menu/MenuItem.svelte +9 -9
- package/dist/ui/menu/MenuTitle.svelte +10 -10
- package/dist/ui/menu/menu.scss +61 -61
- package/dist/ui/menuList/MenuList.demo.svelte +73 -73
- package/dist/ui/menuList/MenuList.svelte +143 -143
- package/dist/ui/menuList/MenuListItem.svelte +134 -134
- package/dist/ui/menuList/MenuListTitle.svelte +10 -10
- package/dist/ui/menuList/menu-list.scss +120 -120
- package/dist/ui/panel/Panel.demo.svelte +169 -169
- package/dist/ui/panel/Panel.svelte +96 -96
- package/dist/ui/panel/PanelGrid.svelte +62 -62
- package/dist/ui/panel/PanelSlide.svelte +156 -156
- package/dist/ui/panel/Paneler.svelte +63 -63
- package/dist/ui/panel/panel.scss +32 -32
- package/dist/ui/popper/Popper.demo.svelte +92 -92
- package/dist/ui/popper/Popper.svelte +160 -160
- package/dist/ui/popper/popper.scss +108 -108
- package/dist/ui/preview/Preview.svelte +41 -41
- package/dist/ui/serviceBox/ServiceBox.svelte +24 -24
- package/dist/ui/startMenu/BootMenu.svelte +102 -102
- package/dist/ui/startMenu/boot-menu.scss +86 -86
- package/dist/ui/taskbar/TaskBarContent.svelte +20 -20
- package/dist/ui/taskbar/Taskbar.svelte +26 -26
- package/dist/ui/taskbar/taskbar.scss +28 -28
- package/dist/ui/themeswitcher/ThemeSwitcher.svelte +18 -18
- package/dist/ui/toast/Toast.demo.svelte +19 -19
- package/dist/ui/toast/Toast.svelte +60 -60
- package/dist/ui/toast/Toaster.svelte +18 -18
- package/dist/ui/toggleBar/ToggleBar.demo.svelte +114 -114
- package/dist/ui/toggleBar/ToggleBar.svelte +58 -58
- package/dist/ui/toggleBar/toggle-bar.scss +45 -45
- package/dist/ui/toolBar/ToolBar.demo.svelte +98 -98
- package/dist/ui/toolBar/ToolBar.svelte +30 -30
- package/dist/ui/toolBar/toolbar.scss +32 -32
- package/dist/ui/tree/Tree.demo.svelte +84 -84
- package/dist/ui/tree/Tree.preview.svelte +19 -19
- package/dist/ui/tree/Tree.svelte +182 -182
- package/dist/ui/tree/tree.scss +38 -38
- package/dist/ui/window/Window.demo.svelte +111 -111
- package/dist/ui/window/Window.svelte +177 -177
- package/dist/ui/window/window.scss +66 -66
- package/dist/utils/content/Content.svelte +78 -78
- package/dist/utils/contextRooter/ContextRooter.demo.svelte +33 -33
- package/dist/utils/contextRooter/ContextRooter.svelte +6 -6
- package/dist/utils/css/Css.demo.svelte +5 -5
- package/dist/utils/css/Css.svelte +64 -64
- package/dist/utils/effects/transitions.js +6 -6
- package/dist/utils/looper/Looper.demo.svelte +36 -36
- package/dist/utils/looper/Looper.svelte +47 -47
- package/dist/utils/slotted/Slotted.svelte +21 -21
- package/dist/utils/stylesheet/StyleSheet.demo.svelte +28 -28
- package/dist/utils/stylesheet/StyleSheet.svelte +30 -30
- package/dist/utils/stylesheet/containerConfig.scss +7 -7
- package/dist/utils/stylesheet/stylesheet.scss +147 -147
- package/dist/utils/uses/sx4u/sx4uPreprocess.js +34 -34
- package/package.json +3 -3
package/dist/ui/tree/Tree.svelte
CHANGED
|
@@ -1,184 +1,184 @@
|
|
|
1
|
-
<svelte:options />
|
|
2
|
-
|
|
3
|
-
<script lang="ts" generics="T = Data">
|
|
4
|
-
import type { Snippet } from 'svelte';
|
|
5
|
-
|
|
6
|
-
import { trans2Tree } from './tree.utils.js';
|
|
7
|
-
import type { TreeItemType } from './types.js';
|
|
8
|
-
import Icon from '../../base/icon/Icon.svelte';
|
|
9
|
-
import { dataOp } from '../../utils/engine/utils.js';
|
|
10
|
-
import type { CommonProps, Data } from '../../types/index.js';
|
|
11
|
-
import Slotted from '../../utils/slotted/Slotted.svelte';
|
|
12
|
-
|
|
13
|
-
type TreeProps = CommonProps & {
|
|
14
|
-
/** data to be displayed in the tree */
|
|
15
|
-
data?: T[];
|
|
16
|
-
|
|
17
|
-
/** paths to be displayed in the tree */
|
|
18
|
-
paths: Record<string, any>[];
|
|
19
|
-
|
|
20
|
-
/** field to be used for paths */
|
|
21
|
-
pathField?: string;
|
|
22
|
-
|
|
23
|
-
/** private use */
|
|
24
|
-
pathes?: TreeItemType[];
|
|
25
|
-
|
|
26
|
-
/** private use */
|
|
27
|
-
level?: number;
|
|
28
|
-
|
|
29
|
-
/** private use */
|
|
30
|
-
selectedDataKeys?: string[];
|
|
31
|
-
|
|
32
|
-
/** exported data */
|
|
33
|
-
selectedData?: T[];
|
|
34
|
-
|
|
35
|
-
/** exported selected paths */
|
|
36
|
-
selectedPathes?: string[];
|
|
37
|
-
|
|
38
|
-
/** the split we use to build hierarchy */
|
|
39
|
-
splitter?: string;
|
|
40
|
-
|
|
41
|
-
/** show checkbox to select */
|
|
42
|
-
showCheckBox?: boolean;
|
|
43
|
-
|
|
44
|
-
/** selected category */
|
|
45
|
-
selectedCategory?: string;
|
|
46
|
-
|
|
47
|
-
element?: HTMLElement;
|
|
48
|
-
children?: Snippet<[{ item: TreeItemType; idx: number }]>;
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
let {
|
|
52
|
-
class: className = '',
|
|
53
|
-
pathField = 'path',
|
|
54
|
-
level = 0,
|
|
55
|
-
splitter = '/',
|
|
56
|
-
element = $bindable(),
|
|
57
|
-
data = $bindable([]),
|
|
58
|
-
paths = $bindable([]),
|
|
59
|
-
showCheckBox = $bindable(false),
|
|
60
|
-
selectedCategory = $bindable(''),
|
|
61
|
-
selectedDataKeys = $bindable([]),
|
|
62
|
-
selectedData = $bindable([]),
|
|
63
|
-
selectedPathes = $bindable([]),
|
|
64
|
-
pathes = trans2Tree(paths, pathField),
|
|
65
|
-
children
|
|
66
|
-
}: TreeProps = $props();
|
|
67
|
-
|
|
68
|
-
let visibleChildChild: Record<string, boolean> = $state({});
|
|
69
|
-
let finalPaths: TreeItemType[] = $state([]);
|
|
70
|
-
|
|
71
|
-
$effect(() => {
|
|
72
|
-
finalPaths = trans2Tree(paths, pathField);
|
|
73
|
-
selectedData = selectedDataKeys.map((dataKey) => {
|
|
74
|
-
return dataOp.filterListFirst(paths, dataKey, pathField);
|
|
75
|
-
});
|
|
76
|
-
selectedPathes = selectedDataKeys;
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
function handleCheck(dataObj: TreeItemType, act: boolean) {
|
|
80
|
-
if (act) {
|
|
81
|
-
selectedDataKeys = [...selectedDataKeys, dataObj.path].filter((x) => x);
|
|
82
|
-
} else {
|
|
83
|
-
delete selectedDataKeys[selectedDataKeys?.indexOf(dataObj.path)];
|
|
84
|
-
selectedDataKeys = [...selectedDataKeys].filter((x) => x);
|
|
85
|
-
}
|
|
86
|
-
// select all children down
|
|
87
|
-
setChildrenState(dataObj.children, act);
|
|
88
|
-
setParentState(dataObj, act);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function setParentState(dataObj: TreeItemType, act: boolean) {
|
|
92
|
-
const arrP = dataObj.path.split(splitter);
|
|
93
|
-
|
|
94
|
-
arrP.forEach((path, index) => {
|
|
95
|
-
let checkPath = arrP.slice(0, index).join(splitter);
|
|
96
|
-
|
|
97
|
-
if (act) {
|
|
98
|
-
selectedDataKeys = [...selectedDataKeys, checkPath].filter((x) => x);
|
|
99
|
-
} else {
|
|
100
|
-
delete selectedDataKeys[selectedDataKeys?.indexOf(checkPath)];
|
|
101
|
-
selectedDataKeys = [...selectedDataKeys].filter((x) => x);
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function setChildrenState(dataObj: TreeItemType[], act: boolean) {
|
|
107
|
-
if (dataObj.length) {
|
|
108
|
-
dataObj.forEach((treeItem) => {
|
|
109
|
-
if (act) {
|
|
110
|
-
selectedDataKeys = [...selectedDataKeys, treeItem.path].filter((x) => x);
|
|
111
|
-
} else {
|
|
112
|
-
delete selectedDataKeys[selectedDataKeys?.indexOf(treeItem.path)];
|
|
113
|
-
selectedDataKeys = [...selectedDataKeys].filter((x) => x);
|
|
114
|
-
}
|
|
115
|
-
setChildrenState(treeItem.children, act);
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
function toggle(path: string, visibility?: boolean) {
|
|
121
|
-
visibleChildChild[path] = visibility ?? !visibleChildChild[path];
|
|
122
|
-
}
|
|
123
|
-
</script>
|
|
124
|
-
|
|
125
|
-
<div bind:this={element} class="tree {className}">
|
|
126
|
-
{#each pathes as pat, k}
|
|
127
|
-
<div data-category={pat.path}>
|
|
128
|
-
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
129
|
-
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
130
|
-
<div
|
|
131
|
-
data-category-title={pat.path}
|
|
132
|
-
aria-selected={selectedCategory === pat.path}
|
|
133
|
-
onclick={(event) => {
|
|
134
|
-
selectedCategory = pat.path;
|
|
135
|
-
toggle(pat.path);
|
|
136
|
-
}}
|
|
137
|
-
title={pat.path}
|
|
138
|
-
style="--tree-level:{level * 1.5}rem"
|
|
139
|
-
class="tree-cell"
|
|
140
|
-
>
|
|
141
|
-
<div class="tree-cell-arrow">
|
|
142
|
-
{#if pat?.children?.length}
|
|
143
|
-
<Icon icon="chevron-{visibleChildChild[pat.path] ? 'down' : 'right'}" />
|
|
144
|
-
{/if}
|
|
145
|
-
</div>
|
|
146
|
-
<div class="tree-cell-title-gutter">
|
|
147
|
-
{#if showCheckBox}
|
|
148
|
-
<input
|
|
149
|
-
onclick={(event) => {
|
|
150
|
-
event.stopPropagation();
|
|
151
|
-
handleCheck(pat, event?.currentTarget?.checked);
|
|
152
|
-
}}
|
|
153
|
-
type="checkbox"
|
|
154
|
-
style="display:block;border:1px solid red;"
|
|
155
|
-
checked={Boolean(selectedDataKeys.includes(pat.path))}
|
|
156
|
-
/>
|
|
157
|
-
{/if}
|
|
158
|
-
<Slotted child={children} slotArgs={{ item: pat, idx: k }}>
|
|
159
|
-
<div>{pat.name}</div>
|
|
160
|
-
</Slotted>
|
|
161
|
-
</div>
|
|
162
|
-
</div>
|
|
163
|
-
<div
|
|
164
|
-
data-category-children={pat.path}
|
|
165
|
-
style="display:{visibleChildChild[pat.path] ? '' : 'none'};"
|
|
166
|
-
>
|
|
167
|
-
{#if pat?.children?.length}
|
|
168
|
-
<svelte:self
|
|
169
|
-
level={level + 1}
|
|
170
|
-
bind:selectedDataKeys
|
|
171
|
-
bind:data
|
|
172
|
-
bind:selectedCategory
|
|
173
|
-
bind:showCheckBox
|
|
174
|
-
pathes={pat.children}
|
|
175
|
-
/>
|
|
176
|
-
{/if}
|
|
177
|
-
</div>
|
|
178
|
-
</div>
|
|
179
|
-
{/each}
|
|
180
|
-
</div>
|
|
181
|
-
|
|
1
|
+
<svelte:options />
|
|
2
|
+
|
|
3
|
+
<script lang="ts" generics="T = Data">
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
|
|
6
|
+
import { trans2Tree } from './tree.utils.js';
|
|
7
|
+
import type { TreeItemType } from './types.js';
|
|
8
|
+
import Icon from '../../base/icon/Icon.svelte';
|
|
9
|
+
import { dataOp } from '../../utils/engine/utils.js';
|
|
10
|
+
import type { CommonProps, Data } from '../../types/index.js';
|
|
11
|
+
import Slotted from '../../utils/slotted/Slotted.svelte';
|
|
12
|
+
|
|
13
|
+
type TreeProps = CommonProps & {
|
|
14
|
+
/** data to be displayed in the tree */
|
|
15
|
+
data?: T[];
|
|
16
|
+
|
|
17
|
+
/** paths to be displayed in the tree */
|
|
18
|
+
paths: Record<string, any>[];
|
|
19
|
+
|
|
20
|
+
/** field to be used for paths */
|
|
21
|
+
pathField?: string;
|
|
22
|
+
|
|
23
|
+
/** private use */
|
|
24
|
+
pathes?: TreeItemType[];
|
|
25
|
+
|
|
26
|
+
/** private use */
|
|
27
|
+
level?: number;
|
|
28
|
+
|
|
29
|
+
/** private use */
|
|
30
|
+
selectedDataKeys?: string[];
|
|
31
|
+
|
|
32
|
+
/** exported data */
|
|
33
|
+
selectedData?: T[];
|
|
34
|
+
|
|
35
|
+
/** exported selected paths */
|
|
36
|
+
selectedPathes?: string[];
|
|
37
|
+
|
|
38
|
+
/** the split we use to build hierarchy */
|
|
39
|
+
splitter?: string;
|
|
40
|
+
|
|
41
|
+
/** show checkbox to select */
|
|
42
|
+
showCheckBox?: boolean;
|
|
43
|
+
|
|
44
|
+
/** selected category */
|
|
45
|
+
selectedCategory?: string;
|
|
46
|
+
|
|
47
|
+
element?: HTMLElement;
|
|
48
|
+
children?: Snippet<[{ item: TreeItemType; idx: number }]>;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
let {
|
|
52
|
+
class: className = '',
|
|
53
|
+
pathField = 'path',
|
|
54
|
+
level = 0,
|
|
55
|
+
splitter = '/',
|
|
56
|
+
element = $bindable(),
|
|
57
|
+
data = $bindable([]),
|
|
58
|
+
paths = $bindable([]),
|
|
59
|
+
showCheckBox = $bindable(false),
|
|
60
|
+
selectedCategory = $bindable(''),
|
|
61
|
+
selectedDataKeys = $bindable([]),
|
|
62
|
+
selectedData = $bindable([]),
|
|
63
|
+
selectedPathes = $bindable([]),
|
|
64
|
+
pathes = trans2Tree(paths, pathField),
|
|
65
|
+
children
|
|
66
|
+
}: TreeProps = $props();
|
|
67
|
+
|
|
68
|
+
let visibleChildChild: Record<string, boolean> = $state({});
|
|
69
|
+
let finalPaths: TreeItemType[] = $state([]);
|
|
70
|
+
|
|
71
|
+
$effect(() => {
|
|
72
|
+
finalPaths = trans2Tree(paths, pathField);
|
|
73
|
+
selectedData = selectedDataKeys.map((dataKey) => {
|
|
74
|
+
return dataOp.filterListFirst(paths, dataKey, pathField);
|
|
75
|
+
});
|
|
76
|
+
selectedPathes = selectedDataKeys;
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
function handleCheck(dataObj: TreeItemType, act: boolean) {
|
|
80
|
+
if (act) {
|
|
81
|
+
selectedDataKeys = [...selectedDataKeys, dataObj.path].filter((x) => x);
|
|
82
|
+
} else {
|
|
83
|
+
delete selectedDataKeys[selectedDataKeys?.indexOf(dataObj.path)];
|
|
84
|
+
selectedDataKeys = [...selectedDataKeys].filter((x) => x);
|
|
85
|
+
}
|
|
86
|
+
// select all children down
|
|
87
|
+
setChildrenState(dataObj.children, act);
|
|
88
|
+
setParentState(dataObj, act);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function setParentState(dataObj: TreeItemType, act: boolean) {
|
|
92
|
+
const arrP = dataObj.path.split(splitter);
|
|
93
|
+
|
|
94
|
+
arrP.forEach((path, index) => {
|
|
95
|
+
let checkPath = arrP.slice(0, index).join(splitter);
|
|
96
|
+
|
|
97
|
+
if (act) {
|
|
98
|
+
selectedDataKeys = [...selectedDataKeys, checkPath].filter((x) => x);
|
|
99
|
+
} else {
|
|
100
|
+
delete selectedDataKeys[selectedDataKeys?.indexOf(checkPath)];
|
|
101
|
+
selectedDataKeys = [...selectedDataKeys].filter((x) => x);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function setChildrenState(dataObj: TreeItemType[], act: boolean) {
|
|
107
|
+
if (dataObj.length) {
|
|
108
|
+
dataObj.forEach((treeItem) => {
|
|
109
|
+
if (act) {
|
|
110
|
+
selectedDataKeys = [...selectedDataKeys, treeItem.path].filter((x) => x);
|
|
111
|
+
} else {
|
|
112
|
+
delete selectedDataKeys[selectedDataKeys?.indexOf(treeItem.path)];
|
|
113
|
+
selectedDataKeys = [...selectedDataKeys].filter((x) => x);
|
|
114
|
+
}
|
|
115
|
+
setChildrenState(treeItem.children, act);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function toggle(path: string, visibility?: boolean) {
|
|
121
|
+
visibleChildChild[path] = visibility ?? !visibleChildChild[path];
|
|
122
|
+
}
|
|
123
|
+
</script>
|
|
124
|
+
|
|
125
|
+
<div bind:this={element} class="tree {className}">
|
|
126
|
+
{#each pathes as pat, k}
|
|
127
|
+
<div data-category={pat.path}>
|
|
128
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
129
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
130
|
+
<div
|
|
131
|
+
data-category-title={pat.path}
|
|
132
|
+
aria-selected={selectedCategory === pat.path}
|
|
133
|
+
onclick={(event) => {
|
|
134
|
+
selectedCategory = pat.path;
|
|
135
|
+
toggle(pat.path);
|
|
136
|
+
}}
|
|
137
|
+
title={pat.path}
|
|
138
|
+
style="--tree-level:{level * 1.5}rem"
|
|
139
|
+
class="tree-cell"
|
|
140
|
+
>
|
|
141
|
+
<div class="tree-cell-arrow">
|
|
142
|
+
{#if pat?.children?.length}
|
|
143
|
+
<Icon icon="chevron-{visibleChildChild[pat.path] ? 'down' : 'right'}" />
|
|
144
|
+
{/if}
|
|
145
|
+
</div>
|
|
146
|
+
<div class="tree-cell-title-gutter">
|
|
147
|
+
{#if showCheckBox}
|
|
148
|
+
<input
|
|
149
|
+
onclick={(event) => {
|
|
150
|
+
event.stopPropagation();
|
|
151
|
+
handleCheck(pat, event?.currentTarget?.checked);
|
|
152
|
+
}}
|
|
153
|
+
type="checkbox"
|
|
154
|
+
style="display:block;border:1px solid red;"
|
|
155
|
+
checked={Boolean(selectedDataKeys.includes(pat.path))}
|
|
156
|
+
/>
|
|
157
|
+
{/if}
|
|
158
|
+
<Slotted child={children} slotArgs={{ item: pat, idx: k }}>
|
|
159
|
+
<div>{pat.name}</div>
|
|
160
|
+
</Slotted>
|
|
161
|
+
</div>
|
|
162
|
+
</div>
|
|
163
|
+
<div
|
|
164
|
+
data-category-children={pat.path}
|
|
165
|
+
style="display:{visibleChildChild[pat.path] ? '' : 'none'};"
|
|
166
|
+
>
|
|
167
|
+
{#if pat?.children?.length}
|
|
168
|
+
<svelte:self
|
|
169
|
+
level={level + 1}
|
|
170
|
+
bind:selectedDataKeys
|
|
171
|
+
bind:data
|
|
172
|
+
bind:selectedCategory
|
|
173
|
+
bind:showCheckBox
|
|
174
|
+
pathes={pat.children}
|
|
175
|
+
/>
|
|
176
|
+
{/if}
|
|
177
|
+
</div>
|
|
178
|
+
</div>
|
|
179
|
+
{/each}
|
|
180
|
+
</div>
|
|
181
|
+
|
|
182
182
|
<style>:root {
|
|
183
183
|
--tree-cell-border: 1px solid transparent;
|
|
184
184
|
--tree-cell-padding: var(--sld-pad-tiny);
|
|
@@ -228,4 +228,4 @@
|
|
|
228
228
|
border-radius: var(--sld-radius-med);
|
|
229
229
|
left: 0;
|
|
230
230
|
border: 1px solid var(--sld-color-primary-alpha-mid);
|
|
231
|
-
}</style>
|
|
231
|
+
}</style>
|
package/dist/ui/tree/tree.scss
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
@use "../../styles/slotui-mixins.scss";
|
|
2
|
-
|
|
3
|
-
:root {
|
|
4
|
-
--tree-cell-border: 1px solid transparent;
|
|
5
|
-
--tree-cell-padding: var(--sld-pad-tiny);
|
|
6
|
-
--tree-cell-border-radius: var(--sld-radius-small);
|
|
7
|
-
--tree-cell-gap: var(--sld-gap-tiny);
|
|
8
|
-
--tree-cell-arrow-width: 16px;
|
|
9
|
-
--tree-cell-title-gutter-gap: var(--sld-pad-tiny);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
.tree {
|
|
13
|
-
&-cell {
|
|
14
|
-
border: var(--tree-cell-border);
|
|
15
|
-
padding: var(--tree-cell-padding);
|
|
16
|
-
padding-left: var(--tree-level);
|
|
17
|
-
border-radius: var(--tree-cell-border-radius);
|
|
18
|
-
gap: var(--tree-cell-gap);
|
|
19
|
-
display: flex;
|
|
20
|
-
align-items: center;
|
|
21
|
-
width: 100%;
|
|
22
|
-
cursor: pointer;
|
|
23
|
-
|
|
24
|
-
&-arrow {
|
|
25
|
-
width: var(--tree-cell-arrow-width);
|
|
26
|
-
text-align: center;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
&-title-gutter {
|
|
30
|
-
display: flex;
|
|
31
|
-
align-items: center;
|
|
32
|
-
gap: var(--tree-cell-title-gutter-gap);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
@include slotui-mixins.data-hover;
|
|
36
|
-
@include slotui-mixins.data-selected;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
1
|
+
@use "../../styles/slotui-mixins.scss";
|
|
2
|
+
|
|
3
|
+
:root {
|
|
4
|
+
--tree-cell-border: 1px solid transparent;
|
|
5
|
+
--tree-cell-padding: var(--sld-pad-tiny);
|
|
6
|
+
--tree-cell-border-radius: var(--sld-radius-small);
|
|
7
|
+
--tree-cell-gap: var(--sld-gap-tiny);
|
|
8
|
+
--tree-cell-arrow-width: 16px;
|
|
9
|
+
--tree-cell-title-gutter-gap: var(--sld-pad-tiny);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.tree {
|
|
13
|
+
&-cell {
|
|
14
|
+
border: var(--tree-cell-border);
|
|
15
|
+
padding: var(--tree-cell-padding);
|
|
16
|
+
padding-left: var(--tree-level);
|
|
17
|
+
border-radius: var(--tree-cell-border-radius);
|
|
18
|
+
gap: var(--tree-cell-gap);
|
|
19
|
+
display: flex;
|
|
20
|
+
align-items: center;
|
|
21
|
+
width: 100%;
|
|
22
|
+
cursor: pointer;
|
|
23
|
+
|
|
24
|
+
&-arrow {
|
|
25
|
+
width: var(--tree-cell-arrow-width);
|
|
26
|
+
text-align: center;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
&-title-gutter {
|
|
30
|
+
display: flex;
|
|
31
|
+
align-items: center;
|
|
32
|
+
gap: var(--tree-cell-title-gutter-gap);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@include slotui-mixins.data-hover;
|
|
36
|
+
@include slotui-mixins.data-selected;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { openWindow } from './actions.svelte.js';
|
|
3
|
-
import Button from '../../controls/button/Button.svelte';
|
|
4
|
-
import Debug from '../../base/debug/Debug.svelte';
|
|
5
|
-
import Window from './Window.svelte';
|
|
6
|
-
|
|
7
|
-
/* demo */
|
|
8
|
-
import { defaultsArgs, defaultsArgsFromProps } from '../../base/demoer/demoer.utils.js';
|
|
9
|
-
import ComponentDemo from '../../base/demoer/DemoerComponent.svelte';
|
|
10
|
-
import Demoer from '../../base/demoer/Demoer.svelte';
|
|
11
|
-
import DemoPage from '../../base/demoer/DemoPage.svelte';
|
|
12
|
-
import Icon from '../../base/icon/Icon.svelte';
|
|
13
|
-
import { uiPresets } from '../../utils/engine/presets.js';
|
|
14
|
-
/* demo */
|
|
15
|
-
|
|
16
|
-
import { parameters, componentArgs } from './types.js';
|
|
17
|
-
|
|
18
|
-
let multiple = {
|
|
19
|
-
showHandle: {
|
|
20
|
-
true: { showHandle: true },
|
|
21
|
-
false: { showHandle: false }
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
let code = `
|
|
26
|
-
<Window title="Slotted window" frameId="slotted" >
|
|
27
|
-
{#snippet windowIcon()}
|
|
28
|
-
<Icon icon="bx:window-alt" />
|
|
29
|
-
{/snippet}
|
|
30
|
-
<div class="pad-4 align-center">
|
|
31
|
-
some slotted content
|
|
32
|
-
</div>
|
|
33
|
-
</Window>
|
|
34
|
-
`;
|
|
35
|
-
|
|
36
|
-
let codeProps = `
|
|
37
|
-
<Button
|
|
38
|
-
onclick={() => {
|
|
39
|
-
openWindow("html", {
|
|
40
|
-
componentProps: { some: "props", someother: "deprops" },
|
|
41
|
-
contentHTML:
|
|
42
|
-
'<div class="pad-4 align-center">some html content</div>',
|
|
43
|
-
});
|
|
44
|
-
}}>
|
|
45
|
-
Window with html content
|
|
46
|
-
</Button>
|
|
47
|
-
|
|
48
|
-
<Button
|
|
49
|
-
onclick={() => {
|
|
50
|
-
openWindow("component", {
|
|
51
|
-
component: Debug,
|
|
52
|
-
componentProps: { some: "props", someother: "deprops" },
|
|
53
|
-
});
|
|
54
|
-
}}>
|
|
55
|
-
Window with component
|
|
56
|
-
</Button>`;
|
|
57
|
-
</script>
|
|
58
|
-
|
|
59
|
-
<ComponentDemo
|
|
60
|
-
component="Window"
|
|
61
|
-
cite="Claiming they were not doors, made what they are today : windows <br /> Ch XX, 1320"
|
|
62
|
-
>
|
|
63
|
-
<div class="flex-v gap-large">
|
|
64
|
-
<DemoPage {code} component="Select">
|
|
65
|
-
<Demoer {multiple} {parameters} {componentArgs}
|
|
66
|
-
>{#snippet children({ activeParams })}
|
|
67
|
-
<div class="pad-2 h-large pos-rel">
|
|
68
|
-
<Window title="Slotted window" frameId="slotted" {...activeParams}>
|
|
69
|
-
{#snippet windowIcon()}
|
|
70
|
-
<Icon icon="bx:window-alt" />
|
|
71
|
-
{/snippet}
|
|
72
|
-
<div class="pad-4 align-center">some slotted content</div>
|
|
73
|
-
</Window>
|
|
74
|
-
</div>
|
|
75
|
-
{/snippet}
|
|
76
|
-
</Demoer>
|
|
77
|
-
</DemoPage>
|
|
78
|
-
<DemoPage code={codeProps} component="Select" title="Using props">
|
|
79
|
-
<Demoer {parameters} {componentArgs}>
|
|
80
|
-
{#snippet children({ activeParams })}
|
|
81
|
-
<div class="flex-h flex-align-middle pos-rel gap-medium">
|
|
82
|
-
<div>
|
|
83
|
-
<Button
|
|
84
|
-
onclick={() => {
|
|
85
|
-
openWindow('html', {
|
|
86
|
-
componentProps: { some: 'props', someother: 'deprops' },
|
|
87
|
-
contentHTML: '<div class="pad-4 align-center">some html content</div>'
|
|
88
|
-
});
|
|
89
|
-
}}
|
|
90
|
-
>
|
|
91
|
-
Window with html content
|
|
92
|
-
</Button>
|
|
93
|
-
</div>
|
|
94
|
-
<div>
|
|
95
|
-
<Button
|
|
96
|
-
onclick={() => {
|
|
97
|
-
openWindow('component', {
|
|
98
|
-
component: Debug,
|
|
99
|
-
componentProps: { some: 'props', someother: 'deprops' }
|
|
100
|
-
});
|
|
101
|
-
}}
|
|
102
|
-
>
|
|
103
|
-
Window with component
|
|
104
|
-
</Button>
|
|
105
|
-
</div>
|
|
106
|
-
</div>
|
|
107
|
-
{/snippet}
|
|
108
|
-
</Demoer>
|
|
109
|
-
</DemoPage>
|
|
110
|
-
</div>
|
|
111
|
-
</ComponentDemo>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { openWindow } from './actions.svelte.js';
|
|
3
|
+
import Button from '../../controls/button/Button.svelte';
|
|
4
|
+
import Debug from '../../base/debug/Debug.svelte';
|
|
5
|
+
import Window from './Window.svelte';
|
|
6
|
+
|
|
7
|
+
/* demo */
|
|
8
|
+
import { defaultsArgs, defaultsArgsFromProps } from '../../base/demoer/demoer.utils.js';
|
|
9
|
+
import ComponentDemo from '../../base/demoer/DemoerComponent.svelte';
|
|
10
|
+
import Demoer from '../../base/demoer/Demoer.svelte';
|
|
11
|
+
import DemoPage from '../../base/demoer/DemoPage.svelte';
|
|
12
|
+
import Icon from '../../base/icon/Icon.svelte';
|
|
13
|
+
import { uiPresets } from '../../utils/engine/presets.js';
|
|
14
|
+
/* demo */
|
|
15
|
+
|
|
16
|
+
import { parameters, componentArgs } from './types.js';
|
|
17
|
+
|
|
18
|
+
let multiple = {
|
|
19
|
+
showHandle: {
|
|
20
|
+
true: { showHandle: true },
|
|
21
|
+
false: { showHandle: false }
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
let code = `
|
|
26
|
+
<Window title="Slotted window" frameId="slotted" >
|
|
27
|
+
{#snippet windowIcon()}
|
|
28
|
+
<Icon icon="bx:window-alt" />
|
|
29
|
+
{/snippet}
|
|
30
|
+
<div class="pad-4 align-center">
|
|
31
|
+
some slotted content
|
|
32
|
+
</div>
|
|
33
|
+
</Window>
|
|
34
|
+
`;
|
|
35
|
+
|
|
36
|
+
let codeProps = `
|
|
37
|
+
<Button
|
|
38
|
+
onclick={() => {
|
|
39
|
+
openWindow("html", {
|
|
40
|
+
componentProps: { some: "props", someother: "deprops" },
|
|
41
|
+
contentHTML:
|
|
42
|
+
'<div class="pad-4 align-center">some html content</div>',
|
|
43
|
+
});
|
|
44
|
+
}}>
|
|
45
|
+
Window with html content
|
|
46
|
+
</Button>
|
|
47
|
+
|
|
48
|
+
<Button
|
|
49
|
+
onclick={() => {
|
|
50
|
+
openWindow("component", {
|
|
51
|
+
component: Debug,
|
|
52
|
+
componentProps: { some: "props", someother: "deprops" },
|
|
53
|
+
});
|
|
54
|
+
}}>
|
|
55
|
+
Window with component
|
|
56
|
+
</Button>`;
|
|
57
|
+
</script>
|
|
58
|
+
|
|
59
|
+
<ComponentDemo
|
|
60
|
+
component="Window"
|
|
61
|
+
cite="Claiming they were not doors, made what they are today : windows <br /> Ch XX, 1320"
|
|
62
|
+
>
|
|
63
|
+
<div class="flex-v gap-large">
|
|
64
|
+
<DemoPage {code} component="Select">
|
|
65
|
+
<Demoer {multiple} {parameters} {componentArgs}
|
|
66
|
+
>{#snippet children({ activeParams })}
|
|
67
|
+
<div class="pad-2 h-large pos-rel">
|
|
68
|
+
<Window title="Slotted window" frameId="slotted" {...activeParams}>
|
|
69
|
+
{#snippet windowIcon()}
|
|
70
|
+
<Icon icon="bx:window-alt" />
|
|
71
|
+
{/snippet}
|
|
72
|
+
<div class="pad-4 align-center">some slotted content</div>
|
|
73
|
+
</Window>
|
|
74
|
+
</div>
|
|
75
|
+
{/snippet}
|
|
76
|
+
</Demoer>
|
|
77
|
+
</DemoPage>
|
|
78
|
+
<DemoPage code={codeProps} component="Select" title="Using props">
|
|
79
|
+
<Demoer {parameters} {componentArgs}>
|
|
80
|
+
{#snippet children({ activeParams })}
|
|
81
|
+
<div class="flex-h flex-align-middle pos-rel gap-medium">
|
|
82
|
+
<div>
|
|
83
|
+
<Button
|
|
84
|
+
onclick={() => {
|
|
85
|
+
openWindow('html', {
|
|
86
|
+
componentProps: { some: 'props', someother: 'deprops' },
|
|
87
|
+
contentHTML: '<div class="pad-4 align-center">some html content</div>'
|
|
88
|
+
});
|
|
89
|
+
}}
|
|
90
|
+
>
|
|
91
|
+
Window with html content
|
|
92
|
+
</Button>
|
|
93
|
+
</div>
|
|
94
|
+
<div>
|
|
95
|
+
<Button
|
|
96
|
+
onclick={() => {
|
|
97
|
+
openWindow('component', {
|
|
98
|
+
component: Debug,
|
|
99
|
+
componentProps: { some: 'props', someother: 'deprops' }
|
|
100
|
+
});
|
|
101
|
+
}}
|
|
102
|
+
>
|
|
103
|
+
Window with component
|
|
104
|
+
</Button>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
{/snippet}
|
|
108
|
+
</Demoer>
|
|
109
|
+
</DemoPage>
|
|
110
|
+
</div>
|
|
111
|
+
</ComponentDemo>
|