From e8324254e50a09ee748b247e6338910967d4f7f6 Mon Sep 17 00:00:00 2001 From: b-mob-contacts Date: Mon, 13 Jul 2026 07:17:25 +0000 Subject: [PATCH] =?UTF-8?q?docs(app-map):=20contacts.diff.md=20=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D1=80.1=20(Ff=2026.7%,=207=20=D1=8D=D0=BA=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2,=20=D0=BC=D0=B5=D0=BD=D1=8E=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B8=D0=BC=D1=91=D0=BD=D0=BD=D0=BE)=20+=20STATUS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/app-map/contacts.diff.md | 136 ++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 docs/app-map/contacts.diff.md diff --git a/docs/app-map/contacts.diff.md b/docs/app-map/contacts.diff.md new file mode 100644 index 0000000..301d714 --- /dev/null +++ b/docs/app-map/contacts.diff.md @@ -0,0 +1,136 @@ +# Diff: Контакты (CardDAV) — итерация 1 (2026-07-13) +Ff_app: **26.7%** · Fd_app: **предварительно** (натив на устройстве в этот проход не гонялся; веб снят live 390px) · n-a: 3 + +Сверка веб (карта `contacts.md`, апстрим `nextcloud/contacts` + тема `_mobile-*.css`) ↔ натив +(`feature/contacts` Compose поверх CardDAV/`core:network`). Метод mail/083: `[Ф|Д]`·`[open|done|n-a]`, +Ff/Fd на экран, n-a вне знаменателя. Веб-подписи — из live-прохода forbion (Browser 1/cloude, +same-origin iframe 390px, [[f7-mobile-web-iframe-technique]]); натив-подписи — из кода +`ContactsScreen.kt`/`ContactDetailSheet.kt`/`ContactsViewModel.kt`/`ContactsRepository.kt` + +`core/network/CardDavClient.kt`. Всплывающие меню (mail/087) разобраны поимённо ниже. +Fd (дизайн) — отдельным проходом на устройстве после ревью-сборки (как у talk/tasks). + +## Экран 1: Список контактов («Все контакты») — Ff 100.0% (0 open Ф / 3) +- [Ф][done] Поиск по списку · натив: поиск по имени/email/телефон (`ContactsUiState.filteredContacts`). +- [Ф][done] Открыть карточку (тап) · натив: `openContact` → `ContactDetailSheet`. +- [Ф][done] Создать контакт · натив: `F7CreateButton` в шапке → `AddContactDialog`. + *(в вебе вызывается из шторки, в нативе из шапки — Д-разница расположения, не Ф.)* +- [Д][—] Строка: аватар (фото/инициалы на палитре) + имя 16 + email серым — типографика по + живой теме (v0.5.126); детальный Fd на устройстве. + +## Экран 2: Шторка навигации — Ff 18.2% (9 open Ф / 11) +Веб-drawer приложения ↔ натив (drawer в модуле ОТСУТСТВУЕТ, есть только плоский список): +- [Ф][done] «Создать контакт» · натив: кнопка в шапке (функция есть). +- [Ф][done] «Все контакты» · натив: дефолтный список. +- [Ф][open] «Импорт контактов» — нет. +- [Ф][open] «Организационная структура» — нет (см. Экран 5). +- [Ф][open] «Без группы» (фильтр) — нет (групп нет). +- [Ф][open] Группы контакта: список групп — нет. +- [Ф][open] Группы контакта: «+» создать группу — нет. +- [Ф][open] Команды: открыть команду — нет (см. Экран 6). +- [Ф][open] Команды: «+» создать команду — нет. +- [Ф][open] Команды: «Показать все команды» — нет. +- [Ф][open] «Параметры контактов» — нет (см. Экран 7). + +## Экран 3: Карточка контакта (просмотр) — Ff 42.1% (11 open Ф / 19) +Ряд действий (веб) ↔ натив (`ContactDetailContent`): +- [Ф][done] Написать письмо (конверт) · натив «Email» (ACTION_SENDTO mailto). + *расхождение: уходит во внешний почтовик, не в свой `MailComposeActivity` (план mail/072 п.3).* +- [Ф][open] Видеозвонок Talk (камера) — натив: «Позвонить» = системный дайлер (ACTION_DIAL), НЕ Talk. + *расхождение: другой канал (план mail/072 п.3).* +- [Ф][open] Профиль пользователя (силуэт) — нет. +Поля (веб-секции) ↔ натив: +- [Ф][done] Email: просмотр + клик→письмо; несколько адресов (`emailLines`). +- [Ф][done] Телефон: просмотр + клик→звонок; несколько (`phoneLines`). +- [Ф][done] Адрес. +- [Ф][done] Сайт (клик→браузер). +- [Ф][done] День рождения. +- [Ф][done] Организация/должность (subtitle). +- [Ф][done] Адресная книга (принадлежность). +- [Ф][open] «Социальная сеть» (ссылка на профиль) — нет. +- [Ф][open] «ID в объединении облачных хранилищ» (federated cloud ID) — нет. +- [Ф][open] «Подробное имя» (Фамилия/Имя/фонетика отдельными полями) — натив показывает только displayName. +Меню шапки: +- [Ф][open] «✏️ Править» — нет (Экран 4). +- [Ф][open] ⋯ «Скачать» (.vcf) — нет. +- [Ф][open] ⋯ «Копировать контакт» — нет. +- [Ф][open] ⋯ «Создать QR-код» — нет. +- [Ф][open] ⋯ «Исключить контакт из календаря Дней Рождений» — нет. +- [Ф][open] ⋯ «Удалить» — нет. +- [Д][—] Крупный аватар/имя/subtitle, поля-плитки, кнопки Email/Позвонить — по живой теме; Fd на устройстве. + +## Экран 4: Правка/создание контакта (форма) — Ff 26.7% (11 open Ф / 15) +Веб-форма правки ↔ натив (`AddContactDialog` — только СОЗДАНИЕ, правки нет): +- [Ф][done] Имя · натив: поле в диалоге создания. +- [Ф][done] Телефон (значение) · натив: поле в диалоге. +- [Ф][done] Email (значение) · натив: поле в диалоге. +- [Ф][done] Сохранить · натив: `createContact` (vCard 3.0 PUT). +- [Ф][open] Правка существующего (загрузка контакта в форму, PUT If-Match) — нет. +- [Ф][open] «Добавить фото» — нет. +- [Ф][open] Должность/организация — нет в форме. +- [Ф][open] Тип телефона (Домашний/Рабочий/CELL/…) — нет (селектор типа). +- [Ф][open] Тип email — нет. +- [Ф][open] Адрес — нет в форме. +- [Ф][open] «Личные даты» (день рождения, дата-пикер) — нет. +- [Ф][open] «О себе» — нет. +- [Ф][open] «Часовой пояс» — нет. +- [Ф][open] «Группы контакта» (добавить в группу) — нет. +- [Ф][open] Выбор адресной книги при создании — нет (пишет в `books.firstOrNull()`). +- [Д][—] Веб — полноэкранная форма; натив — компактный диалог. Расхождение композиции (Fd на устройстве). + +## Экран 5: Организационная структура — Ff 0.0% (4 open Ф / 4) +Отсутствует в нативе целиком: +- [Ф][open] Просмотр графа оргструктуры (карточки сотрудников, связи). +- [Ф][open] Селектор «График:». +- [Ф][open] Разворачивание/сворачивание узлов (`^N`). +- [Ф][open] Переход к карточке из узла. + +## Экран 6: Команда (например «Тест») — Ff 0.0% (0 open Ф / 5; n-a 3) +Отсутствует в нативе: +- [Ф][open] Просмотр команды (название/владелец/участники). +- [Ф][open] «✏️ Править» команду. +- [Ф][open] «Копировать ссылку». +- [Ф][open] «Добавить» участника. +- [Ф][open] Список участников (роль «Владелец» и т.д.). +- [Ф][n-a] Создать «Папка» — зона `feature/files` (создаётся из Файлов). +- [Ф][n-a] Создать «Конференции» — зона `feature/talk`. +- [Ф][n-a] Создать «Календарь» — зона `feature/calendar`. +> n-a обоснование: три «Создать …» из карточки команды — кросс-модульные создающие потоки чужих +> модулей, достижимы из их приложений; в контактах мобильно-неприменимы. Команды (Circles/Teams) +> целиком — кандидат на согласование с лидом: нужен ли отдельный экран команд в мобильных Контактах. + +## Экран 7: Параметры контактов (модальный шит) — Ff 0.0% (5 open Ф / 5) +Отсутствует в нативе: +- [Ф][open] «Сортировать по» (Имя/Фамилия/фонетика ×2/Отображаемое имя/Последнее изменение). +- [Ф][open] «Импорт контактов». +- [Ф][open] Адресные книги: список (Контакты / Недавние / Учётные записи). +- [Ф][open] Адресные книги: ⋯ (переименовать/удалить/шаринг книги). +- [Ф][open] «Новая адресная книга». + +--- +## Сводка и приоритеты (прошу приоритизацию у лида) +Ff_app **26.7%** по 7 экранам (Э1 100 · Э2 18.2 · Э3 42.1 · Э4 26.7 · Э5/6/7 0). Fd — предварительно. +Крупнейшие функциональные дыры (кандидаты P1–P5), совпадают с моим планом mail/072: +1. **Правка/удаление контакта** (Экран 4 + ⋯ карточки): edit-форма, `updateContact` PUT If-Match с + round-trip неизвестных полей vCard, `deleteContact`, выбор адресной книги, поля должность/адрес/ + даты/о-себе/часовой пояс, **типы TEL/EMAIL**. Требует href+ETag в `DavContact`/`ContactEntity` — + core-правка `CardDavClient`+Room, лид дал добро в mail/072 (условия: не менять list/create, + юниты vCard round-trip, гейт `:app:compileReleaseKotlin`, Room-миграция). +2. **Группы контакта** (Экран 2 + поле формы + фильтр «Без группы»): парс CATEGORIES → чипы-фильтр. +3. **Шторка навигации** (Экран 2): импорт, оргструктура, группы, команды, параметры — как единый drawer. +4. **Привязка к каналам** (Экран 3): «Email» → свой композер, «Позвонить» → Talk-звонок + (кросс-модуль feature/mail, feature/talk — согласую письмами, лид в копию). +5. **Параметры** (Экран 7): сортировка, импорт, управление адресными книгами. +Прочее: соц.сеть/cloud-ID/QR/скачать/копировать в карточке; оргструктура-граф; экран команд (см. n-a). + +## Вопросы к лиду (b-dev-mobile) +- Порядок P1–P5? Мой дефолт (не жду ответа, начинаю с P1 edit/delete — целиком мой модуль + + твоё уже-данное добро на core-правку): 1→2→(4 кросс-модуль)→3→5. +- **Команды (Circles/Teams)** (Экран 6) — нужен ли отдельный экран команд в мобильных Контактах, + или считаем n-a целиком? Три «Создать …» я пометил n-a (чужие модули) — подтверди. +- **Оргструктура** (Экран 5) — в скоуп мобильных Контактов или n-a? +- Fd: гоню отдельным проходом на устройстве после ревью-сборки — сборка/версия по гейту (084) за тобой. + +## Live-запись (mail/085, ограждения) +Read-only снят: edit/delete-флоу закрою live на forbion CRUDʼом СВОИХ `bmob-*` контактов +(создать→править→удалить свой же), не трогая реальные данные `cloude`. Пока правка edit/delete не +написана — веду из кода + юнит-тесты на vCard round-trip (обязательны по mail/072).