浏览代码

Merge branch 'master' into feat/whiteboards-onboarding

Tienson Qin 2 年之前
父节点
当前提交
7331000bb1

+ 11 - 5
.github/workflows/build-ios-release.yml

@@ -20,23 +20,23 @@ jobs:
     runs-on: macos-latest
     steps:
       - name: Check out Git repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
         with:
           ref: ${{ github.event.inputs.git-ref }}
 
       - name: Install Node.js, NPM and Yarn
-        uses: actions/setup-node@v2
+        uses: actions/setup-node@v3
         with:
           node-version: ${{ env.NODE_VERSION }}
 
       - name: Setup Java JDK
-        uses: actions/setup-java@v2
+        uses: actions/setup-java@v3
         with:
           distribution: 'zulu'
           java-version: ${{ env.JAVA_VERSION }}
 
       - name: Cache clojure deps
-        uses: actions/cache@v2
+        uses: actions/cache@v3
         with:
           path: |
             ~/.m2/repository
@@ -44,7 +44,7 @@ jobs:
           key: ${{ runner.os }}-clojure-lib-${{ hashFiles('**/deps.edn') }}
 
       - name: Setup clojure
-        uses: DeLaGuardo/setup-clojure@3.5
+        uses: DeLaGuardo/setup-clojure@10.1
         with:
           cli: ${{ env.CLOJURE_VERSION }}
 
@@ -75,3 +75,9 @@ jobs:
           SLACK_URL: ${{ secrets.SLACK_URL }}
           MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
           MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }}
+
+      - name: Save Static File
+        uses: actions/upload-artifact@v3
+        with:
+          name: static
+          path: static

+ 27 - 23
.github/workflows/build.yml

@@ -30,10 +30,10 @@ jobs:
 
     steps:
       - name: Checkout
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
 
       - name: Set up Node
-        uses: actions/setup-node@v2
+        uses: actions/setup-node@v3
         with:
           node-version: ${{ env.NODE_VERSION }}
           cache: 'yarn'
@@ -42,18 +42,18 @@ jobs:
             static/yarn.lock
 
       - name: Set up Java
-        uses: actions/setup-java@v2
+        uses: actions/setup-java@v3
         with:
           distribution: 'zulu'
           java-version: ${{ env.JAVA_VERSION }}
 
       - name: Set up Clojure
-        uses: DeLaGuardo/setup-clojure@master
+        uses: DeLaGuardo/setup-clojure@10.1
         with:
           cli: ${{ env.CLOJURE_VERSION }}
 
       - name: Clojure cache
-        uses: actions/cache@v2
+        uses: actions/cache@v3
         id: clojure-deps
         with:
           path: |
@@ -79,23 +79,19 @@ jobs:
 
     steps:
       - name: Checkout
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
 
       - name: Set up Java
-        uses: actions/setup-java@v2
+        uses: actions/setup-java@v3
         with:
           distribution: 'zulu'
           java-version: ${{ env.JAVA_VERSION }}
 
       - name: Set up Clojure
-        uses: DeLaGuardo/setup-clojure@master
+        uses: DeLaGuardo/setup-clojure@10.1
         with:
           cli: ${{ env.CLOJURE_VERSION }}
-
-      - name: Setup Babashka
-        uses: turtlequeue/[email protected]
-        with:
-          babashka-version: ${{ env.BABASHKA_VERSION }}
+          bb: ${{ env.BABASHKA_VERSION }}
 
       - name: Run clj-kondo lint
         run: clojure -M:clj-kondo --parallel --lint src
@@ -117,10 +113,10 @@ jobs:
 
     steps:
       - name: Checkout
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
 
       - name: Set up Node
-        uses: actions/setup-node@v2
+        uses: actions/setup-node@v3
         with:
           node-version: ${{ env.NODE_VERSION }}
           cache: 'yarn'
@@ -129,13 +125,13 @@ jobs:
             static/yarn.lock
 
       - name: Set up Java
