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>
5.0 KiB
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» подгружает следующие).
- Свёртывание ветки префиксов снимает выделение со скрытых дочерних строк.