diff --git a/docs/app-map/STATUS.md b/docs/app-map/STATUS.md index 2647be3..c9d5fc2 100644 --- a/docs/app-map/STATUS.md +++ b/docs/app-map/STATUS.md @@ -19,7 +19,7 @@ | notifications | b-mob-notify | 0 | — | — | — | — | нет | карта готова, diff | | deck | b-mob-deck | 1 | 24.1 | предв. | 49 | ? | нет | P1: назначить-себя (6eeba1b) + бейдж коммент. (9d726f4) + меню колонки Переименовать/Удалить (4fdadef) done; compile+detekt GREEN (baseline-рефреш модуля); далее бейдж чек-пунктов, быстрые сроки; Fd на устройстве | | calendar | b-mob-calendar | 1 | 64.0 | 80.4 | ~35 | ~7 | нет | P1 разворот повторений+BYDAY=1MO ЗАКРЫТ в коде (`CalendarRecurrence`, 15 тестов, compile+detekt green, коммиты e7d0a5a/492af61); Appointments=n-a (101); далее P2 EXDATE/RECURRENCE-ID | -| contacts | b-mob-contacts | 1 | 31.2 | предв. | ~37 | ? | нет | P1 ядро edit/delete в main (`bc1a497`: updateContact/deleteContact If-Match + VCardEditor, 10 тестов, гейт зелёный); Команды=n-a (102); далее шаг 2/2 Room+форма, потом P2 группы/типы | +| contacts | b-mob-contacts | 1 | 37.4 | предв. | ~32 | ? | нет | P1 edit/delete РЕАЛИЗОВАН в main (ядро `bc1a497` + UI `6b98c5a`: Room v4→5, форма правки, delete-подтверждение; гейты зелёные); live-проверка на bmob-* + device Fd далее; потом P2 группы/типы | Обозначения статуса: `карта` → `diff` (итерация 1) → `правки` → `повторный прогон` → `✅ 0` (Ff=Fd=100%) → `✅ 0 подтв.` (второй прогон держит 0). diff --git a/docs/app-map/contacts.diff.md b/docs/app-map/contacts.diff.md index bffed69..8c00875 100644 --- a/docs/app-map/contacts.diff.md +++ b/docs/app-map/contacts.diff.md @@ -1,13 +1,15 @@ # Diff: Контакты (CardDAV) — итерация 1 (2026-07-13) -Ff_app: **31.2%** · Fd_app: **предварительно** (натив на устройстве в этот проход не гонялся; веб снят live 390px) · n-a: 8 +Ff_app: **37.4%** · Fd_app: **предварительно** (натив на устройстве в этот проход не гонялся; веб снят live 390px) · n-a: 8 -> Прогресс P1 (коммит bc1a497): ЯДРО правки/удаления готово и покрыто тестами (10 юнит-тестов -> `VCardEditorTest` зелёные, гейт `:app:compileReleaseKotlin` зелёный) — `CardDavClient.updateContact` -> (PUT If-Match, round-trip неизвестных полей vCard) / `deleteContact` (DELETE If-Match) + -> `VCardEditor`. UI-часть (Room href/etag/raw + форма правки + delete в карточке) — шаг 2/2, следующим -> коммитом; пункты «Править»/«Удалить» карточки станут `[done]` после неё. -> Решение лида (mail/102): экран «Команды» (Circles) — целиком `n-a` (отдельный тяжёлый апп, не контакты); -> порядок P1→P2→P4→P3→P5 утверждён. +> Прогресс 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]`, @@ -39,7 +41,7 @@ Fd (дизайн) — отдельным проходом на устройст - [Ф][open] Команды: «Показать все команды» — нет. - [Ф][open] «Параметры контактов» — нет (см. Экран 7). -## Экран 3: Карточка контакта (просмотр) — Ff 42.1% (11 open Ф / 19) +## Экран 3: Карточка контакта (просмотр) — Ff 52.6% (9 open Ф / 19; «Править»/«Удалить» done — P1) Ряд действий (веб) ↔ натив (`ContactDetailContent`): - [Ф][done] Написать письмо (конверт) · натив «Email» (ACTION_SENDTO mailto). *расхождение: уходит во внешний почтовик, не в свой `MailComposeActivity` (план mail/072 п.3).* @@ -58,30 +60,30 @@ Fd (дизайн) — отдельным проходом на устройст - [Ф][open] «ID в объединении облачных хранилищ» (federated cloud ID) — нет. - [Ф][open] «Подробное имя» (Фамилия/Имя/фонетика отдельными полями) — натив показывает только displayName. Меню шапки: -- [Ф][open] «✏️ Править» — нет (Экран 4). +- [Ф][done] «✏️ Править» — реализовано (P1, 6b98c5a): кнопка в карточке → форма (Экран 4). +- [Ф][done] «Удалить» — реализовано (P1): кнопка с подтверждением, DELETE If-Match. - [Ф][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) — нет. +## Экран 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] «Добавить фото» — нет. -- [Ф][open] Должность/организация — нет в форме. -- [Ф][open] Тип телефона (Домашний/Рабочий/CELL/…) — нет (селектор типа). -- [Ф][open] Тип email — нет. -- [Ф][open] Адрес — нет в форме. -- [Ф][open] «Личные даты» (день рождения, дата-пикер) — нет. -- [Ф][open] «О себе» — нет. +- [Ф][open] Тип телефона (Домашний/Рабочий/CELL/…) — нет (селектор типа) — P2. +- [Ф][open] Тип email — нет — P2. +- [Ф][open] «О себе» (NOTE) — нет в форме. - [Ф][open] «Часовой пояс» — нет. -- [Ф][open] «Группы контакта» (добавить в группу) — нет. +- [Ф][open] «Группы контакта» (добавить в группу) — нет — P2. - [Ф][open] Выбор адресной книги при создании — нет (пишет в `books.firstOrNull()`). - [Д][—] Веб — полноэкранная форма; натив — компактный диалог. Расхождение композиции (Fd на устройстве). @@ -117,7 +119,8 @@ Fd (дизайн) — отдельным проходом на устройст --- ## Сводка и приоритеты (прошу приоритизацию у лида) -Ff_app **31.2%** по 6 экранам (Э1 100 · Э2 18.2 · Э3 42.1 · Э4 26.7 · Э5 0 · Э7 0; Э6 Команды = n-a, исключён). Fd — предварительно. +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 (группы CATEGORIES + типы TEL/EMAIL) поднимет Э2/Э3/Э4; шторка (Э2) и параметры (Э7) — P3/P5. Крупнейшие функциональные дыры (кандидаты P1–P5), совпадают с моим планом mail/072: 1. **Правка/удаление контакта** (Экран 4 + ⋯ карточки): edit-форма, `updateContact` PUT If-Match с round-trip неизвестных полей vCard, `deleteContact`, выбор адресной книги, поля должность/адрес/