-        uses: actions/setup-java@v2
+        uses: actions/setup-java@v3
         with:
           distribution: 'zulu'
           java-version: ${{ env.JAVA_VERSION }}
 
       - name: Set up Clojure
-        uses: DeLaGuardo/setup-clojure@master
+        uses: DeLaGuardo/setup-clojure@10.1
         with:
           cli: ${{ env.CLOJURE_VERSION }}
 
@@ -154,7 +150,7 @@ jobs:
         run: clojure -A:cljs -P
 
       - name: Shadow-cljs cache
-        uses: actions/cache@v2
+        uses: actions/cache@v3
         with:
           path: .shadow-cljs
           # ensure update cache every time
@@ -178,15 +174,23 @@ jobs:
       - name: Ensure static yarn.lock is up to date
         run: git diff --exit-code static/yarn.lock
 
-      - name: Run Playwright test
-        run: xvfb-run -- yarn e2e-test
+      - name: Run Playwright test - 1/2
+        run: xvfb-run -- npx playwright test --reporter github --shard=1/2
+        env:
+          LOGSEQ_CI: true
+          DEBUG: "pw:api"
+          RELEASE: true # skip dev only test
+
+      - name: Run Playwright test - 2/2
+        run: xvfb-run -- npx playwright test --reporter github --shard=2/2
         env:
-          CI: true
+          LOGSEQ_CI: true
           DEBUG: "pw:api"
+          RELEASE: true # skip dev only test
 
       - name: Save test artifacts
         if: ${{ failure() }}
-        uses: actions/upload-artifact@v2
+        uses: actions/upload-artifact@v3
         with:
           name: e2e-test-report
