diff --git a/AGENTS.md b/AGENTS.md index c78fbbd..77b13ff 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -223,3 +223,15 @@ docker logs aegisone-app --tail 10 - Следуй существующему стилю кода - Удаляй неиспользуемый код при изменениях - Не добавляй лишних зависимостей без необходимости + +--- + +## 11. Стили UI (сервисный портал) + +- **Единый гайд:** `py_service/SERVICE_STYLE_GUIDE.md` — читать перед работой с фронтендом +- **Нельзя** использовать `confirm()`, `alert()`, `prompt()` — только `showNotification()` и кастомные модалки +- **Удаление:** простая модалка (Variant A), кнопки: **Действие** (слева) → **Отмена** (справа) +- **Иконки:** `✕` = удалить, `✎` = редактировать, `+` = создать +- **Модалки:** `.modal-overlay` + `.modal`, открытие через `classList.add('open')` +- **Структура страницы:** `card` > `card-header` > `filter-bar` > `table-wrap` > `table` +- **CSS классы кнопок:** `.btn-primary` (создать), `.btn-secondary` (редактировать), `.btn-danger` (удалить), `.btn-success` (выполнено) diff --git a/max_bot/version.txt b/max_bot/version.txt index fe4e75f..7b378be 100644 --- a/max_bot/version.txt +++ b/max_bot/version.txt @@ -1 +1 @@ -1.8.3 \ No newline at end of file +1.8.4 \ No newline at end of file diff --git a/py_service/CHANGELOG.md b/py_service/CHANGELOG.md index bb95409..d100e60 100644 --- a/py_service/CHANGELOG.md +++ b/py_service/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog — AegisOne Service Portal +## 1.8.4 (02.06.2026) +### Новые функции +- **SERVICE_STYLE_GUIDE.md:** единый гайд стилей сервисного портала +- **AGENTS.md (раздел 11):** правила стилей UI — см. SERVICE_STYLE_GUIDE.md +- **CSS `.modal-actions`:** общий класс для кнопок в модалках + +### Исправления +- **bot_dialogues.html:** скрыт `main-header` (дублирующий заголовок с датой) +- **bot_kb.html:** замена кастомных классов на `.modal-overlay`/`.modal`, `confirm()` → кастомная модалка, иконки ✎/✕ +- **bot_unknown.html:** `.modal-box` → `.modal`, `confirm()` → кастомная модалка, иконки ✎/✕ +- **bot_consent.html:** `confirm()` → кастомная модалка удаления пользователя +- **bot_test.html:** `confirm()` → кастомная модалка очистки тестовых данных +- **charts.html:** `prompt()` → кастомная модалка ввода имени графика, `confirm()` → кастомная модалка удаления +- **role_settings.html:** `alert()` → `showNotification()` +- **10 простых страниц:** blog, cases, coefficients, customers, formulas, ideas, objects, questionnaire_config, tasks, users — `confirm()` → кастомные модалки с уникальными ID +- **migrations_runner.py:** split SQL на `;` для совместимости с asyncpg + ## 1.8.3 (02.06.2026) ### Новые функции - **Docstrings:** добавлены docstrings и комментарии по AGENTS.md ко всем ключевым Python-файлам diff --git a/py_service/SERVICE_STYLE_GUIDE.md b/py_service/SERVICE_STYLE_GUIDE.md new file mode 100644 index 0000000..4acac07 --- /dev/null +++ b/py_service/SERVICE_STYLE_GUIDE.md @@ -0,0 +1,230 @@ +# Сервисный портал AegisOne — Единый стиль + +> Этот документ ОБЯЗАН прочитать каждый AI-агент перед изменением шаблонов/CSS сервисного портала. + +--- + +## 1. Структура страницы + +Каждая страница наследует `page.html` и реализует блок `page_content`. + +### Порядок элементов в правой части (main): + +``` +page.html main-header: + left: h1 (заголовок) + breadcrumb + right: page_actions block + дата {{ now }} + +page_content: + 1. div.card — основной контент + ├── div.card-header — заголовок + кнопка действия + ├── div.filter-bar — фильтры (если нужны) + └── div.table-wrap > table — таблица данных + + 2. div.modal-overlay#modal-xxx — модалка создания/редактирования + 3. div.modal-overlay#confirm-delete-xxx — модалка подтверждения удаления +``` + +### Card Header: + +```html +
+

Название секции

