mirror of
https://github.com/amark/gun.git
synced 2025-06-16 11:06:44 +00:00
Merge pull request #360 from sjones6/sjones6/vue-gun
Add vue+gun todo app
This commit is contained in:
commit
2c2530f8ac
163
examples/vue/todo.html
Normal file
163
examples/vue/todo.html
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Todo App: Gun + Vue</title>
|
||||||
|
|
||||||
|
<script src="https://unpkg.com/vue" type="text/javascript" charset="utf-8"></script>
|
||||||
|
<script src="http://rawgit.com/amark/gun/master/gun.js" type="text/javascript" charset="utf-8"></script>
|
||||||
|
<link href='https://fonts.googleapis.com/css?family=Alegreya+Sans:300italic' rel='stylesheet' type='text/css'>
|
||||||
|
<style>
|
||||||
|
|
||||||
|
body,
|
||||||
|
html {
|
||||||
|
width: 100%;
|
||||||
|
font-family: 'Alegreya Sans', sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-size: 20px;
|
||||||
|
background-color: rgba(0,0,0,.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
h1,
|
||||||
|
h3,
|
||||||
|
h5 {
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
#app {
|
||||||
|
margin: 0 auto;
|
||||||
|
background-color: #fff;
|
||||||
|
max-width: 500px;
|
||||||
|
padding: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.add-todo {
|
||||||
|
font-size: 1em;
|
||||||
|
border: 1px solid black;
|
||||||
|
padding: .5em .25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.completed-header,
|
||||||
|
.completed,
|
||||||
|
.completed-time {
|
||||||
|
color: rgba(0,0,0,.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.completed {
|
||||||
|
text-decoration: line-through;
|
||||||
|
}
|
||||||
|
|
||||||
|
.completed-time {
|
||||||
|
font-size: .8em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div id="app">
|
||||||
|
|
||||||
|
<div class="todo-wrapper">
|
||||||
|
<h1>Todos App</h1>
|
||||||
|
|
||||||
|
<input class="add-todo" type="text" placeholder="Add new todo" v-model="newTodo" @keyup.enter="addTodo">
|
||||||
|
|
||||||
|
<h3>Active</h3>
|
||||||
|
|
||||||
|
<div v-for="active in activeTodos">
|
||||||
|
<label><input type="checkbox" @click="completeTodo(active.key)"> {{ active.todo.description }}</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h5 v-show="completedTodos.length > 0" class="completed-header">Completed</h5>
|
||||||
|
|
||||||
|
<div v-for="completed in completedTodos" @click="reopenTodo(completed.key)">
|
||||||
|
<span class="completed">{{ completed.todo.description }}</span>
|
||||||
|
<span class="completed-time">(completed at {{ (new Date(completed.todo.completed)).toUTCString() }})</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
// Clear out local storage so we can start fresh each time.
|
||||||
|
localStorage.clear();
|
||||||
|
|
||||||
|
|
||||||
|
// No peers for the sake of example,
|
||||||
|
// but this could easily be a collaborative
|
||||||
|
// todolist by adding a few peers
|
||||||
|
var gun = new Gun();
|
||||||
|
var todos = gun.get('todos');
|
||||||
|
|
||||||
|
new Vue({
|
||||||
|
data: {
|
||||||
|
todos: [],
|
||||||
|
newTodo: ""
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
activeTodos: function() {
|
||||||
|
return this.todos.filter(function(todo) {
|
||||||
|
return todo.todo.completed === '';
|
||||||
|
});
|
||||||
|
},
|
||||||
|
completedTodos: function() {
|
||||||
|
return this.todos.filter(function(todo) {
|
||||||
|
return todo.todo.completed !== '';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
todoUpdated: function(todo, nodeKey) {
|
||||||
|
if (/\D/.test(nodeKey)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var existingTodoIndex = this.todos.findIndex(function(todo) {
|
||||||
|
return todo.key === nodeKey
|
||||||
|
});
|
||||||
|
var todoToStore = {
|
||||||
|
todo: todo,
|
||||||
|
key: nodeKey
|
||||||
|
};
|
||||||
|
if (existingTodoIndex === -1) {
|
||||||
|
this.todos.push(todoToStore);
|
||||||
|
} else {
|
||||||
|
this.todos.splice(existingTodoIndex, 1, todoToStore);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
addTodo: function() {
|
||||||
|
var newTodo = todos.get(Date.now().toString());
|
||||||
|
newTodo.put({
|
||||||
|
description: this.newTodo,
|
||||||
|
completed: ''
|
||||||
|
});
|
||||||
|
todos.set(newTodo);
|
||||||
|
this.newTodo = "";
|
||||||
|
},
|
||||||
|
completeTodo: function(key) {
|
||||||
|
todos.get(key).put({
|
||||||
|
completed: Date.now()
|
||||||
|
});
|
||||||
|
},
|
||||||
|
reopenTodo: function(key) {
|
||||||
|
todos.get(key).put({
|
||||||
|
completed: ''
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted: function() {
|
||||||
|
|
||||||
|
// Subscribe to updates on the todos set
|
||||||
|
todos.map().on(this.todoUpdated.bind(this));
|
||||||
|
}
|
||||||
|
}).$mount('#app');
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</html>
|
Loading…
x
Reference in New Issue
Block a user