selector.cljs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. (ns lineup.components.edit.selector
  2. (:require
  3. [clojure.string :as string]
  4. [lineup.events :as events]
  5. [lineup.subs :as subs]
  6. [re-com.core :as re-com]
  7. [re-frame.core :as re-frame]
  8. [reagent.ratom :as r]))
  9. (defn- selection-item [which library-item]
  10. [re-com/h-box
  11. :gap "20px"
  12. :align :center
  13. :align-self :start
  14. :attr {:on-click #(re-frame/dispatch [::events/select-task which (:id library-item)])}
  15. :class "task-selector"
  16. :children
  17. [[re-com/box
  18. :width "50px"
  19. :height "50px"
  20. :max-width "50px"
  21. :max-height "50px"
  22. :justify :center
  23. :child
  24. [:img
  25. {:src (:image library-item)}]]
  26. [re-com/v-box
  27. :children
  28. [[re-com/box
  29. :child
  30. [re-com/title
  31. :label (:name library-item)
  32. :level :level3]]
  33. [re-com/box
  34. :child
  35. [:div
  36. {:class "selector-categories"}
  37. (->> (:categories library-item)
  38. (remove #(= (:name library-item) %))
  39. (string/join ", "))]]
  40. [re-com/box
  41. :child
  42. [:div
  43. {:class "selector-keywords"}
  44. (->> (:keywords library-item)
  45. (string/join ", "))]]]]]])
  46. (defn- search-results [library search-term]
  47. (let [sorted (partial sort-by (comp string/lower-case :name))]
  48. (if-let [search (->> search-term
  49. string/trim
  50. string/lower-case
  51. not-empty)]
  52. (let [search-names (->> library
  53. (filter #(string/includes? (string/lower-case (:name %)) search))
  54. (set))
  55. search-keywords (->> library
  56. (filter (fn [item]
  57. (some #(string/includes? (string/lower-case %) search) (:keywords item))))
  58. (remove search-names)
  59. (set))
  60. search-categories (->> library
  61. (filter (fn [item]
  62. (some #(string/includes? (string/lower-case %) search) (:categories item))))
  63. (remove search-names)
  64. (remove search-keywords)
  65. (set))]
  66. (concat
  67. (sorted search-names)
  68. (sorted search-keywords)
  69. (sorted search-categories)))
  70. (sorted library))))
  71. (defn task-selector [which]
  72. (let [search-term (r/atom "")
  73. library-data (re-frame/subscribe [::subs/library])]
  74. (fn []
  75. [re-com/modal-panel
  76. :backdrop-on-click #(re-frame/dispatch [::events/select-selecting nil])
  77. :child
  78. [re-com/scroller
  79. :v-scroll :auto
  80. :h-scroll :off
  81. :height "80vh"
  82. :child
  83. [re-com/v-box
  84. :gap "10px"
  85. :align :center
  86. :children
  87. (concat
  88. [[re-com/title
  89. :label "Select an Activity"
  90. :level :level3]
  91. [re-com/input-text
  92. :model search-term
  93. :change-on-blur? false
  94. :placeholder "search"
  95. :on-change #(reset! search-term %)]]
  96. (map
  97. (fn [library-item]
  98. [selection-item which library-item])
  99. (search-results @library-data @search-term)))]]])))