1
1
<script setup lang="ts">
2
+ import { onMounted , ref , watch } from ' vue'
2
3
import { Input } from ' @/components/ui/input'
3
4
import TabsList from ' @/components/ui/tabs/TabsList.vue'
4
5
import Tabs from ' @/components/ui/tabs/Tabs.vue'
@@ -20,6 +21,7 @@ useHead({
20
21
const categories = ([' Sports' , ' Service' , ' Arts' , ' Life' , ' Academic' ] as const ).map (c => c as ClubCategoryKey )
21
22
22
23
const searchTerm = ref (' ' )
24
+ const selectedTab = ref (' Sports' )
23
25
24
26
const { data } = await useFetch <Clubs >(' /api/club/all_details' )
25
27
@@ -47,54 +49,70 @@ const filteredClubs = computed(() => {
47
49
return acc
48
50
}, {} as Clubs )
49
51
})
52
+
53
+ onMounted (() => {
54
+ const storedTab = localStorage .getItem (' selectedTab' )
55
+ if (storedTab )
56
+ selectedTab .value = storedTab
57
+ })
58
+
59
+ watch (selectedTab , (newTab ) => {
60
+ if (typeof window !== ' undefined' )
61
+ localStorage .setItem (' selectedTab' , newTab )
62
+ })
63
+
64
+ function categoryIcon(category : ClubCategoryKey ) {
65
+ switch (category ) {
66
+ case ' Sports' :
67
+ return ' material-symbols:sports-basketball'
68
+ case ' Service' :
69
+ return ' material-symbols:home-repair-service'
70
+ case ' Arts' :
71
+ return ' material-symbols:format-paint'
72
+ case ' Life' :
73
+ return ' material-symbols:nightlife'
74
+ case ' Academic' :
75
+ return ' material-symbols:book'
76
+ default :
77
+ return ' '
78
+ }
79
+ }
50
80
</script >
51
81
52
82
<template >
53
83
<div >
54
- <Tabs class =" h-full space-y-6" :value = " isSearchActive ? '' : undefined " : default-value =" isSearchActive ? '' : 'Sports' " >
84
+ <Tabs v-model = " selectedTab " class =" h-full space-y-6" :default-value =" selectedTab " >
55
85
<div class =" flex flex-row items-center justify-between" >
56
86
<TabsList class =" w-min" >
57
- <TabsTrigger :value =" isSearchActive ? '' : 'Sports'" :disabled =" isSearchActive" class =" flex items-center" >
58
- <Icon name =" material-symbols:sports-basketball" />
87
+ <TabsTrigger
88
+ v-for =" category in categories"
89
+ :key =" category"
90
+ :value =" category"
91
+ :disabled =" isSearchActive"
92
+ class =" flex items-center"
93
+ >
94
+ <Icon :name =" categoryIcon(category)" />
59
95
<div class =" hidden sm:block ml-1" >
60
- Sports
61
- </div >
62
- </TabsTrigger >
63
- <TabsTrigger :value =" isSearchActive ? '' : 'Service'" :disabled =" isSearchActive" class =" flex items-center" >
64
- <Icon name =" material-symbols:home-repair-service" />
65
- <div class =" hidden sm:block ml-1" >
66
- Service
67
- </div >
68
- </TabsTrigger >
69
- <TabsTrigger :value =" isSearchActive ? '' : 'Arts'" :disabled =" isSearchActive" class =" flex items-center" >
70
- <Icon name =" material-symbols:format-paint" />
71
- <div class =" hidden sm:block ml-1" >
72
- Arts
73
- </div >
74
- </TabsTrigger >
75
- <TabsTrigger :value =" isSearchActive ? '' : 'Life'" :disabled =" isSearchActive" class =" flex items-center" >
76
- <Icon name =" material-symbols:nightlife" />
77
- <div class =" hidden sm:block ml-1" >
78
- Life
79
- </div >
80
- </TabsTrigger >
81
- <TabsTrigger :value =" isSearchActive ? '' : 'Academic'" :disabled =" isSearchActive" class =" flex items-center" >
82
- <Icon name =" material-symbols:book" />
83
- <div class =" hidden sm:block ml-1" >
84
- Academic
96
+ {{ category }}
85
97
</div >
86
98
</TabsTrigger >
87
99
</TabsList >
88
- <Input v-model =" searchTerm" type =" text" placeholder =" Search..." class =" float-right w-1/4" />
100
+
101
+ <div class =" relative w-1/3 xl:w-1/4" >
102
+ <div class =" absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none" >
103
+ <Icon name =" material-symbols:search" />
104
+ </div >
105
+ <Input v-model =" searchTerm" type =" text" placeholder =" Search..." class =" pl-10" />
106
+ </div >
89
107
</div >
90
108
<TabsContent
91
- v-for =" i in categories"
92
- :key =" i "
93
- :value =" i "
109
+ v-for =" category in categories"
110
+ :key =" category "
111
+ :value =" category "
94
112
class =" border-none p-0 outline-none"
95
113
>
96
114
<div class =" grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4" >
97
- <ClubCard v-for =" j in filteredClubs[i ]" :key =" j .groups[0].C_NameE" :club =" j " />
115
+ <ClubCard v-for =" club in filteredClubs[category ]" :key =" club .groups[0].C_NameE" :club =" club " />
98
116
</div >
99
117
</TabsContent >
100
118
</Tabs >
0 commit comments