poe-svelte-ui-lib 1.22.0 → 1.22.2
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/WidgetDeviceInfo/WidgetDeviceInfo.svelte +7 -2
- package/dist/WidgetDeviceInfo/WidgetDeviceInfoProps.svelte +6 -0
- package/dist/WidgetWiFi/WidgetWiFi.svelte +8 -2
- package/dist/WidgetWiFi/WidgetWiFiProps.svelte +10 -0
- package/dist/types.d.ts +4 -0
- package/dist/widgetCollapse.d.ts +2 -0
- package/dist/widgetCollapse.js +26 -0
- package/package.json +1 -1
|
@@ -12,12 +12,15 @@
|
|
|
12
12
|
import RestartIcon from "./RestartIcon.svelte"
|
|
13
13
|
import WidgetHeader from "../WidgetHeader.svelte"
|
|
14
14
|
import { widgetAccentStyle } from "../widgetAccent"
|
|
15
|
+
import { readPersistedCollapsed, writePersistedCollapsed } from "../widgetCollapse"
|
|
15
16
|
|
|
16
17
|
let {
|
|
17
18
|
wrapperClass = "",
|
|
18
19
|
componentClass = "",
|
|
19
20
|
label = { name: "Информация об устройстве" },
|
|
20
21
|
value = $bindable(),
|
|
22
|
+
collapsed: initialCollapsed = false,
|
|
23
|
+
persistKey,
|
|
21
24
|
onSave = () => {},
|
|
22
25
|
onRestart = () => {},
|
|
23
26
|
}: IWidgetDeviceInfoProps = $props()
|
|
@@ -37,8 +40,10 @@
|
|
|
37
40
|
},
|
|
38
41
|
)
|
|
39
42
|
|
|
40
|
-
/* Сворачивание тела виджета по клику на значок/заголовок (как аккордеон)
|
|
41
|
-
|
|
43
|
+
/* Сворачивание тела виджета по клику на значок/заголовок (как аккордеон), но в отличие от
|
|
44
|
+
Accordion переживает перезагрузку страницы через localStorage, если передан persistKey */
|
|
45
|
+
let collapsed = $state(readPersistedCollapsed(persistKey, initialCollapsed))
|
|
46
|
+
$effect(() => writePersistedCollapsed(persistKey, collapsed))
|
|
42
47
|
|
|
43
48
|
/* Поля редактируются локально (как Argument: NoSend в реальной GUI) — отправка одним пакетом по кнопке */
|
|
44
49
|
let savedSnapshot = $state(JSON.stringify(info))
|
|
@@ -22,5 +22,11 @@
|
|
|
22
22
|
value={component.properties.componentClass ?? ""}
|
|
23
23
|
onUpdate={(value) => updateProperty("componentClass", value, component, onPropertyChange)}
|
|
24
24
|
/>
|
|
25
|
+
<UI.Switch
|
|
26
|
+
label={{ name: "Свёрнут по умолчанию" }}
|
|
27
|
+
value={component.properties.collapsed ? 1 : 0}
|
|
28
|
+
options={[{ id: crypto.randomUUID(), value: 0, class: "" }]}
|
|
29
|
+
onChange={(value) => updateProperty("collapsed", value === 1, component, onPropertyChange)}
|
|
30
|
+
/>
|
|
25
31
|
</div>
|
|
26
32
|
</div>
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
import WarningIcon from "./WarningIcon.svelte"
|
|
16
16
|
import WidgetHeader from "../WidgetHeader.svelte"
|
|
17
17
|
import { widgetAccentStyle } from "../widgetAccent"
|
|
18
|
+
import { readPersistedCollapsed, writePersistedCollapsed } from "../widgetCollapse"
|
|
18
19
|
|
|
19
20
|
let {
|
|
20
21
|
wrapperClass = "",
|
|
@@ -23,6 +24,8 @@
|
|
|
23
24
|
value = $bindable(),
|
|
24
25
|
allowedModes = [1, 2, 3],
|
|
25
26
|
confirmOnAP = true,
|
|
27
|
+
collapsed: initialCollapsed = false,
|
|
28
|
+
persistKey,
|
|
26
29
|
onScan,
|
|
27
30
|
onSave = () => {},
|
|
28
31
|
}: IWidgetWiFiProps = $props()
|
|
@@ -85,8 +88,11 @@
|
|
|
85
88
|
}
|
|
86
89
|
|
|
87
90
|
/* Сворачивание тела виджета по клику на значок/заголовок (как аккордеон) — переключатель режима
|
|
88
|
-
в шапке кликом не триггерит, только сама кнопка значок+заголовок (см. WidgetHeader.svelte)
|
|
89
|
-
|
|
91
|
+
в шапке кликом не триггерит, только сама кнопка значок+заголовок (см. WidgetHeader.svelte).
|
|
92
|
+
В отличие от Accordion (только начальное значение из GUI) — переживает перезагрузку страницы
|
|
93
|
+
через localStorage, если передан persistKey. */
|
|
94
|
+
let collapsed = $state(readPersistedCollapsed(persistKey, initialCollapsed))
|
|
95
|
+
$effect(() => writePersistedCollapsed(persistKey, collapsed))
|
|
90
96
|
|
|
91
97
|
/* Поля редактируются локально (как Argument: NoSend в реальной GUI) — отправка одним пакетом по кнопке */
|
|
92
98
|
let savedSnapshot = $state(JSON.stringify(cfg))
|
|
@@ -55,6 +55,15 @@
|
|
|
55
55
|
/>
|
|
56
56
|
{/snippet}
|
|
57
57
|
|
|
58
|
+
{#snippet WidgetCollapsed()}
|
|
59
|
+
<UI.Switch
|
|
60
|
+
label={{ name: "Свёрнут по умолчанию" }}
|
|
61
|
+
value={component.properties.collapsed ? 1 : 0}
|
|
62
|
+
options={[{ id: crypto.randomUUID(), value: 0, class: "" }]}
|
|
63
|
+
onChange={(value) => updateProperty("collapsed", value === 1, component, onPropertyChange)}
|
|
64
|
+
/>
|
|
65
|
+
{/snippet}
|
|
66
|
+
|
|
58
67
|
<div class="flex w-full flex-col gap-3">
|
|
59
68
|
<div class="grid grid-cols-1 gap-3 sm:grid-cols-2">
|
|
60
69
|
{@render WidgetLabel()}
|
|
@@ -62,4 +71,5 @@
|
|
|
62
71
|
</div>
|
|
63
72
|
{@render WidgetAllowedModes()}
|
|
64
73
|
{@render WidgetColor()}
|
|
74
|
+
{@render WidgetCollapsed()}
|
|
65
75
|
</div>
|
package/dist/types.d.ts
CHANGED
|
@@ -516,6 +516,8 @@ export interface IWidgetWiFiProps {
|
|
|
516
516
|
value?: IWidgetWiFiConfig;
|
|
517
517
|
allowedModes?: number[];
|
|
518
518
|
confirmOnAP?: boolean;
|
|
519
|
+
collapsed?: boolean;
|
|
520
|
+
persistKey?: string;
|
|
519
521
|
onScan?: () => Promise<{
|
|
520
522
|
id: string;
|
|
521
523
|
name: string;
|
|
@@ -541,6 +543,8 @@ export interface IWidgetDeviceInfoProps {
|
|
|
541
543
|
name?: string;
|
|
542
544
|
};
|
|
543
545
|
value?: IWidgetDeviceInfoConfig;
|
|
546
|
+
collapsed?: boolean;
|
|
547
|
+
persistKey?: string;
|
|
544
548
|
onSave?: (info: IWidgetDeviceInfoConfig) => void;
|
|
545
549
|
onRestart?: () => void;
|
|
546
550
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/* $lib/widgetCollapse.ts — запоминание свёрнутости смарт-виджетов в localStorage браузера
|
|
2
|
+
(Accordion этого не делает — isOpen у него только начальное значение из сохранённого GUI,
|
|
3
|
+
без переживания перезагрузки; виджеты сделаны надёжнее). typeof window-проверка вместо
|
|
4
|
+
$app/environment — библиотека не должна знать про SvelteKit. */
|
|
5
|
+
const STORAGE_PREFIX = "widget-collapsed:";
|
|
6
|
+
export const readPersistedCollapsed = (persistKey, defaultValue = false) => {
|
|
7
|
+
if (!persistKey || typeof window === "undefined")
|
|
8
|
+
return defaultValue;
|
|
9
|
+
try {
|
|
10
|
+
const saved = window.localStorage.getItem(STORAGE_PREFIX + persistKey);
|
|
11
|
+
return saved === null ? defaultValue : saved === "1";
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return defaultValue;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
export const writePersistedCollapsed = (persistKey, collapsed) => {
|
|
18
|
+
if (!persistKey || typeof window === "undefined")
|
|
19
|
+
return;
|
|
20
|
+
try {
|
|
21
|
+
window.localStorage.setItem(STORAGE_PREFIX + persistKey, collapsed ? "1" : "0");
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
/* приватный режим/заблокировано — молча игнорируем, просто не запомнится */
|
|
25
|
+
}
|
|
26
|
+
};
|