2026-10-24 00:18:31 +04:00

8.3 KiB
Raw Blame History

ADDED Requirements

Requirement: Вики проекта

Приложение SHALL иметь страницу «Вики» (/app/wiki?project=<метка>, пункт боковой панели; текущий проект — как у доски и задач, «Проект в приложении»). Страница SHALL показывать:

  • дерево страниц проекта (GET /wiki/tree) слева, свёрнутое до первого уровня; узел раскрывается по клику;
  • выбранную страницу справа (GET /wiki/pages/{code}): заголовок, дата синхронизации, ссылка «открыть в Eva», Markdown с таблицами, без сырого HTML; ссылки page:<код> открывают страницу вики (код в адресе &page=<код>), ссылки attachment:<id> скачивают вложение (запрос, опрос состояния, сохранение файла браузером), состояние failed — текст ошибки рядом со ссылкой;
  • поиск над деревом (GET /wiki/search): список результатов с фрагментами вместо дерева, пока строка поиска не пуста;
  • кнопку «Обновить вики» (POST /wiki/sync) и плашку хода синхронизации в боковой панели; ответ 409 — плашка текущего пакета;
  • проекта без корня — форму «Корень вики (DOC-… или ссылка)» с кнопкой «Привязать» (PATCH /projects/{label}); 422 — текст ошибки у поля;
  • корень есть, синхронизаций нет — «вики ещё не синхронизирована» и кнопку «Обновить вики»;
  • последняя синхронизация с ошибкой — плашку с текстом ошибки над страницей.

Scenario: Открыть страницу по ссылке

  • WHEN на странице DOC-3 нажата ссылка page:DOC-2
  • THEN адрес /app/wiki?project=AWPCA&page=DOC-2, справа DOC-2, в дереве DOC-2 выделен

Scenario: Проект без корня

  • WHEN открыта /app/wiki?project=sfm_kedr, корня нет; введено DOC-001234, нажато «Привязать»
  • THEN PATCH /projects/sfm_kedr {wiki_root: "DOC-001234"}; боковая панель показывает ход пакета синхронизации

Scenario: Поиск

  • WHEN в строке поиска «согласов»
  • THEN вместо дерева — результаты GET /wiki/search?project=AWPCA&q=согласов; очистка строки возвращает дерево

MODIFIED Requirements

Requirement: Проект в приложении

Доска, список задач и вики SHALL показывать один проект — текущий. Текущий проект SHALL задаваться параметром project в адресе /app/board, /app/issues и /app/wiki; без параметра — последний выбранный в этом браузере (localStorage), если он есть в GET /projects, иначе первый из GET /projects; выбранный проект записывается в адрес без новой записи истории. Проекта из адреса нет в GET /projects — страница SHALL показывать «проект <метка> не найден» и выпадающий список проектов вместо данных. Проектов нет — доска, список и вики SHALL показывать приглашение создать проект («+ Новый проект…»). Переходы между «Доска связей», «Задачи» и «Вики» SHALL сохранять текущий проект. Карточка задачи (/app/issues/{key}) от проекта не зависит.

Доска SHALL загружать GET /board?project=<текущий>; «Обновить из Jira» — POST /refresh {full: true}, обновляет все проекты. Раскладка, дорожки и фильтры доски в localStorage SHALL храниться отдельно для каждого проекта; у проекта AWPCA — на прежних ключах (раскладка, сделанная до проектов, сохраняется). Фильтр спринтов SHALL показываться, только если хотя бы у одной своей задачи снимка (neighbor = false) есть спринт; иначе — «колонки «Спринт» нет — показаны все задачи».

Форма «Новый проект» (пункт «+ Новый проект…» выпадающего списка) SHALL открываться окном поверх страницы: метка, название и поля модулей — номер доски Jira (необязательно; подсказка «scrum или kanban определится сам») и корень вики (необязательно; подсказка «DOC-… или ссылка на страницу Eva»). Пустое необязательное поле в запрос не попадает. «Создать» — POST /projects с автором viewer; ошибка хаба 409/422 — текст detail рядом с кнопкой, окно остаётся открытым; успех — окно закрывается, текущим становится новый проект, боковая панель показывает ход пакета обновления из ответа (batch_id).

Scenario: Первый вход после выкатки

  • WHEN открыт /app/board без project, в localStorage выбора нет, проекты AWPCA и STOCKS_DRRK
  • THEN адрес — /app/board?project=AWPCA, доска — GET /board?project=AWPCA с прежней раскладкой карточек

Scenario: Переключение проекта

  • WHEN на доске AWPCA в выпадающем списке выбран STOCKS_DRRK, затем открыт раздел «Задачи»
  • THEN доска — GET /board?project=STOCKS_DRRK со своей раскладкой; адрес «Задач» — /app/issues?project=STOCKS_DRRK

Scenario: Неизвестный проект в адресе

  • WHEN открыт /app/issues?project=NOPE
  • THEN «проект NOPE не найден» и список проектов; запроса GET /issues нет

Scenario: Создание проекта из формы

  • WHEN в форме введены STOCKS_DRRK, «Запасы ДРРК», доска и корень вики пусто; нажато «Создать»
  • THEN POST /projects {label: "STOCKS_DRRK", name: "Запасы ДРРК", author: "viewer"}; текущий проект — STOCKS_DRRK; боковая панель показывает «пакет #N выполняется»

Scenario: Проект с корнем вики из формы

  • WHEN в форме введены STOCKS_DRRK, «Запасы ДРРК», корень DOC-001234; нажато «Создать»
  • THEN POST /projects {label: "STOCKS_DRRK", name: "Запасы ДРРК", wiki_root: "DOC-001234", author: "viewer"}

Scenario: Метка занята

  • WHEN в форме введена метка awpca, хаб ответил 409
  • THEN окно открыто, рядом с «Создать» — текст ошибки хаба

Scenario: Канбан-проект

  • WHEN текущий проект — STOCKS_DRRK, ни у одной своей задачи снимка нет спринта (у соседа из AWPCA спринт есть)
  • THEN вместо фильтра спринтов — «колонки «Спринт» нет — показаны все задачи»