+ +
+``` + +--- + +## 2. Модалки + +### Единые CSS-классы + +| Класс | Назначение | +|-------|-----------| +| `.modal-overlay` | Затемнённый фон (position: fixed, z-index: 200) | +| `.modal-overlay.open` | Показать модалку (display: flex) | +| `.modal` | Контейнер модалки (фон, рамка, скругление) | +| `.modal-close` | Кнопка закрытия (✕) в правом верхнем углу | +| `.form-actions` | Блок кнопок внизу модалки (display: flex, gap: 10px) | + +### Открытие/закрытие + +```javascript +// Открыть +document.getElementById('modal-xxx').classList.add('open'); + +// Закрыть +document.getElementById('modal-xxx').classList.remove('open'); + +// Или изнутри кнопки +this.closest('.modal-overlay').classList.remove('open'); +``` + +**ЗАПРЕЩЕНО:** использовать `style.display = 'flex'` / `style.display = 'none'` + +### Модалка создания/редактирования (стандарт) + +```html + +``` + +### Модалка подтверждения удаления (единый шаблон) + +**ЗАПРЕЩЕНЫ:** `confirm()`, `alert()`, `prompt()` — только кастомные модалки! + +```html + +``` + +### Порядок кнопок в модалках + +``` +[ Действие (btn-danger / btn-primary) ] [ Отмена (btn) ] + слева справа +``` + +--- + +## 3. Кнопки + +### Иконки + +| Иконка | Назначение | CSS-класс | +|--------|-----------|-----------| +| `+` | Создание (перед текстом) | `btn btn-primary btn-sm` | +| `✎` | Редактирование | `btn btn-secondary btn-sm` | +| `✕` | Удаление | `btn btn-danger btn-sm` | +| `✓` | Завершение/включение | `btn btn-success btn-sm` | +| `🗑` | Удаление (только в карточках) | `btn btn-danger btn-sm` | + +### CSS-классы кнопок + +| Класс | Назначение | +|-------|-----------| +| `.btn` | Базовая кнопка | +| `.btn-primary` | Основное действие (синий) | +| `.btn-secondary` | Вторичное действие (серый) | +| `.btn-danger` | Удаление/опасное действие (красный) | +| `.btn-success` | Успех/завершение (зелёный) | +| `.btn-warning` | Предупреждение (жёлтый) | +| `.btn-sm` | Маленький размер | + +### Таблицы — колонка действий + +```html + + + + + +``` + +--- + +## 4. Уведомления + +### Показ уведомлений + +```javascript +showNotification('Текст уведомления', 'success'); // зелёное +showNotification('Текст уведомления', 'error'); // красное +showNotification('Текст уведомления', 'warning'); // жёлтое +showNotification('Текст уведомления', 'info'); // синее +``` + +**ЗАПРЕЩЕНЫ:** `alert()`, `prompt()`, `confirm()` — только `showNotification()` и кастомные модалки! + +--- + +## 5. Фильтры + +```html +
+ + +
+``` + +--- + +## 6. Таблицы + +```html +
+ + + + + + + + + + {% for item in items %} + + + + + + {% endfor %} + +
Колонка 1Колонка 2
{{ item.field }}{{ item.field2 }} + + +
+
+``` + +--- + +## 7. Страницы с JS-рендерингом + +Для страниц, где данные загружаются через `fetch()` (bot_consent, bot_dialogues, bot_kb, bot_tickets, bot_unknown, charts): + +- Таблица рендерится через `renderXxx(data)` в JavaScript +- Фильтрация через `filterXxx()` на клиенте +- Модалки подтверждения удаления — те же HTML-шаблоны + +--- + +## 8. Чек-лист перед коммитом + +- [ ] Нет `confirm()`, `alert()`, `prompt()` в коде +- [ ] Модалки открываются через `classList.add('open')` +- [ ] Модалки закрываются через `classList.remove('open')` +- [ ] Кнопки удаления: `✕` (btn-danger) +- [ ] Кнопки редактирования: `✎` (btn-secondary) +- [ ] Порядок кнопок в модалках: Действие → Отмена +- [ ] Уведомления через `showNotification()` +- [ ] CSS-классы модалок: `.modal-overlay` / `.modal` diff --git a/py_service/app/static/css/service.css b/py_service/app/static/css/service.css index 531dd26..87585d5 100644 --- a/py_service/app/static/css/service.css +++ b/py_service/app/static/css/service.css @@ -576,6 +576,12 @@ table .actions button { cursor: pointer; } +.modal-actions { + display: flex; + gap: 10px; + margin-top: 20px; +} + /* ---------- TABS ---------- */ .tabs { display: flex; diff --git a/py_service/app/templates/pages/blog.html b/py_service/app/templates/pages/blog.html index 608a9a5..32053f0 100644 --- a/py_service/app/templates/pages/blog.html +++ b/py_service/app/templates/pages/blog.html @@ -11,7 +11,7 @@ {{ p.created_at.strftime('%d.%m.%Y') if p.created_at else '' }} -
+
{% endfor %} @@ -33,7 +33,34 @@ + {% endblock %} diff --git a/py_service/app/templates/pages/users.html b/py_service/app/templates/pages/users.html index e17e4c7..5d57c68 100644 --- a/py_service/app/templates/pages/users.html +++ b/py_service/app/templates/pages/users.html @@ -16,9 +16,9 @@ {% if u.role != 'owner' %} -
+ - +
{% endif %} {% endfor %} @@ -53,7 +53,34 @@ +