mirror of https://github.com/logseq/logseq
fix: property and property value selection for query builder
for db graphsexperiment/tanstack-table
parent
db6990ab66
commit
8d45ad2d8e
|
@ -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]
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue