docs(app-map): notes.diff итер.1b — P1-UI done (Ff 42.8%), STATUS обновлён
read-only ядро собрано: список/поиск/пусто/редактор-автосейв/конфликт-диалог. 16/42 Ф в коде+UI. Fd 0% (ждёт девайс). Дальше — регистрация экрана у лида.
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
| mail | b-mob-mail | 1 | — | — | ~4 | ~2 | нет | правка P1 черновики |
|
||||
| talk | b-mob-conf | 1 | 41.3 | предв. | ~29 | ? | нет | P1 меню сообщения ~закрыто (Копировать/ссылка/2×переслать/Напоминание/Ответить-лично, …01198a4); остаток P1 файл-тред+перевод эскалирую (кросс-модуль/провайдеры); далее P2 меню беседы; Fd на устройстве |
|
||||
| tasks | b-mob-tasks | 1 | 24.6 | 52.7 | ~34 | ~8 | нет | P1 закрыт в коде (умные коллекции+3-state видимость+персист, `bd56c4b`); далее P2 управление списками; ждёт девайс-сверки |
|
||||
| notes | b-mob-notes | 1 | 21.7 | 0.0 | 34 | 21 | нет | P1 слой данных в коде+юнит-тест (`8a8f1cf`: Notes API v1 клиент/репо/ETag-кэш/конфликт 412); скелет заведён лидом (`133d80d`); далее P1-UI (экраны/редактор/диалог) |
|
||||
| notes | b-mob-notes | 1 | 42.8 | 0.0 | 26 | 21 | нет | P1 read-only ядро в коде+UI (`8a8f1cf` данные + `fb120d5` VM/список/редактор/конфликт); compile+7/7 тестов+detekt OK (worktree); Fd ждёт девайс. Пинг лиду на регистрацию экрана в app-шелле |
|
||||
| notifications | b-mob-notify | 0 | — | — | — | — | нет | карта готова, diff |
|
||||
| deck | b-mob-deck | 1 | 23.1 | предв. | 51 | ? | нет | P1: «Назначить мне/снять» (6eeba1b) + бейдж комментариев (9d726f4) done, green compile; далее бейдж чек-пунктов, меню колонки (Удалить/Переименовать), быстрые сроки; 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 |
|
||||
|
||||
+43
-39
@@ -1,18 +1,22 @@
|
||||
# Diff: Заметки (Notes) — итерация 1 (2026-07-13)
|
||||
|
||||
Ff_app: **21.7%** · Fd_app: **0.0%** (среднее по 6 экранам) · n-a: 0
|
||||
Ff_app: **42.8%** · Fd_app: **0.0%** (среднее по 6 экранам; Fd ждёт девайс-сверки) · n-a: 0
|
||||
|
||||
> ✅ **Скелет модуля заведён лидом** (`133d80d`, mail/096). **Итерация 1a — слой данных
|
||||
> реализован и верифицирован** (коммит `8a8f1cf`): пункты, помеченные `[done]` ниже = логика в
|
||||
> коде + юнит-тест (7/7, MockWebServer), **UI-экраны (список/редактор/диалог/навигация) —
|
||||
> следующий заход P1-UI**, девайс/визуал-сверка позже. Fd=0% пока держится (ни один экран
|
||||
> визуально не собран). Пишущее проверено ЮНИТАМИ, не на forbion (mail/073).
|
||||
> ✅ **Скелет заведён лидом** (`133d80d`). **Итерация 1a — слой данных** (`8a8f1cf`) +
|
||||
> **1b — UI read-only ядра** (`fb120d5`). `[done]` = в коде + верифицировано (compile + 7/7
|
||||
> юнит-тестов MockWebServer + detekt, изолированный worktree); **Fd=0% пока держится — экраны
|
||||
> собраны, но девайс/визуал-сверки ещё не было**. Пишущее проверено ЮНИТАМИ, не на forbion (mail/073).
|
||||
>
|
||||
> **Что готово в коде (1a):** `NotesApiClient` (Notes API v1: list exclude=content+If-None-Match,
|
||||
> get, create, saveContent с `If-Match`→412 `NoteConflictException`, setFavorite/Category/rename,
|
||||
> delete) · `NotesRepository` (offline-first список: 304/сеть→кэш) · `NotesCache` (дисковый
|
||||
> ETag-кэш) · `Note` модель. Осталось для полного P1: UI-экраны + `/autotitle` + `undo` +
|
||||
> категории-CRUD (`PATCH/DELETE /category`) + settings API.
|
||||
> **Готово в коде (1a данные + 1b UI):**
|
||||
> - Данные: `NotesApiClient` (v1: list exclude=content+If-None-Match, get, create, saveContent
|
||||
> `If-Match`→412 `NoteConflictException`, setFavorite/Category/rename, delete) · `NotesRepository`
|
||||
> (offline-first: 304/сеть→кэш) · `NotesCache` (дисковый ETag) · `Note`.
|
||||
> - UI: `NotesViewModel` (список избранное↑+поиск, открытие/создание/сохранение/удаление,
|
||||
> разрешение конфликта явным выбором) · `NotesScreen` (список+поиск+пусто-состояние Welcome+
|
||||
> диалог конфликта) · `NoteEditorScreen` (plain markdown + debounce-автосейв + read-only).
|
||||
> - **Осталось для полного P1:** регистрация экрана в app-шелле (переключение веб-пункта меню
|
||||
> «Заметки» на нативный — зона лида, app/; пинг отправлен). **P2:** rich-редактор/preview,
|
||||
> категории-навигация+CRUD, autotitle, undo, settings, шаринг + попиксельная вёрстка (Fd).
|
||||
|
||||
Сверка веб (`nextcloud/notes v5.0.0` + тема forbion) ↔ натив (**отсутствует**). Карта-источник:
|
||||
[`notes.md`](notes.md) (снята из кода + визуально сверена на forbion, Browser 1, read-only).
|
||||
@@ -23,17 +27,17 @@ Notes API v1 + ETag-кэш, план 1→2→3 (mail/071).
|
||||
|
||||
---
|
||||
|
||||
## Экран 1. Список заметок (главный) — Ff 20% · Fd 0%
|
||||
**Ф (10, open 8):**
|
||||
- [Ф][done] создать заметку (`NotesApiClient.create`, юнит-тест) — UI-кнопка следующим заходом
|
||||
- [Ф][open] поле «Искать заметки» (фильтр по заголовку) + очистка — P2
|
||||
- [Ф][done] загрузка заметки (`get`) + списка (`listNotes` offline-first) — данные готовы; UI строки P1-UI
|
||||
## Экран 1. Список заметок (главный) — Ff 50% · Fd 0%
|
||||
**Ф (10, open 5):**
|
||||
- [Ф][done] создать заметку (`NotesApiClient.create` + кнопка `F7CreateButton` в `NotesScreen`)
|
||||
- [Ф][done] поле «Искать заметки» (фильтр по заголовку, `visibleNotes`) — UI собран
|
||||
- [Ф][done] загрузка заметки (`get`) + списка (`listNotes` offline-first) + строки `F7ListCard`
|
||||
- [Ф][open] индикатор «расшарена» на строке — P3
|
||||
- [Ф][open] меню строки «⋯» (см. Экран 2) — P1
|
||||
- [Ф][open] меню строки «⋯» полное (сейчас на строке только избранное+тап; ⋯-поповер) — P2
|
||||
- [Ф][open] группировка по таймслотам (сегодня/недавние/…) — P2
|
||||
- [Ф][open] группировка по категориям (капшены) — P2
|
||||
- [Ф][open] сортировка «избранное вверх» + по дате изменения — P2
|
||||
- [Ф][open] пустое состояние Welcome (текст + «Новая заметка» + «создать образец») — P2
|
||||
- [Ф][done] сортировка «избранное вверх» + по дате изменения (`visibleNotes`)
|
||||
- [Ф][done] пустое состояние Welcome (`NotesEmptyState`: текст + «Новая заметка»)
|
||||
- [Ф][open] «Найти во всех категориях» (сброс фильтра при пустом поиске в категории) — P3
|
||||
- (состояние загрузки «Загрузка …» — Д)
|
||||
|
||||
@@ -55,30 +59,30 @@ Notes API v1 + ETag-кэш, план 1→2→3 (mail/071).
|
||||
**Д (3, open 3):** [Д][open] состав/порядок пунктов меню · [Д][open] иконки пунктов ·
|
||||
[Д][open] инлайн-поля (переименование/категория)
|
||||
|
||||
## Экран 3. Редактор заметки (rich / plain / preview) — Ff 10% · Fd 0%
|
||||
**Ф (10, open 9):**
|
||||
- [Ф][open] rich-редактор (@nextcloud/text) — P1
|
||||
## Экран 3. Редактор заметки (rich / plain / preview) — Ff 40% · Fd 0%
|
||||
**Ф (10, open 6):**
|
||||
- [Ф][open] rich-редактор (@nextcloud/text) — P2
|
||||
- [Ф][open] панель форматирования: жирный/курсив/цитата/моно/очистить/список/нумерованный/
|
||||
заголовок/крупный заголовок/ссылка (всплывающая тулбар-панель, mail/087) — P2
|
||||
- [Ф][open] plain-режим — P2
|
||||
- [Ф][done] plain-режим (`NoteEditorScreen`, `F7OutlinedField` markdown) — UI собран
|
||||
- [Ф][open] тумблер «Просмотр»/«Правка» (preview⇄edit) — P2
|
||||
- [Ф][open] тумблер «Полный экран» — P3
|
||||
- [Ф][done] автосохранение с `If-Match: "<etag>"` (`saveContent`, юнит-тест 412) — данные готовы; UI-редактор P1-UI
|
||||
- [Ф][done] автосохранение с `If-Match: "<etag>"` (debounce → `saveContent`, юнит-тест 412)
|
||||
- [Ф][open] автозаголовок из первой строки (`PUT /autotitle`) — P2
|
||||
- [Ф][open] состояние read-only заметки (индикатор, блок правки) — P2
|
||||
- [Ф][open] «Сохранение не удалось. Нажмите, чтобы повторить» (ручной ретрай) — P2
|
||||
- [Ф][open] плейсхолдеры «Write …» / «Empty note» — P3
|
||||
- [Ф][done] состояние read-only заметки (блок правки + подпись поля)
|
||||
- [Ф][open] «Сохранение не удалось. Нажмите, чтобы повторить» (ошибка в state, кнопки ретрая нет) — P2
|
||||
- [Ф][done] плейсхолдер поля (подпись `F7OutlinedField`)
|
||||
|
||||
**Д (5, open 5):** [Д][open] вёрстка редактора · [Д][open] перенос тулбара форматирования на
|
||||
мобильном (`.text-menubar__entries` flex-wrap) · [Д][open] типографика тела · [Д][open] меню
|
||||
действий редактора (preview/fullscreen) · [Д][open] индикатор read-only
|
||||
|
||||
## Экран 4. Диалог конфликта версий — Ff 33.3% · Fd 0%
|
||||
**Ф (3, open 2):**
|
||||
## Экран 4. Диалог конфликта версий — Ff 100% · Fd 0%
|
||||
**Ф (3, open 0):**
|
||||
- [Ф][done] детект конфликта (412 на `If-Match` → `NoteConflictException` + перечитка серверной
|
||||
версии, юнит-тест) — логика готова; UI-диалог P1-UI
|
||||
- [Ф][open] «Использовать версию с сервера» — P1
|
||||
- [Ф][open] «Использовать текущую версию» — P1
|
||||
версии, юнит-тест)
|
||||
- [Ф][done] «Использовать версию с сервера» (`F7AlertDialog` dismiss → `resolveConflictUseServer`)
|
||||
- [Ф][done] «Использовать текущую версию» (`F7AlertDialog` confirm → `resolveConflictKeepMine`)
|
||||
- (⚠ обязателен — НЕ молчаливая перезапись, согласовано mail/071 п.2)
|
||||
|
||||
**Д (1, open 1):** [Д][open] вёрстка диалога конфликта
|
||||
@@ -114,17 +118,17 @@ Notes API v1 + ETag-кэш, план 1→2→3 (mail/071).
|
||||
## Сводка
|
||||
| Экран | Ф всего | Ф open | Ff% | Д всего | Д open | Fd% |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 1. Список | 10 | 8 | 20.0% | 6 | 6 | 0% |
|
||||
| 1. Список | 10 | 5 | 50.0% | 6 | 6 | 0% |
|
||||
| 2. Меню «⋯» | 6 | 2 | 66.7% | 3 | 3 | 0% |
|
||||
| 3. Редактор | 10 | 9 | 10.0% | 5 | 5 | 0% |
|
||||
| 4. Конфликт | 3 | 2 | 33.3% | 1 | 1 | 0% |
|
||||
| 3. Редактор | 10 | 6 | 40.0% | 5 | 5 | 0% |
|
||||
| 4. Конфликт | 3 | 0 | 100% | 1 | 1 | 0% |
|
||||
| 5. Категории | 8 | 8 | 0% | 4 | 4 | 0% |
|
||||
| 6. Настройки | 5 | 5 | 0% | 2 | 2 | 0% |
|
||||
| **Итого** | **42** | **34** | **19.0%** | **21** | **21** | **0%** |
|
||||
| **Итого** | **42** | **26** | **38.1%** | **21** | **21** | **0%** |
|
||||
|
||||
**Ff_app = 21.7%** (среднее по 6 экранам: 20+66.7+10+33.3+0+0) · **Fd_app = 0.0%** (UI не собран).
|
||||
Абсолютно: 8 из 42 Ф закрыты в коде (слой данных), 34 open. Fd — весь бэклог (нет ни одного
|
||||
собранного экрана).
|
||||
**Ff_app = 42.8%** (среднее по 6 экранам: 50+66.7+40+100+0+0) · **Fd_app = 0.0%** (экраны
|
||||
собраны, но девайс/визуал-сверки ещё не было). Абсолютно: 16 из 42 Ф закрыты в коде+UI, 26 open.
|
||||
Fd — весь бэклог до попиксельной сверки на устройстве.
|
||||
|
||||
## Предлагаемый порядок реализации (план 1→2→3, mail/071)
|
||||
- **P1 — read-only ядро:** список заметок (открыть/просмотр), rich-редактор, автосейв `If-Match`,
|
||||
|
||||
Reference in New Issue
Block a user