-          path: artifacts.zip
+          path: e2e-dump/*

+ 1 - 1
.github/workflows/e2e.yml

@@ -142,7 +142,7 @@ jobs:
       - name: Run Playwright test
         run: xvfb-run -- npx playwright test --reporter github --shard=${{ matrix.shard }}/3
         env:
-          CI: true
+          LOGSEQ_CI: true
           DEBUG: "pw:api"
           RELEASE: true # skip dev only test
 

+ 4 - 12
.github/workflows/graph-parser.yml

@@ -53,14 +53,10 @@ jobs:
           java-version: ${{ env.JAVA_VERSION }}
 
       - name: Set up Clojure
-        uses: DeLaGuardo/setup-clojure@master
+        uses: DeLaGuardo/setup-clojure@10.1
         with:
           cli: ${{ env.CLOJURE_VERSION }}
-
-      - name: Setup Babashka
-        uses: turtlequeue/[email protected]
-        with:
-          babashka-version: ${{ env.BABASHKA_VERSION }}
+          bb: ${{ env.BABASHKA_VERSION }}
 
       - name: Clojure cache
         uses: actions/cache@v3
@@ -103,14 +99,10 @@ jobs:
           java-version: ${{ env.JAVA_VERSION }}
 
       - name: Set up Clojure
-        uses: DeLaGuardo/setup-clojure@master
+        uses: DeLaGuardo/setup-clojure@10.1
         with:
           cli: ${{ env.CLOJURE_VERSION }}
-
-      - name: Setup Babashka
-        uses: turtlequeue/[email protected]
-        with:
-          babashka-version: ${{ env.BABASHKA_VERSION }}
+          bb: ${{ env.BABASHKA_VERSION }}
 
       - name: Run clj-kondo lint
         run: clojure -M:clj-kondo --parallel --lint src test

+ 1 - 1
e2e-tests/accessibility.spec.ts

@@ -11,5 +11,5 @@ test('should not have any automatically detectable accessibility issues', async
         .setLegacyMode()
         .analyze()
 
-        expect(accessibilityScanResults.violations).toEqual([]);
+    expect(accessibilityScanResults.violations).toEqual([]);
 })

+ 1 - 1
e2e-tests/basic.spec.ts

@@ -246,4 +246,4 @@ test('Scheduled date picker should point to the already specified Date #6985', a
   // Close date picker
   await page.click('a.opacity-80')
   await page.waitForTimeout(500)
-})
+})

+ 0 - 2
e2e-tests/code-editing.spec.ts

@@ -194,8 +194,6 @@ test('click outside to exit', async ({ page }) => {
 test('click language label to exit #3463', async ({ page, block }) => {
   await createRandomPage(page)
 
-  await block.enterNext();
-
   await page.fill('.block-editor textarea', '```cpp\n```')
   await page.waitForTimeout(200)
   await escapeToCodeEditor(page)

+ 18 - 0
e2e-tests/fixtures.ts

@@ -70,6 +70,16 @@ base.beforeAll(async () => {
   console.log("Test start with:", info)
 
   page = await electronApp.firstWindow()
+
+  // inject testing flags
+  await page.evaluate(
+    () => {
+      Object.assign(window, {
+        __E2E_TESTING__: true,
+      })
+    },
+  )
+
   // Direct Electron console to watcher
   page.on('console', consoleLogWatcher)
   page.on('crash', () => {
@@ -108,6 +118,12 @@ base.beforeEach(async () => {
     await page.keyboard.press('Escape')
     await page.keyboard.press('Escape')
 
+    const locator = page.locator('.notification-close-button').first()
+    while (await locator.isVisible()) {
+      await locator.click()
+      expect(locator.isVisible()).resolves.toBe(false)
+    }
+
     const rightSidebar = page.locator('.cp__right-sidebar-inner')
     if (await rightSidebar.isVisible()) {
       await page.click('button.toggle-right-sidebar', {delay: 100})
@@ -119,6 +135,8 @@ base.afterAll(async () => {
   // if (electronApp) {
   //  await electronApp.close()
   //}
+  // use .dump as extension to avoid unfolded when zip by github
+  await context.tracing.stop({ path: 'e2e-dump/trace.zip.dump' });
 })
 
 // hijack electron app into the test context

+ 1 - 1
e2e-tests/logseq-url.spec.ts

@@ -10,7 +10,7 @@ test("Logseq URLs (same graph)", async ({ page, block }) => {
   await block.mustFill(identify_text)
 
   // paste current page's URL to another page, then redirect throught the URL
-  await page.click('.ui__dropdown-trigger')
+  await page.click('.ui__dropdown-trigger .toolbar-dots-btn')
   await page.locator("text=Copy page URL").click()
   await createRandomPage(page)
   await block.mustFill("") // to enter editing mode

+ 19 - 12
e2e-tests/page-search.spec.ts

@@ -8,7 +8,7 @@ import { IsMac, createRandomPage, newBlock, newInnerBlock, randomString, lastBlo
  * Consider diacritics
  ***/
 
