Forráskód Böngészése

Merge pull request #11055 from logseq/fix/new-attribute-for-class-parent

New attribute for class parent
Gabriel Horner 1 éve
szülő
commit
4f37d2ca11

+ 1 - 0
deps/db/src/logseq/db.cljs

@@ -41,6 +41,7 @@
     ;; TODO: remove this in later releases
     :block/heading-level
     :block/file
+    :class/parent
     {:block/page [:db/id :block/name :block/original-name :block/journal-day]}
     {:block/_parent ...}])
 

+ 3 - 3
deps/db/src/logseq/db/frontend/malli_schema.cljs

@@ -90,6 +90,7 @@
    [:block/original-name :string]
    [:block/type {:optional true} [:enum #{"property"} #{"class"} #{"whiteboard"} #{"hidden"}]]
    [:block/journal? :boolean]
+   [:block/namespace {:optional true} :int]
    [:block/alias {:optional true} [:set :int]]
     ;; TODO: Should this be here or in common?
    [:block/path-refs {:optional true} [:set :int]]])
@@ -101,8 +102,7 @@
      ;; Only for linked pages
      [:block/collapsed? {:optional true} :boolean]
      ;; journal-day is only set for journal pages
-     [:block/journal-day {:optional true} :int]
-     [:block/namespace {:optional true} :int]]
+     [:block/journal-day {:optional true} :int]]
     page-attrs
     page-or-block-attrs)))
 
@@ -123,7 +123,7 @@
   (vec
    (concat
     [:map
-     [:block/namespace {:optional true} :int]
+     [:class/parent {:optional true} :int]
      [:db/ident {:optional true} logseq-ident]
      [:block/schema
       {:optional true}

+ 7 - 0
deps/db/src/logseq/db/frontend/rules.cljc

@@ -11,6 +11,13 @@
       [?t :block/namespace ?p]
       (namespace ?t ?c)]]
 
+   :class-parent
+   '[[(class-parent ?p ?c)
+      [?c :class/parent ?p]]
+     [(class-parent ?p ?c)
+      [?t :class/parent ?p]
+      (class-parent ?t ?c)]]
+
    :alias
    '[[(alias ?e2 ?e1)
       [?e2 :block/alias ?e1]]

+ 4 - 2
deps/db/src/logseq/db/frontend/schema.cljs

@@ -121,8 +121,10 @@
    (dissoc schema
            :block/properties-text-values :block/pre-block? :recent/pages :file/handle :block/file
            :block/properties-order)
-   {:file/last-modified-at {}}
-   {:asset/uuid {:db/unique :db.unique/identity}
+   {:class/parent {:db/valueType :db.type/ref
+                   :db/index true}
+    :file/last-modified-at {}
+    :asset/uuid {:db/unique :db.unique/identity}
     :asset/meta {}}))
 
 (def retract-attributes

+ 4 - 3
deps/db/src/logseq/db/sqlite/db.cljs

@@ -89,9 +89,10 @@
   [graphs-dir db-name]
   (let [[db-sanitized-name db-full-path] (get-db-full-path graphs-dir db-name)
         db (new sqlite db-full-path nil)
-        schema (if (sqlite-util/db-based-graph? db-name)
-                 db-schema/schema-for-db-based-graph
-                 db-schema/schema)]
+        ;; For both desktop and CLI, only file graphs have db-name that indicate their db type
+        schema (if (sqlite-util/local-file-based-graph? db-name)
+                 db-schema/schema
+                 db-schema/schema-for-db-based-graph)]
     (sqlite-common-db/create-kvs-table! db)
     (swap! databases assoc db-sanitized-name db)
     (let [storage (new-sqlite-storage db)

+ 2 - 2
scripts/src/logseq/tasks/db_graph/create_graph_with_schema_org.cljs

@@ -75,7 +75,7 @@
                            (class-m "rdfs:comment")
                            (assoc :description (get-comment-string (class-m "rdfs:comment") renamed-pages)))}
       parent-class
-      (assoc :block/namespace {:db/id (get-class-db-id class-db-ids parent-class)})
+      (assoc :class/parent {:db/id (get-class-db-id class-db-ids parent-class)})
       (seq properties)
       (assoc :block/schema {:properties (mapv property-uuids properties)}))))
 
