refactor: improve TeamDetailView and MemberList components for better responsiveness and UI clarity
- Removed unnecessary inline styles from TeamDetailView for cleaner code. - Added responsive grid layout to MemberList using ResizeObserver to adjust the display based on container width. - Integrated tooltip functionality in LimitContextCheckbox to provide context on token limits, enhancing user experience.
This commit is contained in:
parent
71045841e1
commit
05457aca0d
3 changed files with 47 additions and 12 deletions
|
|
@ -1125,14 +1125,7 @@ export const TeamDetailView = ({ teamName }: TeamDetailViewProps): React.JSX.Ele
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div
|
<div className="relative -mx-4 -mt-4 mb-3 overflow-hidden border-b border-[var(--color-border)] px-4 py-3">
|
||||||
className="relative -mx-4 -mt-4 mb-3 overflow-hidden border-b border-[var(--color-border)] px-4 py-3"
|
|
||||||
style={
|
|
||||||
headerColorSet
|
|
||||||
? { borderLeftWidth: '3px', borderLeftColor: headerColorSet.border }
|
|
||||||
: undefined
|
|
||||||
}
|
|
||||||
>
|
|
||||||
{headerColorSet ? (
|
{headerColorSet ? (
|
||||||
<div
|
<div
|
||||||
className="pointer-events-none absolute inset-0 z-0"
|
className="pointer-events-none absolute inset-0 z-0"
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,15 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
|
import { Info } from 'lucide-react';
|
||||||
|
|
||||||
import { Checkbox } from '@renderer/components/ui/checkbox';
|
import { Checkbox } from '@renderer/components/ui/checkbox';
|
||||||
import { Label } from '@renderer/components/ui/label';
|
import { Label } from '@renderer/components/ui/label';
|
||||||
|
import {
|
||||||
|
Tooltip,
|
||||||
|
TooltipContent,
|
||||||
|
TooltipProvider,
|
||||||
|
TooltipTrigger,
|
||||||
|
} from '@renderer/components/ui/tooltip';
|
||||||
|
|
||||||
interface LimitContextCheckboxProps {
|
interface LimitContextCheckboxProps {
|
||||||
id: string;
|
id: string;
|
||||||
|
|
@ -32,5 +40,20 @@ export const LimitContextCheckbox: React.FC<LimitContextCheckboxProps> = ({
|
||||||
Limit context to 200K tokens
|
Limit context to 200K tokens
|
||||||
{disabled && <span className="text-[10px] italic">(always 200K for this model)</span>}
|
{disabled && <span className="text-[10px] italic">(always 200K for this model)</span>}
|
||||||
</Label>
|
</Label>
|
||||||
|
<TooltipProvider delayDuration={200}>
|
||||||
|
<Tooltip>
|
||||||
|
<TooltipTrigger asChild>
|
||||||
|
<Info
|
||||||
|
className={`size-3.5 shrink-0 ${disabled ? 'text-text-muted opacity-50' : 'text-text-muted hover:text-text-secondary'} cursor-help`}
|
||||||
|
/>
|
||||||
|
</TooltipTrigger>
|
||||||
|
<TooltipContent side="top" className="max-w-[260px]">
|
||||||
|
<p>
|
||||||
|
Agents will use 200K context window instead of the default 1M. Useful if you want to
|
||||||
|
save tokens and reduce costs.
|
||||||
|
</p>
|
||||||
|
</TooltipContent>
|
||||||
|
</Tooltip>
|
||||||
|
</TooltipProvider>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import { useStore } from '@renderer/store';
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
||||||
|
|
||||||
import { buildMemberColorMap } from '@renderer/utils/memberHelpers';
|
import { buildMemberColorMap } from '@renderer/utils/memberHelpers';
|
||||||
|
|
||||||
import { MemberCard } from './MemberCard';
|
import { MemberCard } from './MemberCard';
|
||||||
|
|
@ -45,8 +46,26 @@ export const MemberList = ({
|
||||||
onAssignTask,
|
onAssignTask,
|
||||||
onOpenTask,
|
onOpenTask,
|
||||||
}: MemberListProps): React.JSX.Element => {
|
}: MemberListProps): React.JSX.Element => {
|
||||||
const sidebarCollapsed = useStore((s) => s.sidebarCollapsed);
|
const containerRef = useRef<HTMLDivElement>(null);
|
||||||
const gridClass = sidebarCollapsed ? 'grid grid-cols-2 gap-1' : 'grid grid-cols-1 gap-1';
|
const [isWide, setIsWide] = useState(false);
|
||||||
|
|
||||||
|
const handleResize = useCallback((entries: ResizeObserverEntry[]) => {
|
||||||
|
const entry = entries[0];
|
||||||
|
if (entry) {
|
||||||
|
setIsWide(entry.contentRect.width > 1000);
|
||||||
|
}
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const el = containerRef.current;
|
||||||
|
if (!el) return;
|
||||||
|
|
||||||
|
const observer = new ResizeObserver(handleResize);
|
||||||
|
observer.observe(el);
|
||||||
|
return () => observer.disconnect();
|
||||||
|
}, [handleResize]);
|
||||||
|
|
||||||
|
const gridClass = isWide ? 'grid grid-cols-2 gap-1' : 'grid grid-cols-1 gap-1';
|
||||||
const activeMembers = members
|
const activeMembers = members
|
||||||
.filter((m) => !m.removedAt)
|
.filter((m) => !m.removedAt)
|
||||||
.sort((a, b) => {
|
.sort((a, b) => {
|
||||||
|
|
@ -106,7 +125,7 @@ export const MemberList = ({
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col gap-1">
|
<div ref={containerRef} className="flex flex-col gap-1">
|
||||||
<div className={gridClass}>{activeMembers.map((member) => renderCard(member, false))}</div>
|
<div className={gridClass}>{activeMembers.map((member) => renderCard(member, false))}</div>
|
||||||
{removedMembers.length > 0 && (
|
{removedMembers.length > 0 && (
|
||||||
<>
|
<>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue