fix(ui): учитывать права на операции с серверами

This commit is contained in:
Denozordec committed 2026-09-21 15:00:13 +07:00
1 parent e9e5030047
commit 61950638bc
6 files changed
+121 -18

No files matched your search

@@ -22,11 +22,12 @@ const ROS_FEATURES = [
interface ServerExpandedDetailProps {
server: Server
isLive: boolean
canWrite: boolean
isPolling: boolean
onPoll: () => void
}
function ServerExpandedDetail({ server: s, isLive, isPolling, onPoll }: ServerExpandedDetailProps) {
function ServerExpandedDetail({ server: s, isLive, isPolling, canWrite, onPoll }: ServerExpandedDetailProps) {
const ver = rosVer(s.os)
return (
@@ -65,7 +66,7 @@ function ServerExpandedDetail({ server: s, isLive, isPolling, onPoll }: ServerEx
variant="outline"
size="sm"
className="h-7 gap-1.5 text-xs shrink-0"
disabled={isPolling}
disabled={!canWrite || isPolling}
onClick={(e) => { e.stopPropagation(); onPoll() }}
>
<RefreshCwIcon className={cn("size-3.5", isPolling && "animate-spin")} />
+12 -6
View File
@@ -84,6 +84,7 @@ function RosBadge({ os }: { os: string }) {
}
interface ServerRowActionsProps {
canWrite: boolean
busy: boolean
server: Server
isLive: boolean
@@ -95,6 +96,7 @@ interface ServerRowActionsProps {
}
function ServerRowActions({
canWrite,
busy,
server,
isLive,
@@ -137,22 +139,22 @@ function ServerRowActions({
<ExternalLinkIcon className="size-4" />
Открыть WebFig
</DropdownMenuItem>
<DropdownMenuItem onClick={() => onEdit(server)}>
<DropdownMenuItem disabled={!canWrite} onClick={() => onEdit(server)}>
<PencilIcon className="size-4" />
Редактировать
</DropdownMenuItem>
{isLive && (
<DropdownMenuItem onClick={() => onPoll(server.id)} disabled={isPolling}>
<DropdownMenuItem onClick={() => onPoll(server.id)} disabled={!canWrite || isPolling}>
<RefreshCwIcon className={cn("size-4", isPolling && "animate-spin")} />
{isPolling ? "Опрос…" : "Опросить"}
</DropdownMenuItem>
)}
<DropdownMenuItem onClick={() => onToggleStatus(server.id)}>
<DropdownMenuItem disabled={!canWrite} onClick={() => onToggleStatus(server.id)}>
<PowerIcon className="size-4" />
{server.enabled ? "Отключить" : "Включить"}
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem variant="destructive" onClick={() => onDelete(server.id)}>
<DropdownMenuItem disabled={!canWrite} variant="destructive" onClick={() => onDelete(server.id)}>
<Trash2Icon className="size-4" />
Удалить
</DropdownMenuItem>
@@ -164,6 +166,7 @@ function ServerRowActions({
interface ServersDataGridProps {
hasUnfilteredRows?: boolean
canWrite: boolean
busy?: boolean
servers: Server[]
isLive: boolean
@@ -175,6 +178,7 @@ interface ServersDataGridProps {
}
function ServersDataGrid({
canWrite,
hasUnfilteredRows = false,
busy = false,
servers,
@@ -224,6 +228,7 @@ function ServersDataGrid({
cellClassName: DATA_GRID_CELL_PAD_FIRST,
expandedContent: (row: Server) => (
<ServerExpandedDetail
canWrite={canWrite}
server={row}
isLive={isLive}
isPolling={pollingIds.has(row.id)}
@@ -346,6 +351,7 @@ function ServersDataGrid({
const s = row.original
return (
<ServerRowActions
canWrite={canWrite}
busy={busy}
server={s}
isLive={isLive}
@@ -365,7 +371,7 @@ function ServersDataGrid({
},
},
],
[busy, isLive, onDelete, onEdit, onPoll, onToggleStatus, pollingIds],
[canWrite, busy, isLive, onDelete, onEdit, onPoll, onToggleStatus, pollingIds],
)
const table = useTable({
@@ -382,7 +388,7 @@ function ServersDataGrid({
<EmptyState
icon={<ServerIcon className="size-4" />}
title={hasUnfilteredRows ? "Нет совпадений" : "Нет серверов"}
description={hasUnfilteredRows ? "Измените поиск или сбросьте фильтры" : "Добавьте первый MikroTik-сервер для мониторинга"}
description={hasUnfilteredRows ? "Измените поиск или сбросьте фильтры" : canWrite ? "Добавьте первый MikroTik-сервер для мониторинга" : "Серверов нет. Добавление доступно пользователю с правом записи."}
className="border-0 py-12"
/>
)