Skip to content

Commit 035fcf6

Browse files
committed
[TOOL-3493] Dashboard: Fix search in team members page, minor ui tweaks (#6309)
<!-- start pr-codex --> ## PR-Codex overview This PR focuses on enhancing the member management functionality by adding search capabilities to filter team members and invites based on a search term. It introduces new state variables and updates components to utilize these features. ### Detailed summary - Added `searchTerm`, `setSearchTerm`, and `searchPlaceholder` to relevant components. - Updated the `Input` component to use `searchTerm` and `setSearchTerm`. - Implemented filtering logic for invites and members based on `searchTerm`. - Replaced `GradientAvatar` with `Badge` in `TeamSettingsSidebar`. > ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}` <!-- end pr-codex -->
1 parent 7775e7c commit 035fcf6

File tree

4 files changed

+38
-14
lines changed

4 files changed

+38
-14
lines changed

apps/dashboard/src/app/team/[team_slug]/(team)/~/settings/_components/sidebar/TeamSettingsSidebar.tsx

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { Team } from "@/api/team";
2-
import { GradientAvatar } from "@/components/blocks/Avatars/GradientAvatar";
2+
import { Badge } from "@/components/ui/badge";
33
import type { Account } from "@3rdweb-sdk/react/hooks/useApi";
44
import type { ThirdwebClient } from "thirdweb";
55
import { SidebarLink } from "./SidebarLink";
@@ -57,14 +57,13 @@ function RenderLinkGroup(props: {
5757
}) {
5858
return (
5959
<>
60-
<div className="flex items-center gap-1.5 px-4">
61-
<GradientAvatar
62-
src={props.titleAvatarIcon.src}
63-
className="size-[18px]"
64-
id={props.titleAvatarIcon.id}
65-
client={props.client}
66-
/>
67-
<p className="text-muted-foreground text-xs">{props.title}</p>
60+
<div className="px-2">
61+
<Badge
62+
variant="outline"
63+
className="bg-card font-normal text-muted-foreground"
64+
>
65+
{props.title}
66+
</Badge>
6867
</div>
6968

7069
<ul className="flex flex-col gap-0.5">

apps/dashboard/src/app/team/[team_slug]/(team)/~/settings/members/ManageInvitesSection.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,20 @@ export function ManageInvitesSection(props: {
3939
}) {
4040
let topSection: React.ReactNode = null;
4141

42+
const [searchTerm, setSearchTerm] = useState("");
4243
const [deletedInviteIds, setDeletedInviteIds] = useState<string[]>([]);
4344
const [role, setRole] = useState<RoleFilterValue>("ALL ROLES");
4445
const [sortBy, setSortBy] = useState<MemberSortId>("date");
4546

4647
const invitesToShow = useMemo(() => {
4748
let value = props.teamInvites;
4849

50+
if (searchTerm) {
51+
value = value.filter((inv) =>
52+
inv.email.toLowerCase().includes(searchTerm.toLowerCase()),
53+
);
54+
}
55+
4956
value = value.filter((inv) => !deletedInviteIds.includes(inv.id));
5057

5158
if (role !== "ALL ROLES") {
@@ -68,7 +75,7 @@ export function ManageInvitesSection(props: {
6875
}
6976

7077
return value;
71-
}, [role, props.teamInvites, sortBy, deletedInviteIds]);
78+
}, [role, props.teamInvites, sortBy, deletedInviteIds, searchTerm]);
7279

7380
if (!props.userHasEditPermission) {
7481
topSection = (
@@ -89,6 +96,9 @@ export function ManageInvitesSection(props: {
8996
setRole={setRole}
9097
setSortBy={setSortBy}
9198
sortBy={sortBy}
99+
searchTerm={searchTerm}
100+
setSearchTerm={setSearchTerm}
101+
searchPlaceholder="Search Email"
92102
/>
93103

94104
<div className="h-3" />

apps/dashboard/src/app/team/[team_slug]/(team)/~/settings/members/ManageMembersSection.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,20 @@ export function ManageMembersSection(props: {
3636
}) {
3737
let topSection: React.ReactNode = null;
3838

39+
const [searchTerm, setSearchTerm] = useState("");
3940
const [deletedMembersIds, setDeletedMembersIds] = useState<string[]>([]);
4041
const [role, setRole] = useState<RoleFilterValue>("ALL ROLES");
4142
const [sortBy, setSortBy] = useState<MemberSortId>("date");
4243

4344
const membersToShow = useMemo(() => {
4445
let value = props.members;
4546

47+
if (searchTerm) {
48+
value = value.filter((m) =>
49+
m.account.name.toLowerCase().includes(searchTerm.toLowerCase()),
50+
);
51+
}
52+
4653
value = value.filter((m) => !deletedMembersIds.includes(m.accountId));
4754

4855
if (role !== "ALL ROLES") {
@@ -69,7 +76,7 @@ export function ManageMembersSection(props: {
6976
}
7077

7178
return value;
72-
}, [role, props.members, sortBy, deletedMembersIds]);
79+
}, [role, props.members, sortBy, deletedMembersIds, searchTerm]);
7380

7481
if (!props.userHasEditPermission) {
7582
topSection = (
@@ -90,6 +97,9 @@ export function ManageMembersSection(props: {
9097
setRole={setRole}
9198
setSortBy={setSortBy}
9299
sortBy={sortBy}
100+
searchTerm={searchTerm}
101+
setSearchTerm={setSearchTerm}
102+
searchPlaceholder="Search Team Members"
93103
/>
94104

95105
<div className="h-3" />
@@ -147,7 +157,7 @@ function MemberRow(props: {
147157
<div className="flex items-center justify-between gap-3 px-4 py-4">
148158
<div className="flex items-center gap-3 lg:gap-4">
149159
<GradientAvatar
150-
className="size-6 lg:size-9"
160+
className="size-6 border lg:size-9"
151161
src={props.member.account.image || ""}
152162
id={props.member.account.creatorWalletAddress}
153163
client={props.client}

apps/dashboard/src/app/team/[team_slug]/(team)/~/settings/members/_common.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,22 @@ export function FiltersSection(props: {
2020
setRole: (role: RoleFilterValue) => void;
2121
setSortBy: (sortBy: MemberSortId) => void;
2222
sortBy: MemberSortId;
23+
searchTerm: string;
24+
setSearchTerm: (searchTerm: string) => void;
25+
searchPlaceholder: string;
2326
}) {
24-
const { role, setRole, setSortBy, sortBy } = props;
27+
const { role, setRole, setSortBy, sortBy, searchTerm, setSearchTerm } = props;
2528
return (
2629
<div className="flex flex-col gap-3 lg:flex-row lg:items-center">
2730
{/* Search */}
2831
<div className="relative grow">
2932
<SearchIcon className="-translate-y-1/2 absolute top-1/2 left-3 size-4 transform text-muted-foreground" />
3033
<Input
31-
placeholder="Search Team members"
34+
placeholder={props.searchPlaceholder}
3235
className="bg-card pl-9"
3336
disabled={props.disabled}
37+
value={searchTerm}
38+
onChange={(e) => setSearchTerm(e.target.value)}
3439
/>
3540
</div>
3641

0 commit comments

Comments
 (0)