-
Notifications
You must be signed in to change notification settings - Fork 0
/
todo.js
162 lines (154 loc) · 4.77 KB
/
todo.js
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
jQuery(function($) {
// todoの値保持用変数
var todoText = '';
// 初期表示
renderTodoList();
/**
* Todo削除ボタン押下時イベント
* @param {[type]} event [description]
* @return {[type]} [description]
*/
$(document).on('click', 'button.remove', function(event) {
var param = $(this).attr('class').split(' ')[0].replace('todo-', '');
$.ajax({
url: '/deleteTodo',
type: 'DELETE',
data: param
})
.done(function() {
console.log("success");
renderTodoList();
})
.fail(function() {
console.log("error");
});
});
/**
* 新規Todo追加 - ボタンにより追加を行う
* @param {[type]} event [description]
* @return {[type]} [description]
*/
$(document).on('click', 'button.insert', function(event) {
var currentText = $(this).parent().prev().children('.todo-txt').val();
$.ajax({
url: '/addTodo',
type: 'POST',
data: currentText
})
.done(function() {
console.log('success');
renderTodoList();
})
.fail(function() {
console.log('error');
});
});
/**
* Todo押下時にテキストエリアに変更
* @param {[type]} event [description]
* @return {[type]} [description]
*/
$(document).on('click', 'span.todo-content', function(event) {
// テキストエリアに変換(input.todo-txt)
// テキストの内容を保持
todoText = $(this).text();
var $li = $(this).parent();
$li.empty();
$li.append('<input type="text" class="todo-edit">');
$li.children('.todo-edit').val(todoText);
// フォーカスをあてる
$li.children('.todo-edit').focus();
});
/**
* Todoからフォーカスが外れたときに入力値を保存 - 編集のみ
* @param {[type]} event [description]
* @return {[type]} [description]
*/
$(document).on('blur', 'input.todo-edit', function(event) {
// 事前に保持しておいたテキストの内容と比較して、
// 差異がなければサーバ通信しない
var currentText = $(this).val();
if(typeof currentText === 'undefined' || currentText === '') {
return false;
}
var param = {};
param.id = $(this).parent('td').attr('class').split(' ')[0].replace('todo-', '');
param.todo = currentText;
$.ajax({
url: '/updateTodo',
type: 'POST',
data: JSON.stringify(param)
})
.done(function() {
console.log('success');
renderTodoList();
})
.fail(function() {
console.log('error');
});
});
/**
* 完了・未完了切替時イベント
* @param {[type]} event [description]
* @return {[type]} [description]
*/
$(document).on('click', 'input[type=checkbox].todo-check', function(event) {
var param = {};
param.id = $(this).val();
param.doneTodo = $(this).prop('checked');
$.ajax({
url: '/changeStateTodo',
type: 'POST',
data: JSON.stringify(param)
})
.done(function() {
console.log('success');
})
.fail(function() {
console.log('error');
});
});
/**
* Todoリスト表示処理
* @return {[type]} [description]
*/
function renderTodoList() {
/**
* 初期表示時にデータ取得リクエストを飛ばす(取得なのでgetリクエスト)
* [url description]
* @type {String}
*/
$.ajax({
// node側のrequestHandlersに以下のurlをハンドリングしておく
url: '/getTodo',
dataType: 'json', // dataTypeはレスポンスデータに対する指定
})
.done(function(res) {
console.log("success");
$('#todo-list').empty();
res.forEach(function(data) {
// todo消化済みの場合はチェックを付ける
var checkboxDomString = '';
if(data.done_todo) {
checkboxDomString = '<input type="checkbox" value="'+ data.id +'" class="todo-check" checked="checked">';
}
else {
checkboxDomString = '<input type="checkbox" value="'+ data.id +'" class="todo-check">';
}
$('#todo-list').append('<tr>' +
'<td class="todo-' + data.id + '">' +
checkboxDomString +
'<span class="todo-content">' + data.todo + '</span>' +
'</td>' +
'<td>' +
'<button class="todo-' + data.id + ' remove">削除</button>' +
'</td>' +
'</tr>');
});
$('#todo-list').append('<tr><td><input type="text" class="todo-txt"></td><td><button class="insert">追加</button></td></tr>');
})
.fail(function() {
console.log("error");
});
}
});