1
0
Эх сурвалжийг харах

feat: add old outdent behavior back

Related thread: https://discuss.logseq.com/t/whats-your-preferred-outdent-behavior-the-direct-one-or-the-logical-one/978
Tienson Qin 4 жил өмнө
parent
commit
dbc643b85a

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
resources/css/tooltip.css


+ 4 - 1
src/main/frontend/components/block.cljs

@@ -537,7 +537,10 @@
                          (->elem
                           :span.block-ref
                           (map-inline config title))))]
-           (ui/tippy {:html (block-container config block)
+           (ui/tippy {:html [:div.tippy-wrapper
+                             {:style {:width 780
+                                      :text-align "left"}}
+                             (block-container config block)]
                       :interactive true}
             (if label
               (->elem

+ 24 - 0
src/main/frontend/components/settings.cljs

@@ -134,6 +134,20 @@
          :on-click close-fn}
         "Cancel"]]]]))
 
+(rum/defc outdenting-hint
+  []
+  [:div
+   [:blockquote
+    [:ol
+     [:li "Left (the default way to direct outdenting, unindent in place): it keeps the vertical position but can lead to mixed up categories (c becomes a sub-bullet of b)
+"]
+     [:li "right (logical outdenting, unindent puts items at the bottom) : bullet vertical order is lost but categories are preserved, maybe better in terms of logic, but with longer lists, that also involves a lot of scrolling"]]]
+   [:p "- Contributed by "
+    [:a {:href "https://discuss.logseq.com/t/whats-your-preferred-outdent-behavior-the-direct-one-or-the-logical-one/978/7"}
+     "@cannibalox"]]
+   [:p "See more details at " [:a "https://discuss.logseq.com/t/whats-your-preferred-outdent-behavior-the-direct-one-or-the-logical-one/978"] "."]
+   [:image {:src "https://discuss.logseq.com/uploads/default/original/1X/e8ea82f63a5e01f6d21b5da827927f538f3277b9.gif"}]])
+
 (rum/defcs settings < rum/reactive
   []
   (let [preferred-format (state/get-preferred-format)
@@ -145,6 +159,7 @@
         enable-journals? (state/enable-journals? current-repo)
         enable-encryption? (state/enable-encryption? current-repo)
         sentry-disabled? (state/sub :sentry/disabled?)
+        logical-outdenting? (state/logical-outdenting?)
         enable-git-auto-push? (state/enable-git-auto-push? current-repo)
         enable-block-time? (state/enable-block-time?)
         show-brackets? (state/show-brackets?)
@@ -272,6 +287,15 @@
                  "NOW/LATER"
                  "TODO/DOING")])]]]]
 
+        (toggle "preffered_outdenting"
+                (ui/tippy {:html (outdenting-hint)
+                           :interactive true
+                           :theme "customized"}
+                          (t :settings-page/preferred-outdenting))
+                logical-outdenting?
+                (fn []
+                  (config-handler/toggle-logical-outdenting!)))
+
         (toggle "enable_timetracking"
                 (t :settings-page/enable-timetracking)
                 enable-timetracking?

+ 1 - 0
src/main/frontend/dicts.cljs

@@ -203,6 +203,7 @@
         :settings-page/edit-config-edn "Edit config.edn (for current repo)"
         :settings-page/show-brackets "Show brackets"
         :settings-page/disable-sentry "Disable Sentry.io (for error tracking)"
+        :settings-page/preferred-outdenting "Enable logical outdenting"
         :settings-page/custom-date-format "Preferred journal format"
         :settings-page/preferred-file-format "Preferred file format"
         :settings-page/preferred-workflow "Preferred workflow"

+ 4 - 0
src/main/frontend/handler/config.cljs

@@ -12,3 +12,7 @@
 (defn toggle-ui-show-brackets! []
   (let [show-brackets? (state/show-brackets?)]
     (set-config! :ui/show-brackets? (not show-brackets?))))
+
+(defn toggle-logical-outdenting! []
+  (let [logical-outdenting? (state/logical-outdenting?)]
+    (set-config! :editor/logical-outdenting? (not logical-outdenting?))))

+ 50 - 20
src/main/frontend/modules/outliner/core.cljs

@@ -478,10 +478,32 @@
   [node]
   (nil? (tree/-get-parent (tree/-get-parent node))))
 
