Przeglądaj źródła

enhance: display tags instead of property in outliner

Tienson Qin 2 lat temu
rodzic
commit
7edfa533d4

+ 4 - 6
src/main/frontend/commands.cljs

@@ -233,9 +233,8 @@
          ["Underline" [[:editor/input "<ins></ins>"
                         {:last-pattern command-trigger
                          :backward-pos 6}]] "Create a underline text decoration"])
-       (when-not db?
-         ["Template" [[:editor/input command-trigger nil]
-                      [:editor/search-template]] "Insert a created template here"])
+       ["Template" [[:editor/input command-trigger nil]
+                    [:editor/search-template]] "Insert a created template here"]
        (cond
          (and (util/electron?) (config/local-file-based-graph? (state/get-current-repo)))
 
@@ -299,9 +298,8 @@
 
        ["Embed Twitter tweet" [[:editor/input "{{tweet }}" {:last-pattern command-trigger
                                                             :backward-pos 2}]]]
-       (when db?
-         ["Add new property" [[:editor/clear-current-slash]
-                             [:editor/new-property]]])
+       ["Add new property" [[:editor/clear-current-slash]
+                            [:editor/new-property]]]
 
        ["Code block" [[:editor/input "```\n```\n" {:type            "block"
                                                    :backward-pos    5

+ 19 - 7
src/main/frontend/components/block.cljs

@@ -20,6 +20,7 @@
             [frontend.components.svg :as svg]
             [frontend.components.query :as query]
             [frontend.components.property :as property-component]
+            [frontend.components.property.value :as property-value]
             [frontend.config :as config]
             [frontend.context.i18n :refer [t]]
             [frontend.date :as date]
@@ -622,10 +623,8 @@
   [{:keys [children sidebar? tippy-position tippy-distance fixed-position? open? manual?] :as config} page-name]
   (let [*tippy-ref (rum/create-ref)
         page-name (util/page-name-sanity-lc page-name)
-        whiteboard-page? (model/whiteboard-page? page-name)
         redirect-page-name (or (model/get-redirect-page-name page-name (:block/alias? config))
                                page-name)
-        page-original-name (model/get-page-original-name redirect-page-name)
         _  #_:clj-kondo/ignore (rum/defc html-template []
                                  (let [*el-popup (rum/use-ref nil)]
 
@@ -678,7 +677,7 @@
   "Component for a page. `page` argument contains :block/name which can be (un)sanitized page name.
    Keys for `config`:
    - `:preview?`: Is this component under preview mode? (If true, `page-preview-trigger` won't be registered to this `page-cp`)"
-  [{:keys [html-export? redirect-page-name label children contents-page? preview?] :as config} page]
+  [{:keys [html-export? redirect-page-name label children contents-page? preview? disable-preview?] :as config} page]
   (when-let [page-name-in-block (:block/name page)]
     (let [page-name-in-block (gp-util/remove-boundary-slashes page-name-in-block)
           page-name (util/page-name-sanity-lc page-name-in-block)
@@ -698,7 +697,8 @@
             (:block/name page))
 
         (and (not (util/mobile?))
-             (not preview?))
+             (not preview?)
+             (not disable-preview?))
         (page-preview-trigger (assoc config :children inner) page-name)
 
         :else
@@ -2275,8 +2275,19 @@
                (rum/with-key (block-child block)
                  (str uuid "-" idx)))))]))))
 
+(rum/defc named-block
+  [config block]
+  [:div.flex.flex-1.flex-row.flex-wrap.items-center
+   (page-cp config block)
+   (when (:block/tags block)
+     [:div.flex.flex-1.flex-row.flex-wrap.items-center.ml-4
+      (for [tag (:block/tags block)]
+        (page-cp (assoc config
+                        :tag? true
+                        :disable-preview? true) tag))])])
+
 (rum/defc block-content < rum/reactive
-  [config {:block/keys [uuid content children properties scheduled deadline format pre-block?] :as block} edit-input-id block-id slide? selected?]
+  [config {:block/keys [uuid content properties scheduled deadline format pre-block?] :as block} edit-input-id block-id slide? selected?]
   (let [repo (state/get-current-repo)
         content (property/remove-built-in-properties format content)
         {:block/keys [title body] :as block} (if (:block/title block) block
@@ -2330,7 +2341,7 @@
          [:div.flex-1.w-full
           (cond
             (:block/original-name block)
-            (page-cp config block)
+            (named-block config block)
 
             (or (seq title) (:block/marker block))
             (build-block-title config block)
@@ -2880,7 +2891,8 @@
            (db-properties-cp config
                              block
                              edit-input-id
-                             {:selected? selected?}))])
+                             {:selected? selected?
+                              :in-block-container? true}))])
 
       (when @*show-right-menu?
         (block-right-menu config block edit?))]

