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

15 KiB
Raw Blame History

Diff: Контакты (CardDAV) — итерация 1 (2026-07-13)

Ff_app: 37.4% · Fd_app: предварительно (натив на устройстве в этот проход не гонялся; веб снят live 390px) · n-a: 8

Прогресс P1 (коммиты bc1a497 + 6b98c5a): правка/удаление РЕАЛИЗОВАНЫ (ядро + UI). Ядро: CardDavClient.updateContact (PUT If-Match, round-trip неизвестных полей vCard) / deleteContact (DELETE If-Match) + VCardEditor, 10 юнит-тестов зелёные. UI: Room href/etag/raw (миграция v4→5), кнопки «Править» (форма) и «Удалить» (с подтверждением) в карточке. Гейты зелёные (:app:compileReleaseKotlin, :feature:contacts:detekt+compile). Пункты «Править»/«Удалить» (Э3) и поля формы (Э4) отмечены [done] — реализованы в коде; live-проверка на bmob-* (mail/085) и дизайн-проход на устройстве — следующим шагом (Ff по коду, Fd предварительно). NB: P1-edit нормализует TYPE у EMAIL/TEL к INTERNET/CELL — сохранение/правка типов идёт в P2. Решение лида (mail/102): экран «Команды» (Circles) — целиком n-a; порядок P1→P2→P4→P3→P5 утверждён.

Сверка веб (карта 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] Открыть карточку (тап) · натив: openContactContactDetailSheet.
  • [Ф][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 52.6% (9 open Ф / 19; «Править»/«Удалить» done — P1)

Ряд действий (веб) ↔ натив (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. Меню шапки:
  • [Ф][done] «✏️ Править» — реализовано (P1, 6b98c5a): кнопка в карточке → форма (Экран 4).
  • [Ф][done] «Удалить» — реализовано (P1): кнопка с подтверждением, DELETE If-Match.
  • [Ф][open] ⋯ «Скачать» (.vcf) — нет.
  • [Ф][open] ⋯ «Копировать контакт» — нет.
  • [Ф][open] ⋯ «Создать QR-код» — нет.
  • [Ф][open] ⋯ «Исключить контакт из календаря Дней Рождений» — нет.
  • [Д][—] Крупный аватар/имя/subtitle, поля-плитки, кнопки Email/Позвонить — по живой теме; Fd на устройстве.

Экран 4: Правка/создание контакта (форма) — Ff 53.3% (7 open Ф / 15; правка реализована — P1)

Веб-форма правки ↔ натив (EditContactDialog — правка + AddContactDialog — создание):

  • [Ф][done] Имя · поле формы.
  • [Ф][done] Телефон (значение) · поле формы (многострочное, несколько номеров).
  • [Ф][done] Email (значение) · поле формы (многострочное, несколько адресов).
  • [Ф][done] Сохранить · updateContact (round-trip vCard, PUT If-Match) / createContact.
  • [Ф][done] Правка существующего (загрузка контакта в форму, PUT If-Match) — реализовано (P1, 6b98c5a).
  • [Ф][done] Должность/организация — поля формы (organization + title).
  • [Ф][done] Адрес — поле формы.
  • [Ф][done] «Личные даты» (день рождения) — поле формы (текст; дата-пикер — доработка).
  • [Ф][open] «Добавить фото» — нет.
  • [Ф][~] Тип телефона (Домашний/Рабочий/CELL/…) — типы ПАРСЯТСЯ и сохраняются при правке (P2 шаг1, a8741e9); отдельного селектора типа в форме пока нет — P2 шаг2.
  • [Ф][~] Тип email — аналогично (парсинг+сохранение есть, селектор — P2 шаг2).
  • [Ф][open] «О себе» (NOTE) — нет в форме.
  • [Ф][open] «Часовой пояс» — нет.
  • [Ф][open] «Группы контакта» (добавить в группу) — нет — P2.
  • [Ф][open] Выбор адресной книги при создании — нет (пишет в books.firstOrNull()).
  • [Д][—] Веб — полноэкранная форма; натив — компактный диалог. Расхождение композиции (Fd на устройстве).

Экран 5: Организационная структура — Ff 0.0% (4 open Ф / 4)

Отсутствует в нативе целиком:

  • [Ф][open] Просмотр графа оргструктуры (карточки сотрудников, связи).
  • [Ф][open] Селектор «График:».
  • [Ф][open] Разворачивание/сворачивание узлов (^N).
  • [Ф][open] Переход к карточке из узла.

Экран 6: Команда (Circles/Teams) — n-a целиком (0 применимых Ф; n-a 8) — исключён из среднего

Решение лида (mail/102): отдельного экрана команд в мобильных Контактах v1 НЕ делаем — Circles это самостоятельный тяжёлый апп (членство/уровни/шары), не контакты. Весь экран n-a:

  • [Ф][n-a] Просмотр команды (название/владелец/участники).
  • [Ф][n-a] «✏️ Править» команду.
  • [Ф][n-a] «Копировать ссылку».
  • [Ф][n-a] «Добавить» участника.
  • [Ф][n-a] Список участников.
  • [Ф][n-a] Создать «Папка» — зона feature/files.
  • [Ф][n-a] Создать «Конференции» — зона feature/talk.
  • [Ф][n-a] Создать «Календарь» — зона feature/calendar.

Обоснование: Circles = отдельное приложение (мобильно — не в скоупе Контактов v1); три «Создать …» — кросс-модульные создающие потоки чужих модулей. NB: «команды» ≠ «группы контактов»: группы (CATEGORIES→чипы) остаются в скоупе (P2).

Экран 7: Параметры контактов (модальный шит) — Ff 0.0% (5 open Ф / 5)

Отсутствует в нативе:

  • [Ф][open] «Сортировать по» (Имя/Фамилия/фонетика ×2/Отображаемое имя/Последнее изменение).
  • [Ф][open] «Импорт контактов».
  • [Ф][open] Адресные книги: список (Контакты / Недавние / Учётные записи).
  • [Ф][open] Адресные книги: ⋯ (переименовать/удалить/шаринг книги).
  • [Ф][open] «Новая адресная книга».

Сводка и приоритеты (прошу приоритизацию у лида)

Ff_app 37.4% по 6 экранам (Э1 100 · Э2 18.2 · Э3 52.6 · Э4 53.3 · Э5 0 · Э7 0; Э6 Команды = n-a, исключён). Fd — предварительно. P1 (правка/удаление) закрыт в коде — Э3/Э4 подросли. P2 шаг1 (типы TEL/EMAIL) — в коде (a8741e9): типы парсятся из raw, в карточке подписи по типу (Рабочий/Личный/Мобильный/…), при правке типы сохраняются (fix P1-каветата), +4 теста. Дальше P2 шаг2: селектор типа в форме + группы CATEGORIES (чипы-фильтр в списке — поднимет Э2). Шторка (Э2) и параметры (Э7) — P3/P5. Крупнейшие функциональные дыры (кандидаты 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) — РЕШЕНО (mail/102)

  • Порядок P1→P2→P4→P3→P5 — утверждён.
  • Команды (Circles/Teams) (Экран 6) — n-a целиком (учтено выше).
  • Оргструктура (Экран 5) — лид пока не высказался; держу open (не занижаю знаменатель односторонним n-a). Аналогична Circles по «тяжести» — вероятный кандидат в n-a, жду слова.
  • Fd: гоню отдельным проходом на устройстве после ревью-сборки — сборка/версия по гейту (084) за тобой.

Live-запись (mail/085, ограждения)

Read-only снят: edit/delete-флоу закрою live на forbion CRUDʼом СВОИХ bmob-* контактов (создать→править→удалить свой же), не трогая реальные данные cloude. Пока правка edit/delete не написана — веду из кода + юнит-тесты на vCard round-trip (обязательны по mail/072).