18 KiB
Карта: Календарь
Приложение «Календарь» (/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 пунктов).
отличие от десктопа:в мобильной версии переключатель вида спрятан в дропдаун «Действия», а НЕ вынесен видимым тумблером.расхождение (натив):в клиенте есть только День/Неделя/Месяц; «Год» и «Список» отсутствуют.
Тело: сетка календаря. На мобильном (узкий вьюпорт) модель компактная — месяц сверху + список событий выбранного дня снизу.
Действия в теле:
- Тап по ячейке дня → выбор дня (список событий этого дня внизу).
- Тап по пилюле события → открыть событие (просмотр/редактор).
- «Показать незапланированные задачи» (сверено на живом) → шит/панель «Незапланированные
задачи» (VTODO без даты из календарей с задачами); «×» закрыть.
расхождение (натив):панели незапланированных задач в клиенте нет.
Экран: Навигация календарей (сайдбар / бургер)
Открытие: кнопка «Открыть навигацию» в шапке. Тело (сверено на живом): «Мои календари» (+ «Добавить новое»), список календарей, раздел «Предложенные встречи» / «Расписание встреч» (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).расхождение (бэклог, mail/072, долг №4):экрана accept/decline входящих приглашений в нативе нет.
Тело — Беседа Talk (AddTalkModal, форк .property-add-talk):
- «Добавить беседу Talk» → модалка: выбрать существующую беседу или создать публичную/приватную. write при создании.
Тело — Вложения (Editor/Attachments):
- «Из файлов» → навигация по WebDAV (добавить файл / поделиться ссылкой).
- «Загрузить с устройства» (write).
- Пункт вложения → «Удалить файл» (write); пусто — «Нет вложений».
Тело — Занятость (Editor/FreeBusy):
- «Проверить доступность / Найти время» → сетка Free/Busy: «Свободен»/«Занят»/«Занят
(под вопросом)»/«Нет на месте», навигация «Пред./След. дата», легенда.
write (POST в DAV outbox — на forbion НЕ выполняю),
визуал(?).
Расхождения натив ↔ forbion (сводный бэклог, приоритет по mail/072)
- Повторения не разворачиваются в сетке (долг №2, подтверждён лидом) — «Событие: Повторение» / сетка.
- EXDATE / RECURRENCE-ID не поддержаны (долг №3) — «Событие: шапка / Повторение».
- Входящие приглашения без «Принять/Отклонить» (долг №4) — «Событие: Участники».
- Виды «Год» / «Список» отсутствуют в нативе — «Календарь: шапка».
toRruleне сериализуетBYDAY=1MO(«первый понедельник») — вскроется на развёртке повторений.