| | |
| | | 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; |
| | | console.log(record); |
| | | |
| | | 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; |