From 1ed4b56aee1e01d9cdeca3766c687c0ebfe45965 Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期一, 15 十二月 2025 10:27:29 +0800
Subject: [PATCH] #
---
zy-acs-flow/src/map/areaSettings/AreaAdvancedTab.jsx | 78 +++++++
/dev/null | 376 ----------------------------------
zy-acs-flow/src/map/areaSettings/AreaBasicTab.jsx | 62 +++++
zy-acs-flow/src/map/areaSettings/index.jsx | 100 +++++++--
4 files changed, 218 insertions(+), 398 deletions(-)
diff --git a/zy-acs-flow/src/map/areaSettings/AreaAdvancedTab.jsx b/zy-acs-flow/src/map/areaSettings/AreaAdvancedTab.jsx
new file mode 100644
index 0000000..cbb8f51
--- /dev/null
+++ b/zy-acs-flow/src/map/areaSettings/AreaAdvancedTab.jsx
@@ -0,0 +1,78 @@
+import React from 'react';
+import { Box, Grid, TextField, Button } from '@mui/material';
+import { useTranslate } from 'react-admin';
+
+const AreaAdvancedTab = ({
+ areaCode,
+ setAreaCode,
+ maxQty,
+ setMaxQty,
+ speedLimit,
+ setSpeedLimit,
+ shapeData,
+ setShapeData,
+ priority,
+ setPriority,
+ onSave,
+}) => {
+ const translate = useTranslate();
+
+ return (
+ <Box component="form" onSubmit={(e) => { e.preventDefault(); onSave(); }}>
+ <Grid container spacing={2}>
+ <Grid item xs={12}>
+ <TextField
+ label={translate('page.map.area.code', { _: '鍖哄煙缂栫爜' })}
+ fullWidth
+ value={areaCode}
+ onChange={(e) => setAreaCode(e.target.value)}
+ />
+ </Grid>
+ <Grid item xs={6}>
+ <TextField
+ label={translate('page.map.area.maxQty', { _: '鏈�澶ф暟閲�' })}
+ fullWidth
+ type="number"
+ value={maxQty}
+ onChange={(e) => setMaxQty(e.target.value)}
+ />
+ </Grid>
+ <Grid item xs={6}>
+ <TextField
+ label={translate('page.map.area.speedLimit', { _: '閫熷害闄愬埗' })}
+ fullWidth
+ type="number"
+ value={speedLimit}
+ onChange={(e) => setSpeedLimit(e.target.value)}
+ />
+ </Grid>
+ <Grid item xs={12}>
+ <TextField
+ label={translate('page.map.area.shape', { _: '褰㈢姸鏁版嵁' })}
+ fullWidth
+ multiline
+ minRows={3}
+ value={shapeData}
+ onChange={(e) => setShapeData(e.target.value)}
+ />
+ </Grid>
+ <Grid item xs={12}>
+ <TextField
+ label={translate('page.map.area.priority', { _: '浼樺厛绾�' })}
+ fullWidth
+ type="number"
+ value={priority}
+ onChange={(e) => setPriority(e.target.value)}
+ />
+ </Grid>
+ <Grid item xs={12}>
+ <Button variant="contained" type="submit">
+ {translate('common.action.save', { _: '淇濆瓨' })}
+ </Button>
+ </Grid>
+ </Grid>
+ </Box>
+ );
+};
+
+export default AreaAdvancedTab;
diff --git a/zy-acs-flow/src/map/areaSettings/AreaBasicTab.jsx b/zy-acs-flow/src/map/areaSettings/AreaBasicTab.jsx
new file mode 100644
index 0000000..639edc0
--- /dev/null
+++ b/zy-acs-flow/src/map/areaSettings/AreaBasicTab.jsx
@@ -0,0 +1,62 @@
+import React from 'react';
+import { Stack, TextField, Button, Typography, Box } from '@mui/material';
+import { useTranslate } from 'react-admin';
+
+const AreaBasicTab = ({
+ areaName,
+ setAreaName,
+ agvList,
+ setAgvList,
+ barcodeList,
+ setBarcodeList,
+ onSave,
+}) => {
+ const translate = useTranslate();
+
+ return (
+ <Stack spacing={2}>
+ <Stack direction="row" spacing={1} alignItems="center">
+ <TextField
+ label={translate('page.map.area.name', { _: '鍚嶇О' })}
+ fullWidth
+ value={areaName}
+ onChange={(e) => setAreaName(e.target.value)}
+ />
+ <Button variant="contained" onClick={onSave}>
+ {translate('common.action.save', { _: '淇濆瓨' })}
+ </Button>
+ </Stack>
+
+ <Box>
+ <Typography variant="subtitle2" gutterBottom>
+ {translate('page.map.area.agv', { _: '娣诲姞AGV灏忚溅' })}
+ </Typography>
+ <TextField
+ placeholder={translate('page.map.area.agv.placeholder', { _: '鐢ㄩ�楀彿鍒嗛殧锛歛gv01, agv02' })}
+ fullWidth
+ multiline
+ minRows={3}
+ value={agvList}
+ onChange={(e) => setAgvList(e.target.value)}
+ />
+ </Box>
+
+ <Box>
+ <Typography variant="subtitle2" gutterBottom>
+ {translate('page.map.area.barcodes', { _: '鍖哄煙鍐呮潯鐮侀泦鍚�' })}
+ </Typography>
+ <TextField
+ placeholder={translate('page.map.area.barcodes.placeholder', { _: '姣忚涓�涓潯鐮�' })}
+ fullWidth
+ multiline
+ minRows={6}
+ maxRows={10}
+ value={barcodeList}
+ onChange={(e) => setBarcodeList(e.target.value)}
+ />
+ </Box>
+ </Stack>
+ );
+};
+
+export default AreaBasicTab;
diff --git a/zy-acs-flow/src/map/areaSettings/ConfigSettings.jsx b/zy-acs-flow/src/map/areaSettings/ConfigSettings.jsx
deleted file mode 100644
index 2ac2917..0000000
--- a/zy-acs-flow/src/map/areaSettings/ConfigSettings.jsx
+++ /dev/null
@@ -1,178 +0,0 @@
-import React, { useEffect } from 'react';
-import { useForm, Controller } from 'react-hook-form';
-import {
- Box,
- Grid,
- Typography,
- TextField,
- Slider,
- Button,
- Select,
- MenuItem,
- InputLabel,
- FormControl,
- Stack,
- Divider,
-} from '@mui/material';
-import { useTranslate } from 'react-admin';
-import * as Tool from '../tool';
-import ConfirmButton from '../../page/components/ConfirmButton';
-import {
- DEVICE_TYPE,
-} from '../constants';
-import { useNotification } from '../Notification';
-
-const ConfigSettings = (props) => {
- const { sprite, onSubmit } = props;
- const notify = useNotification();
- const translate = useTranslate();
-
- const { control, handleSubmit, reset, watch, setValue, formState: { errors } } = useForm({
- defaultValues: { ...sprite?.data },
- });
-
- useEffect(() => {
- if (sprite?.data) {
- reset({
- ...sprite.data
- });
- }
- }, [sprite, reset]);
-
- const deviceType = sprite?.data?.type;
-
- const rowValue = watch('row');
- const bayValue = watch('bay');
-
- useEffect(() => {
- if (deviceType === DEVICE_TYPE.SHELF) {
- if (rowValue != null && bayValue != null && rowValue !== '' && bayValue !== '') {
- setValue('no', `${rowValue}-${bayValue}`);
- } else {
- setValue('no', '');
- }
- }
- }, [
- setValue,
- deviceType,
- rowValue,
- bayValue,
- ]);
-
- const onFormSubmit = (data) => {
- if (sprite?.data) {
- Object.keys(data).forEach((key) => {
- sprite.data[key] = data[key];
- });
- }
- if (onSubmit) {
- onSubmit(data);
- }
- notify.info(translate('common.response.success'));
- };
-
- return (
- <>
- <Box component="form" onSubmit={handleSubmit(onFormSubmit)} noValidate sx={{ mt: 0 }}>
- <Grid container spacing={1.4}>
-
- {deviceType === DEVICE_TYPE.SHELF && (
- <>
- <Grid item xs={6}>
- <Controller
- name="row"
- control={control}
- render={({ field }) => (
- <TextField
- {...field}
- label={translate('page.map.settings.config.shelf.row')}
- type="number"
- value={field.value ?? ''}
- fullWidth
- onChange={(e) => {
- field.onChange(e.target.value === '' ? '' : Number(e.target.value));
- }}
- />
- )}
- />
- </Grid>
- <Grid item xs={6}>
- <Controller
- name="bay"
- control={control}
- render={({ field }) => (
- <TextField
- {...field}
- label={translate('page.map.settings.config.shelf.bay')}
- type="number"
- value={field.value ?? ''}
- fullWidth
- onChange={(e) => {
- field.onChange(e.target.value === '' ? '' : Number(e.target.value));
- }}
- />
- )}
- />
- </Grid>
- </>
- )}
-
- {deviceType === DEVICE_TYPE.CHARGE && (
- <>
- </>
- )}
-
- {deviceType === DEVICE_TYPE.STATION && (
- <>
- </>
- )}
-
- {deviceType === DEVICE_TYPE.POINT && (
- <>
- </>
- )}
-
- <Grid item xs={12}>
- <Divider />
- </Grid>
-
- <Grid item xs={6}>
- <Controller
- name="no"
- control={control}
- rules={{
- required: translate('ra.validation.required') // warn msg
- }}
- render={({ field }) => {
- return (
- <TextField
- {...field}
- label={translate('page.map.settings.config.base.no')}
- type="text"
- value={field.value ?? ''}
- error={!!errors.no} // show red warn
- helperText={errors.no ? errors.no.message : null} // show warn msg
- fullWidth
- onChange={(e) => {
- field.onChange(e);
- }}
- />
- )
- }}
- />
- </Grid>
-
- <Grid item xs={12} mt={2}>
- <Stack direction="row" spacing={2}>
- <Button variant="contained" color="primary" type="submit">
- {translate('ra.action.confirm')}
- </Button>
- </Stack>
- </Grid>
- </Grid>
- </Box>
- </>
- );
-};
-
-export default ConfigSettings;
diff --git a/zy-acs-flow/src/map/areaSettings/CopyDrawer.jsx b/zy-acs-flow/src/map/areaSettings/CopyDrawer.jsx
deleted file mode 100644
index 19fc976..0000000
--- a/zy-acs-flow/src/map/areaSettings/CopyDrawer.jsx
+++ /dev/null
@@ -1,412 +0,0 @@
-import React, { useEffect } from 'react';
-import { useForm, useWatch, Controller } from 'react-hook-form';
-import {
- Box,
- Grid,
- Typography,
- TextField,
- Card,
- CardContent,
- Button,
- Select,
- MenuItem,
- useTheme,
- FormControl,
- Stack,
- Divider,
- Drawer,
- IconButton,
- Switch,
- FormControlLabel,
- FormLabel,
- ToggleButtonGroup,
- ToggleButton,
-} from '@mui/material';
-import CloseIcon from '@mui/icons-material/Close';
-import { useTranslate } from 'react-admin';
-import * as Tool from '../tool';
-import { PAGE_DRAWER_WIDTH } from '@/config/setting';
-import {
- DEVICE_TYPE,
-} from '../constants';
-import { useNotification } from '../Notification';
-
-const incrementOptionsMap = {
- [DEVICE_TYPE.SHELF]: [
- { value: 'row', label: 'page.map.settings.config.shelf.row' },
- { value: 'bay', label: 'page.map.settings.config.shelf.bay' },
- ],
- [DEVICE_TYPE.CHARGE]: [
- { value: 'no', label: 'page.map.settings.config.base.no' },
- ],
- [DEVICE_TYPE.STATION]: [
- { value: 'no', label: 'page.map.settings.config.base.no' },
- ],
- [DEVICE_TYPE.POINT]: [
- { value: 'no', label: 'page.map.settings.config.base.no' },
- ],
-};
-
-
-const validateIncrement = (value, deviceType, sprite, translate) => {
- if (!value) {
- return true;
- }
- switch (deviceType) {
- case DEVICE_TYPE.SHELF:
- if (!sprite?.data?.row || !sprite?.data?.bay) {
- return translate('page.map.settings.map.copy.valid.shelf');
- }
- break;
- default:
- if (!sprite?.data?.no) {
- return translate('page.map.settings.map.copy.valid.common');
- }
- break;
- }
- return true;
-};
-
-const getDefaultFormValues = (value = {}) => ({
- copyDirect: value.copyDirect || '',
- copyCount: value.copyCount || '',
- gap: 0.0,
- autoIncrement: false,
- incrementMode: 'ascending',
- incrementValue: undefined,
-});
-
-const CopyDrawer = (props) => {
- const {
- open,
- onCancel,
- sprite,
- value,
- width = PAGE_DRAWER_WIDTH,
- handleOnCopy,
- setLastCopiedSprites,
- setSpriteSettings,
- } = props;
- const notify = useNotification();
- const translate = useTranslate();
- const theme = useTheme();
- const themeMode = theme.palette.mode;
-
- const deviceType = sprite?.data?.type;
- const incrementOptions = incrementOptionsMap[deviceType]
-
- const { control, handleSubmit, reset, watch, setValue, formState: { errors } } = useForm({
- defaultValues: getDefaultFormValues(value),
- });
-
- const autoIncrement = useWatch({ control, name: 'autoIncrement' });
- const incrementValue = useWatch({ control, name: 'incrementValue' });
-
- useEffect(() => {
- if (sprite && value && Object.keys(value).length > 0) {
- reset(getDefaultFormValues(value));
- }
- }, [sprite, value, reset, incrementOptions, setValue]);
-
- useEffect(() => {
- if (autoIncrement && incrementOptions && incrementOptions.length > 0) {
- if (!incrementValue) {
- setValue('incrementValue', incrementOptions[0].value);
- }
- } else {
- setValue('incrementValue', undefined);
- }
- }, [autoIncrement, incrementOptions, setValue]);
-
- const handleClose = () => {
- onCancel();
- }
-
- const onFormSubmit = (data) => {
- if (!sprite || !data || Object.keys(data).length === 0) {
- return;
- }
-
- const { copyCount, copyDirect, gap, autoIncrement, incrementMode, incrementValue } = data;
- const copiedSprites = [];
-
- const adjustPosition = (sprite, direction, gap, index) => {
- const factor = index + 1;
- switch (direction) {
- case 'left':
- sprite.position.x -= factor * (gap + sprite.width);
- break;
- case 'right':
- sprite.position.x += factor * (gap + sprite.width);
- break;
- case 'up':
- sprite.position.y -= factor * (gap + sprite.height);
- break;
- case 'down':
- sprite.position.y += factor * (gap + sprite.height);
- break;
- default:
- break;
- }
- };
-
- const incrementSpriteData = (copiedSprite, index) => {
- const incrementAmount = incrementMode === 'descending' ? -(index + 1) : index + 1;
- switch (deviceType) {
- case DEVICE_TYPE.SHELF:
- if (incrementValue === 'row') {
- copiedSprite.data.row = sprite.data.row + incrementAmount;
- }
- if (incrementValue === 'bay') {
- copiedSprite.data.bay = sprite.data.bay + incrementAmount;
- }
- if (copiedSprite.data.row && copiedSprite.data.bay) {
- copiedSprite.data.no = `${copiedSprite.data.row}-${copiedSprite.data.bay}`;
- }
- break;
- default:
- if (incrementValue === 'no') {
- copiedSprite.data.no = Tool.incrementSpriteNo(sprite.data.no, incrementAmount);
- }
- break;
- }
- };
-
- for (let i = 0; i < copyCount; i++) {
- const copiedSprite = Tool.copySprite(sprite);
-
- adjustPosition(copiedSprite, copyDirect, gap, i);
-
- // auto-increment-value
- if (autoIncrement && deviceType) {
- incrementSpriteData(copiedSprite, i);
- }
-
- Tool.getMapContainer().addChild(copiedSprite);
- Tool.beSettings(copiedSprite, setSpriteSettings);
- copiedSprites.push(copiedSprite);
- }
-
- setLastCopiedSprites(copiedSprites);
- onCancel();
- handleOnCopy?.(data);
- notify.info(translate('common.response.success'));
- };
-
- return (
- <>
- <Drawer
- variant="persistent"
- open={open}
- anchor="right"
- onClose={handleClose}
- sx={{ zIndex: 100, opacity: 1 }}
- >
- {(open) && (
- <Box pt={12} width={{ xs: '100vW', sm: width }} height={'calc(100vh - 200px);'} mt={{ xs: 2, sm: 1 }} sx={{
- }}>
- <Stack direction="row" p={2}>
- <Typography variant="h6" flex="1">
- {translate('page.map.settings.map.copy.title')}
- </Typography>
- <IconButton onClick={handleClose} size="small">
- <CloseIcon />
- </IconButton>
- </Stack>
-
- <Box p={3}>
- <Card sx={{
- p: 2,
- transition: '0.3s',
- boxShadow: themeMode === 'light'
- ? '0px 2px 8px rgba(0, 0, 0, 0.1)'
- : '0px 2px 2px rgba(255, 255, 255, 0.1)',
- '&:hover': {
- boxShadow: themeMode === 'light'
- ? '0px 4px 16px rgba(0, 0, 0, 0.2)'
- : '0px 4px 8px rgba(255, 255, 255, 0.2)',
- },
- borderRadius: '8px',
- }}>
- <CardContent>
- <Box component="form" onSubmit={handleSubmit(onFormSubmit)} noValidate sx={{ mt: 0 }}>
- <Grid container spacing={1.4}>
- <Grid item xs={6}>
- <Controller
- name="copyDirect"
- control={control}
- render={({ field }) => (
- <TextField
- {...field}
- label={translate('page.map.settings.map.copy.direction')}
- InputProps={{
- readOnly: true,
- }}
- fullWidth
- />
- )}
- />
- </Grid>
- <Grid item xs={6}>
- <Controller
- name="copyCount"
- control={control}
- render={({ field }) => (
- <TextField
- {...field}
- label={translate('page.map.settings.map.copy.count')}
- InputProps={{
- readOnly: true,
- }}
- fullWidth
- />
- )}
- />
- </Grid>
-
- <Grid item xs={12}>
- <Controller
- name="gap"
- control={control}
- render={({ field }) => (
- <TextField
- {...field}
- label={translate('page.map.settings.map.copy.field.gap')}
- type="number"
- sx={{ width: '50%' }}
- fullWidth
- inputProps={{
- // min: 0,
- step: 1,
- }}
- onChange={(e) => {
- field.onChange(e.target.value === '' ? '' : Number(e.target.value));
- }}
- />
- )}
- />
- </Grid>
-
- <Grid item xs={12} mt={2} mb={1}>
- <Divider />
- </Grid>
-
- <Grid item xs={12}>
- <Controller
- name="autoIncrement"
- control={control}
- rules={{ validate: (value) => validateIncrement(value, deviceType, sprite, translate) }}
- render={({ field }) => (
- <FormControlLabel
- control={
- <Switch
- {...field}
- checked={field.value || false}
- onChange={(e) => field.onChange(e.target.checked)}
- />
- }
- label={translate('page.map.settings.map.copy.field.autoIncrement')}
- />
- )}
- />
- {errors.autoIncrement && (
- <Typography color="error">
- {errors.autoIncrement.message}
- </Typography>
- )}
- </Grid>
-
- {(!!incrementOptions?.length && autoIncrement) && (
- <Grid item xs={12}>
- <FormControl fullWidth>
- <FormLabel sx={{ mb: 1 }}>
- {translate('page.map.settings.map.copy.field.incrementValue')}
- </FormLabel>
- <Controller
- name='incrementValue'
- control={control}
- render={({ field }) => (
- <ToggleButtonGroup
- {...field}
- value={field.value}
- exclusive
- onChange={(event, value) => {
- if (value !== null) {
- field.onChange(value);
- }
- }}
- fullWidth
- >
- {incrementOptions.map((option, idx) => (
- <ToggleButton key={idx} value={option.value}>
- {translate(option.label)}
- </ToggleButton>
- ))}
- </ToggleButtonGroup>
- )}
- />
- </FormControl>
- </Grid>
- )}
-
- {autoIncrement && (
- <Grid item xs={12}>
- <FormControl fullWidth>
- <FormLabel sx={{
- mb: 1
- }}>
- {translate('page.map.settings.map.copy.field.incrementMode')}
- </FormLabel>
- <Controller
- name="incrementMode"
- control={control}
- render={({ field }) => (
- <ToggleButtonGroup
- {...field}
- value={field.value}
- exclusive
- onChange={(event, value) => {
- if (value !== null) {
- field.onChange(value);
- }
- }}
- fullWidth
- >
- <ToggleButton value="ascending">
- {translate('page.map.settings.map.copy.field.ascend')}
- </ToggleButton>
- <ToggleButton value="descending">
- {translate('page.map.settings.map.copy.field.descend')}
- </ToggleButton>
- </ToggleButtonGroup>
- )}
- />
- </FormControl>
- </Grid>
- )}
-
- <Grid item xs={12} mt={2}>
- <Divider />
- </Grid>
-
- <Grid item xs={12} mt={2}>
- <Stack direction="row" spacing={2}>
- <Button variant="contained" color="primary" type="submit">
- {translate('ra.action.confirm')}
- </Button>
- </Stack>
- </Grid>
-
- </Grid>
- </Box>
- </CardContent>
- </Card>
- </Box>
- </Box>
- )}
- </Drawer>
- </>
- )
-}
-
-export default CopyDrawer;
\ No newline at end of file
diff --git a/zy-acs-flow/src/map/areaSettings/MapSettings.jsx b/zy-acs-flow/src/map/areaSettings/MapSettings.jsx
deleted file mode 100644
index 6bc16c2..0000000
--- a/zy-acs-flow/src/map/areaSettings/MapSettings.jsx
+++ /dev/null
@@ -1,376 +0,0 @@
-import React, { useEffect, useState } from 'react';
-import { useForm, Controller } from 'react-hook-form';
-import {
- Box,
- Grid,
- Typography,
- TextField,
- Slider,
- Button,
- Select,
- MenuItem,
- InputLabel,
- FormControl,
- Stack,
- Divider,
-} from '@mui/material';
-import MuiInput from '@mui/material/Input';
-import { useTranslate } from 'react-admin';
-import * as Tool from '../tool';
-import ConfirmButton from '../../page/components/ConfirmButton';
-import CopyDrawer from './CopyDrawer';
-
-const MapSettings = (props) => {
- const { sprite, setSpriteSettings, onSubmit, width, lastCopiedSprites, setLastCopiedSprites } = props;
- const translate = useTranslate();
- const [copyVisible, setCopyVisible] = useState(false);
-
- const { control, handleSubmit, reset, watch } = useForm({
- defaultValues: {
- x: sprite?.position?.x || 0,
- y: sprite?.position?.y || 0,
- scaleX: sprite?.scale?.x || 1,
- scaleY: sprite?.scale?.y || 1,
- rotation: (sprite?.rotation * 180) / Math.PI || 0,
- copyDirection: 'right',
- copyCount: 1,
- },
- });
-
- const watchAllFields = watch();
-
- useEffect(() => {
- if (sprite) {
- setCopyVisible(false);
- reset({
- x: sprite?.position.x,
- y: sprite?.position.y,
- scaleX: sprite?.scale.x,
- scaleY: sprite?.scale.y,
- rotation: (sprite?.rotation * 180) / Math.PI,
- });
- }
- }, [sprite, reset]);
-
- const updateSprite = (data) => {
- if (sprite) {
- sprite.position.x = data.x;
- sprite.position.y = data.y;
- sprite.scale.x = data.scaleX;
- sprite.scale.y = data.scaleY;
- sprite.rotation = (data.rotation * Math.PI) / 180;
- }
- };
-
- const onFormSubmit = (data) => {
- updateSprite(data);
- if (onSubmit) {
- onSubmit(data);
- }
- };
-
- return (
- <>
- <Box component="form" onSubmit={handleSubmit(onFormSubmit)} noValidate sx={{ mt: 0 }}>
- <Grid container spacing={1.4}>
- {/* position */}
- <Grid item xs={12}>
- <Typography variant="inherit">
- {translate('page.map.settings.map.base.position')}
- </Typography>
- </Grid>
- <Grid item xs={6} pt={0} sx={{
- paddingTop: '8px !important',
- }}>
- <Controller
- name="x"
- control={control}
- render={({ field }) => (
- <TextField
- {...field}
- label="X"
- type="number"
- fullWidth
- onChange={(e) => {
- const value = parseFloat(e.target.value);
- field.onChange(e);
- if (!isNaN(value)) {
- updateSprite({ ...watchAllFields, x: value });
- }
- }}
- />
- )}
- />
- </Grid>
- <Grid item xs={6} sx={{
- paddingTop: '8px !important',
- }}>
- <Controller
- name="y"
- control={control}
- render={({ field }) => (
- <TextField
- {...field}
- label="Y"
- type="number"
- fullWidth
- onChange={(e) => {
- const value = parseFloat(e.target.value);
- field.onChange(e);
- if (!isNaN(value)) {
- updateSprite({ ...watchAllFields, y: value });
- }
- }}
- />
- )}
- />
- </Grid>
-
- {/* scale */}
- <Grid item xs={12}>
- <Typography variant="inherit">
- {translate('page.map.settings.map.base.scale')}
- </Typography>
- </Grid>
- <Grid item xs={6} sx={{
- paddingTop: '8px !important',
- }}>
- <Controller
- name="scaleX"
- control={control}
- render={({ field }) => (
- <TextField
- {...field}
- label="X"
- type="number"
- fullWidth
- inputProps={{ step: 0.1, min: 0.1, max: 10 }}
- onChange={(e) => {
- const value = parseFloat(e.target.value);
- field.onChange(e);
- if (!isNaN(value)) {
- updateSprite({ ...watchAllFields, scaleX: value });
- }
- }}
- />
- )}
- />
- </Grid>
- <Grid item xs={6} sx={{
- paddingTop: '8px !important',
- }}>
- <Controller
- name="scaleY"
- control={control}
- render={({ field }) => (
- <TextField
- {...field}
- label="Y"
- type="number"
- fullWidth
- inputProps={{ step: 0.1, min: 0.1, max: 10 }}
- onChange={(e) => {
- const value = parseFloat(e.target.value);
- field.onChange(e);
- if (!isNaN(value)) {
- updateSprite({ ...watchAllFields, scaleY: value });
- }
- }}
- />
- )}
- />
- </Grid>
-
- {/* rotation */}
- <Grid item xs={12}>
- <Typography variant="inherit">
- {translate('page.map.settings.map.base.rotation')}
- </Typography>
- </Grid>
- <Grid item xs={12}>
- <Box display="flex" alignItems="center">
- <Box flex={1} mr={3}>
- <Controller
- name="rotation"
- control={control}
- render={({ field }) => (
- <Slider
- {...field}
- // size="small"
- min={0}
- max={360}
- step={1}
- valueLabelDisplay="auto"
- valueLabelFormat={(value) => `${value}掳`}
- onChange={(e, value) => {
- field.onChange(value);
- updateSprite({ ...watchAllFields, rotation: value });
- }}
- />
- )}
- />
- </Box>
- <Box >
- <Controller
- name="rotation"
- control={control}
- render={({ field }) => (
- <MuiInput
- {...field}
- size="small"
- value={field.value}
- onChange={(e) => {
- const value = e.target.value === '' ? 0 : Number(e.target.value);
- if (!isNaN(value)) {
- field.onChange(value);
- updateSprite({ ...watchAllFields, rotation: value });
- }
- }}
- onBlur={() => {
- if (field.value < 0) {
- field.onChange(0);
- } else if (field.value > 360) {
- field.onChange(360);
- }
- }}
- inputProps={{
- step: 1,
- min: 0,
- max: 360,
- type: 'number',
- 'aria-labelledby': 'input-slider',
- }}
- />
- )}
- />
- </Box>
- </Box>
- </Grid>
-
- <Grid item xs={12}>
- <Divider />
- </Grid>
-
- {/* copy */}
- <Grid item xs={12}>
- <Typography variant="inherit">
- {translate('page.map.settings.map.copy.title')}
- </Typography>
- </Grid>
- <Grid item xs={6} sx={{
- paddingTop: '8px !important',
- }}>
- <Controller
- name="copyDirection"
- control={control}
- render={({ field }) => (
- <FormControl fullWidth>
- <InputLabel>
- {translate('page.map.settings.map.copy.direction')}
- </InputLabel>
- <Select
- {...field}
- label={translate('page.map.settings.map.copy.direction')}
- >
- <MenuItem value="left">
- {translate('page.map.settings.map.copy.left')}
- </MenuItem>
- <MenuItem value="right">
- {translate('page.map.settings.map.copy.right')}
- </MenuItem>
- <MenuItem value="up">
- {translate('page.map.settings.map.copy.up')}
- </MenuItem>
- <MenuItem value="down">
- {translate('page.map.settings.map.copy.down')}
- </MenuItem>
- </Select>
- </FormControl>
- )}
- />
- </Grid>
- <Grid item xs={6} sx={{
- paddingTop: '8px !important',
- }}>
- <Controller
- name="copyCount"
- control={control}
- render={({ field }) => (
- <TextField
- {...field}
- label={translate('page.map.settings.map.copy.count')}
- type="number"
- fullWidth
- inputProps={{ min: 1 }}
- />
- )}
- />
- </Grid>
- <Grid item xs={12}>
- <Stack direction="row" spacing={2}>
- <Button variant="contained" color="primary" onClick={() => {
- setCopyVisible(true);
- }}>
- {translate('page.map.settings.map.copy.execute')}
- </Button>
- <Button variant="text" color="primary" onClick={() => {
- if (lastCopiedSprites && lastCopiedSprites.length > 0) {
- lastCopiedSprites.forEach(copiedSprite => {
- Tool.getMapContainer().removeChild(copiedSprite);
- })
- setLastCopiedSprites([]);
- }
- }}>
- {translate('page.map.settings.map.copy.reverse')}
- </Button>
- </Stack>
- </Grid>
-
- <Grid item xs={12}>
- <Divider />
- </Grid>
-
- {/* more */}
- <Grid item xs={12}>
- <Typography variant="inherit">
- {translate('page.map.settings.map.more.title')}
- </Typography>
- </Grid>
- <Grid item xs={12}>
- <Stack direction="row" spacing={2}>
- <Button variant="outlined" color="error" onClick={() => {
- Tool.getMapContainer().removeChild(sprite);
- setSpriteSettings(null);
- Tool.removeSelectedEffect();
- reset();
- }}>
- {translate('ra.action.delete')}
- </Button>
- {/* <ConfirmButton /> */}
- </Stack>
- </Grid>
- </Grid>
- </Box >
-
- <CopyDrawer
- open={copyVisible}
- onCancel={() => {
- setCopyVisible(false);
- }}
- width={width}
- sprite={sprite}
- value={{
- copyDirect: watch('copyDirection'),
- copyCount: watch('copyCount'),
- }}
- handleOnCopy={() => {
-
- }}
- setLastCopiedSprites={setLastCopiedSprites}
- setSpriteSettings={setSpriteSettings}
- />
- </>
- );
-};
-
-export default MapSettings;
diff --git a/zy-acs-flow/src/map/areaSettings/index.jsx b/zy-acs-flow/src/map/areaSettings/index.jsx
index 39b0fd1..db2f207 100644
--- a/zy-acs-flow/src/map/areaSettings/index.jsx
+++ b/zy-acs-flow/src/map/areaSettings/index.jsx
@@ -1,27 +1,75 @@
-import React, { useState, useRef, useEffect } from 'react';
+import React, { useState, useEffect } from 'react';
import { useTranslate } from "react-admin";
-import { Drawer, Box, Typography, Tabs, Tab, IconButton, Stack, useTheme, Card, CardContent, Divider } from '@mui/material';
+import {
+ Drawer,
+ Box,
+ Typography,
+ Tabs,
+ Tab,
+ IconButton,
+ Stack,
+ useTheme,
+ Card,
+ CardContent,
+ Divider,
+} from '@mui/material';
import CloseIcon from '@mui/icons-material/Close';
import { PAGE_DRAWER_WIDTH } from '@/config/setting';
-import MapSettings from './MapSettings';
-import ConfigSettings from './ConfigSettings';
+import AreaBasicTab from './AreaBasicTab';
+import AreaAdvancedTab from './AreaAdvancedTab';
const AreaSettings = (props) => {
- const { open, onCancel, sprite, width = PAGE_DRAWER_WIDTH, title, setSpriteSettings } = props;
+ const { open, onCancel, sprite, width = PAGE_DRAWER_WIDTH } = props;
const theme = useTheme();
const themeMode = theme.palette.mode;
const translate = useTranslate();
-
- const [lastCopiedSprites, setLastCopiedSprites] = useState([]);
const handleClose = () => {
onCancel();
}
const [activeTab, setActiveTab] = useState(0);
+ const [areaName, setAreaName] = useState('');
+ const [agvList, setAgvList] = useState('');
+ const [barcodeList, setBarcodeList] = useState('');
+ const [areaCode, setAreaCode] = useState('');
+ const [maxQty, setMaxQty] = useState('');
+ const [speedLimit, setSpeedLimit] = useState('');
+ const [shapeData, setShapeData] = useState('');
+ const [priority, setPriority] = useState('');
+
+ useEffect(() => {
+ if (sprite?.data) {
+ setAreaName(sprite.data.name || '');
+ setAreaCode(sprite.data.code || '');
+ setMaxQty(sprite.data.maxQty || '');
+ setSpeedLimit(sprite.data.speedLimit || '');
+ setShapeData(sprite.data.shape || '');
+ setPriority(sprite.data.priority || '');
+ setAgvList((sprite.data.agvs || []).join(', '));
+ setBarcodeList((sprite.data.barcodes || []).join('\n'));
+ } else {
+ setAreaName('');
+ setAreaCode('');
+ setMaxQty('');
+ setSpeedLimit('');
+ setShapeData('');
+ setPriority('');
+ setAgvList('');
+ setBarcodeList('');
+ }
+ }, [sprite]);
const handleTabChange = (event, newValue) => {
setActiveTab(newValue);
+ };
+
+ const handleSaveBasic = () => {
+ // placeholder for save logic
+ };
+
+ const handleSaveAdvanced = () => {
+ // placeholder for save logic
};
return (
@@ -69,29 +117,37 @@
variant="fullWidth"
sx={{ mb: 0 }}
>
- <Tab label={translate('page.map.settings.map.title')} />
- <Tab label={translate('page.map.settings.config.title')} />
+ <Tab label={translate('page.map.area.basic', { _: '鍩虹' })} />
+ <Tab label={translate('page.map.area.advanced', { _: '楂樼骇' })} />
</Tabs>
<Divider />
<Box p={3}>
{activeTab === 0 && (
- <MapSettings
- sprite={sprite}
- setSpriteSettings={setSpriteSettings}
- onSubmit={() => {
- }}
- width={width}
- lastCopiedSprites={lastCopiedSprites}
- setLastCopiedSprites={setLastCopiedSprites}
+ <AreaBasicTab
+ areaName={areaName}
+ setAreaName={setAreaName}
+ agvList={agvList}
+ setAgvList={setAgvList}
+ barcodeList={barcodeList}
+ setBarcodeList={setBarcodeList}
+ onSave={handleSaveBasic}
/>
)}
{activeTab === 1 && (
- <ConfigSettings
- sprite={sprite}
- onSubmit={() => {
- }}
+ <AreaAdvancedTab
+ areaCode={areaCode}
+ setAreaCode={setAreaCode}
+ maxQty={maxQty}
+ setMaxQty={setMaxQty}
+ speedLimit={speedLimit}
+ setSpeedLimit={setSpeedLimit}
+ shapeData={shapeData}
+ setShapeData={setShapeData}
+ priority={priority}
+ setPriority={setPriority}
+ onSave={handleSaveAdvanced}
/>
)}
</Box>
@@ -105,4 +161,4 @@
)
}
-export default AreaSettings;
\ No newline at end of file
+export default AreaSettings;
--
Gitblit v1.9.1