forked from Thinkful-Ed/shopping-list
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
109 lines (92 loc) · 2.99 KB
/
app.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
var state = {
items: []
};
$(function() {
var formElement = $('#js-shopping-list-form');
var listElement = $('.js-shopping-list');
var newItemIdentifier = '#js-new-item';
var removeIdentifier = '.js-shopping-item-delete';
var itemDataAttr = 'data-list-item-id';
var toggleIdentifier = '.js-shopping-item-toggle'
handleItemAdds(
formElement, newItemIdentifier, itemDataAttr, listElement, state);
handleItemDeletes(
formElement, removeIdentifier, itemDataAttr, listElement, state);
handleItemToggles(listElement, toggleIdentifier, itemDataAttr, state);
});
function handleItemAdds(
formElement, newItemIdentifier, itemDataAttr, listElement, state) {
formElement.submit(function(event) {
event.preventDefault();
var newItem = formElement.find(newItemIdentifier).val();
addItem(state, newItem);
renderList(state, listElement, itemDataAttr);
// reset form
this.reset();
});
}
function handleItemDeletes(
formElement, removeIdentifier, itemDataAttr, listElement, state) {
listElement.on('click', removeIdentifier, function(event) {
var itemIndex = parseInt($(this).closest('li').attr(itemDataAttr));
deleteItem(state, itemIndex);
renderList(state, listElement, itemDataAttr);
})
}
function handleItemToggles(
listElement, toggleIdentifier, itemDataAttr, state) {
listElement.on('click', toggleIdentifier, function(event) {
var itemId = $(event.currentTarget.closest('li')).attr(itemDataAttr);
var oldItem = getItem(state, itemId);
updateItem(state, itemId, {
displayName: oldItem.displayName,
checkedOff: !oldItem.checkedOff
});
renderList(state, listElement, itemDataAttr)
});
}
var listItemTemplate = (
'<li>' +
'<span class="shopping-item js-shopping-item"></span>' +
'<div class="shopping-item-controls">' +
'<button class="js-shopping-item-toggle">' +
'<span class="button-label">check</span>' +
'</button>' +
'<button class="js-shopping-item-delete">' +
'<span class="button-label">delete</span>' +
'</button>' +
'</div>' +
'</li>'
);
function addItem(state, item) {
state.items.push({
displayName: item,
checkedOff: false
});
}
function getItem(state, itemIndex) {
return state.items[itemIndex];
}
function deleteItem(state, itemIndex) {
state.items.splice(itemIndex, 1);
}
function updateItem(state, itemIndex, newItemState) {
state.items[itemIndex] = newItemState;
}
function renderItem(item, itemId, itemTemplate, itemDataAttr) {
var element = $(itemTemplate);
element.find('.js-shopping-item').text(item.displayName);
if (item.checkedOff) {
element.find('.js-shopping-item').addClass('shopping-item__checked');
}
element.find('.js-shopping-item-toggle')
element.attr(itemDataAttr, itemId);
return element;
}
function renderList(state, listElement, itemDataAttr) {
var itemsHTML = state.items.map(
function(item, index) {
return renderItem(item, index, listItemTemplate, itemDataAttr);
});
listElement.html(itemsHTML);
}