-
-
Save jamieorc/980f033af5bf2a8737db to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; 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