Skip to content

Instantly share code, notes, and snippets.

@jamieorc
Created May 23, 2014 16:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jamieorc/980f033af5bf2a8737db to your computer and use it in GitHub Desktop.
Save jamieorc/980f033af5bf2a8737db to your computer and use it in GitHub Desktop.
;; sample data
(ns cdr2.sample-data)
(def raw-product
{:name "Product 1" :number "P1" :mass 11.2 :unit-of-mass "g" :supplier-name "Supplier" :supplier-number "s-12345"
:children [{:_id 1 :name "One" :number "p1" :mass 2.1 :unit-of-mass "g" :supplier-name "Supplier" :supplier-number "s-12345"}
{:_id 2 :name "Two" :number "p2" :mass 1.1 :unit-of-mass "g" :supplier-name "Supplier" :supplier-number "s-12345"
:children [{:_id 4 :name "Kid 1" :number "p4" :mass 1.321 :unit-of-mass "g" :supplier-name "Supplier" :supplier-number "s-12345"}]}
{:_id 3 :name "Three" :number "p3" :mass 3.213 :unit-of-mass "g" :supplier-name "Supplier" :supplier-number "s-12345"
:children [{:_id 5 :name "Kid 2" :number "p5" :mass 5.43 :unit-of-mass "g" :supplier-name "Supplier" :supplier-number "s-12345"}
{:_id 6 :name "Kid 3" :number "p6" :mass 1.921 :unit-of-mass "g" :supplier-name "Supplier" :supplier-number "s-12345"
:children [{:_id 7 :name "Kid 4" :number "p7" :mass 0.21 :unit-of-mass "g" :supplier-name "Supplier" :supplier-number "s-12345"}
{:_id 8 :name "Kid 5" :number "p8" :mass 0.342 :unit-of-mass "g" :supplier-name "Supplier" :supplier-number "s-12345"}
{:_id 9 :name "Kid 6" :number "p9" :mass 0.987 :unit-of-mass "g" :supplier-name "Supplier" :supplier-number "s-12345"}]}]}]})
;; the app
(ns cdr2.pbuilder
(:require [reagent.core :as r]
[clojure.string :as s]
[clojure.walk :as w]
[cdr2.sample-data :as sample-data]))
(def ENTER_KEY 13)
(def ESCAPE_KEY 27)
(def app-data (r/atom {:raw-product sample-data/raw-product}))
(defn mass-with-unit
[item]
(str (:mass item) " " (:unit-of-mass item)))
(defn update-raw-product
[item]
(swap! app-data
(fn [m]
(w/prewalk #(if (and (map? %)
(= (:_id item) (:_id %)))
item
%)
m))))
(defn save-raw-component
[rc]
(update-raw-product rc))
(declare RawList)
(defn RawComponentInputs
[item editing?]
[:div.raw-component-inputs
{:on-key-up #(condp == (.-keyCode %)
ENTER_KEY (reset! editing? false)
ESCAPE_KEY (reset! editing? false)
nil)}
[:input.name {:name "name"
:value (:name item)
:on-change #(update-raw-product (assoc item :name (-> % .-target .-value)))}]
[:input.number {:name "number"
:value (:number item)}]
[:input.mass {:name "mass"
:value (:mass item)}]
[:input.supplier-name {:name "supplier-name"
:value (:supplier-name item)}]
[:input.supplier-number {:name "supplier-number"
:value (:supplier-number item)}]
[:button {:value "Save"
:name "Save"
:on-click #(do (reset! editing? false)
(save-raw-component item))} "Save"]])
(def EditRawComponent
(with-meta RawComponentInputs
{:component-did-mount #(.focus (r/dom-node %))}))
(defn RawComponent
[item]
(let [editing? (r/atom false)]
(fn [item]
[:div.component
(when-not @editing?
[:div {:on-click #(do (reset! editing? true)
(js/console.log @editing?)
(js/console.log item))}
[:span.component-attribute.name (:name item)]
[:span.component-attribute.number.soft (str "(" (:number item) ")")]
[:span.component-attribute.mass.soft (str "[" (mass-with-unit item) "]")]
[:span.component-attribute.supplier-name.soft (:supplier-name item)]
[:span.component-attribute.supplier-number.soft (str "(" (:supplier-number item) ")")]
(when @editing?
[EditRawComponent item editing?])
(when (:children item)
[RawList (:children item)])])))
(defn RawList
[list]
[:ul.level (for [item list]
^{:key (:_id item)} [:li [RawComponent item]])])
(defn ^:export run
[]
(r/render-component
[RawComponent (:raw-product @app-data)]
(.getElementById js/document "pbuilder")))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment