- Основы
- Основное использование
- Основные методы
- Отображение
- Дополнительные возможности
- Настройка атрибутов
- Асинхронная загрузка
- Приведение к типу
- Использование в blade
Основы
TableBuilder - инструмент в MoonShine для создания настраиваемых таблиц для отображения данных. Он используется на индексной и детальной CRUD-страницах, а также для полей отношений, таких как HasMany, BelongsToMany, RelationRepeater и поля Json.
use MoonShine\UI\Components\Table\TableBuilder;TableBuilder::make(iterable $fields = [], iterable $items = [])use MoonShine\UI\Components\Table\TableBuilder;TableBuilder::make(iterable $fields = [], iterable $items = [])
<x-moonshine::table:columns="['#', 'First', 'Last', 'Email']":values="[[1, fake()->firstName(), fake()->lastName(), fake()->safeEmail()],[2, fake()->firstName(), fake()->lastName(), fake()->safeEmail()],[3, fake()->firstName(), fake()->lastName(), fake()->safeEmail()]]"/><x-moonshine::table:columns="['#', 'First', 'Last', 'Email']":values="[[1, fake()->firstName(), fake()->lastName(), fake()->safeEmail()],[2, fake()->firstName(), fake()->lastName(), fake()->safeEmail()],[3, fake()->firstName(), fake()->lastName(), fake()->safeEmail()]]"/>
Основное использование
Пример использования TableBuilder:
TableBuilder::make()->items([['id' => 1, 'title' => 'Hello world']])->fields([ID::make()->sortable(),Text::make('Название', 'title'),])TableBuilder::make()->items([['id' => 1, 'title' => 'Hello world']])->fields([ID::make()->sortable(),Text::make('Название', 'title'),])
Основные методы
Поля
Поля для TableBuilder упрощают наполнение данными и отображение ячеек таблицы.
По умолчанию поля выводятся в режиме preview.
Метод fields определяет поля таблицы, каждое поле является ячейкой таблицы (td):
->fields([ID::make()->sortable(),Text::make('Название', 'title'),])->fields([ID::make()->sortable(),Text::make('Название', 'title'),])
Если необходимо указать атрибуты для td, воспользуйтесь методом customWrapperAttributes:
->fields([ID::make()->sortable(),Text::make('Название', 'title')->customWrapperAttributes(['class' => 'my-class']),])->fields([ID::make()->sortable(),Text::make('Название', 'title')->customWrapperAttributes(['class' => 'my-class']),])
Данные
Метод items() устанавливает данные для таблицы:
->items($this->getCollection())->items($this->getCollection())
Пагинация
Метод paginator устанавливает пагинатор для таблицы. Необходимо передать объект, реализующий интерфейс MoonShine\Contracts\Core\Paginator\PaginatorContract:
Если необходимо указать пагинатор для QueryBuilder, можно воспользоваться встроенным ModelCaster, как в примере ниже:
->paginator((new ModelCaster(Article::class))->paginatorCast(Article::query()->paginate()))->paginator((new ModelCaster(Article::class))->paginatorCast(Article::query()->paginate()))
Пагинатор также можно указать через метод items().
Упрощенный вид пагинатора
Метод simple() применяет упрощенный стиль пагинации в таблице:
->simple()->simple()
Кнопки
Метод buttons добавляет кнопки действий:
->buttons([ActionButton::make('Delete', fn() => route('name.delete')),ActionButton::make('Edit', fn() => route('name.edit'))->showInDropdown(),ActionButton::make('Go to home', fn() => route('home'))->blank()->canSee(fn($data) => $data->active),ActionButton::make('Mass Delete', fn() => route('name.mass_delete'))->bulk(),])->buttons([ActionButton::make('Delete', fn() => route('name.delete')),ActionButton::make('Edit', fn() => route('name.edit'))->showInDropdown(),ActionButton::make('Go to home', fn() => route('home'))->blank()->canSee(fn($data) => $data->active),ActionButton::make('Mass Delete', fn() => route('name.mass_delete'))->bulk(),])
Для указания массовых действий над элементами таблицы необходимо у ActionButton указать метод bulk():
->buttons([ActionButton::make('Mass Delete', fn() => route('name.mass_delete'))->bulk(),])->buttons([ActionButton::make('Mass Delete', fn() => route('name.mass_delete'))->bulk(),])
Если вам необходимо зафиксировать кнопки (sticky), тогда воспользуйтесь методом stickyButtons():
->stickyButtons()->stickyButtons()
Отображение
Вертикальное отображение
Метод vertical() отображает таблицу в вертикальном формате (используется на DetailPage):
->vertical()->vertical()
Если вы хотите изменить атрибуты колонок при вертикальном режиме, то воспользуйтесь параметрами title или value:
/** @param TableBuilder $component */public function modifyDetailComponent(ComponentContract $component): ComponentContract{return $component->vertical(title: fn(FieldContract $field, Column $default, TableBuilder $ctx): ComponentContract => $default->columnSpan(2),value: fn(FieldContract $field, Column $default, TableBuilder $ctx): ComponentContract => $default->columnSpan(10),);}/** @param TableBuilder $component */public function modifyDetailComponent(ComponentContract $component): ComponentContract{return $component->vertical(title: fn(FieldContract $field, Column $default, TableBuilder $ctx): ComponentContract => $default->columnSpan(2),value: fn(FieldContract $field, Column $default, TableBuilder $ctx): ComponentContract => $default->columnSpan(10),);}
title- Колонка с заголовкомvalue- Колонка со значением
Также можно передать целочисленное значение для указания колонок:
$component->vertical(title: 2,value: 10,)$component->vertical(title: 2,value: 10,)
Редактируемая таблица
Метод editable() делает таблицу редактируемой, все поля переводятся в режим defaultMode (режим формы):
->editable()->editable()
Упрощенный режим
Метод preview() отключает отображение кнопок и сортировок для таблицы:
->preview()->preview()
С уведомлением "Ничего не найдено"
По умолчанию если у таблицы нет данных, то она будет пустой, но можно вывести сообщение "Пока записей нет".
Для этого воспользуйтесь методом withNotFound():
TableBuilder::make()->withNotFound()TableBuilder::make()->withNotFound()
Кастомизация строк
Поля ускоряют процесс и наполняют таблицу самостоятельно, выстраивая шапку таблицы с заголовками полей и сортировок, тело таблицы с выводом данных через поля и футер таблицы с массовыми действиями. Однако иногда может возникнуть потребность указать строки самостоятельно либо добавить дополнительные.
Для этой задачи существуют методы для соответствующих секций таблицы: headRows (thead), rows (tbody), footRows (tfoot).
// tbodyTableBuilder::make()->rows(static fn(TableRowsContract $default) => $default->pushRow(TableCells::make()->pushCell('td content')))// theadTableBuilder::make()->headRows(static fn(TableRowContract $default) => TableRows::make([$default])->pushRow(TableCells::make()->pushCell('td content')))// tfootTableBuilder::make()->footRows(static fn(?TableRowContract $default) => TableRows::make([$default])->pushRow(TableCells::make()->pushCell('td content')))// tbodyTableBuilder::make()->rows(static fn(TableRowsContract $default) => $default->pushRow(TableCells::make()->pushCell('td content')))// theadTableBuilder::make()->headRows(static fn(TableRowContract $default) => TableRows::make([$default])->pushRow(TableCells::make()->pushCell('td content')))// tfootTableBuilder::make()->footRows(static fn(?TableRowContract $default) => TableRows::make([$default])->pushRow(TableCells::make()->pushCell('td content')))
Обратите внимание, для footRows передается ?TableRowContract и в значении $default будет передано null, если кнопки массовых действий отсутствуют. Значение null можно указывать в списке $items в TableRows::make, оно будет проигнорировано.
TableRows и TableCells - это коллекции компонентов с дополнительным функционалом для быстрого добавления строки или ячейки таблицы.
TableRows::make()->pushRow(TableCellsContract $cells,int|string|null $key = null,?Closure $builder = null)TableRows::make()->pushRow(TableCellsContract $cells,int|string|null $key = null,?Closure $builder = null)
$cells- коллекция ячеек,$key- уникальный ключ tr для массовых действий и событий обновления строк таблицы,$builder- доступ кTableBuilder.
TableCells::make()->pushCell(Closure|string $content,?int $index = null,?Closure $builder = null,array $attributes = [])TableCells::make()->pushCell(Closure|string $content,?int $index = null,?Closure $builder = null,array $attributes = [])
$content- содержимое ячейки,$index- порядковый номер ячейки,$builder- доступ кTableBuilder,$attributes- HTML атрибуты ячейки.
У TableCells также есть дополнительные вспомогательные методы.
pushFields для быстрой генерации ячеек на основе полей:
TableCells::make()->pushFields(FieldsContract $fields,?Closure $builder = null,int $startIndex = 0)TableCells::make()->pushFields(FieldsContract $fields,?Closure $builder = null,int $startIndex = 0)
$fields- коллекция полей,$builder- доступ кTableBuilder,$startIndex- начальный индекс (так как до этого, возможно, уже были добавлены ячейки таблицы)
Также доступны условные методы pushWhen и pushCellWhen.
Дополнительные возможности
Добавление новых строк
Метод creatable() позволяет добавлять новые строки, делает таблицу динамической:
->creatable(reindex: true, limit: 5, label: 'Добавить', icon: 'plus', attributes: ['class' => 'my-class'])->creatable(reindex: true, limit: 5, label: 'Добавить', icon: 'plus', attributes: ['class' => 'my-class'])
creatable(bool $reindex = true,?int $limit = null,?string $label = null,?string $icon = null,array $attributes = [],?ActionButtonContract $button = null)creatable(bool $reindex = true,?int $limit = null,?string $label = null,?string $icon = null,array $attributes = [],?ActionButtonContract $button = null)
$reindex- режим редактирования с динамическим name,$limit- количество записей, которые можно добавить,$label- название кнопки,$icon- иконка у кнопки,$attributes- дополнительные атрибуты,$button- кастомная кнопка добавления.
В режиме добавления необходимо, чтобы последний элемент был пустым (скелет новой записи)!
Если в таблице находятся поля в режиме редактирования с динамическим name, то нужно добавить метод или параметр reindex:
TableBuilder::make()->creatable(reindex: true)TableBuilder::make()->creatable()->reindex()TableBuilder::make()->creatable(reindex: true)TableBuilder::make()->creatable()->reindex()
Пример с указанием кастомной кнопки добавления:
TableBuilder::make()->creatable(button: ActionButton::make('Foo', '#'))TableBuilder::make()->creatable(button: ActionButton::make('Foo', '#'))
Переиндексация
Метод reindex() позволяет переиндексировать элементы таблицы, всем name атрибутам элементов формы будет добавлен индекс.
Пример: Поле Text::make('Title', 'title') на первой строке tr таблицы будет иметь вид <input name="title[1]">.
В режиме creatable или removable при добавлении/удалении новой строки все атрибуты name будут переиндексированы с учетом порядкового номера.
->reindex()->reindex()
Сортировка перетаскиванием
Метод reorderable() добавляет возможность сортировки строк перетаскиванием:
->reorderable(url: '/reorder-url', key: 'id', group: 'group-name')->reorderable(url: '/reorder-url', key: 'id', group: 'group-name')
$url- URL-обработчика,$key- ключ элемента,$group- группировка (если требуется).
Фиксированный заголовок
Метод sticky() делает заголовок таблицы фиксированным:
->sticky()->sticky()
Выбор колонок
Метод columnSelection() добавляет возможность выбора отображаемых колонок:
->columnSelection()->columnSelection()
Если необходимо у определенных полей отключить выбор отображения, то воспользуйтесь методом columnSelection у поля с параметром, равным false:
TableBuilder::make()->fields([Text::make('Title')->columnSelection(false),Text::make('Text')])->columnSelection()TableBuilder::make()->fields([Text::make('Title')->columnSelection(false),Text::make('Text')])->columnSelection()
При использовании columnSelection параметр name компонента TableBuilder должен быть уникальным для всех страниц.
Это связано с тем, что данные сохраняются в localStorage на основе значения name компонента.
Поиск
Метод searchable() добавляет функцию поиска по таблице:
->searchable()->searchable()
Действие по клику
Метод clickAction() задает действие при клике на строку:
В примере ниже при клике на строку таблицы произойдет клик на кнопку редактирования.
->clickAction(ClickAction::EDIT)->clickAction(ClickAction::EDIT)
Если вы используете кастомные кнопки или переопределили кнопки по умолчанию, в таком случае также может потребоваться указать селектор кнопки:
->clickAction(ClickAction::EDIT, '.edit-button')->clickAction(ClickAction::EDIT, '.edit-button')
Типы ClickAction:
ClickAction::SELECT- выбор строки для массовых действий,ClickAction::EDIT- переход в редактирование,ClickAction::DETAIL- переход в детальный просмотр.
Сохранение состояния в URL
Метод pushState() сохраняет состояние таблицы в URL:
->pushState()->pushState()
Модификация чекбокса массовых действий
Метод modifyRowCheckbox() позволяет модифицировать чекбокс массовых действий.
Пример ниже демонстрирует выбор активного чекбокса по умолчанию:
->modifyRowCheckbox(fn(Checkbox $checkbox, DataWrapperContract $data, TableBuilder $ctx) => $data->getKey() === 2 ? $checkbox->customAttributes(['checked' => true]) : $checkbox)->modifyRowCheckbox(fn(Checkbox $checkbox, DataWrapperContract $data, TableBuilder $ctx) => $data->getKey() === 2 ? $checkbox->customAttributes(['checked' => true]) : $checkbox)
Слоты
Вы можете добавить контент над таблицей слева или справа с помощью методов topLeft() и topRight().
TableBuilder::make()// ..->topLeft(function (): array {return [];})->topRight(function (): array {return [Div::make([// ..])];})TableBuilder::make()// ..->topLeft(function (): array {return [];})->topRight(function (): array {return [Div::make([// ..])];})
Настройка атрибутов
TableBuilder предоставляет методы для настройки HTML-атрибутов:
->trAttributes(fn(?DataWrapperContract $data, int $row): array => ['class' => $row % 2 ? 'bg-gray-100' : ''])->tdAttributes(fn(?DataWrapperContract $data, int $row, int $cell): array => ['class' => $cell === 0 ? 'font-bold' : ''])->headAttributes(['class' => 'bg-blue-500 text-white'])->bodyAttributes(['class' => 'text-sm'])->footAttributes(['class' => 'bg-gray-200'])->customAttributes(['class' => 'custom-table'])->trAttributes(fn(?DataWrapperContract $data, int $row): array => ['class' => $row % 2 ? 'bg-gray-100' : ''])->tdAttributes(fn(?DataWrapperContract $data, int $row, int $cell): array => ['class' => $cell === 0 ? 'font-bold' : ''])->headAttributes(['class' => 'bg-blue-500 text-white'])->bodyAttributes(['class' => 'text-sm'])->footAttributes(['class' => 'bg-gray-200'])->customAttributes(['class' => 'custom-table'])
Асинхронная загрузка
Метод async() настраивает асинхронную загрузку таблицы:
Метод async должен быть после метода name
->async(Closure|string|null $url = null,string|array|null $events = null,?AsyncCallback $callback = null,)->async(Closure|string|null $url = null,string|array|null $events = null,?AsyncCallback $callback = null,)
$url- URL асинхронного запроса (в ответе необходимо вернутьTableBuilder),$events- события, которые будут вызваны после успешного ответа,$callback- JS callback, который можно добавить как обертку ответа.
После успешного запроса можно вызвать события, добавив параметр events.
use MoonShine\Support\AlpineJs;use MoonShine\Support\Enums\JsEvent;TableBuilder::make()->name('crud')->async(events: [AlpineJs::event(JsEvent::FORM_RESET, 'main-form'),AlpineJs::event(JsEvent::TOAST, params: ['text' => 'Success', 'type' => 'success']),])use MoonShine\Support\AlpineJs;use MoonShine\Support\Enums\JsEvent;TableBuilder::make()->name('crud')->async(events: [AlpineJs::event(JsEvent::FORM_RESET, 'main-form'),AlpineJs::event(JsEvent::TOAST, params: ['text' => 'Success', 'type' => 'success']),])
Список событий для TableBuilder:
JsEvent::TABLE_UPDATED- обновление таблицы,JsEvent::TABLE_REINDEX- реиндексация таблицы (см.reindex())JsEvent::TABLE_ROW_UPDATED- обновление строки таблицы (AlpineJs::event(JsEvent::TABLE_ROW_UPDATED, "{component-name}-{row-id}"))
Для получения дополнительной информации о js событиях обратитесь к разделу Events.
Все параметры метода async являются опциональными, и по умолчанию TableBuilder автоматически укажет URL на основе текущей страницы.
В процессе использования TableBuilder в режиме async может возникнуть задача, когда вы используете его вне админ-панели на страницах, не объявленных в системе MoonShine.
Тогда вам потребуется указать собственный URL и реализовать ответ с HTML таблицей. Давайте рассмотрим пример реализации:
TableBuilder::make()->name('my-table')->async(route('undefined-page.component', ['_namespace' => self::class,'_component_name' => 'my-table']))TableBuilder::make()->name('my-table')->async(route('undefined-page.component', ['_namespace' => self::class,'_component_name' => 'my-table']))
Controller
namespace App\MoonShine\Controllers;use Illuminate\Contracts\View\View;use MoonShine\Laravel\MoonShineRequest;use MoonShine\Laravel\Http\Controllers\MoonShineController;final class UndefinedPageController extends MoonShineController{public function component(MoonShineRequest $request): View{$page = app($request->input('_namespace'));$component = $page->getComponents()->findByName($request->getComponentName());return $component->render();}}namespace App\MoonShine\Controllers;use Illuminate\Contracts\View\View;use MoonShine\Laravel\MoonShineRequest;use MoonShine\Laravel\Http\Controllers\MoonShineController;final class UndefinedPageController extends MoonShineController{public function component(MoonShineRequest $request): View{$page = app($request->input('_namespace'));$component = $page->getComponents()->findByName($request->getComponentName());return $component->render();}}
Lazy и whenAsync методы
Если вам необходимо отправить запрос на обновление компонента TableBuilder сразу при загрузке страницы, то нужно добавить метод lazy().
Также методы lazy() и whenAsync() в сочетании могут решить задачу ленивой загрузки данных или загрузки данных из внешнего источника.
TableBuilder::make()->name('dashboard-table')->fields([ID::make(),Slug::make('Slug'),Text::make('Title'),Preview::make('Image')->image()])->async()->lazy()->whenAsync(fn(TableBuilder $table) => $table->items(Http::get('https://jsonplaceholder.org/posts')->json())),TableBuilder::make()->name('dashboard-table')->fields([ID::make(),Slug::make('Slug'),Text::make('Title'),Preview::make('Image')->image()])->async()->lazy()->whenAsync(fn(TableBuilder $table) => $table->items(Http::get('https://jsonplaceholder.org/posts')->json())),
Метод whenAsync() проверяет, является ли текущий запрос асинхронным для получения текущего компонента TableBuilder.
Пример взаимодействия с методами, где загрузка таблицы происходит по нажатию на кнопку:
ActionButton::make('Reload')->async(events: [AlpineJs::event(JsEvent::TABLE_UPDATED, 'my-table')]),TableBuilder::make()->name('my-table')->fields([ID::make(),Slug::make('Slug'),Text::make('Title'),Preview::make('Image')->image()])->async()->lazy()->whenAsync(fn(TableBuilder $table) => $table->items(Http::get('https://jsonplaceholder.org/posts')->json()))->withNotFound(),ActionButton::make('Reload')->async(events: [AlpineJs::event(JsEvent::TABLE_UPDATED, 'my-table')]),TableBuilder::make()->name('my-table')->fields([ID::make(),Slug::make('Slug'),Text::make('Title'),Preview::make('Image')->image()])->async()->lazy()->whenAsync(fn(TableBuilder $table) => $table->items(Http::get('https://jsonplaceholder.org/posts')->json()))->withNotFound(),
Приведение к типу
Если вы используете данные в таблице без cast, необходимо указать, что в ваших данных является ключом.
В противном случае некоторые возможности, такие как bulk-операции, работать не будут.
Пример:
TableBuilder::make()->castKeyName('id')->name('my-table')->fields([ID::make(),Text::make('Title')])->items([['id' => 3,'title' => 'Hello world']])->buttons([ActionButton::make('Mass Delete')->bulk()]),TableBuilder::make()->castKeyName('id')->name('my-table')->fields([ID::make(),Text::make('Title')])->items([['id' => 3,'title' => 'Hello world']])->buttons([ActionButton::make('Mass Delete')->bulk()]),
Метод cast служит для приведения значений таблицы к определенному типу.
Так как по умолчанию поля работают с примитивными типами:
use MoonShine\Laravel\TypeCasts\ModelCaster;TableBuilder::make()->cast(new ModelCaster(User::class))use MoonShine\Laravel\TypeCasts\ModelCaster;TableBuilder::make()->cast(new ModelCaster(User::class))
В этом примере мы привели данные к формату модели User с использованием ModelCaster.
За более подробной информацией обратитесь к разделу TypeCasts.
Использование в blade
Основы
Стилизованные таблицы можно создавать с помощью компонента moonshine::table.
<x-moonshine::table:columns="['#', 'First', 'Last', 'Email']":values="[[1, fake()->firstName(), fake()->lastName(), fake()->safeEmail()],[2, fake()->firstName(), fake()->lastName(), fake()->safeEmail()],[3, fake()->firstName(), fake()->lastName(), fake()->safeEmail()]]"/><x-moonshine::table:columns="['#', 'First', 'Last', 'Email']":values="[[1, fake()->firstName(), fake()->lastName(), fake()->safeEmail()],[2, fake()->firstName(), fake()->lastName(), fake()->safeEmail()],[3, fake()->firstName(), fake()->lastName(), fake()->safeEmail()]]"/>
Упрощенный вид
Параметр simple позволяет создавать упрощенного вида таблицы.
<x-moonshine::table:simple="true":columns="['#', 'First', 'Last', 'Email']":values="[[1, fake()->firstName(), fake()->lastName(), fake()->safeEmail()],[2, fake()->firstName(), fake()->lastName(), fake()->safeEmail()],[3, fake()->firstName(), fake()->lastName(), fake()->safeEmail()]]"/><x-moonshine::table:simple="true":columns="['#', 'First', 'Last', 'Email']":values="[[1, fake()->firstName(), fake()->lastName(), fake()->safeEmail()],[2, fake()->firstName(), fake()->lastName(), fake()->safeEmail()],[3, fake()->firstName(), fake()->lastName(), fake()->safeEmail()]]"/>
Фиксированный заголовок
Если в таблице содержится большое количество элементов, то можно зафиксировать шапку при прокрутке таблицы.
<x-moonshine::table:sticky="true":columns="['#', 'First', 'Last', 'Email']":values="[[1, fake()->firstName(), fake()->lastName(), fake()->safeEmail()],[2, fake()->firstName(), fake()->lastName(), fake()->safeEmail()],[3, fake()->firstName(), fake()->lastName(), fake()->safeEmail()]]"/><x-moonshine::table:sticky="true":columns="['#', 'First', 'Last', 'Email']":values="[[1, fake()->firstName(), fake()->lastName(), fake()->safeEmail()],[2, fake()->firstName(), fake()->lastName(), fake()->safeEmail()],[3, fake()->firstName(), fake()->lastName(), fake()->safeEmail()]]"/>
С уведомлением "Ничего не найдено"
Параметр notfound позволяет выводить сообщение при отсутствии элементов таблицы.
<x-moonshine::table:columns="['#', 'First', 'Last', 'Email']":notfound="true"/><x-moonshine::table:columns="['#', 'First', 'Last', 'Email']":notfound="true"/>
Для перевода или изменения текста уведомления необходимо задать параметр translates.
<x-moonshine::table:columns="['#', 'First', 'Last', 'Email']":notfound="true":translates="['notfound' => __('moonshine.ui.notfound')]"/><x-moonshine::table:columns="['#', 'First', 'Last', 'Email']":notfound="true":translates="['notfound' => __('moonshine.ui.notfound')]"/>
Слоты
Таблицу можно сформировать с использованием слотов.
<x-moonshine::table><x-slot:thead class="text-center"><th colspan="4">Header</th></x-slot:thead><x-slot:tbody><tr><th>1</th><th>{{ fake()->firstName() }}</th><th>{{ fake()->lastName() }}</th><th>{{ fake()->safeEmail() }}</th></tr><tr><th>2</th><th>{{ fake()->firstName() }}</th><th>{{ fake()->lastName() }}</th><th>{{ fake()->safeEmail() }}</th></tr><tr><th>3</th><th>{{ fake()->firstName() }}</th><th>{{ fake()->lastName() }}</th><th>{{ fake()->safeEmail() }}</th></tr></x-slot:tbody><x-slot:tfoot class="text-center"><td colspan="4">Footer</td></x-slot:tfoot></x-moonshine::table><x-moonshine::table><x-slot:thead class="text-center"><th colspan="4">Header</th></x-slot:thead><x-slot:tbody><tr><th>1</th><th>{{ fake()->firstName() }}</th><th>{{ fake()->lastName() }}</th><th>{{ fake()->safeEmail() }}</th></tr><tr><th>2</th><th>{{ fake()->firstName() }}</th><th>{{ fake()->lastName() }}</th><th>{{ fake()->safeEmail() }}</th></tr><tr><th>3</th><th>{{ fake()->firstName() }}</th><th>{{ fake()->lastName() }}</th><th>{{ fake()->safeEmail() }}</th></tr></x-slot:tbody><x-slot:tfoot class="text-center"><td colspan="4">Footer</td></x-slot:tfoot></x-moonshine::table>
Стилизация
Для стилизации таблицы есть предустановленные классы, которые можно использовать для tr / td.
Доступные классы:
bgc-primary bgc-secondary bgc-success bgc-warning bgc-error bgc-info bgc-purple bgc-pink bgc-blue bgc-green bgc-yellow bgc-red bgc-gray
<x-moonshine::table><x-slot:thead class="bgc-secondary text-center"><th colspan="3">Header</th></x-slot:thead><x-slot:tbody><tr><th class="bgc-pink">{{ fake()->firstName() }}</th><th class="bgc-gray">{{ fake()->lastName() }}</th><th class="bgc-purple">{{ fake()->safeEmail() }}</th></tr><tr><th class="bgc-green">{{ fake()->firstName() }}</th><th class="bgc-red">{{ fake()->lastName() }}</th><th class="bgc-yellow">{{ fake()->safeEmail() }}</th></tr></x-slot:tbody></x-moonshine::table><x-moonshine::table><x-slot:thead class="bgc-secondary text-center"><th colspan="3">Header</th></x-slot:thead><x-slot:tbody><tr><th class="bgc-pink">{{ fake()->firstName() }}</th><th class="bgc-gray">{{ fake()->lastName() }}</th><th class="bgc-purple">{{ fake()->safeEmail() }}</th></tr><tr><th class="bgc-green">{{ fake()->firstName() }}</th><th class="bgc-red">{{ fake()->lastName() }}</th><th class="bgc-yellow">{{ fake()->safeEmail() }}</th></tr></x-slot:tbody></x-moonshine::table>
TableBuilder в MoonShine предоставляет широкий спектр возможностей для создания гибких и функциональных таблиц в административной панели.