diff --git a/server/Fury/Modules/ErrorHandler/ErrorHandler.php b/server/Fury/Modules/ErrorHandler/ErrorHandler.php index 341156c..6fac360 100644 --- a/server/Fury/Modules/ErrorHandler/ErrorHandler.php +++ b/server/Fury/Modules/ErrorHandler/ErrorHandler.php @@ -125,7 +125,8 @@ * show styles and html code for fatal error */ public function view_fatal_error(Int $errno, String $errstr, String $errfile, Int $errline){ - http_response_code(500); + if(headers_sent()) return false; + http_response_code(500); if(!FCONF["debug"]) return false; $err_type = $this -> get_err_type($errno); $code = $this -> get_prog_code($errfile, $errline); diff --git a/server/SHServ/Models/Devices.php b/server/SHServ/Models/Devices.php index 74f0c7d..0a98013 100644 --- a/server/SHServ/Models/Devices.php +++ b/server/SHServ/Models/Devices.php @@ -292,8 +292,8 @@ public function alias_is_uniq(String $alias): bool { $count = app() -> thin_builder -> count( - Device::$table_name, - [ ["alias", "=", $alias] ] + Device::$table_name, + [ ["alias", "=", $alias], "AND", ["status", "!=", "removed"] ] ); return $count ? false : true; diff --git a/webclient/DOCS.md b/webclient/DOCS.md new file mode 100644 index 0000000..eb574af --- /dev/null +++ b/webclient/DOCS.md @@ -0,0 +1,361 @@ +# Webclient + +SPA-панель управления умным домом. Общается с сервером через REST API (через `proxy.php`). Живёт в `/webclient`, собирается локально, деплоится статикой. + +--- + +## Сборка и разработка + +```bash +npm install # один раз +npm start # сборка + watch + live-reload +``` + +Gulp собирает параллельно: +- `src/scss/main.scss` → `dist/css/main.css` (sass → autoprefixer → minify + sourcemap) +- `src/js/index.js` → `dist/js/main.js` (esbuild bundle + minify + sourcemap) + +После сборки следит за изменениями файлов, пересобирает на лету. + +### Конфигурация сборки + +В `gulpfile.js` есть закомментированная задача `serve` (BrowserSync). Чтобы включить — раскомментировать вызов `serve` в `exports.default`. + +--- + +## Конфигурация приложения + +**`config.php`** — единственный файл настроек: + +```php +return [ + "version" => "0.2 dev", + "server" => "http://192.168.1.101", // адрес сервера SHServ + "allowed_prefixes" => ["/api/v1/"], // пути, разрешённые через прокси + "proxy.allowed_origins" => [ // CORS whitelist для proxy.php + "http://localhost:5173", + ], +]; +``` + +**`proxy.php`** — CORS-прокси, стоит между браузером и сервером SHServ. Форвардит запросы только по путям из `allowed_prefixes`, проставляет CORS-заголовки, форвардит `Authorization`, `Content-Type`, `Accept`. + +**`ui.php`** — kitchensink-страница для просмотра всех UI-компонентов. Открывается в браузере напрямую, не является частью SPA. + +--- + +## JS-архитектура + +### Точка входа + +`src/js/index.js` — инициализация при `DOMContentLoaded`: + +1. Глобальные синглтоны вешаются на `window`: `DataProvider`, `Toasts`, `Modals`, `Helper`, `confirmPopup`, `advancedSelect`, `editableString` +2. `hud()` — инициализирует навигацию +3. `new SmartHomeApi(...)` — создаётся клиент API +4. `new Screens(...)` — создаётся менеджер экранов +5. `routes(screens, sh_api)` — регистрируются все экраны +6. `screens.routing()` — запускается роутинг (polling hash каждые 50 мс) + +Константа `API_BASEURL` инжектируется esbuild при сборке из `gulpfile.js`. + +--- + +### Роутинг + +Hash-based SPA. Формат: `#!/path`. + +Маршруты определены в `src/js/routes.js`: + +| Hash | Экран | +|------|-------| +| `#!/` | редирект → `#!/areas/tree` | +| `#!/devices` | список устройств | +| `#!/devices/scanning` | поиск новых устройств | +| `#!/scripts/actions` | action-скрипты | +| `#!/scripts/regular` | regular-скрипты | +| `#!/scripts/scopes` | scope-файлы | +| `#!/areas/tree` | дерево областей | +| всё остальное | экран 404 | + +--- + +### Screens + +`src/js/components/Screens.js` — движок SPA. + +**Структура объекта экрана:** +```js +{ + alias: "my_screen", + renderer: () => "
...
", // возвращает HTML-строку + initer: (scr) => { // навешивает логику + // загрузить данные, добавить обработчики + scr.ready(); // обязательно в конце + } +} +``` + +**Ключевые методы:** + +| Метод | Что делает | +|-------|-----------| +| `screens.add(route, screenObj)` | Зарегистрировать экран | +| `screens.switch(alias)` | Переключиться на экран (пересоздаёт DOM) | +| `screens.reload()` | Пересоздать текущий экран | +| `screens.reinit()` | Перезапустить `initer` без пересоздания DOM | +| `screens.ready()` | Пометить экран как готовый (убирает лоадер) | +| `screens.error(title, text)` | Показать экран ошибки | +| `screens.onSwitch(cb)` | Хук на переключение экрана | + +--- + +### SmartHomeApi + +`src/js/sh/SmartHomeApi.js` — HTTP-клиент, callback-style. + +```js +const api = new SmartHomeApi({ + base_url: API_BASEURL, + token: "YOUR_TOKEN", + timeout_ms: 10000, + proxy_path: "/proxy.php", + on_unauthorized: ({ error }) => { /* ... */ } +}); +``` + +Все методы принимают коллбэк `(err, data, meta)`: +- `err` — `null` при успехе, иначе `{ type, message, status_code?, raw? }` +- `data` — распарсенный JSON-ответ +- `meta` — `{ url, method, status_code, headers }` + +Типы ошибок: `network_error`, `timeout`, `http_error`, `api_error`. + +**Модули:** + +`api.devices` → `src/js/sh/modules/DevicesApi.js` + +| Метод | Endpoint | +|-------|---------| +| `list(cb)` | GET `/api/v1/devices/list` | +| `scanning_setup(cb)` | GET `/api/v1/devices/scanning/setup` | +| `scanning_all(cb)` | GET `/api/v1/devices/scanning/all` | +| `setup_new_device(payload, cb)` | POST `/api/v1/devices/setup/new-device` | +| `get(id, cb)` | GET `/api/v1/devices/id/{id}` | +| `info(id, cb)` | GET `/api/v1/devices/id/{id}/info` | +| `status(id, cb)` | GET `/api/v1/devices/id/{id}/status` | +| `action(payload, cb)` | POST `/api/v1/devices/action` | +| `remove(id, cb)` | GET `/api/v1/devices/id/{id}/remove` | +| `reboot(id, cb)` | GET `/api/v1/devices/id/{id}/reboot` | +| `place_in_area(payload, cb)` | POST `/api/v1/devices/place-in-area` | +| `unassign_from_area(id, cb)` | GET `/api/v1/devices/id/{id}/unassign-from-area` | +| `update_name(payload, cb)` | POST `/api/v1/devices/update-name` | +| `update_description(payload, cb)` | POST `/api/v1/devices/update-description` | +| `update_alias(payload, cb)` | POST `/api/v1/devices/update-alias` | +| `resetup(payload, cb)` | POST `/api/v1/devices/resetup` | +| `reset(payload, cb)` | POST `/api/v1/devices/reset` | + +`api.areas` → `src/js/sh/modules/AreasApi.js` + +| Метод | Endpoint | +|-------|---------| +| `list(cb)` | GET `/api/v1/areas/list` | +| `inner_list(area_id, cb)` | GET `/api/v1/areas/id/{id}/list` | +| `new_area(payload, cb)` | POST `/api/v1/areas/new-area` | +| `remove(area_id, cb)` | GET `/api/v1/areas/id/{id}/remove` | +| `place_in_area(payload, cb)` | POST `/api/v1/areas/place-in-area` | +| `unassign_from_area(id, cb)` | GET `/api/v1/areas/id/{id}/unassign-from-area` | +| `update_display_name(payload, cb)` | POST `/api/v1/areas/update-display-name` | +| `update_alias(payload, cb)` | POST `/api/v1/areas/update-alias` | +| `devices(area_id, cb)` | GET `/api/v1/areas/id/{id}/devices` | +| `scripts(area_id, cb)` | GET `/api/v1/areas/id/{id}/scripts` | +| `types_list(cb)` | GET `/api/v1/areas/types/list` | +| `reboot_devices(area_id, cb)` | GET `/api/v1/areas/id/{id}/reboot_devices` | + +`api.scripts` → `src/js/sh/modules/ScriptsApi.js` + +| Метод | Endpoint | +|-------|---------| +| `actions_list(cb)` | GET `/api/v1/scripts/actions/list` | +| `regular_list(cb)` | GET `/api/v1/scripts/regular/list` | +| `scopes_list(cb)` | GET `/api/v1/scripts/scopes/list` | +| `run(payload, cb)` | POST `/api/v1/scripts/actions/run` | +| `scope_update(payload, cb)` | POST `/api/v1/scripts/scopes/update` | +| `action_enable/disable(alias, cb)` | GET `.../alias/{alias}/enable\|disable` | +| `regular_enable/disable(alias, cb)` | GET `.../regular/alias/{alias}/enable\|disable` | +| `scope_enable/disable(name, cb)` | GET `.../scope/{name}/enable\|disable` | +| `place_in_area(payload, cb)` | POST `/api/v1/scripts/place-in-area` | +| `unassign_from_area(id, cb)` | GET `/api/v1/scripts/id/{id}/unassign-from-area` | + +--- + +### DataProvider + +`src/js/DataProvider.js` — кеш данных в рамках сессии. Основное назначение: хранить структуры по ID, чтобы потом получить их в попапах и экранах без повторных запросов к серверу. + +**Базовый доступ:** +```js +window.DataProvider.set("key", value); +window.DataProvider.get("key"); +window.DataProvider.setRaw("key", value); // сохраняет с префиксом "raw." +window.DataProvider.getRaw("key"); +``` + +**Получить из кеша или загрузить с сервера:** +```js +DataProvider.getOrFetch( + `raw.devices.${id}`, + (cb) => sh_api.devices.get(id, (err, resp) => cb(err, resp?.data?.device)), + (err, device) => { + if (err) return scr.error("Ошибка", err.message); + // данные здесь — либо из кеша, либо свежезагруженные + } +); +``` + +**Инвалидация после мутаций:** +```js +DataProvider.invalidate("raw.devices.12"); // один ключ +DataProvider.invalidatePrefix("raw.devices"); // всё под префиксом +``` + +**Получить всё закешированное под префиксом:** +```js +const allDevices = DataProvider.getCollection("raw.devices"); // → [device, device, ...] +``` + +**Ключи кеша, которые заполняют API-модули:** + +| Ключ | Заполняется при | +|------|----------------| +| `raw.devices.{id}` | `api.devices.list()` | +| `raw.areas.{id}` | `api.areas.list()` | +| `raw.actions_scripts.{alias}` | `api.scripts.actions_list()` | +| `raw.regular_scripts.{alias}` | `api.scripts.regular_list()` | +| `raw.scopes.{name}` | `api.scripts.scopes_list()` | +| `raw.scanning.setup.devices.{i}` | `api.devices.scanning_setup()` | +| `raw.scanning.devices.{i}` | `api.devices.scanning_all()` | + +--- + +### Паттерн добавления нового экрана + +1. Создать файл `src/js/components/screens/my-section/my-screen.js`: +```js +export function myScreen(sh_api) { + return { + alias: "my_screen", + renderer: () => `
...
`, + initer: (scr) => { + sh_api.devices.list((err, data) => { + if (err) return scr.error("Ошибка", err.message); + // заполнить DOM + scr.ready(); + }); + } + }; +} +``` + +2. Зарегистрировать маршрут в `src/js/routes.js`: +```js +screens.add("#!/my-section", myScreen(sh_api)); +``` + +3. Добавить ссылку в навигацию в `src/js/components/hud.js`. + +--- + +## SCSS-архитектура + +``` +src/scss/ +├── main.scss ← точка входа +├── _fonts.scss ← подключение шрифтов (IBM Plex Mono) +├── _palette-colors.scss ← все CSS-переменные и SCSS-переменные цветов +├── _mixins.scss ← media_up/down/between, hover_touch +├── _spacing.scss ← шкала отступов $space-0..$space-12 +├── _utils.scss ← утилиты: .mt-*, .mb-*, .p-*, .g-*, .d-none +├── _ui.scss ← импортирует ui_components/ +├── _app.scss ← импортирует app/ +├── ui_components/ ← переиспользуемые компоненты +│ ├── _buttons.scss ← .btn, .btn-primary, .btn-accent, .btn-small, .with-icon +│ ├── _forms.scss ← .input, .textarea, .select, .form-group, .label +│ ├── _modals.scss ← .modal, .modal-panel, .modal-header/body/footer +│ ├── _cards.scss ← .card, .card-content, .script-action +│ ├── _lists.scss ← .list, .list-item, .list-nav, .list-action +│ ├── _toasts.scss ← .toast, .toast-success/warning/danger +│ ├── _badges.scss ← .badge, .badge-success/warning/primary +│ ├── _tables.scss ← .table, .table-row, .table-empty +│ ├── _alerts.scss ← .alert, .alert-primary/success/error +│ ├── _typography.scss ← .h1-.h6, .contrast, .text-light +│ ├── _palette.scss ← .bg-*, .text-* цветовые утилиты +│ ├── _loader.scss ← .loader, .circle-loader +│ ├── _advanced-select.scss +│ └── _editable-string.scss +└── app/ + ├── _hud.scss ← .hud, .navigation, .nav-link + ├── _load-screen.scss ← .load-screen, .a-show + ├── _error-screen.scss ← .error-screen + └── _empty-here.scss ← .empty-here +``` + +**Цвета** (`_palette-colors.scss`) — тёмная кибер-тема: +- Фон: `$color-black: #0A0A0D`, `$color-dark: #1A1A23` +- Акценты: `$color-cyan: #00FFCC`, `$color-orange: #ff6f30`, `$color-electric-blue: #00B3FF` +- Состояния: success `$color-neon-green`, warning `$color-neon-yellow`, error `#FF3C00` + +**Брейкпоинты** в `_mixins.scss`: `xs 360` / `sm 480` / `md 768` / `lg 1024` / `xl 1280` / `xxl 1440`. + +**Анимационные классы:** `.a-show` (появление), `.a-hide` (исчезновение) — CSS-переходы 300 мс. + +--- + +## UI-компоненты (JS) + +| Компонент | Файл | Назначение | +|-----------|------|-----------| +| `Toasts` | `toasts.js` | Всплывающие уведомления: `.success(msg)`, `.error(msg)`, `.warning(msg)` | +| `Modals` | `modals.js` | Строитель модальных окон: `Modals.create(id, { title, body, actions, onready })` | +| `confirmPopup` | `confirm-popup.js` | Диалог подтверждения: `confirmPopup("Текст?", onConfirm, onCancel)` | +| `advancedSelect` | `advanced-select.js` | Dropdown с фильтрацией и клавиатурной навигацией | +| `editableString` | `editable-string.js` | Inline-редактор строки, событие `onChange` | +| `Helper` | `helper.js` | Генераторы HTML (`Helper.template.*`), управление состояниями (`Helper.states.*`), нормализация данных (`Helper.unification.*`) | + +**Состояния кнопок/карточек через Helper:** +```js +Helper.states.btnLoadingState(btnElement, true); // показать спиннер +Helper.states.btnLoadingState(btnElement, false); // восстановить +``` + +--- + +## Структура компонентов экранов + +``` +src/js/components/screens/ +├── devices/ +│ ├── devices.js ← роутер к экранам устройств +│ ├── devices-list-screen.js ← таблица всех устройств +│ ├── devices-scanning-screen.js ← поиск и добавление новых +│ ├── device-state-component.js ← рендер состояния по типу (relay/button/sensor/hatch) +│ ├── device-details-popup.js ← попап с деталями устройства +│ ├── device-setup-form-popup.js ← форма добавления устройства +│ └── devices-funcs.js ← общие функции для экранов устройств +├── areas/ +│ ├── areas.js ← роутер к экранам областей +│ ├── areas-tree-screen.js ← иерархическое дерево областей +│ ├── areas-create-new-modal.js ← форма создания области +│ ├── areas-details-modal.js ← редактирование области +│ ├── areas-devices-modal.js ← устройства в области +│ ├── areas-actions-modal.js ← скрипты в области +│ ├── areas-placeto-component.js ← компонент перемещения в дерево +│ └── areas-funcs.js +└── scripts/ + ├── scripts.js ← роутер к экранам скриптов + ├── scripts-actions-screen.js ← action-скрипты + ├── scripts-regular-screen.js ← regular-скрипты + ├── scripts-scopes-screen.js ← scope-файлы + ├── scripts-action-popup.js ← детали и запуск action-скрипта + └── scripts-funcs.js +``` diff --git a/webclient/config.php b/webclient/config.php index 0cc6324..49df5b5 100644 --- a/webclient/config.php +++ b/webclient/config.php @@ -1,8 +1,8 @@ "0.2 dev", - "server" => "http://192.168.1.101", + "version" => "0.3 dev", + "server" => "http://smart-home-serv.local", // Какие пути разрешены (белый список) — подстрой под себя "allowed_prefixes" => [ "/api/v1/", diff --git a/webclient/dist/js/main.js b/webclient/dist/js/main.js index 016a81d..0107742 100644 --- a/webclient/dist/js/main.js +++ b/webclient/dist/js/main.js @@ -1,4 +1,4 @@ -(()=>{var Oe=Object.defineProperty,ke=Object.defineProperties;var Ie=Object.getOwnPropertyDescriptors;var ae=Object.getOwnPropertySymbols;var Ne=Object.prototype.hasOwnProperty,xe=Object.prototype.propertyIsEnumerable;var ne=(n,e,t)=>e in n?Oe(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,v=(n,e)=>{for(var t in e||(e={}))Ne.call(e,t)&&ne(n,t,e[t]);if(ae)for(var t of ae(e))xe.call(e,t)&&ne(n,t,e[t]);return n},se=(n,e)=>ke(n,Ie(e));var ie=(n,e,t)=>new Promise((a,s)=>{var i=c=>{try{r(t.next(c))}catch(l){s(l)}},o=c=>{try{r(t.throw(c))}catch(l){s(l)}},r=c=>c.done?a(c.value):Promise.resolve(c.value).then(i,o);r((t=t.apply(n,e)).next())});var h,T,D;function Re(){h.dataset.navState="displayed",h.classList.remove("state-off"),h.classList.add("state-on"),T.classList.add("a-show")}function F(){h.dataset.navState="hidden",h.classList.remove("state-on"),h.classList.add("state-off"),T.classList.add("a-hide"),T.classList.remove("a-show"),setTimeout(()=>{T.classList.remove("a-hide")},300)}function re(){console.log("HUD init"),h=document.querySelector(".hud .nav-toggle"),T=document.querySelector(".hud .navigation"),D=document.querySelector(".hud .reload-screen"),h==null||h.addEventListener("click",n=>{n.currentTarget.dataset.navState!="displayed"?Re():F()}),D==null||D.addEventListener("click",n=>{Screens.reload()})}var M=class{constructor(e,t,a){this.screens={},this.routesMap={},this.currentScreen=null,this.eventsHandlers={switch:[],reload:[],reinit:[],errorScreen:[]},this.screensContainer=document.querySelector(e),this.loader=document.querySelector(t),this.errorScreen=document.querySelector(a),console.log("Screens Init")}add(e,t){if(typeof t!="object")return console.error("Screens: screens must be object");if(typeof(t==null?void 0:t.alias)=="undefined")return console.error("Screens: undefined alias");if(typeof(t==null?void 0:t.renderer)!="function")return console.error("Screens: renderer must be function");this.screens[t.alias]=v({route:e},t),this.routesMap[e]=t.alias}switch(e){var a;if(this.runSwitchHandlers(e),this.hideErrorScreen(),this.showLoader(),(a=this.currentScreen)==null||a.DOMObject.remove(),typeof this.screens[e]=="undefined"){console.error(`Screens: "${e}" not found`);return}this.currentScreen=this.screens[e];let t=document.createElement("div");t.classList.add("screen"),t.id=e,t.dataset.alias=e,t.innerHTML=this.currentScreen.renderer(),this.currentScreen.DOMObject=t,this.screensContainer.append(this.currentScreen.DOMObject),this.currentScreen.initer(this)}reload(){this.currentScreen&&(this.runReloadHandlers(this.currentScreen.alias),this.switch(this.currentScreen.alias))}reinit(){this.currentScreen&&(this.currentScreen.initer(this),this.runReinitHandlers())}routing(){setInterval(()=>{let e=document.location.hash.split("#!")[1];if(typeof e=="undefined"||e=="")return;let t=typeof this.routesMap[e]=="undefined"?"not-found-screen":this.routesMap[e];(!this.currentScreen||this.currentScreen.alias!=t)&&this.switch(t)},50)}ready(){this.currentScreen!=null&&(this.currentScreen.DOMObject||(this.currentScreen.DOMObject=document.getElementsById(this.currentScreen.alias)),this.hideLoader(),this.currentScreen.DOMObject.classList.add("a-show"))}error(e,t){var a;(a=this.currentScreen)==null||a.DOMObject.remove(),this.errorScreen.querySelector(".error-title").innerHTML=e,this.errorScreen.querySelector(".error-text").innerHTML=t,this.showErrorScreen(),this.runErrorScreenHandlers()}hideLoader(){this.loader.classList.remove("a-show")}showLoader(){this.loader.classList.add("a-show")}showErrorScreen(){this.errorScreen.classList.add("a-show")}hideErrorScreen(){this.errorScreen.classList.remove("a-show")}getScreens(){return this.screens}getRoutesMap(){return this.routesMap}onSwitch(e){this.eventsHandlers.switch.push(e)}onReaload(e){this.eventsHandlers.reload.push(e)}onReinit(e){this.eventsHandlers.reinit.push(e)}onErrorScreen(e){this.eventsHandlers.errorScreen.push(e)}runSwitchHandlers(e){let t=Object.keys(this.routesMap).filter(a=>this.routesMap[a]==e);for(let a of this.eventsHandlers.switch)a(this,e,t.length?t[0]:void 0)}runReloadHandlers(e){for(let t of this.eventsHandlers.reload)t(this,e)}runReinitHandlers(){for(let e of this.eventsHandlers.reinit)e(this)}runErrorScreenHandlers(){for(let e of this.eventsHandlers.errorScreen)e(this)}};var q=class{constructor(){this.data={}}set(e,t){this.data[e]=t}get(e){return this.data[e]}setRaw(e,t){this.set("raw."+e,t)}getRaw(e){return this.get("raw."+e)}};function je(n,e,t,a){return` +(()=>{var Ce=Object.defineProperty,ke=Object.defineProperties;var Ie=Object.getOwnPropertyDescriptors;var ae=Object.getOwnPropertySymbols;var xe=Object.prototype.hasOwnProperty,Re=Object.prototype.propertyIsEnumerable;var ne=(n,e,t)=>e in n?Ce(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,h=(n,e)=>{for(var t in e||(e={}))xe.call(e,t)&&ne(n,t,e[t]);if(ae)for(var t of ae(e))Re.call(e,t)&&ne(n,t,e[t]);return n},se=(n,e)=>ke(n,Ie(e));var ie=(n,e,t)=>new Promise((a,s)=>{var i=c=>{try{o(t.next(c))}catch(l){s(l)}},r=c=>{try{o(t.throw(c))}catch(l){s(l)}},o=c=>c.done?a(c.value):Promise.resolve(c.value).then(i,r);o((t=t.apply(n,e)).next())});var b,T,D;function Ne(){b.dataset.navState="displayed",b.classList.remove("state-off"),b.classList.add("state-on"),T.classList.add("a-show")}function F(){b.dataset.navState="hidden",b.classList.remove("state-on"),b.classList.add("state-off"),T.classList.add("a-hide"),T.classList.remove("a-show"),setTimeout(()=>{T.classList.remove("a-hide")},300)}function re(){console.log("HUD init"),b=document.querySelector(".hud .nav-toggle"),T=document.querySelector(".hud .navigation"),D=document.querySelector(".hud .reload-screen"),b==null||b.addEventListener("click",n=>{n.currentTarget.dataset.navState!="displayed"?Ne():F()}),D==null||D.addEventListener("click",n=>{Screens.reload()})}var M=class{constructor(e,t,a){this.screens={},this.routesMap={},this.currentScreen=null,this.eventsHandlers={switch:[],reload:[],reinit:[],errorScreen:[]},this.screensContainer=document.querySelector(e),this.loader=document.querySelector(t),this.errorScreen=document.querySelector(a),console.log("Screens Init")}add(e,t){if(typeof t!="object")return console.error("Screens: screens must be object");if(typeof(t==null?void 0:t.alias)=="undefined")return console.error("Screens: undefined alias");if(typeof(t==null?void 0:t.renderer)!="function")return console.error("Screens: renderer must be function");this.screens[t.alias]=h({route:e},t),this.routesMap[e]=t.alias}switch(e){var a;if(this.runSwitchHandlers(e),this.hideErrorScreen(),this.showLoader(),(a=this.currentScreen)==null||a.DOMObject.remove(),typeof this.screens[e]=="undefined"){console.error(`Screens: "${e}" not found`);return}this.currentScreen=this.screens[e];let t=document.createElement("div");t.classList.add("screen"),t.id=e,t.dataset.alias=e,t.innerHTML=this.currentScreen.renderer(),this.currentScreen.DOMObject=t,this.screensContainer.append(this.currentScreen.DOMObject),this.currentScreen.initer(this)}reload(){this.currentScreen&&(this.runReloadHandlers(this.currentScreen.alias),this.switch(this.currentScreen.alias))}reinit(){this.currentScreen&&(this.currentScreen.initer(this),this.runReinitHandlers())}routing(){setInterval(()=>{let e=document.location.hash.split("#!")[1];if(typeof e=="undefined"||e=="")return;let t=typeof this.routesMap[e]=="undefined"?"not-found-screen":this.routesMap[e];(!this.currentScreen||this.currentScreen.alias!=t)&&this.switch(t)},50)}ready(){this.currentScreen!=null&&(this.currentScreen.DOMObject||(this.currentScreen.DOMObject=document.getElementsById(this.currentScreen.alias)),this.hideLoader(),this.currentScreen.DOMObject.classList.add("a-show"))}error(e,t){var a;(a=this.currentScreen)==null||a.DOMObject.remove(),this.errorScreen.querySelector(".error-title").innerHTML=e,this.errorScreen.querySelector(".error-text").innerHTML=t,this.showErrorScreen(),this.runErrorScreenHandlers()}hideLoader(){this.loader.classList.remove("a-show")}showLoader(){this.loader.classList.add("a-show")}showErrorScreen(){this.errorScreen.classList.add("a-show")}hideErrorScreen(){this.errorScreen.classList.remove("a-show")}getScreens(){return this.screens}getRoutesMap(){return this.routesMap}onSwitch(e){this.eventsHandlers.switch.push(e)}onReaload(e){this.eventsHandlers.reload.push(e)}onReinit(e){this.eventsHandlers.reinit.push(e)}onErrorScreen(e){this.eventsHandlers.errorScreen.push(e)}runSwitchHandlers(e){let t=Object.keys(this.routesMap).filter(a=>this.routesMap[a]==e);for(let a of this.eventsHandlers.switch)a(this,e,t.length?t[0]:void 0)}runReloadHandlers(e){for(let t of this.eventsHandlers.reload)t(this,e)}runReinitHandlers(){for(let e of this.eventsHandlers.reinit)e(this)}runErrorScreenHandlers(){for(let e of this.eventsHandlers.errorScreen)e(this)}};var q=class{constructor(){this.data={}}set(e,t){this.data[e]=t}get(e){return this.data[e]}setRaw(e,t){this.set("raw."+e,t)}getRaw(e){return this.get("raw."+e)}invalidate(e){delete this.data[e]}invalidatePrefix(e){for(let t of Object.keys(this.data))t.startsWith(e)&&delete this.data[t]}getOrFetch(e,t,a){let s=this.data[e];if(typeof s!="undefined")return a(null,s);t((i,r)=>{!i&&typeof r!="undefined"&&(this.data[e]=r),a(i,r)})}getCollection(e){let t=[];for(let[a,s]of Object.entries(this.data))a.startsWith(e)&&t.push(s);return t}};function Pe(n,e,t,a){return` - `}function Pe(n,e){if(e!=null&&e.alone&&document.querySelectorAll(".toast").forEach(t=>t.close()),n.close=function(){this.classList.add("a-hide"),setTimeout(()=>{this.remove()},300)},n.querySelector(".toast-close").addEventListener("click",t=>{n.close()}),n.show=function(){document.querySelector("body").append(n),setTimeout(()=>{n.classList.add("a-show")},10)},typeof Screens!="undefined"&&Screens.onSwitch((t,a)=>{setTimeout(()=>{n==null||n.close()},1e4)}),n.addEventListener("mouseover",t=>n.ishovered=!0),n.addEventListener("mouseout",t=>n.ishovered=!1),e!=null&&e.lifetime){console.log(e);let t=setInterval(()=>{n.ishovered||(n.close(),clearInterval(t))},e==null?void 0:e.lifetime)}return n}function H(n,e,t,a,s){let i=document.createElement("div");return i.innerHTML=je(n,e,t,a),Pe(i.childNodes[1],s)}function Fe(n,e,t){return typeof t=="undefined"&&(t={}),typeof t.lifetime=="undefined"&&(t.lifetime=4e3),typeof t.alone=="undefined"&&(t.alone=!0),H("success",'',n,e,t)}function Ue(n,e,t){return H("info",'',n,e,t)}function Be(n,e,t){return H("warning",'',n,e,t)}function oe(n,e,t){return H("danger",'',n,e,t)}var ce={create:H,createInfo:Ue,createSuccess:Fe,createWarning:Be,createError:oe,createDanger:oe};function ze(n){let e="";for(let t of n){let a="",s="";t.route&&(a=``,s=""),e+=` + `}function je(n,e){if(e!=null&&e.alone&&document.querySelectorAll(".toast").forEach(t=>t.close()),n.close=function(){this.classList.add("a-hide"),setTimeout(()=>{this.remove()},300)},n.querySelector(".toast-close").addEventListener("click",t=>{n.close()}),n.show=function(){document.querySelector("body").append(n),setTimeout(()=>{n.classList.add("a-show")},10)},typeof Screens!="undefined"&&Screens.onSwitch((t,a)=>{setTimeout(()=>{n==null||n.close()},1e4)}),n.addEventListener("mouseover",t=>n.ishovered=!0),n.addEventListener("mouseout",t=>n.ishovered=!1),e!=null&&e.lifetime){console.log(e);let t=setInterval(()=>{n.ishovered||(n.close(),clearInterval(t))},e==null?void 0:e.lifetime)}return n}function H(n,e,t,a,s){let i=document.createElement("div");return i.innerHTML=Pe(n,e,t,a),je(i.childNodes[1],s)}function Fe(n,e,t){return typeof t=="undefined"&&(t={}),typeof t.lifetime=="undefined"&&(t.lifetime=4e3),typeof t.alone=="undefined"&&(t.alone=!0),H("success",'',n,e,t)}function Ue(n,e,t){return H("info",'',n,e,t)}function Be(n,e,t){return H("warning",'',n,e,t)}function oe(n,e,t){return H("danger",'',n,e,t)}var ce={create:H,createInfo:Ue,createSuccess:Fe,createWarning:Be,createError:oe,createDanger:oe};function ze(n){let e="";for(let t of n){let a="",s="";t.route&&(a=``,s=""),e+=`
  • ${a}${t.content}${s}
  • @@ -16,7 +16,7 @@ ${e} - `}function Ve(n,e,t,a){let s='',i=0;for(let u in e)s+=`${e[u]}`,i++;s+="";let o="";for(let u of t){o+='';for(let p in e)o+=`${u[p]}`;o+=""}let r="";typeof a!="undefined"&&(r=` + `}function Ve(n,e,t,a){let s='',i=0;for(let u in e)s+=`${e[u]}`,i++;s+="";let r="";for(let u of t){r+='';for(let p in e)r+=`${u[p]}`;r+=""}let o="";typeof a!="undefined"&&(o=` @@ -24,13 +24,13 @@ - `);let c=n?`${n}`:"",l=t.length?`${s}`:"";return o=t.length?o:'Empty',` + `);let c=n?`${n}`:"",l=t.length?`${s}`:"";return r=t.length?r:'Empty',`
    ${c} ${l} - ${o} - ${r} + ${r} + ${o}
    `}function le(n,e,t){let a=document.createElement(n);for(let[s,i]of Object.entries(e))s==="class"?a.className=i:s==="dataset"?Object.assign(a.dataset,i):a.setAttribute(s,i);return a.innerHTML=typeof t!="undefined"?t:"",a}function Je(n,e){return["primary","success","secondary","info","warning","error","danger"].indexOf(n)<0?console.error("createAlert()","Error of type: "+n):le("div",{class:`alert alert-${n}`},e)}function We(n){let e={device_name:"name",device_hard_id:"device_id",device_ip:"ip",device_type:"type",ip_address:"ip",mac_address:"mac",device_mac:"mac",core_version:"firmware_core_version"},t={};for(let a in n){if(typeof e[a]!="undefined"){t[e[a]]=n[a];continue}t[a]=n[a]}return t}function Ye(n,e){if((n==null?void 0:n.isLoading)==e)return!1;if(e)n.isLoading=!0,n.originalContent=n.innerHTML,n.classList.contains("with-icon")?n.originalWithIcon=!0:n.classList.add("with-icon"),n.classList.add("loading-state"),n.setAttribute("disabled","disabled"),n.innerHTML=' Loading';else{if(n.isLoading=!1,!n.originalContent)return!1;n.removeAttribute("disabled"),n.classList.remove("loading-state"),n.originalWithIcon||n.classList.remove("with-icon"),n.innerHTML=n.originalContent}return n}function Ge(n,e){if((n==null?void 0:n.isLoading)==e)return!1;let t=n.querySelector(".device-icon");if(e)n.isLoading=!0,n.originalContent=t.innerHTML,n.classList.add("loading-state"),n.setAttribute("disabled","disabled"),t.innerHTML='';else{if(n.isLoading=!1,!n.originalContent)return!1;n.removeAttribute("disabled"),n.classList.remove("loading-state"),t.innerHTML=n.originalContent}return n}function Ke(n,e){return e=e!=null?e:"",` @@ -44,7 +44,7 @@ - `}function Qe(n){return n=="active"?'Online':'Offline'}function Xe(n){return n=="enabled"?'Enabled':'Disabled'}function Ze(n){let e=new Date(n.replace(" ","T")),a=Math.floor((new Date-e)/1e3);if(a<60)return"less than a minute ago";let s=Math.floor(a/60),i=Math.floor(s/60),o=Math.floor(i/24);if(s<60)return`${s} minute${s!==1?"s":""} ago`;if(i<24){let r=s%60;return`${i} hour${i!==1?"s":""} ${r} minute${r!==1?"s":""} ago`}return`${o} day${o!==1?"s":""} ago`}function et(n){let e=new Date(n.replace(" ","T")),t=new Date,a=new Date(t.getFullYear(),t.getMonth(),t.getDate()),s=new Date(e.getFullYear(),e.getMonth(),e.getDate()),i=Math.floor((a-s)/864e5),o=String(e.getHours()).padStart(2,"0"),r=String(e.getMinutes()).padStart(2,"0");if(i===0)return`Today at ${o}:${r}`;if(i===1)return`Yesterday at ${o}:${r}`;let c=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];return`${e.getDate()} ${c[e.getMonth()]} ${e.getFullYear()} at ${o}:${r}`}function tt(){return` + `}function Qe(n){return n=="active"?'Online':'Offline'}function Xe(n){return n=="enabled"?'Enabled':'Disabled'}function Ze(n){let e=new Date(n.replace(" ","T")),a=Math.floor((new Date-e)/1e3);if(a<60)return"less than a minute ago";let s=Math.floor(a/60),i=Math.floor(s/60),r=Math.floor(i/24);if(s<60)return`${s} minute${s!==1?"s":""} ago`;if(i<24){let o=s%60;return`${i} hour${i!==1?"s":""} ${o} minute${o!==1?"s":""} ago`}return`${r} day${r!==1?"s":""} ago`}function et(n){let e=new Date(n.replace(" ","T")),t=new Date,a=new Date(t.getFullYear(),t.getMonth(),t.getDate()),s=new Date(e.getFullYear(),e.getMonth(),e.getDate()),i=Math.floor((a-s)/864e5),r=String(e.getHours()).padStart(2,"0"),o=String(e.getMinutes()).padStart(2,"0");if(i===0)return`Today at ${r}:${o}`;if(i===1)return`Yesterday at ${r}:${o}`;let c=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];return`${e.getDate()} ${c[e.getMonth()]} ${e.getFullYear()} at ${r}:${o}`}function tt(){return`
    Loading @@ -54,9 +54,9 @@

    It's empty here yet

    - `}var de={template:{sidebarNav:ze,table:Ve,createElement:le,createAlert:Je,mainTemplate:Ke,connectionStatusBadge:Qe,toogleStateBadge:Xe,circleLoaderHTML:tt,emptyHereHTML:at},unification:{deviceFieldsUnification:We,timeAgo:Ze,formatDate:et},states:{btnLoadingState:Ye,cardScriptActionLoadingState:Ge}};var C=class{constructor(e){this.core=e}actions_list(e){return this.core.api_get("/api/v1/scripts/actions/list",(t,a,s)=>{var i;if(a&&a.status&&a.data&&a.data.scripts)for(let o of a.data.scripts){let r=(i=o==null?void 0:o.id)!=null?i:o.alias;DataProvider.setRaw(`actions_scripts.${r}`,o)}return e(t,a,s)})}scopes_list(e){return this.core.api_get("/api/v1/scripts/scopes/list",(t,a,s)=>{if(a&&a.status&&a.data&&a.data.scopes)for(let i of a.data.scopes)DataProvider.setRaw(`scopes.${i.name}`,i);return e(t,a,s)})}regular_list(e){return this.core.api_get("/api/v1/scripts/regular/list",(t,a,s)=>{var i;if(a&&a.status&&a.data&&a.data.scripts)for(let o of a.data.scripts){let r=(i=o==null?void 0:o.id)!=null?i:o.alias;DataProvider.setRaw(`regular_scripts.${r}`,o)}return e(t,a,s)})}scope_get_by_filename(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${a}`,t,{})}scope_create(e,t){return this.core.api_post("/api/v1/scripts/scopes/new",e,t)}scope_update(e,t){return this.core.api_post("/api/v1/scripts/scopes/update",e,t)}action_enable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/actions/alias/${a}/enable`,t)}action_disable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/actions/alias/${a}/disable`,t)}regular_enable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/regular/alias/${a}/enable`,t)}regular_disable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/regular/alias/${a}/disable`,t)}scope_enable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${a}/enable`,t)}scope_disable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${a}/disable`,t)}scope_remove(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${a}/remove`,t)}run(e,t){return this.core.api_post("/api/v1/scripts/actions/run",e,t)}place_in_area(e,t){return this.core.api_post("/api/v1/scripts/place-in-area",e,t)}unassign_from_area(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/scripts/id/${a}/unassign-from-area`,t)}};var O=class{constructor(e){this.core=e}list(e){return this.core.api_get("/api/v1/devices/list",(t,a,s)=>{if(a&&a.status&&a.data&&a.data.devices)for(let i of a.data.devices)DataProvider.setRaw(`devices.${i.id}`,i);return e(t,a,s)})}scanning_setup(e){return this.core.api_get("/api/v1/devices/scanning/setup",(t,a,s)=>{if(a&&a.status&&a.data&&a.data.devices)for(let i in a.data.devices)DataProvider.setRaw(`scanning.setup.devices.${i}`,a.data.devices[i]);return e(t,a,s)})}scanning_all(e){return this.core.api_get("/api/v1/devices/scanning/all",(t,a,s)=>{if(a&&a.status&&a.data&&a.data.devices)for(let i in a.data.devices)DataProvider.setRaw(`scanning.devices.${i}`,a.data.devices[i]);return e(t,a,s)})}setup_new_device(e,t){return this.core.api_post("/api/v1/devices/setup/new-device",e,t)}info(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}/info`,t)}get(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}`,t)}status(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}/status`,t)}action(e,t){return this.core.api_post("/api/v1/devices/action",e,t)}remove(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}/remove`,t)}reboot(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}/reboot`,t)}place_in_area(e,t){return this.core.api_post("/api/v1/devices/place-in-area",e,t)}unassign_from_area(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}/unassign-from-area`,t)}update_name(e,t){return this.core.api_post("/api/v1/devices/update-name",e,t)}update_description(e,t){return this.core.api_post("/api/v1/devices/update-description",e,t)}update_alias(e,t){return this.core.api_post("/api/v1/devices/update-alias",e,t)}resetup(e,t){return this.core.api_post("/api/v1/devices/resetup",e,t)}reset(e,t){return this.core.api_post("/api/v1/devices/reset",e,t)}};var k=class{constructor(e){this.core=e}list(e){return this.core.api_get("/api/v1/areas/list",(t,a,s)=>{if(a&&a.status&&a.data&&a.data.areas)for(let i of a.data.areas)DataProvider.setRaw(`areas.${i.id}`,i);return e(t,a,s)})}inner_list(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/list`,t)}new_area(e,t){return this.core.api_post("/api/v1/areas/new-area",e,t)}remove(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/remove`,t)}place_in_area(e,t){return this.core.api_post("/api/v1/areas/place-in-area",e,t)}update_display_name(e,t){return this.core.api_post("/api/v1/areas/update-display-name",e,t)}update_alias(e,t){return this.core.api_post("/api/v1/areas/update-alias",e,t)}devices(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/devices`,t)}scripts(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/scripts`,t)}unassign_from_area(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/unassign-from-area`,t)}types_list(e){return this.core.api_get("/api/v1/areas/types/list",e)}reboot_devices(e,t){if(e==null)return this.core.api_get("/api/v1/areas/reboot_devices",t);let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/reboot_devices`,t)}};function ue(n){if(!n||typeof n!="object")return"";let e=new URLSearchParams;Object.entries(n).forEach(([a,s])=>{s!=null&&e.append(a,String(s))});let t=e.toString();return t?`?${t}`:""}function nt(n,e){let t=String(n||"").replace(/\/+$/,""),a=String(e||"").replace(/^\/+/,"");return`${t}/${a}`}function st(n){try{return{ok:!0,data:JSON.parse(n)}}catch(e){return{ok:!1,error:e}}}var I=class{constructor(e){this.base_url=(e==null?void 0:e.base_url)||"",this.token=(e==null?void 0:e.token)||"",this.timeout_ms=Number.isFinite(e==null?void 0:e.timeout_ms)?e.timeout_ms:15e3,this.default_headers=(e==null?void 0:e.default_headers)||{},this.on_unauthorized=typeof(e==null?void 0:e.on_unauthorized)=="function"?e.on_unauthorized:null,this.proxy_path=(e==null?void 0:e.proxy_path)||"",this.scripts=new C(this),this.devices=new O(this),this.areas=new k(this)}set_base_url(e){this.base_url=e||""}set_token(e){this.token=e||""}set_proxy_path(e){this.proxy_path=e||""}_wrap_path(e,t){if(!this.proxy_path)return t?`${e}${ue(t)}`:e;let a=v({path:e},t||{});return`${this.proxy_path}${ue(a)}`}request(e,t,a,s,i){let o=typeof s=="function"?s:()=>{},r=nt(this.base_url,t),c=new AbortController,l=Number.isFinite(i==null?void 0:i.timeout_ms)?i.timeout_ms:this.timeout_ms,d=setTimeout(()=>c.abort(),l),u=v(v({},this.default_headers),(i==null?void 0:i.headers)||{});this.token&&(u.Authorization=`Bearer ${this.token}`);let p;a!=null&&(u["Content-Type"]="application/json",p=JSON.stringify(a)),fetch(r,{method:e,headers:u,body:p,signal:c.signal}).then(m=>ie(this,null,function*(){clearTimeout(d);let g={url:r,method:e,status_code:m.status,headers:m.headers},b=yield m.text(),P=st(b),S=P.ok?P.data:b;if(!m.ok){let E={type:"http_error",message:`HTTP ${m.status}`,status_code:m.status,raw:S};if((m.status===401||m.status===403)&&this.on_unauthorized)try{this.on_unauthorized({error:E,meta:g})}catch(te){}return o(E,null,g)}if(P.ok&&S&&typeof S=="object"){let E=S.status;if(E===!1||E==="error"){let te={type:"api_error",message:S.message||"API error",status_code:m.status,raw:S,field:S.field};return o(te,null,g)}}return o(null,S,g)})).catch(m=>{clearTimeout(d);let b=m&&(m.name==="AbortError"||String(m).includes("AbortError"))?{type:"timeout",message:`Timeout after ${l}ms`}:{type:"network_error",message:(m==null?void 0:m.message)||"Network error",details:m};return o(b,null,{url:r,method:e,status_code:0,headers:null})})}get(e,t,a){return this.request("GET",e,null,t,a)}post(e,t,a,s){return this.request("POST",e,t,a,s)}api_get(e,t,a,s){return this.get(this._wrap_path(e,a),t,s)}api_post(e,t,a,s,i){return this.post(this._wrap_path(e,s),t,a,i)}};function N(n){return Helper.template.sidebarNav([{content:' Devices',route:"/#!/devices",is_active:n=="devices"},{content:' Scanning',route:"/#!/devices/scanning",is_active:n=="scanning"}])}function w(n,e,t){Helper.states.btnLoadingState(e,!0);let a=e.dataset.deviceId,s=e.dataset.deviceName,i=e.dataset.deviceAlias;n.devices.reboot(a,(o,r,c)=>{Helper.states.btnLoadingState(e,!1),console.log("Reboot done",o,r,c),t==null||t.close(),r?(setTimeout(()=>Screens.reinit(),8e3),Toasts.createSuccess("Reboot successful",`Device: ${s}
    + `}var de={template:{sidebarNav:ze,table:Ve,createElement:le,createAlert:Je,mainTemplate:Ke,connectionStatusBadge:Qe,toogleStateBadge:Xe,circleLoaderHTML:tt,emptyHereHTML:at},unification:{deviceFieldsUnification:We,timeAgo:Ze,formatDate:et},states:{btnLoadingState:Ye,cardScriptActionLoadingState:Ge}};var O=class{constructor(e){this.core=e}actions_list(e){return this.core.api_get("/api/v1/scripts/actions/list",(t,a,s)=>{var i;if(a&&a.status&&a.data&&a.data.scripts)for(let r of a.data.scripts){let o=(i=r==null?void 0:r.id)!=null?i:r.alias;DataProvider.setRaw(`actions_scripts.${o}`,r)}return e(t,a,s)})}scopes_list(e){return this.core.api_get("/api/v1/scripts/scopes/list",(t,a,s)=>{if(a&&a.status&&a.data&&a.data.scopes)for(let i of a.data.scopes)DataProvider.setRaw(`scopes.${i.name}`,i);return e(t,a,s)})}regular_list(e){return this.core.api_get("/api/v1/scripts/regular/list",(t,a,s)=>{var i;if(a&&a.status&&a.data&&a.data.scripts)for(let r of a.data.scripts){let o=(i=r==null?void 0:r.id)!=null?i:r.alias;DataProvider.setRaw(`regular_scripts.${o}`,r)}return e(t,a,s)})}scope_get_by_filename(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${a}`,t,{})}scope_create(e,t){return this.core.api_post("/api/v1/scripts/scopes/new",e,t)}scope_update(e,t){return this.core.api_post("/api/v1/scripts/scopes/update",e,t)}action_enable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/actions/alias/${a}/enable`,t)}action_disable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/actions/alias/${a}/disable`,t)}regular_enable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/regular/alias/${a}/enable`,t)}regular_disable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/regular/alias/${a}/disable`,t)}scope_enable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${a}/enable`,t)}scope_disable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${a}/disable`,t)}scope_remove(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${a}/remove`,t)}run(e,t){return this.core.api_post("/api/v1/scripts/actions/run",e,t)}place_in_area(e,t){return this.core.api_post("/api/v1/scripts/place-in-area",e,t)}unassign_from_area(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/scripts/id/${a}/unassign-from-area`,t)}};var C=class{constructor(e){this.core=e}list(e){return this.core.api_get("/api/v1/devices/list",(t,a,s)=>{if(a&&a.status&&a.data&&a.data.devices)for(let i of a.data.devices)DataProvider.setRaw(`devices.${i.id}`,i);return e(t,a,s)})}scanning_setup(e){return this.core.api_get("/api/v1/devices/scanning/setup",(t,a,s)=>{if(a&&a.status&&a.data&&a.data.devices)for(let i in a.data.devices)DataProvider.setRaw(`scanning.setup.devices.${i}`,a.data.devices[i]);return e(t,a,s)})}scanning_all(e){return this.core.api_get("/api/v1/devices/scanning/all",(t,a,s)=>{if(a&&a.status&&a.data&&a.data.devices)for(let i in a.data.devices)DataProvider.setRaw(`scanning.devices.${i}`,a.data.devices[i]);return e(t,a,s)})}setup_new_device(e,t){return this.core.api_post("/api/v1/devices/setup/new-device",e,t)}info(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}/info`,t)}get(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}`,t)}status(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}/status`,t)}action(e,t){return this.core.api_post("/api/v1/devices/action",e,t)}remove(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}/remove`,t)}reboot(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}/reboot`,t)}place_in_area(e,t){return this.core.api_post("/api/v1/devices/place-in-area",e,t)}unassign_from_area(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}/unassign-from-area`,t)}update_name(e,t){return this.core.api_post("/api/v1/devices/update-name",e,t)}update_description(e,t){return this.core.api_post("/api/v1/devices/update-description",e,t)}update_alias(e,t){return this.core.api_post("/api/v1/devices/update-alias",e,t)}resetup(e,t){return this.core.api_post("/api/v1/devices/resetup",e,t)}reset(e,t){return this.core.api_post("/api/v1/devices/reset",e,t)}};var k=class{constructor(e){this.core=e}list(e){return this.core.api_get("/api/v1/areas/list",(t,a,s)=>{if(a&&a.status&&a.data&&a.data.areas){for(let i of a.data.areas)DataProvider.setRaw(`areas.${i.id}`,i);DataProvider.setRaw("areas.list",a.data)}return e(t,a,s)})}inner_list(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/list`,t)}new_area(e,t){return this.core.api_post("/api/v1/areas/new-area",e,t)}remove(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/remove`,t)}place_in_area(e,t){return this.core.api_post("/api/v1/areas/place-in-area",e,t)}update_display_name(e,t){return this.core.api_post("/api/v1/areas/update-display-name",e,t)}update_alias(e,t){return this.core.api_post("/api/v1/areas/update-alias",e,t)}devices(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/devices`,t)}scripts(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/scripts`,t)}unassign_from_area(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/unassign-from-area`,t)}types_list(e){return this.core.api_get("/api/v1/areas/types/list",e)}reboot_devices(e,t){if(e==null)return this.core.api_get("/api/v1/areas/reboot_devices",t);let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/reboot_devices`,t)}};function ue(n){if(!n||typeof n!="object")return"";let e=new URLSearchParams;Object.entries(n).forEach(([a,s])=>{s!=null&&e.append(a,String(s))});let t=e.toString();return t?`?${t}`:""}function nt(n,e){let t=String(n||"").replace(/\/+$/,""),a=String(e||"").replace(/^\/+/,"");return`${t}/${a}`}function st(n){try{return{ok:!0,data:JSON.parse(n)}}catch(e){return{ok:!1,error:e}}}var I=class{constructor(e){this.base_url=(e==null?void 0:e.base_url)||"",this.token=(e==null?void 0:e.token)||"",this.timeout_ms=Number.isFinite(e==null?void 0:e.timeout_ms)?e.timeout_ms:15e3,this.default_headers=(e==null?void 0:e.default_headers)||{},this.on_unauthorized=typeof(e==null?void 0:e.on_unauthorized)=="function"?e.on_unauthorized:null,this.proxy_path=(e==null?void 0:e.proxy_path)||"",this.scripts=new O(this),this.devices=new C(this),this.areas=new k(this)}set_base_url(e){this.base_url=e||""}set_token(e){this.token=e||""}set_proxy_path(e){this.proxy_path=e||""}_wrap_path(e,t){if(!this.proxy_path)return t?`${e}${ue(t)}`:e;let a=h({path:e},t||{});return`${this.proxy_path}${ue(a)}`}request(e,t,a,s,i){let r=typeof s=="function"?s:()=>{},o=nt(this.base_url,t),c=new AbortController,l=Number.isFinite(i==null?void 0:i.timeout_ms)?i.timeout_ms:this.timeout_ms,d=setTimeout(()=>c.abort(),l),u=h(h({},this.default_headers),(i==null?void 0:i.headers)||{});this.token&&(u.Authorization=`Bearer ${this.token}`);let p;a!=null&&(u["Content-Type"]="application/json",p=JSON.stringify(a)),fetch(o,{method:e,headers:u,body:p,signal:c.signal}).then(m=>ie(this,null,function*(){clearTimeout(d);let g={url:o,method:e,status_code:m.status,headers:m.headers},v=yield m.text(),j=st(v),S=j.ok?j.data:v;if(!m.ok){let E={type:"http_error",message:`HTTP ${m.status}`,status_code:m.status,raw:S};if((m.status===401||m.status===403)&&this.on_unauthorized)try{this.on_unauthorized({error:E,meta:g})}catch(te){}return r(E,null,g)}if(j.ok&&S&&typeof S=="object"){let E=S.status;if(E===!1||E==="error"){let te={type:"api_error",message:S.message||"API error",status_code:m.status,raw:S,field:S.field};return r(te,null,g)}}return r(null,S,g)})).catch(m=>{clearTimeout(d);let v=m&&(m.name==="AbortError"||String(m).includes("AbortError"))?{type:"timeout",message:`Timeout after ${l}ms`}:{type:"network_error",message:(m==null?void 0:m.message)||"Network error",details:m};return r(v,null,{url:o,method:e,status_code:0,headers:null})})}get(e,t,a){return this.request("GET",e,null,t,a)}post(e,t,a,s){return this.request("POST",e,t,a,s)}api_get(e,t,a,s){return this.get(this._wrap_path(e,a),t,s)}api_post(e,t,a,s,i){return this.post(this._wrap_path(e,s),t,a,i)}};function x(n){return Helper.template.sidebarNav([{content:' Devices',route:"/#!/devices",is_active:n=="devices"},{content:' Scanning',route:"/#!/devices/scanning",is_active:n=="scanning"}])}function w(n,e,t){Helper.states.btnLoadingState(e,!0);let a=e.dataset.deviceId,s=e.dataset.deviceName,i=e.dataset.deviceAlias;n.devices.reboot(a,(r,o,c)=>{Helper.states.btnLoadingState(e,!1),console.log("Reboot done",r,o,c),t==null||t.close(),o?(setTimeout(()=>Screens.reinit(),8e3),Toasts.createSuccess("Reboot successful",`Device: ${s}
    Alias: ${i}`).show()):Toasts.createError("Reboot failed",`Device: ${s}
    - Alias: ${i}`).show()})}var f,U,pe,_,x,A,B={area:"areas",device:"devices",action:"scripts"};function z(){let n=f.querySelector(".current-area");for(let e of pe)if(e.id==_)return n.innerHTML=`${e.display_name}`;n.innerHTML=`Area ID ${_}`,ct()}function it(n){x[B[A]].unassign_from_area(n,(e,t,a)=>{if(console.log(`sh_api[${B[A]}].unassign_from_area`,e,t,a),!t||t.data.status)return Toasts.createError("Error of unassigning",t?t.data.error_alias:"Error of request").show();_=0,z(),V(),Toasts.createSuccess("Successfully unassigning","Successfully unassigning").show(),Screens.reinit()})}function rt(n,e){n[B[A]].place_in_area(e,(t,a,s)=>{if(console.log("sh_api.areas.place_in_area",t,a,s),!a||!a.status)return console.error("Component placeInArea",t,a,s);let i=f.querySelector(".current-area");Toasts.createSuccess("Successfully applied","Successfully applied").show(),_=e.place_in_area_id,z(),V(),Screens.reinit(),console.log("Success",a)})}function ot(n,e){x.areas.list((t,a,s)=>{if(console.log("sh_api.areas.list",t,a,s),!a)return console.error("sh_api.areas.list",t);pe=a.data.areas,z();let i={};for(let r of a.data.areas)A=="area"&&r.id==n||(i[r.id]=r.display_name);let o=advancedSelect(f.querySelector(".select-area"),i,"Nothing found");f.querySelector(".advanced-select-container").append(o),o.advancedSelect.addEventListener("changed",r=>{e(r,a.data.areas)}),U.innerHTML="",U.append(f)})}function V(){let n=f.querySelector(".form-container");n.classList.remove("a-show"),n.classList.add("a-hide"),setTimeout(()=>n.classList.remove("a-hide"),300)}function ct(){let n=f.querySelector(".remove-parent-id");_==0?n.classList.add("d-none"):n.classList.remove("d-none")}function L(n,e,t,a,s){x=n,U=e,_=s,A=t,f=document.createElement("div"),f.classList.add("component"),f.classList.add("place-in-area-component"),f.innerHTML=` + Alias: ${i}`).show()})}var f,U,pe,_,R,A,B={area:"areas",device:"devices",action:"scripts"};function z(){let n=f.querySelector(".current-area"),e=pe.find(t=>t.id==_);n.innerHTML=e?e.display_name:`Area ID ${_}`,ct()}function it(n){R[B[A]].unassign_from_area(n,(e,t,a)=>{if(console.log(`sh_api[${B[A]}].unassign_from_area`,e,t,a),!t||t.data.status)return Toasts.createError("Error of unassigning",t?t.data.error_alias:"Error of request").show();DataProvider.invalidate("raw.areas.list"),_=0,z(),V(),Toasts.createSuccess("Successfully unassigning","Successfully unassigning").show(),Screens.reinit()})}function rt(n,e){n[B[A]].place_in_area(e,(t,a,s)=>{if(console.log("sh_api.areas.place_in_area",t,a,s),!a||!a.status)return console.error("Component placeInArea",t,a,s);let i=f.querySelector(".current-area");DataProvider.invalidate("raw.areas.list"),Toasts.createSuccess("Successfully applied","Successfully applied").show(),_=e.place_in_area_id,z(),V(),Screens.reinit(),console.log("Success",a)})}function ot(n,e){DataProvider.getOrFetch("raw.areas.list",t=>R.areas.list((a,s)=>t(a,s==null?void 0:s.data)),(t,a)=>{if(!a)return console.error("sh_api.areas.list",t);pe=a.areas,z();let s={};for(let r of a.areas)A=="area"&&r.id==n||(s[r.id]=r.display_name);let i=advancedSelect(f.querySelector(".select-area"),s,"Nothing found");f.querySelector(".advanced-select-container").append(i),i.advancedSelect.addEventListener("changed",r=>{e(r,a.areas)}),U.innerHTML="",U.append(f)})}function V(){let n=f.querySelector(".form-container");n.classList.remove("a-show"),n.classList.add("a-hide"),setTimeout(()=>n.classList.remove("a-hide"),300)}function ct(){let n=f.querySelector(".remove-parent-id");_==0?n.classList.add("d-none"):n.classList.remove("d-none")}function L(n,e,t,a,s){R=n,U=e,_=s,A=t,f=document.createElement("div"),f.classList.add("component"),f.classList.add("place-in-area-component"),f.innerHTML=` - `});return e}function mt(n,e,t){n.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Devices list",{deviceName:"Device name",connectionStatus:"Connect",state:"State",ip:"IP",actions:"Actions"},e,`Total: ${t} devices`)}function ft(n,e){n.currentScreen.DOMObject.querySelectorAll(".reboot-btn").forEach(t=>{t.addEventListener("click",a=>{a.currentTarget.getAttribute("disabled")||w(e,a.currentTarget)})}),n.currentScreen.DOMObject.querySelectorAll(".details-btn").forEach(t=>{t.addEventListener("click",a=>{let s=v({state:""},JSON.parse(a.currentTarget.dataset.device));R(s,e).show()})})}function fe(n){return{alias:"devices",renderer:()=>Helper.template.mainTemplate(N("devices")),initer:e=>{try{n.devices.list((t,a,s)=>{if(t||!a||s.status_code!=200)throw"Err";mt(e,pt(a.data),a.data.total),ft(e,n),e.currentScreen.DOMObject.querySelectorAll(".device-state-container").forEach(i=>{i.append(y(n,i.dataset.deviceId,i.dataset.deviceType))}),e.ready()})}catch(t){return console.error("sh_api.devices.list",t),e.error("Server API ERROR","")}}}}function be(n,e){return n=Helper.unification.deviceFieldsUnification(n),Modals.create("device-setup",{title:`Setup new device ${n.ip}`,body:t=>{let a="";for(let i in n)i[0]!="_"&&(a+=` + `});return e}function mt(n,e,t){n.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Devices list",{deviceName:"Device name",connectionStatus:"Connect",state:"State",ip:"IP",actions:"Actions"},e,`Total: ${t} devices`)}function ft(n,e){n.currentScreen.DOMObject.querySelectorAll(".reboot-btn").forEach(t=>{t.addEventListener("click",a=>{a.currentTarget.getAttribute("disabled")||w(e,a.currentTarget)})}),n.currentScreen.DOMObject.querySelectorAll(".details-btn").forEach(t=>{t.addEventListener("click",a=>{let s=h({state:""},JSON.parse(a.currentTarget.dataset.device));N(s,e).show()})})}function fe(n){return{alias:"devices",renderer:()=>Helper.template.mainTemplate(x("devices")),initer:e=>{try{n.devices.list((t,a,s)=>{if(t||!a||s.status_code!=200)throw"Err";mt(e,pt(a.data),a.data.total),ft(e,n),e.currentScreen.DOMObject.querySelectorAll(".device-state-container").forEach(i=>{i.append(y(n,i.dataset.deviceId,i.dataset.deviceType))}),e.ready()})}catch(t){return console.error("sh_api.devices.list",t),e.error("Server API ERROR","")}}}}function ve(n,e){return n=Helper.unification.deviceFieldsUnification(n),Modals.create("device-setup",{title:`Setup new device ${n.ip}`,body:t=>{let a="";for(let i in n)i[0]!="_"&&(a+=` ${i}: ${n[i]} @@ -175,13 +175,13 @@
    - `},actions:t=>{let a=Helper.template.createElement("button",{class:"btn btn-primary"},"Cancel");a.addEventListener("click",i=>{t.close()});let s=Helper.template.createElement("button",{class:"btn btn-success with-icon"},' Setup');return s.addEventListener("click",i=>{if(i.currentTarget.getAttribute("disabled"))return!1;let o={device_ip:n.ip},r=document.querySelector("#device-setup .setup-form");if(r.querySelectorAll("input[type='text']").forEach(d=>{d.dispatchEvent(new Event("input",{bubbles:!0}))}),r.querySelectorAll(".label.error").length)return!1;let c=r.querySelectorAll("input"),l=r.querySelector("textarea");for(let d of c)o[d.getAttribute("name")]=d.value;o[l.getAttribute("name")]=l.value,Helper.states.btnLoadingState(s,!0),e.devices.setup_new_device(o,(d,u,p)=>{var m,g;if(Helper.states.btnLoadingState(s,!1),(d==null?void 0:d.type)=="api_error"){if(console.error("ERR! sh_api.devices.setup_new_device",d.raw),(m=d.raw)!=null&&m.failed_fields)for(let b of d.raw.failed_fields)t.querySelector(`[name="${b}"]`).parentNode.classList.add("error");if((g=d.raw)!=null&&g.msg){let b=t.querySelector(".setup-form .alert-container");b.innerHTML="",b==null||b.append(Helper.template.createAlert("error",d.raw.msg))}return!1}if(!u)return!1;c.forEach(b=>b.value=""),l.value="",t.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Setup successful",`Added new device ID ${n.device_id}`).show()},300)})}),[a,s]},onready:t=>{t.querySelector(".setup-form").querySelectorAll("input").forEach(s=>{s.addEventListener("input",i=>{var o;i.currentTarget.value.length?(i.currentTarget.parentNode.classList.remove("error"),(o=i.currentTarget.parentNode.parentNode.querySelector(".input-info.error"))==null||o.remove()):(i.currentTarget.parentNode.classList.add("error"),i.currentTarget.parentNode.parentNode.querySelector(".input-info.error")||i.currentTarget.parentNode.parentNode.append(Helper.template.createElement("div",{class:"input-info error"},' Field cannot be empty')))})})}})}function bt(n){let e=[];for(let t of n.devices)t=Helper.unification.deviceFieldsUnification(t),e.push({deviceId:t.device_id,deviceName:t.name,deviceType:t.type,status:`${t.status}`,ip:`${t.ip}`,mac:`${t.mac}`,wifiSignal:t.wifi_signal,actions:t.status=="setup"?` + `},actions:t=>{let a=Helper.template.createElement("button",{class:"btn btn-primary"},"Cancel");a.addEventListener("click",i=>{t.close()});let s=Helper.template.createElement("button",{class:"btn btn-success with-icon"},' Setup');return s.addEventListener("click",i=>{if(i.currentTarget.getAttribute("disabled"))return!1;let r={device_ip:n.ip},o=document.querySelector("#device-setup .setup-form");if(o.querySelectorAll("input[type='text']").forEach(d=>{d.dispatchEvent(new Event("input",{bubbles:!0}))}),o.querySelectorAll(".label.error").length)return!1;let c=o.querySelectorAll("input"),l=o.querySelector("textarea");for(let d of c)r[d.getAttribute("name")]=d.value;r[l.getAttribute("name")]=l.value,Helper.states.btnLoadingState(s,!0),e.devices.setup_new_device(r,(d,u,p)=>{var m,g;if(Helper.states.btnLoadingState(s,!1),(d==null?void 0:d.type)=="api_error"){if(console.error("ERR! sh_api.devices.setup_new_device",d.raw),(m=d.raw)!=null&&m.failed_fields)for(let v of d.raw.failed_fields)t.querySelector(`[name="${v}"]`).parentNode.classList.add("error");if((g=d.raw)!=null&&g.msg){let v=t.querySelector(".setup-form .alert-container");v.innerHTML="",v==null||v.append(Helper.template.createAlert("error",d.raw.msg))}return!1}if(!u)return!1;c.forEach(v=>v.value=""),l.value="",t.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Setup successful",`Added new device ID ${n.device_id}`).show()},300)})}),[a,s]},onready:t=>{t.querySelector(".setup-form").querySelectorAll("input").forEach(s=>{s.addEventListener("input",i=>{var r;i.currentTarget.value.length?(i.currentTarget.parentNode.classList.remove("error"),(r=i.currentTarget.parentNode.parentNode.querySelector(".input-info.error"))==null||r.remove()):(i.currentTarget.parentNode.classList.add("error"),i.currentTarget.parentNode.parentNode.querySelector(".input-info.error")||i.currentTarget.parentNode.parentNode.append(Helper.template.createElement("div",{class:"input-info error"},' Field cannot be empty')))})})}})}function vt(n){let e=[];for(let t of n.devices)t=Helper.unification.deviceFieldsUnification(t),e.push({deviceId:t.device_id,deviceName:t.name,deviceType:t.type,status:`${t.status}`,ip:`${t.ip}`,mac:`${t.mac}`,wifiSignal:t.wifi_signal,actions:t.status=="setup"?` - `:""});return e}function vt(n,e,t){n.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Found devices",{deviceId:"Device ID",deviceName:"Device name",deviceType:"Type",status:"Status",ip:"IP",mac:"Mac",wifiSignal:"Signal",actions:"Actions"},e,`Total: ${t} devices`)}function ht(n,e){n.currentScreen.DOMObject.querySelectorAll(".setup-btn").forEach(t=>{t.addEventListener("click",a=>{let s=JSON.parse(a.currentTarget.dataset.device);be(s,e).show()})})}function ve(n){return{alias:"devices-scanning",renderer:()=>Helper.template.mainTemplate(N("scanning")),initer:e=>{n.devices.scanning_all((t,a,s)=>{if(console.log("sh_api.devices.scanning_all",t,a),s.status_code!=200)return e.error("Server API ERROR","");vt(e,bt(a.data),a.data.devices.length),ht(e,n),e.ready()})}}}var J={list:fe,scanning:ve};function $(n){return Helper.template.sidebarNav([{content:' Scopes',route:"/#!/scripts/scopes",is_active:n=="scopes"},{content:' Actions',route:"/#!/scripts/actions",is_active:n=="actions"},{content:' Regular',route:"/#!/scripts/regular",is_active:n=="regular"}])}function W(n,e,t){n.scripts.run({alias:e,params:{}},(a,s,i)=>{s?(t(!0),setTimeout(()=>Screens.reinit(),1e3),setTimeout(()=>Toasts.createSuccess(`${e} running`,`${e} running success`).show(),300)):(t(!1),setTimeout(()=>Toasts.createError(`${e} failed`,`${e} running failed`).show(),300))})}function Y(n){return` + `:""});return e}function ht(n,e,t){n.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Found devices",{deviceId:"Device ID",deviceName:"Device name",deviceType:"Type",status:"Status",ip:"IP",mac:"Mac",wifiSignal:"Signal",actions:"Actions"},e,`Total: ${t} devices`)}function bt(n,e){n.currentScreen.DOMObject.querySelectorAll(".setup-btn").forEach(t=>{t.addEventListener("click",a=>{let s=JSON.parse(a.currentTarget.dataset.device);ve(s,e).show()})})}function he(n){return{alias:"devices-scanning",renderer:()=>Helper.template.mainTemplate(x("scanning")),initer:e=>{n.devices.scanning_all((t,a,s)=>{if(console.log("sh_api.devices.scanning_all",t,a),s.status_code!=200)return e.error("Server API ERROR","");ht(e,vt(a.data),a.data.devices.length),bt(e,n),e.ready()})}}}var J={list:fe,scanning:he};function $(n){return Helper.template.sidebarNav([{content:' Scopes',route:"/#!/scripts/scopes",is_active:n=="scopes"},{content:' Actions',route:"/#!/scripts/actions",is_active:n=="actions"},{content:' Regular',route:"/#!/scripts/regular",is_active:n=="regular"}])}function W(n,e,t){n.scripts.run({alias:e,params:{}},(a,s,i)=>{s?(t(!0),setTimeout(()=>Screens.reinit(),1e3),setTimeout(()=>Toasts.createSuccess(`${e} running`,`${e} running success`).show(),300)):(t(!1),setTimeout(()=>Toasts.createError(`${e} failed`,`${e} running failed`).show(),300))})}function Y(n){return`
    ${n.description}
    - `}function G(n,e){e.querySelector(".card-content").addEventListener("click",t=>{if(e.getAttribute("disabled"))return;Helper.states.cardScriptActionLoadingState(e,!0);let a=e.dataset.alias;W(n,a,s=>{Helper.states.cardScriptActionLoadingState(e,!1),s&&(e.classList.add("card-success"),setTimeout(()=>e.classList.remove("card-success"),1e3))})})}function he(n,e){let t=document.createElement("div");t.innerHTML=Y(e);let a=t.querySelector(".card");return G(n,a),a}function gt(n){let e=[];for(let t of n.scopes){let a=t.state=="disabled"?``;e.push({name:t.name,filename:`${t.filename}
    ${t.path}`,state:Helper.template.toogleStateBadge(t.state),actions:` ${a} - `})}return e}function St(n,e,t){n.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Scopes list",{name:"Scope name",filename:"Filename",state:"State",actions:"Actions"},e,`Total: ${t} scopes`)}function yt(n,e){n.currentScreen.DOMObject.querySelectorAll(".change-state-btn").forEach(t=>{t.addEventListener("click",a=>{let s=a.currentTarget;if(s.getAttribute("disabled"))return;let i=s.dataset.value=="enable"?"scope_enable":"scope_disable",o=JSON.parse(s.dataset.scope);Helper.states.btnLoadingState(s,!0),e.scripts[i](o.name,(r,c,l)=>{Helper.states.btnLoadingState(s,!1),c?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of ${o.name} was changed`).show()):Toasts.createError("Request failed","Scope state not changed").show()})})})}function ge(n){return{title:"Scripts Scopes",alias:"scripts-scopes",renderer:()=>Helper.template.mainTemplate($("scopes")),initer:e=>{n.scripts.scopes_list((t,a,s)=>{if(console.log("sh_api.scripts.scopes_list",t,a,s),s.status_code!=200)return e.error("Server API ERROR","");St(e,gt(a.data),a.data.total),yt(e,n),e.ready()})}}}function wt(n){let e=[];for(let t of n.scripts){let a=t.state=="disabled"?``;e.push({alias:`${t.alias}
    by ${t.created_by}`,name:`${t.name}
    ${t.description}
    `,filename:`${t.filename}
    ${t.path}`,state:Helper.template.toogleStateBadge(t.state),actions:` ${a} - `})}return e}function _t(n,e,t){let a={};for(let s in e)a[e[s].alias]=e[s],e[s].code="";n.currentScreen.DOMObject.provideSciptsData=a,n.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Regular scripts list",{alias:"Alias",name:"Script name",filename:"Filename",state:"State",actions:"Actions"},e,`Total: ${t} scripts`)}function Lt(n,e){n.currentScreen.DOMObject.querySelectorAll(".change-state-btn").forEach(t=>{t.addEventListener("click",a=>{var r;let s=a.currentTarget;if(s.getAttribute("disabled"))return;let i=s.dataset.value=="enable"?"regular_enable":"regular_disable",o=(r=n.currentScreen.DOMObject.provideSciptsData[s.dataset.alias])!=null?r:{alias:s.dataset.alias};Helper.states.btnLoadingState(s,!0),e.scripts[i](o.alias,(c,l,d)=>{Helper.states.btnLoadingState(s,!1),l?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of ${o.alias} was changed`).show()):Toasts.createError("Request failed","Regular script state not changed").show()})})})}function Se(n){return{title:"Scripts Regular",alias:"scripts-regular",renderer:()=>Helper.template.mainTemplate($("regular")),initer:e=>{n.scripts.regular_list((t,a,s)=>{if(console.log("sh_api.scripts.regular_list",t,a,s),s.status_code!=200)return e.error("Server API ERROR","");_t(e,wt(a.data),a.data.total),Lt(e,n),e.ready()})}}}function ye(n,e){return console.log("actionDetailsPopup",n),Modals.create("action-script-popup",{title:`${n.name}`,body:t=>{let a=n.area_id!=-1?'
    ':"";return` + `})}return e}function _t(n,e,t){let a={};for(let s in e)a[e[s].alias]=e[s],e[s].code="";n.currentScreen.DOMObject.provideSciptsData=a,n.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Regular scripts list",{alias:"Alias",name:"Script name",filename:"Filename",state:"State",actions:"Actions"},e,`Total: ${t} scripts`)}function Lt(n,e){n.currentScreen.DOMObject.querySelectorAll(".change-state-btn").forEach(t=>{t.addEventListener("click",a=>{var o;let s=a.currentTarget;if(s.getAttribute("disabled"))return;let i=s.dataset.value=="enable"?"regular_enable":"regular_disable",r=(o=n.currentScreen.DOMObject.provideSciptsData[s.dataset.alias])!=null?o:{alias:s.dataset.alias};Helper.states.btnLoadingState(s,!0),e.scripts[i](r.alias,(c,l,d)=>{Helper.states.btnLoadingState(s,!1),l?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of ${r.alias} was changed`).show()):Toasts.createError("Request failed","Regular script state not changed").show()})})})}function Se(n){return{title:"Scripts Regular",alias:"scripts-regular",renderer:()=>Helper.template.mainTemplate($("regular")),initer:e=>{n.scripts.regular_list((t,a,s)=>{if(console.log("sh_api.scripts.regular_list",t,a,s),s.status_code!=200)return e.error("Server API ERROR","");_t(e,wt(a.data),a.data.total),Lt(e,n),e.ready()})}}}function ye(n,e){return console.log("actionDetailsPopup",n),Modals.create("action-script-popup",{title:`${n.name}`,body:t=>{let a=n.area_id!=-1?'
    ':"";return`
    @@ -247,10 +247,10 @@
    - `},actions:t=>{let a=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),s=Helper.template.createElement("button",{class:n.state=="enabled"?"btn btn-warning":"btn btn-success","data-value":n.state=="enabled"?"disable":"enable"},n.state=="enabled"?"Disable":"Enable"),i=Helper.template.createElement("button",{class:"btn btn-secondary with-icon"},' Run');return a.addEventListener("click",o=>{t.close()}),s.addEventListener("click",o=>{let r=o.currentTarget;if(r.getAttribute("disabled"))return;let c=r.dataset.value=="enable"?"action_enable":"action_disable";Helper.states.btnLoadingState(r,!0),e.scripts[c](n.alias,(l,d,u)=>{Helper.states.btnLoadingState(r,!1),t.close(),d?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of ${n.alias} was changed`).show()):Toasts.createError("Request failed","Regular script state not changed").show()})}),i.addEventListener("click",o=>{let r=o.currentTarget;Helper.states.btnLoadingState(r,!0),W(e,n.alias,c=>{Helper.states.btnLoadingState(r,!1),c&&t.close()})}),[a,s,i]},onready:t=>{L(e,t.querySelector(".place-in-area-component-container"),"action",n.id,n.area_id),hljs.highlightElement(t.querySelector(".code-viewer"))}})}function K(n){var t,a,s;let e=[];for(let i of n.scripts)e.push({alias:i.alias,author:i.created_by,name:i.name,icon:(t=i.icon)!=null?t:'',description:i.description,filename:`${i.filename}
    ${i.path}`,state:i.state,code:i.code,id:(a=i.id)!=null?a:0,area_id:(s=i.area_id)!=null?s:-1});return e}function $t(n,e,t){let a='
    ',s={};for(let o of e)s[o.alias]=o,a+=Y(o);a+="
    ";let i=n.currentScreen.DOMObject.querySelector(".main-container");i.innerHTML=a,n.currentScreen.DOMObject.provideSciptsData=s}function Et(n,e){n.currentScreen.DOMObject.querySelectorAll(".script-action").forEach(t=>{G(e,t)}),n.currentScreen.DOMObject.querySelectorAll(".action-details-btn").forEach(t=>{t.addEventListener("click",a=>{var o;let s=a.currentTarget,i=(o=n.currentScreen.DOMObject.provideSciptsData[s.dataset.alias])!=null?o:{};console.log("SCRIPT",i),ye(i,e).show()})})}function we(n){return{title:"Scripts Actions",alias:"scripts-actions",renderer:()=>Helper.template.mainTemplate($("actions")),initer:e=>{n.scripts.actions_list((t,a,s)=>{if(console.log("sh_api.scripts.actions_list",t,a,s),s.status_code!=200)return e.error("Server API ERROR","");$t(e,K(a.data),a.data.total),Et(e,n),e.ready()})}}}var j={scopes:ge,regular:Se,actions:we};function _e(n){return Helper.template.sidebarNav([{content:' Areas Tree',route:"/#!/areas/tree",is_active:n=="areas-tree"}])}function Le(n,e){return console.log("areaDevicesModal",n),Modals.create("area-devices-modal",{title:` ${n.display_name}`,body:t=>` + `},actions:t=>{let a=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),s=Helper.template.createElement("button",{class:n.state=="enabled"?"btn btn-warning":"btn btn-success","data-value":n.state=="enabled"?"disable":"enable"},n.state=="enabled"?"Disable":"Enable"),i=Helper.template.createElement("button",{class:"btn btn-secondary with-icon"},' Run');return a.addEventListener("click",r=>{t.close()}),s.addEventListener("click",r=>{let o=r.currentTarget;if(o.getAttribute("disabled"))return;let c=o.dataset.value=="enable"?"action_enable":"action_disable";Helper.states.btnLoadingState(o,!0),e.scripts[c](n.alias,(l,d,u)=>{Helper.states.btnLoadingState(o,!1),t.close(),d?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of ${n.alias} was changed`).show()):Toasts.createError("Request failed","Regular script state not changed").show()})}),i.addEventListener("click",r=>{let o=r.currentTarget;Helper.states.btnLoadingState(o,!0),W(e,n.alias,c=>{Helper.states.btnLoadingState(o,!1),c&&t.close()})}),[a,s,i]},onready:t=>{L(e,t.querySelector(".place-in-area-component-container"),"action",n.id,n.area_id),hljs.highlightElement(t.querySelector(".code-viewer"))}})}function K(n){var t,a,s;let e=[];for(let i of n.scripts)e.push({alias:i.alias,author:i.created_by,name:i.name,icon:(t=i.icon)!=null?t:'',description:i.description,filename:`${i.filename}
    ${i.path}`,state:i.state,code:i.code,id:(a=i.id)!=null?a:0,area_id:(s=i.area_id)!=null?s:-1});return e}function $t(n,e,t){let a='
    ',s={};for(let r of e)s[r.alias]=r,a+=Y(r);a+="
    ";let i=n.currentScreen.DOMObject.querySelector(".main-container");i.innerHTML=a,n.currentScreen.DOMObject.provideSciptsData=s}function Et(n,e){n.currentScreen.DOMObject.querySelectorAll(".script-action").forEach(t=>{G(e,t)}),n.currentScreen.DOMObject.querySelectorAll(".action-details-btn").forEach(t=>{t.addEventListener("click",a=>{var r;let s=a.currentTarget,i=(r=n.currentScreen.DOMObject.provideSciptsData[s.dataset.alias])!=null?r:{};console.log("SCRIPT",i),ye(i,e).show()})})}function we(n){return{title:"Scripts Actions",alias:"scripts-actions",renderer:()=>Helper.template.mainTemplate($("actions")),initer:e=>{n.scripts.actions_list((t,a,s)=>{if(console.log("sh_api.scripts.actions_list",t,a,s),s.status_code!=200)return e.error("Server API ERROR","");$t(e,K(a.data),a.data.total),Et(e,n),e.ready()})}}}var P={scopes:ge,regular:Se,actions:we};function _e(n){return Helper.template.sidebarNav([{content:' Areas Tree',route:"/#!/areas/tree",is_active:n=="areas-tree"}])}function Le(n,e){return console.log("areaDevicesModal",n),Modals.create("area-devices-modal",{title:` ${n.display_name}`,body:t=>`
    - `,actions:t=>{let a=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),s=Helper.template.createElement("button",{class:"btn btn-warning with-icon btn-reboot-all"},' Reboot All');return a.addEventListener("click",i=>{t.close()}),s.addEventListener("click",i=>{s.getAttribute("disabled")||(Helper.states.btnLoadingState(s,!0),confirmPopup(`Are you sure you want to reboot all devices from ${n.display_name}?`,()=>{e.areas.reboot_devices(n.id,(o,r,c)=>{Helper.states.btnLoadingState(s,!1),r?(console.log("Was rebooted all devices"),Toasts.createSuccess("Rebooted all devices",`Area: ${n.display_name}`).show()):Toasts.createDanger("Rebooted fail",`Area: ${n.display_name}`).show()})},()=>{Helper.states.btnLoadingState(s,!1),console.log("CANCELED")}))}),[a,s]},onready:t=>{let a=t.querySelector(".devices-container"),s=t.querySelector(".loader");e.areas.devices(n.id,(i,o,r)=>{console.log("sh_api.areas.devices",o);function c(d){if(!d)return[];let u=[];for(let p of d.devices)p=Helper.unification.deviceFieldsUnification(p),u.push({deviceNaming:` + `,actions:t=>{let a=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),s=Helper.template.createElement("button",{class:"btn btn-warning with-icon btn-reboot-all"},' Reboot All');return a.addEventListener("click",i=>{t.close()}),s.addEventListener("click",i=>{s.getAttribute("disabled")||(Helper.states.btnLoadingState(s,!0),confirmPopup(`Are you sure you want to reboot all devices from ${n.display_name}?`,()=>{e.areas.reboot_devices(n.id,(r,o,c)=>{Helper.states.btnLoadingState(s,!1),o?(console.log("Was rebooted all devices"),Toasts.createSuccess("Rebooted all devices",`Area: ${n.display_name}`).show()):Toasts.createDanger("Rebooted fail",`Area: ${n.display_name}`).show()})},()=>{Helper.states.btnLoadingState(s,!1),console.log("CANCELED")}))}),[a,s]},onready:t=>{let a=t.querySelector(".devices-container"),s=t.querySelector(".loader");e.areas.devices(n.id,(i,r,o)=>{console.log("sh_api.areas.devices",r);function c(d){if(!d)return[];let u=[];for(let p of d.devices)p=Helper.unification.deviceFieldsUnification(p),u.push({deviceNaming:`
    ${p.name}
    ${p.alias}
    `,status:Helper.template.connectionStatusBadge(p.connection_status),state:`
    Reboot
    - `});return u}let l=c(o==null?void 0:o.data);l.length?a.innerHTML=Helper.template.table("",{deviceNaming:"Device",status:"Status",state:"State",actions:"Actions"},l,`Total: ${l.length} devices`):(a.innerHTML=Helper.template.emptyHereHTML(),t.querySelector(".btn-reboot-all").remove()),a.querySelectorAll(".reboot-btn").forEach(d=>{d.addEventListener("click",u=>{d.getAttribute("disabled")||w(e,u.currentTarget,t)})}),a.querySelectorAll(".device-state-container").forEach(d=>{d.append(y(e,d.dataset.deviceId,d.dataset.deviceType))}),a.querySelectorAll(".details-btn").forEach(d=>{d.addEventListener("click",u=>{let p=v({status:""},JSON.parse(u.currentTarget.dataset.device));R(p,e).show()})}),s.remove(),console.log("devices",l)})}})}function $e(n,e){return console.log("areaActionsModal",n),Modals.create("area-actions-modal",{title:` ${n.display_name}`,body:t=>` + `});return u}let l=c(r==null?void 0:r.data);l.length?a.innerHTML=Helper.template.table("",{deviceNaming:"Device",status:"Status",state:"State",actions:"Actions"},l,`Total: ${l.length} devices`):(a.innerHTML=Helper.template.emptyHereHTML(),t.querySelector(".btn-reboot-all").remove()),a.querySelectorAll(".reboot-btn").forEach(d=>{d.addEventListener("click",u=>{d.getAttribute("disabled")||w(e,u.currentTarget,t)})}),a.querySelectorAll(".device-state-container").forEach(d=>{d.append(y(e,d.dataset.deviceId,d.dataset.deviceType))}),a.querySelectorAll(".details-btn").forEach(d=>{d.addEventListener("click",u=>{let p=h({status:""},JSON.parse(u.currentTarget.dataset.device));N(p,e).show()})}),s.remove(),console.log("devices",l)})}})}function $e(n,e){return console.log("areaActionsModal",n),Modals.create("area-actions-modal",{title:` ${n.display_name}`,body:t=>`
    - `,actions:t=>{let a=Helper.template.createElement("button",{class:"btn btn-primary"},"Close");return a.addEventListener("click",s=>{t.close()}),[a]},onready:t=>{let a=t.querySelector(".actions-container"),s=t.querySelector(".loader");e.areas.scripts(n.id,(i,o,r)=>{if(console.log("sh_api.areas.scripts",i,o,r),!o)return Toasts.createDanger("Loading failed",`Area: ${n.display_name}`).show();let c=K(o.data);console.log("ACTIONS",c),a.innerHTML="",c.length||(a.innerHTML=Helper.template.emptyHereHTML()),s.remove();for(let l of c)a.append(he(e,l))})}})}function Ee(n){return console.log("createNewAreaModal"),Modals.create("create-area-modal",{title:' Create new Area',body:e=>` + `,actions:t=>{let a=Helper.template.createElement("button",{class:"btn btn-primary"},"Close");return a.addEventListener("click",s=>{t.close()}),[a]},onready:t=>{let a=t.querySelector(".actions-container"),s=t.querySelector(".loader");e.areas.scripts(n.id,(i,r,o)=>{if(console.log("sh_api.areas.scripts",i,r,o),!r)return Toasts.createDanger("Loading failed",`Area: ${n.display_name}`).show();let c=K(r.data);console.log("ACTIONS",c),a.innerHTML="",c.length||(a.innerHTML=Helper.template.emptyHereHTML()),s.remove();for(let l of c)a.append(be(e,l))})}})}function Ee(n){return console.log("createNewAreaModal"),Modals.create("create-area-modal",{title:' Create new Area',body:e=>`
    - `,actions:e=>{let t=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),a=Helper.template.createElement("button",{class:"btn btn-success with-icon"},' Create');return t.addEventListener("click",s=>{e.close()}),a.addEventListener("click",s=>{let i=e.querySelector(".create-area-form");if(i.querySelectorAll("input[type='text']").forEach(c=>{c.dispatchEvent(new Event("input",{bubbles:!0}))}),i.querySelectorAll(".label.error").length)return!1;let o=i.querySelectorAll("input"),r={};for(let c of o)r[c.getAttribute("name")]=c.value;Helper.states.btnLoadingState(a,!0),n.areas.new_area(r,(c,l,d)=>{var u,p;if(Helper.states.btnLoadingState(a,!1),(c==null?void 0:c.type)=="api_error"){if(console.error("ERR! sh_api.areas.new_area",c.raw),(u=c.raw)!=null&&u.failed_fields)for(let m of c.raw.failed_fields)e.querySelector(`[name="${m}"]`).parentNode.classList.add("error");if((p=c.raw)!=null&&p.msg){let m=e.querySelector(".alert-container");m.innerHTML="",m==null||m.append(Helper.template.createAlert("error",c.raw.msg))}return!1}if(!l)return!1;o.forEach(m=>m.value=""),e.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Creating successful",`Added new area ID ${r.alias}`).show()},300)})}),[t,a]},onready:e=>{let t=e.querySelector(".create-area-form");t.querySelectorAll(".input").forEach(a=>{a.addEventListener("input",s=>{var i;s.currentTarget.value.length?(s.currentTarget.parentNode.classList.remove("error"),(i=s.currentTarget.parentNode.parentNode.querySelector(".input-info.error"))==null||i.remove()):(s.currentTarget.parentNode.classList.add("error"),s.currentTarget.parentNode.parentNode.querySelector(".input-info.error")||s.currentTarget.parentNode.parentNode.append(Helper.template.createElement("div",{class:"input-info error"},' Field cannot be empty')))})}),n.areas.types_list((a,s,i)=>{console.log("sh_api.areas.types_list",a,s,i),s||console.error("Request Error. sh_api.areas.types_list()");let o={};for(let r of s.data.types)o[r]=r;t.querySelector(".advanced-select-container").append(advancedSelect(t.querySelector('[name="type"]'),o,"Will be created"))})}})}function Tt(n,e,t){let a=[{payloadFieldName:"display_name",selector:".display-name",methName:"update_display_name",originalValue:e.display_name,isMultiString:!1},{payloadFieldName:"new_alias",selector:".alias",methName:"update_alias",originalValue:e.alias,isMultiString:!1}];for(let s of a){let i=editableString(t.querySelector(s.selector));i.editableString.onChange(o=>{let r={area_id:e.id};r[s.payloadFieldName]=o.value,n.areas[s.methName](r,(c,l,d)=>{var u,p,m;if(c||!l||!l.status)return console.error(`sh_api.areas.${s.methName}`,c),i.editableString.setValue(s.originalValue),Toasts.createError((u=c==null?void 0:c.message)!=null?u:"Error updating",(m=(p=c.raw)==null?void 0:p.msg)!=null?m:`Error of ${s.payloadFieldName} updating`).show();l.status==!0&&Screens.reinit()})})}}function Te(n,e){var t;return n=(t=Screens.currentScreen.DOMObject.provideData[n.id])!=null?t:n,console.log("areaDetailsModal",n),Modals.create("area-details-modal",{title:` ${n.display_name}`,body:a=>{var c;let s=n,i={parent_id:"place-in-area-container",display_name:"display-name",alias:"alias-view-container"},o=(l,d)=>{let u={alias:' {{value}}',create_at:p=>Helper.unification.formatDate(p),update_at:p=>Helper.unification.formatDate(p),schema:"Nothing yet"};return u[l]?typeof u[l]=="function"?u[l](d):u[l].replaceAll("{{value}}",d):d},r="";for(let l in s){let d=(c=i[l])!=null?c:"";r+=` + `,actions:e=>{let t=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),a=Helper.template.createElement("button",{class:"btn btn-success with-icon"},' Create');return t.addEventListener("click",s=>{e.close()}),a.addEventListener("click",s=>{let i=e.querySelector(".create-area-form");if(i.querySelectorAll("input[type='text']").forEach(c=>{c.dispatchEvent(new Event("input",{bubbles:!0}))}),i.querySelectorAll(".label.error").length)return!1;let r=i.querySelectorAll("input"),o={};for(let c of r)o[c.getAttribute("name")]=c.value;Helper.states.btnLoadingState(a,!0),n.areas.new_area(o,(c,l,d)=>{var u,p;if(Helper.states.btnLoadingState(a,!1),(c==null?void 0:c.type)=="api_error"){if(console.error("ERR! sh_api.areas.new_area",c.raw),(u=c.raw)!=null&&u.failed_fields)for(let m of c.raw.failed_fields)e.querySelector(`[name="${m}"]`).parentNode.classList.add("error");if((p=c.raw)!=null&&p.msg){let m=e.querySelector(".alert-container");m.innerHTML="",m==null||m.append(Helper.template.createAlert("error",c.raw.msg))}return!1}if(!l)return!1;r.forEach(m=>m.value=""),e.close(),DataProvider.invalidate("raw.areas.list"),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Creating successful",`Added new area ID ${o.alias}`).show()},300)})}),[t,a]},onready:e=>{let t=e.querySelector(".create-area-form");t.querySelectorAll(".input").forEach(a=>{a.addEventListener("input",s=>{var i;s.currentTarget.value.length?(s.currentTarget.parentNode.classList.remove("error"),(i=s.currentTarget.parentNode.parentNode.querySelector(".input-info.error"))==null||i.remove()):(s.currentTarget.parentNode.classList.add("error"),s.currentTarget.parentNode.parentNode.querySelector(".input-info.error")||s.currentTarget.parentNode.parentNode.append(Helper.template.createElement("div",{class:"input-info error"},' Field cannot be empty')))})}),n.areas.types_list((a,s,i)=>{console.log("sh_api.areas.types_list",a,s,i),s||console.error("Request Error. sh_api.areas.types_list()");let r={};for(let o of s.data.types)r[o]=o;t.querySelector(".advanced-select-container").append(advancedSelect(t.querySelector('[name="type"]'),r,"Will be created"))})}})}function Tt(n,e,t){let a=[{payloadFieldName:"display_name",selector:".display-name",methName:"update_display_name",originalValue:e.display_name,isMultiString:!1},{payloadFieldName:"new_alias",selector:".alias",methName:"update_alias",originalValue:e.alias,isMultiString:!1}];for(let s of a){let i=editableString(t.querySelector(s.selector));i.editableString.onChange(r=>{let o={area_id:e.id};o[s.payloadFieldName]=r.value,n.areas[s.methName](o,(c,l,d)=>{var u,p,m;if(c||!l||!l.status)return console.error(`sh_api.areas.${s.methName}`,c),i.editableString.setValue(s.originalValue),Toasts.createError((u=c==null?void 0:c.message)!=null?u:"Error updating",(m=(p=c.raw)==null?void 0:p.msg)!=null?m:`Error of ${s.payloadFieldName} updating`).show();l.status==!0&&(DataProvider.invalidatePrefix("raw.areas"),Screens.reinit())})})}}function Te(n,e){var t;return n=(t=DataProvider.getRaw(`areas.${n.id}`))!=null?t:n,console.log("areaDetailsModal",n),Modals.create("area-details-modal",{title:` ${n.display_name}`,body:a=>{var c;let s=n,i={parent_id:"place-in-area-container",display_name:"display-name",alias:"alias-view-container"},r=(l,d)=>{let u={alias:' {{value}}',create_at:p=>Helper.unification.formatDate(p),update_at:p=>Helper.unification.formatDate(p),schema:"Nothing yet"};return u[l]?typeof u[l]=="function"?u[l](d):u[l].replaceAll("{{value}}",d):d},o="";for(let l in s){let d=(c=i[l])!=null?c:"";o+=` ${l}: - ${o(l,s[l])} + ${r(l,s[l])} `}return` - ${r} + ${o}
    - `},actions:a=>{let s=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),i=Helper.template.createElement("button",{class:"btn btn-danger with-icon"},' Remove');return s.addEventListener("click",o=>{a.close()}),i.addEventListener("click",o=>{Helper.states.btnLoadingState(i,!0),confirmPopup(`Are you sure you want to remove this area? ${n.display_name}`,()=>{e.areas.remove(n.id,(r,c,l)=>{Helper.states.btnLoadingState(i,!1),console.log("Was removed"),a.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Removed",`Area: ${n.display_name}`).show()},300)})},()=>{Helper.states.btnLoadingState(i,!1),console.log("CANCELED")})}),[s,i]},onready:a=>{L(e,a.querySelector(".place-in-area-container"),"area",n.id,n.parent_id),Tt(e,n,a)}})}function Ht(n){let e=n.areas,t={},a=[];for(let s of e)t[s.id]=se(v({},s),{children:[]});for(let s of e){let i=t[s.id];s.parent_id&&t[s.parent_id]?t[s.parent_id].children.push(i):a.push(i)}return a}function At(n){return Ht(n)}function He(n,e){var s,i;e=e!=null?e:0;let t=(s=n.children)!=null&&s.length?"":"is-single",a=` -
    + `},actions:a=>{let s=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),i=Helper.template.createElement("button",{class:"btn btn-danger with-icon"},' Remove');return s.addEventListener("click",r=>{a.close()}),i.addEventListener("click",r=>{Helper.states.btnLoadingState(i,!0),confirmPopup(`Are you sure you want to remove this area? ${n.display_name}`,()=>{e.areas.remove(n.id,(o,c,l)=>{Helper.states.btnLoadingState(i,!1),console.log("Was removed"),DataProvider.invalidatePrefix("raw.areas"),a.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Removed",`Area: ${n.display_name}`).show()},300)})},()=>{Helper.states.btnLoadingState(i,!1),console.log("CANCELED")})}),[s,i]},onready:a=>{L(e,a.querySelector(".place-in-area-container"),"area",n.id,n.parent_id),Tt(e,n,a)}})}function Ht(n){let e=n.areas,t={},a=[];for(let s of e)t[s.id]=se(h({},s),{children:[]});for(let s of e){let i=t[s.id],r=s.parent_id&&s.parent_id==s.id,o=s.parent_id&&t[s.parent_id];!r&&o?t[s.parent_id].children.push(i):a.push(i)}return a.length===0&&e.length>0?Object.values(t):a}function At(n){return Ht(n)}function He(n,e,t){var r,o;if(e=e!=null?e:0,t=t!=null?t:new Set,t.has(n.id))return"";let a=new Set(t);a.add(n.id);let s=(r=n.children)!=null&&r.length?"":"is-single",i=` +
    @@ -351,7 +351,7 @@
    - `;if((i=n.children)!=null&&i.length)for(let o of n.children)a+=He(o,e+1);return a}function Dt(n,e){console.log("TREE",e);let t='
    ';for(let a of e)t+=He(a);t+="
    ",n.currentScreen.DOMObject.querySelector(".main-container .tree-container").innerHTML=t}function Mt(n,e){n.currentScreen.DOMObject.querySelectorAll(".btn.devices").forEach(t=>{t.addEventListener("click",a=>{Le({id:a.currentTarget.dataset.areaId,display_name:a.currentTarget.dataset.areaName},e).show()})}),n.currentScreen.DOMObject.querySelectorAll(".btn.actions").forEach(t=>{t.addEventListener("click",a=>{$e({id:a.currentTarget.dataset.areaId,display_name:a.currentTarget.dataset.areaName},e).show()})}),n.currentScreen.DOMObject.querySelectorAll(".btn.details").forEach(t=>{t.addEventListener("click",a=>{Te({id:a.currentTarget.dataset.areaId,display_name:a.currentTarget.dataset.areaName,parent_id:a.currentTarget.dataset.parentId},e).show()})}),n.currentScreen.DOMObject.querySelectorAll("button.show-childs").forEach(t=>{t.addEventListener("click",a=>{let s=a.currentTarget,i=s.parentNode,o=parseInt(i.dataset.lvl);if(s.classList.contains("opened")){s.classList.remove("opened");let r=i.nextElementSibling;for(;r;){let c=parseInt(r.dataset.lvl);if(c==o||cHelper.template.mainTemplate(_e("areas-tree"),`
    + `;if((o=n.children)!=null&&o.length)for(let c of n.children)i+=He(c,e+1,a);return i}function Dt(n,e){console.log("TREE",e);let t='
    ';for(let a of e)t+=He(a);t+="
    ",n.currentScreen.DOMObject.querySelector(".main-container .tree-container").innerHTML=t}function Mt(n,e){n.currentScreen.DOMObject.querySelectorAll(".btn.devices").forEach(t=>{t.addEventListener("click",a=>{Le({id:a.currentTarget.dataset.areaId,display_name:a.currentTarget.dataset.areaName},e).show()})}),n.currentScreen.DOMObject.querySelectorAll(".btn.actions").forEach(t=>{t.addEventListener("click",a=>{$e({id:a.currentTarget.dataset.areaId,display_name:a.currentTarget.dataset.areaName},e).show()})}),n.currentScreen.DOMObject.querySelectorAll(".btn.details").forEach(t=>{t.addEventListener("click",a=>{Te({id:a.currentTarget.dataset.areaId,display_name:a.currentTarget.dataset.areaName,parent_id:a.currentTarget.dataset.parentId},e).show()})}),n.currentScreen.DOMObject.querySelectorAll("button.show-childs").forEach(t=>{t.addEventListener("click",a=>{let s=a.currentTarget,i=s.parentNode,r=parseInt(i.dataset.lvl);if(s.classList.contains("opened")){s.classList.remove("opened");let o=i.nextElementSibling;for(;o;){let c=parseInt(o.dataset.lvl);if(c==r||cHelper.template.mainTemplate(_e("areas-tree"),`

    Areas Tree

    @@ -365,7 +365,7 @@
    - `),initer:e=>{n.areas.list((t,a,s)=>{if(console.log("sh_api.areas.list",t,a,s),s.status_code!=200)return e.error("Server API ERROR","");if(e.currentScreen.DOMObject.provideData={},typeof a.data!="undefined"&&typeof a.data.areas!="undefined")for(let o of a.data.areas)e.currentScreen.DOMObject.provideData[o.id]=o;Dt(e,At(a.data)),Mt(e,n);let i=e.currentScreen.DOMObject.querySelector(".create-new-area-modal");i.classList.contains("inited")||(i.classList.add("inited"),i==null||i.addEventListener("click",o=>{Ee(n).show()})),e.ready()})}}}var De={areasTree:Ae};function Me(n,e){n.add("/",{alias:"home",renderer:()=>"",initer:t=>{document.location="/#!/areas/tree"}}),n.add("-",{alias:"not-found-screen",renderer:()=>'

    404 NOT FOUND

    ',initer:t=>{t.ready()}}),n.add("/devices",J.list(e)),n.add("/devices/scanning",J.scanning(e)),n.add("/scripts/scopes",j.scopes(e)),n.add("/scripts/regular",j.regular(e)),n.add("/scripts/actions",j.actions(e)),n.add("/areas/tree",De.areasTree(e))}function qt(n,e,t){return` + `),initer:e=>{n.areas.list((t,a,s)=>{if(console.log("sh_api.areas.list",t,a,s),s.status_code!=200)return e.error("Server API ERROR","");if(e.currentScreen.DOMObject.provideData={},typeof a.data!="undefined"&&typeof a.data.areas!="undefined")for(let r of a.data.areas)e.currentScreen.DOMObject.provideData[r.id]=r;Dt(e,At(a.data)),Mt(e,n);let i=e.currentScreen.DOMObject.querySelector(".create-new-area-modal");i.classList.contains("inited")||(i.classList.add("inited"),i==null||i.addEventListener("click",r=>{Ee(n).show()})),e.ready()})}}}var De={areasTree:Ae};function Me(n,e){n.add("/",{alias:"home",renderer:()=>"",initer:t=>{document.location="/#!/areas/tree"}}),n.add("-",{alias:"not-found-screen",renderer:()=>'

    404 NOT FOUND

    ',initer:t=>{t.ready()}}),n.add("/devices",J.list(e)),n.add("/devices/scanning",J.scanning(e)),n.add("/scripts/scopes",P.scopes(e)),n.add("/scripts/regular",P.regular(e)),n.add("/scripts/actions",P.actions(e)),n.add("/areas/tree",De.areasTree(e))}function qt(n,e,t){return`
    - `}function Ct(n,e){return n.show=function(){document.querySelector("body").append(n),setTimeout(()=>{n.classList.add("a-show")},10)},n.close=function(){n.classList.add("a-hide"),setTimeout(()=>{n.remove()},300)},n.querySelector(".modal-close").addEventListener("click",t=>{n.close()}),typeof e=="function"&&e(n),n}function Ot(n,e){let t=e.title||"",a=e.footer||"",s=document.createElement("div");s.innerHTML=qt(n,t,a);let i=s.childNodes[1],o=i.querySelector(".modal-body"),r=i.querySelector(".modal-footer");if(typeof e.actions=="function"){let c=e.actions(i);if(typeof c[0]=="object"){let l=document.createElement("div");l.classList.add("actions");for(let d of c)l.append(d);r.append(l)}}if(typeof e.body=="function"){let c=e.body(i);typeof c=="object"?o.append(c):typeof c=="string"&&(o.innerHTML=c)}return Ct(i,e==null?void 0:e.onready)}var qe={create:Ot};function Q(n,e,t){Modals.create("confirm-popup",{title:"Requires confirmation",body:a=>` + `}function Ot(n,e){return n.show=function(){document.querySelector("body").append(n),setTimeout(()=>{n.classList.add("a-show")},10)},n.close=function(){n.classList.add("a-hide"),setTimeout(()=>{n.remove()},300)},n.querySelector(".modal-close").addEventListener("click",t=>{n.close()}),typeof e=="function"&&e(n),n}function Ct(n,e){let t=e.title||"",a=e.footer||"",s=document.createElement("div");s.innerHTML=qt(n,t,a);let i=s.childNodes[1],r=i.querySelector(".modal-body"),o=i.querySelector(".modal-footer");if(typeof e.actions=="function"){let c=e.actions(i);if(typeof c[0]=="object"){let l=document.createElement("div");l.classList.add("actions");for(let d of c)l.append(d);o.append(l)}}if(typeof e.body=="function"){let c=e.body(i);typeof c=="object"?r.append(c):typeof c=="string"&&(r.innerHTML=c)}return Ot(i,e==null?void 0:e.onready)}var qe={create:Ct};function Q(n,e,t){Modals.create("confirm-popup",{title:"Requires confirmation",body:a=>`

    ${n}

    - `,actions:a=>{let s=Helper.template.createElement("button",{class:"btn btn-primary"},"NO"),i=Helper.template.createElement("button",{class:"btn btn-warning"},"YES");return s.addEventListener("click",o=>{a.close(),t()}),i.addEventListener("click",o=>{a.close(),e()}),[s,i]}}).show()}function Ce(n){let e=n.querySelector(".focus");if(!e)return;let t=n.getBoundingClientRect(),a=e.getBoundingClientRect();a.topt.bottom&&(n.scrollTop+=a.bottom-t.bottom)}function X(n){n.advancedSelect.optionsElements.length-n.querySelectorAll(".option.hide").length==0?n.advancedSelect.showState("not-found"):n.advancedSelect.showState("options")}function Z(n,e,t){let a=document.createElement("div");a.classList.add("advanced-select");let s="";for(let r in e)s+=`
    ${e[r]}
    `;let i=` + `,actions:a=>{let s=Helper.template.createElement("button",{class:"btn btn-primary"},"NO"),i=Helper.template.createElement("button",{class:"btn btn-warning"},"YES");return s.addEventListener("click",r=>{a.close(),t()}),i.addEventListener("click",r=>{a.close(),e()}),[s,i]}}).show()}function Oe(n){let e=n.querySelector(".focus");if(!e)return;let t=n.getBoundingClientRect(),a=e.getBoundingClientRect();a.topt.bottom&&(n.scrollTop+=a.bottom-t.bottom)}function X(n){n.advancedSelect.optionsElements.length-n.querySelectorAll(".option.hide").length==0?n.advancedSelect.showState("not-found"):n.advancedSelect.showState("options")}function Z(n,e,t){let a=document.createElement("div");a.classList.add("advanced-select");let s="";for(let o in e)s+=`
    ${e[o]}
    `;let i=` - `;a.innerHTML=i;let o=(r,c)=>{for(let l in c)if(c[l]==r){let d={};return d[l]=c[l],d}return!1};return a.advancedSelect={isOpened:!1,options:e,eventsHandlers:{openList:[],closeList:[],selected:[],changed:[]},openList:()=>{a.advancedSelect.isOpened=!0,a.classList.add("a-show"),X(a),a.advancedSelect.dispatchEvent("openList")},closeList:()=>{a.advancedSelect.isOpened=!1,a.classList.remove("a-show"),X(a),a.advancedSelect.dispatchEvent("closeList")},showState:r=>{r=="options"?(a.querySelector(".options").classList.add("show"),a.querySelector(".not-found").classList.remove("show")):r=="not-found"&&(a.querySelector(".options").classList.remove("show"),a.querySelector(".not-found").classList.add("show"))},optionsElements:a.querySelectorAll(".option"),value:()=>{let r=o(n.value,e);return{inputValue:n.value,isOption:!!r,option:r}},addEventListener:(r,c)=>{if(typeof a.advancedSelect.eventsHandlers[r]!="undefined")return a.advancedSelect.eventsHandlers[r].push(c);console.error("Advanced Select component.","addEventListener()","Invalid event name")},dispatchEvent:r=>{if(typeof a.advancedSelect.eventsHandlers[r]=="undefined")return console.error("Advanced Select component.","dispatchEvent()","Invalid event name");for(let c of a.advancedSelect.eventsHandlers[r])c(a)}},n.setAttribute("autocomplete","nope"),n.advancedSelect={value:()=>a.advancedSelect.value()},n.addEventListener("focus",r=>{a.advancedSelect.openList()}),n.addEventListener("blur",r=>{setTimeout(()=>a.advancedSelect.closeList(),20)}),n.addEventListener("keydown",r=>{if(r.keyCode==38){let c=a.querySelector(".option.focus");if(c){c.classList.remove("focus");let l=c.previousElementSibling;for(;l&&l.classList.contains("hide");)l=l.previousElementSibling;l||(l=a.querySelector(".option:not(.hide)")),l.classList.add("focus")}else a.querySelector(".option:not(.hide):last-child").classList.add("focus");Ce(a)}else if(r.keyCode==40){let c=a.querySelector(".option.focus");if(c){c.classList.remove("focus");let l=c.nextElementSibling;for(;l&&l.classList.contains("hide");)l=l.nextElementSibling;l||(l=a.querySelector(".option:not(.hide)")),l.classList.add("focus")}else a.querySelector(".option:not(.hide)").classList.add("focus");Ce(a)}else if(r.keyCode==13){let c=a.querySelector(".option.focus");if(!c)return;n.value=c.dataset.displayValue,n.blur(),n.dispatchEvent(new Event("input",{bubbles:!0})),n.dispatchEvent(new Event("change",{bubbles:!0})),a.advancedSelect.dispatchEvent("selected")}}),n.addEventListener("input",r=>{var l;let c=r.currentTarget.value.toLowerCase();c==""?a.advancedSelect.optionsElements.forEach(d=>d.classList.remove("hide")):([...a.advancedSelect.optionsElements].filter(d=>d.dataset.displayValue.toLowerCase().indexOf(c)!=-1).forEach(d=>d.classList.remove("hide")),[...a.advancedSelect.optionsElements].filter(d=>d.dataset.displayValue.toLowerCase().indexOf(c)==-1).forEach(d=>d.classList.add("hide")),X(a),(l=a.querySelector(".option.focus"))==null||l.classList.remove("focus"))}),n.addEventListener("change",r=>{a.advancedSelect.dispatchEvent("changed")}),[...a.advancedSelect.optionsElements].forEach(r=>{r.addEventListener("click",c=>{n.value=c.currentTarget.dataset.displayValue,n.blur(),n.dispatchEvent(new Event("input",{bubbles:!0})),n.dispatchEvent(new Event("change",{bubbles:!0})),a.advancedSelect.dispatchEvent("selected")})}),a}function kt(n,e){let t="Write something",a=e?``:``;return` + `;a.innerHTML=i;let r=(o,c)=>{for(let l in c)if(c[l]==o){let d={};return d[l]=c[l],d}return!1};return a.advancedSelect={isOpened:!1,options:e,eventsHandlers:{openList:[],closeList:[],selected:[],changed:[]},openList:()=>{a.advancedSelect.isOpened=!0,a.classList.add("a-show"),X(a),a.advancedSelect.dispatchEvent("openList")},closeList:()=>{a.advancedSelect.isOpened=!1,a.classList.remove("a-show"),X(a),a.advancedSelect.dispatchEvent("closeList")},showState:o=>{o=="options"?(a.querySelector(".options").classList.add("show"),a.querySelector(".not-found").classList.remove("show")):o=="not-found"&&(a.querySelector(".options").classList.remove("show"),a.querySelector(".not-found").classList.add("show"))},optionsElements:a.querySelectorAll(".option"),value:()=>{let o=r(n.value,e);return{inputValue:n.value,isOption:!!o,option:o}},addEventListener:(o,c)=>{if(typeof a.advancedSelect.eventsHandlers[o]!="undefined")return a.advancedSelect.eventsHandlers[o].push(c);console.error("Advanced Select component.","addEventListener()","Invalid event name")},dispatchEvent:o=>{if(typeof a.advancedSelect.eventsHandlers[o]=="undefined")return console.error("Advanced Select component.","dispatchEvent()","Invalid event name");for(let c of a.advancedSelect.eventsHandlers[o])c(a)}},n.setAttribute("autocomplete","nope"),n.advancedSelect={value:()=>a.advancedSelect.value()},n.addEventListener("focus",o=>{a.advancedSelect.openList()}),n.addEventListener("blur",o=>{setTimeout(()=>a.advancedSelect.closeList(),20)}),n.addEventListener("keydown",o=>{if(o.keyCode==38){let c=a.querySelector(".option.focus");if(c){c.classList.remove("focus");let l=c.previousElementSibling;for(;l&&l.classList.contains("hide");)l=l.previousElementSibling;l||(l=a.querySelector(".option:not(.hide)")),l.classList.add("focus")}else a.querySelector(".option:not(.hide):last-child").classList.add("focus");Oe(a)}else if(o.keyCode==40){let c=a.querySelector(".option.focus");if(c){c.classList.remove("focus");let l=c.nextElementSibling;for(;l&&l.classList.contains("hide");)l=l.nextElementSibling;l||(l=a.querySelector(".option:not(.hide)")),l.classList.add("focus")}else a.querySelector(".option:not(.hide)").classList.add("focus");Oe(a)}else if(o.keyCode==13){let c=a.querySelector(".option.focus");if(!c)return;n.value=c.dataset.displayValue,n.blur(),n.dispatchEvent(new Event("input",{bubbles:!0})),n.dispatchEvent(new Event("change",{bubbles:!0})),a.advancedSelect.dispatchEvent("selected")}}),n.addEventListener("input",o=>{var l;let c=o.currentTarget.value.toLowerCase();c==""?a.advancedSelect.optionsElements.forEach(d=>d.classList.remove("hide")):([...a.advancedSelect.optionsElements].filter(d=>d.dataset.displayValue.toLowerCase().indexOf(c)!=-1).forEach(d=>d.classList.remove("hide")),[...a.advancedSelect.optionsElements].filter(d=>d.dataset.displayValue.toLowerCase().indexOf(c)==-1).forEach(d=>d.classList.add("hide")),X(a),(l=a.querySelector(".option.focus"))==null||l.classList.remove("focus"))}),n.addEventListener("change",o=>{a.advancedSelect.dispatchEvent("changed")}),[...a.advancedSelect.optionsElements].forEach(o=>{o.addEventListener("click",c=>{n.value=c.currentTarget.dataset.displayValue,n.blur(),n.dispatchEvent(new Event("input",{bubbles:!0})),n.dispatchEvent(new Event("change",{bubbles:!0})),a.advancedSelect.dispatchEvent("selected")})}),a}function kt(n,e){let t="Write something",a=e?``:``;return`
    ${n} @@ -400,5 +400,5 @@
    - `}function ee(n,e){e=e!=null?e:!1;let t=n.innerHTML,a=Helper.template.createElement("div",{class:"component editable-string-component"},kt(t,e));n.innerHTML="",n.append(a);let s=a.querySelector(".edit-text-btn"),i=a.querySelector(".apply-changes-btn"),o=a.querySelector(".cancel-changes-btn"),r=a.querySelector(".editable-string-content"),c=a.querySelector(".editable-string"),l=a.querySelector(".editable-string-form"),d=a.querySelector(".input");return a.editableString={formIsDisplaying:!1,value:t,input:d,eventsHandlers:{onChange:[],onSwitch:[]},switch:()=>{a.formIsDisplaying?(l.classList.add("d-none"),r.classList.remove("d-none"),c.innerText=a.editableString.value):(l.classList.remove("d-none"),r.classList.add("d-none"),d.value=a.editableString.value),a.formIsDisplaying=!a.formIsDisplaying,a.editableString.runEventHandler("onSwitch")},setValue:u=>{a.editableString.value=u,d.value=u,c.innerText=u},apply:()=>{a.editableString.value=d.value,a.editableString.switch(),d.value!=t&&a.editableString.runEventHandler("onChange")},onChange:u=>{a.editableString.eventsHandlers.onChange.push(u)},onSwitch:u=>{a.editableString.eventsHandlers.onSwitch.push(u)},runEventHandler:u=>{a.editableString.eventsHandlers[u].forEach(p=>p(a.editableString))}},s.addEventListener("click",u=>{a.editableString.switch()}),o.addEventListener("click",u=>{a.editableString.switch()}),i.addEventListener("click",u=>{a.editableString.apply()}),d.addEventListener("keydown",u=>{u.keyCode==13&&(d.blur(),a.editableString.apply())}),a}document.addEventListener("DOMContentLoaded",n=>{console.log("App init"),document.location.hash.indexOf("#!/")==-1&&(document.location.hash="#!/"),window.DataProvider=new q,window.Toasts=ce,window.Helper=de,window.Modals=qe,window.confirmPopup=Q,window.advancedSelect=Z,window.editableString=ee,re();let e=new I({base_url:API_BASEURL,token:"YOUR_TOKEN",timeout_ms:1e4,on_unauthorized:({error:a})=>console.log("auth problem:",a),proxy_path:"/proxy.php"}),t=new M(".screens",".load-screen",".error-screen");Me(t,e),console.log(t.getScreens()),t.onSwitch((a,s)=>{F()}),t.onSwitch((a,s,i)=>{var o;document.querySelectorAll(".app .hud .navigation .nav-link[data-route].active").forEach(r=>r.classList.remove("active")),(o=document.querySelector(`.app .hud .navigation .nav-link[data-route="${i}"]`))==null||o.classList.add("active")}),t.routing(),window.Screens=t});})(); + `}function ee(n,e){e=e!=null?e:!1;let t=n.innerHTML,a=Helper.template.createElement("div",{class:"component editable-string-component"},kt(t,e));n.innerHTML="",n.append(a);let s=a.querySelector(".edit-text-btn"),i=a.querySelector(".apply-changes-btn"),r=a.querySelector(".cancel-changes-btn"),o=a.querySelector(".editable-string-content"),c=a.querySelector(".editable-string"),l=a.querySelector(".editable-string-form"),d=a.querySelector(".input");return a.editableString={formIsDisplaying:!1,value:t,input:d,eventsHandlers:{onChange:[],onSwitch:[]},switch:()=>{a.formIsDisplaying?(l.classList.add("d-none"),o.classList.remove("d-none"),c.innerText=a.editableString.value):(l.classList.remove("d-none"),o.classList.add("d-none"),d.value=a.editableString.value),a.formIsDisplaying=!a.formIsDisplaying,a.editableString.runEventHandler("onSwitch")},setValue:u=>{a.editableString.value=u,d.value=u,c.innerText=u},apply:()=>{a.editableString.value=d.value,a.editableString.switch(),d.value!=t&&a.editableString.runEventHandler("onChange")},onChange:u=>{a.editableString.eventsHandlers.onChange.push(u)},onSwitch:u=>{a.editableString.eventsHandlers.onSwitch.push(u)},runEventHandler:u=>{a.editableString.eventsHandlers[u].forEach(p=>p(a.editableString))}},s.addEventListener("click",u=>{a.editableString.switch()}),r.addEventListener("click",u=>{a.editableString.switch()}),i.addEventListener("click",u=>{a.editableString.apply()}),d.addEventListener("keydown",u=>{u.keyCode==13&&(d.blur(),a.editableString.apply())}),a}document.addEventListener("DOMContentLoaded",n=>{console.log("App init"),document.location.hash.indexOf("#!/")==-1&&(document.location.hash="#!/"),window.DataProvider=new q,window.Toasts=ce,window.Helper=de,window.Modals=qe,window.confirmPopup=Q,window.advancedSelect=Z,window.editableString=ee,re();let e=new I({base_url:API_BASEURL,token:"YOUR_TOKEN",timeout_ms:1e4,on_unauthorized:({error:a})=>console.log("auth problem:",a),proxy_path:"/proxy.php"}),t=new M(".screens",".load-screen",".error-screen");Me(t,e),console.log(t.getScreens()),t.onSwitch((a,s)=>{F()}),t.onSwitch((a,s,i)=>{var r;document.querySelectorAll(".app .hud .navigation .nav-link[data-route].active").forEach(o=>o.classList.remove("active")),(r=document.querySelector(`.app .hud .navigation .nav-link[data-route="${i}"]`))==null||r.classList.add("active")}),t.routing(),window.Screens=t});})(); //# sourceMappingURL=main.js.map diff --git a/webclient/dist/js/main.js.map b/webclient/dist/js/main.js.map index 843c59e..e129d44 100644 --- a/webclient/dist/js/main.js.map +++ b/webclient/dist/js/main.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../src/js/components/hud.js", "../../src/js/components/Screens.js", "../../src/js/DataProvider.js", "../../src/js/components/toasts.js", "../../src/js/components/helper.js", "../../src/js/sh/modules/ScriptsApi.js", "../../src/js/sh/modules/DevicesApi.js", "../../src/js/sh/modules/AreasApi.js", "../../src/js/sh/SmartHomeApi.js", "../../src/js/components/screens/devices/devices-funcs.js", "../../src/js/components/screens/areas/areas-placeto-component.js", "../../src/js/components/screens/devices/device-state-component.js", "../../src/js/components/screens/devices/device-details-popup.js", "../../src/js/components/screens/devices/devices-list-screen.js", "../../src/js/components/screens/devices/device-setup-form-popup.js", "../../src/js/components/screens/devices/devices-scanning-screen.js", "../../src/js/components/screens/devices/devices.js", "../../src/js/components/screens/scripts/scripts-funcs.js", "../../src/js/components/screens/scripts/scripts-scopes-screen.js", "../../src/js/components/screens/scripts/scripts-regular-screen.js", "../../src/js/components/screens/scripts/scripts-action-popup.js", "../../src/js/components/screens/scripts/scripts-actions-screen.js", "../../src/js/components/screens/scripts/scripts.js", "../../src/js/components/screens/areas/areas-funcs.js", "../../src/js/components/screens/areas/areas-devices-modal.js", "../../src/js/components/screens/areas/areas-actions-modal.js", "../../src/js/components/screens/areas/areas-create-new-modal.js", "../../src/js/components/screens/areas/areas-details-modal.js", "../../src/js/components/screens/areas/areas-tree-screen.js", "../../src/js/components/screens/areas/areas.js", "../../src/js/routes.js", "../../src/js/components/modals.js", "../../src/js/components/confirm-popup.js", "../../src/js/components/advanced-select.js", "../../src/js/components/editable-string.js", "../../src/js/index.js"], - "sourcesContent": ["let navToggleBtn;\nlet navigation;\nlet reloadScreenBtn;\n\nfunction navigationShow() {\n\tnavToggleBtn.dataset.navState = \"displayed\";\n\tnavToggleBtn.classList.remove(\"state-off\");\n\tnavToggleBtn.classList.add(\"state-on\");\n\n\tnavigation.classList.add(\"a-show\");\n}\n\nfunction navigationHide() {\n\tnavToggleBtn.dataset.navState = \"hidden\";\n\tnavToggleBtn.classList.remove(\"state-on\");\n\tnavToggleBtn.classList.add(\"state-off\");\n\n\tnavigation.classList.add(\"a-hide\");\n\tnavigation.classList.remove(\"a-show\");\n\n\tsetTimeout(() => {\n\t\tnavigation.classList.remove(\"a-hide\");\n\t}, 300);\n}\n\nfunction hud() {\n\tconsole.log(\"HUD init\");\n\n\tnavToggleBtn = document.querySelector(\".hud .nav-toggle\");\n\tnavigation = document.querySelector(\".hud .navigation\");\n\treloadScreenBtn = document.querySelector(\".hud .reload-screen\");\n\n\tnavToggleBtn?.addEventListener(\"click\", e => {\n\t\tif(e.currentTarget.dataset.navState != \"displayed\") {\n\t\t\tnavigationShow();\n\t\t} else {\n\t\t\tnavigationHide();\n\t\t}\n\t});\n\n\treloadScreenBtn?.addEventListener(\"click\", e => {\n\t\tScreens.reload();\n\t});\n}\n\nexport {\n\thud,\n\tnavigationShow,\n\tnavigationHide\n}", "export class Screens {\n\tconstructor(screensContainerSelector, loaderSelector, errorScreenSelector) {\n\t\tthis.screens = {};\n\t\tthis.routesMap = {};\n\t\tthis.currentScreen = null;\n\t\tthis.eventsHandlers = {\n\t\t\tswitch: [],\n\t\t\treload: [],\n\t\t\treinit: [],\n\t\t\terrorScreen: [],\n\t\t};\n\n\t\tthis.screensContainer = document.querySelector(screensContainerSelector);\n\t\tthis.loader = document.querySelector(loaderSelector);\n\t\tthis.errorScreen = document.querySelector(errorScreenSelector);\n\t\tconsole.log(\"Screens Init\");\n\t}\n\n\t/**\n\t * \u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u0430 \u0438 \u043E\u0431\u044A\u0435\u043A\u0442\u0430 \u0441 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430\u043C\u0438 \u044D\u043A\u0440\u0430\u043D\u0430\n\t * @param {string} route Like `/path/name`\n\t * @param {void} screen {alias, renderer, initer}\n\t */\n\tadd(route, screen) {\n\t\tif(typeof screen != \"object\") {\n\t\t\treturn console.error(\"Screens: screens must be object\");\n\t\t}\n\t\t\n\t\tif(typeof screen?.alias == \"undefined\") {\n\t\t\treturn console.error(\"Screens: undefined alias\");\n\t\t}\n\n\t\tif(typeof screen?.renderer != \"function\") {\n\t\t\treturn console.error(\"Screens: renderer must be function\");\n\t\t}\n\n\t\tthis.screens[screen.alias] = {\n\t\t\troute: route,\n\t\t\t...screen\n\t\t};\n\n\t\tthis.routesMap[route] = screen.alias;\n\t}\n\n\tswitch(alias) {\t\t\n\t\tthis.runSwitchHandlers(alias);\n\t\tthis.hideErrorScreen();\n\t\tthis.showLoader();\n\t\tthis.currentScreen?.DOMObject.remove();\n\t\t\n\t\tif(typeof this.screens[alias] == \"undefined\") {\n\t\t\tconsole.error(`Screens: \"${alias}\" not found`);\n\t\t\treturn ;\n\t\t}\n\n\t\tthis.currentScreen = this.screens[alias];\n\t\t\n\t\tconst screenContainer = document.createElement(\"div\");\n\t\tscreenContainer.classList.add(\"screen\");\n\t\tscreenContainer.id = alias;\n\t\tscreenContainer.dataset.alias = alias;\n\t\tscreenContainer.innerHTML = this.currentScreen.renderer();\n\t\tthis.currentScreen.DOMObject = screenContainer;\n\t\tthis.screensContainer.append(this.currentScreen.DOMObject);\n\n\t\tthis.currentScreen.initer(this);\n\t}\n\n\treload() {\n\t\tif(!this.currentScreen) {\n\t\t\treturn ;\n\t\t}\n\n\t\tthis.runReloadHandlers(this.currentScreen.alias);\n\t\tthis.switch(this.currentScreen.alias);\n\t}\n\n\treinit() {\n\t\tif(!this.currentScreen) {\n\t\t\treturn ;\n\t\t}\n\n\t\tthis.currentScreen.initer(this);\n\t\tthis.runReinitHandlers();\n\t}\n\n\trouting() {\n\t\tsetInterval(() => {\n\t\t\tconst route = document.location.hash.split(\"#!\")[1];\n\t\t\tif(typeof route == \"undefined\" || route == \"\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tconst alias = (typeof this.routesMap[route] == \"undefined\") \n\t\t\t\t? \"not-found-screen\"\n\t\t\t\t: this.routesMap[route];\n\n\t\t\tif(!this.currentScreen || this.currentScreen.alias != alias) {\n\t\t\t\tthis.switch(alias);\n\t\t\t}\n\t\t}, 50);\n\t}\n\n\tready() {\n\t\tif(this.currentScreen == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(!this.currentScreen.DOMObject) {\n\t\t\tthis.currentScreen.DOMObject = document.getElementsById(this.currentScreen.alias);\n\t\t}\n\n\t\tthis.hideLoader();\n\t\tthis.currentScreen.DOMObject.classList.add(\"a-show\");\n\t}\n\n\terror(title, text) {\n\t\tthis.currentScreen?.DOMObject.remove();\n\t\tthis.errorScreen.querySelector(\".error-title\").innerHTML = title;\n\t\tthis.errorScreen.querySelector(\".error-text\").innerHTML = text;\n\t\tthis.showErrorScreen();\n\t\tthis.runErrorScreenHandlers();\n\t}\n\n\thideLoader() {\n\t\tthis.loader.classList.remove(\"a-show\");\n\t}\n\n\tshowLoader() {\n\t\tthis.loader.classList.add(\"a-show\");\n\t}\n\n\tshowErrorScreen() {\n\t\tthis.errorScreen.classList.add(\"a-show\");\n\t}\n\n\thideErrorScreen() {\n\t\tthis.errorScreen.classList.remove(\"a-show\");\n\t}\n\n\tgetScreens() {\n\t\treturn this.screens;\n\t}\n\n\tgetRoutesMap() {\n\t\treturn this.routesMap;\n\t}\n\n\tonSwitch(cb) {\n\t\tthis.eventsHandlers.switch.push(cb);\n\t}\n\n\tonReaload(cb) {\n\t\tthis.eventsHandlers.reload.push(cb);\n\t}\n\n\tonReinit(cb) {\n\t\tthis.eventsHandlers.reinit.push(cb);\n\t}\n\n\tonErrorScreen(cb) {\n\t\tthis.eventsHandlers.errorScreen.push(cb);\n\t}\n\n\trunSwitchHandlers(alias) {\n\t\tconst route = Object.keys(this.routesMap).filter(route => this.routesMap[route] == alias);\n\t\tfor(let handler of this.eventsHandlers.switch) {\n\t\t\thandler(this, alias, route.length ? route[0] : undefined);\n\t\t}\n\t}\n\n\trunReloadHandlers(alias) {\n\t\tfor(let handler of this.eventsHandlers.reload) {\n\t\t\thandler(this, alias);\n\t\t}\n\t}\n\n\trunReinitHandlers() {\n\t\tfor(let handler of this.eventsHandlers.reinit) {\n\t\t\thandler(this);\n\t\t}\n\t}\n\n\trunErrorScreenHandlers() {\n\t\tfor(let handler of this.eventsHandlers.errorScreen) {\n\t\t\thandler(this);\n\t\t}\n\t}\n}", "export class DataProvider {\n\tconstructor() {\n\t\tthis.data = {};\n\t}\n\n\tset(name, data) {\n\t\tthis.data[name] = data;\n\t}\n\n\tget(name) {\n\t\treturn this.data[name];\n\t}\n\n\tsetRaw(name, data) {\n\t\tthis.set(\"raw.\" + name, data);\n\t}\n\n\tgetRaw(name) {\n\t\treturn this.get(\"raw.\" + name);\n\t}\n}", "function template(type, icon, title, text) {\n\treturn `\n\t\t
    \n\t
    \n\t

    ${icon} ${title}

    \n\t

    ${text}

    \n\t
    \n\t \n\t
    \n\t`;\n}\n\nfunction init(toast, props) {\n\tif(props?.alone) {\n\t\tdocument.querySelectorAll(\".toast\").forEach(i => i.close());\n\t}\n\n\ttoast.close = function() {\n\t\tthis.classList.add(\"a-hide\");\n\t\tsetTimeout(() => {\n\t\t\tthis.remove();\n\t\t}, 300);\n\t}\n\n\ttoast.querySelector(\".toast-close\").addEventListener(\"click\", e => {\n\t\ttoast.close();\n\t});\n\n\ttoast.show = function() {\n\t\tdocument.querySelector(\"body\").append(toast);\n\n\t\tsetTimeout(() => {\n\t\t\ttoast.classList.add(\"a-show\");\n\t\t}, 10);\n\t}\n\n\tif(typeof Screens != \"undefined\") {\n\t\tScreens.onSwitch((scr, alias) => {\n\t\t\tsetTimeout(() => {\n\t\t\t\ttoast?.close();\n\t\t\t}, 10000);\n\t\t});\n\t}\n\n\ttoast.addEventListener(\"mouseover\", e => toast.ishovered = true);\n\ttoast.addEventListener(\"mouseout\", e => toast.ishovered = false);\n\n\tif(props?.lifetime) {\n\t\tconsole.log(props);\n\t\tconst lifetimeInterval = setInterval(() => {\n\t\t\tif(!toast.ishovered) {\n\t\t\t\ttoast.close();\n\t\t\t\tclearInterval(lifetimeInterval);\n\t\t\t}\n\t\t}, props?.lifetime);\n\t}\n\n\treturn toast;\n}\n\nfunction create(type, icon, title, text, props) {\n\tconst div = document.createElement(\"div\");\n\tdiv.innerHTML = template(type, icon, title, text);\n\n\treturn init(div.childNodes[1], props);\n}\n\nfunction createSuccess(title, text, props) {\n\tif(typeof props == \"undefined\") {\n\t\tprops = {};\n\t}\n\n\tif(typeof props.lifetime == \"undefined\") {\n\t\tprops.lifetime = 4000;\n\t}\n\n\tif(typeof props.alone == \"undefined\") {\n\t\tprops.alone = true;\n\t}\n\n\treturn create(\n\t\t\"success\", \n\t\t``, \n\t\ttitle, \n\t\ttext,\n\t\tprops\n\t);\n}\n\nfunction createInfo(title, text, props) {\n\treturn create(\n\t\t\"info\", \n\t\t``, \n\t\ttitle, \n\t\ttext,\n\t\tprops\n\t);\n}\n\nfunction createWarning(title, text, props) {\n\treturn create(\n\t\t\"warning\", \n\t\t``, \n\t\ttitle, \n\t\ttext,\n\t\tprops\n\t);\n}\n\nfunction createError(title, text, props) {\n\treturn create(\n\t\t\"danger\", \n\t\t``, \n\t\ttitle, \n\t\ttext,\n\t\tprops\n\t);\n}\n\nexport default {\n create,\n createInfo,\n createSuccess,\n createWarning,\n createError,\n \"createDanger\": createError\n};", "function sidebarNav(items) {\n\tlet listItems = \"\";\n\n\tfor(let item of items) {\n\t\tlet aOpen = \"\";\n\t\tlet aClose = \"\";\n\t\tif(item.route) {\n\t\t\taOpen = ``;\n\t\t\taClose = ``;\n\t\t}\n\n\t\tlistItems += `\n\t\t\t
  • \n\t\t\t\t${aOpen}${item.content}${aClose}\n\t\t\t
  • \n\t\t`;\n\t}\n\n\treturn `\n\t\t
    \n\t\t\t
      \n\t\t\t\t${listItems} \n\t\t\t
    \n\t\t
    \n\t`;\n}\n\nfunction table(caption, columns, data, tfoot) {\n\tlet head = ``;\n\tlet totalColumns = 0;\n\tfor(let key in columns) {\n\t\thead += `${columns[key]}`;\n\t\ttotalColumns++;\n\t}\n\thead += \"\";\n\n\tlet body = ``;\n\tfor(let item of data) {\n\t\tbody += ``;\n\t\tfor(let column in columns) {\n\t\t\tbody += `${item[column]}`;\n\t\t}\n\t\tbody += ``;\n\t}\n\n\tlet foot = \"\";\n\tif(typeof tfoot != \"undefined\") {\n\t\tfoot = `\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t${tfoot}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t`\n\t}\n\n\tconst tableCaption = caption \n\t\t? `${caption}`\n\t\t: '';\n\n\tconst tableHead = data.length \n\t\t? `${head}`\n\t\t: '';\n\n\tbody = data.length\n\t\t? body\n\t\t: `Empty`;\n\n\tconst tableEmptyClass = !data.length \n\t\t? \"table-empty\"\n\t\t: \"\";\n\n\treturn `\n\t\t
    \n\t\t\t\n\t\t\t\t${tableCaption}\n\t\t\t\t${tableHead}\n\t\t\t\t${body}\n\t\t\t\t${foot}\n\t\t\t
    \n\t\t
    \n\t`;\n}\n\nfunction createElement(type, props, content) {\n\tconst node = document.createElement(type);\n\n\tfor (const [key, value] of Object.entries(props)) {\n\t\tif (key === \"class\") {\n\t\t\tnode.className = value;\n\t\t} else if (key === \"dataset\") {\n\t\t\tObject.assign(node.dataset, value);\n\t\t} else {\n\t\t\tnode.setAttribute(key, value);\n\t\t}\n\t}\n\n\tnode.innerHTML = (typeof content != \"undefined\") ? content : \"\";\n\treturn node; \n}\n\nfunction createAlert(type, content) {\n\tif([\"primary\", \"success\", \"secondary\", \"info\", \"warning\", \"error\", \"danger\"].indexOf(type) < 0) {\n\t\treturn console.error(\"createAlert()\", \"Error of type: \" + type);\n\t}\n\n\treturn createElement(\"div\", {\n\t\tclass: `alert alert-${type}`,\n\t}, content);\n}\n\nfunction deviceFieldsUnification(data) {\n\tconst map = {\n\t\t\"device_name\": \"name\",\n\t\t\"device_hard_id\": \"device_id\",\n\t\t\"device_ip\": \"ip\",\n\t\t\"device_type\": \"type\",\n\t\t\"ip_address\": \"ip\",\n\t\t\"mac_address\": \"mac\",\n\t\t\"device_mac\": \"mac\",\n\t\t\"core_version\": \"firmware_core_version\"\n\t};\n\n\tconst dataObj = {};\n\n\tfor(let field in data) {\n\t\tif(typeof map[field] != \"undefined\") {\n\t\t\tdataObj[ map[field] ] = data[field];\n\t\t\tcontinue;\n\t\t}\n\n\t\tdataObj[field] = data[field];\n\t}\n\n\treturn dataObj;\n}\n\nfunction btnLoadingState(btn, isLoading) {\n\tif(btn?.isLoading == isLoading) {\n\t\treturn false;\n\t}\n\n\tif(isLoading) {\n\t\tbtn.isLoading = true;\n\t\tbtn.originalContent = btn.innerHTML;\n\t\tif(btn.classList.contains(\"with-icon\")) {\n\t\t\tbtn.originalWithIcon = true;\n\t\t} else {\n\t\t\tbtn.classList.add(\"with-icon\");\n\t\t}\n\n\t\tbtn.classList.add(\"loading-state\");\n\t\tbtn.setAttribute(\"disabled\", \"disabled\");\n\t\tbtn.innerHTML = ` Loading`;\n\t} else {\n\t\tbtn.isLoading = false;\n\t\tif(!btn.originalContent) {\n\t\t\treturn false;\n\t\t}\n\t\tbtn.removeAttribute(\"disabled\");\n\t\tbtn.classList.remove(\"loading-state\");\n\t\tif(!btn.originalWithIcon) {\n\t\t\tbtn.classList.remove(\"with-icon\");\n\t\t}\n\t\tbtn.innerHTML = btn.originalContent;\n\t}\n\n\treturn btn;\n}\n\nfunction cardScriptActionLoadingState(card, isLoading) {\n\tif(card?.isLoading == isLoading) {\n\t\treturn false;\n\t}\n\n\tconst iconContainer = card.querySelector(\".device-icon\");\n\n\tif(isLoading) {\n\t\tcard.isLoading = true;\n\t\tcard.originalContent = iconContainer.innerHTML;\n\t\tcard.classList.add(\"loading-state\");\n\t\tcard.setAttribute(\"disabled\", \"disabled\");\n\t\ticonContainer.innerHTML = ``;\n\t} else {\n\t\tcard.isLoading = false;\n\t\tif(!card.originalContent) {\n\t\t\treturn false;\n\t\t}\n\t\tcard.removeAttribute(\"disabled\");\n\t\tcard.classList.remove(\"loading-state\");\n\t\ticonContainer.innerHTML = card.originalContent;\n\t}\n\n\treturn card;\n}\n\nfunction mainTemplate(sidebar, content) {\n\tcontent = content ?? \"\";\n\treturn `\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t${sidebar}\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t${content}\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t`;\n}\n\nfunction connectionStatusBadge(status) {\n\treturn status == \"active\"\n\t\t? `Online`\n\t\t: `Offline`;\n}\n\nfunction toogleStateBadge(state) {\n\treturn state == \"enabled\"\n\t\t? `Enabled`\n\t\t: `Disabled`;\n}\n\nfunction timeAgo(dateString) {\n\tconst date = new Date(dateString.replace(\" \", \"T\"));\n\tconst now = new Date();\n\n\tconst diff_seconds = Math.floor((now - date) / 1000);\n\n\tif (diff_seconds < 60) {\n\t\treturn \"less than a minute ago\";\n\t}\n\n\tconst minutes = Math.floor(diff_seconds / 60);\n\tconst hours = Math.floor(minutes / 60);\n\tconst days = Math.floor(hours / 24);\n\n\tif (minutes < 60) {\n\t\treturn `${minutes} minute${minutes !== 1 ? \"s\" : \"\"} ago`;\n\t}\n\n\tif (hours < 24) {\n\t\tconst remain_minutes = minutes % 60;\n\t\treturn `${hours} hour${hours !== 1 ? \"s\" : \"\"} ${remain_minutes} minute${remain_minutes !== 1 ? \"s\" : \"\"} ago`;\n\t}\n\n\treturn `${days} day${days !== 1 ? \"s\" : \"\"} ago`;\n}\n\nfunction formatDate(dateString) {\n\tconst date = new Date(dateString.replace(\" \", \"T\"));\n\tconst now = new Date();\n\n\tconst today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n\tconst target_day = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n\n\tconst diff_days = Math.floor((today - target_day) / 86400000);\n\n\tconst hours = String(date.getHours()).padStart(2, \"0\");\n\tconst minutes = String(date.getMinutes()).padStart(2, \"0\");\n\n\tif (diff_days === 0) {\n\t\treturn `Today at ${hours}:${minutes}`;\n\t}\n\n\tif (diff_days === 1) {\n\t\treturn `Yesterday at ${hours}:${minutes}`;\n\t}\n\n\tconst months = [\n\t\t\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"\n\t];\n\n\treturn `${date.getDate()} ${months[date.getMonth()]} ${date.getFullYear()} at ${hours}:${minutes}`;\n}\n\nfunction circleLoaderHTML() {\n\treturn `\n\t\t
    \n\t\t\t\n\t\t\tLoading\n\t\t
    \n\t`;\n}\n\nfunction emptyHereHTML() {\n\treturn `\n\t\t
    \n\t\t\t
    \n\t\t\t

    It's empty here yet

    \n\t\t
    \n\t`;\n}\n\nexport default {\n\ttemplate: {\n\t\tsidebarNav,\n\t\ttable,\n\t\tcreateElement,\n\t\tcreateAlert,\n\t\tmainTemplate,\n\t\tconnectionStatusBadge,\n\t\ttoogleStateBadge,\n\t\tcircleLoaderHTML,\n\t\temptyHereHTML,\n\t},\n\tunification: {\n\t\tdeviceFieldsUnification,\n\t\ttimeAgo,\n\t\tformatDate\n\t},\n\tstates: {\n\t\tbtnLoadingState,\n\t\tcardScriptActionLoadingState\n\t}\n}", "/* =========================\n Scripts module\n========================= */\n\nexport class ScriptsApi {\n\tconstructor(core) {\n\t\tthis.core = core;\n\t}\n\n\t// GET /api/v1/scripts/actions/list\n\tactions_list(cb) {\n\t\treturn this.core.api_get(\"/api/v1/scripts/actions/list\", (err, resp, meta) => {\n\t\t\tif(resp && resp.status && resp.data && resp.data.scripts) {\n\t\t\t\tfor(let item of resp.data.scripts) {\n\t\t\t\t\tconst id = item?.id ?? item.alias;\n\t\t\t\t\tDataProvider.setRaw(`actions_scripts.${id}`, item);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn cb(err, resp, meta);\n\t\t});\n\t}\n\n\t// GET /api/v1/scripts/scopes/list\n\tscopes_list(cb) {\n\t\treturn this.core.api_get(\"/api/v1/scripts/scopes/list\", (err, resp, meta) => {\n\t\t\tif(resp && resp.status && resp.data && resp.data.scopes) {\n\t\t\t\tfor(let item of resp.data.scopes) {\n\t\t\t\t\tDataProvider.setRaw(`scopes.${item.name}`, item);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn cb(err, resp, meta);\n\t\t});\n\t}\n\n\t// GET /api/v1/scripts/regular/list\n\tregular_list(cb) {\n\t\treturn this.core.api_get(\"/api/v1/scripts/regular/list\", (err, resp, meta) => {\n\t\t\tif(resp && resp.status && resp.data && resp.data.scripts) {\n\t\t\t\tfor(let item of resp.data.scripts) {\n\t\t\t\t\tconst id = item?.id ?? item.alias;\n\t\t\t\t\tDataProvider.setRaw(`regular_scripts.${id}`, item);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn cb(err, resp, meta);\n\t\t});\n\t}\n\n\t// GET /api/v1/scripts/scopes/name/{{filename}}\n\tscope_get_by_filename(filename, cb) {\n\t\tconst safe = encodeURIComponent(String(filename || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/scopes/name/${safe}`, cb, {\n\t\t\t// \u0442\u0443\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u043C\u043E\u0436\u0435\u0442 \u0432\u0435\u0440\u043D\u0443\u0442\u044C PHP-\u043A\u043E\u0434 \u0442\u0435\u043A\u0441\u0442\u043E\u043C; request \u0443\u043C\u0435\u0435\u0442 \u044D\u0442\u043E \u043F\u0435\u0440\u0435\u0436\u0438\u0442\u044C\n\t\t});\n\t}\n\n\t// POST /api/v1/scripts/scopes/new\n\tscope_create(payload, cb) {\n\t\t// payload: { alias, filename, path }\n\t\treturn this.core.api_post(\"/api/v1/scripts/scopes/new\", payload, cb);\n\t}\n\n\t// POST /api/v1/scripts/scopes/update\n\tscope_update(payload, cb) {\n\t\t// payload: { name, filename, path }\n\t\treturn this.core.api_post(\"/api/v1/scripts/scopes/update\", payload, cb);\n\t}\n\n\t// GET /api/v1/scripts/actions/alias/{{alias}}/enable\n\taction_enable(alias, cb) {\n\t\tconst safe = encodeURIComponent(String(alias || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/actions/alias/${safe}/enable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/actions/alias/{{alias}}/disable\n\taction_disable(alias, cb) {\n\t\tconst safe = encodeURIComponent(String(alias || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/actions/alias/${safe}/disable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/regular/alias/{{alias}}/enable\n\tregular_enable(alias, cb) {\n\t\tconst safe = encodeURIComponent(String(alias || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/regular/alias/${safe}/enable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/regular/alias/{{alias}}/disable\n\tregular_disable(alias, cb) {\n\t\tconst safe = encodeURIComponent(String(alias || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/regular/alias/${safe}/disable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/scope/name/{{name}}/enable\n\tscope_enable(name, cb) {\n\t\tconst safe = encodeURIComponent(String(name || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/scopes/name/${safe}/enable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/actions/scope/name/{{name}}/disable\n\tscope_disable(name, cb) {\n\t\tconst safe = encodeURIComponent(String(name || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/scopes/name/${safe}/disable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/scopes/name/{{name}}/remove\n\tscope_remove(name, cb) {\n\t\tconst safe = encodeURIComponent(String(name || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/scopes/name/${safe}/remove`, cb);\n\t}\n\n\t// POST /api/v1/scripts/actions/run\n\trun(payload, cb) {\n\t\t// payload: { alias, params: {...} }\n\t\treturn this.core.api_post(\"/api/v1/scripts/actions/run\", payload, cb);\n\t}\n\n\t// POST /api/v1/scripts/place-in-area\n\tplace_in_area(payload, cb) {\n\t\t// payload: { target_id, place_in_area_id }\n\t\treturn this.core.api_post(\"/api/v1/scripts/place-in-area\", payload, cb);\n\t}\n\n\t// GET /api/v1/scripts/id/{{target_id}}/unassign-from-area\n\tunassign_from_area(target_id, cb) {\n\t\tconst safe = encodeURIComponent(String(target_id));\n\t\treturn this.core.api_get(`/api/v1/scripts/id/${safe}/unassign-from-area`, cb);\n\t}\n}", "/* =========================\n Devices module\n========================= */\n\nexport class DevicesApi {\n\tconstructor(core) {\n\t\tthis.core = core;\n\t}\n\n\t// GET /api/v1/devices/list\n\tlist(cb) {\n\t\treturn this.core.api_get(\"/api/v1/devices/list\", (err, resp, meta) => {\n\t\t\tif(resp && resp.status && resp.data && resp.data.devices) {\n\t\t\t\tfor(let item of resp.data.devices) {\n\t\t\t\t\tDataProvider.setRaw(`devices.${item.id}`, item);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn cb(err, resp, meta);\n\t\t});\n\t}\n\n\t// GET /api/v1/devices/scanning/setup\n\tscanning_setup(cb) {\n\t\treturn this.core.api_get(\"/api/v1/devices/scanning/setup\", (err, resp, meta) => {\n\t\t\tif(resp && resp.status && resp.data && resp.data.devices) {\n\t\t\t\tfor(let i in resp.data.devices) {\n\t\t\t\t\tDataProvider.setRaw(`scanning.setup.devices.${i}`, resp.data.devices[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn cb(err, resp, meta);\n\t\t});\n\t}\n\n\t// GET /api/v1/devices/scanning/all\n\tscanning_all(cb) {\n\t\treturn this.core.api_get(\"/api/v1/devices/scanning/all\", (err, resp, meta) => {\n\t\t\tif(resp && resp.status && resp.data && resp.data.devices) {\n\t\t\t\tfor(let i in resp.data.devices) {\n\t\t\t\t\tDataProvider.setRaw(`scanning.devices.${i}`, resp.data.devices[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn cb(err, resp, meta);\n\t\t});\n\t}\n\n\t// POST /api/v1/devices/setup/new-device\n\tsetup_new_device(payload, cb) {\n\t\t// payload: { device_ip, alias, name, description }\n\t\treturn this.core.api_post(\"/api/v1/devices/setup/new-device\", payload, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}/info\n\tinfo(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/info`, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}\n\tget(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}`, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}/status\n\tstatus(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/status`, cb);\n\t}\n\n\t// POST /api/v1/devices/action\n\taction(payload, cb) {\n\t\t// payload: { device_id, action, params }\n\t\treturn this.core.api_post(\"/api/v1/devices/action\", payload, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}/remove\n\tremove(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/remove`, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}/reboot\n\treboot(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/reboot`, cb);\n\t}\n\n\t// POST /api/v1/devices/place-in-area\n\tplace_in_area(payload, cb) {\n\t\t// payload: { target_id, place_in_area_id }\n\t\treturn this.core.api_post(\"/api/v1/devices/place-in-area\", payload, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{target_id}}/unassign-from-area\n\tunassign_from_area(target_id, cb) {\n\t\tconst safe = encodeURIComponent(String(target_id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/unassign-from-area`, cb);\n\t}\n\n\t// POST /api/v1/devices/update-name\n\tupdate_name(payload, cb) {\n\t\t// payload: { device_id, name }\n\t\treturn this.core.api_post(\"/api/v1/devices/update-name\", payload, cb);\n\t}\n\n\t// POST /api/v1/devices/update-description\n\tupdate_description(payload, cb) {\n\t\t// payload: { device_id, description }\n\t\treturn this.core.api_post(\"/api/v1/devices/update-description\", payload, cb);\n\t}\n\n\t// POST /api/v1/devices/update-alias\n\tupdate_alias(payload, cb) {\n\t\t// payload: { device_id, new_alias }\n\t\treturn this.core.api_post(\"/api/v1/devices/update-alias\", payload, cb);\n\t}\n\n\t// POST /api/v1/devices/resetup\n\tresetup(payload, cb) {\n\t\t// payload: { device_id }\n\t\treturn this.core.api_post(\"/api/v1/devices/resetup\", payload, cb);\n\t}\n\n\t// POST /api/v1/devices/reset\n\treset(payload, cb) {\n\t\t// payload: { device_id }\n\t\treturn this.core.api_post(\"/api/v1/devices/reset\", payload, cb);\n\t}\n}\n", "export class AreasApi {\n\tconstructor(core) {\n\t\tthis.core = core;\n\t}\n\n\t// GET /api/v1/areas/list\n\tlist(cb) {\n\t\treturn this.core.api_get(\"/api/v1/areas/list\", (err, resp, meta) => {\n\t\t\tif(resp && resp.status && resp.data && resp.data.areas) {\n\t\t\t\tfor(let item of resp.data.areas) {\n\t\t\t\t\tDataProvider.setRaw(`areas.${item.id}`, item);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn cb(err, resp, meta);\n\t\t});\n\t}\n\n\t// GET /api/v1/areas/id/{{area_id}}/list\n\tinner_list(area_id, cb) {\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/list`, cb);\n\t}\n\n\t// POST /api/v1/areas/new-area\n\tnew_area(payload, cb) {\n\t\t// payload: { type, alias, display_name }\n\t\treturn this.core.api_post(\"/api/v1/areas/new-area\", payload, cb);\n\t}\n\n\t// GET /api/v1/areas/id/{{area_id}}/remove\n\tremove(area_id, cb) {\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/remove`, cb);\n\t}\n\n\t// POST /api/v1/areas/place-in-area\n\tplace_in_area(payload, cb) {\n\t\t// payload: { target_id, place_in_area_id }\n\t\treturn this.core.api_post(\"/api/v1/areas/place-in-area\", payload, cb);\n\t}\n\n\t// POST /api/v1/areas/update-display-name\n\tupdate_display_name(payload, cb) {\n\t\t// payload: { area_id, display_name }\n\t\treturn this.core.api_post(\"/api/v1/areas/update-display-name\", payload, cb);\n\t}\n\n\t// POST /api/v1/areas/update-alias\n\tupdate_alias(payload, cb) {\n\t\t// payload: { area_id, new_alias }\n\t\treturn this.core.api_post(\"/api/v1/areas/update-alias\", payload, cb);\n\t}\n\n\t// GET /api/v1/areas/id/{{area_id}}/devices\n\tdevices(area_id, cb) {\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/devices`, cb);\n\t}\n\n\t// GET /api/v1/areas/id/{{area_id}}/scripts\n\tscripts(area_id, cb) {\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/scripts`, cb);\n\t}\n\n\t// GET /api/v1/areas/id/{{target_id}}/unassign-from-area\n\tunassign_from_area(target_id, cb) {\n\t\tconst safe = encodeURIComponent(String(target_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/unassign-from-area`, cb);\n\t}\n\n\t// GET /api/v1/areas/types/list\n\ttypes_list(cb) {\n\t\treturn this.core.api_get(\"/api/v1/areas/types/list\", cb);\n\t}\n\n\t// GET /api/v1/areas/reboot_devices\n\t// GET /api/v1/areas/id/{{area_id}}/reboot_devices\n\treboot_devices(area_id, cb) {\n\t\tif (area_id === undefined || area_id === null) {\n\t\t\treturn this.core.api_get(\"/api/v1/areas/reboot_devices\", cb);\n\t\t}\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/reboot_devices`, cb);\n\t}\n}", "/**\n * smart_home_api.js\n *\n * \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F JS-\u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 \u0434\u043B\u044F REST-\u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 \u043A \u0441\u0435\u0440\u0432\u0435\u0440\u0443 (callback-style).\n * - \u0410\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044F: Bearer token (\u0438\u043B\u0438 \u043A\u0430\u0441\u0442\u043E\u043C\u043D\u044B\u0439 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A, \u0435\u0441\u043B\u0438 \u043F\u043E\u043C\u0435\u043D\u044F\u0435\u0448\u044C)\n * - \u0415\u0434\u0438\u043D\u0430\u044F \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u043E\u0448\u0438\u0431\u043E\u043A: \u0441\u0435\u0442\u0435\u0432\u044B\u0435, \u0442\u0430\u0439\u043C\u0430\u0443\u0442, \u043D\u0435-JSON, \u0441\u0442\u0430\u0442\u0443\u0441=false/error\n * - \u041C\u043E\u0434\u0443\u043B\u0438: \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u043E\u043B\u044C\u043A\u043E Scripts, \u043E\u0441\u0442\u0430\u043B\u044C\u043D\u044B\u0435 \u043F\u043E \u0430\u043D\u0430\u043B\u043E\u0433\u0438\u0438\n */\n\nimport { ScriptsApi } from \"./modules/ScriptsApi.js\";\nimport { DevicesApi } from \"./modules/DevicesApi.js\";\nimport { AreasApi } from \"./modules/AreasApi.js\";\n\n/* =========================\n Utils\n========================= */\n\nfunction build_query(params) {\n\tif (!params || typeof params !== \"object\") return \"\";\n\tconst usp = new URLSearchParams();\n\tObject.entries(params).forEach(([k, v]) => {\n\t\tif (v === undefined || v === null) return;\n\t\tusp.append(k, String(v));\n\t});\n\tconst s = usp.toString();\n\treturn s ? `?${s}` : \"\";\n}\n\nfunction join_url(base_url, path) {\n\tconst b = String(base_url || \"\").replace(/\\/+$/, \"\");\n\tconst p = String(path || \"\").replace(/^\\/+/, \"\");\n\treturn `${b}/${p}`;\n}\n\nfunction safe_json_parse(text) {\n\ttry {\n\t\treturn { ok: true, data: JSON.parse(text) };\n\t} catch (e) {\n\t\treturn { ok: false, error: e };\n\t}\n}\n\n/* =========================\n Core client\n========================= */\n\nexport class SmartHomeApi {\n\t/**\n\t * @param {Object} opts\n\t * @param {string} opts.base_url - \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: http://192.168.2.101\n\t * @param {string} [opts.token] - \u0442\u043E\u043A\u0435\u043D \u0430\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u0438\n\t * @param {number} [opts.timeout_ms=15000]\n\t * @param {Object} [opts.default_headers]\n\t * @param {Function} [opts.on_unauthorized] - cb(details)\n\t * @param {string} [opts.proxy_path] \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 \"/proxy.php\" (\u0432\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0430\u0432\u0442\u043E-\u043F\u0440\u043E\u043A\u0441\u0438)\n\t */\n\tconstructor(opts) {\n\t\tthis.base_url = opts?.base_url || \"\";\n\t\tthis.token = opts?.token || \"\";\n\t\tthis.timeout_ms = Number.isFinite(opts?.timeout_ms) ? opts.timeout_ms : 15000;\n\t\tthis.default_headers = opts?.default_headers || {};\n\t\tthis.on_unauthorized = typeof opts?.on_unauthorized === \"function\" ? opts.on_unauthorized : null;\n\t\tthis.proxy_path = opts?.proxy_path || \"\"; // \"\" => \u0431\u0435\u0437 \u043F\u0440\u043E\u043A\u0441\u0438\n\n\t\t// modules\n\t\tthis.scripts = new ScriptsApi(this);\n\t\tthis.devices = new DevicesApi(this);\n\t\tthis.areas = new AreasApi(this);\n\t}\n\n\tset_base_url(base_url) {\n\t\tthis.base_url = base_url || \"\";\n\t}\n\n\tset_token(token) {\n\t\tthis.token = token || \"\";\n\t}\n\n\tset_proxy_path(proxy_path) {\n\t\tthis.proxy_path = proxy_path || \"\";\n\t}\n\n\t_wrap_path(path, extra_query) {\n\t\t// \u0415\u0441\u043B\u0438 \u0432\u043A\u043B\u044E\u0447\u0451\u043D \u043F\u0440\u043E\u043A\u0441\u0438 \u2014 \u0445\u043E\u0434\u0438\u043C \u043D\u0430 /proxy.php?path=&...\n\t\tif (!this.proxy_path) {\n\t\t\tif (!extra_query) return path;\n\t\t\treturn `${path}${build_query(extra_query)}`;\n\t\t}\n\n\t\tconst q = { path, ...(extra_query || {}) };\n\t\treturn `${this.proxy_path}${build_query(q)}`;\n\t}\n\n\t/**\n\t * \u0423\u043D\u0438\u0444\u0438\u0446\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0437\u0430\u043F\u0440\u043E\u0441.\n\t *\n\t * cb(err, data, meta)\n\t * - err: { type, message, status_code?, raw?, details? }\n\t * - data: \u0440\u0430\u0441\u043F\u0430\u0440\u0441\u0435\u043D\u043D\u044B\u0439 json (\u0438\u043B\u0438 string, \u0435\u0441\u043B\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435 \u0432\u0435\u0440\u043D\u0443\u043B json)\n\t * - meta: { url, method, status_code, headers }\n\t */\n\trequest(method, path, body, cb, opts) {\n\t\tconst callback = typeof cb === \"function\" ? cb : () => {};\n\t\tconst url = join_url(this.base_url, path);\n\n\t\tconst controller = new AbortController();\n\t\tconst timeout_ms = Number.isFinite(opts?.timeout_ms) ? opts.timeout_ms : this.timeout_ms;\n\n\t\tconst t = setTimeout(() => controller.abort(), timeout_ms);\n\n\t\tconst headers = {\n\t\t\t...this.default_headers,\n\t\t\t...(opts?.headers || {}),\n\t\t};\n\n\t\t// \u0410\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044F (\u043F\u043E\u0434\u0441\u0442\u0440\u043E\u0439, \u0435\u0441\u043B\u0438 \u0443 \u0442\u0435\u0431\u044F \u0434\u0440\u0443\u0433\u043E\u0439 \u0444\u043E\u0440\u043C\u0430\u0442)\n\t\tif (this.token) headers[\"Authorization\"] = `Bearer ${this.token}`;\n\n\t\tlet payload = undefined;\n\t\tif (body !== undefined && body !== null) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t\tpayload = JSON.stringify(body);\n\t\t}\n\n\t\tfetch(url, {\n\t\t\tmethod,\n\t\t\theaders,\n\t\t\tbody: payload,\n\t\t\tsignal: controller.signal,\n\t\t})\n\t\t\t.then(async (res) => {\n\t\t\t\tclearTimeout(t);\n\n\t\t\t\tconst meta = {\n\t\t\t\t\turl,\n\t\t\t\t\tmethod,\n\t\t\t\t\tstatus_code: res.status,\n\t\t\t\t\theaders: res.headers,\n\t\t\t\t};\n\n\t\t\t\tconst text = await res.text();\n\t\t\t\tconst parsed = safe_json_parse(text);\n\t\t\t\tconst data = parsed.ok ? parsed.data : text;\n\n\t\t\t\t// HTTP-level \u043E\u0448\u0438\u0431\u043A\u0438\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tconst err = {\n\t\t\t\t\t\ttype: \"http_error\",\n\t\t\t\t\t\tmessage: `HTTP ${res.status}`,\n\t\t\t\t\t\tstatus_code: res.status,\n\t\t\t\t\t\traw: data,\n\t\t\t\t\t};\n\n\t\t\t\t\tif (res.status === 401 || res.status === 403) {\n\t\t\t\t\t\tif (this.on_unauthorized) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tthis.on_unauthorized({ error: err, meta });\n\t\t\t\t\t\t\t} catch (_) {}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn callback(err, null, meta);\n\t\t\t\t}\n\n\t\t\t\t// API-level \u043E\u0448\u0438\u0431\u043A\u0438 (\u043F\u043E \u0442\u0432\u043E\u0438\u043C \u043F\u0440\u0438\u043C\u0435\u0440\u0430\u043C \u0431\u044B\u0432\u0430\u0435\u0442 status:false \u0438\u043B\u0438 status:\"error\")\n\t\t\t\tif (parsed.ok && data && typeof data === \"object\") {\n\t\t\t\t\tconst st = data.status;\n\t\t\t\t\tif (st === false || st === \"error\") {\n\t\t\t\t\t\tconst err = {\n\t\t\t\t\t\t\ttype: \"api_error\",\n\t\t\t\t\t\t\tmessage: data.message || \"API error\",\n\t\t\t\t\t\t\tstatus_code: res.status,\n\t\t\t\t\t\t\traw: data,\n\t\t\t\t\t\t\tfield: data.field,\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn callback(err, null, meta);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn callback(null, data, meta);\n\t\t\t})\n\t\t\t.catch((e) => {\n\t\t\t\tclearTimeout(t);\n\n\t\t\t\tconst is_abort = e && (e.name === \"AbortError\" || String(e).includes(\"AbortError\"));\n\t\t\t\tconst err = is_abort\n\t\t\t\t\t? { type: \"timeout\", message: `Timeout after ${timeout_ms}ms` }\n\t\t\t\t\t: { type: \"network_error\", message: e?.message || \"Network error\", details: e };\n\n\t\t\t\treturn callback(err, null, { url, method, status_code: 0, headers: null });\n\t\t\t});\n\t}\n\n\tget(path, cb, opts) {\n\t\treturn this.request(\"GET\", path, null, cb, opts);\n\t}\n\n\tpost(path, body, cb, opts) {\n\t\treturn this.request(\"POST\", path, body, cb, opts);\n\t}\n\n\tapi_get(api_path, cb, extra_query, opts) {\n\t\treturn this.get(this._wrap_path(api_path, extra_query), cb, opts);\n\t}\n\n\tapi_post(api_path, body, cb, extra_query, opts) {\n\t\treturn this.post(this._wrap_path(api_path, extra_query), body, cb, opts);\n\t}\n}\n\n/* =========================\n Example usage\n========================= */\n\n// import { SmartHomeApi } from \"./smart_home_api.js\";\n//\n// const api = new SmartHomeApi({\n// base_url: \"http://192.168.2.101\",\n// token: \"YOUR_TOKEN\",\n// timeout_ms: 20000,\n// on_unauthorized: ({ error }) => console.log(\"auth problem:\", error),\n// });\n//\n// api.scripts.actions_list((err, res) => {\n// if (err) return console.error(\"actions_list error:\", err);\n// console.log(\"actions:\", res);\n// });\n//\n// api.scripts.run({ alias: \"script_alias\", params: { x: 1 } }, (err, res) => {\n// if (err) return console.error(\"run error:\", err);\n// console.log(\"run result:\", res);\n// });\n", "function sidebarTemplate(active) {\n\treturn Helper.template.sidebarNav([\n\t\t{\n\t\t\tcontent: ` Devices`,\n\t\t\troute: \"/#!/devices\",\n\t\t\tis_active: active == \"devices\"\n\t\t},\n\t\t{\n\t\t\tcontent: ` Scanning`,\n\t\t\troute: \"/#!/devices/scanning\",\n\t\t\tis_active: active == \"scanning\"\n\t\t}\n\t]);\n}\n\nfunction rebootDeviceBtnHandler(sh_api, btn, modal) {\n\tHelper.states.btnLoadingState(btn, true);\n\n\tconst deviceId = btn.dataset.deviceId;\n\tconst deviceName = btn.dataset.deviceName;\n\tconst deviceAlias = btn.dataset.deviceAlias;\n\t\n\tsh_api.devices.reboot(\n\t\tdeviceId,\n\t\t(err, data, meta) => {\n\t\t\tHelper.states.btnLoadingState(btn, false);\n\t\t\tconsole.log(\"Reboot done\", err, data, meta);\n\n\t\t\tmodal?.close();\n\n\t\t\tif(data) {\n\t\t\t\tsetTimeout(() => Screens.reinit(), 8000);\n\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\"Reboot successful\",\n\t\t\t\t\t`Device: ${deviceName}
    \n\t\t\t\t\tAlias: ${deviceAlias}`\n\t\t\t\t).show();\n\t\t\t} else {\n\t\t\t\tToasts.createError(\n\t\t\t\t\t\"Reboot failed\",\n\t\t\t\t\t`Device: ${deviceName}
    \n\t\t\t\t\tAlias: ${deviceAlias}`\n\t\t\t\t).show();\n\t\t\t}\n\t\t}\n\t);\n}\n\nexport {\n\tsidebarTemplate,\n\trebootDeviceBtnHandler\n}", "let selector, container, loadedAreas, currentParentAreaId, sh_api, type;\nconst typeMap = {\n\tarea: \"areas\",\n\tdevice: \"devices\",\n\taction: \"scripts\"\n};\n\nfunction setServerCurrentSelectedAreaName() {\n\tconst currentAreaDisplayContainer = selector.querySelector(\".current-area\");\n\n\tfor(let area of loadedAreas) {\n\t\tif(area.id == currentParentAreaId) {\n\t\t\treturn currentAreaDisplayContainer.innerHTML = `${area.display_name}`;\n\t\t}\n\t}\n\n\tcurrentAreaDisplayContainer.innerHTML = `Area ID ${currentParentAreaId}`;\n\n\tautoDisplayingRmParentIdBtn();\n}\n\nfunction removeParentAreaId(targetId) {\n\tsh_api[typeMap[type]].unassign_from_area(targetId, (err, resp, meta) => {\n\t\tconsole.log(`sh_api[${typeMap[type]}].unassign_from_area`, err, resp, meta);\n\n\t\tif(!resp || resp.data.status) {\n\t\t\treturn Toasts.createError(\n\t\t\t\t`Error of unassigning`,\n\t\t\t\t(!resp) ? `Error of request` : resp.data.error_alias\n\t\t\t).show();\n\t\t}\n\n\t\tcurrentParentAreaId = 0;\n\t\tsetServerCurrentSelectedAreaName();\n\t\thidePlaceInAreaSelector();\n\n\t\tToasts.createSuccess(\n\t\t\t`Successfully unassigning`,\n\t\t\t`Successfully unassigning`\n\t\t).show();\n\n\t\tScreens.reinit();\n\t});\n}\n\nfunction placeInAreaRequest(sh_api, payload) {\n\tsh_api[typeMap[type]].place_in_area(\n\t\tpayload, \n\t\t(err, resp, meta) => {\n\t\t\tconsole.log(\"sh_api.areas.place_in_area\", err, resp, meta);\n\n\t\t\tif(!resp) {\n\t\t\t\treturn console.error(\"Component placeInArea\", err, resp, meta);\n\t\t\t}\n\n\t\t\tif(!resp.status) {\n\t\t\t\treturn console.error(\"Component placeInArea\", err, resp, meta);\n\t\t\t}\n\n\t\t\tconst currentAreaDisplayContainer = selector.querySelector(\".current-area\");\n\n\t\t\tToasts.createSuccess(\n\t\t\t\t`Successfully applied`,\n\t\t\t\t`Successfully applied`\n\t\t\t).show();\n\n\t\t\tcurrentParentAreaId = payload.place_in_area_id;\n\t\t\tsetServerCurrentSelectedAreaName();\n\t\t\thidePlaceInAreaSelector();\n\n\t\t\tScreens.reinit();\n\n\t\t\tconsole.log(\"Success\", resp);\n\t\t}\n\t);\n}\n\nfunction loadAreasList(targetId, changePlaceCb) {\n\tsh_api.areas.list((err, resp, meta) => {\n\t\tconsole.log(\"sh_api.areas.list\", err, resp, meta);\n\n\t\tif(!resp) {\n\t\t\treturn console.error(\"sh_api.areas.list\", err);\n\t\t}\n\n\t\tloadedAreas = resp.data.areas;\n\n\t\tsetServerCurrentSelectedAreaName();\n\n\t\tconst areas = {};\n\t\tfor(let item of resp.data.areas) {\n\t\t\tif(type == \"area\" && item.id == targetId) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tareas[item.id] = item.display_name;\n\t\t}\n\n\t\tconst advs = advancedSelect(\n\t\t\tselector.querySelector(\".select-area\"),\n\t\t\tareas, \n\t\t\t\"Nothing found\"\n\t\t);\n\t\tselector.querySelector(\".advanced-select-container\").append(advs);\t\t\t\n\n\t\tadvs.advancedSelect.addEventListener(\"changed\", self => {\n\t\t\tchangePlaceCb(self, resp.data.areas);\n\t\t});\n\n\t\tcontainer.innerHTML = \"\";\n\t\tcontainer.append(selector);\n\t});\n}\n\nfunction hidePlaceInAreaSelector() {\n\tconst formContainer = selector.querySelector(\".form-container\");\n\tformContainer.classList.remove(\"a-show\");\n\tformContainer.classList.add(\"a-hide\");\n\tsetTimeout(() => formContainer.classList.remove(\"a-hide\"), 300);\n}\n\nfunction autoDisplayingRmParentIdBtn() {\n\tconst btn = selector.querySelector(\".remove-parent-id\");\n\tif(currentParentAreaId == 0) {\n\t\tbtn.classList.add(\"d-none\");\n\t} else {\n\t\tbtn.classList.remove(\"d-none\");\n\t}\n}\n\n/**\n * \u041F\u043E\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0434\u0435\u0432\u0430\u0439\u0441, \u044D\u043A\u0448\u043D \u0438\u043B\u0438 area \u0432 \u0434\u0440\u0443\u0433\u043E\u0439 area\n * @param {[type]} sh_api \n * @param {[type]} container \u0421\u044E\u0434\u0430 \u043C\u044B \u043F\u043E\u043C\u0435\u0441\u0442\u0438\u043C ui \u0434\u043B\u044F \u0432\u044B\u0431\u043E\u0440\u0430 area\n * @param {string} type area | device | action\n * @param {int} targetId ID \u0446\u0435\u043B\u0438, \u043A\u043E\u0442\u043E\u0440\u0443\u044E \u0431\u0443\u0434\u0435\u043C \u043F\u043E\u043C\u0435\u0449\u0430\u0442\u044C \u0432 area\n */\nexport function placeInArea(_sh_api, _container, _type, targetId, _currentParentAreaId) {\n\tsh_api = _sh_api;\n\tcontainer = _container;\n\tcurrentParentAreaId = _currentParentAreaId;\n\ttype = _type;\n\n\tselector = document.createElement(\"div\");\n\tselector.classList.add(\"component\");\n\tselector.classList.add(\"place-in-area-component\");\n\tselector.innerHTML = `\n\t\t\n\t\t\n\t\t\n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t
    \n\t\t
    \n\t`;\n\t\n\tloadAreasList(targetId, (advSelect, areasList) => {\n\t\tconst value = advSelect.advancedSelect.value();\n\t\tif(!value.isOption) {\n\t\t\treturn ;\n\t\t}\n\n\t\tconst areaId = Object.keys(value.option)[0];\n\t\tconst payload = { \n\t\t\ttarget_id: targetId, \n\t\t\tplace_in_area_id: areaId \n\t\t}\n\n\t\tplaceInAreaRequest(sh_api, payload);\n\t});\n\n\tconst formContainer = selector.querySelector(\".form-container\");\n\n\tselector.querySelector(\"button.show-place-in-area\").addEventListener(\"click\", e => {\n\t\tif(formContainer.classList.contains(\"a-show\")) {\n\t\t\tformContainer.classList.remove(\"a-show\");\n\t\t\tformContainer.classList.add(\"a-hide\");\n\t\t\tsetTimeout(() => formContainer.classList.remove(\"a-hide\"), 300);\n\t\t} else {\n\t\t\tformContainer.classList.add(\"a-show\");\n\t\t}\n\t});\n\n\tselector.querySelector(\"button.hide-place-in-area\").addEventListener(\"click\", e => {\n\t\thidePlaceInAreaSelector();\n\t});\n\n\tselector.querySelector(\"button.remove-parent-id\").addEventListener(\"click\", e => {\n\t\tremoveParentAreaId(targetId);\n\t});\n}", "const renderingByType = {\n\trelay: (alias, deviceResp) => {\n\t\tlet channels = \"\";\n\t\tfor(let channel of deviceResp.channels) {\n\t\t\tconst channelState = channel.state == \"off\" ? \"OFF\" : \"ON\";\n\t\t\tconst channelStateClass = channel.state == \"on\" ? \"badge-success\" : \"\";\n\t\t\tconst chId = deviceResp.channels.length > 1 ? `${channel.id}:` : \"\";\n\t\t\tchannels += `\n\t\t\t\t${chId}${channelState}\n\t\t\t`;\n\t\t}\n\n\t\treturn `
    ${channels}
    `;\n\t},\n\n\tbutton: (alias, deviceResp) => {\n\t\tconst channelClassMap = {\n\t\t\tenabled: \"badge-success\",\n\t\t\tdisabled: \"\",\n\t\t\tmute: \"badge-primary-outline\",\n\t\t\twaiting: \"badge-warning\",\n\t\t\terror: \"badge-error\"\n\t\t};\n\n\t\tlet channels = \"\";\n\t\tfor(let channel of deviceResp.channels) {\n\t\t\tchannels += `\n\t\t\t\t${channel.id}:${channel.indicator}\n\t\t\t`;\n\t\t}\n\n\t\treturn `
    ${channels}
    `;\n\t},\n\n\tsensor: (alias, deviceResp) => {\n\t\t/*\n\t\t{\"status\":\"ok\",\"indicators\":\"ok\",\"sensors\":{\n\t\t\t\"light\":{\"online\":true,\"level\":5,\"lux\":240.17,\"percent\":48},\n\t\t\t\"temperature\":{\"online\":true,\"current\":26.44,\"dynamics\":\"constant\",\"dynamics_val\":0},\n\t\t\t\"pressure\":{\"online\":true,\"current\":1000.69,\"dynamics\":\"constant\",\"dynamics_val\":0},\n\t\t\t\"humidity\":{\"online\":true,\"current\":43.02,\"dynamics\":\"constant\",\"dynamics_val\":0},\n\t\t\t\"radar\":{\"online\":true,\"presence\":true,\"activity_score\":1,\"activity_score_current\":1,\"activity_score_dynamics\":\"constant\",\"distance_m\":0},\n\t\t\t\"microphone\":{\"online\":true,\"current_noise\":53,\"noise_level\":7,\"noise_level_dbi\":50,\"noise_dynamics\":\"constant\"}}}\n\t\t */\n\n\t\tconst dynamics = dynamics => {\n\t\t\tswitch(dynamics) {\n\t\t\t\tcase \"increasing\": return ``;\n\t\t\t\tcase \"decreasing\": return ``;\n\t\t\t}\n\n\t\t\treturn ``;\n\t\t};\n\n\t\tconst presence = deviceResp.sensors.radar.presence \n\t\t\t? `${deviceResp.sensors.radar.activity_score}${dynamics(deviceResp.sensors.radar.activity_score_dynamics)}` \n\t\t\t: ''; \n\t\tconst temperature = deviceResp.sensors.temperature.current + \"\u00B0C\" + dynamics(deviceResp.sensors.temperature.dynamics); \n\t\tconst humidity = deviceResp.sensors.humidity.current + \"%\" + dynamics(deviceResp.sensors.humidity.dynamics); \n\t\tconst pressure = deviceResp.sensors.pressure.current + \"hpa\" + dynamics(deviceResp.sensors.pressure.dynamics); \n\t\tconst light = deviceResp.sensors.light.percent + \"%\"; \n\t\tconst noise = deviceResp.sensors.microphone.current_noise + \"dBi\" + dynamics(deviceResp.sensors.microphone.noise_dynamics); \n\n\t\tlet sensors = `\n\t\t\t${presence}\n\t\t\t${temperature}\n\t\t\t${humidity}\n\t\t\t${pressure}\n\t\t\t${light}\n\t\t\t${noise}\n\t\t`;\n\n\t\treturn `
    ${sensors}
    `;\n\t},\n\thatch: (alias, deviceResp) => {\n\t const hatchStateBadge = (deviceResp.hatch.state.indexOf(\"open\") != -1)\n\t \t? `${deviceResp.hatch.state} - ${deviceResp.hatch.position_pct}%`\n\t \t: `${deviceResp.hatch.state}`;\n\n\t return `
    ${hatchStateBadge}
    `;\n\t}\n};\n\nfunction initEventHandlers(component) {\n\tcomponent.addEventListener(\"click\", e => {\n\t\te.currentTarget.deviceStateComponent.create();\n\t});\n}\n\nfunction stateRendering(deviceType, deviceAlias, deviceResponse) {\n\treturn typeof renderingByType[deviceType] != \"undefined\"\n\t\t? renderingByType[deviceType](deviceAlias, deviceResponse)\n\t\t: \"Unknown device type
    \" + JSON.stringify(deviceResponse);\n}\n\nexport default function deviceStateComponent(sh_api, deviceId, deviceType) {\n\tconst component = Helper.template.createElement(\"div\", {\n\t\tclass: \"component device-state-component\"\n\t}, \"\");\n\n\tcomponent.deviceStateComponent = {\n\t\tcreate: () => {\n\t\t\tcomponent.innerHTML = Helper.template.circleLoaderHTML();\n\n\t\t\tsh_api.devices.status(deviceId, (err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.devices.status\", err, resp);\n\n\t\t\t\tif(!resp) {\n\t\t\t\t\tcomponent.innerHTML = `\n\t\t\t\t\t\t Loading Error\n\t\t\t\t\t`;\n\t\t\t\t\treturn console.error(\"deviceStateComponent\", `DeviceID ${deviceId}`);\n\t\t\t\t}\n\n\t\t\t\tcomponent.innerHTML = stateRendering(deviceType, resp.data.device.alias, resp.data.device.device_response);\n\t\t\t\tinitEventHandlers(component);\n\t\t\t});\n\t\t}\n\t}\n\n\tcomponent.deviceStateComponent.create();\n\n\treturn component;\n}", "import { rebootDeviceBtnHandler } from \"./devices-funcs.js\";\nimport { placeInArea } from \"../areas/areas-placeto-component.js\";\nimport deviceStateComponent from \"./device-state-component.js\";\n\nfunction initEditedFields(sh_api, device, modal) {\n\tconst editedFields = [\n\t\t{\n\t\t\tpayloadFieldName: \"name\",\n\t\t\tselector: \".display-name\",\n\t\t\tmethName: \"update_name\",\n\t\t\toriginalValue: device.name,\n\t\t\tisMultiString: false\n\t\t},\n\t\t{\n\t\t\tpayloadFieldName: \"description\",\n\t\t\tselector: \".description\",\n\t\t\tmethName: \"update_description\",\n\t\t\toriginalValue: device.description,\n\t\t\tisMultiString: true\n\t\t},\n\t\t{\n\t\t\tpayloadFieldName: \"new_alias\",\n\t\t\tselector: \".alias\",\n\t\t\tmethName: \"update_alias\",\n\t\t\toriginalValue: device.alias,\n\t\t\tisMultiString: false\n\t\t},\n\t];\n\n\tfor(let editedField of editedFields) {\n\t\tconst edit = editableString(modal.querySelector(editedField.selector));\n\t\tedit.editableString.onChange(component => {\n\t\t\tconst payload = {\n\t\t\t\tdevice_id: device.id,\n\t\t\t};\n\n\t\t\tpayload[editedField.payloadFieldName] = component.value;\n\n\t\t\tsh_api.devices[editedField.methName](payload, (err, resp, meta) => {\n\t\t\t\tif(err || !resp || !resp.status) {\n\t\t\t\t\tconsole.error(`sh_api.devices.${editedField.methName}`, err);\n\t\t\t\t\tedit.editableString.setValue(editedField.originalValue);\n\n\t\t\t\t\treturn Toasts.createError(\n\t\t\t\t\t\terr?.message ?? \"Error updating\", \n\t\t\t\t\t\terr.raw?.msg ?? `Error of ${editedField.payloadFieldName} updating`\n\t\t\t\t\t).show();\n\t\t\t\t}\n\n\t\t\t\tif(resp.status == true) {\n\t\t\t\t\tScreens.reinit();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n}\n\nexport function deviceDetailsPopup(device, sh_api) {\n\tconsole.log(device);\n\n\treturn Modals.create(\"device-popup\", {\n\t\ttitle: `Device ${device.name}`,\n\t\tbody: modal => {\n\t\t\t/* alias, area_id, connection_status, create_at, description, device_id, \n\t\t\tfirmware_version, id, ip, last_contact, mac, name, status, type, update_at */\n\n\t\t\tconst fieldClassMap = {\n\t\t\t\tarea_id: \"place-in-area-component-container\",\n\t\t\t\tip: \"device-ip\",\n\t\t\t\tstate: \"state-container\",\n\t\t\t\tname: \"display-name\",\n\t\t\t\tdescription: \"description\",\n\t\t\t\talias: \"alias-view-container\"\n\t\t\t};\n\n\t\t\tconst wrapToContainer = (field, value) => {\n\t\t\t\tconst map = {\n\t\t\t\t\tip: `{{value}}`,\n\t\t\t\t\tstatus: value => {\n\t\t\t\t\t\tconst map = {\n\t\t\t\t\t\t\tactive: \"badge-success\",\n\t\t\t\t\t\t\tremoved: \"badge-error\",\n\t\t\t\t\t\t\tfreezed: \"badge-warning\" \n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn `${value}`\n\t\t\t\t\t},\n\t\t\t\t\tconnection_status: value => {\n\t\t\t\t\t\tconst badgeClass = value == \"active\" ? \"badge-success\" : \"badge-warning\";\n\t\t\t\t\t\treturn `${value}`\n\t\t\t\t\t},\n\t\t\t\t\tmac: `{{value}}`,\n\t\t\t\t\talias: ` {{value}}`,\n\t\t\t\t\tdevice_id: `{{value}}`,\n\t\t\t\t\tlast_contact: value => Helper.unification.timeAgo(value),\n\t\t\t\t\tcreate_at: value => Helper.unification.formatDate(value),\n\t\t\t\t\tupdate_at: value => Helper.unification.formatDate(value),\n\t\t\t\t}\n\n\t\t\t\treturn map[field] \n\t\t\t\t\t? (typeof map[field] == \"function\" ? map[field](value) : map[field].replaceAll(\"{{value}}\", value))\n\t\t\t\t\t: value; \n\t\t\t}\n\n\t\t\tlet deviceProperties = \"\";\n\t\t\tfor(let field in device) {\n\t\t\t\tlet fieldValueClass = fieldClassMap[field] ?? \"\";\n\n\t\t\t\tdeviceProperties += `\n\t\t\t\t\t\n\t\t\t\t\t\t${field}: \n\t\t\t\t\t\t${wrapToContainer(field, device[field])}\n\t\t\t\t\t\n\t\t\t\t`;\n\t\t\t}\n\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t${deviceProperties}\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst buttonCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst buttonReboot = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-warning with-icon\"\n\t\t\t}, ' Reboot');\n\n\t\t\tconst buttonRemove = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-danger with-icon\"\n\t\t\t}, ' Remove');\n\n\t\t\tconst buttonResetup = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-secondary with-icon\"\n\t\t\t}, ' ReSetup');\n\n\t\t\tconst buttonReset = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-danger with-icon\"\n\t\t\t}, ' Reset');\n\n\t\t\tbuttonCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbuttonReboot.dataset.deviceId = device.id;\n\t\t\tbuttonReboot.dataset.deviceName = device.name;\n\t\t\tbuttonReboot.dataset.deviceAlias = device.alias;\n\n\t\t\tbuttonReboot.addEventListener(\"click\", e => {\n\t\t\t\tif(buttonReboot.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn ;\n\t\t\t\t}\n\n\t\t\t\trebootDeviceBtnHandler(sh_api, e.currentTarget, modal);\n\t\t\t});\n\n\t\t\tbuttonRemove.addEventListener(\"click\", e => {\n\t\t\t\tif(buttonRemove.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tHelper.states.btnLoadingState(buttonRemove, true);\n\t\t\t\tconfirmPopup(\n\t\t\t\t\t\"Are you sure you want to remove this device?\", \n\t\t\t\t\t() => {\n\t\t\t\t\t\tsh_api.devices.remove(\n\t\t\t\t\t\t\tdevice.id,\n\t\t\t\t\t\t\t(err, data, meta) => {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tHelper.states.btnLoadingState(buttonRemove, false);\n\t\t\t\t\t\t\t\tconsole.log(\"Was removed\");\n\n\t\t\t\t\t\t\t\tmodal.close();\n\t\t\t\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t\t\t\t\"Removed\",\n\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t\tDevice: ${device.name}
    \n\t\t\t\t\t\t\t\t\t\tAlias: ${device.alias}
    \n\t\t\t\t\t\t\t\t\t\tIP: ${device.ip}\n\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t\t}, 300);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t}, \n\t\t\t\t() => {\n\t\t\t\t\tHelper.states.btnLoadingState(buttonRemove, false);\n\t\t\t\t\tconsole.log(\"CANCELED\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tbuttonResetup.dataset.deviceId = device.id;\n\n\t\t\tbuttonResetup.addEventListener(\"click\", e => {\n\t\t\t\tconst deviceId = buttonResetup.dataset.deviceId;\n\n\t\t\t\tHelper.states.btnLoadingState(buttonResetup, true);\n\t\t\t\tconfirmPopup(\n\t\t\t\t\t\"Are you sure you want to repeat setup device?\", \n\t\t\t\t\t() => {\n\t\t\t\t\t\tsh_api.devices.resetup({\n\t\t\t\t\t\t\tdevice_id: deviceId\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(err, data, meta) => {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tHelper.states.btnLoadingState(buttonResetup, false);\n\n\t\t\t\t\t\t\tmodal.close();\n\t\t\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t\t\t\"Success\",\n\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\tDevice Id: ${device.name}
    \n\t\t\t\t\t\t\t\t\tAlias: ${device.alias}\n\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t}, 300);\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}, \n\t\t\t\t() => {\n\t\t\t\t\tHelper.states.btnLoadingState(buttonResetup, false);\n\t\t\t\t\tconsole.log(\"CANCELED\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tbuttonReset.dataset.deviceId = device.id;\n\n\t\t\tbuttonReset.addEventListener(\"click\", e => {\n\t\t\t\tconst deviceId = buttonReset.dataset.deviceId;\n\n\t\t\t\tHelper.states.btnLoadingState(buttonReset, true);\n\t\t\t\tconfirmPopup(\n\t\t\t\t\t\"Are you sure you want to RESET device?\", \n\t\t\t\t\t() => {\n\t\t\t\t\t\tsh_api.devices.reset({\n\t\t\t\t\t\t\tdevice_id: deviceId\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(err, data, meta) => {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tHelper.states.btnLoadingState(buttonReset, false);\n\n\t\t\t\t\t\t\tmodal.close();\n\t\t\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t\t\t\"Success\",\n\t\t\t\t\t\t\t\t\t`Device Id: ${device.name}
    \n\t\t\t\t\t\t\t\t\tAlias: ${device.alias}`\n\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t}, 300);\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}, \n\t\t\t\t() => {\n\t\t\t\t\tHelper.states.btnLoadingState(buttonReset, false);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ buttonCancel, buttonResetup, buttonReboot, buttonReset, buttonRemove ];\n\t\t},\n\t\tonready: modal => {\n\t\t\tplaceInArea(\n\t\t\t\tsh_api,\n\t\t\t\tmodal.querySelector(\".place-in-area-component-container\"),\n\t\t\t\t\"device\",\n\t\t\t\tdevice.id,\n\t\t\t\tdevice.area_id\n\t\t\t);\n\n\t\t\tmodal.querySelector(\".state-container\").append(deviceStateComponent(sh_api, device.id, device.type));\n\n\t\t\tinitEditedFields(sh_api, device, modal);\n\t\t\t\n\t\t}\n\t});\n}", "import { sidebarTemplate, rebootDeviceBtnHandler } from \"./devices-funcs.js\";\nimport { deviceDetailsPopup } from \"./device-details-popup.js\";\nimport deviceStateComponent from \"./device-state-component.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\tfor(let device of data.devices) {\n\t\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\t\tpreparedData.push({\n\t\t\tdeviceName: device.name,\n\t\t\talias: device.alias,\n\t\t\tconnectionStatus: Helper.template.connectionStatusBadge(device.connection_status),\n\t\t\tstate: `
    `,\n\t\t\tip: `${device.ip}`,\n\t\t\tactions: `\n\t\t\t\t
    \n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t`\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainTable(scr, data, total) {\n\tscr.currentScreen.DOMObject.querySelector(\".main-container\").innerHTML = Helper.template.table(\n\t\t\"Devices list\", \n\t\t{\n\t\t\tdeviceName: \"Device name\", \n\t\t\tconnectionStatus: \"Connect\",\n\t\t\tstate: \"State\",\n\t\t\tip: \"IP\", \n\t\t\tactions: \"Actions\"\n\t\t},\n\t\tdata,\n\t\t`Total: ${total} devices`\n\t);\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".reboot-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tif(e.currentTarget.getAttribute(\"disabled\")) {\n\t\t\t\treturn ;\n\t\t\t}\n\n\t\t\trebootDeviceBtnHandler(sh_api, e.currentTarget);\n\t\t});\n\t});\n\n\tscr.currentScreen.DOMObject.querySelectorAll(\".details-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst device = {\n\t\t\t\tstate: \"\",\n\t\t\t\t...JSON.parse(e.currentTarget.dataset.device)\n\t\t\t}\n\t\t\tdeviceDetailsPopup(device, sh_api).show();\n\t\t});\n\t});\n}\n\nfunction list(sh_api) {\n\treturn {\n\t\talias: \"devices\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"devices\"));\n\t\t},\n\n\t\tiniter: scr => {\n\t\t\ttry {\n\t\t\t\tsh_api.devices.list((err, resp, meta) => {\n\n\t\t\t\t\tif(err || !resp || meta.status_code != 200) {\n\t\t\t\t\t\tthrow \"Err\";\n\t\t\t\t\t}\n\n\t\t\t\t\trenderingMainTable(scr, prepareData(resp.data), resp.data.total);\n\t\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\t\tscr.currentScreen.DOMObject.querySelectorAll(\".device-state-container\").forEach(container => {\n\t\t\t\t\t\tcontainer.append(deviceStateComponent(\n\t\t\t\t\t\t\tsh_api, \n\t\t\t\t\t\t\tcontainer.dataset.deviceId, \n\t\t\t\t\t\t\tcontainer.dataset.deviceType\n\t\t\t\t\t\t));\n\t\t\t\t\t});\n\n\t\t\t\t\tscr.ready();\n\t\t\t\t});\n\t\t\t} catch(e) {\n\t\t\t\t\tconsole.error(\"sh_api.devices.list\", e);\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t}\n\t\t}\n\t};\n}\n\nexport {\n\tlist\n}", "export function deviceSetupFormPopup(device, sh_api) {\n\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\treturn Modals.create(\"device-setup\", {\n\t\ttitle: `Setup new device ${device.ip}`,\n\t\tbody: modal => {\n\n\t\t\tlet deviceProperties = \"\";\n\t\t\tfor(let field in device) {\n\t\t\t\tif(field[0] == \"_\") continue;\n\t\t\t\tdeviceProperties += `\n\t\t\t\t\t\n\t\t\t\t\t\t${field}: \n\t\t\t\t\t\t${device[field]}\n\t\t\t\t\t\n\t\t\t\t`;\n\t\t\t}\n\n\t\t\tconst deviceInfo = `\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t${deviceProperties}\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t${deviceInfo}\n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst buttonCancel = Helper.template.createElement(\"button\", { class: \"btn btn-primary\" }, \"Cancel\");\n\t\t\tbuttonCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tconst buttonSubmit = Helper.template.createElement(\"button\", \n\t\t\t\t{ class: \"btn btn-success with-icon\" }, \n\t\t\t\t` Setup`\n\t\t\t);\n\n\t\t\tbuttonSubmit.addEventListener(\"click\", e => {\n\t\t\t\tif(e.currentTarget.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst inputs = {\n\t\t\t\t\tdevice_ip: device.ip\n\t\t\t\t};\n\n\t\t\t\tconst setupForm = document.querySelector(\"#device-setup .setup-form\");\n\t\t\t\tsetupForm.querySelectorAll(\"input[type='text']\").forEach(i => {\n\t\t\t\t\ti.dispatchEvent(\n\t\t\t\t\t\tnew Event(\"input\", { bubbles: true })\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tif(setupForm.querySelectorAll(\".label.error\").length) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst inputElements = setupForm.querySelectorAll(\"input\");\n\t\t\t\tconst textareaElement = setupForm.querySelector(\"textarea\");\n\n\t\t\t\tfor(let input of inputElements) {\n\t\t\t\t\tinputs[input.getAttribute(\"name\")] = input.value;\n\t\t\t\t}\n\n\t\t\t\tinputs[textareaElement.getAttribute(\"name\")] = textareaElement.value;\n\n\t\t\t\tHelper.states.btnLoadingState(buttonSubmit, true);\n\t\t\t\t\n\t\t\t\tsh_api.devices.setup_new_device(inputs, (err, resp, meta) => {\n\t\t\t\t\tHelper.states.btnLoadingState(buttonSubmit, false);\n\n\t\t\t\t\tif(err?.type == \"api_error\") {\n\t\t\t\t\t\tconsole.error(\"ERR! sh_api.devices.setup_new_device\", err.raw);\n\n\t\t\t\t\t\tif(err.raw?.failed_fields) {\n\t\t\t\t\t\t\tfor(let errFieldName of err.raw.failed_fields) {\n\t\t\t\t\t\t\t\tmodal.querySelector(`[name=\"${errFieldName}\"]`).parentNode.classList.add(\"error\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\t\t\t\t\t\t\n\n\t\t\t\t\t\tif(err.raw?.msg) {\n\t\t\t\t\t\t\tconst alertContainer = modal.querySelector(\".setup-form .alert-container\");\n\t\t\t\t\t\t\talertContainer.innerHTML = \"\";\n\t\t\t\t\t\t\talertContainer?.append(Helper.template.createAlert( \"error\", err.raw.msg ));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\t\t\t\t\t\n\n\t\t\t\t\tif(!resp) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tinputElements.forEach(i => i.value = \"\");\n\t\t\t\t\ttextareaElement.value = \"\";\n\t\t\t\t\tmodal.close();\n\n\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tToasts.createSuccess(\"Setup successful\", `Added new device ID ${device.device_id}`).show();\n\t\t\t\t\t}, 300);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ buttonCancel, buttonSubmit ];\n\t\t},\n\n\t\tonready: modal => {\n\t\t\tconst setupForm = modal.querySelector(\".setup-form\");\n\t\t\tsetupForm.querySelectorAll(\"input\").forEach(i => {\n\t\t\t\ti.addEventListener(\"input\", e => {\n\t\t\t\t\tif(!e.currentTarget.value.length) {\n\t\t\t\t\t\te.currentTarget.parentNode.classList.add(\"error\");\n\t\t\t\t\t\tif(!e.currentTarget.parentNode.parentNode.querySelector(\".input-info.error\")) {\n\t\t\t\t\t\t\te.currentTarget.parentNode.parentNode.append(Helper.template.createElement(\"div\", {\n\t\t\t\t\t\t\t\tclass: \"input-info error\"\n\t\t\t\t\t\t\t}, ` Field cannot be empty`));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\te.currentTarget.parentNode.classList.remove(\"error\");\n\t\t\t\t\t\te.currentTarget.parentNode.parentNode.querySelector(\".input-info.error\")?.remove();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t})\n}", "import { sidebarTemplate } from \"./devices-funcs.js\";\nimport { deviceSetupFormPopup } from \"./device-setup-form-popup.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\tfor(let device of data.devices) {\n\t\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\t\tpreparedData.push({\n\t\t\tdeviceId: device.device_id,\n\t\t\tdeviceName: device.name,\n\t\t\tdeviceType: device.type,\n\t\t\tstatus: `${device.status}`,\n\t\t\tip: `${device.ip}`,\n\t\t\tmac: `${device.mac}`,\n\t\t\twifiSignal: device.wifi_signal,\n\t\t\tactions: device.status == \"setup\" ? `\n\t\t\t\t\n\t\t\t` : \"\"\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainTable(scr, data, total) {\n\tscr.currentScreen.DOMObject.querySelector(\".main-container\").innerHTML = Helper.template.table(\n\t\t\"Found devices\", \n\t\t{\n\t\t\tdeviceId: \"Device ID\",\n\t\t\tdeviceName: \"Device name\", \n\t\t\tdeviceType: \"Type\", \n\t\t\tstatus: \"Status\", \n\t\t\tip: \"IP\", \n\t\t\tmac: \"Mac\",\n\t\t\twifiSignal: \"Signal\", \n\t\t\tactions: \"Actions\"\n\t\t},\n\t\tdata,\n\t\t`Total: ${total} devices`\n\t);\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".setup-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst device = JSON.parse(e.currentTarget.dataset.device);\n\t\t\tdeviceSetupFormPopup(device, sh_api).show();\n\t\t});\n\t});\n}\n\nfunction scanning(sh_api) {\n\treturn {\n\t\talias: \"devices-scanning\",\n\t\trenderer: () => {\t\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"scanning\"));\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.devices.scanning_all((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.devices.scanning_all\", err, resp);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainTable(scr, prepareData(resp.data), resp.data.devices.length);\n\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\n\t\t}\n\t};\n}\n\nexport {\n\tscanning\n}", "import { list } from \"./devices-list-screen.js\";\nimport { scanning } from \"./devices-scanning-screen.js\";\n\nexport default {\n\tlist,\n\tscanning\n}", "function sidebarTemplate(active) {\n\treturn Helper.template.sidebarNav([\n\t\t{\n\t\t\tcontent: ` Scopes`,\n\t\t\troute: \"/#!/scripts/scopes\",\n\t\t\tis_active: active == \"scopes\"\n\t\t},\n\t\t{\n\t\t\tcontent: ` Actions`,\n\t\t\troute: \"/#!/scripts/actions\",\n\t\t\tis_active: active == \"actions\"\n\t\t},\n\t\t{\n\t\t\tcontent: ` Regular`,\n\t\t\troute: \"/#!/scripts/regular\",\n\t\t\tis_active: active == \"regular\"\n\t\t}\n\t]);\n}\n\nfunction runActionScript(sh_api, alias, cb) {\n\tsh_api.scripts.run({\n\t\talias: alias,\n\t\tparams: {}\n\t}, (err, data, meta) => {\n\t\tif(data) {\n\t\t\tcb(true);\n\n\t\t\tsetTimeout(() => Screens.reinit(), 1000);\n\n\t\t\tsetTimeout(() => Toasts.createSuccess(\n\t\t\t\t`${alias} running`,\n\t\t\t\t`${alias} running success`\n\t\t\t).show(), 300);\n\t\t} else {\n\t\t\tcb(false);\n\n\t\t\tsetTimeout(() => Toasts.createError(\n\t\t\t\t`${alias} failed`,\n\t\t\t\t`${alias} running failed`\n\t\t\t).show(), 300);\n\t\t}\n\t});\n}\n\nfunction createActionCardHtml(action) {\n\tconst cardColor = action.state == \"enabled\" ? \"primary\" : \"warning\";\n\treturn `\n\t\t
    \n\t\t\t${action.name} \n\t\t\t\t\n\t\t\t\n\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t${action.icon}\n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\t\t
    ${action.description}
    \n\t\t\t
    \n\t\t
    \n\t`;\n}\n\nfunction setActionCardEventsHandlers(sh_api, actionCard) {\n\tactionCard.querySelector(\".card-content\").addEventListener(\"click\", e => {\n\t\tif(actionCard.getAttribute(\"disabled\")) {\n\t\t\treturn ;\n\t\t}\n\n\t\tHelper.states.cardScriptActionLoadingState(actionCard, true);\n\n\t\tconst alias = actionCard.dataset.alias;\n\t\trunActionScript(sh_api, alias, resultFlag => {\n\t\t\tHelper.states.cardScriptActionLoadingState(actionCard, false);\n\n\t\t\tif(resultFlag) {\n\t\t\t\tactionCard.classList.add(\"card-success\");\n\t\t\t\tsetTimeout(() => actionCard.classList.remove(\"card-success\"), 1000);\n\t\t\t}\n\t\t});\n\n\t});\n}\n\nfunction createActionCard(sh_api, action) {\n\tconst container = document.createElement(\"div\");\n\tcontainer.innerHTML = createActionCardHtml(action);\n\tconst card = container.querySelector(\".card\");\n\tsetActionCardEventsHandlers(sh_api, card);\n\n\treturn card;\n}\n\nexport {\n\tsidebarTemplate,\n\trunActionScript,\n\tcreateActionCardHtml,\n\tsetActionCardEventsHandlers,\n\tcreateActionCard,\n}", "import { sidebarTemplate } from \"./scripts-funcs.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\n\tfor(let scope of data.scopes) {\n\t\tconst btnSwitch = scope.state == \"disabled\"\n\t\t\t? ``\n\t\t\t: ``;\n\n\t\tpreparedData.push({\n\t\t\tname: scope.name,\n\t\t\tfilename: `${scope.filename}
    ${scope.path}`,\n\t\t\tstate: Helper.template.toogleStateBadge(scope.state),\n\t\t\tactions: `\n\t\t\t\t${btnSwitch}\n\t\t\t`\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainTable(scr, data, total) {\n\tscr.currentScreen.DOMObject.querySelector(\".main-container\").innerHTML = Helper.template.table(\n\t\t\"Scopes list\", \n\t\t{\n\t\t\tname: \"Scope name\", \n\t\t\tfilename: \"Filename\", \n\t\t\tstate: \"State\", \n\t\t\tactions: \"Actions\"\n\t\t},\n\t\tdata,\n\t\t`Total: ${total} scopes`\n\t);\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".change-state-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst btn = e.currentTarget;\n\t\t\tif(btn.getAttribute(\"disabled\")) {\n\t\t\t\treturn ;\n\t\t\t}\n\n\t\t\tconst methName = btn.dataset.value == \"enable\"\n\t\t\t\t? \"scope_enable\"\n\t\t\t\t: \"scope_disable\"\n\n\t\t\tconst scope = JSON.parse(btn.dataset.scope);\n\t\t\tHelper.states.btnLoadingState(btn, true);\n\t\t\tsh_api.scripts[methName](scope.name, (err, data, meta) => {\n\t\t\t\tHelper.states.btnLoadingState(btn, false);\n\n\t\t\t\tif(data) {\n\t\t\t\t\tsetTimeout(() => Screens.reinit(), 250);\n\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t`Request Success`,\n\t\t\t\t\t\t`State of ${scope.name} was changed`\n\t\t\t\t\t).show();\n\t\t\t\t} else {\n\t\t\t\t\tToasts.createError(\n\t\t\t\t\t\t\"Request failed\",\n\t\t\t\t\t\t`Scope state not changed`\n\t\t\t\t\t).show();\n\t\t\t\t}\n\n\t\t\t});\n\t\t});\n\t});\n}\n\nfunction scopes(sh_api) {\n\treturn {\n\t\ttitle: \"Scripts Scopes\",\n\t\talias: \"scripts-scopes\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"scopes\"));\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.scripts.scopes_list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.scripts.scopes_list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainTable(scr, prepareData(resp.data), resp.data.total);\n\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\t\t\t\n\t\t}\n\t}\n}\n\nexport {\n\tscopes\n}", "import { sidebarTemplate } from \"./scripts-funcs.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\n\tfor(let script of data.scripts) {\n\t\tconst btnSwitch = script.state == \"disabled\"\n\t\t\t? ``\n\t\t\t: ``;\n\n\t\tpreparedData.push({\n\t\t\talias: `${script.alias}
    by ${script.created_by}`,\n\t\t\tname: `${script.name}
    ${script.description}
    `,\n\t\t\tfilename: `${script.filename}
    ${script.path}`,\n\t\t\tstate: Helper.template.toogleStateBadge(script.state),\n\t\t\tactions: `\n\t\t\t\t${btnSwitch}\n\t\t\t`\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainTable(scr, data, total) {\n\tconst provideSciptsData = {};\n\tfor(let i in data) {\n\t\tprovideSciptsData[data[i].alias] = data[i];\n\t\tdata[i][\"code\"] = \"\";\n\t}\n\tscr.currentScreen.DOMObject.provideSciptsData = provideSciptsData;\n\n\tscr.currentScreen.DOMObject.querySelector(\".main-container\").innerHTML = Helper.template.table(\n\t\t\"Regular scripts list\", \n\t\t{\n\t\t\talias: \"Alias\", \n\t\t\tname: \"Script name\", \n\t\t\tfilename: \"Filename\", \n\t\t\tstate: \"State\", \n\t\t\tactions: \"Actions\"\n\t\t},\n\t\tdata,\n\t\t`Total: ${total} scripts`\n\t);\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".change-state-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst btn = e.currentTarget;\n\t\t\tif(btn.getAttribute(\"disabled\")) {\n\t\t\t\treturn ;\n\t\t\t}\n\n\t\t\tconst methName = btn.dataset.value == \"enable\"\n\t\t\t\t? \"regular_enable\"\n\t\t\t\t: \"regular_disable\"\n\n\t\t\tconst script = scr.currentScreen.DOMObject.provideSciptsData[btn.dataset.alias] ?? { alias: btn.dataset.alias };\n\n\t\t\tHelper.states.btnLoadingState(btn, true);\n\t\t\tsh_api.scripts[methName](script.alias, (err, data, meta) => {\n\t\t\t\tHelper.states.btnLoadingState(btn, false);\n\n\t\t\t\tif(data) {\n\t\t\t\t\tsetTimeout(() => Screens.reinit(), 250);\n\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t`Request Success`,\n\t\t\t\t\t\t`State of ${script.alias} was changed`\n\t\t\t\t\t).show();\n\t\t\t\t} else {\n\t\t\t\t\tToasts.createError(\n\t\t\t\t\t\t\"Request failed\",\n\t\t\t\t\t\t`Regular script state not changed`\n\t\t\t\t\t).show();\n\t\t\t\t}\n\n\t\t\t});\n\t\t});\n\t});\n}\n\nfunction regular(sh_api) {\n\treturn {\n\t\ttitle: \"Scripts Regular\",\n\t\talias: \"scripts-regular\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"regular\"));\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.scripts.regular_list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.scripts.regular_list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainTable(scr, prepareData(resp.data), resp.data.total);\n\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\t\t\t\n\t\t}\n\t}\n}\n\nexport {\n\tregular\n}", "import { runActionScript } from \"./scripts-funcs.js\";\nimport { placeInArea } from \"../areas/areas-placeto-component.js\";\n\nexport function actionDetailsPopup(script, sh_api) {\n\tconsole.log(\"actionDetailsPopup\", script);\n\n\treturn Modals.create(\"action-script-popup\", {\n\t\ttitle: `${script.name}`,\n\t\tbody: modal => {\n\t\t\tconst placeInAreaContainer = (script.area_id != -1) \n\t\t\t\t? `
    `\n\t\t\t\t: \"\";\n\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t

    ${script.alias}

    \n\t\t\t\t\t\t\t
    ${script.description}
    \n\t\t\t\t\t\t\t
    ${Helper.template.toogleStateBadge(script.state)}
    \n\t\t\t\t\t\t\t${placeInAreaContainer}\n\t\t\t\t\t\t\t
    ${script.filename}
    \n\t\t\t\t\t\t\t
    By ${script.author}
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    ${script.code}
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst btnChangeState = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: script.state == \"enabled\" ? \"btn btn-warning\" : \"btn btn-success\",\n\t\t\t\t\"data-value\": script.state == \"enabled\" ? \"disable\" : \"enable\"\n\t\t\t}, script.state == \"enabled\" ? `Disable` : \"Enable\");\n\n\n\t\t\tconst btnRun = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-secondary with-icon\"\n\t\t\t}, ` Run`);\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbtnChangeState.addEventListener(\"click\", e => {\n\t\t\t\tconst btn = e.currentTarget;\n\t\t\t\tif(btn.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn ;\n\t\t\t\t}\n\n\t\t\t\tconst methName = btn.dataset.value == \"enable\"\n\t\t\t\t\t? \"action_enable\"\n\t\t\t\t\t: \"action_disable\"\n\n\t\t\t\t// const script = scr.currentScreen.DOMObject.provideSciptsData[btn.dataset.alias] ?? {};\n\n\t\t\t\tHelper.states.btnLoadingState(btn, true);\n\t\t\t\tsh_api.scripts[methName](script.alias, (err, data, meta) => {\n\t\t\t\t\tHelper.states.btnLoadingState(btn, false);\n\t\t\t\t\tmodal.close();\n\n\t\t\t\t\tif(data) {\n\t\t\t\t\t\tsetTimeout(() => Screens.reinit(), 250);\n\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t`Request Success`,\n\t\t\t\t\t\t\t`State of ${script.alias} was changed`\n\t\t\t\t\t\t).show();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tToasts.createError(\n\t\t\t\t\t\t\t\"Request failed\",\n\t\t\t\t\t\t\t`Regular script state not changed`\n\t\t\t\t\t\t).show();\n\t\t\t\t\t}\n\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tbtnRun.addEventListener(\"click\", e => {\n\t\t\t\tconst btn = e.currentTarget;\n\t\t\t\tHelper.states.btnLoadingState(btn, true);\n\n\t\t\t\trunActionScript(sh_api, script.alias, resultFlag => {\n\t\t\t\t\tHelper.states.btnLoadingState(btn, false);\n\t\t\t\t\tif(resultFlag) {\n\t\t\t\t\t\tmodal.close();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ btnCancel, btnChangeState, btnRun ];\n\t\t},\n\t\tonready: modal => {\n\t\t\tplaceInArea(\n\t\t\t\tsh_api,\n\t\t\t\tmodal.querySelector(\".place-in-area-component-container\"),\n\t\t\t\t\"action\",\n\t\t\t\tscript.id,\n\t\t\t\tscript.area_id\n\t\t\t);\n\n\t\t\thljs.highlightElement(modal.querySelector(\".code-viewer\"));\n\t\t}\n\t});\n}", "import { \n\tsidebarTemplate, \n\trunActionScript, \n\tsetActionCardEventsHandlers, \n\tcreateActionCardHtml,\n} from \"./scripts-funcs.js\";\nimport { actionDetailsPopup } from \"./scripts-action-popup.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\n\tfor(let script of data.scripts) {\n\t\tpreparedData.push({\n\t\t\talias: script.alias,\n\t\t\tauthor: script.created_by,\n\t\t\tname: script.name,\n\t\t\ticon: script.icon ?? '',\n\t\t\tdescription: script.description,\n\t\t\tfilename: `${script.filename}
    ${script.path}`,\n\t\t\tstate: script.state,\n\t\t\tcode: script.code,\n\t\t\tid: script.id ?? 0,\n\t\t\tarea_id: script.area_id ?? -1\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainGrid(scr, data, total) {\n\tlet grid = `
    `;\n\n\tconst provideSciptsData = {};\n\n\tfor(let item of data) {\n\t\tprovideSciptsData[item.alias] = item;\n\t\tgrid += createActionCardHtml(item);\n\t}\n\tgrid += `
    `;\n\n\tconst mainContainer = scr.currentScreen.DOMObject.querySelector(\".main-container\");\n\tmainContainer.innerHTML = grid;\n\tscr.currentScreen.DOMObject.provideSciptsData = provideSciptsData;\n}\n\nfunction initMainGridInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".script-action\").forEach(actionCard => {\n\t\tsetActionCardEventsHandlers(sh_api, actionCard);\n\t});\n\n\tscr.currentScreen.DOMObject.querySelectorAll(\".action-details-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst btn = e.currentTarget;\n\t\t\tconst script = scr.currentScreen.DOMObject.provideSciptsData[btn.dataset.alias] ?? {};\n\n\t\t\tconsole.log(\"SCRIPT\", script);\n\t\t\tactionDetailsPopup(script, sh_api).show();\n\t\t});\n\t});\n}\n\nfunction actions(sh_api) {\n\treturn {\n\t\ttitle: \"Scripts Actions\",\n\t\talias: \"scripts-actions\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"actions\"));\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.scripts.actions_list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.scripts.actions_list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainGrid(scr, prepareData(resp.data), resp.data.total);\n\t\t\t\tinitMainGridInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\t\t\t\n\t\t}\n\t}\n}\n\nexport {\n\tactions,\n\tprepareData\n}", "import { scopes } from \"./scripts-scopes-screen.js\";\nimport { regular } from \"./scripts-regular-screen.js\";\nimport { actions } from \"./scripts-actions-screen.js\";\n\nexport default {\n\tscopes,\n\tregular,\n\tactions\n}", "function sidebarTemplate(active) {\n\treturn Helper.template.sidebarNav([\n\t\t{\n\t\t\tcontent: ` Areas Tree`,\n\t\t\troute: \"/#!/areas/tree\",\n\t\t\tis_active: active == \"areas-tree\"\n\t\t}\n\t]);\n}\n\nexport {\n\tsidebarTemplate\n}", "import { rebootDeviceBtnHandler } from \"../devices/devices-funcs.js\";\nimport deviceStateComponent from \"../devices/device-state-component.js\";\nimport { deviceDetailsPopup } from \"../devices/device-details-popup.js\";\n\nexport function areaDevicesModal(area, sh_api) {\n\tconsole.log(\"areaDevicesModal\", area);\n\n\treturn Modals.create(\"area-devices-modal\", {\n\t\ttitle: ` ${area.display_name}`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst btnRebootAll = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-warning with-icon btn-reboot-all\"\n\t\t\t}, ` Reboot All`);\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbtnRebootAll.addEventListener(\"click\", e => {\n\t\t\t\tif(btnRebootAll.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tHelper.states.btnLoadingState(btnRebootAll, true);\n\t\t\t\tconfirmPopup(\n\t\t\t\t\t`Are you sure you want to reboot all devices from ${area.display_name}?`, \n\t\t\t\t\t() => {\n\t\t\t\t\t\tsh_api.areas.reboot_devices(\n\t\t\t\t\t\t\tarea.id,\n\t\t\t\t\t\t\t(err, data, meta) => {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tHelper.states.btnLoadingState(btnRebootAll, false);\n\n\t\t\t\t\t\t\t\tif(data) {\n\t\t\t\t\t\t\t\t\tconsole.log(\"Was rebooted all devices\");\n\n\t\t\t\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t\t\t\t\"Rebooted all devices\",\n\t\t\t\t\t\t\t\t\t\t`Area: ${area.display_name}`\n\t\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tToasts.createDanger(\n\t\t\t\t\t\t\t\t\t\t\"Rebooted fail\",\n\t\t\t\t\t\t\t\t\t\t`Area: ${area.display_name}`\n\t\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t}, \n\t\t\t\t() => {\n\t\t\t\t\tHelper.states.btnLoadingState(btnRebootAll, false);\n\t\t\t\t\tconsole.log(\"CANCELED\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ btnCancel, btnRebootAll ];\n\t\t},\n\t\tonready: modal => {\n\t\t\tconst devicesContainer = modal.querySelector(\".devices-container\");\n\t\t\tconst loader = modal.querySelector(\".loader\");\n\n\t\t\tsh_api.areas.devices(area.id, (err, data, meta) => {\n\t\t\t\tconsole.log(\"sh_api.areas.devices\", data);\n\n\t\t\t\tfunction prepareDevicesData(data) {\n\t\t\t\t\tif(!data) {\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\n\t\t\t\t\tconst preparedData = [];\n\t\t\t\t\tfor(let device of data.devices) {\n\t\t\t\t\t\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\t\t\t\t\t\tpreparedData.push({\n\t\t\t\t\t\t\tdeviceNaming: `\n\t\t\t\t\t\t\t\t
    ${device.name}
    \n\t\t\t\t\t\t\t\t
    ${device.alias}
    \n\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\tstatus: Helper.template.connectionStatusBadge(device.connection_status),\n\t\t\t\t\t\t\tstate: `
    \n\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\tactions: `\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\treturn preparedData;\n\t\t\t\t}\n\n\t\t\t\tconst devices = prepareDevicesData(data?.data);\n\t\t\t\tif(devices.length) {\n\t\t\t\t\tdevicesContainer.innerHTML = Helper.template.table(\n\t\t\t\t\t\t\"\", \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdeviceNaming: \"Device\", \n\t\t\t\t\t\t\tstatus: \"Status\", \n\t\t\t\t\t\t\tstate: \"State\", \n\t\t\t\t\t\t\tactions: \"Actions\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdevices,\n\t\t\t\t\t\t`Total: ${devices.length} devices`\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tdevicesContainer.innerHTML = Helper.template.emptyHereHTML();\n\t\t\t\t\tmodal.querySelector(\".btn-reboot-all\").remove();\n\t\t\t\t}\n\n\t\t\t\tdevicesContainer.querySelectorAll(\".reboot-btn\").forEach(rebootBtn => {\n\t\t\t\t\trebootBtn.addEventListener(\"click\", e => {\n\t\t\t\t\t\tif(rebootBtn.getAttribute(\"disabled\")) {\n\t\t\t\t\t\t\treturn ;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trebootDeviceBtnHandler(sh_api, e.currentTarget, modal);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tdevicesContainer.querySelectorAll(\".device-state-container\").forEach(container => {\n\t\t\t\t\tcontainer.append(deviceStateComponent(\n\t\t\t\t\t\tsh_api, \n\t\t\t\t\t\tcontainer.dataset.deviceId, \n\t\t\t\t\t\tcontainer.dataset.deviceType\n\t\t\t\t\t));\n\t\t\t\t});\n\n\t\t\t\tdevicesContainer.querySelectorAll(\".details-btn\").forEach(btn => {\n\t\t\t\t\tbtn.addEventListener(\"click\", e => {\n\t\t\t\t\t\tconst device = {\n\t\t\t\t\t\t\tstatus: \"\",\n\t\t\t\t\t\t\t...JSON.parse(e.currentTarget.dataset.device)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdeviceDetailsPopup(device, sh_api).show();\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tloader.remove();\n\n\t\t\t\tconsole.log(\"devices\", devices);\n\t\t\t});\n\t\t}\n\t});\n}", "import { \n\trunActionScript, \n\tsetActionCardEventsHandlers, \n\tcreateActionCardHtml,\n\tcreateActionCard,\n} from \"../scripts/scripts-funcs.js\";\nimport { prepareData } from \"../scripts/scripts-actions-screen.js\";\n// import { actionDetailsPopup } from \"./scripts-action-popup.js\";\n\nexport function areaActionsModal(area, sh_api) {\n\tconsole.log(\"areaActionsModal\", area);\n\n\treturn Modals.create(\"area-actions-modal\", {\n\t\ttitle: ` ${area.display_name}`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\treturn [ btnCancel ];\n\t\t},\n\t\tonready: modal => {\n\t\t\tconst actionsCardsContainer = modal.querySelector(\".actions-container\");\n\t\t\tconst loader = modal.querySelector(\".loader\");\n\n\t\t\tsh_api.areas.scripts(area.id, (err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.areas.scripts\", err, resp, meta);\n\n\t\t\t\tif(!resp) {\n\t\t\t\t\treturn Toasts.createDanger(\n\t\t\t\t\t\t\"Loading failed\",\n\t\t\t\t\t\t`Area: ${area.display_name}`\n\t\t\t\t\t).show();\n\t\t\t\t}\n\n\t\t\t\tconst actions = prepareData(resp.data);\n\t\t\t\tconsole.log(\"ACTIONS\", actions);\n\t\t\t\tactionsCardsContainer.innerHTML = \"\";\n\t\t\t\t\n\t\t\t\tif(!actions.length) {\n\t\t\t\t\tactionsCardsContainer.innerHTML = Helper.template.emptyHereHTML();\n\t\t\t\t}\n\n\t\t\t\tloader.remove();\n\t\t\t\tfor(let item of actions) {\n\t\t\t\t\tactionsCardsContainer.append(createActionCard(sh_api, item));\n\t\t\t\t}\n\t\t\t});\t\n\n\t\t\t// const devicesContainer = modal.querySelector(\".devices-container\");\n\t\t\t// const loader = modal.querySelector(\".loader\");\n\n\t\t\t// sh_api.areas.devices(area.id, (err, data, meta) => {\n\t\t\t// \tconsole.log(\"sh_api.areas.devices\", data);\n\n\t\t\t// \tfunction prepareDevicesData(data) {\n\t\t\t// \t\tif(!data) {\n\t\t\t// \t\t\treturn [];\n\t\t\t// \t\t}\n\n\t\t\t// \t\tconst preparedData = [];\n\t\t\t// \t\tfor(let device of data.devices) {\n\t\t\t// \t\t\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\t\t\t// \t\t\tpreparedData.push({\n\t\t\t// \t\t\t\tdeviceName: device.name,\n\t\t\t// \t\t\t\talias: device.alias,\n\t\t\t// \t\t\t\tstatus: Helper.template.connectionStatusBadge(device.connection_state),\n\t\t\t// \t\t\t\tip: `${device.ip}`,\n\t\t\t// \t\t\t\tactions: `\n\t\t\t// \t\t\t\t\t\n\t\t\t// \t\t\t\t`\n\t\t\t// \t\t\t});\n\t\t\t// \t\t}\n\n\t\t\t// \t\treturn preparedData;\n\t\t\t// \t}\n\n\t\t\t// \tconst devices = prepareDevicesData(data?.data);\n\n\t\t\t// \tdevicesContainer.innerHTML = Helper.template.table(\n\t\t\t// \t\t\"\", \n\t\t\t// \t\t{\n\t\t\t// \t\t\tdeviceName: \"Device name\", \n\t\t\t// \t\t\talias: \"Device alias\", \n\t\t\t// \t\t\tstatus: \"Status\", \n\t\t\t// \t\t\tip: \"IP\", \n\t\t\t// \t\t\tactions: \"Actions\"\n\t\t\t// \t\t},\n\t\t\t// \t\tdevices,\n\t\t\t// \t\t`Total: ${devices.length} devices`\n\t\t\t// \t);\n\n\t\t\t// \tdevicesContainer.querySelectorAll(\".reboot-btn\").forEach(rebootBtn => {\n\t\t\t// \t\trebootBtn.addEventListener(\"click\", e => {\n\t\t\t// \t\t\tif(rebootBtn.getAttribute(\"disabled\")) {\n\t\t\t// \t\t\t\treturn ;\n\t\t\t// \t\t\t}\n\n\t\t\t// \t\t\trebootDeviceBtnHandler(sh_api, e.currentTarget, modal);\n\t\t\t// \t\t});\n\t\t\t// \t});\n\n\t\t\t// \tloader.remove();\n\n\t\t\t// \tconsole.log(\"devices\", devices);\n\t\t\t// });\n\t\t}\n\t});\n}", "\nexport function createNewAreaModal(sh_api) {\n\tconsole.log(\"createNewAreaModal\");\n\n\treturn Modals.create(\"create-area-modal\", {\n\t\ttitle: ` Create new Area`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst btnSubmit = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-success with-icon\"\n\t\t\t}, ` Create`);\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbtnSubmit.addEventListener(\"click\", e => {\n\t\t\t\tconst form = modal.querySelector(\".create-area-form\");\n\t\t\t\tform.querySelectorAll(\"input[type='text']\").forEach(i => {\n\t\t\t\t\ti.dispatchEvent(\n\t\t\t\t\t\tnew Event(\"input\", { bubbles: true })\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tif(form.querySelectorAll(\".label.error\").length) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst inputElements = form.querySelectorAll(\"input\");\n\n\t\t\t\tconst inputs = {};\n\t\t\t\tfor(let input of inputElements) {\n\t\t\t\t\tinputs[input.getAttribute(\"name\")] = input.value;\n\t\t\t\t}\n\n\t\t\t\tHelper.states.btnLoadingState(btnSubmit, true);\n\n\t\t\t\tsh_api.areas.new_area(inputs, (err, resp, meta) => {\n\t\t\t\t\tHelper.states.btnLoadingState(btnSubmit, false);\n\n\t\t\t\t\tif(err?.type == \"api_error\") {\n\t\t\t\t\t\tconsole.error(\"ERR! sh_api.areas.new_area\", err.raw);\n\n\t\t\t\t\t\tif(err.raw?.failed_fields) {\n\t\t\t\t\t\t\tfor(let errFieldName of err.raw.failed_fields) {\n\t\t\t\t\t\t\t\tmodal.querySelector(`[name=\"${errFieldName}\"]`).parentNode.classList.add(\"error\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\t\t\t\t\t\t\n\n\t\t\t\t\t\tif(err.raw?.msg) {\n\t\t\t\t\t\t\tconst alertContainer = modal.querySelector(\".alert-container\");\n\t\t\t\t\t\t\talertContainer.innerHTML = \"\";\n\t\t\t\t\t\t\talertContainer?.append(Helper.template.createAlert( \"error\", err.raw.msg ));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\t\t\t\t\t\n\n\t\t\t\t\tif(!resp) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tinputElements.forEach(i => i.value = \"\");\n\t\t\t\t\tmodal.close();\n\n\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tToasts.createSuccess(\"Creating successful\", `Added new area ID ${inputs.alias}`).show();\n\t\t\t\t\t}, 300);\n\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ btnCancel, btnSubmit ];\n\t\t},\n\t\tonready: modal => {\n\t\t\tconst form = modal.querySelector(\".create-area-form\");\n\t\t\tform.querySelectorAll(\".input\").forEach(i => {\n\n\t\t\t\ti.addEventListener(\"input\", e => {\n\t\t\t\t\tif(!e.currentTarget.value.length) {\n\t\t\t\t\t\te.currentTarget.parentNode.classList.add(\"error\");\n\t\t\t\t\t\tif(!e.currentTarget.parentNode.parentNode.querySelector(\".input-info.error\")) {\n\t\t\t\t\t\t\te.currentTarget.parentNode.parentNode.append(Helper.template.createElement(\"div\", {\n\t\t\t\t\t\t\t\tclass: \"input-info error\"\n\t\t\t\t\t\t\t}, ` Field cannot be empty`));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\te.currentTarget.parentNode.classList.remove(\"error\");\n\t\t\t\t\t\te.currentTarget.parentNode.parentNode.querySelector(\".input-info.error\")?.remove();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t});\n\n\t\t\tsh_api.areas.types_list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.areas.types_list\", err, resp, meta);\n\n\t\t\t\tif(!resp) {\n\t\t\t\t\tconsole.error(\"Request Error. sh_api.areas.types_list()\");\n\t\t\t\t}\n\n\t\t\t\tconst types = {};\n\t\t\t\tfor(let type of resp.data.types) {\n\t\t\t\t\ttypes[type] = type;\n\t\t\t\t}\n\n\t\t\t\tform.querySelector(\".advanced-select-container\").append(advancedSelect(\n\t\t\t\t\tform.querySelector(`[name=\"type\"]`),\n\t\t\t\t\ttypes, \n\t\t\t\t\t\"Will be created\"\n\t\t\t\t));\n\t\t\t});\n\t\t}\n\t});\n}", "import { placeInArea } from \"./areas-placeto-component.js\";\n\nfunction initEditedFields(sh_api, area, modal) {\n\tconst editedFields = [\n\t\t{\n\t\t\tpayloadFieldName: \"display_name\",\n\t\t\tselector: \".display-name\",\n\t\t\tmethName: \"update_display_name\",\n\t\t\toriginalValue: area.display_name,\n\t\t\tisMultiString: false\n\t\t},\n\t\t{\n\t\t\tpayloadFieldName: \"new_alias\",\n\t\t\tselector: \".alias\",\n\t\t\tmethName: \"update_alias\",\n\t\t\toriginalValue: area.alias,\n\t\t\tisMultiString: false\n\t\t},\n\t];\n\n\tfor(let editedField of editedFields) {\n\t\tconst edit = editableString(modal.querySelector(editedField.selector));\n\t\tedit.editableString.onChange(component => {\n\t\t\tconst payload = {\n\t\t\t\tarea_id: area.id,\n\t\t\t};\n\n\t\t\tpayload[editedField.payloadFieldName] = component.value;\n\n\t\t\tsh_api.areas[editedField.methName](payload, (err, resp, meta) => {\n\t\t\t\tif(err || !resp || !resp.status) {\n\t\t\t\t\tconsole.error(`sh_api.areas.${editedField.methName}`, err);\n\t\t\t\t\tedit.editableString.setValue(editedField.originalValue);\n\n\t\t\t\t\treturn Toasts.createError(\n\t\t\t\t\t\terr?.message ?? \"Error updating\", \n\t\t\t\t\t\terr.raw?.msg ?? `Error of ${editedField.payloadFieldName} updating`\n\t\t\t\t\t).show();\n\t\t\t\t}\n\n\t\t\t\tif(resp.status == true) {\n\t\t\t\t\tScreens.reinit();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n}\n\nexport function areaDetailsModal(area, sh_api) {\n\tarea = Screens.currentScreen.DOMObject.provideData[area.id] ?? area;\n\n\tconsole.log(\"areaDetailsModal\", area);\n\n\treturn Modals.create(\"area-details-modal\", {\n\t\ttitle: ` ${area.display_name}`,\n\t\tbody: modal => {\n\t\t\tconst entityData = area;\n\n\t\t\tconst fieldClassMap = {\n\t\t\t\tparent_id: \"place-in-area-container\",\n\t\t\t\tdisplay_name: \"display-name\",\n\t\t\t\talias: \"alias-view-container\"\n\t\t\t};\n\n\t\t\tconst wrapToContainer = (field, value) => {\n\t\t\t\tconst map = {\n\t\t\t\t\talias: ` {{value}}`,\n\t\t\t\t\tcreate_at: value => Helper.unification.formatDate(value),\n\t\t\t\t\tupdate_at: value => Helper.unification.formatDate(value),\n\t\t\t\t\tschema: \"Nothing yet\",\n\t\t\t\t}\n\n\t\t\t\treturn map[field] \n\t\t\t\t\t? (typeof map[field] == \"function\" ? map[field](value) : map[field].replaceAll(\"{{value}}\", value))\n\t\t\t\t\t: value; \n\t\t\t}\n\n\t\t\tlet properties = \"\";\n\t\t\tfor(let field in entityData) {\n\t\t\t\tlet fieldValueClass = fieldClassMap[field] ?? \"\";\n\n\t\t\t\tproperties += `\n\t\t\t\t\t\n\t\t\t\t\t\t${field}: \n\t\t\t\t\t\t${wrapToContainer(field, entityData[field])}\n\t\t\t\t\t\n\t\t\t\t`;\n\t\t\t}\n\n\t\t\treturn `\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t${properties}\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst btnRemove = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-danger with-icon\"\n\t\t\t}, ` Remove`);\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbtnRemove.addEventListener(\"click\", e => {\n\t\t\t\tHelper.states.btnLoadingState(btnRemove, true);\n\n\t\t\t\tconfirmPopup(\n\t\t\t\t\t`Are you sure you want to remove this area? ${area.display_name}`, \n\t\t\t\t\t() => {\n\t\t\t\t\t\tsh_api.areas.remove(\n\t\t\t\t\t\t\tarea.id,\n\t\t\t\t\t\t\t(err, data, meta) => {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tHelper.states.btnLoadingState(btnRemove, false);\n\t\t\t\t\t\t\t\tconsole.log(\"Was removed\");\n\n\t\t\t\t\t\t\t\tmodal.close();\n\t\t\t\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t\t\t\t\"Removed\",\n\t\t\t\t\t\t\t\t\t\t`Area: ${area.display_name}`\n\t\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t\t}, 300);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t}, \n\t\t\t\t() => {\n\t\t\t\t\tHelper.states.btnLoadingState(btnRemove, false);\n\t\t\t\t\tconsole.log(\"CANCELED\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ btnCancel, btnRemove ];\n\t\t},\n\t\tonready: modal => {\n\t\t\tplaceInArea(\n\t\t\t\tsh_api,\n\t\t\t\tmodal.querySelector(\".place-in-area-container\"),\n\t\t\t\t\"area\",\n\t\t\t\tarea.id,\n\t\t\t\tarea.parent_id\n\t\t\t);\n\n\t\t\tinitEditedFields(sh_api, area, modal);\n\t\t}\n\t});\n}", "import { sidebarTemplate } from \"./areas-funcs.js\";\nimport { areaDevicesModal } from \"./areas-devices-modal.js\";\nimport { areaActionsModal } from \"./areas-actions-modal.js\";\nimport { createNewAreaModal } from \"./areas-create-new-modal.js\";\nimport { areaDetailsModal } from \"./areas-details-modal.js\";\n\nfunction makeTree(data) {\n\tconst items = data.areas;\n\n\tconst map = {};\n const roots = [];\n\n for (const item of items) {\n map[item.id] = { ...item, children: [] };\n }\n\n for (const item of items) {\n const node = map[item.id];\n\n if (item.parent_id && map[item.parent_id]) {\n map[item.parent_id].children.push(node);\n } else {\n roots.push(node);\n }\n }\n\n return roots;\n}\n\nfunction prepareData(data) {\n\tconst tree = makeTree(data);\n\treturn tree;\n}\n\nfunction renderingBranch(branch, lvl) {\n\tlvl = lvl ?? 0;\n\n\tconst isSingle = branch.children?.length ? \"\" : \"is-single\";\n\tlet html = `\n\t\t
    \n\t\t\t\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t ${branch.display_name}\n\t\t\t\t\t[\n\t\t\t\t\t${branch.type}\n\t\t\t\t\t ${branch.alias}\n\t\t\t\t\t]\n\t\t\t\t
    \n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t`;\n\n\tif(branch.children?.length) {\n\t\tfor(let childBranch of branch.children) {\n\t\t\thtml += renderingBranch(childBranch, lvl + 1);\n\t\t}\n\t}\n\n\treturn html;\n}\n\nfunction renderingAreasTree(scr, tree) {\n\tconsole.log(\"TREE\", tree);\n\tlet html = `
    `;\n\tfor(let branch of tree) {\n\t\thtml += renderingBranch(branch);\n\t}\n\thtml += \"
    \";\n\n\tscr.currentScreen.DOMObject.querySelector(\".main-container .tree-container\").innerHTML = html;\n}\n\nfunction initAreasTree(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".btn.devices\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tareaDevicesModal({ \n\t\t\t\tid: e.currentTarget.dataset.areaId, \n\t\t\t\tdisplay_name: e.currentTarget.dataset.areaName \n\t\t\t}, sh_api).show();\n\t\t});\n\t});\n\n\tscr.currentScreen.DOMObject.querySelectorAll(\".btn.actions\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tareaActionsModal({ \n\t\t\t\tid: e.currentTarget.dataset.areaId, \n\t\t\t\tdisplay_name: e.currentTarget.dataset.areaName \n\t\t\t}, sh_api).show();\n\t\t});\n\t});\n\n\tscr.currentScreen.DOMObject.querySelectorAll(\".btn.details\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tareaDetailsModal({\n\t\t\t\tid: e.currentTarget.dataset.areaId,\n\t\t\t\tdisplay_name: e.currentTarget.dataset.areaName,\n\t\t\t\tparent_id: e.currentTarget.dataset.parentId\n\t\t\t}, sh_api).show();\n\t\t});\n\t});\n\n\tscr.currentScreen.DOMObject.querySelectorAll(\"button.show-childs\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst btn = e.currentTarget;\n\t\t\tconst branch = btn.parentNode;\n\t\t\tconst branchLvl = parseInt(branch.dataset.lvl);\n\n\t\t\tif(!btn.classList.contains(\"opened\")) {\n\t\t\t\tbtn.classList.add(\"opened\");\n\t\t\t\tlet next = branch.nextElementSibling;\n\t\t\t\twhile(next) {\n\t\t\t\t\tconst nextBranchLvl = parseInt(next.dataset.lvl);\n\n\t\t\t\t\tif(nextBranchLvl == branchLvl || nextBranchLvl < branchLvl) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(nextBranchLvl == branchLvl + 1) {\n\t\t\t\t\t\tnext.classList.add(\"a-show\");\n\t\t\t\t\t}\n\n\t\t\t\t\tnext = next.nextElementSibling;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbtn.classList.remove(\"opened\");\n\t\t\t\tlet next = branch.nextElementSibling;\n\t\t\t\twhile(next) {\n\t\t\t\t\tconst nextBranchLvl = parseInt(next.dataset.lvl);\n\n\t\t\t\t\tif(nextBranchLvl == branchLvl || nextBranchLvl < branchLvl) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(nextBranchLvl == branchLvl + 1) {\n\t\t\t\t\t\tnext.classList.remove(\"a-show\");\n\t\t\t\t\t}\n\n\t\t\t\t\tnext = next.nextElementSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t})\n\n\tscr.ready();\n}\n\nfunction areasTree(sh_api) {\n\treturn {\n\t\ttitle: \"Areas Tree\",\n\t\talias: \"areas-tree\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(\n\t\t\t\tsidebarTemplate(\"areas-tree\"), \n\t\t\t\t`
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t

    Areas Tree

    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t`\n\t\t\t);\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.areas.list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.areas.list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\tscr.currentScreen.DOMObject.provideData = {};\n\t\t\t\tif(typeof resp.data != \"undefined\" && typeof resp.data.areas != \"undefined\") {\n\t\t\t\t\tfor(let item of resp.data.areas) {\n\t\t\t\t\t\tscr.currentScreen.DOMObject.provideData[item.id] = item;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\trenderingAreasTree(scr, prepareData(resp.data));\n\t\t\t\tinitAreasTree(scr, sh_api);\n\n\t\t\t\tconst btnCreateNewAreaModal = scr.currentScreen.DOMObject.querySelector(\".create-new-area-modal\");\n\t\t\t\tif(!btnCreateNewAreaModal.classList.contains(\"inited\")) {\n\t\t\t\t\tbtnCreateNewAreaModal.classList.add(\"inited\");\n\t\t\t\t\t\n\t\t\t\t\tbtnCreateNewAreaModal?.addEventListener(\"click\", e => {\n\t\t\t\t\t\tcreateNewAreaModal(sh_api).show();\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tscr.ready();\n\t\t\t});\t\t\t\n\t\t}\n\t}\n}\n\nexport {\n\tareasTree\n}", "import { areasTree } from \"./areas-tree-screen.js\";\n\nexport default {\n\tareasTree\n}", "import devices from \"./components/screens/devices/devices.js\";\nimport scripts from \"./components/screens/scripts/scripts.js\";\nimport areas from \"./components/screens/areas/areas.js\";\n\nfunction routes(screens, sh_api) {\n\tscreens.add(\"/\", {\n\t\talias: \"home\",\n\t\trenderer: () => {\n\t\t\treturn ``;\n\t\t},\n\t\tiniter: scr => {\n\t\t\tdocument.location = \"/#!/areas/tree\";\n\t\t}\n\t});\n\n\tscreens.add(\"-\", {\n\t\talias: \"not-found-screen\",\n\t\trenderer: () => {\n\t\t\treturn `

    404 NOT FOUND

    `;\n\t\t},\n\t\tiniter: scr => {\n\t\t\tscr.ready();\n\t\t}\n\t});\n\n\tscreens.add(\"/devices\", devices.list(sh_api));\n\tscreens.add(\"/devices/scanning\", devices.scanning(sh_api));\n\tscreens.add(\"/scripts/scopes\", scripts.scopes(sh_api));\n\tscreens.add(\"/scripts/regular\", scripts.regular(sh_api));\n\tscreens.add(\"/scripts/actions\", scripts.actions(sh_api));\n\tscreens.add(\"/areas/tree\", areas.areasTree(sh_api));\n}\n\nexport {\n\troutes\n}", "function template(id, title, footer) {\n\treturn `\n\t\t
    \n
    \n\n
    \n
    \n

    ${title}

    \n \n
    \n\n
    \n
    ${footer}
    \n
    \n
    \n\t`;\n}\n\nfunction init(modal, onready) {\n\tmodal.show = function() {\n\t\tdocument.querySelector(\"body\").append(modal);\n\n\t\tsetTimeout(() => {\n\t\t\tmodal.classList.add(\"a-show\");\n\t\t}, 10);\n\t}\n\n\tmodal.close = function() {\n\t\tmodal.classList.add(\"a-hide\");\n\t\tsetTimeout(() => {\n\t\t\tmodal.remove();\n\t\t}, 300);\n\t}\n\n\tmodal.querySelector(\".modal-close\").addEventListener(\"click\", e => {\n\t\tmodal.close();\n\t});\n\n\tif(typeof onready == \"function\") {\n\t\tonready(modal);\n\t}\n\n\treturn modal;\n}\n\n\t/**\n\t * Create new modal window;\n\t * @param {string} id Uniq id (selector)\n\t * @param {string} title Display title\n\t * @param {object} props { body: modal => {}, actions => modal => {} }\n\t * @return {object} DOM object\n\t */\nfunction create(id, props) {\n\tconst title = props.title || \"\";\n\tconst footer = props.footer || \"\";\n\n\tconst div = document.createElement(\"div\");\n\tdiv.innerHTML = template(id, title, footer);\n\tconst modal = div.childNodes[1];\n\n\tconst modalBody = modal.querySelector(\".modal-body\");\n\tconst modalFooter = modal.querySelector(\".modal-footer\");\n\n\tif(typeof props.actions == \"function\") {\n\t\tconst actionsResult = props.actions(modal);\n\n\t\tif(typeof actionsResult[0] == \"object\") {\n\t\t\tconst actions = document.createElement(\"div\");\n\t\t\tactions.classList.add(\"actions\");\n\t\t\tfor(let actionElement of actionsResult) {\n\t\t\t\tactions.append(actionElement);\n\t\t\t}\n\n\t\t\tmodalFooter.append(actions);\n\t\t}\n\t}\n\n\tif(typeof props.body == \"function\") {\n\t\tconst bodyResult = props.body(modal);\n\n\t\tif(typeof bodyResult == \"object\") {\n\t\t\tmodalBody.append(bodyResult);\n\t\t} else if(typeof bodyResult == \"string\") {\n\t\t\tmodalBody.innerHTML = bodyResult;\n\t\t}\n\t}\n\n\treturn init(modal, props?.onready);\n}\n\nexport default {\n\tcreate\n}", "export default function confirmPopup(text, confirmedCb, canceledCb) {\n\tModals.create(\"confirm-popup\", {\n\t\ttitle: `Requires confirmation`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t

    ${text}

    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst buttonNO = Helper.template.createElement(\"button\", { class: \"btn btn-primary\" }, \"NO\");\n\t\t\tconst buttonYES = Helper.template.createElement(\"button\", { class: \"btn btn-warning\" }, \"YES\");\n\n\t\t\tbuttonNO.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t\tcanceledCb();\n\t\t\t});\n\n\t\t\tbuttonYES.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t\tconfirmedCb();\n\t\t\t});\n\n\t\t\treturn [ buttonNO, buttonYES ];\n\t\t}\n\t}).show();\n}", "function scrollToElementInFocus(container) {\n\tconst focus = container.querySelector(\".focus\");\n\tif (!focus) return;\n\n\tconst container_rect = container.getBoundingClientRect();\n\tconst focus_rect = focus.getBoundingClientRect();\n\n\tif (focus_rect.top < container_rect.top) {\n\t\tcontainer.scrollTop -= (container_rect.top - focus_rect.top);\n\t} else if (focus_rect.bottom > container_rect.bottom) {\n\t\tcontainer.scrollTop += (focus_rect.bottom - container_rect.bottom);\n\t}\n}\n\nfunction autoSetState(container) {\n\tconst totalViewed = container.advancedSelect.optionsElements.length - container.querySelectorAll(\".option.hide\").length;\n\tif(totalViewed == 0) {\n\t\tcontainer.advancedSelect.showState(\"not-found\");\n\t} else {\n\t\tcontainer.advancedSelect.showState(\"options\");\n\t}\n}\n\nexport default function advancedSelect(input, options, notFoundText) {\n\tconst container = document.createElement(\"div\");\n\tcontainer.classList.add(\"advanced-select\");\n\n\tlet optionsList = ``;\n\tfor(let optionValue in options) {\n\t\toptionsList += `
    ${options[optionValue]}
    `;\n\t}\n\n\tlet html = `\n\t\t
    \n\t\t\t
    ${notFoundText}
    \n\t\t\t
    ${optionsList}
    \n\t\t
    \n\t`;\n\n\tcontainer.innerHTML = html;\n\n\tconst existsOption = (value, options) => {\n\t\tfor(let optionValue in options) {\n\t\t\tif(options[optionValue] == value) {\n\t\t\t\tconst ret = {};\n\t\t\t\tret[optionValue] = options[optionValue];\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tcontainer.advancedSelect = {\n\t\tisOpened: false,\n\t\toptions: options,\n\t\teventsHandlers: {\n\t\t\topenList: [],\n\t\t\tcloseList: [],\n\t\t\tselected: [],\n\t\t\tchanged: [],\n\t\t},\n\t\topenList: () => {\n\t\t\tcontainer.advancedSelect.isOpened = true;\n\t\t\tcontainer.classList.add(\"a-show\");\n\t\t\tautoSetState(container);\n\t\t\tcontainer.advancedSelect.dispatchEvent(\"openList\");\n\t\t},\n\t\tcloseList: () => {\n\t\t\tcontainer.advancedSelect.isOpened = false;\n\t\t\tcontainer.classList.remove(\"a-show\");\n\t\t\tautoSetState(container);\n\t\t\tcontainer.advancedSelect.dispatchEvent(\"closeList\");\n\t\t},\n\t\tshowState: stateName => {\n\t\t\tif(stateName == \"options\") {\n\t\t\t\tcontainer.querySelector(\".options\").classList.add(\"show\");\n\t\t\t\tcontainer.querySelector(\".not-found\").classList.remove(\"show\");\n\t\t\t} else if(stateName == \"not-found\") {\n\t\t\t\tcontainer.querySelector(\".options\").classList.remove(\"show\");\n\t\t\t\tcontainer.querySelector(\".not-found\").classList.add(\"show\");\n\t\t\t}\n\t\t},\n\t\toptionsElements: container.querySelectorAll(\".option\"),\n\t\tvalue: () => {\n\t\t\tconst option = existsOption(input.value, options);\n\n\t\t\treturn { \n\t\t\t\tinputValue: input.value,\n\t\t\t\tisOption: option ? true : false,\n\t\t\t\toption \n\t\t\t};\n\t\t},\n\t\taddEventListener: (name, handler) => {\n\t\t\tif(typeof container.advancedSelect.eventsHandlers[name] != \"undefined\") {\n\t\t\t\treturn container.advancedSelect.eventsHandlers[name].push(handler);\n\t\t\t}\n\n\t\t\tconsole.error(\"Advanced Select component.\", \"addEventListener()\", \"Invalid event name\");\n\t\t},\n\t\tdispatchEvent: name => {\n\t\t\tif(typeof container.advancedSelect.eventsHandlers[name] == \"undefined\") {\n\t\t\t\treturn console.error(\"Advanced Select component.\", \"dispatchEvent()\", \"Invalid event name\");\n\t\t\t}\n\t\t\t\n\t\t\tfor(let eventHandler of container.advancedSelect.eventsHandlers[name]) {\n\t\t\t\teventHandler(container);\n\t\t\t}\n\t\t}\n\t};\n\n\tinput.setAttribute(\"autocomplete\", \"nope\");\n\n\tinput.advancedSelect = {\n\t\tvalue: () => container.advancedSelect.value()\n\t}\n\n\tinput.addEventListener(\"focus\", e => {\n\t\tcontainer.advancedSelect.openList();\n\t});\n\n\tinput.addEventListener(\"blur\", e => {\n\t\tsetTimeout(() => container.advancedSelect.closeList(), 20);\n\t});\n\n\tinput.addEventListener(\"keydown\", e => {\n\t\tif(e.keyCode == 38) {\n\t\t\t// up\n\t\t\tconst current = container.querySelector(\".option.focus\");\n\t\t\tif(current) {\n\t\t\t\tcurrent.classList.remove(\"focus\");\n\t\t\t\tlet prev = current.previousElementSibling;\n\n\t\t\t\twhile (prev) {\n\t\t\t\t\tif (!prev.classList.contains(\"hide\")) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tprev = prev.previousElementSibling;\n\t\t\t\t}\n\n\t\t\t\tif(!prev) {\n\t\t\t\t\tprev = container.querySelector(\".option:not(.hide)\");\n\t\t\t\t}\n\n\t\t\t\tprev.classList.add(\"focus\");\n\t\t\t} else {\n\t\t\t\tcontainer.querySelector(\".option:not(.hide):last-child\").classList.add(\"focus\");\n\t\t\t}\n\n\t\t\tscrollToElementInFocus(container);\n\t\t} else if(e.keyCode == 40) {\n\t\t\t// down\n\t\t\tconst current = container.querySelector(\".option.focus\");\n\t\t\tif(current) {\n\t\t\t\tcurrent.classList.remove(\"focus\");\n\t\t\t\tlet next = current.nextElementSibling;\n\n\t\t\t\twhile (next) {\n\t\t\t\t\tif (!next.classList.contains(\"hide\")) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tnext = next.nextElementSibling;\n\t\t\t\t}\n\n\t\t\t\tif(!next) {\n\t\t\t\t\tnext = container.querySelector(\".option:not(.hide)\");\n\t\t\t\t}\n\n\t\t\t\tnext.classList.add(\"focus\");\n\t\t\t} else {\n\t\t\t\tcontainer.querySelector(\".option:not(.hide)\").classList.add(\"focus\");\n\t\t\t}\n\n\t\t\tscrollToElementInFocus(container);\n\t\t} else if(e.keyCode == 13) {\n\t\t\tlet selected = container.querySelector(\".option.focus\");\n\t\t\tif(!selected) return;\n\t\t\tinput.value = selected.dataset.displayValue;\n\t\t\tinput.blur();\n\t\t\tinput.dispatchEvent(new Event(\"input\", { bubbles: true }));\n\t\t\tinput.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\t\t\tcontainer.advancedSelect.dispatchEvent(\"selected\");\n\t\t}\n\t});\n\n\tinput.addEventListener(\"input\", e => {\n\t\tconst val = e.currentTarget.value.toLowerCase();\n\t\tif(val == \"\") {\n\t\t\tcontainer.advancedSelect.optionsElements.forEach(i => i.classList.remove(\"hide\"));\n\t\t} else {\n\t\t\t[ ...container.advancedSelect.optionsElements ]\n\t\t\t\t.filter(i => i.dataset.displayValue.toLowerCase().indexOf(val) != -1)\n\t\t\t\t.forEach(i => i.classList.remove(\"hide\"));\n\n\t\t\t[ ...container.advancedSelect.optionsElements ]\n\t\t\t\t.filter(i => i.dataset.displayValue.toLowerCase().indexOf(val) == -1)\n\t\t\t\t.forEach(i => i.classList.add(\"hide\"));\n\n\t\t\tautoSetState(container);\n\n\t\t\tcontainer.querySelector(\".option.focus\")?.classList.remove(\"focus\");\n\t\t}\n\t});\n\n\tinput.addEventListener(\"change\", e => {\n\t\tcontainer.advancedSelect.dispatchEvent(\"changed\");\n\t});\n\n\t[ ...container.advancedSelect.optionsElements ].forEach(option => {\n\t\toption.addEventListener(\"click\", e => {\n\t\t\tinput.value = e.currentTarget.dataset.displayValue;\n\t\t\tinput.blur();\n\t\t\tinput.dispatchEvent(new Event(\"input\", { bubbles: true }));\n\t\t\tinput.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\t\t\tcontainer.advancedSelect.dispatchEvent(\"selected\");\n\t\t});\n\t});\n\n\treturn container;\n}", "function template(originalText, isMultiString) {\n\tconst placeholder = \"Write something\";\n\tconst input = !isMultiString \n\t\t? ``\n\t\t: ``;\n\n\treturn `\n\t\t
    \n\t\t\t${originalText}\n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t`;\n}\n\nexport default function editableString(stringContainer, isMultiString) {\n\tisMultiString = isMultiString ?? false;\n\n\tconst originalText = stringContainer.innerHTML;\n\n\tconst component = Helper.template.createElement(\"div\", {\n\t\t\"class\": \"component editable-string-component\"\n\t}, template(originalText, isMultiString));\n\n\tstringContainer.innerHTML = \"\";\n\tstringContainer.append(component);\n\n\tconst editBtn = component.querySelector(\".edit-text-btn\");\n\tconst applyBtn = component.querySelector(\".apply-changes-btn\");\n\tconst cancelBtn = component.querySelector(\".cancel-changes-btn\");\n\tconst content = component.querySelector(\".editable-string-content\");\n\tconst editableString = component.querySelector(\".editable-string\");\n\tconst form = component.querySelector(\".editable-string-form\");\n\tconst input = component.querySelector(\".input\");\n\n\tcomponent.editableString = {\n\t\tformIsDisplaying: false,\n\t\tvalue: originalText,\n\t\tinput: input,\n\t\teventsHandlers: {\n\t\t\tonChange: [],\n\t\t\tonSwitch: [],\n\t\t},\n\t\tswitch: () => {\n\t\t\tif(component.formIsDisplaying) {\n\t\t\t\tform.classList.add(\"d-none\");\n\t\t\t\tcontent.classList.remove(\"d-none\");\n\t\t\t\teditableString.innerText = component.editableString.value;\n\t\t\t} else {\n\t\t\t\tform.classList.remove(\"d-none\");\n\t\t\t\tcontent.classList.add(\"d-none\");\n\t\t\t\tinput.value = component.editableString.value;\n\t\t\t}\n\n\t\t\tcomponent.formIsDisplaying = !component.formIsDisplaying;\n\t\t\tcomponent.editableString.runEventHandler(\"onSwitch\");\n\t\t},\n\t\tsetValue: val => {\n\t\t\tcomponent.editableString.value = val;\n\t\t\tinput.value = val;\n\t\t\teditableString.innerText = val;\n\t\t},\n\t\tapply: () => {\n\t\t\tcomponent.editableString.value = input.value;\n\t\t\tcomponent.editableString.switch();\n\t\t\tif(input.value != originalText) {\n\t\t\t\tcomponent.editableString.runEventHandler(\"onChange\");\n\t\t\t}\n\t\t},\n\t\tonChange: cb => {\n\t\t\tcomponent.editableString.eventsHandlers.onChange.push(cb);\n\t\t},\n\t\tonSwitch: cb => {\n\t\t\tcomponent.editableString.eventsHandlers.onSwitch.push(cb);\n\t\t},\n\t\trunEventHandler: evName => {\n\t\t\tcomponent.editableString.eventsHandlers[evName].forEach(handler => handler(component.editableString));\n\t\t} \n\t}\n\n\teditBtn.addEventListener(\"click\", e => {\n\t\tcomponent.editableString.switch();\n\t});\n\n\tcancelBtn.addEventListener(\"click\", e => {\n\t\tcomponent.editableString.switch();\n\t});\n\n\tapplyBtn.addEventListener(\"click\", e => {\n\t\tcomponent.editableString.apply();\n\t});\n\n\tinput.addEventListener(\"keydown\", e => {\n\t\tif(e.keyCode == 13) {\n\t\t\tinput.blur();\n\t\t\tcomponent.editableString.apply();\n\t\t}\n\t});\n\n\treturn component;\n}", "import { hud, navigationShow, navigationHide } from \"./components/hud.js\";\nimport { Screens } from \"./components/Screens.js\";\nimport { DataProvider } from \"./DataProvider.js\";\nimport Toasts from \"./components/toasts.js\"\nimport Helper from \"./components/helper.js\"\nimport { SmartHomeApi } from \"./sh/SmartHomeApi.js\";\nimport { routes } from \"./routes.js\";\nimport Modals from \"./components/modals.js\";\nimport confirmPopup from \"./components/confirm-popup.js\";\nimport advancedSelect from \"./components/advanced-select.js\";\nimport editableString from \"./components/editable-string.js\";\n\ndocument.addEventListener(\"DOMContentLoaded\", e => {\n\tconsole.log(\"App init\");\n\n\tif(document.location.hash.indexOf(\"#!/\") == -1) {\n\t\tdocument.location.hash = \"#!/\";\n\t}\n\n\twindow.DataProvider = new DataProvider();\n\twindow.Toasts = Toasts;\n\twindow.Helper = Helper;\n\twindow.Modals = Modals;\n\twindow.confirmPopup = confirmPopup;\n\twindow.advancedSelect = advancedSelect;\n\twindow.editableString = editableString;\n\n\thud();\n\tconst sh_api = new SmartHomeApi({\n\t base_url: API_BASEURL,\n\t token: \"YOUR_TOKEN\",\n\t timeout_ms: 10000,\n\t on_unauthorized: ({ error }) => console.log(\"auth problem:\", error),\n\t proxy_path: \"/proxy.php\",\n\t});\n\n\tconst screens = new Screens(\".screens\", \".load-screen\", \".error-screen\");\n\t\n\troutes(screens, sh_api);\n\n\tconsole.log(screens.getScreens());\n\n\tscreens.onSwitch((scr, alias) => {\n\t\tnavigationHide();\n\t});\n\n\tscreens.onSwitch((scr, alias, route) => {\n\t\tdocument.querySelectorAll(`.app .hud .navigation .nav-link[data-route].active`).forEach(item => item.classList.remove(\"active\"));\n\t\tdocument.querySelector(`.app .hud .navigation .nav-link[data-route=\"${route}\"]`)?.classList.add(\"active\");\n\t});\n\n\tscreens.routing();\n\n\twindow.Screens = screens;\n});"], - "mappings": "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", - "names": ["navToggleBtn", "navigation", "reloadScreenBtn", "navigationShow", "navigationHide", "hud", "e", "Screens", "screensContainerSelector", "loaderSelector", "errorScreenSelector", "route", "screen", "__spreadValues", "alias", "_a", "screenContainer", "title", "text", "cb", "handler", "DataProvider", "name", "data", "template", "type", "icon", "title", "text", "init", "toast", "props", "i", "e", "scr", "alias", "lifetimeInterval", "create", "div", "createSuccess", "createInfo", "createWarning", "createError", "toasts_default", "sidebarNav", "items", "listItems", "item", "aOpen", "aClose", "table", "caption", "columns", "data", "tfoot", "head", "totalColumns", "key", "body", "column", "foot", "tableCaption", "tableHead", "createElement", "type", "props", "content", "node", "value", "createAlert", "deviceFieldsUnification", "map", "dataObj", "field", "btnLoadingState", "btn", "isLoading", "cardScriptActionLoadingState", "card", "iconContainer", "mainTemplate", "sidebar", "connectionStatusBadge", "status", "toogleStateBadge", "state", "timeAgo", "dateString", "date", "diff_seconds", "minutes", "hours", "days", "remain_minutes", "formatDate", "now", "today", "target_day", "diff_days", "months", "circleLoaderHTML", "emptyHereHTML", "helper_default", "ScriptsApi", "core", "cb", "err", "resp", "meta", "_a", "item", "id", "filename", "safe", "payload", "alias", "name", "target_id", "DevicesApi", "core", "cb", "err", "resp", "meta", "item", "payload", "id", "safe", "target_id", "AreasApi", "core", "cb", "err", "resp", "meta", "item", "area_id", "safe", "payload", "target_id", "build_query", "params", "usp", "k", "v", "s", "join_url", "base_url", "path", "b", "p", "safe_json_parse", "text", "SmartHomeApi", "opts", "ScriptsApi", "DevicesApi", "AreasApi", "token", "proxy_path", "extra_query", "q", "__spreadValues", "method", "body", "cb", "callback", "url", "controller", "timeout_ms", "t", "headers", "payload", "res", "__async", "meta", "parsed", "data", "err", "_", "st", "e", "api_path", "sidebarTemplate", "active", "rebootDeviceBtnHandler", "sh_api", "btn", "modal", "deviceId", "deviceName", "deviceAlias", "err", "data", "meta", "selector", "container", "loadedAreas", "currentParentAreaId", "sh_api", "type", "typeMap", "setServerCurrentSelectedAreaName", "currentAreaDisplayContainer", "area", "autoDisplayingRmParentIdBtn", "removeParentAreaId", "targetId", "err", "resp", "meta", "hidePlaceInAreaSelector", "placeInAreaRequest", "payload", "loadAreasList", "changePlaceCb", "areas", "item", "advs", "self", "formContainer", "btn", "placeInArea", "_sh_api", "_container", "_type", "_currentParentAreaId", "advSelect", "areasList", "value", "areaId", "e", "renderingByType", "alias", "deviceResp", "channels", "channel", "channelState", "channelStateClass", "chId", "channelClassMap", "dynamics", "presence", "temperature", "humidity", "pressure", "light", "noise", "initEventHandlers", "component", "stateRendering", "deviceType", "deviceAlias", "deviceResponse", "deviceStateComponent", "sh_api", "deviceId", "err", "resp", "meta", "initEditedFields", "sh_api", "device", "modal", "editedFields", "editedField", "edit", "component", "payload", "err", "resp", "meta", "_a", "_b", "_c", "deviceDetailsPopup", "fieldClassMap", "wrapToContainer", "field", "value", "map", "deviceProperties", "fieldValueClass", "buttonCancel", "buttonReboot", "buttonRemove", "buttonResetup", "buttonReset", "e", "rebootDeviceBtnHandler", "data", "deviceId", "placeInArea", "deviceStateComponent", "prepareData", "data", "preparedData", "device", "renderingMainTable", "scr", "total", "initMainTableInteractiveElements", "sh_api", "btn", "e", "rebootDeviceBtnHandler", "__spreadValues", "deviceDetailsPopup", "list", "sidebarTemplate", "err", "resp", "meta", "container", "deviceStateComponent", "deviceSetupFormPopup", "device", "sh_api", "modal", "deviceProperties", "field", "buttonCancel", "e", "buttonSubmit", "inputs", "setupForm", "i", "inputElements", "textareaElement", "input", "err", "resp", "meta", "_a", "_b", "errFieldName", "alertContainer", "prepareData", "data", "preparedData", "device", "renderingMainTable", "scr", "total", "initMainTableInteractiveElements", "sh_api", "btn", "e", "deviceSetupFormPopup", "scanning", "sidebarTemplate", "err", "resp", "meta", "devices_default", "list", "scanning", "sidebarTemplate", "active", "runActionScript", "sh_api", "alias", "cb", "err", "data", "meta", "createActionCardHtml", "action", "setActionCardEventsHandlers", "actionCard", "e", "resultFlag", "createActionCard", "container", "card", "prepareData", "data", "preparedData", "scope", "btnSwitch", "renderingMainTable", "scr", "total", "initMainTableInteractiveElements", "sh_api", "btn", "e", "methName", "err", "meta", "scopes", "sidebarTemplate", "resp", "prepareData", "data", "preparedData", "script", "btnSwitch", "renderingMainTable", "scr", "total", "provideSciptsData", "i", "initMainTableInteractiveElements", "sh_api", "btn", "e", "_a", "methName", "err", "meta", "regular", "sidebarTemplate", "resp", "actionDetailsPopup", "script", "sh_api", "modal", "placeInAreaContainer", "btnCancel", "btnChangeState", "btnRun", "e", "btn", "methName", "err", "data", "meta", "runActionScript", "resultFlag", "placeInArea", "prepareData", "data", "_a", "_b", "_c", "preparedData", "script", "renderingMainGrid", "scr", "total", "grid", "provideSciptsData", "item", "createActionCardHtml", "mainContainer", "initMainGridInteractiveElements", "sh_api", "actionCard", "setActionCardEventsHandlers", "btn", "e", "actionDetailsPopup", "actions", "sidebarTemplate", "err", "resp", "meta", "scripts_default", "scopes", "regular", "actions", "sidebarTemplate", "active", "areaDevicesModal", "area", "sh_api", "modal", "btnCancel", "btnRebootAll", "e", "err", "data", "meta", "devicesContainer", "loader", "prepareDevicesData", "preparedData", "device", "devices", "rebootBtn", "rebootDeviceBtnHandler", "container", "deviceStateComponent", "btn", "__spreadValues", "deviceDetailsPopup", "areaActionsModal", "area", "sh_api", "modal", "btnCancel", "e", "actionsCardsContainer", "loader", "err", "resp", "meta", "actions", "prepareData", "item", "createActionCard", "createNewAreaModal", "sh_api", "modal", "btnCancel", "btnSubmit", "e", "form", "i", "inputElements", "inputs", "input", "err", "resp", "meta", "_a", "_b", "errFieldName", "alertContainer", "types", "type", "initEditedFields", "sh_api", "area", "modal", "editedFields", "editedField", "edit", "component", "payload", "err", "resp", "meta", "_a", "_b", "_c", "areaDetailsModal", "entityData", "fieldClassMap", "wrapToContainer", "field", "value", "map", "properties", "fieldValueClass", "btnCancel", "btnRemove", "e", "data", "placeInArea", "makeTree", "data", "items", "map", "roots", "item", "__spreadProps", "__spreadValues", "node", "prepareData", "renderingBranch", "branch", "lvl", "_a", "_b", "isSingle", "html", "childBranch", "renderingAreasTree", "scr", "tree", "initAreasTree", "sh_api", "btn", "e", "areaDevicesModal", "areaActionsModal", "areaDetailsModal", "branchLvl", "next", "nextBranchLvl", "areasTree", "sidebarTemplate", "err", "resp", "meta", "btnCreateNewAreaModal", "createNewAreaModal", "areas_default", "areasTree", "routes", "screens", "sh_api", "scr", "devices_default", "scripts_default", "areas_default", "template", "id", "title", "footer", "init", "modal", "onready", "e", "create", "props", "div", "modalBody", "modalFooter", "actionsResult", "actions", "actionElement", "bodyResult", "modals_default", "confirmPopup", "text", "confirmedCb", "canceledCb", "modal", "buttonNO", "buttonYES", "e", "scrollToElementInFocus", "container", "focus", "container_rect", "focus_rect", "autoSetState", "advancedSelect", "input", "options", "notFoundText", "optionsList", "optionValue", "html", "existsOption", "value", "ret", "stateName", "option", "name", "handler", "eventHandler", "e", "current", "prev", "next", "selected", "_a", "val", "i", "template", "originalText", "isMultiString", "placeholder", "input", "editableString", "stringContainer", "component", "editBtn", "applyBtn", "cancelBtn", "content", "form", "val", "cb", "evName", "handler", "e", "e", "DataProvider", "toasts_default", "helper_default", "modals_default", "confirmPopup", "advancedSelect", "editableString", "hud", "sh_api", "SmartHomeApi", "error", "screens", "Screens", "routes", "scr", "alias", "navigationHide", "route", "_a", "item"] + "sourcesContent": ["let navToggleBtn;\nlet navigation;\nlet reloadScreenBtn;\n\nfunction navigationShow() {\n\tnavToggleBtn.dataset.navState = \"displayed\";\n\tnavToggleBtn.classList.remove(\"state-off\");\n\tnavToggleBtn.classList.add(\"state-on\");\n\n\tnavigation.classList.add(\"a-show\");\n}\n\nfunction navigationHide() {\n\tnavToggleBtn.dataset.navState = \"hidden\";\n\tnavToggleBtn.classList.remove(\"state-on\");\n\tnavToggleBtn.classList.add(\"state-off\");\n\n\tnavigation.classList.add(\"a-hide\");\n\tnavigation.classList.remove(\"a-show\");\n\n\tsetTimeout(() => {\n\t\tnavigation.classList.remove(\"a-hide\");\n\t}, 300);\n}\n\nfunction hud() {\n\tconsole.log(\"HUD init\");\n\n\tnavToggleBtn = document.querySelector(\".hud .nav-toggle\");\n\tnavigation = document.querySelector(\".hud .navigation\");\n\treloadScreenBtn = document.querySelector(\".hud .reload-screen\");\n\n\tnavToggleBtn?.addEventListener(\"click\", e => {\n\t\tif(e.currentTarget.dataset.navState != \"displayed\") {\n\t\t\tnavigationShow();\n\t\t} else {\n\t\t\tnavigationHide();\n\t\t}\n\t});\n\n\treloadScreenBtn?.addEventListener(\"click\", e => {\n\t\tScreens.reload();\n\t});\n}\n\nexport {\n\thud,\n\tnavigationShow,\n\tnavigationHide\n}", "export class Screens {\n\tconstructor(screensContainerSelector, loaderSelector, errorScreenSelector) {\n\t\tthis.screens = {};\n\t\tthis.routesMap = {};\n\t\tthis.currentScreen = null;\n\t\tthis.eventsHandlers = {\n\t\t\tswitch: [],\n\t\t\treload: [],\n\t\t\treinit: [],\n\t\t\terrorScreen: [],\n\t\t};\n\n\t\tthis.screensContainer = document.querySelector(screensContainerSelector);\n\t\tthis.loader = document.querySelector(loaderSelector);\n\t\tthis.errorScreen = document.querySelector(errorScreenSelector);\n\t\tconsole.log(\"Screens Init\");\n\t}\n\n\t/**\n\t * \u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u0430 \u0438 \u043E\u0431\u044A\u0435\u043A\u0442\u0430 \u0441 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430\u043C\u0438 \u044D\u043A\u0440\u0430\u043D\u0430\n\t * @param {string} route Like `/path/name`\n\t * @param {void} screen {alias, renderer, initer}\n\t */\n\tadd(route, screen) {\n\t\tif(typeof screen != \"object\") {\n\t\t\treturn console.error(\"Screens: screens must be object\");\n\t\t}\n\t\t\n\t\tif(typeof screen?.alias == \"undefined\") {\n\t\t\treturn console.error(\"Screens: undefined alias\");\n\t\t}\n\n\t\tif(typeof screen?.renderer != \"function\") {\n\t\t\treturn console.error(\"Screens: renderer must be function\");\n\t\t}\n\n\t\tthis.screens[screen.alias] = {\n\t\t\troute: route,\n\t\t\t...screen\n\t\t};\n\n\t\tthis.routesMap[route] = screen.alias;\n\t}\n\n\tswitch(alias) {\t\t\n\t\tthis.runSwitchHandlers(alias);\n\t\tthis.hideErrorScreen();\n\t\tthis.showLoader();\n\t\tthis.currentScreen?.DOMObject.remove();\n\t\t\n\t\tif(typeof this.screens[alias] == \"undefined\") {\n\t\t\tconsole.error(`Screens: \"${alias}\" not found`);\n\t\t\treturn ;\n\t\t}\n\n\t\tthis.currentScreen = this.screens[alias];\n\t\t\n\t\tconst screenContainer = document.createElement(\"div\");\n\t\tscreenContainer.classList.add(\"screen\");\n\t\tscreenContainer.id = alias;\n\t\tscreenContainer.dataset.alias = alias;\n\t\tscreenContainer.innerHTML = this.currentScreen.renderer();\n\t\tthis.currentScreen.DOMObject = screenContainer;\n\t\tthis.screensContainer.append(this.currentScreen.DOMObject);\n\n\t\tthis.currentScreen.initer(this);\n\t}\n\n\treload() {\n\t\tif(!this.currentScreen) {\n\t\t\treturn ;\n\t\t}\n\n\t\tthis.runReloadHandlers(this.currentScreen.alias);\n\t\tthis.switch(this.currentScreen.alias);\n\t}\n\n\treinit() {\n\t\tif(!this.currentScreen) {\n\t\t\treturn ;\n\t\t}\n\n\t\tthis.currentScreen.initer(this);\n\t\tthis.runReinitHandlers();\n\t}\n\n\trouting() {\n\t\tsetInterval(() => {\n\t\t\tconst route = document.location.hash.split(\"#!\")[1];\n\t\t\tif(typeof route == \"undefined\" || route == \"\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tconst alias = (typeof this.routesMap[route] == \"undefined\") \n\t\t\t\t? \"not-found-screen\"\n\t\t\t\t: this.routesMap[route];\n\n\t\t\tif(!this.currentScreen || this.currentScreen.alias != alias) {\n\t\t\t\tthis.switch(alias);\n\t\t\t}\n\t\t}, 50);\n\t}\n\n\tready() {\n\t\tif(this.currentScreen == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(!this.currentScreen.DOMObject) {\n\t\t\tthis.currentScreen.DOMObject = document.getElementsById(this.currentScreen.alias);\n\t\t}\n\n\t\tthis.hideLoader();\n\t\tthis.currentScreen.DOMObject.classList.add(\"a-show\");\n\t}\n\n\terror(title, text) {\n\t\tthis.currentScreen?.DOMObject.remove();\n\t\tthis.errorScreen.querySelector(\".error-title\").innerHTML = title;\n\t\tthis.errorScreen.querySelector(\".error-text\").innerHTML = text;\n\t\tthis.showErrorScreen();\n\t\tthis.runErrorScreenHandlers();\n\t}\n\n\thideLoader() {\n\t\tthis.loader.classList.remove(\"a-show\");\n\t}\n\n\tshowLoader() {\n\t\tthis.loader.classList.add(\"a-show\");\n\t}\n\n\tshowErrorScreen() {\n\t\tthis.errorScreen.classList.add(\"a-show\");\n\t}\n\n\thideErrorScreen() {\n\t\tthis.errorScreen.classList.remove(\"a-show\");\n\t}\n\n\tgetScreens() {\n\t\treturn this.screens;\n\t}\n\n\tgetRoutesMap() {\n\t\treturn this.routesMap;\n\t}\n\n\tonSwitch(cb) {\n\t\tthis.eventsHandlers.switch.push(cb);\n\t}\n\n\tonReaload(cb) {\n\t\tthis.eventsHandlers.reload.push(cb);\n\t}\n\n\tonReinit(cb) {\n\t\tthis.eventsHandlers.reinit.push(cb);\n\t}\n\n\tonErrorScreen(cb) {\n\t\tthis.eventsHandlers.errorScreen.push(cb);\n\t}\n\n\trunSwitchHandlers(alias) {\n\t\tconst route = Object.keys(this.routesMap).filter(route => this.routesMap[route] == alias);\n\t\tfor(let handler of this.eventsHandlers.switch) {\n\t\t\thandler(this, alias, route.length ? route[0] : undefined);\n\t\t}\n\t}\n\n\trunReloadHandlers(alias) {\n\t\tfor(let handler of this.eventsHandlers.reload) {\n\t\t\thandler(this, alias);\n\t\t}\n\t}\n\n\trunReinitHandlers() {\n\t\tfor(let handler of this.eventsHandlers.reinit) {\n\t\t\thandler(this);\n\t\t}\n\t}\n\n\trunErrorScreenHandlers() {\n\t\tfor(let handler of this.eventsHandlers.errorScreen) {\n\t\t\thandler(this);\n\t\t}\n\t}\n}", "export class DataProvider {\n\tconstructor() {\n\t\tthis.data = {};\n\t}\n\n\tset(name, data) {\n\t\tthis.data[name] = data;\n\t}\n\n\tget(name) {\n\t\treturn this.data[name];\n\t}\n\n\tsetRaw(name, data) {\n\t\tthis.set(\"raw.\" + name, data);\n\t}\n\n\tgetRaw(name) {\n\t\treturn this.get(\"raw.\" + name);\n\t}\n\n\t/**\n\t * \u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u044B\u0439 \u043A\u043B\u044E\u0447 \u0438\u0437 \u043A\u0435\u0448\u0430.\n\t * \u0412\u044B\u0437\u044B\u0432\u0430\u0442\u044C \u043F\u043E\u0441\u043B\u0435 \u043C\u0443\u0442\u0430\u0446\u0438\u0439 \u2014 \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u043F\u043E\u0441\u043B\u0435 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u044F \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0430.\n\t */\n\tinvalidate(key) {\n\t\tdelete this.data[key];\n\t}\n\n\t/**\n\t * \u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u0441\u0435 \u043A\u043B\u044E\u0447\u0438, \u043D\u0430\u0447\u0438\u043D\u0430\u044E\u0449\u0438\u0435\u0441\u044F \u0441 prefix.\n\t * \u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: invalidatePrefix(\"raw.devices\") \u043E\u0447\u0438\u0449\u0430\u0435\u0442 \u0432\u0435\u0441\u044C \u043A\u0435\u0448 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432.\n\t */\n\tinvalidatePrefix(prefix) {\n\t\tfor (const key of Object.keys(this.data)) {\n\t\t\tif (key.startsWith(prefix)) {\n\t\t\t\tdelete this.data[key];\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * \u0412\u0435\u0440\u043D\u0443\u0442\u044C \u0434\u0430\u043D\u043D\u044B\u0435 \u0438\u0437 \u043A\u0435\u0448\u0430; \u0435\u0441\u043B\u0438 \u0438\u0445 \u043D\u0435\u0442 \u2014 \u0432\u044B\u0437\u0432\u0430\u0442\u044C fetchFn, \u0437\u0430\u043A\u0435\u0448\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438 \u0432\u0435\u0440\u043D\u0443\u0442\u044C.\n\t *\n\t * @param {string} key \u041A\u043B\u044E\u0447 \u0432 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 \"raw.devices.12\"\n\t * @param {function} fetchFn (cb) => void \u2014 \u0434\u043E\u043B\u0436\u043D\u0430 \u0432\u044B\u0437\u0432\u0430\u0442\u044C cb(err, data)\n\t * @param {function} cb (err, data) => void\n\t *\n\t * \u041F\u0440\u0438\u043C\u0435\u0440:\n\t * DataProvider.getOrFetch(\n\t * `raw.devices.${id}`,\n\t * (cb) => sh_api.devices.get(id, (err, resp) => cb(err, resp?.data?.device)),\n\t * (err, device) => { ... }\n\t * );\n\t */\n\tgetOrFetch(key, fetchFn, cb) {\n\t\tconst cached = this.data[key];\n\t\tif (typeof cached !== \"undefined\") {\n\t\t\treturn cb(null, cached);\n\t\t}\n\n\t\tfetchFn((err, data) => {\n\t\t\tif (!err && typeof data !== \"undefined\") {\n\t\t\t\tthis.data[key] = data;\n\t\t\t}\n\t\t\tcb(err, data);\n\t\t});\n\t}\n\n\t/**\n\t * \u0412\u0435\u0440\u043D\u0443\u0442\u044C \u043C\u0430\u0441\u0441\u0438\u0432 \u0432\u0441\u0435\u0445 \u0437\u0430\u043A\u0435\u0448\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439, \u0447\u044C\u0438 \u043A\u043B\u044E\u0447\u0438 \u043D\u0430\u0447\u0438\u043D\u0430\u044E\u0442\u0441\u044F \u0441 prefix.\n\t * \u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: getCollection(\"raw.devices\") \u2192 [device, device, ...]\n\t */\n\tgetCollection(prefix) {\n\t\tconst result = [];\n\t\tfor (const [key, value] of Object.entries(this.data)) {\n\t\t\tif (key.startsWith(prefix)) {\n\t\t\t\tresult.push(value);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n}\n", "function template(type, icon, title, text) {\n\treturn `\n\t\t
    \n\t
    \n\t

    ${icon} ${title}

    \n\t

    ${text}

    \n\t
    \n\t \n\t
    \n\t`;\n}\n\nfunction init(toast, props) {\n\tif(props?.alone) {\n\t\tdocument.querySelectorAll(\".toast\").forEach(i => i.close());\n\t}\n\n\ttoast.close = function() {\n\t\tthis.classList.add(\"a-hide\");\n\t\tsetTimeout(() => {\n\t\t\tthis.remove();\n\t\t}, 300);\n\t}\n\n\ttoast.querySelector(\".toast-close\").addEventListener(\"click\", e => {\n\t\ttoast.close();\n\t});\n\n\ttoast.show = function() {\n\t\tdocument.querySelector(\"body\").append(toast);\n\n\t\tsetTimeout(() => {\n\t\t\ttoast.classList.add(\"a-show\");\n\t\t}, 10);\n\t}\n\n\tif(typeof Screens != \"undefined\") {\n\t\tScreens.onSwitch((scr, alias) => {\n\t\t\tsetTimeout(() => {\n\t\t\t\ttoast?.close();\n\t\t\t}, 10000);\n\t\t});\n\t}\n\n\ttoast.addEventListener(\"mouseover\", e => toast.ishovered = true);\n\ttoast.addEventListener(\"mouseout\", e => toast.ishovered = false);\n\n\tif(props?.lifetime) {\n\t\tconsole.log(props);\n\t\tconst lifetimeInterval = setInterval(() => {\n\t\t\tif(!toast.ishovered) {\n\t\t\t\ttoast.close();\n\t\t\t\tclearInterval(lifetimeInterval);\n\t\t\t}\n\t\t}, props?.lifetime);\n\t}\n\n\treturn toast;\n}\n\nfunction create(type, icon, title, text, props) {\n\tconst div = document.createElement(\"div\");\n\tdiv.innerHTML = template(type, icon, title, text);\n\n\treturn init(div.childNodes[1], props);\n}\n\nfunction createSuccess(title, text, props) {\n\tif(typeof props == \"undefined\") {\n\t\tprops = {};\n\t}\n\n\tif(typeof props.lifetime == \"undefined\") {\n\t\tprops.lifetime = 4000;\n\t}\n\n\tif(typeof props.alone == \"undefined\") {\n\t\tprops.alone = true;\n\t}\n\n\treturn create(\n\t\t\"success\", \n\t\t``, \n\t\ttitle, \n\t\ttext,\n\t\tprops\n\t);\n}\n\nfunction createInfo(title, text, props) {\n\treturn create(\n\t\t\"info\", \n\t\t``, \n\t\ttitle, \n\t\ttext,\n\t\tprops\n\t);\n}\n\nfunction createWarning(title, text, props) {\n\treturn create(\n\t\t\"warning\", \n\t\t``, \n\t\ttitle, \n\t\ttext,\n\t\tprops\n\t);\n}\n\nfunction createError(title, text, props) {\n\treturn create(\n\t\t\"danger\", \n\t\t``, \n\t\ttitle, \n\t\ttext,\n\t\tprops\n\t);\n}\n\nexport default {\n create,\n createInfo,\n createSuccess,\n createWarning,\n createError,\n \"createDanger\": createError\n};", "function sidebarNav(items) {\n\tlet listItems = \"\";\n\n\tfor(let item of items) {\n\t\tlet aOpen = \"\";\n\t\tlet aClose = \"\";\n\t\tif(item.route) {\n\t\t\taOpen = ``;\n\t\t\taClose = ``;\n\t\t}\n\n\t\tlistItems += `\n\t\t\t
  • \n\t\t\t\t${aOpen}${item.content}${aClose}\n\t\t\t
  • \n\t\t`;\n\t}\n\n\treturn `\n\t\t
    \n\t\t\t
      \n\t\t\t\t${listItems} \n\t\t\t
    \n\t\t
    \n\t`;\n}\n\nfunction table(caption, columns, data, tfoot) {\n\tlet head = ``;\n\tlet totalColumns = 0;\n\tfor(let key in columns) {\n\t\thead += `${columns[key]}`;\n\t\ttotalColumns++;\n\t}\n\thead += \"\";\n\n\tlet body = ``;\n\tfor(let item of data) {\n\t\tbody += ``;\n\t\tfor(let column in columns) {\n\t\t\tbody += `${item[column]}`;\n\t\t}\n\t\tbody += ``;\n\t}\n\n\tlet foot = \"\";\n\tif(typeof tfoot != \"undefined\") {\n\t\tfoot = `\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t${tfoot}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t`\n\t}\n\n\tconst tableCaption = caption \n\t\t? `${caption}`\n\t\t: '';\n\n\tconst tableHead = data.length \n\t\t? `${head}`\n\t\t: '';\n\n\tbody = data.length\n\t\t? body\n\t\t: `Empty`;\n\n\tconst tableEmptyClass = !data.length \n\t\t? \"table-empty\"\n\t\t: \"\";\n\n\treturn `\n\t\t
    \n\t\t\t\n\t\t\t\t${tableCaption}\n\t\t\t\t${tableHead}\n\t\t\t\t${body}\n\t\t\t\t${foot}\n\t\t\t
    \n\t\t
    \n\t`;\n}\n\nfunction createElement(type, props, content) {\n\tconst node = document.createElement(type);\n\n\tfor (const [key, value] of Object.entries(props)) {\n\t\tif (key === \"class\") {\n\t\t\tnode.className = value;\n\t\t} else if (key === \"dataset\") {\n\t\t\tObject.assign(node.dataset, value);\n\t\t} else {\n\t\t\tnode.setAttribute(key, value);\n\t\t}\n\t}\n\n\tnode.innerHTML = (typeof content != \"undefined\") ? content : \"\";\n\treturn node; \n}\n\nfunction createAlert(type, content) {\n\tif([\"primary\", \"success\", \"secondary\", \"info\", \"warning\", \"error\", \"danger\"].indexOf(type) < 0) {\n\t\treturn console.error(\"createAlert()\", \"Error of type: \" + type);\n\t}\n\n\treturn createElement(\"div\", {\n\t\tclass: `alert alert-${type}`,\n\t}, content);\n}\n\nfunction deviceFieldsUnification(data) {\n\tconst map = {\n\t\t\"device_name\": \"name\",\n\t\t\"device_hard_id\": \"device_id\",\n\t\t\"device_ip\": \"ip\",\n\t\t\"device_type\": \"type\",\n\t\t\"ip_address\": \"ip\",\n\t\t\"mac_address\": \"mac\",\n\t\t\"device_mac\": \"mac\",\n\t\t\"core_version\": \"firmware_core_version\"\n\t};\n\n\tconst dataObj = {};\n\n\tfor(let field in data) {\n\t\tif(typeof map[field] != \"undefined\") {\n\t\t\tdataObj[ map[field] ] = data[field];\n\t\t\tcontinue;\n\t\t}\n\n\t\tdataObj[field] = data[field];\n\t}\n\n\treturn dataObj;\n}\n\nfunction btnLoadingState(btn, isLoading) {\n\tif(btn?.isLoading == isLoading) {\n\t\treturn false;\n\t}\n\n\tif(isLoading) {\n\t\tbtn.isLoading = true;\n\t\tbtn.originalContent = btn.innerHTML;\n\t\tif(btn.classList.contains(\"with-icon\")) {\n\t\t\tbtn.originalWithIcon = true;\n\t\t} else {\n\t\t\tbtn.classList.add(\"with-icon\");\n\t\t}\n\n\t\tbtn.classList.add(\"loading-state\");\n\t\tbtn.setAttribute(\"disabled\", \"disabled\");\n\t\tbtn.innerHTML = ` Loading`;\n\t} else {\n\t\tbtn.isLoading = false;\n\t\tif(!btn.originalContent) {\n\t\t\treturn false;\n\t\t}\n\t\tbtn.removeAttribute(\"disabled\");\n\t\tbtn.classList.remove(\"loading-state\");\n\t\tif(!btn.originalWithIcon) {\n\t\t\tbtn.classList.remove(\"with-icon\");\n\t\t}\n\t\tbtn.innerHTML = btn.originalContent;\n\t}\n\n\treturn btn;\n}\n\nfunction cardScriptActionLoadingState(card, isLoading) {\n\tif(card?.isLoading == isLoading) {\n\t\treturn false;\n\t}\n\n\tconst iconContainer = card.querySelector(\".device-icon\");\n\n\tif(isLoading) {\n\t\tcard.isLoading = true;\n\t\tcard.originalContent = iconContainer.innerHTML;\n\t\tcard.classList.add(\"loading-state\");\n\t\tcard.setAttribute(\"disabled\", \"disabled\");\n\t\ticonContainer.innerHTML = ``;\n\t} else {\n\t\tcard.isLoading = false;\n\t\tif(!card.originalContent) {\n\t\t\treturn false;\n\t\t}\n\t\tcard.removeAttribute(\"disabled\");\n\t\tcard.classList.remove(\"loading-state\");\n\t\ticonContainer.innerHTML = card.originalContent;\n\t}\n\n\treturn card;\n}\n\nfunction mainTemplate(sidebar, content) {\n\tcontent = content ?? \"\";\n\treturn `\n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t${sidebar}\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t${content}\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t`;\n}\n\nfunction connectionStatusBadge(status) {\n\treturn status == \"active\"\n\t\t? `Online`\n\t\t: `Offline`;\n}\n\nfunction toogleStateBadge(state) {\n\treturn state == \"enabled\"\n\t\t? `Enabled`\n\t\t: `Disabled`;\n}\n\nfunction timeAgo(dateString) {\n\tconst date = new Date(dateString.replace(\" \", \"T\"));\n\tconst now = new Date();\n\n\tconst diff_seconds = Math.floor((now - date) / 1000);\n\n\tif (diff_seconds < 60) {\n\t\treturn \"less than a minute ago\";\n\t}\n\n\tconst minutes = Math.floor(diff_seconds / 60);\n\tconst hours = Math.floor(minutes / 60);\n\tconst days = Math.floor(hours / 24);\n\n\tif (minutes < 60) {\n\t\treturn `${minutes} minute${minutes !== 1 ? \"s\" : \"\"} ago`;\n\t}\n\n\tif (hours < 24) {\n\t\tconst remain_minutes = minutes % 60;\n\t\treturn `${hours} hour${hours !== 1 ? \"s\" : \"\"} ${remain_minutes} minute${remain_minutes !== 1 ? \"s\" : \"\"} ago`;\n\t}\n\n\treturn `${days} day${days !== 1 ? \"s\" : \"\"} ago`;\n}\n\nfunction formatDate(dateString) {\n\tconst date = new Date(dateString.replace(\" \", \"T\"));\n\tconst now = new Date();\n\n\tconst today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n\tconst target_day = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n\n\tconst diff_days = Math.floor((today - target_day) / 86400000);\n\n\tconst hours = String(date.getHours()).padStart(2, \"0\");\n\tconst minutes = String(date.getMinutes()).padStart(2, \"0\");\n\n\tif (diff_days === 0) {\n\t\treturn `Today at ${hours}:${minutes}`;\n\t}\n\n\tif (diff_days === 1) {\n\t\treturn `Yesterday at ${hours}:${minutes}`;\n\t}\n\n\tconst months = [\n\t\t\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"\n\t];\n\n\treturn `${date.getDate()} ${months[date.getMonth()]} ${date.getFullYear()} at ${hours}:${minutes}`;\n}\n\nfunction circleLoaderHTML() {\n\treturn `\n\t\t
    \n\t\t\t\n\t\t\tLoading\n\t\t
    \n\t`;\n}\n\nfunction emptyHereHTML() {\n\treturn `\n\t\t
    \n\t\t\t
    \n\t\t\t

    It's empty here yet

    \n\t\t
    \n\t`;\n}\n\nexport default {\n\ttemplate: {\n\t\tsidebarNav,\n\t\ttable,\n\t\tcreateElement,\n\t\tcreateAlert,\n\t\tmainTemplate,\n\t\tconnectionStatusBadge,\n\t\ttoogleStateBadge,\n\t\tcircleLoaderHTML,\n\t\temptyHereHTML,\n\t},\n\tunification: {\n\t\tdeviceFieldsUnification,\n\t\ttimeAgo,\n\t\tformatDate\n\t},\n\tstates: {\n\t\tbtnLoadingState,\n\t\tcardScriptActionLoadingState\n\t}\n}", "/* =========================\n Scripts module\n========================= */\n\nexport class ScriptsApi {\n\tconstructor(core) {\n\t\tthis.core = core;\n\t}\n\n\t// GET /api/v1/scripts/actions/list\n\tactions_list(cb) {\n\t\treturn this.core.api_get(\"/api/v1/scripts/actions/list\", (err, resp, meta) => {\n\t\t\tif(resp && resp.status && resp.data && resp.data.scripts) {\n\t\t\t\tfor(let item of resp.data.scripts) {\n\t\t\t\t\tconst id = item?.id ?? item.alias;\n\t\t\t\t\tDataProvider.setRaw(`actions_scripts.${id}`, item);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn cb(err, resp, meta);\n\t\t});\n\t}\n\n\t// GET /api/v1/scripts/scopes/list\n\tscopes_list(cb) {\n\t\treturn this.core.api_get(\"/api/v1/scripts/scopes/list\", (err, resp, meta) => {\n\t\t\tif(resp && resp.status && resp.data && resp.data.scopes) {\n\t\t\t\tfor(let item of resp.data.scopes) {\n\t\t\t\t\tDataProvider.setRaw(`scopes.${item.name}`, item);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn cb(err, resp, meta);\n\t\t});\n\t}\n\n\t// GET /api/v1/scripts/regular/list\n\tregular_list(cb) {\n\t\treturn this.core.api_get(\"/api/v1/scripts/regular/list\", (err, resp, meta) => {\n\t\t\tif(resp && resp.status && resp.data && resp.data.scripts) {\n\t\t\t\tfor(let item of resp.data.scripts) {\n\t\t\t\t\tconst id = item?.id ?? item.alias;\n\t\t\t\t\tDataProvider.setRaw(`regular_scripts.${id}`, item);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn cb(err, resp, meta);\n\t\t});\n\t}\n\n\t// GET /api/v1/scripts/scopes/name/{{filename}}\n\tscope_get_by_filename(filename, cb) {\n\t\tconst safe = encodeURIComponent(String(filename || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/scopes/name/${safe}`, cb, {\n\t\t\t// \u0442\u0443\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u043C\u043E\u0436\u0435\u0442 \u0432\u0435\u0440\u043D\u0443\u0442\u044C PHP-\u043A\u043E\u0434 \u0442\u0435\u043A\u0441\u0442\u043E\u043C; request \u0443\u043C\u0435\u0435\u0442 \u044D\u0442\u043E \u043F\u0435\u0440\u0435\u0436\u0438\u0442\u044C\n\t\t});\n\t}\n\n\t// POST /api/v1/scripts/scopes/new\n\tscope_create(payload, cb) {\n\t\t// payload: { alias, filename, path }\n\t\treturn this.core.api_post(\"/api/v1/scripts/scopes/new\", payload, cb);\n\t}\n\n\t// POST /api/v1/scripts/scopes/update\n\tscope_update(payload, cb) {\n\t\t// payload: { name, filename, path }\n\t\treturn this.core.api_post(\"/api/v1/scripts/scopes/update\", payload, cb);\n\t}\n\n\t// GET /api/v1/scripts/actions/alias/{{alias}}/enable\n\taction_enable(alias, cb) {\n\t\tconst safe = encodeURIComponent(String(alias || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/actions/alias/${safe}/enable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/actions/alias/{{alias}}/disable\n\taction_disable(alias, cb) {\n\t\tconst safe = encodeURIComponent(String(alias || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/actions/alias/${safe}/disable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/regular/alias/{{alias}}/enable\n\tregular_enable(alias, cb) {\n\t\tconst safe = encodeURIComponent(String(alias || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/regular/alias/${safe}/enable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/regular/alias/{{alias}}/disable\n\tregular_disable(alias, cb) {\n\t\tconst safe = encodeURIComponent(String(alias || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/regular/alias/${safe}/disable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/scope/name/{{name}}/enable\n\tscope_enable(name, cb) {\n\t\tconst safe = encodeURIComponent(String(name || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/scopes/name/${safe}/enable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/actions/scope/name/{{name}}/disable\n\tscope_disable(name, cb) {\n\t\tconst safe = encodeURIComponent(String(name || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/scopes/name/${safe}/disable`, cb);\n\t}\n\n\t// GET /api/v1/scripts/scopes/name/{{name}}/remove\n\tscope_remove(name, cb) {\n\t\tconst safe = encodeURIComponent(String(name || \"\"));\n\t\treturn this.core.api_get(`/api/v1/scripts/scopes/name/${safe}/remove`, cb);\n\t}\n\n\t// POST /api/v1/scripts/actions/run\n\trun(payload, cb) {\n\t\t// payload: { alias, params: {...} }\n\t\treturn this.core.api_post(\"/api/v1/scripts/actions/run\", payload, cb);\n\t}\n\n\t// POST /api/v1/scripts/place-in-area\n\tplace_in_area(payload, cb) {\n\t\t// payload: { target_id, place_in_area_id }\n\t\treturn this.core.api_post(\"/api/v1/scripts/place-in-area\", payload, cb);\n\t}\n\n\t// GET /api/v1/scripts/id/{{target_id}}/unassign-from-area\n\tunassign_from_area(target_id, cb) {\n\t\tconst safe = encodeURIComponent(String(target_id));\n\t\treturn this.core.api_get(`/api/v1/scripts/id/${safe}/unassign-from-area`, cb);\n\t}\n}", "/* =========================\n Devices module\n========================= */\n\nexport class DevicesApi {\n\tconstructor(core) {\n\t\tthis.core = core;\n\t}\n\n\t// GET /api/v1/devices/list\n\tlist(cb) {\n\t\treturn this.core.api_get(\"/api/v1/devices/list\", (err, resp, meta) => {\n\t\t\tif(resp && resp.status && resp.data && resp.data.devices) {\n\t\t\t\tfor(let item of resp.data.devices) {\n\t\t\t\t\tDataProvider.setRaw(`devices.${item.id}`, item);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn cb(err, resp, meta);\n\t\t});\n\t}\n\n\t// GET /api/v1/devices/scanning/setup\n\tscanning_setup(cb) {\n\t\treturn this.core.api_get(\"/api/v1/devices/scanning/setup\", (err, resp, meta) => {\n\t\t\tif(resp && resp.status && resp.data && resp.data.devices) {\n\t\t\t\tfor(let i in resp.data.devices) {\n\t\t\t\t\tDataProvider.setRaw(`scanning.setup.devices.${i}`, resp.data.devices[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn cb(err, resp, meta);\n\t\t});\n\t}\n\n\t// GET /api/v1/devices/scanning/all\n\tscanning_all(cb) {\n\t\treturn this.core.api_get(\"/api/v1/devices/scanning/all\", (err, resp, meta) => {\n\t\t\tif(resp && resp.status && resp.data && resp.data.devices) {\n\t\t\t\tfor(let i in resp.data.devices) {\n\t\t\t\t\tDataProvider.setRaw(`scanning.devices.${i}`, resp.data.devices[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn cb(err, resp, meta);\n\t\t});\n\t}\n\n\t// POST /api/v1/devices/setup/new-device\n\tsetup_new_device(payload, cb) {\n\t\t// payload: { device_ip, alias, name, description }\n\t\treturn this.core.api_post(\"/api/v1/devices/setup/new-device\", payload, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}/info\n\tinfo(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/info`, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}\n\tget(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}`, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}/status\n\tstatus(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/status`, cb);\n\t}\n\n\t// POST /api/v1/devices/action\n\taction(payload, cb) {\n\t\t// payload: { device_id, action, params }\n\t\treturn this.core.api_post(\"/api/v1/devices/action\", payload, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}/remove\n\tremove(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/remove`, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{id}}/reboot\n\treboot(id, cb) {\n\t\tconst safe = encodeURIComponent(String(id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/reboot`, cb);\n\t}\n\n\t// POST /api/v1/devices/place-in-area\n\tplace_in_area(payload, cb) {\n\t\t// payload: { target_id, place_in_area_id }\n\t\treturn this.core.api_post(\"/api/v1/devices/place-in-area\", payload, cb);\n\t}\n\n\t// GET /api/v1/devices/id/{{target_id}}/unassign-from-area\n\tunassign_from_area(target_id, cb) {\n\t\tconst safe = encodeURIComponent(String(target_id));\n\t\treturn this.core.api_get(`/api/v1/devices/id/${safe}/unassign-from-area`, cb);\n\t}\n\n\t// POST /api/v1/devices/update-name\n\tupdate_name(payload, cb) {\n\t\t// payload: { device_id, name }\n\t\treturn this.core.api_post(\"/api/v1/devices/update-name\", payload, cb);\n\t}\n\n\t// POST /api/v1/devices/update-description\n\tupdate_description(payload, cb) {\n\t\t// payload: { device_id, description }\n\t\treturn this.core.api_post(\"/api/v1/devices/update-description\", payload, cb);\n\t}\n\n\t// POST /api/v1/devices/update-alias\n\tupdate_alias(payload, cb) {\n\t\t// payload: { device_id, new_alias }\n\t\treturn this.core.api_post(\"/api/v1/devices/update-alias\", payload, cb);\n\t}\n\n\t// POST /api/v1/devices/resetup\n\tresetup(payload, cb) {\n\t\t// payload: { device_id }\n\t\treturn this.core.api_post(\"/api/v1/devices/resetup\", payload, cb);\n\t}\n\n\t// POST /api/v1/devices/reset\n\treset(payload, cb) {\n\t\t// payload: { device_id }\n\t\treturn this.core.api_post(\"/api/v1/devices/reset\", payload, cb);\n\t}\n}\n", "export class AreasApi {\n\tconstructor(core) {\n\t\tthis.core = core;\n\t}\n\n\t// GET /api/v1/areas/list\n\tlist(cb) {\n\t\treturn this.core.api_get(\"/api/v1/areas/list\", (err, resp, meta) => {\n\t\t\tif(resp && resp.status && resp.data && resp.data.areas) {\n\t\t\t\tfor(let item of resp.data.areas) {\n\t\t\t\t\tDataProvider.setRaw(`areas.${item.id}`, item);\n\t\t\t\t}\n\t\t\t\tDataProvider.setRaw(\"areas.list\", resp.data);\n\t\t\t}\n\n\t\t\treturn cb(err, resp, meta);\n\t\t});\n\t}\n\n\t// GET /api/v1/areas/id/{{area_id}}/list\n\tinner_list(area_id, cb) {\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/list`, cb);\n\t}\n\n\t// POST /api/v1/areas/new-area\n\tnew_area(payload, cb) {\n\t\t// payload: { type, alias, display_name }\n\t\treturn this.core.api_post(\"/api/v1/areas/new-area\", payload, cb);\n\t}\n\n\t// GET /api/v1/areas/id/{{area_id}}/remove\n\tremove(area_id, cb) {\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/remove`, cb);\n\t}\n\n\t// POST /api/v1/areas/place-in-area\n\tplace_in_area(payload, cb) {\n\t\t// payload: { target_id, place_in_area_id }\n\t\treturn this.core.api_post(\"/api/v1/areas/place-in-area\", payload, cb);\n\t}\n\n\t// POST /api/v1/areas/update-display-name\n\tupdate_display_name(payload, cb) {\n\t\t// payload: { area_id, display_name }\n\t\treturn this.core.api_post(\"/api/v1/areas/update-display-name\", payload, cb);\n\t}\n\n\t// POST /api/v1/areas/update-alias\n\tupdate_alias(payload, cb) {\n\t\t// payload: { area_id, new_alias }\n\t\treturn this.core.api_post(\"/api/v1/areas/update-alias\", payload, cb);\n\t}\n\n\t// GET /api/v1/areas/id/{{area_id}}/devices\n\tdevices(area_id, cb) {\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/devices`, cb);\n\t}\n\n\t// GET /api/v1/areas/id/{{area_id}}/scripts\n\tscripts(area_id, cb) {\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/scripts`, cb);\n\t}\n\n\t// GET /api/v1/areas/id/{{target_id}}/unassign-from-area\n\tunassign_from_area(target_id, cb) {\n\t\tconst safe = encodeURIComponent(String(target_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/unassign-from-area`, cb);\n\t}\n\n\t// GET /api/v1/areas/types/list\n\ttypes_list(cb) {\n\t\treturn this.core.api_get(\"/api/v1/areas/types/list\", cb);\n\t}\n\n\t// GET /api/v1/areas/reboot_devices\n\t// GET /api/v1/areas/id/{{area_id}}/reboot_devices\n\treboot_devices(area_id, cb) {\n\t\tif (area_id === undefined || area_id === null) {\n\t\t\treturn this.core.api_get(\"/api/v1/areas/reboot_devices\", cb);\n\t\t}\n\t\tconst safe = encodeURIComponent(String(area_id));\n\t\treturn this.core.api_get(`/api/v1/areas/id/${safe}/reboot_devices`, cb);\n\t}\n}", "/**\n * smart_home_api.js\n *\n * \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F JS-\u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 \u0434\u043B\u044F REST-\u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 \u043A \u0441\u0435\u0440\u0432\u0435\u0440\u0443 (callback-style).\n * - \u0410\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044F: Bearer token (\u0438\u043B\u0438 \u043A\u0430\u0441\u0442\u043E\u043C\u043D\u044B\u0439 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A, \u0435\u0441\u043B\u0438 \u043F\u043E\u043C\u0435\u043D\u044F\u0435\u0448\u044C)\n * - \u0415\u0434\u0438\u043D\u0430\u044F \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u043E\u0448\u0438\u0431\u043E\u043A: \u0441\u0435\u0442\u0435\u0432\u044B\u0435, \u0442\u0430\u0439\u043C\u0430\u0443\u0442, \u043D\u0435-JSON, \u0441\u0442\u0430\u0442\u0443\u0441=false/error\n * - \u041C\u043E\u0434\u0443\u043B\u0438: \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u043E\u043B\u044C\u043A\u043E Scripts, \u043E\u0441\u0442\u0430\u043B\u044C\u043D\u044B\u0435 \u043F\u043E \u0430\u043D\u0430\u043B\u043E\u0433\u0438\u0438\n */\n\nimport { ScriptsApi } from \"./modules/ScriptsApi.js\";\nimport { DevicesApi } from \"./modules/DevicesApi.js\";\nimport { AreasApi } from \"./modules/AreasApi.js\";\n\n/* =========================\n Utils\n========================= */\n\nfunction build_query(params) {\n\tif (!params || typeof params !== \"object\") return \"\";\n\tconst usp = new URLSearchParams();\n\tObject.entries(params).forEach(([k, v]) => {\n\t\tif (v === undefined || v === null) return;\n\t\tusp.append(k, String(v));\n\t});\n\tconst s = usp.toString();\n\treturn s ? `?${s}` : \"\";\n}\n\nfunction join_url(base_url, path) {\n\tconst b = String(base_url || \"\").replace(/\\/+$/, \"\");\n\tconst p = String(path || \"\").replace(/^\\/+/, \"\");\n\treturn `${b}/${p}`;\n}\n\nfunction safe_json_parse(text) {\n\ttry {\n\t\treturn { ok: true, data: JSON.parse(text) };\n\t} catch (e) {\n\t\treturn { ok: false, error: e };\n\t}\n}\n\n/* =========================\n Core client\n========================= */\n\nexport class SmartHomeApi {\n\t/**\n\t * @param {Object} opts\n\t * @param {string} opts.base_url - \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: http://192.168.2.101\n\t * @param {string} [opts.token] - \u0442\u043E\u043A\u0435\u043D \u0430\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u0438\n\t * @param {number} [opts.timeout_ms=15000]\n\t * @param {Object} [opts.default_headers]\n\t * @param {Function} [opts.on_unauthorized] - cb(details)\n\t * @param {string} [opts.proxy_path] \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 \"/proxy.php\" (\u0432\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0430\u0432\u0442\u043E-\u043F\u0440\u043E\u043A\u0441\u0438)\n\t */\n\tconstructor(opts) {\n\t\tthis.base_url = opts?.base_url || \"\";\n\t\tthis.token = opts?.token || \"\";\n\t\tthis.timeout_ms = Number.isFinite(opts?.timeout_ms) ? opts.timeout_ms : 15000;\n\t\tthis.default_headers = opts?.default_headers || {};\n\t\tthis.on_unauthorized = typeof opts?.on_unauthorized === \"function\" ? opts.on_unauthorized : null;\n\t\tthis.proxy_path = opts?.proxy_path || \"\"; // \"\" => \u0431\u0435\u0437 \u043F\u0440\u043E\u043A\u0441\u0438\n\n\t\t// modules\n\t\tthis.scripts = new ScriptsApi(this);\n\t\tthis.devices = new DevicesApi(this);\n\t\tthis.areas = new AreasApi(this);\n\t}\n\n\tset_base_url(base_url) {\n\t\tthis.base_url = base_url || \"\";\n\t}\n\n\tset_token(token) {\n\t\tthis.token = token || \"\";\n\t}\n\n\tset_proxy_path(proxy_path) {\n\t\tthis.proxy_path = proxy_path || \"\";\n\t}\n\n\t_wrap_path(path, extra_query) {\n\t\t// \u0415\u0441\u043B\u0438 \u0432\u043A\u043B\u044E\u0447\u0451\u043D \u043F\u0440\u043E\u043A\u0441\u0438 \u2014 \u0445\u043E\u0434\u0438\u043C \u043D\u0430 /proxy.php?path=&...\n\t\tif (!this.proxy_path) {\n\t\t\tif (!extra_query) return path;\n\t\t\treturn `${path}${build_query(extra_query)}`;\n\t\t}\n\n\t\tconst q = { path, ...(extra_query || {}) };\n\t\treturn `${this.proxy_path}${build_query(q)}`;\n\t}\n\n\t/**\n\t * \u0423\u043D\u0438\u0444\u0438\u0446\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0437\u0430\u043F\u0440\u043E\u0441.\n\t *\n\t * cb(err, data, meta)\n\t * - err: { type, message, status_code?, raw?, details? }\n\t * - data: \u0440\u0430\u0441\u043F\u0430\u0440\u0441\u0435\u043D\u043D\u044B\u0439 json (\u0438\u043B\u0438 string, \u0435\u0441\u043B\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435 \u0432\u0435\u0440\u043D\u0443\u043B json)\n\t * - meta: { url, method, status_code, headers }\n\t */\n\trequest(method, path, body, cb, opts) {\n\t\tconst callback = typeof cb === \"function\" ? cb : () => {};\n\t\tconst url = join_url(this.base_url, path);\n\n\t\tconst controller = new AbortController();\n\t\tconst timeout_ms = Number.isFinite(opts?.timeout_ms) ? opts.timeout_ms : this.timeout_ms;\n\n\t\tconst t = setTimeout(() => controller.abort(), timeout_ms);\n\n\t\tconst headers = {\n\t\t\t...this.default_headers,\n\t\t\t...(opts?.headers || {}),\n\t\t};\n\n\t\t// \u0410\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044F (\u043F\u043E\u0434\u0441\u0442\u0440\u043E\u0439, \u0435\u0441\u043B\u0438 \u0443 \u0442\u0435\u0431\u044F \u0434\u0440\u0443\u0433\u043E\u0439 \u0444\u043E\u0440\u043C\u0430\u0442)\n\t\tif (this.token) headers[\"Authorization\"] = `Bearer ${this.token}`;\n\n\t\tlet payload = undefined;\n\t\tif (body !== undefined && body !== null) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t\tpayload = JSON.stringify(body);\n\t\t}\n\n\t\tfetch(url, {\n\t\t\tmethod,\n\t\t\theaders,\n\t\t\tbody: payload,\n\t\t\tsignal: controller.signal,\n\t\t})\n\t\t\t.then(async (res) => {\n\t\t\t\tclearTimeout(t);\n\n\t\t\t\tconst meta = {\n\t\t\t\t\turl,\n\t\t\t\t\tmethod,\n\t\t\t\t\tstatus_code: res.status,\n\t\t\t\t\theaders: res.headers,\n\t\t\t\t};\n\n\t\t\t\tconst text = await res.text();\n\t\t\t\tconst parsed = safe_json_parse(text);\n\t\t\t\tconst data = parsed.ok ? parsed.data : text;\n\n\t\t\t\t// HTTP-level \u043E\u0448\u0438\u0431\u043A\u0438\n\t\t\t\tif (!res.ok) {\n\t\t\t\t\tconst err = {\n\t\t\t\t\t\ttype: \"http_error\",\n\t\t\t\t\t\tmessage: `HTTP ${res.status}`,\n\t\t\t\t\t\tstatus_code: res.status,\n\t\t\t\t\t\traw: data,\n\t\t\t\t\t};\n\n\t\t\t\t\tif (res.status === 401 || res.status === 403) {\n\t\t\t\t\t\tif (this.on_unauthorized) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tthis.on_unauthorized({ error: err, meta });\n\t\t\t\t\t\t\t} catch (_) {}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn callback(err, null, meta);\n\t\t\t\t}\n\n\t\t\t\t// API-level \u043E\u0448\u0438\u0431\u043A\u0438 (\u043F\u043E \u0442\u0432\u043E\u0438\u043C \u043F\u0440\u0438\u043C\u0435\u0440\u0430\u043C \u0431\u044B\u0432\u0430\u0435\u0442 status:false \u0438\u043B\u0438 status:\"error\")\n\t\t\t\tif (parsed.ok && data && typeof data === \"object\") {\n\t\t\t\t\tconst st = data.status;\n\t\t\t\t\tif (st === false || st === \"error\") {\n\t\t\t\t\t\tconst err = {\n\t\t\t\t\t\t\ttype: \"api_error\",\n\t\t\t\t\t\t\tmessage: data.message || \"API error\",\n\t\t\t\t\t\t\tstatus_code: res.status,\n\t\t\t\t\t\t\traw: data,\n\t\t\t\t\t\t\tfield: data.field,\n\t\t\t\t\t\t};\n\t\t\t\t\t\treturn callback(err, null, meta);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn callback(null, data, meta);\n\t\t\t})\n\t\t\t.catch((e) => {\n\t\t\t\tclearTimeout(t);\n\n\t\t\t\tconst is_abort = e && (e.name === \"AbortError\" || String(e).includes(\"AbortError\"));\n\t\t\t\tconst err = is_abort\n\t\t\t\t\t? { type: \"timeout\", message: `Timeout after ${timeout_ms}ms` }\n\t\t\t\t\t: { type: \"network_error\", message: e?.message || \"Network error\", details: e };\n\n\t\t\t\treturn callback(err, null, { url, method, status_code: 0, headers: null });\n\t\t\t});\n\t}\n\n\tget(path, cb, opts) {\n\t\treturn this.request(\"GET\", path, null, cb, opts);\n\t}\n\n\tpost(path, body, cb, opts) {\n\t\treturn this.request(\"POST\", path, body, cb, opts);\n\t}\n\n\tapi_get(api_path, cb, extra_query, opts) {\n\t\treturn this.get(this._wrap_path(api_path, extra_query), cb, opts);\n\t}\n\n\tapi_post(api_path, body, cb, extra_query, opts) {\n\t\treturn this.post(this._wrap_path(api_path, extra_query), body, cb, opts);\n\t}\n}\n\n/* =========================\n Example usage\n========================= */\n\n// import { SmartHomeApi } from \"./smart_home_api.js\";\n//\n// const api = new SmartHomeApi({\n// base_url: \"http://192.168.2.101\",\n// token: \"YOUR_TOKEN\",\n// timeout_ms: 20000,\n// on_unauthorized: ({ error }) => console.log(\"auth problem:\", error),\n// });\n//\n// api.scripts.actions_list((err, res) => {\n// if (err) return console.error(\"actions_list error:\", err);\n// console.log(\"actions:\", res);\n// });\n//\n// api.scripts.run({ alias: \"script_alias\", params: { x: 1 } }, (err, res) => {\n// if (err) return console.error(\"run error:\", err);\n// console.log(\"run result:\", res);\n// });\n", "function sidebarTemplate(active) {\n\treturn Helper.template.sidebarNav([\n\t\t{\n\t\t\tcontent: ` Devices`,\n\t\t\troute: \"/#!/devices\",\n\t\t\tis_active: active == \"devices\"\n\t\t},\n\t\t{\n\t\t\tcontent: ` Scanning`,\n\t\t\troute: \"/#!/devices/scanning\",\n\t\t\tis_active: active == \"scanning\"\n\t\t}\n\t]);\n}\n\nfunction rebootDeviceBtnHandler(sh_api, btn, modal) {\n\tHelper.states.btnLoadingState(btn, true);\n\n\tconst deviceId = btn.dataset.deviceId;\n\tconst deviceName = btn.dataset.deviceName;\n\tconst deviceAlias = btn.dataset.deviceAlias;\n\t\n\tsh_api.devices.reboot(\n\t\tdeviceId,\n\t\t(err, data, meta) => {\n\t\t\tHelper.states.btnLoadingState(btn, false);\n\t\t\tconsole.log(\"Reboot done\", err, data, meta);\n\n\t\t\tmodal?.close();\n\n\t\t\tif(data) {\n\t\t\t\tsetTimeout(() => Screens.reinit(), 8000);\n\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\"Reboot successful\",\n\t\t\t\t\t`Device: ${deviceName}
    \n\t\t\t\t\tAlias: ${deviceAlias}`\n\t\t\t\t).show();\n\t\t\t} else {\n\t\t\t\tToasts.createError(\n\t\t\t\t\t\"Reboot failed\",\n\t\t\t\t\t`Device: ${deviceName}
    \n\t\t\t\t\tAlias: ${deviceAlias}`\n\t\t\t\t).show();\n\t\t\t}\n\t\t}\n\t);\n}\n\nexport {\n\tsidebarTemplate,\n\trebootDeviceBtnHandler\n}", "let selector, container, loadedAreas, currentParentAreaId, sh_api, type;\nconst typeMap = {\n\tarea: \"areas\",\n\tdevice: \"devices\",\n\taction: \"scripts\"\n};\n\nfunction setServerCurrentSelectedAreaName() {\n\tconst currentAreaDisplayContainer = selector.querySelector(\".current-area\");\n\n\tconst found = loadedAreas.find(area => area.id == currentParentAreaId);\n\tcurrentAreaDisplayContainer.innerHTML = found\n\t\t? found.display_name\n\t\t: `Area ID ${currentParentAreaId}`;\n\n\tautoDisplayingRmParentIdBtn();\n}\n\nfunction removeParentAreaId(targetId) {\n\tsh_api[typeMap[type]].unassign_from_area(targetId, (err, resp, meta) => {\n\t\tconsole.log(`sh_api[${typeMap[type]}].unassign_from_area`, err, resp, meta);\n\n\t\tif(!resp || resp.data.status) {\n\t\t\treturn Toasts.createError(\n\t\t\t\t`Error of unassigning`,\n\t\t\t\t(!resp) ? `Error of request` : resp.data.error_alias\n\t\t\t).show();\n\t\t}\n\n\t\tDataProvider.invalidate(\"raw.areas.list\");\n\n\t\tcurrentParentAreaId = 0;\n\t\tsetServerCurrentSelectedAreaName();\n\t\thidePlaceInAreaSelector();\n\n\t\tToasts.createSuccess(\n\t\t\t`Successfully unassigning`,\n\t\t\t`Successfully unassigning`\n\t\t).show();\n\n\t\tScreens.reinit();\n\t});\n}\n\nfunction placeInAreaRequest(sh_api, payload) {\n\tsh_api[typeMap[type]].place_in_area(\n\t\tpayload, \n\t\t(err, resp, meta) => {\n\t\t\tconsole.log(\"sh_api.areas.place_in_area\", err, resp, meta);\n\n\t\t\tif(!resp) {\n\t\t\t\treturn console.error(\"Component placeInArea\", err, resp, meta);\n\t\t\t}\n\n\t\t\tif(!resp.status) {\n\t\t\t\treturn console.error(\"Component placeInArea\", err, resp, meta);\n\t\t\t}\n\n\t\t\tconst currentAreaDisplayContainer = selector.querySelector(\".current-area\");\n\n\t\t\tDataProvider.invalidate(\"raw.areas.list\");\n\n\t\t\tToasts.createSuccess(\n\t\t\t\t`Successfully applied`,\n\t\t\t\t`Successfully applied`\n\t\t\t).show();\n\n\t\t\tcurrentParentAreaId = payload.place_in_area_id;\n\t\t\tsetServerCurrentSelectedAreaName();\n\t\t\thidePlaceInAreaSelector();\n\n\t\t\tScreens.reinit();\n\n\t\t\tconsole.log(\"Success\", resp);\n\t\t}\n\t);\n}\n\nfunction loadAreasList(targetId, changePlaceCb) {\n\tDataProvider.getOrFetch(\n\t\t\"raw.areas.list\",\n\t\t(cb) => sh_api.areas.list((err, resp) => cb(err, resp?.data)),\n\t\t(err, data) => {\n\t\t\tif(!data) {\n\t\t\t\treturn console.error(\"sh_api.areas.list\", err);\n\t\t\t}\n\n\t\t\tloadedAreas = data.areas;\n\n\t\t\tsetServerCurrentSelectedAreaName();\n\n\t\t\tconst areas = {};\n\t\t\tfor(let item of data.areas) {\n\t\t\t\tif(type == \"area\" && item.id == targetId) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tareas[item.id] = item.display_name;\n\t\t\t}\n\n\t\t\tconst advs = advancedSelect(\n\t\t\t\tselector.querySelector(\".select-area\"),\n\t\t\t\tareas,\n\t\t\t\t\"Nothing found\"\n\t\t\t);\n\t\t\tselector.querySelector(\".advanced-select-container\").append(advs);\n\n\t\t\tadvs.advancedSelect.addEventListener(\"changed\", self => {\n\t\t\t\tchangePlaceCb(self, data.areas);\n\t\t\t});\n\n\t\t\tcontainer.innerHTML = \"\";\n\t\t\tcontainer.append(selector);\n\t\t}\n\t);\n}\n\nfunction hidePlaceInAreaSelector() {\n\tconst formContainer = selector.querySelector(\".form-container\");\n\tformContainer.classList.remove(\"a-show\");\n\tformContainer.classList.add(\"a-hide\");\n\tsetTimeout(() => formContainer.classList.remove(\"a-hide\"), 300);\n}\n\nfunction autoDisplayingRmParentIdBtn() {\n\tconst btn = selector.querySelector(\".remove-parent-id\");\n\tif(currentParentAreaId == 0) {\n\t\tbtn.classList.add(\"d-none\");\n\t} else {\n\t\tbtn.classList.remove(\"d-none\");\n\t}\n}\n\n/**\n * \u041F\u043E\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0434\u0435\u0432\u0430\u0439\u0441, \u044D\u043A\u0448\u043D \u0438\u043B\u0438 area \u0432 \u0434\u0440\u0443\u0433\u043E\u0439 area\n * @param {[type]} sh_api \n * @param {[type]} container \u0421\u044E\u0434\u0430 \u043C\u044B \u043F\u043E\u043C\u0435\u0441\u0442\u0438\u043C ui \u0434\u043B\u044F \u0432\u044B\u0431\u043E\u0440\u0430 area\n * @param {string} type area | device | action\n * @param {int} targetId ID \u0446\u0435\u043B\u0438, \u043A\u043E\u0442\u043E\u0440\u0443\u044E \u0431\u0443\u0434\u0435\u043C \u043F\u043E\u043C\u0435\u0449\u0430\u0442\u044C \u0432 area\n */\nexport function placeInArea(_sh_api, _container, _type, targetId, _currentParentAreaId) {\n\tsh_api = _sh_api;\n\tcontainer = _container;\n\tcurrentParentAreaId = _currentParentAreaId;\n\ttype = _type;\n\n\tselector = document.createElement(\"div\");\n\tselector.classList.add(\"component\");\n\tselector.classList.add(\"place-in-area-component\");\n\tselector.innerHTML = `\n\t\t\n\t\t\n\t\t\n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t
    \n\t\t
    \n\t`;\n\t\n\tloadAreasList(targetId, (advSelect, areasList) => {\n\t\tconst value = advSelect.advancedSelect.value();\n\t\tif(!value.isOption) {\n\t\t\treturn ;\n\t\t}\n\n\t\tconst areaId = Object.keys(value.option)[0];\n\t\tconst payload = { \n\t\t\ttarget_id: targetId, \n\t\t\tplace_in_area_id: areaId \n\t\t}\n\n\t\tplaceInAreaRequest(sh_api, payload);\n\t});\n\n\tconst formContainer = selector.querySelector(\".form-container\");\n\n\tselector.querySelector(\"button.show-place-in-area\").addEventListener(\"click\", e => {\n\t\tif(formContainer.classList.contains(\"a-show\")) {\n\t\t\tformContainer.classList.remove(\"a-show\");\n\t\t\tformContainer.classList.add(\"a-hide\");\n\t\t\tsetTimeout(() => formContainer.classList.remove(\"a-hide\"), 300);\n\t\t} else {\n\t\t\tformContainer.classList.add(\"a-show\");\n\t\t}\n\t});\n\n\tselector.querySelector(\"button.hide-place-in-area\").addEventListener(\"click\", e => {\n\t\thidePlaceInAreaSelector();\n\t});\n\n\tselector.querySelector(\"button.remove-parent-id\").addEventListener(\"click\", e => {\n\t\tremoveParentAreaId(targetId);\n\t});\n}", "const renderingByType = {\n\trelay: (alias, deviceResp) => {\n\t\tlet channels = \"\";\n\t\tfor(let channel of deviceResp.channels) {\n\t\t\tconst channelState = channel.state == \"off\" ? \"OFF\" : \"ON\";\n\t\t\tconst channelStateClass = channel.state == \"on\" ? \"badge-success\" : \"\";\n\t\t\tconst chId = deviceResp.channels.length > 1 ? `${channel.id}:` : \"\";\n\t\t\tchannels += `\n\t\t\t\t${chId}${channelState}\n\t\t\t`;\n\t\t}\n\n\t\treturn `
    ${channels}
    `;\n\t},\n\n\tbutton: (alias, deviceResp) => {\n\t\tconst channelClassMap = {\n\t\t\tenabled: \"badge-success\",\n\t\t\tdisabled: \"\",\n\t\t\tmute: \"badge-primary-outline\",\n\t\t\twaiting: \"badge-warning\",\n\t\t\terror: \"badge-error\"\n\t\t};\n\n\t\tlet channels = \"\";\n\t\tfor(let channel of deviceResp.channels) {\n\t\t\tchannels += `\n\t\t\t\t${channel.id}:${channel.indicator}\n\t\t\t`;\n\t\t}\n\n\t\treturn `
    ${channels}
    `;\n\t},\n\n\tsensor: (alias, deviceResp) => {\n\t\t/*\n\t\t{\"status\":\"ok\",\"indicators\":\"ok\",\"sensors\":{\n\t\t\t\"light\":{\"online\":true,\"level\":5,\"lux\":240.17,\"percent\":48},\n\t\t\t\"temperature\":{\"online\":true,\"current\":26.44,\"dynamics\":\"constant\",\"dynamics_val\":0},\n\t\t\t\"pressure\":{\"online\":true,\"current\":1000.69,\"dynamics\":\"constant\",\"dynamics_val\":0},\n\t\t\t\"humidity\":{\"online\":true,\"current\":43.02,\"dynamics\":\"constant\",\"dynamics_val\":0},\n\t\t\t\"radar\":{\"online\":true,\"presence\":true,\"activity_score\":1,\"activity_score_current\":1,\"activity_score_dynamics\":\"constant\",\"distance_m\":0},\n\t\t\t\"microphone\":{\"online\":true,\"current_noise\":53,\"noise_level\":7,\"noise_level_dbi\":50,\"noise_dynamics\":\"constant\"}}}\n\t\t */\n\n\t\tconst dynamics = dynamics => {\n\t\t\tswitch(dynamics) {\n\t\t\t\tcase \"increasing\": return ``;\n\t\t\t\tcase \"decreasing\": return ``;\n\t\t\t}\n\n\t\t\treturn ``;\n\t\t};\n\n\t\tconst presence = deviceResp.sensors.radar.presence \n\t\t\t? `${deviceResp.sensors.radar.activity_score}${dynamics(deviceResp.sensors.radar.activity_score_dynamics)}` \n\t\t\t: ''; \n\t\tconst temperature = deviceResp.sensors.temperature.current + \"\u00B0C\" + dynamics(deviceResp.sensors.temperature.dynamics); \n\t\tconst humidity = deviceResp.sensors.humidity.current + \"%\" + dynamics(deviceResp.sensors.humidity.dynamics); \n\t\tconst pressure = deviceResp.sensors.pressure.current + \"hpa\" + dynamics(deviceResp.sensors.pressure.dynamics); \n\t\tconst light = deviceResp.sensors.light.percent + \"%\"; \n\t\tconst noise = deviceResp.sensors.microphone.current_noise + \"dBi\" + dynamics(deviceResp.sensors.microphone.noise_dynamics); \n\n\t\tlet sensors = `\n\t\t\t${presence}\n\t\t\t${temperature}\n\t\t\t${humidity}\n\t\t\t${pressure}\n\t\t\t${light}\n\t\t\t${noise}\n\t\t`;\n\n\t\treturn `
    ${sensors}
    `;\n\t},\n\thatch: (alias, deviceResp) => {\n\t const hatchStateBadge = (deviceResp.hatch.state.indexOf(\"open\") != -1)\n\t \t? `${deviceResp.hatch.state} - ${deviceResp.hatch.position_pct}%`\n\t \t: `${deviceResp.hatch.state}`;\n\n\t return `
    ${hatchStateBadge}
    `;\n\t}\n};\n\nfunction initEventHandlers(component) {\n\tcomponent.addEventListener(\"click\", e => {\n\t\te.currentTarget.deviceStateComponent.create();\n\t});\n}\n\nfunction stateRendering(deviceType, deviceAlias, deviceResponse) {\n\treturn typeof renderingByType[deviceType] != \"undefined\"\n\t\t? renderingByType[deviceType](deviceAlias, deviceResponse)\n\t\t: \"Unknown device type
    \" + JSON.stringify(deviceResponse);\n}\n\nexport default function deviceStateComponent(sh_api, deviceId, deviceType) {\n\tconst component = Helper.template.createElement(\"div\", {\n\t\tclass: \"component device-state-component\"\n\t}, \"\");\n\n\tcomponent.deviceStateComponent = {\n\t\tcreate: () => {\n\t\t\tcomponent.innerHTML = Helper.template.circleLoaderHTML();\n\n\t\t\tsh_api.devices.status(deviceId, (err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.devices.status\", err, resp);\n\n\t\t\t\tif(!resp) {\n\t\t\t\t\tcomponent.innerHTML = `\n\t\t\t\t\t\t Loading Error\n\t\t\t\t\t`;\n\t\t\t\t\treturn console.error(\"deviceStateComponent\", `DeviceID ${deviceId}`);\n\t\t\t\t}\n\n\t\t\t\tcomponent.innerHTML = stateRendering(deviceType, resp.data.device.alias, resp.data.device.device_response);\n\t\t\t\tinitEventHandlers(component);\n\t\t\t});\n\t\t}\n\t}\n\n\tcomponent.deviceStateComponent.create();\n\n\treturn component;\n}", "import { rebootDeviceBtnHandler } from \"./devices-funcs.js\";\nimport { placeInArea } from \"../areas/areas-placeto-component.js\";\nimport deviceStateComponent from \"./device-state-component.js\";\n\nfunction initEditedFields(sh_api, device, modal) {\n\tconst editedFields = [\n\t\t{\n\t\t\tpayloadFieldName: \"name\",\n\t\t\tselector: \".display-name\",\n\t\t\tmethName: \"update_name\",\n\t\t\toriginalValue: device.name,\n\t\t\tisMultiString: false\n\t\t},\n\t\t{\n\t\t\tpayloadFieldName: \"description\",\n\t\t\tselector: \".description\",\n\t\t\tmethName: \"update_description\",\n\t\t\toriginalValue: device.description,\n\t\t\tisMultiString: true\n\t\t},\n\t\t{\n\t\t\tpayloadFieldName: \"new_alias\",\n\t\t\tselector: \".alias\",\n\t\t\tmethName: \"update_alias\",\n\t\t\toriginalValue: device.alias,\n\t\t\tisMultiString: false\n\t\t},\n\t];\n\n\tfor(let editedField of editedFields) {\n\t\tconst edit = editableString(modal.querySelector(editedField.selector));\n\t\tedit.editableString.onChange(component => {\n\t\t\tconst payload = {\n\t\t\t\tdevice_id: device.id,\n\t\t\t};\n\n\t\t\tpayload[editedField.payloadFieldName] = component.value;\n\n\t\t\tsh_api.devices[editedField.methName](payload, (err, resp, meta) => {\n\t\t\t\tif(err || !resp || !resp.status) {\n\t\t\t\t\tconsole.error(`sh_api.devices.${editedField.methName}`, err);\n\t\t\t\t\tedit.editableString.setValue(editedField.originalValue);\n\n\t\t\t\t\treturn Toasts.createError(\n\t\t\t\t\t\terr?.message ?? \"Error updating\", \n\t\t\t\t\t\terr.raw?.msg ?? `Error of ${editedField.payloadFieldName} updating`\n\t\t\t\t\t).show();\n\t\t\t\t}\n\n\t\t\t\tif(resp.status == true) {\n\t\t\t\t\tDataProvider.invalidate(`raw.devices.${device.id}`);\n\t\t\t\t\tScreens.reinit();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n}\n\nexport function deviceDetailsPopup(device, sh_api) {\n\tconsole.log(device);\n\n\treturn Modals.create(\"device-popup\", {\n\t\ttitle: `Device ${device.name}`,\n\t\tbody: modal => {\n\t\t\t/* alias, area_id, connection_status, create_at, description, device_id, \n\t\t\tfirmware_version, id, ip, last_contact, mac, name, status, type, update_at */\n\n\t\t\tconst fieldClassMap = {\n\t\t\t\tarea_id: \"place-in-area-component-container\",\n\t\t\t\tip: \"device-ip\",\n\t\t\t\tstate: \"state-container\",\n\t\t\t\tname: \"display-name\",\n\t\t\t\tdescription: \"description\",\n\t\t\t\talias: \"alias-view-container\"\n\t\t\t};\n\n\t\t\tconst wrapToContainer = (field, value) => {\n\t\t\t\tconst map = {\n\t\t\t\t\tip: `{{value}}`,\n\t\t\t\t\tstatus: value => {\n\t\t\t\t\t\tconst map = {\n\t\t\t\t\t\t\tactive: \"badge-success\",\n\t\t\t\t\t\t\tremoved: \"badge-error\",\n\t\t\t\t\t\t\tfreezed: \"badge-warning\" \n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn `${value}`\n\t\t\t\t\t},\n\t\t\t\t\tconnection_status: value => {\n\t\t\t\t\t\tconst badgeClass = value == \"active\" ? \"badge-success\" : \"badge-warning\";\n\t\t\t\t\t\treturn `${value}`\n\t\t\t\t\t},\n\t\t\t\t\tmac: `{{value}}`,\n\t\t\t\t\talias: ` {{value}}`,\n\t\t\t\t\tdevice_id: `{{value}}`,\n\t\t\t\t\tlast_contact: value => Helper.unification.timeAgo(value),\n\t\t\t\t\tcreate_at: value => Helper.unification.formatDate(value),\n\t\t\t\t\tupdate_at: value => Helper.unification.formatDate(value),\n\t\t\t\t}\n\n\t\t\t\treturn map[field] \n\t\t\t\t\t? (typeof map[field] == \"function\" ? map[field](value) : map[field].replaceAll(\"{{value}}\", value))\n\t\t\t\t\t: value; \n\t\t\t}\n\n\t\t\tlet deviceProperties = \"\";\n\t\t\tfor(let field in device) {\n\t\t\t\tlet fieldValueClass = fieldClassMap[field] ?? \"\";\n\n\t\t\t\tdeviceProperties += `\n\t\t\t\t\t\n\t\t\t\t\t\t${field}: \n\t\t\t\t\t\t${wrapToContainer(field, device[field])}\n\t\t\t\t\t\n\t\t\t\t`;\n\t\t\t}\n\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t${deviceProperties}\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst buttonCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst buttonReboot = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-warning with-icon\"\n\t\t\t}, ' Reboot');\n\n\t\t\tconst buttonRemove = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-danger with-icon\"\n\t\t\t}, ' Remove');\n\n\t\t\tconst buttonResetup = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-secondary with-icon\"\n\t\t\t}, ' ReSetup');\n\n\t\t\tconst buttonReset = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-danger with-icon\"\n\t\t\t}, ' Reset');\n\n\t\t\tbuttonCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbuttonReboot.dataset.deviceId = device.id;\n\t\t\tbuttonReboot.dataset.deviceName = device.name;\n\t\t\tbuttonReboot.dataset.deviceAlias = device.alias;\n\n\t\t\tbuttonReboot.addEventListener(\"click\", e => {\n\t\t\t\tif(buttonReboot.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn ;\n\t\t\t\t}\n\n\t\t\t\trebootDeviceBtnHandler(sh_api, e.currentTarget, modal);\n\t\t\t});\n\n\t\t\tbuttonRemove.addEventListener(\"click\", e => {\n\t\t\t\tif(buttonRemove.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tHelper.states.btnLoadingState(buttonRemove, true);\n\t\t\t\tconfirmPopup(\n\t\t\t\t\t\"Are you sure you want to remove this device?\", \n\t\t\t\t\t() => {\n\t\t\t\t\t\tsh_api.devices.remove(\n\t\t\t\t\t\t\tdevice.id,\n\t\t\t\t\t\t\t(err, data, meta) => {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tHelper.states.btnLoadingState(buttonRemove, false);\n\t\t\t\t\t\t\t\tconsole.log(\"Was removed\");\n\n\t\t\t\t\t\t\t\tDataProvider.invalidate(`raw.devices.${device.id}`);\n\t\t\t\t\t\t\t\tmodal.close();\n\t\t\t\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t\t\t\t\"Removed\",\n\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t\tDevice: ${device.name}
    \n\t\t\t\t\t\t\t\t\t\tAlias: ${device.alias}
    \n\t\t\t\t\t\t\t\t\t\tIP: ${device.ip}\n\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t\t}, 300);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t}, \n\t\t\t\t() => {\n\t\t\t\t\tHelper.states.btnLoadingState(buttonRemove, false);\n\t\t\t\t\tconsole.log(\"CANCELED\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tbuttonResetup.dataset.deviceId = device.id;\n\n\t\t\tbuttonResetup.addEventListener(\"click\", e => {\n\t\t\t\tconst deviceId = buttonResetup.dataset.deviceId;\n\n\t\t\t\tHelper.states.btnLoadingState(buttonResetup, true);\n\t\t\t\tconfirmPopup(\n\t\t\t\t\t\"Are you sure you want to repeat setup device?\", \n\t\t\t\t\t() => {\n\t\t\t\t\t\tsh_api.devices.resetup({\n\t\t\t\t\t\t\tdevice_id: deviceId\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(err, data, meta) => {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tHelper.states.btnLoadingState(buttonResetup, false);\n\n\t\t\t\t\t\t\tDataProvider.invalidate(`raw.devices.${device.id}`);\n\t\t\t\t\t\t\tmodal.close();\n\t\t\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t\t\t\"Success\",\n\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\tDevice Id: ${device.name}
    \n\t\t\t\t\t\t\t\t\tAlias: ${device.alias}\n\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t}, 300);\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}, \n\t\t\t\t() => {\n\t\t\t\t\tHelper.states.btnLoadingState(buttonResetup, false);\n\t\t\t\t\tconsole.log(\"CANCELED\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tbuttonReset.dataset.deviceId = device.id;\n\n\t\t\tbuttonReset.addEventListener(\"click\", e => {\n\t\t\t\tconst deviceId = buttonReset.dataset.deviceId;\n\n\t\t\t\tHelper.states.btnLoadingState(buttonReset, true);\n\t\t\t\tconfirmPopup(\n\t\t\t\t\t\"Are you sure you want to RESET device?\", \n\t\t\t\t\t() => {\n\t\t\t\t\t\tsh_api.devices.reset({\n\t\t\t\t\t\t\tdevice_id: deviceId\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(err, data, meta) => {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tHelper.states.btnLoadingState(buttonReset, false);\n\n\t\t\t\t\t\t\tDataProvider.invalidate(`raw.devices.${device.id}`);\n\t\t\t\t\t\t\tmodal.close();\n\t\t\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t\t\t\"Success\",\n\t\t\t\t\t\t\t\t\t`Device Id: ${device.name}
    \n\t\t\t\t\t\t\t\t\tAlias: ${device.alias}`\n\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t}, 300);\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}, \n\t\t\t\t() => {\n\t\t\t\t\tHelper.states.btnLoadingState(buttonReset, false);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ buttonCancel, buttonResetup, buttonReboot, buttonReset, buttonRemove ];\n\t\t},\n\t\tonready: modal => {\n\t\t\tplaceInArea(\n\t\t\t\tsh_api,\n\t\t\t\tmodal.querySelector(\".place-in-area-component-container\"),\n\t\t\t\t\"device\",\n\t\t\t\tdevice.id,\n\t\t\t\tdevice.area_id\n\t\t\t);\n\n\t\t\tmodal.querySelector(\".state-container\").append(deviceStateComponent(sh_api, device.id, device.type));\n\n\t\t\tinitEditedFields(sh_api, device, modal);\n\t\t\t\n\t\t}\n\t});\n}", "import { sidebarTemplate, rebootDeviceBtnHandler } from \"./devices-funcs.js\";\nimport { deviceDetailsPopup } from \"./device-details-popup.js\";\nimport deviceStateComponent from \"./device-state-component.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\tfor(let device of data.devices) {\n\t\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\t\tpreparedData.push({\n\t\t\tdeviceName: device.name,\n\t\t\talias: device.alias,\n\t\t\tconnectionStatus: Helper.template.connectionStatusBadge(device.connection_status),\n\t\t\tstate: `
    `,\n\t\t\tip: `${device.ip}`,\n\t\t\tactions: `\n\t\t\t\t
    \n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t`\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainTable(scr, data, total) {\n\tscr.currentScreen.DOMObject.querySelector(\".main-container\").innerHTML = Helper.template.table(\n\t\t\"Devices list\", \n\t\t{\n\t\t\tdeviceName: \"Device name\", \n\t\t\tconnectionStatus: \"Connect\",\n\t\t\tstate: \"State\",\n\t\t\tip: \"IP\", \n\t\t\tactions: \"Actions\"\n\t\t},\n\t\tdata,\n\t\t`Total: ${total} devices`\n\t);\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".reboot-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tif(e.currentTarget.getAttribute(\"disabled\")) {\n\t\t\t\treturn ;\n\t\t\t}\n\n\t\t\trebootDeviceBtnHandler(sh_api, e.currentTarget);\n\t\t});\n\t});\n\n\tscr.currentScreen.DOMObject.querySelectorAll(\".details-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst device = {\n\t\t\t\tstate: \"\",\n\t\t\t\t...JSON.parse(e.currentTarget.dataset.device)\n\t\t\t}\n\t\t\tdeviceDetailsPopup(device, sh_api).show();\n\t\t});\n\t});\n}\n\nfunction list(sh_api) {\n\treturn {\n\t\talias: \"devices\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"devices\"));\n\t\t},\n\n\t\tiniter: scr => {\n\t\t\ttry {\n\t\t\t\tsh_api.devices.list((err, resp, meta) => {\n\n\t\t\t\t\tif(err || !resp || meta.status_code != 200) {\n\t\t\t\t\t\tthrow \"Err\";\n\t\t\t\t\t}\n\n\t\t\t\t\trenderingMainTable(scr, prepareData(resp.data), resp.data.total);\n\t\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\t\tscr.currentScreen.DOMObject.querySelectorAll(\".device-state-container\").forEach(container => {\n\t\t\t\t\t\tcontainer.append(deviceStateComponent(\n\t\t\t\t\t\t\tsh_api, \n\t\t\t\t\t\t\tcontainer.dataset.deviceId, \n\t\t\t\t\t\t\tcontainer.dataset.deviceType\n\t\t\t\t\t\t));\n\t\t\t\t\t});\n\n\t\t\t\t\tscr.ready();\n\t\t\t\t});\n\t\t\t} catch(e) {\n\t\t\t\t\tconsole.error(\"sh_api.devices.list\", e);\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t}\n\t\t}\n\t};\n}\n\nexport {\n\tlist\n}", "export function deviceSetupFormPopup(device, sh_api) {\n\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\treturn Modals.create(\"device-setup\", {\n\t\ttitle: `Setup new device ${device.ip}`,\n\t\tbody: modal => {\n\n\t\t\tlet deviceProperties = \"\";\n\t\t\tfor(let field in device) {\n\t\t\t\tif(field[0] == \"_\") continue;\n\t\t\t\tdeviceProperties += `\n\t\t\t\t\t\n\t\t\t\t\t\t${field}: \n\t\t\t\t\t\t${device[field]}\n\t\t\t\t\t\n\t\t\t\t`;\n\t\t\t}\n\n\t\t\tconst deviceInfo = `\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t${deviceProperties}\n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t${deviceInfo}\n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst buttonCancel = Helper.template.createElement(\"button\", { class: \"btn btn-primary\" }, \"Cancel\");\n\t\t\tbuttonCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tconst buttonSubmit = Helper.template.createElement(\"button\", \n\t\t\t\t{ class: \"btn btn-success with-icon\" }, \n\t\t\t\t` Setup`\n\t\t\t);\n\n\t\t\tbuttonSubmit.addEventListener(\"click\", e => {\n\t\t\t\tif(e.currentTarget.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst inputs = {\n\t\t\t\t\tdevice_ip: device.ip\n\t\t\t\t};\n\n\t\t\t\tconst setupForm = document.querySelector(\"#device-setup .setup-form\");\n\t\t\t\tsetupForm.querySelectorAll(\"input[type='text']\").forEach(i => {\n\t\t\t\t\ti.dispatchEvent(\n\t\t\t\t\t\tnew Event(\"input\", { bubbles: true })\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tif(setupForm.querySelectorAll(\".label.error\").length) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst inputElements = setupForm.querySelectorAll(\"input\");\n\t\t\t\tconst textareaElement = setupForm.querySelector(\"textarea\");\n\n\t\t\t\tfor(let input of inputElements) {\n\t\t\t\t\tinputs[input.getAttribute(\"name\")] = input.value;\n\t\t\t\t}\n\n\t\t\t\tinputs[textareaElement.getAttribute(\"name\")] = textareaElement.value;\n\n\t\t\t\tHelper.states.btnLoadingState(buttonSubmit, true);\n\t\t\t\t\n\t\t\t\tsh_api.devices.setup_new_device(inputs, (err, resp, meta) => {\n\t\t\t\t\tHelper.states.btnLoadingState(buttonSubmit, false);\n\n\t\t\t\t\tif(err?.type == \"api_error\") {\n\t\t\t\t\t\tconsole.error(\"ERR! sh_api.devices.setup_new_device\", err.raw);\n\n\t\t\t\t\t\tif(err.raw?.failed_fields) {\n\t\t\t\t\t\t\tfor(let errFieldName of err.raw.failed_fields) {\n\t\t\t\t\t\t\t\tmodal.querySelector(`[name=\"${errFieldName}\"]`).parentNode.classList.add(\"error\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\t\t\t\t\t\t\n\n\t\t\t\t\t\tif(err.raw?.msg) {\n\t\t\t\t\t\t\tconst alertContainer = modal.querySelector(\".setup-form .alert-container\");\n\t\t\t\t\t\t\talertContainer.innerHTML = \"\";\n\t\t\t\t\t\t\talertContainer?.append(Helper.template.createAlert( \"error\", err.raw.msg ));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\t\t\t\t\t\n\n\t\t\t\t\tif(!resp) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tinputElements.forEach(i => i.value = \"\");\n\t\t\t\t\ttextareaElement.value = \"\";\n\t\t\t\t\tmodal.close();\n\n\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tToasts.createSuccess(\"Setup successful\", `Added new device ID ${device.device_id}`).show();\n\t\t\t\t\t}, 300);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ buttonCancel, buttonSubmit ];\n\t\t},\n\n\t\tonready: modal => {\n\t\t\tconst setupForm = modal.querySelector(\".setup-form\");\n\t\t\tsetupForm.querySelectorAll(\"input\").forEach(i => {\n\t\t\t\ti.addEventListener(\"input\", e => {\n\t\t\t\t\tif(!e.currentTarget.value.length) {\n\t\t\t\t\t\te.currentTarget.parentNode.classList.add(\"error\");\n\t\t\t\t\t\tif(!e.currentTarget.parentNode.parentNode.querySelector(\".input-info.error\")) {\n\t\t\t\t\t\t\te.currentTarget.parentNode.parentNode.append(Helper.template.createElement(\"div\", {\n\t\t\t\t\t\t\t\tclass: \"input-info error\"\n\t\t\t\t\t\t\t}, ` Field cannot be empty`));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\te.currentTarget.parentNode.classList.remove(\"error\");\n\t\t\t\t\t\te.currentTarget.parentNode.parentNode.querySelector(\".input-info.error\")?.remove();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t})\n}", "import { sidebarTemplate } from \"./devices-funcs.js\";\nimport { deviceSetupFormPopup } from \"./device-setup-form-popup.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\tfor(let device of data.devices) {\n\t\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\t\tpreparedData.push({\n\t\t\tdeviceId: device.device_id,\n\t\t\tdeviceName: device.name,\n\t\t\tdeviceType: device.type,\n\t\t\tstatus: `${device.status}`,\n\t\t\tip: `${device.ip}`,\n\t\t\tmac: `${device.mac}`,\n\t\t\twifiSignal: device.wifi_signal,\n\t\t\tactions: device.status == \"setup\" ? `\n\t\t\t\t\n\t\t\t` : \"\"\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainTable(scr, data, total) {\n\tscr.currentScreen.DOMObject.querySelector(\".main-container\").innerHTML = Helper.template.table(\n\t\t\"Found devices\", \n\t\t{\n\t\t\tdeviceId: \"Device ID\",\n\t\t\tdeviceName: \"Device name\", \n\t\t\tdeviceType: \"Type\", \n\t\t\tstatus: \"Status\", \n\t\t\tip: \"IP\", \n\t\t\tmac: \"Mac\",\n\t\t\twifiSignal: \"Signal\", \n\t\t\tactions: \"Actions\"\n\t\t},\n\t\tdata,\n\t\t`Total: ${total} devices`\n\t);\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".setup-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst device = JSON.parse(e.currentTarget.dataset.device);\n\t\t\tdeviceSetupFormPopup(device, sh_api).show();\n\t\t});\n\t});\n}\n\nfunction scanning(sh_api) {\n\treturn {\n\t\talias: \"devices-scanning\",\n\t\trenderer: () => {\t\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"scanning\"));\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.devices.scanning_all((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.devices.scanning_all\", err, resp);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainTable(scr, prepareData(resp.data), resp.data.devices.length);\n\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\n\t\t}\n\t};\n}\n\nexport {\n\tscanning\n}", "import { list } from \"./devices-list-screen.js\";\nimport { scanning } from \"./devices-scanning-screen.js\";\n\nexport default {\n\tlist,\n\tscanning\n}", "function sidebarTemplate(active) {\n\treturn Helper.template.sidebarNav([\n\t\t{\n\t\t\tcontent: ` Scopes`,\n\t\t\troute: \"/#!/scripts/scopes\",\n\t\t\tis_active: active == \"scopes\"\n\t\t},\n\t\t{\n\t\t\tcontent: ` Actions`,\n\t\t\troute: \"/#!/scripts/actions\",\n\t\t\tis_active: active == \"actions\"\n\t\t},\n\t\t{\n\t\t\tcontent: ` Regular`,\n\t\t\troute: \"/#!/scripts/regular\",\n\t\t\tis_active: active == \"regular\"\n\t\t}\n\t]);\n}\n\nfunction runActionScript(sh_api, alias, cb) {\n\tsh_api.scripts.run({\n\t\talias: alias,\n\t\tparams: {}\n\t}, (err, data, meta) => {\n\t\tif(data) {\n\t\t\tcb(true);\n\n\t\t\tsetTimeout(() => Screens.reinit(), 1000);\n\n\t\t\tsetTimeout(() => Toasts.createSuccess(\n\t\t\t\t`${alias} running`,\n\t\t\t\t`${alias} running success`\n\t\t\t).show(), 300);\n\t\t} else {\n\t\t\tcb(false);\n\n\t\t\tsetTimeout(() => Toasts.createError(\n\t\t\t\t`${alias} failed`,\n\t\t\t\t`${alias} running failed`\n\t\t\t).show(), 300);\n\t\t}\n\t});\n}\n\nfunction createActionCardHtml(action) {\n\tconst cardColor = action.state == \"enabled\" ? \"primary\" : \"warning\";\n\treturn `\n\t\t
    \n\t\t\t${action.name} \n\t\t\t\t\n\t\t\t\n\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t${action.icon}\n\t\t\t\t\t
    \n\t\t\t\t
    \n\n\t\t\t\t
    ${action.description}
    \n\t\t\t
    \n\t\t
    \n\t`;\n}\n\nfunction setActionCardEventsHandlers(sh_api, actionCard) {\n\tactionCard.querySelector(\".card-content\").addEventListener(\"click\", e => {\n\t\tif(actionCard.getAttribute(\"disabled\")) {\n\t\t\treturn ;\n\t\t}\n\n\t\tHelper.states.cardScriptActionLoadingState(actionCard, true);\n\n\t\tconst alias = actionCard.dataset.alias;\n\t\trunActionScript(sh_api, alias, resultFlag => {\n\t\t\tHelper.states.cardScriptActionLoadingState(actionCard, false);\n\n\t\t\tif(resultFlag) {\n\t\t\t\tactionCard.classList.add(\"card-success\");\n\t\t\t\tsetTimeout(() => actionCard.classList.remove(\"card-success\"), 1000);\n\t\t\t}\n\t\t});\n\n\t});\n}\n\nfunction createActionCard(sh_api, action) {\n\tconst container = document.createElement(\"div\");\n\tcontainer.innerHTML = createActionCardHtml(action);\n\tconst card = container.querySelector(\".card\");\n\tsetActionCardEventsHandlers(sh_api, card);\n\n\treturn card;\n}\n\nexport {\n\tsidebarTemplate,\n\trunActionScript,\n\tcreateActionCardHtml,\n\tsetActionCardEventsHandlers,\n\tcreateActionCard,\n}", "import { sidebarTemplate } from \"./scripts-funcs.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\n\tfor(let scope of data.scopes) {\n\t\tconst btnSwitch = scope.state == \"disabled\"\n\t\t\t? ``\n\t\t\t: ``;\n\n\t\tpreparedData.push({\n\t\t\tname: scope.name,\n\t\t\tfilename: `${scope.filename}
    ${scope.path}`,\n\t\t\tstate: Helper.template.toogleStateBadge(scope.state),\n\t\t\tactions: `\n\t\t\t\t${btnSwitch}\n\t\t\t`\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainTable(scr, data, total) {\n\tscr.currentScreen.DOMObject.querySelector(\".main-container\").innerHTML = Helper.template.table(\n\t\t\"Scopes list\", \n\t\t{\n\t\t\tname: \"Scope name\", \n\t\t\tfilename: \"Filename\", \n\t\t\tstate: \"State\", \n\t\t\tactions: \"Actions\"\n\t\t},\n\t\tdata,\n\t\t`Total: ${total} scopes`\n\t);\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".change-state-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst btn = e.currentTarget;\n\t\t\tif(btn.getAttribute(\"disabled\")) {\n\t\t\t\treturn ;\n\t\t\t}\n\n\t\t\tconst methName = btn.dataset.value == \"enable\"\n\t\t\t\t? \"scope_enable\"\n\t\t\t\t: \"scope_disable\"\n\n\t\t\tconst scope = JSON.parse(btn.dataset.scope);\n\t\t\tHelper.states.btnLoadingState(btn, true);\n\t\t\tsh_api.scripts[methName](scope.name, (err, data, meta) => {\n\t\t\t\tHelper.states.btnLoadingState(btn, false);\n\n\t\t\t\tif(data) {\n\t\t\t\t\tsetTimeout(() => Screens.reinit(), 250);\n\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t`Request Success`,\n\t\t\t\t\t\t`State of ${scope.name} was changed`\n\t\t\t\t\t).show();\n\t\t\t\t} else {\n\t\t\t\t\tToasts.createError(\n\t\t\t\t\t\t\"Request failed\",\n\t\t\t\t\t\t`Scope state not changed`\n\t\t\t\t\t).show();\n\t\t\t\t}\n\n\t\t\t});\n\t\t});\n\t});\n}\n\nfunction scopes(sh_api) {\n\treturn {\n\t\ttitle: \"Scripts Scopes\",\n\t\talias: \"scripts-scopes\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"scopes\"));\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.scripts.scopes_list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.scripts.scopes_list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainTable(scr, prepareData(resp.data), resp.data.total);\n\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\t\t\t\n\t\t}\n\t}\n}\n\nexport {\n\tscopes\n}", "import { sidebarTemplate } from \"./scripts-funcs.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\n\tfor(let script of data.scripts) {\n\t\tconst btnSwitch = script.state == \"disabled\"\n\t\t\t? ``\n\t\t\t: ``;\n\n\t\tpreparedData.push({\n\t\t\talias: `${script.alias}
    by ${script.created_by}`,\n\t\t\tname: `${script.name}
    ${script.description}
    `,\n\t\t\tfilename: `${script.filename}
    ${script.path}`,\n\t\t\tstate: Helper.template.toogleStateBadge(script.state),\n\t\t\tactions: `\n\t\t\t\t${btnSwitch}\n\t\t\t`\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainTable(scr, data, total) {\n\tconst provideSciptsData = {};\n\tfor(let i in data) {\n\t\tprovideSciptsData[data[i].alias] = data[i];\n\t\tdata[i][\"code\"] = \"\";\n\t}\n\tscr.currentScreen.DOMObject.provideSciptsData = provideSciptsData;\n\n\tscr.currentScreen.DOMObject.querySelector(\".main-container\").innerHTML = Helper.template.table(\n\t\t\"Regular scripts list\", \n\t\t{\n\t\t\talias: \"Alias\", \n\t\t\tname: \"Script name\", \n\t\t\tfilename: \"Filename\", \n\t\t\tstate: \"State\", \n\t\t\tactions: \"Actions\"\n\t\t},\n\t\tdata,\n\t\t`Total: ${total} scripts`\n\t);\n}\n\nfunction initMainTableInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".change-state-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst btn = e.currentTarget;\n\t\t\tif(btn.getAttribute(\"disabled\")) {\n\t\t\t\treturn ;\n\t\t\t}\n\n\t\t\tconst methName = btn.dataset.value == \"enable\"\n\t\t\t\t? \"regular_enable\"\n\t\t\t\t: \"regular_disable\"\n\n\t\t\tconst script = scr.currentScreen.DOMObject.provideSciptsData[btn.dataset.alias] ?? { alias: btn.dataset.alias };\n\n\t\t\tHelper.states.btnLoadingState(btn, true);\n\t\t\tsh_api.scripts[methName](script.alias, (err, data, meta) => {\n\t\t\t\tHelper.states.btnLoadingState(btn, false);\n\n\t\t\t\tif(data) {\n\t\t\t\t\tsetTimeout(() => Screens.reinit(), 250);\n\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t`Request Success`,\n\t\t\t\t\t\t`State of ${script.alias} was changed`\n\t\t\t\t\t).show();\n\t\t\t\t} else {\n\t\t\t\t\tToasts.createError(\n\t\t\t\t\t\t\"Request failed\",\n\t\t\t\t\t\t`Regular script state not changed`\n\t\t\t\t\t).show();\n\t\t\t\t}\n\n\t\t\t});\n\t\t});\n\t});\n}\n\nfunction regular(sh_api) {\n\treturn {\n\t\ttitle: \"Scripts Regular\",\n\t\talias: \"scripts-regular\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"regular\"));\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.scripts.regular_list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.scripts.regular_list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainTable(scr, prepareData(resp.data), resp.data.total);\n\t\t\t\tinitMainTableInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\t\t\t\n\t\t}\n\t}\n}\n\nexport {\n\tregular\n}", "import { runActionScript } from \"./scripts-funcs.js\";\nimport { placeInArea } from \"../areas/areas-placeto-component.js\";\n\nexport function actionDetailsPopup(script, sh_api) {\n\tconsole.log(\"actionDetailsPopup\", script);\n\n\treturn Modals.create(\"action-script-popup\", {\n\t\ttitle: `${script.name}`,\n\t\tbody: modal => {\n\t\t\tconst placeInAreaContainer = (script.area_id != -1) \n\t\t\t\t? `
    `\n\t\t\t\t: \"\";\n\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t

    ${script.alias}

    \n\t\t\t\t\t\t\t
    ${script.description}
    \n\t\t\t\t\t\t\t
    ${Helper.template.toogleStateBadge(script.state)}
    \n\t\t\t\t\t\t\t${placeInAreaContainer}\n\t\t\t\t\t\t\t
    ${script.filename}
    \n\t\t\t\t\t\t\t
    By ${script.author}
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    ${script.code}
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst btnChangeState = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: script.state == \"enabled\" ? \"btn btn-warning\" : \"btn btn-success\",\n\t\t\t\t\"data-value\": script.state == \"enabled\" ? \"disable\" : \"enable\"\n\t\t\t}, script.state == \"enabled\" ? `Disable` : \"Enable\");\n\n\n\t\t\tconst btnRun = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-secondary with-icon\"\n\t\t\t}, ` Run`);\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbtnChangeState.addEventListener(\"click\", e => {\n\t\t\t\tconst btn = e.currentTarget;\n\t\t\t\tif(btn.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn ;\n\t\t\t\t}\n\n\t\t\t\tconst methName = btn.dataset.value == \"enable\"\n\t\t\t\t\t? \"action_enable\"\n\t\t\t\t\t: \"action_disable\"\n\n\t\t\t\t// const script = scr.currentScreen.DOMObject.provideSciptsData[btn.dataset.alias] ?? {};\n\n\t\t\t\tHelper.states.btnLoadingState(btn, true);\n\t\t\t\tsh_api.scripts[methName](script.alias, (err, data, meta) => {\n\t\t\t\t\tHelper.states.btnLoadingState(btn, false);\n\t\t\t\t\tmodal.close();\n\n\t\t\t\t\tif(data) {\n\t\t\t\t\t\tsetTimeout(() => Screens.reinit(), 250);\n\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t`Request Success`,\n\t\t\t\t\t\t\t`State of ${script.alias} was changed`\n\t\t\t\t\t\t).show();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tToasts.createError(\n\t\t\t\t\t\t\t\"Request failed\",\n\t\t\t\t\t\t\t`Regular script state not changed`\n\t\t\t\t\t\t).show();\n\t\t\t\t\t}\n\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tbtnRun.addEventListener(\"click\", e => {\n\t\t\t\tconst btn = e.currentTarget;\n\t\t\t\tHelper.states.btnLoadingState(btn, true);\n\n\t\t\t\trunActionScript(sh_api, script.alias, resultFlag => {\n\t\t\t\t\tHelper.states.btnLoadingState(btn, false);\n\t\t\t\t\tif(resultFlag) {\n\t\t\t\t\t\tmodal.close();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ btnCancel, btnChangeState, btnRun ];\n\t\t},\n\t\tonready: modal => {\n\t\t\tplaceInArea(\n\t\t\t\tsh_api,\n\t\t\t\tmodal.querySelector(\".place-in-area-component-container\"),\n\t\t\t\t\"action\",\n\t\t\t\tscript.id,\n\t\t\t\tscript.area_id\n\t\t\t);\n\n\t\t\thljs.highlightElement(modal.querySelector(\".code-viewer\"));\n\t\t}\n\t});\n}", "import { \n\tsidebarTemplate, \n\trunActionScript, \n\tsetActionCardEventsHandlers, \n\tcreateActionCardHtml,\n} from \"./scripts-funcs.js\";\nimport { actionDetailsPopup } from \"./scripts-action-popup.js\";\n\nfunction prepareData(data) {\n\tconst preparedData = [];\n\n\tfor(let script of data.scripts) {\n\t\tpreparedData.push({\n\t\t\talias: script.alias,\n\t\t\tauthor: script.created_by,\n\t\t\tname: script.name,\n\t\t\ticon: script.icon ?? '',\n\t\t\tdescription: script.description,\n\t\t\tfilename: `${script.filename}
    ${script.path}`,\n\t\t\tstate: script.state,\n\t\t\tcode: script.code,\n\t\t\tid: script.id ?? 0,\n\t\t\tarea_id: script.area_id ?? -1\n\t\t});\n\t}\n\n\treturn preparedData;\n}\n\nfunction renderingMainGrid(scr, data, total) {\n\tlet grid = `
    `;\n\n\tconst provideSciptsData = {};\n\n\tfor(let item of data) {\n\t\tprovideSciptsData[item.alias] = item;\n\t\tgrid += createActionCardHtml(item);\n\t}\n\tgrid += `
    `;\n\n\tconst mainContainer = scr.currentScreen.DOMObject.querySelector(\".main-container\");\n\tmainContainer.innerHTML = grid;\n\tscr.currentScreen.DOMObject.provideSciptsData = provideSciptsData;\n}\n\nfunction initMainGridInteractiveElements(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".script-action\").forEach(actionCard => {\n\t\tsetActionCardEventsHandlers(sh_api, actionCard);\n\t});\n\n\tscr.currentScreen.DOMObject.querySelectorAll(\".action-details-btn\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst btn = e.currentTarget;\n\t\t\tconst script = scr.currentScreen.DOMObject.provideSciptsData[btn.dataset.alias] ?? {};\n\n\t\t\tconsole.log(\"SCRIPT\", script);\n\t\t\tactionDetailsPopup(script, sh_api).show();\n\t\t});\n\t});\n}\n\nfunction actions(sh_api) {\n\treturn {\n\t\ttitle: \"Scripts Actions\",\n\t\talias: \"scripts-actions\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(sidebarTemplate(\"actions\"));\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.scripts.actions_list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.scripts.actions_list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\trenderingMainGrid(scr, prepareData(resp.data), resp.data.total);\n\t\t\t\tinitMainGridInteractiveElements(scr, sh_api);\n\n\t\t\t\tscr.ready();\n\t\t\t});\t\t\t\n\t\t}\n\t}\n}\n\nexport {\n\tactions,\n\tprepareData\n}", "import { scopes } from \"./scripts-scopes-screen.js\";\nimport { regular } from \"./scripts-regular-screen.js\";\nimport { actions } from \"./scripts-actions-screen.js\";\n\nexport default {\n\tscopes,\n\tregular,\n\tactions\n}", "function sidebarTemplate(active) {\n\treturn Helper.template.sidebarNav([\n\t\t{\n\t\t\tcontent: ` Areas Tree`,\n\t\t\troute: \"/#!/areas/tree\",\n\t\t\tis_active: active == \"areas-tree\"\n\t\t}\n\t]);\n}\n\nexport {\n\tsidebarTemplate\n}", "import { rebootDeviceBtnHandler } from \"../devices/devices-funcs.js\";\nimport deviceStateComponent from \"../devices/device-state-component.js\";\nimport { deviceDetailsPopup } from \"../devices/device-details-popup.js\";\n\nexport function areaDevicesModal(area, sh_api) {\n\tconsole.log(\"areaDevicesModal\", area);\n\n\treturn Modals.create(\"area-devices-modal\", {\n\t\ttitle: ` ${area.display_name}`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst btnRebootAll = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-warning with-icon btn-reboot-all\"\n\t\t\t}, ` Reboot All`);\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbtnRebootAll.addEventListener(\"click\", e => {\n\t\t\t\tif(btnRebootAll.getAttribute(\"disabled\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tHelper.states.btnLoadingState(btnRebootAll, true);\n\t\t\t\tconfirmPopup(\n\t\t\t\t\t`Are you sure you want to reboot all devices from ${area.display_name}?`, \n\t\t\t\t\t() => {\n\t\t\t\t\t\tsh_api.areas.reboot_devices(\n\t\t\t\t\t\t\tarea.id,\n\t\t\t\t\t\t\t(err, data, meta) => {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tHelper.states.btnLoadingState(btnRebootAll, false);\n\n\t\t\t\t\t\t\t\tif(data) {\n\t\t\t\t\t\t\t\t\tconsole.log(\"Was rebooted all devices\");\n\n\t\t\t\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t\t\t\t\"Rebooted all devices\",\n\t\t\t\t\t\t\t\t\t\t`Area: ${area.display_name}`\n\t\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tToasts.createDanger(\n\t\t\t\t\t\t\t\t\t\t\"Rebooted fail\",\n\t\t\t\t\t\t\t\t\t\t`Area: ${area.display_name}`\n\t\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t}, \n\t\t\t\t() => {\n\t\t\t\t\tHelper.states.btnLoadingState(btnRebootAll, false);\n\t\t\t\t\tconsole.log(\"CANCELED\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ btnCancel, btnRebootAll ];\n\t\t},\n\t\tonready: modal => {\n\t\t\tconst devicesContainer = modal.querySelector(\".devices-container\");\n\t\t\tconst loader = modal.querySelector(\".loader\");\n\n\t\t\tsh_api.areas.devices(area.id, (err, data, meta) => {\n\t\t\t\tconsole.log(\"sh_api.areas.devices\", data);\n\n\t\t\t\tfunction prepareDevicesData(data) {\n\t\t\t\t\tif(!data) {\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\n\t\t\t\t\tconst preparedData = [];\n\t\t\t\t\tfor(let device of data.devices) {\n\t\t\t\t\t\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\t\t\t\t\t\tpreparedData.push({\n\t\t\t\t\t\t\tdeviceNaming: `\n\t\t\t\t\t\t\t\t
    ${device.name}
    \n\t\t\t\t\t\t\t\t
    ${device.alias}
    \n\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\tstatus: Helper.template.connectionStatusBadge(device.connection_status),\n\t\t\t\t\t\t\tstate: `
    \n\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\tactions: `\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\treturn preparedData;\n\t\t\t\t}\n\n\t\t\t\tconst devices = prepareDevicesData(data?.data);\n\t\t\t\tif(devices.length) {\n\t\t\t\t\tdevicesContainer.innerHTML = Helper.template.table(\n\t\t\t\t\t\t\"\", \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdeviceNaming: \"Device\", \n\t\t\t\t\t\t\tstatus: \"Status\", \n\t\t\t\t\t\t\tstate: \"State\", \n\t\t\t\t\t\t\tactions: \"Actions\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdevices,\n\t\t\t\t\t\t`Total: ${devices.length} devices`\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tdevicesContainer.innerHTML = Helper.template.emptyHereHTML();\n\t\t\t\t\tmodal.querySelector(\".btn-reboot-all\").remove();\n\t\t\t\t}\n\n\t\t\t\tdevicesContainer.querySelectorAll(\".reboot-btn\").forEach(rebootBtn => {\n\t\t\t\t\trebootBtn.addEventListener(\"click\", e => {\n\t\t\t\t\t\tif(rebootBtn.getAttribute(\"disabled\")) {\n\t\t\t\t\t\t\treturn ;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trebootDeviceBtnHandler(sh_api, e.currentTarget, modal);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tdevicesContainer.querySelectorAll(\".device-state-container\").forEach(container => {\n\t\t\t\t\tcontainer.append(deviceStateComponent(\n\t\t\t\t\t\tsh_api, \n\t\t\t\t\t\tcontainer.dataset.deviceId, \n\t\t\t\t\t\tcontainer.dataset.deviceType\n\t\t\t\t\t));\n\t\t\t\t});\n\n\t\t\t\tdevicesContainer.querySelectorAll(\".details-btn\").forEach(btn => {\n\t\t\t\t\tbtn.addEventListener(\"click\", e => {\n\t\t\t\t\t\tconst device = {\n\t\t\t\t\t\t\tstatus: \"\",\n\t\t\t\t\t\t\t...JSON.parse(e.currentTarget.dataset.device)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdeviceDetailsPopup(device, sh_api).show();\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tloader.remove();\n\n\t\t\t\tconsole.log(\"devices\", devices);\n\t\t\t});\n\t\t}\n\t});\n}", "import { \n\trunActionScript, \n\tsetActionCardEventsHandlers, \n\tcreateActionCardHtml,\n\tcreateActionCard,\n} from \"../scripts/scripts-funcs.js\";\nimport { prepareData } from \"../scripts/scripts-actions-screen.js\";\n// import { actionDetailsPopup } from \"./scripts-action-popup.js\";\n\nexport function areaActionsModal(area, sh_api) {\n\tconsole.log(\"areaActionsModal\", area);\n\n\treturn Modals.create(\"area-actions-modal\", {\n\t\ttitle: ` ${area.display_name}`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\treturn [ btnCancel ];\n\t\t},\n\t\tonready: modal => {\n\t\t\tconst actionsCardsContainer = modal.querySelector(\".actions-container\");\n\t\t\tconst loader = modal.querySelector(\".loader\");\n\n\t\t\tsh_api.areas.scripts(area.id, (err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.areas.scripts\", err, resp, meta);\n\n\t\t\t\tif(!resp) {\n\t\t\t\t\treturn Toasts.createDanger(\n\t\t\t\t\t\t\"Loading failed\",\n\t\t\t\t\t\t`Area: ${area.display_name}`\n\t\t\t\t\t).show();\n\t\t\t\t}\n\n\t\t\t\tconst actions = prepareData(resp.data);\n\t\t\t\tconsole.log(\"ACTIONS\", actions);\n\t\t\t\tactionsCardsContainer.innerHTML = \"\";\n\t\t\t\t\n\t\t\t\tif(!actions.length) {\n\t\t\t\t\tactionsCardsContainer.innerHTML = Helper.template.emptyHereHTML();\n\t\t\t\t}\n\n\t\t\t\tloader.remove();\n\t\t\t\tfor(let item of actions) {\n\t\t\t\t\tactionsCardsContainer.append(createActionCard(sh_api, item));\n\t\t\t\t}\n\t\t\t});\t\n\n\t\t\t// const devicesContainer = modal.querySelector(\".devices-container\");\n\t\t\t// const loader = modal.querySelector(\".loader\");\n\n\t\t\t// sh_api.areas.devices(area.id, (err, data, meta) => {\n\t\t\t// \tconsole.log(\"sh_api.areas.devices\", data);\n\n\t\t\t// \tfunction prepareDevicesData(data) {\n\t\t\t// \t\tif(!data) {\n\t\t\t// \t\t\treturn [];\n\t\t\t// \t\t}\n\n\t\t\t// \t\tconst preparedData = [];\n\t\t\t// \t\tfor(let device of data.devices) {\n\t\t\t// \t\t\tdevice = Helper.unification.deviceFieldsUnification(device);\n\n\t\t\t// \t\t\tpreparedData.push({\n\t\t\t// \t\t\t\tdeviceName: device.name,\n\t\t\t// \t\t\t\talias: device.alias,\n\t\t\t// \t\t\t\tstatus: Helper.template.connectionStatusBadge(device.connection_state),\n\t\t\t// \t\t\t\tip: `${device.ip}`,\n\t\t\t// \t\t\t\tactions: `\n\t\t\t// \t\t\t\t\t\n\t\t\t// \t\t\t\t`\n\t\t\t// \t\t\t});\n\t\t\t// \t\t}\n\n\t\t\t// \t\treturn preparedData;\n\t\t\t// \t}\n\n\t\t\t// \tconst devices = prepareDevicesData(data?.data);\n\n\t\t\t// \tdevicesContainer.innerHTML = Helper.template.table(\n\t\t\t// \t\t\"\", \n\t\t\t// \t\t{\n\t\t\t// \t\t\tdeviceName: \"Device name\", \n\t\t\t// \t\t\talias: \"Device alias\", \n\t\t\t// \t\t\tstatus: \"Status\", \n\t\t\t// \t\t\tip: \"IP\", \n\t\t\t// \t\t\tactions: \"Actions\"\n\t\t\t// \t\t},\n\t\t\t// \t\tdevices,\n\t\t\t// \t\t`Total: ${devices.length} devices`\n\t\t\t// \t);\n\n\t\t\t// \tdevicesContainer.querySelectorAll(\".reboot-btn\").forEach(rebootBtn => {\n\t\t\t// \t\trebootBtn.addEventListener(\"click\", e => {\n\t\t\t// \t\t\tif(rebootBtn.getAttribute(\"disabled\")) {\n\t\t\t// \t\t\t\treturn ;\n\t\t\t// \t\t\t}\n\n\t\t\t// \t\t\trebootDeviceBtnHandler(sh_api, e.currentTarget, modal);\n\t\t\t// \t\t});\n\t\t\t// \t});\n\n\t\t\t// \tloader.remove();\n\n\t\t\t// \tconsole.log(\"devices\", devices);\n\t\t\t// });\n\t\t}\n\t});\n}", "\nexport function createNewAreaModal(sh_api) {\n\tconsole.log(\"createNewAreaModal\");\n\n\treturn Modals.create(\"create-area-modal\", {\n\t\ttitle: ` Create new Area`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst btnSubmit = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-success with-icon\"\n\t\t\t}, ` Create`);\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbtnSubmit.addEventListener(\"click\", e => {\n\t\t\t\tconst form = modal.querySelector(\".create-area-form\");\n\t\t\t\tform.querySelectorAll(\"input[type='text']\").forEach(i => {\n\t\t\t\t\ti.dispatchEvent(\n\t\t\t\t\t\tnew Event(\"input\", { bubbles: true })\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tif(form.querySelectorAll(\".label.error\").length) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst inputElements = form.querySelectorAll(\"input\");\n\n\t\t\t\tconst inputs = {};\n\t\t\t\tfor(let input of inputElements) {\n\t\t\t\t\tinputs[input.getAttribute(\"name\")] = input.value;\n\t\t\t\t}\n\n\t\t\t\tHelper.states.btnLoadingState(btnSubmit, true);\n\n\t\t\t\tsh_api.areas.new_area(inputs, (err, resp, meta) => {\n\t\t\t\t\tHelper.states.btnLoadingState(btnSubmit, false);\n\n\t\t\t\t\tif(err?.type == \"api_error\") {\n\t\t\t\t\t\tconsole.error(\"ERR! sh_api.areas.new_area\", err.raw);\n\n\t\t\t\t\t\tif(err.raw?.failed_fields) {\n\t\t\t\t\t\t\tfor(let errFieldName of err.raw.failed_fields) {\n\t\t\t\t\t\t\t\tmodal.querySelector(`[name=\"${errFieldName}\"]`).parentNode.classList.add(\"error\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\t\t\t\t\t\t\n\n\t\t\t\t\t\tif(err.raw?.msg) {\n\t\t\t\t\t\t\tconst alertContainer = modal.querySelector(\".alert-container\");\n\t\t\t\t\t\t\talertContainer.innerHTML = \"\";\n\t\t\t\t\t\t\talertContainer?.append(Helper.template.createAlert( \"error\", err.raw.msg ));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\t\t\t\t\t\n\n\t\t\t\t\tif(!resp) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tinputElements.forEach(i => i.value = \"\");\n\t\t\t\t\tmodal.close();\n\n\t\t\t\t\tDataProvider.invalidate(\"raw.areas.list\");\n\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tToasts.createSuccess(\"Creating successful\", `Added new area ID ${inputs.alias}`).show();\n\t\t\t\t\t}, 300);\n\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ btnCancel, btnSubmit ];\n\t\t},\n\t\tonready: modal => {\n\t\t\tconst form = modal.querySelector(\".create-area-form\");\n\t\t\tform.querySelectorAll(\".input\").forEach(i => {\n\n\t\t\t\ti.addEventListener(\"input\", e => {\n\t\t\t\t\tif(!e.currentTarget.value.length) {\n\t\t\t\t\t\te.currentTarget.parentNode.classList.add(\"error\");\n\t\t\t\t\t\tif(!e.currentTarget.parentNode.parentNode.querySelector(\".input-info.error\")) {\n\t\t\t\t\t\t\te.currentTarget.parentNode.parentNode.append(Helper.template.createElement(\"div\", {\n\t\t\t\t\t\t\t\tclass: \"input-info error\"\n\t\t\t\t\t\t\t}, ` Field cannot be empty`));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\te.currentTarget.parentNode.classList.remove(\"error\");\n\t\t\t\t\t\te.currentTarget.parentNode.parentNode.querySelector(\".input-info.error\")?.remove();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t});\n\n\t\t\tsh_api.areas.types_list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.areas.types_list\", err, resp, meta);\n\n\t\t\t\tif(!resp) {\n\t\t\t\t\tconsole.error(\"Request Error. sh_api.areas.types_list()\");\n\t\t\t\t}\n\n\t\t\t\tconst types = {};\n\t\t\t\tfor(let type of resp.data.types) {\n\t\t\t\t\ttypes[type] = type;\n\t\t\t\t}\n\n\t\t\t\tform.querySelector(\".advanced-select-container\").append(advancedSelect(\n\t\t\t\t\tform.querySelector(`[name=\"type\"]`),\n\t\t\t\t\ttypes, \n\t\t\t\t\t\"Will be created\"\n\t\t\t\t));\n\t\t\t});\n\t\t}\n\t});\n}", "import { placeInArea } from \"./areas-placeto-component.js\";\n\nfunction initEditedFields(sh_api, area, modal) {\n\tconst editedFields = [\n\t\t{\n\t\t\tpayloadFieldName: \"display_name\",\n\t\t\tselector: \".display-name\",\n\t\t\tmethName: \"update_display_name\",\n\t\t\toriginalValue: area.display_name,\n\t\t\tisMultiString: false\n\t\t},\n\t\t{\n\t\t\tpayloadFieldName: \"new_alias\",\n\t\t\tselector: \".alias\",\n\t\t\tmethName: \"update_alias\",\n\t\t\toriginalValue: area.alias,\n\t\t\tisMultiString: false\n\t\t},\n\t];\n\n\tfor(let editedField of editedFields) {\n\t\tconst edit = editableString(modal.querySelector(editedField.selector));\n\t\tedit.editableString.onChange(component => {\n\t\t\tconst payload = {\n\t\t\t\tarea_id: area.id,\n\t\t\t};\n\n\t\t\tpayload[editedField.payloadFieldName] = component.value;\n\n\t\t\tsh_api.areas[editedField.methName](payload, (err, resp, meta) => {\n\t\t\t\tif(err || !resp || !resp.status) {\n\t\t\t\t\tconsole.error(`sh_api.areas.${editedField.methName}`, err);\n\t\t\t\t\tedit.editableString.setValue(editedField.originalValue);\n\n\t\t\t\t\treturn Toasts.createError(\n\t\t\t\t\t\terr?.message ?? \"Error updating\", \n\t\t\t\t\t\terr.raw?.msg ?? `Error of ${editedField.payloadFieldName} updating`\n\t\t\t\t\t).show();\n\t\t\t\t}\n\n\t\t\t\tif(resp.status == true) {\n\t\t\t\t\tDataProvider.invalidatePrefix(\"raw.areas\");\n\t\t\t\t\tScreens.reinit();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n}\n\nexport function areaDetailsModal(area, sh_api) {\n\tarea = DataProvider.getRaw(`areas.${area.id}`) ?? area;\n\n\tconsole.log(\"areaDetailsModal\", area);\n\n\treturn Modals.create(\"area-details-modal\", {\n\t\ttitle: ` ${area.display_name}`,\n\t\tbody: modal => {\n\t\t\tconst entityData = area;\n\n\t\t\tconst fieldClassMap = {\n\t\t\t\tparent_id: \"place-in-area-container\",\n\t\t\t\tdisplay_name: \"display-name\",\n\t\t\t\talias: \"alias-view-container\"\n\t\t\t};\n\n\t\t\tconst wrapToContainer = (field, value) => {\n\t\t\t\tconst map = {\n\t\t\t\t\talias: ` {{value}}`,\n\t\t\t\t\tcreate_at: value => Helper.unification.formatDate(value),\n\t\t\t\t\tupdate_at: value => Helper.unification.formatDate(value),\n\t\t\t\t\tschema: \"Nothing yet\",\n\t\t\t\t}\n\n\t\t\t\treturn map[field] \n\t\t\t\t\t? (typeof map[field] == \"function\" ? map[field](value) : map[field].replaceAll(\"{{value}}\", value))\n\t\t\t\t\t: value; \n\t\t\t}\n\n\t\t\tlet properties = \"\";\n\t\t\tfor(let field in entityData) {\n\t\t\t\tlet fieldValueClass = fieldClassMap[field] ?? \"\";\n\n\t\t\t\tproperties += `\n\t\t\t\t\t\n\t\t\t\t\t\t${field}: \n\t\t\t\t\t\t${wrapToContainer(field, entityData[field])}\n\t\t\t\t\t\n\t\t\t\t`;\n\t\t\t}\n\n\t\t\treturn `\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t${properties}\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst btnCancel = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-primary\"\n\t\t\t}, \"Close\");\n\n\t\t\tconst btnRemove = Helper.template.createElement(\"button\", {\n\t\t\t\tclass: \"btn btn-danger with-icon\"\n\t\t\t}, ` Remove`);\n\n\t\t\tbtnCancel.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t});\n\n\t\t\tbtnRemove.addEventListener(\"click\", e => {\n\t\t\t\tHelper.states.btnLoadingState(btnRemove, true);\n\n\t\t\t\tconfirmPopup(\n\t\t\t\t\t`Are you sure you want to remove this area? ${area.display_name}`, \n\t\t\t\t\t() => {\n\t\t\t\t\t\tsh_api.areas.remove(\n\t\t\t\t\t\t\tarea.id,\n\t\t\t\t\t\t\t(err, data, meta) => {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tHelper.states.btnLoadingState(btnRemove, false);\n\t\t\t\t\t\t\t\tconsole.log(\"Was removed\");\n\n\t\t\t\t\t\t\t\tDataProvider.invalidatePrefix(\"raw.areas\");\n\t\t\t\t\t\t\t\tmodal.close();\n\t\t\t\t\t\t\t\tScreens.reinit();\n\n\t\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\t\tToasts.createSuccess(\n\t\t\t\t\t\t\t\t\t\t\"Removed\",\n\t\t\t\t\t\t\t\t\t\t`Area: ${area.display_name}`\n\t\t\t\t\t\t\t\t\t).show();\n\t\t\t\t\t\t\t\t}, 300);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t);\n\t\t\t\t}, \n\t\t\t\t() => {\n\t\t\t\t\tHelper.states.btnLoadingState(btnRemove, false);\n\t\t\t\t\tconsole.log(\"CANCELED\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn [ btnCancel, btnRemove ];\n\t\t},\n\t\tonready: modal => {\n\t\t\tplaceInArea(\n\t\t\t\tsh_api,\n\t\t\t\tmodal.querySelector(\".place-in-area-container\"),\n\t\t\t\t\"area\",\n\t\t\t\tarea.id,\n\t\t\t\tarea.parent_id\n\t\t\t);\n\n\t\t\tinitEditedFields(sh_api, area, modal);\n\t\t}\n\t});\n}", "import { sidebarTemplate } from \"./areas-funcs.js\";\nimport { areaDevicesModal } from \"./areas-devices-modal.js\";\nimport { areaActionsModal } from \"./areas-actions-modal.js\";\nimport { createNewAreaModal } from \"./areas-create-new-modal.js\";\nimport { areaDetailsModal } from \"./areas-details-modal.js\";\n\nfunction makeTree(data) {\n\tconst items = data.areas;\n\n\tconst map = {};\n\tconst roots = [];\n\n\tfor (const item of items) {\n\t\tmap[item.id] = { ...item, children: [] };\n\t}\n\n\tfor (const item of items) {\n\t\tconst node = map[item.id];\n\t\tconst isSelfRef = item.parent_id && item.parent_id == item.id;\n\t\tconst parentExists = item.parent_id && map[item.parent_id];\n\n\t\tif (!isSelfRef && parentExists) {\n\t\t\tmap[item.parent_id].children.push(node);\n\t\t} else {\n\t\t\troots.push(node);\n\t\t}\n\t}\n\n\tif (roots.length === 0 && items.length > 0) {\n\t\treturn Object.values(map);\n\t}\n\n\treturn roots;\n}\n\nfunction prepareData(data) {\n\tconst tree = makeTree(data);\n\treturn tree;\n}\n\nfunction renderingBranch(branch, lvl, ancestors) {\n\tlvl = lvl ?? 0;\n\tancestors = ancestors ?? new Set();\n\n\tif (ancestors.has(branch.id)) return '';\n\n\tconst nextAncestors = new Set(ancestors);\n\tnextAncestors.add(branch.id);\n\n\tconst isSingle = branch.children?.length ? \"\" : \"is-single\";\n\tlet html = `\n\t\t
    \n\t\t\t\n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t ${branch.display_name}\n\t\t\t\t\t[\n\t\t\t\t\t${branch.type}\n\t\t\t\t\t ${branch.alias}\n\t\t\t\t\t]\n\t\t\t\t
    \n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t`;\n\n\tif(branch.children?.length) {\n\t\tfor(let childBranch of branch.children) {\n\t\t\thtml += renderingBranch(childBranch, lvl + 1, nextAncestors);\n\t\t}\n\t}\n\n\treturn html;\n}\n\nfunction renderingAreasTree(scr, tree) {\n\tconsole.log(\"TREE\", tree);\n\tlet html = `
    `;\n\tfor(let branch of tree) {\n\t\thtml += renderingBranch(branch);\n\t}\n\thtml += \"
    \";\n\n\tscr.currentScreen.DOMObject.querySelector(\".main-container .tree-container\").innerHTML = html;\n}\n\nfunction initAreasTree(scr, sh_api) {\n\tscr.currentScreen.DOMObject.querySelectorAll(\".btn.devices\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tareaDevicesModal({ \n\t\t\t\tid: e.currentTarget.dataset.areaId, \n\t\t\t\tdisplay_name: e.currentTarget.dataset.areaName \n\t\t\t}, sh_api).show();\n\t\t});\n\t});\n\n\tscr.currentScreen.DOMObject.querySelectorAll(\".btn.actions\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tareaActionsModal({ \n\t\t\t\tid: e.currentTarget.dataset.areaId, \n\t\t\t\tdisplay_name: e.currentTarget.dataset.areaName \n\t\t\t}, sh_api).show();\n\t\t});\n\t});\n\n\tscr.currentScreen.DOMObject.querySelectorAll(\".btn.details\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tareaDetailsModal({\n\t\t\t\tid: e.currentTarget.dataset.areaId,\n\t\t\t\tdisplay_name: e.currentTarget.dataset.areaName,\n\t\t\t\tparent_id: e.currentTarget.dataset.parentId\n\t\t\t}, sh_api).show();\n\t\t});\n\t});\n\n\tscr.currentScreen.DOMObject.querySelectorAll(\"button.show-childs\").forEach(btn => {\n\t\tbtn.addEventListener(\"click\", e => {\n\t\t\tconst btn = e.currentTarget;\n\t\t\tconst branch = btn.parentNode;\n\t\t\tconst branchLvl = parseInt(branch.dataset.lvl);\n\n\t\t\tif(!btn.classList.contains(\"opened\")) {\n\t\t\t\tbtn.classList.add(\"opened\");\n\t\t\t\tlet next = branch.nextElementSibling;\n\t\t\t\twhile(next) {\n\t\t\t\t\tconst nextBranchLvl = parseInt(next.dataset.lvl);\n\n\t\t\t\t\tif(nextBranchLvl == branchLvl || nextBranchLvl < branchLvl) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(nextBranchLvl == branchLvl + 1) {\n\t\t\t\t\t\tnext.classList.add(\"a-show\");\n\t\t\t\t\t}\n\n\t\t\t\t\tnext = next.nextElementSibling;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbtn.classList.remove(\"opened\");\n\t\t\t\tlet next = branch.nextElementSibling;\n\t\t\t\twhile(next) {\n\t\t\t\t\tconst nextBranchLvl = parseInt(next.dataset.lvl);\n\n\t\t\t\t\tif(nextBranchLvl == branchLvl || nextBranchLvl < branchLvl) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(nextBranchLvl == branchLvl + 1) {\n\t\t\t\t\t\tnext.classList.remove(\"a-show\");\n\t\t\t\t\t}\n\n\t\t\t\t\tnext = next.nextElementSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t})\n\n\tscr.ready();\n}\n\nfunction areasTree(sh_api) {\n\treturn {\n\t\ttitle: \"Areas Tree\",\n\t\talias: \"areas-tree\",\n\t\trenderer: () => {\n\t\t\treturn Helper.template.mainTemplate(\n\t\t\t\tsidebarTemplate(\"areas-tree\"), \n\t\t\t\t`
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t

    Areas Tree

    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t`\n\t\t\t);\n\t\t},\n\t\tiniter: scr => {\n\t\t\tsh_api.areas.list((err, resp, meta) => {\n\t\t\t\tconsole.log(\"sh_api.areas.list\", err, resp, meta);\n\n\t\t\t\tif(meta.status_code != 200) {\n\t\t\t\t\treturn scr.error(\"Server API ERROR\", \"\");\n\t\t\t\t}\n\n\t\t\t\tscr.currentScreen.DOMObject.provideData = {};\n\t\t\t\tif(typeof resp.data != \"undefined\" && typeof resp.data.areas != \"undefined\") {\n\t\t\t\t\tfor(let item of resp.data.areas) {\n\t\t\t\t\t\tscr.currentScreen.DOMObject.provideData[item.id] = item;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\trenderingAreasTree(scr, prepareData(resp.data));\n\t\t\t\tinitAreasTree(scr, sh_api);\n\n\t\t\t\tconst btnCreateNewAreaModal = scr.currentScreen.DOMObject.querySelector(\".create-new-area-modal\");\n\t\t\t\tif(!btnCreateNewAreaModal.classList.contains(\"inited\")) {\n\t\t\t\t\tbtnCreateNewAreaModal.classList.add(\"inited\");\n\t\t\t\t\t\n\t\t\t\t\tbtnCreateNewAreaModal?.addEventListener(\"click\", e => {\n\t\t\t\t\t\tcreateNewAreaModal(sh_api).show();\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tscr.ready();\n\t\t\t});\t\t\t\n\t\t}\n\t}\n}\n\nexport {\n\tareasTree\n}", "import { areasTree } from \"./areas-tree-screen.js\";\n\nexport default {\n\tareasTree\n}", "import devices from \"./components/screens/devices/devices.js\";\nimport scripts from \"./components/screens/scripts/scripts.js\";\nimport areas from \"./components/screens/areas/areas.js\";\n\nfunction routes(screens, sh_api) {\n\tscreens.add(\"/\", {\n\t\talias: \"home\",\n\t\trenderer: () => {\n\t\t\treturn ``;\n\t\t},\n\t\tiniter: scr => {\n\t\t\tdocument.location = \"/#!/areas/tree\";\n\t\t}\n\t});\n\n\tscreens.add(\"-\", {\n\t\talias: \"not-found-screen\",\n\t\trenderer: () => {\n\t\t\treturn `

    404 NOT FOUND

    `;\n\t\t},\n\t\tiniter: scr => {\n\t\t\tscr.ready();\n\t\t}\n\t});\n\n\tscreens.add(\"/devices\", devices.list(sh_api));\n\tscreens.add(\"/devices/scanning\", devices.scanning(sh_api));\n\tscreens.add(\"/scripts/scopes\", scripts.scopes(sh_api));\n\tscreens.add(\"/scripts/regular\", scripts.regular(sh_api));\n\tscreens.add(\"/scripts/actions\", scripts.actions(sh_api));\n\tscreens.add(\"/areas/tree\", areas.areasTree(sh_api));\n}\n\nexport {\n\troutes\n}", "function template(id, title, footer) {\n\treturn `\n\t\t
    \n
    \n\n
    \n
    \n

    ${title}

    \n \n
    \n\n
    \n
    ${footer}
    \n
    \n
    \n\t`;\n}\n\nfunction init(modal, onready) {\n\tmodal.show = function() {\n\t\tdocument.querySelector(\"body\").append(modal);\n\n\t\tsetTimeout(() => {\n\t\t\tmodal.classList.add(\"a-show\");\n\t\t}, 10);\n\t}\n\n\tmodal.close = function() {\n\t\tmodal.classList.add(\"a-hide\");\n\t\tsetTimeout(() => {\n\t\t\tmodal.remove();\n\t\t}, 300);\n\t}\n\n\tmodal.querySelector(\".modal-close\").addEventListener(\"click\", e => {\n\t\tmodal.close();\n\t});\n\n\tif(typeof onready == \"function\") {\n\t\tonready(modal);\n\t}\n\n\treturn modal;\n}\n\n\t/**\n\t * Create new modal window;\n\t * @param {string} id Uniq id (selector)\n\t * @param {string} title Display title\n\t * @param {object} props { body: modal => {}, actions => modal => {} }\n\t * @return {object} DOM object\n\t */\nfunction create(id, props) {\n\tconst title = props.title || \"\";\n\tconst footer = props.footer || \"\";\n\n\tconst div = document.createElement(\"div\");\n\tdiv.innerHTML = template(id, title, footer);\n\tconst modal = div.childNodes[1];\n\n\tconst modalBody = modal.querySelector(\".modal-body\");\n\tconst modalFooter = modal.querySelector(\".modal-footer\");\n\n\tif(typeof props.actions == \"function\") {\n\t\tconst actionsResult = props.actions(modal);\n\n\t\tif(typeof actionsResult[0] == \"object\") {\n\t\t\tconst actions = document.createElement(\"div\");\n\t\t\tactions.classList.add(\"actions\");\n\t\t\tfor(let actionElement of actionsResult) {\n\t\t\t\tactions.append(actionElement);\n\t\t\t}\n\n\t\t\tmodalFooter.append(actions);\n\t\t}\n\t}\n\n\tif(typeof props.body == \"function\") {\n\t\tconst bodyResult = props.body(modal);\n\n\t\tif(typeof bodyResult == \"object\") {\n\t\t\tmodalBody.append(bodyResult);\n\t\t} else if(typeof bodyResult == \"string\") {\n\t\t\tmodalBody.innerHTML = bodyResult;\n\t\t}\n\t}\n\n\treturn init(modal, props?.onready);\n}\n\nexport default {\n\tcreate\n}", "export default function confirmPopup(text, confirmedCb, canceledCb) {\n\tModals.create(\"confirm-popup\", {\n\t\ttitle: `Requires confirmation`,\n\t\tbody: modal => {\n\t\t\treturn `\n\t\t\t\t

    ${text}

    \n\t\t\t`;\n\t\t},\n\t\tactions: modal => {\n\t\t\tconst buttonNO = Helper.template.createElement(\"button\", { class: \"btn btn-primary\" }, \"NO\");\n\t\t\tconst buttonYES = Helper.template.createElement(\"button\", { class: \"btn btn-warning\" }, \"YES\");\n\n\t\t\tbuttonNO.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t\tcanceledCb();\n\t\t\t});\n\n\t\t\tbuttonYES.addEventListener(\"click\", e => {\n\t\t\t\tmodal.close();\n\t\t\t\tconfirmedCb();\n\t\t\t});\n\n\t\t\treturn [ buttonNO, buttonYES ];\n\t\t}\n\t}).show();\n}", "function scrollToElementInFocus(container) {\n\tconst focus = container.querySelector(\".focus\");\n\tif (!focus) return;\n\n\tconst container_rect = container.getBoundingClientRect();\n\tconst focus_rect = focus.getBoundingClientRect();\n\n\tif (focus_rect.top < container_rect.top) {\n\t\tcontainer.scrollTop -= (container_rect.top - focus_rect.top);\n\t} else if (focus_rect.bottom > container_rect.bottom) {\n\t\tcontainer.scrollTop += (focus_rect.bottom - container_rect.bottom);\n\t}\n}\n\nfunction autoSetState(container) {\n\tconst totalViewed = container.advancedSelect.optionsElements.length - container.querySelectorAll(\".option.hide\").length;\n\tif(totalViewed == 0) {\n\t\tcontainer.advancedSelect.showState(\"not-found\");\n\t} else {\n\t\tcontainer.advancedSelect.showState(\"options\");\n\t}\n}\n\nexport default function advancedSelect(input, options, notFoundText) {\n\tconst container = document.createElement(\"div\");\n\tcontainer.classList.add(\"advanced-select\");\n\n\tlet optionsList = ``;\n\tfor(let optionValue in options) {\n\t\toptionsList += `
    ${options[optionValue]}
    `;\n\t}\n\n\tlet html = `\n\t\t
    \n\t\t\t
    ${notFoundText}
    \n\t\t\t
    ${optionsList}
    \n\t\t
    \n\t`;\n\n\tcontainer.innerHTML = html;\n\n\tconst existsOption = (value, options) => {\n\t\tfor(let optionValue in options) {\n\t\t\tif(options[optionValue] == value) {\n\t\t\t\tconst ret = {};\n\t\t\t\tret[optionValue] = options[optionValue];\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tcontainer.advancedSelect = {\n\t\tisOpened: false,\n\t\toptions: options,\n\t\teventsHandlers: {\n\t\t\topenList: [],\n\t\t\tcloseList: [],\n\t\t\tselected: [],\n\t\t\tchanged: [],\n\t\t},\n\t\topenList: () => {\n\t\t\tcontainer.advancedSelect.isOpened = true;\n\t\t\tcontainer.classList.add(\"a-show\");\n\t\t\tautoSetState(container);\n\t\t\tcontainer.advancedSelect.dispatchEvent(\"openList\");\n\t\t},\n\t\tcloseList: () => {\n\t\t\tcontainer.advancedSelect.isOpened = false;\n\t\t\tcontainer.classList.remove(\"a-show\");\n\t\t\tautoSetState(container);\n\t\t\tcontainer.advancedSelect.dispatchEvent(\"closeList\");\n\t\t},\n\t\tshowState: stateName => {\n\t\t\tif(stateName == \"options\") {\n\t\t\t\tcontainer.querySelector(\".options\").classList.add(\"show\");\n\t\t\t\tcontainer.querySelector(\".not-found\").classList.remove(\"show\");\n\t\t\t} else if(stateName == \"not-found\") {\n\t\t\t\tcontainer.querySelector(\".options\").classList.remove(\"show\");\n\t\t\t\tcontainer.querySelector(\".not-found\").classList.add(\"show\");\n\t\t\t}\n\t\t},\n\t\toptionsElements: container.querySelectorAll(\".option\"),\n\t\tvalue: () => {\n\t\t\tconst option = existsOption(input.value, options);\n\n\t\t\treturn { \n\t\t\t\tinputValue: input.value,\n\t\t\t\tisOption: option ? true : false,\n\t\t\t\toption \n\t\t\t};\n\t\t},\n\t\taddEventListener: (name, handler) => {\n\t\t\tif(typeof container.advancedSelect.eventsHandlers[name] != \"undefined\") {\n\t\t\t\treturn container.advancedSelect.eventsHandlers[name].push(handler);\n\t\t\t}\n\n\t\t\tconsole.error(\"Advanced Select component.\", \"addEventListener()\", \"Invalid event name\");\n\t\t},\n\t\tdispatchEvent: name => {\n\t\t\tif(typeof container.advancedSelect.eventsHandlers[name] == \"undefined\") {\n\t\t\t\treturn console.error(\"Advanced Select component.\", \"dispatchEvent()\", \"Invalid event name\");\n\t\t\t}\n\t\t\t\n\t\t\tfor(let eventHandler of container.advancedSelect.eventsHandlers[name]) {\n\t\t\t\teventHandler(container);\n\t\t\t}\n\t\t}\n\t};\n\n\tinput.setAttribute(\"autocomplete\", \"nope\");\n\n\tinput.advancedSelect = {\n\t\tvalue: () => container.advancedSelect.value()\n\t}\n\n\tinput.addEventListener(\"focus\", e => {\n\t\tcontainer.advancedSelect.openList();\n\t});\n\n\tinput.addEventListener(\"blur\", e => {\n\t\tsetTimeout(() => container.advancedSelect.closeList(), 20);\n\t});\n\n\tinput.addEventListener(\"keydown\", e => {\n\t\tif(e.keyCode == 38) {\n\t\t\t// up\n\t\t\tconst current = container.querySelector(\".option.focus\");\n\t\t\tif(current) {\n\t\t\t\tcurrent.classList.remove(\"focus\");\n\t\t\t\tlet prev = current.previousElementSibling;\n\n\t\t\t\twhile (prev) {\n\t\t\t\t\tif (!prev.classList.contains(\"hide\")) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tprev = prev.previousElementSibling;\n\t\t\t\t}\n\n\t\t\t\tif(!prev) {\n\t\t\t\t\tprev = container.querySelector(\".option:not(.hide)\");\n\t\t\t\t}\n\n\t\t\t\tprev.classList.add(\"focus\");\n\t\t\t} else {\n\t\t\t\tcontainer.querySelector(\".option:not(.hide):last-child\").classList.add(\"focus\");\n\t\t\t}\n\n\t\t\tscrollToElementInFocus(container);\n\t\t} else if(e.keyCode == 40) {\n\t\t\t// down\n\t\t\tconst current = container.querySelector(\".option.focus\");\n\t\t\tif(current) {\n\t\t\t\tcurrent.classList.remove(\"focus\");\n\t\t\t\tlet next = current.nextElementSibling;\n\n\t\t\t\twhile (next) {\n\t\t\t\t\tif (!next.classList.contains(\"hide\")) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tnext = next.nextElementSibling;\n\t\t\t\t}\n\n\t\t\t\tif(!next) {\n\t\t\t\t\tnext = container.querySelector(\".option:not(.hide)\");\n\t\t\t\t}\n\n\t\t\t\tnext.classList.add(\"focus\");\n\t\t\t} else {\n\t\t\t\tcontainer.querySelector(\".option:not(.hide)\").classList.add(\"focus\");\n\t\t\t}\n\n\t\t\tscrollToElementInFocus(container);\n\t\t} else if(e.keyCode == 13) {\n\t\t\tlet selected = container.querySelector(\".option.focus\");\n\t\t\tif(!selected) return;\n\t\t\tinput.value = selected.dataset.displayValue;\n\t\t\tinput.blur();\n\t\t\tinput.dispatchEvent(new Event(\"input\", { bubbles: true }));\n\t\t\tinput.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\t\t\tcontainer.advancedSelect.dispatchEvent(\"selected\");\n\t\t}\n\t});\n\n\tinput.addEventListener(\"input\", e => {\n\t\tconst val = e.currentTarget.value.toLowerCase();\n\t\tif(val == \"\") {\n\t\t\tcontainer.advancedSelect.optionsElements.forEach(i => i.classList.remove(\"hide\"));\n\t\t} else {\n\t\t\t[ ...container.advancedSelect.optionsElements ]\n\t\t\t\t.filter(i => i.dataset.displayValue.toLowerCase().indexOf(val) != -1)\n\t\t\t\t.forEach(i => i.classList.remove(\"hide\"));\n\n\t\t\t[ ...container.advancedSelect.optionsElements ]\n\t\t\t\t.filter(i => i.dataset.displayValue.toLowerCase().indexOf(val) == -1)\n\t\t\t\t.forEach(i => i.classList.add(\"hide\"));\n\n\t\t\tautoSetState(container);\n\n\t\t\tcontainer.querySelector(\".option.focus\")?.classList.remove(\"focus\");\n\t\t}\n\t});\n\n\tinput.addEventListener(\"change\", e => {\n\t\tcontainer.advancedSelect.dispatchEvent(\"changed\");\n\t});\n\n\t[ ...container.advancedSelect.optionsElements ].forEach(option => {\n\t\toption.addEventListener(\"click\", e => {\n\t\t\tinput.value = e.currentTarget.dataset.displayValue;\n\t\t\tinput.blur();\n\t\t\tinput.dispatchEvent(new Event(\"input\", { bubbles: true }));\n\t\t\tinput.dispatchEvent(new Event(\"change\", { bubbles: true }));\n\t\t\tcontainer.advancedSelect.dispatchEvent(\"selected\");\n\t\t});\n\t});\n\n\treturn container;\n}", "function template(originalText, isMultiString) {\n\tconst placeholder = \"Write something\";\n\tconst input = !isMultiString \n\t\t? ``\n\t\t: ``;\n\n\treturn `\n\t\t
    \n\t\t\t${originalText}\n\t\t\t\n\t\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n\t\t\t\n\t\t\t\n\t\t
    \n\t`;\n}\n\nexport default function editableString(stringContainer, isMultiString) {\n\tisMultiString = isMultiString ?? false;\n\n\tconst originalText = stringContainer.innerHTML;\n\n\tconst component = Helper.template.createElement(\"div\", {\n\t\t\"class\": \"component editable-string-component\"\n\t}, template(originalText, isMultiString));\n\n\tstringContainer.innerHTML = \"\";\n\tstringContainer.append(component);\n\n\tconst editBtn = component.querySelector(\".edit-text-btn\");\n\tconst applyBtn = component.querySelector(\".apply-changes-btn\");\n\tconst cancelBtn = component.querySelector(\".cancel-changes-btn\");\n\tconst content = component.querySelector(\".editable-string-content\");\n\tconst editableString = component.querySelector(\".editable-string\");\n\tconst form = component.querySelector(\".editable-string-form\");\n\tconst input = component.querySelector(\".input\");\n\n\tcomponent.editableString = {\n\t\tformIsDisplaying: false,\n\t\tvalue: originalText,\n\t\tinput: input,\n\t\teventsHandlers: {\n\t\t\tonChange: [],\n\t\t\tonSwitch: [],\n\t\t},\n\t\tswitch: () => {\n\t\t\tif(component.formIsDisplaying) {\n\t\t\t\tform.classList.add(\"d-none\");\n\t\t\t\tcontent.classList.remove(\"d-none\");\n\t\t\t\teditableString.innerText = component.editableString.value;\n\t\t\t} else {\n\t\t\t\tform.classList.remove(\"d-none\");\n\t\t\t\tcontent.classList.add(\"d-none\");\n\t\t\t\tinput.value = component.editableString.value;\n\t\t\t}\n\n\t\t\tcomponent.formIsDisplaying = !component.formIsDisplaying;\n\t\t\tcomponent.editableString.runEventHandler(\"onSwitch\");\n\t\t},\n\t\tsetValue: val => {\n\t\t\tcomponent.editableString.value = val;\n\t\t\tinput.value = val;\n\t\t\teditableString.innerText = val;\n\t\t},\n\t\tapply: () => {\n\t\t\tcomponent.editableString.value = input.value;\n\t\t\tcomponent.editableString.switch();\n\t\t\tif(input.value != originalText) {\n\t\t\t\tcomponent.editableString.runEventHandler(\"onChange\");\n\t\t\t}\n\t\t},\n\t\tonChange: cb => {\n\t\t\tcomponent.editableString.eventsHandlers.onChange.push(cb);\n\t\t},\n\t\tonSwitch: cb => {\n\t\t\tcomponent.editableString.eventsHandlers.onSwitch.push(cb);\n\t\t},\n\t\trunEventHandler: evName => {\n\t\t\tcomponent.editableString.eventsHandlers[evName].forEach(handler => handler(component.editableString));\n\t\t} \n\t}\n\n\teditBtn.addEventListener(\"click\", e => {\n\t\tcomponent.editableString.switch();\n\t});\n\n\tcancelBtn.addEventListener(\"click\", e => {\n\t\tcomponent.editableString.switch();\n\t});\n\n\tapplyBtn.addEventListener(\"click\", e => {\n\t\tcomponent.editableString.apply();\n\t});\n\n\tinput.addEventListener(\"keydown\", e => {\n\t\tif(e.keyCode == 13) {\n\t\t\tinput.blur();\n\t\t\tcomponent.editableString.apply();\n\t\t}\n\t});\n\n\treturn component;\n}", "import { hud, navigationShow, navigationHide } from \"./components/hud.js\";\nimport { Screens } from \"./components/Screens.js\";\nimport { DataProvider } from \"./DataProvider.js\";\nimport Toasts from \"./components/toasts.js\"\nimport Helper from \"./components/helper.js\"\nimport { SmartHomeApi } from \"./sh/SmartHomeApi.js\";\nimport { routes } from \"./routes.js\";\nimport Modals from \"./components/modals.js\";\nimport confirmPopup from \"./components/confirm-popup.js\";\nimport advancedSelect from \"./components/advanced-select.js\";\nimport editableString from \"./components/editable-string.js\";\n\ndocument.addEventListener(\"DOMContentLoaded\", e => {\n\tconsole.log(\"App init\");\n\n\tif(document.location.hash.indexOf(\"#!/\") == -1) {\n\t\tdocument.location.hash = \"#!/\";\n\t}\n\n\twindow.DataProvider = new DataProvider();\n\twindow.Toasts = Toasts;\n\twindow.Helper = Helper;\n\twindow.Modals = Modals;\n\twindow.confirmPopup = confirmPopup;\n\twindow.advancedSelect = advancedSelect;\n\twindow.editableString = editableString;\n\n\thud();\n\tconst sh_api = new SmartHomeApi({\n\t base_url: API_BASEURL,\n\t token: \"YOUR_TOKEN\",\n\t timeout_ms: 10000,\n\t on_unauthorized: ({ error }) => console.log(\"auth problem:\", error),\n\t proxy_path: \"/proxy.php\",\n\t});\n\n\tconst screens = new Screens(\".screens\", \".load-screen\", \".error-screen\");\n\t\n\troutes(screens, sh_api);\n\n\tconsole.log(screens.getScreens());\n\n\tscreens.onSwitch((scr, alias) => {\n\t\tnavigationHide();\n\t});\n\n\tscreens.onSwitch((scr, alias, route) => {\n\t\tdocument.querySelectorAll(`.app .hud .navigation .nav-link[data-route].active`).forEach(item => item.classList.remove(\"active\"));\n\t\tdocument.querySelector(`.app .hud .navigation .nav-link[data-route=\"${route}\"]`)?.classList.add(\"active\");\n\t});\n\n\tscreens.routing();\n\n\twindow.Screens = screens;\n});"], + "mappings": "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", + "names": ["navToggleBtn", "navigation", "reloadScreenBtn", "navigationShow", "navigationHide", "hud", "e", "Screens", "screensContainerSelector", "loaderSelector", "errorScreenSelector", "route", "screen", "__spreadValues", "alias", "_a", "screenContainer", "title", "text", "cb", "handler", "DataProvider", "name", "data", "key", "prefix", "fetchFn", "cb", "cached", "err", "result", "value", "template", "type", "icon", "title", "text", "init", "toast", "props", "i", "e", "scr", "alias", "lifetimeInterval", "create", "div", "createSuccess", "createInfo", "createWarning", "createError", "toasts_default", "sidebarNav", "items", "listItems", "item", "aOpen", "aClose", "table", "caption", "columns", "data", "tfoot", "head", "totalColumns", "key", "body", "column", "foot", "tableCaption", "tableHead", "createElement", "type", "props", "content", "node", "value", "createAlert", "deviceFieldsUnification", "map", "dataObj", "field", "btnLoadingState", "btn", "isLoading", "cardScriptActionLoadingState", "card", "iconContainer", "mainTemplate", "sidebar", "connectionStatusBadge", "status", "toogleStateBadge", "state", "timeAgo", "dateString", "date", "diff_seconds", "minutes", "hours", "days", "remain_minutes", "formatDate", "now", "today", "target_day", "diff_days", "months", "circleLoaderHTML", "emptyHereHTML", "helper_default", "ScriptsApi", "core", "cb", "err", "resp", "meta", "_a", "item", "id", "filename", "safe", "payload", "alias", "name", "target_id", "DevicesApi", "core", "cb", "err", "resp", "meta", "item", "payload", "id", "safe", "target_id", "AreasApi", "core", "cb", "err", "resp", "meta", "item", "area_id", "safe", "payload", "target_id", "build_query", "params", "usp", "k", "v", "s", "join_url", "base_url", "path", "b", "p", "safe_json_parse", "text", "SmartHomeApi", "opts", "ScriptsApi", "DevicesApi", "AreasApi", "token", "proxy_path", "extra_query", "q", "__spreadValues", "method", "body", "cb", "callback", "url", "controller", "timeout_ms", "t", "headers", "payload", "res", "__async", "meta", "parsed", "data", "err", "_", "st", "e", "api_path", "sidebarTemplate", "active", "rebootDeviceBtnHandler", "sh_api", "btn", "modal", "deviceId", "deviceName", "deviceAlias", "err", "data", "meta", "selector", "container", "loadedAreas", "currentParentAreaId", "sh_api", "type", "typeMap", "setServerCurrentSelectedAreaName", "currentAreaDisplayContainer", "found", "area", "autoDisplayingRmParentIdBtn", "removeParentAreaId", "targetId", "err", "resp", "meta", "hidePlaceInAreaSelector", "placeInAreaRequest", "payload", "loadAreasList", "changePlaceCb", "cb", "data", "areas", "item", "advs", "self", "formContainer", "btn", "placeInArea", "_sh_api", "_container", "_type", "_currentParentAreaId", "advSelect", "areasList", "value", "areaId", "e", "renderingByType", "alias", "deviceResp", "channels", "channel", "channelState", "channelStateClass", "chId", "channelClassMap", "dynamics", "presence", "temperature", "humidity", "pressure", "light", "noise", "initEventHandlers", "component", "stateRendering", "deviceType", "deviceAlias", "deviceResponse", "deviceStateComponent", "sh_api", "deviceId", "err", "resp", "meta", "initEditedFields", "sh_api", "device", "modal", "editedFields", "editedField", "edit", "component", "payload", "err", "resp", "meta", "_a", "_b", "_c", "deviceDetailsPopup", "fieldClassMap", "wrapToContainer", "field", "value", "map", "deviceProperties", "fieldValueClass", "buttonCancel", "buttonReboot", "buttonRemove", "buttonResetup", "buttonReset", "e", "rebootDeviceBtnHandler", "data", "deviceId", "placeInArea", "deviceStateComponent", "prepareData", "data", "preparedData", "device", "renderingMainTable", "scr", "total", "initMainTableInteractiveElements", "sh_api", "btn", "e", "rebootDeviceBtnHandler", "__spreadValues", "deviceDetailsPopup", "list", "sidebarTemplate", "err", "resp", "meta", "container", "deviceStateComponent", "deviceSetupFormPopup", "device", "sh_api", "modal", "deviceProperties", "field", "buttonCancel", "e", "buttonSubmit", "inputs", "setupForm", "i", "inputElements", "textareaElement", "input", "err", "resp", "meta", "_a", "_b", "errFieldName", "alertContainer", "prepareData", "data", "preparedData", "device", "renderingMainTable", "scr", "total", "initMainTableInteractiveElements", "sh_api", "btn", "e", "deviceSetupFormPopup", "scanning", "sidebarTemplate", "err", "resp", "meta", "devices_default", "list", "scanning", "sidebarTemplate", "active", "runActionScript", "sh_api", "alias", "cb", "err", "data", "meta", "createActionCardHtml", "action", "setActionCardEventsHandlers", "actionCard", "e", "resultFlag", "createActionCard", "container", "card", "prepareData", "data", "preparedData", "scope", "btnSwitch", "renderingMainTable", "scr", "total", "initMainTableInteractiveElements", "sh_api", "btn", "e", "methName", "err", "meta", "scopes", "sidebarTemplate", "resp", "prepareData", "data", "preparedData", "script", "btnSwitch", "renderingMainTable", "scr", "total", "provideSciptsData", "i", "initMainTableInteractiveElements", "sh_api", "btn", "e", "_a", "methName", "err", "meta", "regular", "sidebarTemplate", "resp", "actionDetailsPopup", "script", "sh_api", "modal", "placeInAreaContainer", "btnCancel", "btnChangeState", "btnRun", "e", "btn", "methName", "err", "data", "meta", "runActionScript", "resultFlag", "placeInArea", "prepareData", "data", "_a", "_b", "_c", "preparedData", "script", "renderingMainGrid", "scr", "total", "grid", "provideSciptsData", "item", "createActionCardHtml", "mainContainer", "initMainGridInteractiveElements", "sh_api", "actionCard", "setActionCardEventsHandlers", "btn", "e", "actionDetailsPopup", "actions", "sidebarTemplate", "err", "resp", "meta", "scripts_default", "scopes", "regular", "actions", "sidebarTemplate", "active", "areaDevicesModal", "area", "sh_api", "modal", "btnCancel", "btnRebootAll", "e", "err", "data", "meta", "devicesContainer", "loader", "prepareDevicesData", "preparedData", "device", "devices", "rebootBtn", "rebootDeviceBtnHandler", "container", "deviceStateComponent", "btn", "__spreadValues", "deviceDetailsPopup", "areaActionsModal", "area", "sh_api", "modal", "btnCancel", "e", "actionsCardsContainer", "loader", "err", "resp", "meta", "actions", "prepareData", "item", "createActionCard", "createNewAreaModal", "sh_api", "modal", "btnCancel", "btnSubmit", "e", "form", "i", "inputElements", "inputs", "input", "err", "resp", "meta", "_a", "_b", "errFieldName", "alertContainer", "types", "type", "initEditedFields", "sh_api", "area", "modal", "editedFields", "editedField", "edit", "component", "payload", "err", "resp", "meta", "_a", "_b", "_c", "areaDetailsModal", "entityData", "fieldClassMap", "wrapToContainer", "field", "value", "map", "properties", "fieldValueClass", "btnCancel", "btnRemove", "e", "data", "placeInArea", "makeTree", "data", "items", "map", "roots", "item", "__spreadProps", "__spreadValues", "node", "isSelfRef", "parentExists", "prepareData", "renderingBranch", "branch", "lvl", "ancestors", "_a", "_b", "nextAncestors", "isSingle", "html", "childBranch", "renderingAreasTree", "scr", "tree", "initAreasTree", "sh_api", "btn", "e", "areaDevicesModal", "areaActionsModal", "areaDetailsModal", "branchLvl", "next", "nextBranchLvl", "areasTree", "sidebarTemplate", "err", "resp", "meta", "btnCreateNewAreaModal", "createNewAreaModal", "areas_default", "areasTree", "routes", "screens", "sh_api", "scr", "devices_default", "scripts_default", "areas_default", "template", "id", "title", "footer", "init", "modal", "onready", "e", "create", "props", "div", "modalBody", "modalFooter", "actionsResult", "actions", "actionElement", "bodyResult", "modals_default", "confirmPopup", "text", "confirmedCb", "canceledCb", "modal", "buttonNO", "buttonYES", "e", "scrollToElementInFocus", "container", "focus", "container_rect", "focus_rect", "autoSetState", "advancedSelect", "input", "options", "notFoundText", "optionsList", "optionValue", "html", "existsOption", "value", "ret", "stateName", "option", "name", "handler", "eventHandler", "e", "current", "prev", "next", "selected", "_a", "val", "i", "template", "originalText", "isMultiString", "placeholder", "input", "editableString", "stringContainer", "component", "editBtn", "applyBtn", "cancelBtn", "content", "form", "val", "cb", "evName", "handler", "e", "e", "DataProvider", "toasts_default", "helper_default", "modals_default", "confirmPopup", "advancedSelect", "editableString", "hud", "sh_api", "SmartHomeApi", "error", "screens", "Screens", "routes", "scr", "alias", "navigationHide", "route", "_a", "item"] } diff --git a/webclient/index.php b/webclient/index.php index faa1578..a5b8d2b 100644 --- a/webclient/index.php +++ b/webclient/index.php @@ -14,8 +14,13 @@