sheet.cljs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. (ns microtables-frontend.views.sheet
  2. (:require
  3. [microtables-frontend.events :as events]
  4. [microtables-frontend.utils :as utils]
  5. [re-frame.core :as re-frame]))
  6. (defn cell [c r data]
  7. (let [datum (get-in data [c r])]
  8. ^{:key (str c r)} [:td
  9. [:input {:id (str c r)
  10. :class (if (= (:view datum) :highlighted) "highlighted" "")
  11. :value (if (= (get datum :view nil) :value)
  12. (get datum :value "")
  13. (get datum :error (get datum :display (get datum :value ""))));TODO: add "highlight" display mode (possibly just a css class)
  14. :on-change #(re-frame/dispatch [::events/edit-cell-value c r (.. % -target -value)])
  15. :on-focus #(re-frame/dispatch [::events/movement-enter-cell c r])
  16. :on-blur #(re-frame/dispatch [::events/movement-leave-cell c r])
  17. :on-keyPress #(when (= (.. % -which) 13)
  18. (re-frame/dispatch [::events/press-enter-in-cell c r]))}]]))
  19. (defn row [r cols data]
  20. ^{:key (str "row-" r)} [:tr
  21. (cons
  22. ^{:key (str "row-head-" r)} [:th (str r)]
  23. (map #(cell % r data) cols))])
  24. (defn header-row [cols]
  25. ^{:key "header"} [:tr
  26. (cons
  27. ^{:key "corner"} [:th]
  28. (map (fn [c] ^{:key (str "col-head-" c)} [:th c]) cols))])
  29. (defn sheet [data]
  30. [:table
  31. {:id "main-table"}
  32. [:tbody
  33. ;TODO: figure out appropriate starting values for maxrow and maxcol (maybe keep them intentionally small)
  34. ;TODO: figure out movement (maybe allow scroll overflow)
  35. (let [maxrow 50;(utils/highest-row data)
  36. maxcol "Z";(utils/highest-col data)
  37. cols (take-while (partial not= (utils/next-letter maxcol)) utils/col-letters)]
  38. (cons
  39. (header-row cols)
  40. (map #(row % cols data) (range 1 (inc maxrow)))))]])