m-a-k-o/nova-custom-table-card
A Laravel Nova card for building custom data tables with full control over columns, queries, and formatting. Show tailored metrics and datasets on your dashboards without writing separate Vue components. Simple to configure and ideal for admin panels that need flexible, at-a-glance reporting.
Architecture fit: This is a presentation-layer Laravel Nova card that renders a bounded list of recent records — orders, posts, signups, tickets, failed jobs — inside an existing Nova dashboard. It fits applications already standardized on Laravel + Nova and nothing else; there is no standalone dashboard, API, or cross-framework story. For a TPM, the value proposition is narrow but real: it converts "can the admin dashboard show the last five X?" from a custom PHP/Vue card task into a configuration change, compressing delivery from a sprint to roughly an afternoon. It is a tactical admin-UI accelerator, not reporting infrastructure. Treat it as unsuitable for customer-facing analytics, multi-tenant reporting, exports, drill-downs, or anything requiring an SLA.
Integration feasibility: Low-to-moderate effort for a team already fluent in Nova. Composer install, php artisan nova:publish, then register the card in NovaServiceProvider::cards() or a Dashboard class and configure the model or query, columns, labels, ordering, and row limit. No migrations, and typically no published config for the basic case. The genuine uncertainty is API surface drift on a low-adoption package: exact method names (model(), columns(), limit(), orderBy(), plus inherited width(), canSee(), onlyOnDetail()) should be verified against the installed vendor/ source, not the README, during a short spike.
Technical risk: Medium overall, elevated for critical-path use. Positives: MIT license, a recent release (2025-09-23), small code footprint, read-only scope. Negatives: 45 stars and 0 dependents mean almost no community validation; single-maintainer continuity is a real exposure; Nova major-version compatibility, frontend asset builds, authorization hooks, and tenancy enforcement are unproven until tested. Acceptable for internal admin convenience with version pinning and a documented native-card fallback. Not acceptable where a dashboard outage becomes a business incident.
Key questions:
->canSee() sufficient for the visibility we need?Stack fit: Strong only inside an existing Laravel + Nova application. The TPM should position it as a dashboard/resource-page widget for internal ops, support, and content teams — one narrow card per concern ("Failed jobs", "Pending payouts", "Recent refunds") rather than a generic table browser. Because it presents familiar tabular data, it adds no new surface for users to learn and no new login, which keeps adoption friction near zero.
Migration path: No data migration. Treat adoption as a UI-only addition: install in a non-production environment, configure a read-only query against an existing model or resource, validate rendering and permissions, then promote. If the package disappoints, replace it with a native Nova custom card or a simple Nova resource table backed by the same query — the product decision stays reversible and sunk cost stays small. Capture that fallback in writing before the first production deploy.
Compatibility: Gate on the Nova major version, Laravel version, PHP version, frontend asset compatibility, and whether assets require nova:publish. Confirm dashboard and resource-page behavior, dark mode and responsive rendering, and any CSS conflicts with existing cards. Pin the Composer version immediately after the first successful render and record the compatibility matrix in the service catalog.
Sequencing:
Maintenance: Small code footprint, but low adoption means we are the maintainer of last resort. Pin the version, monitor the repository, and keep a lightweight fork or replacement plan. The TPM should budget explicit ownership (a named engineer or team) rather than recording this as a no-maintenance dependency, and should resist spreading it across many dashboards before compatibility is proven.
Support: Community/GitHub-issue support only — no commercial SLA. Defects and Nova compatibility breaks may require internal Laravel/Vue debugging. Document the owning team, the escalation path, and a disable/rollback procedure before production use. Set stakeholder expectations explicitly: isolated internal convenience, not platform infrastructure.
Scaling: Scaling risk is query cost, not package throughput — the card likely runs a latest-records query on each dashboard render. Require indexed ordering and filter columns, a bounded row limit, eager loading for relationship columns to avoid N+1s, and caching on heavily used dashboards. Avoid unbounded tables, complex joins, or tenant-wide scans without performance validation. Define the acceptance threshold during the spike so it is a measurable gate rather than a judgment call.
Failure modes: Nova upgrade breakage, missing compiled assets, slow or timing-out dashboards, authorization or tenant data leakage, N+1 query storms, empty-state and rendering errors, CSS conflicts, and maintainer abandonment. Mitigate with staging tests, least-privilege scoped queries, query limits and caching, version pinning, and the documented native-card fallback.
Ramp-up: A Laravel/Nova developer can likely get a basic card rendering in hours. TPM effort concentrates on compatibility validation, permission and tenancy review, performance acceptance, and ownership assignment. Admin users need little training; support teams should know how to disable the card if queries or rendering fail. Use the first card as a demand test: if a handful of "Latest X" cards satisfies internal users, defer BI/reporting investment with evidence. If the ask grows into filtering, drill-downs, exports, or per-tenant analytics, escalate it to a roadmap conversation rather than adding another card.
How can I help you explore Laravel packages today?