Guest User

Untitled

a guest
Jun 19th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.04 KB | None | 0 0
  1. (ns pantrack.routes.tasks
  2. (:require [reagent.core :as r]
  3. [reagent.session :as session]
  4. [secretary.core :as secretary :include-macros true]
  5. [pantrack.env :as env :refer [navigate! component]]
  6. [pantrack.util :as util]
  7. [pantrack.db :as db]
  8. [pantrack.hunt :as hunt]
  9. [dommy.core :refer-macros [sel sel1]]
  10. [cljsjs.recharts]
  11. [cljsjs.moment]
  12. [clojure.string :as str]))
  13.  
  14. (def table-state
  15. (r/atom
  16. {:column nil
  17. :per-page 12
  18. :cur-page nil
  19. :all-data nil
  20. :page-data nil
  21. :direction nil
  22. :page-count nil
  23. :message-hidden true}))
  24.  
  25. (defn init-table-state []
  26. (let [all-data (map #(assoc % :desc (or (:short-desc %) (:long-desc %)))
  27. (if (contains? @hunt/search-results :tickets)
  28. (:tickets @hunt/search-results)
  29. @db/tickets))]
  30. (swap! table-state assoc
  31. :all-data all-data
  32. :page-data (vec (take 12 all-data))
  33. :page-count (js/Math.ceil
  34. (/ (count all-data)
  35. (:per-page @table-state)))
  36. :message-hidden true
  37. :cur-page 0)))
  38.  
  39. (add-watch
  40. db/tickets :notify-change
  41. (fn [_ _ old new]
  42. (js/console.debug "notifying of tasks change")
  43. (letfn [(get-ticket [n]
  44. (-> #(== n (:number %))
  45. (filter new)
  46. first))
  47. (update-all-data [i m]
  48. (swap! table-state assoc
  49. :all-data (assoc (:all-data @table-state)
  50. i (get-ticket (:number m)))))
  51. (update-page-data [i m]
  52. (swap! table-state assoc
  53. :page-data (assoc (:page-data @table-state)
  54. i (get-ticket (:number m)))))]
  55. (cond
  56. (not (empty? @hunt/search-filters)) (do (hunt/update-search-results! @hunt/search-filters "")
  57. (init-table-state))
  58. (zero? (count (:all-data @table-state))) (init-table-state)
  59. (not= (count (:all-data @table-state)) (count new)) (swap! table-state assoc
  60. :message-hidden false)
  61. :else (do (js/console.debug "updating tasks in-place")
  62. (doall (map-indexed update-page-data (:page-data @table-state)))
  63. (doall (map-indexed update-all-data (:all-data @table-state))))))))
  64.  
  65. (add-watch
  66. hunt/search-results :notify-change
  67. (fn [_ _ old new]
  68. (init-table-state)))
  69.  
  70. (defn sort-table [k]
  71. (let [{:keys [column per-page cur-page direction all-data]} @table-state
  72. sorted-data (sort-by k all-data)]
  73. (if (not= column k)
  74. (swap! table-state assoc
  75. :column k
  76. :direction "ascending"
  77. :page-data (take per-page
  78. (drop (* cur-page per-page)
  79. sorted-data)))
  80. (swap! table-state assoc
  81. :page-data (take per-page
  82. (drop (* cur-page per-page)
  83. (if (= direction "ascending")
  84. (reverse sorted-data)
  85. sorted-data)))
  86. :direction (if (= direction "ascending")
  87. "descending"
  88. "ascending")))))
  89.  
  90. (defn get-page [n]
  91. (let [{:keys [column direction per-page cur-page all-data]} @table-state
  92. sorted-data (if (and (some? direction) (some? column))
  93. (let [sorted (sort-by column all-data)]
  94. (if (= direction "ascending")
  95. sorted
  96. (reverse sorted)))
  97. all-data)]
  98. (swap! table-state assoc
  99. :cur-page n
  100. :page-data (take per-page
  101. (drop (* n per-page)
  102. sorted-data)))))
  103.  
  104. (defn my-header-cell
  105. ([heading k]
  106. (let [t-header-cell (component "Table" "HeaderCell")]
  107. [:> t-header-cell
  108. {:style {:border-left "0px"}
  109. :sorted (if (= (:column @table-state) k)
  110. (:direction @table-state)
  111. nil)
  112. :onClick #(sort-table k)}
  113. heading]))
  114. ([heading]
  115. (my-header-cell
  116. heading
  117. (keyword
  118. (str/lower-case
  119. (str/replace
  120. heading #" " "-"))))))
  121.  
  122. (defn search-filters []
  123. (when (not (empty? @hunt/search-filters))
  124. (let [label (component "Label")
  125. f (fn [[k v]]
  126. ^{:key (name k)}
  127. [:> label
  128. {:onClick #(do
  129. (swap! hunt/search-filters dissoc k)
  130. (hunt/update-search-results!
  131. @hunt/search-filters
  132. (.-value (sel1 "input#searchbar.prompt"))))}
  133. (str (str/capitalize (name k)) ": " v)])]
  134. [:div {:id "search-filters"}
  135. (map f @hunt/search-filters)])))
  136.  
  137. (defn sortable-table []
  138. (let [table (component "Table")
  139. t-header (component "Table" "Header")
  140. t-row (component "Table" "Row")
  141. t-header-cell (component "Table" "HeaderCell")
  142. t-body (component "Table" "Body")
  143. t-cell (component "Table" "Cell")
  144. t-footer (component "Table" "Footer")
  145. icon (component "Icon")
  146. pagination (component "Pagination")
  147. label (component "Label")
  148. button (component "Button")]
  149. [:> table {:sortable true
  150. :compact true :striped true
  151. :style {:margin-top "50px"}
  152. :selectable true :basic "very"
  153. :unstackable true}
  154. [:> t-header
  155. [:> t-row
  156. [my-header-cell "Number"]
  157. [my-header-cell "Requested by" :requestor]
  158. [my-header-cell "Description" :desc]
  159. [my-header-cell "Status"]
  160. [my-header-cell "Assigned to"]
  161. [my-header-cell "Last Updated"]]]
  162. [:> t-body
  163. (map-indexed
  164. (fn [i d]
  165. ^{:key (str i)}
  166. [:> t-row {:onClick #(navigate! (str "/ticket/" (:number d)))}
  167. [:> t-cell
  168. [:> icon
  169. (case (:priority d)
  170. "Urgent" {:name "angle double up" :color "red"}
  171. "High" {:name "angle up" :color "orange"}
  172. "Routine" {:name "angle down"}
  173. "Low" {:name "angle double down" :color "blue"})]
  174. (:number d)]
  175. [:> t-cell (:requestor d)]
  176. [:> t-cell [:div.truncate (or (:short-desc d) (:long-desc d))]]
  177. [:> t-cell (:status d)]
  178. [:> t-cell (:assigned-to d)]
  179. [:> t-cell (:last-updated d)]])
  180. (:page-data @table-state))]
  181. [:> t-footer
  182. [:> t-row
  183. [:> t-header-cell {:colSpan 5}
  184. [:> pagination {:activePage (inc (:cur-page @table-state))
  185. :totalPages (:page-count @table-state)
  186. :onPageChange #(get-page (dec (.-activePage %2)))
  187. :floated "right"}]]
  188. [:> t-header-cell
  189. [:> button {:floated "right" :circular true
  190. :icon "plus" :size "big"
  191. :disabled (nil? @db/logged-in-user)
  192. :onClick #(navigate! "/add-task")}]]]]]))
  193.  
  194. (defn tasks-page []
  195. (let [message (component "Message")
  196. statistic-group (component "Statistic" "Group")
  197. statistic-value (component "Statistic" "Value")
  198. statistic-label (component "Statistic" "Label")
  199. statistic (component "Statistic")
  200. icon (component "Icon")
  201. _ (init-table-state)]
  202. (fn []
  203. (let [priorities (frequencies
  204. (map :priority
  205. (filter (fn [t]
  206. (not-any? #(= (:status t) %)
  207. [:completed :denied]))
  208. (:all-data @table-state))))]
  209. [:div
  210. [search-filters]
  211. [:> statistic-group {:widths "four"
  212. :style {:padding-top "30px"}}
  213. [:> statistic {:color "red"}
  214. [:> statistic-value
  215. [:> icon {:name "angle double up"}]
  216. (or (get priorities "Urgent") 0)]
  217. [:> statistic-label "Urgent"]]
  218. [:> statistic {:color "orange"}
  219. [:> statistic-value
  220. [:> icon {:name "angle up"}]
  221. (or (get priorities "High") 0)]
  222. [:> statistic-label "High"]]
  223. [:> statistic
  224. [:> statistic-value
  225. [:> icon {:name "angle down"}]
  226. (or (get priorities "Routine") 0)]
  227. [:> statistic-label "Routine"]]
  228. [:> statistic {:color "blue"}
  229. [:> statistic-value
  230. [:> icon {:name "angle double down"}]
  231. (or (get priorities "Low") 0)]
  232. [:> statistic-label "Low"]]]
  233. [:> message {:hidden (:message-hidden @table-state)
  234. :onClick init-table-state
  235. :icon "ticket"
  236. :header "New tickets are available for viewing"
  237. :content "Click to reload tickets"}]
  238. [sortable-table]]))))
  239.  
  240. (swap! env/pages assoc :tasks #'tasks-page)
  241.  
  242. (secretary/defroute "/tasks" []
  243. (session/put! :page :tasks))
Add Comment
Please, Sign In to add comment