diff --git a/e2e/helpers/getters/lineage-view/card/get-card-text.ts b/e2e/helpers/getters/lineage-view/card/get-card-text.ts index ee84156..33e5afb 100644 --- a/e2e/helpers/getters/lineage-view/card/get-card-text.ts +++ b/e2e/helpers/getters/lineage-view/card/get-card-text.ts @@ -1,7 +1,7 @@ import { ElementHandle } from '@playwright/test'; import invariant from 'tiny-invariant'; -export const MARKDOWN_PREVIEW = '.preview-container'; +export const MARKDOWN_PREVIEW = '.lng-prev'; export const getCardText = async ( card: ElementHandle, ) => { diff --git a/e2e/helpers/interactions/lineage-view/card/delete-card-using-button.ts b/e2e/helpers/interactions/lineage-view/card/delete-card-using-button.ts index 85e928b..3dfba76 100644 --- a/e2e/helpers/interactions/lineage-view/card/delete-card-using-button.ts +++ b/e2e/helpers/interactions/lineage-view/card/delete-card-using-button.ts @@ -17,4 +17,6 @@ export const deleteCardUsingButton = async () => { invariant(button); await button.click(); await delay(SHORT); + await button.click(); + await delay(SHORT); }; diff --git a/e2e/helpers/interactions/lineage-view/card/select-card.ts b/e2e/helpers/interactions/lineage-view/card/select-card.ts index 0ba9c9b..33ff568 100644 --- a/e2e/helpers/interactions/lineage-view/card/select-card.ts +++ b/e2e/helpers/interactions/lineage-view/card/select-card.ts @@ -1,10 +1,17 @@ import { getCardsOfColumns } from '../../../getters/lineage-view/card/get-cards-of-columns'; import { delay, SHORT } from '../../../general/delay'; import { MARKDOWN_PREVIEW } from '../../../getters/lineage-view/card/get-card-text'; +import { LINEAGE_INLINE_EDITOR } from '../../../getters/lineage-view/card/get-inline-editor'; -export const selectCard = async (column: number, cardNumber: number) => { +export const selectCard = async ( + column: number, + cardNumber: number, + mode: 'preview' | 'edit' = 'preview', +) => { const card = (await getCardsOfColumns())[column][cardNumber]; await card.click(); - await card.waitForSelector(MARKDOWN_PREVIEW); + await card.waitForSelector( + mode === 'preview' ? MARKDOWN_PREVIEW : LINEAGE_INLINE_EDITOR, + ); await delay(SHORT); }; diff --git a/e2e/helpers/interactions/lineage-view/hotkeys/delete-card-using-hotkey.ts b/e2e/helpers/interactions/lineage-view/hotkeys/delete-card-using-hotkey.ts index b5a84f4..370f239 100644 --- a/e2e/helpers/interactions/lineage-view/hotkeys/delete-card-using-hotkey.ts +++ b/e2e/helpers/interactions/lineage-view/hotkeys/delete-card-using-hotkey.ts @@ -6,4 +6,6 @@ export const deleteCardUsingHotkey = async () => { await __obsidian__.waitForSelector(LINEAGE_CARD_ACTIVE); await __obsidian__.keyboard.press('Control+Backspace'); await delay(SHORT); + await __obsidian__.keyboard.press('Control+Backspace'); + await delay(SHORT); }; diff --git a/e2e/helpers/interactions/lineage-view/search/set-search-query.ts b/e2e/helpers/interactions/lineage-view/search/set-search-query.ts index 3671125..a68824d 100644 --- a/e2e/helpers/interactions/lineage-view/search/set-search-query.ts +++ b/e2e/helpers/interactions/lineage-view/search/set-search-query.ts @@ -3,7 +3,7 @@ import { getActiveView } from '../../../getters/lineage-view/card/get-active-vie import { delay, SHORT } from '../../../general/delay'; import { __obsidian__ } from '../../../getters/obsidian/load-obsidian'; -export const SEL_SEARCH_INPUT = `input[aria-label="Search document"]`; +export const SEL_SEARCH_INPUT = `input.search-input-element`; export const setSearchQuery = async (query: string) => { const input = await getSearchInput(); diff --git a/e2e/helpers/interactions/lineage-view/search/toggle-search-query.ts b/e2e/helpers/interactions/lineage-view/search/toggle-search-query.ts index c4cbdea..30ccd26 100644 --- a/e2e/helpers/interactions/lineage-view/search/toggle-search-query.ts +++ b/e2e/helpers/interactions/lineage-view/search/toggle-search-query.ts @@ -1,7 +1,7 @@ import invariant from 'tiny-invariant'; import { getActiveView } from '../../../getters/lineage-view/card/get-active-view'; -const SEL_SEARCH_TOGGLE = `button[aria-label${'Toggle search input'}]`; +const SEL_SEARCH_TOGGLE = `button[aria-label="${'Toggle search input'}"]`; export const toggleSearchQuery = async () => { const view = await getActiveView(); diff --git a/e2e/helpers/interactions/lineage-view/search/toggle-show-all-search-results.ts b/e2e/helpers/interactions/lineage-view/search/toggle-show-all-search-results.ts new file mode 100644 index 0000000..0a9c3b8 --- /dev/null +++ b/e2e/helpers/interactions/lineage-view/search/toggle-show-all-search-results.ts @@ -0,0 +1,11 @@ +import invariant from 'tiny-invariant'; +import { getActiveView } from '../../../getters/lineage-view/card/get-active-view'; + +const SELECTOR = `div[aria-label="${'Show all cards'}"]`; + +export const toggleShowAllSearchResults = async () => { + const view = await getActiveView(); + const button = await view.$(SELECTOR); + invariant(button); + await button.click(); +}; diff --git a/e2e/tests/card-hotkeys.spec.ts b/e2e/tests/card-hotkeys.spec.ts index 930aa03..eadd2a1 100644 --- a/e2e/tests/card-hotkeys.spec.ts +++ b/e2e/tests/card-hotkeys.spec.ts @@ -19,6 +19,7 @@ import { toggleSearchUsingHotkey } from '../helpers/interactions/lineage-view/ho import { setSearchQuery } from '../helpers/interactions/lineage-view/search/set-search-query'; import { getTextsOfColumns } from '../helpers/getters/lineage-view/card/get-texts-of-columns'; import { discardInputChanges } from '../helpers/interactions/lineage-view/hotkeys/discard-input-changes'; +import { toggleShowAllSearchResults } from '../helpers/interactions/lineage-view/search/toggle-show-all-search-results'; test.describe('card hotkeys', () => { test('save card, edit card and discard changes using hotkey', async () => { @@ -359,6 +360,7 @@ test.describe('card hotkeys', () => { await toggleSearchUsingHotkey(); await setSearchQuery('4'); + await toggleShowAllSearchResults(); expect(await getTextsOfColumns()).toEqual([[], [], [n4]]); diff --git a/package-lock.json b/package-lock.json index cd9c97f..0814640 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "devDependencies": { "@commitlint/cli": "17.4.0", "@commitlint/config-conventional": "17.4.0", - "@playwright/test": "1.42.1", + "@playwright/test": "1.49.1", "@tsconfig/svelte": "5.0.2", "@types/diff": "5.2.1", "@types/electron": "1.6.10", @@ -1243,18 +1243,18 @@ } }, "node_modules/@playwright/test": { - "version": "1.42.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.42.1.tgz", - "integrity": "sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ==", + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz", + "integrity": "sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==", "dev": true, "dependencies": { - "playwright": "1.42.1" + "playwright": "1.49.1" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@rollup/rollup-android-arm-eabi": { @@ -5526,33 +5526,33 @@ } }, "node_modules/playwright": { - "version": "1.42.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.42.1.tgz", - "integrity": "sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==", + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz", + "integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==", "dev": true, "dependencies": { - "playwright-core": "1.42.1" + "playwright-core": "1.49.1" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" }, "optionalDependencies": { "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.42.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.42.1.tgz", - "integrity": "sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==", + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz", + "integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==", "dev": true, "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/playwright/node_modules/fsevents": { diff --git a/package.json b/package.json index fb29b5e..210dab7 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "devDependencies": { "@commitlint/cli": "17.4.0", "@commitlint/config-conventional": "17.4.0", - "@playwright/test": "1.42.1", + "@playwright/test": "1.49.1", "@tsconfig/svelte": "5.0.2", "@types/diff": "5.2.1", "@types/electron": "1.6.10", diff --git a/playwright.config.ts b/playwright.config.ts index 6f050b8..ff024d2 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -23,7 +23,7 @@ export default defineConfig({ /* Opt out of parallel tests on CI. */ workers: 1, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: 'html', + reporter: 'null', /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ use: { /* Base URL to use in actions like `await page.goto('/')`. */ diff --git a/src/lang/lang.ts b/src/lang/lang.ts index 5cd1870..5034b71 100644 --- a/src/lang/lang.ts +++ b/src/lang/lang.ts @@ -120,7 +120,7 @@ export const lang = { // undo controls_history: 'History', - controls_history_undo: 'Undo change', + controls_history_undo: 'Undo', controls_history_redo: 'Redo', hk_undo_change: 'Undo change', hk_redo_change: 'Redo change', diff --git a/src/obsidian/helpers/inline-editor/inline-editor.ts b/src/obsidian/helpers/inline-editor/inline-editor.ts index d46a25e..0a6bd15 100644 --- a/src/obsidian/helpers/inline-editor/inline-editor.ts +++ b/src/obsidian/helpers/inline-editor/inline-editor.ts @@ -94,9 +94,25 @@ export class InlineEditor { this.inlineView.editor.focus(); }; + isCursorInRange = (cursor: EditorPosition): boolean => { + const docStart = { line: 0, ch: 0 }; + const lastLine = this.inlineView.editor.lastLine(); + const docEnd = { + line: lastLine, + ch: this.inlineView.editor.getLine(lastLine).length, + }; + + const isLineInRange = + cursor.line >= docStart.line && cursor.line <= docEnd.line; + const isChInRange = + (cursor.line === docStart.line ? cursor.ch >= docStart.ch : true) && + (cursor.line === docEnd.line ? cursor.ch <= docEnd.ch : true); + + return isLineInRange && isChInRange; + }; restoreCursor = () => { const existingCursor = this.cursorPositions.get(this.nodeId!); - if (existingCursor) { + if (existingCursor && this.isCursorInRange(existingCursor)) { this.setCursor(existingCursor); } else { const lastLine = this.inlineView.editor.lastLine(); @@ -108,10 +124,10 @@ export class InlineEditor { } }; - unloadNode(nodeId?: string) { + unloadNode(nodeId?: string, discardChanges = false) { const currentNodeId = this.nodeId; if (nodeId && nodeId !== currentNodeId) return; - if (currentNodeId) { + if (currentNodeId && !discardChanges) { this.saveContent(); const cursor = this.getCursor(); this.cursorPositions.set(currentNodeId, cursor); diff --git a/src/view/actions/keyboard-shortcuts/helpers/commands/commands/helpers/cancel-changes.ts b/src/view/actions/keyboard-shortcuts/helpers/commands/commands/helpers/cancel-changes.ts index 7a18b13..143e91d 100644 --- a/src/view/actions/keyboard-shortcuts/helpers/commands/commands/helpers/cancel-changes.ts +++ b/src/view/actions/keyboard-shortcuts/helpers/commands/commands/helpers/cancel-changes.ts @@ -3,7 +3,7 @@ import { LineageView } from 'src/view/view'; export const cancelChanges = (view: LineageView) => { const documentViewState = view.viewStore.getValue().document; if (documentViewState.pendingConfirmation.disableEdit) { - view.inlineEditor.unloadNode(); + view.inlineEditor.unloadNode(undefined, true); if (documentViewState.editing.isInSidebar) { view.viewStore.dispatch({ type: 'view/sidebar/disable-edit', diff --git a/src/view/components/container/toolbar/components/search-input.svelte b/src/view/components/container/toolbar/components/search-input.svelte index dfa98d6..49959e1 100644 --- a/src/view/components/container/toolbar/components/search-input.svelte +++ b/src/view/components/container/toolbar/components/search-input.svelte @@ -8,7 +8,6 @@ const viewStore = view.viewStore; const search = searchStore(view); - let focusTimeout: ReturnType; const onInput = ( // eslint-disable-next-line no-undef e: Event & { currentTarget: EventTarget & HTMLInputElement },