Skip to content

Instantly share code, notes, and snippets.

@bendlas
Created May 31, 2016 18:25
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bendlas/6a94f7b5d4d9e3fd30bcda5bc96b2e68 to your computer and use it in GitHub Desktop.
Save bendlas/6a94f7b5d4d9e3fd30bcda5bc96b2e68 to your computer and use it in GitHub Desktop.
(ns test.rec
(:require [om.next :as om :refer-macros [defui]]
[goog.dom :as gdom]
[om.dom :as dom]))
(enable-console-print!)
(def app-state
{:display/path []
:tree/root
{:path [],
:children
[{:prop
{:webnf.davstore.dav.xml/displayname "askdj",
:webnf.davstore.dav.xml/getcontenttype "text/markdown",
:webnf.davstore.dav.xml/getetag
"\"15212a6748a1a3bb4ea4a82df100a865e61109d5\"",
:webnf.davstore.dav.xml/getlastmodified
"Tue, 31 May 2016 03:04:42 GMT",
:webnf.davstore.dav.xml/creationdate
"Tue, 31 May 2016 03:04:42 GMT",
:webnf.davstore.dav.xml/resourcetype
{:tag :webnf.davstore.ext/file},
:webnf.davstore.dav.xml/getcontentlength "45"},
:href "/files/askdj",
:path ["askdj"]}],
:as-of nil,
:prop
{:webnf.davstore.dav.xml/displayname
"{ef837a6f-9b81-4b45-aa97-aa650ed91825}",
:webnf.davstore.dav.xml/getlastmodified
"Tue, 31 May 2016 03:04:42 GMT",
:webnf.davstore.dav.xml/creationdate
"Tue, 31 May 2016 02:03:18 GMT",
:webnf.davstore.dav.xml/resourcetype
{:tag :webnf.davstore.dav.xml/collection}},
:href "/files/"}})
(defui File
static om/IQuery (query [_] '[:path {:prop [*]}])
Object (render [this]
(let [{:keys [path]
{:keys [:webnf.davstore.dav.xml/displayname]} :prop :as props} (om/props this)]
(println "RENDER FILE" (pr-str props))
(dom/li
nil
(dom/a #js{:onClick #(om/transact! this [(list 'set-display {:path path})])}
"[FILE] " displayname)))))
(def file (om/factory File))
(declare node)
(defui Folder
static om/IQuery (query [_] '[:path {:prop [*]} {:children ...}])
Object (render [this]
(let [{:keys [path children]
{:keys [:webnf.davstore.dav.xml/displayname]} :prop :as props} (om/props this)]
(println "RENDER FOLDER" (pr-str props))
(dom/li
nil
(dom/a #js{:onClick #(om/transact! this [(list 'set-display {:path path})])}
"[FOLDER] " displayname)
(dom/ul nil (map node children))))))
(def folder (om/factory Folder))
(defui Node
static om/IQuery (query [_] {:file (om/get-query File)
:folder (om/get-query Folder)})
static om/Ident (ident [this {{:keys [:webnf.davstore.dav.xml/resourcetype]} :prop path :path :as args}]
(println "IDENT NODE" this (pr-str args))
(case (:tag resourcetype)
:webnf.davstore.dav.xml/collection [:folder path]
:webnf.davstore.ext/file [:file path]
(do (println "Unknown Type" (pr-str args))
[:none nil])))
Object (render [this]
(let [{:as props {:keys [:webnf.davstore.dav.xml/resourcetype]} :prop} (vary-meta (om/props this)
dissoc :om-path)]
(println "RENDER NODE" (pr-str props))
(case (:tag resourcetype)
:webnf.davstore.dav.xml/collection (folder props)
:webnf.davstore.ext/file (file props)
nil))))
(def node (om/factory Node))
(defui App
static om/IQuery (query [_] [{:tree/root (om/get-query Node)}])
Object (render [this]
(let [{:keys [tree/root]} (om/props this)]
(println "TREE" (pr-str root))
(dom/ul nil (node root)))))
(defmulti mutate-fn om/dispatch)
(defmulti read-fn
(fn [env key params]
(println "READ"
(pr-str key)
(pr-str params)
(pr-str (keys env))
\newline
(pr-str (select-keys env [:query-root :path :pathopt :target :query])))
key))
(def reconciler
(om/reconciler
{:state app-state
;:normalize true
;:pathopt true
:parser (om/parser {:read read-fn :mutate mutate-fn})}))
(defmethod read-fn :tree/root [{:keys [state parser query ast] :as env} k _]
(let [st @state
[type id :as entry] (get st k)
data (get-in st entry)]
{:value (parser (assoc env :data data :union-query query)
(if (map? query)
(get query type)
query))}))
(defmethod read-fn :children [{:keys [parser data union-query state] :as env} k _]
(let [st @state]
{:value (into [] (for [[type :as ch] (:children data)]
(parser (assoc env :data (get-in st ch))
(get union-query type))))}))
(defmethod read-fn :default [{:keys [data]} key params]
{:value (get data key)})
(defmethod mutate-fn 'set-display [{:keys [state]} key {:keys [path]}]
{:pre [(or (nil? href) (nil? path))]}
{:action #(swap! state assoc :display/path path*)})
(om/add-root! reconciler
App
(gdom/getElement "app-main"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment