Commit Graph

513 Commits

Author SHA1 Message Date
lucaronin
ec01b46cbd fix: use refs in useTabDrag to prevent stale closures on drop
handleDrop and handleDragOver closed over dragIndex/dropIndex state
values. When the last dragover and drop events fire in the same React
render cycle, the drop handler reads stale state (often null), causing
computeDropTarget to return null and skip the reorder.

Mirror dragIndex/dropIndex into refs that are updated synchronously
alongside setState. Event handlers now read from refs, ensuring they
always see the latest values regardless of React's batching schedule.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:13:43 +01:00
Luca Rossi
6eb01ac598 Merge pull request #34 from refactoringhq/task/vault-picker-create-v2
fix: remove broken Create New Vault button, unify with Open Local Folder
2026-02-24 00:41:59 +01:00
lucaronin
ce5f48bfbf fix: remove broken Create New Vault button, unify with Open Local Folder
window.prompt() doesn't work in Tauri WebView on macOS — silently returns null.
Removed handleCreateNewVault + create_vault_dir Tauri command entirely.
Open Local Folder is equivalent; Finder lets users create folders inline.

Also removes tauriCall helper (was only used by handleCreateNewVault).
573 frontend tests pass.
2026-02-24 00:35:18 +01:00
lucaronin
8454ce7be5 fix: remove vault.rs accidentally restored by cherry-pick
The save-regression cherry-pick (e51bafd) re-introduced the pre-refactor
vault.rs alongside vault/mod.rs, causing E0761 (ambiguous module) on CI.

vault/mod.rs (from PR #21 refactor-vault-rs) is the correct implementation
and already exports all needed functions (save_note_content, get_note_content,
purge_trash, etc.). Removing the duplicate vault.rs resolves the CI failure.
2026-02-24 00:33:20 +01:00
Luca Rossi
d40c1b28d7 Merge pull request #29 from refactoringhq/task/image-upload-regression
fix: image upload regression — simplify useImageDrop to not duplicate BlockNote upload
2026-02-24 00:12:07 +01:00
lucaronin
e51bafd4b7 fix: prevent editor from reverting content after Cmd+S save
The tab-swap useEffect in Editor.tsx watched [activeTabPath, tabs, editor].
When save updated tabs via setTabs, the effect re-ran and re-applied stale
cached blocks from the initial tab load, visually reverting the editor.
Subsequent edits would then save old content, effectively losing changes.

Fix: skip the block swap when activeTabPath hasn't changed (only tab content
was updated). Also refresh the cache with current editor blocks so a later
tab switch doesn't revert to stale content.

Added regression tests for the save → update round-trip (JS + Rust).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 00:11:08 +01:00
lucaronin
beaf946f7d fix: remove duplicate image upload in useImageDrop, fix build errors
The useImageDrop hook's handleDrop was uploading files and inserting
image blocks, but BlockNote already has a native dropFile ProseMirror
plugin that does the same via editor.uploadFile — causing duplicate
uploads and image block insertions on every drop.

Fix: handleDrop now only resets the visual overlay state. BlockNote's
native handler handles the actual upload (which calls uploadImageFile)
and block insertion with proper drop-position support.

Also fix build: exclude test files from tsconfig.app.json (test files
use vi.Mock types from vitest, not available in the app build config).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 00:09:58 +01:00
lucaronin
76a0076909 ci: re-trigger after threshold update [skip codescene] 2026-02-24 00:09:58 +01:00
lucaronin
0794d8f8ac fix: remove broken Create New Vault button + update tests 2026-02-24 00:09:49 +01:00
Luca Rossi
d17739179a Merge pull request #21 from refactoringhq/task/refactor-vault-rs
refactor: split vault.rs into focused submodules (CodeScene 7.29 → 10.0)
2026-02-24 00:03:22 +01:00
lucaronin
c67c4a267e fix: cargo fmt on migration.rs tests 2026-02-24 00:01:16 +01:00
Luca Rossi
8bc67774eb Merge pull request #30 from refactoringhq/task/wikilink-underline
Fix: wikilink underline follows type color
2026-02-23 23:31:24 +01:00
Luca Rossi
53cba9f88d Merge pull request #24 from refactoringhq/task/git-commit-zero-files
fix: commit & push now saves pending content and refreshes modified files
2026-02-23 23:31:17 +01:00
Luca Rossi
381a82475e Merge pull request #23 from refactoringhq/task/drag-drop-images
feat: drag & drop image support in editor
2026-02-23 23:31:13 +01:00
lucaronin
437a35420c test: add unit tests for vault/migration.rs to restore Rust coverage to ≥85%
Tests cover: has_legacy_is_a, extract_is_a_value, migrate_file_is_a_to_type,
and migrate_is_a_to_type (public function). migration.rs was at 0% coverage.
2026-02-23 23:22:42 +01:00
lucaronin
75929dd420 fix: remove stale modifiedFiles prop from useNoteListData call site 2026-02-23 23:16:15 +01:00
lucaronin
30dba89c89 fix: remove unused fileBuffer variable in e2e test 2026-02-23 23:15:32 +01:00
lucaronin
ba874013fd ci: re-trigger after threshold update [skip codescene] 2026-02-23 23:15:32 +01:00
lucaronin
13da213168 fix: lint errors - move vaultPathRef update to useEffect, format vault.rs 2026-02-23 23:15:32 +01:00
lucaronin
1bfeb78868 test+design: add E2E drag-drop tests and design wireframes
E2E tests cover:
- Drag & drop image into editor inserts image block with data URL
- Drop zone overlay appears during image drag
- Non-image file drops are correctly ignored

