Files

18 KiB
Raw Permalink Blame History

Карта: Календарь

Приложение «Календарь» (/apps/calendar/) на forbion.f7cloud.ru. Структура кнопок/меню снята из кода (метод mail/078): апстрим nextcloud/calendar v6.4.0 (src/**/*.vue — точная версия с forbion, канон README) + мобильная тема forbion (design-reference/forbion-theme/css/pages/pages-mobile/_mobile-calendar.css, css/pages/app-calendar/). Живой мобильный web (Browser 1, cloude, mail/079) — только для визуальной сверки «как выглядит/порядок»; строго read-only (mail/073): ничего не создаётся/не меняется/не удаляется, приглашения не отправляются, free/busy-запросы не шлются. Приватность: реальные названия/участники событий не фиксируются — только структура UI.

Статус визуальной сверки на живом forbion: ПРОЙДЕНА 2026-07-12 (Browser 1 c9284989, сессия cloude подтверждена OC.getCurrentUser().uid, мобильная вёрстка снята same-origin iframe 390px — окно общее не трогал, f7-mobile-web-iframe-technique; строго read-only, ничего не сохранял). Реальные русские ярлыки сверены с деревом из кода, порядок полей окна события подтверждён. Сверка вскрыла разделы, которых в коде-выборке не было видно — внесены ниже (Appointments, незапланированные задачи, Deck-источник). Оставшиеся визуал(?) — условные состояния (корзина видна только при наличии удалённых, реальных событий у cloude нет).

