From ac9d92d1963d88c69fba3de041d4331a2cb91a37 Mon Sep 17 00:00:00 2001 From: stepan Date: Sun, 13 Sep 2026 21:39:03 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B8=20=D0=B8=20=D0=BA=D0=BE=D0=BB=D0=BE=D0=BD?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=B2=20=D0=B0=D1=83=D0=B4=D0=B8=D1=82=D0=B5=20?= =?UTF-8?q?=D0=BF=D0=BE-=D1=80=D1=83=D1=81=D1=81=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/operator/AuditTable.vue | 26 ++++++++++ src/frontend/src/i18n/locales/ru.js | 52 ++++++++++++++++++- 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/components/operator/AuditTable.vue b/src/frontend/src/components/operator/AuditTable.vue index 4394d29..7901663 100644 --- a/src/frontend/src/components/operator/AuditTable.vue +++ b/src/frontend/src/components/operator/AuditTable.vue @@ -23,6 +23,17 @@ const COLUMNS = [ const ACTOR_TONES = { operator: 'brand', tenant: 'neutral', system: 'warn' } +// Код поля «изменённые настройки» устаревшего формата деталей. +const FIELD_SETTINGS = 'fields' + +// Поля-ссылки на контейнер и служебные контейнеры с человекочитаемыми именами. +const CONTAINER_FIELDS = new Set(['to', 'col', 'containerId']) +const CONTAINER_VALUE_KEYS = { + inbox: 'operator.columnValue.inbox', + archive: 'operator.columnValue.archive', + trash: 'operator.columnValue.trash', +} + // Строковые представления булевых значений в деталях события (как в JSON). const TRUE_VALUE = 'true' const FALSE_VALUE = 'false' @@ -53,9 +64,20 @@ function valueLabel(field, raw) { if (raw === null || raw === undefined || raw === '') return '—' if (raw === TRUE_VALUE) return t('operator.da') if (raw === FALSE_VALUE) return t('operator.net') + if (CONTAINER_FIELDS.has(field) && CONTAINER_VALUE_KEYS[raw]) return t(CONTAINER_VALUE_KEYS[raw]) return translate(`operator.value.${field}.${raw}`, raw) } +// Список ключей настроек из устаревшего формата → русские названия через запятую. +function settingList(raw) { + return String(raw) + .split(',') + .map((key) => key.trim()) + .filter(Boolean) + .map((key) => translate(`operator.setting.${key}`, key)) + .join(', ') +} + function changesOf(row) { return Array.isArray(row.changes) ? row.changes : [] } @@ -63,6 +85,10 @@ function changesOf(row) { // Строка изменения: «Поле: было → стало» либо «Поле: значение». function changeLine(change) { const field = fieldLabel(change.field) + if (change.field === FIELD_SETTINGS) { + return `${field}: ${settingList(change.to)}` + } + const to = valueLabel(change.field, change.to) return hasFrom(change) ? `${field}: ${valueLabel(change.field, change.from)} → ${to}` diff --git a/src/frontend/src/i18n/locales/ru.js b/src/frontend/src/i18n/locales/ru.js index c7f2c20..9c26acf 100644 --- a/src/frontend/src/i18n/locales/ru.js +++ b/src/frontend/src/i18n/locales/ru.js @@ -879,7 +879,7 @@ export const ru = { "status": "Статус", "targetLogin": "Вход", "cardId": "Карточка", - "to": "Куда", + "to": "Колонка", "col": "Колонка", "containerId": "Колонка", "attempted": "Обработано", @@ -892,6 +892,56 @@ export const ru = { "phase": "Этап", "dialogId": "Диалог" }, + "setting": { + "archiveAfterDays": "Срок до архива", + "archiveClearDays": "Очистка архива, дней", + "trashClearDays": "Очистка корзины, дней", + "minLen": "Минимальная длина сообщения", + "discJoinLimit": "Суточный лимит вступлений", + "discJoinDelayMin": "Мин. задержка вступления, сек", + "discJoinDelayMax": "Макс. задержка вступления, сек", + "discEvalSample": "Сообщений для оценки", + "discEvalThreshold": "Порог соответствия, %", + "excludeBudgetFrom": "Исключать бюджет от", + "excludeBudgetTo": "Исключать бюджет до", + "autoArchive": "Автоперенос в архив", + "aiEnabled": "Использовать ИИ", + "aiFilterEnabled": "ИИ-фильтр входящих", + "conversionOn": "Конвертация валют", + "remindersEnabled": "Напоминания", + "mlEnabled": "ML в пайплайне", + "blockResumes": "Блокировать резюме", + "budgetRequiredHire": "Требовать бюджет для вакансий", + "budgetRequiredOrder": "Требовать бюджет для фриланса", + "autoMonitorNew": "Проверять новые каналы автоматически", + "discPaused": "Поиск каналов на паузе", + "targetCurrency": "Целевая валюта", + "rateSource": "Источник курсов", + "aiProvider": "Провайдер ИИ", + "aiPrompt": "Промпт классификатора", + "aiFilterPrompt": "Промпт фильтра", + "cardPrompt": "Промпт структуры карточки", + "domainDescription": "Описание домена", + "wantedType": "Тип заявок", + "hireLabel": "Метка вакансии", + "orderLabel": "Метка фриланса", + "stopPhrases": "Стоп-фразы", + "domainKeywords": "Ключевые слова домена", + "hireMarkers": "Маркеры найма", + "levelTerms": "Термины уровней", + "resumeMarkers": "Маркеры резюме", + "excludeKeywords": "Исключающие слова", + "excludeLocations": "Исключающие локации", + "excludeTypes": "Исключающие типы", + "colState": "Состояние колонок", + "myPrompts": "Мои промпты", + "aiConfigs": "Провайдеры ИИ" + }, + "columnValue": { + "inbox": "Неразобранное", + "archive": "Архив", + "trash": "Корзина" + }, "value": { "status": { "active": "Активен",