Bladeren bron

Merge remote-tracking branch 'upstream/master' into whiteboards

Peng Xiao 3 jaren geleden
bovenliggende
commit
1553311666

+ 1 - 1
libs/src/LSPlugin.ts

@@ -386,7 +386,7 @@ export interface IAppProxy {
   queryElementRect: (selector: string) => Promise<DOMRectReadOnly | null>
   queryElementRect: (selector: string) => Promise<DOMRectReadOnly | null>
 
 
   /**
   /**
-   * @deprecated
+   * @deprecated Use `logseq.UI.showMsg` instead
    * @param content
    * @param content
    * @param status
    * @param status
    */
    */

+ 1 - 1
package.json

@@ -85,7 +85,7 @@
         "@capacitor/status-bar": "^4.0.0",
         "@capacitor/status-bar": "^4.0.0",
         "@excalidraw/excalidraw": "0.10.0",
         "@excalidraw/excalidraw": "0.10.0",
         "@kanru/rage-wasm": "0.2.1",
         "@kanru/rage-wasm": "0.2.1",
-        "@logseq/capacitor-file-sync": "0.0.5",
+        "@logseq/capacitor-file-sync": "0.0.6",
         "@logseq/react-tweet-embed": "1.3.1-1",
         "@logseq/react-tweet-embed": "1.3.1-1",
         "@sentry/react": "^6.18.2",
         "@sentry/react": "^6.18.2",
         "@sentry/tracing": "^6.18.2",
         "@sentry/tracing": "^6.18.2",

+ 31 - 31
src/main/frontend/dicts.cljc

@@ -4721,11 +4721,11 @@
                           :default "tutorial-pl.md")
                           :default "tutorial-pl.md")
         :tutorial/dummy-notes #?(:cljs (rc/inline "dummy-notes-pl.md")
         :tutorial/dummy-notes #?(:cljs (rc/inline "dummy-notes-pl.md")
                                  :default "dummy-notes-pl.md")
                                  :default "dummy-notes-pl.md")
-        :on-boarding/demo-graph "To jest przykładowy graf, zmiany nie zostaną zapisane dopóki nie otworzysz jakiegoś lokalnego katalogu."
+        :on-boarding/demo-graph "To jest przykładowy graf, zmiany nie zostaną zapisane dopóki nie otworzysz lokalnego katalogu."
         :on-boarding/add-graph "Dodaj graf"
         :on-boarding/add-graph "Dodaj graf"
         :on-boarding/open-local-dir "Otwórz lokalny katalog"
         :on-boarding/open-local-dir "Otwórz lokalny katalog"
         :on-boarding/new-graph-desc-1 "Logseq wspiera zarówno składnię Markdown jak i Org-mode. Możesz otworzyć istniejący już folder lub utworzyć nowy katalog na swoim urządzeniu. Wszystkie dane będą przechowywane tylko na tym urządzeniu."
         :on-boarding/new-graph-desc-1 "Logseq wspiera zarówno składnię Markdown jak i Org-mode. Możesz otworzyć istniejący już folder lub utworzyć nowy katalog na swoim urządzeniu. Wszystkie dane będą przechowywane tylko na tym urządzeniu."
-        :on-boarding/new-graph-desc-2 "Po otwarciu wybranego katalogu zostaną w nim uworzone trzy dodatkowe katalogi:"
+        :on-boarding/new-graph-desc-2 "Po otwarciu wybranego katalogu zostaną w nim utworzone trzy dodatkowe katalogi:"
         :on-boarding/new-graph-desc-3 "/journals - przechowuje wszystkie strony twojego dziennika"
         :on-boarding/new-graph-desc-3 "/journals - przechowuje wszystkie strony twojego dziennika"
         :on-boarding/new-graph-desc-4 "/pages - przechowuje wszystkie pozostałe, utworzone przez Ciebie strony"
         :on-boarding/new-graph-desc-4 "/pages - przechowuje wszystkie pozostałe, utworzone przez Ciebie strony"
         :on-boarding/new-graph-desc-5 "/logseq - przechowuje konfigurację, custom.css oraz niektóre meta dane."
         :on-boarding/new-graph-desc-5 "/logseq - przechowuje konfigurację, custom.css oraz niektóre meta dane."
@@ -4742,19 +4742,19 @@
         :help/community "Społeczność Discord"
         :help/community "Społeczność Discord"
         :help/forum-community "Forum dyskusyjne"
         :help/forum-community "Forum dyskusyjne"
         :help/awesome-logseq "Awesome Logseq"
         :help/awesome-logseq "Awesome Logseq"
-        :help/shortcuts "Skróty klawiaturowe"
+        :help/shortcuts "Skróty klawiszowe"
         :help/shortcuts-triggers "Akcja"
         :help/shortcuts-triggers "Akcja"
         :help/shortcut "Skrót"
         :help/shortcut "Skrót"
         :help/slash-autocomplete "Autouzupełnianie poleceń /"
         :help/slash-autocomplete "Autouzupełnianie poleceń /"
         :help/block-content-autocomplete "Autouzupełnianie treści bloku"
         :help/block-content-autocomplete "Autouzupełnianie treści bloku"
         :help/reference-autocomplete "Autouzupełnianie referencji bloku"
         :help/reference-autocomplete "Autouzupełnianie referencji bloku"
         :help/block-reference "Referencja bloku"
         :help/block-reference "Referencja bloku"
-        :help/key-commands "Kluczowe"
+        :help/key-commands "Polecenia klawiszowe"
         :help/working-with-lists " (praca z listami)"
         :help/working-with-lists " (praca z listami)"
         :help/select-nfs-browser "Proszę użyć innej przeglądarki (na przykład ostatniego Chrome), która wspiera otwieranie lokalnych katalogów (NFS feature)"
         :help/select-nfs-browser "Proszę użyć innej przeglądarki (na przykład ostatniego Chrome), która wspiera otwieranie lokalnych katalogów (NFS feature)"
         :undo "Cofnij"
         :undo "Cofnij"
         :redo "Ponów"
         :redo "Ponów"
-        :general "General"
+        :general "Ogólne"
         :more "Więcej"
         :more "Więcej"
         :search/result-for "Wyniki wyszukiwania dla"
         :search/result-for "Wyniki wyszukiwania dla"
         :search/items "elementów"
         :search/items "elementów"
