selector.cljs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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 task-selector [which]
  47. (let [search-term (r/atom "")
  48. library-data (re-frame/subscribe [::subs/library])]
  49. (fn []
  50. (let [sorted (partial sort-by (comp string/lower-case :name))
  51. library (if-let [search (->> @search-term
  52. string/trim
  53. string/lower-case
  54. not-empty)]
  55. (let [search-names (->> @library-data
  56. (filter #(string/includes? (string/lower-case (:name %)) search))
  57. (set))
  58. search-keywords (->> @library-data
  59. (filter (fn [item]
  60. (some #(string/includes? (string/lower-case %) search) (:keywords item))))
  61. (remove search-names)
  62. (set))
  63. search-categories (->> @library-data
  64. (filter (fn [item]
  65. (some #(string/includes? (string/lower-case %) search) (:categories item))))
  66. (remove search-names)
  67. (remove search-keywords)
  68. (set))]
  69. (concat
  70. (sorted search-names)
  71. (sorted search-keywords)
  72. (sorted search-categories)))
  73. (sorted @library-data))]
  74. [re-com/modal-panel
  75. :backdrop-on-click #(re-frame/dispatch [::events/select-selecting nil])
  76. :child
  77. [re-com/scroller
  78. :v-scroll :auto
  79. :h-scroll :off
  80. :height "80vh"
  81. :child
  82. [re-com/v-box
  83. :gap "10px"
  84. :align :center
  85. :children
  86. (concat
  87. [[re-com/title
  88. :label "Select an Activity"
  89. :level :level3]
  90. [re-com/input-text
  91. :model search-term
  92. :change-on-blur? false
  93. :placeholder "search"
  94. :on-change #(reset! search-term %)]]
  95. (map
  96. (fn [library-item]
  97. [selection-item which library-item])
  98. library))]]]))))