Explorar el Código

refactor: simplify editor timeout

Tienson Qin hace 4 años
padre
commit
2f808c14bf

+ 8 - 8
src/main/frontend/db/react.cljs

@@ -280,16 +280,16 @@
   (let [handler-keys (get-handler-keys handler-opts)
         db (conn/get-conn repo-url)]
     (doseq [handler-key handler-keys]
-     (let [handler-key (vec (cons repo-url handler-key))]
-       (when-let [cache (get @query-state handler-key)]
-         (let [{:keys [query inputs transform-fn query-fn inputs-fn]} cache]
-           (when (or query query-fn)
-             (let [new-result (->
+      (let [handler-key (vec (cons repo-url handler-key))]
+        (when-let [cache (get @query-state handler-key)]
+          (let [{:keys [query inputs transform-fn query-fn inputs-fn]} cache]
+            (when (or query query-fn)
+              (let [new-result (->
                                 (cond
                                   query-fn
                                   (profile
-                                    "Query:"
-                                    (doall (query-fn db)))
+                                   "Query:"
+                                   (doall (query-fn db)))
 
                                   inputs-fn
                                   (let [inputs (inputs-fn)]
@@ -304,7 +304,7 @@
                                   :else
                                   (d/q query db))
                                 transform-fn)]
-               (set-new-result! handler-key new-result)))))))))
+                (set-new-result! handler-key new-result)))))))))
 
 (defn transact-react!
   [repo-url tx-data {:keys [key data] :as handler-opts}]

+ 0 - 1
src/main/frontend/extensions/code.cljs

@@ -68,7 +68,6 @@
                         (string/trimr value)
                         "\n")
              content' (utf8/insert! content start_pos end_pos value)]
