diff --git a/src/main/frontend/components/journal1.cljs b/src/main/frontend/components/journal1.cljs index b109fad155..216370de49 100644 --- a/src/main/frontend/components/journal1.cljs +++ b/src/main/frontend/components/journal1.cljs @@ -2,26 +2,118 @@ (:require [frontend.modules.journal.core :as journal-core] [rum.core :as rum] [frontend.ui :as ui] - [frontend.handler.page :as page-handler] - [frontend.db-mixins :as db-mixins])) + [frontend.db-mixins :as db-mixins] + [frontend.modules.outliner.core :as outliner-core] + [frontend.modules.outliner.tree :as tree] + [frontend.modules.outliner.state :as outliner-state] + [frontend.util :as util] + [frontend.modules.outliner.tree-test :as tt])) -(rum/defc journal-cp < rum/reactive - [[title format]]) +(def enter-key-code 13) +(def tab-key-code 9) -(rum/defc journals < - {:did-mount (fn [state] state)} - [latest-journals] - [:div#journals - (ui/infinite-list - (for [[journal-name format] latest-journals] - [:div.journal-item.content {:key journal-name} - (journal-cp [journal-name format]) - ]) - {:on-load (fn [] - (page-handler/load-more-journals!))})]) +(def state + (atom {:editor/current-node nil + :outliner/node-number 10})) + +(defn sub + [ks] + (if (coll? ks) + (util/react (rum/cursor-in state ks)) + (util/react (rum/cursor state ks)))) + +(defn textarea-option + [node] + (let [old-block (:data node) + content (:block/content old-block)] + {:on-key-down + (fn [e] + (let [pressed-code (.-keyCode e)] + (cond + (= enter-key-code pressed-code) + (do + (.blur (.-target e)) + (.preventDefault e) + (let [left-id (tree/-get-id node) + parent-id (tree/-get-parent-id node) + new-node-id (outliner-core/gen-block-id) + new-node + (outliner-core/block + {:block/id new-node-id + :block/left-id [:block/id left-id] + :block/parent-id [:block/id parent-id] + :block/content (str new-node-id)})] + (tree/insert-node-as-sibling new-node node))) + + + (= tab-key-code pressed-code) + (do (.blur (.-target e)) + (let [parent-node (tree/-get-left node)] + (tree/move-subtree node parent-node nil))) + + :else + :no-extra-operate))) + + + :on-blur + (fn [e] + (let [value (util/evalue e) + new-block (-> (assoc old-block :block/content value) + (outliner-core/block))] + (tree/-save new-block))) + :default-value content})) + +(defn single-node-render + [node] + (let [] + [:div.single-node + [:textarea (textarea-option node)]])) + +(defn down-render + [node children] + [:div.down + [:div [:textarea (textarea-option node)]] + [:div.children + children]]) + +(defn right-render + [node-tree children] + (if (empty? children) + [:div.right node-tree] + (into children [node-tree]))) + +(def root-parent-id 1) +(def root-left-id 1) + +(rum/defc render-react-tree + < rum/reactive + [init-node] + (let [num (sub :outliner/node-number) + number (atom num)] + (letfn [(render [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 down nil))) + (single-node-render node))) + 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/defc all-journals < rum/reactive db-mixins/query [] - (let [journals-length 8 - latest-journals (journal-core/get-latest-journals journals-length)] - (journals latest-journals))) \ No newline at end of file + (do (tt/build-db-records tt/node-tree) + (let [init-node (outliner-state/get-block-and-ensure-position + root-parent-id root-left-id)] + [:div.journal1 + (render-react-tree init-node)]))) \ No newline at end of file diff --git a/src/main/frontend/components/journal1.css b/src/main/frontend/components/journal1.css new file mode 100644 index 0000000000..993344fd73 --- /dev/null +++ b/src/main/frontend/components/journal1.css @@ -0,0 +1,7 @@ +.journal1 { + + .children { + margin-left: 20px; + } + +} \ 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 3897424f55..c6f31fb7a5 100644 --- a/src/main/frontend/modules/outliner/core.cljs +++ b/src/main/frontend/modules/outliner/core.cljs @@ -4,7 +4,18 @@ [frontend.db.outliner :as db-outliner] [frontend.db.conn :as conn] [frontend.util :as util] - [frontend.modules.outliner.utils :as outliner-u])) + [frontend.modules.outliner.utils :as outliner-u] + [nano-id.core :as nano])) + +(def block-id-size 9) + +(defn gen-block-id + [] + (nano/nano-id block-id-size)) + +(defn block + [m] + (outliner-u/->Block m)) ;; -get-id, -get-parent-id, -get-left-id return block-id ;; the :block/parent-id, :block/left-id should be datascript lookup ref @@ -12,9 +23,8 @@ (extend-type outliner-u/Block tree/INode (-get-id [this] - (if-let [block-id (get-in this [:data :block/id])] - block-id - (throw (js/Error (util/format "Cant find id: %s" this))))) + (when-let [block-id (get-in this [:data :block/id])] + block-id)) (-get-parent-id [this] (-> (get-in this [:data :block/parent-id]) @@ -67,4 +77,4 @@ children [first-child]] (if-let [node (tree/-get-right current)] (recur node (conj children node)) - children))))) \ No newline at end of file + children))))) diff --git a/src/main/frontend/modules/outliner/state.cljs b/src/main/frontend/modules/outliner/state.cljs index 7dcec3f5ba..4f144bf810 100644 --- a/src/main/frontend/modules/outliner/state.cljs +++ b/src/main/frontend/modules/outliner/state.cljs @@ -5,7 +5,7 @@ [frontend.modules.outliner.utils :as outliner-u] [frontend.react-impls :as r])) -(def position-state (atom {})) +(defonce position-state (atom {})) (defn- fill-block-into-position ([block] diff --git a/src/main/frontend/modules/outliner/tree.cljs b/src/main/frontend/modules/outliner/tree.cljs index a29bb5c669..632ebdd74c 100644 --- a/src/main/frontend/modules/outliner/tree.cljs +++ b/src/main/frontend/modules/outliner/tree.cljs @@ -24,24 +24,28 @@ "Insert a node as first child." [new-node parent-node] (:pre [(every? satisfied-inode? [new-node parent-node])]) - (let [right-node (-get-down parent-node) - parent-id (-get-id parent-node) - new-right-node (-set-left-id right-node (-get-id new-node)) + (let [parent-id (-get-id parent-node) node (-> (-set-left-id new-node parent-id) - (-set-parent-id parent-id))] - (-save node) - (-save new-right-node))) + (-set-parent-id parent-id)) + right-node (-get-down parent-node)] + (if (satisfied-inode? right-node) + (let [new-right-node (-set-left-id right-node (-get-id new-node))] + (-save node) + (-save new-right-node)) + (-save node)))) (defn insert-node-as-sibling "Insert a node as sibling." [new-node left-node] (:pre [(every? satisfied-inode? [new-node left-node])]) - (let [right-node (-get-right left-node) - new-right-node (-set-left-id right-node (-get-id new-node)) - node (-> (-set-left-id new-node (-get-id left-node)) - (-set-parent-id (-get-parent-id left-node)))] - (-save node) - (-save new-right-node))) + (let [node (-> (-set-left-id new-node (-get-id left-node)) + (-set-parent-id (-get-parent-id left-node))) + right-node (-get-right left-node)] + (if (satisfied-inode? right-node) + (let [new-right-node (-set-left-id right-node (-get-id new-node))] + (-save node) + (-save new-right-node)) + (-save node)))) (defn delete-node "Delete node from the tree." @@ -59,14 +63,18 @@ root: root of subtree left-node: left node of destination" [root parent-node left-node] - {:pre [(every? satisfied-inode? [root parent-node left-node])]} - (let [left-node-id (-get-left-id root) - right-node (-> (-get-right root) - (-set-left-id left-node-id))] - (-save right-node) + {:pre [(every? satisfied-inode? [root parent-node]) + (or + (satisfied-inode? left-node) + (nil? left-node))]} + (let [left-node-id (-get-left-id root)] (if (nil? left-node) (insert-node-as-first-child root parent-node) - (insert-node-as-sibling root left-node)))) + (insert-node-as-sibling root left-node)) + (let [right-node (-get-right root)] + (when (satisfied-inode? right-node) + (let [new-right-node (-set-left-id right-node left-node-id)] + (-save new-right-node)))))) (defn render-react-tree [init-node node-number @@ -78,14 +86,14 @@ (letfn [(render [node children] (let [node-tree (let [down (-get-down node)] (if (and (satisfied-inode? down) - (pos? @number)) + (pos? @number)) (do (swap! number dec) (parent-&-children-render node (render down nil))) (single-node-render node))) right (-get-right node)] (let [new-children (sibling-nodes-render children node-tree)] (if (and (satisfied-inode? right) - (pos? @number)) + (pos? @number)) (do (swap! number dec) (render right new-children)) new-children))))] diff --git a/src/main/frontend/react_impls.cljs b/src/main/frontend/react_impls.cljs index a9e299bdf8..95e8c8a19c 100644 --- a/src/main/frontend/react_impls.cljs +++ b/src/main/frontend/react_impls.cljs @@ -1,5 +1,5 @@ (ns frontend.react-impls "Support different react implements." - (:require [rum.core :as rum])) + (:require [frontend.util :as util])) -(def react (atom rum/react)) +(def react (atom util/react)) diff --git a/src/main/frontend/routes.cljs b/src/main/frontend/routes.cljs index a0e3b6f024..52ed595775 100644 --- a/src/main/frontend/routes.cljs +++ b/src/main/frontend/routes.cljs @@ -6,7 +6,7 @@ [frontend.components.diff :as diff] [frontend.components.draw :as draw] [frontend.components.journal :as journal] - [frontend.components.journal :as journal1] + [frontend.components.journal1 :as journal1] [frontend.components.settings :as settings] [frontend.components.external :as external] [frontend.components.publishing :as publishing])) diff --git a/src/test/frontend/fixtures.cljs b/src/test/frontend/fixtures.cljs index 1de58c7d38..11ea3ce258 100644 --- a/src/test/frontend/fixtures.cljs +++ b/src/test/frontend/fixtures.cljs @@ -32,3 +32,5 @@ (reset! react-impls/react react-test/react) (let [r (f)] (reset! react-impls/react rum/react) r)) + + diff --git a/src/test/frontend/modules/outliner/tree_test.cljs b/src/test/frontend/modules/outliner/tree_test.cljs index 76f869a158..2852873688 100644 --- a/src/test/frontend/modules/outliner/tree_test.cljs +++ b/src/test/frontend/modules/outliner/tree_test.cljs @@ -6,15 +6,14 @@ [frontend.db.conn :as conn] [frontend.modules.outliner.utils :as outliner-u] [frontend.modules.outliner.core] - [frontend.fixtures :as fixtures])) + [frontend.fixtures :as fixtures] + [cljs-run-test])) -(def fixtures (test/join-fixtures - [fixtures/react-impl - fixtures/react-components - fixtures/outliner-position-state - fixtures/outliner-db])) - -(use-fixtures :each fixtures) +(use-fixtures :each + fixtures/react-impl + fixtures/react-components + fixtures/outliner-position-state + fixtures/outliner-db) (defn build-block ([id] @@ -24,7 +23,8 @@ :block/parent-id (outliner-u/->block-lookup-ref parent-id) :block/left-id - (outliner-u/->block-lookup-ref left-id)}) + (outliner-u/->block-lookup-ref left-id) + :block/content (str id)}) (remove #(nil? (val %))) (into {}))] (outliner-u/->Block m))))