- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
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.
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
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
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>
- 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.
- 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.
- Refactored the `IndexPersistence` implementation to improve error handling and logging when querying directory paths.
- Updated the change detection logic to always load existing entries during reindexing, ensuring accurate detection of moves, modifications, and deletions.
- Introduced a new test suite for folder rename operations, covering both persistent and ephemeral indexing scenarios, validating UUID/inode preservation and parent-child relationship integrity.
- Enhanced the `IndexingHarnessBuilder` to allow disabling the filesystem watcher for specific tests, improving test flexibility.
- Added closure table integrity verification to ensure proper connections between renamed folders and their children, preventing data inconsistencies.