История правок и откат
История правок — ваши последние операции с сетью и свойствами, новые сверху. Отменённые помечены, каждую можно показать на карте, а «Откатить до сюда» отменяет правки от последней до выбранной включительно.
Возможности
- Список ваших последних операций редактора — правок сети и свойств из журнала отмены, новые сверху, с названием, временем и отметкой «отменено».
- Кнопка с рамкой-прицелом — показать место правки на карте.
- У последней неотменённой правки — «Отменить», у более ранних — «Откатить до сюда»: отмена всех правок от последней до выбранной включительно.
- Кнопка обновления списка в заголовке окна.
Как это работает
Откуда список. Окно читает журнал отмены topology_undo_log — только операции текущего пользователя, последние 50. Каждая запись хранит название операции, краткое описание (номера узлов и участков, длина, тип) и границы области на карте для кнопки «Показать».
Откат до места. Окно передаёт серверу операции, которые показывало, — от последней до выбранной. Сервер отменяет ровно их, по одной, каждую в своей транзакции — как несколько Ctrl+Z подряд. Если сверху журнала оказалась другая операция (вы правили в другой вкладке или с другого компьютера после открытия истории), откат останавливается с причиной «Последняя операция изменилась — обновите список» и чужую для этого списка правку не трогает. Отмена каждой сверяет контрольные суммы строк: если объект изменили после этой операции (другой пользователь, десктоп или ваша же более поздняя правка, которую отменить нельзя), откат останавливается на ней. Уже отменённое остаётся отменённым, уведомление пишет «Отменено правок: N; дальше нельзя — причина». При полном успехе — «Отменено правок: N».
Подтверждение. При откате больше чем одной правки окно спрашивает: «Отменить 2 последние правки — до «…» включительно?» (число и форма слова — по количеству правок). Одна правка отменяется сразу.
Повтор. Отменённые правки возвращает «Повторить» (Ctrl+Y) — по одной, начиная с последней отменённой, пока их объекты не изменены.
Что нужно для работы
- Любое право на правку сети; отмена и повтор — при флагах API
MUTATIONS_ENABLEDиTOPOLOGY_MUTATIONS_ENABLED. - Таблица журнала
topology_undo_logв базе города (API создаёт её сам). Правки, записанные без журнала, в истории не видны и не отменяются.
Шаги
Нажмите кнопку «История правок» на панели редактора (или H).

Окно «История правок»: операция, время, отменена ли. Кнопка с рамкой-прицелом показывает место на карте, «Откатить до сюда» — откат до этой строки (у самой новой правки кнопка называется «Отменить»).

Подтверждение называет, сколько правок отменится и до какой операции включительно. Нажмите «Откатить».

Уведомление «Отменено правок: …». Отменённые строки в истории остаются, с отметкой «отменено» и временем.

Примеры
На копии базы Алматы, фрагмент 74. Сделаны трасса, смена типа конечного узла на «Потребитель», разворот участка и его разрез — четыре строки истории. «Откатить до сюда» на строке «Разворот участка …» спросило «Отменить 2 последние правки — до «разворот участка …» включительно?» и отменило разрез и разворот одной командой; трасса и смена типа узла остались.
В e2e-тесте после девяти операций откат до «Разрезания участка» отменил шесть операций (разрез, новый узел, слияние, соединение труб, тип линии, трасса по координатам). Участок трассы снова целый, его длина совпала с исходной.
Если не получается
- «Отменено правок: N; дальше нельзя — …» — одну из операций отменить нельзя: её объекты изменили после неё. Откат остановился на ней, более поздние правки уже отменены.
- Нет нужной правки — в истории только ваши операции и только записанные с журналом отмены.
- Повторить откат нельзя пачкой — после отката «Повторить» (Ctrl+Y) возвращает правки по одной.
- В истории чужие операции — на стенде без входа все работают под одним пользователем, и журнал у них общий. На рабочем сервере у каждого пользователя своя история.
- Откат остановился раньше выбранной строки — объект этой операции изменили позже: смотрите причину в уведомлении и правьте вручную.
- «Последняя операция изменилась — обновите список» — после открытия истории вы сделали правку в другой вкладке или сессии: обновите историю (кнопка вверху окна) и выберите место заново.
- Строки «Импорт фрагмента» и «Слияние фрагментов» — операции окна «Фрагменты: экспорт, импорт, слияние»; откатываются так же.
Для разработчика
GET /api/v1/topology/history?limit=1..200→items: [{operation_id, operation, summary, created_at, undone_at, redone_at, objects, undo_supported, bbox}].POST /api/v1/topology/undo-to {operation_id, expected}→{undone: [...], stopped: {reason} | null, target, complete}.expected— показанные неотменённые операции доoperation_id: отменяются только они, другая операция сверху — остановка;operation_idне изexpected— 422. Безexpected(старый клиент) — подряд всё сверху журнала. Тест —tests/test_topology_undo_to.py.GET|POST /api/v1/topology/undo,GET|POST /api/v1/topology/redo— последняя отменяемая или повторяемая операция и её отмена или повтор; 404 — нечего, 409 — объекты изменены.- Сервер:
database/topology_history.py(operation_history,undo_to,HISTORY_LIMIT = 200),database/topology_journal.py(образы строк и контрольные суммы). - Веб:
components/EditHistoryPanel.vue, названия операций —utils/topologyLabels.ts(topologyOperationLabel), Ctrl+Z / Ctrl+Y —composables/useTopologyEditor.ts. - Тесты: API
tests/test_history.py,tests/test_topology_undo.py, вебtests/utils/topologyLabels.spec.ts; e2e — тесты «отмена и повтор» и «история правок (H)» вe2e/functions/network-editor.spec.ts.
