<?php
/**
* Example 04 — Toolbar with Bulk Actions
*
* Shows how to add toolbar buttons above/below the table for
* creating new records, bulk-deleting selected rows, and exporting
* all visible data.
*/
declare(strict_types=1);
require __DIR__ . '/../vendor/autoload.php';
use Italix\DataSets\DataSet;
use Italix\DataSets\Drivers\Tabulator\TabulatorDriver;
$ds = new DataSet($usersTable);
$ds->columns(['name', 'email', 'role', 'created_at']);
$ds->ajax_url('/api/users');
// Enable row selection with checkboxes (required for "selected" scope buttons)
$ds->selectable(true);
// ---- Toolbar ---------------------------------------------------------------
// Toolbar buttons have a "scope" that determines what data they receive:
// 'none' — callback receives no data (e.g. "Add New")
// 'selected' — callback receives an array of selected rows
// 'all' — callback receives all rows currently in the table
$ds->toolbar()
->position('top') // 'top', 'bottom', or 'both'
->css_class('my-toolbar');
// "Add New" — no row data needed
$ds->toolbar()
->button('add', 'Add New', 'none')
->css_class('btn btn-success')
->icon('fa fa-plus');
// "Delete Selected" — receives the selected rows
$ds->toolbar()
->button('delete_selected', 'Delete Selected', 'selected')
->css_class('btn btn-danger')
->icon('fa fa-trash')
->confirm('Delete all selected users?');
// "Export CSV" — receives all visible rows
$ds->toolbar()
->button('export', 'Export CSV', 'all')
->css_class('btn btn-outline-secondary')
->icon('fa fa-download');
// Map toolbar actions to JS callbacks
$ds->on('add', 'onAddUser');
$ds->on('delete_selected', 'onDeleteSelected');
$ds->on('export', 'onExportCsv');
// ---- Render ----------------------------------------------------------------
$driver = new TabulatorDriver();
$script = $driver->render_script($ds, '#users-table', 'usersTable');
?>
<div id="users-table"></div>
<script>
// Toolbar callbacks
function onAddUser() {
// scope='none': no arguments
window.location.href = '/users/create';
}
function onDeleteSelected(selectedRows) {
// scope='selected': receives array of row data objects
var ids = selectedRows.map(function(r) { return r.id; });
fetch('/api/users/bulk-delete', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ids: ids })
}).then(function() {
usersTable.setData(); // Reload the table
});
}
function onExportCsv(allRows) {
// scope='all': receives array of all row data objects
var csv = 'name,email,role\n';
allRows.forEach(function(row) {
csv += row.name + ',' + row.email + ',' + row.role + '\n';
});
var blob = new Blob([csv], { type: 'text/csv' });
var a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = 'users.csv';
a.click();
}
<?= $script ?>
</script>