From b9e1d4c019a80ff8484cbca69c57e37657117e4a Mon Sep 17 00:00:00 2001 From: hasecilu Date: Tue, 30 May 2023 16:01:28 -0600 Subject: [PATCH 1/3] Update Spanish translation --- src/resources/dicts/es.edn | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/resources/dicts/es.edn b/src/resources/dicts/es.edn index 842a795c52..4266757ad0 100644 --- a/src/resources/dicts/es.edn +++ b/src/resources/dicts/es.edn @@ -521,4 +521,12 @@ :command.whiteboard/zoom-to-selection "Zoom para ajustar a la selección" :shortcut.category/whiteboard "Pizarra" :context-menu/toggle-number-list "Alternar lista de números" - :file-sync/rsapi-cannot-upload-err "Incapaz de comenzar la sincronización, favor de checar si..."} \ No newline at end of file + :file-sync/rsapi-cannot-upload-err "Incapaz de comenzar la sincronización, favor de checar si..." + :toggle-theme "Alternar tema" + :settings-page/native-titlebar "Barra de título nativa" + :settings-page/native-titlebar-desc "Habilta la barra de título nativa de la ventana en Windows y ..." + :window/close "Cerrar" + :window/exit-fullscreen "Salir de pantalla completa" + :window/maximize "Maximizar" + :window/minimize "Minimizar" + :window/restore "Restaurar"} From 521502ac8f0d57653693f22bf37d0b3017f15e44 Mon Sep 17 00:00:00 2001 From: Konstantinos Date: Wed, 31 May 2023 17:18:07 +0300 Subject: [PATCH 2/3] Fix (Whiteboards): Onboarding triggered on existing whiteboard (#9543) * fix: onboarding whiteboard predicate * fix: wording * fix: onboarding trigger * fix: wording --- src/main/frontend/extensions/tldraw.cljs | 2 +- src/main/frontend/handler/route.cljs | 4 +++- src/main/frontend/handler/whiteboard.cljs | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/frontend/extensions/tldraw.cljs b/src/main/frontend/extensions/tldraw.cljs index 13c2ddaac7..927de4c9c5 100644 --- a/src/main/frontend/extensions/tldraw.cljs +++ b/src/main/frontend/extensions/tldraw.cljs @@ -128,7 +128,7 @@ (rum/defc tldraw-app [page-name block-id] - (let [populate-onboarding? (whiteboard-handler/should-populate-onboarding-whiteboard? page-name) + (let [populate-onboarding? (whiteboard-handler/should-populate-onboarding-whiteboard? page-name) data (whiteboard-handler/page-name->tldr! page-name) [loaded-app set-loaded-app] (rum/use-state nil) on-mount (fn [^js tln] diff --git a/src/main/frontend/handler/route.cljs b/src/main/frontend/handler/route.cljs index 9d25fea0ba..7659fc1785 100644 --- a/src/main/frontend/handler/route.cljs +++ b/src/main/frontend/handler/route.cljs @@ -86,7 +86,9 @@ (defn redirect-to-whiteboard! ([name] (redirect-to-whiteboard! name nil)) - ([name {:keys [block-id]}] + ([name {:keys [block-id new-whiteboard?]}] + ;; Always skip onboarding when loading an existing whiteboard + (when-not new-whiteboard? (state/set-onboarding-whiteboard! true)) (recent-handler/add-page-to-recent! (state/get-current-repo) name false) (if (= name (state/get-current-whiteboard)) (state/focus-whiteboard-shape block-id) diff --git a/src/main/frontend/handler/whiteboard.cljs b/src/main/frontend/handler/whiteboard.cljs index aebd5a0e26..dc98b0b722 100644 --- a/src/main/frontend/handler/whiteboard.cljs +++ b/src/main/frontend/handler/whiteboard.cljs @@ -224,7 +224,7 @@ ([name] (when-not config/publishing? (create-new-whiteboard-page! name) - (route-handler/redirect-to-whiteboard! name)))) + (route-handler/redirect-to-whiteboard! name {:new-whiteboard? true})))) (defn ->logseq-portal-shape [block-id point] @@ -328,7 +328,7 @@ :assets assets :bindings bindings}))))) (defn should-populate-onboarding-whiteboard? - "When there is not whiteboard, or there is only whiteboard that is the given page name, we should populate the onboarding whiteboard" + "When there is no whiteboard, or there is only one whiteboard that has the given page name, we should populate the onboarding shapes" [page-name] (let [whiteboards (model/get-all-whiteboards (state/get-current-repo))] (and (or (empty? whiteboards) From 235c9fbb58659143d01319299ce46f508e341854 Mon Sep 17 00:00:00 2001 From: situ2001 Date: Thu, 1 Jun 2023 03:37:39 +0800 Subject: [PATCH 3/3] fix(editor): handle backspace when at beginning of line in embed page/block (#8421) * fix(editor): handle backspace when pos is 0 on embed page * fix(editor): embed block should also be handled * fix(editor): handle backspace when pos is 0 on embed page * fix(editor): embed block should also be handled * refactor(editor): reduce repeated code * Add tests for deleting block with backspace Also replace get-prev-block-non-collapsed-in-embed which isn't being used enough to merit another copy and paste --------- Co-authored-by: Gabriel Horner --- src/main/frontend/handler/editor.cljs | 28 +++++---- src/main/frontend/util.cljc | 31 ++++++---- src/test/frontend/handler/editor_test.cljs | 70 +++++++++++++++++++++- src/test/frontend/test/helper.cljs | 5 ++ 4 files changed, 110 insertions(+), 24 deletions(-) diff --git a/src/main/frontend/handler/editor.cljs b/src/main/frontend/handler/editor.cljs index 88ea15d52a..97802116a0 100644 --- a/src/main/frontend/handler/editor.cljs +++ b/src/main/frontend/handler/editor.cljs @@ -807,7 +807,7 @@ (delete-block! repo true)) ([repo delete-children?] (state/set-editor-op! :delete) - (let [{:keys [id block-id block-parent-id value format]} (get-state)] + (let [{:keys [id block-id block-parent-id value format config]} (get-state)] (when block-id (let [page-id (:db/id (:block/page (db/entity [:block/uuid block-id]))) page-blocks-count (and page-id (db/get-page-blocks-count repo page-id))] @@ -823,24 +823,28 @@ (when-not (and has-children? left-has-children?) (when block-parent-id (let [block-parent (gdom/getElement block-parent-id) - sibling-block (util/get-prev-block-non-collapsed-non-embed block-parent) + sibling-block (if (:embed? config) + (util/get-prev-block-non-collapsed + block-parent + {:container (util/rec-get-blocks-container block-parent)}) + (util/get-prev-block-non-collapsed-non-embed block-parent)) {:keys [prev-block new-content move-fn]} (move-to-prev-block repo sibling-block format id value false) concat-prev-block? (boolean (and prev-block new-content)) transact-opts (cond-> - {:outliner-op :delete-blocks} + {:outliner-op :delete-blocks} concat-prev-block? (assoc :concat-data {:last-edit-block (:block/uuid block)}))] (outliner-tx/transact! transact-opts - (if concat-prev-block? - (let [prev-block' (if (seq (:block/_refs block-e)) - (assoc prev-block - :block/uuid (:block/uuid block) - :block.temp/additional-properties (:block/properties block)) - prev-block)] - (delete-block-aux! block delete-children?) - (save-block! repo prev-block' new-content {:editor/op :delete})) - (delete-block-aux! block delete-children?))) + (if concat-prev-block? + (let [prev-block' (if (seq (:block/_refs block-e)) + (assoc prev-block + :block/uuid (:block/uuid block) + :block.temp/additional-properties (:block/properties block)) + prev-block)] + (delete-block-aux! block delete-children?) + (save-block! repo prev-block' new-content {:editor/op :delete})) + (delete-block-aux! block delete-children?))) (move-fn))))))))) (state/set-editor-op! nil))) diff --git a/src/main/frontend/util.cljc b/src/main/frontend/util.cljc index eaae057209..e684ac8ec2 100644 --- a/src/main/frontend/util.cljc +++ b/src/main/frontend/util.cljc @@ -778,9 +778,13 @@ (rec-get-blocks-content-section (gobj/get node "parentNode")))))) #?(:cljs - (defn get-blocks-noncollapse [] - (->> (d/sel "div:not(.reveal) .ls-block") - (filter (fn [b] (some? (gobj/get b "offsetParent"))))))) + (defn get-blocks-noncollapse + ([] + (->> (d/sel "div:not(.reveal) .ls-block") + (filter (fn [b] (some? (gobj/get b "offsetParent")))))) + ([blocks-container] + (->> (d/sel blocks-container "div:not(.reveal) .ls-block") + (filter (fn [b] (some? (gobj/get b "offsetParent")))))))) #?(:cljs (defn remove-embedded-blocks [blocks] @@ -848,14 +852,19 @@ #?(:cljs (defn get-prev-block-non-collapsed - [block] - (when-let [blocks (get-blocks-noncollapse)] - (let [block-id (.-id block) - block-ids (mapv #(.-id %) blocks)] - (when-let [index (.indexOf block-ids block-id)] - (let [idx (dec index)] - (when (>= idx 0) - (nth-safe blocks idx)))))))) + "Gets previous non-collapsed block. If given a container + looks up blocks in that container e.g. for embed" + ([block] (get-prev-block-non-collapsed block {})) + ([block {:keys [container]}] + (when-let [blocks (if container + (get-blocks-noncollapse container) + (get-blocks-noncollapse))] + (let [block-id (.-id block) + block-ids (mapv #(.-id %) blocks)] + (when-let [index (.indexOf block-ids block-id)] + (let [idx (dec index)] + (when (>= idx 0) + (nth-safe blocks idx))))))))) #?(:cljs (defn get-prev-block-non-collapsed-non-embed diff --git a/src/test/frontend/handler/editor_test.cljs b/src/test/frontend/handler/editor_test.cljs index d30d6f31ed..f819c408e4 100644 --- a/src/test/frontend/handler/editor_test.cljs +++ b/src/test/frontend/handler/editor_test.cljs @@ -6,7 +6,9 @@ [frontend.test.helper :as test-helper :refer [load-test-files]] [frontend.db.model :as model] [frontend.state :as state] - [frontend.util.cursor :as cursor])) + [frontend.util.cursor :as cursor] + [goog.dom :as gdom] + [frontend.util :as util])) (use-fixtures :each test-helper/start-and-destroy-db) @@ -255,3 +257,69 @@ (editor/save-block! repo block-uuid "# bar") (is (= "# bar" (:block/content (model/query-block-by-uuid block-uuid))))))) + +(defn- delete-block + [db block {:keys [embed?]}] + (let [sibling-block (d/entity db (get-in block [:block/left :db/id])) + first-block (d/entity db (get-in sibling-block [:block/left :db/id])) + block-dom-id "ls-block-block-to-delete"] + (with-redefs [editor/get-state (constantly {:block-id (:block/uuid block) + :block-parent-id block-dom-id + :config {:embed? embed?}}) + ;; stub for delete-block + gdom/getElement (constantly #js {:id block-dom-id}) + ;; stub since not testing moving + editor/edit-block! (constantly nil) + util/get-blocks-noncollapse (constantly (mapv + (fn [m] + #js {:id (:id m) + ;; for dom/attr + :getAttribute #({"blockid" (str (:block-uuid m)) + "data-embed" (if embed? "true" "false")} %)}) + [{:id "ls-block-first-block" + :block-uuid (:block/uuid first-block)} + {:id "ls-block-sibling-block" + :block-uuid (:block/uuid sibling-block)} + {:id block-dom-id + :block-uuid (:block/uuid block)}]))] + (editor/delete-block! test-helper/test-db false)))) + +(deftest ^:focus delete-block! + (testing "backspace deletes empty block" + (load-test-files [{:file/path "pages/page1.md" + :file/content "\n +- b1 +- b2 +-"}]) + (let [conn (db/get-db test-helper/test-db false) + block (->> (d/q '[:find (pull ?b [*]) + :where [?b :block/content ""] [?b :block/page [:block/name "page1"]]] + @conn) + ffirst) + _ (delete-block @conn block {}) + updated-blocks (->> (d/q '[:find (pull ?b [*]) + :where [?b :block/content] [(missing? $ ?b :block/pre-block?)]] + @conn) + (map (comp :block/content first)))] + (is (= ["b1" "b2"] updated-blocks) "Block is deleted")) + (test-helper/reset-test-db!)) + + (testing "backspace deletes empty block in embedded context" + ;; testing embed at this layer doesn't require an embed block since + ;; delete-block handles all the embed setup + (load-test-files [{:file/path "pages/page1.md" + :file/content "\n +- b1 +- b2 +-"}]) + (let [conn (db/get-db test-helper/test-db false) + block (->> (d/q '[:find (pull ?b [*]) + :where [?b :block/content ""] [?b :block/page [:block/name "page1"]]] + @conn) + ffirst) + _ (delete-block @conn block {:embed? true}) + updated-blocks (->> (d/q '[:find (pull ?b [*]) + :where [?b :block/content] [(missing? $ ?b :block/pre-block?)]] + @conn) + (map (comp :block/content first)))] + (is (= ["b1" "b2"] updated-blocks) "Block is deleted")))) \ No newline at end of file diff --git a/src/test/frontend/test/helper.cljs b/src/test/frontend/test/helper.cljs index e4c3d6e52a..1befc262fc 100644 --- a/src/test/frontend/test/helper.cljs +++ b/src/test/frontend/test/helper.cljs @@ -14,6 +14,11 @@ [] (conn/destroy-all!)) +(defn reset-test-db! + [] + (destroy-test-db!) + (start-test-db!)) + (defn load-test-files "Given a collection of file maps, loads them into the current test-db. This can be called in synchronous contexts as no async fns should be invoked"