- test('Search page and blocks (diacritics)', async ({ page }) => {
+test('Search page and blocks (diacritics)', async ({ page, block }) => {
   let hotkeyOpenLink = 'Control+o'
   let hotkeyBack = 'Control+['
   if (IsMac) {
@@ -21,28 +21,35 @@ import { IsMac, createRandomPage, newBlock, newInnerBlock, randomString, lastBlo
   // diacritic opening test
   await createRandomPage(page)
 
-  await page.fill('textarea >> nth=0', '[[Einführung in die Allgemeine Sprachwissenschaft' + rand + ']] diacritic-block-1')
+  await block.mustType('[[Einführung in die Allgemeine Sprachwissenschaft' + rand + ']] diacritic-block-1', { delay: 10 })
   await page.keyboard.press(hotkeyOpenLink)
 
+  const pageTitle = page.locator('.page-title').first()
+  expect(await pageTitle.innerText()).toEqual('Einführung in die Allgemeine Sprachwissenschaft' + rand)
+
+  await page.waitForTimeout(500)
+
   // build target Page with diacritics
-  await lastBlock(page)
-  await page.type('textarea >> nth=0', 'Diacritic title test content')
+  await block.activeEditing(0)
+  await block.mustType('Diacritic title test content', { delay: 10 })
 
-  await page.keyboard.press('Enter')
-  await page.fill('textarea >> nth=0', '[[Einführung in die Allgemeine Sprachwissenschaft' + rand + ']] diacritic-block-2')
+  await block.enterNext()
+  await block.mustType('[[Einführung in die Allgemeine Sprachwissenschaft' + rand + ']] diacritic-block-2', { delay: 10 })
   await page.keyboard.press(hotkeyBack)
 
   // check if diacritics are indexed
   await page.click('#search-button')
   await page.waitForSelector('[placeholder="Search or create page"]')
-  await page.fill('[placeholder="Search or create page"]', 'Einführung in die Allgemeine Sprachwissenschaft' + rand)
+  await page.type('[placeholder="Search or create page"]', 'Einführung in die Allgemeine Sprachwissenschaft' + rand, { delay: 10 })
 
   await page.waitForTimeout(2000) // wait longer for search contents to render
-  const results = await page.$$('#ui__ac-inner>div')
-  expect(results.length).toBeGreaterThan(3) // 2 blocks + 1 page + 2 page content
-  await page.keyboard.press("Escape")
-  await page.keyboard.press("Escape")
-  await page.waitForTimeout(1000) // wait for modal disappear
+  // 2 blocks + 1 page + 1 page content
+  const searchResults = page.locator('#ui__ac-inner>div')
+  await expect(searchResults).toHaveCount(4)
+
+  await page.keyboard.press("Escape") // escape search box typing
+  await page.waitForTimeout(500)
+  await page.keyboard.press("Escape") // escape modal
 })
 
 async function alias_test(page: Page, page_name: string, search_kws: string[]) {

+ 2 - 2
e2e-tests/sidebar.spec.ts

@@ -12,7 +12,7 @@ test('favorite item and recent item test', async ({ page }) => {
   const fav_page_name = await createRandomPage(page)
   let favs = await page.$$('.favorite-item a')
   let previous_fav_count = favs.length
-  await page.click('.ui__dropdown-trigger')
+  await page.click('.ui__dropdown-trigger .toolbar-dots-btn')
   await page.locator("text=Add to Favorites").click()
   // click from another page
   const another_page_name = await createRandomPage(page)
@@ -24,7 +24,7 @@ test('favorite item and recent item test', async ({ page }) => {
   expect(await page.innerText(':nth-match(.recent-item a, 2)')).toBe(another_page_name)
 
   // remove fav
-  await page.click('.ui__dropdown-trigger')
+  await page.click('.ui__dropdown-trigger .toolbar-dots-btn')
   await page.locator("text=Unfavorite page").click()
   await expect(page.locator('.favorite-item a')).toHaveCount(previous_fav_count)
 

+ 4 - 4
package.json

@@ -4,9 +4,9 @@
     "private": true,
     "main": "static/electron.js",
     "devDependencies": {
-        "@axe-core/playwright": "^4.4.4",
+        "@axe-core/playwright": "=4.4.4",
         "@capacitor/cli": "^4.0.0",
-        "@playwright/test": "^1.24.2",
+        "@playwright/test": "=1.25.2",
         "@tailwindcss/aspect-ratio": "0.4.2",
         "@tailwindcss/forms": "0.5.3",
         "@tailwindcss/line-clamp": "0.4.2",
@@ -20,7 +20,7 @@
         "gulp-clean-css": "^4.3.0",
         "ip": "1.1.8",
         "npm-run-all": "^4.1.5",
-        "playwright": "^1.24.2",
+        "playwright": "=1.25.2",
         "postcss": "8.4.17",
         "postcss-cli": "10.0.0",
         "postcss-import": "15.0.0",
@@ -107,7 +107,7 @@
         "d3-force": "3.0.0",
         "diff": "5.0.0",
         "dompurify": "2.4.0",
-        "electron": "19.0.12",
+        "electron": "19.1.8",
         "electron-dl": "3.3.0",
         "fs": "0.0.1-security",
         "fs-extra": "9.1.0",

+ 4 - 4
resources/package.json

@@ -13,8 +13,8 @@
     "electron:make": "electron-forge make",
     "electron:make-macos-arm64": "electron-forge make --platform=darwin --arch=arm64",
     "electron:publish:github": "electron-forge publish",
-    "rebuild:better-sqlite3": "electron-rebuild -v 19.0.12 -f -w better-sqlite3",
-    "rebuild:all": "electron-rebuild -v 19.0.12 -f",
+    "rebuild:better-sqlite3": "electron-rebuild -v 19.1.8 -f -w better-sqlite3",
+    "rebuild:all": "electron-rebuild -v 19.1.8 -f",
     "postinstall": "install-app-deps"
   },
   "config": {
@@ -49,13 +49,13 @@
     "@electron-forge/maker-rpm": "^6.0.0-beta.57",
     "@electron-forge/maker-squirrel": "^6.0.0-beta.57",
     "@electron-forge/maker-zip": "^6.0.0-beta.57",
-    "electron": "19.0.12",
+    "electron": "19.1.8",
     "electron-builder": "^22.11.7",
     "electron-forge-maker-appimage": "https://github.com/logseq/electron-forge-maker-appimage.git",
     "electron-rebuild": "3.2.5"
   },
   "resolutions": {
-    "**/electron": "19.0.12",
+    "**/electron": "19.1.8",
     "**/node-gyp": "9.0.0"
   }
 }

+ 1 - 1
shadow-cljs.edn

@@ -36,7 +36,7 @@
         :closure-defines  {goog.debug.LOGGING_ENABLED       true
                            frontend.config/ENABLE-PLUGINS   #shadow/env ["ENABLE_PLUGINS"   :as :bool :default true]
                            frontend.config/ENABLE-FILE-SYNC-PRODUCTION #shadow/env ["ENABLE_FILE_SYNC_PRODUCTION" :as :bool :default true]
-                           frontend.config/TEST #shadow/env ["CI" :as :bool :default false]}
+                           frontend.config/TEST #shadow/env ["LOGSEQ_CI" :as :bool :default false]}
 
         ;; NOTE: electron, browser/mobile-app use different asset-paths.
         ;;   For browser/mobile-app devs, assets are located in /static/js(via HTTP root).

+ 18 - 15
src/electron/electron/search.cljs

@@ -215,12 +215,15 @@
 
 (defn- search-blocks-aux
   [database sql input page limit]
-  (let [stmt (prepare database sql)]
-    (js->clj
-     (if page
-       (.all ^object stmt (int page) input limit)
-       (.all ^object stmt  input limit))
-     :keywordize-keys true)))
+  (try
+    (let [stmt (prepare database sql)]
+      (js->clj
+       (if page
+         (.all ^object stmt (int page) input limit)
+         (.all ^object stmt  input limit))
+       :keywordize-keys true))
+    (catch :default e
+      (logger/error "Search blocks failed: " (str e)))))
 
 (defn- get-match-inputs
   [q]
@@ -285,27 +288,28 @@
 (defn- search-pages-aux
   [database sql input limit]
   (let [stmt (prepare database sql)]
-    (map search-pages-res-unpack (-> (.raw ^object stmt)
-                                     (.all input limit)
-                                     (js->clj)))))
+    (try
+      (doall
+       (map search-pages-res-unpack (-> (.raw ^object stmt)
+                                        (.all input limit)
+                                        (js->clj))))
+      (catch :default e
+        (logger/error "Search page failed: " (str e))))))
 
 (defn search-pages
   [repo q {:keys [limit]}]
   (when-let [database (get-db repo)]
     (when-not (string/blank? q)
       (let [match-inputs (get-match-inputs q)
-            non-match-input (str "%" (string/replace q #"\s+" "%") "%")
             limit  (or limit 20)
             ;; https://www.sqlite.org/fts5.html#the_highlight_function
             ;; the 2nd column in pages_fts (content)
             ;; pfts_2lqh is a key for retrieval
             ;; highlight and snippet only works for some matching with high rank
-            snippet-aux "snippet(pages_fts, 1, '$pfts_2lqh>$', '$<pfts_2lqh$', '...', 32)"
+            snippet-aux "snippet(pages_fts, 1, ' $pfts_2lqh>$ ', ' $<pfts_2lqh$ ', '...', 32)"
             select (str "select rowid, uuid, content, " snippet-aux " from pages_fts where ")
             match-sql (str select
                            " content match ? order by rank limit ?")
-            non-match-sql (str select
-                               " content like ? limit ?")
             matched-result (->>
                             (map
                               (fn [match-input]
@@ -313,8 +317,7 @@
                               match-inputs)
                             (apply concat))]
         (->>
-         (concat matched-result
-          (search-pages-aux database non-match-sql non-match-input limit))
+         matched-result
          (distinct-by :id)
          (take limit)
          (vec))))))

+ 3 - 3
src/main/frontend/format/block.cljs

@@ -1,7 +1,6 @@
 (ns frontend.format.block
   "Block code needed by app but not graph-parser"
-  (:require ["@sentry/react" :as Sentry]
-            [cljs-time.format :as tf]
+  (:require [cljs-time.format :as tf]
             [clojure.string :as string]
             [frontend.config :as config]
             [frontend.date :as date]
@@ -29,7 +28,8 @@ and handles unexpected failure."
                               :date-formatter (state/get-date-formatter)})
     (catch :default e
       (log/error :exception e)
-      (Sentry/captureException e)
+      (state/pub-event! [:capture-error {:error e
+                                         :payload {:type "Extract-blocks"}}])
       (notification/show! "An unexpected error occurred during block extraction." :error)
       [])))
 

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

@@ -228,11 +228,7 @@
         (str prefix "///private/" others))
 
       :else
-      (do
-        (state/pub-event! [:capture-error {:error (js/Error. "ios path missing slashes")
-                                           :payload {:type :error/ios-path-missing-slashes
-                                                     :path (gp-util/safe-subs (str path) 12)}}])
-        path))
+      path)
     path))
 
 (defn normalize-file-protocol-path [dir path]

+ 11 - 11
src/main/frontend/fs/sync.cljs

@@ -778,17 +778,17 @@
 
 (declare <rsapi-cancel-all-requests)
 
-(defn- build-local-file-metadatas
-  [this graph-uuid result]
-  (loop [[[path metadata] & others] (js->clj result)
-         result #{}]
+(defn- <build-local-file-metadatas
+  [this graph-uuid r]
+  (go-loop [[[path metadata] & others] (js->clj r)
+            result #{}]
     (if-not (and path metadata)
       ;; finish
       result
       (let [normalized-path (path-normalize path)
-            encryptedFname (if (not= path normalized-path)
-                             (first (<! (<encrypt-fnames this graph-uuid [normalized-path])))
-                             (get metadata "encryptedFname"))]
+            encryptedFname  (if (not= path normalized-path)
+                              (first (<! (<encrypt-fnames this graph-uuid [normalized-path])))
+                              (get metadata "encryptedFname"))]
         (recur others
                (conj result
                      (->FileMetadata (get metadata "size") (get metadata "md5") normalized-path
@@ -816,12 +816,12 @@
       (let [r (<! (<retry-rsapi #(p->c (ipc/ipc "get-local-all-files-meta" graph-uuid base-path))))]
         (if (instance? ExceptionInfo r)
           r
-          (build-local-file-metadatas this graph-uuid r)))))
+          (<! (<build-local-file-metadatas this graph-uuid r))))))
   (<get-local-files-meta [this graph-uuid base-path filepaths]
     (go
       (let [r (<! (<retry-rsapi #(p->c (ipc/ipc "get-local-files-meta" graph-uuid base-path filepaths))))]
         (assert (not (instance? ExceptionInfo r)) "get-local-files-meta shouldn't return exception")
-        (build-local-file-metadatas this graph-uuid r))))
+        (<! (<build-local-file-metadatas this graph-uuid r)))))
   (<rename-local-file [_ graph-uuid base-path from to]
     (<retry-rsapi #(p->c (ipc/ipc "rename-local-file" graph-uuid base-path
                                   (path-normalize from)
@@ -900,7 +900,7 @@
                                                                                :basePath base-path}))))]
         (if (instance? ExceptionInfo r)
           r
-          (build-local-file-metadatas this graph-uuid (.-result r))))))
+          (<! (<build-local-file-metadatas this graph-uuid (.-result r)))))))
 
   (<get-local-files-meta [this graph-uuid base-path filepaths]
     (go
@@ -909,7 +909,7 @@
                                                       :basePath base-path
                                                       :filePaths filepaths}))))]
         (assert (not (instance? ExceptionInfo r)) "get-local-files-meta shouldn't return exception")
