Skip to content

Commit 87c9fac

Browse files
wavehassmannunnyu
authored andcommitted
#3885: Refactored and finished UI
2 parents 8cb5c14 + 62bb609 commit 87c9fac

6 files changed

Lines changed: 72 additions & 12 deletions

File tree

src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/BOMTable.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ const BOMTable: React.FC<BOMTableProps> = ({ setHideColumn, assignMaterial, colu
6363
subtotal: '',
6464
link: '',
6565
notes: '',
66-
assemblyId: assembly.assemblyId
66+
assemblyId: assembly.assemblyId,
67+
isCopied: false
6768
});
6869

6970
assemblyMaterials.forEach((material, indx) => materialsWithAssemblies.push(materialToRow(material, indx)));

src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/BOMTableWrapper.tsx

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import { useToast } from '../../../../hooks/toasts.hooks';
1111
import { useAssignMaterialToAssembly, useDeleteAssembly, useDeleteMaterial } from '../../../../hooks/bom.hooks';
1212
import LoadingIndicator from '../../../../components/LoadingIndicator';
1313
import EditMaterialModal from './MaterialForm/EditMaterialModal';
14-
import { Button, Link, Typography } from '@mui/material';
14+
import ContentCopyIcon from '@mui/icons-material/ContentCopy';
15+
import { Button, Link, Tooltip, Typography } from '@mui/material';
1516
import { bomBaseColDef } from '../../../../utils/bom.utils';
1617
import NERModal from '../../../../components/NERModal';
1718
import { renderStatusBOM } from './BOMTableCustomCells';
@@ -292,10 +293,22 @@ const BOMTableWrapper: React.FC<BOMTableWrapperProps> = ({
292293
flex: 1.5,
293294
field: 'name',
294295
headerName: 'Name',
295-
type: 'string',
296296
sortable: false,
297297
filterable: false,
298-
hide: hideColumn[3]
298+
hide: hideColumn[3],
299+
renderCell: (params) => {
300+
const material = materials.find((m) => m.materialId === params.row.materialId);
301+
return (
302+
<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>
303+
<Typography variant="body2">{params.value}</Typography>
304+
{material?.isCopied && (
305+
<Tooltip title="Copied from another BOM">
306+
<ContentCopyIcon sx={{ fontSize: 14, color: 'warning.main' }} />
307+
</Tooltip>
308+
)}
309+
</Box>
310+
);
311+
}
299312
},
300313
{
301314
...bomBaseColDef,
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import NERModal from '../../../../../components/NERModal';
2+
3+
export interface BOMCopyConfirmModalProps {
4+
open: boolean;
5+
onHide: () => void;
6+
onSuccess?: () => void;
7+
materialsCount: number;
8+
sourceProjectName: string;
9+
currentProjectName: string;
10+
}
11+
12+
const BOMCopyConfirmModal = ({
13+
open,
14+
onHide,
15+
onSuccess,
16+
materialsCount,
17+
sourceProjectName,
18+
currentProjectName
19+
}: BOMCopyConfirmModalProps) => {
20+
const message = `Are you sure you want to copy ${materialsCount} materials from ${sourceProjectName} to ${currentProjectName}?`;
21+
return (
22+
<NERModal open={open} onHide={onHide} onSubmit={onSuccess} title="Confirm Copy">
23+
<p>{message}</p>
24+
</NERModal>
25+
);
26+
};
27+
28+
export default BOMCopyConfirmModal;

src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
Accordion,
33
AccordionDetails,
44
AccordionSummary,
5+
Button,
56
FormControl,
67
FormHelperText,
78
FormLabel,
@@ -504,30 +505,33 @@ const MaterialFormView: React.FC<MaterialFormViewProps> = ({
504505
)}
505506
</Grid>
506507
</Grid>
507-
{/*submitText === 'Add' && (
508+
{submitText === 'Add' && (
508509
<Grid item xs={12} sx={{ pl: 0, pr: 0 }}>
509510
<Box
510511
sx={{
511512
pt: 1
512513
}}
513514
>
514-
<Button
515+
{/* <Button
515516
variant="contained"
516517
disableElevation
517-
onClick={() => {}}
518+
onClick={() => {
519+
setBomConfirmOpen(true);
520+
}}
518521
sx={{
519522
mx: 0,
523+
my: 1,
520524
textTransform: 'none',
521525
bgcolor: '#EF4345',
522526
color: (t) => t.palette.getContrastText('#EF4345'),
523527
'&:hover': { bgcolor: (t) => t.palette.error.dark }
524528
}}
525529
>
526530
COPY FROM EXISTING BOM
527-
</Button>
531+
</Button> */}
528532
</Box>
529533
</Grid>
530-
)*/}
534+
)}
531535
</NERFormModal>
532536
);
533537
};

