Files
vesti/openspec/changes/archive/2026-09-16-candidates-buttons-order/design.md
T

5.2 KiB

Design

Файл: /opt/vesti/web/templates/candidates.html, правая панель ({% if selected %}), блок действий (строки ~150–184).

Текущая разметка

<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-формы они уже есть).

<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 — «Сохранить комментарий».