fix path
for /route
route
This commit is contained in:
parent
b0181f988b
commit
7ee4334381
@ -74,16 +74,34 @@ export const RouteCreate = () => {
|
||||
<TextField
|
||||
{...register('path', {
|
||||
required: 'Это поле является обязательным',
|
||||
setValueAs: (value) => String(value),
|
||||
setValueAs: (value: string) => {
|
||||
try {
|
||||
// Парсим строку в массив массивов
|
||||
return JSON.parse(value)
|
||||
} catch {
|
||||
return []
|
||||
}
|
||||
},
|
||||
validate: (value: unknown) => {
|
||||
if (!Array.isArray(value)) return 'Неверный формат'
|
||||
if (!value.every((point: unknown) => Array.isArray(point) && point.length === 2)) {
|
||||
return 'Каждая точка должна быть массивом из двух координат'
|
||||
}
|
||||
if (!value.every((point: unknown[]) => point.every((coord: unknown) => !isNaN(Number(coord)) && typeof coord === 'number'))) {
|
||||
return 'Координаты должны быть числами'
|
||||
}
|
||||
return true
|
||||
},
|
||||
})}
|
||||
error={!!(errors as any)?.path}
|
||||
helperText={(errors as any)?.path?.message}
|
||||
helperText={(errors as any)?.path?.message} // 'Формат: [[lat1,lon1], [lat2,lon2], ...]'
|
||||
margin="normal"
|
||||
fullWidth
|
||||
InputLabelProps={{shrink: true}}
|
||||
type="text"
|
||||
label={'Путь'}
|
||||
label={'Координаты маршрута'}
|
||||
name="path"
|
||||
placeholder="[[1.1, 2.2], [2.1, 4.5]]"
|
||||
/>
|
||||
</Box>
|
||||
</Create>
|
||||
|
@ -66,18 +66,45 @@ export const RouteEdit = () => {
|
||||
(Прямой / Обратный)
|
||||
</Typography>
|
||||
|
||||
<TextField
|
||||
{...register('path', {
|
||||
setValueAs: (value) => String(value),
|
||||
})}
|
||||
error={!!(errors as any)?.path}
|
||||
helperText={(errors as any)?.path?.message}
|
||||
margin="normal"
|
||||
fullWidth
|
||||
InputLabelProps={{shrink: true}}
|
||||
type="text"
|
||||
label={'Путь'}
|
||||
<Controller
|
||||
name="path"
|
||||
control={control}
|
||||
defaultValue={[]}
|
||||
rules={{
|
||||
required: 'Это поле является обязательным',
|
||||
validate: (value: unknown) => {
|
||||
if (!Array.isArray(value)) return 'Неверный формат'
|
||||
if (!value.every((point: unknown) => Array.isArray(point) && point.length === 2)) {
|
||||
return 'Каждая точка должна быть массивом из двух координат'
|
||||
}
|
||||
if (!value.every((point: unknown[]) => point.every((coord: unknown) => !isNaN(Number(coord)) && typeof coord === 'number'))) {
|
||||
return 'Координаты должны быть числами'
|
||||
}
|
||||
return true
|
||||
},
|
||||
}}
|
||||
render={({field, fieldState: {error}}) => (
|
||||
<TextField
|
||||
{...field}
|
||||
value={Array.isArray(field.value) ? JSON.stringify(field.value) : ''}
|
||||
onChange={(e) => {
|
||||
try {
|
||||
const parsed = JSON.parse(e.target.value)
|
||||
field.onChange(parsed)
|
||||
} catch {
|
||||
field.onChange([])
|
||||
}
|
||||
}}
|
||||
error={!!error}
|
||||
helperText={error?.message || 'Формат: [[lat1,lon1], [lat2,lon2], ...]'}
|
||||
margin="normal"
|
||||
fullWidth
|
||||
InputLabelProps={{shrink: true}}
|
||||
type="text"
|
||||
label={'Координаты маршрута'}
|
||||
placeholder="[[1.1, 2.2], [2.1, 4.5]]"
|
||||
/>
|
||||
)}
|
||||
/>
|
||||
</Box>
|
||||
</Edit>
|
||||
|
@ -180,7 +180,28 @@ export const RouteShow = () => {
|
||||
const fields = [
|
||||
{label: 'Перевозчик', data: 'carrier'},
|
||||
{label: 'Номер маршрута', data: 'route_number'},
|
||||
{label: 'Путь', data: 'path'},
|
||||
{
|
||||
label: 'Координаты маршрута',
|
||||
data: 'path',
|
||||
render: (value: number[][]) => (
|
||||
<Box
|
||||
sx={{
|
||||
fontFamily: 'monospace',
|
||||
bgcolor: (theme) => theme.palette.background.paper,
|
||||
p: 2,
|
||||
borderRadius: 1,
|
||||
maxHeight: '200px',
|
||||
overflow: 'auto',
|
||||
}}
|
||||
>
|
||||
{value?.map((point, index) => (
|
||||
<Typography key={index} sx={{mb: 0.5}}>
|
||||
Точка {index + 1}: [{point[0]}, {point[1]}]
|
||||
</Typography>
|
||||
))}
|
||||
</Box>
|
||||
),
|
||||
},
|
||||
]
|
||||
|
||||
const stationFields: Array<{label: string; data: keyof StationItem}> = [
|
||||
@ -196,12 +217,12 @@ export const RouteShow = () => {
|
||||
return (
|
||||
<Show isLoading={isLoading}>
|
||||
<Stack gap={4}>
|
||||
{fields.map(({label, data}) => (
|
||||
{fields.map(({label, data, render}) => (
|
||||
<Stack key={data} gap={1}>
|
||||
<Typography variant="body1" fontWeight="bold">
|
||||
{label}
|
||||
</Typography>
|
||||
<TextField value={record?.[data]} />
|
||||
{render ? render(record?.[data]) : <TextField value={record?.[data]} />}
|
||||
</Stack>
|
||||
))}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user