Ver Fonte

fix: block properties should be shown in the same order when saving

Tienson Qin há 4 anos atrás
pai
commit
0cbf80e661

+ 3 - 3
deps.edn

@@ -21,8 +21,7 @@
   ;; fork
   com.andrewmcveigh/cljs-time {:git/url "https://github.com/logseq/cljs-time",
                                :sha "5704fbf48d3478eedcf24d458c8964b3c2fd59a9"}
-  cljs-drag-n-drop/cljs-drag-n-drop
-  {:mvn/version "0.1.0"}
+  cljs-drag-n-drop/cljs-drag-n-drop {:mvn/version "0.1.0"}
   borkdude/sci                {:mvn/version "0.1.1-alpha.6"}
   hickory/hickory             {:mvn/version "0.7.1"}
   hiccups/hiccups             {:mvn/version "0.3.0"}
@@ -34,7 +33,8 @@
   binaryage/devtools          {:mvn/version "1.0.2"}
   camel-snake-kebab/camel-snake-kebab {:mvn/version "0.4.2"}
   instaparse/instaparse       {:mvn/version "1.4.10"}
-  nubank/workspaces           {:mvn/version "1.1.1"}}
+  nubank/workspaces           {:mvn/version "1.1.1"}
+  frankiesardo/linked         {:mvn/version "1.3.0"}}
 
  :aliases {:cljs {:extra-paths ["src/dev-cljs/" "src/test/" "src/electron/"]
                   :extra-deps  {org.clojure/clojurescript   {:mvn/version "1.10.844"}

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

@@ -1468,7 +1468,9 @@
 (rum/defc properties-cp
   [config block]
   (let [properties (walk/keywordize-keys (:block/properties block))
+        properties-order (:block/properties-order block)
         properties (apply dissoc properties property/built-in-properties)
+        properties-order (remove property/built-in-properties properties-order)
         pre-block? (:block/pre-block? block)
         properties (if pre-block?
                      (let [repo (state/get-current-repo)
@@ -1482,7 +1484,9 @@
                            (assoc properties :alias aliases))
                          properties))
                      properties)
-        properties (sort properties)]
+        properties (if (seq properties-order)
+                     (map (fn [k] [k (get properties k)]) properties-order)
+                     properties)]
     (cond
       (seq properties)
       [:div.block-properties

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

@@ -327,7 +327,8 @@
                                                              (:db/id page)
                                                              :page-presentation
                                                              {:page page}))}}
-                                     (when-not contents?
+                                     (when (and (not contents?)
+                                                (not journal?))
                                        {:title   (t :page/rename)
                                         :options {:on-click #(state/set-modal! (rename-page-dialog title page-name))}})
 

+ 2 - 0
src/main/frontend/db_schema.cljs

@@ -68,6 +68,8 @@
 
    ;; block key value properties
    :block/properties {}
+   ;; vector
+   :block/properties-order {}
 
    ;; parsed ast
    :block/body {}

+ 49 - 41
src/main/frontend/format/block.cljs

@@ -193,37 +193,40 @@
 ;; TODO: we should move this to mldoc
 (defn extract-properties
   [properties]
-  (let [properties (into {} properties)
-        page-refs (->>
-                   (map (fn [v]
-                          (when (string? v)
-                            (let [result (text/split-page-refs-without-brackets v {:un-brackets? false})]
-                              (if (coll? result)
-                                (map text/page-ref-un-brackets! result)
-                                []))))
-                     (vals properties))
-                   (apply concat)
-                   (remove string/blank?))
-        properties (->> properties
-                        (medley/map-kv (fn [k v]
-                                         (let [k (-> (string/lower-case (name k))
-                                                     (string/replace " " "-")
-                                                     (string/replace "_" "-"))
-                                               k (if (contains? #{"custom_id" "custom-id"} k)
-                                                   "id"
-                                                   k)
-                                               v (if (coll? v)
-                                                   v
-                                                   (property/parse-property k v))
-                                               k (keyword k)
-                                               v (if (and
-                                                      (string? v)
-                                                      (contains? #{:alias :aliases :tags} k))
-                                                   (set [v])
-                                                   v)]
-                                           [k v]))))]
-    {:properties properties
-     :page-refs page-refs}))
+  (when (seq properties)
+    (let [properties (seq properties)
+          properties-order (keys properties)
+          page-refs (->>
+                     (map (fn [v]
+                            (when (string? v)
+                              (let [result (text/split-page-refs-without-brackets v {:un-brackets? false})]
+                                (if (coll? result)
+                                  (map text/page-ref-un-brackets! result)
+                                  []))))
+                       (map last properties))
+                     (apply concat)
+                     (remove string/blank?))
+          properties (->> properties
+                          (map (fn [[k v]]
+                                 (let [k (-> (string/lower-case (name k))
+                                             (string/replace " " "-")
+                                             (string/replace "_" "-"))
+                                       k (if (contains? #{"custom_id" "custom-id"} k)
+                                           "id"
+                                           k)
+                                       v (if (coll? v)
+                                           v
+                                           (property/parse-property k v))
+                                       k (keyword k)
+                                       v (if (and
+                                              (string? v)
+                                              (contains? #{:alias :aliases :tags} k))
+                                           (set [v])
+                                           v)]
+                                   [k v]))))]
+      {:properties (into {} properties)
+       :properties-order (map first properties)
+       :page-refs page-refs})))
 
 (defn- paragraph-timestamp-block?
   [block]
@@ -525,16 +528,21 @@
                           (>= level last-level)
                           [(conj children [id level])
                            #{}])
-
-                        block (-> (assoc block
-                                         :uuid id
-                                         :body (vec
-                                                (->> (reverse block-body)
-                                                     (map #(remove-indentations format (:level block) %))))
-                                         :properties (:properties properties)
-                                         :refs ref-pages-in-properties
-                                         :children (or current-block-children [])
-                                         :format format)
+                        block (cond->
+                                (assoc block
+                                      :uuid id
+                                      :body (vec
+                                             (->> (reverse block-body)
+                                                  (map #(remove-indentations format (:level block) %))))
+                                      :refs ref-pages-in-properties
+                                      :children (or current-block-children [])
+                                      :format format)
+                                (seq (:properties properties))
+                                (assoc :properties (:properties properties))
+
+                                (seq (:properties-order properties))
+                                (assoc :properties-order (:properties-order properties)))
+                        block (-> block
                                   (assoc-in [:meta :start-pos] start_pos)
                                   (assoc-in [:meta :end-pos] last-pos)
                                   ((fn [block]

+ 5 - 5
src/main/frontend/format/mldoc.cljs

@@ -9,7 +9,8 @@
             [goog.object :as gobj]
             [lambdaisland.glogi :as log]
             [medley.core :as medley]
-            ["mldoc" :as mldoc :refer [Mldoc]]))
+            ["mldoc" :as mldoc :refer [Mldoc]]
+            [linked.core :as linked]))
 
 (defonce parseJson (gobj/get Mldoc "parseJson"))
 (defonce parseInlineJson (gobj/get Mldoc "parseInlineJson"))
@@ -139,9 +140,8 @@
                                    v (if (contains? #{:title :description :filters :roam_tags} k)
                                        v
                                        (text/split-page-refs-without-brackets v))]
-                               [k v])))
-                          (reverse)
-                          (into {}))
+                               [k v]))))
+          properties (into (linked/map) properties)
           macro-properties (filter (fn [x] (= :macro (first x))) properties)
           macros (if (seq macro-properties)
                    (->>
@@ -155,7 +155,7 @@
                     (into {}))
                    {})
           properties (->> (remove (fn [x] (= :macro (first x))) properties)
-                          (into {}))
+                          (into (linked/map)))
           properties (if (seq properties)
                        (cond-> properties
                          (:roam_key properties)