From 6db769f5986c7a3f48cd3e8f5ca3aaf523b2a33b Mon Sep 17 00:00:00 2001 From: maxim Date: Wed, 19 Mar 2025 21:11:32 +0300 Subject: [PATCH] add new `props` for `/carrier` route --- src/components/CustomDataGrid.tsx | 11 ++- src/pages/carrier/create.tsx | 116 ++++++++++++++++++++++++++++++ src/pages/carrier/edit.tsx | 116 ++++++++++++++++++++++++++++++ src/pages/carrier/list.tsx | 37 +++++++++- src/pages/carrier/show.tsx | 34 +++++++-- src/pages/route/show.tsx | 5 ++ 6 files changed, 305 insertions(+), 14 deletions(-) diff --git a/src/components/CustomDataGrid.tsx b/src/components/CustomDataGrid.tsx index c981be1..f16fb76 100644 --- a/src/components/CustomDataGrid.tsx +++ b/src/components/CustomDataGrid.tsx @@ -12,10 +12,10 @@ interface CustomDataGridProps extends DataGridProps { resource?: string // Add this prop } -const DEV_FIELDS = ['id', 'code', 'country_code', 'city_id', 'carrier_id'] as const +const DEV_FIELDS = ['id', 'code', 'country_code', 'city_id', 'carrier_id', 'main_color', 'left_color', 'right_color', 'logo', 'slogan'] as const export const CustomDataGrid = ({hasCoordinates = false, columns = [], resource, ...props}: CustomDataGridProps) => { - const isDev = import.meta.env.DEV + // const isDev = import.meta.env.DEV const {triggerExport, isLoading: exportLoading} = useExport({ resource: resource ?? '', // pageSize: 100, #* @@ -23,10 +23,9 @@ export const CustomDataGrid = ({hasCoordinates = false, columns = [], resource, }) const initialShowCoordinates = Cookies.get('showCoordinates') === 'true' - const initialShowDevData = Cookies.get('showDevData') === 'true' - + const initialShowDevData = false // Default to false in both prod and dev const [showCoordinates, setShowCoordinates] = useState(initialShowCoordinates) - const [showDevData, setShowDevData] = useState(initialShowDevData) + const [showDevData, setShowDevData] = useState(Cookies.get('showDevData') === 'true') const availableDevFields = useMemo(() => DEV_FIELDS.filter((field) => columns.some((column) => column.field === field)), [columns]) @@ -107,7 +106,7 @@ export const CustomDataGrid = ({hasCoordinates = false, columns = [], resource, )} - {isDev && availableDevFields.length > 0 && ( + {showDevData && availableDevFields.length > 0 && ( diff --git a/src/pages/carrier/create.tsx b/src/pages/carrier/create.tsx index 20b3dd7..ad9c77b 100644 --- a/src/pages/carrier/create.tsx +++ b/src/pages/carrier/create.tsx @@ -23,6 +23,17 @@ export const CarrierCreate = () => { ], }) + const {autocompleteProps: mediaAutocompleteProps} = useAutocomplete({ + resource: 'media', + onSearch: (value) => [ + { + field: 'filename', + operator: 'contains', + value, + }, + ], + }) + return ( @@ -79,6 +90,111 @@ export const CarrierCreate = () => { label={'Короткое имя'} name="short_name" /> + + + + + + + + + ( + option.id === field.value) || null} + onChange={(_, value) => { + field.onChange(value?.id || '') + }} + getOptionLabel={(item) => { + return item ? item.filename : '' + }} + isOptionEqualToValue={(option, value) => { + return option.id === value?.id + }} + filterOptions={(options, {inputValue}) => { + return options.filter((option) => option.filename.toLowerCase().includes(inputValue.toLowerCase())) + }} + renderInput={(params) => } + /> + )} + /> ) diff --git a/src/pages/carrier/edit.tsx b/src/pages/carrier/edit.tsx index c572eb7..ef152f4 100644 --- a/src/pages/carrier/edit.tsx +++ b/src/pages/carrier/edit.tsx @@ -22,6 +22,17 @@ export const CarrierEdit = () => { ], }) + const {autocompleteProps: mediaAutocompleteProps} = useAutocomplete({ + resource: 'media', + onSearch: (value) => [ + { + field: 'filename', + operator: 'contains', + value, + }, + ], + }) + return ( @@ -78,6 +89,111 @@ export const CarrierEdit = () => { label={'Короткое имя'} name="short_name" /> + + + + + + + + + ( + option.id === field.value) || null} + onChange={(_, value) => { + field.onChange(value?.id || '') + }} + getOptionLabel={(item) => { + return item ? item.filename : '' + }} + isOptionEqualToValue={(option, value) => { + return option.id === value?.id + }} + filterOptions={(options, {inputValue}) => { + return options.filter((option) => option.filename.toLowerCase().includes(inputValue.toLowerCase())) + }} + renderInput={(params) => } + /> + )} + /> ) diff --git a/src/pages/carrier/list.tsx b/src/pages/carrier/list.tsx index e32718b..143a95e 100644 --- a/src/pages/carrier/list.tsx +++ b/src/pages/carrier/list.tsx @@ -34,17 +34,50 @@ export const CarrierList = () => { field: 'short_name', headerName: 'Короткое имя', type: 'string', - minWidth: 150, + minWidth: 125, }, { field: 'city', headerName: 'Город', type: 'string', - minWidth: 150, + minWidth: 125, align: 'left', headerAlign: 'left', flex: 1, }, + { + field: 'main_color', + headerName: 'Основной цвет', + type: 'string', + minWidth: 150, + renderCell: ({value}) =>
{value}
, + }, + { + field: 'left_color', + headerName: 'Цвет левого виджета', + type: 'string', + minWidth: 150, + renderCell: ({value}) =>
{value}
, + }, + { + field: 'right_color', + headerName: 'Цвет правого виджета', + type: 'string', + minWidth: 150, + renderCell: ({value}) =>
{value}
, + }, + { + field: 'logo', + headerName: 'Лого', + type: 'string', + minWidth: 150, + }, + { + field: 'slogan', + headerName: 'Слоган', + type: 'string', + minWidth: 150, + }, { field: 'actions', headerName: 'Действия', diff --git a/src/pages/carrier/show.tsx b/src/pages/carrier/show.tsx index 24295aa..0dc5d12 100644 --- a/src/pages/carrier/show.tsx +++ b/src/pages/carrier/show.tsx @@ -1,30 +1,52 @@ -import {Stack, Typography} from '@mui/material' +import {Box, Stack, Typography} from '@mui/material' import {useShow} from '@refinedev/core' import {Show, TextFieldComponent as TextField} from '@refinedev/mui' +export type FieldType = { + label: string + data: any + render?: (value: any) => React.ReactNode +} + export const CarrierShow = () => { const {query} = useShow({}) const {data, isLoading} = query const record = data?.data - const fields = [ - // {label: 'ID', data: 'id'}, - // {label: 'ID города', data: 'city_id'}, + const fields: FieldType[] = [ {label: 'Полное имя', data: 'full_name'}, {label: 'Короткое имя', data: 'short_name'}, {label: 'Город', data: 'city'}, + { + label: 'Основной цвет', + data: 'main_color', + render: (value: string) => {value}, + }, + { + label: 'Цвет левого виджета', + data: 'left_color', + render: (value: string) => {value}, + }, + { + label: 'Цвет правого виджета', + data: 'right_color', + render: (value: string) => {value}, + }, + {label: 'Слоган', data: 'slogan'}, + {label: 'Логотип', data: 'logo', render: (value: number) => {String(value)}}, ] return ( - {fields.map(({label, data}) => ( + {fields.map(({label, data, render}) => ( {label} - + + {render ? render(record?.[data]) : } ))} diff --git a/src/pages/route/show.tsx b/src/pages/route/show.tsx index 7f63db2..4b2e6f7 100644 --- a/src/pages/route/show.tsx +++ b/src/pages/route/show.tsx @@ -12,6 +12,11 @@ export const RouteShow = () => { const fields = [ {label: 'Перевозчик', data: 'carrier'}, {label: 'Номер маршрута', data: 'route_number'}, + { + label: 'Направление маршрута', + data: 'route_direction', + render: (value: number[][]) => {value ? 'прямое' : 'обратное'}, + }, { label: 'Координаты маршрута', data: 'path',