src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOMTab.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { Box } from '@mui/system';
22
import { MaterialPreview, Project, isGuest } from 'shared';
33
import { NERButton } from '../../../components/NERButton';
44
import WarningIcon from '@mui/icons-material/Warning';
5+
import React, { useState } from 'react';
56
import { Tooltip, useTheme } from '@mui/material';
6-
import { useState } from 'react';
77
import BOMTableWrapper from './BOM/BOMTableWrapper';
88
import CreateMaterialModal from './BOM/MaterialForm/CreateMaterialModal';
99
import CreateAssemblyModal from './BOM/AssemblyForm/CreateAssemblyModal';
@@ -20,6 +20,7 @@ import {
2020
useGetMaterialsForWbsElement
2121
} from '../../../hooks/bom.hooks';
2222
import ImportBOMModal from './BOM/ImportBOMModal';
23+
import BOMCopyConfirmModal from './BOM/MaterialForm/BOMCopyConfirmModal';
2324

2425
export const addMaterialCosts = (accumulator: number, currentMaterial: MaterialPreview) =>
2526
(currentMaterial.subtotal ?? 0) + accumulator;
@@ -31,8 +32,9 @@ const BOMTab = ({ project }: { project: Project }) => {
3132
const [showAddAssembly, setShowAddAssembly] = useState(false);
3233
const [showCopyBOM, setShowCopyBOM] = useState(false);
3334
const [showImportBOM, setShowImportBOM] = useState(false);
34-
const theme = useTheme();
35+
const [bomConfirmOpen, setBomConfirmOpen] = useState(false);
3536

37+
const theme = useTheme();
3638
const user = useCurrentUser();
3739

3840
const {
@@ -148,6 +150,16 @@ const BOMTab = ({ project }: { project: Project }) => {
148150
Copy Existing BOM
149151
</NERButton>
150152
</Box>
153+
<BOMCopyConfirmModal
154+
open={bomConfirmOpen}
155+
onHide={() => {
156+
setBomConfirmOpen(false);
157+
}}
158+
onSuccess={() => {}}
159+
materialsCount={1}
160+
sourceProjectName={'Source Project'}
161+
currentProjectName={'Target Project'}
162+
></BOMCopyConfirmModal>
151163
<Box display="flex" gap="20px" alignItems="center">
152164
<Box sx={{ backgroundColor: theme.palette.background.paper, padding: '8px 14px 8px 14px', borderRadius: '6px' }}>
153165
Budget: ${project.budget}

src/frontend/src/utils/bom.utils.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export interface BomRow extends GridValidRowModel {
2020
link: string;
2121
notes: string | undefined;
2222
assemblyId: string | undefined;
23+
isCopied: boolean;
2324
}
2425

2526
export const materialToRow = (material: Material, idx: number): BomRow => {
@@ -38,7 +39,8 @@ export const materialToRow = (material: Material, idx: number): BomRow => {
3839
subtotal: material.subtotal !== undefined ? `$${centsToDollar(material.subtotal)}` : '',
3940
link: material.linkUrl,
4041
notes: material.notes,
41-
assemblyId: material.assemblyId ?? 'assembly-misc'
42+
assemblyId: material.assemblyId ?? 'assembly-misc',
43+
isCopied: material.isCopied
4244
};
4345
};
4446

0 commit comments

Comments
 (0)