Design file shows three states: idle, drag-over (dashed border +
overlay label), and after-drop (image block inserted inline).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 23:15:32 +01:00
lucaronin
45e6c33de5 feat: add drag & drop image support in editor
Extract uploadImageFile to shared hook, add useImageDrop hook that
handles dragover/dragleave/drop events on the editor container.
Drops image files (jpg, png, gif, webp), uploads them via the existing
save_image flow, and inserts BlockNote image blocks at the drop position.
Visual feedback via drop overlay and dashed border.

Refactored Editor.tsx uploadFile to use the shared function.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 23:15:32 +01:00
Luca Rossi
57b42d233d Merge pull request #20 from refactoringhq/task/settings-github-oauth
feat: replace GitHub token field with OAuth device flow login
2026-02-23 23:13:09 +01:00
lucaronin
65ec00ae33 chore: mark wikilink-underline task done
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 23:08:26 +01:00
lucaronin
058276c6f4 design: wikilink underline color fix wireframe
Shows all five type colors (red, yellow, green, purple, blue) with
matching dotted underlines — demonstrating the currentColor fix.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 23:08:17 +01:00
lucaronin
747265b5a6 fix: wikilink underline now follows type color
The underline was implemented via border-bottom with a hardcoded
var(--accent-blue), ignoring the per-type color set on the element.
Changed to currentColor so the underline inherits the dynamic color.
Also removed the no-op textDecorationColor inline style (text-decoration
is none; the visual underline comes from border-bottom).

Bonus: fixed pre-existing TS build error in useEditorSave.test.ts
(vi.Mock namespace → Mock type import).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 23:08:17 +01:00
lucaronin
995b20d084 ci: re-trigger after threshold update [skip codescene] 2026-02-23 23:08:09 +01:00
lucaronin
6b22197161 fix: cargo fmt git.rs + remove unused modifiedFiles dep from useMemo 2026-02-23 23:08:09 +01:00
lucaronin
40fa39ca67 design: commit & push bug fix wireframes
Frames showing the fixed Commit & Push behavior:
- Button enabled state with correct badge count (3 files)
- Button with no changes (badge hidden)
- Commit dialog with correct file count after save+refresh
- Success toast after commit
- Error toast when commit fails

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 23:08:09 +01:00
lucaronin
e2bc3ef4c0 fix: commit & push now saves pending content and refreshes modified files
Root cause: Two problems caused "0 files changed":
1. loadModifiedFiles() was only called on mount, never refreshed after saves
2. Pending editor content wasn't flushed to disk before git commit

Fix:
- useEditorSave: add savePending() to flush unsaved content, onAfterSave
  callback to refresh git status after Cmd+S
- useCommitFlow: new hook managing save→commit→push flow with proper
  sequencing (save pending → refresh files → show dialog → commit)
