فهرست منبع

enhance: limit part of db attributes to be queryable

1. add title for all built-in properties
2. hide all built-in properties including public ones in the query builder
3. hide private built-in properties in mod+p
Tienson Qin 11 ماه پیش
والد
کامیت
3851367229
3فایلهای تغییر یافته به همراه126 افزوده شده و 67 حذف شده
  1. 79 40
      deps/db/src/logseq/db/frontend/property.cljs
  2. 26 11
      src/main/frontend/components/query/builder.cljs
  3. 21 16
      src/main/frontend/db/async.cljs

+ 79 - 40
deps/db/src/logseq/db/frontend/property.cljs

@@ -24,6 +24,7 @@
    * :name - Property's :block/name as a keyword. If none given, one is derived from the db/ident
    * :attribute - Property keyword that is saved to a datascript attribute outside of :block/properties
    * :closed-values - Vec of closed-value maps for properties with choices. Map
+   * :queryable? - Whether property can be queried in the query builder
      has keys :value, :db-ident, :uuid and :icon"
   (ordered-map
    :block/alias           {:title "Alias"
@@ -31,13 +32,15 @@
                            :schema {:type :page
                                     :cardinality :many
                                     :view-context :page
-                                    :public? true}}
+                                    :public? true}
+                           :queryable? true}
    :block/tags           {:title "Tags"
                           :attribute :block/tags
                           :schema {:type :class
                                    :cardinality :many
                                    :public? true
-                                   :classes #{:logseq.class/Root}}}
+                                   :classes #{:logseq.class/Root}}
+                          :queryable? true}
    :kv/value             {:title "KV value"
                           :attribute :kv/value
                           :schema {:type :any
@@ -47,7 +50,8 @@
                           :attribute :block/type
                           :schema {:type :string
                                    :public? false
-                                   :hide? true}}
+                                   :hide? true}
+                          :queryable? true}
    :block/schema         {:title "Node schema"
                           :attribute :block/schema
                           :schema {:type :map
@@ -72,19 +76,22 @@
                           :attribute :block/page
                           :schema {:type :entity
                                    :public? false
-                                   :hide? true}}
+                                   :hide? true}
+                          :queryable? true}
    :block/refs           {:title "Node references"
                           :attribute :block/refs
                           :schema {:type :entity
                                    :cardinality :many
                                    :public? false
-                                   :hide? true}}
+                                   :hide? true}
+                          :queryable? true}
    :block/path-refs      {:title "Node path references"
                           :attribute :block/path-refs
                           :schema {:type :entity
                                    :cardinality :many
                                    :public? false
-                                   :hide? true}}
+                                   :hide? true}
+                          :queryable? true}
    :block/link           {:title "Node links to"
                           :attribute :block/link
                           :schema {:type :entity
@@ -94,7 +101,8 @@
                           :attribute :block/title
                           :schema {:type :string
                                    :public? false
-                                   :hide? true}}
+                                   :hide? true}
+                          :queryable? true}
    :block/closed-value-property  {:title "Closed value property"
                                   :attribute :block/closed-value-property
                                   :schema {:type :entity
@@ -126,16 +134,19 @@
                                        :schema {:type :keyword
                                                 :public? false
                                                 :hide? true
-                                                :view-context :block}}
+                                                :view-context :block}
+                                       :queryable? true}
    :logseq.property.code/lang {:title "Code mode"
                                :schema {:type :string
                                         :public? false
                                         :hide? true
-                                        :view-context :block}}
+                                        :view-context :block}
+                               :queryable? true}
    :logseq.property/parent {:title "Parent"
                             :schema {:type :node
                                      :public? true
-                                     :view-context :page}}
+                                     :view-context :page}
+                            :queryable? true}
    ;; :logseq.property/default-value {:title "Default value"
    ;;                                 :schema {:type :any
    ;;                                          :public? true
@@ -163,27 +174,35 @@
                                         :public? true
                                         :view-context :page
                                         :cardinality :many}}
