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 }; };