mirror of
https://gitverse.ru/kpa39l/vesti.git
synced 2026-09-29 18:05:03 +00:00
562d787f1b
- reject/reject-old (single + bulk): редирект на /candidates с текущей группировкой вместо /candidates?status=rejected — не прерываем отбор. Отклонённые доступны через фильтр статуса. - candidates.html: Обработать/Переписать/Отклонить — один ряд над полем комментария (после переноса Опубликовать в approve-форму кнопки съехали). changes: candidates-buttons-order, reject-stay-candidates (skip_specs, валидны).
106 lines
5.2 KiB
Markdown
106 lines
5.2 KiB
Markdown
## Design
|
||
|
||
Файл: `/opt/vesti/web/templates/candidates.html`, правая панель
|
||
(`{% if selected %}`), блок действий (строки ~150–184).
|
||
|
||
### Текущая разметка
|
||
|
||
```html
|
||
<div class="mb-3 d-flex flex-wrap gap-2">
|
||
{% set hid %}...{% endset %}
|
||
{% if selected.status != 'published' %}
|
||
<form method="post" action="/posts/{{ selected.id }}/approve" id="approve-form">
|
||
{{ hid }}
|
||
<label class="form-label small text-muted mb-0">💬 Мой комментарий...</label>
|
||
<textarea class="form-control form-control-sm mt-1" name="comment" rows="2"
|
||
placeholder="Комментарий/анонс…">{{ selected.comment or '' }}</textarea>
|
||
<div class="mt-2 d-flex gap-2">
|
||
<button class="btn btn-success" type="submit" title="...">✅ Опубликовать</button>
|
||
<button class="btn btn-sm btn-outline-secondary" type="submit"
|
||
formaction="/posts/{{ selected.id }}/comment" title="...">💾 Сохранить комментарий</button>
|
||
</div>
|
||
</form>
|
||
{% endif %}
|
||
{% if selected.status != 'published' %}
|
||
<form method="post" action="/posts/{{ selected.id }}/reclassify">
|
||
{{ hid }}
|
||
<button class="btn btn-info" type="submit" title="...">🤖 Обработать моделью</button>
|
||
</form>
|
||
{% endif %}
|
||
{% if selected.status != 'published' %}
|
||
<form method="post" action="/posts/{{ selected.id }}/rewrite">
|
||
{{ hid }}
|
||
<button class="btn btn-outline-primary" type="submit" title="...">✍️ Переписать</button>
|
||
</form>
|
||
{% endif %}
|
||
{% if selected.status != 'rejected' and selected.status != 'published' %}
|
||
<form method="post" action="/posts/{{ selected.id }}/reject">
|
||
{{ hid }}
|
||
<button class="btn btn-outline-danger" type="submit">🚫 Отклонить</button>
|
||
</form>
|
||
{% endif %}
|
||
</div>
|
||
```
|
||
|
||
### Новая разметка
|
||
|
||
Кнопки действий выносятся в ОДИН flex-ряд НАД полем комментария; approve-форма
|
||
остаётся обёрткой только для «Опубликовать» + «Сохранить комментарий» + textarea
|
||
(поля `hid` нужны каждой форме; внутри approve-формы они уже есть).
|
||
|
||
```html
|
||
<div class="mb-3 d-flex flex-wrap gap-2">
|
||
{% set hid %}...{% endset %}
|
||
{% if selected.status != 'published' %}
|
||
<form method="post" action="/posts/{{ selected.id }}/reclassify">
|
||
{{ hid }}
|
||
<button class="btn btn-info" type="submit" title="...">🤖 Обработать моделью</button>
|
||
</form>
|
||
{% endif %}
|
||
{% if selected.status != 'published' %}
|
||
<form method="post" action="/posts/{{ selected.id }}/rewrite">
|
||
{{ hid }}
|
||
<button class="btn btn-outline-primary" type="submit" title="...">✍️ Переписать</button>
|
||
</form>
|
||
{% endif %}
|
||
{% if selected.status != 'rejected' and selected.status != 'published' %}
|
||
<form method="post" action="/posts/{{ selected.id }}/reject">
|
||
{{ hid }}
|
||
<button class="btn btn-outline-danger" type="submit">🚫 Отклонить</button>
|
||
</form>
|
||
{% endif %}
|
||
{% if selected.status != 'published' %}
|
||
<form method="post" action="/posts/{{ selected.id }}/approve" id="approve-form">
|
||
{{ hid }}
|
||
<div class="mt-0 d-flex gap-2">
|
||
<button class="btn btn-success" type="submit" title="...">✅ Опубликовать</button>
|
||
</div>
|
||
<label class="form-label small text-muted mb-0 mt-2">💬 Мой комментарий...</label>
|
||
<textarea class="form-control form-control-sm mt-1" name="comment" rows="2"
|
||
placeholder="Комментарий/анонс…">{{ selected.comment or '' }}</textarea>
|
||
<div class="mt-2">
|
||
<button class="btn btn-sm btn-outline-secondary" type="submit"
|
||
formaction="/posts/{{ selected.id }}/comment" title="...">💾 Сохранить комментарий</button>
|
||
</div>
|
||
</form>
|
||
{% endif %}
|
||
</div>
|
||
```
|
||
|
||
Порядок в ряду: «🤖 Обработать моделью» → «✍️ Переписать» → «🚫 Отклонить» →
|
||
«✅ Опубликовать» (кнопка публикации — правая, главная). Затем — поле
|
||
комментария и «💾 Сохранить комментарий».
|
||
|
||
Все кнопки остаются `type="submit"` в своих формах; `formaction` у
|
||
«Сохранить комментарий» сохраняется; логика видимости не меняется.
|
||
|
||
## Верификация
|
||
|
||
- `openspec validate candidates-buttons-order` — чисто.
|
||
- Рендер шаблона проверяется только ч/з сам сервис (TestClient/живой GET),
|
||
т.к. прямой рендер `tpl.get_template(...)` блокируется политикой.
|
||
- Перезапуск: `sudo systemctl restart vesti-web` (Jinja2-кеш!).
|
||
- Ручная проверка: `GET /candidates` → выбран неопубликованный пост → в
|
||
правой панели НАД полем комментария в одном ряду кнопки
|
||
Обработать/Переписать/Отклонить/Опубликовать, под textarea — «Сохранить
|
||
комментарий». |