diff --git a/docs/TZ.md b/docs/TZ.md index fe078cc..31064b4 100644 --- a/docs/TZ.md +++ b/docs/TZ.md @@ -4,7 +4,7 @@ | | | |---|---| -| Версия ТЗ | 0.93 | +| Версия ТЗ | 0.94 | | Дата | 2026-10-10 | | Статус | На обсуждении | @@ -247,6 +247,11 @@ (3.5): «показать главное» и «показать повторяющееся» — два вопроса об одном списке, и читаются они парой. Фильтры списка применяет сервер (как и остальные), персистентности у них нет — по 3.8 запоминаются фильтры только на странице проекта. +- **Фильтр «Созданные агентом»** (0.94): третий `GnSwitch` в шапке списка, параметр + `created_by_kind=agent` у `GET /api/tasks` (3.20). До 0.94 это был `GnSelect` с + тремя пунктами — «все / мои / агента»; средний пункт ничего не прибавлял к + «всем» (своих задач у владельца подавляющее большинство), а спрашивалось в нём + ровно одно: «показать только то, что завёл агент». Теперь так и спрашивается. - **Фильтры-поля — в шапке страницы** (0.75): переключатель «Приоритетные» и поиск по тегу собраны справа от заголовка (слот действий `GnPageHeader`) одной группой; отдельной строкой под шапкой остались только табы статуса. На узком экране группа @@ -1333,10 +1338,22 @@ причина возврата живут в записи. - Страница **«Журнал»** (`/journal`, отдельный пункт меню) — таблица записей с фильтрами по - типу события, актору и проекту и с пагинацией. Это первый пагинированный список на + типу события и актору, с пагинацией. Это первый пагинированный список на бэкенде: `GET /api/task-events` отвечает конвертом `{ items, total, page, per_page }` - (потолок `per_page` — 100). Вкладки-фильтры «Ждёт приёмки» и «Создано» (мной / агентом) - живут в списке задач (3.6). + (потолок `per_page` — 100). Фильтр «Созданные агентом» (3.6) и вкладка «Ждёт приёмки» + живут в списке задач. +- Доработка 0.94 — журнал читается с телефона. **Фильтра по проекту нет**: проектов у + владельца будут сотни, и выпадающий список из них нужный не находит — разрез по + проектам живёт в разделе «Проекты» (3.8), как и в общем списке задач (0.73). + **Комментарий показывается иконкой и только там, где он есть**: записей без + комментария в журнале большинство, и колонка пустых ячеек съедала половину ширины + таблицы, а текст автора в ячейке не влезал и рвался по строкам — целиком он + открывается модалкой (в ней же стоит вид записи и заголовок задачи: диалог + открывается из строки, под ним остаётся весь журнал). Заголовок колонки — та же + иконка, слово «Комментарий» шире самой колонки. На узком экране дата и время встают + **в две строки**, колонки «Проект» и «Актор» уходят, а актор возвращается строкой под + бейджем события: ради актора журнал и существует, но своей колонкой он оставлял + половину ширины пустой. На 390px таблица не едет по горизонтали. - Записи переживают задачу: `task_id` при удалении обнуляется, но заголовок сохранён снапшотом — журнал читается как история, а не как список живых задач. - О работе агента узнают не только из журнала: взятие и закрытие публикуются по SSE @@ -1731,7 +1748,7 @@ | M5 — MCP | MCP-сервер, инструменты для агентов | | M5+ — мандат агента | Доступность задачи для ИИ-агента, взятие в работу (аренда), приёмка работы, журнал `task_events` (0.85, 3.20) | | M6 — мобильность | PWA (Android-приложение — позже, вне стартового скоупа) | -| M6+ — уведомления | Системные уведомления (Web Push): подписки устройств, ключи VAPID, блок настроек, работа агента в закрытом приложении (0.88, 3.21). Напоминания: дедлайны, ритм регулярных задач, утренняя сводка, тихие часы (0.89, 3.21). Регулярные задачи: дата следующего экземпляра у клона, метка в карточке, фильтр «Регулярные» (0.91, 3.5). Импорт задачи из ссылки на багрепорт BugTrail — в форме задачи и в попапе расширения (0.92, 3.22). Автодетализация переведена на теги, приоритет и оценку времени — заголовок и описание ИИ не предлагает (0.93, 3.2) | +| M6+ — уведомления | Системные уведомления (Web Push): подписки устройств, ключи VAPID, блок настроек, работа агента в закрытом приложении (0.88, 3.21). Напоминания: дедлайны, ритм регулярных задач, утренняя сводка, тихие часы (0.89, 3.21). Регулярные задачи: дата следующего экземпляра у клона, метка в карточке, фильтр «Регулярные» (0.91, 3.5). Импорт задачи из ссылки на багрепорт BugTrail — в форме задачи и в попапе расширения (0.92, 3.22). Автодетализация переведена на теги, приоритет и оценку времени — заголовок и описание ИИ не предлагает (0.93, 3.2). Журнал и шапка списка приспособлены к телефону, «Кто создал» стал переключателем (0.94, 3.20, 3.6) | | M7 — упаковка | Docker (docker-compose: API, PostgreSQL, фронт, Ollama + модель) | Порядок M4/M5 может меняться — MCP можно поднять раньше ради ИИ-сценария. diff --git a/frontend/src/kit-overrides.css b/frontend/src/kit-overrides.css index dfbb9fa..52bf3fb 100644 --- a/frontend/src/kit-overrides.css +++ b/frontend/src/kit-overrides.css @@ -155,7 +155,10 @@ (dropdownClamp.ts). До 767px меню вместо этого становится шторкой снизу: панель во всю ширину + затемнение под ней. Это штатная мобильная замена выпадашки (так делают и нативные листы действий), и заодно снимает всю - возню с координатами. Затемняющий слой — статичный div в index.html. */ + возню с координатами. Затемняющий слой — статичный div в index.html. + Блок временный — как только кит отдаст шторку сам, он удаляется вместе со слоем + в index.html; задача оформлена в доке кита + (gnexus-ui-kit/docs/tasks/gn-dropdown-mobile-sheet.md) */ .dropdown-backdrop { display: none; } diff --git a/frontend/src/locales/en.ts b/frontend/src/locales/en.ts index aec124e..78d1c82 100644 --- a/frontend/src/locales/en.ts +++ b/frontend/src/locales/en.ts @@ -16,6 +16,9 @@ confirmTitle: 'Confirmation', delete: 'Delete', open: 'Open', + // Close button of modals that have no action of their own (0.94): a viewer + // has nothing to confirm, and "Cancel" would read as backing out of something + close: 'Close', move: 'Move', actions: 'Actions', expand: 'Expand', @@ -482,9 +485,7 @@ noTagsFound: 'No tags found', // Review (0.85, spec 3.20): a separate tab-plane, not a status tabReview: 'Awaiting review', - filterCreated: 'Created by', - createdAll: 'All tasks', - createdMe: 'Created by me', + // Switch label (0.94): "show what the agent created" createdAgent: 'Created by agent', }, // Action journal (spec 3.20): who did what to tasks, and when @@ -496,10 +497,10 @@ filterKindAll: 'All events', filterActor: 'Actor', filterActorAll: 'All actors', - filterProject: 'Project', - filterProjectAll: 'All projects', actorUser: 'Me', actorAgent: 'Agent', + // Record comment sits behind an icon (0.94): it did not fit in the cell + showComment: 'Show comment', col: { when: 'When', event: 'Event', diff --git a/frontend/src/locales/ru.ts b/frontend/src/locales/ru.ts index 0bce7c2..9601134 100644 --- a/frontend/src/locales/ru.ts +++ b/frontend/src/locales/ru.ts @@ -17,6 +17,9 @@ confirmTitle: 'Подтверждение', delete: 'Удалить', open: 'Открыть', + // Кнопка закрытия у модалок без своего действия (0.94): у просмотра нечего + // подтверждать, а «Отмена» здесь читалась бы как отказ от чего-то + close: 'Закрыть', move: 'Переместить', actions: 'Действия', expand: 'Развернуть', @@ -489,9 +492,7 @@ noTagsFound: 'Теги не найдены', // Приёмка (0.85, ТЗ 3.20): не статус, а отдельная вкладка-плоскость tabReview: 'Ждёт приёмки', - filterCreated: 'Кто создал', - createdAll: 'Все задачи', - createdMe: 'Созданные мной', + // Подпись переключателя (0.94): «показать, что создал агент» createdAgent: 'Созданные агентом', }, // Журнал действий (ТЗ 3.20): кто, что и когда делал с задачами @@ -503,10 +504,10 @@ filterKindAll: 'Все события', filterActor: 'Актор', filterActorAll: 'Все акторы', - filterProject: 'Проект', - filterProjectAll: 'Все проекты', actorUser: 'Я', actorAgent: 'Агент', + // Комментарий записи — за иконкой (0.94): в ячейке он не влезал + showComment: 'Показать комментарий', col: { when: 'Когда', event: 'Событие', diff --git a/frontend/src/locales/uk.ts b/frontend/src/locales/uk.ts index 01b7c4c..f7cf637 100644 --- a/frontend/src/locales/uk.ts +++ b/frontend/src/locales/uk.ts @@ -16,6 +16,9 @@ confirmTitle: 'Підтвердження', delete: 'Видалити', open: 'Відкрити', + // Кнопка закриття в модалок без власної дії (0.94): у перегляду нічого + // підтверджувати, а «Скасувати» читалося б як відмова від чогось + close: 'Закрити', move: 'Перемістити', actions: 'Дії', expand: 'Розгорнути', @@ -482,9 +485,7 @@ noTagsFound: 'Теґів не знайдено', // Приймання (0.85, ТЗ 3.20): не статус, а окрема вкладка-площина tabReview: 'Чекає на приймання', - filterCreated: 'Хто створив', - createdAll: 'Усі завдання', - createdMe: 'Створені мною', + // Підпис перемикача (0.94): «показати, що створив агент» createdAgent: 'Створені агентом', }, // Журнал дій (ТЗ 3.20): хто, що і коли робив із завданнями @@ -496,10 +497,10 @@ filterKindAll: 'Усі події', filterActor: 'Актор', filterActorAll: 'Усі актори', - filterProject: 'Проєкт', - filterProjectAll: 'Усі проєкти', actorUser: 'Я', actorAgent: 'Агент', + // Коментар запису — за іконкою (0.94): у комірці він не вміщався + showComment: 'Показати коментар', col: { when: 'Коли', event: 'Подія', diff --git a/frontend/src/taskui.ts b/frontend/src/taskui.ts index d60ae75..2c675bc 100644 --- a/frontend/src/taskui.ts +++ b/frontend/src/taskui.ts @@ -239,17 +239,6 @@ ) } -// Дата со временем — журнал: записи идут одна за другой, и одних суток мало -export function formatDateTime(iso: string): string { - return new Intl.DateTimeFormat(intlLocale(), { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - }).format(parseIsoDate(iso)) -} - // Подпись даты. У регулярной та же `deadline_date` — не срок, а дата следующего // экземпляра (0.91, ТЗ 3.5), и «до 11.10» читалось бы как «успей к»: ветка для // повторяющихся задач говорит «след. 11.10». Ветка одна на всех вызывающих — diff --git a/frontend/src/views/JournalView.vue b/frontend/src/views/JournalView.vue index 4e6b921..2b31c36 100644 --- a/frontend/src/views/JournalView.vue +++ b/frontend/src/views/JournalView.vue @@ -1,9 +1,9 @@