Skip to content

Commit 8858d2b

Browse files
committed
feat: add TeamMemberPage and enhance team management features
- Introduced TeamMemberPage for managing team members with protected routing. - Updated TeamColumns to include a button for navigating to the members page with a tooltip. - Enhanced TeamPage to facilitate navigation to the members section. - Added new types for team members to improve type safety and clarity in the codebase. - Updated toast removal delay for better user experience. - Remove git2 from Cargo.toml
1 parent 588d14d commit 8858d2b

File tree

9 files changed

+409
-22
lines changed

9 files changed

+409
-22
lines changed

src-tauri/Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src-tauri/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mcp-linker"
3-
version = "1.3.0"
3+
version = "1.3.1"
44
description = "Easily connect and manage MCP servers for Claude and other clients"
55
authors = ["milisp"]
66
edition = "2021"
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
"use client";
2+
3+
import { Button } from "@/components/ui/button";
4+
import { Input } from "@/components/ui/input";
5+
import { Label } from "@/components/ui/label";
6+
import {
7+
Select,
8+
SelectContent,
9+
SelectItem,
10+
SelectTrigger,
11+
SelectValue,
12+
} from "@/components/ui/select";
13+
import { AddTeamMemberData, TeamMemberRole } from "@/types/team";
14+
import { Mail, Plus } from "lucide-react";
15+
import { useState } from "react";
16+
17+
interface AddTeamMemberFormProps {
18+
onAddMember: (newMember: AddTeamMemberData) => void;
19+
isAddingMember: boolean;
20+
}
21+
22+
export function AddTeamMemberForm({
23+
onAddMember,
24+
isAddingMember,
25+
}: AddTeamMemberFormProps) {
26+
const [newMemberData, setNewMemberData] = useState<AddTeamMemberData>({
27+
email: "",
28+
role: "member",
29+
});
30+
31+
const handleAddClick = () => {
32+
onAddMember(newMemberData);
33+
};
34+
35+
return (
36+
<div className="border rounded-lg p-4 space-y-4">
37+
<h3 className="font-medium flex items-center gap-2">
38+
<Plus className="h-4 w-4" />
39+
Add New Member
40+
</h3>
41+
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
42+
<div className="md:col-span-2">
43+
<Label htmlFor="email">Email Address</Label>
44+
<Input
45+
id="email"
46+
type="email"
47+
placeholder="Enter member's email"
48+
value={newMemberData.email}
49+
onChange={(e) =>
50+
setNewMemberData((prev) => ({ ...prev, email: e.target.value }))
51+
}
52+
/>
53+
</div>
54+
<div>
55+
<Label htmlFor="role">Role</Label>
56+
<Select
57+
value={newMemberData.role}
58+
onValueChange={(value: TeamMemberRole) =>
59+
setNewMemberData((prev) => ({ ...prev, role: value }))
60+
}
61+
>
62+
<SelectTrigger>
63+
<SelectValue />
64+
</SelectTrigger>
65+
<SelectContent>
66+
<SelectItem value="member">Member</SelectItem>
67+
<SelectItem value="admin">Admin</SelectItem>
68+
</SelectContent>
69+
</Select>
70+
</div>
71+
</div>
72+
<Button
73+
onClick={handleAddClick}
74+
disabled={isAddingMember || !newMemberData.email.trim()}
75+
className="w-full md:w-auto"
76+
>
77+
<Mail className="mr-2 h-4 w-4" />
78+
{isAddingMember ? "Adding..." : "Add Member"}
79+
</Button>
80+
</div>
81+
);
82+
}

src/components/team/TeamColumns.tsx

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,26 @@ import {
1010
AlertDialogTrigger,
1111
} from "@/components/ui/alert-dialog";
1212
import { Button } from "@/components/ui/button";
13+
import {
14+
Tooltip,
15+
TooltipContent,
16+
TooltipProvider,
17+
TooltipTrigger,
18+
} from "@/components/ui/tooltip";
19+
import { TeamResponse } from "@/types/team";
1320
import { ColumnDef } from "@tanstack/react-table";
14-
import { Pencil, Trash2 } from "lucide-react";
15-
import { TeamResponse } from "../../types/team";
21+
import { Pencil, Trash2, User2 } from "lucide-react";
1622

1723
interface TeamColumnsProps {
1824
onEdit: (team: TeamResponse) => void;
1925
onDelete: (teamId: string) => void;
26+
navigateToMembers: (teamId: string) => void;
2027
}
2128

2229
export function useTeamColumns({
2330
onEdit,
2431
onDelete,
32+
navigateToMembers,
2533
}: TeamColumnsProps): ColumnDef<TeamResponse>[] {
2634
return [
2735
{
@@ -62,33 +70,37 @@ export function useTeamColumns({
6270
header: "Actions",
6371
cell: ({ row }) => {
6472
const team = row.original;
65-
73+
6674
return (
6775
<div className="flex gap-2">
68-
<Button
69-
variant="outline"
70-
size="sm"
71-
onClick={() => onEdit(team)}
72-
>
76+
{/* Manage Members Button */}
77+
<TooltipProvider>
78+
<Tooltip>
79+
<TooltipTrigger asChild>
80+
<Button
81+
variant="secondary"
82+
size="sm"
83+
onClick={() => navigateToMembers(team.id)}
84+
>
85+
<User2 className="mr-1 h-4 w-4" />
86+
</Button>
87+
</TooltipTrigger>
88+
<TooltipContent>Manage Members</TooltipContent>
89+
</Tooltip>
90+
</TooltipProvider>
91+
<Button variant="outline" size="sm" onClick={() => onEdit(team)}>
7392
<Pencil className="mr-1 h-4 w-4" />
74-
Edit
7593
</Button>
76-
94+
7795
<AlertDialog>
7896
<AlertDialogTrigger asChild>
79-
<Button
80-
variant="destructive"
81-
size="sm"
82-
>
97+
<Button variant="destructive" size="sm">
8398
<Trash2 className="mr-1 h-4 w-4" />
84-
Delete
8599
</Button>
86100
</AlertDialogTrigger>
87101
<AlertDialogContent>
88102
<AlertDialogHeader>
89-
<AlertDialogTitle>
90-
Are you absolutely sure?
91-
</AlertDialogTitle>
103+
<AlertDialogTitle>Are you absolutely sure?</AlertDialogTitle>
92104
<AlertDialogDescription>
93105
This action cannot be undone. This will permanently delete
94106
the team "{team.name}" and all associated data.

src/hooks/use-toast.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import * as React from "react";
66
import type { ToastActionElement, ToastProps } from "@/components/ui/toast";
77

88
const TOAST_LIMIT = 1;
9-
const TOAST_REMOVE_DELAY = 1000000;
9+
const TOAST_REMOVE_DELAY = 5000;
1010

1111
type ToasterToast = ToastProps & {
1212
id: string;
@@ -188,4 +188,5 @@ function useToast() {
188188
};
189189
}
190190

191-
export { useToast, toast };
191+
export { toast, useToast };
192+

0 commit comments

Comments
 (0)