@@ -4777,7 +4777,7 @@
         :right-side-bar/favorites "Ulubione"
         :right-side-bar/favorites "Ulubione"
         :right-side-bar/page-graph "Graf strony"
         :right-side-bar/page-graph "Graf strony"
         :right-side-bar/block-ref "Ref bloku"
         :right-side-bar/block-ref "Ref bloku"
-        :right-side-bar/graph-view "Widok gafu"
+        :right-side-bar/graph-view "Widok grafu"
         :right-side-bar/all-pages "Wszystkie strony"
         :right-side-bar/all-pages "Wszystkie strony"
         :right-side-bar/flashcards "Fiszki"
         :right-side-bar/flashcards "Fiszki"
         :right-side-bar/new-page "Nowa strona"
         :right-side-bar/new-page "Nowa strona"
@@ -4791,7 +4791,7 @@
         :format/markdown "Markdown"
         :format/markdown "Markdown"
         :format/org-mode "Org mode"
         :format/org-mode "Org mode"
         :reference/linked "Powiązane referencje"
         :reference/linked "Powiązane referencje"
-        :reference/unlinked-ref "Niepołączone referencje"
+        :reference/unlinked-ref "Niepowiązane referencje"
         :page/presentation-mode "Tryb prezentacji"
         :page/presentation-mode "Tryb prezentacji"
         :page/edit-properties-placeholder "Właściwości"
         :page/edit-properties-placeholder "Właściwości"
         :page/delete-success "Strona {1} została usunięta!"
         :page/delete-success "Strona {1} została usunięta!"
@@ -4806,7 +4806,7 @@
         :page/make-public "Oznacz jako publiczną"
         :page/make-public "Oznacz jako publiczną"
         :page/version-history "Sprawdź historię zmian"
         :page/version-history "Sprawdź historię zmian"
         :page/open-backup-directory "Otwórz katalog z kopiami bezpieczeństwa"
         :page/open-backup-directory "Otwórz katalog z kopiami bezpieczeństwa"
-        :page/make-private "Oznacz jako prywantą"
+        :page/make-private "Oznacz jako prywatną"
         :page/delete "Usuń stronę"
         :page/delete "Usuń stronę"
         :page/add-to-favorites "Dodaj do ulubionych"
         :page/add-to-favorites "Dodaj do ulubionych"
         :page/unfavorite "Usuń z ulubionych"
         :page/unfavorite "Usuń z ulubionych"
@@ -4836,29 +4836,29 @@
         :draw/specify-title "Proszę najpierw określić tytuł strony!"
         :draw/specify-title "Proszę najpierw określić tytuł strony!"
         :draw/rename-success "Nazwa pliku została zmieniona!"
         :draw/rename-success "Nazwa pliku została zmieniona!"
         :draw/rename-failure "Zmiana nazwy pliku nieudana. Powód: "
         :draw/rename-failure "Zmiana nazwy pliku nieudana. Powód: "
-        :draw/title-placeholder "Nienazwany"
+        :draw/title-placeholder "Bez nazwy"
         :draw/save "Zapisz"
         :draw/save "Zapisz"
         :draw/save-changes "Zapisz zmiany"
         :draw/save-changes "Zapisz zmiany"
         :draw/new-file "Nowy plik"
         :draw/new-file "Nowy plik"
         :draw/list-files "Wylistuj pliki"
         :draw/list-files "Wylistuj pliki"
         :draw/delete "Usuń"
         :draw/delete "Usuń"
         :draw/more-options "Więcej opcji"
         :draw/more-options "Więcej opcji"
-        :draw/back-to-logseq "Powrót do LogSeq"
+        :draw/back-to-logseq "Powrót do Logseq"
         :text/image "Obrazek"
         :text/image "Obrazek"
         :asset/confirm-delete "Jesteś pewien, że chcesz usunąć ten {1}?"
         :asset/confirm-delete "Jesteś pewien, że chcesz usunąć ten {1}?"
         :asset/physical-delete "Usuń ten plik z dysku (operacja nie może zostać cofnięta)"
         :asset/physical-delete "Usuń ten plik z dysku (operacja nie może zostać cofnięta)"
         :content/copy "Kopiuj"
         :content/copy "Kopiuj"
         :content/cut "Wytnij"
         :content/cut "Wytnij"
         :content/make-todos "Stwórz {1}s"
         :content/make-todos "Stwórz {1}s"
-        :content/copy-block-ref "Kopiuje ref bloku"
+        :content/copy-block-ref "Kopiuj ref bloku"
         :content/copy-block-emebed "Kopiuj blok jako embed"
         :content/copy-block-emebed "Kopiuj blok jako embed"
         :content/focus-on-block "Skup się na bloku"
         :content/focus-on-block "Skup się na bloku"
         :content/open-in-sidebar "Otwórz w panelu bocznym"
         :content/open-in-sidebar "Otwórz w panelu bocznym"
         :content/copy-as-json "Kopiuj jako JSON"
         :content/copy-as-json "Kopiuj jako JSON"
-        :content/click-to-edit "Kliknij aby edytować"
-        :settings-page/git-desc "jest użyty do kontroli wersji stron, możesz kliknąć pionowe trzy kropki żeby zobaczyć historię zmian strony."
-        :settings-page/git-confirm "Musisz uruchomić ponownie aplikację żeby zastosować zmiany w ustawieniach GITa."
-        :settings-page/git-switcher-label "Włącz Autocommit GITa"
+        :content/click-to-edit "Kliknij, aby edytować"
+        :settings-page/git-desc "jest użyty do kontroli wersji stron, aby zobaczyć historię zmian strony, kliknij na ikonę trzech pionowych kropek."
+        :settings-page/git-confirm "Musisz uruchomić ponownie aplikację żeby zastosować zmiany w ustawieniach Gita."
+        :settings-page/git-switcher-label "Włącz opcję autocommit w Git"
         :settings-page/git-commit-delay "Wykonaj commit co każde [s.]"
         :settings-page/git-commit-delay "Wykonaj commit co każde [s.]"
         :settings-page/edit-config-edn "Edytuj config.edn"
         :settings-page/edit-config-edn "Edytuj config.edn"
         :settings-page/edit-custom-css "Edytuj custom.css"
         :settings-page/edit-custom-css "Edytuj custom.css"
