@@ -18,13 +18,11 @@ import {
18
18
} from "@/outerbase-cloud/api-type" ;
19
19
import {
20
20
CalendarDots ,
21
- Eye ,
22
21
MagnifyingGlass ,
23
22
Pencil ,
24
23
SortAscending ,
25
24
SortDescending ,
26
25
Trash ,
27
- Users ,
28
26
} from "@phosphor-icons/react" ;
29
27
import { AnimatePresence , motion } from "framer-motion" ;
30
28
import { useMemo , useState } from "react" ;
@@ -68,6 +66,21 @@ export function getResourceItemPropsFromBoard(
68
66
} ;
69
67
}
70
68
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
+
71
84
export function ResourceItemList ( {
72
85
bases,
73
86
boards,
@@ -88,6 +101,15 @@ export function ResourceItemList({
88
101
workspaceId ?: string ;
89
102
} ) {
90
103
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 ] ) ;
91
113
92
114
const baseMatchedCount = useMemo ( ( ) => {
93
115
return bases . filter ( ( base ) =>
@@ -111,12 +133,14 @@ export function ResourceItemList({
111
133
112
134
< MenuBar
113
135
size = "lg"
136
+ value = { sorted }
137
+ onChange = { ( newSortOrder : string ) =>
138
+ setSorted ( newSortOrder as SortedType )
139
+ }
114
140
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 } /> } ,
120
144
] }
121
145
/>
122
146
@@ -135,7 +159,7 @@ export function ResourceItemList({
135
159
< h2 className = "text-base font-bold" > Boards</ h2 >
136
160
< 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" >
137
161
< AnimatePresence initial = { false } >
138
- { boards . map ( ( resource : ResourceItemProps ) => {
162
+ { sortedBoards . map ( ( resource : ResourceItemProps ) => {
139
163
const status = `Last updated ${ timeSince ( resource . lastUsed ) } ago` ;
140
164
141
165
return (
@@ -198,7 +222,7 @@ export function ResourceItemList({
198
222
199
223
{ bases . length > 0 && (
200
224
< AnimatePresence initial = { false } >
201
- { bases . map ( ( resource : ResourceItemProps ) => {
225
+ { sortedBases . map ( ( resource : ResourceItemProps ) => {
202
226
const status = `Last updated ${ timeSince ( resource . lastUsed ) } ago` ;
203
227
204
228
return (
0 commit comments