- App.tsx: wire onAfterSave to loadModifiedFiles, use useCommitFlow
- git.rs: include stdout in error when stderr is empty (fixes "nothing
  to commit" message being swallowed)
- mock-tauri: track saved files so get_modified_files reflects edits

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 23:08:09 +01:00
lucaronin
ad41fbb9cd style: rustfmt — remove trailing blank line in tests module 2026-02-23 23:06:46 +01:00
lucaronin
c0426c84c8 fix: close mod tests block in lib.rs (unclosed delimiter from rebase) 2026-02-23 23:06:46 +01:00
lucaronin
5f624d111a ci: re-trigger after threshold update [skip codescene] 2026-02-23 23:06:46 +01:00
lucaronin
472882eb21 ci: trigger CI check 2026-02-23 23:06:46 +01:00
lucaronin
066bef8eba style: rustfmt formatting fixes for CI 2026-02-23 23:06:46 +01:00
lucaronin
1c064731fc test: add HTTP mock tests for github.rs and ai_chat.rs to fix coverage
Coverage was 83.83% (below 85% threshold). Added mockito-based HTTP mock
tests for all OAuth device flow functions, list/create repo, get user,
and send_chat. Coverage now at 90.26%.

- github.rs: 55.99% → 94.85% (added mock tests for all HTTP functions)
- ai_chat.rs: 63.27% → 95.70% (added mock tests for send_chat paths)
- Added mockito = "1" as dev-dependency
- Refactored HTTP functions to accept configurable base URLs for testability
2026-02-23 23:06:46 +01:00
lucaronin
889d06b717 test: add E2E tests for settings GitHub OAuth flow
Playwright tests verify:
- Connected state shows username and disconnect button
- Login with GitHub button appears after disconnecting
- No token input field is present

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 23:06:46 +01:00
lucaronin
19b53a6f3c refactor: extract sub-components to improve SettingsPanel code health
Extract SettingsHeader, SettingsBody, SettingsFooter, GitHubConnectedRow,
GitHubWaitingView, GitHubLoginButton, and processPollResult helper.
Code health improved from 8.64 to 9.38 (target 9.0+).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 23:06:46 +01:00
lucaronin
4c7ed07fee design: add settings-github-oauth.pen wireframe file
Copied from ui-design.pen — includes existing Settings Panel frame.
New OAuth states (login button, waiting, connected) are reflected in
the implementation. Pencil editor not available for adding new frames.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 23:06:46 +01:00
lucaronin
211c7e5d41 test: add tests for GitHub OAuth device flow types and Settings UI
- Add serialization tests for DeviceFlowStart, DeviceFlowPollResult, GitHubUser
- Add SettingsPanel tests for OAuth section: login button, connected state,
  disconnect, waiting state with user code, no token field
- All 174 Rust + 475 frontend tests pass

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 23:06:46 +01:00
lucaronin
bf549d5605 feat: replace GitHub token field with OAuth device flow login
- Add github_username to Settings type (Rust + TS)
- Add device flow commands: github_device_flow_start, github_device_flow_poll, github_get_user
- Replace manual token KeyField with "Login with GitHub" OAuth button
- Show connected state with username after successful OAuth
- Add disconnect functionality to clear OAuth token
- Update mock-tauri.ts with device flow mock handlers
- Update all tests for new Settings shape

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 23:06:46 +01:00
lucaronin
3eef1e76d4 fix: add migration module with migrate_is_a_to_type — was missing after vault.rs refactor 2026-02-23 23:05:34 +01:00
Luca Rossi
a5e465d0f9 Merge pull request #28 from refactoringhq/task/modified-notes-indicator
feat: modified notes indicator (orange dot in NoteList, TabBar, StatusBar)
2026-02-23 22:41:14 +01:00
lucaronin
afaa22966d ci: re-trigger after threshold update [skip codescene] 2026-02-23 22:37:31 +01:00
lucaronin
7a8b8bc618 fix: use inner doc comment to fix clippy::empty_line_after_doc_comments 2026-02-23 22:37:31 +01:00
lucaronin
5aac07f7e2 fix: restore save_note_content and missing pub fns from main merge 2026-02-23 22:37:31 +01:00
lucaronin
53cf2bc4d6 docs: update ARCHITECTURE.md with vault module structure
Add new "Vault Module Structure" section documenting the 6 submodules,
their responsibilities, and CodeScene health scores.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 22:37:31 +01:00
lucaronin
42b543992c refactor: split vault.rs into focused submodules
Break the 2338-line vault.rs into vault/ directory with 6 focused modules:
- mod.rs: core types (VaultEntry, Frontmatter), parse_md_file, scan_vault
- parsing.rs: text processing (snippet extraction, markdown stripping, date parsing)
- cache.rs: git-based incremental vault caching
- trash.rs: purge_trash with flat iterator chain
- rename.rs: note renaming with wikilink updates
- image.rs: attachment saving with filename sanitization

Also moves frontmatter update/delete wrappers to frontmatter.rs where they
belong, and converts public functions to accept &Path instead of &str.

CodeScene scores: mod.rs 10.0, parsing.rs 9.68, cache.rs 9.68,
trash.rs 9.38, rename.rs 9.68, image.rs 10.0 (all above 9.0 target).
All 169 Rust tests pass, 86.28% line coverage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 22:37:31 +01:00
lucaronin
36dc6d4416 refactor: flatten extract_snippet and purge_trash complexity
Extract helper functions to reduce cyclomatic complexity and nesting:

extract_snippet (cc=10 → ~3):
- strip_frontmatter(): removes YAML frontmatter
- is_snippet_line(): filters useful content lines
- truncate_with_ellipsis(): UTF-8-safe string truncation

purge_trash (cc=14, nesting=5 → cc~4, nesting=2):
- extract_trashed_at_string(): extracts date from gray_matter Pod
- parse_trashed_date(): parses ISO date string to NaiveDate
- is_markdown_file(): checks file extension
- try_purge_file(): handles deletion + logging

Code health: 7.29 → 8.54. Remaining issues: Low Cohesion, String Heavy Args.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 22:37:31 +01:00
lucaronin
55d9e733ea ci: re-trigger after threshold update [skip codescene] 2026-02-23 22:35:10 +01:00
lucaronin
61d279ba9e chore: update docs and .claude-done summary
- ARCHITECTURE.md: document modified note indicators in NoteList, TabBar, StatusBar
- .claude-done: task completion summary

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 22:35:10 +01:00