fix(ui): учитывать права на операции с серверами
This commit is contained in:
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")} />
|
||||
|
||||
@@ -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"
|
||||
/>
|
||||
)
|
||||
|
||||
Reference in new issue
Block a user