From b757f18bfb3a230b3d84f1935fef03aeef40bbd3 Mon Sep 17 00:00:00 2001 From: Kirill Date: Sun, 24 May 2026 16:47:51 +0500 Subject: [PATCH] =?UTF-8?q?docs:=20update=20test=20checklist=20spec=20?= =?UTF-8?q?=E2=80=94=203-state=20status=20+=20error=20comments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-05-24-admin-test-checklist-design.md | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/docs/superpowers/specs/2026-05-24-admin-test-checklist-design.md b/docs/superpowers/specs/2026-05-24-admin-test-checklist-design.md index 30093d1..05cee5b 100644 --- a/docs/superpowers/specs/2026-05-24-admin-test-checklist-design.md +++ b/docs/superpowers/specs/2026-05-24-admin-test-checklist-design.md @@ -2,22 +2,24 @@ **Date:** 2026-05-24 **Status:** Approved +**Updated:** 2026-05-24 (v2 — 3-state status + error comments) ## Summary -Админ-страница с чек-листом для ручного тестирования функционала сайта. Каждая проверка имеет описание действия и ожидаемый результат. Отметка сохраняется в SQLite с автоматической датой. +Админ-страница с чек-листом для ручного тестирования функционала сайта. Каждая проверка имеет описание действия и ожидаемый результат. Отметка сохраняется в SQLite с автоматической датой. Поддерживает 3 состояния: пройдено / не пройдено (с комментарием об ошибке) / не проверено. ## Architecture ### Data Model -Новая модель `ChecklistResult` в Prisma schema: +Модель `ChecklistResult` в Prisma schema: ```prisma model ChecklistResult { id String @id @default(cuid()) itemKey String @unique // уникальный ключ проверки - passed Boolean + passed Boolean // true = пройдено, false = не пройдено + comment String? // описание ошибки (при passed: false) checkedAt DateTime @default(now()) updatedAt DateTime @updatedAt } @@ -25,7 +27,7 @@ model ChecklistResult { ### Elements Source -Элементы чек-листа — хардкод в `shared/constants/test-checklist-items.ts` (JS + .d.ts). Версионируются с кодом. +Элементы чек-листа — хардкод в `shared/constants/test-checklist-items.js` (JS + .d.ts). Версионируются с кодом. Структура элемента: ```ts @@ -41,8 +43,8 @@ model ChecklistResult { **Server route:** `server/src/routes/api/admin/test-checklist.js` -- `GET /api/admin/test-checklist` — возвращает все элементы + их результаты из БД -- `PATCH /api/admin/test-checklist` — body: `{ itemKey, passed }`, обновляет/создаёт результат, `checkedAt = now()` +- `GET /api/admin/test-checklist` — возвращает все элементы + их результаты из БД (включая `comment`) +- `PATCH /api/admin/test-checklist` — body: `{ itemKey, passed, comment? }`, обновляет/создаёт результат, `checkedAt = now()`. При `passed: true` комментарий очищается. - `POST /api/admin/test-checklist/reset` — сбрасывает все результаты (удаляет записи) Только для админов. @@ -52,9 +54,9 @@ model ChecklistResult { **Page:** `client/src/pages/admin-test-checklist/ui/AdminTestChecklistPage.tsx` - Аккордеон по разделам (MUI Accordion) -- Каждая строка: чекбокс, колонка "Действие", колонка "Ожидаемый результат", дата проверки -- Чекбокс отмечен = `passed: true`, снят = `passed: false` -- Дата проставляется автоматически при изменении чекбокса +- Каждая строка: 3-состоятельный статус (✅ пройдено / ❌ не пройдено / ⬜ не проверено), колонка "Действие", колонка "Ожидаемый результат", колонка "Комментарий" (показывает текст ошибки с tooltip), дата проверки +- При выборе «Не пройдено» — открывается диалог с обязательным полем «Описание ошибки» (textarea) +- Диалог: заголовок «Описание ошибки — {название проверки}», placeholder «Опишите, что пошло не так...», кнопки «Отмена» / «Сохранить», валидация — поле обязательно при ❌ - Кнопка «Сбросить все» для полного ре-теста - `@tanstack/react-query` для данных, `apiClient` для запросов