Skip to content

Commit bea6f79

Browse files
committed
Dia 1 - ToDoList
1 parent 4b5f1c9 commit bea6f79

File tree

12 files changed

+62
-427
lines changed

12 files changed

+62
-427
lines changed
Lines changed: 62 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,73 @@
1-
<script setup lang="ts">
2-
import HelloWorld from './components/HelloWorld.vue'
3-
import TheWelcome from './components/TheWelcome.vue'
4-
</script>
5-
61
<template>
7-
<header>
8-
<img alt="Vue logo" class="logo" src="./assets/logo.svg" width="125" height="125" />
9-
10-
<div class="wrapper">
11-
<HelloWorld msg="You did it!" />
12-
</div>
13-
</header>
14-
15-
<main>
16-
<TheWelcome />
17-
</main>
2+
<h1>My To-Do List</h1>
3+
<div>
4+
<!-- Input for adding new tasks -->
5+
<input v-model="newTask" @keyup.enter="addTask" placeholder="Add a new task" />
6+
<button @click="addTask">Add</button>
7+
</div>
8+
<ul>
9+
<!-- Loop through tasks and display them -->
10+
<li v-for="(task, index) in tasks" :key="task.id">
11+
<span :class="{ completed: task.completed }">
12+
{{ task.text }}
13+
</span>
14+
<button @click="toggleTask(index)">
15+
{{ task.completed ? 'Undo' : 'Complete' }}
16+
</button>
17+
<button @click="deleteTask(index)">Delete</button>
18+
</li>
19+
</ul>
1820
</template>
1921

20-
<style scoped>
21-
header {
22-
line-height: 1.5;
22+
<script setup lang="ts">
23+
import { ref } from 'vue'
24+
25+
// Define the structure of a task
26+
interface Task {
27+
id: number
28+
text: string
29+
completed: boolean
2330
}
2431
25-
.logo {
26-
display: block;
27-
margin: 0 auto 2rem;
32+
// Reactive state
33+
const newTask = ref('')
34+
const tasks = ref<Task[]>([])
35+
36+
// Add a new task
37+
function addTask() {
38+
if (newTask.value.trim() === '') return // Prevent empty tasks
39+
tasks.value.push({
40+
id: new Date().getTime(),
41+
text: newTask.value,
42+
completed: false,
43+
})
44+
newTask.value = '' // Clear the input
2845
}
2946
30-
@media (min-width: 1024px) {
31-
header {
32-
display: flex;
33-
place-items: center;
34-
padding-right: calc(var(--section-gap) / 2);
35-
}
47+
// Toggle task completion
48+
function toggleTask(index: number) {
49+
tasks.value[index].completed = !tasks.value[index].completed
50+
}
3651
37-
.logo {
38-
margin: 0 2rem 0 0;
39-
}
52+
// Delete a task
53+
function deleteTask(index: number) {
54+
tasks.value.splice(index, 1)
55+
}
56+
</script>
4057

41-
header .wrapper {
42-
display: flex;
43-
place-items: flex-start;
44-
flex-wrap: wrap;
45-
}
58+
<style scoped>
59+
.completed {
60+
text-decoration: line-through;
61+
color: gray;
62+
}
63+
ul {
64+
list-style-type: none;
65+
padding: 0;
66+
}
67+
li {
68+
margin: 10px 0;
69+
}
70+
button {
71+
margin-left: 10px;
4672
}
4773
</style>

04-frameworks/03-vue/Dia_1/src/assets/base.css

Lines changed: 0 additions & 86 deletions
This file was deleted.

04-frameworks/03-vue/Dia_1/src/assets/logo.svg

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +0,0 @@
1-
@import './base.css';
2-
3-
#app {
4-
max-width: 1280px;
5-
margin: 0 auto;
6-
padding: 2rem;
7-
font-weight: normal;
8-
}
9-
10-
a,
11-
.green {
12-
text-decoration: none;
13-
color: hsla(160, 100%, 37%, 1);
14-
transition: 0.4s;
15-
padding: 3px;
16-
}
17-
18-
@media (hover: hover) {
19-
a:hover {
20-
background-color: hsla(160, 100%, 37%, 0.2);
21-
}
22-
}
23-
24-
@media (min-width: 1024px) {
25-
body {
26-
display: flex;
27-
place-items: center;
28-
}
29-
30-
#app {
31-
display: grid;
32-
grid-template-columns: 1fr 1fr;
33-
padding: 0 2rem;
34-
}
35-
}

04-frameworks/03-vue/Dia_1/src/components/HelloWorld.vue

Lines changed: 0 additions & 41 deletions
This file was deleted.

04-frameworks/03-vue/Dia_1/src/components/TheWelcome.vue

Lines changed: 0 additions & 94 deletions
This file was deleted.

0 commit comments

Comments
 (0)