-         (state/set-editor-op! :code-editor)
          (editor-handler/save-block-if-changed! block content')
          (let [new-pos-meta {:start_pos start_pos
                              :end_pos (+ start_pos

+ 10 - 8
src/main/frontend/handler/block.cljs

@@ -71,14 +71,16 @@
        blocks
        (let [page-block (when page-name (db/entity [:block/name (string/lower-case page-name)]))
              page-id {:db/id (:db/id page-block)}
-             dummy (merge {:block/uuid (db/new-block-id)
-                           :block/left page-id
-                           :block/parent page-id
-                           :block/title ""
-                           :block/content ""
-                           :block/format format
-                           :block/dummy? true}
-                          default-option)]
+             dummy (->
+                    (merge {:block/uuid (db/new-block-id)
+                            :block/left page-id
+                            :block/parent page-id
+                            :block/title ""
+                            :block/content ""
+                            :block/format format
+                            :block/dummy? true}
+                           default-option)
+                    (dissoc :block/file))]
          [dummy])))))
 
 (defn filter-blocks

+ 47 - 75
src/main/frontend/handler/editor.cljs

@@ -442,8 +442,8 @@
                                    (outliner-insert-block! current-block next-block block-self?))
         refresh-fn (fn []
                      (let [opts {:key :block/insert
-                                :data [current-block next-block]}]
-                      (db/refresh! repo opts)))]
+                                 :data [current-block next-block]}]
+                       (db/refresh! repo opts)))]
     (do
       (if (or dummy? (not sibling?))
         (refresh-fn)
@@ -453,8 +453,7 @@
       ;; WORKAROUND: The block won't refresh itself even if the content is empty.
       (when block-self?
         (gobj/set input "value" ""))
-      (profile "ok handler" (ok-handler next-block))
-      (state/set-editor-op! nil))))
+      (profile "ok handler" (ok-handler next-block)))))
 
 (defn clear-when-saved!
   []
@@ -502,10 +501,8 @@
   ([state]
    (insert-new-block! state nil))
   ([state block-value]
-   (when (and (not config/publishing?)
-           ;; skip this operation if it's inserting
-            (not= :insert (state/get-editor-op)))
-     (state/set-editor-op! :insert)
+   (state/set-editor-op! :insert)
+   (when-not config/publishing?
      (when-let [state (get-state state)]
        (let [{:keys [block value format id config]} state
              value (if (string? block-value) block-value value)
@@ -522,7 +519,8 @@
           {:ok-handler
            (fn [last-block]
              (edit-block! last-block 0 format id)
-             (clear-when-saved!))}))))))
+             (clear-when-saved!))}))))
+   (state/set-editor-op! nil)))
 
 (defn update-timestamps-content!
   [{:block/keys [repeated? marker] :as block} content]
@@ -660,9 +658,7 @@
 (defn delete-block!
   [state repo e]
   (let [{:keys [id block-id block-parent-id dummy? value pos format]} (get-state state)]
-    (when (and block-id
-               (not= :block/delete (state/get-editor-op)))
-      (state/set-editor-op! :block/delete)
+    (when block-id
       (let [page-id (:db/id (:block/page (db/entity [:block/uuid block-id])))
             page-blocks-count (and page-id (db/get-page-blocks-count repo page-id))]
         (when (> page-blocks-count 1)
@@ -685,8 +681,7 @@
                                0)]
                       (edit-block! block pos format id
                                    {:custom-content new-value
-                                    :tail-len tail-len})))))))))
-      (state/set-editor-op! nil))))
+                                    :tail-len tail-len}))))))))))))
 
 (defn- get-end-block-parent
   [end-block blocks]
@@ -1069,9 +1064,8 @@
 
 (defn save-current-block!
   []
-  (when (and (nil? (state/get-editor-op))
-             ;; non English input method
-             (not (state/editor-in-composition?)))
+  ;; non English input method
+  (when-not (state/editor-in-composition?)
     (when-let [repo (state/get-current-repo)]
       (when (and (not (state/get-editor-show-page-search?))
                  (not (state/get-editor-show-page-search-hashtag?))
@@ -1079,7 +1073,6 @@
                  (not (state/get-editor-show-date-picker?))
                  (not (state/get-editor-show-template-search?))
                  (not (state/get-editor-show-input)))
-        (state/set-editor-op! :auto-save)
         (try
           (let [input-id (state/get-edit-input-id)
                 block (state/get-edit-block)
@@ -1096,8 +1089,7 @@
                               (string/trim value))))
               (save-block-aux! db-block value (:block/format db-block) {})))
           (catch js/Error error
-            (log/error :save-block-failed error)))
-        (state/set-editor-op! nil)))))
+            (log/error :save-block-failed error)))))))
 
 (defn on-up-down
   [direction]
@@ -1839,21 +1831,12 @@
   (= parent page))
 
 (defn outdent-on-enter
-  ([node]
-   (outdent-on-enter node 100))
-  ([node retry-limit]
-   (if (= :insert (state/get-editor-op))
-     (if (> retry-limit 0)
-       (js/setTimeout #(outdent-on-enter node (dec retry-limit)) 20)
-       (log/error :editor/indent-outdent-retry-max-limit "Unknown Error."))
-     (do
-       (state/set-editor-op! :indent-outdent)
-       (when-not (parent-is-page? node)
-         (let [parent-node (tree/-get-parent node)]
-           (outliner-core/move-subtree node parent-node true)))
-       (let [repo (state/get-current-repo)]
-        (db/refresh! repo {:key :block/change :data [(:data node)]}))
-       (state/set-editor-op! nil)))))
+  [node]
+  (when-not (parent-is-page? node)
+    (let [parent-node (tree/-get-parent node)]
+      (outliner-core/move-subtree node parent-node true)))
+  (let [repo (state/get-current-repo)]
+    (db/refresh! repo {:key :block/change :data [(:data node)]})))
 
 (defn- last-top-level-child?
   [{:keys [id config]} current-node]
@@ -2084,51 +2067,40 @@
 
 ;; TODO: merge indent-on-tab, outdent-on-shift-tab, on-tab
 (defn indent-on-tab
-  ([state]
-   (indent-on-tab state 100))
-  ([state retry-limit]
-   (if (= :insert (state/get-editor-op))
-     (if (> retry-limit 0)
-       (js/setTimeout #(indent-on-tab state (dec retry-limit)) 20)
-       (log/error :editor/indent-outdent-retry-max-limit "indent on hit tab."))
-     (let [{:keys [block block-parent-id value config]} (get-state state)]
-       (when block
-         (state/set-editor-op! :indent-outdent)
-         (let [current-node (outliner-core/block block)
-               first-child? (outliner-core/first-child? current-node)]
-           (when-not first-child?
-             (let [left (tree/-get-left current-node)
-                   children-of-left (tree/-get-children left)]
-               (if (seq children-of-left)
-                 (let [target-node (last children-of-left)]
-                   (outliner-core/move-subtree current-node target-node true))
-                 (outliner-core/move-subtree current-node left false))
-               (let [repo (state/get-current-repo)]
-                 (db/refresh! repo
-                              {:key :block/change :data [(:data current-node)]}))))))
-       (state/set-editor-op! nil)))))
+  [state]
+  (state/set-editor-op! :indent)
+  (let [{:keys [block block-parent-id value config]} (get-state state)]
+    (when block
+      (let [current-node (outliner-core/block block)
+            first-child? (outliner-core/first-child? current-node)]
+        (when-not first-child?
+          (let [left (tree/-get-left current-node)
+                children-of-left (tree/-get-children left)]
+            (if (seq children-of-left)
+              (let [target-node (last children-of-left)]
+                (outliner-core/move-subtree current-node target-node true))
+              (outliner-core/move-subtree current-node left false))
+            (let [repo (state/get-current-repo)]
+              (db/refresh! repo
+                           {:key :block/change :data [(:data current-node)]})))))))
+  (state/set-editor-op! :nil))
 
 (defn outdent-on-shift-tab
   ([state]
    (outdent-on-shift-tab state 100))
   ([state retry-limit]
-   (if (= :insert (state/get-editor-op))
-     (if (> retry-limit 0)
-       (js/setTimeout #(outdent-on-shift-tab state (dec retry-limit)) 20)
-       (log/error :editor/indent-outdent-retry-max-limit "outdent on hit shift tab."))
-     (do
-       (state/set-editor-op! :indent-outdent)
-       (let [{:keys [block block-parent-id value config]} (get-state state)
-             {:block/keys [parent page]} block
-             current-node (outliner-core/block block)
-             parent-is-page? (= parent page)]
-         (when-not parent-is-page?
-           (let [parent (tree/-get-parent current-node)]
-             (outliner-core/move-subtree current-node parent true))
-           (let [repo (state/get-current-repo)]
-             (db/refresh! repo
-                          {:key :block/change :data [(:data current-node)]}))))
-       (state/set-editor-op! nil)))))
+   (state/set-editor-op! :outdent)
+   (let [{:keys [block block-parent-id value config]} (get-state state)
+         {:block/keys [parent page]} block
+         current-node (outliner-core/block block)
+         parent-is-page? (= parent page)]
+     (when-not parent-is-page?
+       (let [parent (tree/-get-parent current-node)]
+         (outliner-core/move-subtree current-node parent true))
+       (let [repo (state/get-current-repo)]
+         (db/refresh! repo
+                      {:key :block/change :data [(:data current-node)]}))))
+   (state/set-editor-op! nil)))
 
 (defn keydown-tab-handler
   [get-state-fn direction]

+ 1 - 1
src/main/frontend/handler/editor/lifecycle.cljs

@@ -85,7 +85,7 @@
                                 path)]
                   (file/alter-file (state/get-current-repo) new-path (string/trim value)
                                    {:re-render-root? true})))))))
