Files
ayurishchevandClaude Sonnet 5 cd09ef0805 Задачи 006-010: пользователи, исправление удаления, журнал отказов, групповые операции, автовыделение префиксов
006 Пользователи: API /users (CRUD, смена своего пароля), раздел UI «Пользователи»,
    события журнала user.*, защита от отключения/удаления себя и последнего админа.
007 Исправление удаления организации: VRF удаляются явным DELETE до организации
    (без relationship() порядок DELETE не гарантирован → ложный 409).
008 Журнал фиксирует отказы в удалении (<entity>.delete_blocked) со списком
    мешающих объектов в «Данных»: организация, VRF, тип устройства, префикс, пользователь.
009 Выбор строк чекбоксами и групповые операции в UI (удаление, смена типа устройств,
    статус префиксов и адресов, доступ пользователей); цикл запросов из UI, итог и список отказов.
010 Автовыделение следующего вложенного префикса: POST/GET /prefixes/{id}/subnets/next,
    первый свободный выровненный блок; пункт «Добавить вложенный (авто)» в меню префикса.

Тесты: 14 (добавлены сценарии для 006, 007/008, 010); исправлена нестабильность
тестов журнала (IPv6-группы с ведущими нулями нормализуются PostgreSQL).
Документация: README.md, docs/changes/006-010 (планы и итоги).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-26 13:25:33 +03:00

5.0 KiB

Итог: выбор нескольких объектов и групповые операции (изменение 009)

Что сделано

  • Чекбоксы и панель действий на экранах «Организации», «Операторы», «Устройства», «Префиксы», «Адреса подсети», «Пользователи» (web/app.js, web/styles.css). Чекбокс в шапке — «выбрать все» (состояние «частично» при неполном выборе). Выбранные строки подсвечены; над таблицей — панель «Выбрано: N · действия · Снять выделение». «Журнал» не затронут; окна «Управление VRF/типами» не входят. Роль viewer чекбоксов и панели не видит.
  • Операции: удаление на всех экранах; «Сменить тип» (устройства); «Статус» (префиксы: Активен/Резерв/Устарел; адреса: Назначен/Резерв/Устаревший); «Разрешить/Отключить доступ» (пользователи).
  • Что выбирается: префиксы — только листовые (как и меню «⋯»); адреса — только не «Свободен»; пользователи — все, кроме своей записи (чекбокс недоступен). Выделение усекается до видимых строк: поиск, фильтр, свёрнутая ветка префиксов и смена экрана не оставляют «невидимых» выбранных.
  • Выполнение — последовательные вызовы существующих DELETE/PATCH из UI (bulk()); бэкенд, API, БД и миграции не менялись. Итог — toast «Удаление: выполнено N из M». Отказ по объекту не прерывает остальные: причины показаны в окне «Выполнено не для всех объектов», отказавшие остаются выбранными, выполненные — снимаются с выделения. Серверные правила сохраняются (свой аккаунт, последний администратор, зависимые объекты). Каждый отказ удаления сам попадает в журнал как <сущность>.delete_blocked (изменение 008). Групповая операция отдельным событием не пишется.
  • Удаление префиксов — без force: префикс с адресами отклоняется и попадает в список отказов; принудительное удаление остаётся в одиночном меню.
  • Артефакты: этот итог, план, раздел «Поведение таблиц UI» в README.md.

Проверка

  • node --check web/app.js; стенд ipam_control_006 пересобран (только app); backend-тесты — 13 passed (новых нет: бэкенд не менялся).
  • Сквозная проверка в headless Chromium (Playwright) на временных данных, 25 проверок, все пройдены: удаление 3 операторов; удаление пары организаций (1 удалена, 1 отклонена с окном причин и записью organization.delete_blocked); смена типа и удаление устройств; отключение доступа и удаление пользователей (у своей записи чекбокс недоступен); смена статуса префиксов и отказ удаления префикса с адресами; смена статуса и «выбрать все» + удаление адресов; в «Журнале» и для viewer чекбоксов нет. Временные данные удалены. Скрипт проверки в репозиторий не добавлялся (правило «минимум тестов»).

Ограничения

  • Операции выполняются по одному запросу на объект, без общей транзакции: при обрыве связи часть объектов может остаться необработанной (видно по итоговому сообщению).
  • «Выбрать все» действует на загруженные строки (на экране адресов — на уже показанные, «Показать ещё 100» подгружает следующие).
  • Свёртывание ветки префиксов снимает выделение со скрытых дочерних строк.