|
|
@@ -1,21 +1,19 @@
|
|
|
(ns frontend.components.query
|
|
|
(:require [clojure.string :as string]
|
|
|
[frontend.components.file-based.query-table :as query-table]
|
|
|
+ [frontend.components.file-based.query :as file-query]
|
|
|
[frontend.components.query.result :as query-result]
|
|
|
[frontend.components.query.view :as query-view]
|
|
|
[frontend.context.i18n :refer [t]]
|
|
|
[frontend.db :as db]
|
|
|
[frontend.db-mixins :as db-mixins]
|
|
|
- [frontend.db.query-dsl :as query-dsl]
|
|
|
[frontend.extensions.sci :as sci]
|
|
|
[frontend.handler.editor :as editor-handler]
|
|
|
- [frontend.handler.property :as property-handler]
|
|
|
[frontend.state :as state]
|
|
|
[frontend.ui :as ui]
|
|
|
[frontend.util :as util]
|
|
|
[lambdaisland.glogi :as log]
|
|
|
[rum.core :as rum]
|
|
|
- [frontend.handler.property.util :as pu]
|
|
|
[frontend.config :as config]))
|
|
|
|
|
|
(defn built-in-custom-query?
|
|
|
@@ -24,25 +22,7 @@
|
|
|
(when (seq queries)
|
|
|
(boolean (some #(= % title) (map :title queries))))))
|
|
|
|
|
|
-(rum/defc query-refresh-button
|
|
|
- [query-time {:keys [on-pointer-down full-text-search?]}]
|
|
|
- (ui/tippy
|
|
|
- {:html [:div
|
|
|
- [:p
|
|
|
- (if full-text-search?
|
|
|
- [:span "Full-text search results will not be refreshed automatically."]
|
|
|
- [:span (str "This query takes " (int query-time) "ms to finish, it's a bit slow so that auto refresh is disabled.")])]
|
|
|
- [:p
|
|
|
- "Click the refresh button instead if you want to see the latest result."]]
|
|
|
- :interactive true
|
|
|
- :popperOptions {:modifiers {:preventOverflow
|
|
|
- {:enabled true
|
|
|
- :boundariesElement "viewport"}}}
|
|
|
- :arrow true}
|
|
|
- [:a.fade-link.flex
|
|
|
- {:on-pointer-down on-pointer-down}
|
|
|
- (ui/icon "refresh" {:style {:font-size 20}})]))
|
|
|
-
|
|
|
+;; TODO: Split this into file and DB graph versions. DB graph needlessly coupled too file graph args
|
|
|
(rum/defcs custom-query-inner < rum/reactive
|
|
|
[state config {:keys [query breadcrumb-show?]}
|
|
|
{:keys [query-error-atom
|
|
|
@@ -80,8 +60,7 @@
|
|
|
(util/hiccup-keywordize result))
|
|
|
|
|
|
(and (config/db-based-graph? (state/get-current-repo))
|
|
|
- (not (:built-in? config))
|
|
|
- (or page-list? only-blocks? blocks-grouped-by-page? table?))
|
|
|
+ (not (:built-in? config)))
|
|
|
(query-view/query-result (assoc config :id (:db/id current-block))
|
|
|
current-block result)
|
|
|
|
|
|
@@ -137,7 +116,7 @@
|
|
|
[:span.opacity-60.text-sm.ml-2.results-count
|
|
|
(str result-count (if (> result-count 1) " results" " result"))])]))
|
|
|
|
|
|
-(rum/defcs ^:large-vars/cleanup-todo custom-query* < rum/reactive rum/static db-mixins/query
|
|
|
+(rum/defcs custom-query* < rum/reactive rum/static db-mixins/query
|
|
|
{:init (fn [state]
|
|
|
(let [[config {:keys [title collapsed?]}] (:rum/args state)
|
|
|
built-in? (built-in-custom-query? title)
|
|
|
@@ -149,7 +128,7 @@
|
|
|
(editor-handler/collapse-block! current-block-uuid))))
|
|
|
(assoc state :query-error (atom nil)
|
|
|
:fulltext-query-result (atom nil)))}
|
|
|
- [state config {:keys [title builder query view collapsed? table-view?] :as q}]
|
|
|
+ [state config {:keys [title builder query view collapsed?] :as q}]
|
|
|
(let [*query-error (:query-error state)
|
|
|
*fulltext-query-result (:fulltext-query-result state)
|
|
|
built-in? (built-in-custom-query? title)
|
|
|
@@ -165,20 +144,14 @@
|
|
|
collapsed?
|
|
|
(:block/collapsed? current-block)))
|
|
|
built-in-collapsed? (and collapsed? built-in?)
|
|
|
- query-table? (pu/get-block-property-value current-block :logseq.property/query-table)
|
|
|
- table? (or table-view?
|
|
|
- query-table?
|
|
|
- (and (string? query) (string/ends-with? (string/trim query) "table")))
|
|
|
+ db-based? (config/db-based-graph? (state/get-current-repo))
|
|
|
+ table? (when-not db-based?
|
|
|
+ (or (get-in current-block [:block/properties :query-table])
|
|
|
+ (and (string? query) (string/ends-with? (string/trim query) "table"))))
|
|
|
view-fn (if (keyword? view) (get-in (state/sub-config) [:query/views view]) view)
|
|
|
view-f (and view-fn (sci/eval-string (pr-str view-fn)))
|
|
|
- dsl-page-query? (and dsl-query?
|
|
|
- (false? (:blocks? (query-dsl/parse-query query))))
|
|
|
- full-text-search? (and dsl-query?
|
|
|
- (string? query)
|
|
|
- (re-matches #"\".*\"" query))
|
|
|
result (when (or built-in-collapsed? (not collapsed?'))
|
|
|
(query-result/get-query-result config q *query-error *fulltext-query-result current-block-uuid {:table? table?}))
|
|
|
- query-time (:query-time (meta result))
|
|
|
page-list? (and (seq result)
|
|
|
(some? (:block/name (first result))))
|
|
|
opts {:query-error-atom *query-error
|
|
|
@@ -188,59 +161,24 @@
|
|
|
:view-f view-f
|
|
|
:page-list? page-list?
|
|
|
:result result
|
|
|
- :group-by-page? (query-result/get-group-by-page q {:table? table?})}
|
|
|
- db-based? (config/db-based-graph? (state/get-current-repo))]
|
|
|
+ :group-by-page? (query-result/get-group-by-page q {:table? table?})}]
|
|
|
(if (:custom-query? config)
|
|
|
[:code (if dsl-query?
|
|
|
(util/format "{{query %s}}" query)
|
|
|
"{{query hidden}}")]
|
|
|
(when-not (and built-in? (empty? result))
|
|
|
[:div.custom-query (get config :attr {})
|
|
|
- (when-not (or built-in? db-based?)
|
|
|
- [:div.th
|
|
|
- {:title (str "Query: " query)}
|
|
|
- (if dsl-query?
|
|
|
- [:div.flex.flex-1.flex-row
|
|
|
- (ui/icon "search" {:size 14})
|
|
|
- [:div.ml-1 (str "Live query" (when dsl-page-query? " for pages"))]]
|
|
|
- [:div {:style {:font-size "initial"}} title])
|
|
|
-
|
|
|
- (when (or (not dsl-query?) (not collapsed?'))
|
|
|
- [:div.flex.flex-row.items-center.fade-in
|
|
|
- (when (> (count result) 0)
|
|
|
- [:span.results-count.pl-2
|
|
|
- (let [result-count (if (and (not table?) (map? result))
|
|
|
- (apply + (map (comp count val) result))
|
|
|
- (count result))]
|
|
|
- (str result-count (if (> result-count 1) " results" " result")))])
|
|
|
-
|
|
|
- (when (and current-block (not view-f) (nil? table-view?) (not page-list?))
|
|
|
- (if table?
|
|
|
- [:a.flex.ml-1.fade-link {:title "Switch to list view"
|
|
|
- :on-click (fn [] (property-handler/set-block-property! (state/get-current-repo) current-block-uuid
|
|
|
- (pu/get-pid :logseq.property/query-table)
|
|
|
- false))}
|
|
|
- (ui/icon "list" {:style {:font-size 20}})]
|
|
|
- [:a.flex.ml-1.fade-link {:title "Switch to table view"
|
|
|
- :on-click (fn [] (property-handler/set-block-property! (state/get-current-repo) current-block-uuid
|
|
|
- (pu/get-pid :logseq.property/query-table)
|
|
|
- true))}
|
|
|
- (ui/icon "table" {:style {:font-size 20}})]))
|
|
|
-
|
|
|
- [:a.flex.ml-1.fade-link
|
|
|
- {:title "Setting properties"
|
|
|
- :on-click (fn []
|
|
|
- (let [all-keys (query-table/get-all-columns-for-result result page-list?)]
|
|
|
- (state/pub-event! [:modal/set-query-properties current-block all-keys])))}
|
|
|
- (ui/icon "settings" {:style {:font-size 20}})]
|
|
|
-
|
|
|
- [:div.ml-1
|
|
|
- (when (or full-text-search?
|
|
|
- (and query-time (> query-time 50)))
|
|
|
- (query-refresh-button query-time {:full-text-search? full-text-search?
|
|
|
- :on-pointer-down (fn [e]
|
|
|
- (util/stop e)
|
|
|
- (query-result/trigger-custom-query! config q *query-error *fulltext-query-result))}))]])])
|
|
|
+ (when (and (not db-based?) (not built-in?))
|
|
|
+ (file-query/custom-query-header config
|
|
|
+ q
|
|
|
+ {:query-error-atom *query-error
|
|
|
+ :fulltext-query-result-atom *fulltext-query-result
|
|
|
+ :current-block current-block
|
|
|
+ :table? table?
|
|
|
+ :view-f view-f
|
|
|
+ :page-list? page-list?
|
|
|
+ :result result
|
|
|
+ :collapsed? collapsed?'}))
|
|
|
|
|
|
(when dsl-query? builder)
|
|
|
|
|
|
@@ -264,4 +202,4 @@
|
|
|
(ui/lazy-visible
|
|
|
(fn []
|
|
|
(custom-query* config q))
|
|
|
- {:debug-id q})))
|
|
|
+ {:debug-id q})))
|