π μ‘°ν
selectedDateObj λ³κ²½ μ loadTodoList νΈμΆ
watch(selectedDateObj, () => {
if (!tokenRef.value) return;
loadTodoList();
});
fetchTodosApi νΈμΆ
async function loadTodoList() {
const res = await fetchTodosApi({
date: selectedDate.value,
authHeader: authHeaderFn(),
});
todoList.value = Array.isArray(res) ? res : [];
}
μλ³ summary μ‘°ν
async function loadMonthSummary(monthStr) {
currentMonth.value = monthStr;
const data = await fetchMonthSummaryApi({
monthStr,
authHeader: authHeaderFn(),
});
const map = {};
data.forEach(row => {
map[row.date] = {
total: row.total,
remaining: row.remaining,
};
});
monthRemainingMap.value = map;
}
μ νν λ μ§κ° λ³κ²½λ λλ§λ€ ν΄λΉ λ μ§ Todo μ‘°ν
watch(selectedDateObj, () => {
if (!tokenRef.value) return;
loadTodoList();
});
μ΅μ΄ μ§μ μ mountedμμ μ΄κΈ° μ‘°ν
onMounted(async () => {
const { year, month } = getYMFromDate(selectedDateObj.value);
const initMonth = toMonthStr(year, month);
await loadTodoList();
await loadMonthSummary(initMonth);
});
π μΆκ°
inputμμ μν° λλ₯΄λ©΄ addTodo μ€ν
<input
type="text"
v-model="newTitle"
@keydown.enter="addTodo"
/>
title, dateλ₯Ό paramμΌλ‘ μ λ¬
const res = await addTodoApi({
title,
date: selectedDate.value,
authHeader: authHeaderFn(),
});
μΆκ° ν λͺ©λ‘ + μ summary μ¬μ‘°ν
newTitle.value = "";
await loadTodoList();
await loadMonthSummary(currentMonth.value);
π λ΄μ© μμ
edit μνμμ μν° μ saveEdit μ€ν
async function saveEdit(id) {
await editTodoApi({
id,
title,
authHeader: authHeaderFn(),
});
}
μμ ν λͺ©λ‘ + μ summary μ¬μ‘°ν
await loadTodoList();
await loadMonthSummary(currentMonth.value);
π μΌμ μλ£(체ν¬)
μ²΄ν¬ μ toggleTodo μ€ν
async function toggleTodo(todo) {
await toggleTodoApi({
id: todo._id,
done: !todo.done,
authHeader: authHeaderFn(),
});
}
μ΄ν λͺ©λ‘ + μ summary μ¬μ‘°ν
await loadTodoList();
await loadMonthSummary(currentMonth.value);
π μμ
async function deleteTodo(id) {
await deleteTodoApi({
id,
authHeader: authHeaderFn(),
});
}
await loadTodoList();
await loadMonthSummary(currentMonth.value);