From ae383b5231f3c28e86f98adc1982c753e2b3b81e 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: Mon, 19 Oct 2026 16:17:56 +0500 Subject: [PATCH] fix: show title, unit and plan for a work created from the picker The new work was not yet in lookups of the current render, so the card got the full path, an empty unit and plan 0. Co-Authored-By: Claude Opus 5.5 (1M context) --- .../stroyBot/pages/report/usePickerModal.ts | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/webparts/stroyBot/pages/report/usePickerModal.ts b/src/webparts/stroyBot/pages/report/usePickerModal.ts index fc2016e..c3666f5 100644 --- a/src/webparts/stroyBot/pages/report/usePickerModal.ts +++ b/src/webparts/stroyBot/pages/report/usePickerModal.ts @@ -1,6 +1,6 @@ import * as React from 'react'; import { LISTS } from '../../config/lists'; -import { IReportLookups, IWorkItem } from './reportTypes'; +import { IJobWithPath, IReportLookups, IWorkItem } from './reportTypes'; import { IPickerCreateData, IPickerItem, IPickerOptions } from './picker/pickerTypes'; import { PickerKind, PICKER_OPTIONS, toPickerItems } from './reportPicker'; import { addResource, addWork, createLocalId, createResourceItem } from './reportFormUpdates'; @@ -32,8 +32,14 @@ interface IPickerDeps { projectId: number; } -function newWorkItem(item: IPickerItem, lookups: IReportLookups, totalFact: number): IWorkItem { - const job = lookups.jobs.filter((candidate) => candidate.cree9_tableid === item.id)[0]; +function newWorkItem( + item: IPickerItem, + lookups: IReportLookups, + createdJobs: Map, + totalFact: number +): IWorkItem { + const job = + lookups.jobs.filter((candidate) => candidate.cree9_tableid === item.id)[0] ?? createdJobs.get(String(item.id)); return { id: createLocalId(), jobId: String(item.id), @@ -75,6 +81,10 @@ export function usePickerModal(deps: IPickerDeps): IPickerModalApi { const { services, report } = deps; const [active, setActive] = React.useState(undefined); const [isLoading, setIsLoading] = React.useState(false); + // Работы, созданные из пикера в этой форме. Нужны сразу при выборе: в lookups.jobs текущего рендера + // их ещё нет (обновление state придёт позже), и без этого карточка получала путь вместо названия, + // пустую ед. изм. и план 0 — баг старого кода, исправлен при проверке T-REP-15b. + const createdJobsRef = React.useRef>(new Map()); const open = (kind: PickerKind, targetWorkId?: string): void => { setActive({ kind, targetWorkId }); @@ -100,10 +110,8 @@ export function usePickerModal(deps: IPickerDeps): IPickerModalApi { } else if (kind === 'company') { report.updateForm((prev) => ({ ...prev, companyId: Number(item.id), companyName: item.title })); } else if (kind === 'work') { - // 🐞 Как в старом коде: только что созданной работы ещё нет в lookups.jobs этого рендера, - // поэтому у неё название = полный путь, ед. изм. пустая и план 0. const totalFact = await services.dv.getJobTotalFact(String(item.id)); - const work = newWorkItem(item, report.lookups, totalFact); + const work = newWorkItem(item, report.lookups, createdJobsRef.current, totalFact); report.updateForm((prev) => addWork(prev, work)); } else { const resource = createResourceItem(Number(item.id), item.title); @@ -134,7 +142,9 @@ export function usePickerModal(deps: IPickerDeps): IPickerModalApi { parentId: data.parentId }); const fullPath = newJobPath(data.title, data.parentId, report.lookups.jobs); - report.updateLookups((prev) => ({ jobs: [...prev.jobs, { ...created, fullPath }] })); + const createdWithPath = { ...created, fullPath }; + createdJobsRef.current.set(created.cree9_tableid, createdWithPath); + report.updateLookups((prev) => ({ jobs: [...prev.jobs, createdWithPath] })); return { id: created.cree9_tableid, title: fullPath, subtitle: data.unit }; };