search.nim 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import strutils, strformat, unicode, tables
  2. import karax/[karaxdsl, vdom, vstyles]
  3. import renderutils, timeline
  4. import ".."/[types, formatters, query]
  5. let toggles = {
  6. "nativeretweets": "Retweets",
  7. "media": "Media",
  8. "videos": "Videos",
  9. "news": "News",
  10. "verified": "Verified",
  11. "native_video": "Native videos",
  12. "replies": "Replies",
  13. "links": "Links",
  14. "images": "Images",
  15. "safe": "Safe",
  16. "quote": "Quotes",
  17. "pro_video": "Pro videos"
  18. }.toOrderedTable
  19. proc renderSearch*(): VNode =
  20. buildHtml(tdiv(class="panel-container")):
  21. tdiv(class="search-bar"):
  22. form(`method`="get", action="/search"):
  23. hiddenField("kind", "users")
  24. input(`type`="text", name="text", autofocus="", placeholder="Enter username...")
  25. button(`type`="submit"): icon "search"
  26. proc getTabClass(query: Option[Query]; tab: string): string =
  27. var classes = @["tab-item"]
  28. if query.isNone or get(query).kind == multi:
  29. if tab == "posts":
  30. classes.add "active"
  31. elif $get(query).kind == tab:
  32. classes.add "active"
  33. return classes.join(" ")
  34. proc renderProfileTabs*(query: Option[Query]; username: string): VNode =
  35. let link = "/" & username
  36. buildHtml(ul(class="tab")):
  37. li(class=query.getTabClass("posts")):
  38. a(href=link): text "Tweets"
  39. li(class=query.getTabClass("replies")):
  40. a(href=(link & "/replies")): text "Tweets & Replies"
  41. li(class=query.getTabClass("media")):
  42. a(href=(link & "/media")): text "Media"
  43. li(class=query.getTabClass("custom")):
  44. a(href=(link & "/search")): text "Custom"
  45. proc renderSearchTabs*(query: Option[Query]): VNode =
  46. var q = if query.isSome: get(query) else: Query()
  47. buildHtml(ul(class="tab")):
  48. li(class=query.getTabClass("custom")):
  49. q.kind = custom
  50. a(href=genQueryUrl(q)): text "Tweets"
  51. li(class=query.getTabClass("users")):
  52. q.kind = users
  53. a(href=genQueryUrl(q)): text "Users"
  54. proc renderSearchPanel*(query: Query): VNode =
  55. let user = query.fromUser.join(",")
  56. let action = if user.len > 0: &"/{user}/search" else: "/search"
  57. buildHtml(form(`method`="get", action=action, class="search-field")):
  58. hiddenField("kind", "custom")
  59. genInput("text", "", query.text, "Enter search...", class="pref-inline")
  60. button(`type`="submit"): icon "search"
  61. input(id="search-panel-toggle", `type`="checkbox")
  62. label(`for`="search-panel-toggle"):
  63. icon "down"
  64. tdiv(class="search-panel"):
  65. for f in @["filter", "exclude"]:
  66. span(class="search-title"): text capitalize(f)
  67. tdiv(class="search-toggles"):
  68. for k, v in toggles:
  69. let state =
  70. if f == "filter": k in query.filters
  71. else: k in query.excludes
  72. genCheckbox(&"{f[0]}-{k}", v, state)
  73. proc renderTweetSearch*(tweets: Result[Tweet]; prefs: Prefs; path: string): VNode =
  74. let query =
  75. if tweets.query.isSome: get(tweets.query)
  76. else: Query(kind: custom)
  77. buildHtml(tdiv(class="timeline-container")):
  78. if query.fromUser.len > 1:
  79. tdiv(class="timeline-header"):
  80. text query.fromUser.join(" | ")
  81. if query.fromUser.len == 0 or query.kind == custom:
  82. tdiv(class="timeline-header"):
  83. renderSearchPanel(query)
  84. if query.fromUser.len > 0:
  85. renderProfileTabs(tweets.query, query.fromUser.join(","))
  86. else:
  87. renderSearchTabs(tweets.query)
  88. renderTimelineTweets(tweets, prefs, path)
  89. proc renderUserSearch*(users: Result[Profile]; prefs: Prefs): VNode =
  90. let searchText =
  91. if users.query.isSome: get(users.query).text
  92. else: ""
  93. buildHtml(tdiv(class="timeline-container")):
  94. tdiv(class="timeline-header"):
  95. form(`method`="get", action="/search", class="search-field"):
  96. hiddenField("kind", "users")
  97. genInput("text", "", searchText, "Enter username...", class="pref-inline")
  98. button(`type`="submit"): icon "search"
  99. renderSearchTabs(users.query)
  100. renderTimelineUsers(users, prefs)