### Install Bulma Extension Packages Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/guide/styling.mdx Install framework-specific extension packages, such as Select, Responsive, and Buttons, for Bulma. This example shows installing core, select, responsive, and buttons for Bulma. ```bash php bin/console importmap:require datatables.net-bm php bin/console importmap:require datatables.net-select-bm php bin/console importmap:require datatables.net-responsive-bm php bin/console importmap:require datatables.net-buttons-bm ``` -------------------------------- ### UrlColumn Factory Example Source: https://github.com/pentiminax/ux-datatables/blob/main/skills/ux-datatables/references/columns.md Example of creating a UrlColumn with a name. ```php UrlColumn::new('website') ``` -------------------------------- ### ImageColumn Factory Example Source: https://github.com/pentiminax/ux-datatables/blob/main/skills/ux-datatables/references/columns.md Example of creating an ImageColumn with a name. ```php ImageColumn::new('photo') ``` -------------------------------- ### MoneyColumn Factory Example Source: https://github.com/pentiminax/ux-datatables/blob/main/skills/ux-datatables/references/columns.md Example of creating a MoneyColumn with a name. ```php MoneyColumn::new('price') ``` -------------------------------- ### Install Project Dependencies Source: https://github.com/pentiminax/ux-datatables/blob/main/AGENTS.md Use Composer to install project dependencies. This is a standard first step for PHP projects. ```bash composer install ``` -------------------------------- ### TemplateColumn Factory Example Source: https://github.com/pentiminax/ux-datatables/blob/main/skills/ux-datatables/references/columns.md Example of creating a TemplateColumn with a name. ```php TemplateColumn::new('preview') ``` -------------------------------- ### Complete DataTables Configuration Example Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/guide/options.mdx An example demonstrating a comprehensive configuration of DataTables with various options including AJAX source, scrolling, pagination, search, language, and layout. ```php use Pentiminax\UX\DataTables\Enum\Feature; use Pentiminax\UX\DataTables\Enum\Language; use Pentiminax\UX\DataTables\Model\DataTable; $dataTable = new DataTable('products'); $dataTable ->autoWidth() ->caption('Product Catalog') ->language(Language::EN_GB) ->ordering(handler: true, indicators: true) ->paging(buttons: 5, firstLast: true) ->searching() ->serverSide() ->processing() ->scrollY('400px') ->pageLength(25) ->lengthMenu([10, 25, 50, 100]) ->stateSave() ->urlState() ->layout([ 'topStart' => Feature::PAGE_LENGTH, 'topEnd' => Feature::SEARCH, 'bottomStart' => Feature::INFO, 'bottomEnd' => Feature::PAGING, ]) ->ajax( url: '/api/products', dataSrc: 'data', type: 'GET' ); ``` -------------------------------- ### ChoiceColumn Factory Example Source: https://github.com/pentiminax/ux-datatables/blob/main/skills/ux-datatables/references/columns.md Example of creating a ChoiceColumn with a name. ```php ChoiceColumn::new('status') ``` -------------------------------- ### Install UX DataTables Source: https://github.com/pentiminax/ux-datatables/blob/main/README.md Install the UX DataTables library using Composer. ```bash composer require pentiminax/ux-datatables ``` -------------------------------- ### DataTable Example Usage Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/reference/datatable.mdx An example demonstrating how to instantiate and configure a DataTable with server-side processing, language settings, and layout options. ```APIDOC ## Example ```php use Pentiminax\UX\DataTables\Enum\Feature; use Pentiminax\UX\DataTables\Enum\Language; use Pentiminax\UX\DataTables\Model\DataTable; $table = (new DataTable('users')) ->serverSide(true) ->processing(true) ->language(Language::EN) ->layout([ 'topStart' => Feature::PAGE_LENGTH, 'topEnd' => Feature::SEARCH, 'bottomStart' => Feature::INFO, 'bottomEnd' => Feature::PAGING, ]); ``` ``` -------------------------------- ### DateColumn Factory Example Source: https://github.com/pentiminax/ux-datatables/blob/main/skills/ux-datatables/references/columns.md Example of creating a DateColumn with a name. ```php DateColumn::new('createdAt') ``` -------------------------------- ### Minimal Select Extension Setup Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/extensions/select.mdx Instantiate the Select extension with a single selection style. Ensure the necessary use statements are present. ```php use Pentiminax\UX\DataTables\Enum\SelectStyle; use Pentiminax\UX\DataTables\Model\Extensions\SelectExtension; $dataTable->addExtension(new SelectExtension(SelectStyle::SINGLE)); ``` -------------------------------- ### Full Data Table Example with Edit Action Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/reference/edit-modal.mdx A complete example of a Data Table configuration including columns and an 'Edit' action that opens the inline edit modal. ```php use App\Entity\Product; use Pentiminax\UX\DataTables\Attribute\AsDataTable; use Pentiminax\UX\DataTables\Column\BooleanColumn; use Pentiminax\UX\DataTables\Column\NumberColumn; use Pentiminax\UX\DataTables\Column\TextColumn; use Pentiminax\UX\DataTables\Model\AbstractDataTable; use Pentiminax\UX\DataTables\Model\Action; use Pentiminax\UX\DataTables\Model\Actions; #[AsDataTable(Product::class)] final class ProductsDataTable extends AbstractDataTable { public function configureColumns(): iterable { yield NumberColumn::new('id', 'ID'); yield TextColumn::new('name', 'Name'); yield NumberColumn::new('price', 'Price'); yield BooleanColumn::new('active', 'Active'); } public function configureActions(Actions $actions): Actions { return $actions->add( Action::edit('Edit') ->setIcon('bi bi-pencil') ); } } ``` -------------------------------- ### Manual Provider Example Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/reference/data-providers-row-mappers.mdx Illustrates how to implement a custom data provider using `ArrayDataProvider` and ensuring the row mapping pipeline is preserved. ```APIDOC ## Manual Provider Example ### Description Example of overriding `createDataProvider` to use `ArrayDataProvider` while maintaining the row mapping pipeline. ### Method Implementation ```php use Pentiminax\UX\DataTables\Contracts\DataProviderInterface; use Pentiminax\UX\DataTables\DataProvider\ArrayDataProvider; protected function createDataProvider(): ?DataProviderInterface { return new ArrayDataProvider($this->rows, $this->createRowMapper()); } ``` ### Notes - `$this->createRowMapper()` ensures that the same mapping, template rendering, and action-resolution logic is applied. - `setData()` on `AbstractDataTable` uses the same pipeline for inline rows. ``` -------------------------------- ### NumberColumn Factory Example Source: https://github.com/pentiminax/ux-datatables/blob/main/skills/ux-datatables/references/columns.md Example of creating a NumberColumn with a name. ```php NumberColumn::new('qty') ``` -------------------------------- ### Complete Example with TemplateColumn Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/columns/template-column.mdx A full example demonstrating the integration of TemplateColumn within a DataTable class, including column configuration and row mapping. ```APIDOC ## Complete Example ```php use Pentiminax\UX\DataTables\Attribute\AsDataTable; use Pentiminax\UX\DataTables\Column\NumberColumn; use Pentiminax\UX\DataTables\Column\TemplateColumn; use Pentiminax\UX\DataTables\Column\TextColumn; use Pentiminax\UX\DataTables\Model\AbstractDataTable; #[AsDataTable(Product::class)] final class ProductsDataTable extends AbstractDataTable { public function configureColumns(): iterable { yield NumberColumn::new('id', 'ID'); yield TextColumn::new('name', 'Name'); yield TemplateColumn::new('stock_badge', 'Stock') ->setField('stock') ->setTemplate('datatable/columns/stock_badge.html.twig'); } protected function mapRow(mixed $item): array { return [ 'id' => $item->getId(), 'name' => $item->getName(), 'stock_badge' => $item->getStock(), ]; } } ``` ```twig {# templates/datatable/columns/stock_badge.html.twig #} {% set variant = data > 10 ? 'success' : (data > 0 ? 'warning' : 'danger') %} {{ data }} ``` ``` -------------------------------- ### TextColumn Factory Example Source: https://github.com/pentiminax/ux-datatables/blob/main/skills/ux-datatables/references/columns.md Example of creating a TextColumn with a name and title. ```php TextColumn::new('name', 'Name') ``` -------------------------------- ### EmailColumn Factory Example Source: https://github.com/pentiminax/ux-datatables/blob/main/skills/ux-datatables/references/columns.md Example of creating an EmailColumn with a name and title. ```php EmailColumn::new('email', 'Email') ``` -------------------------------- ### Set Display Start Row Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/guide/options.mdx Set the starting row for the DataTable display. Note that the value is zero-indexed, so `displayStart(20)` starts at row 21. ```php $dataTable->displayStart(20); // Start at row 21 ``` -------------------------------- ### Complete Image Column Configuration Example Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/columns/image-column.mdx Demonstrates a comprehensive configuration of an ImageColumn within a DataTable, including dimensions, rounded styling, placeholder, and click-to-open functionality. ```php use Pentiminax\UX\DataTables\Attribute\AsDataTable; use Pentiminax\UX\DataTables\Column\ImageColumn; use Pentiminax\UX\DataTables\Column\NumberColumn; use Pentiminax\UX\DataTables\Column\TextColumn; use Pentiminax\UX\DataTables\Model\AbstractDataTable; #[AsDataTable(User::class)] final class UsersDataTable extends AbstractDataTable { public function configureColumns(): iterable { yield NumberColumn::new('id', 'ID'); yield ImageColumn::new('avatar', 'Avatar') ->setImageWidth(50) ->setImageHeight(50) ->rounded() ->setPlaceholder('/images/default-avatar.png') ->clickable(); yield TextColumn::new('name', 'Name'); } protected function mapRow(mixed $item): array { return [ 'id' => $item->getId(), 'avatar' => $item->getAvatarUrl(), 'name' => $item->getName(), ]; } } ``` -------------------------------- ### BooleanColumn Factory Example Source: https://github.com/pentiminax/ux-datatables/blob/main/skills/ux-datatables/references/columns.md Example of creating a BooleanColumn with a name. ```php BooleanColumn::new('active') ``` -------------------------------- ### Complete UsersDataTable Example Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/columns/url-column.mdx A full example of a DataTables class using various column types, including UrlColumn, for managing user data. This demonstrates how to configure columns and map row data. ```php use App\Entity\User; use Pentiminax\UX\DataTables\Attribute\AsDataTable; use Pentiminax\UX\DataTables\Column\NumberColumn; use Pentiminax\UX\DataTables\Column\TextColumn; use Pentiminax\UX\DataTables\Column\UrlColumn; use Pentiminax\UX\DataTables\Model\AbstractDataTable; #[AsDataTable(User::class)] final class UsersDataTable extends AbstractDataTable { public function configureColumns(): iterable { yield NumberColumn::new('id', 'ID'); yield TextColumn::new('name', 'Name'); yield UrlColumn::new('name', 'Profile') ->linkToRoute('admin_user_show', static fn (User $user): array => [ 'id' => $user->getId(), ]); yield UrlColumn::new('website', 'Website') ->openInNewTab() ->showExternalIcon(); } protected function mapRow(mixed $item): array { return [ 'id' => $item->getId(), 'name' => $item->getName(), 'website' => $item->getWebsite(), ]; } } ``` -------------------------------- ### Complete TextColumn Example in DataTable Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/columns/text-column.mdx This example demonstrates configuring multiple TextColumns within a DataTable, including options for HTML content and UTF-8 sorting. It also shows how to map data to columns and set column widths. ```php use Pentiminax\UX\DataTables\Attribute\AsDataTable; use Pentiminax\UX\DataTables\Column\NumberColumn; use Pentiminax\UX\DataTables\Column\TextColumn; use Pentiminax\UX\DataTables\Model\AbstractDataTable; #[AsDataTable(User::class)] final class UsersDataTable extends AbstractDataTable { public function configureColumns(): iterable { yield NumberColumn::new('id', 'ID')->setWidth('60px'); yield TextColumn::new('name', 'Name')->utf8(); yield TextColumn::new('bio', 'Bio')->html()->utf8(); } protected function mapRow(mixed $item): array { return [ 'id' => $item->getId(), 'name' => $item->getName(), 'bio' => $item->getBio(), ]; } } ``` -------------------------------- ### Complete Choice Column Example in a DataTable Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/columns/choice-column.mdx This example demonstrates integrating a ChoiceColumn with Bootstrap badge rendering within a full DataTable configuration, including other column types and enum usage. ```php use Pentiminax\UX\DataTables\Attribute\AsDataTable; use Pentiminax\UX\DataTables\Column\ChoiceColumn; use Pentiminax\UX\DataTables\Column\NumberColumn; use Pentiminax\UX\DataTables\Column\TextColumn; use Pentiminax\UX\DataTables\Model\AbstractDataTable; enum OrderStatus: case Draft = 'draft'; case Confirmed = 'confirmed'; case Shipped = 'shipped'; case Cancelled = 'cancelled'; #[AsDataTable(Order::class)] final class OrdersDataTable extends AbstractDataTable { public function configureColumns(): iterable { yield NumberColumn::new('id', 'ID'); yield TextColumn::new('reference', 'Reference'); yield ChoiceColumn::new('status', 'Status') ->setChoices(OrderStatus::class) ->renderAsBadges([ 'draft' => 'secondary', 'confirmed' => 'primary', 'shipped' => 'success', 'cancelled' => 'danger', ]); } protected function mapRow(mixed $item): array { return [ 'id' => $item->getId(), 'reference' => $item->getReference(), 'status' => $item->getStatus()->value, ]; } } ``` -------------------------------- ### Environment-Specific Configuration Example Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/guide/configuration.mdx Illustrates how to use Symfony's configuration system to set different DataTables options for development versus default environments. ```yaml # config/packages/data_tables.yaml (default) data_tables: options: pageLength: 10 # config/packages/dev/datatables.yaml data_tables: options: pageLength: 5 # Smaller for development ``` -------------------------------- ### Minimal Buttons Extension Setup Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/extensions/buttons.mdx Configure basic export buttons (Copy, CSV, Excel) and specify their rendering location using `Feature::BUTTONS` in the layout. Ensure `Feature::BUTTONS` is included in the layout to generate the buttons container. ```php use Pentiminax\UX\DataTables\Enum\ButtonType; use Pentiminax\UX\DataTables\Enum\Feature; use Pentiminax\UX\DataTables\Model\Extensions\ButtonsExtension; $dataTable ->addExtension(new ButtonsExtension([ ButtonType::COPY, ButtonType::CSV, ButtonType::EXCEL, ])) ->layout([ 'topStart' => Feature::BUTTONS, 'topEnd' => Feature::SEARCH, ]); ``` -------------------------------- ### Install Semantic UI Package with Importmap Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/guide/styling.mdx Use the Symfony console to require the Semantic UI DataTables package for use with importmap. ```bash php bin/console importmap:require datatables.net-se ``` -------------------------------- ### Install Bulma Package with Importmap Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/guide/styling.mdx Use the Symfony console to require the Bulma DataTables package for use with importmap. ```bash php bin/console importmap:require datatables.net-bm ``` -------------------------------- ### Install JavaScript Dependencies with Webpack Encore Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/getting-started/installation.mdx If using Webpack Encore, install the necessary JavaScript dependencies and rebuild your assets. ```bash npm install --force npm run watch ``` -------------------------------- ### Install Zurb Foundation Package with Importmap Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/guide/styling.mdx Use the Symfony console to require the Zurb Foundation DataTables package for use with importmap. ```bash php bin/console importmap:require datatables.net-zf ``` -------------------------------- ### Complete Data Table Configuration with Date Columns Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/columns/date-column.mdx Demonstrates a complete Data Table setup including `DateColumn` with both default and custom formats. Ensure the `mapRow` method returns dates in the exact format declared for each column to guarantee correct sorting. ```php use Pentiminax\UX\DataTables\Attribute\AsDataTable; use Pentiminax\UX\DataTables\Column\DateColumn; use Pentiminax\UX\DataTables\Column\NumberColumn; use Pentiminax\UX\DataTables\Column\TextColumn; use Pentiminax\UX\DataTables\Model\AbstractDataTable; #[AsDataTable(Article::class)] final class ArticlesDataTable extends AbstractDataTable { public function configureColumns(): iterable { yield NumberColumn::new('id', 'ID'); yield TextColumn::new('title', 'Title'); yield DateColumn::new('publishedAt', 'Published'); yield DateColumn::new('updatedAt', 'Updated')->setFormat('Y-m-d H:i'); } protected function mapRow(mixed $item): array { return [ 'id' => $item->getId(), 'title' => $item->getTitle(), 'publishedAt' => $item->getPublishedAt()?->format('Y-m-d'), 'updatedAt' => $item->getUpdatedAt()?->format('Y-m-d H:i'), ]; } } ``` -------------------------------- ### Custom Row Stage Example Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/reference/data-providers-row-mappers.mdx Example of a custom row stage that converts the 'title' field to uppercase. This demonstrates how to extend the row mapping pipeline with custom logic. ```php use Pentiminax\UX\DataTables\Contracts\RowStageInterface; final class UpperCaseTitleStage implements RowStageInterface { public function process(array $mappedRow, mixed $originalRow, array $columns): { if (isset($mappedRow['title'])) { $mappedRow['title'] = strtoupper($mappedRow['title']); } return $mappedRow; } } ``` -------------------------------- ### Quick Start with #[AsDataTable] Attribute Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/reference/abstract-datatable.mdx Use the #[AsDataTable] attribute for Doctrine-backed tables. It automatically configures the DoctrineDataProvider with your entity, row processing, and query builder customization. ```php use App\Entity\User; use Pentiminax\UX\DataTables\Attribute\AsDataTable; use Pentiminax\UX\DataTables\Model\AbstractDataTable; use Pentiminax\UX\DataTables\Column\TextColumn; use Pentiminax\UX\DataTables\Column\NumberColumn; #[AsDataTable(User::class)] final class UsersDataTable extends AbstractDataTable { public function configureColumns(): iterable { yield NumberColumn::new('id', 'ID'); yield TextColumn::new('lastName', 'Last name'); yield TextColumn::new('firstName', 'First name'); yield TextColumn::new('email', 'Email'); } protected function mapRow(mixed $item): array { /** @var User $item */ return [ 'id' => $item->getId(), 'lastName' => $item->getLastName(), 'firstName' => $item->getFirstName(), 'email' => $item->getEmail(), ]; } } ``` -------------------------------- ### Implement Custom Dialog Modal Adapter Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/reference/edit-modal.mdx Implement the ModalAdapter interface to create a custom modal. This example shows how to create a dialog-based modal that handles submission and cancellation. ```typescript // assets/modal/dialog-adapter.ts import type { ModalAdapter, ModalHandlers } from '@pentiminax/ux-datatables/modal/ModalAdapter' export class DialogModalAdapter implements ModalAdapter { private dialog: HTMLDialogElement | null = null private handlers: ModalHandlers | null = null async show(html: string, handlers: ModalHandlers): Promise { this.handlers = handlers const template = document.createElement('template') template.innerHTML = html.trim() const root = template.content.querySelector('[data-ux-datatables-modal]') if (!root) return this.dialog = root as HTMLDialogElement document.body.appendChild(this.dialog) this.dialog.querySelector('[data-ux-datatables-submit]') ?.addEventListener('click', async () => { const form = this.dialog!.querySelector('#ux-datatables-edit-form') if (form) await handlers.onSubmit(Object.fromEntries(new FormData(form))) }) this.dialog.addEventListener('close', () => handlers.onCancel?.()) this.dialog.showModal() } replaceBody(html: string): void { const body = this.dialog?.querySelector('[data-ux-datatables-modal-body]') if (body) body.innerHTML = html } async hide(): Promise { this.dialog?.close() this.dialog?.remove() this.dialog = null } isOpen(): boolean { return this.dialog?.open ?? false } } ``` -------------------------------- ### Set Length Menu with Custom Labels in PHP Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/guide/configuration.mdx Provides an example of setting the length menu options with custom labels for the dropdown in PHP. ```php $table->lengthMenu([ [10, 25, 50, -1], [10, 25, 50, 'All'] ]); ``` -------------------------------- ### Install Bootstrap 3 Package with Importmap Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/guide/styling.mdx Use the Symfony console to require the Bootstrap 3 DataTables package for use with importmap. ```bash php bin/console importmap:require datatables.net-bs ``` -------------------------------- ### Configure DataTable with Mercure Topics Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/reference/attributes.mdx This example demonstrates configuring the `#[AsDataTable]` attribute with explicit Mercure topics. It specifies the entity class and Mercure configuration including the topics to subscribe to. ```php #[AsDataTable( entityClass: User::class, mercure: [ 'topics' => [ 'https://example.com/users', ], ], )] ``` -------------------------------- ### Create DataTableResult Instance Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/reference/data-providers-row-mappers.mdx Example of instantiating DataTableResult with total records, filtered records, and the data payload. ```php new DataTableResult( recordsTotal: 1000, recordsFiltered: 150, data: $rows, ); ``` -------------------------------- ### Install Bootstrap 4 Package with Importmap Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/guide/styling.mdx Use the Symfony console to require the Bootstrap 4 DataTables package for use with importmap. ```bash php bin/console importmap:require datatables.net-bs4 ``` -------------------------------- ### Install jQuery UI Package with Importmap Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/guide/styling.mdx Use the Symfony console to require the jQuery UI DataTables package for use with importmap. ```bash php bin/console importmap:require datatables.net-jqui ``` -------------------------------- ### Complete NumberColumn Example in a DataTable Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/columns/number-column.mdx Demonstrates integrating NumberColumn with other column types within a complete DataTable configuration, including custom width and mapping row data. ```php use Pentiminax\UX\DataTables\Attribute\AsDataTable; use Pentiminax\UX\DataTables\Column\NumberColumn; use Pentiminax\UX\DataTables\Column\TextColumn; use Pentiminax\UX\DataTables\Model\AbstractDataTable; #[AsDataTable(Product::class)] final class ProductsDataTable extends AbstractDataTable { public function configureColumns(): iterable { yield NumberColumn::new('id', 'ID')->setWidth('60px'); yield TextColumn::new('name', 'Product'); yield NumberColumn::new('stock', 'Stock'); yield NumberColumn::new('price', 'Price'); } protected function mapRow(mixed $item): array { return [ 'id' => $item->getId(), 'name' => $item->getName(), 'stock' => $item->getStock(), 'price' => $item->getPrice(), ]; } } ``` -------------------------------- ### Implement Manual Data Provider Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/reference/data-providers-row-mappers.mdx Example of creating a custom data provider using ArrayDataProvider. It ensures the same mapping, template rendering, and action resolution behavior is preserved by calling createRowMapper. ```php use Pentiminax\UX\DataTables\Contracts\DataProviderInterface; use Pentiminax\UX\DataTables\DataProvider\ArrayDataProvider; protected function createDataProvider(): ?DataProviderInterface { return new ArrayDataProvider($this->rows, $this->createRowMapper()); } ``` -------------------------------- ### Configure DataTable with AsDataTable Attribute Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/reference/attributes.mdx Use the `#[AsDataTable]` attribute on a class to configure a data table. This example shows basic configuration with entity class, serialization groups, Mercure, and API Platform integration. ```php #[AsDataTable(User::class, serializationGroups: ['user:list'], mercure: true, apiPlatform: true)] ``` -------------------------------- ### Configure UrlColumn with openInNewTab and showExternalIcon Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/columns/url-column.mdx Configure the UrlColumn to open links in a new tab and display an external icon. This is useful for external links or when you want to guide users to a new page without leaving the current one. ```php yield UrlColumn::new('website', 'Website') ->openInNewTab() ->showExternalIcon(); ``` -------------------------------- ### Complete Email Column Example in DataTable Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/columns/email-column.mdx Demonstrates integrating an EmailColumn with both obfuscation and masking within a complete DataTable configuration. Note that searching and sorting operate on the raw email value. ```php use Pentiminax\UX\DataTables\Attribute\AsDataTable; use Pentiminax\UX\DataTables\Column\EmailColumn; use Pentiminax\UX\DataTables\Column\NumberColumn; use Pentiminax\UX\DataTables\Column\TextColumn; use Pentiminax\UX\DataTables\Model\AbstractDataTable; #[AsDataTable(User::class)] final class UsersDataTable extends AbstractDataTable { public function configureColumns(): iterable { yield NumberColumn::new('id', 'ID'); yield TextColumn::new('name', 'Name'); yield EmailColumn::new('email', 'Email Address') ->obfuscate() ->mask(); } protected function mapRow(mixed $item): array { return [ 'id' => $item->getId(), 'name' => $item->getName(), 'email' => $item->getEmail(), ]; } } ``` -------------------------------- ### Initialize Buttons Extension with Button Types Source: https://github.com/pentiminax/ux-datatables/blob/main/skills/ux-datatables/references/extensions.md Shows how to initialize the Buttons extension with an array of predefined ButtonType cases. The constructor also accepts strings or Button objects. ```php use Pentiminax\UX\DataTables\Enum\ButtonType; use Pentiminax\UX\DataTables\Model\Extensions\{ButtonsExtension, Button}; new ButtonsExtension([ ButtonType::COPY, ButtonType::CSV, ButtonType::EXCEL, ButtonType::PDF, ButtonType::PRINT, ButtonType::COLUMN_VISIBILITY, ]); ``` -------------------------------- ### Example JSON Payload for AJAX Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/guide/client-side-processing.mdx This is an example of the JSON structure expected from an AJAX endpoint when `dataSrc` is not explicitly set (defaults to 'data'). ```json { "data": [ { "firstName": "Ada", "lastName": "Lovelace", "email": "ada@example.com", "role": "Administrator" }, { "firstName": "Grace", "lastName": "Hopper", "email": "grace@example.com", "role": "Manager" } ] } ``` -------------------------------- ### Initialize FixedColumns Extension Source: https://github.com/pentiminax/ux-datatables/blob/main/skills/ux-datatables/references/extensions.md Shows how to initialize the FixedColumns extension to freeze a specified number of leftmost or rightmost columns. ```php new FixedColumnsExtension(start: 1, end: 0); // freeze N leftmost / rightmost ``` -------------------------------- ### Complete Boolean Column Example in DataTable Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/columns/boolean-column.mdx A full example demonstrating the usage of BooleanColumn within a DataTable class, including other column types and the mapRow method. ```php use Pentiminax\UX\DataTables\Attribute\AsDataTable; use Pentiminax\UX\DataTables\Column\BooleanColumn; use Pentiminax\UX\DataTables\Column\NumberColumn; use Pentiminax\UX\DataTables\Column\TextColumn; use Pentiminax\UX\DataTables\Model\AbstractDataTable; #[AsDataTable(User::class)] final class UsersDataTable extends AbstractDataTable { public function configureColumns(): iterable { yield NumberColumn::new('id', 'ID'); yield TextColumn::new('email', 'Email'); yield BooleanColumn::new('active', 'Active') ->renderAsSwitch(); // Entity class is injected automatically from #[AsDataTable(User::class)] } protected function mapRow(mixed $item): array { return [ 'id' => $item->getId(), 'email' => $item->getEmail(), 'active' => $item->isActive(), ]; } } ``` -------------------------------- ### Configure Select Extension with Multi-Select Style Source: https://github.com/pentiminax/ux-datatables/blob/main/skills/ux-datatables/references/extensions.md Demonstrates initializing the Select extension with a multi-select style and enabling header checkboxes. The constructor supports various other options for customization. ```php use Pentiminax\UX\DataTables\Enum\SelectStyle; use Pentiminax\UX\DataTables\Model\Extensions\SelectExtension; (new SelectExtension(style: SelectStyle::MULTI)) // SINGLE | MULTI ->withCheckbox(true) ->headerCheckbox(true); ``` -------------------------------- ### Configure NumberColumn and MoneyColumn Variants Source: https://github.com/pentiminax/ux-datatables/blob/main/README.md Shows fluent configuration for NumberColumn and MoneyColumn, including formatting and currency settings. ```php NumberColumn::new('price')->formatted(); MoneyColumn::new('price')->currency('EUR')->storedAsCents(); ``` -------------------------------- ### Inline Arrays With data() Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/guide/client-side-processing.mdx Use `data()` when your controller already has the rows in array form for the smallest possible setup. This setup is ideal when the page already owns the dataset and no extra HTTP request is needed. ```php namespace App\Controller; use Pentiminax\UX\DataTables\Column\EmailColumn; use Pentiminax\UX\DataTables\Column\TextColumn; use Pentiminax\UX\DataTables\Contracts\DataTableBuilderInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; final class UserController extends AbstractController { #[Route('/admin/users', name: 'app_admin_users')] public function index(DataTableBuilderInterface $builder): Response { $table = $builder ->createDataTable('users') ->columns([ TextColumn::new('firstName', 'First name'), TextColumn::new('lastName', 'Last name'), EmailColumn::new('email', 'Email'), TextColumn::new('role', 'Role'), ]) ->data([ [ 'firstName' => 'Ada', 'lastName' => 'Lovelace', 'email' => 'ada@example.com', 'role' => 'Administrator', ], [ 'firstName' => 'Grace', 'lastName' => 'Hopper', 'email' => 'grace@example.com', 'role' => 'Manager', ], ]); return $this->render('admin/users/index.html.twig', [ 'table' => $table, ]); } } ``` -------------------------------- ### List Available Entities for DataTable Generation Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/reference/maker.mdx Run this command without arguments to list all available entities and be prompted to select one for DataTable generation. This is useful when you don't want to specify the entity directly in the command. ```bash php bin/console make:datatable ``` -------------------------------- ### Shared Column Configuration Methods Source: https://github.com/pentiminax/ux-datatables/blob/main/skills/ux-datatables/references/columns.md Demonstrates various shared methods available on all column types for configuration, including width, class, ordering, searching, and data source. ```php TextColumn::new('email', 'Email') ->setWidth('200px') // any CSS unit ->setClassName('text-truncate') ->setCellType('th') // 'td' (default) or 'th' ->setVisible(true) ->setOrderable(false) // disable sorting on this column ->setSearchable(false) // disable per-column search ->disableGlobalSearch() // keep searchable but exclude from the global box ->setOrderExpression('invoiceCount') // raw ORDER BY (DQL/SELECT alias) for a computed column — see server-side.md ->setData('user.email') // data source path (client-side rows) ->setField('user.email') // entity property path (server-side query/sort) ->setDefaultContent('—') // fallback when value is null/missing ->setExportable(false) // exclude from export (adds 'not-exportable' class) ->hideWhenUpdating() // hide field in the edit modal ->permission('ROLE_ADMIN') // hide column unless granted (evaluated server-side, never sent to client) ->setCustomOption('key', 'value'); ``` -------------------------------- ### Disable Column Control for a TextColumn Source: https://github.com/pentiminax/ux-datatables/blob/main/README.md Example of disabling column control features for a specific TextColumn while maintaining search processing. ```php TextColumn::new('internalCode')->disableColumnControl(); ``` -------------------------------- ### Configure TextColumn Variants Source: https://github.com/pentiminax/ux-datatables/blob/main/README.md Demonstrates fluent configuration options for TextColumn, including UTF8 encoding and HTML rendering. ```php TextColumn::new('name')->utf8(); TextColumn::new('content')->html()->utf8(); ``` -------------------------------- ### Custom Stage Example Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/reference/data-providers-row-mappers.mdx Demonstrates how to implement a custom `RowStageInterface` to modify row data, such as converting a 'title' field to uppercase. ```APIDOC ## Custom Stage Example ### Description Example of a custom row stage that converts the 'title' field to uppercase. ### Class Definition ```php use Pentiminax\UX\DataTables\Contracts\RowStageInterface; final class UpperCaseTitleStage implements RowStageInterface { public function process(array $mappedRow, mixed $originalRow, array $columns): array { if (isset($mappedRow['title'])) { $mappedRow['title'] = strtoupper($mappedRow['title']); } return $mappedRow; } } ``` ### Usage Example ```php protected function createRowMapper(): RowMapperInterface { return parent::createRowMapper()->add(new UpperCaseTitleStage()); } ``` ``` -------------------------------- ### Run Project Tests Source: https://github.com/pentiminax/ux-datatables/blob/main/AGENTS.md Execute all project tests using PHPUnit. Ensure the project is functioning as expected. ```bash vendor/bin/phpunit ``` -------------------------------- ### Excluding Columns from Edit Form Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/reference/edit-modal.mdx Use `hideWhenUpdating()` on a column to exclude it from the edit modal form. This example excludes the 'createdAt' column. ```php public function configureColumns(): iterable { yield NumberColumn::new('id', 'ID'); yield TextColumn::new('name', 'Name'); yield DateColumn::new('createdAt', 'Created') ->hideWhenUpdating(); // Excluded from the edit form } ``` -------------------------------- ### Generated UserDataTable Class Structure Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/reference/maker.mdx This is an example of the DataTable class generated by the maker command. It includes column definitions and row mapping. ```php // src/DataTables/UserDataTable.php namespace App\DataTables; use App\Entity\User; use Pentiminax\UX\DataTables\Attribute\AsDataTable; use Pentiminax\UX\DataTables\Model\AbstractDataTable; use Pentiminax\UX\DataTables\Column\TextColumn; #[AsDataTable(User::class)] final class UserDataTable extends AbstractDataTable { public function configureColumns(): iterable { yield TextColumn::new('id', 'Id'); yield TextColumn::new('email', 'Email'); yield TextColumn::new('firstName', 'First Name'); yield TextColumn::new('lastName', 'Last Name'); // Add more columns as needed } protected function mapRow(mixed $item): array { /** @var User $item */ return [ 'id' => $item->getId(), 'email' => $item->getEmail(), 'firstName' => $item->getFirstName(), 'lastName' => $item->getLastName(), ]; } } ``` -------------------------------- ### Fluent Action Configuration Source: https://github.com/pentiminax/ux-datatables/blob/main/skills/ux-datatables/references/actions.md Configure an action fluently with various options including label, class, icon, ID field, HTML attributes, confirmation prompts, conditional display, URL linking, entity class, and permissions. ```php Action::detail() ->setLabel('View') ->setClassName('btn btn-sm btn-primary') ->setIcon('bi bi-eye') ->setIdField('uuid') // ID field used in URLs (default 'id') ->setHtmlAttributes(['data-turbo' => 'false']) ->askConfirmation('Sure?') // confirmation button label ->displayIf('status', 'draft') // show only when row.status === 'draft' ->linkToUrl(fn (User $u) => '/users/'.$u->getId()) // string | callable ->setEntityClass(User::class) // entity for permission subject ->permission('EDIT', fn (User $u) => $u->getId() !== 1); ``` -------------------------------- ### Basic Usage of TemplateColumn Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/columns/template-column.mdx Demonstrates how to create and configure a basic TemplateColumn, specifying the field to use and the Twig template for rendering. ```APIDOC ## Basic Usage ```php use Pentiminax\UX\DataTables\Column\TemplateColumn; TemplateColumn::new('status_display', 'Status') ->setField('status') ->setTemplate('datatable/columns/user_status.html.twig'); ``` The column name (`status_display`) is the key used in `mapRow()`. `setField()` tells the row mapper which property to read from the entity. ``` -------------------------------- ### UrlColumn::new Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/columns/url-column.mdx Creates a new UrlColumn instance. The first argument is the data name, and the second is the column title. ```APIDOC ## UrlColumn::new ### Description Creates a new UrlColumn (type: `html`). ### Method `UrlColumn::new(string $name, string $title = '')` ### Parameters - **name** (string) - The data name for the column. - **title** (string) - The title to display for the column. ``` -------------------------------- ### Create Basic Email Column Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/columns/email-column.mdx Instantiate a new EmailColumn for rendering email addresses. This sets up the basic column with a mailto link. ```php use Pentiminax\UX\DataTables\Column\EmailColumn; EmailColumn::new('email', 'Email Address'); ``` -------------------------------- ### Enable Responsive Extension (Minimal) Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/extensions/responsive.mdx Call the `responsive()` method on your DataTable instance to enable the Responsive Extension with default settings. ```php $dataTable->responsive(); ``` -------------------------------- ### Configure Column Display Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/columns/overview.mdx Set the header label, CSS class, width, visibility, and default content for a column using fluent methods. ```php $column ->setTitle('Full Name') // Header label ->setClassName('text-primary') // CSS class on each cell ->setWidth('200px') // Column width ->setVisible(false) // Hide the column ->setDefaultContent('N/A'); // Fallback for null values ``` -------------------------------- ### DataTableResult Instantiation Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/reference/abstract-datatable.mdx Example of creating a DataTableResult object to wrap data with pagination counts. Use this to return structured results from your data table processing. ```php new DataTableResult( recordsTotal: 1000, recordsFiltered: 150, data: $rows ); ``` -------------------------------- ### Configure BooleanColumn Variant Source: https://github.com/pentiminax/ux-datatables/blob/main/README.md Illustrates how to configure a BooleanColumn to render as a switch. ```php BooleanColumn::new('active')->renderAsSwitch(); ``` -------------------------------- ### Create Columns Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/columns/overview.mdx Use the static `::new()` factory method on concrete column classes to create new column instances. The first argument is the data key, and the second is the display header. ```php use Pentiminax\UX\DataTables\Column\TextColumn; use Pentiminax\UX\DataTables\Column\NumberColumn; use Pentiminax\UX\DataTables\Column\DateColumn; TextColumn::new('firstName', 'First Name'); NumberColumn::new('age', 'Age'); DateColumn::new('createdAt', 'Created'); ``` -------------------------------- ### Action Fluent Configuration Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/columns/action-column.mdx Customize the behavior and appearance of individual actions using these fluent methods. ```APIDOC ## Action Fluent Configuration ### `setLabel(string $label)` Override the button label. ### `setClassName(string $className)` Customize button classes. ### `setIcon(string $icon)` Render an icon before the label. ### `askConfirmation(string $message)` Display a browser confirmation prompt before the action. ### `displayIf(string $field, mixed $value)` Show the action only when `row[field] === value`. ### `setIdField(string $idField)` Use another row key instead of `id`. ### `setEntityClass(string $entityClass)` Set the Doctrine entity class explicitly. ### `linkToUrl(string|callable $url)` Set the URL for detail actions (static string or per-row callable). When `linkToUrl()` receives a callable, the argument depends on how the row was produced: - `AbstractDataTable` + provider or `setData($objects)`: the callable receives the original source object - manual `DataTable::data([...])` inline rows: the callable receives the row array ``` -------------------------------- ### Minimal User Data Table Configuration Source: https://github.com/pentiminax/ux-datatables/blob/main/skills/ux-datatables/SKILL.md Defines a DataTables class for the User entity, including columns, server-side processing, and row actions. Use this as a starting point for your own DataTables. ```php use App\Entity\User; use Pentiminax\UX\DataTables\Attribute\AsDataTable; use Pentiminax\UX\DataTables\Column\{DateColumn, NumberColumn, TextColumn}; use Pentiminax\UX\DataTables\Model\{AbstractDataTable, Action, Actions, DataTable}; #[AsDataTable(User::class)] final class UserDataTable extends AbstractDataTable { public function configureColumns(): iterable { return [ NumberColumn::new('id', 'ID'), TextColumn::new('email', 'Email'), DateColumn::new('createdAt', 'Created')->setFormat('d/m/Y'), ]; } public function configureDataTable(DataTable $table): DataTable { return $table->serverSide()->processing()->pageLength(25); } public function configureActions(Actions $actions): Actions { return $actions->add(Action::edit())->add(Action::delete()->askConfirmation('Delete?')); } } ``` -------------------------------- ### Enable Bulma Styling with AssetMapper Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/guide/styling.mdx Configure `assets/controllers.json` to use Bulma CSS. Ensure Bulma CSS is enabled and default CSS is disabled. Install the necessary packages separately. ```json { "controllers": { "@pentiminax/ux-datatables": { "datatable": { "enabled": true, "autoimport": { "datatables.net-dt/css/dataTables.dataTables.min.css": false, "datatables.net-bm/css/dataTables.bulma.min.css": true } } } } } ``` -------------------------------- ### Define Column with Column Attribute Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/reference/attributes.mdx Use the `#[Column]` attribute on a property to define column metadata. This example shows a basic column definition for an email property, enabling searching and ordering. ```php #[Column(title: 'Email', searchable: true, orderable: true)] private string $email; ``` -------------------------------- ### Manual Usage with DataTableBuilderInterface Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/columns/action-column.mdx Demonstrates how to manually create and configure an ActionColumn with various actions, such as delete, using the DataTableBuilderInterface. ```APIDOC ## Manual Usage with `DataTableBuilderInterface` If you build tables manually, create an `Actions` collection and wrap it with `ActionColumn::fromActions()`: ```php use App\Entity\User; use Pentiminax\UX\DataTables\Column\ActionColumn; use Pentiminax\UX\DataTables\Column\TextColumn; use Pentiminax\UX\DataTables\Model\Action; use Pentiminax\UX\DataTables\Model\Actions; $actions = (new Actions()) ->setColumnLabel('Operations') ->add( Action::delete() ->setEntityClass(User::class) ->setIdField('uuid') ->askConfirmation('Delete this user?') ); $table = $builder ->createDataTable('users') ->columns([ TextColumn::new('email', 'Email'), ActionColumn::fromActions('actions', 'Operations', $actions), ]) ->data([ ['uuid' => '8f9f0c31', 'email' => 'john@example.com'], ]); ``` Manual tables must provide the entity class themselves because there is no `#[AsDataTable]` attribute to infer it from. ``` -------------------------------- ### Basic Maker Command Usage Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/reference/maker.mdx The most basic usage of the `make:datatable` command requires only the entity name. ```bash php bin/console make:datatable EntityName ``` -------------------------------- ### Configure User Data Table with Domain Objects Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/guide/client-side-processing.mdx Define columns and actions for a data table that processes domain objects. Use `setData()` in the controller to provide the domain objects. ```php namespace App\DataTables; use App\Entity\User; use Pentiminax\UX\DataTables\Attribute\AsDataTable; use Pentiminax\UX\DataTables\Column\EmailColumn; use Pentiminax\UX\DataTables\Column\TextColumn; use Pentiminax\UX\DataTables\Model\AbstractDataTable; use Pentiminax\UX\DataTables\Model\Action; use Pentiminax\UX\DataTables\Model\Actions; #[AsDataTable(User::class)] final class UsersDataTable extends AbstractDataTable { public function configureColumns(): iterable { yield TextColumn::new('fullName', 'Name'); yield EmailColumn::new('email', 'Email'); yield TextColumn::new('role', 'Role'); } protected function mapRow(mixed $item): array { /** @var User $item */ return [ 'fullName' => $item->getFirstName().' '.$item->getLastName(), 'email' => $item->getEmail(), 'role' => $item->getRole()->value, ]; } public function configureActions(Actions $actions): Actions { $detailAction = Action::detail()->linkToUrl(static fn (User $user): string => '/admin/users/'.$user->getId()): return $actions->add($detailAction); } } ``` ```php namespace App\Controller; use App\DataTables\UsersDataTable; use App\Repository\UserRepository; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; final class UserController extends AbstractController { #[Route('/admin/users', name: 'app_admin_users')] public function index(UsersDataTable $table, UserRepository $users): Response { $data = $users->findBy([], ['lastName' => 'ASC']) $table->setData($data); return $this->render('admin/users/index.html.twig', [ 'table' => $table, ]); } } ``` -------------------------------- ### Enable Responsive Extension (Advanced) Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/extensions/responsive.mdx Add the `ResponsiveExtension` to your DataTable using the `addExtension` method for more control over its configuration. ```php use Pentiminax\UX\DataTables\Model\Extensions\ResponsiveExtension; $dataTable->addExtension(new ResponsiveExtension()); ``` -------------------------------- ### Configure Fixed Columns Extension Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/extensions/fixed-columns.mdx Customize the Fixed Columns extension by specifying the number of columns to fix at the start and end of the table. Use this for more granular control over which columns remain visible during scrolling. ```php $dataTable->addExtension(new FixedColumnsExtension(start: 2, end: 1)); ``` -------------------------------- ### Enable API Platform Integration via Attribute Source: https://github.com/pentiminax/ux-datatables/blob/main/skills/ux-datatables/references/api-platform.md Use the `#[AsDataTable]` attribute with `apiPlatform: true` to enable API Platform integration and automatic URL resolution/column detection. ```php #[AsDataTable(Book::class, apiPlatform: true)] final class BookDataTable extends AbstractDataTable {} ``` -------------------------------- ### Publish Mercure Update Payload Source: https://github.com/pentiminax/ux-datatables/blob/main/docs/src/content/docs/integrations/mercure.mdx Example JSON payload for a Mercure update when using inline editing with topics. This structure is published by the Ajax edit controller when boolean inline edit is called. ```json { "type": "edit", "id": "...", "field": "..." } ```