@@ -252,7 +252,7 @@
         pages (mapv #(hash-map :page
                                (->class-page % class-db-ids class-uuids class-to-properties property-uuids options))
                     select-classes)]
-    (assert (= ["Thing"] (keep #(when-not (:block/namespace (:page %))
+    (assert (= ["Thing"] (keep #(when-not (:class/parent (:page %))
                                   (:block/original-name (:page %)))
                                pages))
             "Thing is the only class that doesn't have a parent class")

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

@@ -775,8 +775,8 @@
 
 (rum/defc page-reference < rum/reactive
   "Component for page reference"
-  [html-export? s {:keys [nested-link? id] :as config} label]
-  (let [show-brackets? (state/show-brackets?)
+  [html-export? s {:keys [nested-link? show-brackets? id] :as config} label]
+  (let [show-brackets? (if (some? show-brackets?) show-brackets? (state/show-brackets?))
         block-uuid (:block/uuid config)
         contents-page? (= "contents" (string/lower-case (str id)))]
     (if (string/ends-with? s ".excalidraw")

+ 39 - 11
src/main/frontend/components/class.cljs

@@ -6,12 +6,13 @@
             [frontend.state :as state]
             [frontend.ui :as ui]
             [frontend.util :as util]
-            [rum.core :as rum]))
+            [rum.core :as rum]
+            [frontend.components.block :as block]))
 
 (rum/defc class-select
   [page class on-select]
   (let [repo (state/get-current-repo)
-        children-pages (model/get-namespace-children repo (:db/id page))
+        children-pages (model/get-class-children repo (:db/id page))
         ;; Disallows cyclic hierarchies
         exclude-ids (-> (set (map (fn [id] (:block/uuid (db/entity id))) children-pages))
                         (conj (:block/uuid page))) ; break cycle
@@ -53,9 +54,9 @@
                                       (if (seq value)
                                         (db/transact!
                                          [{:db/id (:db/id page)
-                                           :block/namespace [:block/uuid (uuid value)]}])
+                                           :class/parent [:block/uuid (uuid value)]}])
                                         (db/transact!
-                                         [[:db.fn/retractAttribute (:db/id page) :block/namespace]]))))]
+                                          [[:db.fn/retractAttribute (:db/id page) :class/parent]]))))]
       [:div.opacity-50.pointer.text-sm.cursor-pointer {:on-click #(reset! *show? true)}
        "Empty"])))
 
@@ -73,22 +74,22 @@
         [:div.col-span-2 "Parent class:"]
         (if config/publishing?
           [:div.col-span-3
-           (if-let [parent-class (some-> (:db/id (:block/namespace page))
+           (if-let [parent-class (some-> (:db/id (:class/parent page))
                                          db/entity
                                          :block/original-name)]
              [:a {:on-click #(route-handler/redirect-to-page! parent-class)}
               parent-class]
              "None")]
           [:div.col-span-3
-           (let [parent (some-> (:db/id (:block/namespace page))
+           (let [parent (some-> (:db/id (:class/parent page))
                                 db/entity)]
              (page-parent page parent))])]
 
-       (when (:block/namespace page)
-         (let [ancestor-pages (loop [namespaces [page]]
-                                (if-let [parent (:block/namespace (last namespaces))]
-                                  (recur (conj namespaces parent))
-                                  namespaces))
+       (when (:class/parent page)
+         (let [ancestor-pages (loop [parents [page]]
+                                (if-let [parent (:class/parent (last parents))]
+                                  (recur (conj parents parent))
+                                  parents))
                class-ancestors (map :block/original-name (reverse ancestor-pages))]
            (when (> (count class-ancestors) 2)
              [:div.grid.grid-cols-5.gap-1.items-center.class-ancestors
@@ -100,3 +101,30 @@
                                    [:span class-name]
                                    [:a {:on-click #(route-handler/redirect-to-page! class-name)} class-name]))
                                class-ancestors))]])))])))
+
+(defn class-children-aux
+  [class {:keys [default-collapsed?] :as opts}]
+  (let [children (:class/_parent class)]
+    (when (seq children)
+      [:ul
+       (for [child (sort-by :block/original-name children)]
+         (let [title [:li.ml-2 (block/page-reference false (:block/original-name child) {:show-brackets? false} nil)]]
+           (if (seq (:class/_parent child))
+             (ui/foldable
+              title
+              (class-children-aux child opts)
+              {:default-collapsed? default-collapsed?})
+             title)))])))
+
+(rum/defc class-children
+  [class]
+  (when (seq (:class/_parent class))
+    (let [children-pages (model/get-class-children (state/get-current-repo) (:db/id class))
+          ;; Expand children if there are about a pageful of total blocks to display
+          default-collapsed? (> (count children-pages) 30)]
+      [:div.mt-4
+       (ui/foldable
+        [:h2.font-medium "Child classes (" (count children-pages) ")"]
+        [:div.mt-2.ml-1 (class-children-aux class {:default-collapsed? default-collapsed?})]
+        {:default-collapsed? false
+         :title-trigger? true})])))

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

@@ -119,7 +119,8 @@
        [:<>
         (when (= mode :class)
           (class-component/configure page {:show-title? false}))
-        (when-not config/publishing? (tags-row page))
+        (when-not (or config/publishing? class?)
+          (tags-row page))
         (when-not config/publishing? (icon-row page))
         [:h2 "Properties: "]
         (page-properties page (assoc page-opts :mode mode))])]))