-      (when-not (contains? #{:insert :indent-outdent :auto-save} (state/get-editor-op))
+      (when-not (contains? #{:insert :indent :outdent} (state/get-editor-op))
         (editor-handler/save-block! (get-state state) value))))
   state)
 

+ 2 - 1
src/main/frontend/handler/page.cljs

@@ -48,7 +48,8 @@
    (create! title {}))
   ([title {:keys [redirect?]
            :or {redirect? true}}]
-   (let [page (string/lower-case title)]
+   (let [title (string/trim title)
+         page (string/lower-case title)]
      (let [tx (block/page-name->map title true)]
        (db/transact! [tx]))
      (when redirect?

+ 5 - 4
src/main/frontend/util.cljc

@@ -134,7 +134,7 @@
           (js->clj :keywordize-keys true))))
 
 (defn remove-nils
-  "remove pairs of key-value that has nil value from a (possibly nested) map. also transform map to nil if all of its value are nil"
+  "remove pairs of key-value that has nil value from a (possibly nested) map."
   [nm]
   (walk/postwalk
    (fn [el]
@@ -647,9 +647,10 @@
 
 #?(:cljs
    (defn cursor-move-forward [input n]
-     (let [{:keys [pos]} (get-caret-pos input)
-           pos (+ pos n)]
-       (.setSelectionRange input pos pos))))
+     (when input
+       (let [{:keys [pos]} (get-caret-pos input)
+            pos (+ pos n)]
+        (.setSelectionRange input pos pos)))))
 
 #?(:cljs
    (defn move-cursor-to [input n]