|  |  |  | 
|---|
|  |  |  | import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; | 
|---|
|  |  |  | import { | 
|---|
|  |  |  | DeleteButton, | 
|---|
|  |  |  | useTranslate, | 
|---|
|  |  |  | EditButton, | 
|---|
|  |  |  | ReferenceArrayField, | 
|---|
|  |  |  | ReferenceField, | 
|---|
|  |  |  | 
|---|
|  |  |  | Divider, | 
|---|
|  |  |  | Stack, | 
|---|
|  |  |  | Typography, | 
|---|
|  |  |  | Avatar, | 
|---|
|  |  |  | useTheme, | 
|---|
|  |  |  | } from '@mui/material'; | 
|---|
|  |  |  | import DialogCloseButton from "../components/DialogCloseButton"; | 
|---|
|  |  |  | import { blueGrey, blue } from '@mui/material/colors'; | 
|---|
|  |  |  | import MoveToInboxIcon from '@mui/icons-material/MoveToInbox'; | 
|---|
|  |  |  | import { format } from 'date-fns'; | 
|---|
|  |  |  | import { TaskList } from "./TaskList"; | 
|---|
|  |  |  | import { ActionsIterator } from "../action/ActionsIterator"; | 
|---|
|  |  |  | import ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos'; | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const MissionShow = ({ open, id }) => { | 
|---|
|  |  |  | const redirect = useRedirect(); | 
|---|
|  |  |  | 
|---|
|  |  |  | }; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return ( | 
|---|
|  |  |  | <> | 
|---|
|  |  |  | <Dialog | 
|---|
|  |  |  | open={open} | 
|---|
|  |  |  | onClose={handleClose} | 
|---|
|  |  |  | fullWidth | 
|---|
|  |  |  | maxWidth="md" | 
|---|
|  |  |  | sx={{ | 
|---|
|  |  |  | '& .MuiDialog-container': { | 
|---|
|  |  |  | alignItems: 'flex-start', | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | }} | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <DialogContent sx={{ padding: 0 }}> | 
|---|
|  |  |  | {!!id ? ( | 
|---|
|  |  |  | <ShowBase id={id}> | 
|---|
|  |  |  | <MissionShowContent handleClose={handleClose} /> | 
|---|
|  |  |  | </ShowBase> | 
|---|
|  |  |  | ) : null} | 
|---|
|  |  |  | </DialogContent> | 
|---|
|  |  |  | </Dialog> | 
|---|
|  |  |  | </> | 
|---|
|  |  |  | <Dialog | 
|---|
|  |  |  | open={open} | 
|---|
|  |  |  | onClose={handleClose} | 
|---|
|  |  |  | fullWidth | 
|---|
|  |  |  | maxWidth="md" | 
|---|
|  |  |  | sx={{ | 
|---|
|  |  |  | '& .MuiDialog-container': { | 
|---|
|  |  |  | alignItems: 'flex-start', | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | }} | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <DialogContent sx={{ padding: 0 }}> | 
|---|
|  |  |  | {!!id ? ( | 
|---|
|  |  |  | <ShowBase id={id}> | 
|---|
|  |  |  | <MissionShowContent handleClose={handleClose} /> | 
|---|
|  |  |  | </ShowBase> | 
|---|
|  |  |  | ) : null} | 
|---|
|  |  |  | </DialogContent> | 
|---|
|  |  |  | </Dialog> | 
|---|
|  |  |  | ) | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const CLOSE_TOP_WITH_ARCHIVED = 14; | 
|---|
|  |  |  | const MissionShowContent = ({ handleClose }) => { | 
|---|
|  |  |  | const theme = useTheme(); | 
|---|
|  |  |  | const record = useRecordContext(); | 
|---|
|  |  |  | const translate = useTranslate(); | 
|---|
|  |  |  | if (!record) return null; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return ( | 
|---|
|  |  |  | <> | 
|---|
|  |  |  | <DialogCloseButton | 
|---|
|  |  |  | onClose={handleClose} | 
|---|
|  |  |  | top={12} | 
|---|
|  |  |  | /> | 
|---|
|  |  |  | <Stack gap={1}> | 
|---|
|  |  |  | <Box display="flex" p={2}> | 
|---|
|  |  |  | 
|---|
|  |  |  | mb={4} | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <Stack direction="row" alignItems="center" gap={2}> | 
|---|
|  |  |  | <Avatar | 
|---|
|  |  |  | sx={{ | 
|---|
|  |  |  | width: 30, | 
|---|
|  |  |  | height: 30, | 
|---|
|  |  |  | bgcolor: theme.palette.primary.main, | 
|---|
|  |  |  | }} | 
|---|
|  |  |  | > | 
|---|
|  |  |  | {record.agv} | 
|---|
|  |  |  | </Avatar> | 
|---|
|  |  |  | <Typography variant="h5"> | 
|---|
|  |  |  | {record.name} | 
|---|
|  |  |  | {record.groupNo} | 
|---|
|  |  |  | </Typography> | 
|---|
|  |  |  | </Stack> | 
|---|
|  |  |  | <Stack | 
|---|
|  |  |  | gap={1} | 
|---|
|  |  |  | direction="row" | 
|---|
|  |  |  | pr={record.archived_at ? 0 : 6} | 
|---|
|  |  |  | pr={6} | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <ResendButton record={record} /> | 
|---|
|  |  |  | </Stack> | 
|---|
|  |  |  | </Stack> | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | color="textSecondary" | 
|---|
|  |  |  | variant="caption" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | Expected closing date | 
|---|
|  |  |  | {translate('table.field.mission.lastSendDate')} | 
|---|
|  |  |  | </Typography> | 
|---|
|  |  |  | <Stack | 
|---|
|  |  |  | direction="row" | 
|---|
|  |  |  | 
|---|
|  |  |  | gap={1} | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <Typography variant="body2"> | 
|---|
|  |  |  | {format(record.sendTime, 'yyyy-MM-dd HH:mm:ss') || '-'} | 
|---|
|  |  |  | </Typography> | 
|---|
|  |  |  | {new Date(record.expected_closing_date) < | 
|---|
|  |  |  | new Date() ? ( | 
|---|
|  |  |  | <Chip | 
|---|
|  |  |  | label="Past" | 
|---|
|  |  |  | color="error" | 
|---|
|  |  |  | size="small" | 
|---|
|  |  |  | /> | 
|---|
|  |  |  | ) : null} | 
|---|
|  |  |  | </Stack> | 
|---|
|  |  |  | </Box> | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | color="textSecondary" | 
|---|
|  |  |  | variant="caption" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | Budget | 
|---|
|  |  |  | {translate('table.field.bus.busNo')} | 
|---|
|  |  |  | </Typography> | 
|---|
|  |  |  | <Typography variant="body2"> | 
|---|
|  |  |  | {record.busNo || '-'} | 
|---|
|  |  |  | </Typography> | 
|---|
|  |  |  | </Box> | 
|---|
|  |  |  |  | 
|---|
|  |  |  | {record.category && ( | 
|---|
|  |  |  | <Box | 
|---|
|  |  |  | display="flex" | 
|---|
|  |  |  | mr={5} | 
|---|
|  |  |  | flexDirection="column" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <Typography | 
|---|
|  |  |  | color="textSecondary" | 
|---|
|  |  |  | variant="caption" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | Category | 
|---|
|  |  |  | </Typography> | 
|---|
|  |  |  | <Typography variant="body2"> | 
|---|
|  |  |  | {record.category} | 
|---|
|  |  |  | </Typography> | 
|---|
|  |  |  | </Box> | 
|---|
|  |  |  | )} | 
|---|
|  |  |  |  | 
|---|
|  |  |  | <Box display="flex" mr={5} flexDirection="column"> | 
|---|
|  |  |  | <Typography | 
|---|
|  |  |  | color="textSecondary" | 
|---|
|  |  |  | variant="caption" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | Stage | 
|---|
|  |  |  | {translate('table.field.segment.posType')} | 
|---|
|  |  |  | </Typography> | 
|---|
|  |  |  | <Typography variant="body2"> | 
|---|
|  |  |  | {translate(`page.mission.enums.posType.${record.posType}`)} | 
|---|
|  |  |  | </Typography> | 
|---|
|  |  |  | </Box> | 
|---|
|  |  |  |  | 
|---|
|  |  |  | <Box display="flex" mr={5} flexDirection="column"> | 
|---|
|  |  |  | <Typography | 
|---|
|  |  |  | color="textSecondary" | 
|---|
|  |  |  | variant="caption" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | {translate('table.field.mission.actionCount')} | 
|---|
|  |  |  | </Typography> | 
|---|
|  |  |  | <Typography variant="body2"> | 
|---|
|  |  |  | {record.actionCount || 'unknown'} | 
|---|
|  |  |  | </Typography> | 
|---|
|  |  |  | </Box> | 
|---|
|  |  |  | </Box> | 
|---|
|  |  |  |  | 
|---|
|  |  |  | {!!record.contact_ids?.length && ( | 
|---|
|  |  |  | {!!record.taskIds?.length && ( | 
|---|
|  |  |  | <Box m={2}> | 
|---|
|  |  |  | <Box | 
|---|
|  |  |  | display="flex" | 
|---|
|  |  |  | 
|---|
|  |  |  | color="textSecondary" | 
|---|
|  |  |  | variant="caption" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | Contacts | 
|---|
|  |  |  | {translate('table.field.mission.task')} | 
|---|
|  |  |  | </Typography> | 
|---|
|  |  |  | <ReferenceArrayField | 
|---|
|  |  |  | source="contact_ids" | 
|---|
|  |  |  | reference="contacts_summary" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <ContactList /> | 
|---|
|  |  |  | <TaskList taskIds={record.taskIds} /> | 
|---|
|  |  |  | </ReferenceArrayField> | 
|---|
|  |  |  | </Box> | 
|---|
|  |  |  | </Box> | 
|---|
|  |  |  | )} | 
|---|
|  |  |  |  | 
|---|
|  |  |  | {record.description && ( | 
|---|
|  |  |  | {!!record.codeList?.length && ( | 
|---|
|  |  |  | <Box m={2} sx={{ whiteSpace: 'pre-line' }}> | 
|---|
|  |  |  | <Typography | 
|---|
|  |  |  | color="textSecondary" | 
|---|
|  |  |  | variant="caption" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | Description | 
|---|
|  |  |  | {translate('table.field.mission.runPath')} | 
|---|
|  |  |  | </Typography> | 
|---|
|  |  |  | <Typography variant="body2"> | 
|---|
|  |  |  | {record.description} | 
|---|
|  |  |  | <Typography variant="body2" sx={{ whiteSpace: 'normal', overflow: 'hidden', display: 'flex', flexWrap: 'wrap' }}> | 
|---|
|  |  |  | [ {record.codeList.map((code, index) => ( | 
|---|
|  |  |  | <span key={index} style={{ | 
|---|
|  |  |  | color: record.currCode === code ? theme.palette.primary.main : 'inherit', | 
|---|
|  |  |  | }}> | 
|---|
|  |  |  | {code}{index < record.codeList.length - 1 && ','}  | 
|---|
|  |  |  | </span> | 
|---|
|  |  |  | ))} ] | 
|---|
|  |  |  | </Typography> | 
|---|
|  |  |  | </Box> | 
|---|
|  |  |  | )} | 
|---|
|  |  |  |  | 
|---|
|  |  |  | <Box m={2}> | 
|---|
|  |  |  | <Typography | 
|---|
|  |  |  | color="textSecondary" | 
|---|
|  |  |  | variant="caption" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | {translate('table.field.mission.actions')} | 
|---|
|  |  |  | </Typography> | 
|---|
|  |  |  | <Divider /> | 
|---|
|  |  |  | <ActionsIterator actionIds={record.actionIds} /> | 
|---|
|  |  |  | </Box> | 
|---|
|  |  |  | </Box> | 
|---|
|  |  |  | </Box> | 
|---|
|  |  |  | </Stack> | 
|---|
|  |  |  | </> | 
|---|
|  |  |  | ) | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const ResendButton = ({ record }) => { | 
|---|
|  |  |  | const dataProvider = useDataProvider(); | 
|---|
|  |  |  | const redirect = useRedirect(); | 
|---|
|  |  |  | const notify = useNotify(); | 
|---|
|  |  |  | const refresh = useRefresh(); | 
|---|
|  |  |  | const translate = useTranslate(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const handleClick = () => { | 
|---|
|  |  |  | redirect(`/mission/${record.id}/resend`, undefined, undefined, undefined, { | 
|---|
|  |  |  | _scrollToTop: false, | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | }; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return ( | 
|---|
|  |  |  | <Button | 
|---|
|  |  |  | onClick={handleClick} | 
|---|
|  |  |  | // startIcon={<MoveToInboxIcon />} | 
|---|
|  |  |  | endIcon={<ArrowForwardIosIcon />} | 
|---|
|  |  |  | size="small" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | {translate('common.action.resend')} | 
|---|
|  |  |  | </Button> | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | }; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | export default MissionShow; | 
|---|