From 7ee43343813b3de2d969828ceb4bb3dc55986ae5 Mon Sep 17 00:00:00 2001 From: maxim Date: Mon, 17 Mar 2025 03:30:41 +0300 Subject: [PATCH] fix `path` for `/route` route --- src/pages/route/create.tsx | 24 ++++++++++++++++--- src/pages/route/edit.tsx | 49 +++++++++++++++++++++++++++++--------- src/pages/route/show.tsx | 27 ++++++++++++++++++--- 3 files changed, 83 insertions(+), 17 deletions(-) diff --git a/src/pages/route/create.tsx b/src/pages/route/create.tsx index 6bebaca..67aa7b5 100644 --- a/src/pages/route/create.tsx +++ b/src/pages/route/create.tsx @@ -74,16 +74,34 @@ export const RouteCreate = () => { 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]]" /> diff --git a/src/pages/route/edit.tsx b/src/pages/route/edit.tsx index 4491bf3..5a66217 100644 --- a/src/pages/route/edit.tsx +++ b/src/pages/route/edit.tsx @@ -66,18 +66,45 @@ export const RouteEdit = () => { (Прямой / Обратный) - String(value), - })} - error={!!(errors as any)?.path} - helperText={(errors as any)?.path?.message} - margin="normal" - fullWidth - InputLabelProps={{shrink: true}} - type="text" - label={'Путь'} + { + 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}}) => ( + { + 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]]" + /> + )} /> diff --git a/src/pages/route/show.tsx b/src/pages/route/show.tsx index 0fba6e0..775cfd0 100644 --- a/src/pages/route/show.tsx +++ b/src/pages/route/show.tsx @@ -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[][]) => ( + theme.palette.background.paper, + p: 2, + borderRadius: 1, + maxHeight: '200px', + overflow: 'auto', + }} + > + {value?.map((point, index) => ( + + Точка {index + 1}: [{point[0]}, {point[1]}] + + ))} + + ), + }, ] const stationFields: Array<{label: string; data: keyof StationItem}> = [ @@ -196,12 +217,12 @@ export const RouteShow = () => { return ( - {fields.map(({label, data}) => ( + {fields.map(({label, data, render}) => ( {label} - + {render ? render(record?.[data]) : } ))}