preferences.nim 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import tables, macros, strutils
  2. import karax/[karaxdsl, vdom]
  3. import renderutils
  4. import ../types, ../prefs_impl
  5. macro renderPrefs*(): untyped =
  6. result = nnkCall.newTree(
  7. ident("buildHtml"), ident("tdiv"), nnkStmtList.newTree())
  8. for header, options in prefList:
  9. result[2].add nnkCall.newTree(
  10. ident("legend"),
  11. nnkStmtList.newTree(
  12. nnkCommand.newTree(ident("text"), newLit(header))))
  13. for pref in options:
  14. let procName = ident("gen" & capitalizeAscii($pref.kind))
  15. let state = nnkDotExpr.newTree(ident("prefs"), ident(pref.name))
  16. var stmt = nnkStmtList.newTree(
  17. nnkCall.newTree(procName, newLit(pref.name), newLit(pref.label), state))
  18. case pref.kind
  19. of checkbox: discard
  20. of input: stmt[0].add newLit(pref.placeholder)
  21. of select:
  22. if pref.name == "theme":
  23. stmt[0].add ident("themes")
  24. else:
  25. stmt[0].add newLit(pref.options)
  26. result[2].add stmt
  27. proc renderPreferences*(prefs: Prefs; path: string; themes: seq[string]): VNode =
  28. buildHtml(tdiv(class="overlay-panel")):
  29. fieldset(class="preferences"):
  30. form(`method`="post", action="/saveprefs"):
  31. refererField path
  32. renderPrefs()
  33. h4(class="cookie-note"):
  34. text "Preferences are stored client-side using cookies without any personal information."
  35. button(`type`="submit", class="pref-submit"):
  36. text "Save preferences"
  37. buttonReferer "/resetprefs", "Reset Preferences", path, class="pref-reset"