fix: property and property value selection for query builder

for db graphs
experiment/tanstack-table
Gabriel Horner 2024-05-31 11:59:21 -04:00
parent db6990ab66
commit 8d45ad2d8e
4 changed files with 49 additions and 32 deletions

View File

@ -12,7 +12,6 @@
[frontend.state :as state] [frontend.state :as state]
[frontend.util :as util] [frontend.util :as util]
[logseq.shui.ui :as shui] [logseq.shui.ui :as shui]
[frontend.search :as search]
[frontend.mixins :as mixins] [frontend.mixins :as mixins]
[logseq.graph-parser.db :as gp-db] [logseq.graph-parser.db :as gp-db]
[rum.core :as rum] [rum.core :as rum]
@ -20,7 +19,9 @@
[logseq.common.util :as common-util] [logseq.common.util :as common-util]
[logseq.common.util.page-ref :as page-ref] [logseq.common.util.page-ref :as page-ref]
[promesa.core :as p] [promesa.core :as p]
[frontend.config :as config])) [frontend.config :as config]
[logseq.db.frontend.property :as db-property]
[logseq.db.sqlite.util :as sqlite-util]))
(rum/defc page-block-selector (rum/defc page-block-selector
[*find] [*find]
@ -41,7 +42,10 @@
(select items on-chosen {})) (select items on-chosen {}))
([items on-chosen options] ([items on-chosen options]
(component-select/select (merge (component-select/select (merge
{:items (map #(hash-map :value %) items) ;; Allow caller to build :items
{:items (if (map? (first items))
items
(map #(hash-map :value %) items))
:on-chosen on-chosen} :on-chosen on-chosen}
options)))) options))))
@ -134,24 +138,40 @@
(let [[properties set-properties!] (rum/use-state nil)] (let [[properties set-properties!] (rum/use-state nil)]
(rum/use-effect! (rum/use-effect!
(fn [] (fn []
(p/let [properties (search/get-all-properties)] (p/let [properties (db-async/<get-all-properties)]
(set-properties! properties))) (set-properties! properties)))
[]) [])
(select properties (select (map #(hash-map :db/ident (:db/ident %)
(fn [{:keys [value]}] :value (:block/original-name %))
properties)
(fn [{value :value db-ident :db/ident}]
(reset! *mode "property-value") (reset! *mode "property-value")
(reset! *property (keyword value)))))) (reset! *property (if (config/db-based-graph? (state/get-current-repo))
db-ident
(keyword value)))))))
(rum/defc property-value-select (rum/defc property-value-select
[repo *property *find *tree opts loc] [repo *property *find *tree opts loc]
(let [[values set-values!] (rum/use-state nil)] (let [db-graph? (sqlite-util/db-based-graph? repo)
[values set-values!] (rum/use-state nil)]
(rum/use-effect! (rum/use-effect!
(fn [] (fn []
(p/let [result (db-async/<get-property-values repo @*property)] (p/let [result (if db-graph?
(db-async/<get-block-property-values repo @*property)
(db-async/<file-get-property-values repo @*property))]
(when db-graph?
(doseq [db-id result]
(db-async/<get-block repo db-id :children? false)))
(set-values! result))) (set-values! result)))
[@*property]) [@*property])
(let [values (cons "Select all" values)] (let [;; FIXME: lazy load property values consistently on first call
(select values _ (when db-graph?
(doseq [id values] (db/sub-block id)))
values' (if db-graph?
(map #(db-property/get-property-value-name (db/entity repo %)) values)
values)
values'' (cons "Select all" values')]
(select values''
(fn [{:keys [value]}] (fn [{:keys [value]}]
(let [x (if (= value "Select all") (let [x (if (= value "Select all")
[(if (= @*find :page) :page-property :property) @*property] [(if (= @*find :page) :page-property :property) @*property]

View File

@ -16,6 +16,7 @@
[cljs-time.format :as tf] [cljs-time.format :as tf]
[logseq.db :as ldb] [logseq.db :as ldb]
[frontend.util :as util] [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]))
(def <q db-async-util/<q) (def <q db-async-util/<q)
@ -63,21 +64,27 @@
(db-property/logseq-property? (:db/ident %)) (db-property/logseq-property? (:db/ident %))
(not (get-in % [:block/schema :public?]))))))) (not (get-in % [:block/schema :public?])))))))
(defn <get-all-property-names (defn <get-all-properties
"Returns a seq of property name strings" "Returns all public properties as property maps including their
:block/original-name and :db/ident. For file graphs the map only contains
:block/original-name"
[] []
(when-let [graph (state/get-current-repo)] (when-let [graph (state/get-current-repo)]
(if (config/db-based-graph? graph) (if (config/db-based-graph? graph)
(p/let [properties (<db-based-get-all-properties graph)] (<db-based-get-all-properties graph)
(map :block/original-name properties)) (p/let [properties (file-async/<file-based-get-all-properties graph)
(file-async/<file-based-get-all-properties graph)))) hidden-properties (set (map name (property-util/hidden-properties)))]
(remove #(hidden-properties (:block/original-name %)) properties)))))
(defn <get-property-values (defn <file-get-property-values
"For file graphs, returns property value names for given property name"
[graph property] [graph property]
(when-not (config/db-based-graph? graph) (when-not (config/db-based-graph? graph)
(file-async/<get-file-based-property-values graph property))) (file-async/<get-file-based-property-values graph property)))
(defn <get-block-property-values (defn <get-block-property-values
"For db graphs, returns property value ids for given property db-ident.
Separate from file version because values are lazy loaded"
[graph property-id] [graph property-id]
(let [empty-id (:db/id (db/entity :logseq.property/empty-placeholder))] (let [empty-id (:db/id (db/entity :logseq.property/empty-placeholder))]
(<q graph {:transact-db? false} (<q graph {:transact-db? false}

View File

@ -18,7 +18,8 @@
(apply concat) (apply concat)
distinct distinct
sort sort
(map name)))) (map name)
(map #(hash-map :block/original-name %)))))
(defn- property-value-for-refs-and-text (defn- property-value-for-refs-and-text
"Given a property value's refs and full text, determines the value to "Given a property value's refs and full text, determines the value to

View File

@ -11,8 +11,6 @@
[frontend.search.fuzzy :as fuzzy] [frontend.search.fuzzy :as fuzzy]
[logseq.common.config :as common-config] [logseq.common.config :as common-config]
[frontend.db.async :as db-async] [frontend.db.async :as db-async]
[frontend.config :as config]
[frontend.handler.file-based.property.util :as property-util]
[cljs-bean.core :as bean] [cljs-bean.core :as bean]
[frontend.db :as db] [frontend.db :as db]
[frontend.db.model :as db-model] [frontend.db.model :as db-model]
@ -69,23 +67,14 @@
(let [result (fuzzy/fuzzy-search (keys templates) q {:limit limit})] (let [result (fuzzy/fuzzy-search (keys templates) q {:limit limit})]
(vec (select-keys templates result))))))))) (vec (select-keys templates result)))))))))
(defn get-all-properties
[]
(when-let [repo (state/get-current-repo)]
(let [hidden-props (if (config/db-based-graph? repo)
;; no-op since already removed
(constantly false)
(set (map name (property-util/hidden-properties))))]
(p/let [properties (db-async/<get-all-property-names)]
(remove hidden-props properties)))))
(defn property-search (defn property-search
([q] ([q]
(property-search q 100)) (property-search q 100))
([q limit] ([q limit]
(when q (when q
(p/let [q (fuzzy/clean-str q) (p/let [q (fuzzy/clean-str q)
properties (get-all-properties)] properties* (db-async/<get-all-properties)
properties (map :block/original-name properties*)]
(when (seq properties) (when (seq properties)
(if (string/blank? q) (if (string/blank? q)
properties properties
@ -100,7 +89,7 @@
(when-let [repo (state/get-current-repo)] (when-let [repo (state/get-current-repo)]
(when q (when q
(p/let [q (fuzzy/clean-str q) (p/let [q (fuzzy/clean-str q)
result (db-async/<get-property-values repo (keyword property))] result (db-async/<file-get-property-values repo (keyword property))]
(when (seq result) (when (seq result)
(if (string/blank? q) (if (string/blank? q)
result result