Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Filament Record Nav Laravel Package

nben/filament-record-nav

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture Fit

  • Filament-native design: Leverages Filament’s Action class and $livewire injection API, ensuring seamless integration with Filament’s ecosystem (v4/v5). Avoids invasive modifications to core Filament or Laravel.
  • Zero-config simplicity: Default behavior (ID-based navigation) requires no trait or custom logic, aligning with Filament’s philosophy of minimal boilerplate.
  • Extensibility: Optional trait (WithRecordNavigation) enables custom query logic (e.g., filtering by status, tenant-scoped navigation) without forcing it on all users.
  • Performance-optimized: Single database query per action per render via caching ($resolvedRecordCache), critical for large datasets.
  • Future-proof: Relies only on Filament’s stable $livewire API, reducing risk of breaking changes across Filament versions.

Integration Feasibility

  • Low friction: Drop-in actions (PreviousRecordAction, NextRecordAction) integrate into getHeaderActions() with zero resource or model changes.
  • Config-driven: Global defaults (e.g., order_column) can be overridden via published config, reducing per-resource setup.
  • Page-type awareness: Supports view, edit, and custom routes (registered in getPages()), matching Filament’s resource-based architecture.
  • UI consistency: Buttons auto-disable at boundaries (first/last record) and use Filament’s native styling system (icons, colors, tooltips).

Technical Risk

  • Filament version lock: Explicitly supports Filament 4.x/5.x; no backward compatibility with v3 or forward compatibility with v6+ (though Filament’s API stability mitigates this).
  • Query performance: Custom overrides (e.g., getPreviousRecord()) may introduce N+1 queries if not optimized (e.g., eager loading). Mitigation: Document best practices (e.g., indexing order_column).
  • Edge cases: Navigation logic assumes distinct order_column values (e.g., created_at with duplicates). Mitigation: Clear docs + config validation for order_column.
  • Custom route dependency: NavigationPage::custom() requires exact route name matching in getPages(). Mitigation: Runtime validation or IDE hints for route names.

Key Questions

  1. Use Case Alignment:
    • Is navigation primary (e.g., sequential approval workflows) or secondary (e.g., quick browsing)? Prioritize customization if primary.
    • Are records ordered by a non-ID column (e.g., published_at)? If so, ensure proper indexing.
  2. Customization Needs:
    • Will users need filtering (e.g., "only navigate through active records")? If yes, assess trait adoption vs. global config.
    • Are custom pages (beyond view/edit) required? Validate getPages() registration.
  3. Performance:
    • For tables with >100K records, test query performance with custom overrides. Consider adding a limit to navigation queries.
    • Is order_column indexed? If not, add it to avoid full-table scans.
  4. UI/UX:
    • Should buttons use keyboard shortcuts (e.g., mod+left)? Package supports this via Filament’s keyBindings().
    • Should disabled states use gray icons or hidden buttons? Customize via color() and visible() methods.
  5. Testing:
    • How will you test boundary conditions (first/last record)? Mock getPreviousRecord()/getNextRecord() in PHPUnit.
    • For custom routes, verify Resource::getUrl() handles dynamic segments (e.g., {record}).

Integration Approach

Stack Fit

  • Laravel: Compatible with Laravel 10–13; no framework-level changes required.
  • Filament: Designed for Filament 4/5; no Filament core modifications needed.
  • PHP: Requires PHP 8.2+ (type safety for enums, named arguments).
  • Database: Works with Eloquent models; assumes standard query builder methods (e.g., where, orderBy).

