-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathIssuesList.tsx
More file actions
101 lines (89 loc) · 3.62 KB
/
Copy pathIssuesList.tsx
File metadata and controls
101 lines (89 loc) · 3.62 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
import { createMemo, createSignal, Show, Suspense, useTransition } from "solid-js";
import { useSubmissions } from "@solidjs/router";
import { resolveIssues, unresolveIssues } from "~/lib/actions";
import { cn } from "~/lib/utils";
import { IssueWithAssignedUser } from "~/lib/queries";
import { UserRow } from "~/lib/db";
import IssueActionBar from "./IssueActionBar";
import PaginatedIssues from "./PaginatedIssues";
type IssuesListProps = {
issues: IssueWithAssignedUser[];
type: 'resolved' | 'unresolved';
onDateFilterChange: (date: string) => void;
users?: UserRow[]
}
export default function IssuesList(props: IssuesListProps) {
const [searchTerm, setSearchTerm] = createSignal('');
const [page, setPage] = createSignal(1);
const [selected, setSelected] = createSignal<number[]>([]);
const [pending] = useTransition();
const resolveIssuesSubmissions = useSubmissions(resolveIssues);
const unresolveIssuesSubmissions = useSubmissions(unresolveIssues);
const filteredIssues = createMemo(() => props.issues?.filter(issue => issue.title?.toLowerCase().includes(searchTerm().toLowerCase())));
const optimisticIssues = createMemo(() => {
const resolvingIds = [...resolveIssuesSubmissions.values(), ...unresolveIssuesSubmissions.values()]
.filter(submission => submission.pending)
.flatMap(submission => submission.input[0]);
return filteredIssues().filter(issue => !resolvingIds.includes(issue.id));
});
const updateSearchTerm = (term: string) => {
setSearchTerm(term)
}
const resetPagination = () => {
setPage(1);
}
const setCurrentPage = (page: number) => {
setPage(page);
}
const toggleSelect = (id: number) => {
const idExist = selected().find(sel => sel === id);
if (idExist) {
setSelected(selected().filter(sel => sel !== id));
} else {
setSelected([
...selected(),
id,
]);
}
};
const toggleSelectAll = () => {
if (props.issues && selected().length === 0) {
setSelected(props.issues.map(issue => issue.id));
} else {
setSelected([]);
}
}
return (
<Suspense fallback="Loading issues...">
<div class="gap-4 mb-4 mt-4 hidden md:flex">
<IssueActionBar
issues={optimisticIssues()}
toggleSelectAll={toggleSelectAll}
selected={selected()}
updateSearchTerm={updateSearchTerm}
onDateFilterChange={props.onDateFilterChange}
resetPagination={resetPagination}
type={props.type}
/>
</div>
<div classList={{ 'opacity-50': pending() }}>
<div class="mb-2 text-sm">
{optimisticIssues().length || 0} Issues
</div>
<Show when={optimisticIssues() && optimisticIssues().length > 0} fallback={
<div class={cn("flex flex-row items-center gap-6 rounded-lg border p-3 text-left text-sm w-full font-semibold",)}>
No issues found
</div>}>
<PaginatedIssues
issues={optimisticIssues()}
setCurrentPage={setCurrentPage}
page={page()}
selected={selected()}
toggleSelect={toggleSelect}
users={props.users}
/>
</Show>
</div>
</Suspense>
)
}