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

73 lines
4.3 KiB
Clojure

(ns com.fulcrologic.rad.rendering.semantic-ui.controls.pickers
(:require
[com.fulcrologic.fulcro.components :as comp :refer [defsc]]
[com.fulcrologic.rad.picker-options :as po]
[com.fulcrologic.rad.control :as control]
[com.fulcrologic.rad.rendering.semantic-ui.components :refer [ui-wrapped-dropdown]]
#?(:cljs [ch.lyrion.carbon.combo-box.ui-combo-box :refer [ui-combo-box]])
[com.fulcrologic.rad.options-util :refer [?!]]
[taoensso.timbre :as log]
#?(:cljs [com.fulcrologic.fulcro.dom :as dom]
:clj [com.fulcrologic.fulcro.dom-server :as dom])))
(defsc SimplePicker [_ {:keys [instance control-key]}]
{:shouldComponentUpdate (fn [_ _ _] true)
:componentDidMount (fn [this]
(let [{:keys [instance control-key] :as props} (comp/props this)
controls (control/component-controls instance)
{::po/keys [query-key] :as picker-options} (get controls control-key)]
(when query-key
(po/load-picker-options! instance (comp/react-type instance) props picker-options))))}
#?(:cljs
(let [controls (control/component-controls instance)
props (comp/props instance)
{::po/keys [query-key cache-key]
:keys [label onChange disabled? visible? action placeholder options user-props] :as control} (get controls control-key)
options (or options (get-in props [::po/options-cache (or cache-key query-key) :options]))]
(when control
(let [label (or (?! label instance))
disabled? (?! disabled? instance)
placeholder (?! placeholder instance)
visible? (or (nil? visible?) (?! visible? instance))
value (control/current-value instance control-key)]
(when visible?
(dom/div
(ui-combo-box
{:id (or (str control-key) (str (hash options)))
;;:titleText label
:disabled (or disabled? false)
:placeholder (str placeholder)
:items (or options [])
:itemToString (fn [item] (.-text item))
:initialSelectedItem (or value "")
:onChange (fn [v]
(let [selectedItem (.-selectedItem v)
selected-item (if (nil? selectedItem)
(or (first (filter #(= "" (:value %)) options))
{:text "" :value ""})
{:text (.-text selectedItem) :value (.-value selectedItem)})]
(js/console.log "Event:" v)
(control/set-parameter! instance control-key (:value selected-item))
(binding [comp/*after-render* true]
(when onChange
(onChange instance v))
(when action
(action instance)))))}))
#_(dom/div :.ui.field {:key (str control-key)}
(dom/label label)
(ui-wrapped-dropdown (merge
user-props
{:disabled disabled?
:placeholder (str placeholder)
:options options
:value value
:onChange (fn [v]
(control/set-parameter! instance control-key v)
(binding [comp/*after-render* true]
(when onChange
(onChange instance v))
(when action
(action instance))))})))))))))
(def render-control (comp/factory SimplePicker {:keyfn :control-key}))