Commit Graph

585 Commits

Author SHA1 Message Date
Jamie Pine
e9e90c0483 feat: finalize bidirectional remote file copy implementation
- Marked the task FILE-005 as done, completing the implementation of bidirectional file transfers with PULL support.
- Updated documentation to reflect the new capabilities and changes in the system.
- Enhanced UI components to support drag-and-drop functionality from remote devices to local folders.
- Added integration tests for PULL operations, ensuring reliability and performance.

This commit concludes the work on enabling users to copy files from remote devices to local destinations seamlessly.
2025-12-26 15:40:55 -08:00
Jamie Pine
2b6f2a14d7 Enhance InstancesTab component for improved device instance display
- Refactored the `InstancesTab` component to group file instances by device, providing a clearer overview of file availability across devices.
- Introduced a new `InstanceRow` component for better organization and readability of individual file instances.
- Added device querying to retrieve device names and icons, enhancing the user interface with relevant device information.
- Updated the layout to improve visual clarity and user experience when viewing alternate file instances.
2025-12-26 12:05:19 -08:00
Jamie Pine
996df041a4 Enhance file querying and alternate instances handling
- Updated `FileByIdQuery` and `FileByPathQuery` to populate alternate paths for files with the same content ID, improving data retrieval for file instances.
- Introduced `get_alternate_paths` method in both queries to fetch alternate file paths from the database.
- Modified the `InstancesTab` component to utilize a new query for alternate instances, enhancing the user interface with detailed instance information.
- Updated TypeScript types to support the new alternate instances query structure, ensuring type safety across the application.
- Adjusted various components to improve the display of alternate file instances, including device and path information.
2025-12-26 11:20:01 -08:00
Jamie Pine
8d0ae5065f Enhance FileSearchOutput structure and update search query logic
- Added a new `files` field to `FileSearchOutput` to provide a flat array of files, improving integration with the explorer.
- Updated the `FileSearchQuery` to join directory paths directly on `parent_id`, simplifying the SQL query.
- Enhanced the query to batch fetch sidecars for content UUIDs, improving performance and data retrieval.
- Adjusted the handling of content identity fields to ensure proper association with files in search results.
- Updated the `SearchView` component to utilize the new `files` array instead of the previous `results` structure.
2025-12-26 10:55:51 -08:00
Jamie Pine
c586544b0c Add device_id to entries for efficient querying
- Introduced a new column `device_id` in the entries table to denormalize device relationships, improving query performance.
- Updated related models and queries to accommodate the new device_id field.
- Enhanced foreign key mappings and migration scripts to support the addition of device_id.
- Adjusted various components to handle device_id, ensuring compatibility across the application.
- Improved release workflow to include specific file types for distribution.
2025-12-26 10:03:51 -08:00
Jamie Pine
51f14bcc43 Refactor MultiFileInspector layout and improve section organization
- Updated the layout of the MultiFileInspector component to enhance visual clarity and usability.
- Removed unnecessary dividers between sections for a cleaner presentation.
- Streamlined the rendering of file types and tags sections, improving code readability and maintainability.
2025-12-26 08:51:46 -08:00
Jamie Pine
7e0cba0f6b Refactor SearchView component for improved readability
- Reformatted import statements for better organization.
- Enhanced code readability by adjusting indentation and line breaks in the SearchGridView and SearchListView functions.
- Ensured consistent formatting across file handling and event functions for clarity.
2025-12-26 06:07:47 -08:00
Jamie Pine
f1547de0af Refactor file transfer protocol to skip encryption and decryption
- Updated `stream_file_data` to bypass encryption, as Iroh provides end-to-end encryption for connections.
- Adjusted `FileTransferProtocolHandler` to skip decryption, directly using the received encrypted data.
- Enhanced logging to reflect changes in data handling during file transfers.
- Added tests to ensure session keys are distinct and validate key swapping functionality.
- Improved error handling in `DevicePersistence` for corrupted session keys during device loading.
2025-12-25 22:33:21 -08:00
Jamie Pine
fd6a9122d6 Update submodule reference and enhance file copy job logging
- Updated macOS subproject reference to indicate a dirty state.
- Refactored `FileCopyJob` to improve logging for final destination calculations.
- Enhanced `stream_file_data` logging to include destination path in transfer requests.
- Added `find_containing` method to `EphemeralIndex` for substring search functionality.
- Improved logging in `ephemeral_search` to track search results and filtering.
- Replaced print statements with tracing logs in `FileTransferProtocolHandler` for better debugging.
2025-12-25 14:31:42 -08:00
Jamie Pine
f7d38828b7 Merge branch 'main' into cursor/search-ui-integration-ephemeral-1978 2025-12-25 13:13:49 -08:00
Jamie Pine
3e64221f2c Implement clipboard functionality and enhance keybind handling
- Added clipboard event handling to support native clipboard operations (copy, cut, paste) based on input focus.
- Introduced functions to check if an input element is focused and to execute native clipboard commands.
- Updated keybind listener to trigger appropriate actions based on clipboard events, differentiating between text input and file operations.
- Enhanced menu setup to ensure clipboard actions are always enabled for better user experience.
2025-12-25 13:07:52 -08:00
Jamie Pine
bcaa1ff85c Implement directory preview and enhance file deletion testing
- Added `DirectoryPreview` component for rendering a grid view of subdirectories in the Quick Preview.
- Updated `ContentRenderer` to utilize `DirectoryPreview` for directory types.
- Introduced TypeScript integration test for verifying cache updates upon file deletions, ensuring accurate directory listing after deletions.
- Enhanced keyboard handling in Explorer to prevent shortcuts when input fields are focused.
2025-12-25 10:50:20 -08:00
Jamie Pine
4d10dd5e14 Enhance Explorer functionality with context menus and keyboard shortcuts
- Added context menu options for creating new folders and pasting files in empty space within the Explorer.
- Implemented keyboard shortcuts for entering tag assignment mode and toggling tags 1-10.
- Refactored keyboard event handling to streamline tag mode activation and file renaming.
- Updated GridView and ListView components to support context menu interactions.
2025-12-25 09:17:29 -08:00
Cursor Agent
98a342e974 feat: Implement search functionality and UI improvements
Co-authored-by: ijamespine <ijamespine@me.com>
2025-12-25 17:11:24 +00:00
Jamie Pine
b452871a67 feat: Integrate search UI with ephemeral and persistent indexes
Implements comprehensive search functionality that intelligently routes between
ephemeral (in-memory) and persistent (FTS5 database) indexes, following the
directory listing pattern for consistency.

**Backend Changes:**
- Add IndexType enum (Persistent/Ephemeral/Hybrid) to communicate which index was used
- Add FilterKind enum to indicate available filters for each search type
- Implement ephemeral_search module with content type filtering via FileTypeRegistry
- Update FileSearchOutput with index_type and available_filters fields
- Add routing logic in FileSearchQuery to determine and use appropriate index
- Support file type, size, date, and content type filters in ephemeral search

**Frontend Changes:**
- Add search mode to Explorer context (browse vs search with query/scope)
- Create SearchView component with placeholder for search results
- Wire up SearchBar with debounced search (300ms, min 2 chars)
- Integrate search mode switching in ExplorerView router

**Key Features:**
- Fast, synchronous search (no events, no jobs)
- Defaults to current folder scope (not global like Finder)
- Backend as source of truth for all search operations
- Content type filtering using FileTypeRegistry.identify_by_extension()
- Ephemeral search supports: file types, size, dates, content types
- Persistent search supports: all ephemeral filters + tags + locations

**Architecture:**
Follows the directory listing pattern: checks location index mode, queries
database, falls back to ephemeral cache. Search results indicate which index
was used and which filters are available for dynamic UI updates.
2025-12-25 08:59:51 -08:00
Jamie Pine
8d157325e1 Merge branch 'main' into feature/file-004-rename-and-folders 2025-12-25 08:13:40 -08:00
Jamie Pine
e5dd16e51b Remove debug flag from GridView component for cleaner production code 2025-12-25 08:05:07 -08:00
Cursor Agent
3f78b97495 Merge main into feature/file-004-rename-and-folders
Resolved conflicts in:
- SelectionContext.tsx: Merged rename state with isActiveTab prop
- useFileContextMenu.ts: Combined rename/folder actions with Open With submenu
- FileCard.tsx: Integrated InlineNameEdit with useOpenWith hook
- TableRow.tsx: Integrated InlineNameEdit with useOpenWith hook
2025-12-25 16:04:48 +00:00
Jamie Pine
6bb6cb6c9a Enhance IndexerJobConfig to support background execution
- Added `run_in_background` field to `IndexerJobConfig` to allow jobs to run without persisting to the database or updating the UI.
- Updated `should_persist` method in `IndexerJob` to account for background jobs.
- Modified `handle_new_directory` in `DatabaseAdapter` to create background indexer jobs.
- Ensured default value for `run_in_background` is set to false in various configurations.
- Introduced a new integration test for bulk file moves to validate cache updates and file handling.
2025-12-25 07:30:07 -08:00
Jamie Pine
050207c3e4 style: Update ThumbstripScrubber to allow pointer events
- Modified the class name in ThumbstripScrubber to enable pointer events, enhancing user interaction capabilities.
2025-12-25 03:08:50 -08:00
Jamie Pine
d24525d470 Merge pull request #2929 from spacedriveapp/cursor/demon-startup-overlay-a536
Demon startup overlay
2025-12-24 17:16:24 -08:00
Jamie Pine
327a255e3e style: Update OverviewTopBar button styling for improved UI
- Modified button styles in OverviewTopBar to enhance visual appeal and user experience.
- Adjusted layout properties, including height, padding, and border styles, for a more modern look.
- Simplified button content structure by removing unnecessary span elements.
2025-12-24 17:15:58 -08:00
Jamie Pine
8488700a07 feat: Add app version retrieval and enhance DaemonStartupOverlay
- Implemented `getAppVersion` method in the platform abstraction to fetch the application version.
- Updated `DaemonStartupOverlay` to display the app version during startup, improving user feedback.
- Introduced a new `Orb` component for enhanced visual effects in the overlay.
- Made minor layout adjustments in various components for better UI consistency.
2025-12-24 17:08:57 -08:00
Jamie Pine
8d9fe080ca refactor: Enhance TabBar component with layout grouping and memoization
- Integrated LayoutGroup from framer-motion to improve tab animations and transitions.
- Added useMemo to ensure safeActiveTabId is derived efficiently, preventing unnecessary re-renders.
- Refactored tab rendering logic for better clarity and performance, maintaining existing functionality.
2025-12-24 16:47:28 -08:00
Jamie Pine
938f8326fa refactor: Simplify daemon overlay management in Explorer component
- Removed the DaemonOverlays component and integrated its functionality into a new ExplorerWithDaemonCheck component.
- The new component conditionally renders the Explorer UI based on the daemon connection status, preventing unnecessary queries during startup.
- Updated DaemonDisconnectedOverlay to accept daemonStatus as a prop for improved state management.
- Refactored useDaemonStatus hook to streamline polling logic and enhance connection handling.
2025-12-24 16:37:44 -08:00
Jamie Pine
60b23a39f8 Merge branch 'main' into cursor/demon-startup-overlay-a536 2025-12-24 16:21:22 -08:00
Jamie Pine
bd38204855 feat: Integrate SwiftRs for macOS file opening functionality
- Added SwiftRs as a dependency in Package.swift to enhance file opening capabilities.
- Updated the get_apps_for_path function to return a JSON string of available applications instead of an array.
- Modified the Swift implementation to align with the new return type and improved data handling.
- Created a new Package.resolved file to manage package dependencies.
2025-12-24 16:15:33 -08:00
Jamie Pine
3c685cc405 Merge branch 'main' into cursor/file-opening-system-implementation-e4cb 2025-12-24 16:00:56 -08:00
Jamie Pine
8f1d66a10e refactor: Improve formatting and structure in SelectionContext component
- Reformatted code for better readability and consistency, including indentation and line breaks.
- Enhanced the clarity of function definitions and context values within the SelectionProvider.
- Maintained existing functionality while improving code maintainability and visual structure.
2025-12-24 15:52:16 -08:00
Jamie Pine
214dfa8180 feat: Enhance drag selection functionality in Explorer views
- Added multi-select capability for the Inspector in the TODO list.
- Updated drag selection logic to prevent conflicts with file dragging when clicking on selected items.
- Adjusted drag selection settings across GridView, ListView, and ColumnView to improve user experience and ensure compatibility with drag-and-drop interactions.
- Refactored related components to streamline event handling and enhance performance.
2025-12-24 15:36:31 -08:00
Jamie Pine
ca8eae04f8 refactor: Remove focus ring from FileCard component
- Eliminated the focus ring styling for the FileCard component to streamline its appearance during drag-and-drop interactions.
- Adjusted class names to enhance visual consistency and user experience in the GridView layout.
2025-12-24 15:18:11 -08:00
Jamie Pine
7df7974f27 Merge branch 'main' into drag-select 2025-12-24 15:06:19 -08:00
Jamie Pine
6146959ce8 feat: Improve TabNavigationGuard to enhance tab switching experience
- Updated `TabNavigationGuard` to track tab switch timing and prevent stale data rendering during brief navigation delays.
- Introduced logic to only block rendering when a tab switch occurs within 50ms, ensuring smoother transitions and improved user experience.
- Clarified documentation regarding the guard's behavior during in-tab navigation.
2025-12-24 15:05:42 -08:00
Jamie Pine
b519f5b582 feat: Add TabNavigationGuard to prevent stale data during tab switches
- Introduced `TabNavigationGuard` component to manage rendering during tab navigation, ensuring that stale data is not displayed while switching tabs.
- Updated `ExplorerView` to wrap view components with `TabNavigationGuard`, enhancing user experience by blocking rendering until navigation completes.
- Removed unused tab management logic from `ColumnView` to streamline component functionality.
2025-12-24 15:00:49 -08:00
Jamie Pine
51bc83d0fe refactor: Streamline Explorer component state management
- Removed unused TabViewSync and associated hooks to simplify tab state handling.
- Integrated columnStack and scrollPosition management directly within ExplorerProvider, enhancing per-tab state synchronization.
- Updated Explorer and ColumnView components to utilize new context values for improved state consistency.
- Refactored view settings handling in ExplorerProvider to align with the new TabManager context structure, ensuring a cohesive user experience across tabs.
2025-12-24 14:46:13 -08:00
Jamie Pine
6631b5cba7 feat: Enhance tab management with view state synchronization
- Introduced `TabViewSync` component to preserve view settings (viewMode, sortBy, gridSize) per tab, improving user experience when switching between tabs.
- Added `useTabColumnSync` hook to maintain column drill-down state across tabs in the ColumnView, ensuring a seamless navigation experience.
- Updated `TabManagerContext` to include new view state management functions, enhancing the overall tab management capabilities.
- Refactored `Explorer` and `ColumnView` components to integrate the new synchronization features, ensuring consistent state handling across the application.
2025-12-24 12:20:12 -08:00
Jamie Pine
1efeb1b170 feat: Implement tab scroll synchronization across Explorer views
- Added `useTabScrollSync` hook to preserve scroll position for each tab in GridView, ListView, and MediaView components.
- Updated respective views to utilize the new hook, enhancing user experience by maintaining scroll state when switching tabs.
- Exported `useTabScrollSync` from TabManager for accessibility across components.
2025-12-24 11:59:11 -08:00
Jamie Pine
671214d742 Refactor: Update Explorer and TabManager components for improved context handling
- Added a placeholder comment in TabView for future per-tab router isolation.
- Updated ExplorerProvider to include a new prop for controlling tab context processing.
- Changed TabManagerProvider's routes prop type to RouteObject for better type safety.
- Cleaned up TabView component by removing unused tab prop and simplifying children handling.
2025-12-24 11:51:52 -08:00
Jamie Pine
2a6c09f426 Refactor: Update TabBar component for improved styling and functionality
- Adjusted layout and styling of the TabBar for better visual consistency and user experience.
- Enhanced tab button styles to support flexible sizing and improved alignment.
- Updated close button positioning and hover effects for better accessibility.
- Refined transition effects for active tab indication, improving responsiveness.
2025-12-24 11:32:24 -08:00
Jamie Pine
65df3e4c28 Refactor: Enhance tab management and layout in Explorer
- Improved tab management by adding TabDefaultsSync for default tab path handling.
- Refactored ExplorerLayoutContent to better structure the layout, including repositioning the TabBar and adjusting content areas.
- Updated TabBar component to conditionally render based on the number of tabs.
- Enhanced tab title derivation logic in TabNavigationSync to reflect current route accurately.
- Cleaned up styles and structure in various components for improved readability and maintainability.
2025-12-24 11:12:50 -08:00
Cursor Agent
0dd4e688cf Fix: Prevent saving path during tab switch
Co-authored-by: ijamespine <ijamespine@me.com>
2025-12-24 18:54:58 +00:00
Jamie Pine
998deacdb6 Implement drag selection feature across Explorer views
- Added a new DragSelect component to facilitate multi-file selection using mouse drag.
- Integrated DragSelect into GridView, ListView, and ColumnView for consistent user experience.
- Enhanced file selection logic to support both single and multi-file selections, including modifier key handling.
- Updated FileCard and TableRow components to include selectable data attributes for drag selection.
- Improved performance with scroll handling during drag operations and optimized event management.
- Introduced context for managing drag selection state and behavior across different views.
2025-12-24 10:42:15 -08:00
Cursor Agent
ff4e03ba62 feat: Implement cross-platform file opening
Co-authored-by: ijamespine <ijamespine@me.com>
2025-12-24 17:59:33 +00:00
Cursor Agent
1fb4a0f8e6 Refactor: Move daemon reconnect reload to ExplorerLayout
Co-authored-by: ijamespine <ijamespine@me.com>
2025-12-24 17:54:21 +00:00
Cursor Agent
ab858bd023 feat: Implement tabbed interface for Explorer
Adds browser-like tabs to the Explorer, allowing users to browse multiple locations simultaneously. Includes tab creation, closing, switching, and navigation persistence.

Co-authored-by: ijamespine <ijamespine@me.com>
2025-12-24 17:34:05 +00:00
Cursor Agent
ca9b8f3f73 Fix: Improve rename functionality and error handling
Co-authored-by: ijamespine <ijamespine@me.com>
2025-12-24 17:26:27 +00:00
Jamie Pine
06f0406b82 feat: Implement file rename and folder creation operations (FILE-004)
Backend:
- Add create_directory() method to VolumeBackend trait
- Implement LocalBackend and CloudBackend create_directory
- Create FileRenameAction with filename validation
- Create CreateFolderAction with optional items parameter

Frontend:
- Add rename state to SelectionContext (renamingFileId, startRename, cancelRename, saveRename)
- Create InlineNameEdit component for inline file name editing
- Integrate inline editing in GridView FileCard and ListView TableRow
- Wire up explorer.renameFile keybind (Enter key)
- Add context menu items: Rename, New Folder, New Folder with Items
2025-12-24 08:59:54 -08:00
Cursor Agent
940bd90a8f feat: Add daemon startup overlay and status hook
Co-authored-by: ijamespine <ijamespine@me.com>
2025-12-24 16:58:56 +00:00
Jamie Pine
546c5ec132 Add file operations for renaming and folder creation
- Introduced new features for file renaming, new folder creation, and creating folders with items.
- Implemented inline editing for file names, integrating with existing keybinds and context menus.
- Enhanced backend with new actions for renaming and folder creation, including validation and job management.
- Developed frontend components for inline editing and integrated them into GridView and ListView.
- Added context menu options for renaming and creating folders, improving user experience.
- Updated styles for job progress indicators to include a barber-pole animation for pending jobs.
2025-12-24 08:36:23 -08:00
Jamie Pine
b555156fa7 Update TODO list and enhance job logging configuration
- Added critical tasks for remote file access and updater functionality to the TODO list.
- Updated job logging configuration to include an option for logging ephemeral jobs, improving logging flexibility.
- Enhanced the job manager to conditionally log job events based on persistence settings, ensuring better tracking of job statuses.
- Refactored the inspector component to remove unnecessary console logs, streamlining the codebase.
- Improved the selection context to eliminate redundant logging during file synchronization, enhancing performance.
2025-12-24 08:04:57 -08:00