diff --git a/customer_email.php b/customer_email.php index 93f9da5c..9cd97b8c 100644 --- a/customer_email.php +++ b/customer_email.php @@ -40,91 +40,15 @@ if ($page == 'overview') { } elseif ($page == 'emails') { if ($action == '') { $log->logAction(\Froxlor\FroxlorLogger::USR_ACTION, LOG_NOTICE, "viewed customer_email::emails"); - $fields = array( - 'd.domain_ace' => $lng['domains']['domainname'], - 'm.email_full' => $lng['emails']['emailaddress'], - 'm.destination' => $lng['emails']['forwarders'] - ); + try { - // get total count - $json_result = Emails::getLocal($userinfo)->listingCount(); - $result = json_decode($json_result, true)['data']; - // initialize pagination and filtering - $paging = new \Froxlor\UI\Pagination($userinfo, $fields, $result); - // get list - $json_result = Emails::getLocal($userinfo, $paging->getApiCommandParams())->listing(); + $email_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/customer/tablelisting.emails.php'; + $list = (new \Froxlor\UI\Collection(\Froxlor\Api\Commands\Emails::class, $userinfo)) + ->withPagination($email_list_data['email_list']['columns']) + ->getList(); } catch (Exception $e) { \Froxlor\UI\Response::dynamic_error($e->getMessage()); } - $result = json_decode($json_result, true)['data']; - - $sortcode = $paging->getHtmlSortCode($lng); - $arrowcode = $paging->getHtmlArrowCode($filename . '?page=' . $page . '&s=' . $s); - $searchcode = $paging->getHtmlSearchCode($lng); - $pagingcode = $paging->getHtmlPagingCode($filename . '?page=' . $page . '&s=' . $s); - $emails = array(); - $emailscount = $paging->getEntries(); - - foreach ($result['list'] as $row) { - if (! isset($emails[$row['domain']]) || ! is_array($emails[$row['domain']])) { - $emails[$row['domain']] = array(); - } - - $emails[$row['domain']][$row['email_full']] = $row; - } - - if ($paging->sortfield == 'd.domain_ace' && $paging->sortorder == 'desc') { - krsort($emails); - } else { - ksort($emails); - } - - $count = 0; - $accounts = ''; - $emails_count = 0; - $domainname = ''; - foreach ($emails as $domainid => $emailaddresses) { - if ($paging->sortfield == 'm.email_full' && $paging->sortorder == 'desc') { - krsort($emailaddresses); - } else { - ksort($emailaddresses); - } - - foreach ($emailaddresses as $row) { - if ($domainname != $idna_convert->decode($row['domain'])) { - $domainname = $idna_convert->decode($row['domain']); - eval("\$accounts.=\"" . \Froxlor\UI\Template::getTemplate("email/emails_domain") . "\";"); - } - - $emails_count ++; - $row['email'] = $idna_convert->decode($row['email']); - $row['email_full'] = $idna_convert->decode($row['email_full']); - $row['destination'] = explode(' ', $row['destination']); - uasort($row['destination'], 'strcasecmp'); - - $dest_list = $row['destination']; - foreach ($dest_list as $dest_id => $destination) { - $row['destination'][$dest_id] = $idna_convert->decode($row['destination'][$dest_id]); - - if ($row['destination'][$dest_id] == $row['email_full']) { - unset($row['destination'][$dest_id]); - } - } - - $destinations_count = count($row['destination']); - $row['destination'] = implode(', ', $row['destination']); - - if (strlen($row['destination']) > 35) { - $row['destination'] = substr($row['destination'], 0, 32) . '... (' . $destinations_count . ')'; - } - - $row['mboxsize'] = \Froxlor\PhpHelper::sizeReadable($row['mboxsize'], 'GiB', 'bi', '%01.' . (int) Settings::Get('panel.decimal_places') . 'f %s'); - - $row = \Froxlor\PhpHelper::htmlentitiesArray($row); - eval("\$accounts.=\"" . \Froxlor\UI\Template::getTemplate("email/emails_email") . "\";"); - $count ++; - } - } $result_stmt = Database::prepare(" SELECT COUNT(`id`) as emaildomains @@ -136,7 +60,10 @@ if ($page == 'overview') { )); $emaildomains_count = $result2['emaildomains']; - eval("echo \"" . \Froxlor\UI\Template::getTemplate("email/emails") . "\";"); + UI::twigBuffer('user/table.html.twig', [ + 'listing' => \Froxlor\UI\Listing::format($list, $email_list_data['email_list']), + ]); + UI::twigOutputBuffer(); } elseif ($action == 'delete' && $id != 0) { try { $json_result = Emails::getLocal($userinfo, array( diff --git a/lib/Froxlor/UI/Callbacks/Email.php b/lib/Froxlor/UI/Callbacks/Email.php new file mode 100644 index 00000000..03e1a164 --- /dev/null +++ b/lib/Froxlor/UI/Callbacks/Email.php @@ -0,0 +1,35 @@ + (2010-) + * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt + * @package Listing + * + */ + +class Email +{ + public static function account(string $data, array $attributes): mixed + { + return [ + 'type' => 'booleanWithInfo', + 'data' => [ + 'checked' => $data != 0, + 'info' => $data != 0 ? PhpHelper::sizeReadable($attributes['mboxsize'], 'GiB', 'bi', '%01.' . (int) Settings::Get('panel.decimal_places') . 'f %s') : '' + ] + ]; + } +} diff --git a/lib/formfields/customer/email/formfield.emails_addaccount.php b/lib/formfields/customer/email/formfield.emails_addaccount.php index e57db43d..08e3827c 100644 --- a/lib/formfields/customer/email/formfield.emails_addaccount.php +++ b/lib/formfields/customer/email/formfield.emails_addaccount.php @@ -23,7 +23,7 @@ return array( 'title' => $lng['emails']['account_add'], 'image' => 'icons/email_add.png', 'fields' => array( - 'email_full' => array( + 'emailaddr' => array( 'label' => $lng['emails']['emailaddress'], 'type' => 'label', 'value' => $result['email_full'] diff --git a/lib/formfields/customer/email/formfield.emails_addforwarder.php b/lib/formfields/customer/email/formfield.emails_addforwarder.php index 2b3fee44..5900f55f 100644 --- a/lib/formfields/customer/email/formfield.emails_addforwarder.php +++ b/lib/formfields/customer/email/formfield.emails_addforwarder.php @@ -23,7 +23,7 @@ return array( 'title' => $lng['emails']['forwarder_add'], 'image' => 'icons/autoresponder_add.png', 'fields' => array( - 'email_full' => array( + 'emailaddr' => array( 'label' => $lng['emails']['from'], 'type' => 'label', 'value' => $result['email_full'] diff --git a/lib/tablelisting/customer/tablelisting.emails.php b/lib/tablelisting/customer/tablelisting.emails.php new file mode 100644 index 00000000..b4f79cae --- /dev/null +++ b/lib/tablelisting/customer/tablelisting.emails.php @@ -0,0 +1,83 @@ + (2010-) + * @author Maurice Preuß + * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt + * @package Tabellisting + * + */ + +use Froxlor\UI\Callbacks\Email; +use Froxlor\UI\Callbacks\Text; +use Froxlor\UI\Listing; + +return [ + 'email_list' => [ + 'title' => $lng['menue']['email']['emails'], + 'icon' => 'fa-solid fa-envelope', + 'columns' => [ + 'm.email_full' => [ + 'label' => $lng['emails']['emailaddress'], + 'column' => 'email_full', + ], + 'm.destination' => [ + 'label' => $lng['emails']['forwarders'], + 'column' => 'destination', + // @todo formatting + ], + 'm.popaccountid' => [ + 'label' => $lng['emails']['account'], + 'column' => 'popaccountid', + 'format_callback' => [Email::class, 'account'], + ], + 'm.iscatchall' => [ + 'label' => $lng['emails']['catchall'], + 'column' => 'iscatchall', + 'format_callback' => [Text::class, 'boolean'], + 'visible' => \Froxlor\Settings::Get('catchall.catchall_enabled') == '1' + ], + 'm.quota' => [ + 'label' => $lng['emails']['quota'], + 'column' => 'quota', + 'visible' => \Froxlor\Settings::Get('system.mail_quota_enabled') == '1' + ] + ], + 'visible_columns' => Listing::getVisibleColumnsForListing('email_list', [ + 'm.email_full', + 'm.destination', + 'm.popaccountid', + 'm.iscatchall', + 'm.quota' + ]), + 'actions' => [ + 'edit' => [ + 'icon' => 'fa fa-edit', + 'href' => [ + 'section' => 'email', + 'page' => 'emails', + 'action' => 'edit', + 'id' => ':id' + ], + ], + 'delete' => [ + 'icon' => 'fa fa-trash', + 'class' => 'text-danger', + 'href' => [ + 'section' => 'email', + 'page' => 'emails', + 'action' => 'delete', + 'id' => ':id' + ], + ] + ] + ] +]; diff --git a/templates/Froxlor/form/formfields.html.twig b/templates/Froxlor/form/formfields.html.twig index 1304ef99..08920022 100644 --- a/templates/Froxlor/form/formfields.html.twig +++ b/templates/Froxlor/form/formfields.html.twig @@ -53,7 +53,7 @@ {% if field.next_to is defined %}
{% endif %} - + {% if field.next_to is defined %} {% for nid, nfield in field.next_to %} {% if nfield.next_to_prefix is defined %} diff --git a/templates/Froxlor/table/callbacks.html.twig b/templates/Froxlor/table/callbacks.html.twig index 0258ad1d..421bba1e 100644 --- a/templates/Froxlor/table/callbacks.html.twig +++ b/templates/Froxlor/table/callbacks.html.twig @@ -18,6 +18,17 @@ {% endif %} {% endmacro %} +{% macro booleanWithInfo(data) %} + {% if (data.checked) %} + + {% else %} + + {% endif %} + {% if data.info is not empty %} + {{ data.info }} + {% endif %} +{% endmacro %} + {% macro link(data) %} {% apply spaceless %} diff --git a/templates/Froxlor/table/table.html.twig b/templates/Froxlor/table/table.html.twig index 157ee887..cbd7ab65 100644 --- a/templates/Froxlor/table/table.html.twig +++ b/templates/Froxlor/table/table.html.twig @@ -31,6 +31,8 @@ {{ callbacks.progressbar(td.data.data) }} {% elseif td.data.type == 'boolean' %} {{ callbacks.boolean(td.data.data) }} + {% elseif td.data.type == 'booleanWithInfo' %} + {{ callbacks.booleanWithInfo(td.data.data) }} {% elseif td.data.type == 'link' %} {{ callbacks.link(td.data.data) }} {% elseif td.data.type == 'domainWithSan' %}