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

Tables Laravel Package

beartropy/tables

Beartropy Tables is a Livewire table component for the TALL stack with search, sorting, filters, bulk actions, and column toggling. It includes inline editing and boolean toggles with per-field authorization hooks to control writes.

View on GitHub
Deep Wiki
Context7
v3.0.2

Fixed

  • Filters: updatedFilters() crashed with Undefined array key "type" when a request updated a filter key the server doesn't know — a stale browser tab, or keys regenerated by a later setFilters() call. Livewire writes the incoming value before the hook runs, leaving a bare ['input' => ...] entry in $filters; the hook then treated it as a real filter. Such entries are now dropped and the update is ignored.
v3.0.0

BREAKING

  • A closure passed to editable() now owns persistence. Previously setColumns() nulled out every closure so Livewire could serialize the column objects, which left a closure editableCallback silently unreachable: the callback never ran, and updateField() fell through to the default write and saved the field anyway. The callback now runs, and — matching how a string callback has always behaved — it replaces the default write rather than running alongside it. A table using editable('input', [], fn ($id, $field, $value, $table) => ...) that relied on the field still being saved must now persist it from inside the closure.

Fixed

  • Editable: updateField() dispatched table-field-updated before doing any work, so a denied or failed update announced itself as a successful one. It is now dispatched only once the write has actually happened — after a callback runs, after a successful model save, or after the array row is updated. A write refused by authorizeFieldUpdate()/authorizeFieldUpdateRaw(), or aimed at a record that does not exist, no longer dispatches it.
  • Editable: updateField() resolves the column through getFreshColumns() instead of the serialized $this->columns, which is what makes closure callbacks reachable at all. This matches how Sort, Search and Data already resolve columns when they need callbacks intact.
v2.10.0

BREAKING

Neither change is reachable through the package's own views: the inline editor only renders for columns marked ->editable(), and toggles only render for toggle columns. Both guards reject input the UI never produces, so the affected surface is programmatic calls and hand-crafted Livewire requests.

  • updateField() now refuses to write a column that was not marked with ->editable(). Previously any declared column could be written through the inline-edit action, including display-only ones. Tables that call updateField() programmatically on a non-editable column must add ->editable() to that column's definition.
  • toggleBoolean() now refuses a column key that is not part of the table's columns(). A key absent from both columns() and the row data previously raised Undefined array key and now returns quietly. The genuine behaviour change is the other case: a key present in the row data but never declared as a column — for example a data() row carrying is_admin with no matching column — used to flip successfully and is now refused.

Fixed

  • Editable: authorizeFieldUpdate() was only consulted on the Eloquent write path. A column with a string editableCallback, and every array/stdClass backed table, wrote with no authorization check at all. Both paths are now gated by the new authorizeFieldUpdateRaw() hook.

Added

  • authorizeFieldUpdateRaw($id, string $field, mixed $value): bool on Editable, defaulting to true. It is the counterpart of authorizeFieldUpdate() for the write paths that have no resolved Eloquent model — a column with a custom update callback, and array/stdClass backed tables — which receive the raw row id instead of a record. authorizeFieldUpdate()'s own signature is unchanged, so existing overrides typed Model $record keep working; override the new hook as well to cover the non-model paths.
  • authorizeToggle($id, string $column): bool on RowManipulators, defaulting to true. Override it to gate boolean toggles the way authorizeFieldUpdate() gates field writes.
v2.9.13

Fixed

  • Cache: Object cell values (e.g. Carbon dates, backed enums, value objects) are now deep-normalized to scalars/arrays before caching, so the cache never stores objects. Previously v2.9.12 only flattened the top-level container, leaving object cell values to come back as __PHP_Incomplete_Class under Laravel 13's hardened cache unserialization — which broke rendering with htmlspecialchars(): Argument #1 ($string) must be of type string, __PHP_Incomplete_Class given. Stringable values (Carbon, etc.) are cached as their string form, preserving rendered output.
  • Cache: getCachedData() now self-heals — a non-array cache hit (a legacy cached TableCollection or an incomplete-class artifact from a pre-upgrade entry) is discarded and rebuilt from source instead of rendering garbage.
