feat: add annotation for action buttons and double click for user list page

This commit is contained in:
2026-05-19 13:47:36 +03:00
parent a997cdb198
commit fbf6b0dc9d
13 changed files with 39 additions and 17 deletions

View File

@@ -123,6 +123,8 @@ const LeftWidget = observer(
? routeSightsEn.find((sight) => sight.id === selectedSightId) ? routeSightsEn.find((sight) => sight.id === selectedSightId)
: routeSightsZh.find((sight) => sight.id === selectedSightId); : routeSightsZh.find((sight) => sight.id === selectedSightId);
if (!sight) return;
const leftArticle = sight.left_article; const leftArticle = sight.left_article;
const leftArticleData = const leftArticleData =
@@ -132,6 +134,8 @@ const LeftWidget = observer(
? sightArticlesEn.get(leftArticle + "_" + selectedLanguage) ? sightArticlesEn.get(leftArticle + "_" + selectedLanguage)
: sightArticlesZh.get(leftArticle + "_" + selectedLanguage); : sightArticlesZh.get(leftArticle + "_" + selectedLanguage);
if (!leftArticleData?.media?.length) return;
const media = await ContentAPI.getMediaPreview( const media = await ContentAPI.getMediaPreview(
leftArticleData.media[0].id, leftArticleData.media[0].id,
selectedLanguage, selectedLanguage,

View File

@@ -55,11 +55,12 @@ export const ArticleListPage = observer(() => {
sortable: false, sortable: false,
renderCell: (params: GridRenderCellParams) => ( renderCell: (params: GridRenderCellParams) => (
<div className="flex h-full gap-7 justify-center items-center"> <div className="flex h-full gap-7 justify-center items-center">
<button onClick={() => navigate(`/article/${params.row.id}`)}> <button title="Просмотр" onClick={() => navigate(`/article/${params.row.id}`)}>
<Eye size={20} className="text-green-500" /> <Eye size={20} className="text-green-500" />
</button> </button>
{canWriteArticles && ( {canWriteArticles && (
<button <button
title="Удалить"
onClick={() => { onClick={() => {
setIsDeleteModalOpen(true); setIsDeleteModalOpen(true);
setRowId(params.row.id); setRowId(params.row.id);

View File

@@ -98,10 +98,11 @@ export const CarrierListPage = observer(() => {
sortable: false, sortable: false,
renderCell: (params: GridRenderCellParams) => ( renderCell: (params: GridRenderCellParams) => (
<div className="flex h-full gap-7 justify-center items-center"> <div className="flex h-full gap-7 justify-center items-center">
<button onClick={() => navigate(`/carrier/${params.row.id}/edit`)}> <button title="Редактировать" onClick={() => navigate(`/carrier/${params.row.id}/edit`)}>
<Pencil size={20} className="text-blue-500" /> <Pencil size={20} className="text-blue-500" />
</button> </button>
<button <button
title="Удалить"
onClick={() => { onClick={() => {
setIsDeleteModalOpen(true); setIsDeleteModalOpen(true);
setRowId(params.row.id); setRowId(params.row.id);

View File

@@ -119,10 +119,11 @@ export const CityListPage = observer(() => {
sortable: false, sortable: false,
renderCell: (params: GridRenderCellParams) => ( renderCell: (params: GridRenderCellParams) => (
<div className="flex h-full gap-7 justify-center items-center"> <div className="flex h-full gap-7 justify-center items-center">
<button onClick={() => navigate(`/city/${params.row.id}/edit`)}> <button title="Редактировать" onClick={() => navigate(`/city/${params.row.id}/edit`)}>
<Pencil size={20} className="text-blue-500" /> <Pencil size={20} className="text-blue-500" />
</button> </button>
<button <button
title="Удалить"
onClick={(e) => { onClick={(e) => {
e.stopPropagation(); e.stopPropagation();
setIsDeleteModalOpen(true); setIsDeleteModalOpen(true);

View File

@@ -78,11 +78,12 @@ export const MediaListPage = observer(() => {
sortable: false, sortable: false,
renderCell: (params: GridRenderCellParams) => ( renderCell: (params: GridRenderCellParams) => (
<div className="flex h-full gap-7 justify-center items-center"> <div className="flex h-full gap-7 justify-center items-center">
<button onClick={() => navigate(`/media/${params.row.id}`)}> <button title="Просмотр" onClick={() => navigate(`/media/${params.row.id}`)}>
<Eye size={20} className="text-green-500" /> <Eye size={20} className="text-green-500" />
</button> </button>
{canWriteMedia && ( {canWriteMedia && (
<button <button
title="Удалить"
onClick={() => { onClick={() => {
setIsDeleteModalOpen(true); setIsDeleteModalOpen(true);
setRowId(params.row.id); setRowId(params.row.id);

View File

@@ -178,22 +178,23 @@ export const RouteListPage = observer(() => {
return ( return (
<div className="flex h-full gap-7 justify-center items-center"> <div className="flex h-full gap-7 justify-center items-center">
{canWriteRoutes && ( {canWriteRoutes && (
<button onClick={() => navigate(`/route/${params.row.id}/edit`)}> <button title="Редактировать" onClick={() => navigate(`/route/${params.row.id}/edit`)}>
<Pencil size={20} className="text-blue-500" /> <Pencil size={20} className="text-blue-500" />
</button> </button>
)} )}
{canShowRoutePreview && ( {canShowRoutePreview && (
<button onClick={() => navigate(`/route-preview/${params.row.id}`)}> <button title="Предпросмотр на карте" onClick={() => navigate(`/route-preview/${params.row.id}`)}>
<Map size={20} className="text-purple-500" /> <Map size={20} className="text-purple-500" />
</button> </button>
)} )}
{canShowRoutePreview && ( {canShowRoutePreview && (
<button onClick={() => window.open(`/demo/${params.row.id}`, "_blank")}> <button title="Демо" onClick={() => window.open(`/demo/${params.row.id}`, "_blank")}>
<Monitor size={20} className="text-green-500" /> <Monitor size={20} className="text-green-500" />
</button> </button>
)} )}
{canWriteRoutes && ( {canWriteRoutes && (
<button <button
title="Удалить"
onClick={() => { onClick={() => {
setIsDeleteModalOpen(true); setIsDeleteModalOpen(true);
setRowId(params.row.id); setRowId(params.row.id);

View File

@@ -105,10 +105,11 @@ export const SightListPage = observer(() => {
sortable: false, sortable: false,
renderCell: (params: GridRenderCellParams) => ( renderCell: (params: GridRenderCellParams) => (
<div className="flex h-full gap-7 justify-center items-center"> <div className="flex h-full gap-7 justify-center items-center">
<button onClick={() => navigate(`/sight/${params.row.id}/edit`)}> <button title="Редактировать" onClick={() => navigate(`/sight/${params.row.id}/edit`)}>
<Pencil size={20} className="text-blue-500" /> <Pencil size={20} className="text-blue-500" />
</button> </button>
<button <button
title="Удалить"
onClick={() => { onClick={() => {
setIsDeleteModalOpen(true); setIsDeleteModalOpen(true);
setRowId(params.row.id); setRowId(params.row.id);

View File

@@ -137,6 +137,7 @@ export const SnapshotListPage = observer(() => {
renderCell: (params: GridRenderCellParams) => ( renderCell: (params: GridRenderCellParams) => (
<div className="flex h-full gap-7 justify-center items-center"> <div className="flex h-full gap-7 justify-center items-center">
<button <button
title="Восстановить"
onClick={() => { onClick={() => {
setIsRestoreModalOpen(true); setIsRestoreModalOpen(true);
setRowId(params.row.id); setRowId(params.row.id);
@@ -145,6 +146,7 @@ export const SnapshotListPage = observer(() => {
<DatabaseBackup size={20} className="text-blue-500" /> <DatabaseBackup size={20} className="text-blue-500" />
</button> </button>
<button <button
title="Удалить"
onClick={() => { onClick={() => {
setIsDeleteModalOpen(true); setIsDeleteModalOpen(true);
setRowId(params.row.id); setRowId(params.row.id);

View File

@@ -141,7 +141,7 @@ export const StationListPage = observer(() => {
return ( return (
<div className="flex h-full gap-7 justify-center items-center"> <div className="flex h-full gap-7 justify-center items-center">
{canWriteStations && ( {canWriteStations && (
<button onClick={() => navigate(`/station/${params.row.id}/edit`)}> <button title="Редактировать" onClick={() => navigate(`/station/${params.row.id}/edit`)}>
<Pencil size={20} className="text-blue-500" /> <Pencil size={20} className="text-blue-500" />
</button> </button>
)} )}
@@ -151,13 +151,14 @@ export const StationListPage = observer(() => {
setSelectedStationId(params.row.id); setSelectedStationId(params.row.id);
setIsTransfersModalOpen(true); setIsTransfersModalOpen(true);
}} }}
title="Редактировать пересадки" title="Управление пересадками"
> >
<Route size={20} className="text-purple-500" /> <Route size={20} className="text-purple-500" />
</button> </button>
)} )}
{canWriteStations && ( {canWriteStations && (
<button <button
title="Удалить"
onClick={() => { onClick={() => {
setIsDeleteModalOpen(true); setIsDeleteModalOpen(true);
setRowId(params.row.id); setRowId(params.row.id);

View File

@@ -92,10 +92,11 @@ export const UserListPage = observer(() => {
sortable: false, sortable: false,
renderCell: (params: GridRenderCellParams) => ( renderCell: (params: GridRenderCellParams) => (
<div className="flex h-full gap-7 justify-center items-center"> <div className="flex h-full gap-7 justify-center items-center">
<button onClick={() => navigate(`/user/${params.row.id}/edit`)}> <button title="Редактировать" onClick={() => navigate(`/user/${params.row.id}/edit`)}>
<Pencil size={20} className="text-blue-500" /> <Pencil size={20} className="text-blue-500" />
</button> </button>
<button <button
title="Удалить"
onClick={() => { onClick={() => {
setIsDeleteModalOpen(true); setIsDeleteModalOpen(true);
setRowId(params.row.id); setRowId(params.row.id);
@@ -154,6 +155,11 @@ export const UserListPage = observer(() => {
checkboxSelection={canWriteUsers} checkboxSelection={canWriteUsers}
disableRowSelectionExcludeModel disableRowSelectionExcludeModel
disableRowSelectionOnClick disableRowSelectionOnClick
onRowDoubleClick={(params) => {
if (canWriteUsers) {
navigate(`/user/${params.row.id}/edit`);
}
}}
loading={isLoading} loading={isLoading}
paginationModel={paginationModel} paginationModel={paginationModel}
onPaginationModelChange={setPaginationModel} onPaginationModelChange={setPaginationModel}

View File

@@ -115,15 +115,16 @@ export const VehicleListPage = observer(() => {
return ( return (
<div className="flex h-full gap-7 justify-center items-center"> <div className="flex h-full gap-7 justify-center items-center">
{canWrite && ( {canWrite && (
<button onClick={() => navigate(`/vehicle/${params.row.id}/edit`)}> <button title="Редактировать" onClick={() => navigate(`/vehicle/${params.row.id}/edit`)}>
<Pencil size={20} className="text-blue-500" /> <Pencil size={20} className="text-blue-500" />
</button> </button>
)} )}
<button onClick={() => navigate(`/vehicle/${params.row.id}`)}> <button title="Просмотр" onClick={() => navigate(`/vehicle/${params.row.id}`)}>
<Eye size={20} className="text-green-500" /> <Eye size={20} className="text-green-500" />
</button> </button>
{canWrite && ( {canWrite && (
<button <button
title="Удалить"
onClick={() => { onClick={() => {
setIsDeleteModalOpen(true); setIsDeleteModalOpen(true);
setRowId(params.row.id); setRowId(params.row.id);

View File

@@ -618,7 +618,7 @@ export const DevicesTable = observer(() => {
e.stopPropagation(); e.stopPropagation();
navigate(`/vehicle/${row.vehicle_id}/edit`); navigate(`/vehicle/${row.vehicle_id}/edit`);
}} }}
title="Редактировать транспорт" title="Редактировать"
> >
<Pencil size={16} /> <Pencil size={16} />
</button> </button>
@@ -628,7 +628,7 @@ export const DevicesTable = observer(() => {
e.stopPropagation(); e.stopPropagation();
handleReloadStatus(); handleReloadStatus();
}} }}
title="Перезапросить статус" title="Обновить статус"
disabled={ disabled={
!row.device_uuid || !devices.includes(row.device_uuid) !row.device_uuid || !devices.includes(row.device_uuid)
} }
@@ -655,7 +655,7 @@ export const DevicesTable = observer(() => {
setLogsModalOpen(true); setLogsModalOpen(true);
} }
}} }}
title="Логи устройства" title="Логи"
> >
<ScrollText size={16} /> <ScrollText size={16} />
</button> </button>
@@ -668,7 +668,7 @@ export const DevicesTable = observer(() => {
setSessionsModalVehicleTailNumber(row.tail_number); setSessionsModalVehicleTailNumber(row.tail_number);
setSessionsModalOpen(true); setSessionsModalOpen(true);
}} }}
title="Сессии ТО" title="Сессии обслуживания"
> >
<Wrench size={16} /> <Wrench size={16} />
</button> </button>

View File

@@ -87,12 +87,14 @@ export const SightsTable = observer(() => {
<TableCell align="center" className="py-3"> <TableCell align="center" className="py-3">
<div className="flex justify-center items-center gap-3"> <div className="flex justify-center items-center gap-3">
<button <button
title="Редактировать"
className="rounded-md px-3 py-1.5 transition-transform transform hover:scale-105" className="rounded-md px-3 py-1.5 transition-transform transform hover:scale-105"
onClick={() => navigate(`/sight/${row?.id}`)} onClick={() => navigate(`/sight/${row?.id}`)}
> >
<Pencil size={18} className="text-blue-500" /> <Pencil size={18} className="text-blue-500" />
</button> </button>
<button <button
title="Удалить"
className="rounded-md px-3 py-1.5 transition-transform transform hover:scale-105" className="rounded-md px-3 py-1.5 transition-transform transform hover:scale-105"
onClick={() => { onClick={() => {
setIsDeleteModalOpen(true); setIsDeleteModalOpen(true);