-
-
Notifications
You must be signed in to change notification settings - Fork 74
/
core.cljs
90 lines (78 loc) · 2.97 KB
/
core.cljs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
(ns ^:figwheel-always oz.core
(:require [reagent.core :as r]
[clojure.string :as str]
[cljs.core.async :as async :refer (<! >! put! chan)]
[taoensso.encore :as encore :refer-macros (have have?)]
[taoensso.timbre :as log :refer-macros (tracef debugf infof warnf errorf)]
[taoensso.sente :as sente :refer (cb-success?)]
[taoensso.sente.packers.transit :as sente-transit]
[cljsjs.vega]
[cljsjs.vega-lite]
[cljsjs.vega-embed]
[cljsjs.vega-tooltip])
(:require-macros
[cljs.core.async.macros :as asyncm :refer (go go-loop)]))
(log/set-level! :info)
(enable-console-print!)
(defn- ^:no-doc log [a-thing]
(.log js/console a-thing))
(defn ^:no-doc render-vega-lite
([spec elem]
(when spec
(let [spec (clj->js spec)
opts {:renderer "canvas"
:mode "vega-lite"}
vega-spec (. js/vl (compile spec))]
(log "Vega-lite translates to:")
(log vega-spec)
(-> (js/vegaEmbed elem spec (clj->js opts))
(.then (fn [res]
#_(log res)
(. js/vegaTooltip (vegaLite (.-view res) spec))))
(.catch (fn [err]
(log err))))))))
(defn render-vega [spec elem]
(when spec
(let [spec (clj->js spec)
opts {:renderer "canvas"
:mode "vega"}]
(-> (js/vegaEmbed elem spec (clj->js opts))
(.then (fn [res]
#_(log res)
(. js/vegaTooltip (vega (.-view res) spec))))
(.catch (fn [err]
(log err)))))))
(defn vega-lite
"Reagent component that renders vega-lite."
[spec]
(r/create-class
{:display-name "vega-lite"
:component-did-mount (fn [this]
(render-vega-lite spec (r/dom-node this)))
:component-will-update (fn [this [_ new-spec]]
(render-vega-lite new-spec (r/dom-node this)))
:reagent-render (fn [spec]
[:div#vis])}))
(defn vega
"Reagent component that renders vega"
[spec]
(r/create-class
{:display-name "vega"
:component-did-mount (fn [this]
(render-vega spec (r/dom-node this)))
:component-will-update (fn [this [_ new-spec]]
(render-vega new-spec (r/dom-node this)))
:reagent-render (fn [spec]
[:div#vis])}))
(defn ^:no-doc view-spec
;; should handle sharing data with nodes that need it?
[spec]
;; prewalk spec, rendering special hiccup tags like :vega and :vega-lite, and potentially other composites,
;; rendering using the components above. Leave regular hiccup unchanged).
;; TODO finish writing; already hooked in below so will break now
(clojure.walk/prewalk
(fn [x] (if (and (coll? x) (#{:vega :vega-lite} (first x)))
[(case (first x) :vega vega :vega-lite vega-lite)
(reduce merge (rest x))]
x))
spec))