+(defn get-right-siblings
+  [node]
+  {:pre [(tree/satisfied-inode? node)]}
+  (when-let [parent (tree/-get-parent node)]
+    (let [children (tree/-get-children parent)]
+      (->> (split-with #(not= (tree/-get-id node) (tree/-get-id %)) children)
+           last
+           rest))))
+
+(defn- logical-outdenting
+  [txs-state parent nodes first-node last-node last-node-right parent-parent-id parent-right]
+  (some-> last-node-right
+          (tree/-set-left-id (tree/-get-left-id first-node))
+          (tree/-save txs-state))
+  (let [first-node (tree/-set-left-id first-node (tree/-get-id parent))]
+    (doseq [node (cons first-node (rest nodes))]
+      (-> (tree/-set-parent-id node parent-parent-id)
+          (tree/-save txs-state))))
+  (some-> parent-right
+          (tree/-set-left-id (tree/-get-id last-node))
+          (tree/-save txs-state)))
+
 (defn indent-outdent-nodes
   [nodes indent?]
   (ds/auto-transact!
-    [txs-state (ds/new-outliner-txs-state)] {:outliner-op :indent-outdent-nodes}
+   [txs-state (ds/new-outliner-txs-state)] {:outliner-op :indent-outdent-nodes}
    (let [first-node (first nodes)
          last-node (last nodes)]
      (if indent?
@@ -489,33 +511,41 @@
          (let [first-node-left-id (tree/-get-left-id first-node)
                last-node-right (tree/-get-right last-node)
                parent-or-last-child-id (or (-> (db/get-block-immediate-children (state/get-current-repo)
-                                                 first-node-left-id)
-                                             last
-                                             :block/uuid)
-                                         first-node-left-id)
+                                                                                first-node-left-id)
+                                               last
+                                               :block/uuid)
+                                           first-node-left-id)
                first-node (tree/-set-left-id first-node parent-or-last-child-id)]
            (doseq [node (cons first-node (rest nodes))]
              (-> (tree/-set-parent-id node first-node-left-id)
-               (tree/-save txs-state)))
+                 (tree/-save txs-state)))
            (some-> last-node-right
-             (tree/-set-left-id first-node-left-id)
-             (tree/-save txs-state))))
+                   (tree/-set-left-id first-node-left-id)
+                   (tree/-save txs-state))))
        (when-not (first-level? first-node)
          (let [parent (tree/-get-parent first-node)
                parent-parent-id (tree/-get-parent-id parent)
                parent-right (tree/-get-right parent)
-               last-node-right (tree/-get-right last-node)]
-           (some-> last-node-right
-             (tree/-set-left-id (tree/-get-left-id first-node))
-             (tree/-save txs-state))
-           (let [first-node (tree/-set-left-id first-node (tree/-get-id parent))]
-             (doseq [node (cons first-node (rest nodes))]
-               (-> (tree/-set-parent-id node parent-parent-id)
-                 (tree/-save txs-state))))
-           (some-> parent-right
-             (tree/-set-left-id (tree/-get-id last-node))
-             (tree/-save txs-state))))))))
-
+               last-node-right (tree/-get-right last-node)
+               last-node-id (tree/-get-id last-node)]
+           (logical-outdenting txs-state parent nodes first-node last-node last-node-right parent-parent-id parent-right)
+           (when-not (state/logical-outdenting?)
+             ;; direct outdenting (the old behavior)
+             (let [right-siblings (get-right-siblings last-node)
+                   right-siblings (doall
+                                   (map (fn [sibling right-siblings]
+                                          (some->
+                                           (tree/-set-parent-id sibling last-node-id)
+                                           (tree/-save txs-state)))
+                                     right-siblings))]
+               (when-let [last-node-right (first right-siblings)]
+                 (let [last-node-children (tree/-get-children last-node)
+                       left-id (if (seq last-node-children)
+                                 (tree/-get-id (last last-node-children))
+                                 last-node-id)]
+                   (when left-id
+                     (some-> (tree/-set-left-id last-node-right left-id)
+                             (tree/-save txs-state)))))))))))))
 
 (defn- set-nodes-page&file-aux
   [node page file txs-state]

+ 5 - 0
src/main/frontend/modules/shortcut/config.cljs

@@ -235,6 +235,10 @@
     {:desc    "Toggle whether to display brackets"
      :binding "mod+c mod+b"
      :fn      config-handler/toggle-ui-show-brackets!}
+    :editor/toggle-outdenting
+    {:desc    "Toggle outdenting behavior"
+     :binding "mod+c mod+o"
+     :fn      config-handler/toggle-logical-outdenting!}
     :go/search-in-page
     {:desc    "Search in the current page"
      :binding "mod+shift+u"
@@ -387,6 +391,7 @@
    [:ui/toggle-help
     :ui/toggle-new-block
     :ui/toggle-wide-mode
+    :editor/toggle-outdenting
     :ui/toggle-document-mode
     :ui/toggle-brackets
     :ui/toggle-theme

+ 6 - 0
src/main/frontend/state.cljs

@@ -86,6 +86,7 @@
     :editor/last-input-time nil
     :editor/new-block-toggle? false
     :editor/args nil
+    :editor/logical-outdenting? false
     :db/last-transact-time {}
     :db/last-persist-transact-ids {}
     ;; whether database is persisted
@@ -1227,6 +1228,11 @@
   (when value
     (.close js/window.Sentry)))
 
+(defn logical-outdenting?
+  []
+  (:editor/logical-outdenting?
+   (get (sub-config) (get-current-repo))))
+
 (defn get-editor-args
   []
   (:editor/args @state))

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно