89 lines
2.2 KiB
Nim
89 lines
2.2 KiB
Nim
|
|
import vdom, karax, karaxdsl, jdict, jstrutils
|
|
|
|
when false:
|
|
var plugins {.exportc.}: seq[(string, proc())] = @[]
|
|
|
|
proc onInput(val: cstring) =
|
|
kout val
|
|
if val == "dyn":
|
|
let body = getElementById("body")
|
|
body.prepend(tree("script", [("type", "text/javascript"), ("src", "nimcache/dyn.js")]))
|
|
redraw()
|
|
kout(plugins.len)
|
|
if plugins.len > 0:
|
|
plugins[0][1]()
|
|
|
|
var
|
|
entries: seq[cstring]
|
|
selectedEntry = -1
|
|
|
|
proc onTodoEnter(val: cstring) =
|
|
entries.add val
|
|
|
|
proc removeHandler(ev: Event; n: VNode) =
|
|
let id = suffixAsInt(n.id, "remove:")
|
|
#entries.delete(id)
|
|
entries[id] = nil
|
|
|
|
proc editHandler(ev: Event; n: VNode) =
|
|
let id = suffixAsInt(n.id, "edit:")
|
|
selectedEntry = id
|
|
|
|
when defined(usecache):
|
|
var entryCache = newJDict[int, VNode]()
|
|
|
|
proc editInput(i: int; d: cstring): VNode =
|
|
proc onTodoChange(val: cstring) =
|
|
entries[i] = val
|
|
selectedEntry = -1
|
|
result = enterInput("todo-edit", d, onTodoChange)
|
|
result.setOnfocuslost(proc (ev: Event; n: VNode) = selectedEntry = -1)
|
|
|
|
proc createEntry(i: int; d: cstring; selected: bool): VNode =
|
|
# implement caching:
|
|
when defined(usecache):
|
|
if entryCache.contains(i):
|
|
let old = entryCache[i]
|
|
return old
|
|
|
|
result = buildHtml(tr) do:
|
|
td(id="edit:" & $i, onclick=editHandler):
|
|
if selected:
|
|
editInput(i, d)
|
|
else:
|
|
text d
|
|
td:
|
|
span(id="remove:" & $i, onclick=removeHandler):
|
|
text "[remove]"
|
|
when defined(usecache):
|
|
entryCache[i] = result
|
|
|
|
proc createDom(): VNode =
|
|
result = buildHtml(tdiv) do:
|
|
tdiv(id = "sheader"):
|
|
#text "plugin"
|
|
#realtimeInput("by-name", "", onInput)
|
|
#br()
|
|
|
|
text cstring"todo"
|
|
enterInput("todo-input", "", onTodoEnter)
|
|
var entriesCount = 0
|
|
table(class = "wl"):
|
|
for i, d in entries:
|
|
if d != nil:
|
|
createEntry(i, d, i == selectedEntry)
|
|
inc entriesCount
|
|
tdiv(id = "footer"):
|
|
text cstring"Entries: " & &entriesCount
|
|
proc onAllDone(ev: Event; n: VNode) =
|
|
entries = @[]
|
|
selectedEntry = -1
|
|
button "All done!", onAllDone, entriesCount == 0 or selectedEntry >= 0
|
|
|
|
setRenderer createDom
|
|
|
|
proc onload(session: cstring) {.exportc.} =
|
|
for i in 0..10_000:
|
|
entries.add("Entry " & $i)
|
|
redraw()
|