-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.ts
115 lines (104 loc) · 3.28 KB
/
app.ts
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
// عناصر استفاده شده
const newItemInput = document.querySelector(
".new-item > input"
) as HTMLInputElement;
const addItemBtn = document.querySelector(
".new-item > button"
) as HTMLButtonElement;
const itemsList = document.querySelector(".items") as HTMLDivElement;
// اجرای مقدار دهی اولیه
initFromStorage(itemsList);
// افزودن آیتم جدید
addItemBtn.addEventListener("click", () => {
const value = getValidValue(newItemInput);
if (value) {
const item = makeNewItem(itemsList, value);
itemsList.appendChild(item);
updateStorage(itemsList);
newItemInput.value = "";
}
});
// تعریف توابع
// متن آیتم
function setItemText(item: HTMLDivElement, text: string) {
const span = item.querySelector("span") as HTMLSpanElement;
span.textContent = text;
}
// قابلیت حذف آیتم
function setItemDelete(item: HTMLDivElement, list: HTMLDivElement) {
const delBtn = item.querySelector("button") as HTMLButtonElement;
delBtn.addEventListener("click", () => {
item.remove();
updateStorage(list);
});
}
// قابلیت تیک زدن آیتم
function setItemCheck(
item: HTMLDivElement,
isChecked: boolean,
list: HTMLDivElement
) {
const checkInput = item.querySelector("input") as HTMLInputElement;
checkInput.checked = isChecked;
updateItemClass(item, checkInput);
checkInput.addEventListener("change", () => {
updateItemClass(item, checkInput);
updateStorage(list);
});
}
function updateItemClass(item: HTMLDivElement, checkInput: HTMLInputElement) {
if (checkInput.checked) {
item.classList.add("done");
} else {
item.classList.remove("done");
}
}
// ایجاد آیتم جدید
function makeNewItem(list: HTMLDivElement, text: string, isChecked = false) {
const template = list.querySelector(".template") as HTMLDivElement;
const item = template.cloneNode(true) as HTMLDivElement;
item.classList.remove("template");
setItemText(item, text);
setItemDelete(item, list);
setItemCheck(item, isChecked, list);
return item;
}
// گرفتن مقدار صحیح از ورودی
function getValidValue(input: HTMLInputElement) {
if (!input.value) {
alert("ابتدا باید چیزی بنویسید");
input.focus();
return null;
}
return input.value;
}
// ذخیره لیست آیتم ها
function updateStorage(list: HTMLDivElement) {
const items = list.querySelectorAll(".item:not(.template)");
const array = Array.from(items, (item) => {
const span = item.querySelector("span") as HTMLSpanElement;
const input = item.querySelector("input") as HTMLInputElement;
return {
text: span.textContent,
isChecked: input.checked,
};
});
localStorage.setItem("todo-items", JSON.stringify(array));
}
interface TodoItemData {
text: string;
isChecked: boolean;
}
// گرفتن مقادر ذخیره شده
function getStorageValues(): TodoItemData[] {
const jsonArray = localStorage.getItem("todo-items") || "[]";
return JSON.parse(jsonArray);
}
// مقدار دهی اولیه از ایتم های ذخیره شده
function initFromStorage(list: HTMLDivElement) {
const values = getStorageValues();
values.forEach(({ text, isChecked }) => {
const item = makeNewItem(list, text, isChecked);
itemsList.appendChild(item);
});
}