diff --git a/docs/app-map/STATUS.md b/docs/app-map/STATUS.md index 6e06b66..075c6a9 100644 --- a/docs/app-map/STATUS.md +++ b/docs/app-map/STATUS.md @@ -18,7 +18,7 @@ | notes | b-mob-notes | 1 | 0.0 | 0.0 | 42 | 21 | нет | diff выложен (`notes.diff.md`); натив пуст — модуль не создан, жду скелет от лида (пинг «готов к регистрации», 093) | | notifications | b-mob-notify | 0 | — | — | — | — | нет | карта готова, diff | | deck | b-mob-deck | 1 | 22.1 | предв. | 53 | ? | нет | diff выложен (`deck.diff.md`); Fd на устройстве; жду приоритизации лида, P1 — меню карточки/бейджи/меню колонки | -| calendar | b-mob-calendar | 0 | — | — | — | — | нет | карта готова, diff | +| calendar | b-mob-calendar | 1 | 51.6 | 67.0 | ~38 | ~7 | нет | diff итер.1 (`calendar.diff.md`); P1 разворот повторений; Appointments — вопрос n-a лиду | | contacts | b-mob-contacts | 1 | 26.7 | предв. | ~40 | ? | нет | diff выложен (7 экранов); P1 — edit/delete (core-правка одобрена 072), далее группы/типы | Обозначения статуса: `карта` → `diff` (итерация 1) → `правки` → `повторный прогон` → diff --git a/docs/app-map/calendar.diff.md b/docs/app-map/calendar.diff.md new file mode 100644 index 0000000..ba2e0f5 --- /dev/null +++ b/docs/app-map/calendar.diff.md @@ -0,0 +1,160 @@ +# Diff: Календарь (Calendar) — итерация 1 (2026-07-13) + +Ff_app: **51.6%** · Fd_app: **67.0%** (среднее по 6 экранам, невзвешенно) · n-a: 0 +_(без экрана Appointments, если владелец сочтёт его мобильно-неприменимым: Ff_app **62.0%** / +Fd_app **80.4%** по 5 экранам — вопрос лиду в конце.)_ + +Сверка веб (`nextcloud/calendar v6.4.0` + тема `_mobile-calendar.css`, карта `calendar.md`) ↔ +натив (`feature/calendar`: `CalendarScreen`, `CalendarComponents`, `CalendarExtendedUi`, +`CalendarViewModel`, `CalendarRepository`, `RecurrenceRule`). Метки: `[Ф|Д]` · `[open|done|n-a]`. +Источник состава — из кода (mail/078); порядок/вид части экранов сверен на живом forbion +(Browser 1 / `cloude`, mail/079). **Живую write-верификацию** пишущих пунктов (`bmob-*`, +mail/085) добавлю следующим проходом — этот прогон из кода + read-сверки. + +> Важно: v0.5.144 закрыл в коде бОльшую часть старых «долгов» из представления (mail/072): +> виды Год/Список, корзина, незапланированные задачи, ответы на приглашения (Принять/Может +> быть/Отклонить) — **уже реализованы** (`done`). Реальные открытые дыры — разворот повторений, +> EXDATE/RECURRENCE-ID, Appointments и часть настроек. Карту `calendar.md` синхронизирую с этим +> (в ней несколько пунктов ошибочно значились как «нет в нативе» — правлю тем же коммитом). + +Прошу приоритизацию: предлагаемый порядок P1→P5 в конце. + +--- + +## Экран 1. Календарь (сетка + шапка + виды) — Ff 90.0% · Fd 75.0% +Ф (10, open 1): +- [Ф][done] предыдущий/следующий период · [Ф][done] «Сегодня» +- [Ф][done] переключатель вида: День/Неделя/Месяц/**Год/Список** (все 5, `CalendarViewMode`) +- [Ф][done] «Создать событие» · [Ф][done] открыть навигацию (бургер) +- [Ф][done] тап по дню → выбор дня · [Ф][done] тап по событию → открыть +- [Ф][done] «Показать незапланированные задачи» (`loadUnscheduledTasks`) +- [Ф][open] **разворот повторяющихся событий в сетке** — `rememberEventsByDay` → + `eventOccursOnDay` кладёт событие только на DTSTART (для timed) / DTSTART..DTEND (all-day), + **RRULE НЕ итерируется**: 2-я и дальше оккуренции в сетке/списке не видны (долг №2 mail/072, + подтверждён лидом). Это ядро P1. +Д (8, open 2): [Д][done] безрамочная месячная сетка + гридлайны (v0.5.114) · [Д][done] «сегодня» +в зелёном круге · [Д][done] пилюли событий (до 2 + «+N») · [Д][done] пилюли дней недели · +[Д][done] таймлайн День/Неделя · [Д][done] русская локализация шапки · [Д][open] пиксель-вид +видов **Год/Список** (в коде есть, вёрстка на устройстве не сверена) · [Д][open] мобильная +модель «месяц+список дня» — сверить скролл/порядок на девайсе. + +## Экран 2. Сайдбар навигации — Ff 61.1% · Fd 80.0% +Ф (18, open 7): +- [Ф][done] «Мои календари» — список · [Ф][done] чекбокс видимости календаря + (`CalendarColorCheckbox`/`onToggleCalendar`) +- [Ф][done] «Изменить календарь» (для не-подписок, `onEditCalendar`) +- [Ф][done] «Добавить календарь»: Новый / Со списком задач / Подписка по ссылке + (`CreateBookMode`) · [Ф][done] Корзина · [Ф][done] Незапланированные задачи · + [Ф][done] Параметры календаря +- [Ф][open] «Копировать публичную ссылку» · [Ф][open] «Копировать ссылку подписки» +- [Ф][open] «Экспорт календаря» (.ics из сайдбара) +- [Ф][open] «Добавить календарь праздников» · [Ф][open] «Добавить произвольный публичный календарь» +- [Ф][open] «Очистить корзину» (сейчас только по одному Восстановить/Удалить навсегда) +- [Ф][open] раздел **Appointments** «Предложенные встречи / Расписание встреч» (см. Экран 5) +- (натив-экстра, не против паритета) «Синхронизация с телефоном» — двусторонний sync с + календарём устройства, в вебе аналога нет. +Д (5, open 1): [Д][done] композиция сайдбара · [Д][done] строка календаря (цвет-чекбокс+имя) · +[Д][done] иконки разделов (тема forbion) · [Д][done] подписки визуально read-only · +[Д][open] отсутствует блок Appointments (порядок/место раздела). + +## Экран 3. Диалог «Добавить / Изменить календарь» (+шаринг) — Ff 60.0% · Fd 85.0% +Ф (10, open 4): +- [Ф][done] имя календаря · [Ф][done] выбор цвета (`CalendarEditBookDialog`) +- [Ф][done] «Поделиться»: поиск получателей (`onSearchSharees`/OCS sharees) · + [Ф][done] добавить с правом чтение/редактирование · [Ф][done] убрать получателя +- [Ф][done] удалить календарь +- [Ф][open] «Напоминания по умолчанию» для этого календаря (full/part-day) +- [Ф][open] «Не показывать меня занятым» (transparent-календарь) +- [Ф][open] «Экспорт» из диалога · [Ф][open] «Убрать у меня» (unshare-from-me для расшаренных) +Д (5, open ~1): [Д][done] лэйаут диалога · [Д][done] цветовые чипы · [Д][done] строки +получателей с меткой (редактирование)/(чтение) · [Д][done] радиокнопки режима создания · +[Д][open] точная сверка панели шаринга по теме (права «видит конфиденциальные» отсутствуют). + +## Экран 4. Параметры календаря (settings-шит) — Ff 15.4% · Fd 70.0% +Ф (13, open 11): +- [Ф][done] «Импорт календарей» (`onImportClick`) · [Ф][done] тумблеры sync-слоя устройства + (натив-специфика) +- [Ф][open] «Номера недель» · [Ф][open] «Выходные» · [Ф][open] «Задачи в календаре» +- [Ф][open] «Плотность День/Неделя» · [Ф][open] «Лимит событий в Месяце» +- [Ф][open] «Простой редактор событий» (сейчас всегда открывается полный, см. Экран 6) +- [Ф][open] «Календарь дней рождения» · [Ф][open] «Напоминание по умолчанию» (full/part) +- [Ф][open] «Календарь по умолчанию для входящих приглашений» +- [Ф][open] «Настройки доступности» (availability) · [Ф][open] инфо-блок «CalDAV URL / адрес + для iOS и macOS» (копирование) +Д (5, open ~2): [Д][done] лэйаут шита настроек · [Д][done] строки-переключатели · +[Д][done] секция импорта · [Д][open] отсутствуют секции General/Editing/Availability/CalDAV · +[Д][open] порядок и группировка пунктов по теме. + +## Экран 5. Appointments / Расписание встреч — Ff 0.0% · Fd 0.0% +Ф (10, open 10) — **раздел отсутствует в нативе целиком**: +- [Ф][open] список расписаний встреч · [Ф][open] «Создать расписание встреч» +- [Ф][open] поля: имя/описание/местоположение/длительность/инкремент +- [Ф][open] «Календарь бронирования» · [Ф][open] «Календари для проверки конфликтов» +- [Ф][open] буферы до/после · [Ф][open] макс. слотов в день / горизонт бронирования +- [Ф][open] «Создать комнату Talk» для встречи · [Ф][open] публичная страница бронирования + (внешний гость: выбор слота → Подтвердить) +Д (n/a пока — экран не реализован). +> ВОПРОС ЛИДУ: Appointments мобильно-применимы или помечаем `n-a` (организаторская фича, чаще +> десктоп)? От ответа зависит, входит ли экран в знаменатель (см. шапку — две метрики). + +## Экран 6. Окно события — Ff 83.3% · Fd 92.0% +Ф (30, open 5): +- [Ф][done] заголовок · [Ф][done] «Весь день» · [Ф][done] дата/время С и По (нативные пикеры) · + [Ф][done] многодневное (отдельная дата окончания) +- [Ф][done] выбор календаря · [Ф][done] местоположение · [Ф][done] описание · [Ф][done] категории +- [Ф][done] добавить/удалить напоминание (тип+смещение, несколько) +- [Ф][done] повтор-пресет · [Ф][done] кастомный повтор (интервал/частота/дни/окончание → + RRULE, `RecurrenceRule`) +- [Ф][done] участники: поиск (OCS sharees) · [Ф][done] удалить участника · [Ф][done] PARTSTAT +- [Ф][done] ответ на приглашение: Принять/Может быть/Отклонить (`respondToInvite`) +- [Ф][done] беседа Talk: выбрать существующую / создать публичную/приватную +- [Ф][done] вложения: из Файлов (WebDAV) · [Ф][done] загрузить с устройства · [Ф][done] удалить +- [Ф][done] занятость free/busy (VFREEBUSY через outbox) +- [Ф][done] сохранить · [Ф][done] копия (duplicate) · [Ф][done] удалить · [Ф][done] экспорт события +- [Ф][open] **редактирование серии «только это / это и будущие» (RECURRENCE-ID)** — нет выбора + области при правке повторяющегося (долг №3) +- [Ф][open] **EXDATE** — исключение отдельной оккуренции / «удалить это повторение» (долг №3) +- [Ф][open] опции ответов: «только приглашённые могут отвечать / любой» + «разрешить пересылку» +- [Ф][open] роли участника (Обязательный/Необязательный/Председатель/Не участвует) + «Запросить + ответ» — сверить полноту в нативе +- [Ф][open] «Подробнее» (переключение простой↔полный редактор) — натив всегда открывает полный +Д (12, open ~1): [Д][done] окно события 1:1 по теме (форк `.f7-calendar-event-view`, v0.5.144: +pill-поля 40dp, шапка с крестиком/галочкой, высота 94%) · [Д][done] нативные пикеры · +[Д][done] строки участников со статус-аватаром · [Д][open] мелкая пиксель-добивка секций +повтора/free-busy на устройстве. + +--- + +## Всплывающие меню (mail/087) — построчная сверка +1. **Меню действий события** (шапка окна, `EventActions`): веб — Дублировать / Экспорт / + Удалить (+ у серии: «Удалить это повторение», «Удалить это и все будущие»). + Натив: Копия `done` · Экспорт `done` · Удалить `done` · **варианты «это/все будущие» `open`** + (следствие RECURRENCE-ID/EXDATE). +2. **Меню «Добавить календарь»** (радио): веб — Новый / Со списком задач / Подписка / (Праздники / + Произвольный публичный). Натив: Новый `done` · Со списком задач `done` · Подписка `done` · + Праздники `open` · Произвольный публичный `open`. +3. **Переключатель вида** (меню «Действия»): веб — День/Неделя/Месяц/Год/Список. Натив: все 5 + `done` (в нативе — сегментированный переключатель, не дропдаун — `[Д]` отличие подачи, не Ф). +4. **Меню вложения** (`attachMenu`): веб — Из Файлов / Загрузить с устройства. Натив: оба `done`. +5. **Строка календаря в сайдбаре**: веб «⋯» — Изменить/Экспорт/Копировать ссылку/Удалить. + Натив: Изменить `done` (открывает диалог с удалением) · Экспорт/Копировать-ссылку `open`. + +## Предлагаемый порядок правок (жду приоритизацию лида) +- **P1 — Разворот повторений в сетке/списке** (Экран 1, долг №2): в `CalendarRepository` + реализовать генерацию оккуренций по RRULE в видимом диапазоне поверх CTag-кэша (по граблям из + ответа лида mail/072: развёртка ПОСЛЕ парсинга, экземпляры не кэшировать, ключ уникальности + `uid+recurrenceStart`). Заодно вскроется `RecurrenceRule.toRrule` для `BYDAY=1MO`. +- **P2 — EXDATE + RECURRENCE-ID** (Экран 6, долг №3): чтение EXDATE (не показывать удалённые + оккуренции) → выбор области правки/удаления «это / это и будущие» → запись без затирания серии. +- **P3 — Настройки** (Экран 4): вынести веб-параметры (номера недель/выходные/задачи-в-календаре/ + дни рождения/напоминание по умолчанию/календарь для приглашений). +- **P4 — Сайдбар-добивка** (Экран 2/3): копирование ссылок, экспорт из сайдбара, transparent, + напоминания по умолчанию календаря, unshare-from-me, очистить корзину. +- **P5 — Опции ответов/роли участников + «Подробнее» simple-редактор** (Экран 6). +- **Appointments (Экран 5)** — вне P1–P5 до решения n-a/применимости (вопрос выше). + +## Вопросы лиду +1. Appointments — `n-a` или в план (влияет на метрику: 51.6/67.0 против 62.0/80.4)? +2. P1 «разворот повторений» подтверждаю как локальный (без ``/core, по mail/072) — ок? +3. Живую write-сверку пишущих пунктов гоню на `bmob-*` событиях/календарях (mail/085) следующим + проходом — приоритет device-сверки Год/Список против P1-кода? diff --git a/docs/app-map/calendar.md b/docs/app-map/calendar.md index ff883c0..83006bd 100644 --- a/docs/app-map/calendar.md +++ b/docs/app-map/calendar.md @@ -47,7 +47,8 @@ Talk) · `Editor/FreeBusy/*` (занятость). «**Список**» (сверено на живом — все 5 пунктов). - `отличие от десктопа:` в мобильной версии переключатель вида спрятан в дропдаун «Действия», а НЕ вынесен видимым тумблером. - - `расхождение (натив):` в клиенте есть только День/Неделя/Месяц; «Год» и «Список» отсутствуют. + - `подача (Д):` в нативе все 5 видов есть (`CalendarViewMode`), но переключатель — + сегментированный, не дропдаун; сверка подачи — в calendar.diff.md. **Тело:** сетка календаря. На мобильном (узкий вьюпорт) модель компактная — месяц сверху + список событий выбранного дня снизу. @@ -56,8 +57,8 @@ Talk) · `Editor/FreeBusy/*` (занятость). - Тап по ячейке дня → выбор дня (список событий этого дня внизу). - Тап по пилюле события → открыть событие (просмотр/редактор). - «**Показать незапланированные задачи**» (сверено на живом) → шит/панель «Незапланированные - задачи» (VTODO без даты из календарей с задачами); «×» закрыть. `расхождение (натив):` панели - незапланированных задач в клиенте нет. + задачи» (VTODO без даты из календарей с задачами); «×» закрыть. В нативе реализовано + (`loadUnscheduledTasks`, `CalendarTrashSheet`-стиль шит) — `done`. ## Экран: Навигация календарей (сайдбар / бургер) Открытие: кнопка «**Открыть навигацию**» в шапке. @@ -165,8 +166,9 @@ Talk) · `Editor/FreeBusy/*` (занятость). отвечать», «Разрешить пересылку». - «**Кнопки ответа на приглашение**» (входящее событие, `InvitationResponseButtons`): «**Принять**» / «**Отклонить**» / «**Под вопросом**». write (iTIP REPLY). - - `расхождение (бэклог, mail/072, долг №4):` экрана accept/decline входящих приглашений в - нативе нет. + - В нативе реализовано: «Принять»/«Может быть»/«Отклонить» (`respondToInvite`) — `done` + (v0.5.144 закрыл этот долг). Открыто: опции «только приглашённые/любой» + «разрешить + пересылку» — см. calendar.diff.md. **Тело — Беседа Talk (`AddTalkModal`, форк `.property-add-talk`):** - «**Добавить беседу Talk**» → модалка: выбрать существующую беседу или создать @@ -182,9 +184,14 @@ Talk) · `Editor/FreeBusy/*` (занятость). (под вопросом)»/«Нет на месте», навигация «Пред./След. дата», легенда. write (POST в DAV outbox — на forbion НЕ выполняю), `визуал(?)`. -## Расхождения натив ↔ forbion (сводный бэклог, приоритет по mail/072) -1. Повторения не разворачиваются в сетке (долг №2, подтверждён лидом) — «Событие: Повторение» / сетка. -2. EXDATE / RECURRENCE-ID не поддержаны (долг №3) — «Событие: шапка / Повторение». -3. Входящие приглашения без «Принять/Отклонить» (долг №4) — «Событие: Участники». -4. Виды «Год» / «Список» отсутствуют в нативе — «Календарь: шапка». -5. `toRrule` не сериализует `BYDAY=1MO` («первый понедельник») — вскроется на развёртке повторений. +## Расхождения натив ↔ forbion +Полная построчная сверка со счётчиком Ff/Fd — в **`calendar.diff.md`** (итерация 1: +Ff_app 51.6% / Fd_app 67.0%). Ключевые открытые (P1→P5): +1. **Разворот повторений** в сетке/списке (`eventOccursOnDay` не итерирует RRULE) — P1. +2. **EXDATE / RECURRENCE-ID** (правка/удаление «это / это и будущие») — P2. +3. **Настройки** (номера недель/выходные/дни рождения/напоминание по умолчанию/…) — P3. +4. **Appointments** (расписания встреч) — отсутствуют целиком; применимость на решении лида. +5. `toRrule` не сериализует `BYDAY=1MO` — вскроется на развёртке (P1). + +_Закрыто в v0.5.144 (было в старых долгах mail/072, теперь `done`):_ виды Год/Список, +корзина, незапланированные задачи, ответы на приглашения (Принять/Может быть/Отклонить).