@@ -4868,15 +4868,15 @@
         :settings-page/export-theme "Eksportuj motyw graficzny"
         :settings-page/export-theme "Eksportuj motyw graficzny"
         :settings-page/show-brackets "Pokaż kwadratowe nawiasy"
         :settings-page/show-brackets "Pokaż kwadratowe nawiasy"
         :settings-page/spell-checker "Sprawdzanie pisowni"
         :settings-page/spell-checker "Sprawdzanie pisowni"
-        :settings-page/auto-updater "Auto aktualizacje"
+        :settings-page/auto-updater "Automatyczne aktualizacje"
         :settings-page/disable-sentry "Wyślij statystyki użycia aplikacji do Logseq"
         :settings-page/disable-sentry "Wyślij statystyki użycia aplikacji do Logseq"
         :settings-page/preferred-outdenting "Logiczne zmniejszanie wcięć"
         :settings-page/preferred-outdenting "Logiczne zmniejszanie wcięć"
         :settings-page/custom-date-format "Preferowany format daty"
         :settings-page/custom-date-format "Preferowany format daty"
         :settings-page/preferred-file-format "Preferowany format pliku"
         :settings-page/preferred-file-format "Preferowany format pliku"
         :settings-page/preferred-workflow "Preferowany flow TODOsów"
         :settings-page/preferred-workflow "Preferowany flow TODOsów"
-        :settings-page/enable-shortcut-tooltip "Włącz dymek podpowiedzi skrótu klawiszowego"
+        :settings-page/enable-shortcut-tooltip "Włącz podpowiedzi skrótu klawiszowego"
         :settings-page/enable-timetracking "Mierzenie czasu"
         :settings-page/enable-timetracking "Mierzenie czasu"
-        :settings-page/enable-tooltip "Dymki podpowiedzi"
+        :settings-page/enable-tooltip "Podpowiedzi"
         :settings-page/enable-journals "Dzienniki"
         :settings-page/enable-journals "Dzienniki"
         :settings-page/enable-all-pages-public "Publikuj wszystkie strony"
         :settings-page/enable-all-pages-public "Publikuj wszystkie strony"
         :settings-page/enable-encryption "Szyfrowanie"
         :settings-page/enable-encryption "Szyfrowanie"
@@ -4911,14 +4911,14 @@
         :delete "Usuń"
         :delete "Usuń"
         :save "Zapisz"
         :save "Zapisz"
         :type "Typ"
         :type "Typ"
-        :re-index "Ponownie indeksuj"
+        :re-index "Indeksuj ponownie"
         :re-index-detail "Przebuduj graf od nowa"
         :re-index-detail "Przebuduj graf od nowa"
-        :re-index-multiple-windows-warning "Musisz zamknąć inne okna zanim rozpoczniesz proces ponownej indeksacji"
-        :re-index-discard-unsaved-changes-warning "Ponowna indeksacja odrzuci zmiany w obecnym grafie a następnie przejdzie po wszystkich plikach zapisanych na dysku. Utracisz wszystkie niezapisane zmiany a sam proces może trochę potrwać. Kontynuować?"
+        :re-index-multiple-windows-warning "Musisz zamknąć inne okna, zanim rozpoczniesz proces ponownej indeksacji"
+        :re-index-discard-unsaved-changes-warning "Ponowna indeksacja odrzuci zmiany w obecnym grafie, a następnie przejdzie po wszystkich plikach zapisanych na dysku. Utracisz wszystkie niezapisane zmiany, a sam proces może trochę potrwać. Kontynuować?"
         :open-new-window "Nowe okno"
         :open-new-window "Nowe okno"
         :sync-from-local-files "Odśwież"
         :sync-from-local-files "Odśwież"
         :sync-from-local-files-detail "Importuj zmiany z lokalnych plików"
         :sync-from-local-files-detail "Importuj zmiany z lokalnych plików"
-        :sync-from-local-changes-detected "Funkcja Odśwież wykrywa i procesuje pliki zmianione na dysku. Wszystkie pliki różniące się od tych w Logseq zostaną ponownie wczytane. Kontynuować?"
+        :sync-from-local-changes-detected "Funkcja Odśwież wykrywa i procesuje pliki zmienione na dysku. Wszystkie pliki różniące się od tych w Logseq zostaną ponownie wczytane. Kontynuować?"
 
 
         :unlink "Usuń link"
         :unlink "Usuń link"
         :search/publishing "Szukaj"
         :search/publishing "Szukaj"
@@ -4962,13 +4962,13 @@
         :settings-of-plugins "Ustawienia pluginu"
         :settings-of-plugins "Ustawienia pluginu"
         :plugins "Pluginy"
         :plugins "Pluginy"
         :themes "Motywy graficzne"
         :themes "Motywy graficzne"
-        :developer-mode-alert "Musisz uruchomić ponownie aplikację żeby włączyć system pluginów. Zrobić to teraz?"
-        :relaunch-confirm-to-work "Powinienem uruchomić ponownie aplikację żeby to zaczęło działać. Zrobić to teraz?"
+        :developer-mode-alert "Aby włączyć system pluginów, aplikacja musi zostać uruchomiona ponownie. Zrobić to teraz?"
+        :relaunch-confirm-to-work "Aby wprowadzić zmiany, aplikacja musi zostać uruchomiona ponownie. Zrobić to teraz?"
         :join-community "Dołącz do społeczności"
         :join-community "Dołącz do społeczności"
         :sponsor-us "Sponsoruj nas"
         :sponsor-us "Sponsoruj nas"
         :discourse-title "Nasze forum!"
         :discourse-title "Nasze forum!"
         :discord-title "Nasza grupa Discord!" ;; unused
         :discord-title "Nasza grupa Discord!" ;; unused
-        :help-shortcut-title "Kliknij aby sprawdzić skróty klawiszowe i inne takie"
+        :help-shortcut-title "Kliknij, aby sprawdzić skróty klawiszowe oraz inne porady"
         :loading "Ładuję"
         :loading "Ładuję"
         :cloning "Klonuję"
         :cloning "Klonuję"
         :parsing-files "Parsuję pliki"
         :parsing-files "Parsuję pliki"
