From a0d4e43d18dbe836dc218b468398210753330882 Mon Sep 17 00:00:00 2001 From: Gabriel Horner Date: Thu, 26 Sep 2024 10:55:50 -0400 Subject: [PATCH] enhance: add /Advanced Query for db graphs Related to https://linear.app/logseq/issue/LOG-3246/improve-advanced-query-editor. Had to upgrade promesa to get p/doseq --- .clj-kondo/config.edn | 1 + deps.edn | 2 +- deps/graph-parser/deps.edn | 2 +- deps/shui/deps.edn | 2 +- src/main/frontend/commands.cljs | 82 ++++++++++++++++++++------------- 5 files changed, 55 insertions(+), 34 deletions(-) diff --git a/.clj-kondo/config.edn b/.clj-kondo/config.edn index 745478c5d6..2e1e7500fd 100644 --- a/.clj-kondo/config.edn +++ b/.clj-kondo/config.edn @@ -201,6 +201,7 @@ :lint-as {promesa.core/let clojure.core/let promesa.core/loop clojure.core/loop promesa.core/recur clojure.core/recur + promesa.core/doseq clojure.core/doseq rum.core/defcc rum.core/defc rum.core/with-context clojure.core/let rum.core/defcontext clojure.core/def diff --git a/deps.edn b/deps.edn index 1594b14d68..349c03c498 100644 --- a/deps.edn +++ b/deps.edn @@ -8,7 +8,7 @@ datascript-transit/datascript-transit {:mvn/version "0.3.0"} borkdude/rewrite-edn {:mvn/version "0.4.7"} - funcool/promesa {:mvn/version "4.0.2"} + funcool/promesa {:mvn/version "11.0.678"} medley/medley {:mvn/version "1.4.0"} metosin/reitit-frontend {:mvn/version "0.3.10"} cljs-bean/cljs-bean {:mvn/version "1.5.0"} diff --git a/deps/graph-parser/deps.edn b/deps/graph-parser/deps.edn index fde95bdde5..18f953e6b1 100644 --- a/deps/graph-parser/deps.edn +++ b/deps/graph-parser/deps.edn @@ -9,7 +9,7 @@ ;; stubbed in nbb com.lambdaisland/glogi {:mvn/version "1.1.144"} ;; built in to nbb - funcool/promesa {:mvn/version "4.0.2"} + funcool/promesa {:mvn/version "11.0.678"} cljs-bean/cljs-bean {:mvn/version "1.5.0"}} :aliases diff --git a/deps/shui/deps.edn b/deps/shui/deps.edn index 8731c2e55c..fdb9142c2f 100644 --- a/deps/shui/deps.edn +++ b/deps/shui/deps.edn @@ -2,7 +2,7 @@ :deps {org.clojure/clojure {:mvn/version "1.11.1"} org.clojure/clojurescript {:mvn/version "1.11.132"} - funcool/promesa {:mvn/version "4.0.2"} + funcool/promesa {:mvn/version "11.0.678"} rum/rum {:mvn/version "0.12.9"} medley/medley {:mvn/version "1.4.0"} cljs-bean/cljs-bean {:mvn/version "1.5.0"}}} diff --git a/src/main/frontend/commands.cljs b/src/main/frontend/commands.cljs index b9ef535080..911db7eecd 100644 --- a/src/main/frontend/commands.cljs +++ b/src/main/frontend/commands.cljs @@ -154,6 +154,43 @@ (db-based-query) (file-based-query))) +(defn ->block + ([type] + (->block type nil)) + ([type optional] + (let [format (get (state/get-edit-block) :block/format) + markdown-src? (and (= format :markdown) + (= (string/lower-case type) "src")) + [left right] (cond + markdown-src? + ["```" "\n```"] + + :else + (->> ["#+BEGIN_%s" "\n#+END_%s"] + (map #(util/format % + (string/upper-case type))))) + template (str + left + (if optional (str " " optional) "") + "\n" + right) + backward-pos (if (= type "src") + (+ 1 (count right)) + (count right))] + [[:editor/input template {:type "block" + :last-pattern command-trigger + :backward-pos backward-pos}]]))) + +(defn- advanced-query-steps + [] + (if (config/db-based-graph? (state/get-current-repo)) + [[:editor/input "" {:last-pattern command-trigger}] + [:editor/set-property :block/tags :logseq.class/Query] + [:editor/set-property :logseq.property/query ""] + [:editor/set-property-on-block-property :logseq.property/query :logseq.property.node/type :code] + [:editor/set-property-on-block-property :logseq.property/query :logseq.property.code/mode "clojure"]] + (->block "query"))) + (defn db-based-code-block [] [[:editor/input "" {:last-pattern command-trigger}] @@ -173,7 +210,6 @@ (db-based-code-block) (file-based-code-block))) -(declare ->block) (defn quote-block-steps [] (if (config/db-based-graph? (state/get-current-repo)) @@ -256,33 +292,6 @@ (defonce *matched-commands (atom nil)) (defonce *initial-commands (atom nil)) -(defn ->block - ([type] - (->block type nil)) - ([type optional] - (let [format (get (state/get-edit-block) :block/format) - markdown-src? (and (= format :markdown) - (= (string/lower-case type) "src")) - [left right] (cond - markdown-src? - ["```" "\n```"] - - :else - (->> ["#+BEGIN_%s" "\n#+END_%s"] - (map #(util/format % - (string/upper-case type))))) - template (str - left - (if optional (str " " optional) "") - "\n" - right) - backward-pos (if (= type "src") - (+ 1 (count right)) - (count right))] - [[:editor/input template {:type "block" - :last-pattern command-trigger - :backward-pos backward-pos}]]))) - (defn ->properties [] [[:editor/clear-current-slash] @@ -375,7 +384,6 @@ (cond-> [;; Should this be replaced by "Code block"? ["Src" (->block "src") "Create a code block"] - ["Advanced Query" (->block "query") "Create an advanced query block"] ["Math block" (->block "export" "latex") "Create a latex block"] ["Note" (->block "note") "Create a note block"] ["Tip" (->block "tip") "Create a tip block"] @@ -399,6 +407,7 @@ query-doc :icon/query "ADVANCED"] + ["Advanced Query" (advanced-query-steps) "Create an advanced query block" :icon/advanced-query] (when-not db? ["Zotero" (zotero-steps) "Import Zotero journal article" :icon/circle-letter-z]) ["Query function" [[:editor/input "{{function }}" {:backward-pos 2}]] "Create a query function" :icon/queryCode] @@ -739,6 +748,14 @@ (when-let [block (state/get-edit-block)] (db-property-handler/set-block-property! (:db/id block) property-id value)))) +(defmethod handle-step :editor/set-property-on-block-property [[_ block-property-id property-id value]] + (when (config/db-based-graph? (state/get-current-repo)) + (let [updated-block (when-let [block-uuid (:block/uuid (state/get-edit-block))] + (db/entity [:block/uuid block-uuid])) + block-property-value (get updated-block block-property-id)] + (when block-property-value + (db-property-handler/set-block-property! (:db/id block-property-value) property-id value))))) + (defn- file-based-set-priority [priority] (when-let [input-id (state/get-edit-input-id)] @@ -897,8 +914,11 @@ (defn handle-steps [vector' format] - (doseq [step vector'] - (handle-step step format))) + (if (config/db-based-graph? (state/get-current-repo)) + (p/doseq [step vector'] + (handle-step step format)) + (doseq [step vector'] + (handle-step step format)))) (defn exec-plugin-simple-command! [pid {:keys [block-id] :as cmd} action]