| | |
| | | useDataProvider, |
| | | } from 'react-admin'; |
| | | import { format } from 'date-fns'; |
| | | import PanelTypography from "../components/PanelTypography"; |
| | | import * as Common from '@/utils/common' |
| | | |
| | | const STATUS_FIELDS = [ |
| | |
| | | { key: 'outEnable', labelKey: 'table.field.sta.outEnable' }, |
| | | ]; |
| | | |
| | | const INFO_FIELDS = [ |
| | | { labelKey: 'table.field.sta.uuid', valueKey: 'uuid' }, |
| | | { labelKey: 'table.field.sta.zoneId', valueKey: 'zoneId$' }, |
| | | { labelKey: 'table.field.sta.staType', valueKey: 'staType$' }, |
| | | { labelKey: 'table.field.sta.code', valueKey: 'code$' }, |
| | | { labelKey: 'table.field.sta.capacity', valueKey: 'capacity' }, |
| | | { labelKey: 'table.field.sta.offset', valueKey: 'offset' }, |
| | | { labelKey: 'table.field.sta.rsvInCnt', valueKey: 'rsvInCnt' }, |
| | | { labelKey: 'table.field.sta.rsvOutCnt', valueKey: 'rsvOutCnt' }, |
| | | { labelKey: 'table.field.sta.staSts', valueKey: 'staSts$' }, |
| | | { labelKey: 'table.field.sta.zpallet', valueKey: 'zpallet' }, |
| | | ]; |
| | | const StaPanel = () => { |
| | | const record = useRecordContext(); |
| | | const translate = useTranslate(); |
| | |
| | | </Grid> |
| | | <Box height={16}> </Box> |
| | | <Grid container spacing={2}> |
| | | <Grid item xs={6}> |
| | | <PanelTypography |
| | | title="table.field.sta.uuid" |
| | | property={record.uuid} |
| | | {INFO_FIELDS.map(({ labelKey, valueKey }) => ( |
| | | <Grid item xs={12} sm={6} md={4} key={labelKey}> |
| | | <InfoItem |
| | | labelKey={labelKey} |
| | | value={getRecordValue(record, valueKey)} |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6}> |
| | | <PanelTypography |
| | | title="table.field.sta.zoneId" |
| | | property={record.zoneId$} |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6}> |
| | | <PanelTypography |
| | | title="table.field.sta.staType" |
| | | property={record.staType$} |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6}> |
| | | <PanelTypography |
| | | title="table.field.sta.code" |
| | | property={record.code$} |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6}> |
| | | <PanelTypography |
| | | title="table.field.sta.capacity" |
| | | property={record.capacity} |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6}> |
| | | <PanelTypography |
| | | title="table.field.sta.offset" |
| | | property={record.offset} |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6}> |
| | | <PanelTypography |
| | | title="table.field.sta.rsvInCnt" |
| | | property={record.rsvInCnt} |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6}> |
| | | <PanelTypography |
| | | title="table.field.sta.rsvOutCnt" |
| | | property={record.rsvOutCnt} |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6}> |
| | | <PanelTypography |
| | | title="table.field.sta.staSts" |
| | | property={record.staSts$} |
| | | /> |
| | | </Grid> |
| | | <Grid item xs={6}> |
| | | <PanelTypography |
| | | title="table.field.sta.zpallet" |
| | | property={record.zpallet} |
| | | /> |
| | | </Grid> |
| | | ))} |
| | | </Grid> |
| | | |
| | | <Divider sx={{ my: 2 }} /> |
| | |
| | | <TableRow> |
| | | <TableCell colSpan={7}> |
| | | <Typography variant="body2" color="textSecondary"> |
| | | No reservations |
| | | {translate('ra.navigation.no_results')} |
| | | </Typography> |
| | | </TableCell> |
| | | </TableRow> |
| | |
| | | {reserves.map((reserve) => ( |
| | | <TableRow key={reserve.id}> |
| | | <TableCell>{reserve.name || '-'}</TableCell> |
| | | <TableCell>{reserve.type || '-'}</TableCell> |
| | | <TableCell>{formatReserveType(reserve.type, translate)}</TableCell> |
| | | <TableCellRight>{reserve.qty ?? '-'}</TableCellRight> |
| | | <TableCell>{reserve.state || '-'}</TableCell> |
| | | <TableCell>{formatReserveState(reserve.state, translate)}</TableCell> |
| | | <TableCell>{reserve.agvId$ || reserve.agvId || '-'}</TableCell> |
| | | <TableCell>{formatDateTime(reserve.waitingAt)}</TableCell> |
| | | <TableCell>{formatDateTime(reserve.confirmedAt)}</TableCell> |
| | |
| | | </Card > |
| | | </> |
| | | ); |
| | | }; |
| | | |
| | | const InfoItem = ({ labelKey, value }) => { |
| | | const translate = useTranslate(); |
| | | return ( |
| | | <Stack spacing={0.5}> |
| | | <Typography variant="caption" color="textSecondary"> |
| | | {Common.camelToPascalWithSpaces(translate(labelKey))} |
| | | </Typography> |
| | | <Typography variant="body2" fontWeight={600}> |
| | | {formatInfoValue(value)} |
| | | </Typography> |
| | | </Stack> |
| | | ); |
| | | }; |
| | | |
| | | const getRecordValue = (record, key) => { |
| | | if (!record) return undefined; |
| | | if (record[key] !== undefined && record[key] !== null) { |
| | | return record[key]; |
| | | } |
| | | if (key.endsWith('$')) { |
| | | const fallbackKey = key.slice(0, -1); |
| | | return record[fallbackKey]; |
| | | } |
| | | return record[key]; |
| | | }; |
| | | |
| | | const formatInfoValue = (value) => { |
| | | if (value === null || value === undefined || value === '') { |
| | | return '-'; |
| | | } |
| | | return value; |
| | | }; |
| | | |
| | | const StatusIndicator = ({ labelKey, value }) => { |
| | |
| | | return String(value); |
| | | }; |
| | | |
| | | const formatReserveType = (value, translate) => |
| | | formatReserveEnum(value, translate, 'type'); |
| | | |
| | | const formatReserveState = (value, translate) => |
| | | formatReserveEnum(value, translate, 'state', { |
| | | cancelled: 'canceled', |
| | | }); |
| | | |
| | | const formatReserveEnum = (value, translate, enumType, overrides = {}) => { |
| | | const normalized = normalizeValueKey(value); |
| | | if (!normalized) { |
| | | return '-'; |
| | | } |
| | | const translationKey = overrides[normalized] || normalized; |
| | | return translate(`page.sta.enums.${enumType}.${translationKey}`, { _: value }); |
| | | }; |
| | | |
| | | const normalizeValueKey = (value) => { |
| | | if (typeof value === 'string') { |
| | | return value.trim().toLowerCase(); |
| | | } |
| | | if (value === undefined || value === null) { |
| | | return ''; |
| | | } |
| | | return String(value).trim().toLowerCase(); |
| | | }; |
| | | |
| | | const formatDateTime = (value) => { |
| | | if (!value) return '-'; |
| | | try { |