-        (build-local-file-metadatas this graph-uuid (.-result r)))))
+        (<! (<build-local-file-metadatas this graph-uuid (.-result r))))))
 
   (<rename-local-file [_ graph-uuid base-path from to]
     (p->c (.renameLocalFile mobile-util/file-sync

+ 8 - 2
src/main/frontend/handler/events.cljs

@@ -371,6 +371,7 @@
      (fn []
        (let [filename-format (state/get-filename-format repo)]
          (when (and (util/electron?)
+                    (not (util/ci?))
                     (not (config/demo-graph?))
                     (not= filename-format :triple-lowbar))
            (state/pub-event! [:ui/notify-outdated-filename-format []]))))
@@ -420,8 +421,13 @@
   (posthog/capture type payload))
 
 (defmethod handle :capture-error [[_ {:keys [error payload]}]]
-  (Sentry/captureException error
-                           (bean/->js {:extra payload})))
+  (let [[user-uuid graph-uuid tx-id] @sync/graphs-txid
+        payload (assoc payload
+                       :user-id user-uuid
+                       :graph-id graph-uuid
+                       :tx-id tx-id)]
+    (Sentry/captureException error
+                            (bean/->js {:extra payload}))))
 
 (defmethod handle :exec-plugin-cmd [[_ {:keys [pid cmd action]}]]
   (commands/exec-plugin-simple-command! pid cmd action))

+ 3 - 7
src/main/frontend/handler/search.cljs

@@ -9,8 +9,6 @@
             [frontend.util :as util]
             [promesa.core :as p]
             [logseq.graph-parser.text :as text]
-            [frontend.util.drawer :as drawer]
-            [frontend.util.property :as property]
             [electron.ipc :as ipc]
             [goog.functions :refer [debounce]]
             [dommy.core :as dom]))
