From 5a19ec55b8a69d5f48ae60075dccc4506e220d2e Mon Sep 17 00:00:00 2001 From: Aditya Date: Wed, 24 Jun 2026 12:12:41 +0530 Subject: [PATCH 1/2] fix: exact tag matching, menu positioning, CI check, and cleanup - Fix tag bulk delete/export to use exact tag matching (not substring) - Fix tag context menu position to use click coordinates - Remove dead sort code in RemindersPage (completed tasks already filtered) - Fix CI version bump check to handle package.json and tauri.conf.json independently - Remove unused @codemirror/autocomplete dependency --- .github/workflows/ci.yml | 13 +++++++--- package-lock.json | 37 +++++++++------------------- package.json | 1 - src/components/NoteSearch.tsx | 41 +++++++++++++++++--------------- src/components/RemindersPage.tsx | 3 +-- 5 files changed, 44 insertions(+), 51 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 71efbab..ca1a255 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,10 +31,17 @@ jobs: MAIN_TAURI_VERSION=$(git show origin/main:src-tauri/tauri.conf.json | grep '"version"' | head -1 | awk -F: '{ print $2 }' | sed 's/[", ]//g') CURR_TAURI_VERSION=$(grep '"version"' src-tauri/tauri.conf.json | head -1 | awk -F: '{ print $2 }' | sed 's/[", ]//g') - if [ "$MAIN_VERSION" != "$CURR_VERSION" ] || [ "$MAIN_TAURI_VERSION" != "$CURR_TAURI_VERSION" ]; then - echo "Version bumped. Checking for New Features note..." + if [ "$MAIN_VERSION" != "$CURR_VERSION" ]; then + echo "package.json version bumped. Checking for New Features note..." if [ ! -f "notes/New Features in v${CURR_VERSION}.md" ]; then - echo "Error: Missing notes/New Features in v${CURR_VERSION}.md" + echo "Error: Missing notes/New Features in v${CURR_VERSION}.md for package.json version" + exit 1 + fi + fi + if [ "$MAIN_TAURI_VERSION" != "$CURR_TAURI_VERSION" ]; then + echo "tauri.conf.json version bumped. Checking for New Features note..." + if [ ! -f "notes/New Features in v${CURR_TAURI_VERSION}.md" ]; then + echo "Error: Missing notes/New Features in v${CURR_TAURI_VERSION}.md for tauri.conf.json version" exit 1 fi fi diff --git a/package-lock.json b/package-lock.json index de0df29..91ab626 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,6 @@ "name": "papercache", "version": "0.5.2", "dependencies": { - "@codemirror/autocomplete": "^6.20.3", "@tauri-apps/api": "^2.11.1", "@tauri-apps/plugin-autostart": "^2.5.1", "@tauri-apps/plugin-dialog": "^2.7.1", @@ -395,6 +394,7 @@ "version": "6.20.3", "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.3.tgz", "integrity": "sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==", + "dev": true, "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -484,6 +484,7 @@ "version": "6.12.3", "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.3.tgz", "integrity": "sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==", + "dev": true, "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -522,6 +523,7 @@ "version": "6.7.0", "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.0.tgz", "integrity": "sha512-Zbl9NyscLMZkfXPQnNAIIAFftidrA1UbcJEIMp24C0Bukc2I5T8wJS0wsXYsnDOqCFJUeJ1BITGNs5CqPDSmSg==", + "dev": true, "license": "MIT", "dependencies": { "@marijn/find-cluster-break": "^1.0.0" @@ -544,6 +546,7 @@ "version": "6.43.2", "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.2.tgz", "integrity": "sha512-8kU6WNRYBKV9Sw3cxNz+uSvUvx3tt+1qgupGFPubnbLFDHOgh5qQdIGmXcD7bkA/PROK6LDKVhKMpcY7H++Amg==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -695,31 +698,6 @@ "node": ">=20.19.0" } }, - "node_modules/@emnapi/core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", - "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@emnapi/wasi-threads": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", @@ -1439,6 +1417,7 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.2.tgz", "integrity": "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==", + "dev": true, "license": "MIT" }, "node_modules/@lezer/css": { @@ -1457,6 +1436,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "dev": true, "license": "MIT", "dependencies": { "@lezer/common": "^1.3.0" @@ -1490,6 +1470,7 @@ "version": "1.4.10", "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.10.tgz", "integrity": "sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==", + "dev": true, "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0" @@ -1510,6 +1491,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "dev": true, "license": "MIT" }, "node_modules/@napi-rs/wasm-runtime": { @@ -3083,6 +3065,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "dev": true, "license": "MIT" }, "node_modules/cross-spawn": { @@ -5584,6 +5567,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "dev": true, "license": "MIT" }, "node_modules/supports-color": { @@ -6024,6 +6008,7 @@ "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "dev": true, "license": "MIT" }, "node_modules/w3c-xmlserializer": { diff --git a/package.json b/package.json index c17eb84..b86fc55 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,6 @@ ] }, "dependencies": { - "@codemirror/autocomplete": "^6.20.3", "@tauri-apps/api": "^2.11.1", "@tauri-apps/plugin-autostart": "^2.5.1", "@tauri-apps/plugin-dialog": "^2.7.1", diff --git a/src/components/NoteSearch.tsx b/src/components/NoteSearch.tsx index a3656e4..a38b0f5 100644 --- a/src/components/NoteSearch.tsx +++ b/src/components/NoteSearch.tsx @@ -22,6 +22,7 @@ export function NoteSearch() { const [activeTag, setActiveTag] = useState(null) const [tagActionMenuIndex, setTagActionMenuIndex] = useState(0) + const [tagMenuPos, setTagMenuPos] = useState({ x: 0, y: 0 }) if (!showNoteSearch) return null @@ -31,6 +32,14 @@ export function NoteSearch() { return isAuto ? n.content.split('\n')[0].trim() || 'New Note' : fileName } + const getNoteTags = (n: Note): string[] => { + const matches = n.content.match(/![a-zA-Z0-9_-]+/g) + return matches || [] + } + + const tagMatch = (tag: string) => (n: Note) => + getNoteTags(n).some((t) => t.toLowerCase() === tag.toLowerCase()) + const filteredNotes = notes.filter( (n) => n.content.toLowerCase().includes(noteSearchQuery.toLowerCase()) || @@ -40,10 +49,7 @@ export function NoteSearch() { const allTags = new Set() notes.forEach((n) => { - const matches = n.content.match(/![a-zA-Z0-9_-]+/g) - if (matches) { - matches.forEach((m) => allTags.add(m.toLowerCase())) - } + getNoteTags(n).forEach((m) => allTags.add(m.toLowerCase())) }) const tagArray = Array.from(allTags).sort() @@ -71,11 +77,11 @@ export function NoteSearch() { e.preventDefault() const tag = activeTag setActiveTag(null) + if (!tag) return + const matchNotes = notes.filter(tagMatch(tag)) if (tagActionMenuIndex === 0) { const doDelete = async () => { - const notesToDelete = notes.filter((n) => - n.content.toLowerCase().includes(tag.toLowerCase()) - ) + const notesToDelete = matchNotes await window.electronAPI.setDialogOpen(true) const confirmed = await confirm( `Delete ${notesToDelete.length} notes containing tag ${tag}?`, @@ -101,9 +107,7 @@ export function NoteSearch() { doDelete() } else if (tagActionMenuIndex === 1) { const doExport = async () => { - const notesToExport = notes.filter((n) => - n.content.toLowerCase().includes(tag.toLowerCase()) - ) + const notesToExport = matchNotes const combinedContent = notesToExport .map((n) => { const title = getNoteTitle(n) @@ -214,9 +218,9 @@ export function NoteSearch() {
- n.content.toLowerCase().includes(tag.toLowerCase()) - ) + if (!tag) return + const notesToDelete = notes.filter(tagMatch(tag)) await window.electronAPI.setDialogOpen(true) const confirmed = await confirm( `Delete ${notesToDelete.length} notes containing tag ${tag}?`, @@ -305,9 +308,8 @@ export function NoteSearch() { e.stopPropagation() const tag = activeTag setActiveTag(null) - const notesToExport = notes.filter((n) => - n.content.toLowerCase().includes(tag.toLowerCase()) - ) + if (!tag) return + const notesToExport = notes.filter(tagMatch(tag)) const combinedContent = notesToExport .map((n) => { const title = getNoteTitle(n) @@ -361,6 +363,7 @@ export function NoteSearch() { e.stopPropagation() setActiveTag(tag) setTagActionMenuIndex(0) + setTagMenuPos({ x: e.clientX, y: e.clientY }) setShowNoteActionMenu(false) }} > diff --git a/src/components/RemindersPage.tsx b/src/components/RemindersPage.tsx index d3371c8..8d63db2 100644 --- a/src/components/RemindersPage.tsx +++ b/src/components/RemindersPage.tsx @@ -56,9 +56,8 @@ export const RemindersPage: React.FC = ({ } }) - // Sort: Overdue first, then soonest, then no target, then done + // Sort: Overdue first, then soonest, then no target reminders.sort((a, b) => { - if (a.done !== b.done) return a.done ? 1 : -1 if (a.targetMs && b.targetMs) return a.targetMs - b.targetMs if (a.targetMs) return -1 if (b.targetMs) return 1 From 12e5799998610d45dc97b02fc2c14630fc2dea78 Mon Sep 17 00:00:00 2001 From: Aditya Date: Wed, 24 Jun 2026 12:22:43 +0530 Subject: [PATCH 2/2] fix: restore missing @emnapi entries in lockfile --- package-lock.json | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 91ab626..5aaa462 100644 --- a/package-lock.json +++ b/package-lock.json @@ -394,7 +394,6 @@ "version": "6.20.3", "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.3.tgz", "integrity": "sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==", - "dev": true, "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -484,7 +483,6 @@ "version": "6.12.3", "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.3.tgz", "integrity": "sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==", - "dev": true, "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -523,7 +521,6 @@ "version": "6.7.0", "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.0.tgz", "integrity": "sha512-Zbl9NyscLMZkfXPQnNAIIAFftidrA1UbcJEIMp24C0Bukc2I5T8wJS0wsXYsnDOqCFJUeJ1BITGNs5CqPDSmSg==", - "dev": true, "license": "MIT", "dependencies": { "@marijn/find-cluster-break": "^1.0.0" @@ -546,7 +543,6 @@ "version": "6.43.2", "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.2.tgz", "integrity": "sha512-8kU6WNRYBKV9Sw3cxNz+uSvUvx3tt+1qgupGFPubnbLFDHOgh5qQdIGmXcD7bkA/PROK6LDKVhKMpcY7H++Amg==", - "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -698,6 +694,31 @@ "node": ">=20.19.0" } }, + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emnapi/wasi-threads": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", @@ -1417,7 +1438,6 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.2.tgz", "integrity": "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==", - "dev": true, "license": "MIT" }, "node_modules/@lezer/css": { @@ -1436,7 +1456,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", - "dev": true, "license": "MIT", "dependencies": { "@lezer/common": "^1.3.0" @@ -1470,7 +1489,6 @@ "version": "1.4.10", "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.10.tgz", "integrity": "sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==", - "dev": true, "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0" @@ -1491,7 +1509,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", - "dev": true, "license": "MIT" }, "node_modules/@napi-rs/wasm-runtime": { @@ -3065,7 +3082,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", - "dev": true, "license": "MIT" }, "node_modules/cross-spawn": { @@ -5567,7 +5583,6 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", - "dev": true, "license": "MIT" }, "node_modules/supports-color": { @@ -6008,7 +6023,6 @@ "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", - "dev": true, "license": "MIT" }, "node_modules/w3c-xmlserializer": {