Browse Source

Rename :logseq.property/parent to :logseq.property.class/extends

Tienson Qin 5 months ago
parent
commit
61d5aa3605
29 changed files with 125 additions and 116 deletions
  1. 8 8
      deps/db/src/logseq/db/frontend/class.cljs
  2. 2 2
      deps/db/src/logseq/db/frontend/db.cljs
  3. 11 10
      deps/db/src/logseq/db/frontend/property.cljs
  4. 9 2
      deps/db/src/logseq/db/frontend/rules.cljc
  5. 1 1
      deps/db/src/logseq/db/sqlite/build.cljs
  6. 2 2
      deps/db/src/logseq/db/sqlite/create_graph.cljs
  7. 9 9
      deps/db/src/logseq/db/sqlite/export.cljs
  8. 2 2
      deps/db/src/logseq/db/sqlite/util.cljs
  9. 2 2
      deps/db/test/logseq/db/sqlite/create_graph_test.cljs
  10. 2 2
      deps/db/test/logseq/db_test.cljs
  11. 9 9
      deps/graph-parser/src/logseq/graph_parser/exporter.cljs
  12. 4 4
      deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs
  13. 4 4
      deps/outliner/src/logseq/outliner/property.cljs
  14. 8 8
      deps/outliner/src/logseq/outliner/validate.cljs
  15. 1 1
      deps/outliner/test/logseq/outliner/validate_test.cljs
  16. 4 4
      scripts/src/logseq/tasks/db_graph/create_graph_with_schema_org.cljs
  17. 1 1
      src/main/frontend/components/cmdk/core.cljs
  18. 1 1
      src/main/frontend/components/container.cljs
  19. 2 1
      src/main/frontend/components/editor.cljs
  20. 1 1
      src/main/frontend/components/property.cljs
  21. 8 8
      src/main/frontend/components/property/config.cljs
  22. 12 12
      src/main/frontend/components/property/value.cljs
  23. 2 2
      src/main/frontend/worker/db/migrate.cljs
  24. 1 1
      src/main/frontend/worker/handler/page.cljs
  25. 4 4
      src/main/frontend/worker/handler/page/db_based/page.cljs
  26. 0 0
      src/rtc_e2e_test/example.cljs
  27. 3 3
      src/test/frontend/db/db_based_model_test.cljs
  28. 2 2
      src/test/frontend/worker/handler/page/db_based/page_test.cljs
  29. 10 10
      src/test/frontend/worker/rtc/gen_client_op_test.cljs

+ 8 - 8
deps/db/src/logseq/db/frontend/class.cljs

