Skip to content

Commit b1c36c2

Browse files
committed
Vue Lab - Search Bar implemented
1 parent 0f0e737 commit b1c36c2

3 files changed

Lines changed: 64 additions & 4 deletions

File tree

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<template>
2+
<div class="search-container">
3+
<input
4+
type="text"
5+
v-model="searchQuery"
6+
placeholder="Search todos..."
7+
class="search-input"
8+
@input="search"
9+
/>
10+
</div>
11+
</template>
12+
13+
<script setup lang="ts">
14+
import { ref, watch } from 'vue'
15+
import { useTodoStore } from '~/stores/todo-store'
16+
17+
const store = useTodoStore()
18+
const searchQuery = ref('')
19+
20+
const search = () => {
21+
store.setSearchQuery(searchQuery.value)
22+
}
23+
</script>
24+
25+
<style scoped>
26+
.search-container {
27+
margin: 1rem 0;
28+
}
29+
30+
.search-input {
31+
width: 100%;
32+
padding: 0.5rem;
33+
font-size: 1rem;
34+
border: 1px solid #ddd;
35+
border-radius: 4px;
36+
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
37+
}
38+
39+
.search-input:focus {
40+
outline: none;
41+
border-color: #4CAF50;
42+
box-shadow: 0 2px 4px rgba(76,175,80,0.2);
43+
}
44+
</style>

4 - Frameworks/Ejercicios/VUE/vue-lab/todo-app/pages/index.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<div class="container">
33
<h1>Todo App</h1>
44
<TodoInput @add-todo="addTodo" />
5+
<SearchBar />
56
<TodoFilter />
67
<TodoList :todos="store.filteredTodos" @toggle="toggleTodo" @delete="deleteTodo" />
78
</div>

4 - Frameworks/Ejercicios/VUE/vue-lab/todo-app/stores/todo-store.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { defineStore } from "pinia";
2-
import { ref } from "vue";
2+
import { ref, computed } from "vue";
33
import type { Todo, FilterType } from "~/types/index";
44

55
export const useTodoStore = defineStore(
@@ -8,15 +8,24 @@ export const useTodoStore = defineStore(
88
const todos = ref<Todo[]>([]);
99
const editingId = ref<number | null>(null);
1010
const filter = ref<FilterType>("all");
11+
const searchQuery = ref("");
1112

1213
const filteredTodos = computed(() => {
14+
let filtered = todos.value;
15+
16+
if (searchQuery.value) {
17+
filtered = filtered.filter((todo) =>
18+
todo.title.toLowerCase().includes(searchQuery.value.toLowerCase())
19+
);
20+
}
21+
1322
switch (filter.value) {
1423
case "active":
15-
return todos.value.filter((todo) => !todo.completed);
24+
return filtered.value.filter((todo) => !todo.completed);
1625
case "completed":
17-
return todos.value.filter((todo) => todo.completed);
26+
return filtered.value.filter((todo) => todo.completed);
1827
default:
19-
return todos.value;
28+
return filtered;
2029
}
2130
});
2231

@@ -60,6 +69,10 @@ export const useTodoStore = defineStore(
6069
filter.value = newFilter;
6170
};
6271

72+
const setSearchQuery = (query: string) => {
73+
searchQuery.value = query;
74+
};
75+
6376
return {
6477
todos,
6578
editingId,
@@ -72,6 +85,8 @@ export const useTodoStore = defineStore(
7285
filter,
7386
filteredTodos,
7487
setFilter,
88+
searchQuery,
89+
setSearchQuery,
7590
};
7691
},
7792
{

0 commit comments

Comments
 (0)