-   :logseq.property/background-color {:schema {:type :default :hide? true}}
-   :logseq.property/background-image {:schema
-                                      {:type :default
-                                       :view-context :block
-                                       :public? true}}
+   :logseq.property/background-color {:title "Background color"
+                                      :schema {:type :default :hide? true}}
+   :logseq.property/background-image {:title "Background image"
+                                      :schema
+                                      {:type :default ; FIXME: asset
+                                       :view-context :block}}
    ;; number (1-6) or boolean for auto heading
-   :logseq.property/heading {:schema {:type :any :hide? true}}
-   :logseq.property/created-from-property {:schema {:type :entity
+   :logseq.property/heading {:title "Heading"
+                             :schema {:type :any :hide? true}
+                             :queryable? true}
+   :logseq.property/created-from-property {:title "Created from property"
+                                           :schema {:type :entity
                                                     :hide? true}}
-   :logseq.property/built-in?             {:schema {:type :checkbox
+   :logseq.property/built-in?             {:title "Built in?"
+                                           :schema {:type :checkbox
                                                     :hide? true}}
    :logseq.property/asset   {:title "Asset"
                              :schema {:type :entity
                                       :hide? true}}
    ;; used by pdf and whiteboard
+   ;; TODO: remove ls-type
    :logseq.property/ls-type {:schema {:type :keyword
                                       :hide? true}}
 
-   :logseq.property.pdf/hl-type {:schema {:type :keyword :hide? true}}
+   :logseq.property.pdf/hl-type {:title "Annotation type"
+                                 :schema {:type :keyword :hide? true}}
    :logseq.property.pdf/hl-color
-   {:schema {:type :default}
+   {:title "Annotation color"
+    :schema {:type :default}
     :closed-values
     (mapv (fn [[db-ident value]]
             {:db-ident db-ident
@@ -194,18 +213,24 @@
            [:logseq.property/color.green "green"]
            [:logseq.property/color.blue "blue"]
            [:logseq.property/color.purple "purple"]])}
-   :logseq.property.pdf/hl-page {:schema {:type :raw-number}}
-   :logseq.property.pdf/hl-image {:schema {:type :entity :hide? true}}
-   :logseq.property.pdf/hl-value {:schema {:type :map :hide? true}}
+   :logseq.property.pdf/hl-page {:title "Annotation page"
+                                 :schema {:type :raw-number}}
+   :logseq.property.pdf/hl-image {:title "Annotation image"
+                                  :schema {:type :entity :hide? true}}
+   :logseq.property.pdf/hl-value {:title "Annotation data"
+                                  :schema {:type :map :hide? true}}
    ;; FIXME: :logseq.property/order-list-type should updated to closed values
-   :logseq.property/order-list-type {:name :logseq.order-list-type
+   :logseq.property/order-list-type {:title "List type"
+                                     :name :logseq.order-list-type
                                      :schema {:type :default
                                               :hide? true}}
-   :logseq.property.linked-references/includes {:schema {; could be :entity to support blocks(objects) in the future
+   :logseq.property.linked-references/includes {:title "Included references"
+                                                :schema {; could be :entity to support blocks(objects) in the future
                                                          :type :node
                                                          :cardinality :many
                                                          :hide? true}}
-   :logseq.property.linked-references/excludes {:schema {:type :node
+   :logseq.property.linked-references/excludes {:title "Excluded references"
+                                                :schema {:type :node
                                                          :cardinality :many
                                                          :hide? true}}
    :logseq.property.tldraw/page {:name :logseq.tldraw.page
@@ -271,24 +296,28 @@
            [:logseq.task/status.in-review "In Review" "InReview"]
            [:logseq.task/status.done "Done" "Done"]
            [:logseq.task/status.canceled "Canceled" "Cancelled"]])
-    :properties {:logseq.property/hide-empty-value true}}
+    :properties {:logseq.property/hide-empty-value true}
+    :queryable? true}
    :logseq.task/deadline
    {:title "Deadline"
     :schema {:type :date
              :public? true
              :position :block-below}
-    :properties {:logseq.property/hide-empty-value true}}
+    :properties {:logseq.property/hide-empty-value true}
+    :queryable? true}
 
    ;; TODO: Add more props :Assignee, :Estimate, :Cycle, :Project
 
    :logseq.property/icon {:title "Icon"
                           :schema {:type :map}}
-   :logseq.property/public {:schema
+   :logseq.property/public {:title "Public?"
+                            :schema
                             {:type :checkbox
                              :hide? true
                              :view-context :page
                              :public? true}}
-   :logseq.property/exclude-from-graph-view {:schema
+   :logseq.property/exclude-from-graph-view {:title "Excluded from Graph view?"
+                                             :schema
                                              {:type :checkbox
                                               :hide? true
                                               :view-context :page
@@ -311,46 +340,55 @@
              :uuid (common-uuid/gen-uuid :db-ident-block-uuid db-ident)})
           [[:logseq.property.view/type.table "Table View"]
            [:logseq.property.view/type.list "List View"]
-           [:logseq.property.view/type.gallery "Gallery View"]])}
+           [:logseq.property.view/type.gallery "Gallery View"]])
+    :queryable? true}
 
-   :logseq.property.table/sorting {:schema
+   :logseq.property.table/sorting {:title "View sorting"
+                                   :schema
                                    {:type :coll
                                     :hide? true
                                     :public? false}}
 
-   :logseq.property.table/filters {:schema
+   :logseq.property.table/filters {:title "View filters"
+                                   :schema
                                    {:type :coll
                                     :hide? true
                                     :public? false}}
 
-   :logseq.property.table/hidden-columns {:schema
+   :logseq.property.table/hidden-columns {:title "View hidden columns"
+                                          :schema
                                           {:type :keyword
                                            :cardinality :many
                                            :hide? true
                                            :public? false}}
 
-   :logseq.property.table/ordered-columns {:schema
+   :logseq.property.table/ordered-columns {:title "View ordered columns"
+                                           :schema
                                            {:type :coll
                                             :hide? true
                                             :public? false}}
 
-   :logseq.property.table/sized-columns {:schema
+   :logseq.property.table/sized-columns {:title "View columns settings"
+                                         :schema
                                          {:type :map
                                           :hide? true
                                           :public? false}}
 
-   :logseq.property/view-for {:schema
+   :logseq.property/view-for {:title "This view belongs to"
+                              :schema
                               {:type :node
                                :hide? true
                                :public? false}}
    :logseq.property.asset/type {:title "File type"
                                 :schema {:type :string
                                          :hide? true
-                                         :public? false}}
+                                         :public? false}
+                                :queryable? true}
    :logseq.property.asset/size {:title "File size"
                                 :schema {:type :raw-number
                                          :hide? true
-                                         :public? false}}
+                                         :public? false}
+                                :queryable? true}
    :logseq.property.asset/checksum {:title "File checksum"
                                     :schema {:type :string
                                              :hide? true
@@ -359,7 +397,8 @@
                                            :schema {:type :raw-number
                                                     :hide? true
                                                     :public? false}}
-   :logseq.property.asset/remote-metadata {:schema
+   :logseq.property.asset/remote-metadata {:title "File remote metadata"
+                                           :schema
                                            {:type :map
                                             :hide? true
                                             :public? false}}

+ 26 - 11
src/main/frontend/components/query/builder.cljs

@@ -23,7 +23,8 @@
             [logseq.db.frontend.property :as db-property]
             [logseq.db.frontend.property.type :as db-property-type]
             [logseq.db.sqlite.util :as sqlite-util]
-            [frontend.db-mixins :as db-mixins]))
+            [frontend.db-mixins :as db-mixins]
+            [logseq.db :as ldb]))
 
 (rum/defc page-block-selector
   [*find]
@@ -140,20 +141,34 @@
 
 (rum/defc property-select
   [*mode *property]
-  (let [[properties set-properties!] (rum/use-state nil)]
+  (let [[properties set-properties!] (rum/use-state nil)
+        [include-built-in? set-include-built-in!] (rum/use-state false)
+        properties (cond->> properties
+                     (not include-built-in?)
+                     (remove ldb/built-in?))]
     (rum/use-effect!
      (fn []
-       (p/let [properties (db-async/<get-all-properties {:remove-built-in-property? false})]
+       (p/let [properties (db-async/<get-all-properties {:remove-built-in-property? false
+                                                         :remove-non-queryable-built-in-property? true})]
          (set-properties! properties)))
      [])
-    (select (map #(hash-map :db/ident (:db/ident %)
-                            :value (:block/title %))
-                 properties)
-            (fn [{value :value db-ident :db/ident}]
-              (reset! *mode "property-value")
-              (reset! *property (if (config/db-based-graph? (state/get-current-repo))
-                                  db-ident
-                                  (keyword value)))))))
+    [:div.flex.flex-col.gap-1
+     [:div.flex.flex-row.justify-between.gap-1.items-center.px-1.pb-1.border-b
+      [:label.opacity-50.cursor.select-none.text-sm
+       {:for "built-in"}
+       "Show built in properties"]
+      (shui/checkbox
+       {:id "built-in"
+        :value include-built-in?
+        :on-checked-change #(set-include-built-in! (not include-built-in?))})]
+     (select (map #(hash-map :db/ident (:db/ident %)
+                             :value (:block/title %))
+                  properties)
+             (fn [{value :value db-ident :db/ident}]
+               (reset! *mode "property-value")
+               (reset! *property (if (config/db-based-graph? (state/get-current-repo))
+                                   db-ident
+                                   (keyword value)))))]))
 
 (rum/defc property-value-select-inner
   < rum/reactive db-mixins/query

+ 21 - 16
src/main/frontend/db/async.cljs

@@ -17,7 +17,8 @@
             [logseq.db :as ldb]
             [frontend.util :as util]
             [frontend.handler.file-based.property.util :as property-util]
-            [logseq.db.frontend.property :as db-property]))
+            [logseq.db.frontend.property :as db-property]
+            [logseq.db.frontend.schema :as db-schema]))
 
 (def <q db-async-util/<q)
 (def <pull db-async-util/<pull)
@@ -51,30 +52,34 @@
 
 (defn <db-based-get-all-properties
   "Return seq of all property names except for private built-in properties."
-  [graph & {:keys [remove-built-in-property?]
-            :or {remove-built-in-property? true}}]
-  (p/let [result (<q graph
-                     {:transact-db? false}
-                     '[:find [(pull ?e [:block/uuid :db/ident :block/title :block/schema]) ...]
-                       :where
-                       [?e :block/type "property"]
-                       [?e :block/title]])]
+  [graph & {:keys [remove-built-in-property? remove-non-queryable-built-in-property?]
+            :or {remove-built-in-property? true
+                 remove-non-queryable-built-in-property? false}}]
+  (let [result (->> (d/datoms (db/get-db graph) :avet :block/type "property")
+                    (map (fn [datom] (db/entity (:e datom))))
+                    (sort-by (juxt ldb/built-in? :block/title)))]
     (cond->> result
       remove-built-in-property?
-         ;; remove private built-in properties
-      (remove #(and (:db/ident %)
-                    (db-property/logseq-property? (:db/ident %))
-                    (not (ldb/public-built-in-property? %))
-                    (not= (:db/ident %) :logseq.property/icon))))))
+      ;; remove private built-in properties
+      (remove (fn [p]
+                (let [ident (:db/ident p)]
+                  (and (ldb/built-in? p)
+                       (not (ldb/public-built-in-property? p))
+                       (not= ident :logseq.property/icon)))))
+      remove-non-queryable-built-in-property?
+      (remove (fn [p]
+                (let [ident (:db/ident p)]
+                  (and (ldb/built-in? p)
+                       (not (:queryable? (db-property/built-in-properties ident))))))))))
 
 (defn <get-all-properties
   "Returns all public properties as property maps including their
   :block/title and :db/ident. For file graphs the map only contains
   :block/title"
-  [& {:keys [remove-built-in-property?]}]
+  [& {:as opts}]
   (when-let [graph (state/get-current-repo)]
     (if (config/db-based-graph? graph)
-      (<db-based-get-all-properties graph {:remove-built-in-property? remove-built-in-property?})
+      (<db-based-get-all-properties graph opts)
       (p/let [properties (file-async/<file-based-get-all-properties graph)
               hidden-properties (set (map name (property-util/hidden-properties)))]
         (remove #(hidden-properties (:block/title %)) properties)))))