@@ -26,12 +26,12 @@
 
      :logseq.class/Journal
      {:title "Journal"
-      :properties {:logseq.property/parent :logseq.class/Page
+      :properties {:logseq.property.class/extends :logseq.class/Page
                    :logseq.property.journal/title-format "MMM do, yyyy"}}
 
      :logseq.class/Whiteboard
      {:title "Whiteboard"
-      :properties {:logseq.property/parent :logseq.class/Page}}
+      :properties {:logseq.property.class/extends :logseq.class/Page}}
 
      :logseq.class/Task
      {:title "Task"
@@ -49,7 +49,7 @@
      :logseq.class/Cards
      {:title "Cards"
       :properties {:logseq.property/icon {:type :tabler-icon :id "search"}
-                   :logseq.property/parent :logseq.class/Query}}
+                   :logseq.property.class/extends :logseq.class/Query}}
 
      :logseq.class/Asset
      {:title "Asset"
@@ -94,7 +94,7 @@
   "Children of :logseq.class/Page"
   (set
    (keep (fn [[class-ident m]]
-           (when (= (get-in m [:properties :logseq.property/parent]) :logseq.class/Page) class-ident))
+           (when (= (get-in m [:properties :logseq.property.class/extends]) :logseq.class/Page) class-ident))
          built-in-classes)))
 
 (def page-classes
@@ -120,13 +120,13 @@
 (defn get-structured-children
   [db eid]
   (->>
-   (d/q '[:find [?children ...]
-          :in $ ?parent %
+   (d/q '[:find [?c ...]
+          :in $ ?class-extends %
           :where
-          (parent ?parent ?children)]
+          (class-extends ?p ?c)]
         db
         eid
-        (:parent rules/rules))
+        (:class-extends rules/rules))
    (remove #{eid})))
 
 ;; Helper fns

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

@@ -50,14 +50,14 @@
 
 (defn get-page-parents
   [node & {:keys [node-class?]}]
-  (when-let [parent (:logseq.property/parent node)]
+  (when-let [parent (:logseq.property.class/extends node)]
     (loop [current-parent parent
            parents' []]
       (if (and
            current-parent
            (if node-class? (entity-util/class? current-parent) true)
            (not (contains? parents' current-parent)))
-        (recur (:logseq.property/parent current-parent)
+        (recur (:logseq.property.class/extends current-parent)
                (conj parents' current-parent))
         (vec (reverse parents'))))))
 

+ 11 - 10
deps/db/src/logseq/db/frontend/property.cljs

@@ -6,8 +6,8 @@
             [flatland.ordered.map :refer [ordered-map]]
             [logseq.common.defkeywords :refer [defkeywords]]
             [logseq.common.uuid :as common-uuid]
-            [logseq.db.frontend.property.type :as db-property-type]
-            [logseq.db.frontend.db-ident :as db-ident]))
+            [logseq.db.frontend.db-ident :as db-ident]
+            [logseq.db.frontend.property.type :as db-property-type]))
 
 ;; Main property vars
 ;; ==================
@@ -148,13 +148,6 @@
                                           :hide? true
                                           :view-context :block}
                                  :queryable? true}
-     :logseq.property/parent {:title "Parent"
-                              :schema {:type :node
-                                       :public? true
-                                       :view-context :page}
-                              :queryable? true
-                              :properties
-                              {:logseq.property/description "Provides parent-child relationships between nodes. For tags this enables inheritance and for pages this enables namespaces."}}
      :logseq.property/default-value {:title "Default value"
                                      :schema {:type :entity
                                               :public? false
@@ -165,6 +158,14 @@
                                                      :public? false
                                                      :hide? true
                                                      :view-context :property}}
+     ;; TODO: support cardinality many for extends
+     :logseq.property.class/extends {:title "Extends"
+                                     :schema {:type :class
+                                              :public? true
+                                              :view-context :class}
+                                     :queryable? true
+                                     :properties
+                                     {:logseq.property/description "This enables tags to inherit properties from other tags"}}
      :logseq.property.class/properties {:title "Tag Properties"
                                         :schema {:type :property
                                                  :cardinality :many
@@ -732,4 +733,4 @@
   "Given a built-in's db-ident, determine if its property value is a ref"
   [db-ident]
   (contains? db-property-type/value-ref-property-types
-             (get-in built-in-properties [db-ident :schema :type])))
+             (get-in built-in-properties [db-ident :schema :type])))

+ 9 - 2
deps/db/src/logseq/db/frontend/rules.cljc

@@ -8,11 +8,18 @@
   ;; rule "parent" is optimized for parent node -> child node nesting queries
   {:parent
    '[[(parent ?p ?c)
-      [?c :logseq.property/parent ?p]]
+      [?c :block/parent ?p]]
      [(parent ?p ?c)
-      [?t :logseq.property/parent ?p]
+      [?t :block/parent ?p]
       (parent ?t ?c)]]
 
+   :class-extends
+   '[[(class-extends ?p ?c)
+      [?c :logseq.property.class/extends ?p]]
+     [(class-extends ?p ?c)
+      [?t :logseq.property.class/extends ?p]
+      (class-extends ?t ?c)]]
+
    :alias
    '[[(alias ?e2 ?e1)
       [?e2 :block/alias ?e1]]

+ 1 - 1
deps/db/src/logseq/db/sqlite/build.cljs

@@ -281,7 +281,7 @@
                                (->block-properties (merge props (db-property-build/build-properties-with-ref-values pvalue-tx-m))
                                                    uuid-maps all-idents options))
                              (when class-parent
-                               {:logseq.property/parent
+                               {:logseq.property.class/extends
                                 (or (class-db-ids class-parent)
                                     (if (db-malli-schema/class? class-parent)
                                       class-parent

+ 2 - 2
deps/db/src/logseq/db/sqlite/create_graph.cljs

@@ -128,7 +128,7 @@
      :properties (filter entity-util/property? properties-tx)}))
 
 (def built-in-pages-names
-  #{"Contents"})
+  #{"Contents" "Library"})
 
 (defn- validate-tx-for-duplicate-idents [tx]
   (when-let [conflicting-idents
@@ -226,7 +226,7 @@
                            (map mark-block-as-built-in))
         hidden-pages (concat (build-initial-views) (build-favorites-page))
         ;; These classes bootstrap our tags and properties as they depend on each other e.g.
-        ;; Root <-> Tag, classes-tx depends on logseq.property/parent, properties-tx depends on Property
+        ;; Root <-> Tag, classes-tx depends on logseq.property.class/extends, properties-tx depends on Property
         bootstrap-class? (fn [c] (contains? #{:logseq.class/Root :logseq.class/Property :logseq.class/Tag :logseq.class/Template} (:db/ident c)))
         bootstrap-classes (filter bootstrap-class? default-classes)
         bootstrap-class-ids (map #(select-keys % [:db/ident :block/uuid]) bootstrap-classes)

+ 9 - 9
deps/db/src/logseq/db/sqlite/export.cljs

@@ -7,16 +7,16 @@
             [datascript.core :as d]
             [datascript.impl.entity :as de]
             [logseq.db :as ldb]
+            [logseq.db.common.entity-plus :as entity-plus]
             [logseq.db.frontend.class :as db-class]
             [logseq.db.frontend.content :as db-content]
             [logseq.db.frontend.db :as db-db]
-            [logseq.db.common.entity-plus :as entity-plus]
             [logseq.db.frontend.entity-util :as entity-util]
             [logseq.db.frontend.property :as db-property]
-            [logseq.db.sqlite.build :as sqlite-build]
-            [medley.core :as medley]
             [logseq.db.frontend.property.type :as db-property-type]
-            [logseq.db.frontend.schema :as db-schema]))
+            [logseq.db.frontend.schema :as db-schema]
+            [logseq.db.sqlite.build :as sqlite-build]
+            [medley.core :as medley]))
 
 ;; Export fns
 ;; ==========
@@ -166,7 +166,7 @@
            (map (fn [[ent build-property]]
                   (let [ent-properties (apply dissoc (db-property/properties ent)
                                               ;; For overlapping class properties, these would be built in :classes
-                                              :logseq.property/parent :logseq.property.class/properties
+                                              :logseq.property.class/extends :logseq.property.class/properties
                                               (into db-property/schema-properties db-property/public-db-attribute-properties))]
                     [(:db/ident ent)
                      (cond-> build-property
@@ -191,10 +191,10 @@
     (assoc :block/alias (set (map #(vector :block/uuid (:block/uuid %)) (:block/alias class-ent))))
     ;; It's caller's responsibility to ensure parent is included in final export
     (and (not shallow-copy?)
-         (:logseq.property/parent class-ent)
-         (not= :logseq.class/Root (:db/ident (:logseq.property/parent class-ent))))
+         (:logseq.property.class/extends class-ent)
+         (not= :logseq.class/Root (:db/ident (:logseq.property.class/extends class-ent))))
     (assoc :build/class-parent
-           (:db/ident (:logseq.property/parent class-ent)))))
+           (:db/ident (:logseq.property.class/extends class-ent)))))
 
 (defn- build-node-classes
   [db build-block block-tags properties]
@@ -588,7 +588,7 @@
         classes
         (->> class-ents
              (map (fn [ent]
-                    (let [ent-properties (apply dissoc (db-property/properties ent) :logseq.property/parent db-property/public-db-attribute-properties)]
+                    (let [ent-properties (apply dissoc (db-property/properties ent) :logseq.property.class/extends db-property/public-db-attribute-properties)]
                       (vector (:db/ident ent)
                               (cond-> (build-export-class ent options)
                                 (seq ent-properties)

+ 2 - 2
deps/db/src/logseq/db/sqlite/util.cljs

@@ -99,8 +99,8 @@
    (cond-> (merge block
                   {:block/tags (set (conj (:block/tags block) :logseq.class/Tag))})
      (and (not= (:db/ident block) :logseq.class/Root)
-          (nil? (:logseq.property/parent block)))
-     (assoc :logseq.property/parent :logseq.class/Root))))
+          (nil? (:logseq.property.class/extends block)))
+     (assoc :logseq.property.class/extends :logseq.class/Root))))
 
 (defn build-new-page
   "Builds a basic page to be transacted. A minimal version of gp-block/page-name->map"

+ 2 - 2
deps/db/test/logseq/db/sqlite/create_graph_test.cljs

@@ -84,9 +84,9 @@
     (is (= (count (dissoc db-class/built-in-classes :logseq.class/Root))
            (count (->> (d/datoms @conn :avet :block/tags :logseq.class/Tag)
                        (map #(d/entity @conn (:e %)))
-                       (mapcat :logseq.property/_parent)
+                       (mapcat :logseq.property.class/_extends)
                        set)))
-        "Reverse lookup of :logseq.property/parent correctly fetches number of child classes")))
+        "Reverse lookup of :logseq.property.class/extends correctly fetches number of child classes")))
 
 (deftest new-graph-initializes-default-properties-correctly
   (let [conn (db-test/create-conn)]

+ 2 - 2
deps/db/test/logseq/db_test.cljs

@@ -37,12 +37,12 @@
     :block/title "y"
     :block/name "y"
     :block/uuid #uuid "7008db08-ba0c-4aa9-afc6-7e4783e40a99"
-    :logseq.property/parent [:block/uuid #uuid "6c353967-f79b-4785-b804-a39b81d72461"]}
+    :logseq.property.class/extends [:block/uuid #uuid "6c353967-f79b-4785-b804-a39b81d72461"]}
    {:block/tags :logseq.class/Tag
     :block/title "z"
     :block/name "z"
     :block/uuid #uuid "d95f2912-a7af-41b9-8ed5-28861f7fc0be"
-    :logseq.property/parent [:block/uuid #uuid "7008db08-ba0c-4aa9-afc6-7e4783e40a99"]}])
+    :logseq.property.class/extends [:block/uuid #uuid "7008db08-ba0c-4aa9-afc6-7e4783e40a99"]}])
 
 (deftest get-page-parents
   (let [conn (db-test/create-conn)]

+ 9 - 9
deps/graph-parser/src/logseq/graph_parser/exporter.cljs

@@ -17,6 +17,7 @@
             [logseq.common.uuid :as common-uuid]
             [logseq.db :as ldb]
             [logseq.db.common.order :as db-order]
+            [logseq.db.common.property-util :as db-property-util]
             [logseq.db.frontend.class :as db-class]
             [logseq.db.frontend.content :as db-content]
             [logseq.db.frontend.db-ident :as db-ident]
@@ -29,8 +30,7 @@
             [logseq.graph-parser.block :as gp-block]
             [logseq.graph-parser.extract :as extract]
             [logseq.graph-parser.property :as gp-property]
-            [promesa.core :as p]
-            [logseq.db.common.property-util :as db-property-util]))
+            [promesa.core :as p]))
 
 (defn- add-missing-timestamps
   "Add updated-at or created-at timestamps if they doesn't exist"
@@ -62,7 +62,7 @@
 (defn- replace-namespace-with-parent [block page-names-to-uuids]
   (if (:block/namespace block)
     (-> (dissoc block :block/namespace)
-        (assoc :logseq.property/parent
+        (assoc :logseq.property.class/extends
                {:block/uuid (get-page-uuid page-names-to-uuids
                                            (get-in block [:block/namespace :block/name])
                                            {:block block :block/namespace (:block/namespace block)})}))
@@ -735,7 +735,7 @@
       (update :block dissoc :block/properties :block/properties-text-values :block/properties-order :block/invalid-properties)))
 
 (defn- handle-page-properties
-  "Adds page properties including special handling for :logseq.property/parent"
+  "Adds page properties including special handling for :logseq.property.class/extends"
   [{:block/keys [properties] :as block*} db {:keys [page-names-to-uuids classes-tx]} refs
    {:keys [user-options log-fn import-state] :as options}]
   (let [{:keys [block properties-tx]} (handle-page-and-block-properties block* db page-names-to-uuids refs options)
@@ -748,7 +748,7 @@
                 class-m (find-or-create-class db ((some-fn ::original-title :block/title) block) (:all-idents import-state) block)
                 class-m' (-> block
                              (merge class-m)
-                             (assoc :logseq.property/parent
+                             (assoc :logseq.property.class/extends
                                     (let [new-class (first parent-classes-from-properties)
                                           class-m (find-or-create-class db new-class (:all-idents import-state))
                                           class-m' (merge class-m
@@ -921,9 +921,9 @@
   "Like ldb/get-page-parents but using all-existing-page-uuids"
   [node all-existing-page-uuids]
   (let [get-parent (fn get-parent [n]
-                     (when (:block/uuid (:logseq.property/parent n))
-                       (or (get all-existing-page-uuids (:block/uuid (:logseq.property/parent n)))
-                           (throw (ex-info (str "No parent page found for " (pr-str (:block/uuid (:logseq.property/parent n))))
+                     (when (:block/uuid (:logseq.property.class/extends n))
+                       (or (get all-existing-page-uuids (:block/uuid (:logseq.property.class/extends n)))
+                           (throw (ex-info (str "No parent page found for " (pr-str (:block/uuid (:logseq.property.class/extends n))))
                                            {:node n})))))]
     (when-let [parent (get-parent node)]
       (loop [current-parent parent
@@ -959,7 +959,7 @@
   (let [;; These attributes are not allowed to be transacted because they must not change across files
         disallowed-attributes [:block/name :block/uuid :block/format :block/title :block/journal-day
                                :block/created-at :block/updated-at]
-        allowed-attributes (into [:block/tags :block/alias :logseq.property/parent :db/ident]
+        allowed-attributes (into [:block/tags :block/alias :logseq.property.class/extends :db/ident]
                                  (keep #(when (db-malli-schema/user-property? (key %)) (key %))
                                        m))
         block-changes (select-keys m allowed-attributes)]

+ 4 - 4
deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs

@@ -9,8 +9,8 @@
             [logseq.common.graph :as common-graph]
             [logseq.common.util.date-time :as date-time-util]
             [logseq.db :as ldb]
-            [logseq.db.frontend.content :as db-content]
             [logseq.db.common.entity-plus :as entity-plus]
+            [logseq.db.frontend.content :as db-content]
             [logseq.db.frontend.malli-schema :as db-malli-schema]
             [logseq.db.frontend.rules :as rules]
             [logseq.db.frontend.validate :as db-validate]
@@ -326,7 +326,7 @@
              (:block/alias (db-test/readable-properties (db-test/find-page-by-title @conn "chat-gpt"))))
           "alias set correctly")
       (is (= ["y"]
-             (->> (d/q '[:find [?b ...] :where [?b :block/title "y"] [?b :logseq.property/parent]]
+             (->> (d/q '[:find [?b ...] :where [?b :block/title "y"] [?b :logseq.property.class/extends]]
                        @conn)
                   first
                   (d/entity @conn)
@@ -675,9 +675,9 @@
                 set))
         "All classes are correctly defined by :type")
 
-    (is (= "CreativeWork" (get-in (d/entity @conn :user.class/Movie) [:logseq.property/parent :block/title]))
+    (is (= "CreativeWork" (get-in (d/entity @conn :user.class/Movie) [:logseq.property.class/extends :block/title]))
         "Existing page correctly set as class parent")
-    (is (= "Thing" (get-in (d/entity @conn :user.class/CreativeWork) [:logseq.property/parent :block/title]))
+    (is (= "Thing" (get-in (d/entity @conn :user.class/CreativeWork) [:logseq.property.class/extends :block/title]))
         "New page correctly set as class parent")))
 
 (deftest-async export-files-with-property-pages-disabled

+ 4 - 4
deps/outliner/src/logseq/outliner/property.cljs

@@ -310,7 +310,7 @@
            _ (when (= property-id :block/tags)
                (outliner-validate/validate-tags-property @conn block-eids v))
            property (d/entity @conn property-id)
-           _ (when (= (:db/ident property) :logseq.property/parent)
+           _ (when (= (:db/ident property) :logseq.property.class/extends)
                (outliner-validate/validate-parent-property
                 (if (number? v) (d/entity @conn v) v)
                 (map #(d/entity @conn %) block-eids)))
@@ -355,9 +355,9 @@
                        property-id :logseq.property/empty-placeholder}]
                      {:outliner-op :save-block})
 
-      (and (ldb/class? block) (= property-id :logseq.property/parent))
+      (and (ldb/class? block) (= property-id :logseq.property.class/extends))
       (ldb/transact! conn
-                     [[:db/add (:db/id block) :logseq.property/parent :logseq.class/Root]]
+                     [[:db/add (:db/id block) :logseq.property.class/extends :logseq.class/Root]]
                      {:outliner-op :save-block})
 
       (contains? db-property/db-attribute-properties property-id)
@@ -383,7 +383,7 @@
           db-attribute? (some? (db-schema/schema property-id))]
       (when (= property-id :block/tags)
         (outliner-validate/validate-tags-property @conn [block-eid] v))
-      (when (= property-id :logseq.property/parent)
+      (when (= property-id :logseq.property.class/extends)
         (outliner-validate/validate-parent-property v [block]))
       (cond
         db-attribute?

+ 8 - 8
deps/outliner/src/logseq/outliner/validate.cljs

@@ -50,11 +50,11 @@
                               :in $ ?eid ?type ?title
                               :where
                               [?b :block/title ?title]
-                              [?b :logseq.property/parent ?type]
+                              [?b :logseq.property.class/extends ?type]
                               [(not= ?b ?eid)]]
                             db
                             (:db/id entity)
-                            (:db/id (:logseq.property/parent entity))
+                            (:db/id (:logseq.property.class/extends entity))
                             new-title))]
     (throw (ex-info "Duplicate page by parent"
                     {:type :notification
@@ -80,7 +80,7 @@
                                     [?b :block/tags ?tag-id]
                                     [(missing? $ ?b :logseq.property/built-in?)]
                                     [(not= ?b ?eid)]]
-                                  (:logseq.property/parent entity)
+                                  (:logseq.property.class/extends entity)
                                   '[:find [?b ...]
                                     :in $ ?eid ?title [?tag-id ...]
                                     :where
@@ -88,8 +88,8 @@
                                     [?b :block/tags ?tag-id]
                                     [(not= ?b ?eid)]
                                     ;; same parent
-                                    [?b :logseq.property/parent ?bp]
-                                    [?eid :logseq.property/parent ?ep]
+                                    [?b :logseq.property.class/extends ?bp]
+                                    [?eid :logseq.property.class/extends ?ep]
                                     [(= ?bp ?ep)]]
                                   :else
                                   '[:find [?b ...]
@@ -116,13 +116,13 @@
                                                                 (map (fn [id] (str "#" (:block/title (d/entity db id)))) common-tag-ids)))
                                      :type :warning}})))))
 
-    (:logseq.property/parent entity)
+    (:logseq.property.class/extends entity)
     (validate-unique-by-parent-and-name db entity new-title)))
 
 (defn ^:api validate-unique-by-name-tag-and-block-type
   "Validates uniqueness of nodes for the following cases:
    - Page names are unique for a tag e.g. their can be Apple #Company and Apple #Fruit
-   - Page names are unique for a :logseq.property/parent"
+   - Page names are unique for a :logseq.property.class/extends"
   [db new-title entity]
   (when (entity-util/page? entity)
     (validate-unique-for-page db new-title entity)))
@@ -220,4 +220,4 @@
   "Validates deleting a property value from :block/tags for given blocks"
   [db block-eids v]
   (disallow-tagging-a-built-in-entity db block-eids {:delete? true})
-  (disallow-node-cant-tag-with-private-tags db block-eids v {:delete? true}))
+  (disallow-node-cant-tag-with-private-tags db block-eids v {:delete? true}))

+ 1 - 1
deps/outliner/test/logseq/outliner/validate_test.cljs

@@ -168,7 +168,7 @@
 
     (testing "Validate property relationships"
       (let [parent-child-pairs (d/q '[:find ?parent ?child
-                                      :where [?child :logseq.property/parent ?parent]] @conn)]
+                                      :where [?child :logseq.property.class/extends ?parent]] @conn)]
         (doseq [[parent-id child-id] parent-child-pairs]
           (let [parent (d/entity @conn parent-id)
                 child (d/entity @conn child-id)]

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

@@ -365,14 +365,14 @@
                      (d/q '[:find [(pull ?b [*
                                              {:logseq.property.class/properties [:block/title]}
                                              {:logseq.property/classes [:block/title]}
-                                             {:logseq.property/parent [:block/title]}
+                                             {:logseq.property.class/extends [:block/title]}
                                              {:block/tags [:block/title]}
                                              {:block/refs [:block/title]}]) ...]
                             :in $
                             :where [?b :db/ident ?ident]]
                           db))
         top-level-properties [:logseq.property/type :logseq.property.class/properties :logseq.property/classes
-                              :logseq.property/parent :block/tags]
+                              :logseq.property.class/extends :block/tags]
         debug-attributes (into [:block/name :block/title :db/cardinality :db/ident :block/refs]
                                top-level-properties)]
     (fs/writeFileSync "schema-org.edn"
@@ -389,8 +389,8 @@
                                                                                      v)))))
                                        (seq (:logseq.property.class/properties m))
                                        (update :logseq.property.class/properties #(set (map :block/title %)))
-                                       (some? (:logseq.property/parent m))
-                                       (update :logseq.property/parent :block/title)
+                                       (some? (:logseq.property.class/extends m))
+                                       (update :logseq.property.class/extends :block/title)
                                        (seq (:logseq.property/classes m))
                                        (update :logseq.property/classes #(set (map :block/title %)))
                                        (seq (:block/tags m))

+ 1 - 1
src/main/frontend/components/cmdk/core.cljs

@@ -115,7 +115,7 @@
                          (or (let [page (some-> (text/get-namespace-last-part input)
                                                 string/trim
                                                 db/get-page)
-                                   parent-title (:block/title (:logseq.property/parent page))
+                                   parent-title (:block/title (:block/parent page))
                                    namespace? (string/includes? input "/")]
                                (and page
                                     (or (not namespace?)

+ 1 - 1
src/main/frontend/components/container.cljs

@@ -155,7 +155,7 @@
         (block/inline-text :markdown (:block/title page))
         untitled? (t :untitled)
         :else (let [title' (pdf-utils/fix-local-asset-pagename title)
-                    parent (:logseq.property/parent page)]
+                    parent (:block/parent page)]
                 (if (and parent (not (ldb/class? page)))
                   (str (:block/title parent) ns-util/parent-char title')
                   title')))]

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

@@ -123,7 +123,8 @@
         (state/clear-editor-action!)
         (p/let [page (db/get-page chosen-item)
                 _ (when-not page (page-handler/<create! chosen-item {:redirect? false
-                                                                     :create-first-block? false}))
+                                                                     :create-first-block? false
+                                                                     :reference? true}))
                 page' (db/get-page chosen-item)
                 current-block (state/get-edit-block)]
           (editor-handler/api-insert-new-block! chosen-item

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

@@ -380,7 +380,7 @@
                                    (and (not page?) (contains? #{:block/alias} (:db/ident m)))
                                    ;; Filters out properties from being in wrong :view-context and :never view-contexts
                                    (and (not= view-context :all) (not (contains? block-types view-context)))
-                                   (and (ldb/built-in? block) (contains? #{:logseq.property/parent} (:db/ident m)))
+                                   (and (ldb/built-in? block) (contains? #{:logseq.property.class/extends} (:db/ident m)))
                                    ;; Filters out adding buggy class properties e.g. Alias and Parent
                                    (and class-schema? (ldb/public-built-in-property? m) (:logseq.property/view-context m)))))
         property (rum/react *property)

+ 8 - 8
src/main/frontend/components/property/config.cljs

@@ -602,16 +602,16 @@
                                   :title "Property type"
                                   :desc (if disabled?'
                                           (ui/tooltip
-                                            [:span (str property-type-label')]
-                                            [:div.w-96
-                                             "The type of this property is locked once you start using it. This is to make sure all your existing information stays correct if the property type is changed later. To unlock, all uses of a property must be deleted."])
+                                           [:span (str property-type-label')]
+                                           [:div.w-96
+                                            "The type of this property is locked once you start using it. This is to make sure all your existing information stays correct if the property type is changed later. To unlock, all uses of a property must be deleted."])
                                           (str property-type-label'))
                                   :disabled? disabled?'
                                   :submenu-content (fn [ops]
                                                      (property-type-sub-pane property ops))}))
 
      (when (and (= property-type :node)
-             (not (contains? #{:logseq.property/parent} (:db/ident property))))
+                (not (contains? #{:logseq.property.class/extends} (:db/ident property))))
        (dropdown-editor-menuitem {:icon :hash
                                   :disabled? disabled?
                                   :title "Specify node tags"
@@ -661,7 +661,7 @@
 
      (when (not= :logseq.property/enable-history? (:db/ident property))
        (let [property-type (:logseq.property/type property)
-             group' (->> [(when (and (not (contains? #{:logseq.property/parent :logseq.property.class/properties} (:db/ident property)))
+             group' (->> [(when (and (not (contains? #{:logseq.property.class/extends :logseq.property.class/properties} (:db/ident property)))
                                      (contains? #{:default :number :date :checkbox :node} property-type)
                                      (not
                                       (and (= :default property-type)
@@ -673,13 +673,13 @@
                                                          :disabled? config/publishing?
                                                          :submenu-content (fn [ops] (ui-position-sub-pane property (assoc ops :ui-position position)))})))
 
-                          (when (not (contains? #{:logseq.property/parent :logseq.property.class/properties} (:db/ident property)))
+                          (when (not (contains? #{:logseq.property.class/extends :logseq.property.class/properties} (:db/ident property)))
                             (dropdown-editor-menuitem {:icon :eye-off :title "Hide by default" :toggle-checked? (boolean (:logseq.property/hide? property))
                                                        :disabled? config/publishing?
                                                        :on-toggle-checked-change #(db-property-handler/set-block-property! (:db/id property)
                                                                                                                            :logseq.property/hide?
                                                                                                                            %)}))
-                          (when (not (contains? #{:logseq.property/parent :logseq.property.class/properties} (:db/ident property)))
+                          (when (not (contains? #{:logseq.property.class/extends :logseq.property.class/properties} (:db/ident property)))
                             (dropdown-editor-menuitem
                              {:icon :eye-off :title "Hide empty value"
                               :toggle-checked? (boolean (:logseq.property/hide-empty-value property))
@@ -727,7 +727,7 @@
                 (or class-schema?
                     (not (and
                           (ldb/class? owner-block)
-                          (contains? #{:logseq.property/parent} (:db/ident property))))))
+                          (contains? #{:logseq.property.class/extends} (:db/ident property))))))
        (dropdown-editor-menuitem
         {:id :delete-property :icon :x
          :title (if class-schema? "Delete property from tag" "Delete property from node")

+ 12 - 12
src/main/frontend/components/property/value.cljs

@@ -582,7 +582,7 @@
         page-entity (ldb/get-case-page (db/get-db) page)
         id (:db/id page-entity)
         class? (or (= :block/tags (:db/ident property))
-                   (and (= :logseq.property/parent (:db/ident property))
+                   (and (= :logseq.property.class/extends (:db/ident property))
                         (ldb/class? block)))
         ;; Note: property and other types shouldn't be converted to class
         page? (ldb/internal-page? page-entity)]
@@ -630,7 +630,7 @@
         items' (->>
                 (if (and (seq selected-choices)
                          (not multiple-choices?)
-                         (not (and (ldb/class? block) (= (:db/ident property) :logseq.property/parent)))
+                         (not (and (ldb/class? block) (= (:db/ident property) :logseq.property.class/extends)))
                          (not= (:db/ident property) :logseq.property.view/type))
                   (concat items
                           [{:value clear-value
@@ -685,14 +685,14 @@
                              (if (every? entity-map? v)
                                (map :db/id v)
                                [(:db/id v)])))
-        parent-property? (= (:db/ident property) :logseq.property/parent)
-        children-pages (when parent-property? (model/get-structured-children repo (:db/id block)))
+        extends-property? (= (:db/ident property) :logseq.property.class/extends)
+        children-pages (when extends-property? (model/get-structured-children repo (:db/id block)))
         property-type (:logseq.property/type property)
         get-all-classes-f (fn []
                             (model/get-all-classes repo {:except-root-class? true
                                                          :except-private-tags? (not (contains? #{:logseq.property/template-applied-to} (:db/ident property)))}))
         nodes (cond
-                parent-property?
+                extends-property?
                 (let [;; Disallows cyclic hierarchies
                       exclude-ids (-> (set (map (fn [id] (:block/uuid (db/entity id))) children-pages))
                                       (conj (:block/uuid block))) ; break cycle
@@ -787,7 +787,7 @@
                                               "Set alias"
                                               :else
                                               (str "Set " (:block/title property)))
-                 :show-new-when-not-exact-match? (if (or (and parent-property? (contains? (set children-pages) (:db/id block)))
+                 :show-new-when-not-exact-match? (if (or (and extends-property? (contains? (set children-pages) (:db/id block)))
                                                          ;; Don't allow creating private tags
                                                          (and (= :block/tags (:db/ident property))
                                                               (seq (set/intersection (set (map :db/ident classes'))
@@ -868,20 +868,20 @@
         non-root-classes (cond-> (remove (fn [c] (= (:db/ident c) :logseq.class/Root)) classes)
                            class?
                            (conj (frontend.db/entity :logseq.class/Tag)))
-        parent-property? (= (:db/ident property) :logseq.property/parent)]
+        extends-property? (= (:db/ident property) :logseq.property.class/extends)]
 
     ;; effect runs once
     (hooks/use-effect!
      (fn []
        (cond
-         (and parent-property? (not (ldb/class? block))
+         (and extends-property? (not (ldb/class? block))
               (ldb/internal-page? block))
          (p/let [result (db-async/<get-tag-pages repo (:db/id (db/entity :logseq.class/Page)))
                  result' (->> result
                               (remove ldb/built-in?))]
            (set-result-and-initial-choices! result'))
 
-         parent-property?
+         extends-property?
          nil
 
          (seq non-root-classes)
@@ -1491,15 +1491,15 @@
                          (multiple-values block property opts)
 
                          :else
-                         (let [parent? (= property-ident :logseq.property/parent)
+                         (let [extends? (= property-ident :logseq.property.class/extends)
                                value-cp (property-scalar-value block property v
                                                                (merge
                                                                 opts
                                                                 {:editor-id editor-id
                                                                  :dom-id dom-id}))
-                               page-ancestors (when parent?
+                               page-ancestors (when extends?
                                                 (let [ancestor-pages (loop [parents [block]]
-                                                                       (if-let [parent (:logseq.property/parent (last parents))]
+                                                                       (if-let [parent (:logseq.property.class/extends (last parents))]
                                                                          (when-not (contains? (set parents) parent)
                                                                            (recur (conj parents parent)))
                                                                          parents))]

+ 2 - 2
src/main/frontend/worker/db/migrate.cljs

@@ -358,7 +358,7 @@
               (fn [id]
                 (let [value (:db/id (:class/parent (d/entity db id)))]
                   [[:db/retract id :class/parent]
-                   [:db/add id :logseq.property/parent value]]))))))))
+                   [:db/add id :logseq.property.class/extends value]]))))))))
 
 (defn- deprecate-class-schema-properties
   [conn _search-db]
@@ -884,7 +884,7 @@
    [12 {:fix update-block-type-many->one}]
    [13 {:classes [:logseq.class/Journal]
         :properties [:logseq.property.journal/title-format]}]
-   [14 {:properties [:logseq.property/parent]
+   [14 {:properties [:logseq.property.class/extends]
         :fix deprecate-class-parent}]
    [15 {:properties [:logseq.property.class/properties]
         :fix deprecate-class-schema-properties}]

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

@@ -98,7 +98,7 @@
                                           (->> (filter (fn [p] (ldb/class? p)) (:logseq.property/_parent page))
                                                (map (fn [p]
                                                       {:db/id (:db/id p)
-                                                       :logseq.property/parent :logseq.class/Root}))))
+                                                       :logseq.property.class/extends :logseq.class/Root}))))
                 tx-data (concat truncate-blocks-tx-data
                                 restore-class-parent-tx
                                 delete-page-tx

+ 4 - 4
src/main/frontend/worker/handler/page/db_based/page.cljs

@@ -92,7 +92,7 @@
     '[:find [?b ...]
       :in $ ?parent-name ?child-name
       :where
-      [?b :logseq.property/parent ?p]
+      [?b :logseq.property.class/extends ?p]
       [?b :block/name ?child-name]
       [?p :block/name ?parent-name]]
     db
@@ -148,7 +148,7 @@
                 (if class?
                   (cond
                     (and (de/entity? page) (ldb/class? page))
-                    (assoc page :logseq.property/parent parent-eid)
+                    (assoc page :logseq.property.class/extends parent-eid)
 
                     (de/entity? page) ; page exists but not a class, avoid converting here because this could be troublesome.
                     nil
@@ -157,10 +157,10 @@
                     (db-class/build-new-class db page)
 
                     :else
-                    (db-class/build-new-class db (assoc page :logseq.property/parent parent-eid)))
+                    (db-class/build-new-class db (assoc page :logseq.property.class/extends parent-eid)))
                   (if (or (de/entity? page) (zero? idx))
                     page
-                    (assoc page :logseq.property/parent parent-eid)))))
+                    (assoc page :logseq.property.class/extends parent-eid)))))
             pages)))
        [page])
      (remove nil?))))

File diff suppressed because it is too large
+ 0 - 0
src/rtc_e2e_test/example.cljs


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

@@ -48,7 +48,7 @@
       ;; set class2's parent to class1
       (let [class2 (db/get-case-page "class2")]
         (db/transact! [{:db/id (:db/id class2)
-                        :logseq.property/parent (:db/id class)}]))
+                        :logseq.property.class/extends (:db/id class)}]))
       (test-helper/save-block! repo sbid "Block 2" {:tags ["class2"]})
       (is (= (map :db/id (model/get-class-objects repo (:db/id class)))
              [(:db/id (db/entity [:block/uuid fbid]))
@@ -82,9 +82,9 @@
         class2 (db/get-case-page "class2")
         class3 (db/get-case-page "class3")
         _ (db/transact! [{:db/id (:db/id class2)
-                          :logseq.property/parent (:db/id class1)}
+                          :logseq.property.class/extends (:db/id class1)}
                          {:db/id (:db/id class3)
-                          :logseq.property/parent (:db/id class2)}])]
+                          :logseq.property.class/extends (:db/id class2)}])]
     (is
      (= (model/get-structured-children repo (:db/id (db/get-case-page "class1")))
         [(:db/id class2) (:db/id class3)]))))

+ 2 - 2
src/test/frontend/worker/handler/page/db_based/page_test.cljs

@@ -52,8 +52,8 @@
       (let [_ (worker-db-page/create! conn "vim/keys" {:split-namespace? true})
             _ (worker-db-page/create! conn "emacs/keys" {:split-namespace? true})]
         (is (= #{"vim" "emacs"}
-               (->> (d/q '[:find [(pull ?b [{:logseq.property/parent [:block/title]}]) ...] :where [?b :block/title "keys"]] @conn)
-                    (map #(get-in % [:logseq.property/parent :block/title]))
+               (->> (d/q '[:find [(pull ?b [{:logseq.property.class/extends [:block/title]}]) ...] :where [?b :block/title "keys"]] @conn)
+                    (map #(get-in % [:logseq.property.class/extends :block/title]))
                     set))
             "Two child pages with same name exist and have different parents")))
 

+ 10 - 10
src/test/frontend/worker/rtc/gen_client_op_test.cljs

@@ -89,7 +89,7 @@
     (let [conn (db-test/create-conn)
           tx-data [[:db/add 1000000 :block/uuid #uuid "66856a29-6eb3-4122-af97-8580a853c6a6" 536870954]
                    [:db/add 1000000 :block/updated-at 1720019497643 536870954]
-                   [:db/add 1000000 :logseq.property/parent :logseq.class/Root 536870954]
+                   [:db/add 1000000 :logseq.property.class/extends :logseq.class/Root 536870954]
                    [:db/add 1000000 :block/created-at 1720019497643 536870954]
                    [:db/add 1000000 :db/ident :user.class/zzz 536870954]
                    [:db/add 1000000 :block/tags :logseq.class/Tag 536870954]
@@ -109,7 +109,7 @@
                         [:block/created-at "[\"~#'\",1720019497643]"]
                         [:block/tags #uuid "00000002-5389-0208-3000-000000000000"]
                         [:block/title "[\"~#'\",\"zzz\"]"]
-                        [:logseq.property/parent #uuid "00000002-2737-8382-7000-000000000000"]
+                        [:logseq.property.class/extends #uuid "00000002-2737-8382-7000-000000000000"]
                        ;;1. shouldn't have :db/ident, :db/ident is special, will be handled later
                         ])}]]
            (map (fn [[op-type _t op-value]]
@@ -168,10 +168,10 @@
                         :block/tags :block/title :db/cardinality}]
     #_{:clj-kondo/ignore [:unresolved-symbol :invalid-arity]}
     (is (->> (me/find (subject/generate-rtc-ops-from-property-entities [ent])
-               ([:move _ {:block-uuid ?block-uuid}]
-                [:update-page _ {:block-uuid ?block-uuid}]
-                [:update _ {:block-uuid ?block-uuid :av-coll ([!av-coll-attrs . _ ...] ...)}])
-               !av-coll-attrs)
+                      ([:move _ {:block-uuid ?block-uuid}]
+                       [:update-page _ {:block-uuid ?block-uuid}]
+                       [:update _ {:block-uuid ?block-uuid :av-coll ([!av-coll-attrs . _ ...] ...)}])
+                      !av-coll-attrs)
              set
              (set/difference av-coll-attrs)
              empty?))))
@@ -180,13 +180,13 @@
   (let [repo (state/get-current-repo)
         db (conn/get-db repo true)
         ent (d/entity db :logseq.class/Template)
-        av-coll-attrs #{:logseq.property.class/properties :logseq.property/built-in? :logseq.property/parent
+        av-coll-attrs #{:logseq.property.class/properties :logseq.property/built-in? :logseq.property.class/extends
                         :block/tags :block/title}]
     #_{:clj-kondo/ignore [:unresolved-symbol :invalid-arity]}
     (is (->> (me/find (subject/generate-rtc-ops-from-class-entities [ent])
-               ([:update-page _ {:block-uuid ?block-uuid}]
-                [:update _ {:block-uuid ?block-uuid :av-coll ([!av-coll-attrs . _ ...] ...)}])
-               !av-coll-attrs)
+                      ([:update-page _ {:block-uuid ?block-uuid}]
+                       [:update _ {:block-uuid ?block-uuid :av-coll ([!av-coll-attrs . _ ...] ...)}])
+                      !av-coll-attrs)
              set
              (set/difference av-coll-attrs)
              empty?))))

Some files were not shown because too many files changed in this diff