diff --git a/src/main/frontend/components/journal1.cljs b/src/main/frontend/components/journal1.cljs index 2500b56b3c..2cc0fd466a 100644 --- a/src/main/frontend/components/journal1.cljs +++ b/src/main/frontend/components/journal1.cljs @@ -7,14 +7,17 @@ [frontend.modules.outliner.tree :as tree] [frontend.modules.outliner.state :as outliner-state] [frontend.util :as util] - [frontend.modules.outliner.tree-test :as tt])) + [frontend.modules.outliner.generator :as tg] + [frontend.modules.outliner.tree-test :as tt] + [cljs-time.core :as t] + [cljs-time.coerce :as tc])) (def enter-key-code 13) (def tab-key-code 9) (def up-key-code 38) (def down-key-code 40) -(def state +(defonce state (atom {:editor/current-node nil :outliner/node-number 10})) @@ -24,6 +27,10 @@ (util/react (rum/cursor-in state ks)) (util/react (rum/cursor state ks)))) +(defn update-node-num + [num] + (swap! state assoc :outliner/node-number num)) + ;;; helpers (defn textarea-focus! [block-id] @@ -92,7 +99,7 @@ ;;; FIXME: node should be associated with block Atom data ;;; FIXME: for reactivity ? -(rum/defc node-render +(defn node-render [node] (let [old-block (:data node) bid (:block/id old-block) @@ -133,9 +140,13 @@ (defn down-render [node children] - [:div.blocks - (node-render node) - (and children [:div.children children])]) + (if (some? children) + [:div.blocks + (node-render node) + [:div.children children]] + + [:div.blocks + (node-render node)])) (defn right-render [node-tree children] @@ -146,7 +157,24 @@ (def root-parent-id 1) (def root-left-id 1) -(rum/defcs render-react-tree < +(defn render + [number node children] + (when (tree/satisfied-inode? node) + (let [node-tree (let [down (tree/-get-down node)] + (if (and (tree/satisfied-inode? down) + (pos? @number)) + (do (swap! number dec) + (down-render node (render number down nil))) + (down-render node nil))) + right (tree/-get-right node)] + (let [new-children (right-render node-tree children)] + (if (and (tree/satisfied-inode? right) + (pos? @number)) + (do (swap! number dec) + (render number right new-children)) + new-children))))) + +(rum/defcs render-react-tree* < {:did-mount (fn [state] (let [[init-node] (:rum/args state)] (js/setTimeout #(set-current-node init-node) 10)) @@ -156,31 +184,19 @@ (let [num (sub :outliner/node-number) current-node (sub :editor/current-node) number (atom num)] - [:div.page - (current-node-observer current-node) - (letfn [(render [node children] - (when (tree/satisfied-inode? node) - (let [node-tree (let [down (tree/-get-down node)] - (and (tree/satisfied-inode? down) - (swap! number dec)) - (down-render node (render down nil))) - right (tree/-get-right node)] - (let [new-children (right-render node-tree children)] - (if (and (tree/satisfied-inode? right) - (pos? @number)) - (do (swap! number dec) - (render right new-children)) - new-children)))))] - - (let [rs (render init-node nil)] - ;;(cljs.pprint/pprint rs) - rs))])) + (rum/with-key (current-node-observer current-node) + (str "current-" (tree/-get-id init-node))) + (render number init-node nil)])) (rum/defc all-journals < rum/reactive db-mixins/query [] - (do (tt/build-db-records tt/node-tree) - (let [init-node (outliner-state/get-block-and-ensure-position - root-parent-id root-left-id)] + (do + ;(tg/generate-random-tree 1000) + ;(tg/generate-random-block 10e4) + (tt/build-db-records tt/node-tree) + (let [init-node (outliner-state/get-block-and-ensure-position + "1" "1")] [:div.journal1 - (render-react-tree init-node)]))) \ No newline at end of file + (rum/with-key (render-react-tree* init-node) + (str "id-" (tree/-get-id init-node)))]))) \ No newline at end of file diff --git a/src/main/frontend/modules/outliner/core.cljs b/src/main/frontend/modules/outliner/core.cljs index c6f31fb7a5..108950689b 100644 --- a/src/main/frontend/modules/outliner/core.cljs +++ b/src/main/frontend/modules/outliner/core.cljs @@ -5,7 +5,9 @@ [frontend.db.conn :as conn] [frontend.util :as util] [frontend.modules.outliner.utils :as outliner-u] - [nano-id.core :as nano])) + [nano-id.core :as nano] + [cljs-time.coerce :as tc] + [cljs-time.core :as t])) (def block-id-size 9) diff --git a/src/test/frontend/modules/outliner/generator.cljs b/src/test/frontend/modules/outliner/generator.cljs new file mode 100644 index 0000000000..29469991db --- /dev/null +++ b/src/test/frontend/modules/outliner/generator.cljs @@ -0,0 +1,66 @@ +(ns frontend.modules.outliner.generator + (:require [nano-id.core :as nano] + [frontend.modules.outliner.tree-test :as tt] + [frontend.db.conn :as conn] + [frontend.modules.outliner.tree :as tree] + [datascript.core :as d])) + + +(defn generate-parent-relation + [number root-id] + (let [node-seq (repeatedly number nano/nano-id) + root {:id root-id} + parent-coll (atom [root])] + (doseq [n node-seq] + (let [size (count @parent-coll) + parent-id (->> (dec size) + (rand-int) + (get @parent-coll) + :id) + new-node {:id n :parent parent-id}] + (swap! parent-coll conj new-node))) + @parent-coll)) + +(defn generate-tree-node + [node-id parent-relation] + (let [children-record (filter #(= (:parent %) node-id) parent-relation)] + (if (seq children-record) + (let [rest-parent-relation + (remove #(= (:parent %) node-id) parent-relation) + children + (keep #(generate-tree-node (:id %) rest-parent-relation) children-record)] + {:id node-id :children children}) + {:id node-id :children nil}))) + +(defn generate-random-tree + [node-num] + (let [root-id "2"] + (->> + (generate-parent-relation node-num root-id) + (generate-tree-node root-id) + (tt/build-db-records)))) + +(defn generate-random-block + [num] + (dotimes [i num] + (prn i) + (let [block (tt/build-block (nano/nano-id))] + (tree/-save block)))) + +(comment + (let [fresh-db (conn/create-outliner-db)] + (reset! conn/outliner-db @fresh-db) + (generate-random-tree 10)) + + conn/outliner-db + + (generate-random-block 10e4) + + (generate-random-tree 10) + + (d/q '[:find (count ?id) . + :where + [?e :block/id ?id]] + @conn/outliner-db) + + ) \ No newline at end of file diff --git a/src/test/frontend/modules/outliner/tree_test.cljs b/src/test/frontend/modules/outliner/tree_test.cljs index 2852873688..5e21f6f7d5 100644 --- a/src/test/frontend/modules/outliner/tree_test.cljs +++ b/src/test/frontend/modules/outliner/tree_test.cljs @@ -7,6 +7,7 @@ [frontend.modules.outliner.utils :as outliner-u] [frontend.modules.outliner.core] [frontend.fixtures :as fixtures] + [nano-id.core :as nano] [cljs-run-test])) (use-fixtures :each @@ -24,7 +25,7 @@ (outliner-u/->block-lookup-ref parent-id) :block/left-id (outliner-u/->block-lookup-ref left-id) - :block/content (str id)}) + :block/content (apply str (repeat 100 (str id)))}) (remove #(nil? (val %))) (into {}))] (outliner-u/->Block m)))) @@ -52,9 +53,11 @@ (tree/-save block) (when (seq queue) (build (first queue) (rest queue)))))] - (let [root (assoc tree-record :left nil :parent nil)] + (let [root (assoc tree-record :left "1" :parent "1")] + (tree/-save (build-block "1")) (build root '())))) + (def tree [1 [[2 [[3 [[4] [5]]] [6 [[7 [[8]]]]] @@ -386,3 +389,5 @@ [15]]] [16 [[17]]]]]] @result))))) + +