83 lines
8.3 KiB
Markdown
83 lines
8.3 KiB
Markdown
## 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** вместо фильтра спринтов — «колонки «Спринт» нет — показаны все задачи»
|