diff --git a/frontend/uxbox/shapes.cljs b/frontend/uxbox/shapes.cljs index 582d4c78a..77046bf83 100644 --- a/frontend/uxbox/shapes.cljs +++ b/frontend/uxbox/shapes.cljs @@ -1,17 +1,35 @@ (ns uxbox.shapes - (:require [sablono.core :refer-macros [html]])) + (:require [sablono.core :refer-macros [html]] + [uxbox.util.data :refer (remove-nil-vals)])) -(defmulti render - (fn [shape & params] +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Api +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defmulti -render + (fn [shape attrs] (:type shape))) -(defmethod render :builtin/icon - [{:keys [data width height view-box]} & [attrs]] - (let [attrs (merge - (when width {:width width}) - (when height {:height height}) - (when view-box {:viewBox (apply str (interpose " " view-box))}) - attrs)] +(defn render + ([shape] (-render shape nil)) + ([shape attrs] (-render shape attrs))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Implementation +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defn transform-attrs + [{:keys [view-box] :as data}] + (if view-box + (assoc data :view-box (apply str (interpose " " view-box))) + data)) + +(defmethod -render :builtin/icon + [{:keys [data width height view-box] :as shape} attrs] + (let [attrs (as-> shape $ + (select-keys $ [:width :height :view-box]) + (remove-nil-vals $) + (merge $ attrs) + (transform-attrs $))] (html [:svg attrs data]))) diff --git a/frontend/uxbox/util/data.cljs b/frontend/uxbox/util/data.cljs index 54801509d..8d3914b37 100644 --- a/frontend/uxbox/util/data.cljs +++ b/frontend/uxbox/util/data.cljs @@ -11,3 +11,9 @@ (persistent! data))) (def ^:static index-by-id #(index-by % :id)) + +(defn remove-nil-vals + "Given a map, return a map removing key-value + pairs when value is `nil`." + [data] + (into {} (remove (comp nil? second) data)))