diff --git a/src/components/Dashboard/IntegrationList/index.tsx b/src/components/Dashboard/IntegrationList/index.tsx index 05356a04..baf644b9 100644 --- a/src/components/Dashboard/IntegrationList/index.tsx +++ b/src/components/Dashboard/IntegrationList/index.tsx @@ -14,10 +14,10 @@ import { fetchGet, fetchPost } from '@/api/http'; import { Button } from '@/components/ui/button'; +import { Checkbox } from '@/components/ui/checkbox'; import { Tooltip, TooltipContent, - TooltipSimple, TooltipTrigger, } from '@/components/ui/tooltip'; import { CircleAlert, Settings2 } from 'lucide-react'; @@ -36,6 +36,7 @@ import { } from '@/hooks/useIntegrationManagement'; import { getProxyBaseURL } from '@/lib'; import { OAuth } from '@/lib/oauth'; +import { cn } from '@/lib/utils'; import { MCPEnvDialog } from '@/pages/Connectors/components/MCPEnvDialog'; import React, { useCallback, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -65,6 +66,11 @@ interface IntegrationListProps { installedKeys?: string[]; oauth?: OAuth | null; translationNamespace?: 'layout' | 'setting'; // For translation keys + className?: string; + /** Select mode: show a leading checkbox; use isIntegrationSelected + onToggleIntegration */ + selectWithCheckbox?: boolean; + isIntegrationSelected?: (item: IntegrationItem) => boolean; + onToggleIntegration?: (item: IntegrationItem, selected: boolean) => void; } export default function IntegrationList({ @@ -84,6 +90,10 @@ export default function IntegrationList({ installedKeys: _installedKeys = [], oauth: _oauth, translationNamespace = variant === 'select' ? 'layout' : 'setting', + className: rootClassName, + selectWithCheckbox = false, + isIntegrationSelected, + onToggleIntegration, }: IntegrationListProps) { const { t } = useTranslation(); const [showEnvConfig, setShowEnvConfig] = useState(false); @@ -294,15 +304,15 @@ export default function IntegrationList({ : 'flex flex-col w-full items-start justify-start gap-4'; const itemClassName = isSelectMode - ? 'cursor-pointer hover:bg-ds-bg-neutral-default-hover px-3 py-2 flex justify-between' + ? 'cursor-pointer gap-2 rounded-lg bg-ds-bg-neutral-subtle-default px-3 py-2 min-h-0 flex w-full items-center justify-between hover:bg-ds-bg-neutral-default-hover' : 'w-full px-6 py-4 bg-ds-bg-neutral-subtle-default rounded-2xl'; const titleClassName = isSelectMode - ? 'text-base leading-snug font-bold text-ds-text-brand-default-default' + ? 'min-w-0 flex-1 text-sm font-bold leading-5 text-ds-text-neutral-default-default sm:text-base line-clamp-2 break-words' : 'text-label-lg font-bold text-ds-text-neutral-default-default'; return ( -