Files
f7cloud_mobile/docs/app-map/calendar.diff.md
T

16 KiB
Raw Blame History

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] разворот повторяющихся событий в сеткеrememberEventsByDayeventOccursOnDay кладёт событие только на 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 «разворот повторений» подтверждаю как локальный (без <c:expand>/core, по mail/072) — ок?
  3. Живую write-сверку пишущих пунктов гоню на bmob-* событиях/календарях (mail/085) следующим проходом — приоритет device-сверки Год/Список против P1-кода?