fulcro-rad-carbon/src/main/com/fulcrologic/rad/rendering/semantic_ui/container.cljc

86 lines
4.1 KiB
Clojure

(ns com.fulcrologic.rad.rendering.semantic-ui.container
(:require
#?@(:cljs
[[com.fulcrologic.fulcro.dom :as dom :refer [div]]]
:clj
[[com.fulcrologic.fulcro.dom-server :as dom :refer [div]]])
[com.fulcrologic.fulcro.components :as comp]
[com.fulcrologic.rad.container :as container]
[com.fulcrologic.rad.control :as control]
[com.fulcrologic.rad.options-util :refer [?!]]
[com.fulcrologic.rad.rendering.semantic-ui.form :as sui-form]
[taoensso.timbre :as log]))
(comp/defsc StandardContainerControls [_ {:keys [instance]}]
{:shouldComponentUpdate (fn [_ _ _] true)}
(let [controls (control/component-controls instance)
{:keys [input-layout action-layout]} (control/standard-control-layout instance)]
(div :.ui.top.attached.compact.basic.segment
(dom/h3 :.ui.header
(or (some-> instance comp/component-options ::container/title (?! instance)) "")
(div :.ui.right.floated.buttons
(keep (fn [k] (control/render-control instance k (get controls k))) action-layout)))
(div :.ui.form
(map-indexed
(fn [idx row]
(div {:key idx :className (sui-form/n-fields-string (count row))}
(map #(if-let [c (get controls %)]
(control/render-control instance % c)
(dom/div :.ui.field {:key (str %)} "")) row)))
input-layout)))))
(let [ui-standard-container-controls (comp/factory StandardContainerControls)]
(defn render-standard-controls [instance]
(ui-standard-container-controls {:instance instance})))
(def n-string {0 "zero"
1 "one"
2 "two"
3 "three"
4 "four"
5 "five"
6 "six"
7 "seven"
8 "eight"
9 "nine"
10 "ten"
11 "eleven"
12 "twelve"
13 "thirteen"
14 "fourteen"
15 "fifteen"
16 "sixteen"})
(defn render-container-layout [container-instance]
(let [{::container/keys [children layout]} (comp/component-options container-instance)]
;; TODO: Custom controls rendering as a separate config?
(let [container-props (comp/props container-instance)
render-cls (fn [id cls]
(let [factory (comp/computed-factory cls)
props (get container-props id {})]
(factory props {::container/controlled? true})))]
(dom/div :.ui.basic.segments
(render-standard-controls container-instance)
(dom/div :.ui.basic.segment
(if layout
(dom/div :.ui.container.centered.grid
(map-indexed
(fn *render-row [idx row]
(let [cols (count row)]
(dom/div :.row {:key idx}
(map
(fn *render-col [entry]
(let [id (if (keyword? entry) entry (:id entry))
width (or
(and (map? entry) (:width entry))
(int (/ 16 cols)))
cls (get children id)]
(dom/div {:key id :classes [(when width (str (n-string width) " wide")) "column"]}
(render-cls id cls))))
row))))
layout))
(map
(fn [[id cls]]
(dom/div {:key id}
(render-cls id cls))) (container/id-child-pairs children))))))))