events.cljs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. (ns microtables-frontend.events
  2. (:require
  3. [re-frame.core :as re-frame]
  4. [microtables-frontend.db :as db]
  5. [microtables-frontend.utils :as utils]))
  6. (re-frame/reg-event-db
  7. ::initialize-db
  8. (fn [_ _]
  9. (println "initializing db")
  10. (-> db/default-db
  11. (update-in [:table-data] (partial map utils/add-parsed-variables))
  12. (update-in [:table-data] utils/re-evaluate)
  13. (update-in [:alt-table-data] #(utils/walk-modify-data % (fn [c r datum] (if (= (first (:value datum)) "=") (assoc datum :dirty true) datum))))
  14. (update-in [:alt-table-data] utils/create-all-references)
  15. (update-in [:alt-table-data] utils/create-all-back-references)
  16. (update-in [:alt-table-data] utils/evaluate-all))))
  17. (re-frame/reg-event-db
  18. ::movement-enter-cell
  19. (fn [db [_ c r]]
  20. (println "::movement-enter-cell" c r)
  21. (assoc-in db [:position :cursor] {:col c :row r})))
  22. (defn re-evaluate-if-dirty [db dirty]
  23. (if dirty
  24. (update-in db [:table-data] utils/re-evaluate)
  25. db))
  26. (re-frame/reg-event-db
  27. ::movement-leave-cell
  28. (fn [db [_ c r]]
  29. (let [datum (utils/get-datum (:table-data db) c r)
  30. alt-datum (get-in (:alt-table-data db) [c r])]
  31. (println "::movement-leave-cell" c r (if (:dirty datum) "- dirty" ""))
  32. (-> db
  33. (assoc-in [:position :cursor] nil)
  34. (assoc-in [:position :selection] nil)
  35. (update-in [:table-data] (partial utils/add-parsed-variables-to-specific-datum c r))
  36. ;(update-in [:alt-table-data c r] utils/add-references)
  37. (update-in [:alt-table-data] #(utils/reset-references % c r))
  38. (update-in [:alt-table-data] #(utils/evaluate-from-cell % c r))
  39. (re-evaluate-if-dirty (:dirty datum))))))
  40. (re-frame/reg-event-db
  41. ::edit-cell-value
  42. (fn [db [_ c r existing-datum value]]
  43. (println "::edit-cell-value" c r value)
  44. (if (nil? existing-datum);TODO: when removing list-based data, remove this conditional, and all references to "existing-datum" (not needed in map-based data)
  45. (-> db
  46. (assoc :table-data (conj (:table-data db) {:row r :col c :value value :dirty true}))
  47. (update-in [:alt-table-data] #(utils/change-datum-value % c r value)))
  48. (-> db
  49. (assoc :table-data (map #(if (and (= r (:row %)) (= c (:col %))) (assoc (assoc % :dirty true) :value value) %) (:table-data db)))
  50. (update-in [:alt-table-data] #(utils/change-datum-value % c r value))))))