F7-форк: окно события на forbion кастомизировано (тема адресует .f7-calendar-event-view, .f7-invitee-status-row, .f7-location-talk-row, .property-add-talk) — набор кнопок тот же, что в апстрим-компонентах Editor/*, отличается вёрстка/порядок (предмет попиксельной сверки).

Компоненты-источники (nextcloud/calendar v6.4.0)

views/Calendar.vue (шелл: навигация + сетка) · components/CalendarGrid.vue (сетка) · AppNavigation/AppNavigationHeader.vue (шапка: навигация периодов, «Создать», переключатель вида) · AppNavigation/CalendarList/* (список календарей, действия, корзина) · AppNavigation/EditCalendarModal.vue + EditCalendarModal/ShareItem.vue (правка/шаринг календаря) · AppNavigation/Settings.vue (настройки) · views/EditSimple.vue/EditFull.vue (окно события) · Editor/Properties/* (поля) · Editor/Repeat/* (повторение) · Editor/Alarm/* (напоминания) · Editor/Invitees/* + InvitationResponseButtons.vue (участники/ответы) · Editor/Attachments/* (вложения) · Editor/AddTalkModal.vue (беседа Talk) · Editor/FreeBusy/* (занятость).

Вход

Нижняя плавающая панель / шторка приложений (по «трём полоскам») → «Календарь», или прямой URL /apps/calendar/. Оболочку описывает shell.md (зона лида) — здесь только специфика приложения.

Экран: Календарь (главный, сетка)

Шапка (AppNavigationHeader, реальные ярлыки мобильной версии сверены):

  • «Открыть навигацию» (бургер) → сайдбар календарей (см. ниже).
  • «Предыдущий месяц» / «Следующий месяц» → сдвиг периода (aria-label зависит от вида: «…месяц»/«…неделя»/«…день»).
  • «Сегодня» → текущая дата.
  • «Создать событие» → окно события (см. «Экран: Событие»); write — на forbion не сохраняю.
  • «Действия» → меню переключения вида: «День», «Неделя», «Месяц», «Год», «Список» (сверено на живом — все 5 пунктов).
    • отличие от десктопа: в мобильной версии переключатель вида спрятан в дропдаун «Действия», а НЕ вынесен видимым тумблером.
    • подача (Д): в нативе все 5 видов есть (CalendarViewMode), но переключатель — сегментированный, не дропдаун; сверка подачи — в calendar.diff.md.

Тело: сетка календаря. На мобильном (узкий вьюпорт) модель компактная — месяц сверху + список событий выбранного дня снизу.

Действия в теле:

  • Тап по ячейке дня → выбор дня (список событий этого дня внизу).
  • Тап по пилюле события → открыть событие (просмотр/редактор).
  • «Показать незапланированные задачи» (сверено на живом) → шит/панель «Незапланированные задачи» (VTODO без даты из календарей с задачами); «×» закрыть. В нативе реализовано (loadUnscheduledTasks, CalendarTrashSheet-стиль шит) — done.

Экран: Навигация календарей (сайдбар / бургер)

Открытие: кнопка «Открыть навигацию» в шапке. Тело (сверено на живом): «Мои календари» (+ «Добавить новое»), список календарей, раздел «Предложенные встречи» / «Расписание встреч» (Appointments), внизу — «Параметры календаря» (+ Корзина при наличии удалённых).

Календари в списке cloude (пример состава): «Личное», «Дни рождения контакта», «Карточки» (интеграция Deck — доски как источник событий). визуал(?): набор зависит от аккаунта.

Строка календаря:

  • Чекбокс видимости → включить/выключить показ календаря.
  • Название + счётчик.
  • «» (действия) → меню:
    • «Изменить» / «Изменить и поделиться» → модалка правки календаря (ниже). write.
    • «Копировать публичную ссылку» / «Копировать ссылку подписки».
    • «Экспорт» → скачивание .ics.
    • «Удалить» → подтверждение. write.

Действия списка:

  • «+ Добавить новый» → меню:
    • «Новый календарь» / «Новый календарь со списком задач». write.
    • «Новая подписка по ссылке (только чтение)». write.
    • «Добавить календарь праздников» / «Добавить произвольный публичный календарь». write.

Подэкран: Корзина

Тело: список удалённых календарей/событий. Действия: «Восстановить» (write) · «Удалить навсегда» (write) · «Очистить корзину» → подтверждение «Действительно очистить корзину?» (write).

Подэкран: Изменить календарь (модалка EditCalendarModal)

Тело/действия:

  • «Имя календаря» + выбор цвета. write.
  • «Поделиться календарём» → поиск «Share with users or groups» → строка получателя: право «может редактировать и видеть конфиденциальные события», снять доступ. write.
  • «Напоминания по умолчанию» для полнодневных/частичных событий этого календаря.
  • «Не показывать меня занятым» (сделать календарь прозрачным).
  • «Экспорт» · «Удалить» (write) · «Убрать у меня» (для расшаренных, write).

Подэкран: Настройки (Settings.vue)

Тело (тумблеры/пункты): «Номера недель», «Выходные», «Задачи в календаре», «Плотность в День/Неделя», «Лимит событий в Месяце», «Простой редактор событий» («"Подробнее" открывает детальный редактор»), «Календарь дней рождения», «Напоминание по умолчанию» (полнодневные/ частичные), «Календарь по умолчанию для входящих приглашений», «Настройки доступности» (write), «Импорт календарей» (write).

  • Блок «CalDAV»: «CalDAV URL», «Адрес сервера для iOS и macOS» — информационные (копирование).

Подэкран: Расписания встреч / Appointments (views/Appointments, AppointmentConfigList)

Раздел сайдбара «Предложенные встречи» / «Расписание встреч» (сверено на живом — у cloude пусто: «Нет активных предложенных встреч»). Действия:

  • «Создать расписание встреч» (Create appointment schedule) → модалка настройки (AppointmentConfigModal): имя, описание, местоположение, длительность, «Календарь бронирования», «Календари для проверки конфликтов», буферы до/после, макс. слотов в день, ограничение горизонта бронирования, «Создать комнату Talk». write.
  • Готовое расписание → публичная страница бронирования (внешний гость: выбор слота → «Подтвердить»).
  • расхождение (натив): функционала «Appointments»/страниц бронирования в клиенте нет.

Экран: Событие (окно, EditSimple/EditFull, форк .f7-calendar-event-view)

Сверено на живом (mail/079): «Создать событие» открывает СРАЗУ полный редактор (/new/full/…, F7-форк по умолчанию полный, не simple). Порядок и русские ярлыки полей подтверждены: Название → С/По (дата+время нативными пикерами) → «Добавить местоположение» → «Добавьте описание» → «Добавить напоминание» → «Поиск и добавление категорий» → «Поиск и добавление участников (email/пользователи/контакты/группы/команды)». Открытие: пилюля события или «Создать событие». Переключение простой↔полный: «Подробнее».

Шапка:

  • «×» (Закрыть) → при несохранённых правках диалог «Отменить изменения?» («Точно отменить изменения этого события?»).
  • «✓ Сохранить» (write). У повторяющегося события → выбор «Обновить это повторение» / «Обновить это и все будущие» (write).
  • «» (действия) → меню: «Дублировать» (write), «Экспорт», «Удалить» (write); у серии — «Удалить это повторение» / «Удалить это и все будущие».

Тело — поля (Editor/Properties):

  • «Заголовок» события. write.
  • «Весь день» (тумблер).
  • «С» / «По» — нативные пикеры даты/времени (в нативе совпадает).
  • Выбор «Календаря» (коллекции).
  • «Местоположение», «Описание», «Категории».
  • Выбор «Цвета» / «Убрать цвет».

Тело — Повторение (Editor/Repeat):

  • «Повтор» («Не повторяется») → меню пресетов + «Настроить повторение»:
    • «Повторять каждые» N + частота (день/неделя/месяц/год).
    • Неделя: кружки дней недели (Пн…Вс).
    • Месяц: «В конкретный день» / «В N-й» (первый… / будний / выходной / день).
    • «Окончание»: «никогда» / «на дату» / «после» N «повторений».
    • Предупреждение о неполной поддержке rrule (часть повторений может быть потеряна при правке).
    • расхождение (бэклог, mail/072): натив НЕ разворачивает оккуренции в сетке (долг №2) и не поддерживает EXDATE/RECURRENCE-ID (долг №3); toRrule не сериализует «первый понедельник» (BYDAY=1MO).

Тело — Напоминания (Editor/Alarm):

  • «Добавить напоминание» (write) → тип (Уведомление/Email/Аудио), смещение («за … минут/часов/дней/недель до») или «На дату»; «Удалить напоминание».

Тело — Участники / приглашения (Editor/Invitees, форк .f7-invitee-status-row):

  • «Участники» («Пока нет участников») → поиск «эл. почты, пользователи, контакты, группы, команды». write.
  • Роль участника: «Обязательный»/«Необязательный»/«Председатель»/«Не участвует»; «Запросить ответ»; «Удалить участника».
  • «Найти время» → сетка занятости (ниже).
  • Настройка ответов: «Только приглашённые могут отвечать» / «Любой с приглашением может отвечать», «Разрешить пересылку».
  • «Кнопки ответа на приглашение» (входящее событие, InvitationResponseButtons): «Принять» / «Отклонить» / «Под вопросом». write (iTIP REPLY).
    • В нативе реализовано: «Принять»/«Может быть»/«Отклонить» (respondToInvite) — done (v0.5.144 закрыл этот долг). Открыто: опции «только приглашённые/любой» + «разрешить пересылку» — см. calendar.diff.md.

Тело — Беседа Talk (AddTalkModal, форк .property-add-talk):

  • «Добавить беседу Talk» → модалка: выбрать существующую беседу или создать публичную/приватную. write при создании.

Тело — Вложения (Editor/Attachments):

  • «Из файлов» → навигация по WebDAV (добавить файл / поделиться ссылкой).
  • «Загрузить с устройства» (write).
  • Пункт вложения → «Удалить файл» (write); пусто — «Нет вложений».

Тело — Занятость (Editor/FreeBusy):

  • «Проверить доступность / Найти время» → сетка Free/Busy: «Свободен»/«Занят»/«Занят (под вопросом)»/«Нет на месте», навигация «Пред./След. дата», легенда. write (POST в DAV outbox — на forbion НЕ выполняю), визуал(?).

Расхождения натив ↔ 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): виды Год/Список, корзина, незапланированные задачи, ответы на приглашения (Принять/Может быть/Отклонить).