-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.html
119 lines (101 loc) · 2.97 KB
/
app.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<script>
let currentFilter = 'all';
let items = [];
let editing = null;
let numActive, numCompleted;
try {
items = JSON.parse(localStorage.getItem('todos-malina')) || [];
} catch (err) {
items = [];
}
const updateView = () => {
currentFilter = 'all';
if (window.location.hash === '#/active') {
currentFilter = 'active';
} else if (window.location.hash === '#/completed') {
currentFilter = 'completed';
}
};
window.addEventListener('hashchange', updateView);
updateView();
function clearCompleted() {
items = items.filter(item => !item.completed);
}
function remove(index) {
items.splice(index, 1);
}
function toggleAll(value) {
items.forEach(item => item.completed = value)
}
function createNew(el) {
items.push({
description: el.value,
completed: false
});
el.value = '';
}
function save(value) {
editing.description = value;
editing = null;
}
const filtered = () => {
if(currentFilter == 'active') return items.filter(item => !item.completed);
if(currentFilter == 'completed') return items.filter(item => item.completed);
return items;
}
$: numActive = items.filter(item => !item.completed).length;
$: numCompleted = items.filter(item => item.completed).length;
$: JSON.stringify(items), (json) => localStorage.setItem('todos-malina', json);
</script>
<header class="header">
<h1>todos</h1>
<input
class="new-todo"
on:keydown|enter={createNew($element)}
placeholder="What needs to be done?"
use={$element.focus()}
>
</header>
{#if items.length > 0}
<section class="main">
<input id="toggle-all" class="toggle-all" type="checkbox" on:change={toggleAll($element.checked)} checked={numCompleted == items.length}>
<label for="toggle-all">Mark all as complete</label>
<ul class="todo-list">
{#each filtered() as item }
<li class:completed={item.completed} class:editing={editing == item}>
<div class="view">
<input class="toggle" type="checkbox" bind:checked={item.completed}>
<label on:dblclick={editing = item}>{item.description}</label>
<button on:click={remove($index)} class="destroy"></button>
</div>
{#if editing == item }
<input
value={item.description}
id="edit"
class="edit"
on:keydown|enter={$element.blur()}
on:keydown|escape={editing=null}
on:blur={save($element.value)}
use={$element.focus()}
>
{/if}
</li>
{/each}
</ul>
<footer class="footer">
<span class="todo-count">
<strong>{numActive}</strong> {numActive === 1 ? 'item' : 'items'} left
</span>
<ul class="filters">
<li><a class:selected={currentFilter == 'all'} href="#/">All</a></li>
<li><a class:selected={currentFilter == 'active'} href="#/active">Active</a></li>
<li><a class:selected={currentFilter == 'completed'} href="#/completed">Completed</a></li>
</ul>
{#if numCompleted}
<button class="clear-completed" on:click={clearCompleted()}>
Clear completed
</button>
{/if}
</footer>
</section>
{/if}