Created
May 31, 2016 18:25
-
-
Save bendlas/6a94f7b5d4d9e3fd30bcda5bc96b2e68 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
(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