diff --git a/lib/Froxlor/UI/Callbacks/Domain.php b/lib/Froxlor/UI/Callbacks/Domain.php
index 5d9dd152..5510a496 100644
--- a/lib/Froxlor/UI/Callbacks/Domain.php
+++ b/lib/Froxlor/UI/Callbacks/Domain.php
@@ -28,7 +28,7 @@ class Domain
// path or redirect
if (preg_match('/^https?\:\/\//', $attributes['fields']['documentroot'])) {
return [
- 'type' => 'link',
+ 'macro' => 'link',
'data' => [
'text' => $attributes['fields']['documentroot'],
'href' => $attributes['fields']['documentroot'],
diff --git a/lib/Froxlor/UI/Callbacks/Email.php b/lib/Froxlor/UI/Callbacks/Email.php
index b951e9a6..b22642ae 100644
--- a/lib/Froxlor/UI/Callbacks/Email.php
+++ b/lib/Froxlor/UI/Callbacks/Email.php
@@ -24,7 +24,7 @@ class Email
public static function account(array $attributes)
{
return [
- 'type' => 'booleanWithInfo',
+ 'macro' => 'booleanWithInfo',
'data' => [
'checked' => $attributes['data'] != 0,
'info' => $attributes['data'] != 0 ? PhpHelper::sizeReadable($attributes['fields']['mboxsize'], 'GiB', 'bi', '%01.' . (int)Settings::Get('panel.decimal_places') . 'f %s') : ''
diff --git a/lib/Froxlor/UI/Callbacks/Impersonate.php b/lib/Froxlor/UI/Callbacks/Impersonate.php
index d1009b6d..24e45218 100644
--- a/lib/Froxlor/UI/Callbacks/Impersonate.php
+++ b/lib/Froxlor/UI/Callbacks/Impersonate.php
@@ -26,7 +26,7 @@ class Impersonate
if (UI::getCurrentUser()['adminid'] != $attributes['fields']['adminid']) {
$linker = UI::getLinker();
return [
- 'type' => 'link',
+ 'macro' => 'link',
'data' => [
'text' => $attributes['data'],
'href' => $linker->getLink([
@@ -45,7 +45,7 @@ class Impersonate
{
$linker = UI::getLinker();
return [
- 'type' => 'link',
+ 'macro' => 'link',
'data' => [
'text' => $attributes['data'],
'href' => $linker->getLink([
diff --git a/lib/Froxlor/UI/Callbacks/PHPConf.php b/lib/Froxlor/UI/Callbacks/PHPConf.php
index 3dec2a78..fc083e79 100644
--- a/lib/Froxlor/UI/Callbacks/PHPConf.php
+++ b/lib/Froxlor/UI/Callbacks/PHPConf.php
@@ -21,7 +21,7 @@ use Froxlor\UI\Panel\UI;
*/
class PHPConf
{
- public static function domainList(array $attributes)
+ public static function domainList(array $attributes): string
{
$idna = new IdnaWrapper;
$domains = "";
@@ -56,7 +56,7 @@ class PHPConf
{
$linker = UI::getLinker();
return [
- 'type' => 'link',
+ 'macro' => 'link',
'data' => [
'text' => $attributes['data'],
'href' => $linker->getLink([
diff --git a/lib/Froxlor/UI/Callbacks/ProgressBar.php b/lib/Froxlor/UI/Callbacks/ProgressBar.php
index 164baa1c..dae6e0f9 100644
--- a/lib/Froxlor/UI/Callbacks/ProgressBar.php
+++ b/lib/Froxlor/UI/Callbacks/ProgressBar.php
@@ -75,7 +75,7 @@ class ProgressBar
}
return [
- 'type' => 'progressbar',
+ 'macro' => 'progressbar',
'data' => [
'percent' => $percent,
'style' => $style,
diff --git a/lib/Froxlor/UI/Callbacks/SSLCertificate.php b/lib/Froxlor/UI/Callbacks/SSLCertificate.php
index 9abcbaf2..31acc7fd 100644
--- a/lib/Froxlor/UI/Callbacks/SSLCertificate.php
+++ b/lib/Froxlor/UI/Callbacks/SSLCertificate.php
@@ -22,7 +22,7 @@ class SSLCertificate
public static function domainWithSan(array $attributes): array
{
return [
- 'type' => 'domainWithSan',
+ 'macro' => 'domainWithSan',
'data' => [
'domain' => $attributes['data'],
'san' => implode(', ', $attributes['fields']['san'] ?? []),
diff --git a/lib/Froxlor/UI/Callbacks/Text.php b/lib/Froxlor/UI/Callbacks/Text.php
index 79459dd3..90d832cf 100644
--- a/lib/Froxlor/UI/Callbacks/Text.php
+++ b/lib/Froxlor/UI/Callbacks/Text.php
@@ -27,7 +27,7 @@ class Text
public static function boolean(array $attributes): array
{
return [
- 'type' => 'boolean',
+ 'macro' => 'boolean',
'data' => (bool)$attributes['data']
];
}
diff --git a/lib/Froxlor/UI/Listing.php b/lib/Froxlor/UI/Listing.php
index f087eef3..a5f37306 100644
--- a/lib/Froxlor/UI/Listing.php
+++ b/lib/Froxlor/UI/Listing.php
@@ -65,31 +65,37 @@ class Listing
return $heading;
}
+ /**
+ * @throws Exception
+ */
private static function generateTableRows(array $list, array $tabellisting): array
{
$rows = [];
// Create new row from item
- foreach ($list as $row => $item) {
+ foreach ($list as $row => $fields) {
// Generate columns from item
foreach ($tabellisting['visible_columns'] as $col => $visible_column) {
+ // Continue if column is not visible
if (isset($tabellisting['columns'][$visible_column]['visible']) && !$tabellisting['columns'][$visible_column]['visible']) {
continue;
}
- $format_callback = $tabellisting['columns'][$visible_column]['format_callback'] ?? null;
- $column = $tabellisting['columns'][$visible_column]['field'] ?? null;
- if (empty($column)) {
- throw new Exception('Column in "visible columns" specified that is not defined in "fields"');
- }
- $data = self::getMultiArrayFromString($item, $column);
+ // Get data from filed if it is defined
+ $field = $tabellisting['columns'][$visible_column]['field'] ?? null;
+ $data = self::getMultiArrayFromString($fields, $field);
- if ($format_callback) {
- $rows[$row]['td'][$col]['data'] = call_user_func($format_callback, ['data' => $data, 'fields' => $item]);
- } else {
+ // Call user function for given column if defined or return data from field, otherwise throw exception
+ $callback = $tabellisting['columns'][$visible_column]['callback'] ?? null;
+ if ($callback) {
+ $rows[$row]['td'][$col]['data'] = call_user_func($callback, ['data' => $data, 'fields' => $fields]);
+ } elseif ($field) {
$rows[$row]['td'][$col]['data'] = $data;
+ } else {
+ throw new Exception('The visible column "'. $visible_column .'" has neither a "callback" nor a "field" set.');
}
+ // Set class for table-row if defined
$rows[$row]['td'][$col]['class'] = $tabellisting['columns'][$visible_column]['class'] ?? null;
}
@@ -97,19 +103,19 @@ class Listing
if (isset($tabellisting['format_callback'])) {
$class = [];
foreach ($tabellisting['format_callback'] as $format_callback) {
- $class[] = call_user_func($format_callback, ['fields' => $item]);
+ $class[] = call_user_func($format_callback, ['fields' => $fields]);
}
$rows[$row]['class'] = implode(' ', $class);
}
// Set all actions for row
if (isset($tabellisting['actions'])) {
- $actions = self::setLinks($tabellisting['actions'], $item);
+ $actions = self::setLinks($tabellisting['actions'], $fields);
$rows[$row]['td'][] = [
'class' => 'text-end',
'data' => [
- 'type' => 'actions',
+ 'macro' => 'actions',
'data' => $actions
]
];
@@ -151,14 +157,14 @@ class Listing
public static function getVisibleColumnsForListing(string $listing, array $default_columns): array
{
- // Hier käme dann die Logik, die das aus der DB zieht ...
- // alternativ nimmt er die $default_columns, wenn kein Eintrag
- // in der DB definiert ist
+ // Here would come the logic that pulls this from the DB ...
+ // alternatively, it takes the $default_columns if no entry is
+ // defined in the DB
return $default_columns;
}
- public static function getMultiArrayFromString(array $arr, string $str)
+ public static function getMultiArrayFromString(array $arr, ?string $str)
{
foreach (explode('.', $str) as $key) {
if (!array_key_exists($key, $arr)) {
diff --git a/lib/tablelisting/admin/tablelisting.admins.php b/lib/tablelisting/admin/tablelisting.admins.php
index 64520dc9..a4004d8a 100644
--- a/lib/tablelisting/admin/tablelisting.admins.php
+++ b/lib/tablelisting/admin/tablelisting.admins.php
@@ -48,18 +48,18 @@ return [
'diskspace' => [
'label' => $lng['customer']['diskspace'],
'field' => 'diskspace',
- 'format_callback' => [ProgressBar::class, 'diskspace'],
+ 'callback' => [ProgressBar::class, 'diskspace'],
],
'traffic' => [
'label' => $lng['customer']['traffic'],
'field' => 'traffic',
- 'format_callback' => [ProgressBar::class, 'traffic'],
+ 'callback' => [ProgressBar::class, 'traffic'],
],
'deactivated' => [
'label' => $lng['admin']['deactivated'],
'field' => 'deactivated',
'class' => 'text-center',
- 'format_callback' => [Text::class, 'boolean'],
+ 'callback' => [Text::class, 'boolean'],
],
],
'visible_columns' => Listing::getVisibleColumnsForListing('admin_list', [
@@ -93,7 +93,7 @@ return [
],
],
],
- 'format_callback' => [
+ 'callback' => [
[Style::class, 'deactivated'],
[Style::class, 'diskspaceWarning'],
[Style::class, 'trafficWarning']
diff --git a/lib/tablelisting/admin/tablelisting.cronjobs.php b/lib/tablelisting/admin/tablelisting.cronjobs.php
index cbc625a0..fc99c555 100644
--- a/lib/tablelisting/admin/tablelisting.cronjobs.php
+++ b/lib/tablelisting/admin/tablelisting.cronjobs.php
@@ -26,12 +26,12 @@ return [
'c.description' => [
'label' => $lng['cron']['description'],
'field' => 'desc_lng_key',
- 'format_callback' => [Text::class, 'crondesc']
+ 'callback' => [Text::class, 'crondesc']
],
'c.lastrun' => [
'label' => $lng['cron']['lastrun'],
'field' => 'lastrun',
- 'format_callback' => [Text::class, 'timestamp']
+ 'callback' => [Text::class, 'timestamp']
],
'c.interval' => [
'label' => $lng['cron']['interval'],
@@ -40,7 +40,7 @@ return [
'c.isactive' => [
'label' => $lng['cron']['isactive'],
'field' => 'isactive',
- 'format_callback' => [Text::class, 'boolean']
+ 'callback' => [Text::class, 'boolean']
],
],
'visible_columns' => Listing::getVisibleColumnsForListing('cron_list', [
diff --git a/lib/tablelisting/admin/tablelisting.customers.php b/lib/tablelisting/admin/tablelisting.customers.php
index d2b03f3d..f878c82a 100644
--- a/lib/tablelisting/admin/tablelisting.customers.php
+++ b/lib/tablelisting/admin/tablelisting.customers.php
@@ -30,17 +30,17 @@ return [
'c.name' => [
'label' => $lng['customer']['name'],
'field' => 'name',
- 'format_callback' => [Text::class, 'customerfullname'],
+ 'callback' => [Text::class, 'customerfullname'],
],
'c.loginname' => [
'label' => $lng['login']['username'],
'field' => 'loginname',
- 'format_callback' => [Impersonate::class, 'customer'],
+ 'callback' => [Impersonate::class, 'customer'],
],
'a.loginname' => [
'label' => $lng['admin']['admin'],
'field' => 'admin.loginname',
- 'format_callback' => [Impersonate::class, 'admin'],
+ 'callback' => [Impersonate::class, 'admin'],
],
'c.email' => [
'label' => $lng['customer']['email'],
@@ -49,12 +49,12 @@ return [
'c.diskspace' => [
'label' => $lng['customer']['diskspace'],
'field' => 'diskspace',
- 'format_callback' => [ProgressBar::class, 'diskspace'],
+ 'callback' => [ProgressBar::class, 'diskspace'],
],
'c.traffic' => [
'label' => $lng['customer']['traffic'],
'field' => 'traffic',
- 'format_callback' => [ProgressBar::class, 'traffic'],
+ 'callback' => [ProgressBar::class, 'traffic'],
],
],
'visible_columns' => Listing::getVisibleColumnsForListing('customer_list', [
diff --git a/lib/tablelisting/admin/tablelisting.domains.php b/lib/tablelisting/admin/tablelisting.domains.php
index adf71620..7e10f745 100644
--- a/lib/tablelisting/admin/tablelisting.domains.php
+++ b/lib/tablelisting/admin/tablelisting.domains.php
@@ -34,12 +34,12 @@ return [
'c.name' => [
'label' => $lng['customer']['name'],
'field' => 'customer.name',
- 'format_callback' => [Text::class, 'customerfullname'],
+ 'callback' => [Text::class, 'customerfullname'],
],
'c.loginname' => [
'label' => $lng['login']['username'],
'field' => 'customer.loginname',
- 'format_callback' => [Impersonate::class, 'customer'],
+ 'callback' => [Impersonate::class, 'customer'],
],
'd.aliasdomain' => [
'label' => $lng['domains']['aliasdomain'],
diff --git a/lib/tablelisting/admin/tablelisting.fpmconfigs.php b/lib/tablelisting/admin/tablelisting.fpmconfigs.php
index e9603153..328caa25 100644
--- a/lib/tablelisting/admin/tablelisting.fpmconfigs.php
+++ b/lib/tablelisting/admin/tablelisting.fpmconfigs.php
@@ -30,8 +30,7 @@ return [
],
'configs' => [
'label' => $lng['admin']['phpsettings']['activephpconfigs'],
- 'field' => 'configs',
- 'text' => [PHPConf::class, 'configsList']
+ 'callback' => [PHPConf::class, 'configsList']
],
'reload_cmd' => [
'label' => $lng['serversettings']['phpfpm_settings']['reload'],
diff --git a/lib/tablelisting/admin/tablelisting.ipsandports.php b/lib/tablelisting/admin/tablelisting.ipsandports.php
index 6b075b4d..b92bef9b 100644
--- a/lib/tablelisting/admin/tablelisting.ipsandports.php
+++ b/lib/tablelisting/admin/tablelisting.ipsandports.php
@@ -38,40 +38,40 @@ return [
'label' => 'Listen',
'field' => 'listen_statement',
'class' => 'text-center',
- 'format_callback' => [Text::class, 'boolean'],
+ 'callback' => [Text::class, 'boolean'],
'visible' => Settings::Get('system.webserver') != 'nginx'
],
'namevirtualhost' => [
'label' => 'NameVirtualHost',
'field' => 'namevirtualhost_statement',
'class' => 'text-center',
- 'format_callback' => [Text::class, 'boolean'],
+ 'callback' => [Text::class, 'boolean'],
'visible' => Settings::Get('system.webserver') == 'apache2' && (int)Settings::Get('system.apache24') == 0
],
'vhostcontainer' => [
'label' => 'vHost-Container',
'field' => 'vhostcontainer',
'class' => 'text-center',
- 'format_callback' => [Text::class, 'boolean']
+ 'callback' => [Text::class, 'boolean']
],
'specialsettings' => [
'label' => 'Specialsettings',
'field' => 'specialsettings',
'class' => 'text-center',
- 'format_callback' => [Text::class, 'boolean']
+ 'callback' => [Text::class, 'boolean']
],
'servername' => [
'label' => 'ServerName',
'field' => 'vhostcontainer_servername_statement',
'class' => 'text-center',
- 'format_callback' => [Text::class, 'boolean'],
+ 'callback' => [Text::class, 'boolean'],
'visible' => Settings::Get('system.webserver') == 'apache2'
],
'ssl' => [
'label' => 'SSL',
'field' => 'ssl',
'class' => 'text-center',
- 'format_callback' => [Text::class, 'boolean']
+ 'callback' => [Text::class, 'boolean']
],
],
'visible_columns' => Listing::getVisibleColumnsForListing('ipsandports_list', [
diff --git a/lib/tablelisting/admin/tablelisting.phpconfigs.php b/lib/tablelisting/admin/tablelisting.phpconfigs.php
index 774e7e0b..ef12c3ef 100644
--- a/lib/tablelisting/admin/tablelisting.phpconfigs.php
+++ b/lib/tablelisting/admin/tablelisting.phpconfigs.php
@@ -32,13 +32,13 @@ return [
'domains' => [
'label' => $lng['admin']['phpsettings']['activedomains'],
'field' => 'domains',
- 'text' => [PHPConf::class, 'domainList']
+ 'callback' => [PHPConf::class, 'domainList']
],
'fpmdesc' => [
'label' => $lng['admin']['phpsettings']['fpmdesc'],
'field' => 'fpmdesc',
'visible' => (bool) Settings::Get('phpfpm.enabled'),
- 'format_callback' => [PHPConf::class, 'fpmConfLink']
+ 'callback' => [PHPConf::class, 'fpmConfLink']
],
'c.binary' => [
'label' => $lng['admin']['phpsettings']['binary'],
diff --git a/lib/tablelisting/admin/tablelisting.plans.php b/lib/tablelisting/admin/tablelisting.plans.php
index fdc9118f..922ad9aa 100644
--- a/lib/tablelisting/admin/tablelisting.plans.php
+++ b/lib/tablelisting/admin/tablelisting.plans.php
@@ -39,7 +39,7 @@ return [
'p.ts' => [
'label' => $lng['admin']['plans']['last_update'],
'field' => 'ts',
- 'format_callback' => [Text::class, 'timestamp'],
+ 'callback' => [Text::class, 'timestamp'],
],
],
'visible_columns' => Listing::getVisibleColumnsForListing('plan_list', [
diff --git a/lib/tablelisting/admin/tablelisting.sslcertificates.php b/lib/tablelisting/admin/tablelisting.sslcertificates.php
index d8ee78ec..ecea6892 100644
--- a/lib/tablelisting/admin/tablelisting.sslcertificates.php
+++ b/lib/tablelisting/admin/tablelisting.sslcertificates.php
@@ -33,7 +33,7 @@ return [
'c.domain' => [
'label' => $lng['ssl_certificates']['certificate_for'],
'field' => 'domain',
- 'format_callback' => [SSLCertificate::class, 'domainWithSan'],
+ 'callback' => [SSLCertificate::class, 'domainWithSan'],
],
'c.issuer' => [
'label' => $lng['ssl_certificates']['issuer'],
@@ -51,7 +51,7 @@ return [
'label' => $lng['panel']['letsencrypt'],
'field' => 'letsencrypt',
'class' => 'text-center',
- 'format_callback' => [Text::class, 'boolean'],
+ 'callback' => [Text::class, 'boolean'],
'visible' => Settings::Get('system.le_froxlor_enabled'),
],
],
diff --git a/lib/tablelisting/customer/tablelisting.domains.php b/lib/tablelisting/customer/tablelisting.domains.php
index 9f30c529..fd759656 100644
--- a/lib/tablelisting/customer/tablelisting.domains.php
+++ b/lib/tablelisting/customer/tablelisting.domains.php
@@ -31,7 +31,7 @@ return [
'd.documentroot' => [
'label' => $lng['panel']['path'],
'field' => 'documentroot',
- 'format_callback' => [Domain::class, 'domainTarget'],
+ 'callback' => [Domain::class, 'domainTarget'],
]
],
'visible_columns' => Listing::getVisibleColumnsForListing('domain_list', [
diff --git a/lib/tablelisting/customer/tablelisting.emails.php b/lib/tablelisting/customer/tablelisting.emails.php
index e9e0c5aa..175037b3 100644
--- a/lib/tablelisting/customer/tablelisting.emails.php
+++ b/lib/tablelisting/customer/tablelisting.emails.php
@@ -38,12 +38,12 @@ return [
'm.popaccountid' => [
'label' => $lng['emails']['account'],
'field' => 'popaccountid',
- 'format_callback' => [Email::class, 'account'],
+ 'callback' => [Email::class, 'account'],
],
'm.iscatchall' => [
'label' => $lng['emails']['catchall'],
'field' => 'iscatchall',
- 'format_callback' => [Text::class, 'boolean'],
+ 'callback' => [Text::class, 'boolean'],
'visible' => Settings::Get('catchall.catchall_enabled') == '1'
],
'm.quota' => [
diff --git a/lib/tablelisting/customer/tablelisting.ftps.php b/lib/tablelisting/customer/tablelisting.ftps.php
index 0555666b..305259a6 100644
--- a/lib/tablelisting/customer/tablelisting.ftps.php
+++ b/lib/tablelisting/customer/tablelisting.ftps.php
@@ -36,7 +36,7 @@ return [
'homedir' => [
'label' => $lng['panel']['path'],
'field' => 'homedir',
- 'format_callback' => [Ftp::class, 'pathRelative']
+ 'callback' => [Ftp::class, 'pathRelative']
],
'shell' => [
'label' => $lng['panel']['shell'],
diff --git a/lib/tablelisting/customer/tablelisting.htaccess.php b/lib/tablelisting/customer/tablelisting.htaccess.php
index 605ca0a4..d2e6ea1d 100644
--- a/lib/tablelisting/customer/tablelisting.htaccess.php
+++ b/lib/tablelisting/customer/tablelisting.htaccess.php
@@ -28,12 +28,12 @@ return [
'path' => [
'label' => $lng['panel']['path'],
'field' => 'path',
- 'format_callback' => [Ftp::class, 'pathRelative']
+ 'callback' => [Ftp::class, 'pathRelative']
],
'option_indexes' => [
'label' => $lng['extras']['view_directory'],
'field' => 'option_indexes',
- 'format_callback' => [Text::class, 'boolean']
+ 'callback' => [Text::class, 'boolean']
],
'error404path' => [
'label' => $lng['extras']['error404path'],
@@ -50,7 +50,7 @@ return [
'options_cgi' => [
'label' => $lng['extras']['execute_perl'],
'field' => 'options_cgi',
- 'format_callback' => [Text::class, 'boolean'],
+ 'callback' => [Text::class, 'boolean'],
'visible' => $cperlenabled
]
],
diff --git a/lib/tablelisting/customer/tablelisting.htpasswd.php b/lib/tablelisting/customer/tablelisting.htpasswd.php
index c4248a7c..3d2f3c3c 100644
--- a/lib/tablelisting/customer/tablelisting.htpasswd.php
+++ b/lib/tablelisting/customer/tablelisting.htpasswd.php
@@ -31,7 +31,7 @@ return [
'path' => [
'label' => $lng['panel']['path'],
'field' => 'path',
- 'format_callback' => [Ftp::class, 'pathRelative']
+ 'callback' => [Ftp::class, 'pathRelative']
]
],
'visible_columns' => Listing::getVisibleColumnsForListing('htpasswd_list', [
diff --git a/lib/tablelisting/customer/tablelisting.mysqls.php b/lib/tablelisting/customer/tablelisting.mysqls.php
index f2178a8b..bdf3f94c 100644
--- a/lib/tablelisting/customer/tablelisting.mysqls.php
+++ b/lib/tablelisting/customer/tablelisting.mysqls.php
@@ -36,12 +36,12 @@ return [
'size' => [
'label' => $lng['mysql']['size'],
'field' => 'size',
- 'format_callback' => [Text::class, 'size']
+ 'callback' => [Text::class, 'size']
],
'dbserver' => [
'label' => $lng['mysql']['mysql_server'],
'field' => 'dbserver',
- 'format_callback' => [Mysql::class, 'dbserver'],
+ 'callback' => [Mysql::class, 'dbserver'],
'visible' => $count_mysqlservers > 1
]
],
diff --git a/templates/Froxlor/table/callbacks.html.twig b/templates/Froxlor/table/macros.html.twig
similarity index 96%
rename from templates/Froxlor/table/callbacks.html.twig
rename to templates/Froxlor/table/macros.html.twig
index a36a1662..56d2984b 100644
--- a/templates/Froxlor/table/callbacks.html.twig
+++ b/templates/Froxlor/table/macros.html.twig
@@ -45,8 +45,10 @@
{% macro domainWithSan(data) %}
{{ data.domain }}
{% if data.san is not empty %}
-
SAN:
- {{ data.san }}
+
+
+ SAN: {{ data.san }}
+
{% endif %}
{% endmacro %}
diff --git a/templates/Froxlor/table/table.html.twig b/templates/Froxlor/table/table.html.twig
index 2383a4f1..fc83c5dc 100644
--- a/templates/Froxlor/table/table.html.twig
+++ b/templates/Froxlor/table/table.html.twig
@@ -1,6 +1,6 @@
{% macro table(listing) %}
- {% import "Froxlor/table/callbacks.html.twig" as callbacks %}
+ {% import "Froxlor/table/macros.html.twig" as macros %}
{% import "Froxlor/table/pagination.html.twig" as pagination %}