From f7c0c721a2e6f79ef21397bef22d28afe38b7671 Mon Sep 17 00:00:00 2001 From: b-mob-notes Date: Mon, 13 Jul 2026 07:34:06 +0000 Subject: [PATCH] =?UTF-8?q?docs(app-map):=20notes.diff=20=D0=B8=D1=82?= =?UTF-8?q?=D0=B5=D1=80.1a=20=E2=80=94=20=D1=81=D0=BB=D0=BE=D0=B9=20=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20done=20(Ff=2021.7%),=20STATUS?= =?UTF-8?q?=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D1=91=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Скелет заведён лидом (133d80d), P1 слой данных реализован+юнит-тест (8a8f1cf): 8/42 Ф закрыты в коде (create/get/list/favorite/category/rename/delete/save-If-Match/конфликт). Fd=0% (UI не собран). Дальше — P1-UI. --- docs/app-map/STATUS.md | 4 +- docs/app-map/notes.diff.md | 84 ++++++++++++++++++++++---------------- 2 files changed, 51 insertions(+), 37 deletions(-) diff --git a/docs/app-map/STATUS.md b/docs/app-map/STATUS.md index 1b09df3..ce385c4 100644 --- a/docs/app-map/STATUS.md +++ b/docs/app-map/STATUS.md @@ -13,9 +13,9 @@ | shell | b-dev-mobile | 0 | — | — | — | — | — | карта | | files | b-mob-files | 1 | — | — | 4 | ? | нет | правки D4→D3→D2→D1 | | mail | b-mob-mail | 1 | — | — | ~4 | ~2 | нет | правка P1 черновики | -| talk | b-mob-conf | 1 | 40.0 | предв. | ~31 | ? | нет | P1: меню сообщения Копировать/ссылка/переслать/Напоминание (59543a7,bbaaf7a); далее лично/файл-тред/перевод; Fd на устройстве | +| talk | b-mob-conf | 1 | 40.7 | предв. | ~30 | ? | нет | P1: меню сообщения Копировать/ссылка/переслать/Напоминание/Ответить-лично (…a60fd78); далее файл-тред/перевод, затем P2; Fd на устройстве | | tasks | b-mob-tasks | 1 | 24.6 | 52.7 | ~34 | ~8 | нет | P1 закрыт в коде (умные коллекции+3-state видимость+персист, `bd56c4b`); далее P2 управление списками; ждёт девайс-сверки | -| notes | b-mob-notes | 1 | 0.0 | 0.0 | 42 | 21 | нет | diff выложен (`notes.diff.md`); натив пуст — модуль не создан, жду скелет от лида (пинг «готов к регистрации», 093) | +| notes | b-mob-notes | 1 | 21.7 | 0.0 | 34 | 21 | нет | P1 слой данных в коде+юнит-тест (`8a8f1cf`: Notes API v1 клиент/репо/ETag-кэш/конфликт 412); скелет заведён лидом (`133d80d`); далее P1-UI (экраны/редактор/диалог) | | notifications | b-mob-notify | 0 | — | — | — | — | нет | карта готова, diff | | deck | b-mob-deck | 1 | 22.6 | предв. | 52 | ? | нет | P1 начат: «Назначить мне/снять» done (6eeba1b, green compile); далее бейджи чек-пунктов/комментариев, меню колонки (Удалить/Переименовать), быстрые сроки; Fd на устройстве | | calendar | b-mob-calendar | 1 | 51.6 | 67.0 | ~38 | ~7 | нет | diff итер.1 (`calendar.diff.md`); P1 разворот повторений; Appointments — вопрос n-a лиду | diff --git a/docs/app-map/notes.diff.md b/docs/app-map/notes.diff.md index a373d22..9bdbbed 100644 --- a/docs/app-map/notes.diff.md +++ b/docs/app-map/notes.diff.md @@ -1,13 +1,18 @@ # Diff: Заметки (Notes) — итерация 1 (2026-07-13) -Ff_app: **0.0%** · Fd_app: **0.0%** (среднее по 6 экранам) · n-a: 0 +Ff_app: **21.7%** · Fd_app: **0.0%** (среднее по 6 экранам) · n-a: 0 -> ⚠️ **Особый случай: нативного модуля `feature/notes` ЕЩЁ НЕТ.** Он не заведён в -> `settings.gradle`/`app` — скелет создаёт лид по пингу «готов к регистрации» (mail/071 п.2, -> подтверждено в 093). Поэтому **все** функции/элементы веба — `open` (в нативе ноль), а -> счётчики честно 0%. Diff = полный бэклог на реализацию. **Код правок начну сразу, как лид -> заведёт скелет** — пинг «готов к регистрации» отправлен в ответе 093. До скелета коммитить в -> `feature/notes/**` физически некуда. +> ✅ **Скелет модуля заведён лидом** (`133d80d`, mail/096). **Итерация 1a — слой данных +> реализован и верифицирован** (коммит `8a8f1cf`): пункты, помеченные `[done]` ниже = логика в +> коде + юнит-тест (7/7, MockWebServer), **UI-экраны (список/редактор/диалог/навигация) — +> следующий заход P1-UI**, девайс/визуал-сверка позже. 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. Сверка веб (`nextcloud/notes v5.0.0` + тема forbion) ↔ натив (**отсутствует**). Карта-источник: [`notes.md`](notes.md) (снята из кода + визуально сверена на forbion, Browser 1, read-only). @@ -18,11 +23,11 @@ Notes API v1 + ETag-кэш, план 1→2→3 (mail/071). --- -## Экран 1. Список заметок (главный) — Ff 0% · Fd 0% -**Ф (10, open 10):** -- [Ф][open] кнопка «Новая заметка» (создать + открыть редактор) — P1 +## Экран 1. Список заметок (главный) — Ff 20% · Fd 0% +**Ф (10, open 8):** +- [Ф][done] создать заметку (`NotesApiClient.create`, юнит-тест) — UI-кнопка следующим заходом - [Ф][open] поле «Искать заметки» (фильтр по заголовку) + очистка — P2 -- [Ф][open] строка-заметка, тап → открыть редактор — P1 +- [Ф][done] загрузка заметки (`get`) + списка (`listNotes` offline-first) — данные готовы; UI строки P1-UI - [Ф][open] индикатор «расшарена» на строке — P3 - [Ф][open] меню строки «⋯» (см. Экран 2) — P1 - [Ф][open] группировка по таймслотам (сегодня/недавние/…) — P2 @@ -37,28 +42,28 @@ Notes API v1 + ETag-кэш, план 1→2→3 (mail/071). [Д][open] типографика (Raleway, тема) · [Д][open] иконки (звезда избранного, share-индикатор) · [Д][open] состояние загрузки/пустое -## Экран 2. Меню заметки «⋯» (всплывающее, mail/087) — Ff 0% · Fd 0% +## Экран 2. Меню заметки «⋯» (всплывающее, mail/087) — Ff 66.7% · Fd 0% Полный состав из кода (`NoteItem` #actions), порядок сверен визуально: -**Ф (6, open 6):** -- [Ф][open] «Добавить/Удалить из избранного» (`PUT /favorite`) — P1 +**Ф (6, open 2):** +- [Ф][done] «Добавить/Удалить из избранного» (`setFavorite`, юнит-тест) — данные готовы; UI P1-UI - [Ф][open] «Поделиться» → сайдбар шаринга (NC sharing) — P3 -- [Ф][open] «<Категория>» / «Изменить категорию» (мультиселект + создать новую, `PUT /category`) — P2 -- [Ф][open] «Переименовать» (инлайн, `PUT /title`) — P2 -- [Ф][open] «Удалить заметку» (`DELETE`) — P1 -- [Ф][open] отмена удаления (`POST /notes/undo`) — P2 +- [Ф][done] «<Категория>» / «Изменить категорию» (`setCategory`) — данные готовы; UI-мультиселект P2 +- [Ф][done] «Переименовать» (`rename`) — данные готовы; UI-инлайн P2 +- [Ф][done] «Удалить заметку» (`delete`, юнит-тест) — данные готовы; UI P1-UI +- [Ф][open] отмена удаления (`POST /notes/undo`) — не реализовано — P2 **Д (3, open 3):** [Д][open] состав/порядок пунктов меню · [Д][open] иконки пунктов · [Д][open] инлайн-поля (переименование/категория) -## Экран 3. Редактор заметки (rich / plain / preview) — Ff 0% · Fd 0% -**Ф (10, open 10):** +## Экран 3. Редактор заметки (rich / plain / preview) — Ff 10% · Fd 0% +**Ф (10, open 9):** - [Ф][open] rich-редактор (@nextcloud/text) — P1 - [Ф][open] панель форматирования: жирный/курсив/цитата/моно/очистить/список/нумерованный/ заголовок/крупный заголовок/ссылка (всплывающая тулбар-панель, mail/087) — P2 - [Ф][open] plain-режим — P2 - [Ф][open] тумблер «Просмотр»/«Правка» (preview⇄edit) — P2 - [Ф][open] тумблер «Полный экран» — P3 -- [Ф][open] автосохранение с `If-Match: ""` (`PUT /notes/{id}`) — P1 +- [Ф][done] автосохранение с `If-Match: ""` (`saveContent`, юнит-тест 412) — данные готовы; UI-редактор P1-UI - [Ф][open] автозаголовок из первой строки (`PUT /autotitle`) — P2 - [Ф][open] состояние read-only заметки (индикатор, блок правки) — P2 - [Ф][open] «Сохранение не удалось. Нажмите, чтобы повторить» (ручной ретрай) — P2 @@ -68,9 +73,10 @@ Notes API v1 + ETag-кэш, план 1→2→3 (mail/071). мобильном (`.text-menubar__entries` flex-wrap) · [Д][open] типографика тела · [Д][open] меню действий редактора (preview/fullscreen) · [Д][open] индикатор read-only -## Экран 4. Диалог конфликта версий — Ff 0% · Fd 0% -**Ф (3, open 3):** -- [Ф][open] детект конфликта (сервер вернул конфликт на `If-Match`) — P1 +## Экран 4. Диалог конфликта версий — Ff 33.3% · Fd 0% +**Ф (3, open 2):** +- [Ф][done] детект конфликта (412 на `If-Match` → `NoteConflictException` + перечитка серверной + версии, юнит-тест) — логика готова; UI-диалог P1-UI - [Ф][open] «Использовать версию с сервера» — P1 - [Ф][open] «Использовать текущую версию» — P1 - (⚠ обязателен — НЕ молчаливая перезапись, согласовано mail/071 п.2) @@ -108,15 +114,17 @@ Notes API v1 + ETag-кэш, план 1→2→3 (mail/071). ## Сводка | Экран | Ф всего | Ф open | Ff% | Д всего | Д open | Fd% | |---|---|---|---|---|---|---| -| 1. Список | 10 | 10 | 0% | 6 | 6 | 0% | -| 2. Меню «⋯» | 6 | 6 | 0% | 3 | 3 | 0% | -| 3. Редактор | 10 | 10 | 0% | 5 | 5 | 0% | -| 4. Конфликт | 3 | 3 | 0% | 1 | 1 | 0% | +| 1. Список | 10 | 8 | 20.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% | | 5. Категории | 8 | 8 | 0% | 4 | 4 | 0% | | 6. Настройки | 5 | 5 | 0% | 2 | 2 | 0% | -| **Итого** | **42** | **42** | **0%** | **21** | **21** | **0%** | +| **Итого** | **42** | **34** | **19.0%** | **21** | **21** | **0%** | -**Ff_app = 0.0% · Fd_app = 0.0%** (натив пуст — модуль не создан). +**Ff_app = 21.7%** (среднее по 6 экранам: 20+66.7+10+33.3+0+0) · **Fd_app = 0.0%** (UI не собран). +Абсолютно: 8 из 42 Ф закрыты в коде (слой данных), 34 open. Fd — весь бэклог (нет ни одного +собранного экрана). ## Предлагаемый порядок реализации (план 1→2→3, mail/071) - **P1 — read-only ядро:** список заметок (открыть/просмотр), rich-редактор, автосейв `If-Match`, @@ -127,8 +135,14 @@ Notes API v1 + ETag-кэш, план 1→2→3 (mail/071). режим, расширение файла/папка, попиксельная вёрстка по `_mobile-notes.css`. (= итерация 3) ## Блокеры -1. **Скелет модуля** — заводит лид (mail/071/093); до него код не пишу. Пинг «готов к - регистрации» — в ответе 093. -2. **NC-апп `notes` на glb** — установлен ли (для интеграционной проверки записи); лид спросил - в PPS 069. До ответа write-путь — на unit-тестах (`core:network`), не на forbion (read-only, mail/073). -3. Повторный (подтверждающий) прогон для гейта — после реализации P1, на устройстве/`bmob-*`. +1. ~~Скелет модуля~~ — **снят**: заведён лидом (`133d80d`, mail/096). Слой данных 1a — в коде (`8a8f1cf`). +2. **NC-апп `notes` на glb** — установлен ли (для интеграционной проверки записи на живом + сервере); лид спросил в PPS 069. До ответа write-путь проверяется юнит-тестами (MockWebServer), + не на forbion (read-only, mail/073). НЕ блокирует разработку — только живую верификацию. +3. Повторный (подтверждающий) прогон для гейта — после реализации P1-UI, на устройстве/`bmob-*`. + +## Дальше (следующий заход, автономно) +P1-UI: `NotesScreen` (список+поиск+пусто-состояние) → `NoteEditorScreen` (rich/plain/preview + +автосейв) → диалог `ConflictSolution` → регистрация экрана у лида (переключение веб-пункта меню +на нативный — зона app/, делает лид по готовности). Затем P2 (категории-CRUD/autotitle/undo/ +settings), P3 (шаринг/добивка вёрстки).