From 5e9f0f811056a665f4b47106850fb09e97f3a9bb Mon Sep 17 00:00:00 2001
From: PTah
Date: Wed, 10 Jun 2026 17:07:49 +1000
Subject: [PATCH] fix: show copyable enrollment code after issue in Settings
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Исправлен v-if, скрывавший весь раздел при success; баннер с полным
кодом, копированием и sessionStorage до Скрыть. Версия 0.9.1.
Co-authored-by: Cursor
---
backend/app/version.py | 2 +-
frontend/src/views/SettingsView.vue | 94 +++++++++++++++++++++++++----
2 files changed, 84 insertions(+), 12 deletions(-)
diff --git a/backend/app/version.py b/backend/app/version.py
index 64884a1..f9ceaf5 100644
--- a/backend/app/version.py
+++ b/backend/app/version.py
@@ -1,5 +1,5 @@
"""Единый источник версии SAC (API, health, логи, OpenAPI)."""
APP_NAME = "Security Alert Center"
-APP_VERSION = "0.9.0"
+APP_VERSION = "0.9.1"
APP_VERSION_LABEL = f"{APP_NAME} v.{APP_VERSION}"
diff --git a/frontend/src/views/SettingsView.vue b/frontend/src/views/SettingsView.vue
index 18d21fe..ba1ad68 100644
--- a/frontend/src/views/SettingsView.vue
+++ b/frontend/src/views/SettingsView.vue
@@ -7,10 +7,22 @@
{{ error }}
- {{ success }}
- Загрузка…
+ Загрузка…
-
+
+ {{ success }}
+
+
+
Код регистрации Seaca
+
+ Скопируйте и передайте оператору вместе с URL сервера. Полный код показывается только сейчас.
+
+
+ {{ lastCreatedCode }}
+
+
+
+
Интерфейс
@@ -137,9 +149,6 @@
-
- Код (скопируйте сейчас): {{ lastCreatedCode }}
-
@@ -511,6 +520,34 @@ const enrollmentCodes = ref([]);
const mobileDevices = ref([]);
const sacUsers = ref([]);
const lastCreatedCode = ref("");
+const ENROLLMENT_CODE_STORAGE_KEY = "sac_mobile_last_enrollment_code";
+
+function restoreLastCreatedCode() {
+ const stored = sessionStorage.getItem(ENROLLMENT_CODE_STORAGE_KEY);
+ if (stored) {
+ lastCreatedCode.value = stored;
+ }
+}
+
+function persistLastCreatedCode(code: string) {
+ sessionStorage.setItem(ENROLLMENT_CODE_STORAGE_KEY, code);
+}
+
+function dismissEnrollmentCode() {
+ lastCreatedCode.value = "";
+ sessionStorage.removeItem(ENROLLMENT_CODE_STORAGE_KEY);
+}
+
+async function copyEnrollmentCode() {
+ if (!lastCreatedCode.value) return;
+ error.value = "";
+ try {
+ await navigator.clipboard.writeText(lastCreatedCode.value);
+ success.value = "Код скопирован в буфер обмена.";
+ } catch {
+ error.value = "Не удалось скопировать автоматически — выделите код вручную.";
+ }
+}
const policyForm = reactive({
min_severity: "warning",
@@ -699,7 +736,6 @@ async function createEnrollmentCode() {
creatingCode.value = true;
error.value = "";
success.value = "";
- lastCreatedCode.value = "";
try {
const created = await createMobileEnrollmentCode({
label: codeForm.label,
@@ -709,8 +745,8 @@ async function createEnrollmentCode() {
expires_in_hours: codeForm.expires_in_hours,
});
lastCreatedCode.value = created.enrollment_code;
+ persistLastCreatedCode(created.enrollment_code);
enrollmentCodes.value = await fetchMobileEnrollmentCodes();
- success.value = "Код регистрации создан.";
codeForm.label = "";
} catch (e) {
error.value = e instanceof Error ? e.message : "Ошибка создания кода";
@@ -953,7 +989,10 @@ async function testEmail() {
}
}
-onMounted(load);
+onMounted(() => {
+ restoreLastCreatedCode();
+ load();
+});