@@ -26,18 +24,16 @@
 (defn sanity-search-content
   "Convert a block to the display contents for searching"
   [format content]
-  (->> (text/remove-level-spaces content format (config/get-block-pattern format))
-       (drawer/remove-logbook)
-       (property/remove-built-in-properties format)))
+  (text/remove-level-spaces content format (config/get-block-pattern format)))
 
 (defn search
   ([q]
    (search (state/get-current-repo) q))
   ([repo q]
-   (search repo q {:limit 20}))
+   (search repo q {:limit 10}))
   ([repo q {:keys [page-db-id limit more?]
             :or {page-db-id nil
-                 limit 20}
+                 limit 10}
             :as opts}]
    (when-not (string/blank? q)
      (let [page-db-id (if (string? page-db-id)

+ 5 - 0
src/main/frontend/util.cljc

@@ -113,6 +113,11 @@
      []
      (when (electron?) (. js/window -__MOCKED_OPEN_DIR_PATH__))))
 
+#?(:cljs
+   (defn ci?
+     []
+     (boolean (. js/window -__E2E_TESTING__))))
+
 #?(:cljs
    (do
      (def nfs? (and (not (electron?))

+ 1 - 2
tldraw/packages/react/src/components/Canvas/Canvas.tsx

@@ -110,7 +110,6 @@ export const Canvas = observer(function Renderer<S extends TLReactShape>({
   const selectedShapesSet = React.useMemo(() => new Set(selectedShapes || []), [selectedShapes])
   const erasingShapesSet = React.useMemo(() => new Set(erasingShapes || []), [erasingShapes])
   const singleSelectedShape = selectedShapes?.length === 1 ? selectedShapes[0] : undefined
-  const selectedOrHoveredShape = hoveredShape || singleSelectedShape
 
   return (
     <div ref={rContainer} className={`tl-container ${className ?? ''}`}>
@@ -139,7 +138,7 @@ export const Canvas = observer(function Renderer<S extends TLReactShape>({
                 isSelected={selectedShapesSet.has(shape)}
                 isErasing={erasingShapesSet.has(shape)}
                 meta={meta}
-                zIndex={selectedOrHoveredShape === shape ? 10000 : 1000 + i}
+                zIndex={1000 + i}
                 onEditingEnd={onEditingEnd}
               />
             ))}

+ 7 - 7
yarn.lock

@@ -15,7 +15,7 @@
     "@jridgewell/gen-mapping" "^0.1.0"
     "@jridgewell/trace-mapping" "^0.3.9"
 
-"@axe-core/playwright@^4.4.4":
+"@axe-core/playwright@=4.4.4":
   version "4.4.4"
   resolved "https://registry.yarnpkg.com/@axe-core/playwright/-/playwright-4.4.4.tgz#3786c5f6bba38d1991b608584b00ae2744544573"
   integrity sha512-VA7MR1WCqW5tFcUGCXDaaqV9pJUCdOGIR4DiZJrOxGjeRYxz3VwyMc1MDg/yiJ5fQA/QYMx+w0mvqYEr3CPx7w==
@@ -713,7 +713,7 @@
     eventemitter3 "^3.1.0"
     url "^0.11.0"
 
-"@playwright/test@^1.24.2":
+"@playwright/test@=1.25.2":
   version "1.25.2"
   resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.25.2.tgz#e726cf4844f096315c3954fdb3abf295cede43ba"
   integrity sha512-6qPznIR4Fw02OMbqXUPMG6bFFg1hDVNEdihKy0t9K0dmRbus1DyP5Q5XFQhGwEHQkLG5hrSfBuu9CW/foqhQHQ==
@@ -2514,10 +2514,10 @@ electron-to-chromium@^1.4.251:
   resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592"
   integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==
 
-electron@19.0.12:
-  version "19.0.12"
-  resolved "https://registry.yarnpkg.com/electron/-/electron-19.0.12.tgz#73d11cc2a3e4dbcd61fdc1c39561e7a7911046e9"
-  integrity sha512-GOvG0t2NCeJYIfmC3g/dnEAQ71k3nQDbRVqQhpi2YbsYMury0asGJwqnVAv2uZQEwCwSx4XOwOQARTFEG/msWw==
+electron@19.1.8:
+  version "19.1.8"
+  resolved "https://registry.yarnpkg.com/electron/-/electron-19.1.8.tgz#3ce19c270ca86d05bbf0df5ceeaea2d23edc7083"
+  integrity sha512-UfPQdFjgKI0xCm1V5sV3iAVOs0kCwAE91xWzV5tI7ij14yOkxTdXp9BqTzFaSbQYLYxn6q1BUUe1nlzjJjzAnw==
   dependencies:
     "@electron/get" "^1.14.1"
     "@types/node" "^16.11.26"
@@ -5414,7 +5414,7 @@ [email protected]:
   resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.25.2.tgz#ea4baa398a4d45fcdfe48799482b599e3d0f033f"
   integrity sha512-0yTbUE9lIddkEpLHL3u8PoCL+pWiZtj5A/j3U7YoNjcmKKDGBnCrgHJMzwd2J5vy6l28q4ki3JIuz7McLHhl1A==
 
-"playwright@>= 1.0.0", playwright@^1.24.2:
+playwright@=1.25.2, "playwright@>= 1.0.0":
   version "1.25.2"
   resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.25.2.tgz#0fc67e4385a52a51371ff9114bf68e3ad50a7f41"
   integrity sha512-RwMB5SFRV/8wSfK+tK8ycpqdzORvoqUNz9DUeRfSgZFrZej5uuBl9wFjWcc+OkXFEtaPmx1acAVGG7hA4IJ1kg==