-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy pathController.cs
132 lines (113 loc) · 3.62 KB
/
Controller.cs
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
using System;
using System.Text.RegularExpressions;
namespace TodoMVC
{
public partial class Controller
{
private string? _activeRoute;
private string? _lastActiveRoute;
private Store store { get; }
private View view { get; }
public Controller(Store store, View view)
{
this.store = store;
this.view = view;
view.BindAddItem(AddItem);
view.BindEditItemSave(EditItemSave);
view.BindEditItemCancel(EditItemCancel);
view.BindRemoveItem(RemoveItem);
view.BindToggleItem((id, completed) =>
{
ToggleCompleted(id, completed);
_filter(true);
});
view.BindRemoveCompleted(RemoveCompletedItems);
view.BindToggleAll(ToggleAll);
_activeRoute = "";
_lastActiveRoute = null;
}
[GeneratedRegex("^#\\/")]
private static partial Regex GetUrlHashRegex();
public void SetView(string? urlHash)
{
var route = GetUrlHashRegex().Replace(urlHash ?? "", "");
_activeRoute = route;
_filter();
view.UpdateFilterButtons(route);
}
public void AddItem(string title)
{
store.Insert(new Item
{
Id = DateTime.UtcNow.Ticks / 10000,
Title = title,
Completed = false
});
view.ClearNewTodo();
_filter(true);
}
public void EditItemSave(long id, string title)
{
if (title.Length != 0)
{
store.Update(new Item { Id = id, Title = title });
view.EditItemDone(id, title);
}
else
{
RemoveItem(id);
}
}
public void EditItemCancel(long id)
{
var items = store.Find(id, null, null);
var title = items[0].Title!;
view.EditItemDone(id, title);
}
public void RemoveItem(long id)
{
store.Remove(id, null, null);
_filter();
view.RemoveItem(id);
}
public void RemoveCompletedItems()
{
store.Remove(null, null, true);
_filter(true);
}
public void ToggleCompleted(long id, bool completed)
{
store.Update(new Item { Id = id, Completed = completed });
view.SetItemComplete(id, completed);
}
public void ToggleAll(bool completed)
{
var todos = store.Find(null, null, !completed);
foreach (var item in todos)
{
ToggleCompleted(item.Id, completed);
}
_filter(true);
}
void _filter(bool force = false)
{
var route = _activeRoute;
if (force || _lastActiveRoute != "" || _lastActiveRoute != route)
{
var todos = route switch
{
"active" => store.Find(null, null, false),
"completed" => store.Find(null, null, true),
_ => store.Find(null, null, null),
};
view.ShowItems(todos);
}
var count = store.Count();
view.SetItemsLeft(count.active);
view.SetClearCompletedButtonVisibility(count.completed != 0);
view.SetCompleteAllCheckbox(count.completed == count.total);
view.SetMainVisibility(count.total != 0);
_lastActiveRoute = route;
}
}
}