+ 20 - 58
src/main/frontend/components/hierarchy.cljs

@@ -8,8 +8,7 @@
             [frontend.ui :as ui]
             [medley.core :as medley]
             [rum.core :as rum]
-            [frontend.util :as util]
-            [frontend.config :as config]))
+            [frontend.util :as util]))
 
 (defn- get-relation
   "Get all parent pages along the namespace hierarchy path.
@@ -44,62 +43,25 @@
             :else
             nil))))))
 
-(rum/defc page-children
-  [page-id parent-children-map namespace-page-map options]
-  [:.ml-4.mb-2
-   {:key (str "page-children-" page-id)}
-   (->> (parent-children-map page-id)
-        (sort-by #(get-in namespace-page-map [% :block/original-name]))
-        (map #(let [child-name (get-in namespace-page-map [% :block/original-name])]
-                (if (seq (parent-children-map %))
-                  (ui/foldable (block/page-reference false child-name {} child-name)
-                               (page-children % parent-children-map namespace-page-map options)
-                               (select-keys options [:default-collapsed?]))
-                  [:div
-                   (block/page-reference false child-name {} child-name)]))))])
-
-(rum/defc db-version-hierarchy
-  [page namespace-pages]
-  (let [parent-children-map (reduce (fn [acc m]
-                                      (update acc
-                                              (get-in m [:block/namespace :db/id])
-                                              (fnil conj [])
-                                              (:db/id m)))
-                                    {}
-                                    namespace-pages)
-        namespace-page-map (into {} (map (juxt :db/id identity) namespace-pages))
-        page-id (:db/id (db/entity [:block/name (util/page-name-sanity-lc page)]))
-        ;; Expand children if there are about a page-ful of total blocks to display
-        default-collapsed? (> (count namespace-pages) 30)]
-    [:div.page-hierarchy.mt-6
-     (ui/foldable
-      [:h2.font-bold.opacity-30 (str "Hierarchy (" (count namespace-pages) ")")]
-      [:div.p-4
-       (page-children page-id parent-children-map namespace-page-map {:default-collapsed? default-collapsed?})]
-      {:default-collapsed? false
-       :title-trigger? true})]))
-
 (rum/defc structures
   [page]
-  (let [{:keys [namespaces namespace-pages]} (get-relation page)]
+  (let [{:keys [namespaces]} (get-relation page)]
     (when (seq namespaces)
-      (if (config/db-based-graph? (state/get-current-repo))
-        (db-version-hierarchy page namespace-pages)
-        [:div.page-hierarchy.mt-6
-         (ui/foldable
-          [:h2.font-bold.opacity-30 "Hierarchy"]
-          [:ul.namespaces {:style {:margin "12px 24px"}}
-           (for [namespace namespaces]
-             [:li.my-2
-              (->>
-               (for [[idx page] (medley/indexed namespace)]
-                 (when (and (string? page) page)
-                   (let [full-page (->> (take (inc idx) namespace)
-                                        util/string-join-path)]
-                     (block/page-reference false
-                                           full-page
-                                           {}
-                                           page))))
-               (interpose [:span.mx-2.opacity-30 "/"]))])]
-          {:default-collapsed? false
-           :title-trigger? true})]))))
+      [:div.page-hierarchy.mt-6
+       (ui/foldable
+        [:h2.font-bold.opacity-30 "Hierarchy"]
+        [:ul.namespaces {:style {:margin "12px 24px"}}
+         (for [namespace namespaces]
+           [:li.my-2
+            (->>
+             (for [[idx page] (medley/indexed namespace)]
+               (when (and (string? page) page)
+                 (let [full-page (->> (take (inc idx) namespace)
+                                      util/string-join-path)]
+                   (block/page-reference false
+                                         full-page
+                                         {}
+                                         page))))
+             (interpose [:span.mx-2.opacity-30 "/"]))])]
+        {:default-collapsed? false
+         :title-trigger? true})])))

