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) <noreply@anthropic.com>
This commit is contained in:
Тимур Городецкий
2026-10-19 16:17:56 +05:00
parent 33f31366cd
commit ae383b5231
@@ -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<string, IJobWithPath>,
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<IActivePicker | undefined>(undefined);
const [isLoading, setIsLoading] = React.useState<boolean>(false);
// Работы, созданные из пикера в этой форме. Нужны сразу при выборе: в lookups.jobs текущего рендера
// их ещё нет (обновление state придёт позже), и без этого карточка получала путь вместо названия,
// пустую ед. изм. и план 0 — баг старого кода, исправлен при проверке T-REP-15b.
const createdJobsRef = React.useRef<Map<string, IJobWithPath>>(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 };
};