From ee282b61b7c5b6da6f8bcd1defc1c42687409773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A2=D0=B8=D0=BC=D1=83=D1=80=20=D0=93=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D1=86=D0=BA=D0=B8=D0=B9?= Date: Fri, 23 Oct 2026 09:54:12 +0500 Subject: [PATCH] feat: show current vs new plan before importing works A file value replaces the planned volume of an existing work. Before the import the page now lists such works with their current and new volume and unit, highlighting changes and greying out rows that stay the same, so the user sees what will be overwritten. Co-Authored-By: Claude Opus 5.5 (1M context) --- docs/TEST-PLAN.md | 1 + .../worksImport/WorksImportPage.module.scss | 48 +++++++++++++++++ .../pages/worksImport/WorksImportStep.tsx | 2 + .../pages/worksImport/WorksUpdatesTable.tsx | 54 +++++++++++++++++++ .../stroyBot/pages/worksImport/texts.ts | 16 +++++- .../worksImport/worksImportBuilder.test.ts | 41 ++++++++++++-- .../pages/worksImport/worksImportBuilder.ts | 36 +++++++++++-- .../pages/worksImport/worksImportSave.test.ts | 3 +- 8 files changed, 190 insertions(+), 11 deletions(-) create mode 100644 src/webparts/stroyBot/pages/worksImport/WorksUpdatesTable.tsx diff --git a/docs/TEST-PLAN.md b/docs/TEST-PLAN.md index 18ceac5..f2a7923 100644 --- a/docs/TEST-PLAN.md +++ b/docs/TEST-PLAN.md @@ -201,6 +201,7 @@ - [ ] **T-WIM-01** Меню: «Импорт работ из Excel» после «Загрузить работы из сметы»; есть у роли **Е**, у **Р** (без edit0) — нет; в архивном проекте — нет; в завершённом — есть. - [ ] **T-WIM-02** Файл с несуществующим объектом → «С ошибками: 1», «Объект 2: «…» не найден внутри «…»», кнопки «Импортировать» нет. - [ ] **T-WIM-03** Тестовый файл → «Сверяем с работами объектов…» → «Будет создано работ: 1, обновлён … у существующих: 1», кнопка «Импортировать (работ: 2)». +- [ ] **T-WIM-03a** У работ, где план уже есть, — таблица «Сейчас → Станет»: изменившийся объём подсвечен со стрелкой ▲/▼ (например, «Арматура» 120 м → 150 м ▲), совпадающий — серым «без изменений». План **заменяется** значением из файла, не складывается. В окне подтверждения — «…плановый объём будет заменён значением из файла». (Проверено 2026-10-23.) - [ ] ✍️ **T-WIM-04** «Импортировать» → окно «… будет создано работ: 1, обновлено: 1» → «Сохраняем работы…» → «Импорт завершён: создано работ — 1, обновлено — 1» и ссылка «Открыть «Объекты»». (Проверено 2026-10-22.) - [ ] **T-WIM-05** «Объекты» → «Бетонирование» → «Работы»: «Арматура» — 120 м, родитель «Бетон B25» и даты не изменились; «Тестовая работа импорта» — 50 м3, верхний уровень. - [ ] ✍️ **T-WIM-06** Тот же файл ещё раз → «создано: 0, обновлено: 2» — работы не задваиваются. (Проверено 2026-10-22.) diff --git a/src/webparts/stroyBot/pages/worksImport/WorksImportPage.module.scss b/src/webparts/stroyBot/pages/worksImport/WorksImportPage.module.scss index 8a9a69f..60b1020 100644 --- a/src/webparts/stroyBot/pages/worksImport/WorksImportPage.module.scss +++ b/src/webparts/stroyBot/pages/worksImport/WorksImportPage.module.scss @@ -33,3 +33,51 @@ color: inherit; font-weight: 600; } + +// «Сейчас → станет»: изменившийся план подсвечен, совпадающий — приглушён. +.updates { + display: flex; + flex-direction: column; + gap: $sp-2; +} + +.updatesTitle { + margin: 0; + font-size: $fs-sm; + font-weight: 600; + color: $gold-600; +} + +.updatesTable { + border-collapse: collapse; + font-size: $fs-sm; + background: $white; + border: 1px solid $gray-200; + border-radius: $r-md; + + th { + padding: $sp-2 $sp-3; + border-bottom: 1px solid $gray-200; + background: $gray-50; + font-size: $fs-caption; + font-weight: 600; + text-align: left; + text-transform: uppercase; + color: $gray-500; + } + + td { + padding: $sp-2 $sp-3; + border-bottom: 1px solid $gray-100; + color: $gray-900; + } +} + +.changed { + font-weight: 600; + background: $gold-50; +} + +.unchanged td { + color: $gray-400; +} diff --git a/src/webparts/stroyBot/pages/worksImport/WorksImportStep.tsx b/src/webparts/stroyBot/pages/worksImport/WorksImportStep.tsx index d86a24d..a3c19ac 100644 --- a/src/webparts/stroyBot/pages/worksImport/WorksImportStep.tsx +++ b/src/webparts/stroyBot/pages/worksImport/WorksImportStep.tsx @@ -4,6 +4,7 @@ import { IExcelImportCheck } from '../_excelImport/excelImportTypes'; import { IWorksImportPlan } from './worksImportBuilder'; import { WorksImportStatus } from './useWorksImport'; import { WorksImportOutcome } from './WorksImportOutcome'; +import { WorksUpdatesTable } from './WorksUpdatesTable'; import { WORKS_IMPORT_TEXTS } from './texts'; import styles from './WorksImportPage.module.scss'; @@ -47,6 +48,7 @@ export const WorksImportStep: React.FC = ({ check, projectId, projectTitl return (

{TEXTS.plan(plan.toCreate.length, plan.toUpdate.length)}

+