v2.9.12

Fixed

  • Cache: Table data is now cached as a plain array of rows instead of the TableCollection object, and re-wrapped into a TableCollection on read. This keeps the cache compatible with Laravel 13's hardened unserialization (cache.serializable_classes) without consumers having to allow-list TableCollection. Legacy cached collections are tolerated for the remaining TTL window after upgrading.
v2.9.11

Changed

  • Dev: Upgrade Pest to v4 (pestphp/pest: ^4.0, pestphp/pest-plugin-laravel: ^4.0).
v2.9.10

Changed

  • Dependencies: Allow Livewire 4 (livewire/livewire: ^3.7|^4.0).
  • Dev: Test against Laravel 13 via Orchestra Testbench 11 (orchestra/testbench: ^9.0|^10.0|^11.0).
v2.9.9

Fixed

  • GenericExport: Export headers now use column display labels (e.g., "Rol funcional") instead of raw data keys (e.g., "rol_funcional"). Works automatically for both Eloquent and array/collection tables — no changes needed in existing apps.
  • GenericExport: Internal metadata keys (_original, _disabled, _hidden, _card_title) no longer leak into exported data. Previously only _original was stripped.
  • exportToClipboard: Clipboard export now uses column labels as headers and filters out internal metadata keys, matching the GenericExport fix.

Added

  • TableCollection: New Collection subclass that carries column label metadata from processCollection() through to GenericExport, enabling automatic label resolution without requiring changes to existing export methods.
v2.9.8

