whitespacecode/nova-table-card
Nova Table Card adds a flexible table card to Laravel Nova dashboards, letting you display custom rows and columns from any data source. Configure headers, values, and formatting to build compact, readable summaries without leaving Nova.
Package: whitespacecode/nova-table-card v1.1.0 (MIT, ~10 stars, 0 dependents, last release 2024-12-16). A Laravel Nova card that renders tabular Eloquent/builder/array data on a Nova dashboard or resource detail screen, with configurable columns, labels, formatting callbacks, row limits and sorting.
Architecture fit The package is a thin presentation layer over Nova's own card and resource abstractions. From a program perspective that is the decisive fact: adoption adds no new runtime component. No datastore, no queue, no service boundary, no migration, no scheduled job, no external integration, no new deployment artifact, no config drift. It adds one Composer dependency and a handful of PHP card classes confined to the admin surface.
That shape is what makes it tractable: blast radius is bounded to the Nova admin panel, and rollback is composer remove. The only real coupling is to Nova's card contract and Nova's compiled front-end assets — which is also the only thing that can break it.
Two framing facts to carry into the decision:
Integration feasibility
Low effort, well-bounded, routine for any Laravel developer already fluent in Nova. The work is: Composer install → a card class → column/query definition → registration in NovaServiceProvider (dashboard) or a resource detail screen. Realistic effort to first card is under one engineer-day, small enough to bundle into an existing sprint without a standalone business case.
For contrast, the build alternative (hand-rolled Nova card) means a Vue component, an asset build pipeline, publishable assets, and recurring maintenance against every Nova major — realistically a ~two-week block plus ongoing cost. That delta is the entire value proposition.
Technical risk (ranked by severity × detectability, for the risk register)
authorizedToViewAny and Nova's index-query scoping hooks, a user who can see the dashboard but not the resource can see rows they should not. There is no natural alarm: the card renders correctly and the query succeeds. Only an explicit negative test (restricted user, real resource, real data) catches it. Classify as a launch blocker, not a hardening item.Key questions — each needs an owner and a date before the decision is logged
nova, laravel/framework and php constraints in 1.1.0. Is Nova 4 still supported or is Nova 5 now the minimum? Owner: tech lead. Blocking.Stack fit Requires Laravel + Laravel Nova; Composer-installed; PHP card classes only. It renders server-side data via Nova's card mechanism, so it inherits Nova's auth, routing, layout and asset pipeline — nothing bespoke to operate. It does not fit any non-Nova surface, and should be rejected outright rather than bent to fit one.
Migration path No data migration exists or is required — the card reads existing tables/collections. The path is additive and reversible:
composer.json and commit composer.lock.composer remove. Well understood, sub-day.Compatibility Read the actual Composer constraints before committing (question 1). Treat the Nova 4 floor as unverified until confirmed in code, not changelog prose. Confirm PHP and Laravel versions match the platform's current runtime. Also confirm the Nova asset publish step works in the target environment — compiled-asset mismatches surface as blank cards, not errors. Maintain a documented, tested Nova version pair (card version ↔ Nova major) rather than a range.
Sequencing
Maintenance Steady-state maintenance is essentially zero: no infrastructure, no migrations, no jobs, no config to drift. The entire lifetime cost concentrates at Nova upgrade events, where the team inherits the maintainer's release timing. Budget it as a recurring line item in each Nova upgrade epic, not as ongoing operational load, and keep the internal base class so replacement remains a modest, well-scoped task.
Support No vendor, no SLA — the only channel is a GitHub issue tracker with a single volunteer maintainer. Escalation path must be internal: an owning engineer who can read the package source, plus a documented fallback (fork or hand-roll the card). Never place this in a path where a support contract or audit obligation applies.
Scaling The card re-runs its query on every dashboard load, and again on every poll tick if polling is enabled — a per-view database cost that stays invisible until dashboard traffic or table size grows. Mitigations to standardize: hard row limits on every card, indexed/limited queries only, no card on hot or high-row-count tables, and watch for N+1 patterns when column callbacks touch relationships. There is no caching layer in the card itself; if a query is expensive, cache it upstream or don't ship the card. Horizontal scaling is unaffected — the cost lands on the database, not the app tier.
Failure modes (and the alarm for each)
| Failure | Symptom | Detection |
|---|---|---|
| Authorization scoping gap | Rows visible to a user who shouldn't see the resource; card renders normally | No natural alarm — explicit negative test in CI only |
| Nova point-release asset break | Blank/unstyled card | Manual dashboard check post-upgrade; smoke test |
| Query timeout / slow dashboard | Dashboard latency, not a card error | APM/dashboard p95, per-view query counts |
| Missing tenant/team scope | Cross-tenant rows in an operational table | Code review of base class + seed-data test |
| Maintainer abandonment | No release for a new Nova major | Track release cadence; fallback plan on file |
| Card disabled mid-upgrade | Stakeholder-facing dashboard gap | Comms plan for dashboard consumers |
Ramp-up A Laravel developer already fluent in Nova reaches productivity in roughly half a day; the concepts (cards, resources, columns, callbacks) are native Nova vocabulary. Non-Nova developers should not be assigned — off-Nova knowledge does not transfer. Onboarding cost is therefore near-zero, but the team should treat the authorization test and the Nova-upgrade verification step as required competencies, not optional polish, since both are where the real risk sits.
How can I help you explore Laravel packages today?