@@ -9,7 +9,7 @@ definePageMeta({
99})
1010
1111const searchQuery = ref (' ' )
12- const teacherSelected = ref <string []>([])
12+ const selectedTeachers = ref <string []>([])
1313const levelSelected = ref <string []>([])
1414const categorySelected = ref <string []>([])
1515
@@ -46,9 +46,9 @@ async function loadMoreCourses() {
4646 page: currentPage .value ,
4747 per_page: perPage .value ,
4848 query: searchQuery .value ,
49- users_ids: teacherSelected .value ,
50- category_ids: categorySelected .value ,
51- level_ids: levelSelected .value ,
49+ users_ids: selectedTeachers .value . join ( ' , ' ) ,
50+ category_ids: categorySelected .value . join ( ' , ' ) ,
51+ level_ids: levelSelected .value . join ( ' , ' ) ,
5252 },
5353 })
5454
@@ -108,7 +108,7 @@ function handleScroll(event: Event) {
108108}
109109
110110// Usar watch para reaccionar a cambios en los filtros
111- watch ([searchQuery , teacherSelected , levelSelected , categorySelected ], () => {
111+ watch ([searchQuery , selectedTeachers , levelSelected , categorySelected ], () => {
112112 handleSearch ()
113113})
114114
@@ -125,8 +125,28 @@ onUnmounted(() => {
125125 }
126126})
127127
128- function handleTeacherSelected(newSelected : string []) {
129- teacherSelected .value = newSelected
128+ function handleTeacherClick(teacherId : string ) {
129+ if (! teacherId ) {
130+ console .warn (' El ID del profesor es inválido:' , teacherId )
131+ return
132+ }
133+
134+ const isTeacherSelected = selectedTeachers .value .includes (teacherId )
135+
136+ if (isTeacherSelected ) {
137+ selectedTeachers .value = selectedTeachers .value .filter (id => id !== teacherId )
138+ }
139+ else {
140+ selectedTeachers .value = [... selectedTeachers .value , teacherId ]
141+ }
142+
143+ applyFilters ()
144+ }
145+
146+ function applyFilters() {
147+ // Aquí puedes agregar cualquier lógica adicional necesaria después de cambiar los filtros
148+ // Por ejemplo, disparar una nueva búsqueda o actualizar la interfaz
149+ handleSearch ()
130150}
131151
132152function handleCategorySelected(newSelected : string []) {
@@ -201,7 +221,7 @@ useSeoMeta({
201221 <h1 class =" text-white text-3xl font-oswald mb-6 uppercase font-semibold" >
202222 Cursos de hacking ético
203223 </h1 >
204- <div class =" flex flex-col space-y-6 md:flex-row md:space-y-0 md:space-x-6" >
224+ <div class =" flex flex-col space-y-6 md:flex-row md:space-y-0 md:space-x-6 " >
205225 <!-- Sección de cursos -->
206226 <div
207227 v-if =" isLoading && !courses.courses.length"
@@ -212,6 +232,14 @@ useSeoMeta({
212232 <p >Cargando cursos...</p >
213233 </div >
214234 </div >
235+ <div
236+ v-else-if =" !isLoading && courses.courses.length === 0 && (searchQuery || selectedTeachers.length || levelSelected.length || categorySelected.length)"
237+ class =" w-full flex-1 min-h-[calc(100vh-200px)] grid place-items-center"
238+ >
239+ <div class =" text-center" >
240+ <p >No se encontraron cursos que coincidan con los filtros</p >
241+ </div >
242+ </div >
215243
216244 <div v-else class =" flex-1 grid grid-cols-[repeat(auto-fill,minmax(250px,1fr))] gap-4 mb-40" >
217245 <div v-for =" course in courses.courses" :key =" course.id" class =" flex" >
@@ -226,45 +254,68 @@ useSeoMeta({
226254 </div >
227255
228256 <!-- Filtros -->
229- <div class =" space-y-4 max-w-[290px] w-full" >
230- <div class =" relative flex-1" >
231- <label class =" text-sm font-medium mb-2 block" >Cursos</label >
232- <Input
233- v-model =" searchQuery"
234- class =" placeholder:font-inconsolata"
235- placeholder =" Buscar cursos..."
236- />
237- </div >
238-
239- <div >
240- <label class =" text-sm font-medium mb-2 block" >Categorías</label >
241- <MultiSelect
242- class-name =" font-inconsolata"
243- :options =" formattedCategories || []"
244- :selected =" categorySelected"
245- placeholder =" Categorías"
246- search-placeholder =" Buscar categorías..."
247- @change =" handleCategorySelected"
248- />
257+ <div class =" h-[200px]" >
258+ <div class =" space-y-4 max-w-[290px] w-full sticky top-10" >
259+ <div class =" relative flex-1" >
260+ <label class =" text-sm font-medium mb-2 block" >Cursos</label >
261+ <Input
262+ v-model =" searchQuery"
263+ class =" placeholder:font-inconsolata"
264+ placeholder =" Buscar cursos..."
265+ />
266+ </div >
267+
268+ <div >
269+ <label class =" text-sm font-medium mb-2 block" >Categorías</label >
270+ <MultiSelect
271+ class-name =" font-inconsolata"
272+ :options =" formattedCategories || []"
273+ :selected =" categorySelected"
274+ placeholder =" Categorías"
275+ search-placeholder =" Buscar categorías..."
276+ @change =" handleCategorySelected"
277+ />
278+ </div >
279+ <div >
280+ <label class =" text-sm font-medium mb-2 block" >Niveles</label >
281+ <MultiSelect
282+ class-name =" font-inconsolata"
283+ :options =" formattedLevels || []"
284+ :selected =" levelSelected"
285+ placeholder =" Niveles"
286+ search-placeholder =" Buscar niveles..."
287+ @change =" handleLevelSelected"
288+ />
289+ </div >
290+
291+ <Button
292+ class =" rounded-md bg-bta-pink px-8 py-2 text-primary hover:bg-bta-pink/90"
293+ @click =" handleSearch"
294+ >
295+ Buscar
296+ </Button >
297+ <!-- Profesores -->
298+ <div class =" space-y-2" >
299+ <h3 class =" font-medium mb-4" >
300+ Profesores
301+ </h3 >
302+ <div class =" space-y-1" >
303+ {{ selectedTeachers.value }}
304+ <button
305+ v-for =" teacher in formattedTeachers"
306+ :key =" teacher.value"
307+ class =" w-full text-left px-3 py-2 rounded-md text-sm transition-colors" :class =" [
308+ selectedTeachers.includes(teacher.value)
309+ ? 'bg-primary text-primary-foreground'
310+ : 'hover:bg-secondary',
311+ ]"
312+ @click =" handleTeacherClick(teacher.value)"
313+ >
314+ {{ teacher.label }} {{ teacher.value }}
315+ </button >
316+ </div >
317+ </div >
249318 </div >
250- <div >
251- <label class =" text-sm font-medium mb-2 block" >Niveles</label >
252- <MultiSelect
253- class-name =" font-inconsolata"
254- :options =" formattedLevels || []"
255- :selected =" levelSelected"
256- placeholder =" Niveles"
257- search-placeholder =" Buscar niveles..."
258- @change =" handleLevelSelected"
259- />
260- </div >
261-
262- <Button
263- class =" rounded-md bg-bta-pink px-8 py-2 text-primary hover:bg-bta-pink/90"
264- @click =" handleSearch"
265- >
266- Buscar
267- </Button >
268319 </div >
269320 </div >
270321 </div >
0 commit comments