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:
@@ -1,6 +1,6 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { LISTS } from '../../config/lists';
|
import { LISTS } from '../../config/lists';
|
||||||
import { IReportLookups, IWorkItem } from './reportTypes';
|
import { IJobWithPath, IReportLookups, IWorkItem } from './reportTypes';
|
||||||
import { IPickerCreateData, IPickerItem, IPickerOptions } from './picker/pickerTypes';
|
import { IPickerCreateData, IPickerItem, IPickerOptions } from './picker/pickerTypes';
|
||||||
import { PickerKind, PICKER_OPTIONS, toPickerItems } from './reportPicker';
|
import { PickerKind, PICKER_OPTIONS, toPickerItems } from './reportPicker';
|
||||||
import { addResource, addWork, createLocalId, createResourceItem } from './reportFormUpdates';
|
import { addResource, addWork, createLocalId, createResourceItem } from './reportFormUpdates';
|
||||||
@@ -32,8 +32,14 @@ interface IPickerDeps {
|
|||||||
projectId: number;
|
projectId: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
function newWorkItem(item: IPickerItem, lookups: IReportLookups, totalFact: number): IWorkItem {
|
function newWorkItem(
|
||||||
const job = lookups.jobs.filter((candidate) => candidate.cree9_tableid === item.id)[0];
|
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 {
|
return {
|
||||||
id: createLocalId(),
|
id: createLocalId(),
|
||||||
jobId: String(item.id),
|
jobId: String(item.id),
|
||||||
@@ -75,6 +81,10 @@ export function usePickerModal(deps: IPickerDeps): IPickerModalApi {
|
|||||||
const { services, report } = deps;
|
const { services, report } = deps;
|
||||||
const [active, setActive] = React.useState<IActivePicker | undefined>(undefined);
|
const [active, setActive] = React.useState<IActivePicker | undefined>(undefined);
|
||||||
const [isLoading, setIsLoading] = React.useState<boolean>(false);
|
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 => {
|
const open = (kind: PickerKind, targetWorkId?: string): void => {
|
||||||
setActive({ kind, targetWorkId });
|
setActive({ kind, targetWorkId });
|
||||||
@@ -100,10 +110,8 @@ export function usePickerModal(deps: IPickerDeps): IPickerModalApi {
|
|||||||
} else if (kind === 'company') {
|
} else if (kind === 'company') {
|
||||||
report.updateForm((prev) => ({ ...prev, companyId: Number(item.id), companyName: item.title }));
|
report.updateForm((prev) => ({ ...prev, companyId: Number(item.id), companyName: item.title }));
|
||||||
} else if (kind === 'work') {
|
} else if (kind === 'work') {
|
||||||
// 🐞 Как в старом коде: только что созданной работы ещё нет в lookups.jobs этого рендера,
|
|
||||||
// поэтому у неё название = полный путь, ед. изм. пустая и план 0.
|
|
||||||
const totalFact = await services.dv.getJobTotalFact(String(item.id));
|
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));
|
report.updateForm((prev) => addWork(prev, work));
|
||||||
} else {
|
} else {
|
||||||
const resource = createResourceItem(Number(item.id), item.title);
|
const resource = createResourceItem(Number(item.id), item.title);
|
||||||
@@ -134,7 +142,9 @@ export function usePickerModal(deps: IPickerDeps): IPickerModalApi {
|
|||||||
parentId: data.parentId
|
parentId: data.parentId
|
||||||
});
|
});
|
||||||
const fullPath = newJobPath(data.title, data.parentId, report.lookups.jobs);
|
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 };
|
return { id: created.cree9_tableid, title: fullPath, subtitle: data.unit };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user