Browse Source

enhance: allow users to store any metadata on nodes via :map

property and EDN or API property creation
Gabriel Horner 6 months ago
parent
commit
4075c0d509

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

@@ -334,7 +334,8 @@
    (concat
     [:map
      [:db/ident user-property-ident]
-     [:logseq.property/type (apply vector :enum db-property-type/user-built-in-property-types)]]
+     [:logseq.property/type (apply vector :enum (into db-property-type/user-allowed-internal-property-types
+                                                      db-property-type/user-built-in-property-types))]]
     property-common-schema-attrs
     property-attrs
     page-attrs

+ 7 - 0
deps/db/src/logseq/db/frontend/property/type.cljs

@@ -20,6 +20,13 @@
   "Valid property types for users in order they appear in the UI"
   [:default :number :date :datetime :checkbox :url :node])
 
+(def user-allowed-internal-property-types
+  "Internal property types that users are allowed to store. These aren't available in the UI
+   so these would normally be created via EDN or the API."
+  #{:map})
+
+(assert (set/subset? user-allowed-internal-property-types internal-built-in-property-types))
+
 (def closed-value-property-types
   "Valid property :type for closed values"
   #{:default :number :url})

+ 5 - 2
deps/db/test/logseq/db/sqlite/export_test.cljs

@@ -428,7 +428,8 @@
                       :user.property/node {:logseq.property/type :node
                                            :db/cardinality :db.cardinality/many
                                            :build/property-classes [:user.class/MyClass]}
-                      :user.property/p1 {:logseq.property/type :default}}
+                      :user.property/p1 {:logseq.property/type :default}
+                      :user.property/map {:logseq.property/type :map}}
          :classes {:user.class/MyClass {:build/class-properties [:user.property/p1]}}
          :pages-and-blocks
          [{:page {:block/title "page1"}
@@ -442,7 +443,9 @@
                      :build/properties {:user.property/node #{[:build/page {:block/title "page object"
                                                                             :build/tags [:user.class/MyClass]}]
                                                               [:block/uuid block-object-uuid]
-                                                              :logseq.class/Task}}}]}
+                                                              :logseq.class/Task}}}
+                    {:block/title "map block"
+                     :build/properties {:user.property/map {:foo :bar :num 2}}}]}
           {:page {:block/title "Blocks"}
            :blocks [{:block/title "myclass object"
                      :build/tags [:user.class/MyClass]