diff --git a/docs/app-map/deck.md b/docs/app-map/deck.md new file mode 100644 index 0000000..4d06e64 --- /dev/null +++ b/docs/app-map/deck.md @@ -0,0 +1,196 @@ +# Карта: Карточки (Deck) + +Приложение «Карточки» (`/apps/deck/`) на forbion.f7cloud.ru. Структура кнопок/меню/переходов +снята **из кода** (метод mail/078): апстрим `nextcloud/deck` **v1.16.4** (`src/**/*.vue` — точная +версия с forbion, канон README) + мобильная тема forbion +(`design-reference/forbion-theme/css/pages/pages-mobile/_mobile-deck.css`, +`css/pages/app-deck/_app-deck.css`). Живой мобильный web (Browser 1, `cloude`, mail/079) — только +для визуальной сверки «как выглядит/порядок»; **строго read-only** (mail/073): ничего не +создаётся/не меняется/не удаляется. Приватность: реальные названия досок/карточек не +фиксируются — только структура UI и дерево переходов. + +> Статус визуальной сверки на живом forbion: **ожидает**. Дерево ниже построено из кода и +> валидно; отметки `визуал(?)` = требуют финального взгляда на экран (порядок элементов, +> что именно показывает мобильная тема). Как только владелец подтвердит выбор браузера +> `Browser 1 (c9284989)` — пройду экраны и сниму `визуал(?)`. + +## Компоненты-источники (nextcloud/deck v1.16.4) +Навигация: `navigation/AppNavigation.vue` (+ `AppNavigationAddBoard`, `AppNavigationBoard`, +`AppNavigationBoardCategory`, `AppNavigationImportBoard`, `BoardCloneModal`, `BoardExportModal`). +Список досок: `boards/Boards.vue`, `boards/BoardItem.vue`. Обзор: `overview/Overview.vue` +(+ `dashboard/Card.vue`, `views/DashboardToday|Tomorrow|Upcoming.vue`). Доска: `board/Board.vue`, +`board/Stack.vue`, `Controls.vue`. Карточка на доске: `cards/CardItem.vue`, `cards/CardMenu.vue`, +`cards/CardMenuEntries.vue`, `cards/CardBadges.vue`, `cards/AvatarList.vue`, `cards/badges/DueDate.vue`, +`cards/badges/CardId.vue`. Сайдбар карточки: `card/CardSidebar.vue` + табы `CardSidebarTabDetails` +(→ `TagSelector`, `AssignmentSelector`, `DueDateSelector`, `Description`, `AttachmentList`), +`CardSidebarTabAttachments`, `CardSidebarTabComments` (+ `CommentForm`, `CommentItem`), +`CardSidebarTabActivity`. Сайдбар доски: `board/BoardSidebar.vue` + `SharingTabSidebar`, +`TagsTabSidebar`, `DeletedTabSidebar`, `TimelineTabSidebar`. Диалоги: `CardMoveDialog.vue`, +`CardCreateDialog.vue`, `BoardSelector.vue`, `CardSelector.vue`. Настройки: `DeckAppSettings.vue` +(+ `KeyboardShortcuts.vue`). + +## Вход +Шторка приложений (по «трём полоскам») → «Карточки», или прямой URL `/apps/deck/`. Оболочку +(нижняя панель, шторка, бургер) описывает `shell.md` (зона лида) — здесь только специфика +приложения. На мобильном (узкий вьюпорт) тема (`_mobile-deck.css`) раскладывает **доску +колонками по вертикали** (`.smooth-dnd-container.horizontal { flex-direction: column }`), +навигацию убирает под бургер/шторку навигации, а сайдбары/модалки/настройки раскрывает **на +весь экран** (`modal-container height:100%`, `modal-header` скрыт). + +## Экран: Навигация приложения (левая шторка — `AppNavigation`) +На мобильном — за «бургером»/шторкой навигации приложения (не нижняя панель оболочки). +**Тело (пункты по порядку из кода):** +- «**Предстоящие карточки**» (Upcoming cards, `to="/"`) → экран «Обзор» (дашборд по срокам). +- «**Все доски**» (All boards, `to="/board"`, иконка deck) → список досок. +- «**Архивные доски**» (Archived boards, `to="/board/archived"`) → список архивных досок. +- «**Доски, доступные вам**» (Shared with you, `to="/board/shared"`) → список расшаренных досок. +- Список **личных досок** (каждая — `AppNavigationBoard`, см. ниже), сгруппировано по категориям + (`AppNavigationBoardCategory`: персональные / расшаренные — показывается непусто). +- «**Добавить доску**» (Add board, иконка +) → инлайн-создание: цветной bullet (палитра-пикер) + + поле «**Имя доски**» (Board name) + кнопки «Отмена правки»/«Сохранить доску». *(write — не жму.)* +- «**Импорт доски**» (Import board, иконка upload) → диалог импорта (файл). *(write — не жму.)* +- Внизу: «**Настройки Deck**» (Deck settings, шестерёнка) → модалка настроек. + +### Меню доски (⋯ на пункте доски — `AppNavigationBoard` NcActions) +Порядок пунктов из кода: +- «**Сведения о доске**» (Board details, icon-info) → открывает сайдбар доски (см. ниже). +- «**Редактировать доску**» (Edit board, icon-rename; если canManage и не архивная) → + инлайн-правка названия/цвета. +- «**Клонировать доску**» (Clone board; если canCreate) → модалка `BoardCloneModal`. +- «**Разархивировать доску**» / «**Архивировать доску**» (Unarchive/Archive board) — тумблер. +- «**Экспортировать доску**» (Export board, icon-download) → модалка `BoardExportModal`. +- «**Вкл./выкл. напоминания о сроках**» → подменю «**Напоминания о сроках**» (Due date reminders): + «Все карточки» (All cards) / «Назначенные карточки» (Assigned cards) / «Выкл.» (Off). + *(все write — не выполняю.)* + +## Экран: Все доски (список — `Boards.vue`) +**Тело:** таблица-список досок. Тема (`_app-deck.css`, `_mobile-deck.css`) делает каждую строку +карточкой (border, radius 8px). Колонки-заголовки (`board-list-header-row`): +- «**Имя доски**» (Board name) — bullet цвета доски + название (тап по строке → открыть доску). +- «**Участники**» (Members) — аватары ACL (`AvatarList`; если >5 — «+N» иконкой more). +- Поле фильтра списка `navFilter` (быстрый поиск по названию доски) — `визуал(?)` (положение + на мобильной вёрстке). +**Пустое состояние:** стандартный `NcEmptyContent` (тема подставляет deck-иконку). + +## Экран: Доска (`Board.vue` + `Controls.vue`) +**Шапка (`Controls`):** +- «**Название доски**» (bullet цвета в теме скрыт на мобильном) — тап (?) → сайдбар добки. `визуал(?)` +- «**Добавить карточку**» (Add card) — быстрый ввод в первую колонку. *(write — не жму.)* +- Индикатор «(**Архивные карточки**)» (Archived cards) — режим показа архивных. +- «**Добавить список**» (Add list) — инлайн-поле «**Имя списка**» (List name) + подтверждение. + *(write — не жму.)* +- «**Фильтр**» (иконка воронки; активная = primary). Раскрывает поповер «Фильтры»: + - «**Фильтр по метке**» (Filter by tag) — чекбоксы по меткам доски. + - «**Фильтр по назначенному**» (Filter by assigned user) — «Без назначения» (Unassigned) + + список пользователей доски. + - «**Фильтр по статусу**» (Filter by status) — «Открытые и выполненные» (Open and completed) / + «Открытые» (Open) / «Выполненные» (?). `визуал(?)` +**Тело:** колонки-списки (`Stack`) по вертикали (мобильная тема), в каждой — карточки. +**Состояния:** «Загрузка доски» (Loading board) / «Доска не найдена» (Board not found) / +пусто «**Нет доступных списков**» (No lists available) + «Создать новый список, чтобы добавлять +карточки» + поле «Имя списка». + +### Колонка-список (`Stack.vue`) +**Шапка колонки:** +- Заголовок списка — тап (canManage) → инлайн-правка «**Изменить заголовок списка**» (Edit list title). +- Меню колонки (⋯, `NcActions`): «**Архивировать все карточки**» (Archive all cards) / + «**Разархивировать все карточки**» (Unarchive all cards) → подтверждение + («Архивировать все карточки в этом списке» + Архивировать/Отмена); «**Удалить список**» + (Delete list). *(все write — не выполняю.)* +- «**Добавить карточку**» (Add card) → инлайн-поле «**Имя карточки**» (Card name). *(write — не жму.)* +**Тело:** карточки (`CardItem`), drag-n-drop переносом между колонками (мышью/тачем). + +### Карточка на доске (`CardItem` + `CardBadges`) +- Тап по карточке → сайдбар/деталь карточки. +- Заголовок (тап при canEdit / клавиша `E` → инлайн-правка «Edit card title»). +- Бейджи (`CardBadges`): срок (`DueDate` — цвет по просрочке, «выполнено»→галочка), счётчик + «**чек-пунктов**» (Todo items), счётчик «**комментариев**» (N comments, M unread), аватары + назначенных (`AvatarList`), ID карточки (если включён бейдж ID в настройках). +- Меню карточки (⋯ / long-press, `CardMenuEntries`): «**Сведения о карточке**» (Card details) → + сайдбар; «**Изменить заголовок**» (Edit title); «**Назначить мне**» / «**Снять назначение с + меня**» (Assign to me / Unassign myself); «**Отметить выполненной**» / «**Отметить + невыполненной**» (Mark as done / not done); «**Переместить/копировать карточку**» (Move/copy + card) → диалог; «**Архивировать**» / «**Разархивировать карточку**» (Archive/Unarchive card); + «**Удалить карточку**» (Delete card) — с тостом «Карточка удалена» + «Отменить» (undo). + *(все write — не выполняю.)* +- Клавиши на карточке: `E` правка заголовка, `S` назначить себя, archive/done по хоткею (см. настройки). + +## Экран: Обзор / Предстоящие карточки (`Overview.vue`) +Дашборд карточек по срокам (`to="/"`), колонки-секции (мобильная тема ставит их в столбец): +«**Просрочено**» (Overdue), «**Сегодня**» (Today), «**Завтра**» (Tomorrow), «**Ближайшие 7 +дней**» (Next 7 days), «**Позже**» (Later), «**Без срока**» (No due). Каждая секция — список +`dashboard/Card.vue`. Состояние загрузки: «Загрузка отфильтрованного вида». `визуал(?)` (порядок/ +свёрнутость секций на узком экране). + +## Сайдбар карточки (`CardSidebar` — на мобильном во весь экран) +**Шапка:** заголовок карточки (редактируемый), меню (⋯): «**Открыть в боковом виде**» (Open in +sidebar view) / «**Открыть в большом виде**» (Open in bigger view). Подпись «Изменено … ⸱ Создано …». +**Табы (по порядку):** +- **Детали** (Details) — `CardSidebarTabDetails`, порядок секций из кода: + 1. «**Назначить метку карточке…**» (`TagSelector`) — комбобокс «Выбрать или создать метку…», + можно «Создать новую метку». + 2. «**Назначить пользователю/группе/команде**» (`AssignmentSelector`) — «Выбрать пользователя…». + 3. «**Назначить срок карточке…**» (`DueDateSelector`) — «Установить срок» / «Добавить срок»; + быстрые опции: «Позже сегодня», «Завтра», «В эти выходные», «На след. неделе»; «**Выбрать + дату**» (Choose a date) → пикер; «**Убрать срок**» (Remove due date); «**Отметить + выполненной**» (Mark as done); при наличии — «Срок: …»/«Не выполнено»; «Архивировать + карточку». + 4. (если включены проекты) блок связанных проектов (`NcCollectionList`). + 5. «**Описание**» (`Description`) — «Редактировать описание» / «Просмотр описания», «Справка по + форматированию», «Добавить вложение», плейсхолдер «Напишите описание …»; статусы «(Не + сохранено)»/«(Сохранение…)». +- **Вложения** (Attachments) — `CardSidebarTabAttachments` (+ `AttachmentList`): «**Загрузить новые + файлы**» (Upload new files), «**Поделиться из Файлов**» (Share from Files); по элементу: + «Показать в Файлах», «Скачать» (Download), «Удалить вложение», «Восстановить вложение»; drop-зона + «Перетащите файлы для загрузки»; «Эта доска только для чтения». +- **Комментарии** (Comments) — `CardSidebarTabComments` (+ `CommentForm`): поле ввода + «Сохранить»; + пусто «Пока нет комментариев. Начните обсуждение!». +- **Активность** (Activity) — `CardSidebarTabActivity` (если включён Activity-апп). +*(все действия табов — write, на forbion не выполняю.)* + +## Сайдбар доски (`BoardSidebar` — во весь экран на мобильном) +Табы: «**Общий доступ**» (Sharing) — `SharingTabSidebar`: «Поделиться доской с пользователем, +группой или командой …», права по ACL (Can edit / Can share / Can manage / Owner), «Передать +доску» (Transfer) с подтверждением, «Удалить» доступ; «**Метки**» (Tags) — `TagsTabSidebar`: +список меток, «Добавить новую метку», по метке — «Редактировать»/«Удалить»; «**Удалённые +элементы**» (Deleted items) — `DeletedTabSidebar`: «Удалённые списки» / «Удалённые карточки» +(восстановление); «**Активность**» (Activity). *(все write — не выполняю.)* + +## Диалог: Переместить/копировать карточку (`CardMoveDialog`) +- «**Выбрать доску**» (Select a board) — комбобокс. +- «**Выбрать список**» (Select a list; «Нет доступных списков», если пусто). +- Кнопки «**Переместить карточку**» (Move card) / «**Копировать карточку**» (Copy card). + +## Модалка: Настройки Deck (`DeckAppSettings` — во весь экран на мобильном) +- **Общее** (General): «**Использовать увеличенный вид карточки**» (Use bigger card view). +- **Внешний вид** (Appearance): «**Показывать бейдж ID карточки**» (Show card ID badge), + «**Показывать доски в календаре/задачах**» (Show boards in calendar/tasks). +- **Настройки администратора** (Admin settings, если админ): «Ограничить создание досок группами». +- **Комбинации клавиш** (`KeyboardShortcuts`): действия доски (Scroll sideways, навигация + стрелками, Escape закрыть карточку, Ctrl+F поиск, F фильтры, X сброс фильтров, ? справка) и + карточки (Enter/Space открыть, E правка заголовка, S назначить себя). В теме forbion секция + клавиш может быть скрыта на мобильном — `визуал(?)`. + +## Расхождения с нативным клиентом (`feature/deck`) — бэклог +Нативный модуль (`DeckRepository`/`DeckScreen`/`DeckCardSheet`/`DeckViewModel`) сейчас покрывает: +список неархивных досок, доску колонками, карточки (метки/срок/исполнители-**чтение**/done/ +счётчик), деталь карточки (правка названия/описания, срок через пикер, done, toggle меток, +перенос между колонками, архив, удаление), создание карточки и колонки, учёт PERMISSION_EDIT. +**Отсутствует против веба (приоритетный бэклог):** +- **Обзор/Предстоящие карточки** — дашборда по срокам (Просрочено/Сегодня/…/Без срока) нет. +- **Архивные доски** и **Доски, доступные вам** — отдельных видов нет (архивные доски просто скрыты). +- **Фильтры доски** — по метке / назначенному / статусу; поиска по доске нет. +- **Исполнители — только чтение**: нет «Назначить мне/пользователю», снятия (совпадает с долгом №1 + плана mail/071, п.2). +- **Комментарии** и **Вложения** карточки — нет совсем (вложения явно в зоне, mail/065). +- **Меню/CRUD колонки**: правка заголовка списка, «Архивировать/Разархивировать все карточки», + «Удалить список» — в приложении нет (только создание). +- **CRUD досок**: создать/править/клонировать/архивировать/экспортировать/импортировать доску — + нет; переименования колонок нет. +- **Move/copy на другую доску** — нативно только перенос между колонками одной доски. +- **Метки (Tags) доски** — управления (создать/править/удалить) нет; toggle существующих есть. +- **Sharing / Deleted items / Activity** доски — нет. +- **Быстрые опции срока** (Позже сегодня/Завтра/Выходные/След. неделя) — в пикере нет. +- **Напоминания о сроках** (notify-due) и **бейдж ID / увеличенный вид** из настроек — нет. +- **Undo** при удалении карточки — в вебе есть тост-отмена; в нативном удаление сразу. +- Мелочь UI: счётчики чек-пунктов и комментариев на карточке доски — не показываются.