+ 2 - 2
src/main/frontend/components/property.cljs

@@ -355,7 +355,7 @@
   {:init (fn [state]
            (assoc state ::blocks-container-id (or (:blocks-container-id (last (:rum/args state)))
                                                   (state/next-blocks-container-id))))}
-  [state target-block edit-input-id opts]
+  [state target-block edit-input-id {:keys [in-block-container?] :as opts}]
   (let [block (resolve-linked-block-if-exists target-block)
         properties (if (and (:class-schema? opts) (:block/schema block))
                      (let [properties (:properties (:block/schema block))]
@@ -365,7 +365,7 @@
         tags (set (map :block/uuid (:block/tags block)))
         alias-properties (when (seq alias)
                            [[(:block/uuid (db/entity [:block/name "alias"])) alias]])
-        tags-properties (when (seq tags)
+        tags-properties (when (and (seq tags) (not in-block-container?))
                           [[(:block/uuid (db/entity [:block/name "tags"])) tags]])
         class-properties (->> (:block/tags block)
                               (mapcat (fn [tag]

+ 23 - 0
src/main/frontend/format/mldoc.cljs

@@ -9,6 +9,7 @@
             [logseq.graph-parser.mldoc :as gp-mldoc]
             [logseq.graph-parser.util :as gp-util]
             [logseq.graph-parser.text :as text]
+            [logseq.graph-parser.block :as gp-block]
             [clojure.walk :as walk]))
 
 (defonce anchorLink (gobj/get Mldoc "anchorLink"))
@@ -131,3 +132,25 @@
        ast)
       (-> (string/trim (apply str @*result))
           text/page-ref-un-brackets!))))
+
+(defn extract-tags
+  "Extract tags from content"
+  [content]
+  (let [ast (->edn content (gp-mldoc/default-config :markdown))
+        *result (atom [])]
+    (walk/prewalk
+     (fn [f]
+       (cond
+           ;; tag
+         (and (vector? f)
+              (= "Tag" (first f)))
+         (let [tag (gp-block/get-tag f)]
+           (swap! *result conj tag)
+           nil)
+
+         :else
+         f))
+     ast)
+    (->> @*result
+         (remove string/blank?)
+         (distinct))))

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

@@ -1200,7 +1200,19 @@
       (let [value (string/trim value)]
         ;; FIXME: somehow frontend.components.editor's will-unmount event will loop forever
         ;; maybe we shouldn't save the block/file in "will-unmount" event?
-        (save-block-if-changed! block value opts)))))
+        (if (:block/original-name entity)
+          (let [existing-tags (:block/tags block)
+                tags (mldoc/extract-tags value)]
+            (when (seq tags)
+              (let [tag-pages (concat
+                               (map #(block/page-name->map % true) tags)
+                               (map :db/id existing-tags))
+                    opts {:outliner-op :save-block}]
+                (outliner-tx/transact!
+                 opts
+                 (outliner-core/save-block! {:db/id (:db/id block)
+                                             :block/tags tag-pages})))))
+          (save-block-if-changed! block value opts))))))
 
 (defn save-block!
   ([repo block-or-uuid content]