86 lines
4.1 KiB
Clojure
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))))))))
|