73 lines
4.3 KiB
Clojure
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}))
|