+ 4 - 0
src/main/frontend/components/page.cljs

@@ -11,6 +11,7 @@
             [frontend.components.scheduled-deadlines :as scheduled]
             [frontend.components.icon :as icon-component]
             [frontend.components.db-based.page :as db-page]
+            [frontend.components.class :as class-component]
             [frontend.handler.property.util :as pu]
             [frontend.handler.db-based.property :as db-property-handler]
             [frontend.handler.db-based.property.util :as db-pu]
@@ -555,6 +556,9 @@
                       (reference/references route-page-name)
                       (str route-page-name "-refs"))]))
 
+               (when (contains? (:block/type page) "class")
+                 (class-component/class-children page))
+
                (when-not block-or-whiteboard?
                  (when (not journal?)
                    (hierarchy/structures route-page-name)))

+ 5 - 4
src/main/frontend/components/property/value.cljs

@@ -270,10 +270,11 @@
                  :transform-fn (fn [results input]
                                  (if-let [[_ new-page class-input] (and (empty? results) (re-find #"(.*)#(.*)$" input))]
                                    (let [repo (state/get-current-repo)
-                                         class-names (map #(:block/original-name (db/entity repo [:block/uuid %])) string-classes)
-                                         descendent-classes (->> class-names
-                                                                 (mapcat #(db/get-namespace-pages repo %))
-                                                                 (map :block/original-name))]
+                                         class-ents (map #(db/entity repo [:block/uuid %]) string-classes)
+                                         class-names (map :block/original-name class-ents)
+                                         descendent-classes (->> class-ents
+                                                                 (mapcat #(model/get-class-children repo (:db/id %)))
+                                                                 (map #(:block/original-name (db/entity repo %))))]
                                      (->> (concat class-names descendent-classes)
                                           (filter #(string/includes? % class-input))
                                           (mapv #(hash-map :value (str new-page "#" %)))))

+ 6 - 6
src/main/frontend/db/model.cljs

@@ -1000,33 +1000,33 @@ independent of format as format specific heading characters are stripped"
      [?page :block/uuid ?id]]
     (conn/get-db repo)))
 
-(defn get-namespace-children
+(defn get-class-children
   [repo eid]
   (->>
    (d/q '[:find [?children ...]
           :in $ ?parent %
           :where
-          (namespace ?parent ?children)]
+          (class-parent ?parent ?children)]
         (conn/get-db repo)
         eid
-        (:namespace rules/rules))
+        (:class-parent rules/rules))
    distinct))
 
 ;; FIXME: async query
 (defn get-class-objects
   [repo class-id]
   (when-let [class (db-utils/entity repo class-id)]
-    (if (first (:block/_namespace class))        ; has children classes
+    (if (first (:class/_parent class))        ; has children classes
       (d/q
        '[:find [?object ...]
          :in $ % ?parent
          :where
-         (namespace ?parent ?c)
+         (class-parent ?parent ?c)
          (or-join [?object ?c]
           [?object :block/tags ?parent]
           [?object :block/tags ?c])]
        (conn/get-db repo)
-       (:namespace rules/rules)
+       (:class-parent rules/rules)
        class-id)
       (map :db/id (:block/_tags class)))))
 

+ 12 - 12
src/main/frontend/handler/db_based/property.cljs

@@ -529,20 +529,20 @@
                   [[f (:db/id block) :block/collapsed-properties (:db/id property)]]
                   {:outliner-op :save-block})))
 
-(defn- get-namespace-parents
+(defn- get-class-parents
   [tags]
   (let [tags' (filter (fn [tag] (contains? (:block/type tag) "class")) tags)
-        *namespaces (atom #{})]
+        *classes (atom #{})]
     (doseq [tag tags']
-      (when-let [ns (:block/namespace tag)]
-        (loop [current-ns ns]
+      (when-let [parent (:class/parent tag)]
+        (loop [current-parent parent]
           (when (and
-                 current-ns
-                 (contains? (:block/type ns) "class")
-                 (not (contains? @*namespaces (:db/id ns))))
-            (swap! *namespaces conj current-ns)
-            (recur (:block/namespace current-ns))))))
-    @*namespaces))
+                 current-parent
+                 (contains? (:block/type parent) "class")
+                 (not (contains? @*classes (:db/id parent))))
+            (swap! *classes conj current-parent)
+            (recur (:class/parent current-parent))))))
+    @*classes))
 
 (defn get-block-classes-properties
   [eid]
@@ -550,8 +550,8 @@
         classes (->> (:block/tags block)
                      (sort-by :block/name)
                      (filter (fn [tag] (contains? (:block/type tag) "class"))))
-        namespace-parents (get-namespace-parents classes)
-        all-classes (->> (concat classes namespace-parents)
+        class-parents (get-class-parents classes)
+        all-classes (->> (concat classes class-parents)
                          (filter (fn [class]
                                    (seq (:properties (:block/schema class))))))
         all-properties (-> (mapcat (fn [class]

+ 5 - 5
src/test/frontend/db/db_based_model_test.cljs

@@ -63,7 +63,7 @@
       ;; set class2's parent to class1
         (let [class2 (db/entity [:block/name "class2"])]
           (db/transact! [{:db/id (:db/id class2)
-                          :block/namespace (:db/id class)}]))
+                          :class/parent (:db/id class)}]))
         (test-helper/save-block! repo sbid "Block 2" {:tags ["class2"]})
         (is (= (model/get-class-objects repo (:db/id class))
                [(:db/id (db/entity [:block/uuid fbid]))
@@ -99,7 +99,7 @@
     (is (false? (model/hidden-page? "$$$test")))
     (is (true? (model/hidden-page? (str "$$$" (random-uuid)))))))
 
-(deftest get-namespace-children-test
+(deftest get-class-children-test
   (let [opts {:redirect? false :create-first-block? false :class? true}
         _ (page-handler/create! "class1" opts)
         _ (page-handler/create! "class2" opts)
@@ -108,9 +108,9 @@
         class2 (db/entity [:block/name "class2"])
         class3 (db/entity [:block/name "class3"])
         _ (db/transact! [{:db/id (:db/id class2)
-                          :block/namespace (:db/id class1)}
+                          :class/parent (:db/id class1)}
                          {:db/id (:db/id class3)
-                          :block/namespace (:db/id class2)}])]
+                          :class/parent (:db/id class2)}])]
     (is
-     (= (model/get-namespace-children repo (:db/id (db/entity [:block/name "class1"])))
+     (= (model/get-class-children repo (:db/id (db/entity [:block/name "class1"])))
         [(:db/id class2) (:db/id class3)]))))

+ 1 - 1
src/test/frontend/handler/db_based/property_test.cljs

@@ -214,7 +214,7 @@
       ;; set c2 as parent of c3
       (let [c3 (db/entity [:block/name "class3"])]
         (db/transact! [{:db/id (:db/id c3)
-                        :block/namespace (:db/id c2)}]))
+                        :class/parent (:db/id c2)}]))
       (db-property-handler/class-add-property! repo c2id "property-3")
       (db-property-handler/class-add-property! repo c2id "property-4")
       (is (= 3 (count (:classes-properties