Fixed

  • Expanded Rows: Use key() helper function instead of key: named argument in [@livewire](https://github.com/livewire)() directive for inline expanded row components. The named argument syntax isn't handled by Livewire's Blade compiler regex, causing a closure parameter error when expanding task rows.
v2.9.7

Fixed

  • Column: Declare isHtml as a class property (public $isHtml = false) so property_exists() returns true on PHP 8.2+. Previously, isHtml was set dynamically in the toHtml() trait method, causing the raw-HTML branch in Blade templates to never trigger.
v2.9.6

Added

  • Column: secondaryHeader(callable $callback) method to display a secondary header row below the main header with computed content (e.g., subtotals, averages). The callback receives the current page's rows as a Collection and supports HTML output.

Fixed

  • Tests: Updated ViewTest default button variant assertion from soft to glass to match v2.9.5 change.
v2.9.5

Added

  • BeartropyTable: Customizable base query via overridable query() method — scope table data by tenant, permissions, or any custom condition without global scopes.
  • BeartropyTable: Internal newQuery() wrapper that applies $with eager loading automatically on top of query().

Changed

  • View: Default button variant changed from soft to glass.
v2.9.4

Changed

  • Buttons: Default button variant changed from outline to soft (light tinted background with colored text) for a consistent, subtle look across all header buttons.
  • PerPage: Per-page selector now uses the shared $yat_button_variant instead of a hardcoded outline attribute, ensuring all buttons match.

Added

  • Tests: Added 16 tests covering stdClass data support (unit + feature).
v2.9.3

Fixed

  • Data: stdClass rows now use ArrayObject instead of plain arrays, preserving both $row->key and $row['key'] access in user callbacks (fixes "Attempt to read property on array" regression from v2.9.2).

Changed

  • Docs: Added stdClass data source documentation and examples across LLM reference, user reference, AI guide, and basic-tables examples.
v2.9.2

Fixed

  • Data: Normalize stdClass objects to arrays in processCollection() and addRowToTable(), preventing "Cannot use object of type stdClass as array" errors when data() returns stdClass objects (e.g. from json_decode() or API responses).
  • Theming: Fix setTheme() not propagating to header components.
v2.9.1

Changed

  • BeartropyTable: Renamed base class from YATBaseTable to BeartropyTable. The old name continues to work via class_alias — no changes needed in existing user code.
  • BeartropyTableServiceProvider: Renamed service provider from YATProvider to BeartropyTableServiceProvider. The old name extends the new one for backward compatibility.
  • Stubs: make:btable now generates extends BeartropyTable instead of extends YATBaseTable.
  • Docs: Comprehensive documentation overhaul — all settings methods, data access methods, view slots, theming, state persistence, spinner, cache, row manipulation, sort, bulk, and export now fully documented across LLM reference, user reference, and AI guide.
  • Docs: Documentation updated to reference BeartropyTable throughout. Doc files renamed from yat-base-table to bear-table.
  • Skills: bt-tables-setup updated with correct artisan command (make:btable) and BeartropyTable references.
  • Skills: bt-tables-docs-maintenance updated with correct service provider path.
  • MCP: ComponentDocs schema example updated from yat-base-table to bear-table.
v2.9.0

Added

  • YATBaseTable: setComponentSize() method to uniformly resize all header UI components.
v2.8.2

Changed

  • Search: Use native icon-start prop for search input magnifying glass.
  • Pagination: Add cursor-pointer to pagination buttons.
  • Pagination: Reset page when changing per-page option.

Fixed

  • FilterSelect: Fix sending option labels instead of IDs.
  • FilterSelect: Fix integer-keyed options not filtering correctly.
  • ToggleColumn: Fix undefined property after Livewire serialization.
v2.8.1

Fixed

  • YATBaseTable: Removed mixed type from $model property to restore child class compatibility. Typed parent properties cannot be overridden without matching the type exactly in PHP 8.
v2.8.0

Added

  • MCP Tools: Three MCP tools (ComponentDocs, ListComponents, ProjectContext) for Laravel Boost integration.
  • Skills: Setup skill (bt-tables-setup) and docs maintenance skill for AI assistants.
  • Docs: LLM reference docs and user docs for all 12 components (docs/llms/, docs/components/).
  • Docs: AI assistant documentation with universal guide, Cursor rules, and code examples (docs/ai-assistants/).
  • Docs: Doc templates for LLM and user documentation (docs/llms/_template.md, docs/components/_template.md).
  • Tests: Comprehensive test suite expanded from 39 to 243 tests covering all column types, filter types, traits, bulk actions, inline editing, filters integration, row manipulation, and export.
  • Tests: MCP integrity tests ensuring documentation stays in sync with code.
  • Translations: 8 missing Spanish translation keys added.

Changed

  • Code Quality: Type hints added to 60 properties across all traits and classes.
  • Code Quality: PHPDoc blocks added or corrected across 68 issues in all src/ files.
  • Code Quality: Magic number replaced with PHP_INT_MAX constant.
  • Security: Input validation and null safety improvements across multiple traits.
  • Cleanup: Dead code, duplicate PHPDoc blocks, and Spanish comments removed.

Fixed

  • Migration: Corrected down() method to properly reverse migration.
  • Pagination: Fixed typo in pagination property name.
  • Null Safety: Added null checks to prevent errors with empty data sets.
v2.5.0

[2.5.0] - 2026-01-02

Added

  • Comprehensive test suite using PestPHP:
    • Unit Tests: Column logic (instantiation, unique keys, modifiers) and Options logic.
    • Feature Tests: Table rendering, pagination (per page, navigation), global search, and column sorting.
  • Test infrastructure: TestCase setup with SQLite in-memory database and Pest configuration.
  • Structural improvements in yat-table.blade.php:
    • Better handling of row expansion and mobile layout.
    • Improved empty search results display.
    • Enhanced data-attribute handling for accessibility and styling.

Changed

  • Improved project documentation structure and meta-information.
  • Refactored yat-table.blade.php for better readability and performance.
  • Updated YATableComponent.stub with improved code styling and type hints.
v2.4.4
v2.4.3
v2.3.11
v2.0.1
v2.0.0
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.
oxygen/auth
relicsoftware/barakah-payment-gateway
tobya/work-with-composer
equipc/laravel-email-validator
equipc/laravel-email-database-log
adedsec/nova-translated-labels
wazza/laravel-db-encryption
hokny/laravel-generator
vonsogt/backup
jengo/queues
jeremykenedy/laravel-observability
coleus/frame
thtg88/journalism
filagora/filagora-ai-forums
rlacerda83/query-parser
socialdept/atp-orm
cboxdk/laravel-assistant-client
socialdept/atp-resolver
socialdept/tenant-domains
tautvydasr/blade-class-names