From efb613b0b5d1522ae892202247ea6186c77095d4 Mon Sep 17 00:00:00 2001 From: sagitchu Date: Sun, 15 Mar 2026 23:31:39 +0800 Subject: [PATCH] Fix TypeScript compilation errors - Add isIndeterminate support to Checkbox component - Use showAddressModal in SortableTableRow for multi-address display - Remove unused onClose parameter in search modal - Remove unused infoPopoverPlacement and related code in node.tsx --- vite-frontend/src/components/ui/checkbox.tsx | 9 ++-- vite-frontend/src/pages/forward.tsx | 48 ++++++++----------- vite-frontend/src/pages/node.tsx | 36 -------------- .../src/shadcn-bridge/heroui/checkbox.tsx | 8 +++- 4 files changed, 33 insertions(+), 68 deletions(-) diff --git a/vite-frontend/src/components/ui/checkbox.tsx b/vite-frontend/src/components/ui/checkbox.tsx index 118cbcd..3b2b76e 100644 --- a/vite-frontend/src/components/ui/checkbox.tsx +++ b/vite-frontend/src/components/ui/checkbox.tsx @@ -1,6 +1,6 @@ import * as React from "react"; import * as CheckboxPrimitive from "@radix-ui/react-checkbox"; -import { CheckIcon } from "lucide-react"; +import { CheckIcon, MinusIcon } from "lucide-react"; import { cn } from "@/lib/utils"; @@ -11,17 +11,18 @@ function Checkbox({ return ( - + + ); diff --git a/vite-frontend/src/pages/forward.tsx b/vite-frontend/src/pages/forward.tsx index 56d0e56..359c2e8 100644 --- a/vite-frontend/src/pages/forward.tsx +++ b/vite-frontend/src/pages/forward.tsx @@ -784,44 +784,38 @@ const SortableTableRow = ({ -
{ - e.stopPropagation(); - copyToClipboard( - (forward.inIp || "").replace(/:\d+$/, "") || "默认IP", - "入口地址", - ); + title={formatInAddress(forward.inIp, forward.inPort)} + onClick={() => { + if (hasMultipleAddresses(forward.inIp)) { + showAddressModal(forward.inIp, forward.inPort, "入口端口"); + } }} > {formatInAddress(forward.inIp, forward.inPort)} -
+
-
{ - e.stopPropagation(); - copyToClipboard( - forward.remoteAddr.split(",")[0].split(":")[0], - "落地地址", - ); + title={formatRemoteAddress(forward.remoteAddr)} + onClick={() => { + if (hasMultipleAddresses(forward.remoteAddr)) { + showAddressModal(forward.remoteAddr, null, "目标地址"); + } }} > {formatRemoteAddress(forward.remoteAddr)} -
+
- {(onClose) => ( + {() => ( <> 搜索筛选用户规则 diff --git a/vite-frontend/src/pages/node.tsx b/vite-frontend/src/pages/node.tsx index 094b57e..b98733d 100644 --- a/vite-frontend/src/pages/node.tsx +++ b/vite-frontend/src/pages/node.tsx @@ -374,40 +374,6 @@ export default function NodePage() { const [upgradeProgress, setUpgradeProgress] = useState< Record >({}); - const [infoPopoverPlacement, setInfoPopoverPlacement] = useState< - Record - >({}); - - const updateInfoPopoverPlacement = useCallback( - (nodeId: number, triggerElement: HTMLElement | null) => { - if (!triggerElement) { - return; - } - - const rect = triggerElement.getBoundingClientRect(); - const cardElement = triggerElement.closest("[data-node-card='true']"); - const cardRect = - cardElement instanceof HTMLElement - ? cardElement.getBoundingClientRect() - : null; - const estimatedPanelWidth = 288; - const containerPadding = 16; - const availableLeftSpace = cardRect - ? rect.left - cardRect.left - : rect.left; - const nextPlacement: "left" | "bottom" = - availableLeftSpace >= estimatedPanelWidth + containerPadding - ? "left" - : "bottom"; - - setInfoPopoverPlacement((prev) => - prev[nodeId] === nextPlacement - ? prev - : { ...prev, [nodeId]: nextPlacement }, - ); - }, - [], - ); const handleNodeOffline = useCallback((nodeId: number) => { setNodeList((prev) => @@ -1744,8 +1710,6 @@ export default function NodePage() { !node.expiryReminderDismissed, ); const hasInfoTrigger = hasRemark || hasExpiryInfo; - const infoCount = Number(hasExpiryInfo) + Number(hasRemark); - const infoPlacement = infoPopoverPlacement[node.id] ?? "left"; return ( diff --git a/vite-frontend/src/shadcn-bridge/heroui/checkbox.tsx b/vite-frontend/src/shadcn-bridge/heroui/checkbox.tsx index 158271a..8632da5 100644 --- a/vite-frontend/src/shadcn-bridge/heroui/checkbox.tsx +++ b/vite-frontend/src/shadcn-bridge/heroui/checkbox.tsx @@ -11,6 +11,7 @@ export interface CheckboxProps classNames?: Record; color?: string; isDisabled?: boolean; + isIndeterminate?: boolean; isSelected?: boolean; onValueChange?: (value: boolean) => void; size?: string; @@ -20,6 +21,7 @@ export function Checkbox({ children, className, isDisabled, + isIndeterminate, isSelected, onValueChange, ...props @@ -32,6 +34,10 @@ export function Checkbox({ onValueChange?.(value === true); }; + const checkedValue: boolean | "indeterminate" = isIndeterminate + ? "indeterminate" + : Boolean(isSelected); + return (