2026-08-14 14:09:23 +08:00

304 lines
13 KiB
TypeScript

"use client";
import type { BrandFilingBrand } from "@/app/intake/brand-filing/brandFilingConfig";
import type { BomLibraryKey } from "@/app/intake/bom-library/BomLibraryDomain";
import { IntakeEmptyDetail } from "@/app/intake/IntakeMainLayout";
import type { IntakePrimaryDomainContentProps } from "@/app/intake/IntakePrimaryDomainContent";
import type { IntakeRightWorkbenchPanelProps } from "@/app/intake/IntakeRightWorkbenchPanel";
import type { IntakeWorkspaceContentPanelProps } from "@/app/intake/IntakeWorkspaceContentPanel";
import type { IntakeClientProps } from "@/app/intake/intakeClientTypes";
import type {
IntegratedPendingSeriesRow,
IntakeEntryTab,
IntakeSection,
IntakeWorkspaceTab,
ProductDevelopmentKind,
WorkbenchSku,
WorkspaceProductDetailState,
WorkspaceProductMode,
} from "@/app/intake/intakeWorkspaceTypes";
import type { NonIntegratedProductKindFilter } from "@/app/intake/product-development/nonIntegratedListState";
import type { ProductPatentLedgerTarget } from "@/app/intake/product-patent/ProductPatentDomain";
import type { RawMaterialLibraryKey } from "@/app/intake/raw-material-library/RawMaterialLibraryDomain";
import type { NonIntegratedProductRecord } from "@/app/intake/non-integrated/nonIntegratedStorage";
import type {
MaterialCategoryDTO,
MaterialDTO,
SubstrateDictionaryBundleDTO,
SubstrateDTO,
} from "@/server/services";
type IntakeViewUser = IntakeClientProps["user"];
export function buildIntakeWorkspacePanelProps(params: {
workspaceTabs: IntakeWorkspaceTab[];
activeWorkspaceTabId: string | null;
activeWorkspaceTab: IntakeWorkspaceTab | null;
user: IntakeViewUser;
canManageSpuRuleLibrary: boolean;
canEditBomLibrary: boolean;
canViewProductPatentLedger: boolean;
canEditProductPatentLedger: boolean;
canViewProductPatentDashboard: boolean;
activeProductWorkspaceNeedsFullLoad: boolean;
activeProductWorkspaceLoadError: string;
seriesNameOptions: string[];
existingSeriesNames: string[];
existingSeriesComponentDetailNames: string[];
seriesDraftSkuOptions: WorkbenchSku[];
materialLibrarySubstrates: SubstrateDTO[];
materialLibraryFinishes: MaterialDTO[];
materialLibraryCategories: MaterialCategoryDTO[];
materialLibraryDictionaries: SubstrateDictionaryBundleDTO;
selectedRawMaterialName: string;
nonIntegratedProducts: NonIntegratedProductRecord[];
onRetryProductWorkspaceLoad: (tabId: string) => void;
onProductSaved: (product: NonIntegratedProductRecord) => void;
onProductWorkspaceDetailStateChange: (
detailState: WorkspaceProductDetailState,
) => void;
onOpenProductPatentLedger: (target: ProductPatentLedgerTarget) => void;
onOpenProductWorkspace: (
product: NonIntegratedProductRecord,
mode: WorkspaceProductMode,
) => void;
onOpenRawMaterialProcessConfig: (materialName: string) => void;
onActivatePendingEntryListWorkspace: (
productDevelopmentKind?: ProductDevelopmentKind,
entryTabOverride?: IntakeEntryTab,
) => void;
onCloseNewProductWorkspace: (tabId: string) => void;
onMaterialLibraryFinishesChange: (finishes: MaterialDTO[]) => void;
onActivate: (tabId: string) => void;
onClose: (tabId: string) => void;
}): Omit<IntakeWorkspaceContentPanelProps, "mainContent"> {
return {
tabs: params.workspaceTabs,
activeTabId: params.activeWorkspaceTabId,
activeWorkspaceTab: params.activeWorkspaceTab,
currentUser: params.user,
canManageSpuRuleLibrary: params.canManageSpuRuleLibrary,
canEditBomLibrary: params.canEditBomLibrary,
canViewProductPatentLedger: params.canViewProductPatentLedger,
canEditProductPatentLedger: params.canEditProductPatentLedger,
canViewProductPatentDashboard: params.canViewProductPatentDashboard,
activeProductWorkspaceNeedsFullLoad:
params.activeProductWorkspaceNeedsFullLoad,
activeProductWorkspaceLoadError: params.activeProductWorkspaceLoadError,
seriesNameOptions: params.seriesNameOptions,
existingSeriesNames: params.existingSeriesNames,
existingSeriesComponentDetailNames:
params.existingSeriesComponentDetailNames,
seriesDraftSkuOptions: params.seriesDraftSkuOptions,
materialLibrarySubstrates: params.materialLibrarySubstrates,
materialLibraryFinishes: params.materialLibraryFinishes,
materialLibraryCategories: params.materialLibraryCategories,
materialLibraryDictionaries: params.materialLibraryDictionaries,
selectedRawMaterialName: params.selectedRawMaterialName,
nonIntegratedProducts: params.nonIntegratedProducts,
onRetryProductWorkspaceLoad: params.onRetryProductWorkspaceLoad,
onProductSaved: params.onProductSaved,
onProductWorkspaceDetailStateChange:
params.onProductWorkspaceDetailStateChange,
onOpenProductPatentLedger: params.onOpenProductPatentLedger,
onOpenProductWorkspace: params.onOpenProductWorkspace,
onOpenRawMaterialProcessConfig: params.onOpenRawMaterialProcessConfig,
onActivatePendingEntryListWorkspace:
params.onActivatePendingEntryListWorkspace,
onCloseNewProductWorkspace: params.onCloseNewProductWorkspace,
onMaterialLibraryFinishesChange: params.onMaterialLibraryFinishesChange,
onActivate: params.onActivate,
onClose: params.onClose,
};
}
export function buildIntakePrimaryDomainProps(params: {
activeSection: IntakeSection;
pendingEntryTab: IntakeEntryTab;
skuList: IntegratedPendingSeriesRow[];
nonIntegratedProducts: NonIntegratedProductRecord[];
productDevelopmentProgressProducts: NonIntegratedProductRecord[];
initialNonIntegratedPageInfo: IntakeClientProps["initialNonIntegratedPageInfo"];
canDeleteNonIntegratedProducts: boolean;
canCreateNonIntegratedProducts: boolean;
canUseDesignControlledProductData: boolean;
canViewProductDevelopmentList: boolean;
canViewSeriesDevelopmentList: boolean;
canViewStockDevelopmentList: boolean;
canViewProductProgressDashboard: boolean;
user: IntakeViewUser;
canOpenProductForEdit: (product: NonIntegratedProductRecord) => boolean;
onProductsChange: (
productDevelopmentKind: ProductDevelopmentKind,
nextProducts: NonIntegratedProductRecord[],
productKindFilter?: NonIntegratedProductKindFilter,
) => void;
onOpenProductWorkspace: (
product: NonIntegratedProductRecord,
mode: WorkspaceProductMode,
) => void;
onOpenNewProductWorkspace: (
productDevelopmentKind: ProductDevelopmentKind,
) => void;
canViewBomLibrary: boolean;
canEditBomLibrary: boolean;
activeBomLibrary: BomLibraryKey;
materialLibrarySubstrates: SubstrateDTO[];
materialLibraryFinishes: MaterialDTO[];
materialLibraryCategories: MaterialCategoryDTO[];
materialLibraryDictionaries: SubstrateDictionaryBundleDTO;
onMaterialLibraryFinishesChange: (finishes: MaterialDTO[]) => void;
canViewRawMaterialLibrary: boolean;
activeRawMaterialLibrary: RawMaterialLibraryKey;
selectedRawMaterialName: string;
canViewReferenceEstimator: boolean;
canViewProductPatentLedger: boolean;
canEditProductPatentLedger: boolean;
canViewBarcodePrint: boolean;
canViewBrandFiling: boolean;
}): IntakePrimaryDomainContentProps {
return {
activeSection: params.activeSection,
fallback: <IntakeEmptyDetail />,
productDevelopment: {
pendingEntryTab: params.pendingEntryTab,
integratedRows: params.skuList,
nonIntegratedProducts: params.nonIntegratedProducts,
productDevelopmentProgressProducts:
params.productDevelopmentProgressProducts,
initialNonIntegratedPageInfo: params.initialNonIntegratedPageInfo,
canDeleteProducts: params.canDeleteNonIntegratedProducts,
canCreateProducts: params.canCreateNonIntegratedProducts,
canUseDesignControlledProductData:
params.canUseDesignControlledProductData,
canViewProductDevelopmentList: params.canViewProductDevelopmentList,
canViewSeriesDevelopmentList: params.canViewSeriesDevelopmentList,
canViewStockDevelopmentList: params.canViewStockDevelopmentList,
canViewProductProgressDashboard:
params.canViewProductProgressDashboard,
currentUser: params.user,
fallback: <IntakeEmptyDetail />,
canOpenProductForEdit: params.canOpenProductForEdit,
onProductsChange: params.onProductsChange,
onOpenProductWorkspace: params.onOpenProductWorkspace,
onOpenNewProductWorkspace: params.onOpenNewProductWorkspace,
},
canViewBomLibrary: params.canViewBomLibrary,
bomLibrary: {
user: params.user,
canEditLibraries: params.canEditBomLibrary,
activeBomLibrary: params.activeBomLibrary,
materialLibrarySubstrates: params.materialLibrarySubstrates,
materialLibraryFinishes: params.materialLibraryFinishes,
materialLibraryCategories: params.materialLibraryCategories,
materialLibraryDictionaries: params.materialLibraryDictionaries,
onMaterialLibraryFinishesChange:
params.onMaterialLibraryFinishesChange,
},
canViewRawMaterialLibrary: params.canViewRawMaterialLibrary,
rawMaterialLibrary: {
activeRawMaterialLibrary: params.activeRawMaterialLibrary,
selectedMaterialName: params.selectedRawMaterialName,
},
canViewReferenceEstimator: params.canViewReferenceEstimator,
referenceEstimator: {
materialLibrarySubstrates: params.materialLibrarySubstrates,
},
canViewProductPatentLedger: params.canViewProductPatentLedger,
productPatent: {
products: params.productDevelopmentProgressProducts,
user: params.user,
readOnly: !params.canEditProductPatentLedger,
},
canViewBarcodePrint: params.canViewBarcodePrint,
barcodePrint: {
products: params.nonIntegratedProducts,
user: params.user,
},
canViewBrandFiling: params.canViewBrandFiling,
};
}
export function buildIntakeRightWorkbenchProps(params: {
activeWorkspaceTabKind: IntakeWorkspaceTab["kind"] | null;
activeBrandFilingBrand: BrandFilingBrand | null;
activeSection: IntakeSection;
onToggle: (section: Exclude<IntakeSection, null>) => void;
pendingEntryTab: IntakeEntryTab;
onPendingEntryTabChange: (entryTab: IntakeEntryTab) => void;
onOpenProgressDashboard: () => void;
activeBomLibrary: BomLibraryKey;
onBomLibraryChange: (library: BomLibraryKey) => void;
activeRawMaterialLibrary: RawMaterialLibraryKey;
onOpenRawMaterialLibraryWorkspace: (
library: RawMaterialLibraryKey,
selectedMaterialName?: string,
) => void;
onOpenReferenceEstimatorWorkspace: () => void;
onOpenProductPatents: () => void;
onOpenProductPatentLedger: () => void;
onOpenProductPatentDashboard: () => void;
onOpenBarcodePrintWorkspace: () => void;
onOpenBrandFilingWorkspace: (brand: BrandFilingBrand) => void;
onOpenWorkRecordWorkspace: () => void;
onOpenWorkRecordScoreWorkspace: () => void;
onOpenWorkRecordArchiveWorkspace: () => void;
onOpenSpuRuleLibraryWorkspace?: () => void;
canViewProductDevelopmentList: boolean;
canViewSeriesDevelopmentList: boolean;
canViewProductProgressDashboard: boolean;
canViewStockDevelopmentList: boolean;
canViewBomLibrary: boolean;
canViewRawMaterialLibrary: boolean;
canViewReferenceEstimator: boolean;
canViewProductPatentLedger: boolean;
canViewProductPatentDashboard: boolean;
canViewBarcodePrint: boolean;
canViewBrandFiling: boolean;
canViewWorkRecord: boolean;
canViewWorkRecordArchives: boolean;
}): IntakeRightWorkbenchPanelProps {
return {
activeWorkspaceTabKind: params.activeWorkspaceTabKind,
workbench: {
activeWorkspaceTabKind: params.activeWorkspaceTabKind,
activeSection: params.activeSection,
activeBrandFilingBrand: params.activeBrandFilingBrand,
onToggle: params.onToggle,
pendingEntryTab: params.pendingEntryTab,
onPendingEntryTabChange: params.onPendingEntryTabChange,
onOpenProgressDashboard: params.onOpenProgressDashboard,
activeBomLibrary: params.activeBomLibrary,
onBomLibraryChange: params.onBomLibraryChange,
activeRawMaterialLibrary: params.activeRawMaterialLibrary,
onOpenRawMaterialLibraryWorkspace:
params.onOpenRawMaterialLibraryWorkspace,
onOpenReferenceEstimatorWorkspace:
params.onOpenReferenceEstimatorWorkspace,
onOpenProductPatents: params.onOpenProductPatents,
onOpenProductPatentLedger: params.onOpenProductPatentLedger,
onOpenProductPatentDashboard: params.onOpenProductPatentDashboard,
onOpenBarcodePrintWorkspace: params.onOpenBarcodePrintWorkspace,
onOpenBrandFilingWorkspace: params.onOpenBrandFilingWorkspace,
onOpenWorkRecordWorkspace: params.onOpenWorkRecordWorkspace,
onOpenWorkRecordScoreWorkspace: params.onOpenWorkRecordScoreWorkspace,
onOpenWorkRecordArchiveWorkspace: params.onOpenWorkRecordArchiveWorkspace,
onOpenSpuRuleLibraryWorkspace: params.onOpenSpuRuleLibraryWorkspace,
canViewProductDevelopmentList: params.canViewProductDevelopmentList,
canViewSeriesDevelopmentList: params.canViewSeriesDevelopmentList,
canViewProductProgressDashboard:
params.canViewProductProgressDashboard,
canViewStockDevelopmentList: params.canViewStockDevelopmentList,
canViewBomLibrary: params.canViewBomLibrary,
canViewRawMaterialLibrary: params.canViewRawMaterialLibrary,
canViewReferenceEstimator: params.canViewReferenceEstimator,
canViewProductPatentLedger: params.canViewProductPatentLedger,
canViewProductPatentDashboard: params.canViewProductPatentDashboard,
canViewBarcodePrint: params.canViewBarcodePrint,
canViewBrandFiling: params.canViewBrandFiling,
canViewWorkRecord: params.canViewWorkRecord,
canViewWorkRecordArchives: params.canViewWorkRecordArchives,
},
};
}