(ns microtables-frontend.views (:require [re-frame.core :as re-frame] [microtables-frontend.subs :as subs] [microtables-frontend.events :as events] [microtables-frontend.utils :as utils])) ;; TABLE COMPONENTS (defn cell [c r data] (let [datum (utils/get-datum data c r)] ^{:key (str c r)} [:td [:input {:id (str c r) :value (if (= (get datum :view nil) :value) (get datum :value "") (get datum :error (get datum :display (get datum :value ""))));TODO: add "highlight" display mode (possibly just a css class) :on-change #(re-frame/dispatch [::events/edit-cell-value c r datum (.. % -target -value)]) :on-focus #(re-frame/dispatch [::events/movement-enter-cell c r]) ;TODO: add "dirty" value to pass to on-blur (maybe not necessary??) :on-blur #(re-frame/dispatch [::events/movement-leave-cell c r])}]])) (defn row [r cols data] ^{:key (str "row-" r)} [:tr (cons ^{:key (str "row-head-" r)} [:th (str r)] (map #(cell % r data) cols))]) (defn header-row [cols] ^{:key "header"} [:tr (cons ^{:key "corner"} [:th] (map (fn [c] ^{:key (str "col-head-" c)} [:th c]) cols))]) (defn sheet [data] [:table [:tbody (let [maxrow (utils/highest :row data) cols (take-while (partial not= (utils/next-letter (utils/highest :col data))) utils/col-letters)] (cons (header-row cols) (map #(row % cols data) (range 1 (inc maxrow)))))]]) (defn main-panel [] (let [data (re-frame/subscribe [::subs/table-data])] [:div [:h1 "Microtables"] [sheet @data]]))