This repository was archived by the owner on Jun 19, 2025. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 227
Expand file tree
/
Copy pathSearchReposTable.tsx
More file actions
116 lines (111 loc) · 3.98 KB
/
SearchReposTable.tsx
File metadata and controls
116 lines (111 loc) · 3.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import { CheckedState } from "@radix-ui/react-checkbox";
import { BiBarChartAlt2 } from "react-icons/bi";
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "components/shared/Table";
import { Avatar } from "components/atoms/Avatar/avatar-hover-card";
import Checkbox from "components/atoms/Checkbox/checkbox";
import Search from "components/atoms/Search/search";
interface SearchedReposTableProps {
type: "by-repos" | "by-org";
repositories: Map<string, boolean>;
onFilter: (filterTerm: string) => void;
onToggleRepo: (repo: string, checked: boolean) => void;
onToggleAllRepos: (checked: boolean) => void;
message?: string;
}
const EmptyState = ({ message }: { message: string }) => {
return (
<TableRow>
<TableCell className="grid place-content-center">
<div className="grid place-content-center gap-5 my-8">
<BiBarChartAlt2 className="border rounded-lg p-2 w-11 h-11 mx-auto fill-slate-600 shadow-xs" />
<div className="grid w-max max-w-sm mx-auto">
<span className="text-center font-medium mb-2">{message}</span>
</div>
</div>
</TableCell>
</TableRow>
);
};
export const SearchedReposTable = ({
type,
repositories = new Map(),
onFilter,
onToggleRepo,
onToggleAllRepos,
message = "No repositories found",
}: SearchedReposTableProps) => {
const allChecked = [...repositories.values()].every((checked) => checked);
const rows = [...repositories.entries()];
return (
<div className="border border-light-slate-7 rounded-lg">
<Table className="not-sr-only">
<TableHeader>
<TableRow className="bg-light-slate-3">
<TableHead className="flex justify-between items-center gap-6">
<div className="flex gap-2">
<Checkbox
onCheckedChange={(checked: CheckedState) => {
onToggleAllRepos(!!checked);
}}
checked={allChecked}
label={type === "by-repos" ? "Selected repositories" : "Selected organization repositories"}
/>
</div>
<form
className="pr-2"
role="search"
onSubmit={(event) => {
event.preventDefault;
}}
>
<Search
placeholder="Filter repositories"
labelText="Filter repositories from the list"
className="w-full"
name="query"
onChange={onFilter}
/>
</form>
</TableHead>
</TableRow>
</TableHeader>
</Table>
<div className="overflow-y-scroll h-60">
<Table>
<TableHeader className="sr-only">
<TableRow className=" bg-light-slate-3">
<TableHead>Selected repositories</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{rows.length > 0 ? (
<>
{rows.map(([repo, checked]) => {
const [owner] = repo.split("/");
return (
<TableRow key={repo}>
<TableCell className="flex gap-2 items-center w-full">
<label className="flex items-center gap-2">
<Checkbox
onCheckedChange={(checked: CheckedState) => {
onToggleRepo(repo, !!checked);
}}
checked={checked}
/>
<Avatar contributor={owner} size="xsmall" />
<span>{repo}</span>
</label>
</TableCell>
</TableRow>
);
})}
</>
) : (
<EmptyState message={message} />
)}
</TableBody>
</Table>
</div>
</div>
);
};