mirror of
https://github.com/IoTManagerProject/IoTManagerWeb.git
synced 2026-03-26 23:12:34 +03:00
парсинг данных страниц
This commit is contained in:
127
src/App.svelte
127
src/App.svelte
@@ -45,25 +45,57 @@
|
||||
//dashboard
|
||||
let pages = [];
|
||||
|
||||
//ready flags
|
||||
let dashReady = false;
|
||||
let configReady = false;
|
||||
let connectionReady = false;
|
||||
let listReady = false;
|
||||
let systemReady = false;
|
||||
|
||||
//configuration
|
||||
let configJson = [];
|
||||
let configJsonFlag = false;
|
||||
let configJsonParced = false;
|
||||
|
||||
let widgetsJson = [];
|
||||
let widgetsJsonFlag = false;
|
||||
let widgetsJsonParced = false;
|
||||
|
||||
let itemsJson = [];
|
||||
let itemsJsonFlag = false;
|
||||
let itemsJsonParced = false;
|
||||
|
||||
let layoutJson = [];
|
||||
let layoutJsonFlag = false;
|
||||
let layoutJsonParced = false;
|
||||
|
||||
let settingsJson = {};
|
||||
let settingsJsonFlag = false;
|
||||
let settingsJsonParced = false;
|
||||
|
||||
let errorsJson = {};
|
||||
let errorsJsonParced = false;
|
||||
|
||||
let ssidJson = {};
|
||||
let ssidJsonParced = false;
|
||||
|
||||
let paramsJson = {};
|
||||
let paramsJsonParced = false;
|
||||
|
||||
let statusJsonParced = false;
|
||||
|
||||
let incDeviceList = [];
|
||||
let incDeviceListParced = false;
|
||||
|
||||
let deviceList = [];
|
||||
deviceList = [
|
||||
{
|
||||
name: "--",
|
||||
id: "--",
|
||||
ip: myip,
|
||||
status: false,
|
||||
},
|
||||
];
|
||||
|
||||
//web sockets
|
||||
let socket = [];
|
||||
@@ -77,19 +109,6 @@
|
||||
|
||||
let oneOfJsonPackageError = false;
|
||||
|
||||
let deviceList = [];
|
||||
deviceList = [
|
||||
{
|
||||
name: "--",
|
||||
id: "--",
|
||||
ip: myip,
|
||||
status: false,
|
||||
},
|
||||
];
|
||||
|
||||
let incDeviceList = [];
|
||||
let incDeviceListParced = false;
|
||||
|
||||
//***********************************************************blob**************************************************************/
|
||||
var MyBlobBuilder = function () {
|
||||
this.parts = [];
|
||||
@@ -235,16 +254,16 @@
|
||||
udateStatusOfWidget(statusJson);
|
||||
wigetsUpdate();
|
||||
if (debug) console.log("✔", "statusJson parced");
|
||||
statusJsonParced = true;
|
||||
onParced("status");
|
||||
}
|
||||
}
|
||||
//сборщик paramsJson сообщений======================================
|
||||
if (data.includes("params")) {
|
||||
if (IsJsonParse(data)) {
|
||||
let paramsJson = JSON.parse(data);
|
||||
udateStatusOfAllWidgets(paramsJson);
|
||||
wigetsUpdate();
|
||||
paramsJson = JSON.parse(data);
|
||||
if (debug) console.log("✔", "paramsJson parced");
|
||||
paramsJsonParced = true;
|
||||
onParced("params");
|
||||
}
|
||||
}
|
||||
@@ -254,6 +273,7 @@
|
||||
ssidJson = JSON.parse(data);
|
||||
ssidJson = ssidJson;
|
||||
if (debug) console.log("✔", "ssidJson parced");
|
||||
ssidJsonParced = true;
|
||||
onParced("ssid");
|
||||
}
|
||||
}
|
||||
@@ -267,6 +287,7 @@
|
||||
deviceList = deviceList;
|
||||
whenDeviceListWasUpdated();
|
||||
connectToAllDevices();
|
||||
|
||||
if (debug) console.log("✔", "incDeviceList json parced");
|
||||
onParced("devicelist");
|
||||
}
|
||||
@@ -276,8 +297,8 @@
|
||||
if (IsJsonParse(data)) {
|
||||
errorsJson = JSON.parse(data);
|
||||
errorsJson = errorsJson;
|
||||
errorsJsonParced = true;
|
||||
if (debug) console.log("✔", "errorsJson json parced");
|
||||
//dataReceived();
|
||||
onParced("errors");
|
||||
}
|
||||
}
|
||||
@@ -295,6 +316,7 @@
|
||||
if (IsJsonParse(configJsonResult)) {
|
||||
configJson = JSON.parse(configJsonResult);
|
||||
configJson = configJson;
|
||||
configJsonParced = true;
|
||||
if (debug) console.log("✔", "configJson parced");
|
||||
onParced("config");
|
||||
}
|
||||
@@ -314,6 +336,7 @@
|
||||
if (IsJsonParse(widgetsJsonResult)) {
|
||||
widgetsJson = JSON.parse(widgetsJsonResult);
|
||||
widgetsJson = widgetsJson;
|
||||
widgetsJsonParced = true;
|
||||
if (debug) console.log("✔", "widgetsJson parced");
|
||||
onParced("widgets");
|
||||
}
|
||||
@@ -333,6 +356,7 @@
|
||||
if (IsJsonParse(itemsJsonResult)) {
|
||||
itemsJson = JSON.parse(itemsJsonResult);
|
||||
itemsJson = itemsJson;
|
||||
itemsJsonParced = true;
|
||||
if (debug) console.log("✔", "itemsJson parced");
|
||||
onParced("items");
|
||||
}
|
||||
@@ -353,6 +377,7 @@
|
||||
layoutJson = JSON.parse(layoutJsonResult);
|
||||
layoutJson = layoutJson;
|
||||
wigetsUpdate();
|
||||
layoutJsonParced = true;
|
||||
if (debug) console.log("✔", "layoutJson parced");
|
||||
onParced("layout");
|
||||
}
|
||||
@@ -374,6 +399,7 @@
|
||||
settingsJson = settingsJson;
|
||||
wigetsUpdate();
|
||||
updateThisDeviceInList();
|
||||
settingsJsonParced = true;
|
||||
if (debug) console.log("✔", "settingsJson parced");
|
||||
onParced("settings");
|
||||
}
|
||||
@@ -401,6 +427,36 @@
|
||||
}
|
||||
}
|
||||
|
||||
function onParced(file) {
|
||||
if (currentPageName === "/|" && layoutJsonParced && paramsJsonParced) {
|
||||
clearParcedFlags();
|
||||
if (debug) console.log("✔✔", "dashboard data parced");
|
||||
udateStatusOfAllWidgets(paramsJson);
|
||||
wigetsUpdate();
|
||||
dashReady = true;
|
||||
}
|
||||
if (currentPageName === "/config|" && itemsJsonParced && widgetsJsonParced && configJsonParced && settingsJsonParced) {
|
||||
clearParcedFlags();
|
||||
if (debug) console.log("✔✔", "config data parced");
|
||||
configReady = true;
|
||||
}
|
||||
if (currentPageName === "/connection|" && ssidJsonParced && settingsJsonParced && errorsJsonParced) {
|
||||
clearParcedFlags();
|
||||
if (debug) console.log("✔✔", "connection data parced");
|
||||
connectionReady = true;
|
||||
}
|
||||
if (currentPageName === "/list|" && incDeviceListParced) {
|
||||
clearParcedFlags();
|
||||
if (debug) console.log("✔✔", "list data parced");
|
||||
listReady = true;
|
||||
}
|
||||
if (currentPageName === "/system|" && errorsJsonParced) {
|
||||
clearParcedFlags();
|
||||
if (debug) console.log("✔✔", "system data parced");
|
||||
systemReady = true;
|
||||
}
|
||||
}
|
||||
|
||||
function saveConfig() {
|
||||
wsSendMsg(selectedWs, "/tuoyal|" + JSON.stringify(generateLayout()));
|
||||
wsSendMsg(selectedWs, "/gifnoc|" + JSON.stringify(configJson));
|
||||
@@ -501,9 +557,30 @@
|
||||
|
||||
errorsJson = {};
|
||||
|
||||
dashReady = false;
|
||||
configReady = false;
|
||||
connectionReady = false;
|
||||
listReady = false;
|
||||
systemReady = false;
|
||||
|
||||
clearParcedFlags();
|
||||
|
||||
if (debug) console.log("[i]", "all app data cleared");
|
||||
}
|
||||
|
||||
function clearParcedFlags() {
|
||||
configJsonParced = false;
|
||||
widgetsJsonParced = false;
|
||||
itemsJsonParced = false;
|
||||
layoutJsonParced = false;
|
||||
settingsJsonParced = false;
|
||||
errorsJsonParced = false;
|
||||
ssidJsonParced = false;
|
||||
paramsJsonParced = false;
|
||||
statusJsonParced = false;
|
||||
incDeviceListParced = false;
|
||||
}
|
||||
|
||||
function wsPush(ws, topic, status) {
|
||||
let msg = topic + " " + status;
|
||||
if (debug) console.log("[i]", "send to ws msg:", msg);
|
||||
@@ -802,8 +879,6 @@
|
||||
wsSendMsg(selectedWs, '/rorre|{"' + alarmKey + '":0}');
|
||||
}
|
||||
|
||||
function onParced(file) {}
|
||||
|
||||
//*******************************************************initialisation********************************************************************/
|
||||
onMount(async () => {
|
||||
console.log("[i]", "mounted");
|
||||
@@ -879,16 +954,19 @@
|
||||
<Alarm title="Нет соединения" />
|
||||
{:else}
|
||||
<Route path="/">
|
||||
<DashboardPage layoutJson={layoutJson} pages={pages} wsPush={(ws, topic, status) => wsPush(ws, topic, status)} />
|
||||
<DashboardPage show={dashReady} layoutJson={layoutJson} pages={pages} wsPush={(ws, topic, status) => wsPush(ws, topic, status)} />
|
||||
</Route>
|
||||
<Route path="/config">
|
||||
<ConfigPage configJson={configJson} widgetsJson={widgetsJson} itemsJson={itemsJson} saveConfig={() => saveConfig()} />
|
||||
<ConfigPage show={configReady} configJson={configJson} widgetsJson={widgetsJson} itemsJson={itemsJson} saveConfig={() => saveConfig()} />
|
||||
</Route>
|
||||
<Route path="/connection">
|
||||
<ConnectionPage rebootEsp={() => rebootEsp()} ssidClick={() => ssidClick()} saveSett={() => saveSett()} saveMqtt={() => saveMqtt()} settingsJson={settingsJson} errorsJson={errorsJson} ssidJson={ssidJson} />
|
||||
<ConnectionPage show={connectionReady} rebootEsp={() => rebootEsp()} ssidClick={() => ssidClick()} saveSett={() => saveSett()} saveMqtt={() => saveMqtt()} settingsJson={settingsJson} errorsJson={errorsJson} ssidJson={ssidJson} />
|
||||
</Route>
|
||||
<Route path="/list">
|
||||
<ListPage show={listReady} deviceList={deviceList} showInput={showInput} addDevInList={() => addDevInList()} newDevice={newDevice} />
|
||||
</Route>
|
||||
<Route path="/system">
|
||||
<SystemPage settingsJson={settingsJson} errorsJson={errorsJson} rebootEsp={() => rebootEsp()} cancelAlarm={(alarmKey) => cancelAlarm(alarmKey)} version={version} />
|
||||
<SystemPage show={systemReady} settingsJson={settingsJson} errorsJson={errorsJson} rebootEsp={() => rebootEsp()} cancelAlarm={(alarmKey) => cancelAlarm(alarmKey)} version={version} />
|
||||
</Route>
|
||||
|
||||
<!--<Route path="/utilities">-->
|
||||
@@ -901,9 +979,6 @@
|
||||
<!--<AboutPage wigetsUpdate={wigetsUpdate} layoutJson={layoutJson} showModal={() => showModal()} syntaxHighlight={(json) => syntaxHighlight(json)} />-->
|
||||
<!--</Route>-->
|
||||
{/if}
|
||||
<Route path="/list">
|
||||
<ListPage deviceList={deviceList} showInput={showInput} addDevInList={() => addDevInList()} newDevice={newDevice} />
|
||||
</Route>
|
||||
</div>
|
||||
</ul>
|
||||
</main>
|
||||
|
||||
@@ -2,11 +2,14 @@
|
||||
import Card from "../components/Card.svelte";
|
||||
import CrossIcon from "../svg/Cross.svelte";
|
||||
import OpenIcon from "../svg/Open.svelte";
|
||||
import Alarm from "../components/Alarm.svelte";
|
||||
|
||||
export let configJson;
|
||||
export let widgetsJson;
|
||||
export let itemsJson;
|
||||
|
||||
export let show;
|
||||
|
||||
let itemsJsonBind = 0;
|
||||
let debug = true;
|
||||
|
||||
@@ -41,80 +44,78 @@
|
||||
}
|
||||
</script>
|
||||
|
||||
<!--{#if itemsJsonParced && widgetsJsonParced && configJsonParced && settingsJsonParced}-->
|
||||
<div class="grd-1col1">
|
||||
<Card>
|
||||
<div class="grd-2col2">
|
||||
<select class="slct-lg" bind:value={itemsJsonBind} on:change={() => elementsDropdownChange()}>
|
||||
{#each itemsJson as item}
|
||||
{#if item.header}
|
||||
<optgroup label={item.header} />
|
||||
{/if}
|
||||
{#if !item.header}
|
||||
<option value={item.num}>
|
||||
{item.name}
|
||||
</option>
|
||||
{/if}
|
||||
{/each}
|
||||
</select>
|
||||
<select class="slct-lg"><option>{"Выберите пресет"}</option></select>
|
||||
</div>
|
||||
<table class="tbl">
|
||||
<thead class="bg-gray-100">
|
||||
<tr class="txt-sz txt-pad">
|
||||
<th class="tbl-hd">Тип</th>
|
||||
<th class="tbl-hd">Id</th>
|
||||
<th class="tbl-hd">Виджет</th>
|
||||
<th class="tbl-hd">Вкладка</th>
|
||||
<th class="tbl-hd">Название</th>
|
||||
<th class="tbl-hd w-7" />
|
||||
<th class="tbl-hd w-7" />
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="bg-white">
|
||||
{#each configJson as element, i}
|
||||
<tr class="txt-sz txt-pad align-middle">
|
||||
<td class="tbl-bdy-lg">{element.subtype}</td>
|
||||
<td class="tbl-bdy-lg"><input bind:value={element.id} class="ipt-lg w-full" type="text" /></td>
|
||||
<td class="tbl-bdy-lg"
|
||||
><select bind:value={element.widget} class="ipt-lg w-full">
|
||||
{#each widgetsJson as select}
|
||||
<option value={select.name}>
|
||||
{select.label}
|
||||
</option>
|
||||
{/each}
|
||||
</select></td>
|
||||
<td class="tbl-bdy-lg"><input bind:value={element.page} class="ipt-lg w-full" type="text" /></td>
|
||||
<td class="tbl-bdy-lg"><input bind:value={element.descr} class="ipt-lg w-full" type="text" /></td>
|
||||
<td class="tbl-bdy-lg"><OpenIcon click={() => (hideAllSubParams = !hideAllSubParams)} /></td>
|
||||
<td class="tbl-bdy-lg"><CrossIcon click={() => deleteLineFromConfig(i)} /></td>
|
||||
{#if show}
|
||||
<div class="grd-1col1">
|
||||
<Card>
|
||||
<div class="grd-2col2">
|
||||
<select class="slct-lg" bind:value={itemsJsonBind} on:change={() => elementsDropdownChange()}>
|
||||
{#each itemsJson as item}
|
||||
{#if item.header}
|
||||
<optgroup label={item.header} />
|
||||
{/if}
|
||||
{#if !item.header}
|
||||
<option value={item.num}>
|
||||
{item.name}
|
||||
</option>
|
||||
{/if}
|
||||
{/each}
|
||||
</select>
|
||||
<select class="slct-lg"><option>{"Выберите пресет"}</option></select>
|
||||
</div>
|
||||
<table class="tbl">
|
||||
<thead class="bg-gray-100">
|
||||
<tr class="txt-sz txt-pad">
|
||||
<th class="tbl-hd">Тип</th>
|
||||
<th class="tbl-hd">Id</th>
|
||||
<th class="tbl-hd">Виджет</th>
|
||||
<th class="tbl-hd">Вкладка</th>
|
||||
<th class="tbl-hd">Название</th>
|
||||
<th class="tbl-hd w-7" />
|
||||
<th class="tbl-hd w-7" />
|
||||
</tr>
|
||||
{#if !hideAllSubParams}
|
||||
{#each Object.entries(element) as [key, param]}
|
||||
{#if key != "type" && key != "subtype" && key != "id" && key != "widget" && key != "page" && key != "descr"}
|
||||
<tr class="txt-sz txt-pad">
|
||||
<td />
|
||||
<td />
|
||||
<td />
|
||||
<td class="tbl-bdy-sm text-right">
|
||||
<p class="txt-ita">{key}</p>
|
||||
</td>
|
||||
<td class="tbl-bdy-sm text-center">
|
||||
<input bind:value={element[key]} class="ipt-sm w-full" type="text" />
|
||||
</td>
|
||||
</tr>
|
||||
{/if}
|
||||
{/each}
|
||||
<!--<br />-->
|
||||
{/if}
|
||||
{/each}
|
||||
</tbody>
|
||||
</table>
|
||||
<button class="btn-lg" on:click={() => saveConfig()}>{"Сохранить"}</button>
|
||||
</Card>
|
||||
</div>
|
||||
<!--{:else if !itemsJsonParced && !widgetsJsonParced && !configJsonParced && !settingsJsonParced}-->
|
||||
<!--<div class="flex justify-center items-center">-->
|
||||
<!--<div style="border-top-color:transparent" class="w-20 h-20 border-4 border-blue-400 border-solid rounded-full animate-spin" />-->
|
||||
<!--</div>-->
|
||||
<!--{/if}-->
|
||||
</thead>
|
||||
<tbody class="bg-white">
|
||||
{#each configJson as element, i}
|
||||
<tr class="txt-sz txt-pad align-middle">
|
||||
<td class="tbl-bdy-lg">{element.subtype}</td>
|
||||
<td class="tbl-bdy-lg"><input bind:value={element.id} class="ipt-lg w-full" type="text" /></td>
|
||||
<td class="tbl-bdy-lg"
|
||||
><select bind:value={element.widget} class="ipt-lg w-full">
|
||||
{#each widgetsJson as select}
|
||||
<option value={select.name}>
|
||||
{select.label}
|
||||
</option>
|
||||
{/each}
|
||||
</select></td>
|
||||
<td class="tbl-bdy-lg"><input bind:value={element.page} class="ipt-lg w-full" type="text" /></td>
|
||||
<td class="tbl-bdy-lg"><input bind:value={element.descr} class="ipt-lg w-full" type="text" /></td>
|
||||
<td class="tbl-bdy-lg"><OpenIcon click={() => (hideAllSubParams = !hideAllSubParams)} /></td>
|
||||
<td class="tbl-bdy-lg"><CrossIcon click={() => deleteLineFromConfig(i)} /></td>
|
||||
</tr>
|
||||
{#if !hideAllSubParams}
|
||||
{#each Object.entries(element) as [key, param]}
|
||||
{#if key != "type" && key != "subtype" && key != "id" && key != "widget" && key != "page" && key != "descr"}
|
||||
<tr class="txt-sz txt-pad">
|
||||
<td />
|
||||
<td />
|
||||
<td />
|
||||
<td class="tbl-bdy-sm text-right">
|
||||
<p class="txt-ita">{key}</p>
|
||||
</td>
|
||||
<td class="tbl-bdy-sm text-center">
|
||||
<input bind:value={element[key]} class="ipt-sm w-full" type="text" />
|
||||
</td>
|
||||
</tr>
|
||||
{/if}
|
||||
{/each}
|
||||
<!--<br />-->
|
||||
{/if}
|
||||
{/each}
|
||||
</tbody>
|
||||
</table>
|
||||
<button class="btn-lg" on:click={() => saveConfig()}>{"Сохранить"}</button>
|
||||
</Card>
|
||||
</div>
|
||||
{:else}
|
||||
<Alarm title="Загрузка..." />
|
||||
{/if}
|
||||
|
||||
@@ -6,131 +6,137 @@
|
||||
export let errorsJson;
|
||||
export let ssidJson;
|
||||
|
||||
export let show;
|
||||
|
||||
export let ssidClick = () => {};
|
||||
export let saveSett = () => {};
|
||||
export let saveMqtt = () => {};
|
||||
export let rebootEsp = () => {};
|
||||
</script>
|
||||
|
||||
<div class="grd-2col1">
|
||||
<Card title="Подключение к WiFi">
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Название устройства</p>
|
||||
{#if show}
|
||||
<div class="grd-2col1">
|
||||
<Card title="Подключение к WiFi">
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Название устройства</p>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.name} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.name} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Точка доступа</p>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.apssid} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Точка доступа</p>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Пароль точки доступа</p>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.appass} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.apssid} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Название wifi сети</p>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<select class="ipt-rnd text-left focus:border-indigo-500" bind:value={settingsJson.routerssid} on:click={() => ssidClick()}>
|
||||
{#each Object.entries(ssidJson) as [num, ssid]}
|
||||
<option value={ssid}>
|
||||
{ssid}
|
||||
</option>
|
||||
{/each}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Пароль точки доступа</p>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Пароль</p>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.routerpass} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.appass} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Название wifi сети</p>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<select class="ipt-rnd text-left focus:border-indigo-500" bind:value={settingsJson.routerssid} on:click={() => ssidClick()}>
|
||||
{#each Object.entries(ssidJson) as [num, ssid]}
|
||||
<option value={ssid}>
|
||||
{ssid}
|
||||
</option>
|
||||
{/each}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Пароль</p>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.routerpass} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
</div>
|
||||
</div>
|
||||
{#if errorsJson.passer === 1}
|
||||
<div class="grd-1col1">
|
||||
<Alarm title="Введен неправильный пароль" />
|
||||
</div>
|
||||
{/if}
|
||||
{#if errorsJson.passer === 1}
|
||||
<div class="grd-1col1">
|
||||
<Alarm title="Введен неправильный пароль" />
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<button class="btn-lg" on:click={() => saveSett()}>{"Сохранить"}</button>
|
||||
</Card>
|
||||
<button class="btn-lg" on:click={() => saveSett()}>{"Сохранить"}</button>
|
||||
</Card>
|
||||
|
||||
<Card title="Подключение к MQTT">
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Состояние подключения</p>
|
||||
<Card title="Подключение к MQTT">
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Состояние подключения</p>
|
||||
</div>
|
||||
<div class="flex justify-center w-3/6 align-baseline text-sm sm:text-sm md:text-base lg:text-base xl:text-base 2xl:text-base break-words">
|
||||
{#if errorsJson.mqtt === "e5"}
|
||||
<p class="text-green-500 font-bold h-8 bg-green-50 border-2 border-gray-200 rounded w-full text-center">Подключено</p>
|
||||
{:else if errorsJson.mqtt === "e13"}
|
||||
<p class="text-yellow-500 font-bold h-8 bg-yellow-50 border-2 border-gray-200 rounded w-full text-center">Подключение</p>
|
||||
{:else if errorsJson.mqtt === undefined}
|
||||
<p class="text-blue-500 font-bold h-8 bg-blue-50 border-2 border-gray-200 rounded w-full text-center">Ожидание</p>
|
||||
{:else}
|
||||
<p class="text-red-500 font-bold h-8 bg-red-50 border-2 border-gray-200 rounded w-full text-center">Ошибка</p>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-center w-3/6 align-baseline text-sm sm:text-sm md:text-base lg:text-base xl:text-base 2xl:text-base break-words">
|
||||
{#if errorsJson.mqtt === "e5"}
|
||||
<p class="text-green-500 font-bold h-8 bg-green-50 border-2 border-gray-200 rounded w-full text-center">Подключено</p>
|
||||
{:else if errorsJson.mqtt === "e13"}
|
||||
<p class="text-yellow-500 font-bold h-8 bg-yellow-50 border-2 border-gray-200 rounded w-full text-center">Подключение</p>
|
||||
{:else if errorsJson.mqtt === undefined}
|
||||
<p class="text-blue-500 font-bold h-8 bg-blue-50 border-2 border-gray-200 rounded w-full text-center">Ожидание</p>
|
||||
{:else}
|
||||
<p class="text-red-500 font-bold h-8 bg-red-50 border-2 border-gray-200 rounded w-full text-center">Ошибка</p>
|
||||
{/if}
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Название сервера</p>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.mqttServer} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Название сервера</p>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Порт</p>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.mqttPort} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.mqttServer} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Префикс</p>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.mqttPrefix} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Порт</p>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Имя пользователя</p>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.mqttUser} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.mqttPort} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Пароль</p>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.mqttPass} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Префикс</p>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.mqttPrefix} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Имя пользователя</p>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.mqttUser} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-4/6">
|
||||
<p class="wgt-dscr-stl">Пароль</p>
|
||||
</div>
|
||||
<div class="flex justify-end w-3/6">
|
||||
<input bind:value={settingsJson.mqttPass} class="ipt-rnd text-left focus:border-indigo-500" type="text" />
|
||||
</div>
|
||||
</div>
|
||||
<button class="btn-lg" on:click={() => saveMqtt()}>{"Сохранить"}</button>
|
||||
</Card>
|
||||
</div>
|
||||
<div class="grd-1col1">
|
||||
<Card>
|
||||
<button class="btn-lg" on:click={() => rebootEsp()}>{"Перезагрузить устройство"}</button>
|
||||
</Card>
|
||||
</div>
|
||||
<button class="btn-lg" on:click={() => saveMqtt()}>{"Сохранить"}</button>
|
||||
</Card>
|
||||
</div>
|
||||
<div class="grd-1col1">
|
||||
<Card>
|
||||
<button class="btn-lg" on:click={() => rebootEsp()}>{"Перезагрузить устройство"}</button>
|
||||
</Card>
|
||||
</div>
|
||||
{:else}
|
||||
<Alarm title="Загрузка..." />
|
||||
{/if}
|
||||
|
||||
@@ -3,32 +3,39 @@
|
||||
import Input from "../widgets/Input.svelte";
|
||||
import Toggle from "../widgets/Toggle.svelte";
|
||||
import Anydata from "../widgets/Anydata.svelte";
|
||||
import Alarm from "../components/Alarm.svelte";
|
||||
|
||||
export let layoutJson;
|
||||
export let pages;
|
||||
|
||||
export let show;
|
||||
|
||||
export let wsPush = (ws, topic, status) => {};
|
||||
</script>
|
||||
|
||||
<div class="grd-3col1">
|
||||
{#if layoutJson === []}
|
||||
<Card title={"Ваша панель управления пуста, вначале добавьте новые элементы в конфигураторе!"} />
|
||||
{/if}
|
||||
{#each pages as pagesName, i}
|
||||
<Card title={pagesName.page}>
|
||||
{#each layoutJson as widget, i}
|
||||
{#if widget.page === pagesName.page}
|
||||
{#if widget.widget === "input"}
|
||||
<Input bind:value={widget.status} widget={widget} wsPush={(ws, topic, status) => wsPush(ws, topic, status)} />
|
||||
{#if show}
|
||||
<div class="grd-3col1">
|
||||
{#if layoutJson === []}
|
||||
<Card title={"Ваша панель управления пуста, вначале добавьте новые элементы в конфигураторе!"} />
|
||||
{/if}
|
||||
{#each pages as pagesName, i}
|
||||
<Card title={pagesName.page}>
|
||||
{#each layoutJson as widget, i}
|
||||
{#if widget.page === pagesName.page}
|
||||
{#if widget.widget === "input"}
|
||||
<Input bind:value={widget.status} widget={widget} wsPush={(ws, topic, status) => wsPush(ws, topic, status)} />
|
||||
{/if}
|
||||
{#if widget.widget === "toggle"}
|
||||
<Toggle bind:value={widget.status} widget={widget} wsPush={(ws, topic, status) => wsPush(ws, topic, status)} />
|
||||
{/if}
|
||||
{#if widget.widget === "anydata"}
|
||||
<Anydata bind:value={widget.status} widget={widget} />
|
||||
{/if}
|
||||
{/if}
|
||||
{#if widget.widget === "toggle"}
|
||||
<Toggle bind:value={widget.status} widget={widget} wsPush={(ws, topic, status) => wsPush(ws, topic, status)} />
|
||||
{/if}
|
||||
{#if widget.widget === "anydata"}
|
||||
<Anydata bind:value={widget.status} widget={widget} />
|
||||
{/if}
|
||||
{/if}
|
||||
{/each}
|
||||
</Card>
|
||||
{/each}
|
||||
</div>
|
||||
{/each}
|
||||
</Card>
|
||||
{/each}
|
||||
</div>
|
||||
{:else}
|
||||
<Alarm title="Загрузка..." />
|
||||
{/if}
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
import CrossIcon from "../svg/Cross.svelte";
|
||||
import OpenIcon from "../svg/Open.svelte";
|
||||
|
||||
export let show;
|
||||
|
||||
export let deviceList;
|
||||
export let showInput;
|
||||
export let newDevice = {};
|
||||
@@ -25,41 +27,45 @@
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="grd-1col1">
|
||||
<Card title={"Список устройств"}>
|
||||
<table class="tbl">
|
||||
<thead class="bg-gray-100">
|
||||
<tr class="txt-sz txt-pad">
|
||||
<th class="tbl-hd">Название устройства</th>
|
||||
<th class="tbl-hd">IP адрес</th>
|
||||
<th class="tbl-hd">Идентификатор</th>
|
||||
<th class="tbl-hd">Состояние</th>
|
||||
<th class="tbl-hd w-7" />
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="bg-white">
|
||||
{#each deviceList as device, i}
|
||||
{#if show}
|
||||
<div class="grd-1col1">
|
||||
<Card title={"Список устройств"}>
|
||||
<table class="tbl">
|
||||
<thead class="bg-gray-100">
|
||||
<tr class="txt-sz txt-pad">
|
||||
<td class="tbl-bdy-lg ipt-lg w-full">{device.name}</td>
|
||||
<td class="tbl-bdy-lg ipt-lg w-full"><a href={"http://" + device.ip}>{device.ip}</a></td>
|
||||
<td class="tbl-bdy-lg ipt-lg w-full">{device.id}</td>
|
||||
<td class="tbl-bdy-lg ipt-lg w-full {device.status ? 'bg-green-50' : 'bg-red-50'}">{device.status ? "online" : "offline"}</td>
|
||||
<td class="tbl-bdy-lg"><CrossIcon click={() => deleteLineFromDevlist(i)} /></td>
|
||||
<th class="tbl-hd">Название устройства</th>
|
||||
<th class="tbl-hd">IP адрес</th>
|
||||
<th class="tbl-hd">Идентификатор</th>
|
||||
<th class="tbl-hd">Состояние</th>
|
||||
<th class="tbl-hd w-7" />
|
||||
</tr>
|
||||
{/each}
|
||||
{#if showInput}
|
||||
<tr class="txt-sz txt-pad">
|
||||
<td class="tbl-bdy-lg"><input bind:value={newDevice.name} class="ipt-lg w-full" type="text" /></td>
|
||||
<td class="tbl-bdy-lg"><input bind:value={newDevice.ip} class="ipt-lg w-full" type="text" /></td>
|
||||
<td class="tbl-bdy-lg"><input bind:value={newDevice.id} class="ipt-lg w-full" type="text" /></td>
|
||||
<td class="tbl-bdy-lg" />
|
||||
</tr>
|
||||
{/if}
|
||||
</tbody>
|
||||
</table>
|
||||
<button class="btn-lg" on:click={() => ((showInput = !showInput), addDevInList())}>{showInput ? "Сохранить" : "Добавить устройство"}</button>
|
||||
</Card>
|
||||
<Alarm>
|
||||
<p>Список устройств будет обновляться автоматически. Подключенные к одному роутеру устройства будут появляться в списке в течении двух минут. Ручное добавление сделано в целях проверки для разработчика.</p>
|
||||
</Alarm>
|
||||
</div>
|
||||
</thead>
|
||||
<tbody class="bg-white">
|
||||
{#each deviceList as device, i}
|
||||
<tr class="txt-sz txt-pad">
|
||||
<td class="tbl-bdy-lg ipt-lg w-full">{device.name}</td>
|
||||
<td class="tbl-bdy-lg ipt-lg w-full"><a href={"http://" + device.ip}>{device.ip}</a></td>
|
||||
<td class="tbl-bdy-lg ipt-lg w-full">{device.id}</td>
|
||||
<td class="tbl-bdy-lg ipt-lg w-full {device.status ? 'bg-green-50' : 'bg-red-50'}">{device.status ? "online" : "offline"}</td>
|
||||
<td class="tbl-bdy-lg"><CrossIcon click={() => deleteLineFromDevlist(i)} /></td>
|
||||
</tr>
|
||||
{/each}
|
||||
{#if showInput}
|
||||
<tr class="txt-sz txt-pad">
|
||||
<td class="tbl-bdy-lg"><input bind:value={newDevice.name} class="ipt-lg w-full" type="text" /></td>
|
||||
<td class="tbl-bdy-lg"><input bind:value={newDevice.ip} class="ipt-lg w-full" type="text" /></td>
|
||||
<td class="tbl-bdy-lg"><input bind:value={newDevice.id} class="ipt-lg w-full" type="text" /></td>
|
||||
<td class="tbl-bdy-lg" />
|
||||
</tr>
|
||||
{/if}
|
||||
</tbody>
|
||||
</table>
|
||||
<button class="btn-lg" on:click={() => ((showInput = !showInput), addDevInList())}>{showInput ? "Сохранить" : "Добавить устройство"}</button>
|
||||
</Card>
|
||||
<Alarm>
|
||||
<p>Список устройств будет обновляться автоматически. Подключенные к одному роутеру устройства будут появляться в списке в течении двух минут. Ручное добавление сделано в целях проверки для разработчика.</p>
|
||||
</Alarm>
|
||||
</div>
|
||||
{:else}
|
||||
<Alarm title="Загрузка..." />
|
||||
{/if}
|
||||
|
||||
@@ -124,98 +124,104 @@
|
||||
export let errorsJson;
|
||||
export let rebootEsp = () => {};
|
||||
|
||||
export let show;
|
||||
|
||||
export let cancelAlarm = (alarmKey) => {};
|
||||
</script>
|
||||
|
||||
<div class="grd-2col1">
|
||||
<Card title="Системная информация">
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-3/4">
|
||||
<p class="wgt-dscr-stl">Версия прошивки</p>
|
||||
{#if show}
|
||||
<div class="grd-2col1">
|
||||
<Card title="Системная информация">
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-3/4">
|
||||
<p class="wgt-dscr-stl">Версия прошивки</p>
|
||||
</div>
|
||||
<div class="flex justify-center w-1/4">
|
||||
<p class="text-gray-500 font-bold">{errorsJson.bver}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-center w-1/4">
|
||||
<p class="text-gray-500 font-bold">{errorsJson.bver}</p>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-3/4">
|
||||
<p class="wgt-dscr-stl">Версия файловой системы</p>
|
||||
</div>
|
||||
<div class="flex justify-center w-1/4">
|
||||
<p class="text-gray-500 font-bold">{version}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-3/4">
|
||||
<p class="wgt-dscr-stl">Версия файловой системы</p>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-3/4">
|
||||
<p class="wgt-dscr-stl">Uptime устройства</p>
|
||||
</div>
|
||||
<div class="flex justify-center w-1/4">
|
||||
<p class="text-gray-500 font-bold">{errorsJson.upt}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-center w-1/4">
|
||||
<p class="text-gray-500 font-bold">{version}</p>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-3/4">
|
||||
<p class="wgt-dscr-stl">Uptime сессии mqtt</p>
|
||||
</div>
|
||||
<div class="flex justify-center w-1/4">
|
||||
<p class="text-gray-500 font-bold">{errorsJson.uptm}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-3/4">
|
||||
<p class="wgt-dscr-stl">Uptime устройства</p>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-3/4">
|
||||
<p class="wgt-dscr-stl">Качество WiFi сигнала</p>
|
||||
</div>
|
||||
<div class="flex justify-center w-1/4 text-xs sm:text-sm md:text-base lg:text-base xl:text-base 2xl:text-base break-words">
|
||||
{#if errorsJson.rssi === 0}
|
||||
<p class="text-red-500 font-bold">не подключено</p>
|
||||
{/if}
|
||||
{#if errorsJson.rssi === 1}
|
||||
<p class="text-red-500 font-bold">нет сигнала</p>
|
||||
{/if}
|
||||
{#if errorsJson.rssi === 2}
|
||||
<p class="text-red-500 font-bold">очень низкий</p>
|
||||
{/if}
|
||||
{#if errorsJson.rssi === 3}
|
||||
<p class="text-yellow-500 font-bold">низкий</p>
|
||||
{/if}
|
||||
{#if errorsJson.rssi === 4}
|
||||
<p class="text-yellow-500 font-bold">хороший</p>
|
||||
{/if}
|
||||
{#if errorsJson.rssi === 5}
|
||||
<p class="text-green-500 font-bold">очень хороший</p>
|
||||
{/if}
|
||||
{#if errorsJson.rssi === 6}
|
||||
<p class="text-green-500 font-bold">отличный</p>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-center w-1/4">
|
||||
<p class="text-gray-500 font-bold">{errorsJson.upt}</p>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-3/4">
|
||||
<p class="wgt-dscr-stl">Остаток оперативной памяти</p>
|
||||
</div>
|
||||
<div class="flex justify-center w-1/4">
|
||||
<p class="text-green-500 font-bold">{errorsJson.heap}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-3/4">
|
||||
<p class="wgt-dscr-stl">Uptime сессии mqtt</p>
|
||||
</Card>
|
||||
<Card title="Системные ошибки">
|
||||
<div class="grd-2col1">
|
||||
<!--ошибки-->
|
||||
{#each Object.entries(errorsJson) as [key, param]}
|
||||
{#if key in systemErrorsRus && param in systemErrorsRus[key]}
|
||||
<Alarm title={systemErrorsRus[key][param].descr} cross={systemErrorsRus[key][param].cancel} close={() => cancelAlarm(key)}>
|
||||
<p class="break-words text-center">{systemErrorsRus[key][param].txt}</p>
|
||||
{#if systemErrorsRus[key][param].num}
|
||||
<p class="break-words text-center">{"Количество: " + errorsJson[key + "n"]}</p>
|
||||
{/if}
|
||||
</Alarm>
|
||||
{/if}
|
||||
{/each}
|
||||
</div>
|
||||
<div class="flex justify-center w-1/4">
|
||||
<p class="text-gray-500 font-bold">{errorsJson.uptm}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-3/4">
|
||||
<p class="wgt-dscr-stl">Качество WiFi сигнала</p>
|
||||
</div>
|
||||
<div class="flex justify-center w-1/4 text-xs sm:text-sm md:text-base lg:text-base xl:text-base 2xl:text-base break-words">
|
||||
{#if errorsJson.rssi === 0}
|
||||
<p class="text-red-500 font-bold">не подключено</p>
|
||||
{/if}
|
||||
{#if errorsJson.rssi === 1}
|
||||
<p class="text-red-500 font-bold">нет сигнала</p>
|
||||
{/if}
|
||||
{#if errorsJson.rssi === 2}
|
||||
<p class="text-red-500 font-bold">очень низкий</p>
|
||||
{/if}
|
||||
{#if errorsJson.rssi === 3}
|
||||
<p class="text-yellow-500 font-bold">низкий</p>
|
||||
{/if}
|
||||
{#if errorsJson.rssi === 4}
|
||||
<p class="text-yellow-500 font-bold">хороший</p>
|
||||
{/if}
|
||||
{#if errorsJson.rssi === 5}
|
||||
<p class="text-green-500 font-bold">очень хороший</p>
|
||||
{/if}
|
||||
{#if errorsJson.rssi === 6}
|
||||
<p class="text-green-500 font-bold">отличный</p>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
<div class="crd-itm-psn">
|
||||
<div class="w-3/4">
|
||||
<p class="wgt-dscr-stl">Остаток оперативной памяти</p>
|
||||
</div>
|
||||
<div class="flex justify-center w-1/4">
|
||||
<p class="text-green-500 font-bold">{errorsJson.heap}</p>
|
||||
</div>
|
||||
</div>
|
||||
</Card>
|
||||
<Card title="Системные ошибки">
|
||||
<div class="grd-2col1">
|
||||
<!--ошибки-->
|
||||
{#each Object.entries(errorsJson) as [key, param]}
|
||||
{#if key in systemErrorsRus && param in systemErrorsRus[key]}
|
||||
<Alarm title={systemErrorsRus[key][param].descr} cross={systemErrorsRus[key][param].cancel} close={() => cancelAlarm(key)}>
|
||||
<p class="break-words text-center">{systemErrorsRus[key][param].txt}</p>
|
||||
{#if systemErrorsRus[key][param].num}
|
||||
<p class="break-words text-center">{"Количество: " + errorsJson[key + "n"]}</p>
|
||||
{/if}
|
||||
</Alarm>
|
||||
{/if}
|
||||
{/each}
|
||||
</div>
|
||||
</Card>
|
||||
</div>
|
||||
<div class="grd-1col1">
|
||||
<Card>
|
||||
<button class="btn-lg" on:click={() => rebootEsp()}>{"Перезагрузить устройство"}</button>
|
||||
</Card>
|
||||
</div>
|
||||
</Card>
|
||||
</div>
|
||||
<div class="grd-1col1">
|
||||
<Card>
|
||||
<button class="btn-lg" on:click={() => rebootEsp()}>{"Перезагрузить устройство"}</button>
|
||||
</Card>
|
||||
</div>
|
||||
{:else}
|
||||
<Alarm title="Загрузка..." />
|
||||
{/if}
|
||||
|
||||
Reference in New Issue
Block a user