Skip to content

Commit 7e8482d

Browse files
committed
allow resource to be sortable
1 parent 508bcd8 commit 7e8482d

File tree

1 file changed

+33
-9
lines changed

1 file changed

+33
-9
lines changed

src/app/(outerbase)/resource-item-helper.tsx

+33-9
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,11 @@ import {
1818
} from "@/outerbase-cloud/api-type";
1919
import {
2020
CalendarDots,
21-
Eye,
2221
MagnifyingGlass,
2322
Pencil,
2423
SortAscending,
2524
SortDescending,
2625
Trash,
27-
Users,
2826
} from "@phosphor-icons/react";
2927
import { AnimatePresence, motion } from "framer-motion";
3028
import { useMemo, useState } from "react";
@@ -68,6 +66,21 @@ export function getResourceItemPropsFromBoard(
6866
};
6967
}
7068

69+
type SortedType = "name_asc" | "name_desc" | "recent";
70+
71+
function sortResources(resources: ResourceItemProps[], sorted: SortedType) {
72+
return resources.sort((a, b) => {
73+
if (sorted === "name_asc") {
74+
return (a.name ?? "").localeCompare(b.name ?? "");
75+
} else if (sorted === "name_desc") {
76+
return (b.name ?? "").localeCompare(a.name ?? "");
77+
} else if (sorted === "recent") {
78+
return b.lastUsed - a.lastUsed;
79+
}
80+
return 0;
81+
});
82+
}
83+
7184
export function ResourceItemList({
7285
bases,
7386
boards,
@@ -88,6 +101,15 @@ export function ResourceItemList({
88101
workspaceId?: string;
89102
}) {
90103
const [search, setSearch] = useState("");
104+
const [sorted, setSorted] = useState<SortedType>("name_asc");
105+
106+
const sortedBases = useMemo(() => {
107+
return sortResources(bases, sorted);
108+
}, [sorted, bases]);
109+
110+
const sortedBoards = useMemo(() => {
111+
return sortResources(boards, sorted);
112+
}, [sorted, boards]);
91113

92114
const baseMatchedCount = useMemo(() => {
93115
return bases.filter((base) =>
@@ -111,12 +133,14 @@ export function ResourceItemList({
111133

112134
<MenuBar
113135
size="lg"
136+
value={sorted}
137+
onChange={(newSortOrder: string) =>
138+
setSorted(newSortOrder as SortedType)
139+
}
114140
items={[
115-
{ value: "all", content: <SortAscending size={16} /> },
116-
{ value: "recent", content: <SortDescending size={16} /> },
117-
{ value: "updated", content: <CalendarDots size={16} /> },
118-
{ value: "created", content: <Eye size={16} /> },
119-
{ value: "name", content: <Users size={16} /> },
141+
{ value: "name_asc", content: <SortAscending size={16} /> },
142+
{ value: "name_desc", content: <SortDescending size={16} /> },
143+
{ value: "recent", content: <CalendarDots size={16} /> },
120144
]}
121145
/>
122146

@@ -135,7 +159,7 @@ export function ResourceItemList({
135159
<h2 className="text-base font-bold">Boards</h2>
136160
<div className="flex grid grid-cols-1 flex-wrap gap-4 min-[700px]:grid-cols-2 min-[900px]:grid-cols-3 min-[1200px]:grid-cols-4 min-[1500px]:grid-cols-5 min-[1800px]:grid-cols-6 min-[2100px]:grid-cols-7">
137161
<AnimatePresence initial={false}>
138-
{boards.map((resource: ResourceItemProps) => {
162+
{sortedBoards.map((resource: ResourceItemProps) => {
139163
const status = `Last updated ${timeSince(resource.lastUsed)} ago`;
140164

141165
return (
@@ -198,7 +222,7 @@ export function ResourceItemList({
198222

199223
{bases.length > 0 && (
200224
<AnimatePresence initial={false}>
201-
{bases.map((resource: ResourceItemProps) => {
225+
{sortedBases.map((resource: ResourceItemProps) => {
202226
const status = `Last updated ${timeSince(resource.lastUsed)} ago`;
203227

204228
return (

0 commit comments

Comments
 (0)