{$item['id']} - {$item['name']} {$item['birth_date']|date:'j. n. Y H:i:s'}
-
-
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Curabitur vitae diam non enim vestibulum interdum. Nulla quis diam. Integer in sapien. Nullam dapibus fermentum ipsum. Curabitur bibendum justo non orci. Etiam neque. Nullam dapibus fermentum ipsum. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Etiam posuere lacus quis dolor. Aliquam ornare wisi eu metus. Nulla non lectus sed nisl molestie malesuada. Vivamus ac leo pretium faucibus. Aliquam ante. Aliquam erat volutpat.
-
-
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Curabitur vitae diam non enim vestibulum interdum. Nulla quis diam. Integer in sapien. Nullam dapibus fermentum ipsum. Curabitur bibendum justo non orci. Etiam neque. Nullam dapibus fermentum ipsum. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Etiam posuere lacus quis dolor. Aliquam ornare wisi eu metus. Nulla non lectus sed nisl molestie malesuada. Vivamus ac leo pretium faucibus. Aliquam ante. Aliquam erat volutpat.
-
-
+
{$item['id']} - {$item['name']}
+
Status: {$item['status']}
+
Template parameter: {$customParam}
+ {if isset($frm)}
+ {$frm}
+ {/if}
{/block}
diff --git a/app/UI/Row/RowPresenter.php b/app/UI/Row/RowPresenter.php
index f144aec..ccd78d4 100644
--- a/app/UI/Row/RowPresenter.php
+++ b/app/UI/Row/RowPresenter.php
@@ -50,6 +50,13 @@ public function createComponentGrid(): Datagrid
$grid->allowRowsAction('detail', fn ($item): bool => $item->id % 4 === 0);
+ $multiAction = $grid->addMultiAction('multi', 'More')
+ ->addAction('view', 'View', 'this')
+ ->addAction('export', 'Export', 'this');
+
+ $grid->allowRowsMultiAction('multi', 'view', fn ($item): bool => $item->id % 2 === 0);
+ $grid->allowRowsMultiAction('multi', 'export', fn ($item): bool => $item->id % 3 === 0);
+
return $grid;
}
diff --git a/app/UI/Sorting/SortingPresenter.php b/app/UI/Sorting/SortingPresenter.php
new file mode 100644
index 0000000..38e4337
--- /dev/null
+++ b/app/UI/Sorting/SortingPresenter.php
@@ -0,0 +1,46 @@
+setDataSource($this->dibiConnection->select('*')->from('users'));
+
+ $grid->setItemsPerPageList([20, 50, 100], true);
+
+ // Enable multi-sort - allows sorting by multiple columns simultaneously
+ $grid->setMultiSortEnabled();
+
+ $grid->addColumnText('id', 'Id')
+ ->setSortable()
+ ->setSortableResetPagination(); // Reset pagination when sorting changes
+
+ $grid->addColumnText('email', 'E-mail')
+ ->setSortable()
+ ->setSortableResetPagination();
+
+ $grid->addColumnText('name', 'Name')
+ ->setSortable()
+ ->setSortableResetPagination()
+ ->setSortableCallback(function (Fluent $fluent, string $sort): void {
+ $fluent->orderBy('CHAR_LENGTH(name)', $sort); // Custom sort: by name length
+ });
+
+ $grid->addColumnText('status', 'Status')
+ ->setSortable();
+
+ $grid->setDefaultSort(['name' => 'ASC', 'id' => 'DESC']);
+
+ return $grid;
+ }
+
+}
diff --git a/app/UI/Sorting/Templates/default.latte b/app/UI/Sorting/Templates/default.latte
new file mode 100644
index 0000000..ec3ba3a
--- /dev/null
+++ b/app/UI/Sorting/Templates/default.latte
@@ -0,0 +1,3 @@
+{block content}
+ {control grid}
+{/block}
diff --git a/app/UI/StateStorage/StateStoragePresenter.php b/app/UI/StateStorage/StateStoragePresenter.php
new file mode 100644
index 0000000..bbe355b
--- /dev/null
+++ b/app/UI/StateStorage/StateStoragePresenter.php
@@ -0,0 +1,47 @@
+setDataSource($this->dibiConnection->select('*')->from('users'));
+
+ $grid->setItemsPerPageList([20, 50, 100], true);
+
+ // Remember grid state (filters, sorting, pagination) across requests
+ $grid->setRememberState();
+
+ // Refresh URL with current filter state (history API)
+ $grid->setRefreshUrl();
+
+ $grid->addColumnText('id', 'Id')
+ ->setSortable();
+
+ $grid->addColumnText('email', 'E-mail')
+ ->setSortable()
+ ->setFilterText();
+
+ $grid->addColumnText('name', 'Name')
+ ->setSortable()
+ ->setFilterText();
+
+ $grid->addColumnText('status', 'Status')
+ ->setFilterSelect([
+ '' => 'All',
+ 'active' => 'Active',
+ 'inactive' => 'Inactive',
+ 'deleted' => 'Deleted',
+ ]);
+
+ return $grid;
+ }
+
+}
diff --git a/app/UI/StateStorage/Templates/default.latte b/app/UI/StateStorage/Templates/default.latte
new file mode 100644
index 0000000..ec3ba3a
--- /dev/null
+++ b/app/UI/StateStorage/Templates/default.latte
@@ -0,0 +1,3 @@
+{block content}
+ {control grid}
+{/block}
diff --git a/docker-compose.yml b/docker-compose.yml
index a1f568f..66e0f31 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -8,7 +8,7 @@ services:
depends_on:
- database
environment:
- NETTE_DEBUG: 1
+ NETTE_DEBUG: 0
database:
image: mariadb:11.5
diff --git a/screenshots/00-home.png b/screenshots/00-home.png
new file mode 100644
index 0000000..9fd437b
Binary files /dev/null and b/screenshots/00-home.png differ
diff --git a/screenshots/01-filters.png b/screenshots/01-filters.png
new file mode 100644
index 0000000..44a8269
Binary files /dev/null and b/screenshots/01-filters.png differ
diff --git a/screenshots/02-outer-filters-expanded.png b/screenshots/02-outer-filters-expanded.png
new file mode 100644
index 0000000..4e3ccf1
Binary files /dev/null and b/screenshots/02-outer-filters-expanded.png differ
diff --git a/screenshots/02-outer-filters.png b/screenshots/02-outer-filters.png
new file mode 100644
index 0000000..6f3ee96
Binary files /dev/null and b/screenshots/02-outer-filters.png differ
diff --git a/screenshots/03-columns-hideable.png b/screenshots/03-columns-hideable.png
new file mode 100644
index 0000000..22e553c
Binary files /dev/null and b/screenshots/03-columns-hideable.png differ
diff --git a/screenshots/03-columns.png b/screenshots/03-columns.png
new file mode 100644
index 0000000..b7d1353
Binary files /dev/null and b/screenshots/03-columns.png differ
diff --git a/screenshots/04-actions-multiaction.png b/screenshots/04-actions-multiaction.png
new file mode 100644
index 0000000..ba3a4b3
Binary files /dev/null and b/screenshots/04-actions-multiaction.png differ
diff --git a/screenshots/04-actions.png b/screenshots/04-actions.png
new file mode 100644
index 0000000..ddbb527
Binary files /dev/null and b/screenshots/04-actions.png differ
diff --git a/screenshots/05-group-actions-selected.png b/screenshots/05-group-actions-selected.png
new file mode 100644
index 0000000..b003b52
Binary files /dev/null and b/screenshots/05-group-actions-selected.png differ
diff --git a/screenshots/05-group-actions.png b/screenshots/05-group-actions.png
new file mode 100644
index 0000000..38b6684
Binary files /dev/null and b/screenshots/05-group-actions.png differ
diff --git a/screenshots/06-row.png b/screenshots/06-row.png
new file mode 100644
index 0000000..8ae064e
Binary files /dev/null and b/screenshots/06-row.png differ
diff --git a/screenshots/07-item-detail-expanded.png b/screenshots/07-item-detail-expanded.png
new file mode 100644
index 0000000..d27ed78
Binary files /dev/null and b/screenshots/07-item-detail-expanded.png differ
diff --git a/screenshots/07-item-detail.png b/screenshots/07-item-detail.png
new file mode 100644
index 0000000..a457bc6
Binary files /dev/null and b/screenshots/07-item-detail.png differ
diff --git a/screenshots/08-export.png b/screenshots/08-export.png
new file mode 100644
index 0000000..6876f87
Binary files /dev/null and b/screenshots/08-export.png differ
diff --git a/screenshots/09-tree-view-expanded.png b/screenshots/09-tree-view-expanded.png
new file mode 100644
index 0000000..8696c8f
Binary files /dev/null and b/screenshots/09-tree-view-expanded.png differ
diff --git a/screenshots/09-tree-view.png b/screenshots/09-tree-view.png
new file mode 100644
index 0000000..5d0da4e
Binary files /dev/null and b/screenshots/09-tree-view.png differ
diff --git a/screenshots/10-edit-inline.png b/screenshots/10-edit-inline.png
new file mode 100644
index 0000000..e99bd4a
Binary files /dev/null and b/screenshots/10-edit-inline.png differ
diff --git a/screenshots/10-edit.png b/screenshots/10-edit.png
new file mode 100644
index 0000000..8daae15
Binary files /dev/null and b/screenshots/10-edit.png differ
diff --git a/screenshots/11-add-inline.png b/screenshots/11-add-inline.png
new file mode 100644
index 0000000..9b5b24d
Binary files /dev/null and b/screenshots/11-add-inline.png differ
diff --git a/screenshots/11-add.png b/screenshots/11-add.png
new file mode 100644
index 0000000..9b5b24d
Binary files /dev/null and b/screenshots/11-add.png differ
diff --git a/screenshots/12-localization.png b/screenshots/12-localization.png
new file mode 100644
index 0000000..3696dcb
Binary files /dev/null and b/screenshots/12-localization.png differ
diff --git a/screenshots/13-cdn.png b/screenshots/13-cdn.png
new file mode 100644
index 0000000..94cf5b0
Binary files /dev/null and b/screenshots/13-cdn.png differ
diff --git a/screenshots/14-no-pagination.png b/screenshots/14-no-pagination.png
new file mode 100644
index 0000000..ecf04ea
Binary files /dev/null and b/screenshots/14-no-pagination.png differ
diff --git a/screenshots/15-sorting.png b/screenshots/15-sorting.png
new file mode 100644
index 0000000..127bbfa
Binary files /dev/null and b/screenshots/15-sorting.png differ
diff --git a/screenshots/16-columns-summary.png b/screenshots/16-columns-summary.png
new file mode 100644
index 0000000..7b8418e
Binary files /dev/null and b/screenshots/16-columns-summary.png differ
diff --git a/screenshots/17-array-datasource.png b/screenshots/17-array-datasource.png
new file mode 100644
index 0000000..89f982f
Binary files /dev/null and b/screenshots/17-array-datasource.png differ
diff --git a/screenshots/18-state-storage.png b/screenshots/18-state-storage.png
new file mode 100644
index 0000000..22c0569
Binary files /dev/null and b/screenshots/18-state-storage.png differ
diff --git a/screenshots/19-events.png b/screenshots/19-events.png
new file mode 100644
index 0000000..f6304aa
Binary files /dev/null and b/screenshots/19-events.png differ