|
1 | 1 | <template>
|
2 | 2 | <div class="row">
|
3 | | - <div class="col-12 mx-auto"> |
4 | | - <TextInput v-on:add-note="addNote"/> |
5 | | - <b-list-group v-bind:key="item.id" v-for="item in items"> |
6 | | - <ListItem v-bind:data="item" v-on:del-todo="deleteItem"></ListItem> |
7 | | - </b-list-group> |
| 3 | + <div class="col-12"> |
| 4 | + <FilterNotes /> |
| 5 | + <div class="row mb-2"> |
| 6 | + <AddNote v-if="!onEditMode" class="col-12" /> |
| 7 | + </div> |
| 8 | + <div class="row mx-auto"> |
| 9 | + <div class="legend col-12 mb-1"> |
| 10 | + <span>Double Click to mark as complete</span> |
| 11 | + <span> |
| 12 | + <span class="legend-box incomplete-note"></span> = Incomplete |
| 13 | + </span> |
| 14 | + <span> |
| 15 | + <span class="legend-box complete-note"></span> = Complete |
| 16 | + </span> |
| 17 | + </div> |
| 18 | + |
| 19 | + <b-list-group |
| 20 | + v-bind:key="item.id" |
| 21 | + v-for="item in allNotes" |
| 22 | + class="col-6" |
| 23 | + @dblclick="onDblClick(item)" |
| 24 | + > |
| 25 | + <ListItem |
| 26 | + v-bind:data="item" |
| 27 | + v-on:del-todo="deleteItem" |
| 28 | + v-bind:class="{'complete-note':item.completed, 'incomplete-note':!item.completed}" |
| 29 | + class="note" |
| 30 | + /> |
| 31 | + </b-list-group> |
| 32 | + </div> |
8 | 33 | </div>
|
9 | 34 | </div>
|
10 | 35 | </template>
|
11 | 36 |
|
12 | 37 | <script>
|
13 | | -import axios from "axios"; |
| 38 | +// import axios from "axios"; |
| 39 | +import { mapGetters, mapActions } from "vuex"; |
14 | 40 |
|
15 | | -import TextInput from '@/components/TextInput.vue'; |
| 41 | +import AddNote from "@/components/AddNote.vue"; |
| 42 | +import FilterNotes from "@/components/FilterNotes.vue"; |
16 | 43 | import ListItem from "@/components/ListItem.vue";
|
17 | 44 |
|
18 | 45 | export default {
|
19 | 46 | name: "List",
|
| 47 | + computed: mapGetters(["allNotes", "onEditMode"]), |
20 | 48 | data() {
|
21 | 49 | return {
|
22 | 50 | items: []
|
23 | 51 | };
|
24 | 52 | },
|
25 | 53 | components: {
|
26 | | - TextInput, |
| 54 | + FilterNotes, |
| 55 | + AddNote, |
27 | 56 | ListItem
|
28 | 57 | },
|
29 | | - created() { |
30 | | - axios |
31 | | - .get("https://jsonplaceholder.typicode.com/todos?_limit=5") |
32 | | - .then(res => (this.items = res.data)) |
33 | | - .catch(err => console.log(err)); |
34 | | - }, |
35 | 58 | methods: {
|
| 59 | + ...mapActions(["fetchNotes", "deleteNote", "updateNote"]), |
36 | 60 | deleteItem(id) {
|
37 | | - this.items=this.items.filter(todo=>todo.id!== id) |
| 61 | + this.deleteNote(id); |
38 | 62 | },
|
39 | 63 | addNote(newNote) {
|
40 | 64 | this.items = [newNote, ...this.items];
|
| 65 | + }, |
| 66 | + onDblClick(note) { |
| 67 | + const newNote = { |
| 68 | + id: note.id, |
| 69 | + completed: !note.completed, |
| 70 | + title: note.title |
| 71 | + }; |
| 72 | + this.updateNote(newNote); |
41 | 73 | }
|
| 74 | + }, |
| 75 | + created() { |
| 76 | + this.fetchNotes(); |
42 | 77 | }
|
43 | | - |
44 | 78 | };
|
45 | 79 | </script>
|
46 | 80 |
|
47 | 81 | <style scoped>
|
| 82 | +@media (max-width: 500px) { |
| 83 | + .todos { |
| 84 | + grid-template-columns: 1fr; |
| 85 | + } |
| 86 | +} |
| 87 | + |
| 88 | +.notes { |
| 89 | + display: grid; |
| 90 | + grid-template-columns: repeat(3, 1fr); |
| 91 | + grid-gap: 1rem; |
| 92 | +} |
| 93 | +.note:hover, |
| 94 | +.note:focus { |
| 95 | + opacity: 1; |
| 96 | + box-shadow: none; |
| 97 | +} |
| 98 | +.legend { |
| 99 | + display: flex; |
| 100 | + justify-content: space-around; |
| 101 | + margin-bottom: 1rem; |
| 102 | +} |
| 103 | + |
| 104 | +.legend-box { |
| 105 | + display: inline-block; |
| 106 | + width: 10px; |
| 107 | + height: 10px; |
| 108 | +} |
| 109 | + |
| 110 | +.complete-note { |
| 111 | + background: greenyellow; |
| 112 | + color: black; |
| 113 | +} |
| 114 | + |
| 115 | +.incomplete-note { |
| 116 | + background: rgb(66, 61, 61); |
| 117 | + color: white; |
| 118 | +} |
48 | 119 | </style>
|
0 commit comments