From 41d199e24ac2afa39efd502251a13423485e7e8ccc5c36a01b9fd84994730221 Mon Sep 17 00:00:00 2001 From: AidarKC Date: Mon, 15 Jun 2026 15:31:19 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20pai?= =?UTF-8?q?ring-=D0=BF=D0=B0=D1=80=D0=BE=D0=BB=D1=8F=20=D0=B2=20=D0=BE?= =?UTF-8?q?=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D0=BC=20=D0=BE=D0=BA?= =?UTF-8?q?=D0=BD=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VERSION.properties | 4 +- shine-UI/js/app.js | 2 +- shine-UI/js/pages/device-pairing-view.js | 114 +++++++++++++++++++---- 3 files changed, 97 insertions(+), 23 deletions(-) diff --git a/VERSION.properties b/VERSION.properties index 763d3e1..3450509 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.2.202 -server.version=1.2.191 +client.version=1.2.203 +server.version=1.2.192 diff --git a/shine-UI/js/app.js b/shine-UI/js/app.js index 9bbb7f5..08457fa 100644 --- a/shine-UI/js/app.js +++ b/shine-UI/js/app.js @@ -55,7 +55,7 @@ import * as serverSettingsView from './pages/server-settings-view.js'; import * as toolsSettingsView from './pages/tools-settings-view.js'; import * as deviceView from './pages/device-view.js?v=202606131435'; import * as connectDeviceView from './pages/connect-device-view.js?v=202606142055'; -import * as devicePairingView from './pages/device-pairing-view.js?v=202606151030'; +import * as devicePairingView from './pages/device-pairing-view.js?v=202606151050'; import * as deviceQrView from './pages/device-qr-view.js'; import * as deviceCameraView from './pages/device-camera-view.js'; import * as showKeysView from './pages/show-keys-view.js'; diff --git a/shine-UI/js/pages/device-pairing-view.js b/shine-UI/js/pages/device-pairing-view.js index 22f0886..f0817b4 100644 --- a/shine-UI/js/pages/device-pairing-view.js +++ b/shine-UI/js/pages/device-pairing-view.js @@ -208,6 +208,58 @@ export function render({ navigate }) { const dialogPasswordToggleBtn = passwordDialog.querySelector('#pairing-dialog-password-toggle'); const dialogPasswordConfirmToggleBtn = passwordDialog.querySelector('#pairing-dialog-password-confirm-toggle'); + const dialogOverlay = document.createElement('div'); + dialogOverlay.hidden = true; + dialogOverlay.style.position = 'absolute'; + dialogOverlay.style.inset = '0'; + dialogOverlay.style.zIndex = '2'; + dialogOverlay.innerHTML = ` +
+
+

Ошибка

+

+
+ + +
+
+ `; + passwordDialog.append(dialogOverlay); + + const dialogOverlayTitleEl = dialogOverlay.querySelector('#pairing-dialog-overlay-title'); + const dialogOverlayTextEl = dialogOverlay.querySelector('#pairing-dialog-overlay-text'); + const dialogOverlayCancelBtn = dialogOverlay.querySelector('#pairing-dialog-overlay-cancel'); + const dialogOverlayConfirmBtn = dialogOverlay.querySelector('#pairing-dialog-overlay-confirm'); + let dialogOverlayOnConfirm = null; + let dialogOverlayOnCancel = null; + + const closeDialogOverlay = () => { + dialogOverlay.hidden = true; + dialogOverlayOnConfirm = null; + dialogOverlayOnCancel = null; + }; + + const showDialogAlert = (message) => { + dialogOverlayTitleEl.textContent = 'Ошибка'; + dialogOverlayTextEl.textContent = message; + dialogOverlayCancelBtn.hidden = true; + dialogOverlayConfirmBtn.textContent = 'Ок'; + dialogOverlay.hidden = false; + dialogOverlayOnConfirm = () => closeDialogOverlay(); + dialogOverlayOnCancel = null; + }; + + const showDialogConfirm = (message, { title = 'Подтверждение', confirmLabel = 'Да', cancelLabel = 'Нет', onConfirm, onCancel } = {}) => { + dialogOverlayTitleEl.textContent = title; + dialogOverlayTextEl.textContent = message; + dialogOverlayCancelBtn.hidden = false; + dialogOverlayCancelBtn.textContent = cancelLabel; + dialogOverlayConfirmBtn.textContent = confirmLabel; + dialogOverlay.hidden = false; + dialogOverlayOnConfirm = onConfirm || (() => closeDialogOverlay()); + dialogOverlayOnCancel = onCancel || (() => closeDialogOverlay()); + }; + const bindPasswordToggle = (input, button) => { button.addEventListener('click', () => { if (input.type === 'password') { @@ -244,6 +296,7 @@ export function render({ navigate }) { const closePasswordDialog = () => { dialogMode = ''; + closeDialogOverlay(); passwordDialog.hidden = true; }; @@ -404,36 +457,57 @@ export function render({ navigate }) { } }); + dialogOverlayConfirmBtn.addEventListener('click', async () => { + const handler = dialogOverlayOnConfirm; + if (!handler) return; + await handler(); + }); + + dialogOverlayCancelBtn.addEventListener('click', async () => { + const handler = dialogOverlayOnCancel; + if (!handler) { + closeDialogOverlay(); + return; + } + await handler(); + }); + dialogSaveBtn.addEventListener('click', async () => { const password = String(dialogPasswordInput.value || ''); const confirm = String(dialogPasswordConfirmInput.value || ''); const currentMode = dialogMode; if (!password && !confirm) { - const shouldRemove = window.confirm('Пароль не задан. Хотите убрать дополнительный пароль?'); - if (!shouldRemove) { - setStatus(status, 'Введите пароль или отмените изменение.', 'error'); - return; - } - dialogSaveBtn.disabled = true; - try { - await removeAdditionalPassword(); - closePasswordDialog(); - renderSettingsCard(); - } catch (error) { - const message = toUserMessage(error, 'Не удалось убрать дополнительный пароль.'); - setAuthError(message); - setStatus(status, message, 'error'); - } finally { - dialogSaveBtn.disabled = false; - } + showDialogConfirm('Пароль не задан. Хотите убрать дополнительный пароль?', { + title: 'Пароль не задан', + confirmLabel: 'Да', + cancelLabel: 'Нет', + onConfirm: async () => { + closeDialogOverlay(); + dialogSaveBtn.disabled = true; + try { + await removeAdditionalPassword(); + closePasswordDialog(); + renderSettingsCard(); + } catch (error) { + const message = toUserMessage(error, 'Не удалось убрать дополнительный пароль.'); + setAuthError(message); + showDialogAlert(message); + } finally { + dialogSaveBtn.disabled = false; + } + }, + onCancel: () => { + closeDialogOverlay(); + }, + }); return; } if (!password || !confirm) { - setStatus(status, 'Заполните пароль и подтверждение пароля.', 'error'); + showDialogAlert('Заполните пароль и подтверждение пароля.'); return; } if (password !== confirm) { - setStatus(status, 'Пароли не совпадают.', 'error'); + showDialogAlert('Пароли не совпадают.'); return; } dialogSaveBtn.disabled = true; @@ -455,7 +529,7 @@ export function render({ navigate }) { } catch (error) { const message = toUserMessage(error, 'Не удалось сохранить дополнительный пароль.'); setAuthError(message); - setStatus(status, message, 'error'); + showDialogAlert(message); } finally { dialogSaveBtn.disabled = false; }