feat: Add more pages
This commit is contained in:
		
							
								
								
									
										117
									
								
								src/pages/Station/StationListPage/index.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								src/pages/Station/StationListPage/index.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | ||||
| import { DataGrid, GridColDef, GridRenderCellParams } from "@mui/x-data-grid"; | ||||
| import { languageStore, stationsStore } from "@shared"; | ||||
| import { useEffect, useState } from "react"; | ||||
| import { observer } from "mobx-react-lite"; | ||||
| import { Eye, Trash2 } from "lucide-react"; | ||||
| import { useNavigate } from "react-router-dom"; | ||||
| import { CreateButton, DeleteModal, LanguageSwitcher } from "@widgets"; | ||||
|  | ||||
| export const StationListPage = observer(() => { | ||||
|   const { stations, getStations, deleteStation } = stationsStore; | ||||
|   const navigate = useNavigate(); | ||||
|   const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); | ||||
|   const [rowId, setRowId] = useState<number | null>(null); // Lifted state | ||||
|   const { language } = languageStore; | ||||
|  | ||||
|   useEffect(() => { | ||||
|     getStations(); | ||||
|   }, [language]); | ||||
|  | ||||
|   const columns: GridColDef[] = [ | ||||
|     { | ||||
|       field: "name", | ||||
|       headerName: "Название", | ||||
|       flex: 1, | ||||
|     }, | ||||
|     { | ||||
|       field: "system_name", | ||||
|       headerName: "Системное название", | ||||
|       flex: 1, | ||||
|     }, | ||||
|     { | ||||
|       field: "direction", | ||||
|       headerName: "Направление", | ||||
|       width: 200, | ||||
|       align: "center", | ||||
|       headerAlign: "center", | ||||
|  | ||||
|       renderCell: (params: GridRenderCellParams) => { | ||||
|         return ( | ||||
|           <p | ||||
|             className={ | ||||
|               params.row.direction === true ? "text-green-500" : "text-red-500" | ||||
|             } | ||||
|           > | ||||
|             {params.row.direction ? "Прямой" : "Обратный"} | ||||
|           </p> | ||||
|         ); | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       field: "actions", | ||||
|       headerName: "Действия", | ||||
|       width: 140, | ||||
|       align: "center", | ||||
|       headerAlign: "center", | ||||
|  | ||||
|       renderCell: (params: GridRenderCellParams) => { | ||||
|         return ( | ||||
|           <div className="flex h-full gap-7 justify-center items-center"> | ||||
|             <button onClick={() => navigate(`/station/${params.row.id}`)}> | ||||
|               <Eye size={20} className="text-green-500" /> | ||||
|             </button> | ||||
|             <button | ||||
|               onClick={() => { | ||||
|                 setIsDeleteModalOpen(true); | ||||
|                 setRowId(params.row.id); | ||||
|               }} | ||||
|             > | ||||
|               <Trash2 size={20} className="text-red-500" /> | ||||
|             </button> | ||||
|           </div> | ||||
|         ); | ||||
|       }, | ||||
|     }, | ||||
|   ]; | ||||
|  | ||||
|   const rows = stations.map((station) => ({ | ||||
|     id: station.id, | ||||
|     name: station.name, | ||||
|     system_name: station.system_name, | ||||
|     direction: station.direction, | ||||
|   })); | ||||
|  | ||||
|   return ( | ||||
|     <> | ||||
|       <LanguageSwitcher /> | ||||
|  | ||||
|       <div style={{ width: "100%" }}> | ||||
|         <div className="flex justify-between items-center mb-10"> | ||||
|           <h1 className="text-2xl">Станции</h1> | ||||
|           <CreateButton label="Создать станцию" path="/station/create" /> | ||||
|         </div> | ||||
|         <DataGrid | ||||
|           rows={rows} | ||||
|           columns={columns} | ||||
|           hideFooterPagination | ||||
|           hideFooter | ||||
|         /> | ||||
|       </div> | ||||
|  | ||||
|       <DeleteModal | ||||
|         open={isDeleteModalOpen} | ||||
|         onDelete={async () => { | ||||
|           if (rowId) { | ||||
|             deleteStation(rowId); | ||||
|           } | ||||
|           setIsDeleteModalOpen(false); | ||||
|           setRowId(null); | ||||
|         }} | ||||
|         onCancel={() => { | ||||
|           setIsDeleteModalOpen(false); | ||||
|           setRowId(null); | ||||
|         }} | ||||
|       /> | ||||
|     </> | ||||
|   ); | ||||
| }); | ||||
		Reference in New Issue
	
	Block a user