chore(openspec): sync lightroom-workspace-ui with implemented changes
Reflect post-planning work in proposal, design, specs (albums/photos/ ui-workspace) and tasks: photo rename, viewer delete/zoom/fullscreen, resizable and collapsible panels with EXIF, upload size limit, album counts, themes/scrollbars, back navigation.
This commit is contained in:
@@ -29,3 +29,11 @@
|
||||
#### Scenario: Нет прав на смену обложки
|
||||
- **WHEN** участник без права редактирования пытается сменить обложку
|
||||
- **THEN** система отклоняет запрос
|
||||
|
||||
### Requirement: Счётчики альбома
|
||||
Данные альбома SHALL включать количество фото и участников, чтобы панель и карточки могли
|
||||
показать их без отдельных запросов.
|
||||
|
||||
#### Scenario: Счётчики в ответе
|
||||
- **WHEN** клиент запрашивает список альбомов или альбом по id
|
||||
- **THEN** ответ содержит число фото и число участников альбома
|
||||
|
||||
@@ -13,3 +13,31 @@
|
||||
#### Scenario: Обложка уже задана
|
||||
- **WHEN** фото обработано, а обложка уже задана
|
||||
- **THEN** система не меняет обложку
|
||||
|
||||
### Requirement: Переименование фото
|
||||
Автор фото, владелец и админ альбома SHALL иметь возможность изменить имя файла фото;
|
||||
остальные SHALL получать отказ, а пустое имя SHALL отклоняться.
|
||||
|
||||
#### Scenario: Переименование автором
|
||||
- **WHEN** автор меняет имя файла своего фото на непустое
|
||||
- **THEN** система сохраняет новое имя и транслирует изменение подписчикам альбома
|
||||
|
||||
#### Scenario: Пустое имя
|
||||
- **WHEN** пользователь подтверждает пустое имя файла
|
||||
- **THEN** система отклоняет запрос
|
||||
|
||||
#### Scenario: Нет прав
|
||||
- **WHEN** участник без прав переименовывает чужое фото
|
||||
- **THEN** система отклоняет запрос
|
||||
|
||||
### Requirement: Ограничение размера загрузки
|
||||
Система SHALL ограничивать размер загружаемых файлов и SHALL отвечать понятной ошибкой при
|
||||
превышении лимита, а не ошибкой разбора формы.
|
||||
|
||||
#### Scenario: Превышение лимита
|
||||
- **WHEN** загружаемый файл превышает максимальный размер
|
||||
- **THEN** система отклоняет загрузку с явной ошибкой о превышении размера
|
||||
|
||||
#### Scenario: Файл в пределах лимита
|
||||
- **WHEN** файл не превышает лимит
|
||||
- **THEN** система принимает multipart-загрузку и обрабатывает фото
|
||||
|
||||
@@ -91,9 +91,10 @@ SHALL отображаться вне каркаса, но в общей тем
|
||||
- **WHEN** пользователь открывает альбом без фото и имеет право загрузки
|
||||
- **THEN** в центре показана зона-подсказка загрузки
|
||||
|
||||
### Requirement: Тёмная графитовая тема
|
||||
### Requirement: Темы и графитовый хром
|
||||
Тёмная тема SHALL использовать графитовый хром Lightroom и SHALL применяться по умолчанию;
|
||||
остальные темы SHALL оставаться доступными.
|
||||
нейтральная тема SHALL быть тёплым графитом; остальные темы SHALL оставаться доступными, а
|
||||
скроллбары SHALL быть стилизованы в цвет темы.
|
||||
|
||||
#### Scenario: Первый вход
|
||||
- **WHEN** пользователь впервые открывает приложение без сохранённой темы
|
||||
@@ -101,7 +102,11 @@ SHALL отображаться вне каркаса, но в общей тем
|
||||
|
||||
#### Scenario: Смена темы
|
||||
- **WHEN** пользователь выбирает другую тему
|
||||
- **THEN** интерфейс и иконки переключаются согласованно и выбор сохраняется
|
||||
- **THEN** интерфейс, иконки и скроллбары меняются согласованно, и выбор сохраняется
|
||||
|
||||
#### Scenario: Нейтральная тема
|
||||
- **WHEN** пользователь выбирает нейтральную тему
|
||||
- **THEN** применяется тёплый графитовый хром, отличный от холодной тёмной темы
|
||||
|
||||
### Requirement: Адаптивность рабочего стола
|
||||
На узких экранах рейл SHALL становиться выдвижной панелью, контекстная панель —
|
||||
@@ -119,3 +124,77 @@ SHALL отображаться вне каркаса, но в общей тем
|
||||
#### Scenario: Клавиатурная навигация
|
||||
- **WHEN** пользователь работает только с клавиатуры
|
||||
- **THEN** органы управления каркаса достижимы, доступные имена присутствуют, фокус виден
|
||||
|
||||
### Requirement: Изменение ширины панелей
|
||||
Пользователь SHALL иметь возможность менять ширину левой и правой панелей перетаскиванием, а
|
||||
выбранная ширина SHALL сохраняться между сессиями.
|
||||
|
||||
#### Scenario: Перетаскивание разделителя
|
||||
- **WHEN** пользователь тянет разделитель у панели на рабочем столе
|
||||
- **THEN** панель меняет ширину в допустимых пределах
|
||||
|
||||
#### Scenario: Сохранение ширины
|
||||
- **WHEN** пользователь перезагружает приложение
|
||||
- **THEN** восстановленные панели имеют сохранённую ширину
|
||||
|
||||
### Requirement: Сворачиваемые разделы панели
|
||||
Контекстная панель SHALL группировать содержимое в сворачиваемые разделы, а состояние
|
||||
сворачивания SHALL сохраняться; раздел «Информация» SHALL показывать метаданные EXIF фото.
|
||||
|
||||
#### Scenario: Сворачивание раздела
|
||||
- **WHEN** пользователь нажимает заголовок раздела
|
||||
- **THEN** содержимое раздела скрывается или показывается, состояние сохраняется
|
||||
|
||||
#### Scenario: Метаданные фото
|
||||
- **WHEN** открыт просмотр фото
|
||||
- **THEN** раздел «Информация» показывает размер, тип, разрешение, дату съёмки и координаты
|
||||
|
||||
### Requirement: Полноэкранный просмотр фотографии
|
||||
В режиме просмотра SHALL быть доступен переход в полноэкранный режим кнопкой и хоткеем `f`.
|
||||
|
||||
#### Scenario: Вход в полный экран
|
||||
- **WHEN** пользователь нажимает кнопку полного экрана или клавишу `f`
|
||||
- **THEN** просмотр разворачивается на весь экран
|
||||
|
||||
#### Scenario: Выход из полного экрана
|
||||
- **WHEN** пользователь повторно нажимает кнопку или клавишу `f`
|
||||
- **THEN** полноэкранный режим закрывается
|
||||
|
||||
### Requirement: Зум в просмотре
|
||||
Просмотр SHALL поддерживать зум: колесо мыши меняет масштаб, `Space` переключает 100%, а при
|
||||
увеличении фото SHALL панорамироваться. Зум SHALL работать и в полноэкранном режиме.
|
||||
|
||||
#### Scenario: Зум колесом
|
||||
- **WHEN** пользователь вращает колесо мыши над фото
|
||||
- **THEN** масштаб фото меняется относительно положения курсора
|
||||
|
||||
#### Scenario: 100% по пробелу
|
||||
- **WHEN** пользователь нажимает `Space`
|
||||
- **THEN** фото показывается в масштабе 100% (1:1), повторное нажатие возвращает вписанный вид
|
||||
|
||||
#### Scenario: Панорамирование
|
||||
- **WHEN** фото увеличено
|
||||
- **THEN** пользователь может перемещать изображение перетаскиванием и прокруткой
|
||||
|
||||
### Requirement: Удаление фото из просмотра
|
||||
Автор фото, владелец и админ альбома SHALL иметь возможность удалить текущее фото из режима
|
||||
просмотра; удаление SHALL подтверждаться диалогом.
|
||||
|
||||
#### Scenario: Подтверждение удаления
|
||||
- **WHEN** пользователь с правом удаления нажимает «Удалить»
|
||||
- **THEN** открывается диалог подтверждения, и после подтверждения фото удаляется
|
||||
|
||||
#### Scenario: Лента после удаления
|
||||
- **WHEN** фото удалено
|
||||
- **THEN** просмотр переходит к соседнему фото, а лента миниатюр обновляется без удалённого
|
||||
|
||||
### Requirement: Возврат к обзору
|
||||
Из альбома и из режима просмотра SHALL быть доступен возврат к обзору альбомов.
|
||||
|
||||
#### Scenario: Возврат из альбома
|
||||
- **WHEN** пользователь нажимает кнопку «назад» слева от названия альбома
|
||||
- **THEN** открывается обзор альбомов
|
||||
|
||||
#### Scenario: Возврат из просмотра
|
||||
- **WHEN** пользователь нажимает кнопку «назад» в режиме просмотра
|
||||
- **THEN** открывается альбом с сеткой фото
|
||||
|
||||
Reference in New Issue
Block a user