@@ -5009,7 +5009,7 @@
         :plugin/all "Wszystkie"
         :plugin/all "Wszystkie"
         :plugin/unpacked "Rozpakowany"
         :plugin/unpacked "Rozpakowany"
         :plugin/marketplace "Marketplace"
         :plugin/marketplace "Marketplace"
-        :plugin/delete-alert "Czy napeno chcesz usunąć plugin [{1}]?"
+        :plugin/delete-alert "Czy na pewno chcesz usunąć plugin [{1}]?"
         :plugin/open-settings "Otwórz ustawienia"
         :plugin/open-settings "Otwórz ustawienia"
         :plugin/open-package "Otwórz paczkę"
         :plugin/open-package "Otwórz paczkę"
         :plugin/load-unpacked "Załaduj rozpakowany plugin"
         :plugin/load-unpacked "Załaduj rozpakowany plugin"
@@ -5019,15 +5019,15 @@
         :plugin/contribute "✨ Napisz i prześlij nowy plugin"
         :plugin/contribute "✨ Napisz i prześlij nowy plugin"
         :plugin/marketplace-tips "Jeżeli plugin po załadowaniu nie działa, spróbuj zrestartować Logseq."
         :plugin/marketplace-tips "Jeżeli plugin po załadowaniu nie działa, spróbuj zrestartować Logseq."
         :plugin/up-to-date "Wszystko jest aktualne"
         :plugin/up-to-date "Wszystko jest aktualne"
-        :plugin/custom-js-alert "Found the custom.js file, is it allowed to execute? (If you don't understand the content of this file, it is recommended not to allow execution, which has certain security risks.)"
+        :plugin/custom-js-alert "Wykryto plik custom.js, czy chcesz go wykonać? Ze względów bezpieczeństwa, nie rekomendujemy wykonywania tego pliku, jeżeli nie znasz jego zawartości."
 
 
         :pdf/copy-ref "Kopiuj ref"
         :pdf/copy-ref "Kopiuj ref"
         :pdf/copy-text "Kopiuj tekst"
         :pdf/copy-text "Kopiuj tekst"
         :pdf/linked-ref "Połączone odwołania"
         :pdf/linked-ref "Połączone odwołania"
-        :pdf/toggle-dashed "Dashed style for area highlight"
+        :pdf/toggle-dashed "Styl kreskowany dla podświetlenia obszaru"
 
 
         :updater/new-version-install "Nowa wersja została ściągnięta."
         :updater/new-version-install "Nowa wersja została ściągnięta."
-        :updater/quit-and-install "Uruchom ponownie żeby zainstalować"
+        :updater/quit-and-install "Uruchom ponownie, aby zainstalować"
 
 
         :paginates/pages "{1} wszystkich stron"
         :paginates/pages "{1} wszystkich stron"
         :paginates/prev "← Poprzednia"
         :paginates/prev "← Poprzednia"
@@ -5041,7 +5041,7 @@
         :select.graph/empty-placeholder-description "Brak pasujących grafów. Chcesz dodać nowy?"
         :select.graph/empty-placeholder-description "Brak pasujących grafów. Chcesz dodać nowy?"
         :select.graph/add-graph "Tak, dodaj nowy graf"
         :select.graph/add-graph "Tak, dodaj nowy graf"
 
 
-        :file-sync/other-user-graph "Obecny lokalny graf jest przypisany do zdalnego grafu innego użytkownika. Nie mo rozpocząć synchronizacji."
+        :file-sync/other-user-graph "Obecny lokalny graf jest przypisany do zdalnego grafu innego użytkownika. Nie można rozpocząć synchronizacji."
         :file-sync/graph-deleted "Obecny zdalny graf został usunięty"
         :file-sync/graph-deleted "Obecny zdalny graf został usunięty"
         }
         }
    :tongue/fallback :en})
    :tongue/fallback :en})
@@ -5055,7 +5055,7 @@
                 {:label "Afrikaans" :value :af}
                 {:label "Afrikaans" :value :af}
                 {:label "Español" :value :es}
                 {:label "Español" :value :es}
                 {:label "Norsk (bokmål)" :value :nb-NO}
                 {:label "Norsk (bokmål)" :value :nb-NO}
-                {:label "Polski" :value :pl}
+                {:label "polski" :value :pl}
                 {:label "Português (Brasileiro)" :value :pt-BR}
                 {:label "Português (Brasileiro)" :value :pt-BR}
                 {:label "Português (Europeu)" :value :pt-PT}
                 {:label "Português (Europeu)" :value :pt-PT}
                 {:label "Русский" :value :ru}
                 {:label "Русский" :value :ru}

+ 3 - 3
src/main/frontend/encrypt.cljs

@@ -97,7 +97,7 @@
             encrypted (ipc/ipc "encrypt-with-passphrase" passphrase raw-content)]
             encrypted (ipc/ipc "encrypt-with-passphrase" passphrase raw-content)]
       (utf8/decode encrypted))
       (utf8/decode encrypted))
 
 
-    (mobile-util/native-ios?)
+    (mobile-util/native-platform?)
     (p/chain (.encryptWithPassphrase mobile-util/file-sync
     (p/chain (.encryptWithPassphrase mobile-util/file-sync
                                      (clj->js {:passphrase passphrase :content content}))
                                      (clj->js {:passphrase passphrase :content content}))
              #(js->clj % :keywordize-keys true)
              #(js->clj % :keywordize-keys true)
@@ -117,12 +117,12 @@
             decrypted (ipc/ipc "decrypt-with-passphrase" passphrase raw-content)]
             decrypted (ipc/ipc "decrypt-with-passphrase" passphrase raw-content)]
       (utf8/decode decrypted))
       (utf8/decode decrypted))
 
 
-    (mobile-util/native-ios?)
+    (mobile-util/native-platform?)
     (p/chain (.decryptWithPassphrase mobile-util/file-sync
     (p/chain (.decryptWithPassphrase mobile-util/file-sync
                                      (clj->js {:passphrase passphrase :content content}))
                                      (clj->js {:passphrase passphrase :content content}))
              #(js->clj % :keywordize-keys true)
              #(js->clj % :keywordize-keys true)
              :data)
              :data)
