import vdom, karax, karaxdsl, jstrutils, components, karaxdb/client type Filter = enum all, active, completed var selectedEntry = -1 filter: Filter entriesLen: int data: Db registerOnUpdate proc(newDb: Db) = merge(newDb, data) data = newDb redraw() const contentSuffix = cstring"content" completedSuffix = cstring"completed" lenSuffix = cstring"entriesLen" proc getEntryContent(pos: int): cstring = extract(data, &pos, contentSuffix) proc isCompleted(pos: int): bool = var value = extract(data, &pos, completedSuffix) result = value == cstring"true" proc setEntryContent(pos: int, content: cstring) = insert(data, &pos, contentSuffix, content) proc markAsCompleted(pos: int, completed: bool) = insert(data, &pos, completedSuffix, &completed) proc addEntry(content: cstring, completed: bool) = setEntryContent(entriesLen, content) markAsCompleted(entriesLen, completed) inc entriesLen insert(data, lenSuffix, "equals", &entriesLen) proc updateEntry(pos: int, content: cstring, completed: bool) = setEntryContent(pos, content) markAsCompleted(pos, completed) proc onTodoEnter(ev: Event; n: VNode) = addEntry(n.value, false) n.value = "" proc removeHandler(ev: Event; n: VNode) = updateEntry(n.key, cstring(nil), false) proc editHandler(ev: Event; n: VNode) = selectedEntry = n.key proc focusLost(ev: Event; n: VNode) = selectedEntry = -1 proc editEntry(ev: Event; n: VNode) = setEntryContent(n.key, n.value) selectedEntry = -1 proc toggleEntry(ev: Event; n: VNode) = let id = n.key markAsCompleted(id, not isCompleted(id)) proc onAllDone(ev: Event; n: VNode) = insert(data, lenSuffix, "equals", "0") selectedEntry = -1 proc clearCompleted(ev: Event, n: VNode) = for i in 0..