Skip to content

Commit b2ddba6

Browse files
committed
ADD: teachers in sidebar
1 parent d502e31 commit b2ddba6

File tree

1 file changed

+97
-46
lines changed

1 file changed

+97
-46
lines changed

pages/cursos/index.vue

Lines changed: 97 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ definePageMeta({
99
})
1010
1111
const searchQuery = ref('')
12-
const teacherSelected = ref<string[]>([])
12+
const selectedTeachers = ref<string[]>([])
1313
const levelSelected = ref<string[]>([])
1414
const 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
132152
function 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

Comments
 (0)