From 07bfc2edff412f31378aadd2f5f7dbf06c1766dd Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Thu, 18 Feb 2021 13:06:03 +0800 Subject: [PATCH 01/28] fix: api.q --- src/main/api.cljs | 2 +- src/main/frontend/db/query_custom.cljs | 55 ++++++++++++++------------ 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/main/api.cljs b/src/main/api.cljs index 9159b52cb6..6411258d5c 100644 --- a/src/main/api.cljs +++ b/src/main/api.cljs @@ -10,7 +10,7 @@ (when-let [repo (state/get-current-repo)] (when-let [conn (db/get-conn repo)] (when-let [result (query-dsl/query repo query-string)] - @result)))) + (clj->js @result))))) (defn ^:export datascript_query [query & inputs] diff --git a/src/main/frontend/db/query_custom.cljs b/src/main/frontend/db/query_custom.cljs index f8434dec07..9cb863ab23 100644 --- a/src/main/frontend/db/query_custom.cljs +++ b/src/main/frontend/db/query_custom.cljs @@ -45,32 +45,35 @@ (defn custom-query-result-transform [query-result remove-blocks q] - (let [repo (state/get-current-repo) - result (db-utils/seq-flatten query-result) - block? (:block/uuid (first result))] - (let [result (if block? - (let [result (if (seq remove-blocks) - (let [remove-blocks (set remove-blocks)] - (remove (fn [h] - (contains? remove-blocks (:block/uuid h))) - result)) - result)] - (some->> result - (db-utils/with-repo repo) - (model/with-block-refs-count repo) - (model/sort-blocks))) - result)] - (if-let [result-transform (:result-transform q)] - (if-let [f (sci/eval-string (pr-str result-transform))] - (try - (sci/call-fn f result) - (catch js/Error e - (log/error :sci/call-error e) - result)) - result) - (if block? - (db-utils/group-by-page result) - result))))) + (try + (let [repo (state/get-current-repo) + result (db-utils/seq-flatten query-result) + block? (:block/uuid (first result))] + (let [result (if block? + (let [result (if (seq remove-blocks) + (let [remove-blocks (set remove-blocks)] + (remove (fn [h] + (contains? remove-blocks (:block/uuid h))) + result)) + result)] + (some->> result + (db-utils/with-repo repo) + (model/with-block-refs-count repo) + (model/sort-blocks))) + result)] + (if-let [result-transform (:result-transform q)] + (if-let [f (sci/eval-string (pr-str result-transform))] + (try + (sci/call-fn f result) + (catch js/Error e + (log/error :sci/call-error e) + result)) + result) + (if block? + (db-utils/group-by-page result) + result)))) + (catch js/Error e + (log/error :query/failed e)))) (defn- resolve-query [query] From d9e8ed433a10d979c98a1c324bdb1dad03329f8f Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Thu, 18 Feb 2021 15:59:10 +0800 Subject: [PATCH 02/28] fix: search Related to #1319 --- src/main/frontend/search.cljs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/frontend/search.cljs b/src/main/frontend/search.cljs index ced5c3d32f..9852b4be14 100644 --- a/src/main/frontend/search.cljs +++ b/src/main/frontend/search.cljs @@ -38,6 +38,13 @@ :uuid (str uuid) :content result})) +(def default-block-indice (flexsearch. + (clj->js + {:encode "icase" + :tokenize utils/searchTokenize + :doc {:id "id" + :field ["content"]} + :async true}))) (defn make-blocks-indice! [] (when-let [repo (state/get-current-repo)] @@ -45,13 +52,7 @@ (map block->index) (remove nil?) (bean/->js)) - indice (flexsearch. - (clj->js - {:encode "icase" - :tokenize utils/searchTokenize - :doc {:id "id" - :field ["content"]} - :async true}))] + indice default-block-indice] (p/let [result (.add indice blocks)] (swap! indices assoc-in [repo :blocks] indice)) indice))) @@ -81,7 +82,7 @@ (defn reset-indice! [repo] (swap! indices assoc repo {:pages #js [] - :blocks #js []})) + :blocks default-block-indice})) ;; Copied from https://gist.github.com/vaughnd/5099299 (defn str-len-distance From 2b9b9429a8d24a2eb697ee9f19fe19dc73d8c05f Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Thu, 18 Feb 2021 16:10:48 +0800 Subject: [PATCH 03/28] fix: Content can't read related to #1322 --- src/main/frontend/fs.cljs | 2 +- src/main/frontend/handler/image.cljs | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/frontend/fs.cljs b/src/main/frontend/fs.cljs index e362aae9c8..27b46b525c 100644 --- a/src/main/frontend/fs.cljs +++ b/src/main/frontend/fs.cljs @@ -62,7 +62,7 @@ options (if (= fs bfs-record) {:encoding "utf8"} {})] - (read-file dir path {}))) + (read-file dir path options))) ([dir path options] (protocol/read-file (get-fs dir) dir path options))) diff --git a/src/main/frontend/handler/image.cljs b/src/main/frontend/handler/image.cljs index c0157f79cb..d65c8e51f1 100644 --- a/src/main/frontend/handler/image.cljs +++ b/src/main/frontend/handler/image.cljs @@ -36,9 +36,7 @@ (subs path 1) path)] (util/p-handle - (fs/read-file (config/get-repo-dir (state/get-current-repo)) - path - {}) + (fs/read-file (config/get-repo-dir (state/get-current-repo)) path {}) (fn [blob] (let [blob (js/Blob. (array blob) (clj->js {:type "image"})) img-url (image/create-object-url blob)] From 5e50ac671d97b284c51bcbcf18ad0b8195469e05 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Thu, 18 Feb 2021 22:20:30 +0800 Subject: [PATCH 04/28] refactor: use rules --- src/main/frontend/db/model.cljs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/frontend/db/model.cljs b/src/main/frontend/db/model.cljs index 5aa1200617..79980c6764 100644 --- a/src/main/frontend/db/model.cljs +++ b/src/main/frontend/db/model.cljs @@ -22,6 +22,13 @@ ;; TODO: extract to specific models and move data transform logic to the ;; correponding handlers. +(def rules + '[[(parent ?p ?c) + [?p :block/children ?c]] + [(parent ?p ?c) + [?t :block/children ?c] + (parent ?p ?t)]]) + (defn transact-files-db! ([tx-data] (db-utils/transact! (state/get-current-repo) tx-data)) @@ -569,17 +576,12 @@ (when-let [conn (conn/get-conn repo)] (let [eid (:db/id (db-utils/entity repo [:block/uuid block-uuid]))] (->> (d/q - '[:find ?e1 - :in $ ?e2 % - :where (parent ?e2 ?e1)] - conn - eid - ;; recursive rules - '[[(parent ?e2 ?e1) - [?e2 :block/children ?e1]] - [(parent ?e2 ?e1) - [?t :block/children ?e1] - (parent ?e2 ?t)]]) + '[:find ?c + :in $ ?p % + :where (parent ?p ?c)] + conn + eid + rules) (apply concat))))) (defn get-block-immediate-children From 467888e7c6abc2923305f10ab951bd1a67377485 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Fri, 19 Feb 2021 13:44:38 +0800 Subject: [PATCH 05/28] query: experiments --- deps.edn | 2 +- src/main/frontend/db/model.cljs | 58 ++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index d270e07a89..686b080ed2 100755 --- a/deps.edn +++ b/deps.edn @@ -8,7 +8,7 @@ ;; FIXME: doesn't work on my archlinux laptop (tienson) ;; The required namespace "datascript.core" is not available, it was required by "frontend/db.cljs". datascript/datascript {:git/url "https://github.com/tiensonqin/datascript", - :sha "7c2822565d9a114c7d8604c335af89de4640e2e5"} + :sha "efde8d389e6703b6f60ca3538f484a579b0d6de0"} ;; datascript {:mvn/version "1.0.1"} datascript-transit/datascript-transit {:mvn/version "0.3.0" diff --git a/src/main/frontend/db/model.cljs b/src/main/frontend/db/model.cljs index 79980c6764..3bf542a1a7 100644 --- a/src/main/frontend/db/model.cljs +++ b/src/main/frontend/db/model.cljs @@ -27,7 +27,26 @@ [?p :block/children ?c]] [(parent ?p ?c) [?t :block/children ?c] - (parent ?p ?t)]]) + (parent ?p ?t)] + + ;; from https://stackoverflow.com/questions/43784258/find-entities-whose-ref-to-many-attribute-contains-all-elements-of-input + ;; Quote: + ;; You're tackling the general problem of 'dynamic conjunction' in Datomic's Datalog. + ;; Write a dynamic Datalog query which uses 2 negations and 1 disjunction or a recursive rule + ;; Datalog has no direct way of expressing dynamic conjunction (logical AND / 'for all ...' / set intersection). + ;; However, you can achieve it in pure Datalog by combining one disjunction + ;; (logical OR / 'exists ...' / set union) and two negations, i.e + ;; (For all ?g in ?Gs p(?e,?g)) <=> NOT(Exists ?g in ?Gs, such that NOT(p(?e, ?g))) + + ;; TODO: benchmark, + + [(matches-all ?e ?a ?vs) + [(first ?vs) ?v0] + [?e ?a ?v0] + (not-join [?e ?vs] + [(identity ?vs) [?v ...]] + (not-join [?e ?v] + [?e ?a ?v]))]]) (defn transact-files-db! ([tx-data] @@ -322,6 +341,16 @@ (->> (db-utils/pull-many repo '[:page/name] ids) (map :page/name))))) +(defn get-page-ids-by-names + ([names] + (get-page-ids-by-names (state/get-current-repo) names)) + ([repo names] + (when repo + (let [lookup-refs (map (fn [name] + [:page/name (string/lower-case name)]) names)] + (->> (db-utils/pull-many repo '[:db/id] lookup-refs) + (mapv :db/id)))))) + (defn get-page-alias-names [repo page-name] (let [alias-ids (page-alias-set repo page-name)] @@ -1208,3 +1237,30 @@ [tx-data] {:key [:file/content path] :files-db? true})))) + +(comment + (def page-names ["foo" "bar"]) + + (def page-ids (set (get-page-ids-by-names page-names))) + + (d/q '[:find [(pull ?b [*]) ...] + :in $ % ?refs + :where + [?b :block/ref-pages ?p] + ;; Filter other blocks + [(contains? ?refs ?p)] + (or-join [?b ?refs] + (matches-all ?b :block/ref-pages ?refs) + (and + (parent ?p ?b) + ;; FIXME: not working + ;; (matches-all (union ?p ?b) :block/ref-pages ?refs) + [?p :block/ref-pages ?p-ref] + [?b :block/ref-pages ?b-ref] + [(contains? ?refs ?p-ref)] + [(contains? ?refs ?b-ref)] + ))] + (conn/get-conn) + rules + page-ids) + ) From 9bf8bef59af0c639e881ac67668df65c053cf861 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Fri, 19 Feb 2021 13:47:48 +0800 Subject: [PATCH 06/28] query: parent and children don't have the same ref --- src/main/frontend/db/model.cljs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/frontend/db/model.cljs b/src/main/frontend/db/model.cljs index 3bf542a1a7..ca96edfea5 100644 --- a/src/main/frontend/db/model.cljs +++ b/src/main/frontend/db/model.cljs @@ -1257,6 +1257,7 @@ ;; (matches-all (union ?p ?b) :block/ref-pages ?refs) [?p :block/ref-pages ?p-ref] [?b :block/ref-pages ?b-ref] + [(not= ?p-ref ?b-ref)] [(contains? ?refs ?p-ref)] [(contains? ?refs ?b-ref)] ))] From 901f0321cd521d2233d982f49dded63bec489dda Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sat, 20 Feb 2021 12:58:48 +0800 Subject: [PATCH 07/28] fix: duplicated blocks when editing --- src/main/frontend/format/block.cljs | 5 +- src/main/frontend/handler/editor.cljs | 286 ++++++++++++++------------ 2 files changed, 150 insertions(+), 141 deletions(-) diff --git a/src/main/frontend/format/block.cljs b/src/main/frontend/format/block.cljs index 3bd7331c7b..bcccee033f 100644 --- a/src/main/frontend/format/block.cljs +++ b/src/main/frontend/format/block.cljs @@ -423,10 +423,7 @@ (:start-pos meta) (:end-pos meta))} ;; Preserve the original block id - (when (and (zero? idx) - ;; not custom-id - (not (get-in block [:block/properties "custom_id"])) - (not (get-in block [:block/properties "id"]))) + (when (zero? idx) {:block/uuid uuid}) (when (seq ref-pages) {:block/ref-pages diff --git a/src/main/frontend/handler/editor.cljs b/src/main/frontend/handler/editor.cljs index ebc84c22d6..094a3e495b 100644 --- a/src/main/frontend/handler/editor.cljs +++ b/src/main/frontend/handler/editor.cljs @@ -473,152 +473,164 @@ (set (keys text-properties)) text/hidden-properties) (set/union (set remove-properties))) - properties (medley/remove-keys (fn [k] (contains? remove-properties k)) properties) - value (block-text-with-time block format value properties) - content-changed? (not= (text/remove-timestamp-property! (string/trim content)) - (text/remove-timestamp-property! (string/trim value)))] - (cond - content-changed? - (let [file (db/entity repo (:db/id file))] - (cond - ;; Page was referenced but no related file - ;; TODO: replace with handler.page/create! - (and page (not file)) - (let [format (name format) - title (string/capitalize (:page/name page)) - journal-page? (date/valid-journal-title? title) - path (str - (if journal-page? - config/default-journals-directory - (config/get-pages-directory)) - "/" - (if journal-page? - (date/journal-title->default title) - (-> (:page/name page) - (util/page-name-sanity))) "." - (if (= format "markdown") "md" format)) - file-path (str "/" path) - dir (config/get-repo-dir repo)] - (p/let [exists? (fs/file-exists? dir file-path)] - (if exists? - (notification/show! - [:p.content - (util/format "File %s already exists!" file-path)] - :error) - ;; create the file - (let [value (block-text-with-time nil format value) - content (str (util/default-content-with-title format - (or (:page/original-name page) - (:page/name page))) - value)] - (p/let [_ (fs/create-if-not-exists repo dir file-path content) - _ (git-handler/git-add repo path)] - (file-handler/reset-file! repo path content) - (ui-handler/re-render-root!) + properties (medley/remove-keys (fn [k] (contains? remove-properties k)) properties)] + (let [id (get properties "id")] + (cond + (and (string? id) + (util/uuid-string? id) + (not= uuid (cljs.core/uuid id)) + (db/entity [:block/uuid (cljs.core/uuid id)])) + (notification/show! + [:p.content + (util/format "Block with the id % already exists!" id)] + :error) - ;; Continue to edit the last block - (let [blocks (db/get-page-blocks repo (:page/name page)) - last-block (last blocks)] - (edit-last-block-for-new-page! last-block :max))))))) + :else + (let [value (block-text-with-time block format value properties) + content-changed? (not= (text/remove-timestamp-property! (string/trim content)) + (text/remove-timestamp-property! (string/trim value)))] + (cond + content-changed? + (let [file (db/entity repo (:db/id file))] + (cond + ;; Page was referenced but no related file + ;; TODO: replace with handler.page/create! + (and page (not file)) + (let [format (name format) + title (string/capitalize (:page/name page)) + journal-page? (date/valid-journal-title? title) + path (str + (if journal-page? + config/default-journals-directory + (config/get-pages-directory)) + "/" + (if journal-page? + (date/journal-title->default title) + (-> (:page/name page) + (util/page-name-sanity))) "." + (if (= format "markdown") "md" format)) + file-path (str "/" path) + dir (config/get-repo-dir repo)] + (p/let [exists? (fs/file-exists? dir file-path)] + (if exists? + (notification/show! + [:p.content + (util/format "File %s already exists!" file-path)] + :error) + ;; create the file + (let [value (block-text-with-time nil format value) + content (str (util/default-content-with-title format + (or (:page/original-name page) + (:page/name page))) + value)] + (p/let [_ (fs/create-if-not-exists repo dir file-path content) + _ (git-handler/git-add repo path)] + (file-handler/reset-file! repo path content) + (ui-handler/re-render-root!) - (and file page) - (let [file (db/entity repo (:db/id file)) - file-path (:file/path file) - format (format/get-format file-path) - file-content (db/get-file repo file-path) - value (get-block-new-value block file-content value) - value (if rebuild-content? - (rebuild-block-content value format) - value) - block (assoc block :block/content value) - {:keys [blocks pages start-pos end-pos]} (if pre-block? - (let [new-end-pos (utf8/length (utf8/encode value))] - {:blocks [(assoc-in block [:block/meta :end-pos] new-end-pos)] - :pages [] - :start-pos 0 - :end-pos new-end-pos}) - (block/parse-block block format)) - block-retracted-attrs (when-not pre-block? - ;; TODO: should we retract the whole block instead? - (when-let [id (:db/id block)] - [[:db/retract id :block/properties] - [:db/retract id :block/priority] - [:db/retract id :block/deadline] - [:db/retract id :block/deadline-ast] - [:db/retract id :block/scheduled] - [:db/retract id :block/scheduled-ast] - [:db/retract id :block/marker] - [:db/retract id :block/repeated?]])) - [after-blocks block-children-content new-end-pos] (rebuild-after-blocks-indent-outdent repo file block (:end-pos (:block/meta block)) end-pos indent-left?) - retract-refs (compute-retract-refs (:db/id e) (first blocks) ref-pages ref-blocks) - page-id (:db/id page) - page-properties (when pre-block? - (if (seq new-properties) - [[:db/retract page-id :page/properties] + ;; Continue to edit the last block + (let [blocks (db/get-page-blocks repo (:page/name page)) + last-block (last blocks)] + (edit-last-block-for-new-page! last-block :max))))))) + + (and file page) + (let [file (db/entity repo (:db/id file)) + file-path (:file/path file) + format (format/get-format file-path) + file-content (db/get-file repo file-path) + value (get-block-new-value block file-content value) + value (if rebuild-content? + (rebuild-block-content value format) + value) + block (assoc block :block/content value) + {:keys [blocks pages start-pos end-pos]} (if pre-block? + (let [new-end-pos (utf8/length (utf8/encode value))] + {:blocks [(assoc-in block [:block/meta :end-pos] new-end-pos)] + :pages [] + :start-pos 0 + :end-pos new-end-pos}) + (block/parse-block block format)) + block-retracted-attrs (when-not pre-block? + ;; TODO: should we retract the whole block instead? + (when-let [id (:db/id block)] + [[:db/retract id :block/properties] + [:db/retract id :block/priority] + [:db/retract id :block/deadline] + [:db/retract id :block/deadline-ast] + [:db/retract id :block/scheduled] + [:db/retract id :block/scheduled-ast] + [:db/retract id :block/marker] + [:db/retract id :block/repeated?]])) + [after-blocks block-children-content new-end-pos] (rebuild-after-blocks-indent-outdent repo file block (:end-pos (:block/meta block)) end-pos indent-left?) + retract-refs (compute-retract-refs (:db/id e) (first blocks) ref-pages ref-blocks) + page-id (:db/id page) + page-properties (when pre-block? + (if (seq new-properties) + [[:db/retract page-id :page/properties] + {:db/id page-id + :page/properties new-properties}] + [[:db/retract page-id :page/properties]])) + pages (if (seq page-tags) + (concat pages page-tags) + pages) + pages (remove + (fn [page] + (string/blank? (:page/name page))) + pages) + page-tags (when (and pre-block? (seq page-tags)) + (if (seq page-tags) + [[:db/retract page-id :page/tags] {:db/id page-id - :page/properties new-properties}] - [[:db/retract page-id :page/properties]])) - pages (if (seq page-tags) - (concat pages page-tags) - pages) - pages (remove - (fn [page] - (string/blank? (:page/name page))) - pages) - page-tags (when (and pre-block? (seq page-tags)) - (if (seq page-tags) - [[:db/retract page-id :page/tags] - {:db/id page-id - :page/tags page-tags}] - [[:db/retract page-id :page/tags]])) - page-alias (when (and pre-block? (seq page-alias)) - (if (seq page-alias) - [[:db/retract page-id :page/alias] - {:db/id page-id - :page/alias page-alias}] - [[:db/retract page-id :page/alias]]))] - (profile - "Save block: " - (repo-handler/transact-react-and-alter-file! - repo - (concat - pages - block-retracted-attrs - (mapv (fn [b] {:block/uuid (:block/uuid b)}) blocks) - blocks - retract-refs - page-properties - page-tags - page-alias - after-blocks) - {:key :block/change - :data (map (fn [block] (assoc block :block/page page)) blocks)} - (let [new-content (new-file-content-indent-outdent block file-content value block-children-content new-end-pos indent-left?)] - [[file-path new-content]]) - (when chan {:chan chan - :chan-callback chan-callback}))) + :page/tags page-tags}] + [[:db/retract page-id :page/tags]])) + page-alias (when (and pre-block? (seq page-alias)) + (if (seq page-alias) + [[:db/retract page-id :page/alias] + {:db/id page-id + :page/alias page-alias}] + [[:db/retract page-id :page/alias]]))] + (profile + "Save block: " + (repo-handler/transact-react-and-alter-file! + repo + (concat + pages + block-retracted-attrs + (mapv (fn [b] {:block/uuid (:block/uuid b)}) blocks) + blocks + retract-refs + page-properties + page-tags + page-alias + after-blocks) + {:key :block/change + :data (map (fn [block] (assoc block :block/page page)) blocks)} + (let [new-content (new-file-content-indent-outdent block file-content value block-children-content new-end-pos indent-left?)] + [[file-path new-content]]) + (when chan {:chan chan + :chan-callback chan-callback}))) - ;; fix editing template with multiple headings - (when (> (count blocks) 1) - (let [new-value (-> (text/remove-level-spaces (:block/content (first blocks)) (:block/format (first blocks))) - (string/trim-newline)) - edit-input-id (state/get-edit-input-id)] - (when edit-input-id - (state/set-edit-content! edit-input-id new-value)))) + ;; fix editing template with multiple headings + (when (> (count blocks) 1) + (let [new-value (-> (text/remove-level-spaces (:block/content (first blocks)) (:block/format (first blocks))) + (string/trim-newline)) + edit-input-id (state/get-edit-input-id)] + (when edit-input-id + (state/set-edit-content! edit-input-id new-value)))) - (when (or (seq retract-refs) pre-block?) - (ui-handler/re-render-root!)) + (when (or (seq retract-refs) pre-block?) + (ui-handler/re-render-root!)) - (repo-handler/push-if-auto-enabled! repo)) + (repo-handler/push-if-auto-enabled! repo)) - :else - nil)) + :else + nil)) - (seq (state/get-changed-files)) - (repo-handler/push-if-auto-enabled! repo) + (seq (state/get-changed-files)) + (repo-handler/push-if-auto-enabled! repo) - :else - nil)))) + :else + nil))))))) (defn insert-new-block-aux! [{:block/keys [uuid content meta file dummy? level repo page format properties collapsed? pre-block?] :as block} From fd3fe1e571c87eb6b4cc83336a1abe24ce0ea7a7 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sat, 20 Feb 2021 13:07:50 +0800 Subject: [PATCH 08/28] chore: disable source-map temporally --- shadow-cljs.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shadow-cljs.edn b/shadow-cljs.edn index f513f48588..ea6710dcca 100644 --- a/shadow-cljs.edn +++ b/shadow-cljs.edn @@ -16,7 +16,7 @@ :release {:asset-path "https://asset.logseq.com/static/js"} :compiler-options {:infer-externs :auto :output-feature-set :es-next - :source-map true + ;; :source-map true :externs ["datascript/externs.js" "externs.js"] :warnings {:fn-deprecated false}} From ba8055f748d4330ea9b7c733c469ceae49098457 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sat, 20 Feb 2021 13:27:27 +0800 Subject: [PATCH 09/28] feat: add shortcut mod-c mod-r to re-index the graph --- src/main/frontend/components/repo.cljs | 9 +-------- src/main/frontend/db_schema.cljs | 3 +++ src/main/frontend/handler/repo.cljs | 12 ++++++++++++ src/main/frontend/keyboards.cljs | 7 +++++++ 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/main/frontend/components/repo.cljs b/src/main/frontend/components/repo.cljs index 14b6b7f61a..90e0c4f61f 100644 --- a/src/main/frontend/components/repo.cljs +++ b/src/main/frontend/components/repo.cljs @@ -64,14 +64,7 @@ "Sync with the local directory" "Clone again and re-index the db") :on-click (fn [] - (if local? - (nfs-handler/rebuild-index! url - repo-handler/create-today-journal!) - (repo-handler/rebuild-index! url)) - (js/setTimeout - (fn [] - (route-handler/redirect! {:to :home})) - 500))} + (repo-handler/re-index! nfs-handler/rebuild-index!))} "Re-index"] [:a.control.ml-4 {:title "Clone again and re-index the db" :on-click (fn [] diff --git a/src/main/frontend/db_schema.cljs b/src/main/frontend/db_schema.cljs index a071be6c62..1573dca486 100644 --- a/src/main/frontend/db_schema.cljs +++ b/src/main/frontend/db_schema.cljs @@ -61,6 +61,9 @@ ;; referenced pages :block/ref-pages {:db/valueType :db.type/ref :db/cardinality :db.cardinality/many} + ;; referenced pages inherited from the parents + :block/path-ref-pages {:db/valueType :db.type/ref + :db/cardinality :db.cardinality/many} ;; Referenced pages ;; Notice: it's only for org mode, :tag1:tag2: diff --git a/src/main/frontend/handler/repo.cljs b/src/main/frontend/handler/repo.cljs index 94b7b94ec2..2f2bf2799d 100644 --- a/src/main/frontend/handler/repo.cljs +++ b/src/main/frontend/handler/repo.cljs @@ -650,6 +650,18 @@ (p/catch (fn [error] (prn "Delete repo failed, error: " error)))))) +(defn re-index! + [nfs-rebuild-index!] + (when-let [repo (state/get-current-repo)] + (let [local? (config/local-db? repo)] + (if local? + (nfs-rebuild-index! repo create-today-journal!) + (rebuild-index! repo)) + (js/setTimeout + (fn [] + (route-handler/redirect! {:to :home})) + 500)))) + (defn git-commit-and-push! [commit-message] (when-let [repo (state/get-current-repo)] diff --git a/src/main/frontend/keyboards.cljs b/src/main/frontend/keyboards.cljs index d94e7c900b..f1b1d57d57 100644 --- a/src/main/frontend/keyboards.cljs +++ b/src/main/frontend/keyboards.cljs @@ -5,6 +5,8 @@ [frontend.handler.route :as route-handler] [frontend.handler.search :as search-handler] [frontend.handler.config :as config-handler] + [frontend.handler.repo :as repo-handler] + [frontend.handler.web.nfs :as nfs-handler] [frontend.state :as state] [frontend.search :as search] [frontend.util :as util] @@ -30,6 +32,8 @@ (def shortcut state/get-shortcut) +(def re-index! #(repo-handler/re-index! nfs-handler/rebuild-index!)) + (defonce chords { ;; non-editing mode @@ -75,6 +79,9 @@ (or (shortcut :editor/prev) "up") (fn [state e] (editor-handler/open-block! false)) (or (shortcut :search/re-index) "mod+c mod+s") [search-handler/rebuild-indices! true] + + (or (shortcut :graph/re-index) "mod+c mod+r") [re-index! true] + (or (shortcut :ui/toggle-brackets) "mod+c mod+b") [config-handler/toggle-ui-show-brackets! true]}) (defonce bind! (gobj/get mousetrap "bind")) From f9e933397778d6ae6e3698eac2ea570ab92794d4 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sat, 20 Feb 2021 20:52:19 +0800 Subject: [PATCH 10/28] feat: add :block/path-ref-pages to enable flexible queries --- src/main/frontend/components/block.cljs | 53 ++++++------ src/main/frontend/db/model.cljs | 53 ++++++------ src/main/frontend/db/query_dsl.cljs | 2 +- src/main/frontend/format/block.cljs | 107 +++++++++++++++++------- src/main/frontend/handler/extract.cljs | 6 +- src/main/frontend/handler/file.cljs | 2 +- 6 files changed, 140 insertions(+), 83 deletions(-) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index a429ee4e29..ec1d9d9be0 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -1506,18 +1506,18 @@ (text/build-data-value refs))] [:div.ls-block.flex.flex-col.rounded-sm (cond-> - {:id block-id - :data-refs data-refs - :data-refs-self data-refs-self - :style {:position "relative"} - :class (str uuid - (when dummy? " dummy") - (when (and collapsed? has-child?) " collapsed") - (when pre-block? " pre-block")) - :blockid (str uuid) - :repo repo - :level level - :haschild (str has-child?)} + {:id block-id + :data-refs data-refs + :data-refs-self data-refs-self + :style {:position "relative"} + :class (str uuid + (when dummy? " dummy") + (when (and collapsed? has-child?) " collapsed") + (when pre-block? " pre-block")) + :blockid (str uuid) + :repo repo + :level level + :haschild (str has-child?)} (not slide?) (merge attrs)) @@ -1748,9 +1748,11 @@ (and (seq result) (or only-blocks? blocks-grouped-by-page?)) (->hiccup result (cond-> (assoc config - ;; :editor-box editor/box :custom-query? true - :group-by-page? blocks-grouped-by-page?) + ;; :breadcrumb-show? true + :group-by-page? blocks-grouped-by-page? + ;; :ref? true +) children? (assoc :ref? true)) {:style {:margin-top "0.25rem" @@ -2044,17 +2046,18 @@ (assoc :class "doc-mode")) (if (:group-by-page? config) [:div.flex.flex-col - (for [[page blocks] blocks] - (let [alias? (:page/alias? page) - page (db/entity (:db/id page))] - [:div.my-2 (cond-> {:key (str "page-" (:db/id page))} - (:ref? config) - (assoc :class "color-level px-7 py-2 rounded")) - (ui/foldable - [:div - (page-cp config page) - (when alias? [:span.text-sm.font-medium.opacity-50 " Alias"])] - (blocks-container blocks config))]))] + (let [blocks (sort-by (comp :page/journal-day first) > blocks)] + (for [[page blocks] blocks] + (let [alias? (:page/alias? page) + page (db/entity (:db/id page))] + [:div.my-2 (cond-> {:key (str "page-" (:db/id page))} + (:ref? config) + (assoc :class "color-level px-7 py-2 rounded")) + (ui/foldable + [:div + (page-cp config page) + (when alias? [:span.text-sm.font-medium.opacity-50 " Alias"])] + (blocks-container blocks config))])))] (blocks-container blocks config))]) (comment diff --git a/src/main/frontend/db/model.cljs b/src/main/frontend/db/model.cljs index ca96edfea5..9b2384f2fc 100644 --- a/src/main/frontend/db/model.cljs +++ b/src/main/frontend/db/model.cljs @@ -12,7 +12,6 @@ [clojure.set :as set] [frontend.utf8 :as utf8] [frontend.config :as config] - [frontend.format.block :as block] [cljs.reader :as reader] [cljs-time.core :as t] [cljs-time.coerce :as tc] @@ -38,15 +37,14 @@ ;; (logical OR / 'exists ...' / set union) and two negations, i.e ;; (For all ?g in ?Gs p(?e,?g)) <=> NOT(Exists ?g in ?Gs, such that NOT(p(?e, ?g))) - ;; TODO: benchmark, - - [(matches-all ?e ?a ?vs) - [(first ?vs) ?v0] - [?e ?a ?v0] - (not-join [?e ?vs] - [(identity ?vs) [?v ...]] - (not-join [?e ?v] - [?e ?a ?v]))]]) + ;; [(matches-all ?e ?a ?vs) + ;; [(first ?vs) ?v0] + ;; [?e ?a ?v0] + ;; (not-join [?e ?vs] + ;; [(identity ?vs) [?v ...]] + ;; (not-join [?e ?v] + ;; [?e ?a ?v]))] +]) (defn transact-files-db! ([tx-data] @@ -388,7 +386,7 @@ (defn sort-blocks [blocks] (let [pages-ids (map (comp :db/id :block/page) blocks) - pages (db-utils/pull-many '[:db/id :page/name :page/original-name] pages-ids) + pages (db-utils/pull-many '[:db/id :page/name :page/original-name :page/journal-day] pages-ids) pages-map (reduce (fn [acc p] (assoc acc (:db/id p) p)) {} pages) blocks (map (fn [block] @@ -511,7 +509,8 @@ (defn get-block-parent [repo block-id] (when-let [conn (conn/get-conn repo)] - (d/entity conn [:block/children [:block/uuid block-id]]))) + (when-let [block (d/entity conn [:block/uuid block-id])] + (d/entity conn [:block/children [:block/uuid block-id]])))) ;; non recursive query (defn get-block-parents @@ -605,12 +604,12 @@ (when-let [conn (conn/get-conn repo)] (let [eid (:db/id (db-utils/entity repo [:block/uuid block-uuid]))] (->> (d/q - '[:find ?c - :in $ ?p % - :where (parent ?p ?c)] - conn - eid - rules) + '[:find ?c + :in $ ?p % + :where (parent ?p ?c)] + conn + eid + rules) (apply concat))))) (defn get-block-immediate-children @@ -733,13 +732,19 @@ (db-utils/entity [:block/uuid (uuid page-name)]) (db-utils/entity [:page/name page-name]))) +(defn- heading-block? + [block] + (and + (vector? block) + (= "Heading" (first block)))) + (defn get-page-name [file ast] ;; headline (let [ast (map first ast)] (if (string/includes? file "pages/contents.") "Contents" - (let [first-block (last (first (filter block/heading-block? ast))) + (let [first-block (last (first (filter heading-block? ast))) property-name (when (and (= "Properties" (ffirst ast)) (not (string/blank? (:title (last (first ast)))))) (:title (last (first ast)))) @@ -1259,9 +1264,7 @@ [?b :block/ref-pages ?b-ref] [(not= ?p-ref ?b-ref)] [(contains? ?refs ?p-ref)] - [(contains? ?refs ?b-ref)] - ))] - (conn/get-conn) - rules - page-ids) - ) + [(contains? ?refs ?b-ref)]))] + (conn/get-conn) + rules + page-ids)) diff --git a/src/main/frontend/db/query_dsl.cljs b/src/main/frontend/db/query_dsl.cljs index fbf1f747d5..8f7c12d01b 100644 --- a/src/main/frontend/db/query_dsl.cljs +++ b/src/main/frontend/db/query_dsl.cljs @@ -148,7 +148,7 @@ (string/lower-case))] (when (and (not (string/blank? page-name)) (some? (db-utils/entity repo [:page/name page-name]))) - [['?b :block/ref-pages [:page/name page-name]]])) + [['?b :block/path-ref-pages [:page/name page-name]]])) (contains? #{'and 'or 'not} fe) (let [clauses (->> (map (fn [form] diff --git a/src/main/frontend/format/block.cljs b/src/main/frontend/format/block.cljs index bcccee033f..e8572cf4c6 100644 --- a/src/main/frontend/format/block.cljs +++ b/src/main/frontend/format/block.cljs @@ -9,7 +9,9 @@ [datascript.core :as d] [frontend.date :as date] [frontend.text :as text] - [medley.core :as medley])) + [medley.core :as medley] + [frontend.state :as state] + [frontend.db :as db])) (defn heading-block? [block] @@ -251,9 +253,9 @@ (concat title body)) (let [ref-blocks (remove string/blank? @ref-blocks)] (assoc block :ref-blocks (map - (fn [id] - [:block/uuid (medley/uuid id)]) - ref-blocks))))) + (fn [id] + [:block/uuid (medley/uuid id)]) + ref-blocks))))) (defn update-src-pos-meta! [{:keys [body] :as block}] @@ -286,6 +288,43 @@ (block-keywordize (util/remove-nils block))) blocks)) +(defn with-path-refs + [blocks] + (loop [blocks blocks + acc [] + parents []] + (if (empty? blocks) + acc + (let [block (first blocks) + cur-level (:block/level block) + level-diff (- cur-level + (get (last parents) :block/level 0)) + [path-refs parents] + (cond + (zero? level-diff) ; sibling + (let [path-refs (mapcat :block/ref-pages (drop-last parents)) + parents (conj (vec (butlast parents)) block)] + [path-refs parents]) + + (> level-diff 0) ; child + (let [path-refs (mapcat :block/ref-pages parents)] + [path-refs (conj parents block)]) + + (< level-diff 0) ; new parent + (let [parents (take-while (fn [p] (< (:block/level p) cur-level)) parents) + path-refs (mapcat :block/ref-pages parents)] + [path-refs (conj parents block)]))] + (recur (rest blocks) + (conj acc (assoc block :block/path-ref-pages + (->> path-refs + (concat (:block/ref-pages block)) + (remove string/blank?) + (map string/lower-case) + (distinct) + (map (fn [p] + {:page/name p}))))) + parents))))) + (defn extract-blocks [blocks last-pos encoded-content] (let [blocks @@ -361,29 +400,30 @@ (-> (reverse headings) safe-blocks)))] (let [first-block (first blocks) - first-block-start-pos (get-in first-block [:block/meta :start-pos])] - (if (and - (not (string/blank? encoded-content)) - (or (empty? blocks) - (> first-block-start-pos 1))) - (cons - (merge - (let [content (utf8/substring encoded-content 0 first-block-start-pos) - uuid (d/squuid)] - (-> - {:uuid uuid - :content content - :anchor (str uuid) - :level 2 - :meta {:start-pos 0 - :end-pos (or first-block-start-pos - (utf8/length encoded-content))} - :body (take-while (fn [block] (not (heading-block? block))) blocks) - :pre-block? true} - (block-keywordize))) - (select-keys first-block [:block/file :block/format :block/page])) - blocks) - blocks)))) + first-block-start-pos (get-in first-block [:block/meta :start-pos]) + blocks (if (and + (not (string/blank? encoded-content)) + (or (empty? blocks) + (> first-block-start-pos 1))) + (cons + (merge + (let [content (utf8/substring encoded-content 0 first-block-start-pos) + uuid (d/squuid)] + (-> + {:uuid uuid + :content content + :anchor (str uuid) + :level 2 + :meta {:start-pos 0 + :end-pos (or first-block-start-pos + (utf8/length encoded-content))} + :body (take-while (fn [block] (not (heading-block? block))) blocks) + :pre-block? true} + (block-keywordize))) + (select-keys first-block [:block/file :block/format :block/page])) + blocks) + blocks)] + (with-path-refs blocks)))) (defn- page-with-journal [original-page-name] @@ -408,10 +448,18 @@ content-length (utf8/length encoded-content) blocks (extract-blocks ast content-length encoded-content) ref-pages-atom (atom []) + parent-ref-pages (->> (db/get-block-parent (state/get-current-repo) uuid) + :block/path-ref-pages + (map :db/id)) blocks (doall (map-indexed (fn [idx {:block/keys [ref-pages ref-blocks meta] :as block}] - (let [block (merge + (let [path-ref-pages (->> ref-pages + (remove string/blank?) + (map string/lower-case) + (map (fn [p] [:page/name p])) + (concat parent-ref-pages)) + block (merge block {:block/meta meta :block/marker (get block :block/marker "nil") @@ -421,7 +469,8 @@ :block/page page :block/content (utf8/substring encoded-content (:start-pos meta) - (:end-pos meta))} + (:end-pos meta)) + :block/path-ref-pages path-ref-pages} ;; Preserve the original block id (when (zero? idx) {:block/uuid uuid}) diff --git a/src/main/frontend/handler/extract.cljs b/src/main/frontend/handler/extract.cljs index 507477b72a..e1ad485c34 100644 --- a/src/main/frontend/handler/extract.cljs +++ b/src/main/frontend/handler/extract.cljs @@ -36,7 +36,8 @@ (fn [[page blocks]] (if page (map (fn [block] - (let [block-ref-pages (seq (:block/ref-pages block))] + (let [block-ref-pages (seq (:block/ref-pages block)) + block-path-ref-pages (seq (:block/path-ref-pages block))] (when block-ref-pages (swap! ref-pages set/union (set block-ref-pages))) (-> block @@ -48,7 +49,8 @@ :block/ref-pages (mapv (fn [page] (block/page-with-journal page)) - block-ref-pages))))) + block-ref-pages) + :block/path-ref-pages block-path-ref-pages)))) blocks))) (remove nil? pages))) pages (doall diff --git a/src/main/frontend/handler/file.cljs b/src/main/frontend/handler/file.cljs index b649459fbe..0f37f3fca9 100644 --- a/src/main/frontend/handler/file.cljs +++ b/src/main/frontend/handler/file.cljs @@ -192,7 +192,7 @@ (history/add-history! repo [[path original-content content]]))) (fn [error] (println "Write file failed, path: " path ", content: " content) - (js/console.error error))))) + (log/error :write/failed error))))) (defn create! ([path] From 74f40e0f8f8400b104d1e0a24dd961ec73798fdc Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sat, 20 Feb 2021 21:03:41 +0800 Subject: [PATCH 11/28] fix: CI --- src/test/frontend/db/query_dsl_test.cljs | 32 ++++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/test/frontend/db/query_dsl_test.cljs b/src/test/frontend/db/query_dsl_test.cljs index 3c8744a3f5..338b011a91 100644 --- a/src/test/frontend/db/query_dsl_test.cljs +++ b/src/test/frontend/db/query_dsl_test.cljs @@ -135,11 +135,11 @@ parent: child page 2 (testing "Single page query" (are [x y] (= (q-count x) y) "[[page 1]]" - {:query '[[?b :block/ref-pages [:page/name "page 1"]]] + {:query '[[?b :block/path-ref-pages [:page/name "page 1"]]] :count 6} "[[page 2]]" - {:query '[[?b :block/ref-pages [:page/name "page 2"]]] + {:query '[[?b :block/path-ref-pages [:page/name "page 2"]]] :count 4})) (testing "Block properties query" @@ -326,29 +326,29 @@ parent: child page 2 (testing "AND queries" (are [x y] (= (q-count x) y) "(and [[tag1]] [[page 2]])" - {:query '([?b :block/ref-pages [:page/name "tag1"]] - [?b :block/ref-pages [:page/name "page 2"]]) + {:query '([?b :block/path-ref-pages [:page/name "tag1"]] + [?b :block/path-ref-pages [:page/name "page 2"]]) :count 1}) (are [x y] (= (q-count x) y) "(and [[tag1]] [[page 2]])" - {:query '([?b :block/ref-pages [:page/name "tag1"]] - [?b :block/ref-pages [:page/name "page 2"]]) + {:query '([?b :block/path-ref-pages [:page/name "tag1"]] + [?b :block/path-ref-pages [:page/name "page 2"]]) :count 1})) (testing "OR queries" (are [x y] (= (q-count x) y) "(or [[tag1]] [[page 2]])" {:query '(or - (and [?b :block/ref-pages [:page/name "tag1"]]) - (and [?b :block/ref-pages [:page/name "page 2"]])) + (and [?b :block/path-ref-pages [:page/name "tag1"]]) + (and [?b :block/path-ref-pages [:page/name "page 2"]])) :count 4})) (testing "NOT queries" (are [x y] (= (q-count x) y) "(not [[page 1]])" {:query '([?b :block/uuid] - (not [?b :block/ref-pages [:page/name "page 1"]])) + (not [?b :block/path-ref-pages [:page/name "page 1"]])) :count 8})) (testing "Between query" @@ -374,15 +374,15 @@ parent: child page 2 {:query '([?b :block/uuid] [?b :block/marker ?marker] [(contains? #{"DONE"} ?marker)] - (not [?b :block/ref-pages [:page/name "page 1"]])) + (not [?b :block/path-ref-pages [:page/name "page 1"]])) :count 0}) (are [x y] (= (q-count x) y) "(and (todo now later) (or [[page 1]] [[page 2]]))" {:query '([?b :block/marker ?marker] [(contains? #{"NOW" "LATER"} ?marker)] - (or (and [?b :block/ref-pages [:page/name "page 1"]]) - (and [?b :block/ref-pages [:page/name "page 2"]]))) + (or (and [?b :block/path-ref-pages [:page/name "page 1"]]) + (and [?b :block/path-ref-pages [:page/name "page 2"]]))) :count 3}) (are [x y] (= (q-count x) y) @@ -392,8 +392,8 @@ parent: child page 2 [?b :block/marker ?marker] [(contains? #{"NOW" "LATER"} ?marker)] (or - (and [?b :block/ref-pages [:page/name "page 1"]]) - (and [?b :block/ref-pages [:page/name "page 2"]])))) + (and [?b :block/path-ref-pages [:page/name "page 1"]]) + (and [?b :block/path-ref-pages [:page/name "page 2"]])))) :count 11}) ;; FIXME: not working @@ -411,8 +411,8 @@ parent: child page 2 [?b :block/marker ?marker] [(contains? #{"NOW" "LATER" "DONE"} ?marker)] (or - (and [?b :block/ref-pages [:page/name "page 1"]]) - (and (not [?b :block/ref-pages [:page/name "page 1"]])))) + (and [?b :block/path-ref-pages [:page/name "page 1"]]) + (and (not [?b :block/path-ref-pages [:page/name "page 1"]])))) :count 5})) (testing "sort-by (created_at defaults to desc)" From 1000b72a6660dcc3a44b0aa06fa8e915a030b573 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sat, 20 Feb 2021 21:17:06 +0800 Subject: [PATCH 12/28] chore: bump version --- src/main/frontend/components/repo.cljs | 2 +- src/main/frontend/version.cljs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/frontend/components/repo.cljs b/src/main/frontend/components/repo.cljs index 90e0c4f61f..434f3d254e 100644 --- a/src/main/frontend/components/repo.cljs +++ b/src/main/frontend/components/repo.cljs @@ -87,7 +87,7 @@ (when-not (= repo config/local-repo) (if (and nfs-repo? (nfs-handler/supported?)) (let [syncing? (state/sub :graph/syncing?)] - [:div.ml-2.mr-1.opacity-70.hover:opacity-100 {:class (if syncing? "loader" "initial")} + [:div.ml-2.mr-1.opacity-70.hover:opacity-100.refresh {:class (if syncing? "loader" "initial")} [:a {:on-click #(nfs-handler/refresh! repo repo-handler/create-today-journal!) diff --git a/src/main/frontend/version.cljs b/src/main/frontend/version.cljs index a11a3cc224..d0ba13ccb7 100644 --- a/src/main/frontend/version.cljs +++ b/src/main/frontend/version.cljs @@ -1,3 +1,3 @@ (ns frontend.version) -(defonce version "0.0.8") +(defonce version "0.0.9") From 2dc42d70fe012bc4791b437153baa95d59e1132b Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sat, 20 Feb 2021 21:18:54 +0800 Subject: [PATCH 13/28] chore: bold h1 --- resources/css/common.css | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/css/common.css b/resources/css/common.css index dd0c242e51..7ab63e3676 100644 --- a/resources/css/common.css +++ b/resources/css/common.css @@ -571,6 +571,7 @@ h1.title { margin-bottom: 1.5rem; color: var(--ls-title-text-color, #222); font-size: var(--ls-page-title-size, 36px); + font-weight: 700; } .block-highlight, From c1e7b4e5a536e90b4141e7544abd47761baa76fd Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sun, 21 Feb 2021 15:52:55 +0800 Subject: [PATCH 14/28] feat: queries support dynamic variables too Resolved #1340 --- src/main/frontend/components/block.cljs | 7 ++--- src/main/frontend/components/editor.cljs | 3 ++- src/main/frontend/db/query_dsl.cljs | 8 +++--- src/main/frontend/handler/editor.cljs | 28 ------------------- src/main/frontend/template.cljs | 34 ++++++++++++++++++++++++ 5 files changed, 45 insertions(+), 35 deletions(-) create mode 100644 src/main/frontend/template.cljs diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index ec1d9d9be0..09a523db05 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -47,7 +47,8 @@ [reitit.frontend.easy :as rfe] [frontend.commands :as commands] [lambdaisland.glogi :as log] - [frontend.context.i18n :as i18n])) + [frontend.context.i18n :as i18n] + [frontend.template :as template])) ;; TODO: remove rum/with-context because it'll make reactive queries not working @@ -841,12 +842,12 @@ (block/macro-subs macro-content arguments) macro-content) macro-content (when macro-content - (editor-handler/resolve-dynamic-template! macro-content))] + (template/resolve-dynamic-template! macro-content))] (render-macro config name arguments macro-content format)) (when-let [macro-txt (macro->text name arguments)] (let [macro-txt (when macro-txt - (editor-handler/resolve-dynamic-template! macro-txt)) + (template/resolve-dynamic-template! macro-txt)) format (get-in config [:block :block/format] :markdown)] (render-macro config name arguments macro-txt format)))))) diff --git a/src/main/frontend/components/editor.cljs b/src/main/frontend/components/editor.cljs index bc316e1104..ce9da50025 100644 --- a/src/main/frontend/components/editor.cljs +++ b/src/main/frontend/components/editor.cljs @@ -32,6 +32,7 @@ [medley.core :as medley] [cljs-drag-n-drop.core :as dnd] [frontend.text :as text] + [frontend.template :as template] ["/frontend/utils" :as utils])) (rum/defc commands < rum/reactive @@ -228,7 +229,7 @@ content (if (string/includes? (string/trim edit-content) "\n") content (text/remove-level-spaces content format)) - content (editor-handler/resolve-dynamic-template! content)] + content (template/resolve-dynamic-template! content)] (state/set-editor-show-template-search! false) (editor-handler/insert-command! id content diff --git a/src/main/frontend/db/query_dsl.cljs b/src/main/frontend/db/query_dsl.cljs index 8f7c12d01b..109103bdb2 100644 --- a/src/main/frontend/db/query_dsl.cljs +++ b/src/main/frontend/db/query_dsl.cljs @@ -14,7 +14,8 @@ [medley.core :as medley] [clojure.walk :as walk] [clojure.core] - [clojure.set :as set])) + [clojure.set :as set] + [frontend.template :as template])) ;; Query fields: @@ -377,8 +378,9 @@ (defn query [repo query-string] - (when query-string - (let [{:keys [query sort-by blocks?]} (parse repo query-string)] + (when (string? query-string) + (let [query-string (template/resolve-dynamic-template! query-string) + {:keys [query sort-by blocks?]} (parse repo query-string)] (when query (let [query (query-wrapper query blocks?)] (query-custom/react-query repo diff --git a/src/main/frontend/handler/editor.cljs b/src/main/frontend/handler/editor.cljs index 094a3e495b..079668a4b5 100644 --- a/src/main/frontend/handler/editor.cljs +++ b/src/main/frontend/handler/editor.cljs @@ -2257,31 +2257,3 @@ value (:block/content block) new-value (string/replace value full_text new-full-text)] (save-block-aux! block new-value (:block/format block) {}))) - -(defn variable-rules - [] - {"today" (util/format "[[%s]]" (date/today)) - "yesterday" (util/format "[[%s]]" (date/yesterday)) - "tomorrow" (util/format "[[%s]]" (date/tomorrow)) - "time" (date/get-current-time) - "current page" (util/format "[[%s]]" - (or (state/get-current-page) - (date/today)))}) - -;; TODO: programmable -;; context information, date, current page -(defn resolve-dynamic-template! - [content] - (string/replace content #"<%([^%].*?)%>" - (fn [[_ match]] - (let [match (string/trim match)] - (cond - (string/blank? match) - "" - (get (variable-rules) (string/lower-case match)) - (get (variable-rules) (string/lower-case match)) - :else - (if-let [nld (date/nld-parse match)] - (let [date (tc/to-local-date-time nld)] - (util/format "[[%s]]" (date/journal-name date))) - match)))))) diff --git a/src/main/frontend/template.cljs b/src/main/frontend/template.cljs new file mode 100644 index 0000000000..96e3dd82ef --- /dev/null +++ b/src/main/frontend/template.cljs @@ -0,0 +1,34 @@ +(ns frontend.template + (:require [frontend.util :as util :refer-macros [profile]] + [frontend.date :as date] + [clojure.string :as string] + [cljs-time.coerce :as tc] + [frontend.state :as state])) + +(defn- variable-rules + [] + {"today" (util/format "[[%s]]" (date/today)) + "yesterday" (util/format "[[%s]]" (date/yesterday)) + "tomorrow" (util/format "[[%s]]" (date/tomorrow)) + "time" (date/get-current-time) + "current page" (util/format "[[%s]]" + (or (state/get-current-page) + (date/today)))}) + +;; TODO: programmable +;; context information, date, current page +(defn resolve-dynamic-template! + [content] + (string/replace content #"<%([^%].*?)%>" + (fn [[_ match]] + (let [match (string/trim match)] + (cond + (string/blank? match) + "" + (get (variable-rules) (string/lower-case match)) + (get (variable-rules) (string/lower-case match)) + :else + (if-let [nld (date/nld-parse match)] + (let [date (tc/to-local-date-time nld)] + (util/format "[[%s]]" (date/journal-name date))) + match)))))) From 88d1fa8b911102e8cca8db2c4b3537a01ca46df5 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sun, 21 Feb 2021 17:31:53 +0800 Subject: [PATCH 15/28] fix: don't treat file link as pages Resolved #1334 --- src/main/frontend/format/block.cljs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/frontend/format/block.cljs b/src/main/frontend/format/block.cljs index e8572cf4c6..7b58c516e4 100644 --- a/src/main/frontend/format/block.cljs +++ b/src/main/frontend/format/block.cljs @@ -36,10 +36,12 @@ (= typ "Search") ;; FIXME: alert error (not (contains? #{\# \* \/ \[} (first (second (:url (second block)))))) - (let [page (second (:url (second block)))] - (when (and (not (util/starts-with? page "http")) - (not (util/starts-with? page "file")) - (not (string/ends-with? page ".html"))) + (let [page (second (:url (second block))) + ext (some-> (util/get-file-ext page) keyword)] + (when (and (not (util/starts-with? page "http:")) + (not (util/starts-with? page "https:")) + (not (util/starts-with? page "file:")) + (not (contains? (config/supported-formats) ext))) page))) (and From fdd153882062c3db26c17c1b28bcf2ba3b6d5d2f Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sun, 21 Feb 2021 21:54:46 +0800 Subject: [PATCH 16/28] fix: use fuse.js for both fuzzy search and full-text search --- package.json | 3 +- src/main/frontend/components/search.cljs | 17 ++++- src/main/frontend/handler/search.cljs | 10 +-- src/main/frontend/search.cljs | 95 ++++++++++-------------- src/main/frontend/utils.js | 10 --- yarn.lock | 11 +-- 6 files changed, 64 insertions(+), 82 deletions(-) diff --git a/package.json b/package.json index b234c9968a..86576fd2e3 100644 --- a/package.json +++ b/package.json @@ -62,9 +62,8 @@ "diff": "5.0.0", "diff-match-patch": "^1.0.5", "electron": "^11.2.0", - "flexsearch": "git+https://github.com/logseq/flexsearch", "fs": "^0.0.1-security", - "fuzzysort": "git+https://github.com/getstation/fuzzysort#a66f5813825d2415b606cc69129070c4eb612ae2", + "fuse.js": "^6.4.6", "gulp-cached": "^1.1.1", "ignore": "^5.1.8", "jszip": "^3.5.0", diff --git a/src/main/frontend/components/search.cljs b/src/main/frontend/components/search.cljs index b8738a43fe..e8c99494f6 100644 --- a/src/main/frontend/components/search.cljs +++ b/src/main/frontend/components/search.cljs @@ -127,13 +127,17 @@ (rum/defc search-auto-complete [{:keys [pages files blocks]} search-q] (rum/with-context [[t] i18n/*tongue-context*] - (let [new-page [{:type :new-page}] - new-file (when-let [ext (util/get-file-ext search-q)] + (let [new-file (when-let [ext (util/get-file-ext search-q)] (when (contains? config/mldoc-support-formats (keyword (string/lower-case ext))) [{:type :new-file}])) pages (map (fn [page] {:type :page :data page}) pages) files (map (fn [file] {:type :file :data file}) files) blocks (map (fn [block] {:type :block :data block}) blocks) + new-page (if (and (seq pages) + (= (string/lower-case search-q) + (string/lower-case (:data (first pages))))) + [] + [{:type :new-page}]) result (if config/publishing? (concat pages files blocks) (concat new-page pages new-file files blocks))] @@ -221,6 +225,8 @@ nil))})]))) +(defonce search-timeout (atom nil)) + (rum/defc search < rum/reactive (mixins/event-mixin (fn [state] @@ -253,12 +259,17 @@ :auto-complete (if (util/chrome?) "chrome-off" "off") ; off not working here :default-value "" :on-change (fn [e] + (when @search-timeout + (js/clearTimeout @search-timeout)) (let [value (util/evalue e)] (if (string/blank? value) (search-handler/clear-search!) (do (state/set-q! value) - (search-handler/search value)))))}] + (reset! search-timeout + (js/setTimeout + #(search-handler/search value) + 500))))))}] (when-not (string/blank? search-q) (ui/css-transition {:class-names "fade" diff --git a/src/main/frontend/handler/search.cljs b/src/main/frontend/handler/search.cljs index 09e9430ac6..04e37a7350 100644 --- a/src/main/frontend/handler/search.cljs +++ b/src/main/frontend/handler/search.cljs @@ -8,12 +8,10 @@ (defn search [q] - ;; TODO: separate rendering for blocks - (p/let [blocks-result (search/block-search q 10)] - (swap! state/state assoc :search/result - {:pages (search/page-search q) - :files (search/file-search q) - :blocks blocks-result}))) + (swap! state/state assoc :search/result + {:pages (search/page-search q) + :files (search/file-search q) + :blocks (search/block-search q 10)})) (defn clear-search! [] diff --git a/src/main/frontend/search.cljs b/src/main/frontend/search.cljs index 9852b4be14..da055f4af3 100644 --- a/src/main/frontend/search.cljs +++ b/src/main/frontend/search.cljs @@ -11,24 +11,14 @@ [frontend.text :as text] [cljs-bean.core :as bean] [goog.object :as gobj] - ["fuzzysort" :as fuzzy] - ["flexsearch" :as flexsearch] + ["fuse.js" :as fuse] [medley.core :as medley] [promesa.core :as p] ["/frontend/utils" :as utils])) -(def fuzzy-go (gobj/get fuzzy "go")) -(defonce prepare (gobj/get fuzzy "prepare")) -(defonce highlight (gobj/get fuzzy "highlight")) - (defn go - [q indice-type indice opts] - (case indice-type - :page - (fuzzy-go q indice opts) - - :block - (.search indice q opts))) + [q indice opts] + (.search indice q opts)) (defn block->index [{:block/keys [uuid content format] :as block}] @@ -38,13 +28,6 @@ :uuid (str uuid) :content result})) -(def default-block-indice (flexsearch. - (clj->js - {:encode "icase" - :tokenize utils/searchTokenize - :doc {:id "id" - :field ["content"]} - :async true}))) (defn make-blocks-indice! [] (when-let [repo (state/get-current-repo)] @@ -52,9 +35,10 @@ (map block->index) (remove nil?) (bean/->js)) - indice default-block-indice] - (p/let [result (.add indice blocks)] - (swap! indices assoc-in [repo :blocks] indice)) + indice (fuse. blocks + (clj->js {:keys ["uuid" "content"] + }))] + (swap! indices assoc-in [repo :blocks] indice) indice))) (defn make-pages-indice! @@ -63,9 +47,11 @@ (let [pages (->> (db/get-pages (state/get-current-repo)) (remove string/blank?) (map (fn [p] {:name p})) - (bean/->js))] - (swap! indices assoc-in [repo :pages] pages) - pages))) + (bean/->js)) + indice (fuse. pages + (clj->js {:keys ["name"]}))] + (swap! indices assoc-in [repo :pages] indice) + indice))) ;; TODO: persist indices to indexeddb, it'll be better if the future db ;; can has the direct fuzzy search support. @@ -82,7 +68,7 @@ (defn reset-indice! [repo] (swap! indices assoc repo {:pages #js [] - :blocks default-block-indice})) + :blocks #js []})) ;; Copied from https://gist.github.com/vaughnd/5099299 (defn str-len-distance @@ -162,14 +148,15 @@ (when-not (string/blank? q) (let [indice (or (get-in @indices [repo :blocks]) (make-blocks-indice!))] - (p/let [result (go q :block indice (clj->js {:limit limit})) - result (bean/->clj result)] + (let [result (go q indice (clj->js {:limit limit})) + result (bean/->clj result)] (->> (map - (fn [{:keys [content uuid] :as block}] - {:block/uuid uuid - :block/content content - :block/page (:block/page (db/entity [:block/uuid (medley/uuid (str uuid))]))}) + (fn [{:keys [item] :as block}] + (let [{:keys [content uuid]} item] + {:block/uuid uuid + :block/content content + :block/page (:block/page (db/entity [:block/uuid (medley/uuid (str uuid))]))})) result) (remove nil?)))))))))) @@ -183,15 +170,12 @@ (when-not (string/blank? q) (let [indice (or (get-in @indices [repo :pages]) (make-pages-indice!)) - result (->> (go q :page indice (clj->js {:limit limit - :key "name" - :allowTypo false - :threshold -10000})) + result (->> (go q indice {}) (bean/->clj))] ;; TODO: add indexes for highlights (->> (map - (fn [{:keys [obj]}] - (:name obj)) + (fn [{:keys [item]}] + (:name item)) result) (remove nil?)))))))) @@ -234,19 +218,20 @@ pages-to-add (->> (filter (fn [page] (contains? pages-to-add-set (:db/id page))) pages-result) (map (fn [p] {:name (or (:page/original-name p) - (:page/name p))})) - (set)) + (:page/name p))}))) pages-to-remove-set (->> (remove :added pages) - (map :v) - (set))] + (map :v))] (swap! search-db/indices update-in [repo :pages] - (fn [pages] - (let [pages (or pages (array)) - pages (.filter pages (fn [page] - (when-let [page-name (gobj/get page "name")] - (not (contains? pages-to-remove-set - (string/lower-case page-name))))))] - (.concat pages (bean/->js pages-to-add))))))) + (fn [indice] + (when indice + (doseq [page-name pages-to-remove-set] + (.remove indice + (fn [page] + (= page-name (gobj/get page "name"))))) + (when (seq pages-to-add) + (doseq [page pages-to-add] + (.add indice (bean/->js page))))) + indice)))) (when (seq blocks) (let [blocks-result (db/pull-many '[:db/id :block/uuid :block/format :block/content] (set (map :e blocks))) blocks-to-add-set (->> (filter :added blocks) @@ -255,8 +240,7 @@ blocks-to-add (->> (filter (fn [block] (contains? blocks-to-add-set (:db/id block))) blocks-result) - (map block->index) - (set)) + (map block->index)) blocks-to-remove-set (->> (remove :added blocks) (map :e) (set))] @@ -264,7 +248,10 @@ (fn [indice] (when indice (doseq [block-id blocks-to-remove-set] - (.remove indice #js {:id block-id})) + (.remove indice + (fn [block] + (= block-id (gobj/get block "id"))))) (when (seq blocks-to-add) - (.add indice (bean/->js blocks-to-add)))) + (doseq [block blocks-to-add] + (.add indice (bean/->js block))))) indice)))))))) diff --git a/src/main/frontend/utils.js b/src/main/frontend/utils.js index 30539fe29d..1a158e3cde 100644 --- a/src/main/frontend/utils.js +++ b/src/main/frontend/utils.js @@ -204,13 +204,3 @@ export const win32 = path => { // UNC paths are always absolute return Boolean(result[2] || isUnc); }; - -export const searchTokenize = str => { - let ascii_words = str.split(/\W+/); - let non_ascii_str = str.replace(/[\x00-\x7F]/g, ''); - if (non_ascii_str == '') { - return ascii_words; - } else { - return ascii_words.concat(non_ascii_str.split('')).filter(e => !!e); - } -}; diff --git a/yarn.lock b/yarn.lock index 1f447e3bf8..38aee71a75 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2324,10 +2324,6 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== -"flexsearch@git+https://github.com/logseq/flexsearch": - version "0.6.32" - resolved "git+https://github.com/logseq/flexsearch#0a04c518ef0a9b3c76e18da893642835f98d5616" - flush-write-stream@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" @@ -2415,9 +2411,10 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -"fuzzysort@git+https://github.com/getstation/fuzzysort#a66f5813825d2415b606cc69129070c4eb612ae2": - version "1.1.4" - resolved "git+https://github.com/getstation/fuzzysort#a66f5813825d2415b606cc69129070c4eb612ae2" +fuse.js@^6.4.6: + version "6.4.6" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.4.6.tgz#62f216c110e5aa22486aff20be7896d19a059b79" + integrity sha512-/gYxR/0VpXmWSfZOIPS3rWwU8SHgsRTwWuXhyb2O6s7aRuVtHtxCkR33bNYu3wyLyNx/Wpv0vU7FZy8Vj53VNw== gensync@^1.0.0-beta.1: version "1.0.0-beta.2" From b9fd0ef7aba93eab9dd376092fbd62aa6b66e7d8 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sun, 21 Feb 2021 22:16:21 +0800 Subject: [PATCH 17/28] fix: click can't create block reference Resolved #1337 --- src/main/frontend/components/editor.cljs | 6 ++---- src/main/frontend/handler/editor.cljs | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/frontend/components/editor.cljs b/src/main/frontend/components/editor.cljs index ce9da50025..82434256fb 100644 --- a/src/main/frontend/components/editor.cljs +++ b/src/main/frontend/components/editor.cljs @@ -150,10 +150,8 @@ @editor-handler/*selected-text (when (> (count edit-content) current-pos) (subs edit-content pos current-pos))) - _ (p/let [matched-blocks (when-not (string/blank? q) - (editor-handler/get-matched-blocks q (:block/uuid edit-block)))] - (state/set-search-result! matched-blocks)) - matched-blocks (state/sub :search/result)] + matched-blocks (when-not (string/blank? q) + (editor-handler/get-matched-blocks q (:block/uuid edit-block)))] (when input (let [chosen-handler (fn [chosen _click?] (state/set-editor-show-block-search! false) diff --git a/src/main/frontend/handler/editor.cljs b/src/main/frontend/handler/editor.cljs index 079668a4b5..75687a429b 100644 --- a/src/main/frontend/handler/editor.cljs +++ b/src/main/frontend/handler/editor.cljs @@ -1776,7 +1776,7 @@ 99) (map (comp str :block/uuid)))) current-and-parents (set/union #{(str (:block/uuid current-block))} block-parents)] - (p/let [result (search/block-search q 10)] + (let [result (search/block-search q 10)] (remove (fn [h] (contains? current-and-parents (:block/uuid h))) From dff669b903fbf15ea1f444d8d2b996e9a03d91c9 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sun, 21 Feb 2021 22:40:14 +0800 Subject: [PATCH 18/28] fix: don't show new page when search result is not ready --- src/main/frontend/components/search.cljs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/frontend/components/search.cljs b/src/main/frontend/components/search.cljs index e8c99494f6..5d8bd5b374 100644 --- a/src/main/frontend/components/search.cljs +++ b/src/main/frontend/components/search.cljs @@ -124,8 +124,10 @@ (when-let [input (gdom/getElement "search_field")] (.blur input))) +(defonce search-timeout (atom nil)) + (rum/defc search-auto-complete - [{:keys [pages files blocks]} search-q] + [{:keys [pages files blocks] :as result} search-q] (rum/with-context [[t] i18n/*tongue-context*] (let [new-file (when-let [ext (util/get-file-ext search-q)] (when (contains? config/mldoc-support-formats (keyword (string/lower-case ext))) @@ -133,9 +135,11 @@ pages (map (fn [page] {:type :page :data page}) pages) files (map (fn [file] {:type :file :data file}) files) blocks (map (fn [block] {:type :block :data block}) blocks) - new-page (if (and (seq pages) - (= (string/lower-case search-q) - (string/lower-case (:data (first pages))))) + new-page (if (or + (and (seq pages) + (= (string/lower-case search-q) + (string/lower-case (:data (first pages))))) + (nil? result)) [] [{:type :new-page}]) result (if config/publishing? @@ -225,8 +229,6 @@ nil))})]))) -(defonce search-timeout (atom nil)) - (rum/defc search < rum/reactive (mixins/event-mixin (fn [state] From 3ff3d133896629b608e941cb25fa94c1a9632dab Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 22 Feb 2021 13:28:55 +0800 Subject: [PATCH 19/28] fix: limit page searchs and make it more accurate --- src/main/frontend/search.cljs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/frontend/search.cljs b/src/main/frontend/search.cljs index da055f4af3..b2b79f0533 100644 --- a/src/main/frontend/search.cljs +++ b/src/main/frontend/search.cljs @@ -49,7 +49,8 @@ (map (fn [p] {:name p})) (bean/->js)) indice (fuse. pages - (clj->js {:keys ["name"]}))] + (clj->js {:keys ["name"] + :threshold 0.4}))] (swap! indices assoc-in [repo :pages] indice) indice))) @@ -170,7 +171,7 @@ (when-not (string/blank? q) (let [indice (or (get-in @indices [repo :pages]) (make-pages-indice!)) - result (->> (go q indice {}) + result (->> (go q indice (clj->js {:limit limit})) (bean/->clj))] ;; TODO: add indexes for highlights (->> (map From aa724433e9979917d5aeb9c185cf20e7c105ba90 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 22 Feb 2021 14:23:09 +0800 Subject: [PATCH 20/28] fix: page routes --- src/main/frontend/components/sidebar.cljs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/frontend/components/sidebar.cljs b/src/main/frontend/components/sidebar.cljs index bf0b962275..6fae317fa0 100644 --- a/src/main/frontend/components/sidebar.cljs +++ b/src/main/frontend/components/sidebar.cljs @@ -55,16 +55,16 @@ left-sidebar? (state/sub :ui/left-sidebar-open?)] (when left-sidebar? [:nav.flex-1.left-sidebar-inner - (nav-item "Journals" "/" + (nav-item "Journals" "#/" "M3 12l9-9 9 9M5 10v10a1 1 0 001 1h3a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1h3a1 1 0 001-1V10M9 21h6" (active? :home) close-modal-fn) - (nav-item "All Pages" "/all-pages" + (nav-item "All Pages" "#/all-pages" "M6 2h9a1 1 0 0 1 .7.3l4 4a1 1 0 0 1 .3.7v13a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4c0-1.1.9-2 2-2zm9 2.41V7h2.59L15 4.41zM18 9h-3a2 2 0 0 1-2-2V4H6v16h12V9zm-2 7a1 1 0 0 1-1 1H9a1 1 0 0 1 0-2h6a1 1 0 0 1 1 1zm0-4a1 1 0 0 1-1 1H9a1 1 0 0 1 0-2h6a1 1 0 0 1 1 1zm-5-4a1 1 0 0 1-1 1H9a1 1 0 1 1 0-2h1a1 1 0 0 1 1 1z" (active? :all-pages) close-modal-fn) (when-not config/publishing? - (nav-item "All Files" "/all-files" + (nav-item "All Files" "#/all-files" "M3 7V17C3 18.1046 3.89543 19 5 19H19C20.1046 19 21 18.1046 21 17V9C21 7.89543 20.1046 7 19 7H13L11 5H5C3.89543 5 3 5.89543 3 7Z" (active? :all-files) close-modal-fn)) From abb93539cb5c71f7b3b93685459c901085886924 Mon Sep 17 00:00:00 2001 From: charlie Date: Mon, 22 Feb 2021 14:48:28 +0800 Subject: [PATCH 21/28] fix(desktop): #1306 --- src/electron/electron/core.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/electron/electron/core.cljs b/src/electron/electron/core.cljs index e083c3e951..0eede0976c 100644 --- a/src/electron/electron/core.cljs +++ b/src/electron/electron/core.cljs @@ -14,7 +14,7 @@ (defonce *teardown-fn (volatile! nil)) ;; Handle creating/removing shortcuts on Windows when installing/uninstalling. -;(when (js/require "electron-squirrel-startup") (.quit app)) +(when (js/require "electron-squirrel-startup") (.quit app)) (defn create-main-window "create main app window" From 3104ecde0ca596dd5417431d0d03e29445a301b4 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 22 Feb 2021 15:42:22 +0800 Subject: [PATCH 22/28] enhance: enable mod+shift+z to redo --- src/main/frontend/keyboards.cljs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/frontend/keyboards.cljs b/src/main/frontend/keyboards.cljs index f1b1d57d57..91e59f8ab3 100644 --- a/src/main/frontend/keyboards.cljs +++ b/src/main/frontend/keyboards.cljs @@ -54,6 +54,7 @@ (or (shortcut :editor/undo) "mod+z") [history-handler/undo! true] (or (shortcut :editor/redo) "mod+y") [history-handler/redo! true] + (or (shortcut :editor/redo) "mod+shift+z") [history-handler/redo! true] (or (shortcut :go/search) "mod+u") [route-handler/go-to-search! true] (or (shortcut :go/journals) (if util/mac? "mod+j" "alt+j")) [route-handler/go-to-journals! true] (or (shortcut :editor/zoom-in) From 12e23c932ad6a35e8ba7d2809d4dfb52027df8c6 Mon Sep 17 00:00:00 2001 From: charlie Date: Mon, 22 Feb 2021 16:59:57 +0800 Subject: [PATCH 23/28] fix(ui): Page title show null #1343 --- src/main/frontend/components/sidebar.cljs | 8 ++++++-- src/main/frontend/components/theme.cljs | 12 +++++++++++- src/main/frontend/handler/route.cljs | 15 ++++++++++----- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/main/frontend/components/sidebar.cljs b/src/main/frontend/components/sidebar.cljs index 6fae317fa0..5e125f90f8 100644 --- a/src/main/frontend/components/sidebar.cljs +++ b/src/main/frontend/components/sidebar.cljs @@ -297,6 +297,7 @@ (state/set-left-sidebar-open! false)) me (state/sub :me) current-repo (state/sub :git/current-repo) + granted? (state/sub [:nfs/user-granted? (state/get-current-repo)]) theme (state/sub :ui/theme) white? (= "white" (state/sub :ui/theme)) sidebar-open? (state/sub :ui/sidebar-open?) @@ -310,8 +311,11 @@ default-home (get-default-home-if-valid)] (rum/with-context [[t] i18n/*tongue-context*] (theme/container - {:theme theme - :on-click editor-handler/unhighlight-block!} + {:theme theme + :route route-match + :nfs-granted? granted? + :db-restoring? db-restoring? + :on-click editor-handler/unhighlight-block!} [:div.theme-inner (sidebar-mobile-sidebar diff --git a/src/main/frontend/components/theme.cljs b/src/main/frontend/components/theme.cljs index ff70113f76..07ccd9408c 100644 --- a/src/main/frontend/components/theme.cljs +++ b/src/main/frontend/components/theme.cljs @@ -1,11 +1,12 @@ (ns frontend.components.theme (:require [rum.core :as rum] [frontend.util :as util] + [frontend.handler.route :as route-handler] [frontend.version :refer [version]] [frontend.components.svg :as svg])) (rum/defc container - [{:keys [theme on-click] :as props} child] + [{:keys [route theme on-click nfs-granted? db-restoring?] :as props} child] (rum/use-effect! #(let [doc js/document.documentElement cls (.-classList doc)] @@ -14,6 +15,15 @@ (.add cls "dark") (.remove cls "dark"))) [theme]) + + (rum/use-effect! + #(let [db-restored? (false? db-restoring?)] + (if db-restoring? + (util/set-title! "Loading") + (when (or nfs-granted? db-restored?) + (route-handler/update-page-title! route)))) + [nfs-granted? db-restoring? route]) + [:div {:class (str theme "-theme") :on-click on-click} diff --git a/src/main/frontend/handler/route.cljs b/src/main/frontend/handler/route.cljs index 1f0770f9af..148fdacb9c 100644 --- a/src/main/frontend/handler/route.cljs +++ b/src/main/frontend/handler/route.cljs @@ -58,7 +58,8 @@ (let [page (util/url-decode name) page (db/pull [:page/name (string/lower-case page)])] (or (:page/original-name page) - (:page/name page))))) + (:page/name page) + "Logseq")))) :tag (str "#" (util/url-decode (:name path-params))) :diff @@ -71,14 +72,18 @@ "Import data into Logseq" "Logseq")) +(defn update-page-title! + [route] + (let [{:keys [data path-params]} route + title (get-title (:name data) path-params)] + (util/set-title! title))) + (defn set-route-match! [route] (let [route route] (swap! state/state assoc :route-match route) - (let [{:keys [data path-params]} route - title (get-title (:name data) path-params)] - (util/set-title! title) - (util/scroll-to-top)))) + (update-page-title! route) + (util/scroll-to-top))) (defn jump-to-anchor! [anchor-text] From c54f4ba3a996ce5c796c723af4a211563044e370 Mon Sep 17 00:00:00 2001 From: charlie Date: Mon, 22 Feb 2021 18:09:13 +0800 Subject: [PATCH 24/28] fix(desktop): Desktop client cannot delete files #1346 --- src/main/frontend/handler/file.cljs | 4 ++-- src/main/frontend/handler/page.cljs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/frontend/handler/file.cljs b/src/main/frontend/handler/file.cljs index 0f37f3fca9..252ab78e82 100644 --- a/src/main/frontend/handler/file.cljs +++ b/src/main/frontend/handler/file.cljs @@ -278,7 +278,7 @@ [repo file] (when-not (string/blank? file) (-> - (p/let [_ (git/remove-file repo file) + (p/let [_ (or (config/local-db? repo) (git/remove-file repo file)) result (fs/unlink! (config/get-repo-path repo file) nil)] (when-let [file (db/entity repo [:file/path file])] (common-handler/check-changed-files-status) @@ -291,7 +291,7 @@ (when (seq tx-data) (db/transact! repo tx-data))))) (p/catch (fn [err] - (prn "error: " err)))))) + (js/console.error "error: " err)))))) (defn re-index! [file] diff --git a/src/main/frontend/handler/page.cljs b/src/main/frontend/handler/page.cljs index f364834bc3..e3f16a39d8 100644 --- a/src/main/frontend/handler/page.cljs +++ b/src/main/frontend/handler/page.cljs @@ -278,12 +278,12 @@ (db/transact! tx-data) ;; remove file (-> - (p/let [_ (git/remove-file repo file-path) + (p/let [_ (or (config/local-db? repo) (git/remove-file repo file-path)) _ (fs/unlink! (config/get-repo-path repo file-path) nil)] (common-handler/check-changed-files-status) (repo-handler/push-if-auto-enabled! repo)) (p/catch (fn [err] - (prn "error: " err)))))) + (js/console.error "error: " err)))))) (db/transact! [[:db.fn/retractEntity [:page/name page-name]]]) From 8ea487a5cdfd01ca8668a484461eb6dea71e2598 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 22 Feb 2021 22:51:29 +0800 Subject: [PATCH 25/28] enhance: theme tweaks Code and ideas are mostly from https://github.com/PiotrSss/logseq-bujo-theme. --- resources/css/common.css | 202 ++++++++++++++++++----- src/main/frontend/components/block.cljs | 4 +- src/main/frontend/components/block.css | 4 +- src/main/frontend/components/header.cljs | 4 +- src/main/frontend/components/header.css | 2 +- src/main/frontend/components/repo.cljs | 9 +- src/main/frontend/components/search.cljs | 2 +- src/main/frontend/components/search.css | 3 +- src/main/frontend/components/theme.css | 20 ++- src/main/frontend/ui.css | 23 --- 10 files changed, 182 insertions(+), 91 deletions(-) diff --git a/resources/css/common.css b/resources/css/common.css index 7ab63e3676..f506bad109 100644 --- a/resources/css/common.css +++ b/resources/css/common.css @@ -81,45 +81,45 @@ html[data-theme=dark] { .white-theme, html[data-theme=light] { --ls-primary-background-color: white; - --ls-secondary-background-color: #dee9f2; - --ls-tertiary-background-color: #f0f8ff; - --ls-quaternary-background-color: #e1f0fe; + --ls-secondary-background-color: #f7f6f4; + --ls-tertiary-background-color: #f1eee8; + --ls-quaternary-background-color: #e8e5de; --ls-table-tr-even-background-color: #f4f5f7; --ls-active-primary-color: rgb(4, 85, 145); --ls-active-secondary-color: #003761; - --ls-block-properties-background-color: var(--ls-tertiary-background-color); + --ls-block-properties-background-color: #f7f6f4; --ls-block-ref-link-text-color: #D8E1E8; --ls-search-background-color: var(--ls-primary-background-color); --ls-border-color: #ccc; --ls-secondary-border-color: #e2e2e2; - --ls-guideline-color: var(--ls-border-color); + --ls-guideline-color: rgba(46, 27, 5, 0.08); --ls-menu-hover-color: var(--ls-a-chosen-bg); - --ls-primary-text-color: #24292e; + --ls-primary-text-color: #433F38; --ls-secondary-text-color: #161e2e; - --ls-title-text-color: #222; - --ls-link-text-color: var(--ls-active-primary-color); - --ls-link-text-hover-color: var(--ls-active-secondary-color); - --ls-link-ref-text-color: var(--ls-link-text-color); - --ls-link-ref-text-hover-color: var(--ls-link-text-hover-color); - --ls-tag-text-color: var(--ls-link-text-color); - --ls-tag-text-hover-color: var(--ls-link-text-hover-color); + --ls-title-text-color: var(--ls-primary-text-color); + --ls-link-text-color: #106BA3; + --ls-link-text-hover-color: #5d9cd6; + --ls-link-ref-text-color: #106BA3; + --ls-link-ref-text-hover-color: #5d9cd6; + --ls-tag-text-color: var(--ls-link-ref-text-color); + --ls-tag-text-hover-color: var(--ls-link-ref-text-hover-color); --ls-slide-background-color: #fff; - --ls-block-bullet-border-color: var(--ls-border-color); - --ls-block-bullet-color: #394b59; + --ls-block-bullet-border-color: #dedede; + --ls-block-bullet-color: rgba(67, 63, 56, 0.25); --ls-block-highlight-color: #c0e6fd; --ls-selection-background-color: #e4f2ff; - --ls-page-checkbox-color: var(--ls-active-primary-color); - --ls-page-checkbox-border-color: #8c8c8c; + --ls-page-checkbox-color: #9dbbd8; + --ls-page-checkbox-border-color: var(--ls-page-checkbox-color); --ls-page-blockquote-color: var(--ls-primary-text-color); - --ls-page-blockquote-bg-color: var(--ls-secondary-background-color); - --ls-page-blockquote-border-color: var(--ls-active-primary-color); - --ls-page-inline-code-bg-color: var(--ls-secondary-background-color); + --ls-page-blockquote-bg-color: #fbfaf8; + --ls-page-blockquote-border-color: #799bbc; + --ls-page-inline-code-bg-color: #f7f6f4; --ls-page-inline-code-color: var(--ls-primary-text-color); --ls-scrollbar-foreground-color: rgba(0, 0, 0, 0.1); --ls-scrollbar-background-color: rgba(0, 0, 0, 0.05); --ls-scrollbar-thumb-hover-color: rgba(0, 0, 0, 0.2); --ls-head-text-color: var(--ls-link-text-color); - --ls-icon-color: #6b7280; + --ls-icon-color: #c1bdb7; --ls-search-icon-color: var(--ls-icon-color); --ls-a-chosen-bg: #f4f5f7; --ls-right-sidebar-code-bg-color: var(--ls-secondary-background-color); @@ -445,6 +445,10 @@ li p:last-child, opacity: 0.6; } +.opacity-30 { + opacity: 0.3; +} + .opacity-70 { opacity: 0.7; } @@ -542,22 +546,6 @@ li p:last-child, overflow-y: auto; } -.marker-switch { - font-size: 85%; - margin-right: 6px; - margin-left: 2px; - border-radius: 3px; - font-weight: 500; - display: inline-block; - text-align: center; - width: 16px; - height: 18px; - opacity: 0.5; - padding: 0 2px 0 2px; - border: 1px solid; - line-height: 1.3; -} - .heading-bg { border-radius: 50%; width: 12px; @@ -637,10 +625,6 @@ a.login:hover { color: var(--ls-link-text-hover-color, #000); } -a.marker-switch:hover { - opacity: 1; -} - a.tooltip-priority { display: contents; position: absolute; @@ -673,13 +657,17 @@ img.small { } a.tag { - opacity: var(--ls-tag-text-opacity, 0.6); - color: var(--ls-tag-text-color, #045591); + font-size: 13px; + padding: 0px 3px; + text-align: center; + text-decoration: none; + display: inline-block; + cursor: pointer; + opacity: 0.8; } a.tag:hover { - opacity: var(--ls-tag-text-hover-opacity, 0.8); - color: var(--ls-tag-text-hover-color, #045591); + opacity: 1; } svg.note { @@ -714,3 +702,127 @@ hr { resize: both; overflow: hidden; } + +/* ideas from https://github.com/PiotrSss/logseq-bujo-theme/blob/main/main.css */ + +/*************************************************************** +***************************** TOP ****************************** +***************************************************************/ + +.cp__header-logo, .fade-link { + opacity: .3; + transition: .3s; +} + +a.fade-link:hover { + opacity: 1; +} + +/* import (arrows) icon */ + +#head .refresh svg { + height: 20px; +} + +#head { + background: none; +} + +/* < > buttons */ + +a[title="Go Back"], +a[title="Go Forward"] { + border-radius: 3px; + opacity: 1; + transition: .3s; +} + +/* search-field */ + +#search-wrapper { + opacity: 0; + transition: .3s; + padding-right: 12px; +} + +#search-wrapper:hover, +#search-wrapper:focus-within { + opacity: 1; +} + +#search>.inner { + max-width: 100%; + border-radius: 4px; +} + +#search_field:focus { + background: var(--ls-search-background-color); +} + +/* text mark/highlight */ + +mark { + padding: 2px 4px; + border-radius: 3px; +} + +/* page reference */ + +.page-reference { + border-radius: 3px; + padding: 2px 0px; + transition: .3s; +} + +.page-reference .bracket { + opacity: .3; +} + +/* block references */ + +.block-ref { + padding: 2px 5px; + border-radius: 3px; + font-style: italic; +} + +.block-ref .block-ref { + padding: 6px 5px; + border: none; +} + +/* inline code */ +:not(pre)>code { + border-radius: 3px; + font-size: .9em; + font-family: MonoLisa, "Fira Code", Monaco, Menlo, Consolas, "COURIER NEW", monospace; + padding: 3px 5px !important; +} + +a { + transition: .3s; +} + +/* search-field */ + +.dark-theme #search_field { + background: linear-gradient(to right, #021c23 0%, #021b21 200px, #002b36 100%); + transition: background .3s; +} + +.dark-theme #search_field:focus { + box-shadow: 0px 0px 20px 0px rgba(18, 18, 18, .8); +} + +.page-reference:hover { + background: var(--ls-secondary-background-color); +} + +.references-blocks .page-reference:hover { + background: var(--ls-tertiary-background-color); +} + +#head .fade-link { + font-weight: 600; + font-size: 13px; +} diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index 09a523db05..e2b8a191cc 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -394,7 +394,7 @@ (when (and (or show-brackets? nested-link?) (not html-export?) (not contents-page?)) - [:span.text-gray-500 "[["]) + [:span.text-gray-500.bracket "[["]) (if (string/ends-with? s ".excalidraw") [:a.page-ref {:on-click (fn [e] @@ -410,7 +410,7 @@ (when (and (or show-brackets? nested-link?) (not html-export?) (not contents-page?)) - [:span.text-gray-500 "]]"])])) + [:span.text-gray-500.bracket "]]"])])) (defn- latex-environment-content [name option content] diff --git a/src/main/frontend/components/block.css b/src/main/frontend/components/block.css index 0e857ae829..3e5925d158 100644 --- a/src/main/frontend/components/block.css +++ b/src/main/frontend/components/block.css @@ -94,7 +94,7 @@ } .block-children { - border-left: 2px solid; + border-left: 1px solid; border-left-color: var(--ls-guideline-color, #ddd); padding-top: 2px; @@ -118,7 +118,6 @@ } .block-ref { - color: var(--ls-link-text-color); padding-bottom: 2px; border-bottom: 0.5px solid; border-bottom-color: var(--ls-block-ref-link-text-color); @@ -176,6 +175,7 @@ &:hover { color: var(--ls-link-text-hover-color); + opacity: 1; } } diff --git a/src/main/frontend/components/header.cljs b/src/main/frontend/components/header.cljs index 2f8913b775..15b1c82aa6 100644 --- a/src/main/frontend/components/header.cljs +++ b/src/main/frontend/components/header.cljs @@ -40,8 +40,8 @@ (ui/dropdown-with-links (fn [{:keys [toggle-fn]}] - [:a {:on-click toggle-fn} - [:span.ml-1.text-sm (t :login)]]) + [:a.fade-link {:on-click toggle-fn} + [:span.ml-1 (t :login)]]) (let [list [{:title (t :login-google) :url (str config/website "/login/google")} {:title (t :login-github) diff --git a/src/main/frontend/components/header.css b/src/main/frontend/components/header.css index f1daa33bee..74a830bd7f 100644 --- a/src/main/frontend/components/header.css +++ b/src/main/frontend/components/header.css @@ -46,7 +46,7 @@ .cp__header-logo, .cp__right-menu-button { - opacity: 0.7; + opacity: 0.3; } .cp__header-logo { diff --git a/src/main/frontend/components/repo.cljs b/src/main/frontend/components/repo.cljs index 434f3d254e..bdbb833d94 100644 --- a/src/main/frontend/components/repo.cljs +++ b/src/main/frontend/components/repo.cljs @@ -87,7 +87,7 @@ (when-not (= repo config/local-repo) (if (and nfs-repo? (nfs-handler/supported?)) (let [syncing? (state/sub :graph/syncing?)] - [:div.ml-2.mr-1.opacity-70.hover:opacity-100.refresh {:class (if syncing? "loader" "initial")} + [:div.ml-2.mr-2.opacity-30.refresh.hover:opacity-100 {:class (if syncing? "loader" "initial")} [:a {:on-click #(nfs-handler/refresh! repo repo-handler/create-today-journal!) @@ -192,7 +192,7 @@ (> (count repos) 1) (ui/dropdown-with-links (fn [{:keys [toggle-fn]}] - [:a#repo-switch {:on-click toggle-fn} + [:a#repo-switch.fade-link {:on-click toggle-fn} (let [repo-name (get-repo-name current-repo) repo-name (if (util/electron?) (last (string/split repo-name #"/")) @@ -221,8 +221,9 @@ (if (config/local-db? current-repo) (if (util/electron?) (last (string/split repo-name #"/")) - repo-name) - [:a + [:span.fade-link + repo-name]) + [:a.fade-link {:href current-repo :target "_blank"} repo-name])) diff --git a/src/main/frontend/components/search.cljs b/src/main/frontend/components/search.cljs index 5d8bd5b374..5705bb343c 100644 --- a/src/main/frontend/components/search.cljs +++ b/src/main/frontend/components/search.cljs @@ -246,7 +246,7 @@ [:div.inner [:label.sr-only {:for "search_field"} (t :search)] [:div#search-wrapper.relative.w-full.text-gray-400.focus-within:text-gray-600 - [:div.absolute.inset-y-0.flex.items-center.pointer-events-none.left-0 + [:div.absolute.inset-y-0.flex.items-center.pointer-events-none {:style {:left 6}} [:svg.h-5.w-5 {:view-box "0 0 20 20", :fill "currentColor"} [:path diff --git a/src/main/frontend/components/search.css b/src/main/frontend/components/search.css index 07789dc468..0013b76a32 100644 --- a/src/main/frontend/components/search.css +++ b/src/main/frontend/components/search.css @@ -1,7 +1,6 @@ #search { > .inner { width: 100%; - max-width: 280px; } } @@ -16,4 +15,4 @@ #search_field { background-color: var(--ls-search-background-color, #fff); color: var(--ls-secondary-text-color, #161e2e); -} \ No newline at end of file +} diff --git a/src/main/frontend/components/theme.css b/src/main/frontend/components/theme.css index 1864ccdf6b..387add2c89 100644 --- a/src/main/frontend/components/theme.css +++ b/src/main/frontend/components/theme.css @@ -41,6 +41,17 @@ html { } } +.form-checkbox { + color: var(--ls-page-checkbox-color, #6093a0); + background-color: var(--ls-page-checkbox-color, #6093a0); + border-color: var(--ls-page-checkbox-border-color, #6093a0); + border: none; +} + +.form-checkbox:hover { + transform: scale(1.1); +} + html[data-theme=dark] { background-color: var(--ls-primary-background-color); @@ -51,13 +62,6 @@ html[data-theme=dark] { input.form-input { background: none; } - - .form-checkbox { - color: var(--ls-page-checkbox-color, #6093a0); - background-color: var(--ls-page-checkbox-color, #6093a0); - border-color: var(--ls-page-checkbox-border-color, #6093a0); - border: none; - } } html[data-theme=light] { @@ -203,5 +207,3 @@ html.is-electron { } } } - - diff --git a/src/main/frontend/ui.css b/src/main/frontend/ui.css index 5aa9adab90..095b2aa452 100644 --- a/src/main/frontend/ui.css +++ b/src/main/frontend/ui.css @@ -82,29 +82,6 @@ border-left: 4px solid transparent; } -.form-checkbox { - color: var(--ls-page-checkbox-color, #137cbd); - background-color: transparent; - border-radius: 0; - border: 2px solid; - border-color: var(--ls-page-checkbox-border-color); - appearance: none -} - -.form-checkbox { - &:checked { - border: none; - - &:focus { - box-shadow: none; - } - } - - &:not(:checked):focus { - box-shadow: none; - } -} - .form-select { background-color: var(--ls-primary-background-color, transparent); background-repeat: no-repeat; From 27d53f4113cad9b39638b6a7e8d36dc38eeee29f Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 22 Feb 2021 23:04:56 +0800 Subject: [PATCH 26/28] fix: remove padding for tags --- resources/css/common.css | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/css/common.css b/resources/css/common.css index f506bad109..89e6781cd7 100644 --- a/resources/css/common.css +++ b/resources/css/common.css @@ -658,7 +658,6 @@ img.small { a.tag { font-size: 13px; - padding: 0px 3px; text-align: center; text-decoration: none; display: inline-block; From d7e3027a4caaf9aa8e06714e0737dd8c34cb3445 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 22 Feb 2021 23:18:16 +0800 Subject: [PATCH 27/28] fix: set mark font size --- resources/css/common.css | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/css/common.css b/resources/css/common.css index 89e6781cd7..844280c37e 100644 --- a/resources/css/common.css +++ b/resources/css/common.css @@ -763,6 +763,7 @@ a[title="Go Forward"] { mark { padding: 2px 4px; border-radius: 3px; + font-size: 14px; } /* page reference */ From 124d2b62222fab0edcb4c262e430d63a21977b91 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 22 Feb 2021 23:33:50 +0800 Subject: [PATCH 28/28] fix: checkbox background --- src/main/frontend/components/theme.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/frontend/components/theme.css b/src/main/frontend/components/theme.css index 387add2c89..c02b3d8af0 100644 --- a/src/main/frontend/components/theme.css +++ b/src/main/frontend/components/theme.css @@ -55,10 +55,6 @@ html { html[data-theme=dark] { background-color: var(--ls-primary-background-color); - input { - color: var(--ls-secondary-text-color); - } - input.form-input { background: none; }