Weave 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

Robusta Table Laravel Package

evitenic/robusta-table

evitenic/robusta-table is a Laravel package for building robust, feature-rich data tables with minimal code. It supports sorting, filtering, pagination, and customizable columns, making it easy to display and manage tabular data in PHP applications.

View on GitHub
Deep Wiki
Context7

Getting Started

  • First, resolve what this package actually is. The listing labels it "Filament Package," while the description describes a standalone Laravel/Blade table builder with its own views and assets. Those are very different integrations. Open composer.json and src/ and look for a Filament plugin class (implements Plugin, make(), ->plugin() registration) versus a plain service provider with a view namespace. That single check determines your entire setup path — do it before writing a line of table code.
  • Confirm the Composer name. The repository is evitenic/robusta-table, the release commits are under ahmdsb/robusta-table, and the changelog link points at the latter. Run composer show / check Packagist before assuming the vendor prefix. Get the exact name from the composer.json on the default branch of the repo you're actually pulling from, then pin it.
  • Install and inspect the service provider. composer require it, then read the provider's boot()/register(): it tells you the view namespace, config key, asset tags, and whether anything auto-registers into a Filament panel. Publish whatever tags exist (vendor:publish --tag=...) and read the resulting config file first — for a package this small, the config is the documentation.
  • Pin the version immediately. "evitenic/robusta-table": "^3.0" (or the exact 3.0.6). With 3 stars and a single-maintainer history, floating to * or dev-main is how you end up debugging someone else's half-finished refactor on a Friday.
  • First use case: one read-only admin listing over an Eloquent query — say orders with columns for ID, customer, total, created date — sortable, searchable, paginated, with a footer sum on total. This exercises the source query, column definitions, and the calculation path (the one thing touched in v3.0.6) in a single screen, so you learn the whole surface area before committing to it across the app.
  • Where to look first in the source: the abstract/base table class and the column base class. Those two files define the required method signatures and the extension surface. There's effectively no prose documentation beyond the release notes, so budget an hour to read the source properly — it will save you several hours of guessing at method names.

Implementation Patterns

  • One table class per listing, and keep it declarative. Columns, filters, actions, and calculations belong in the class; query construction belongs in one clearly named source method (query() / getQuery() / whatever the base class defines). When those two leak into each other, sorting and pagination start disagreeing with what's on screen.
  • Choose the source type deliberately. Use the Eloquent/query source for anything that grows (Order::query()->with('customer')) and the array/collection source only for small, pre-computed sets (dashboard summaries, report snapshots). Trying to paginate or sort an array source in-memory silently degrades — it "works" in dev with 50 rows and falls over in production with 50,000.
  • Filters and search must go through the query builder. Apply them on the builder your source method returns, never as a post-filter in PHP. Otherwise the paginator count, the footer aggregate, and the visible rows are computed from three different datasets and will disagree in ways that are painful to trace.
  • Match column keys to SQL aliases exactly. If you selectRaw('SUM(line_total) as order_total'), the column's name/data key must be order_total. A mismatch produces a blank column and a sort link that quietly does nothing — no exception, no log line.
  • Treat footer calculations as part of the schema. Decide per column: sum, average, count, and — critically — whether the aggregate covers the current page or the full filtered result set. Reporting tables almost always want the full set; dashboards often want the page. Write that decision down in the table class as a comment, because the next developer will assume the opposite.
  • If this is the Filament integration, prefer its native table/column objects where they exist and only fall back to the package's own abstractions for the parts Filament doesn't cover (the calculations, mainly). Mixing the two paradigms inside one resource is where most of the confusion lives.
  • Keep row actions next to the columns, with authorisation checked per row via policies. Hiding a button is a UI convention, not an access control.
  • Build one project-level base table that sets your pagination size, date formatting, empty state, and default calculation behaviour, then extend that for each listing. With a low-activity package, keeping the extension point in your codebase (not vendor/) is what makes future upgrades a composer update instead of a rewrite.
  • Test the rendered output, not the internals. A feature test hitting the endpoint, asserting on column headers, row count, sort order, and the numeric footer values against a fixed fixture set. The calculation assertion is the one that will catch a regression when you next bump versions — and it's the only part of this package with a recent bug fix history.

Gotchas and Tips

  • v3.0.6 is a one-line release: fix: table calculation. Drop-in from v3.0.5, no API change — but the implication is that any footer totals your app displayed before the upgrade may have been wrong. After bumping, reconcile every reporting screen against a raw SUM() in tinker, with and without filters/search applied. Don't trust pre-upgrade numbers in screenshots, tickets, or exported reports.
  • Aggregates vs. pagination is the trap you will actually hit. If a total looks plausible on page 1 and absurdly small on page 2, the package is aggregating the page, not the result set. Verify once, early, and encode the answer in your base table so you never have to think about it again.
  • Computed and relationship columns break sorting and search. Accessors and relation-backed columns bypass the builder, so the sort link either fails silently or forces in-memory work. Eager-load with with() and expose real (or selectRaw-aliased) columns for anything the user can sort on.
  • Vendor/repo naming mismatch. evitenic in the repo slug, ahmdsb in the commit URLs, "Filament Package" in the metadata, "Laravel package for Blade tables" in the description. Any one of these being stale means your composer require line, your issue report, or your mental model is wrong. Verify against the actual composer.json.
  • Config and view caches. After touching the published config: php artisan config:clear. After an upgrade where the table renders blank or unstyled: php artisan view:clear, then re-publish assets, then check whether the view namespace changed. That sequence resolves most "it broke after update" reports.
  • Dump the builder. When a column is empty or a total is off, dd() the builder inside the source method and look at the SQL the package appends. One dump beats an hour of reading vendor code — and with a package this small, you will end up reading vendor code eventually, so learn the shape early.
  • Extend, never patch. Subclass the table and column base classes for custom renderers and formatters. Anything edited in vendor/ disappears on the next composer update, and with a package at this maturity level you can't count on upstream accepting a PR promptly.
  • Assess the bus factor honestly. 3 stars, a single recent patch release, and release notes as the only documentation. That's fine for an internal admin table where you can read and fork the source; it's a poor fit for a customer-facing product where a breaking minor means a support incident. If you adopt it, keep the table definitions thin enough that swapping in a hand-rolled Blade partial or Filament's native table is a day's work, not a sprint.
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.
3mdikram/worldmoneywords
snowsoft/config
itmosoft/laravel-subscriptions
larva/laravel-ai-qwen
diephp/sequences
users-au/socialite-provider
twidpay/twid-logger
mrnewport/laravel-plaid
mrnewport/laravel-repo
mrnewport/laravel-docsign
mrnewport/laravel-stow
mrnewport/laravel-flow
mrnewport/laravel-priceable
mrnewport/laravel-nestedterms
fredmeng/laravel-apidoc-generator
itstructure/laravel-multilingual-tools
pdustdar/elasticsearch
markupai/php-sdk
rlacerda83/lumem-microservice-shipment
uni-method/symfony-lib