mirror of
https://github.com/fankes/beszel.git
synced 2025-10-19 01:39:34 +08:00
update
This commit is contained in:
@@ -36,28 +36,14 @@ import {
|
|||||||
ArrowUpIcon,
|
ArrowUpIcon,
|
||||||
Settings2Icon,
|
Settings2Icon,
|
||||||
EyeIcon,
|
EyeIcon,
|
||||||
PenBoxIcon,
|
|
||||||
ClockIcon,
|
|
||||||
FilterIcon,
|
FilterIcon,
|
||||||
HourglassIcon,
|
|
||||||
} from "lucide-react"
|
} from "lucide-react"
|
||||||
import { memo, useEffect, useMemo, useState } from "react"
|
import { memo, useEffect, useMemo, useState } from "react"
|
||||||
import { $systems } from "@/lib/stores"
|
import { $systems } from "@/lib/stores"
|
||||||
import { useStore } from "@nanostores/react"
|
import { useStore } from "@nanostores/react"
|
||||||
import {
|
import { cn, useLocalStorage } from "@/lib/utils"
|
||||||
cn,
|
import { $router, Link } from "../router"
|
||||||
copyToClipboard,
|
import { useLingui, Trans } from "@lingui/react/macro"
|
||||||
isReadOnlyUser,
|
|
||||||
useLocalStorage,
|
|
||||||
formatTemperature,
|
|
||||||
decimalString,
|
|
||||||
formatBytes,
|
|
||||||
formatUptimeString,
|
|
||||||
} from "@/lib/utils"
|
|
||||||
import AlertsButton from "../alerts/alert-button"
|
|
||||||
import { $router, Link, navigate } from "../router"
|
|
||||||
import { EthernetIcon, GpuIcon, ThermometerIcon } from "../ui/icons"
|
|
||||||
import { useLingui, Trans, Plural } from "@lingui/react/macro"
|
|
||||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../ui/card"
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../ui/card"
|
||||||
import { Input } from "@/components/ui/input"
|
import { Input } from "@/components/ui/input"
|
||||||
import { getPagePath } from "@nanostores/router"
|
import { getPagePath } from "@nanostores/router"
|
||||||
@@ -136,8 +122,9 @@ export default function SystemsTable() {
|
|||||||
<Trans>Updated in real time. Click on a system to view information.</Trans>
|
<Trans>Updated in real time. Click on a system to view information.</Trans>
|
||||||
</CardDescription>
|
</CardDescription>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex gap-2 ms-auto w-full md:w-auto">
|
|
||||||
<Input placeholder={t`Filter...`} onChange={(e) => setFilter(e.target.value)} className="px-4 w-full md:w-80" />
|
<div className="flex gap-2 ms-auto w-full md:w-80">
|
||||||
|
<Input placeholder={t`Filter...`} onChange={(e) => setFilter(e.target.value)} className="px-4" />
|
||||||
<DropdownMenu>
|
<DropdownMenu>
|
||||||
<DropdownMenuTrigger asChild>
|
<DropdownMenuTrigger asChild>
|
||||||
<Button variant="outline">
|
<Button variant="outline">
|
||||||
@@ -147,7 +134,7 @@ export default function SystemsTable() {
|
|||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent align="end" className="h-72 md:h-auto min-w-48 md:min-w-auto overflow-y-auto">
|
<DropdownMenuContent align="end" className="h-72 md:h-auto min-w-48 md:min-w-auto overflow-y-auto">
|
||||||
<div className="grid grid-cols-1 md:grid-cols-4 divide-y md:divide-s md:divide-y-0">
|
<div className="grid grid-cols-1 md:grid-cols-4 divide-y md:divide-s md:divide-y-0">
|
||||||
<div>
|
<div className="border-r">
|
||||||
<DropdownMenuLabel className="pt-2 px-3.5 flex items-center gap-2">
|
<DropdownMenuLabel className="pt-2 px-3.5 flex items-center gap-2">
|
||||||
<LayoutGridIcon className="size-4" />
|
<LayoutGridIcon className="size-4" />
|
||||||
<Trans>Layout</Trans>
|
<Trans>Layout</Trans>
|
||||||
@@ -169,7 +156,7 @@ export default function SystemsTable() {
|
|||||||
</DropdownMenuRadioGroup>
|
</DropdownMenuRadioGroup>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div className="border-r">
|
||||||
<DropdownMenuLabel className="pt-2 px-3.5 flex items-center gap-2">
|
<DropdownMenuLabel className="pt-2 px-3.5 flex items-center gap-2">
|
||||||
<FilterIcon className="size-4" />
|
<FilterIcon className="size-4" />
|
||||||
<Trans>Status</Trans>
|
<Trans>Status</Trans>
|
||||||
@@ -180,22 +167,22 @@ export default function SystemsTable() {
|
|||||||
value={statusFilter}
|
value={statusFilter}
|
||||||
onValueChange={(value) => setStatusFilter(value as StatusFilter)}
|
onValueChange={(value) => setStatusFilter(value as StatusFilter)}
|
||||||
>
|
>
|
||||||
<DropdownMenuRadioItem value="all" onSelect={(e) => e.preventDefault()} className="gap-2">
|
<DropdownMenuRadioItem value="all" onSelect={(e) => e.preventDefault()}>
|
||||||
<Trans>All Systems</Trans>
|
<Trans>All Systems</Trans>
|
||||||
</DropdownMenuRadioItem>
|
</DropdownMenuRadioItem>
|
||||||
<DropdownMenuRadioItem value="up" onSelect={(e) => e.preventDefault()} className="gap-2">
|
<DropdownMenuRadioItem value="up" onSelect={(e) => e.preventDefault()}>
|
||||||
<Trans>Up</Trans>
|
<Trans>Up</Trans>
|
||||||
</DropdownMenuRadioItem>
|
</DropdownMenuRadioItem>
|
||||||
<DropdownMenuRadioItem value="down" onSelect={(e) => e.preventDefault()} className="gap-2">
|
<DropdownMenuRadioItem value="down" onSelect={(e) => e.preventDefault()}>
|
||||||
<Trans>Down</Trans>
|
<Trans>Down</Trans>
|
||||||
</DropdownMenuRadioItem>
|
</DropdownMenuRadioItem>
|
||||||
<DropdownMenuRadioItem value="paused" onSelect={(e) => e.preventDefault()} className="gap-2">
|
<DropdownMenuRadioItem value="paused" onSelect={(e) => e.preventDefault()}>
|
||||||
<Trans>Paused</Trans>
|
<Trans>Paused</Trans>
|
||||||
</DropdownMenuRadioItem>
|
</DropdownMenuRadioItem>
|
||||||
</DropdownMenuRadioGroup>
|
</DropdownMenuRadioGroup>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div className="border-r">
|
||||||
<DropdownMenuLabel className="pt-2 px-3.5 flex items-center gap-2">
|
<DropdownMenuLabel className="pt-2 px-3.5 flex items-center gap-2">
|
||||||
<ArrowUpDownIcon className="size-4" />
|
<ArrowUpDownIcon className="size-4" />
|
||||||
<Trans>Sort By</Trans>
|
<Trans>Sort By</Trans>
|
||||||
@@ -409,7 +396,9 @@ const SystemCard = memo(
|
|||||||
<div key={column.id} className="flex items-center gap-3">
|
<div key={column.id} className="flex items-center gap-3">
|
||||||
{column.id === "lastSeen" ? (
|
{column.id === "lastSeen" ? (
|
||||||
<EyeIcon className="size-4 text-muted-foreground" />
|
<EyeIcon className="size-4 text-muted-foreground" />
|
||||||
) : Icon && <Icon className="size-4 text-muted-foreground" />}
|
) : (
|
||||||
|
Icon && <Icon className="size-4 text-muted-foreground" />
|
||||||
|
)}
|
||||||
<div className="flex items-center gap-3 flex-1">
|
<div className="flex items-center gap-3 flex-1">
|
||||||
<span className="text-muted-foreground min-w-16">{name()}:</span>
|
<span className="text-muted-foreground min-w-16">{name()}:</span>
|
||||||
<div className="flex-1">{flexRender(cell.column.columnDef.cell, cell.getContext())}</div>
|
<div className="flex-1">{flexRender(cell.column.columnDef.cell, cell.getContext())}</div>
|
||||||
|
@@ -79,7 +79,7 @@ const DropdownMenuItem = React.forwardRef<
|
|||||||
<DropdownMenuPrimitive.Item
|
<DropdownMenuPrimitive.Item
|
||||||
ref={ref}
|
ref={ref}
|
||||||
className={cn(
|
className={cn(
|
||||||
"relative flex select-none items-center rounded-sm px-2.5 py-1.5 text-sm outline-hidden focus:bg-accent/70 focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50",
|
"cursor-pointer relative flex select-none items-center rounded-sm px-2.5 py-1.5 text-sm outline-hidden focus:bg-accent/70 focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50",
|
||||||
inset && "ps-8",
|
inset && "ps-8",
|
||||||
className
|
className
|
||||||
)}
|
)}
|
||||||
@@ -95,7 +95,7 @@ const DropdownMenuCheckboxItem = React.forwardRef<
|
|||||||
<DropdownMenuPrimitive.CheckboxItem
|
<DropdownMenuPrimitive.CheckboxItem
|
||||||
ref={ref}
|
ref={ref}
|
||||||
className={cn(
|
className={cn(
|
||||||
"relative flex select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-hidden focus:bg-accent/70 focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50",
|
"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 ps-8 pe-2.5 text-sm outline-hidden focus:bg-accent/70 focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50",
|
||||||
className
|
className
|
||||||
)}
|
)}
|
||||||
checked={checked}
|
checked={checked}
|
||||||
@@ -118,7 +118,7 @@ const DropdownMenuRadioItem = React.forwardRef<
|
|||||||
<DropdownMenuPrimitive.RadioItem
|
<DropdownMenuPrimitive.RadioItem
|
||||||
ref={ref}
|
ref={ref}
|
||||||
className={cn(
|
className={cn(
|
||||||
"relative flex cursor-default select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-hidden focus:bg-accent/70 focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50",
|
"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 ps-8 pe-2.5 text-sm outline-hidden focus:bg-accent/70 focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50",
|
||||||
className
|
className
|
||||||
)}
|
)}
|
||||||
{...props}
|
{...props}
|
||||||
|
Reference in New Issue
Block a user