Migration Path

  1. Assessment Phase:
    • Audit existing Filament resources to identify:
      • Target pages needing navigation (e.g., ViewRecord, EditRecord).
      • Custom routes in getPages() (if using NavigationPage::custom()).
      • Current ordering logic (e.g., created_at vs. id).
    • Validate order_column candidates (e.g., indexed columns) for performance.
  2. Pilot Integration:
    • Start with one resource (e.g., PostResource) to test:
      • Default behavior (ID-based navigation).
      • Custom page types (e.g., Edit).
      • Boundary handling (first/last record).
    • Use php artisan vendor:publish --tag=filament-record-nav-config to customize order_column.
  3. Rollout:
    • Phase 1: Add actions to getHeaderActions() in target resources.
    • Phase 2: Customize appearance (icons, labels, tooltips) via Filament’s fluent methods.
    • Phase 3: Extend with custom logic (trait) if needed for filtered navigation.
  4. Validation:
    • Test navigation across edge cases (e.g., single record, duplicate order_column values).
    • Verify URL generation for custom routes (e.g., verified-view).

Compatibility

  • Filament Resources: Works with any resource using ViewRecord or EditRecord pages.
  • Custom Pages: Supports pages registered in getPages() via NavigationPage::custom().
  • Multi-tenancy: Custom overrides (trait) enable tenant-scoped navigation (e.g., where('tenant_id', auth()->id())).
  • Localization: Button labels/tooltips can be localized via Filament’s translation system.

Sequencing

  1. Prerequisites:
    • Ensure Laravel/Filament versions meet requirements (PHP 8.2+, Laravel 10+, Filament 4/5).
    • Index the order_column (e.g., id, created_at) for performance.
  2. Installation:
    composer require nben/filament-record-nav
    php artisan vendor:publish --tag=filament-record-nav-config  # Optional
    
  3. Implementation:
    • Add actions to getHeaderActions() in target pages.
    • Configure order_column and directions in config/filament-record-nav.php.
  4. Testing:
    • Manual testing of navigation (next/previous) across records.
    • Automated tests for boundary conditions (first/last record).
  5. Customization:
    • Extend with trait for custom queries (if needed).
    • Override getRecordNavigationUrl() for non-standard routing.

Operational Impact

Maintenance

  • Low overhead: No cron jobs, queues, or external dependencies.
  • Config-driven: Global settings (order_column) reduce per-resource maintenance.
  • Upgrade path: Follow Filament’s release notes for version compatibility (e.g., Filament 5.x may require minor adjustments).
  • Deprecation risk: MIT license; monitor for Filament API changes (e.g., $livewire injection).

Support

  • Troubleshooting:
    • Disabled buttons: Check order_column values (duplicates? distinct?).
    • Custom logic failures: Verify trait methods are correctly overridden.
    • Route errors: Confirm NavigationPage::custom() matches getPages() keys.
  • Documentation: README provides clear examples for common use cases (default, custom pages, overrides).
  • Community: Limited stars (11) but active repo (last release 2026-06-03). Consider opening issues for edge cases.

Scaling

  • Performance:
    • Default behavior: Single query per action per render (optimized via caching).
    • Large datasets: Ensure order_column is indexed. For >1M records, consider adding limit to navigation queries (e.g., ->take(2)).
    • Custom queries: Overrides in getPreviousRecord()/getNextRecord() may degrade performance if not optimized (e.g., avoid select(*)).
  • Concurrency: Stateless actions; no race conditions in navigation logic.
  • Resource usage: Minimal (one query per action per render).

Failure Modes

Failure Scenario Impact Mitigation
order_column has duplicate values Navigation skips records or fails Use a unique column (e.g., id) or add tiebreaker (e.g., created_at).
Custom route name mismatch InvalidArgumentException Validate NavigationPage::custom() against getPages().
Database connection issues Buttons disabled indefinitely Add retry logic or user feedback (e.g., toast).
Custom query returns no results Buttons disabled prematurely Log queries in overrides for debugging.
Filament major version upgrade Package compatibility break Test early; fork
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
hamzi/corewatch
minionfactory/raw-hydrator
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours
renatovdemoura/blade-elements-ui
devgeek/beacon-admin
benjamin-rqt/data-watcher-bundle
atriumphp/atrium
sandermuller/package-boost-laravel
sandermuller/boost-skills
redaxo/core
yusufgenc/filament-api-forge
l3aro/rating-star-for-filament
leek/filament-subtenant-scope