-    
+
     :else
     :else
     (p/let [_ (loader/load :age-encryption)
     (p/let [_ (loader/load :age-encryption)
             lazy-decrypt-with-user-passphrase (resolve 'frontend.extensions.age-encryption/decrypt-with-user-passphrase)
             lazy-decrypt-with-user-passphrase (resolve 'frontend.extensions.age-encryption/decrypt-with-user-passphrase)

+ 1 - 1
src/main/frontend/fs.cljs

@@ -210,7 +210,7 @@
   [dir path]
   [dir path]
   (util/p-handle
   (util/p-handle
    (stat dir path)
    (stat dir path)
-   (fn [_stat] true)
+   (fn [stat] (not (nil? stat)))
    (fn [_e] false)))
    (fn [_e] false)))
 
 
 (defn dir-exists?
 (defn dir-exists?

+ 27 - 35
src/main/frontend/fs/capacitor_fs.cljs

@@ -82,36 +82,26 @@
                      (p/let [d (first dirs)
                      (p/let [d (first dirs)
                              files (<readdir d)
                              files (<readdir d)
                              files (->> files
                              files (->> files
-                                        (remove (fn [file]
-                                                  (or (string/starts-with? file ".")
-                                                      (and (mobile-util/native-android?)
-                                                           (or (string/includes? file "#")
-                                                               (string/includes? file "%")))
-                                                      (= file "bak")))))
-                             files (->> files
-                                        (map (fn [file]
-                                               ;; TODO: use uri-join
-                                               (str (string/replace d #"/+$" "")
-                                                    "/"
-                                                    (if (mobile-util/native-ios?)
-                                                      (js/encodeURI file)
-                                                      file)))))
-                             files-with-stats (p/all (mapv <stat files))
-                             files-dir (->> files-with-stats
+                                        (remove (fn [{:keys [name  type]}]
+                                                  (or (string/starts-with? name ".")
+                                                      (and (= type "directory")
+                                                           (or (= name "bak")
+                                                               (= name "version-files")))))))
+                             files-dir (->> files
                                             (filterv #(= (:type %) "directory"))
                                             (filterv #(= (:type %) "directory"))
                                             (mapv :uri))
                                             (mapv :uri))
                              files-result
                              files-result
                              (p/all
                              (p/all
-                              (->> files-with-stats
+                              (->> files
                                    (filter #(= (:type %) "file"))
                                    (filter #(= (:type %) "file"))
                                    (filter
                                    (filter
                                     (fn [{:keys [uri]}]
                                     (fn [{:keys [uri]}]
                                       (some #(string/ends-with? uri %)
                                       (some #(string/ends-with? uri %)
                                             [".md" ".markdown" ".org" ".edn" ".css"])))
                                             [".md" ".markdown" ".org" ".edn" ".css"])))
                                    (mapv
                                    (mapv
-                                    (fn [{:keys [uri] :as file-result}]
+                                    (fn [{:keys [uri] :as file-info}]
                                       (p/chain (<read-file-with-utf8 uri)
                                       (p/chain (<read-file-with-utf8 uri)
-                                               #(assoc file-result :content %))))))]
+                                               #(assoc file-info :content %))))))]
                        (p/recur (concat result files-result)
                        (p/recur (concat result files-result)
                                 (concat (rest dirs) files-dir)))))]
                                 (concat (rest dirs) files-dir)))))]
     (js->clj result :keywordize-keys true)))
     (js->clj result :keywordize-keys true)))
@@ -221,7 +211,7 @@
 
 
 (defn get-file-path [dir path]
 (defn get-file-path [dir path]
   (let [dir (some-> dir (string/replace #"/+$" ""))
   (let [dir (some-> dir (string/replace #"/+$" ""))
-        dir (if (string/starts-with? dir "/")
+        dir (if (and (not-empty dir) (string/starts-with? dir "/"))
               (do
               (do
                 (js/console.trace "WARN: detect absolute path, use URL instead")
                 (js/console.trace "WARN: detect absolute path, use URL instead")
                 (str "file://" (js/encodeURI dir)))
                 (str "file://" (js/encodeURI dir)))
@@ -271,13 +261,18 @@
                    (log/error :mkdir! {:path dir
                    (log/error :mkdir! {:path dir
                                        :error error})))))
                                        :error error})))))
   (mkdir-recur! [_this dir]
   (mkdir-recur! [_this dir]
-    (p/let [result (.mkdir Filesystem
-                           (clj->js
-                            {:path dir
-                             ;; :directory (.-ExternalStorage Directory)
-                             :recursive true}))]
-      (js/console.log result)
-      result))
+    (p/let
+     [_ (-> (.mkdir Filesystem
+                    (clj->js
+                     {:path dir
+                      :recursive true}))
+            (p/catch (fn [error]
+                       (log/error :mkdir-recur! {:path dir
+                                                 :error error}))))
+      stat (<stat dir)]
+      (if (= (:type stat) "directory")
+        (p/resolved true)
+        (p/rejected (js/Error. "mkdir-recur! failed")))))
   (readdir [_this dir]                  ; recursive
   (readdir [_this dir]                  ; recursive
     (let [dir (if-not (string/starts-with? dir "file://")
     (let [dir (if-not (string/starts-with? dir "file://")
                 (str "file://" dir)
                 (str "file://" dir)
@@ -286,13 +281,13 @@
   (unlink! [this repo path _opts]
   (unlink! [this repo path _opts]
     (p/let [path (get-file-path nil path)
     (p/let [path (get-file-path nil path)
             repo-url (config/get-local-dir repo)
             repo-url (config/get-local-dir repo)
-            recycle-dir (str repo-url config/app-name "/.recycle") ;; logseq/.recycle
+            recycle-dir (util/safe-path-join repo-url config/app-name ".recycle") ;; logseq/.recycle
             ;; convert url to pure path
             ;; convert url to pure path
             file-name (-> (string/replace path repo-url "")
             file-name (-> (string/replace path repo-url "")
                           (string/replace "/" "_")
                           (string/replace "/" "_")
                           (string/replace "\\" "_"))
                           (string/replace "\\" "_"))
-            new-path (str recycle-dir "/" file-name)]
-      (protocol/mkdir! this recycle-dir)
+            new-path (str recycle-dir "/" file-name)
+            _ (protocol/mkdir-recur! this recycle-dir)]
       (protocol/rename! this repo path new-path)))
       (protocol/rename! this repo path new-path)))
   (rmdir! [_this _dir]
   (rmdir! [_this _dir]
     ;; Too dangerous!!! We'll never implement this.
     ;; Too dangerous!!! We'll never implement this.
@@ -330,11 +325,8 @@
          (log/error :copy-file-failed error)))))
          (log/error :copy-file-failed error)))))
   (stat [_this dir path]
   (stat [_this dir path]
     (let [path (get-file-path dir path)]
     (let [path (get-file-path dir path)]
-      (p/let [result (.stat Filesystem (clj->js
-                                        {:path path
-                                         ;; :directory (.-ExternalStorage Directory)
-                                         }))]
-        result)))
+      (p/chain (.stat Filesystem (clj->js {:path path}))
+               #(js->clj % :keywordize-keys true))))
   (open-dir [_this _ok-handler]
   (open-dir [_this _ok-handler]
     (p/let [_ (when (mobile-util/native-android?) (android-check-permission))
     (p/let [_ (when (mobile-util/native-android?) (android-check-permission))
             {:keys [path localDocumentsPath]} (-> (.pickFolder mobile-util/folder-picker)
             {:keys [path localDocumentsPath]} (-> (.pickFolder mobile-util/folder-picker)

+ 65 - 10
src/main/frontend/fs/sync.cljs

@@ -653,6 +653,7 @@
   (<get-remote-graph [this graph-name-opt graph-uuid-opt] "get graph info by GRAPH-NAME-OPT or GRAPH-UUID-OPT")
   (<get-remote-graph [this graph-name-opt graph-uuid-opt] "get graph info by GRAPH-NAME-OPT or GRAPH-UUID-OPT")
   (<get-remote-file-versions [this graph-uuid filepath] "get file's version list")
   (<get-remote-file-versions [this graph-uuid filepath] "get file's version list")
   (<list-remote-graphs [this] "list all remote graphs")
   (<list-remote-graphs [this] "list all remote graphs")
+  (<get-deletion-logs [this graph-uuid from-txid] "get deletion logs from FROM-TXID")
   (<get-diff [this graph-uuid from-txid] "get diff from FROM-TXID, return [txns, latest-txid, min-txid]")
   (<get-diff [this graph-uuid from-txid] "get diff from FROM-TXID, return [txns, latest-txid, min-txid]")
   (<create-graph [this graph-name] "create graph")
   (<create-graph [this graph-name] "create graph")
   (<delete-graph [this graph-uuid] "delete graph")
   (<delete-graph [this graph-uuid] "delete graph")
@@ -1104,9 +1105,9 @@
                        (recur next-continuation-token)))))))]
                        (recur next-continuation-token)))))))]
         (if (instance? ExceptionInfo exp-r)
         (if (instance? ExceptionInfo exp-r)
           exp-r
           exp-r
-          (let [file-meta-list*          (persistent! file-meta-list)
-                encrypted-path-list*     (persistent! encrypted-path-list)
-                path-list-or-exp (<! (<decrypt-fnames rsapi encrypted-path-list*))]
+          (let [file-meta-list*      (persistent! file-meta-list)
+                encrypted-path-list* (persistent! encrypted-path-list)
+                path-list-or-exp     (<! (<decrypt-fnames rsapi encrypted-path-list*))]
             (if (instance? ExceptionInfo path-list-or-exp)
             (if (instance? ExceptionInfo path-list-or-exp)
               path-list-or-exp
               path-list-or-exp
               (let [encrypted-path->path-map (zipmap encrypted-path-list* path-list-or-exp)]
               (let [encrypted-path->path-map (zipmap encrypted-path-list* path-list-or-exp)]
@@ -1157,6 +1158,23 @@
   (<list-remote-graphs [this]
   (<list-remote-graphs [this]
     (.<request this "list_graphs"))
     (.<request this "list_graphs"))
 
 
+  (<get-deletion-logs [this graph-uuid from-txid]
+    (go
+      (let [r (<! (.<request this "get_deletion_log" {:GraphUUID graph-uuid :FromTXId from-txid}))]
+        (if (instance? ExceptionInfo r)
+          r
+          (let [txns-with-encrypted-paths (mapv #(update % :path remove-user-graph-uuid-prefix) (:Transactions r))
+                encrypted-paths           (mapv :path txns-with-encrypted-paths)
+                encrypted-path->path-map
+                (zipmap
+                 encrypted-paths
+                 (<! (<decrypt-fnames rsapi encrypted-paths)))
+                txns
+                (mapv
+                 (fn [txn] (update txn :path #(get encrypted-path->path-map %)))
+                 txns-with-encrypted-paths)]
+            txns)))))
+
   (<get-diff [this graph-uuid from-txid]
   (<get-diff [this graph-uuid from-txid]
     ;; TODO: path in transactions should be relative path(now s3 key, which includes graph-uuid and user-uuid)
     ;; TODO: path in transactions should be relative path(now s3 key, which includes graph-uuid and user-uuid)
     (go
     (go
@@ -2190,6 +2208,21 @@
          (every? #(instance? FileChangeEvent %) es)]}
          (every? #(instance? FileChangeEvent %) es)]}
   (filterv filter-too-huge-files-aux es))
   (filterv filter-too-huge-files-aux es))
 
 
+(defn- filter-local-files-in-deletion-logs
+  [local-all-files-meta deletion-logs]
+  (let [deletion-logs-map (into {} (map (juxt :path identity)) deletion-logs)
+        *keep             (transient #{})
+        *delete           (transient #{})]
+    (doseq [f local-all-files-meta]
+      (let [epoch-long (some-> (get deletion-logs-map (:path f))
+                               :epoch
+                               (* 1000))]
+        (if (and epoch-long (> epoch-long (:last-modified f)))
+          (conj! *delete f)
+          (conj! *keep f))))
+    {:keep   (persistent! *keep)
+     :delete (persistent! *delete)}))
+
 
 
 (defrecord ^:large-vars/cleanup-todo
 (defrecord ^:large-vars/cleanup-todo
     Local->RemoteSyncer [user-uuid graph-uuid base-path repo *sync-state remoteapi
     Local->RemoteSyncer [user-uuid graph-uuid base-path repo *sync-state remoteapi
@@ -2207,7 +2240,7 @@
                    true)
                    true)
                  (or (string/starts-with? (.-dir e) base-path)
                  (or (string/starts-with? (.-dir e) base-path)
                      (string/starts-with? (str "file://" (.-dir e)) base-path)) ; valid path prefix
                      (string/starts-with? (str "file://" (.-dir e)) base-path)) ; valid path prefix
-                 (not (ignored? e)) ;not ignored
+                 (not (ignored? e))     ;not ignored
                  ;; download files will also trigger file-change-events, ignore them
                  ;; download files will also trigger file-change-events, ignore them
                  (let [r (not (contains? (:recent-remote->local-files @*sync-state)
                  (let [r (not (contains? (:recent-remote->local-files @*sync-state)
                                          (<! (<file-change-event=>recent-remote->local-file-item e))))]
                                          (<! (<file-change-event=>recent-remote->local-file-item e))))]
@@ -2253,10 +2286,10 @@
     (<sync-local->remote! [_ es]
     (<sync-local->remote! [_ es]
       (if (empty? es)
       (if (empty? es)
         (go {:succ true})
         (go {:succ true})
-        (let [type          (.-type ^FileChangeEvent (first es))
-              es->paths-xf  (comp
-                             (map #(relative-path %))
-                             (remove ignored?))]
+        (let [type         (.-type ^FileChangeEvent (first es))
+              es->paths-xf (comp
+                            (map #(relative-path %))
+                            (remove ignored?))]
           (go
           (go
             (let [es*   (<! (<filter-checksum-not-consistent es))
             (let [es*   (<! (<filter-checksum-not-consistent es))
                   _     (when (not= (count es*) (count es))
                   _     (when (not= (count es*) (count es))
@@ -2316,7 +2349,9 @@
       (go
       (go
         (let [remote-all-files-meta-c      (<get-remote-all-files-meta remoteapi graph-uuid)
         (let [remote-all-files-meta-c      (<get-remote-all-files-meta remoteapi graph-uuid)
               local-all-files-meta-c       (<get-local-all-files-meta rsapi graph-uuid base-path)
               local-all-files-meta-c       (<get-local-all-files-meta rsapi graph-uuid base-path)
-              remote-all-files-meta-or-exp (<! remote-all-files-meta-c)]
+              deletion-logs-c              (<get-deletion-logs remoteapi graph-uuid @*txid)
+              remote-all-files-meta-or-exp (<! remote-all-files-meta-c)
+              deletion-logs                (<! deletion-logs-c)]
           (if (or (storage-exceed-limit? remote-all-files-meta-or-exp)
           (if (or (storage-exceed-limit? remote-all-files-meta-or-exp)
                   (sync-stop-when-api-flying? remote-all-files-meta-or-exp)
                   (sync-stop-when-api-flying? remote-all-files-meta-or-exp)
                   (decrypt-exp? remote-all-files-meta-or-exp))
                   (decrypt-exp? remote-all-files-meta-or-exp))
@@ -2327,6 +2362,8 @@
                 {:stop true})
                 {:stop true})
             (let [remote-all-files-meta remote-all-files-meta-or-exp
             (let [remote-all-files-meta remote-all-files-meta-or-exp
                   local-all-files-meta  (<! local-all-files-meta-c)
                   local-all-files-meta  (<! local-all-files-meta-c)
+                  {local-all-files-meta :keep delete-local-files :delete}
+                  (filter-local-files-in-deletion-logs local-all-files-meta deletion-logs)
                   diff-local-files      (diff-file-metadata-sets local-all-files-meta remote-all-files-meta)
                   diff-local-files      (diff-file-metadata-sets local-all-files-meta remote-all-files-meta)
                   change-events
                   change-events
                   (sequence
                   (sequence
@@ -2342,7 +2379,25 @@
                    (partition-file-change-events 10)
                    (partition-file-change-events 10)
                    (distinct-file-change-events change-events))]
                    (distinct-file-change-events change-events))]
               (println "[full-sync(local->remote)]"
               (println "[full-sync(local->remote)]"
-                       (count (flatten change-events-partitions)) "files need to sync")
+                       (count (flatten change-events-partitions)) "files need to sync and"
+                       (count delete-local-files) "local files need to delete")
+              ;; 1. delete local files
+              (loop [[f & fs] delete-local-files]
+                (when f
+                  (let [relative-p (relative-path f)]
+                    (when-not (<! (<local-file-not-exist? rsapi base-path relative-p))
+                      (let [fake-recent-remote->local-file-item {:remote->local-type :delete
+                                                                 :checksum nil
+                                                                 :path relative-p}]
+                        (swap! *sync-state sync-state--add-recent-remote->local-files
+                               [fake-recent-remote->local-file-item])
+                        (<! (<delete-local-files rsapi graph-uuid base-path [(relative-path f)]))
+                        (go (<! (timeout 5000))
+                            (swap! *sync-state sync-state--remove-recent-remote->local-files
+                                   [fake-recent-remote->local-file-item])))))
+                  (recur fs)))
+
+              ;; 2. upload local files
               (loop [es-partitions change-events-partitions]
               (loop [es-partitions change-events-partitions]
                 (if @*stopped
                 (if @*stopped
                   {:stop true}
                   {:stop true}

+ 6 - 6
templates/tutorial-pl.md

@@ -3,18 +3,18 @@
 - To jest 3 minutowy samouczek jak używać Logseq. Rozpoczynajmy!
 - To jest 3 minutowy samouczek jak używać Logseq. Rozpoczynajmy!
 - Masz tutaj kilka podpowiedzi, które mogą być przydatne podczas pracy z programem.
 - Masz tutaj kilka podpowiedzi, które mogą być przydatne podczas pracy z programem.
 #+BEGIN_TIP
 #+BEGIN_TIP
-Kliknij aby rozpocząć edycję bloku.
+Kliknij, aby rozpocząć edycję bloku.
 Każdorazowe naciśnięcie `Enter` tworzy nowy blok.
 Każdorazowe naciśnięcie `Enter` tworzy nowy blok.
 Zaś `Shift+Enter` tworzy nową linię w tym samym bloku.
 Zaś `Shift+Enter` tworzy nową linię w tym samym bloku.
 Napisanie `/` pokazuje wszystkie dostępne komendy.
 Napisanie `/` pokazuje wszystkie dostępne komendy.
 #+END_TIP
 #+END_TIP
-- 1. Stwórzmy stronę [[Jak pisać zwykłe notatki?]]. Możesz kliknąć ten link aby otworzyć wybraną stronę, albo kliknąć z wciśniętym klawiszem `Shift` aby otworzyć go w panelu bocznym! Powinieneś widzieć teraz zarówno _Połączone referencje_ jak i _Niepołączone referencje_.
-- 2. Odwołajmy się do niektórych bloków strony [[Jak pisać zwykłe notatki?]], możesz kliknąć z `Shift` dowolne odwołanie aby otworzyć je w panelu bocznym. Spróbuj zmienić cokolwiek
+- 1. Stwórzmy stronę [[Jak pisać zwykłe notatki?]].Możesz kliknąć ten link, aby otworzyć wybraną stronę albo kliknąć z wciśniętym klawiszem `Shift`, aby otworzyć go w panelu bocznym! Powinieneś widzieć teraz zarówno _Powiązane referencje_ jak i _Niepowiązane referencje_.
+- 2. Odwołajmy się do niektórych bloków strony [[Jak pisać zwykłe notatki?]], możesz kliknąć z `Shift` dowolne odwołanie, aby otworzyć je w panelu bocznym. Spróbuj zmienić cokolwiek
 w prawym panelu. Zmiany powinny być widoczne w wybranych blokach w centralnej części edytora!
 w prawym panelu. Zmiany powinny być widoczne w wybranych blokach w centralnej części edytora!
     - ((5f713e91-8a3c-4b04-a33a-c39482428e2d)) : To jest odwołanie do wybranegoo bloku.
     - ((5f713e91-8a3c-4b04-a33a-c39482428e2d)) : To jest odwołanie do wybranegoo bloku.
     - ((5f713ea8-8cba-403d-ac00-9964b1ec7190)) : To jest odwołanie do innego bloku.
     - ((5f713ea8-8cba-403d-ac00-9964b1ec7190)) : To jest odwołanie do innego bloku.
 - 3. Czy Logseq wspiera tagi?
 - 3. Czy Logseq wspiera tagi?
-    - Oczywiście!! To jest #przyład tagu.
+    - Oczywiście! To jest #przyład tagu.
 - 4. Czy Logseq wspiera todosy np. todo/doing/done oraz priorytety?
 - 4. Czy Logseq wspiera todosy np. todo/doing/done oraz priorytety?
     - Tak jest! Wciśnij `/` i wybierz ulubione słowo todo lub priorytet z listy (A/B/C).
     - Tak jest! Wciśnij `/` i wybierz ulubione słowo todo lub priorytet z listy (A/B/C).
     - NOW [#A] Zwykły samouczek nt. "Jak pisać zwykłe notatki?"
     - NOW [#A] Zwykły samouczek nt. "Jak pisać zwykłe notatki?"
@@ -23,5 +23,5 @@ w prawym panelu. Zmiany powinny być widoczne w wybranych blokach w centralnej c
 
 
     - DONE Stworzyć nową stronę
     - DONE Stworzyć nową stronę
     - CANCELED [#C] Stworzyć stronę z przynajmniej tysiącem innych bloków
     - CANCELED [#C] Stworzyć stronę z przynajmniej tysiącem innych bloków
-- To by było na tyle! Możesz dodać więcej treści do tego grafu lub otworzyć lokalny katalog aby zaimportować swoje notatki!
-- Możesz także ściągnąć naszą pulpitową aplikację na [Github](https://github.com/logseq/logseq/releases)
+- To by było na tyle! Możesz dodać więcej treści do tego grafu lub otworzyć lokalny katalog, aby zaimportować swoje notatki!
+- Możesz także ściągnąć naszą aplikację desktopową na [Github](https://github.com/logseq/logseq/releases)

+ 4 - 4
yarn.lock

@@ -480,10 +480,10 @@
   resolved "https://registry.yarnpkg.com/@kanru/rage-wasm/-/rage-wasm-0.2.1.tgz#dd8fdd3133992c42bf68c0086d8cad40a13bc329"
   resolved "https://registry.yarnpkg.com/@kanru/rage-wasm/-/rage-wasm-0.2.1.tgz#dd8fdd3133992c42bf68c0086d8cad40a13bc329"
   integrity sha512-sYi4F2mL6Mpcz7zbS4myasw11xLBEbgZkDMRVg9jNxTKt6Ct/LT7/vCHDmEzAFcPcPqixD5De6Ql3bJijAX0/w==
   integrity sha512-sYi4F2mL6Mpcz7zbS4myasw11xLBEbgZkDMRVg9jNxTKt6Ct/LT7/vCHDmEzAFcPcPqixD5De6Ql3bJijAX0/w==
 
 
-"@logseq/[email protected].5":
-  version "0.0.5"
-  resolved "https://registry.yarnpkg.com/@logseq/capacitor-file-sync/-/capacitor-file-sync-0.0.5.tgz#e391d3ec9eb65d200fa5af18738913d19a223f39"
-  integrity sha512-3cdpwt5lsEE7occQwJKaalaKGXxgucSDzFNeRkRQMylRehlZskAQtCjgDFR7Wt3tBQZdLZmjpgj7ioYQesWbTA==
+"@logseq/[email protected].6":
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/@logseq/capacitor-file-sync/-/capacitor-file-sync-0.0.6.tgz#e738ec08c1249ad96560c5f5090a60f4f49d679a"
+  integrity sha512-gnSAm2x9jNAtlQP4r8S5P2a7vRYZkGDIh6wX1/UgldDHPaY//+SWYvtFQQeDEJ1rLU/S+UYnPndlQdMDpu6mqA==
 
 
 "@logseq/[email protected]":
 "@logseq/[email protected]":
   version "1.3.1-1"
   version "1.3.1-1"