git subrepo commit (merge) mailcow/src/mailcow-dockerized
subrepo: subdir: "mailcow/src/mailcow-dockerized"
merged: "c7b1dc37"
upstream: origin: "https://github.com/mailcow/mailcow-dockerized.git"
branch: "master"
commit: "a366494c"
git-subrepo: version: "0.4.6"
origin: "???"
commit: "???"
Change-Id: Id574ecd4e02e3c4fbf8a1efd49be11c0b6d19a3f
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/admin.twig b/mailcow/src/mailcow-dockerized/data/web/templates/admin.twig
index 863f87e..33f2422 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/admin.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/admin.twig
@@ -57,7 +57,7 @@
</div>
</div> <!-- /col-md-12 -->
</div> <!-- /row -->
-</div>
+</div>
{% include 'modals/admin.twig' %}
@@ -66,7 +66,7 @@
var lang_datatables = {{ lang_datatables|raw }};
var admin_username = '{{ mailcow_cc_username }}';
var csrf_token = '{{ csrf_token }}';
-var pagination_size = '{{ pagination_size }}';
-var log_pagination_size = '{{ log_pagination_size }}';
+var pagination_size = Math.trunc('{{ pagination_size }}');
+var log_pagination_size = Math.trunc('{{ log_pagination_size }}');
</script>
{% endblock %}
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/admin/customize/logo.twig b/mailcow/src/mailcow-dockerized/data/web/templates/admin/customize/logo.twig
new file mode 100644
index 0000000..45f6c91
--- /dev/null
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/admin/customize/logo.twig
@@ -0,0 +1,9 @@
+<div class="thumbnail mb-4">
+ <img class="img-thumbnail mb-4{% if dark %} bg-black{% endif %}" src="{{ logo }}" alt="mailcow logo">
+ <div class="caption">
+ <span class="badge fs-5 bg-info">{{ logo_specs.geometry.width }}x{{ logo_specs.geometry.height }} px</span>
+ <span class="badge fs-5 bg-info">{{ logo_specs.mimetype }}</span>
+ <span class="badge fs-5 bg-info">{{ logo_specs.fileSize }}</span>
+ </div>
+</div>
+
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-admins.twig b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-admins.twig
index 0221a8e..44342af 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-admins.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-admins.twig
@@ -1,4 +1,4 @@
-<div role="tabpanel" class="tab-pane fade show active" id="tab-config-admins" role="tabpanel" aria-labelledby="tab-config-admins">
+<div class="tab-pane fade show active" id="tab-config-admins" role="tabpanel" aria-labelledby="tab-config-admins">
<div class="card mb-4">
<div class="card-header bg-danger text-white d-flex fs-5">
<button class="btn d-md-none text-white flex-grow-1 text-start" data-bs-target="#collapse-tab-config-admins" data-bs-toggle="collapse" aria-controls="collapse-tab-config-admins">
@@ -97,6 +97,39 @@
<div class="col-lg-12">
<p class="text-muted">{{ lang.admin.api_info|raw }}</p>
</div>
+ <div class="col-lg-12">
+ <div class="card mb-3">
+ <div class="card-header">
+ <h4 class="card-title"><i class="bi bi-file-earmark-arrow-down"></i> {{ lang.admin.cors_settings }}</h4>
+ </div>
+ <div class="card-body">
+ <form class="form-horizontal" autocapitalize="none" autocorrect="off" role="form" data-id="editcors" method="post">
+ <div class="row mb-4">
+ <label class="control-label col-sm-2 mb-4" for="allowed_origins">{{ lang.admin.allowed_origins }}</label>
+ <div class="col-sm-9 mb-4">
+ <textarea class="form-control textarea-code" rows="7" name="allowed_origins" id="allowed_origins">{{ cors_settings.allowed_origins }}</textarea>
+ </div>
+ </div>
+ <div class="row mb-4">
+ <label class="control-label col-sm-2" for="allowed_methods">{{ lang.admin.allowed_methods }}</label>
+ <div class="col-sm-9">
+ <select name="allowed_methods" id="allowed_methods" multiple class="form-control">
+ <option value="POST"{% if "POST" in cors_settings.allowed_methods %} selected{% endif %}>POST</option>
+ <option value="GET"{% if "GET" in cors_settings.allowed_methods %} selected{% endif %}>GET</option>
+ <option value="DELETE"{% if "DELETE" in cors_settings.allowed_methods %} selected{% endif %}>DELETE</option>
+ <option value="PUT"{% if "PUT" in cors_settings.allowed_methods %} selected{% endif %}>PUT</option>
+ </select>
+ </div>
+ </div>
+ <div class="row mb-4">
+ <div class="offset-sm-2 col-sm-9 d-grid d-sm-block">
+ <button class="btn btn-sm btn-xs-lg btn-success" data-item="cors" data-api-url="edit/cors" data-id="editcors" data-action="edit_selected" href="#"><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
+ </div>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
<div class="col-lg-6">
<div class="card mb-3">
<div class="card-header">
@@ -113,7 +146,7 @@
<div class="row mb-2">
<div class="offset-sm-3 col-sm-9">
<label>
- <input type="checkbox" name="skip_ip_check" id="skip_ip_check_ro" {% if api.ro.skip_ip_check %}checked{% endif %}> {{ lang.admin.api_skip_ip_check }}
+ <input type="checkbox" class="form-check-input" name="skip_ip_check" id="skip_ip_check_ro" {% if api.ro.skip_ip_check %}checked{% endif %}> {{ lang.admin.api_skip_ip_check }}
</label>
</div>
</div>
@@ -126,15 +159,15 @@
<div class="row mb-2">
<div class="offset-sm-3 col-sm-9">
<label>
- <input type="checkbox" name="active" {% if api.ro.active %}checked{% endif %}> {{ lang.admin.activate_api }}
+ <input type="checkbox" class="form-check-input" name="active" {% if api.ro.active %}checked{% endif %}> {{ lang.admin.activate_api }}
</label>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-3 col-sm-9">
<div class="btn-group">
- <button class="btn btn-sm btn-xs-half d-block d-sm-inline btn-success" name="admin_api[ro]" type="submit" href="#"><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
- <button class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary admin-ays-dialog" name="admin_api_regen_key[ro]" type="submit" href="#" {% if not api.ro.api_key %}disabled{% endif %}>{{ lang.admin.regen_api_key }}</button>
+ <button class="btn btn-sm btn-xs-lg btn-xs-half d-block d-sm-inline btn-success" name="admin_api[ro]" type="submit" href="#"><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
+ <button class="btn btn-sm btn-xs-lg btn-xs-half d-block d-sm-inline btn-secondary admin-ays-dialog" name="admin_api_regen_key[ro]" type="submit" href="#" {% if not api.ro.api_key %}disabled{% endif %}>{{ lang.admin.regen_api_key }}</button>
</div>
</div>
</div>
@@ -158,7 +191,7 @@
<div class="row mb-2">
<div class="offset-sm-3 col-sm-9">
<label>
- <input type="checkbox" name="skip_ip_check" id="skip_ip_check_rw" {% if api.rw.skip_ip_check %}checked{% endif %}> {{ lang.admin.api_skip_ip_check }}
+ <input type="checkbox" class="form-check-input" name="skip_ip_check" id="skip_ip_check_rw" {% if api.rw.skip_ip_check %}checked{% endif %}> {{ lang.admin.api_skip_ip_check }}
</label>
</div>
</div>
@@ -171,7 +204,7 @@
<div class="row mb-2">
<div class="offset-sm-3 col-sm-9">
<label>
- <input type="checkbox" name="active" {% if api.rw.active %}checked{% endif %}> {{ lang.admin.activate_api }}
+ <input type="checkbox" class="form-check-input" name="active" {% if api.rw.active %}checked{% endif %}> {{ lang.admin.activate_api }}
</label>
</div>
</div>
@@ -194,7 +227,7 @@
<div class="card mb-4">
<div class="card-header d-flex fs-5">
- <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-dadmins" data-bs-toggle="collapse" aria-controls="ollapse-tab-config-dadmins">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-dadmins" data-bs-toggle="collapse" aria-controls="collapse-tab-config-dadmins">
{{ lang.admin.domain_admins }}
</button>
<span class="d-none d-md-block">{{ lang.admin.domain_admins }}</span>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-customize.twig b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-customize.twig
index 4ec6aec..7fc990a 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-customize.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-customize.twig
@@ -1,7 +1,7 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-config-customize" role="tabpanel" aria-labelledby="tab-config-customize">
+<div class="tab-pane fade" id="tab-config-customize" role="tabpanel" aria-labelledby="tab-config-customize">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
- <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-customize" data-bs-toggle="collapse" aria-controls="ollapse-tab-config-customize">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-customize" data-bs-toggle="collapse" aria-controls="collapse-tab-config-customize">
{{ lang.admin.customize }}
</button>
<span class="d-none d-md-block">{{ lang.admin.customize }}</span>
@@ -10,22 +10,26 @@
<legend><i class="bi bi-file-image"></i> {{ lang.admin.change_logo }}</legend><hr />
<p class="text-muted">{{ lang.admin.logo_info }}</p>
<form class="form-inline" role="form" method="post" enctype="multipart/form-data">
- <p>
- <input class="mb-4" type="file" name="main_logo" accept="image/gif, image/jpeg, image/pjpeg, image/x-png, image/png, image/svg+xml"><br>
- <button name="submit_main_logo" type="submit" class="btn btn-sm d-block d-sm-inline btn-secondary"><i class="bi bi-upload"></i> {{ lang.admin.upload }}</button>
- </p>
+ <div class="mb-4">
+ <label for="main_logo_input" class="form-label">{{ lang.admin.logo_normal_label }}</label>
+ <input class="form-control" id="main_logo_input" type="file" name="main_logo" accept="image/gif, image/jpeg, image/pjpeg, image/x-png, image/png, image/svg+xml">
+ </div>
+ <div class="mb-4">
+ <label for="main_logo_dark_input" class="form-label">{{ lang.admin.logo_dark_label }}</label>
+ <input class="form-control" id="main_logo_dark_input" type="file" name="main_logo_dark" accept="image/gif, image/jpeg, image/pjpeg, image/x-png, image/png, image/svg+xml">
+ </div>
+
+ <button name="submit_main_logo" type="submit" class="btn btn-sm d-block d-sm-inline btn-secondary"><i class="bi bi-upload"></i> {{ lang.admin.upload }}</button>
</form>
- {% if logo %}
- <div class="row">
+ {% if logo or logo_dark %}
+ <div class="row mt-4">
<div class="col-sm-4">
- <div class="thumbnail">
- <img class="img-thumbnail" src="{{ logo }}" alt="mailcow logo">
- <div class="caption">
- <span class="badge fs-5 bg-info">{{ logo_specs.geometry.width }}x{{ logo_specs.geometry.height }} px</span>
- <span class="badge fs-5 bg-info">{{ logo_specs.mimetype }}</span>
- <span class="badge fs-5 bg-info">{{ logo_specs.fileSize }}</span>
- </div>
- </div>
+ {% if logo %}
+ {% include 'admin/customize/logo.twig' %}
+ {% endif %}
+ {% if logo_dark %}
+ {% include 'admin/customize/logo.twig' with {'logo': logo_dark, 'logo_specs': logo_dark_specs, 'dark': 1} %}
+ {% endif %}
<hr>
<form class="form-inline" role="form" method="post">
<p><button name="reset_main_logo" type="submit" class="btn btn-sm d-block d-sm-inline btn-secondary">{{ lang.admin.reset_default }}</button></p>
@@ -33,6 +37,20 @@
</div>
</div>
{% endif %}
+ <legend style="padding-top:20px" unselectable="on">{{ lang.admin.ip_check }}</legend><hr />
+ <div id="ip_check">
+ <form class="form" data-id="ip_check" role="form" method="post">
+ <div class="mb-4">
+ <input class="form-check-input" type="checkbox" value="1" name="ip_check_opt_in" id="ip_check_opt_in" {% if ip_check == 1 %}checked{% endif %}>
+ <label class="form-check-label" for="ip_check_opt_in">
+ {{ lang.admin.ip_check_opt_in|raw }}
+ </label>
+ </div>
+ <p><div class="btn-group">
+ <button class="btn btn-sm btn-xs-half d-block d-sm-inline btn-success" data-action="edit_selected" data-item="admin" data-id="ip_check" data-reload="no" data-api-url='edit/ip_check' data-api-attr='{}' href="#"><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
+ </div></p>
+ </form>
+ </div>
<legend>{{ lang.admin.app_links }}</legend><hr />
<p class="text-muted">{{ lang.admin.merged_vars_hint|raw }}</p>
<form class="form-inline" data-id="app_links" role="form" method="post">
@@ -97,7 +115,7 @@
</div>
</div>
<p><textarea class="form-control" id="ui_announcement_text" name="ui_announcement_text" rows="7">{{ ui_texts.ui_announcement_text }}</textarea></p>
- <div class="checkbox">
+ <div class="form-check">
<label>
<input type="checkbox" name="ui_announcement_active" class="form-check-input" {% if ui_texts.ui_announcement_active == 1 %}checked{% endif %}> {{ lang.admin.ui_header_announcement_active }}
</label>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-dkim.twig b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-dkim.twig
index 8dbccf7..85c6dc6 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-dkim.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-dkim.twig
@@ -1,7 +1,7 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-config-dkim" role="tabpanel" aria-labelledby="tab-config-dkim">
+<div class="tab-pane fade" id="tab-config-dkim" role="tabpanel" aria-labelledby="tab-config-dkim">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
- <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-dkim" data-bs-toggle="collapse" aria-controls="ollapse-tab-config-dkim">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-dkim" data-bs-toggle="collapse" aria-controls="collapse-tab-config-dkim">
{{ lang.admin.dkim_keys }}
</button>
<span class="d-none d-md-block">{{ lang.admin.dkim_keys }}</span>
@@ -20,7 +20,7 @@
{% for domain, domain_data in dkim_domains %}
{% if domain_data.dkim %}
<div class="row collapse show dkim_key_valid">
- <div class="col-md-1"><input type="checkbox" data-id="dkim" name="multi_select" value="{{ domain }}"></div>
+ <div class="col-md-1"><input type="checkbox" class="form-check-input" data-id="dkim" name="multi_select" value="{{ domain }}"></div>
<div class="col-md-3">
<p>{{ lang.admin.domain }}: <strong>{{ domain }}</strong>
<p class="dkim-label"><span class="badge fs-6 bg-success">{{ lang.admin.dkim_key_valid }}</span></p>
@@ -31,7 +31,7 @@
<div class="col-md-8">
<textarea class="form-control" rows="6" readonly>{{ domain_data.dkim.dkim_txt }}</textarea>
<small>
- <i class="bi bi-arrow-return-right"></i>
+ <i class="bi bi-arrow-return-right"></i>
<a href="#" data-bs-toggle="modal" data-bs-target="#showDKIMprivKey" id="dkim_priv" data-priv-key="{{ domain_data.dkim.privkey }}"> {{ lang.admin.dkim_private_key }}</a>
</small>
</div>
@@ -50,7 +50,7 @@
{% for alias_domain, alias_domain_data in domain_data.alias_domains %}
{% if alias_domain_data.dkim %}
<div class="row collapse in dkim_key_valid">
- <div class="col-md-1"><input type="checkbox" data-id="dkim" name="multi_select" value="{{ alias_domain }}"></div>
+ <div class="col-md-1"><input type="checkbox" class="form-check-input" data-id="dkim" name="multi_select" value="{{ alias_domain }}"></div>
<div class="col-md-2 offset-md-1">
<p><small>↳ Alias-Domain: <strong>{{ alias_domain }}</strong></small>
<p class="dkim-label"><span class="badge fs-6 bg-success">{{ lang.admin.dkim_key_valid }}</span></p>
@@ -78,7 +78,7 @@
{% endfor %}
{% for blind, data in dkim_blind_domains|filter(data => data.dkim is not null) %}
<div class="row collapse in dkim_key_unused">
- <div class="col-md-1"><input type="checkbox" data-id="dkim" name="multi_select" value="{{ blind }}"></div>
+ <div class="col-md-1"><input type="checkbox" class="form-check-input" data-id="dkim" name="multi_select" value="{{ blind }}"></div>
<div class="col-md-3">
<p>{{ lang.admin.domain }}: <strong>{{ blind }}</strong>
<p class="dkim-label"><span class="badge fs-6 bg-warning">{{ lang.admin.dkim_key_unused }}</span></p>
@@ -114,7 +114,7 @@
</div>
<div class="row mb-4">
<div class="col-12 col-md-6 col-lg-4 col-xl-3">
- <select data-style="btn btn-secondary btn-sm" class="form-control" id="key_size" name="key_size" title="{{ lang.admin.dkim_key_length }}" required>
+ <select data-style="btn btn-light btn-sm" class="form-control" id="key_size" name="key_size" title="{{ lang.admin.dkim_key_length }}" required>
<option data-subtext="bits">1024</option>
<option data-subtext="bits">2048</option>
</select>
@@ -143,7 +143,7 @@
</div>
<div class="mb-2">
<label>
- <input type="checkbox" name="overwrite_existing" value="1"> {{ lang.admin.dkim_overwrite_key }}
+ <input type="checkbox" class="form-check-input" name="overwrite_existing" value="1"> {{ lang.admin.dkim_overwrite_key }}
</label>
</div>
<button class="btn btn-sm d-block d-sm-inline btn-secondary" data-action="add_item" data-id="dkim_import" data-api-url='add/dkim_import' data-api-attr='{}' href="#"><i class="bi bi-plus-lg"></i> {{ lang.admin.import }}</button>
@@ -159,7 +159,7 @@
<div class="row mb-2">
<label class="control-label col-sm-2 text-sm-end" for="from_domain">{{ lang.admin.dkim_from }}:</label>
<div class="col-sm-10 col-md-6 col-lg-4 col-xl-3">
- <select data-style="btn btn-secondary btn-sm"
+ <select data-style="btn btn-light btn-sm"
data-live-search="true"
data-id="dkim_duplicate"
title="{{ lang.admin.dkim_from_title }}"
@@ -175,7 +175,7 @@
<div class="col-sm-10 col-md-6 col-lg-4 col-xl-3">
<select
data-live-search="true"
- data-style="btn btn-secondary btn-sm"
+ data-style="btn btn-light btn-sm"
data-id="dkim_duplicate"
title="{{ lang.admin.dkim_to_title }}"
name="to_domain" id="to_domain" class="full-width-select form-control" multiple required>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-f2b.twig b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-f2b.twig
index bbd3e36..a353f7f 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-f2b.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-f2b.twig
@@ -1,7 +1,7 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-config-f2b" role="tabpanel" aria-labelledby="tab-config-f2b">
+<div class="tab-pane fade" id="tab-config-f2b" role="tabpanel" aria-labelledby="tab-config-f2b">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
- <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-f2b" data-bs-toggle="collapse" aria-controls="ollapse-tab-config-f2b">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-f2b" data-bs-toggle="collapse" aria-controls="collapse-tab-config-f2b">
{{ lang.admin.f2b_parameters }}
</button>
<span class="d-none d-md-block">{{ lang.admin.f2b_parameters }}</span>
@@ -13,6 +13,14 @@
<input type="number" class="form-control" id="f2b_ban_time" name="ban_time" value="{{ f2b_data.ban_time }}" required>
</div>
<div class="mb-4">
+ <label for="f2b_max_ban_time">{{ lang.admin.f2b_max_ban_time }}:</label>
+ <input type="number" class="form-control" id="f2b_max_ban_time" name="max_ban_time" value="{{ f2b_data.max_ban_time }}" required>
+ </div>
+ <div class="mb-4">
+ <input class="form-check-input" type="checkbox" value="1" name="ban_time_increment" id="f2b_ban_time_increment" {% if f2b_data.ban_time_increment == 1 %}checked{% endif %}>
+ <label class="form-check-label" for="f2b_ban_time_increment">{{ lang.admin.f2b_ban_time_increment }}</label>
+ </div>
+ <div class="mb-4">
<label for="f2b_max_attempts">{{ lang.admin.f2b_max_attempts }}:</label>
<input type="number" class="form-control" id="f2b_max_attempts" name="max_attempts" value="{{ f2b_data.max_attempts }}" required>
</div>
@@ -84,12 +92,14 @@
{% endif %}
{% for active_ban in f2b_data.active_bans %}
<p>
- <span class="badge fs-5 bg-info" style="padding:4px;font-size:85%;">
+ <span class="badge fs-7 bg-info d-block d-sm-inline-block">
<i class="bi bi-funnel-fill"></i>
- <a href="https://bgp.he.net/ip/{{ active_ban.ip }}" target="_blank" style="color:white">
+ <a href="https://bgp.he.net/ip/{{ active_ban.ip }}" target="_blank">
{{ active_ban.network }}
</a>
- ({{ active_ban.banned_until }}) -
+ ({{ active_ban.banned_until }})
+ </span>
+ <span class="d-none d-sm-inline"> - </span>
{% if active_ban.queued_for_unban == 0 %}
<a data-action="edit_selected" data-item="{{ active_ban.network }}" data-id="f2b-quick" data-api-url='edit/fail2ban' data-api-attr='{"action":"unban"}' href="#">[{{ lang.admin.queue_unban }}]</a>
<a data-action="edit_selected" data-item="{{ active_ban.network }}" data-id="f2b-quick" data-api-url='edit/fail2ban' data-api-attr='{"action":"whitelist"}' href="#">[whitelist]</a>
@@ -97,15 +107,14 @@
{% else %}
<i>{{ lang.admin.unban_pending }}</i>
{% endif %}
- </span>
</p>
{% endfor %}
<hr>
{% for perm_ban in f2b_data.perm_bans %}
<p>
- <span class="badge fs-5 bg-danger" style="padding: 0.1em 0.4em 0.1em;">
+ <span class="badge fs-7 bg-danger d-block d-sm-inline-block">
<i class="bi bi-funnel-fill"></i>
- <a href="https://bgp.he.net/ip/{{ perm_ban.ip }}" target="_blank" style="color:white">
+ <a href="https://bgp.he.net/ip/{{ perm_ban.ip }}" target="_blank">
{{ perm_ban.network }}
</a>
</span>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-fwdhosts.twig b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-fwdhosts.twig
index 0f77048..d3efddd 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-fwdhosts.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-fwdhosts.twig
@@ -1,7 +1,7 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-config-fwdhosts" role="tabpanel" aria-labelledby="tab-config-fwdhosts">
+<div class="tab-pane fade" id="tab-config-fwdhosts" role="tabpanel" aria-labelledby="tab-config-fwdhosts">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
- <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-fwdhosts" data-bs-toggle="collapse" aria-controls="ollapse-tab-config-fwdhosts">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-fwdhosts" data-bs-toggle="collapse" aria-controls="collapse-tab-config-fwdhosts">
{{ lang.admin.forwarding_hosts }}
</button>
<span class="d-none d-md-block">{{ lang.admin.forwarding_hosts }}</span>
@@ -9,7 +9,7 @@
<div id="collapse-tab-config-fwdhosts" class="card-body collapse" data-bs-parent="#admin-content">
<p style="margin-bottom:40px">{{ lang.admin.forwarding_hosts_hint }}</p>
<table id="forwardinghoststable" class="table table-striped dt-responsive w-100"></table>
- <div class="mass-actions-admin">
+ <div class="mass-actions-admin mb-4">
<div class="btn-group btn-group-sm">
<button type="button" id="toggle_multi_select_all" data-id="fwdhosts" class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary">{{ lang.mailbox.toggle_all }}</button>
<a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-oauth2.twig b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-oauth2.twig
index 07f9e77..4fa4cf5 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-oauth2.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-oauth2.twig
@@ -1,7 +1,7 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-config-oauth2" role="tabpanel" aria-labelledby="tab-config-oauth2">
+<div class="tab-pane fade" id="tab-config-oauth2" role="tabpanel" aria-labelledby="tab-config-oauth2">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
- <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-oauth2" data-bs-toggle="collapse" aria-controls="ollapse-tab-config-oauth2">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-oauth2" data-bs-toggle="collapse" aria-controls="collapse-tab-config-oauth2">
{{ lang.admin.oauth2_apps }}
</button>
<span class="d-none d-md-block">{{ lang.admin.oauth2_apps }}</span>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-password-policy.twig b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-password-policy.twig
index fb6ec7f..8209ba5 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-password-policy.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-password-policy.twig
@@ -1,7 +1,7 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-config-password-policy" role="tabpanel" aria-labelledby="tab-config-password-policy">
+<div class="tab-pane fade" id="tab-config-password-policy" role="tabpanel" aria-labelledby="tab-config-password-policy">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
- <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-password-policy" data-bs-toggle="collapse" aria-controls="ollapse-tab-config-password-policy">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-password-policy" data-bs-toggle="collapse" aria-controls="collapse-tab-config-password-policy">
{{ lang.admin.password_policy }}
</button>
<span class="d-none d-md-block">{{ lang.admin.password_policy }}</span>
@@ -21,7 +21,7 @@
<div class="row mb-2">
<div class="offset-sm-3 col-sm-9">
<label>
- <input type="checkbox" name="{{ name }}" id="{{ name }}" value="1" {% if value == 1 %}checked{% endif %}> {{ lang.admin['password_policy_'~name] }}
+ <input type="checkbox" class="form-check-input" name="{{ name }}" id="{{ name }}" value="1" {% if value == 1 %}checked{% endif %}> {{ lang.admin['password_policy_'~name] }}
</label>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-quarantine.twig b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-quarantine.twig
index 91d9d53..be2d59a 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-quarantine.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-quarantine.twig
@@ -1,7 +1,7 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-config-quarantine" role="tabpanel" aria-labelledby="tab-config-quarantine">
+<div class="tab-pane fade" id="tab-config-quarantine" role="tabpanel" aria-labelledby="tab-config-quarantine">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
- <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-quarantine" data-bs-toggle="collapse" aria-controls="ollapse-tab-config-quarantine">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-quarantine" data-bs-toggle="collapse" aria-controls="collapse-tab-config-quarantine">
{{ lang.admin.quarantine }}
</button>
<span class="d-none d-md-block">{{ lang.admin.quarantine }}</span>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-quota.twig b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-quota.twig
index c8f2e92..03f3f38 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-quota.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-quota.twig
@@ -1,7 +1,7 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-config-quota" role="tabpanel" aria-labelledby="tab-config-quota">
+<div class="tab-pane fade" id="tab-config-quota" role="tabpanel" aria-labelledby="tab-config-quota">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
- <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-quota" data-bs-toggle="collapse" aria-controls="ollapse-tab-config-quota">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-quota" data-bs-toggle="collapse" aria-controls="collapse-tab-config-quota">
{{ lang.admin.quota_notifications }}
</button>
<span class="d-none d-md-block">{{ lang.admin.quota_notifications }}</span>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-rsettings.twig b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-rsettings.twig
index 8cd690e..439e55a 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-rsettings.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-rsettings.twig
@@ -1,7 +1,7 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-config-rsettings" role="tabpanel" aria-labelledby="tab-config-rsettings">
+<div class="tab-pane fade" id="tab-config-rsettings" role="tabpanel" aria-labelledby="tab-config-rsettings">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
- <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-rsettings" data-bs-toggle="collapse" aria-controls="ollapse-tab-config-rsettings">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-rsettings" data-bs-toggle="collapse" aria-controls="collapse-tab-config-rsettings">
{{ lang.admin.rspamd_settings_map }}
</button>
<span class="d-none d-md-block">{{ lang.admin.rspamd_settings_map }}</span>
@@ -44,7 +44,7 @@
<p class="text-muted">{{ lang.admin.rsetting_no_selection }}</p>
</div>
{% for rsetting in rsettings %}
- <div id="settings_tab{{ rsetting.details.id }}" class="tab-pane">
+ <div id="settings_tab{{ rsetting.details.id }}" class="tab-pane rsettings">
<form class="form" data-id="rsettings" role="form" method="post">
<input type="hidden" name="active" value="0">
<div>
@@ -57,11 +57,13 @@
</div>
<div class="mt-4 mb-2">
<label>
- <input type="checkbox" name="active" value="1" {% if rsetting.details.active %}checked{% endif %}> {{ lang.admin.active }}
+ <input type="checkbox" class="form-check-input" name="active" value="1" {% if rsetting.details.active %}checked{% endif %}> {{ lang.admin.active }}
</label>
</div>
- <button class="btn btn-sm btn-success" data-action="edit_selected" data-item="{{ rsetting.details.id }}" data-id="rsettings" data-api-url='edit/rsetting' data-api-attr='{}' href="#"><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
- <button class="btn btn-sm btn-danger" data-action="delete_selected" data-item="{{ rsetting.details.id }}" data-id="rsettings" data-api-url="delete/rsetting" data-api-attr='{}' href="#">{{ lang.admin.remove }}</button>
+ <div class="btn-group">
+ <button class="btn btn-sm btn-xs-lg btn-success" data-action="edit_selected" data-item="{{ rsetting.details.id }}" data-id="rsettings" data-api-url='edit/rsetting' data-api-attr='{}' href="#"><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
+ <button class="btn btn-sm btn-xs-lg btn-danger" data-action="delete_selected" data-item="{{ rsetting.details.id }}" data-id="rsettings" data-api-url="delete/rsetting" data-api-attr='{}' href="#">{{ lang.admin.remove }}</button>
+ </div>
</form>
</div>
{% endfor %}
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-rspamd.twig b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-rspamd.twig
index 5cbdc59..928eb17 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-rspamd.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-config-rspamd.twig
@@ -1,7 +1,7 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-config-rspamd" role="tabpanel" aria-labelledby="tab-config-rspamd">
+<div class="tab-pane fade" id="tab-config-rspamd" role="tabpanel" aria-labelledby="tab-config-rspamd">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
- <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-rspamd" data-bs-toggle="collapse" aria-controls="ollapse-tab-config-rspamd">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-rspamd" data-bs-toggle="collapse" aria-controls="collapse-tab-config-rspamd">
Rspamd UI
</button>
<span class="d-none d-md-block">Rspamd UI</span>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-globalfilter-regex.twig b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-globalfilter-regex.twig
index e597057..386cffc 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-globalfilter-regex.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-globalfilter-regex.twig
@@ -1,7 +1,7 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-globalfilter-regex" role="tabpanel" aria-labelledby="tab-globalfilter-regex">
+<div class="tab-pane fade" id="tab-globalfilter-regex" role="tabpanel" aria-labelledby="tab-globalfilter-regex">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
- <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-regex" data-bs-toggle="collapse" aria-controls="ollapse-tab-config-regex">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-regex" data-bs-toggle="collapse" aria-controls="collapse-tab-config-regex">
{{ lang.admin.rspamd_global_filters }}
</button>
<span class="d-none d-md-block">{{ lang.admin.rspamd_global_filters }}</span>
@@ -12,7 +12,7 @@
<div class="row">
<div class="offset-sm-2 col-sm-10">
<label>
- <input type="checkbox" id="show_rspamd_global_filters"> {{ lang.admin.rspamd_global_filters_agree }}
+ <input type="checkbox" class="form-check-input" id="show_rspamd_global_filters"> {{ lang.admin.rspamd_global_filters_agree }}
</label>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-ldap.twig b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-ldap.twig
index b69817c..89542d1 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-ldap.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-ldap.twig
@@ -1,7 +1,7 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-config-ldap-admins" role="tabpanel" aria-labelledby="tab-config-ldap-admins">
+<div class="tab-pane fade" id="tab-config-ldap-admins" role="tabpanel" aria-labelledby="tab-config-ldap-admins">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
- <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-ldap-admins" data-bs-toggle="collapse" aria-controls="ollapse-tab-config-ldap-admins">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-config-ldap-admins" data-bs-toggle="collapse" aria-controls="collapse-tab-config-ldap-admins">
{{ lang.admin.admins_ldap }}
</button>
<span class="d-none d-md-block">{{ lang.admin.admins_ldap }}</span>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-routing.twig b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-routing.twig
index 8caeec8..07d9795 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-routing.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-routing.twig
@@ -1,7 +1,7 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-routing" role="tabpanel" aria-labelledby="tab-routing">
+<div class="tab-pane fade" id="tab-routing" role="tabpanel" aria-labelledby="tab-routing">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
- <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-routing" data-bs-toggle="collapse" aria-controls="ollapse-tab-routing">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-routing" data-bs-toggle="collapse" aria-controls="collapse-tab-routing">
{{ lang.admin.relayhosts }}
</button>
<span class="d-none d-md-block">{{ lang.admin.relayhosts }}</span>
@@ -36,7 +36,7 @@
</div>
<div class="mb-4">
<label for="rlyhost_password">{{ lang.admin.password }}</label>
- <input class="form-control" id="rlyhost_password" name="password">
+ <input class="form-control" id="rlyhost_password" name="password" type="password">
</div>
<button class="btn btn-sm d-block d-sm-inline btn-success" data-action="add_item" data-id="rlyhost" data-api-url='add/relayhost' data-api-attr='{}' href="#"><i class="bi bi-plus-lg"></i> {{ lang.admin.add }}</button>
</form>
@@ -47,7 +47,7 @@
<div class="card mb-4">
<div class="card-header d-flex">
- <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-maps" data-bs-toggle="collapse" aria-controls="ollapse-tab-maps">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-maps" data-bs-toggle="collapse" aria-controls="collapse-tab-maps">
{{ lang.admin.transport_maps }}
</button>
<span class="d-none d-md-block">{{ lang.admin.transport_maps }}</span>
@@ -55,7 +55,7 @@
<div id="collapse-tab-maps" class="card-body collapse" data-bs-parent="#admin-content">
<p style="margin-bottom:40px">{{ lang.admin.transports_hint|raw }}</p>
<table id="transportstable" class="table table-striped dt-responsive w-100"></table>
- <div class="mass-actions-admin">
+ <div class="mass-actions-admin mb-4">
<div class="btn-group btn-group-sm">
<button type="button" id="toggle_multi_select_all" data-id="transports" class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary">{{ lang.mailbox.toggle_all }}</button>
<a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
@@ -86,16 +86,16 @@
</div>
<div class="mb-4">
<label for="transport_password">{{ lang.admin.password }}</label>
- <input class="form-control" id="transport_password" name="password">
+ <input class="form-control" id="transport_password" name="password" type="password">
</div>
<div class="mb-2">
<label>
- <input type="checkbox" name="is_mx_based" value="1"> {{ lang.admin.lookup_mx|raw }}
+ <input type="checkbox" class="form-check-input" name="is_mx_based" value="1"> {{ lang.admin.lookup_mx|raw }}
</label>
</div>
<div class="mb-4">
<label>
- <input type="checkbox" name="active" value="1"> {{ lang.admin.active }}
+ <input type="checkbox" class="form-check-input" name="active" value="1"> {{ lang.admin.active }}
</label>
</div>
<p class="text-muted">{{ lang.admin.credentials_transport_warning|raw }}</p>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-sys-mails.twig b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-sys-mails.twig
index 056d193..105151f 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-sys-mails.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/admin/tab-sys-mails.twig
@@ -1,7 +1,7 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-sys-mails" role="tabpanel" aria-labelledby="tab-sys-mails">
+<div class="tab-pane fade" id="tab-sys-mails" role="tabpanel" aria-labelledby="tab-sys-mails">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
- <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-sys-mails" data-bs-toggle="collapse" aria-controls="ollapse-tab-sys-mails">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-sys-mails" data-bs-toggle="collapse" aria-controls="collapse-tab-sys-mails">
{{ lang.admin.sys_mails }}
</button>
<span class="d-none d-md-block">{{ lang.admin.sys_mails }}</span>
@@ -60,7 +60,7 @@
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
<label>
- <input type="checkbox" id="mass_disarm"> {{ lang.admin.activate_send }}
+ <input type="checkbox" class="form-check-input" id="mass_disarm"> {{ lang.admin.activate_send }}
</label>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/base.twig b/mailcow/src/mailcow-dockerized/data/web/templates/base.twig
index 06c47bd..0b1c60a 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/base.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/base.twig
@@ -31,7 +31,10 @@
{% block navbar %}
<nav class="navbar navbar-expand-lg navbar-light bg-light navbar-fixed-top p-0">
<div class="container-fluid">
- <a class="navbar-brand" href="/"><img alt="mailcow-logo" src="{{ logo|default('/img/cow_mailcow.svg') }}"></a>
+ <a class="navbar-brand" href="/">
+ <img class="main-logo" alt="mailcow-logo" src="{{ logo|default('/img/cow_mailcow.svg') }}">
+ <img class="main-logo-dark" alt="mailcow-logo-dark" src="{{ logo_dark|default('/img/cow_mailcow.svg') }}">
+ </a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar" aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-list fs-3"></i>
</button>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/debug.twig b/mailcow/src/mailcow-dockerized/data/web/templates/debug.twig
index 6c96de8..8673711 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/debug.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/debug.twig
@@ -37,11 +37,12 @@
<div class="card-body">
<div class="row">
<div class="col-sm-12 col-md-4 d-flex flex-column">
- <img class="img-responsive my-auto m-auto" alt="mailcow-logo" style="max-width: 85%; max-height: 85%;" src="{{ logo|default('/img/cow_mailcow.svg') }}">
+ <img class="main-logo img-responsive my-auto m-auto" alt="mailcow-logo" style="max-width: 85%; max-height: 85%;" src="{{ logo|default('/img/cow_mailcow.svg') }}">
+ <img class="main-logo-dark img-responsive my-auto m-auto" alt="mailcow-logo-dark" style="max-width: 85%; max-height: 85%;" src="{{ logo_dark|default('/img/cow_mailcow.svg') }}">
</div>
<div class="col-sm-12 col-md-8">
<div class="table-responsive" style="margin-top: 10px;">
- <table class="table table-striped table-condensed">
+ <table class="table table-striped table-condensed w-100">
<tbody>
<tr>
<td>Hostname</td>
@@ -50,18 +51,34 @@
</div></td>
</tr>
<tr>
+ <td>{{ lang.debug.architecture }}</td>
+ <td class="text-break"><div>
+ <p id="host_architecture">-</p>
+ </div></td>
+ </tr>
+ <tr>
<td>IPs</td>
<td class="text-break">
- <span class="d-block" id="host_ipv4">-</span>
- <span class="d-block" id="host_ipv6">-</span>
+ {% if ip_check == 1 %}
+ <span class="d-none" id="host_ipv4">-</span>
+ <span class="d-none mb-2" id="host_ipv6">-</span>
+ <button class="d-block btn btn-primary btn-sm" id="host_show_ip">
+ <span class="text">{{ lang.debug.show_ip }}</span>
+ <div class="spinner-border spinner-border-sm d-none" role="status">
+ <span class="visually-hidden">Loading...</span>
+ </div>
+ </button>
+ {% else %}
+ <span class="d-block">{{ lang.admin.ip_check_disabled|raw }}</span>
+ {% endif %}
</td>
</tr>
<tr>
<td>Version</td>
<td class="text-break">
<div class="fw-bolder">
- <p ><a href="#" id="maiclow_version">{{ mailcow_info.version_tag }}</a></p>
- <p id="mailcow_update"></p>
+ <p ><a href="#" id="mailcow_version">{{ mailcow_info.version_tag }}</a></p>
+ <p id="mailcow_update"></p>
</div>
</td>
</tr>
@@ -188,10 +205,10 @@
<i class="bi bi-caret-down-fill caret"></i>
</button>
</div>
- {% endif %}
+ {% endif %}
</div>
{% if containers["solr-mailcow"].State.Running == 1 %}
- <div class="collapse p-0 list-group-details container-details-collapse" id="solr-mailcowCollapse" data-id="{{ containers["solr-mailcow"].Id }}">
+ <div class="collapse p-0 list-group-details container-details-collapse" id="solr-mailcowCollapse" data-id="{{ containers["solr-mailcow"].Id }}">
<div class="row p-2 pt-4">
<div class="col-sm-3">
<p><img class="img-responsive" alt="Solr Logo" width="128px" src="data:image/png;base64,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" /></p>
@@ -228,10 +245,10 @@
<canvas class="d-none" id="solr-mailcow_NetIOChart" width="400" height="200"></canvas>
</div>
<div class="col-sm-12 d-flex" style="height: 40px">
- <a href data-bs-toggle="modal"
- data-container="solr-mailcow"
- data-bs-target="#RestartContainer"
- class="btn btn-sm btn-secondary d-flex align-items-center justify-content-center mb-2 ms-auto"
+ <a href data-bs-toggle="modal"
+ data-container="solr-mailcow"
+ data-bs-target="#RestartContainer"
+ class="btn btn-sm btn-secondary d-flex align-items-center justify-content-center mb-2 ms-auto"
style="height: 30px;">{{ lang.debug.restart_container }}
<i class="ms-1 bi
{% if containers["solr-mailcow"].State.Running == 1 %}
@@ -245,7 +262,7 @@
></i>
</a>
</div>
- </div>
+ </div>
</div>
{% endif %}
</div>
@@ -281,8 +298,8 @@
</button>
</div>
</div>
- <div class="collapse p-0 list-group-details container-details-collapse" id="{{ container }}Collapse" data-id="{{ container_info.Id }}">
- <div class="row p-2 pt-4">
+ <div class="collapse p-0 list-group-details container-details-collapse" id="{{ container }}Collapse" data-id="{{ container_info.Id }}">
+ <div class="row p-2 pt-4">
<div class="mt-4 col-sm-12 col-md-6 d-flex flex-column">
<h6>Disk I/O</h6>
<div class="spinner-border my-4 mx-auto" role="status">
@@ -296,12 +313,12 @@
<span class="visually-hidden">Loading...</span>
</div>
<canvas class="d-none" id="{{ container }}_NetIOChart" width="400" height="200"></canvas>
- </div>
- <div class="col-12 d-flex" style="height: 40px">
- <a href data-bs-toggle="modal"
- data-container="{{ container }}"
- data-bs-target="#RestartContainer"
- class="btn btn-sm btn-secondary d-flex align-items-center justify-content-center mb-2 ms-auto"
+ </div>
+ <div class="col-12 d-flex" style="height: 40px">
+ <a href data-bs-toggle="modal"
+ data-container="{{ container }}"
+ data-bs-target="#RestartContainer"
+ class="btn btn-sm btn-secondary d-flex align-items-center justify-content-center mb-2 ms-auto"
style="height: 30px;">{{ lang.debug.restart_container }}
<i class="ms-1 bi
{% if container_info.State.Running == 1 %}
@@ -330,7 +347,7 @@
<div class="debug-log-info">{{ lang.debug.log_info|format(log_lines+1)|raw }}</div>
<div class="card">
<div class="card-header d-flex align-items-center fs-5">
- <span class="mt-2 ms-2">Postfix</span>
+ <span class="mt-2 ms-2">Postfix</span>
<div class="btn-group ms-auto">
<button class="btn btn-sm btn-secondary refresh_table" data-draw="draw_postfix_logs" data-table="postfix_log">{{ lang.admin.refresh }}</button>
</div>
@@ -340,9 +357,9 @@
<ul class="dropdown-menu">
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="postfix_log" data-log-url="postfix" data-nrows="100" href="#">+ 100</a></li>
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="postfix_log" data-log-url="postfix" data-nrows="1000" href="#">+ 1000</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="postfix_log" data-table="postfix_log" href="#">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="postfix_log" data-table="postfix_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="postfix_log" data-table="postfix_log" href="#">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="postfix_log" data-table="postfix_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<table id="postfix_log" class="table table-striped dt-responsive w-100"></table>
</div>
@@ -363,9 +380,9 @@
<ul class="dropdown-menu">
<li><a class="dropdown-item add_log_lines" data-post-process="mailcow_ui" data-table="ui_logs" data-log-url="ui" data-nrows="100" href="#">+ 100</a></li>
<li><a class="dropdown-item add_log_lines" data-post-process="mailcow_ui" data-table="ui_logs" data-log-url="ui" data-nrows="1000" href="#">+ 1000</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="ui_logs" data-table="ui_logs" href="#">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="ui_logs" data-table="ui_logs" href="#">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="ui_logs" data-table="ui_logs" href="#">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="ui_logs" data-table="ui_logs" href="#">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<table id="ui_logs" class="table table-striped dt-responsive w-100"></table>
</div>
@@ -386,9 +403,9 @@
<ul class="dropdown-menu">
<li><a class="dropdown-item add_log_lines" data-post-process="sasl_log_table" data-table="sasl_logs" data-log-url="ui" data-nrows="100" href="#">+ 100</a></li>
<li><a class="dropdown-item add_log_lines" data-post-process="sasl_log_table" data-table="sasl_logs" data-log-url="ui" data-nrows="1000" href="#">+ 1000</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="sasl_logs" data-table="sasl_logs" href="#">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="sasl_logs" data-table="sasl_logs" href="#">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="sasl_logs" data-table="sasl_logs" href="#">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="sasl_logs" data-table="sasl_logs" href="#">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<table id="sasl_logs" class="table table-striped dt-responsive w-100"></table>
</div>
@@ -409,9 +426,9 @@
<ul class="dropdown-menu">
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="dovecot_log" data-log-url="dovecot" data-nrows="100" href="#">+ 100</a></li>
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="dovecot_log" data-log-url="dovecot" data-nrows="1000" href="#">+ 1000</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="dovecot_log" data-table="dovecot_log" href="#">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="dovecot_log" data-table="dovecot_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="dovecot_log" data-table="dovecot_log" href="#">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="dovecot_log" data-table="dovecot_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<table id="dovecot_log" class="table table-striped dt-responsive w-100"></table>
</div>
@@ -432,9 +449,9 @@
<ul class="dropdown-menu">
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="sogo_log" data-log-url="sogo" data-nrows="100" href="#">+ 100</a></li>
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="sogo_log" data-log-url="sogo" data-nrows="1000" href="#">+ 1000</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="sogo_log" data-table="sogo_log" href="#">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="sogo_log" data-table="sogo_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="sogo_log" data-table="sogo_log" href="#">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="sogo_log" data-table="sogo_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<table id="sogo_log" class="table table-striped dt-responsive w-100"></table>
</div>
@@ -455,9 +472,9 @@
<ul class="dropdown-menu">
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="netfilter_log" data-log-url="netfilter" data-nrows="100" href="#">+ 100</a></li>
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="netfilter_log" data-log-url="netfilter" data-nrows="1000" href="#">+ 1000</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="netfilter_log" data-table="netfilter_log" href="#">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="netfilter_log" data-table="netfilter_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="netfilter_log" data-table="netfilter_log" href="#">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="netfilter_log" data-table="netfilter_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<table id="netfilter_log" class="table table-striped dt-responsive w-100"></table>
</div>
@@ -481,11 +498,11 @@
<legend>{{ lang.debug.history_all_servers }}</legend><hr />
<a class="btn btn-sm btn-secondary dropdown-toggle mb-4" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
<ul class="dropdown-menu">
- <li><a class="dropdown-item add_log_lines" data-post-process="rspamd_history" data-table="rspamd_history" data-log-url="rspamd_history" data-nrows="100" href="#">+ 100</a></li>
- <li><a class="dropdown-item add_log_lines" data-post-process="rspamd_history" data-table="rspamd_history" data-log-url="rspamd_history" data-nrows="1000" href="#">+ 1000</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="rspamd_history" data-table="rspamd_history" href="#">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="rspamd_history" data-table="rspamd_history" href="#">{{ lang.datatables.collapse_all }}</a></li>
+ <li><a class="dropdown-item add_log_lines" data-post-process="rspamd_history" data-table="rspamd_history" data-log-url="rspamd-history" data-nrows="100" href="#">+ 100</a></li>
+ <li><a class="dropdown-item add_log_lines" data-post-process="rspamd_history" data-table="rspamd_history" data-log-url="rspamd-history" data-nrows="1000" href="#">+ 1000</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="rspamd_history" data-table="rspamd_history" href="#">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="rspamd_history" data-table="rspamd_history" href="#">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<table id="rspamd_history" class="table table-striped dt-responsive w-100"></table>
</div>
@@ -506,9 +523,9 @@
<ul class="dropdown-menu">
<li><a class="dropdown-item add_log_lines" data-post-process="autodiscover_log" data-table="autodiscover_log" data-log-url="autodiscover" data-nrows="100" href="#">+ 100</a></li>
<li><a class="dropdown-item add_log_lines" data-post-process="autodiscover_log" data-table="autodiscover_log" data-log-url="autodiscover" data-nrows="1000" href="#">+ 1000</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="autodiscover_log" data-table="autodiscover_log" href="#">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="autodiscover_log" data-table="autodiscover_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="autodiscover_log" data-table="autodiscover_log" href="#">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="autodiscover_log" data-table="autodiscover_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<table id="autodiscover_log" class="table table-striped dt-responsive w-100"></table>
</div>
@@ -529,9 +546,9 @@
<ul class="dropdown-menu">
<li><a class="dropdown-item add_log_lines" data-post-process="watchdog" data-table="watchdog_log" data-log-url="watchdog" data-nrows="100" href="#">+ 100</a></li>
<li><a class="dropdown-item add_log_lines" data-post-process="watchdog" data-table="watchdog_log" data-log-url="watchdog" data-nrows="1000" href="#">+ 1000</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="watchdog_log" data-table="watchdog_log" href="#">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="watchdog_log" data-table="watchdog_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="watchdog_log" data-table="watchdog_log" href="#">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="watchdog_log" data-table="watchdog_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<table id="watchdog_log" class="table table-striped dt-responsive w-100"></table>
</div>
@@ -552,9 +569,9 @@
<ul class="dropdown-menu">
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="acme_log" data-log-url="acme" data-nrows="100" href="#">+ 100</a></li>
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="acme_log" data-log-url="acme" data-nrows="1000" href="#">+ 1000</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="acme_log" data-table="acme_log" href="#">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="acme_log" data-table="acme_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="acme_log" data-table="acme_log" href="#">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="acme_log" data-table="acme_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<table id="acme_log" class="table table-striped dt-responsive w-100"></table>
</div>
@@ -575,9 +592,9 @@
<ul class="dropdown-menu">
<li><a class="dropdown-item add_log_lines" data-post-process="apilog" data-table="api_log" data-log-url="api" data-nrows="100" href="#">+ 100</a></li>
<li><a class="dropdown-item add_log_lines" data-post-process="apilog" data-table="api_log" data-log-url="api" data-nrows="1000" href="#">+ 1000</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="api_log" data-table="api_log" href="#">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="api_log" data-table="api_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="api_log" data-table="api_log" href="#">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="api_log" data-table="api_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<table id="api_log" class="table table-striped dt-responsive w-100"></table>
</div>
@@ -598,11 +615,11 @@
<ul class="dropdown-menu">
<li><a class="dropdown-item add_log_lines" data-post-process="rllog" data-table="rl_log" data-log-url="ratelimited" data-nrows="100" href="#">+ 100</a></li>
<li><a class="dropdown-item add_log_lines" data-post-process="rllog" data-table="rl_log" data-log-url="ratelimited" data-nrows="1000" href="#">+ 1000</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="rl_log" data-table="rl_log" href="#">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="rl_log" data-table="rl_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="rl_log" data-table="rl_log" href="#">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="rl_log" data-table="rl_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
</ul>
- <p class="text-muted">{{ lang.admin.hash_remove_info }}</p>
+ <p class="text-muted">{{ lang.admin.hash_remove_info|raw }}</p>
<table id="rl_log" class="table table-striped dt-responsive w-100"></table>
</div>
</div>
@@ -617,6 +634,6 @@
var lang_debug = {{ lang_debug|raw }};
var lang_datatables = {{ lang_datatables|raw }};
var csrf_token = '{{ csrf_token }}';
- var log_pagination_size = '{{ log_pagination_size }}';
+ var log_pagination_size = Math.trunc('{{ log_pagination_size }}');
</script>
{% endblock %}
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/domainadmin.twig b/mailcow/src/mailcow-dockerized/data/web/templates/domainadmin.twig
index 56f5e75..070bf00 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/domainadmin.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/domainadmin.twig
@@ -46,7 +46,7 @@
<div class="col-sm-3 col-5 text-end">{{ lang.fido2.known_ids }}:</div>
<div class="col-sm-9 col-7">
<div class="table-responsive">
- <table class="table table-striped table-hover table-condensed" id="fido2_keys">
+ <table class="table table-striped table-hover table-condensed w-100" id="fido2_keys">
<tr>
<th>ID</th>
<th style="min-width:240px;text-align: right">{{ lang.admin.action }}</th>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit.twig
index 29f3643..af83a31 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit.twig
@@ -26,7 +26,7 @@
var lang_user = {{ lang_user|raw }};
var lang_datatables = {{ lang_datatables|raw }};
var csrf_token = '{{ csrf_token }}';
- var pagination_size = '{{ pagination_size }}';
+ var pagination_size = Math.trunc('{{ pagination_size }}');
var table_for_domain = '{{ domain }}';
</script>
{% endblock %}
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit/admin.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit/admin.twig
index 8806b06..e2c6f66 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit/admin.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit/admin.twig
@@ -27,15 +27,15 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="disable_tfa"> {{ lang.tfa.disable_tfa }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="disable_tfa"> {{ lang.tfa.disable_tfa }}</label>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit/alias.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit/alias.twig
index 83a3760..48d1961 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit/alias.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit/alias.twig
@@ -19,19 +19,19 @@
<label class="control-label col-sm-2" for="goto">{{ lang.edit.target_address|raw }}</label>
<div class="col-sm-10">
<textarea id="textarea_alias_goto" class="form-control mb-4" autocapitalize="none" autocorrect="off" rows="10" id="goto" name="goto" required>{{ goto|replace({',': ', '}) }}</textarea>
- <div class="checkbox">
- <label><input class="goto_checkbox" type="checkbox" value="1" name="goto_null"{% if result.goto == 'null@localhost' %} checked{% endif %}> {{ lang.add.goto_null }}</label>
+ <div class="form-check">
+ <label><input class="form-check-input goto_checkbox" type="checkbox" value="1" name="goto_null"{% if result.goto == 'null@localhost' %} checked{% endif %}> {{ lang.add.goto_null }}</label>
</div>
- <div class="checkbox">
- <label><input class="goto_checkbox" type="checkbox" value="1" name="goto_spam"{% if result.goto == 'spam@localhost' %} checked{% endif %}> {{ lang.add.goto_spam|raw }}</label>
+ <div class="form-check">
+ <label><input class="form-check-input goto_checkbox" type="checkbox" value="1" name="goto_spam"{% if result.goto == 'spam@localhost' %} checked{% endif %}> {{ lang.add.goto_spam|raw }}</label>
</div>
- <div class="checkbox">
- <label><input class="goto_checkbox" type="checkbox" value="1" name="goto_ham"{% if result.goto == 'ham@localhost' %} checked{% endif %}> {{ lang.add.goto_ham|raw }}</label>
+ <div class="form-check">
+ <label><input class="form-check-input goto_checkbox" type="checkbox" value="1" name="goto_ham"{% if result.goto == 'ham@localhost' %} checked{% endif %}> {{ lang.add.goto_ham|raw }}</label>
</div>
{% if not skip_sogo %}
<hr>
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="sogo_visible"{% if result.sogo_visible == '1' %} checked{% endif %}> {{ lang.edit.sogo_visible }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="sogo_visible"{% if result.sogo_visible == '1' %} checked{% endif %}> {{ lang.edit.sogo_visible }}</label>
</div>
<p class="text-muted">{{ lang.edit.sogo_visible_info }}</p>
{% endif %}
@@ -53,8 +53,8 @@
<hr>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit/aliasdomain.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit/aliasdomain.twig
index 808d128..540326e 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit/aliasdomain.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit/aliasdomain.twig
@@ -2,7 +2,7 @@
{% block inner_content %}
{% if result %}
-<h4>{{ lang.edit.edit_alias_domain }}</h4>
+<h4 class="mb-4">{{ lang.edit.edit_alias_domain }}</h4>
<form class="form-horizontal" data-id="editaliasdomain" role="form" method="post">
<input type="hidden" value="0" name="active">
<div class="row mb-2">
@@ -17,8 +17,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
</div>
</div>
</div>
@@ -31,17 +31,19 @@
<hr>
<form data-id="domratelimit" class="form-inline well" method="post">
<label class="control-label mb-2">{{ lang.acl.ratelimit }}</label>
- <input name="rl_value" type="number" value="{{ rl.value }}" autocomplete="off" class="form-control mb-4" placeholder="{{ lang.ratelimit.disabled }}">
- <select name="rl_frame" class="form-control">
+ <div class="input-group mb-4">
+ <input name="rl_value" type="number" value="{{ rl.value }}" autocomplete="off" class="form-control" placeholder="{{ lang.ratelimit.disabled }}">
+ <select name="rl_frame" class="form-control">
{% include 'mailbox/rl-frame.twig' %}
- </select>
+ </select>
+ </div>
<button class="btn btn-xs-lg d-block d-sm-inline btn-secondary" data-action="edit_selected" data-id="domratelimit" data-item="{{ alias_domain }}" data-api-url='edit/rl-domain' data-api-attr='{}' href="#">{{ lang.admin.save }}</button>
</form>
{% if dkim %}
<hr>
<div class="row">
<div class="col-12 col-sm-2">
- <p>Domain: <strong>{{ result.alias_domain }}</strong> ({{ dkim.dkim_selector }}._domainkey)</p>
+ <p>{{ lang.add.domain }}: <strong>{{ result.alias_domain }}</strong> ({{ dkim.dkim_selector }}._domainkey)</p>
</div>
<div class="col-12 col-sm-10">
<pre class="p-2">{{ dkim.dkim_txt }}</pre>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit/app-passwd.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit/app-passwd.twig
index fcd9d04..46dc648 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit/app-passwd.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit/app-passwd.twig
@@ -26,8 +26,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit/bcc.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit/bcc.twig
index f7d0c5c..fb7a538 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit/bcc.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit/bcc.twig
@@ -24,8 +24,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit/domain-templates.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit/domain-templates.twig
index 5a0cbb6..825e667 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit/domain-templates.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit/domain-templates.twig
@@ -64,16 +64,16 @@
</div>
<div class="row">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="gal"{% if template.attributes.gal == '1' %} checked{% endif %}> {{ lang.edit.gal }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="gal"{% if template.attributes.gal == '1' %} checked{% endif %}> {{ lang.edit.gal }}</label>
<small class="text-muted">{{ lang.edit.gal_info|raw }}</small>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if template.attributes.active == '1' %} checked{% endif %}{% if mailcow_cc_role != 'admin' %} disabled{% endif %}> {{ lang.edit.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if template.attributes.active == '1' %} checked{% endif %}{% if mailcow_cc_role != 'admin' %} disabled{% endif %}> {{ lang.edit.active }}</label>
</div>
</div>
</div>
@@ -81,13 +81,12 @@
<div class="row">
<label class="control-label col-sm-2">{{ lang.edit.ratelimit }}</label>
<div class="col-sm-10">
- <input name="rl_value" type="number" value="{{ template.attributes.rl_value }}" autocomplete="off" class="form-control mb-4" placeholder="{{ lang.ratelimit.disabled }}">
- <select name="rl_frame" class="form-control">
- <option value="s"{% if template.attributes.rl_frame == 's' %} selected{% endif %}>{{ lang.ratelimit.second }}</option>
- <option value="m"{% if template.attributes.rl_frame == 'm' %} selected{% endif %}>{{ lang.ratelimit.minute }}</option>
- <option value="h"{% if template.attributes.rl_frame == 'h' %} selected{% endif %}>{{ lang.ratelimit.hour }}</option>
- <option value="d"{% if template.attributes.rl_frame == 'd' %} selected{% endif %}>{{ lang.ratelimit.day }}</option>
- </select>
+ <div class="input-group">
+ <input name="rl_value" type="number" value="{{ template.attributes.rl_value }}" autocomplete="off" class="form-control mb-4" placeholder="{{ lang.ratelimit.disabled }}">
+ <select name="rl_frame" class="form-control">
+ {% include 'mailbox/rl-frame.twig' %}
+ </select>
+ </div>
</div>
</div>
{% endif %}
@@ -101,7 +100,7 @@
<div class="row mb-4">
<label class="control-label col-sm-2" for="key_size">{{ lang.admin.dkim_key_length }}</label>
<div class="col-sm-10">
- <select data-style="btn btn-secondary btn-sm" class="form-control" id="key_size" name="key_size">
+ <select data-style="btn btn-light" class="form-control" id="key_size" name="key_size">
<option value="1024" data-subtext="bits" {% if template.attributes.key_size == 1024 %} selected{% endif %}>1024</option>
<option value="2048" data-subtext="bits" {% if template.attributes.key_size == 2048 %} selected{% endif %}>2048</option>
</select>
@@ -111,12 +110,12 @@
<div class="row mb-2">
<label class="control-label col-sm-2">{{ lang.edit.backup_mx_options }}</label>
<div class="col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="backupmx"{% if template.attributes.backupmx == '1' %} checked{% endif %}> {{ lang.edit.relay_domain }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="backupmx"{% if template.attributes.backupmx == '1' %} checked{% endif %}> {{ lang.edit.relay_domain }}</label>
<br>
- <label><input type="checkbox" value="1" name="relay_all_recipients"{% if template.attributes.relay_all_recipients == '1' %} checked{% endif %}> {{ lang.edit.relay_all }}</label>
+ <label><input type="checkbox" class="form-check-input" value="1" name="relay_all_recipients"{% if template.attributes.relay_all_recipients == '1' %} checked{% endif %}> {{ lang.edit.relay_all }}</label>
<p>{{ lang.edit.relay_all_info|raw }}</p>
- <label><input type="checkbox" value="1" name="relay_unknown_only"{% if template.attributes.relay_unknown_only == '1' %} checked{% endif %}> {{ lang.edit.relay_unknown_only }}</label>
+ <label><input type="checkbox" class="form-check-input" value="1" name="relay_unknown_only"{% if template.attributes.relay_unknown_only == '1' %} checked{% endif %}> {{ lang.edit.relay_unknown_only }}</label>
<br>
<p>{{ lang.edit.relay_transport_info|raw }}</p>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit/domain.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit/domain.twig
index 0c42488..5e9eb54 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit/domain.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit/domain.twig
@@ -2,233 +2,315 @@
{% block inner_content %}
{% if result %}
-<ul class="nav nav-tabs" role="tablist">
- <li role="presentation" class="nav-item"><button class="nav-link active" data-bs-toggle="tab" data-bs-target="#dedit">{{ lang.edit.domain }}</button></li>
- <li role="presentation" class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#dratelimit">{{ lang.edit.ratelimit }}</button></li>
- <li role="presentation" class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#dspamfilter">{{ lang.edit.spam_filter }}</button></li>
- <li role="presentation" class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#dqwbcc">{{ lang.edit.quota_warning_bcc }}</button></li>
-</ul>
-<hr>
-<div class="tab-content">
- <div id="dedit" class="tab-pane fade show active" role="tabpanel" aria-labelledby="domain-edit">
- <form data-id="editdomain" class="form-horizontal" role="form" method="post">
- <input type="hidden" value="0" name="active">
- <input type="hidden" value="0" name="backupmx">
- <input type="hidden" value="0" name="gal">
- <input type="hidden" value="0" name="relay_all_recipients">
- <input type="hidden" value="0" name="relay_unknown_only">
- <div class="row mb-2" data-acl="{{ acl.domain_desc }}">
- <label class="control-label col-sm-2" for="description">{{ lang.edit.description }}</label>
- <div class="col-sm-10">
- <input type="text" class="form-control" name="description" value="{{ result.description }}">
+<div id="domain-content" class="responsive-tabs">
+ <ul class="nav nav-tabs" role="tablist">
+ <li role="presentation" class="nav-item"><button class="nav-link active" data-bs-toggle="tab" data-bs-target="#dedit">{{ lang.edit.domain }}</button></li>
+ <li role="presentation" class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#dratelimit">{{ lang.edit.ratelimit }}</button></li>
+ <li role="presentation" class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#dspamfilter">{{ lang.edit.spam_filter }}</button></li>
+ <li role="presentation" class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#dqwbcc">{{ lang.edit.quota_warning_bcc }}</button></li>
+ <li role="presentation" class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#dfooter">{{ lang.edit.domain_footer }}</button></li>
+ </ul>
+ <hr class="d-none d-md-block">
+ <div class="tab-content">
+ <div id="dedit" class="tab-pane fade show active" role="tabpanel" aria-labelledby="domain-edit">
+ <div class="card mb-4">
+ <div class="card-header d-flex d-md-none fs-5">
+ <button class="btn flex-grow-1 text-start" data-bs-target="#collapse-tab-dedit" data-bs-toggle="collapse" aria-controls="collapse-tab-dedit">
+ {{ lang.edit.domain }} <span class="badge bg-info table-lines"></span>
+ </button>
+ </div>
+ <div id="collapse-tab-dedit" class="card-body collapse show" data-bs-parent="#domain-content">
+ <form data-id="editdomain" class="form-horizontal" role="form" method="post">
+ <input type="hidden" value="0" name="active">
+ <input type="hidden" value="0" name="backupmx">
+ <input type="hidden" value="0" name="gal">
+ <input type="hidden" value="0" name="relay_all_recipients">
+ <input type="hidden" value="0" name="relay_unknown_only">
+ <div class="row mb-2" data-acl="{{ acl.domain_desc }}">
+ <label class="control-label col-sm-2" for="description">{{ lang.edit.description }}</label>
+ <div class="col-sm-10">
+ <input type="text" class="form-control" name="description" value="{{ result.description }}">
+ </div>
+ </div>
+ <div class="row mb-4">
+ <label class="control-label col-sm-2">{{ lang.add.tags }}</label>
+ <div class="col-sm-10">
+ <div class="form-control tag-box">
+ {% for tag in domain_details.tags %}
+ <span data-action='delete_selected' data-item="{{ tag|url_encode }}" data-id="domain_tag_{{ tag }}" data-api-url='delete/domain/tag/{{ domain }}' class="badge bg-primary tag-badge btn-badge">
+ <i class="bi bi-tag-fill"></i>
+ {{ tag }}
+ </span>
+ {% endfor %}
+ <input type="text" class="tag-input">
+ <span class="btn tag-add"><i class="bi bi-plus-lg"></i></span>
+ <input type="hidden" value="" name="tags" class="tag-values" />
+ </div>
+ </div>
+ </div>
+ <div class="row mb-2">
+ <label class="control-label col-sm-2" for="relayhost">{{ lang.edit.relayhost }}</label>
+ <div class="col-sm-10">
+ <select data-acl="{{ acl.domain_relayhost }}" data-live-search="true" id="relayhost" name="relayhost" class="form-control">
+ {% for rlyhost in rlyhosts %}
+ <option
+ style="{% if rlyhost.active != '1' %}background: #ff4136; color: #fff{% endif %}"
+ {% if result.relayhost == rlyhost.id %} selected{% endif %}
+ value="{{ rlyhost.id }}">
+ ID {{ rlyhost.id }}: {{ rlyhost.hostname }} ({{ rlyhost.username }})
+ </option>
+ {% endfor %}
+ <option value=""{% if not result.relayhost %} selected{% endif %}>
+ {{ lang.edit.none_inherit }}
+ </option>
+ </select>
+ </div>
+ </div>
+ {% if mailcow_cc_role == 'admin' %}
+ <div class="row mb-2">
+ <label class="control-label col-sm-2" for="aliases">{{ lang.edit.max_aliases }}</label>
+ <div class="col-sm-10">
+ <input type="number" class="form-control" name="aliases" value="{{ result.max_num_aliases_for_domain }}">
+ </div>
+ </div>
+ <div class="row mb-2">
+ <label class="control-label col-sm-2" for="mailboxes">{{ lang.edit.max_mailboxes }}</label>
+ <div class="col-sm-10">
+ <input type="number" class="form-control" name="mailboxes" value="{{ result.max_num_mboxes_for_domain }}">
+ </div>
+ </div>
+ <div class="row mb-2">
+ <label class="control-label col-sm-2" for="defquota">{{ lang.edit.mailbox_quota_def }}</label>
+ <div class="col-sm-10">
+ <input type="number" class="form-control" name="defquota" value="{{ (result.def_quota_for_mbox / 1048576) }}">
+ </div>
+ </div>
+ <div class="row mb-2">
+ <label class="control-label col-sm-2" for="maxquota">{{ lang.edit.max_quota }}</label>
+ <div class="col-sm-10">
+ <input type="number" class="form-control" name="maxquota" value="{{ (result.max_quota_for_mbox / 1048576) }}">
+ </div>
+ </div>
+ <div class="row mb-4">
+ <label class="control-label col-sm-2" for="quota">{{ lang.edit.domain_quota }}</label>
+ <div class="col-sm-10">
+ <input type="number" class="form-control" name="quota" value="{{ (result.max_quota_for_domain / 1048576) }}">
+ </div>
+ </div>
+ <div class="row mb-2">
+ <label class="control-label col-sm-2">{{ lang.edit.backup_mx_options }}</label>
+ <div class="col-sm-10">
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="backupmx"{% if result.backupmx == '1' %} checked{% endif %}> {{ lang.edit.relay_domain }}</label>
+ <br>
+ <label><input type="checkbox" class="form-check-input" value="1" name="relay_all_recipients"{% if result.relay_all_recipients == '1' %} checked{% endif %}> {{ lang.edit.relay_all }}</label>
+ <p>{{ lang.edit.relay_all_info|raw }}</p>
+ <label><input type="checkbox" class="form-check-input" value="1" name="relay_unknown_only"{% if result.relay_unknown_only == '1' %} checked{% endif %}> {{ lang.edit.relay_unknown_only }}</label>
+ <br>
+ <p>{{ lang.edit.relay_transport_info|raw }}</p>
+ <hr style="margin:25px 0px 0px 0px">
+ </div>
+ </div>
+ </div>
+ {% endif %}
+ <div class="row">
+ <div class="offset-sm-2 col-sm-10">
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="gal"{% if result.gal == '1' %} checked{% endif %}> {{ lang.edit.gal }}</label>
+ <small class="text-muted">{{ lang.edit.gal_info|raw }}</small>
+ </div>
+ </div>
+ </div>
+ <hr>
+ <div class="row mb-2">
+ <div class="offset-sm-2 col-sm-10">
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if result.active == '1' %} checked{% endif %}{% if mailcow_cc_role != 'admin' %} disabled{% endif %}> {{ lang.edit.active }}</label>
+ </div>
+ </div>
+ </div>
+ <div class="row mb-2">
+ <div class="offset-sm-2 col-sm-10">
+ <button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="edit_selected" data-id="editdomain" data-item="{{ domain }}" data-api-url='edit/domain' data-api-attr='{}' href="#">{{ lang.admin.save }}</button>
+ </div>
+ </div>
+ <div class="row">
+ <div class="offset-sm-2 col-sm-10">
+ <small class="fst-italic d-block">{{ lang.edit.created_on }}: {{ result.created }}</small>
+ <small class="fst-italic d-block">{{ lang.edit.last_modified }}: {{ result.modified }}</small>
+ </div>
+ </div>
+ </form>
+ {% if dkim %}
+ <hr>
+ <div class="row">
+ <div class="col-12 col-sm-2">
+ <p>{{ lang.add.domain }}: <strong>{{ result.domain_name }}</strong> ({{ dkim.dkim_selector }}._domainkey)</p>
+ </div>
+ <div class="col-12 col-sm-10">
+ <pre class="p-2">{{ dkim.dkim_txt }}</pre>
+ </div>
+ </div>
+ {% endif %}
+ </div>
</div>
</div>
- <div class="row mb-4">
- <label class="control-label col-sm-2">{{ lang.add.tags }}</label>
- <div class="col-sm-10">
- <div class="form-control tag-box">
- {% for tag in domain_details.tags %}
- <span data-action='delete_selected' data-item="{{ tag|url_encode }}" data-id="domain_tag_{{ tag }}" data-api-url='delete/domain/tag/{{ domain }}' class="badge bg-primary tag-badge btn-badge">
- <i class="bi bi-tag-fill"></i>
- {{ tag }}
- </span>
- {% endfor %}
- <input type="text" class="tag-input">
- <span class="btn tag-add"><i class="bi bi-plus-lg"></i></span>
- <input type="hidden" value="" name="tags" class="tag-values" />
- </div>
+ <div id="dratelimit" class="tab-pane fade" role="tabpanel" aria-labelledby="domain-ratelimit">
+ <div class="card mb-4">
+ <div class="card-header d-flex d-md-none fs-5">
+ <button class="btn flex-grow-1 text-start" data-bs-target="#collapse-tab-ratelimit" data-bs-toggle="collapse" aria-controls="collapse-tab-ratelimit">
+ {{ lang.edit.ratelimit }} <span class="badge bg-info table-lines"></span>
+ </button>
+ </div>
+ <div id="collapse-tab-ratelimit" class="card-body collapse" data-bs-parent="#domain-content">
+ <form data-id="domratelimit" class="well" method="post">
+ <div class="row mb-2">
+ <label class="control-label col-sm-2">{{ lang.edit.ratelimit }}</label>
+ <div class="col-sm-10">
+ <div class="input-group">
+ <input name="rl_value" type="number" value="{{ rl.value }}" autocomplete="off" class="form-control placeholder="{{ lang.ratelimit.disabled }}">
+ <select name="rl_frame" class="form-control">
+ {% include 'mailbox/rl-frame.twig' %}
+ </select>
+ </div>
+ </div>
+ </div>
+ <div class="row mb-2">
+ <div class="offset-sm-2 col-sm-10">
+ <button data-acl="{{ acl.ratelimit }}" class="btn btn-xs-lg d-block d-sm-inline btn-secondary" data-action="edit_selected" data-id="domratelimit" data-item="{{ domain }}" data-api-url='edit/rl-domain' data-api-attr='{}' href="#">{{ lang.admin.save }}</button>
+ </div>
+ </div>
+ </form>
+ </div>
</div>
</div>
- <div class="row mb-2">
- <label class="control-label col-sm-2" for="relayhost">{{ lang.edit.relayhost }}</label>
- <div class="col-sm-10">
- <select data-acl="{{ acl.domain_relayhost }}" data-live-search="true" id="relayhost" name="relayhost" class="form-control">
- {% for rlyhost in rlyhosts %}
- <option
- style="{% if rlyhost.active != '1' %}background: #ff4136; color: #fff{% endif %}"
- {% if result.relayhost == rlyhost.id %} selected{% endif %}
- value="{{ rlyhost.id }}">
- ID {{ rlyhost.id }}: {{ rlyhost.hostname }} ({{ rlyhost.username }})
- </option>
- {% endfor %}
- <option value=""{% if not result.relayhost %} selected{% endif %}>
- {{ lang.edit.none_inherit }}
- </option>
- </select>
+ <div id="dspamfilter" class="tab-pane fade" role="tabpanel" aria-labelledby="domain-spamfilter">
+ <div class="card mb-4">
+ <div class="card-header d-flex d-md-none fs-5">
+ <button class="btn flex-grow-1 text-start" data-bs-target="#collapse-tab-spamfilter" data-bs-toggle="collapse" aria-controls="collapse-tab-spamfilter">
+ {{ lang.edit.spam_filter }} <span class="badge bg-info table-lines"></span>
+ </button>
+ </div>
+ <div id="collapse-tab-spamfilter" class="card-body collapse" data-bs-parent="#domain-content">
+ <div class="row">
+ <div class="col-sm-6">
+ <h4>{{ lang.user.spamfilter_wl }}</h4>
+ <p>{{ lang.user.spamfilter_wl_desc|raw }}</p>
+ <form class="form-inline mb-4" data-id="add_wl_policy_domain">
+ <div class="input-group" data-acl="{{ acl.spam_policy }}">
+ <input type="text" class="form-control" name="object_from" placeholder="*@example.org" required>
+ <button class="btn btn-secondary" data-action="add_item" data-id="add_wl_policy_domain" data-api-url='add/domain-policy' data-api-attr='{"domain":"{{ domain }}","object_list":"wl"}' href="#">{{ lang.user.spamfilter_table_add }}</button>
+ </div>
+ </form>
+ <table id="wl_policy_domain_table" class="table table-striped dt-responsive w-100"></table>
+ <div class="mass-actions-user">
+ <div class="btn-group" data-acl="{{ acl.spam_policy }}">
+ <a class="btn btn-xs-half d-block d-sm-inline btn-sm btn-secondary" id="toggle_multi_select_all" data-id="policy_wl_domain" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
+ <a class="btn btn-xs-half d-block d-sm-inline btn-sm btn-danger" data-action="delete_selected" data-id="policy_wl_domain" data-api-url='delete/domain-policy' href="#">{{ lang.mailbox.remove }}</a>
+ </div>
+ </div>
+ </div>
+ <div class="col-sm-6">
+ <h4>{{ lang.user.spamfilter_bl }}</h4>
+ <p>{{ lang.user.spamfilter_bl_desc|raw }}</p>
+ <form class="form-inline mb-4" data-id="add_bl_policy_domain">
+ <div class="input-group" data-acl="{{ acl.spam_policy }}">
+ <input type="text" class="form-control" name="object_from" placeholder="*@example.org" required>
+ <button class="btn btn-secondary" data-action="add_item" data-id="add_bl_policy_domain" data-api-url='add/domain-policy' data-api-attr='{"domain":"{{ domain }}","object_list":"bl"}' href="#">{{ lang.user.spamfilter_table_add }}</button>
+ </div>
+ </form>
+ <table id="bl_policy_domain_table" class="table table-striped dt-responsive w-100"></table>
+ <div class="mass-actions-user">
+ <div class="btn-group" data-acl="{{ acl.spam_policy }}">
+ <a class="btn btn-xs-half d-block d-sm-inline btn-sm btn-secondary" id="toggle_multi_select_all" data-id="policy_bl_domain" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
+ <a class="btn btn-xs-half d-block d-sm-inline btn-sm btn-danger" data-action="delete_selected" data-id="policy_bl_domain" data-api-url='delete/domain-policy' href="#">{{ lang.mailbox.remove }}</a></li>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
</div>
</div>
- {% if mailcow_cc_role == 'admin' %}
- <div class="row mb-2">
- <label class="control-label col-sm-2" for="aliases">{{ lang.edit.max_aliases }}</label>
- <div class="col-sm-10">
- <input type="number" class="form-control" name="aliases" value="{{ result.max_num_aliases_for_domain }}">
+ <div id="dqwbcc" class="tab-pane fade" role="tabpanel" aria-labelledby="domain-qwbcc">
+ <div class="card mb-4">
+ <div class="card-header d-flex d-md-none fs-5">
+ <button class="btn flex-grow-1 text-start" data-bs-target="#collapse-tab-qwbcc" data-bs-toggle="collapse" aria-controls="collapse-tab-qwbcc">
+ {{ lang.edit.quota_warning_bcc }} <span class="badge bg-info table-lines"></span>
+ </button>
+ </div>
+ <div id="collapse-tab-qwbcc" class="card-body collapse" data-bs-parent="#domain-content">
+ <div class="row">
+ <div class="col-sm-12">
+ <h4>{{ lang.edit.quota_warning_bcc }}</h4>
+ <p>{{ lang.edit.quota_warning_bcc_info|raw }}</p>
+ <form class="form-horizontal" data-id="quota_bcc">
+ <input type="hidden" value="0" name="active">
+ <div class="row mb-2">
+ <label class="control-label col-sm-2" for="script_data">{{ lang.edit.target_address|raw }}:</label>
+ <div class="col-sm-10">
+ <textarea spellcheck="false" autocorrect="off" autocapitalize="none" class="form-control" rows="10" id="bcc_rcpt" name="bcc_rcpt">{{ quota_notification_bcc.bcc_rcpts|join("\n") }}</textarea>
+ </div>
+ </div>
+ <div class="row mb-4">
+ <div class="offset-sm-2 col-sm-10">
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if quota_notification_bcc.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="offset-sm-2 col-sm-10">
+ <button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="edit_selected" data-id="quota_bcc" data-item="quota_bcc" data-api-url='edit/quota_notification_bcc' data-api-attr='{"domain":"{{ domain }}"}' href="#">{{ lang.edit.save }}</button>
+ </div>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
</div>
</div>
- <div class="row mb-2">
- <label class="control-label col-sm-2" for="mailboxes">{{ lang.edit.max_mailboxes }}</label>
- <div class="col-sm-10">
- <input type="number" class="form-control" name="mailboxes" value="{{ result.max_num_mboxes_for_domain }}">
- </div>
- </div>
- <div class="row mb-2">
- <label class="control-label col-sm-2" for="defquota">{{ lang.edit.mailbox_quota_def }}</label>
- <div class="col-sm-10">
- <input type="number" class="form-control" name="defquota" value="{{ (result.def_quota_for_mbox / 1048576) }}">
- </div>
- </div>
- <div class="row mb-2">
- <label class="control-label col-sm-2" for="maxquota">{{ lang.edit.max_quota }}</label>
- <div class="col-sm-10">
- <input type="number" class="form-control" name="maxquota" value="{{ (result.max_quota_for_mbox / 1048576) }}">
- </div>
- </div>
- <div class="row mb-4">
- <label class="control-label col-sm-2" for="quota">{{ lang.edit.domain_quota }}</label>
- <div class="col-sm-10">
- <input type="number" class="form-control" name="quota" value="{{ (result.max_quota_for_domain / 1048576) }}">
- </div>
- </div>
- <div class="row mb-2">
- <label class="control-label col-sm-2">{{ lang.edit.backup_mx_options }}</label>
- <div class="col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="backupmx"{% if result.backupmx == '1' %} checked{% endif %}> {{ lang.edit.relay_domain }}</label>
- <br>
- <label><input type="checkbox" value="1" name="relay_all_recipients"{% if result.relay_all_recipients == '1' %} checked{% endif %}> {{ lang.edit.relay_all }}</label>
- <p>{{ lang.edit.relay_all_info|raw }}</p>
- <label><input type="checkbox" value="1" name="relay_unknown_only"{% if result.relay_unknown_only == '1' %} checked{% endif %}> {{ lang.edit.relay_unknown_only }}</label>
- <br>
- <p>{{ lang.edit.relay_transport_info|raw }}</p>
- <hr style="margin:25px 0px 0px 0px">
- </div>
- </div>
- </div>
- {% endif %}
- <div class="row">
- <div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="gal"{% if result.gal == '1' %} checked{% endif %}> {{ lang.edit.gal }}</label>
- <small class="text-muted">{{ lang.edit.gal_info|raw }}</small>
- </div>
- </div>
- </div>
- <hr>
- <div class="row mb-2">
- <div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if result.active == '1' %} checked{% endif %}{% if mailcow_cc_role != 'admin' %} disabled{% endif %}> {{ lang.edit.active }}</label>
- </div>
- </div>
- </div>
- <div class="row mb-2">
- <div class="offset-sm-2 col-sm-10">
- <button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="edit_selected" data-id="editdomain" data-item="{{ domain }}" data-api-url='edit/domain' data-api-attr='{}' href="#">{{ lang.admin.save }}</button>
- </div>
- </div>
- <div class="row">
- <div class="offset-sm-2 col-sm-10">
- <small class="fst-italic d-block">{{ lang.edit.created_on }}: {{ result.created }}</small>
- <small class="fst-italic d-block">{{ lang.edit.last_modified }}: {{ result.modified }}</small>
- </div>
- </div>
- </form>
- {% if dkim %}
- <hr>
- <div class="row">
- <div class="col-12 col-sm-2">
- <p>Domain: <strong>{{ result.domain_name }}</strong> ({{ dkim.dkim_selector }}._domainkey)</p>
- </div>
- <div class="col-12 col-sm-10">
- <pre class="p-2">{{ dkim.dkim_txt }}</pre>
- </div>
- </div>
- {% endif %}
- </div>
- <div id="dratelimit" class="tab-pane fade" role="tabpanel" aria-labelledby="domain-ratelimit">
- <form data-id="domratelimit" class="form-inline well" method="post">
- <div class="row">
- <div class="col-12">
- <label class="control-label mb-2">{{ lang.edit.ratelimit }}</label>
- <input name="rl_value" type="number" value="{{ rl.value }}" autocomplete="off" class="form-control mb-4" placeholder="{{ lang.ratelimit.disabled }}">
- <select name="rl_frame" class="form-control">
- {% include 'mailbox/rl-frame.twig' %}
- </select>
- <button data-acl="{{ acl.ratelimit }}" class="btn btn-xs-lg d-block d-sm-inline btn-secondary" data-action="edit_selected" data-id="domratelimit" data-item="{{ domain }}" data-api-url='edit/rl-domain' data-api-attr='{}' href="#">{{ lang.admin.save }}</button>
- </div>
- </div>
- </form>
- </div>
- <div id="dspamfilter" class="tab-pane fade" role="tabpanel" aria-labelledby="domain-spamfilter">
- <div class="row">
- <div class="col-sm-6">
- <h4>{{ lang.user.spamfilter_wl }}</h4>
- <p>{{ lang.user.spamfilter_wl_desc|raw }}</p>
- <form class="form-inline mb-4" data-id="add_wl_policy_domain">
- <div class="input-group" data-acl="{{ acl.spam_policy }}">
- <input type="text" class="form-control" name="object_from" placeholder="*@example.org" required>
- <span class="input-group-btn">
- <button class="btn btn-secondary" data-action="add_item" data-id="add_wl_policy_domain" data-api-url='add/domain-policy' data-api-attr='{"domain":"{{ domain }}","object_list":"wl"}' href="#">{{ lang.user.spamfilter_table_add }}</button>
- </span>
- </div>
- </form>
- <table id="wl_policy_domain_table" class="table table-striped dt-responsive w-100"></table>
- <div class="mass-actions-user">
- <div class="btn-group" data-acl="{{ acl.spam_policy }}">
- <a class="btn btn-xs-half d-block d-sm-inline btn-sm btn-secondary" id="toggle_multi_select_all" data-id="policy_wl_domain" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
- <a class="btn btn-xs-half d-block d-sm-inline btn-sm btn-danger" data-action="delete_selected" data-id="policy_wl_domain" data-api-url='delete/domain-policy' href="#">{{ lang.mailbox.remove }}</a>
- </div>
- </div>
- </div>
- <div class="col-sm-6">
- <h4>{{ lang.user.spamfilter_bl }}</h4>
- <p>{{ lang.user.spamfilter_bl_desc|raw }}</p>
- <form class="form-inline mb-4" data-id="add_bl_policy_domain">
- <div class="input-group" data-acl="{{ acl.spam_policy }}">
- <input type="text" class="form-control" name="object_from" placeholder="*@example.org" required>
- <span class="input-group-btn">
- <button class="btn btn-secondary" data-action="add_item" data-id="add_bl_policy_domain" data-api-url='add/domain-policy' data-api-attr='{"domain":"{{ domain }}","object_list":"bl"}' href="#">{{ lang.user.spamfilter_table_add }}</button>
- </span>
- </div>
- </form>
- <table id="bl_policy_domain_table" class="table table-striped dt-responsive w-100"></table>
- <div class="mass-actions-user">
- <div class="btn-group" data-acl="{{ acl.spam_policy }}">
- <a class="btn btn-xs-half d-block d-sm-inline btn-sm btn-secondary" id="toggle_multi_select_all" data-id="policy_bl_domain" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
- <a class="btn btn-xs-half d-block d-sm-inline btn-sm btn-danger" data-action="delete_selected" data-id="policy_bl_domain" data-api-url='delete/domain-policy' href="#">{{ lang.mailbox.remove }}</a></li>
- </div>
+ <div id="dfooter" class="tab-pane fade" role="tabpanel" aria-labelledby="domain-footer">
+ <div class="card mb-4">
+ <div class="card-header d-flex d-md-none fs-5">
+ <button class="btn flex-grow-1 text-start" data-bs-target="#collapse-tab-footer" data-bs-toggle="collapse" aria-controls="collapse-tab-footer">
+ {{ lang.edit.domain_footer }} <span class="badge bg-info table-lines"></span>
+ </button>
+ </div>
+ <div id="collapse-tab-footer" class="card-body collapse" data-bs-parent="#domain-content">
+ <div class="row">
+ <div class="col-sm-12">
+ <h4>{{ lang.edit.domain_footer }}</h4>
+ <p>{{ lang.edit.domain_footer_info|raw }}</p>
+ <pre>{{ lang.edit.domain_footer_info_vars.auth_user }}
+{{ lang.edit.domain_footer_info_vars.from_user }}
+{{ lang.edit.domain_footer_info_vars.from_name }}
+{{ lang.edit.domain_footer_info_vars.from_addr }}
+{{ lang.edit.domain_footer_info_vars.from_domain }}</pre>
+ <form class="form-horizontal mt-4" data-id="domain_footer">
+ <div class="row mb-2">
+ <label class="control-label col-sm-2" for="domain_footer_html">{{ lang.edit.domain_footer_html }}:</label>
+ <div class="col-sm-10">
+ <textarea spellcheck="false" autocorrect="off" autocapitalize="none" class="form-control" rows="10" id="domain_footer_html" name="footer_html">{{ domain_footer.html }}</textarea>
+ </div>
+ </div>
+ <div class="row mb-4">
+ <label class="control-label col-sm-2" for="domain_footer_plain">{{ lang.edit.domain_footer_plain }}:</label>
+ <div class="col-sm-10">
+ <textarea spellcheck="false" autocorrect="off" autocapitalize="none" class="form-control" rows="10" id="domain_footer_plain" name="footer_plain">{{ domain_footer.plain }}</textarea>
+ </div>
+ </div>
+ <div class="row">
+ <div class="offset-sm-2 col-sm-10">
+ <button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="edit_selected" data-id="domain_footer" data-item="domain_footer" data-api-url='edit/domain-wide-footer' data-api-attr='{"domain":"{{ domain }}"}' href="#">{{ lang.edit.save }}</button>
+ </div>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
</div>
</div>
</div>
- </div>
- <div id="dqwbcc" class="tab-pane fade" role="tabpanel" aria-labelledby="domain-qwbcc">
- <div class="row">
- <div class="col-sm-12">
- <h4>{{ lang.edit.quota_warning_bcc }}</h4>
- <p>{{ lang.edit.quota_warning_bcc_info|raw }}</p>
- <form class="form-horizontal" data-id="quota_bcc">
- <input type="hidden" value="0" name="active">
- <div class="row mb-2">
- <label class="control-label col-sm-2" for="script_data">{{ lang.edit.target_address|raw }}:</label>
- <div class="col-sm-10">
- <textarea spellcheck="false" autocorrect="off" autocapitalize="none" class="form-control" rows="10" id="bcc_rcpt" name="bcc_rcpt">{{ quota_notification_bcc.bcc_rcpts|join("\n") }}</textarea>
- </div>
- </div>
- <div class="row mb-4">
- <div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if quota_notification_bcc.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
- </div>
- </div>
- </div>
- <div class="row">
- <div class="offset-sm-2 col-sm-10">
- <button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="edit_selected" data-id="quota_bcc" data-item="quota_bcc" data-api-url='edit/quota_notification_bcc' data-api-attr='{"domain":"{{ domain }}"}' href="#">{{ lang.edit.save }}</button>
- </div>
- </div>
- </form>
- </div>
- </div>
- </div>
</div>
{% else %}
{{ parent() }}
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit/domainadmin.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit/domainadmin.twig
index d241fa5..2c40faa 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit/domainadmin.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit/domainadmin.twig
@@ -40,15 +40,15 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="disable_tfa"> {{ lang.tfa.disable_tfa }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="disable_tfa"> {{ lang.tfa.disable_tfa }}</label>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit/filter.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit/filter.twig
index ff4ac4e..124ecaf 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit/filter.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit/filter.twig
@@ -28,8 +28,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit/mailbox-templates.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit/mailbox-templates.twig
index fea99bd..f606bd4 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit/mailbox-templates.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit/mailbox-templates.twig
@@ -9,8 +9,8 @@
<input type="hidden" value="default" name="sender_acl">
<input type="hidden" value="0" name="force_pw_update">
<input type="hidden" value="0" name="sogo_access">
- <input type="hidden" value="0" name="protocol_access">
-
+ <input type="hidden" value="0" name="protocol_access">
+
<div class="row mb-4">
<label class="control-label col-sm-2" for="template">{{ lang.mailbox.template }}</label>
<div class="col-sm-10">
@@ -41,16 +41,16 @@
<div class="col-sm-10">
<div class="btn-group">
<input type="radio" class="btn-check" name="quarantine_notification" id="quarantine_notification_never" autocomplete="off" value="never" {% if template.attributes.quarantine_notification == 'never' %}checked{% endif %}>
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="quarantine_notification_never">{{ lang.user.never }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_notification_never">{{ lang.user.never }}</label>
<input type="radio" class="btn-check" name="quarantine_notification" id="quarantine_notification_hourly" autocomplete="off" value="hourly" {% if template.attributes.quarantine_notification == 'hourly' %}checked{% endif %}>
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="quarantine_notification_hourly">{{ lang.user.hourly }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_notification_hourly">{{ lang.user.hourly }}</label>
<input type="radio" class="btn-check" name="quarantine_notification" id="quarantine_notification_daily" autocomplete="off" value="daily" {% if template.attributes.quarantine_notification == 'daily' %}checked{% endif %}>
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="quarantine_notification_daily">{{ lang.user.daily }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_notification_daily">{{ lang.user.daily }}</label>
<input type="radio" class="btn-check" name="quarantine_notification" id="quarantine_notification_weekly" autocomplete="off" value="weekly" {% if template.attributes.quarantine_notification == 'weekly' %}checked{% endif %}>
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="quarantine_notification_weekly">{{ lang.user.weekly }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_notification_weekly">{{ lang.user.weekly }}</label>
</div>
<p class="text-muted"><small>{{ lang.user.quarantine_notification_info }}</small></p>
</div>
@@ -60,13 +60,13 @@
<div class="col-sm-10">
<div class="btn-group">
<input type="radio" class="btn-check" name="quarantine_category" id="quarantine_category_reject" autocomplete="off" value="reject" {% if template.attributes.quarantine_category == 'reject' %}checked{% endif %}>
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="quarantine_category_reject">{{ lang.user.q_reject }}</label>
-
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_category_reject">{{ lang.user.q_reject }}</label>
+
<input type="radio" class="btn-check" name="quarantine_category" id="quarantine_category_add_header" autocomplete="off" value="add_header" {% if template.attributes.quarantine_category == 'add_header' %}checked{% endif %}>
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="quarantine_category_add_header">{{ lang.user.q_add_header }}</label>
-
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_category_add_header">{{ lang.user.q_add_header }}</label>
+
<input type="radio" class="btn-check" name="quarantine_category" id="quarantine_category_all" autocomplete="off" value="all" {% if template.attributes.quarantine_category == 'all' %}checked{% endif %}>
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="quarantine_category_all">{{ lang.user.q_all }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_category_all">{{ lang.user.q_all }}</label>
</div>
<p class="text-muted"><small>{{ lang.user.quarantine_category_info }}</small></p>
</div>
@@ -76,10 +76,10 @@
<div class="col-sm-10">
<div class="btn-group">
<input type="checkbox" class="btn-check" name="tls_enforce_in" id="tls_enforce_in" autocomplete="off" value="1" {% if template.attributes.tls_enforce_in == '1' %}checked{% endif %}>
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="tls_enforce_in">{{ lang.user.tls_enforce_in }}</label>
-
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="tls_enforce_in">{{ lang.user.tls_enforce_in }}</label>
+
<input type="checkbox" class="btn-check" name="tls_enforce_out" id="tls_enforce_out" autocomplete="off" value="1" {% if template.attributes.tls_enforce_out == '1' %}checked{% endif %}>
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="tls_enforce_out">{{ lang.user.tls_enforce_out }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="tls_enforce_out">{{ lang.user.tls_enforce_out }}</label>
</div>
</div>
</div>
@@ -97,7 +97,7 @@
<div class="row mb-4">
<label class="control-label col-sm-2">ACL</label>
<div class="col-sm-10">
- <select id="template_user_acl" name="acl" size="10" multiple class="form-control">
+ <select id="template_user_acl" name="acl" size="10" multiple class="form-control">
<option value="spam_alias" {% if template.attributes.acl_spam_alias == '1' %} selected{% endif %}>{{ lang.acl["spam_alias"] }}</option>
<option value="tls_policy" {% if template.attributes.acl_tls_policy == '1' %} selected{% endif %}>{{ lang.acl["tls_policy"] }}</option>
<option value="spam_score" {% if template.attributes.acl_spam_score == '1' %} selected{% endif %}>{{ lang.acl["spam_score"] }}</option>
@@ -118,14 +118,13 @@
<div class="row mb-4">
<label class="control-label col-sm-2">{{ lang.acl.ratelimit }}</label>
<div class="col-sm-10">
- <input name="rl_value" type="number" autocomplete="off" value="{{ template.attributes.rl_value }}" class="form-control mb-2" placeholder="{{ lang.ratelimit.disabled }}">
- <select name="rl_frame" class="form-control">
- <option value="s"{% if template.attributes.rl_frame == 's' %} selected{% endif %}>{{ lang.ratelimit.second }}</option>
- <option value="m"{% if template.attributes.rl_frame == 'm' %} selected{% endif %}>{{ lang.ratelimit.minute }}</option>
- <option value="h"{% if template.attributes.rl_frame == 'h' %} selected{% endif %}>{{ lang.ratelimit.hour }}</option>
- <option value="d"{% if template.attributes.rl_frame == 'd' %} selected{% endif %}>{{ lang.ratelimit.day }}</option>
- </select>
- <p class="text-muted mt-3">{{ lang.edit.mbox_rl_info }}</p>
+ <div class="input-group">
+ <input name="rl_value" type="number" autocomplete="off" value="{{ template.attributes.rl_value }}" class="form-control mb-2" placeholder="{{ lang.ratelimit.disabled }}">
+ <select name="rl_frame" class="form-control">
+ {% include 'mailbox/rl-frame.twig' %}
+ </select>
+ </div>
+ <p class="text-muted mt-1">{{ lang.edit.mbox_rl_info }}</p>
</div>
</div>
<hr>
@@ -140,8 +139,8 @@
</div>
<div class="row">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="force_pw_update"{% if template.attributes.force_pw_update == '1' %} checked{% endif %}> {{ lang.edit.force_pw_update }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="force_pw_update"{% if template.attributes.force_pw_update == '1' %} checked{% endif %}> {{ lang.edit.force_pw_update }}</label>
<small class="text-muted">{{ lang.edit.force_pw_update_info|format(ui_texts.main_name) }}</small>
</div>
</div>
@@ -149,8 +148,8 @@
{% if not skip_sogo %}
<div class="row">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="sogo_access"{% if template.attributes.sogo_access == '1' %} checked{% endif %}> {{ lang.edit.sogo_access }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="sogo_access"{% if template.attributes.sogo_access == '1' %} checked{% endif %}> {{ lang.edit.sogo_access }}</label>
<small class="text-muted">{{ lang.edit.sogo_access_info }}</small>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit/mailbox.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit/mailbox.twig
index 289638d..0725045 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit/mailbox.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit/mailbox.twig
@@ -2,397 +2,443 @@
{% block inner_content %}
{% if result %}
-<ul class="nav nav-tabs" role="tablist">
- <li role="presentation" class="nav-item"><button class="nav-link active" data-bs-toggle="tab" data-bs-target="#medit">{{ lang.edit.mailbox }}</button></li>
- <li role="presentation" class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#mpushover">{{ lang.edit.pushover }}</button></li>
- <li role="presentation" class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#macl">{{ lang.edit.acl }}</button></li>
- <li role="presentation" class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#mrl">{{ lang.edit.ratelimit }}</button></li>
-</ul>
-<hr>
-<div class="tab-content">
- <div id="medit" class="tab-pane fade show active" role="tabpanel" aria-labelledby="mailbox-edit">
- <form class="form-horizontal" data-id="editmailbox" role="form" method="post">
- <input type="hidden" value="default" name="sender_acl">
- <input type="hidden" value="0" name="force_pw_update">
- <input type="hidden" value="0" name="sogo_access">
- <input type="hidden" value="0" name="protocol_access">
- <div class="row mb-2">
- <label class="control-label col-sm-2" for="name">{{ lang.edit.full_name }}</label>
- <div class="col-sm-10">
- <input type="text" class="form-control" name="name" value="{{ result.name }}">
- </div>
- </div>
- <div class="row mb-4">
- <label class="control-label col-sm-2">{{ lang.add.tags }}</label>
- <div class="col-sm-10">
- <div class="form-control tag-box">
- {% for tag in mailbox_details.tags %}
- <span data-action='delete_selected' data-item="{{ tag }}" data-id="mailbox_tag_{{ tag }}" data-api-url='delete/mailbox/tag/{{ mailbox }}' class="badge bg-primary tag-badge btn-badge">
- <i class="bi bi-tag-fill"></i>
- {{ tag }}
- </span>
- {% endfor %}
- <input type="text" class="tag-input">
- <span class="btn tag-add"><i class="bi bi-plus-lg"></i></span>
- <input type="hidden" value="" name="tags" class="tag-values" />
- </div>
- </div>
- </div>
- <div class="row mb-2">
- <label class="control-label col-sm-2" for="quota">{{ lang.edit.quota_mb }}
- <br><span id="quotaBadge" class="badge bg-info">max. {{ (result.max_new_quota / 1048576) }} MiB</span>
- </label>
- <div class="col-sm-10">
- <input type="number" name="quota" style="width:100%" min="0" max="{{ (result.max_new_quota / 1048576) }}" value="{{ (result.quota / 1048576) }}" class="form-control">
- <small class="text-muted">0 = ∞</small>
- </div>
- </div>
- <div class="row mb-2">
- <label class="control-label col-sm-2" for="sender_acl">{{ lang.edit.sender_acl }}</label>
- <div class="col-sm-10">
- <select data-live-search="true" data-width="100%" style="width:100%" id="editSelectSenderACL" name="sender_acl" size="10" multiple>
- {% for domain in sender_acl_handles.sender_acl_domains.ro %}
- <option data-subtext="Admin" value="{{ domain }}" disabled selected>
- {{ lang.edit.dont_check_sender_acl|format(domain) }}
- </option>
- {% endfor %}
- {% for alias in sender_acl_handles.sender_acl_addresses.ro %}
- <option data-subtext="Admin" disabled selected>
- {{ alias }}
- </option>
- {% endfor %}
- {% for alias in sender_acl_handles.fixed_sender_aliases %}
- <option data-subtext="Alias" disabled selected>{{ alias }}</option>
- {% endfor %}
- {% for domain in sender_acl_handles.sender_acl_domains.rw %}
- <option value="{{ domain }}" selected>
- {{ lang.edit.dont_check_sender_acl|format(domain) }}
- </option>
- {% endfor %}
- {% for domain in sender_acl_handles.sender_acl_domains.selectable %}
- <option value="{{ domain }}">
- {{ lang.edit.dont_check_sender_acl|format(domain) }}
- </option>
- {% endfor %}
- {% for address in sender_acl_handles.sender_acl_addresses.rw %}
- <option selected>{{ address }}</option>
- {% endfor %}
- {% for address in sender_acl_handles.sender_acl_addresses.selectable %}
- <option>{{ address }}</option>
- {% endfor %}
- </select>
- <div id="sender_acl_disabled"><i class="bi bi-shield-exclamation"></i> {{ lang.edit.sender_acl_disabled|raw }}</div>
- <small class="text-muted d-block">{{ lang.edit.sender_acl_info|raw }}</small>
- </div>
- </div>
- <div class="row mb-2">
- <label class="control-label col-sm-2" for="relayhost">{{ lang.edit.relayhost }}</label>
- <div class="col-sm-10">
- <select data-acl="{{ acl.mailbox_relayhost }}" data-live-search="true" id="relayhost" name="relayhost" class="form-control mb-4">
- {% for rlyhost in rlyhosts %}
- <option
- style="{% if rlyhost.active != '1' %}background: #ff4136; color: #fff{% endif %}"
- {% if result.attributes.relayhost == rlyhost.id %} selected{% endif %}
- value="{{ rlyhost.id }}">
- ID {{ rlyhost.id }}: {{ rlyhost.hostname }} ({{ rlyhost.username }})
- </option>
- {% endfor %}
- <option value=""{% if not result.attributes.relayhost %} selected{% endif %}>
- {{ lang.edit.none_inherit }}
- </option>
- </select>
- <p class="d-block d-sm-none" style="margin: 0;padding: 0"> </p>
- <small class="text-muted d-block">{{ lang.edit.mailbox_relayhost_info }}</small>
- </div>
- </div>
- <div class="row mb-2">
- <label class="control-label col-sm-2">{{ lang.user.quarantine_notification }}</label>
- <div class="col-sm-10">
- <div class="btn-group" data-acl="{{ acl.quarantine_notification }}">
- <button type="button" class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary{% if quarantine_notification == 'never' %} active{% endif %}"
- data-action="edit_selected"
- data-item="{{ mailbox }}"
- data-id="quarantine_notification"
- data-api-url='edit/quarantine_notification'
- data-api-attr='{"quarantine_notification":"never"}'>{{ lang.user.never }}</button>
- <button type="button" class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary{% if quarantine_notification == 'hourly' %} active{% endif %}"
- data-action="edit_selected"
- data-item="{{ mailbox }}"
- data-id="quarantine_notification"
- data-api-url='edit/quarantine_notification'
- data-api-attr='{"quarantine_notification":"hourly"}'>{{ lang.user.hourly }}</button>
- <button type="button" class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary{% if quarantine_notification == 'daily' %} active{% endif %}"
- data-action="edit_selected"
- data-item="{{ mailbox }}"
- data-id="quarantine_notification"
- data-api-url='edit/quarantine_notification'
- data-api-attr='{"quarantine_notification":"daily"}'>{{ lang.user.daily }}</button>
- <button type="button" class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary{% if quarantine_notification == 'weekly' %} active{% endif %}"
- data-action="edit_selected"
- data-item="{{ mailbox }}"
- data-id="quarantine_notification"
- data-api-url='edit/quarantine_notification'
- data-api-attr='{"quarantine_notification":"weekly"}'>{{ lang.user.weekly }}</button>
- </div>
- <p class="text-muted"><small>{{ lang.user.quarantine_notification_info }}</small></p>
- </div>
- </div>
- <div class="row mb-2">
- <label class="control-label col-sm-2">{{ lang.user.quarantine_category }}</label>
- <div class="col-sm-10">
- <div class="btn-group" data-acl="{{ acl.quarantine_category }}">
- <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline btn-secondary{% if quarantine_category == 'reject' %} active{% endif %}"
- data-action="edit_selected"
- data-item="{{ mailbox }}"
- data-id="quarantine_category"
- data-api-url='edit/quarantine_category'
- data-api-attr='{"quarantine_category":"reject"}'>{{ lang.user.q_reject }}</button>
- <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline btn-secondary{% if quarantine_category == 'add_header' %} active{% endif %}"
- data-action="edit_selected"
- data-item="{{ mailbox }}"
- data-id="quarantine_category"
- data-api-url='edit/quarantine_category'
- data-api-attr='{"quarantine_category":"add_header"}'>{{ lang.user.q_add_header }}</button>
- <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline btn-secondary{% if quarantine_category == 'all' %} active{% endif %}"
- data-action="edit_selected"
- data-item="{{ mailbox }}"
- data-id="quarantine_category"
- data-api-url='edit/quarantine_category'
- data-api-attr='{"quarantine_category":"all"}'>{{ lang.user.q_all }}</button>
- </div>
- <p class="text-muted"><small>{{ lang.user.quarantine_category_info }}</small></p>
- </div>
- </div>
- <div class="row mb-4">
- <label class="control-label col-sm-2" for="sender_acl">{{ lang.user.tls_policy }}</label>
- <div class="col-sm-10">
- <div class="btn-group" data-acl="{{ acl.tls_policy }}">
- <button type="button" class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary{% if get_tls_policy.tls_enforce_in == '1' %} active"{% endif %}"
- data-action="edit_selected"
- data-item="{{ mailbox }}"
- data-id="tls_policy"
- data-api-url='edit/tls_policy'
- data-api-attr='{"tls_enforce_in": {% if get_tls_policy.tls_enforce_in == '1' %}0{% else %}1{% endif %} }'>{{ lang.user.tls_enforce_in }}</button>
- <button type="button" class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary{% if get_tls_policy.tls_enforce_out == '1' %} active"{% endif %}"
- data-action="edit_selected"
- data-item="{{ mailbox }}"
- data-id="tls_policy"
- data-api-url='edit/tls_policy'
- data-api-attr='{"tls_enforce_out": {% if get_tls_policy.tls_enforce_out == '1' %}0{% else %}1{% endif %} }'>{{ lang.user.tls_enforce_out }}</button>
- </div>
- </div>
- </div>
- <div class="row">
- <label class="control-label col-sm-2" for="password">{{ lang.edit.password }} (<a href="#" class="generate_password">{{ lang.edit.generate }}</a>)</label>
- <div class="col-sm-10">
- <input type="password" data-pwgen-field="true" data-hibp="true" class="form-control" name="password" placeholder="{{ lang.edit.unchanged_if_empty }}" autocomplete="new-password">
- </div>
- </div>
- <div class="row mb-4">
- <label class="control-label col-sm-2" for="password2">{{ lang.edit.password_repeat }}</label>
- <div class="col-sm-10">
- <input type="password" data-pwgen-field="true" class="form-control" name="password2" autocomplete="new-password">
- </div>
- </div>
- <div data-acl="{{ acl.extend_sender_acl }}" class="row mb-4">
- <label class="control-label col-sm-2" for="extended_sender_acl">{{ lang.edit.extended_sender_acl }}</label>
- <div class="col-sm-10">
- {% if sender_acl_handles.external_sender_aliases %}
- {% set ext_sender_acl = sender_acl_handles.external_sender_aliases|join(', ') %}
- {% endif %}
- <input type="text" class="form-control" name="extended_sender_acl" value="{{ ext_sender_acl }}" placeholder="user1@example.com, user2@example.org, @example.com, ...">
- <small class="text-muted">{{ lang.edit.extended_sender_acl_info|raw }}</small>
- </div>
- </div>
- <div class="row">
- <label class="control-label col-sm-2" for="protocol_access">{{ lang.edit.allowed_protocols }}</label>
- <div class="col-sm-10">
- <select data-acl="{{ acl.protocol_access }}" name="protocol_access" multiple class="form-control">
- <option value="imap"{% if result.attributes.imap_access == '1' %} selected{% endif %}>IMAP</option>
- <option value="pop3"{% if result.attributes.pop3_access == '1' %} selected{% endif %}>POP3</option>
- <option value="smtp"{% if result.attributes.smtp_access == '1' %} selected{% endif %}>SMTP</option>
- <option value="sieve"{% if result.attributes.sieve_access == '1' %} selected{% endif %}>Sieve</option>
- </select>
- </div>
- </div>
- <div hidden data-acl="{{ acl.smtp_ip_access }}" class="row">
- <label class="control-label col-sm-2" for="allow_from_smtp">{{ lang.edit.allow_from_smtp }}</label>
- <div class="col-sm-10">
- <input type="text" class="form-control" name="allow_from_smtp" value="{{ allow_from_smtp }}" placeholder="1.1.1.1, 10.2.0.0/24, ...">
- <small class="text-muted">{{ lang.edit.allow_from_smtp_info }}</small>
- </div>
- </div>
- <hr>
- <div class="row">
- <div class="offset-sm-2 col-sm-10">
- <select name="active" class="form-control">
- <option value="1"{% if result.active == '1' %} selected{% endif %}>{{ lang.edit.active }}</option>
- <option value="2"{% if result.active == '2' %} selected{% endif %}>{{ lang.edit.disable_login }}</option>
- <option value="0"{% if result.active == '0' %} selected{% endif %}>{{ lang.edit.inactive }}</option>
- </select>
- </div>
- </div>
- <div class="row">
- <div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="force_pw_update"{% if result.attributes.force_pw_update == '1' %} checked{% endif %}> {{ lang.edit.force_pw_update }}</label>
- <small class="text-muted">{{ lang.edit.force_pw_update_info|format(ui_texts.main_name) }}</small>
- </div>
- </div>
- </div>
- {% if not skip_sogo %}
- <div data-acl="{{ acl.sogo_access }}" class="row">
- <div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="sogo_access"{% if result.attributes.sogo_access == '1' %} checked{% endif %}> {{ lang.edit.sogo_access }}</label>
- <small class="text-muted">{{ lang.edit.sogo_access_info }}</small>
- </div>
- </div>
- </div>
- {% endif %}
- <div class="row mb-2">
- <div class="offset-sm-2 col-sm-10">
- <button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="edit_selected" data-id="editmailbox" data-item="{{ result.username }}" data-api-url='edit/mailbox' data-api-attr='{}' href="#">{{ lang.edit.save }}</button>
- </div>
- </div>
- <div class="row">
- <div class="offset-sm-2 col-sm-10">
- <small class="fst-italic d-block">{{ lang.edit.created_on }}: {{ result.created }}</small>
- <small class="fst-italic d-block">{{ lang.edit.last_modified }}: {{ result.modified }}</small>
- </div>
- </div>
- </form>
- </div>
- <div id="mpushover" class="tab-pane fade" role="tabpanel" aria-labelledby="mailbox-pushover">
- <form data-id="pushover" class="form well" method="post">
- <input type="hidden" value="0" name="evaluate_x_prio">
- <input type="hidden" value="0" name="only_x_prio">
- <input type="hidden" value="0" name="active">
- <div class="row">
- <div class="col-sm-1">
- <p class="text-muted"><a href="https://pushover.net" target="_blank"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAACglBMVEUAAAAAAAEAAAAilecFGigAAAAAAAAAAAAAAAANj+c3n+Ypm+oeYI4KWI4MieAtkdQbleoJcLcjmeswmN4Rit4KgdMKUYQJKUAQSnILL0kMNlMSTngimOoNPF0hlOQBBgkNOlkRS3MHIjUhk+IPf8wKLUYsjM0AAAASTngAAAAAAAAPfckbdLIbdrYUWIgegsgce70knfEAAAAknfENOVkGHi8YaaIjnvEdgMUhkuAQSG8aca0hleQUh9YLjOM4nOEMgtMcbaYWa6YemO02ltkKhNktgLodYZEPXJEyi8kKesktfLUzj84cWYMiluckZ5YJXJYeW4Y0k9YKfs4yjs0pc6YHZaUviskLfMkqmugak+cqkNcViNcqeK4Iaq4XRmYGPmYMKDsFJTstgr0LdL0ti84CCQ4BCQ4Qgc8rlt8XjN8shcQsi8wZSGgEP2cRMEUDKkUAAAD///8dmvEamfExo/EXmPEWl/ERlvElnvEsofEjnfETl/Enn/Ezo/E4pvEvovEfm/E1pPEzpPEvofEOlfEpoPEamPEQlfEYmfE6p/EgnPEVlvEroPE3pfE2pfENk/Ern/E3pPEcmfEfmvEnnvBlufT6/P0soPAknPDd7/zs9vzo9PxBqfItofAqoPD9/f3B4/q43/mx2/l/xfZ6w/Vxv/VtvfVgt/RXtPNTsfNEq/L3+/31+v3a7fvR6vvH5fqs2vmc0/jx+P3v9/3h8fzW7PvV7PvL5/q13fmo1/mh1PiY0fiNy/aHyfZ2wfVou/Vdt/RPsPM3oeoQkuowmeAgjdgcgMQbeLrw9/3k8vy74Pm63/mX0PdYtfNNr/Ikm+4wnOchkuAVjOAfdrMVcrOdoJikAAAAcnRSTlMAIQ8IzzweFwf+/fvw8P79+/Xt7e3p6eji4d7U08y8qZyTiIWDgn53bWxqaWBKQ0JBOjUwMCkoJCEfHBkT/vz8/Pv7+vr69/b29PTy7ezm5ubm5N7e29vQ0M/Pv7+4uLW1pqaWloWDg3x7e21mUVFFRUXdPracAAAEbElEQVRIx4WUZbvaQBCFF+ru7u7u7u7u7t4mvVwSoBC0JIUCLRQolLq7u7vr/+nMLkmQyvlwyfPcd86e3ZldUqwyQ/p329J+XfutPQYOLUP+q55rFtQJRvY79+xxlZTUWbKpz7/xrrMr2+3BoNPpdLn2lJQ4HEeqLOr1d7z7XNkesQed4A848G63Oy4Gmg/6Mz542QvZbqe8C/Ig73CLYiYTrtLmT3zfqbIcAR7y4wIqH/B6M9Fo0+Ldb6sM9ph/v4ozPuz12mxRofaAAr7jCNkuoz/jNf9AGHibkBCm51fsGKvxsAGWx4H+jBcEi6V2birDpCL/9Klrd1KHbiSvPWP8V0tTnTfO03iXi57P6WNHOVUf44IFdFDRz6pV5fw8Zy5z3JVH5+R48OwxqDiGvKJIY9R+9JsCuJ5HPg74OVEMpz+nbdEPUHEWeEk6IDUnTC1l5r+f8uffc0cfxc8fS17kLso24SwUPFDA/6DE82xKDOPliJ7n/GGOOyWK9zD9CdjvOfg9Dv6AH+AX04LW9gj2i8W/APx1UbxwCAu+wPmcpgUKL/EHdvtq4uwaZwCuznPJVY5LHhED15G/isd5Hz4eKui/e/du02YoKFeD5mHzHIN/nxEDe25gQQwKorAid04CfyzwL4XutXvl1Pt1guMOwwKPkU8mYIFT8JHK+vv8prpDScUVL+j8s3lOctw1GIhbWHAS+HgKPk7xPM/4UtNAYmzizJkf6NgTb/gM8jePQLsewMdthS3g95tMpT1IhVm6v1s8fYmLeb13Odwp8Fh5KY048y/d14WUrwrb1e/X/rNp73nkD8kWS+wi/MZ4XuetG4mhKubJm3/WNEvi8SHwB56nPKjUam0LBdp9ARwupFemTYudvgN/L1+A/Ko/LGBuS8pPy+YR1fuCTWNKnUyoeUyYx2o2dyEVGmr5xTD42xzvkD16+Pb9WIIH6fmt1r3mbsTY7Bvw+n23naT8BUWh86bz6G/e259UXPUK3gfAxQDlo7Rpx3Geqb2e3wp83SGEdKpB7zvwYbzvT2n65xLwbH6YP+M9C8vA8E1wxLU8gkCbdhXGUyrMgwVrcbzLHonr78lzDvWM3q/C/HtDlXoSUIe3YkblhRPIX4E8Oo/9siLv8dRjV7SBlkdgTXvKS7nzsA/9AfeEuhKq9T8zWIDv1Sd6ETAP4D6/H/1V+1BojvruNa4SZXz4JhY84dV5MOF5agUvu5OsOo+KRpG30KalEnoeDccFlutPZYs38D5n3zcpr1/0fBhfb3DOY1z2tSAgLxWezz6zuoHhfUmOejf6blHQH/sFuJYfcMZX307ytKvRa3ifoV/586P5j+tICtS77BuJxzxYAPZsntX8k3eSIhlajK4p8b7iefCEKs03kD/I2LnxL9ovH+43y4fAv1YrI/mzDBsavAX/UppfzVOrZT/ydxk6lJ047MfLfVbcb6hS9ZEzWxekKQ5WrtPqZg3rV6tWrX6Tle3KQZj/q6KxQnmDoXwFY0VSrN9e8FRXBCTAvwAAAABJRU5ErkJggg==" class="img img-fluid"></a></p>
- </div>
- <div class="col-sm-10">
- <p class="text-muted">{{ lang.user.pushover_info|format(mailbox)|raw }}</p>
- <p class="text-muted">{{ lang.edit.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code>, <code>{SENDER_ADDRESS}</code>, <code>{SENDER_NAME}</code>, <code>{TO_NAME}</code>, <code>{TO_ADDRESS}</code>, <code>{MSG_ID}</code></p>
- <div class="row">
- <div class="col-sm-6 mb-2">
- <label for="token">API Token/Key (Application)</label>
- <input type="text" class="form-control" name="token" maxlength="30" value="{{ pushover_data.token }}" required>
+<div id="mailbox-content" class="responsive-tabs">
+ <ul class="nav nav-tabs" role="tablist">
+ <li role="presentation" class="nav-item"><button class="nav-link active" data-bs-toggle="tab" data-bs-target="#medit">{{ lang.edit.mailbox }}</button></li>
+ <li role="presentation" class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#mpushover">{{ lang.edit.pushover }}</button></li>
+ <li role="presentation" class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#macl">{{ lang.edit.acl }}</button></li>
+ <li role="presentation" class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#mrl">{{ lang.edit.ratelimit }}</button></li>
+ </ul>
+ <hr class="d-none d-md-block">
+ <div class="tab-content">
+ <div id="medit" class="tab-pane fade show active" role="tabpanel" aria-labelledby="mailbox-edit">
+ <div class="card mb-4">
+ <div class="card-header d-flex d-md-none fs-5">
+ <button class="btn flex-grow-1 text-start" data-bs-target="#collapse-tab-medit" data-bs-toggle="collapse" aria-controls="collapse-tab-medit">
+ {{ lang.edit.mailbox }} <span class="badge bg-info table-lines"></span>
+ </button>
</div>
- <div class="col-sm-6 mb-2">
- <label for="key">User/Group Key</label>
- <input type="text" class="form-control" name="key" maxlength="30" value="{{ pushover_data.key }}" required>
+ <div id="collapse-tab-medit" class="card-body collapse show" data-bs-parent="#mailbox-content">
+ <form class="form-horizontal" data-id="editmailbox" role="form" method="post">
+ <input type="hidden" value="default" name="sender_acl">
+ <input type="hidden" value="0" name="force_pw_update">
+ <input type="hidden" value="0" name="sogo_access">
+ <input type="hidden" value="0" name="protocol_access">
+ <div class="row mb-2">
+ <label class="control-label col-sm-2" for="name">{{ lang.edit.full_name }}</label>
+ <div class="col-sm-10">
+ <input type="text" class="form-control" name="name" value="{{ result.name }}">
+ </div>
+ </div>
+ <div class="row mb-4">
+ <label class="control-label col-sm-2">{{ lang.add.tags }}</label>
+ <div class="col-sm-10">
+ <div class="form-control tag-box">
+ {% for tag in mailbox_details.tags %}
+ <span data-action='delete_selected' data-item="{{ tag }}" data-id="mailbox_tag_{{ tag }}" data-api-url='delete/mailbox/tag/{{ mailbox }}' class="badge bg-primary tag-badge btn-badge">
+ <i class="bi bi-tag-fill"></i>
+ {{ tag }}
+ </span>
+ {% endfor %}
+ <input type="text" class="tag-input">
+ <span class="btn tag-add"><i class="bi bi-plus-lg"></i></span>
+ <input type="hidden" value="" name="tags" class="tag-values" />
+ </div>
+ </div>
+ </div>
+ <div class="row mb-2">
+ <label class="control-label col-sm-2" for="quota">{{ lang.edit.quota_mb }}
+ <br><span id="quotaBadge" class="badge bg-info">max. {{ (result.max_new_quota / 1048576) }} MiB</span>
+ </label>
+ <div class="col-sm-10">
+ <input type="number" name="quota" style="width:100%" min="0" max="{{ (result.max_new_quota / 1048576) }}" value="{{ (result.quota / 1048576) }}" class="form-control">
+ <small class="text-muted">0 = ∞</small>
+ </div>
+ </div>
+ <div class="row mb-2">
+ <label class="control-label col-sm-2" for="sender_acl">{{ lang.edit.sender_acl }}</label>
+ <div class="col-sm-10">
+ <select data-live-search="true" data-width="100%" style="width:100%" id="editSelectSenderACL" name="sender_acl" size="10" multiple>
+ {% for domain in sender_acl_handles.sender_acl_domains.ro %}
+ <option data-subtext="Admin" value="{{ domain }}" disabled selected>
+ {{ lang.edit.dont_check_sender_acl|format(domain) }}
+ </option>
+ {% endfor %}
+ {% for alias in sender_acl_handles.sender_acl_addresses.ro %}
+ <option data-subtext="Admin" disabled selected>
+ {{ alias }}
+ </option>
+ {% endfor %}
+ {% for alias in sender_acl_handles.fixed_sender_aliases %}
+ <option data-subtext="Alias" disabled selected>{{ alias }}</option>
+ {% endfor %}
+ {% for domain in sender_acl_handles.sender_acl_domains.rw %}
+ <option value="{{ domain }}" selected>
+ {{ lang.edit.dont_check_sender_acl|format(domain) }}
+ </option>
+ {% endfor %}
+ {% for domain in sender_acl_handles.sender_acl_domains.selectable %}
+ <option value="{{ domain }}">
+ {{ lang.edit.dont_check_sender_acl|format(domain) }}
+ </option>
+ {% endfor %}
+ {% for address in sender_acl_handles.sender_acl_addresses.rw %}
+ <option selected>{{ address }}</option>
+ {% endfor %}
+ {% for address in sender_acl_handles.sender_acl_addresses.selectable %}
+ <option>{{ address }}</option>
+ {% endfor %}
+ </select>
+ <div id="sender_acl_disabled"><i class="bi bi-shield-exclamation"></i> {{ lang.edit.sender_acl_disabled|raw }}</div>
+ <small class="text-muted d-block">{{ lang.edit.sender_acl_info|raw }}</small>
+ </div>
+ </div>
+ <div class="row mb-2">
+ <label class="control-label col-sm-2" for="relayhost">{{ lang.edit.relayhost }}</label>
+ <div class="col-sm-10">
+ <select data-acl="{{ acl.mailbox_relayhost }}" data-live-search="true" id="relayhost" name="relayhost" class="form-control mb-4">
+ {% for rlyhost in rlyhosts %}
+ <option
+ style="{% if rlyhost.active != '1' %}background: #ff4136; color: #fff{% endif %}"
+ {% if result.attributes.relayhost == rlyhost.id %} selected{% endif %}
+ value="{{ rlyhost.id }}">
+ ID {{ rlyhost.id }}: {{ rlyhost.hostname }} ({{ rlyhost.username }})
+ </option>
+ {% endfor %}
+ <option value=""{% if not result.attributes.relayhost %} selected{% endif %}>
+ {{ lang.edit.none_inherit }}
+ </option>
+ </select>
+ <p class="d-block d-sm-none" style="margin: 0;padding: 0"> </p>
+ <small class="text-muted d-block">{{ lang.edit.mailbox_relayhost_info }}</small>
+ </div>
+ </div>
+ <div class="row mb-2">
+ <label class="control-label col-sm-2">{{ lang.user.quarantine_notification }}</label>
+ <div class="col-sm-10">
+ <div class="btn-group" data-acl="{{ acl.quarantine_notification }}">
+ <button type="button" class="btn btn-sm btn-xs-quart d-block d-sm-inline{% if quarantine_notification == 'never' %} btn-dark{% else %} btn-light{% endif %}"
+ data-action="edit_selected"
+ data-item="{{ mailbox }}"
+ data-id="quarantine_notification"
+ data-api-url='edit/quarantine_notification'
+ data-api-attr='{"quarantine_notification":"never"}'>{{ lang.user.never }}</button>
+ <button type="button" class="btn btn-sm btn-xs-quart d-block d-sm-inline{% if quarantine_notification == 'hourly' %} btn-dark{% else %} btn-light{% endif %}"
+ data-action="edit_selected"
+ data-item="{{ mailbox }}"
+ data-id="quarantine_notification"
+ data-api-url='edit/quarantine_notification'
+ data-api-attr='{"quarantine_notification":"hourly"}'>{{ lang.user.hourly }}</button>
+ <button type="button" class="btn btn-sm btn-xs-quart d-block d-sm-inline{% if quarantine_notification == 'daily' %} btn-dark{% else %} btn-light{% endif %}"
+ data-action="edit_selected"
+ data-item="{{ mailbox }}"
+ data-id="quarantine_notification"
+ data-api-url='edit/quarantine_notification'
+ data-api-attr='{"quarantine_notification":"daily"}'>{{ lang.user.daily }}</button>
+ <button type="button" class="btn btn-sm btn-xs-quart d-block d-sm-inline{% if quarantine_notification == 'weekly' %} btn-dark{% else %} btn-light{% endif %}"
+ data-action="edit_selected"
+ data-item="{{ mailbox }}"
+ data-id="quarantine_notification"
+ data-api-url='edit/quarantine_notification'
+ data-api-attr='{"quarantine_notification":"weekly"}'>{{ lang.user.weekly }}</button>
+ </div>
+ <p class="text-muted"><small>{{ lang.user.quarantine_notification_info }}</small></p>
+ </div>
+ </div>
+ <div class="row mb-2">
+ <label class="control-label col-sm-2">{{ lang.user.quarantine_category }}</label>
+ <div class="col-sm-10">
+ <div class="btn-group" data-acl="{{ acl.quarantine_category }}">
+ <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline{% if quarantine_category == 'reject' %} btn-dark{% else %} btn-light{% endif %}"
+ data-action="edit_selected"
+ data-item="{{ mailbox }}"
+ data-id="quarantine_category"
+ data-api-url='edit/quarantine_category'
+ data-api-attr='{"quarantine_category":"reject"}'>{{ lang.user.q_reject }}</button>
+ <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline{% if quarantine_category == 'add_header' %} btn-dark{% else %} btn-light{% endif %}"
+ data-action="edit_selected"
+ data-item="{{ mailbox }}"
+ data-id="quarantine_category"
+ data-api-url='edit/quarantine_category'
+ data-api-attr='{"quarantine_category":"add_header"}'>{{ lang.user.q_add_header }}</button>
+ <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline{% if quarantine_category == 'all' %} btn-dark{% else %} btn-light{% endif %}"
+ data-action="edit_selected"
+ data-item="{{ mailbox }}"
+ data-id="quarantine_category"
+ data-api-url='edit/quarantine_category'
+ data-api-attr='{"quarantine_category":"all"}'>{{ lang.user.q_all }}</button>
+ </div>
+ <p class="text-muted"><small>{{ lang.user.quarantine_category_info }}</small></p>
+ </div>
+ </div>
+ <div class="row mb-4">
+ <label class="control-label col-sm-2" for="sender_acl">{{ lang.user.tls_policy }}</label>
+ <div class="col-sm-10">
+ <div class="btn-group" data-acl="{{ acl.tls_policy }}">
+ <button type="button" class="btn btn-sm btn-xs-half d-block d-sm-inline{% if get_tls_policy.tls_enforce_in == '1' %} btn-dark{% else %} btn-light{% endif %}"
+ data-action="edit_selected"
+ data-item="{{ mailbox }}"
+ data-id="tls_policy"
+ data-api-url='edit/tls_policy'
+ data-api-attr='{"tls_enforce_in": {% if get_tls_policy.tls_enforce_in == '1' %}0{% else %}1{% endif %} }'>{{ lang.user.tls_enforce_in }}</button>
+ <button type="button" class="btn btn-sm btn-xs-half d-block d-sm-inline{% if get_tls_policy.tls_enforce_out == '1' %} btn-dark{% else %} btn-light{% endif %}"
+ data-action="edit_selected"
+ data-item="{{ mailbox }}"
+ data-id="tls_policy"
+ data-api-url='edit/tls_policy'
+ data-api-attr='{"tls_enforce_out": {% if get_tls_policy.tls_enforce_out == '1' %}0{% else %}1{% endif %} }'>{{ lang.user.tls_enforce_out }}</button>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <label class="control-label col-sm-2" for="password">{{ lang.edit.password }} (<a href="#" class="generate_password">{{ lang.edit.generate }}</a>)</label>
+ <div class="col-sm-10">
+ <input type="password" data-pwgen-field="true" data-hibp="true" class="form-control" name="password" placeholder="{{ lang.edit.unchanged_if_empty }}" autocomplete="new-password">
+ </div>
+ </div>
+ <div class="row mb-4">
+ <label class="control-label col-sm-2" for="password2">{{ lang.edit.password_repeat }}</label>
+ <div class="col-sm-10">
+ <input type="password" data-pwgen-field="true" class="form-control" name="password2" autocomplete="new-password">
+ </div>
+ </div>
+ <div data-acl="{{ acl.extend_sender_acl }}" class="row mb-4">
+ <label class="control-label col-sm-2" for="extended_sender_acl">{{ lang.edit.extended_sender_acl }}</label>
+ <div class="col-sm-10">
+ {% if sender_acl_handles.external_sender_aliases %}
+ {% set ext_sender_acl = sender_acl_handles.external_sender_aliases|join(', ') %}
+ {% endif %}
+ {% if acl.extend_sender_acl and acl.extend_sender_acl == 1 %}
+ <input type="text" class="form-control" name="extended_sender_acl" value="{{ ext_sender_acl }}" placeholder="user1@example.com, user2@example.org, @example.com, ...">
+ <small class="text-muted">{{ lang.edit.extended_sender_acl_info|raw }}</small>
+ {% endif %}
+ </div>
+ </div>
+ <div class="row">
+ <label class="control-label col-sm-2" for="protocol_access">{{ lang.edit.allowed_protocols }}</label>
+ <div class="col-sm-10">
+ <select data-acl="{{ acl.protocol_access }}" name="protocol_access" multiple class="form-control">
+ <option value="imap"{% if result.attributes.imap_access == '1' %} selected{% endif %}>IMAP</option>
+ <option value="pop3"{% if result.attributes.pop3_access == '1' %} selected{% endif %}>POP3</option>
+ <option value="smtp"{% if result.attributes.smtp_access == '1' %} selected{% endif %}>SMTP</option>
+ <option value="sieve"{% if result.attributes.sieve_access == '1' %} selected{% endif %}>Sieve</option>
+ </select>
+ </div>
+ </div>
+ <div hidden data-acl="{{ acl.smtp_ip_access }}" class="row">
+ <label class="control-label col-sm-2" for="allow_from_smtp">{{ lang.edit.allow_from_smtp }}</label>
+ <div class="col-sm-10">
+ <input type="text" class="form-control" name="allow_from_smtp" value="{{ allow_from_smtp }}" placeholder="1.1.1.1, 10.2.0.0/24, ...">
+ <small class="text-muted">{{ lang.edit.allow_from_smtp_info }}</small>
+ </div>
+ </div>
+ <hr>
+ <div class="row">
+ <div class="offset-sm-2 col-sm-10">
+ <select name="active" class="form-control">
+ <option value="1"{% if result.active == '1' %} selected{% endif %}>{{ lang.edit.active }}</option>
+ <option value="2"{% if result.active == '2' %} selected{% endif %}>{{ lang.edit.disable_login }}</option>
+ <option value="0"{% if result.active == '0' %} selected{% endif %}>{{ lang.edit.inactive }}</option>
+ </select>
+ </div>
+ </div>
+ <div class="row mt-2">
+ <div class="offset-sm-2 col-sm-10">
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="force_pw_update"{% if result.attributes.force_pw_update == '1' %} checked{% endif %}> {{ lang.edit.force_pw_update }}</label>
+ <small class="text-muted">{{ lang.edit.force_pw_update_info|format(ui_texts.main_name) }}</small>
+ </div>
+ </div>
+ </div>
+ {% if not skip_sogo %}
+ <div data-acl="{{ acl.sogo_access }}" class="row">
+ <div class="offset-sm-2 col-sm-10">
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="sogo_access"{% if result.attributes.sogo_access == '1' %} checked{% endif %}> {{ lang.edit.sogo_access }}</label>
+ <small class="text-muted">{{ lang.edit.sogo_access_info }}</small>
+ </div>
+ </div>
+ </div>
+ {% endif %}
+ <div class="row mt-2 mb-2">
+ <div class="offset-sm-2 col-sm-10">
+ <button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="edit_selected" data-id="editmailbox" data-item="{{ result.username }}" data-api-url='edit/mailbox' data-api-attr='{}' href="#">{{ lang.edit.save }}</button>
+ </div>
+ </div>
+ <div class="row">
+ <div class="offset-sm-2 col-sm-10">
+ <small class="fst-italic d-block">{{ lang.edit.created_on }}: {{ result.created }}</small>
+ <small class="fst-italic d-block">{{ lang.edit.last_modified }}: {{ result.modified }}</small>
+ </div>
+ </div>
+ </form>
</div>
- <div class="col-sm-6 mb-4">
- <label for="title">{{ lang.edit.pushover_title }}</label>
- <input type="text" class="form-control" name="title" value="{{ pushover_data.title }}" placeholder="Mail">
- </div>
- <div class="col-sm-6 mb-4">
- <label for="text">{{ lang.edit.pushover_text }}</label>
- <input type="text" class="form-control" name="text" value="{{ pushover_data.text }}" placeholder="You've got mail 📧">
- </div>
- <div class="col-sm-12 mb-4">
- <label for="text">{{ lang.edit.pushover_sender_array|raw }}</label>
- <input type="text" class="form-control" name="senders" value="{{ pushover_data.senders }}" placeholder="sender1@example.com, sender2@example.com">
- </div>
- <div class="col-sm-12 mb-2">
- <div class="form-group">
- <label for="sound">{{ lang.edit.pushover_sound }}</label><br>
- <select name="sound" class="form-control">
- <option value="pushover"{% if pushover_data.attributes.sound == 'pushover' %} selected{% endif %}>Pushover (default)</option>
- <option value="bike"{% if pushover_data.attributes.sound == 'bike' %} selected{% endif %}>Bike</option>
- <option value="bugle"{% if pushover_data.attributes.sound == 'bugle' %} selected{% endif %}>Bugle</option>
- <option value="cashregister"{% if pushover_data.attributes.sound == 'cashregister' %} selected{% endif %}>Cash Register</option>
- <option value="classical"{% if pushover_data.attributes.sound == 'classical' %} selected{% endif %}>Classical</option>
- <option value="cosmic"{% if pushover_data.attributes.sound == 'cosmic' %} selected{% endif %}>Cosmic</option>
- <option value="falling"{% if pushover_data.attributes.sound == 'falling' %} selected{% endif %}>Falling</option>
- <option value="gamelan"{% if pushover_data.attributes.sound == 'gamelan' %} selected{% endif %}>Gamelan</option>
- <option value="incoming"{% if pushover_data.attributes.sound == 'incoming' %} selected{% endif %}>Incoming</option>
- <option value="intermission"{% if pushover_data.attributes.sound == 'intermission' %} selected{% endif %}>Intermission</option>
- <option value="magic"{% if pushover_data.attributes.sound == 'magic' %} selected{% endif %}>Magic</option>
- <option value="mechanical"{% if pushover_data.attributes.sound == 'mechanical' %} selected{% endif %}>Mechanical</option>
- <option value="pianobar"{% if pushover_data.attributes.sound == 'pianobar' %} selected{% endif %}>Piano Bar</option>
- <option value="siren"{% if pushover_data.attributes.sound == 'siren' %} selected{% endif %}>Siren</option>
- <option value="spacealarm"{% if pushover_data.attributes.sound == 'spacealarm' %} selected{% endif %}>Space Alarm</option>
- <option value="tugboat"{% if pushover_data.attributes.sound == 'tugboat' %} selected{% endif %}>Tug Boat</option>
- <option value="alien"{% if pushover_data.attributes.sound == 'alien' %} selected{% endif %}>Alien Alarm (long)</option>
- <option value="climb"{% if pushover_data.attributes.sound == 'climb' %} selected{% endif %}>Climb (long)</option>
- <option value="persistent"{% if pushover_data.attributes.sound == 'persistent' %} selected{% endif %}>Persistent (long)</option>
- <option value="echo"{% if pushover_data.attributes.sound == 'echo' %} selected{% endif %}>Pushover Echo (long)</option>
- <option value="updown"{% if pushover_data.attributes.sound == 'updown' %} selected{% endif %}>Up Down (long)</option>
- <option value="vibrate"{% if pushover_data.attributes.sound == 'vibrate' %} selected{% endif %}>Vibrate Only</option>
- <option value="none"{% if pushover_data.attributes.sound == 'none' %} selected{% endif %}> None (silent) </option>
- </select>
- </div>
- </div>
- <div class="col-sm-12">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if pushover_data.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
- </div>
- </div>
- <div class="col-sm-12">
- <legend style="cursor:pointer;margin-top:10px" data-bs-target="#po_advanced" unselectable="on" data-bs-toggle="collapse">
- <i class="bi bi-plus"></i> {{ lang.edit.advanced_settings }}
- </legend>
- <hr />
- </div>
- <div class="col-sm-12 mb-4">
- <div id="po_advanced" class="collapse">
- <label for="text">{{ lang.edit.pushover_sender_regex }}</label>
- <input type="text" class="form-control mt-2" name="senders_regex" value="{{ pushover_data.senders_regex }}" placeholder="/(.*@example\.org$|^foo@example\.com$)/i" regex="true">
- <div class="checkbox mt-4">
- <label><input type="checkbox" value="1" name="evaluate_x_prio"{% if pushover_data.attributes.evaluate_x_prio == '1' %} checked{% endif %}> {{ lang.edit.pushover_evaluate_x_prio|raw }}</label>
- </div>
- <div class="checkbox mt-2">
- <label><input type="checkbox" value="1" name="only_x_prio"{% if pushover_data.attributes.only_x_prio == '1' %} checked{% endif %}> {{ lang.edit.pushover_only_x_prio|raw }}</label>
- </div>
- </div>
- </div>
- </div>
- <div class="btn-group" data-acl="{{ acl.pushover }}">
- <a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-success" data-action="edit_selected" data-id="pushover" data-item="{{ mailbox }}" data-api-url='edit/pushover' data-api-attr='{}' href="#">{{ lang.edit.save }}</a>
- <a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" data-action="edit_selected" data-id="pushover-test" data-item="{{ mailbox }}" data-api-url='edit/pushover-test' data-api-attr='{}' href="#"><i class="bi bi-check-lg"></i> {{ lang.edit.pushover_verify }}</a>
- <a id="pushover_delete" class="btn btn-sm d-block d-sm-inline btn-danger" data-action="edit_selected" data-id="pushover-delete" data-item="{{ mailbox }}" data-api-url='edit/pushover' data-api-attr='{"delete":"true"}' href="#"><i class="bi bi-trash"></i> {{ lang.edit.remove }}</a>
- </div>
</div>
</div>
- </form>
- </div>
- <div id="macl" class="tab-pane fade" role="tabpanel" aria-labelledby="mailbox-acl">
- <form data-id="useracl" class="form-inline well" method="post">
- <div class="row">
- <div class="col-sm-1">
- <p class="text-muted">ACL</p>
- </div>
- <div class="col-sm-10">
- <select id="user_acl" name="user_acl" size="10" multiple>
- {% for acl, val in user_acls %}
- <option value="{{ acl }}"{% if val == 1 %} selected{% endif %}>{{ lang.acl[acl] }}</option>
- {% endfor %}
- </select>
- <button class="btn btn-xs-lg d-block d-sm-inline btn-secondary" data-action="edit_selected" data-id="useracl" data-item="{{ mailbox }}" data-api-url='edit/user-acl' data-api-attr='{}' href="#">{{ lang.edit.save }}</button>
+ <div id="mpushover" class="tab-pane fade" role="tabpanel" aria-labelledby="mailbox-pushover">
+ <div class="card mb-4">
+ <div class="card-header d-flex d-md-none fs-5">
+ <button class="btn flex-grow-1 text-start" data-bs-target="#collapse-tab-mpushover" data-bs-toggle="collapse" aria-controls="collapse-tab-mpushover">
+ {{ lang.edit.pushover }} <span class="badge bg-info table-lines"></span>
+ </button>
+ </div>
+ <div id="collapse-tab-mpushover" class="card-body collapse" data-bs-parent="#mailbox-content">
+ <form data-id="pushover" class="form well" method="post">
+ <input type="hidden" value="0" name="evaluate_x_prio">
+ <input type="hidden" value="0" name="only_x_prio">
+ <input type="hidden" value="0" name="active">
+ <div class="row">
+ <div class="col-sm-1">
+ <p class="text-muted"><a href="https://pushover.net" target="_blank"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAACglBMVEUAAAAAAAEAAAAilecFGigAAAAAAAAAAAAAAAANj+c3n+Ypm+oeYI4KWI4MieAtkdQbleoJcLcjmeswmN4Rit4KgdMKUYQJKUAQSnILL0kMNlMSTngimOoNPF0hlOQBBgkNOlkRS3MHIjUhk+IPf8wKLUYsjM0AAAASTngAAAAAAAAPfckbdLIbdrYUWIgegsgce70knfEAAAAknfENOVkGHi8YaaIjnvEdgMUhkuAQSG8aca0hleQUh9YLjOM4nOEMgtMcbaYWa6YemO02ltkKhNktgLodYZEPXJEyi8kKesktfLUzj84cWYMiluckZ5YJXJYeW4Y0k9YKfs4yjs0pc6YHZaUviskLfMkqmugak+cqkNcViNcqeK4Iaq4XRmYGPmYMKDsFJTstgr0LdL0ti84CCQ4BCQ4Qgc8rlt8XjN8shcQsi8wZSGgEP2cRMEUDKkUAAAD///8dmvEamfExo/EXmPEWl/ERlvElnvEsofEjnfETl/Enn/Ezo/E4pvEvovEfm/E1pPEzpPEvofEOlfEpoPEamPEQlfEYmfE6p/EgnPEVlvEroPE3pfE2pfENk/Ern/E3pPEcmfEfmvEnnvBlufT6/P0soPAknPDd7/zs9vzo9PxBqfItofAqoPD9/f3B4/q43/mx2/l/xfZ6w/Vxv/VtvfVgt/RXtPNTsfNEq/L3+/31+v3a7fvR6vvH5fqs2vmc0/jx+P3v9/3h8fzW7PvV7PvL5/q13fmo1/mh1PiY0fiNy/aHyfZ2wfVou/Vdt/RPsPM3oeoQkuowmeAgjdgcgMQbeLrw9/3k8vy74Pm63/mX0PdYtfNNr/Ikm+4wnOchkuAVjOAfdrMVcrOdoJikAAAAcnRSTlMAIQ8IzzweFwf+/fvw8P79+/Xt7e3p6eji4d7U08y8qZyTiIWDgn53bWxqaWBKQ0JBOjUwMCkoJCEfHBkT/vz8/Pv7+vr69/b29PTy7ezm5ubm5N7e29vQ0M/Pv7+4uLW1pqaWloWDg3x7e21mUVFFRUXdPracAAAEbElEQVRIx4WUZbvaQBCFF+ru7u7u7u7u7t4mvVwSoBC0JIUCLRQolLq7u7vr/+nMLkmQyvlwyfPcd86e3ZldUqwyQ/p329J+XfutPQYOLUP+q55rFtQJRvY79+xxlZTUWbKpz7/xrrMr2+3BoNPpdLn2lJQ4HEeqLOr1d7z7XNkesQed4A848G63Oy4Gmg/6Mz542QvZbqe8C/Ig73CLYiYTrtLmT3zfqbIcAR7y4wIqH/B6M9Fo0+Ldb6sM9ph/v4ozPuz12mxRofaAAr7jCNkuoz/jNf9AGHibkBCm51fsGKvxsAGWx4H+jBcEi6V2birDpCL/9Klrd1KHbiSvPWP8V0tTnTfO03iXi57P6WNHOVUf44IFdFDRz6pV5fw8Zy5z3JVH5+R48OwxqDiGvKJIY9R+9JsCuJ5HPg74OVEMpz+nbdEPUHEWeEk6IDUnTC1l5r+f8uffc0cfxc8fS17kLso24SwUPFDA/6DE82xKDOPliJ7n/GGOOyWK9zD9CdjvOfg9Dv6AH+AX04LW9gj2i8W/APx1UbxwCAu+wPmcpgUKL/EHdvtq4uwaZwCuznPJVY5LHhED15G/isd5Hz4eKui/e/du02YoKFeD5mHzHIN/nxEDe25gQQwKorAid04CfyzwL4XutXvl1Pt1guMOwwKPkU8mYIFT8JHK+vv8prpDScUVL+j8s3lOctw1GIhbWHAS+HgKPk7xPM/4UtNAYmzizJkf6NgTb/gM8jePQLsewMdthS3g95tMpT1IhVm6v1s8fYmLeb13Odwp8Fh5KY048y/d14WUrwrb1e/X/rNp73nkD8kWS+wi/MZ4XuetG4mhKubJm3/WNEvi8SHwB56nPKjUam0LBdp9ARwupFemTYudvgN/L1+A/Ko/LGBuS8pPy+YR1fuCTWNKnUyoeUyYx2o2dyEVGmr5xTD42xzvkD16+Pb9WIIH6fmt1r3mbsTY7Bvw+n23naT8BUWh86bz6G/e259UXPUK3gfAxQDlo7Rpx3Geqb2e3wp83SGEdKpB7zvwYbzvT2n65xLwbH6YP+M9C8vA8E1wxLU8gkCbdhXGUyrMgwVrcbzLHonr78lzDvWM3q/C/HtDlXoSUIe3YkblhRPIX4E8Oo/9siLv8dRjV7SBlkdgTXvKS7nzsA/9AfeEuhKq9T8zWIDv1Sd6ETAP4D6/H/1V+1BojvruNa4SZXz4JhY84dV5MOF5agUvu5OsOo+KRpG30KalEnoeDccFlutPZYs38D5n3zcpr1/0fBhfb3DOY1z2tSAgLxWezz6zuoHhfUmOejf6blHQH/sFuJYfcMZX307ytKvRa3ifoV/586P5j+tICtS77BuJxzxYAPZsntX8k3eSIhlajK4p8b7iefCEKs03kD/I2LnxL9ovH+43y4fAv1YrI/mzDBsavAX/UppfzVOrZT/ydxk6lJ047MfLfVbcb6hS9ZEzWxekKQ5WrtPqZg3rV6tWrX6Tle3KQZj/q6KxQnmDoXwFY0VSrN9e8FRXBCTAvwAAAABJRU5ErkJggg==" class="img img-fluid"></a></p>
+ </div>
+ <div class="col-sm-10">
+ <p class="text-muted">{{ lang.user.pushover_info|format(mailbox)|raw }}</p>
+ <p class="text-muted">{{ lang.edit.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code>, <code>{SENDER_ADDRESS}</code>, <code>{SENDER_NAME}</code>, <code>{TO_NAME}</code>, <code>{TO_ADDRESS}</code>, <code>{MSG_ID}</code></p>
+ <div class="row">
+ <div class="col-sm-6 mb-2">
+ <label for="token">API Token/Key (Application)</label>
+ <input type="text" class="form-control" name="token" maxlength="30" value="{{ pushover_data.token }}" required>
+ </div>
+ <div class="col-sm-6 mb-2">
+ <label for="key">User/Group Key</label>
+ <input type="text" class="form-control" name="key" maxlength="30" value="{{ pushover_data.key }}" required>
+ </div>
+ <div class="col-sm-6 mb-4">
+ <label for="title">{{ lang.edit.pushover_title }}</label>
+ <input type="text" class="form-control" name="title" value="{{ pushover_data.title }}" placeholder="Mail">
+ </div>
+ <div class="col-sm-6 mb-4">
+ <label for="text">{{ lang.edit.pushover_text }}</label>
+ <input type="text" class="form-control" name="text" value="{{ pushover_data.text }}" placeholder="You've got mail 📧">
+ </div>
+ <div class="col-sm-12 mb-4">
+ <label for="text">{{ lang.edit.pushover_sender_array|raw }}</label>
+ <input type="text" class="form-control" name="senders" value="{{ pushover_data.senders }}" placeholder="sender1@example.com, sender2@example.com">
+ </div>
+ <div class="col-sm-12 mb-2">
+ <div class="form-group">
+ <label for="sound">{{ lang.edit.pushover_sound }}</label><br>
+ <select name="sound" class="form-control">
+ <option value="pushover"{% if pushover_data.attributes.sound == 'pushover' %} selected{% endif %}>Pushover (default)</option>
+ <option value="bike"{% if pushover_data.attributes.sound == 'bike' %} selected{% endif %}>Bike</option>
+ <option value="bugle"{% if pushover_data.attributes.sound == 'bugle' %} selected{% endif %}>Bugle</option>
+ <option value="cashregister"{% if pushover_data.attributes.sound == 'cashregister' %} selected{% endif %}>Cash Register</option>
+ <option value="classical"{% if pushover_data.attributes.sound == 'classical' %} selected{% endif %}>Classical</option>
+ <option value="cosmic"{% if pushover_data.attributes.sound == 'cosmic' %} selected{% endif %}>Cosmic</option>
+ <option value="falling"{% if pushover_data.attributes.sound == 'falling' %} selected{% endif %}>Falling</option>
+ <option value="gamelan"{% if pushover_data.attributes.sound == 'gamelan' %} selected{% endif %}>Gamelan</option>
+ <option value="incoming"{% if pushover_data.attributes.sound == 'incoming' %} selected{% endif %}>Incoming</option>
+ <option value="intermission"{% if pushover_data.attributes.sound == 'intermission' %} selected{% endif %}>Intermission</option>
+ <option value="magic"{% if pushover_data.attributes.sound == 'magic' %} selected{% endif %}>Magic</option>
+ <option value="mechanical"{% if pushover_data.attributes.sound == 'mechanical' %} selected{% endif %}>Mechanical</option>
+ <option value="pianobar"{% if pushover_data.attributes.sound == 'pianobar' %} selected{% endif %}>Piano Bar</option>
+ <option value="siren"{% if pushover_data.attributes.sound == 'siren' %} selected{% endif %}>Siren</option>
+ <option value="spacealarm"{% if pushover_data.attributes.sound == 'spacealarm' %} selected{% endif %}>Space Alarm</option>
+ <option value="tugboat"{% if pushover_data.attributes.sound == 'tugboat' %} selected{% endif %}>Tug Boat</option>
+ <option value="alien"{% if pushover_data.attributes.sound == 'alien' %} selected{% endif %}>Alien Alarm (long)</option>
+ <option value="climb"{% if pushover_data.attributes.sound == 'climb' %} selected{% endif %}>Climb (long)</option>
+ <option value="persistent"{% if pushover_data.attributes.sound == 'persistent' %} selected{% endif %}>Persistent (long)</option>
+ <option value="echo"{% if pushover_data.attributes.sound == 'echo' %} selected{% endif %}>Pushover Echo (long)</option>
+ <option value="updown"{% if pushover_data.attributes.sound == 'updown' %} selected{% endif %}>Up Down (long)</option>
+ <option value="vibrate"{% if pushover_data.attributes.sound == 'vibrate' %} selected{% endif %}>Vibrate Only</option>
+ <option value="none"{% if pushover_data.attributes.sound == 'none' %} selected{% endif %}> None (silent) </option>
+ </select>
+ </div>
+ </div>
+ <div class="col-sm-12">
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if pushover_data.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
+ </div>
+ </div>
+ <div class="col-sm-12">
+ <legend style="cursor:pointer;margin-top:10px" data-bs-target="#po_advanced" unselectable="on" data-bs-toggle="collapse">
+ <i class="bi bi-plus"></i> {{ lang.edit.advanced_settings }}
+ </legend>
+ <hr />
+ </div>
+ <div class="col-sm-12 mb-4">
+ <div id="po_advanced" class="collapse">
+ <label for="text">{{ lang.edit.pushover_sender_regex }}</label>
+ <input type="text" class="form-control mt-2" name="senders_regex" value="{{ pushover_data.senders_regex }}" placeholder="/(.*@example\.org$|^foo@example\.com$)/i" regex="true">
+ <div class="form-check mt-4">
+ <label><input type="checkbox" class="form-check-input" value="1" name="evaluate_x_prio"{% if pushover_data.attributes.evaluate_x_prio == '1' %} checked{% endif %}> {{ lang.edit.pushover_evaluate_x_prio|raw }}</label>
+ </div>
+ <div class="form-check mt-2">
+ <label><input type="checkbox" class="form-check-input" value="1" name="only_x_prio"{% if pushover_data.attributes.only_x_prio == '1' %} checked{% endif %}> {{ lang.edit.pushover_only_x_prio|raw }}</label>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="btn-group" data-acl="{{ acl.pushover }}">
+ <a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-success" data-action="edit_selected" data-id="pushover" data-item="{{ mailbox }}" data-api-url='edit/pushover' data-api-attr='{}' href="#">{{ lang.edit.save }}</a>
+ <a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" data-action="edit_selected" data-id="pushover-test" data-item="{{ mailbox }}" data-api-url='edit/pushover-test' data-api-attr='{}' href="#"><i class="bi bi-check-lg"></i> {{ lang.edit.pushover_verify }}</a>
+ <a id="pushover_delete" class="btn btn-sm d-block d-sm-inline btn-danger" data-action="edit_selected" data-id="pushover-delete" data-item="{{ mailbox }}" data-api-url='edit/pushover' data-api-attr='{"delete":"true"}' href="#"><i class="bi bi-trash"></i> {{ lang.edit.remove }}</a>
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
</div>
</div>
- </form>
- </div>
- <div id="mrl" class="tab-pane fade" role="tabpanel" aria-labelledby="mailbox-rl">
- <form data-id="mboxratelimit" class="form-inline well" method="post">
- <div class="row">
- <div class="col-sm-1">
- <p class="text-muted">{{ lang.acl.ratelimit }}</p>
- </div>
- <div class="col-sm-10">
- <input name="rl_value" type="number" autocomplete="off" value="{{ rl.value }}" class="form-control mb-4" placeholder="{{ lang.ratelimit.disabled }}">
- <select name="rl_frame" class="form-control">
- {% include 'mailbox/rl-frame.twig' %}
- </select>
- <button class="btn btn-xs-lg d-block d-sm-inline btn-secondary" data-action="edit_selected" data-id="mboxratelimit" data-item="{{ mailbox }}" data-api-url='edit/rl-mbox' data-api-attr='{}' href="#">{{ lang.edit.save }}</button>
- <p class="text-muted mt-3">{{ lang.edit.mbox_rl_info }}</p>
+ <div id="macl" class="tab-pane fade" role="tabpanel" aria-labelledby="mailbox-acl">
+ <div class="card mb-4">
+ <div class="card-header d-flex d-md-none fs-5">
+ <button class="btn flex-grow-1 text-start" data-bs-target="#collapse-tab-macl" data-bs-toggle="collapse" aria-controls="collapse-tab-macl">
+ {{ lang.edit.acl }} <span class="badge bg-info table-lines"></span>
+ </button>
+ </div>
+ <div id="collapse-tab-macl" class="card-body collapse" data-bs-parent="#mailbox-content">
+ <form data-id="useracl" class="form-inline well" method="post">
+ <div class="row">
+ <div class="col-sm-1">
+ <p class="text-muted">ACL</p>
+ </div>
+ <div class="col-sm-10">
+ <select id="user_acl" name="user_acl" size="10" multiple>
+ {% for acl, val in user_acls %}
+ <option value="{{ acl }}"{% if val == 1 %} selected{% endif %}>{{ lang.acl[acl] }}</option>
+ {% endfor %}
+ </select>
+ <button class="btn btn-xs-lg d-block d-sm-inline btn-secondary" data-action="edit_selected" data-id="useracl" data-item="{{ mailbox }}" data-api-url='edit/user-acl' data-api-attr='{}' href="#">{{ lang.edit.save }}</button>
+ </div>
+ </div>
+ </form>
+ </div>
</div>
</div>
- </form>
- </div>
+ <div id="mrl" class="tab-pane fade" role="tabpanel" aria-labelledby="mailbox-rl">
+ <div class="card mb-4">
+ <div class="card-header d-flex d-md-none fs-5">
+ <button class="btn flex-grow-1 text-start" data-bs-target="#collapse-tab-mrl" data-bs-toggle="collapse" aria-controls="collapse-tab-mrl">
+ {{ lang.edit.ratelimit }} <span class="badge bg-info table-lines"></span>
+ </button>
+ </div>
+ <div id="collapse-tab-mrl" class="card-body collapse" data-bs-parent="#mailbox-content">
+ <form data-id="mboxratelimit" class="well" method="post">
+ <div class="row mb-2">
+ <div class="col-sm-2">
+ <p class="text-muted">{{ lang.acl.ratelimit }}</p>
+ </div>
+ <div class="col-sm-10">
+ <div class="input-group">
+ <input name="rl_value" type="number" autocomplete="off" value="{{ rl.value }}" class="form-control" placeholder="{{ lang.ratelimit.disabled }}">
+ <select name="rl_frame" class="form-control">
+ {% include 'mailbox/rl-frame.twig' %}
+ </select>
+ </div>
+ </div>
+ </div>
+ <div class="row mb-2">
+ <div class="offset-sm-2 col-sm-10">
+ <button class="btn btn-xs-lg d-block d-sm-inline btn-secondary" data-action="edit_selected" data-id="mboxratelimit" data-item="{{ mailbox }}" data-api-url='edit/rl-mbox' data-api-attr='{}' href="#">{{ lang.edit.save }}</button>
+ <p class="text-muted mt-2">{{ lang.edit.mbox_rl_info }}</p>
+ </div>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
</div>
{% else %}
{{ parent() }}
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit/recipient_map.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit/recipient_map.twig
index 9af30a3..c7f3493 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit/recipient_map.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit/recipient_map.twig
@@ -22,8 +22,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit/relayhost.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit/relayhost.twig
index c668981..3187170 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit/relayhost.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit/relayhost.twig
@@ -26,8 +26,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit/resource.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit/resource.twig
index 4ba65bd..7fdc556 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit/resource.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit/resource.twig
@@ -38,8 +38,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit/syncjob.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit/syncjob.twig
index d2172e6..6f6cded 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit/syncjob.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit/syncjob.twig
@@ -2,7 +2,7 @@
{% block inner_content %}
{% if result %}
- <h4>{{ lang.edit.syncjob }}</h4>
+ <h4 class="mb-4">{{ lang.edit.syncjob }}</h4>
<form class="form-horizontal" data-id="editsyncjob" role="form" method="post">
<input type="hidden" value="0" name="delete2duplicates">
<input type="hidden" value="0" name="delete1">
@@ -101,50 +101,50 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="delete2duplicates"{% if result.delete2duplicates == '1' %} checked{% endif %}> {{ lang.edit.delete2duplicates }} (--delete2duplicates)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="delete2duplicates"{% if result.delete2duplicates == '1' %} checked{% endif %}> {{ lang.edit.delete2duplicates }} (--delete2duplicates)</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="delete1"{% if result.delete1 == '1' %} checked{% endif %}> {{ lang.edit.delete1 }} (--delete1)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="delete1"{% if result.delete1 == '1' %} checked{% endif %}> {{ lang.edit.delete1 }} (--delete1)</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="delete2"{% if result.delete2 == '1' %} checked{% endif %}> {{ lang.edit.delete2 }} (--delete2)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="delete2"{% if result.delete2 == '1' %} checked{% endif %}> {{ lang.edit.delete2 }} (--delete2)</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="automap"{% if result.automap == '1' %} checked{% endif %}> {{ lang.edit.automap }} (--automap)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="automap"{% if result.automap == '1' %} checked{% endif %}> {{ lang.edit.automap }} (--automap)</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="skipcrossduplicates"{% if result.skipcrossduplicates == '1' %} checked{% endif %}> {{ lang.edit.skipcrossduplicates }} (--skipcrossduplicates)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="skipcrossduplicates"{% if result.skipcrossduplicates == '1' %} checked{% endif %}> {{ lang.edit.skipcrossduplicates }} (--skipcrossduplicates)</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="subscribeall"{% if result.subscribeall == '1' %} checked{% endif %}> {{ lang.add.subscribeall }} (--subscribeall)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="subscribeall"{% if result.subscribeall == '1' %} checked{% endif %}> {{ lang.add.subscribeall }} (--subscribeall)</label>
</div>
</div>
</div>
<div class="row mb-4">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit/tls_policy_map.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit/tls_policy_map.twig
index 199bbfe..aa89575 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit/tls_policy_map.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit/tls_policy_map.twig
@@ -32,8 +32,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/edit/transport.twig b/mailcow/src/mailcow-dockerized/data/web/templates/edit/transport.twig
index 2fc461f..4aedb53 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/edit/transport.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/edit/transport.twig
@@ -32,15 +32,15 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="is_mx_based"{% if result.is_mx_based == '1' %} checked{% endif %}> {{ lang.edit.lookup_mx|raw }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="is_mx_based"{% if result.is_mx_based == '1' %} checked{% endif %}> {{ lang.edit.lookup_mx|raw }}</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if result.active == '1' %} checked{% endif %}> {{ lang.edit.active }}</label>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/fido2.twig b/mailcow/src/mailcow-dockerized/data/web/templates/fido2.twig
index c29cd8f..6157aef 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/fido2.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/fido2.twig
@@ -15,10 +15,10 @@
<form style="display:inline;" method="post">
<input type="hidden" name="unset_fido2_key" value="{{ key_info.cid }}">
<div class="btn-group">
- <a href="#" class="btn btn-xs btn-secondary" data-cid="{{ key_info.cid }}" data-subject="{{ key_info.subject|base64_encode }}" data-bs-toggle="modal" data-bs-target="#fido2ChangeFn">
+ <a href="#" class="btn btn-sm btn-xs-lg btn-secondary" data-cid="{{ key_info.cid }}" data-subject="{{ key_info.subject|base64_encode }}" data-bs-toggle="modal" data-bs-target="#fido2ChangeFn">
<i class="bi bi-pencil-fill"></i> {{ lang.fido2.rename }}
</a>
- <a href="#" onClick='return confirm("{{ lang.admin.ays }}")?$(this).closest("form").submit():"";' class="btn btn-xs btn-danger">
+ <a href="#" onClick='return confirm("{{ lang.admin.ays }}")?$(this).closest("form").submit():"";' class="btn btn-sm btn-xs-lg btn-danger">
<i class="bi bi-trash"></i> {{ lang.admin.remove }}
</a>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/index.twig b/mailcow/src/mailcow-dockerized/data/web/templates/index.twig
index e90a720..aa28254 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/index.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/index.twig
@@ -14,7 +14,10 @@
</div>
</div>
<div class="card-body">
- <div class="text-center mailcow-logo mb-4"><img src="{{ logo|default('/img/cow_mailcow.svg') }}" alt="mailcow"></div>
+ <div class="text-center mailcow-logo mb-4">
+ <img class="main-logo" src="{{ logo|default('/img/cow_mailcow.svg') }}" alt="mailcow">
+ <img class="main-logo-dark" src="{{ logo_dark|default('/img/cow_mailcow.svg') }}" alt="mailcow-logo-dark">
+ </div>
{% if ui_texts.ui_announcement_text and ui_texts.ui_announcement_active %}
<div class="my-4 alert alert-{{ ui_texts.ui_announcement_type }} rot-enc ui-announcement-alert">{{ ui_texts.ui_announcement_text|rot13 }}</div>
{% endif %}
@@ -37,18 +40,14 @@
<input name="pass_user" type="password" id="pass_user" class="form-control" placeholder="{{ lang.login.password }}" required="" autocomplete="current-password">
</div>
</div>
- <div class="d-flex mt-4" style="position: relative">
- <div class="btn-group">
- <div class="btn-group">
- <button type="submit" class="btn btn-xs-lg btn-success" value="Login">{{ lang.login.login }}</button>
- <button type="button" class="btn btn-xs-lg btn-success dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></button>
- <ul class="dropdown-menu">
- <li><a class="dropdown-item" href="#" id="fido2-login"><i class="bi bi-shield-fill-check"></i> {{ lang.login.fido2_webauthn }}</a></li>
- </ul>
- </div>
+ <div class="d-flex justify-content-between mt-4" style="position: relative">
+ <div class="d-grid gap-2 d-sm-block">
+ <button type="submit" class="btn btn-xs-lg btn-success" value="Login">{{ lang.login.login }}</button>
+ <button type="button" class="btn btn-xs-lg btn-success" id="fido2-login"><i class="bi bi-shield-fill-check"></i> {{ lang.login.fido2_webauthn }}</button>
</div>
{% if not oauth2_request %}
- <button type="button" {% if available_languages|length == 1 %}disabled="true"{% endif %} class="btn btn-xs-lg btn-secondary ms-auto dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+ <div class="d-grid d-sm-block">
+ <button type="button" {% if available_languages|length == 1 %}disabled="true"{% endif %} class="btn btn-secondary ms-auto dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="flag-icon flag-icon-{{ mailcow_locale[-2:] }}"></span>
</button>
<ul class="dropdown-menu ms-auto login">
@@ -60,6 +59,7 @@
</li>
{% endfor %}
</ul>
+ </div>
{% endif %}
</div>
</form>
@@ -69,19 +69,15 @@
<div class="my-4" id="fido2-alerts"></div>
{% if not oauth2_request and (mailcow_apps or app_links) %}
<legend><i class="bi bi-link-45deg"></i> {{ ui_texts.apps_name|raw }}</legend><hr />
- <div class="my-2 d-flex flex-wrap apps">
+ <div class="my-2 d-grid gap-2 d-sm-block apps">
{% for app in mailcow_apps %}
{% if not skip_sogo or not is_uri('SOGo', app.link) %}
- <div class="m-2">
- <a href="{{ app.link }}" role="button" {% if app.description %}title="{{ app.description }}"{% endif %} class="btn btn-primary btn-block">{{ app.name }}</a>
- </div>
- {% endif %}
+ <a href="{{ app.link }}" role="button" {% if app.description %}title="{{ app.description }}"{% endif %} class="btn btn-primary">{{ app.name }}</a>
+ {% endif %}
{% endfor %}
{% for row in app_links %}
{% for key, val in row %}
- <div class="m-2">
- <a href="{{ val }}" role="button" class="btn btn-primary btn-block">{{ key }}</a>
- </div>
+ <a href="{{ val }}" role="button" class="btn btn-primary">{{ key }}</a>
{% endfor %}
{% endfor %}
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox.twig b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox.twig
index cdb6a42..b61896d 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox.twig
@@ -3,23 +3,31 @@
{% block content %}
<div id="mail-content" class="responsive-tabs">
<ul class="nav nav-tabs" role="tablist">
+ {% if mailcow_cc_role == 'admin' %}
<li class="nav-item dropdown" role="presentation">
- <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.domains }}</a>
- <ul class="dropdown-menu">
- <li><button class="dropdown-item" aria-selected="false" aria-controls="tab-domains" role="tab" data-bs-toggle="tab" data-bs-target="#tab-domains">{{ lang.mailbox.domains }}</button></li>
- <li><button class="dropdown-item {% if mailcow_cc_role != 'admin' %} d-none{% endif %}" aria-selected="false" aria-controls="tab-templates-domains" role="tab" data-bs-toggle="tab" data-bs-target="#tab-templates-domains">{{ lang.mailbox.templates }}</button></li>
- </ul>
+ <a class="nav-link dropdown-toggle active" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.domains }}</a>
+ <ul class="dropdown-menu">
+ <li><button class="dropdown-item" aria-selected="false" aria-controls="tab-domains" role="tab" data-bs-toggle="tab" data-bs-target="#tab-domains">{{ lang.mailbox.domains }}</button></li>
+ <li><button class="dropdown-item" aria-selected="false" aria-controls="tab-templates-domains" role="tab" data-bs-toggle="tab" data-bs-target="#tab-templates-domains">{{ lang.mailbox.templates }}</button></li>
+ </ul>
</li>
+ {% else %}
+ <li class="nav-item" role="presentation"><button class="nav-link" aria-controls="tab-domains" role="tab" data-bs-toggle="tab" data-bs-target="#tab-domains">{{ lang.mailbox.domains }}</button></li>
+ {% endif %}
+ {% if mailcow_cc_role == 'admin' %}
<li class="nav-item dropdown" role="presentation">
- <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.mailboxes }}</a>
- <ul class="dropdown-menu">
- <li><button class="dropdown-item" aria-selected="false" aria-controls="tab-mailboxes" role="tab" data-bs-toggle="tab" data-bs-target="#tab-mailboxes">{{ lang.mailbox.mailboxes }}</button></li>
- <li><button class="dropdown-item {% if mailcow_cc_role != 'admin' %} d-none{% endif %}" aria-selected="false" aria-controls="tab-templates-mbox" role="tab" data-bs-toggle="tab" data-bs-target="#tab-templates-mbox">{{ lang.mailbox.templates }}</button></li>
- </ul>
+ <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.mailboxes }}</a>
+ <ul class="dropdown-menu">
+ <li><button class="dropdown-item" aria-selected="false" aria-controls="tab-mailboxes" role="tab" data-bs-toggle="tab" data-bs-target="#tab-mailboxes">{{ lang.mailbox.mailboxes }}</button></li>
+ <li><button class="dropdown-item" aria-selected="false" aria-controls="tab-templates-mbox" role="tab" data-bs-toggle="tab" data-bs-target="#tab-templates-mbox">{{ lang.mailbox.templates }}</button></li>
+ </ul>
</li>
+ {% else %}
+ <li class="nav-item" role="presentation"><button class="nav-link" aria-controls="tab-mailboxes" role="tab" data-bs-toggle="tab" data-bs-target="#tab-mailboxes">{{ lang.mailbox.mailboxes }}</button></li>
+ {% endif %}
<li class="nav-item" role="presentation"><button class="nav-link" aria-controls="tab-resources" role="tab" data-bs-toggle="tab" data-bs-target="#tab-resources">{{ lang.mailbox.resources }}</button></li>
<li class="nav-item dropdown">
- <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" data-bs-target="#">{{ lang.mailbox.aliases }}</a>
+ <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.aliases }}</a>
<ul class="dropdown-menu">
<li role="presentation"><button class="dropdown-item" aria-selected="false" aria-controls="tab-mbox-aliases" role="tab" data-bs-toggle="tab" data-bs-target="#tab-mbox-aliases">{{ lang.mailbox.aliases }}</button></li>
<li role="presentation"><button class="dropdown-item" aria-selected="false" aria-controls="tab-domain-aliases" role="tab" data-bs-toggle="tab" data-bs-target="#tab-domain-aliases">{{ lang.mailbox.domain_aliases }}</button></li>
@@ -35,9 +43,13 @@
<div class="col-md-12">
<div class="tab-content" style="padding-top:20px">
{% include 'mailbox/tab-domains.twig' %}
+ {% if mailcow_cc_role == 'admin' %}
{% include 'mailbox/tab-templates-domains.twig' %}
+ {% endif %}
{% include 'mailbox/tab-mailboxes.twig' %}
+ {% if mailcow_cc_role == 'admin' %}
{% include 'mailbox/tab-templates-mbox.twig' %}
+ {% endif %}
{% include 'mailbox/tab-resources.twig' %}
{% include 'mailbox/tab-domain-aliases.twig' %}
{% include 'mailbox/tab-mbox-aliases.twig' %}
@@ -58,7 +70,7 @@
var lang_rl = {{ lang_rl|raw }};
var lang_datatables = {{ lang_datatables|raw }};
var csrf_token = '{{ csrf_token }}';
- var pagination_size = '{{ pagination_size }}';
+ var pagination_size = Math.trunc('{{ pagination_size }}');
var role = '{{ role }}';
var is_dual = {{ is_dual }};
var ALLOW_ADMIN_EMAIL_LOGIN = {{ allow_admin_email_login }};
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-bcc.twig b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-bcc.twig
index 7f8319e..eedb04b 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-bcc.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-bcc.twig
@@ -1,4 +1,4 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-bcc" role="tabpanel" aria-labelledby="tab-bcc">
+<div class="tab-pane fade" id="tab-bcc" role="tabpanel" aria-labelledby="tab-bcc">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-bcc" data-bs-toggle="collapse" aria-controls="collapse-tab-bcc">
@@ -11,7 +11,7 @@
</div>
</div>
<div id="collapse-tab-bcc" class="card-body collapse" data-bs-parent="#mail-content">
- <div class="mass-actions-mailbox mb-4">
+ <div class="mass-actions-mailbox mb-4 d-none d-sm-block">
<div class="btn-group" data-acl="{{ acl.bcc_maps }}">
<a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="bcc" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
<a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
@@ -23,9 +23,9 @@
<li><a class="dropdown-item" data-action="edit_selected" data-id="bcc" data-api-url='edit/bcc' data-api-attr='{"type":"rcpt"}' href="#">{{ lang.mailbox.bcc_to_rcpt }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-id="bcc" data-api-url='delete/bcc' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="bcc_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="bcc_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="bcc_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="bcc_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addBCCModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_bcc_entry }}</a>
</div>
@@ -34,8 +34,8 @@
<table id="bcc_table" class="table table-striped dt-responsive w-100"></table>
<div class="mass-actions-mailbox mt-4">
<div class="btn-group" data-acl="{{ acl.bcc_maps }}">
- <a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="bcc" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
- <a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="bcc" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" data-action="edit_selected" data-id="bcc" data-api-url='edit/bcc' data-api-attr='{"active":"1"}' href="#">{{ lang.mailbox.activate }}</a></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="bcc" data-api-url='edit/bcc' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
@@ -44,11 +44,11 @@
<li><a class="dropdown-item" data-action="edit_selected" data-id="bcc" data-api-url='edit/bcc' data-api-attr='{"type":"rcpt"}' href="#">{{ lang.mailbox.bcc_to_rcpt }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-id="bcc" data-api-url='delete/bcc' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="bcc_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="bcc_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="bcc_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="bcc_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
- <a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addBCCModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_bcc_entry }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addBCCModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_bcc_entry }}</a>
</div>
</div>
</div>
@@ -65,7 +65,7 @@
</div>
</div>
<div id="collapse-tab-bcc-filters" class="card-body collapse" data-bs-parent="#mail-content">
- <div class="mass-actions-mailbox mb-4">
+ <div class="mass-actions-mailbox mb-4 d-none d-sm-block">
<div class="btn-group">
<a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="recipient_map" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
<a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
@@ -74,9 +74,9 @@
<li><a class="dropdown-item" data-action="edit_selected" data-id="recipient_map" data-api-url='edit/recipient_map' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-id="recipient_map" data-api-url='delete/recipient_map' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="recipient_map_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="recipient_map_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="recipient_map_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="recipient_map_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addRecipientMapModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_recipient_map_entry }}</a>
</div>
@@ -85,18 +85,18 @@
<table id="recipient_map_table" class="table table-striped dt-responsive w-100"></table>
<div class="mass-actions-mailbox mt-4">
<div class="btn-group">
- <a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="recipient_map" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
- <a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="recipient_map" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" data-action="edit_selected" data-id="recipient_map" data-api-url='edit/recipient_map' data-api-attr='{"active":"1"}' href="#">{{ lang.mailbox.activate }}</a></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="recipient_map" data-api-url='edit/recipient_map' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-id="recipient_map" data-api-url='delete/recipient_map' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="recipient_map_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="recipient_map_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="recipient_map_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="recipient_map_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
- <a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addRecipientMapModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_recipient_map_entry }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addRecipientMapModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_recipient_map_entry }}</a>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-domain-aliases.twig b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-domain-aliases.twig
index f203776..4bbfbbe 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-domain-aliases.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-domain-aliases.twig
@@ -1,7 +1,7 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-domain-aliases" role="tabpanel" aria-labelledby="tab-domain-aliases">
+<div class="tab-pane fade" id="tab-domain-aliases" role="tabpanel" aria-labelledby="tab-domain-aliases">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
- <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-domain-aliases" data-bs-toggle="collapse" aria-controls="ollapse-tab-domain-aliases">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-domain-aliases" data-bs-toggle="collapse" aria-controls="collapse-tab-domain-aliases">
{{ lang.mailbox.domain_aliases }} <span class="badge bg-info table-lines"></span>
</button>
<span class="d-none d-md-block">{{ lang.mailbox.domain_aliases }} <span class="badge bg-info table-lines"></span></span>
@@ -11,7 +11,7 @@
</div>
</div>
<div id="collapse-tab-domain-aliases" class="card-body collapse" data-bs-parent="#mail-content">
- <div class="mass-actions-mailbox mb-4">
+ <div class="mass-actions-mailbox mb-4 d-none d-sm-block">
<div class="btn-group">
<a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="alias-domain" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
<a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
@@ -20,9 +20,9 @@
<li><a class="dropdown-item" data-action="edit_selected" data-id="alias-domain" data-api-url='edit/alias-domain' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-id="alias-domain" data-api-url='delete/alias-domain' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="aliasdomain_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="aliasdomain_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="aliasdomain_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="aliasdomain_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<a class="btn btn-sm btn-success" href="#" data-acl="{{ acl.alias_domains }}" data-bs-toggle="modal" data-bs-target="#addAliasDomainModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_domain_alias }}</a>
</div>
@@ -30,18 +30,18 @@
<table id="aliasdomain_table" class="table table-striped dt-responsive w-100"></table>
<div class="mass-actions-mailbox mt-4">
<div class="btn-group">
- <a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="alias-domain" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
- <a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="alias-domain" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" data-action="edit_selected" data-id="alias-domain" data-api-url='edit/alias-domain' data-api-attr='{"active":"1"}' href="#">{{ lang.mailbox.activate }}</a></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="alias-domain" data-api-url='edit/alias-domain' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-id="alias-domain" data-api-url='delete/alias-domain' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="aliasdomain_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="aliasdomain_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="aliasdomain_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="aliasdomain_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
- <a class="btn btn-sm btn-success" href="#" data-acl="{{ acl.alias_domains }}" data-bs-toggle="modal" data-bs-target="#addAliasDomainModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_domain_alias }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-success" href="#" data-acl="{{ acl.alias_domains }}" data-bs-toggle="modal" data-bs-target="#addAliasDomainModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_domain_alias }}</a>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-domains.twig b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-domains.twig
index d3d8824..49cb89b 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-domains.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-domains.twig
@@ -1,4 +1,4 @@
-<div role="tabpanel" class="tab-pane fade show active" id="tab-domains" role="tabpanel" aria-labelledby="tab-domains">
+<div class="tab-pane fade show active" id="tab-domains" role="tabpanel" aria-labelledby="tab-domains">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-sm-block d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-domains" data-bs-toggle="collapse" aria-controls="collapse-tab-domains">
@@ -12,7 +12,7 @@
</div>
<div id="collapse-tab-domains" class="card-body collapse show" data-bs-parent="#mail-content">
{#<div class="mass-actions-mailbox" data-actions-header="true"></div>#}
- <div class="mass-actions-mailbox mb-4">
+ <div class="mass-actions-mailbox mb-4 d-none d-sm-block">
<div class="btn-group">
<button class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="domain" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</button>
<button class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</button>
@@ -22,34 +22,34 @@
<li><a class="dropdown-item" data-action="edit_selected" data-id="domain" data-api-url='edit/domain' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-id="domain" data-api-url='delete/domain' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="domain_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="domain_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
{% endif %}
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="domain_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="domain_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
{% if mailcow_cc_role == 'admin' %}
- <a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addDomainModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_domain }}</a>
+ <button class="btn btn-sm btn-success" data-bs-toggle="modal" data-bs-target="#addDomainModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_domain }}</button>
{% endif %}
</div>
</div>
<table id="domain_table" class="table table-striped dt-responsive w-100"></table>
<div class="mass-actions-mailbox mt-4">
<div class="btn-group">
- <button class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="domain" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</button>
- <button class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</button>
+ <button class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="domain" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</button>
+ <button class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</button>
<ul class="dropdown-menu">
{% if mailcow_cc_role == 'admin' %}
<li><a class="dropdown-item" data-action="edit_selected" data-id="domain" data-api-url='edit/domain' data-api-attr='{"active":"1"}' href="#">{{ lang.mailbox.activate }}</a></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="domain" data-api-url='edit/domain' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-id="domain" data-api-url='delete/domain' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
{% endif %}
- <li><a class="dropdown-item" data-datatables-expand="domain_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="domain_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="domain_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="domain_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
{% if mailcow_cc_role == 'admin' %}
- <button class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addDomainModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_domain }}</button>
+ <button class="btn btn-sm btn-xs-lg btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addDomainModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_domain }}</button>
{% endif %}
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-filters.twig b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-filters.twig
index 942f784..8ccff27 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-filters.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-filters.twig
@@ -1,4 +1,4 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-filters" role="tabpanel" aria-labelledby="tab-filters">
+<div class="tab-pane fade" id="tab-filters" role="tabpanel" aria-labelledby="tab-filters">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-filters" data-bs-toggle="collapse" aria-controls="collapse-tab-filters">
@@ -11,7 +11,7 @@
</div>
</div>
<div id="collapse-tab-filters" class="card-body collapse" data-bs-parent="#mail-content">
- <div class="mass-actions-mailbox mb-4">
+ <div class="mass-actions-mailbox mb-4 d-none d-sm-block">
<div class="btn-group" data-acl="{{ acl.filters }}">
<a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="filter_item" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
<a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
@@ -23,9 +23,9 @@
<li><a class="dropdown-item" data-action="edit_selected" data-id="filter_item" data-api-url='edit/filter' data-api-attr='{"filter_type":"postfilter"}' href="#">{{ lang.mailbox.set_postfilter }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-text="{{ lang.user.eas_reset }}?" data-id="filter_item" data-api-url='delete/filter' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="filter_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="filter_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="filter_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="filter_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addFilterModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_filter }}</a>
</div>
@@ -34,8 +34,8 @@
<table id="filter_table" class="table table-striped dt-responsive w-100"></table>
<div class="mass-actions-mailbox mt-4 mb-4">
<div class="btn-group" data-acl="{{ acl.filters }}">
- <a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="filter_item" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
- <a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="filter_item" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" data-action="edit_selected" data-id="filter_item" data-api-url='edit/filter' data-api-attr='{"active":"1"}' href="#">{{ lang.mailbox.activate }}</a></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="filter_item" data-api-url='edit/filter' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
@@ -44,11 +44,11 @@
<li><a class="dropdown-item" data-action="edit_selected" data-id="filter_item" data-api-url='edit/filter' data-api-attr='{"filter_type":"postfilter"}' href="#">{{ lang.mailbox.set_postfilter }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-text="{{ lang.user.eas_reset }}?" data-id="filter_item" data-api-url='delete/filter' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="filter_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="filter_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="filter_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="filter_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
- <a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addFilterModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_filter }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addFilterModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_filter }}</a>
</div>
</div>
<div class="{% if mailcow_cc_role != 'admin' %}hidden{% endif %}">
@@ -64,8 +64,8 @@
<div class="row mt-2">
<div class="col-sm-10 add_filter_btns">
<div class="btn-group">
- <button class="btn btn-sm btn-xs-half btn-secondary validate_sieve" href="#">{{ lang.add.validate }}</button>
- <button class="btn btn-sm btn-xs-half btn-success add_sieve_script" data-action="add_item" data-id="add_prefilter" data-api-url='add/global-filter' data-api-attr='{"filter_type":"prefilter"}' href="#" disabled><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
+ <button class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary validate_sieve" href="#">{{ lang.add.validate }}</button>
+ <button class="btn btn-sm btn-xs-lg btn-xs-half btn-success add_sieve_script" data-action="add_item" data-id="add_prefilter" data-api-url='add/global-filter' data-api-attr='{"filter_type":"prefilter"}' href="#" disabled><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
</div>
</div>
</div>
@@ -82,8 +82,8 @@
<div class="row mt-2">
<div class="col-sm-10 add_filter_btns">
<div class="btn-group">
- <button class="btn btn-sm btn-xs-half btn-secondary validate_sieve" href="#">{{ lang.add.validate }}</button>
- <button class="btn btn-sm btn-xs-half btn-success add_sieve_script" data-action="add_item" data-id="add_postfilter" data-api-url='add/global-filter' data-api-attr='{"filter_type":"postfilter"}' href="#" disabled><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
+ <button class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary validate_sieve" href="#">{{ lang.add.validate }}</button>
+ <button class="btn btn-sm btn-xs-lg btn-xs-half btn-success add_sieve_script" data-action="add_item" data-id="add_postfilter" data-api-url='add/global-filter' data-api-attr='{"filter_type":"postfilter"}' href="#" disabled><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-mailboxes.twig b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-mailboxes.twig
index d04cf0d..fce7d62 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-mailboxes.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-mailboxes.twig
@@ -1,4 +1,4 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-mailboxes" role="tabpanel" aria-labelledby="tab-mailboxes">
+<div class="tab-pane fade" id="tab-mailboxes" role="tabpanel" aria-labelledby="tab-mailboxes">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-mailboxes" data-bs-toggle="collapse" aria-controls="collapse-tab-mailboxes">
@@ -11,14 +11,14 @@
</div>
</div>
<div id="collapse-tab-mailboxes" class="card-body collapse" data-bs-parent="#mail-content">
- <div class="mass-actions-mailbox mb-4">
+ <div class="mass-actions-mailbox mb-4 d-none d-sm-block">
<div class="btn-group d-flex d-lg-none">
<a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="mailbox" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
<a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
<ul class="dropdown-menu">
- <li><a class="dropdown-item" data-datatables-expand="mailbox_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="mailbox_table">{{ lang.datatables.collapse_all }}</a></li>
- <li><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="mailbox_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="mailbox_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
<li class="dropdown-header">{{ lang.mailbox.mailbox }}</li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="mailbox" data-api-url='edit/mailbox' data-api-attr='{"active":"1"}' href="#">{{ lang.mailbox.activate }}</a></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="mailbox" data-api-url='edit/mailbox' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
@@ -54,6 +54,7 @@
<li class="dropdown-header">SMTP</li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="mailbox" data-api-url='edit/mailbox' data-api-attr='{"smtp_access":1}' href="#">{{ lang.mailbox.activate }}</a></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="mailbox" data-api-url='edit/mailbox' data-api-attr='{"smtp_access":0}' href="#">{{ lang.mailbox.deactivate }}</a></li>
+ <li><hr class="dropdown-divider"></li>
<li class="dropdown-header">Sieve</li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="mailbox" data-api-url='edit/mailbox' data-api-attr='{"sieve_access":1}' href="#">{{ lang.mailbox.activate }}</a></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="mailbox" data-api-url='edit/mailbox' data-api-attr='{"sieve_access":0}' href="#">{{ lang.mailbox.deactivate }}</a></li>
@@ -61,11 +62,11 @@
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addMailboxModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_mailbox }}</a>
</div>
<div class="btn-group d-none d-lg-flex">
- <a class="btn btn-sm btn-secondary" id="toggle_multi_select_all" data-id="mailbox" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
+ <a class="btn btn-sm btn-secondary" id="toggle_multi_select_all" data-id="mailbox" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
<a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
<ul class="dropdown-menu">
- <li><a class="dropdown-item" data-datatables-expand="mailbox_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="mailbox_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="mailbox_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="mailbox_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<div class="btn-group">
<a class="btn btn-sm btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.mailbox }}</a>
@@ -127,12 +128,12 @@
<table id="mailbox_table" class="table table-striped dt-responsive w-100"></table>
<div class="mass-actions-mailbox mt-4">
<div class="btn-group d-flex d-lg-none">
- <a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="mailbox" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
- <a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="mailbox" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
<ul class="dropdown-menu">
- <li><a class="dropdown-item" data-datatables-expand="mailbox_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="mailbox_table">{{ lang.datatables.collapse_all }}</a></li>
- <li><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="mailbox_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="mailbox_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
<li class="dropdown-header">{{ lang.mailbox.mailbox }}</li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="mailbox" data-api-url='edit/mailbox' data-api-attr='{"active":"1"}' href="#">{{ lang.mailbox.activate }}</a></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="mailbox" data-api-url='edit/mailbox' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
@@ -172,14 +173,14 @@
<li><a class="dropdown-item" data-action="edit_selected" data-id="mailbox" data-api-url='edit/mailbox' data-api-attr='{"sieve_access":1}' href="#">{{ lang.mailbox.activate }}</a></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="mailbox" data-api-url='edit/mailbox' data-api-attr='{"sieve_access":0}' href="#">{{ lang.mailbox.deactivate }}</a></li>
</ul>
- <a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addMailboxModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_mailbox }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addMailboxModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_mailbox }}</a>
</div>
<div class="btn-group d-none d-lg-flex">
<a class="btn btn-sm btn-secondary" id="toggle_multi_select_all" data-id="mailbox" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
<a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
<ul class="dropdown-menu">
- <li><a class="dropdown-item" data-datatables-expand="mailbox_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="mailbox_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="mailbox_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="mailbox_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<div class="btn-group">
<a class="btn btn-sm btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.mailbox }}</a>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-mbox-aliases.twig b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-mbox-aliases.twig
index 6b8fcaf..02b5b6d 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-mbox-aliases.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-mbox-aliases.twig
@@ -1,4 +1,4 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-mbox-aliases" role="tabpanel" aria-labelledby="tab-mbox-aliases">
+<div class="tab-pane fade" id="tab-mbox-aliases" role="tabpanel" aria-labelledby="tab-mbox-aliases">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-mbox-aliases" data-bs-toggle="collapse" aria-controls="collapse-tab-mbox-aliases">
@@ -11,7 +11,7 @@
</div>
</div>
<div id="collapse-tab-mbox-aliases" class="card-body collapse" data-bs-parent="#mail-content">
- <div class="mass-actions-mailbox mb-4">
+ <div class="mass-actions-mailbox mb-4 d-none d-sm-block">
<div class="btn-group">
<a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="alias" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
<a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
@@ -20,9 +20,9 @@
<li><a class="dropdown-item" data-action="edit_selected" data-id="alias" data-api-url='edit/alias' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-id="alias" data-api-url='delete/alias' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="alias_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="alias_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="alias_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="alias_table">{{ lang.datatables.collapse_all }}</a></li>
{% if not skip_sogo %}
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="alias" data-api-url='edit/alias' data-api-attr='{"sogo_visible":"1"}' href="#">{{ lang.mailbox.sogo_visible_y }}</a></li>
@@ -37,24 +37,24 @@
<table id="alias_table" class="table table-striped dt-responsive w-100"></table>
<div class="mass-actions-mailbox mt-4">
<div class="btn-group">
- <a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="alias" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
- <a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="alias" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
<ul class="dropdown-menu top33">
<li><a class="dropdown-item" data-action="edit_selected" data-id="alias" data-api-url='edit/alias' data-api-attr='{"active":"1"}' href="#">{{ lang.mailbox.activate }}</a></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="alias" data-api-url='edit/alias' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-id="alias" data-api-url='delete/alias' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="alias_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="alias_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="alias_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="alias_table">{{ lang.datatables.collapse_all }}</a></li>
{% if not skip_sogo %}
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="alias" data-api-url='edit/alias' data-api-attr='{"sogo_visible":"1"}' href="#">{{ lang.mailbox.sogo_visible_y }}</a></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="alias" data-api-url='edit/alias' data-api-attr='{"sogo_visible":"0"}' href="#">{{ lang.mailbox.sogo_visible_n }}</a></li>
{% endif %}
</ul>
- <a class="btn btn-sm btn-secondary" data-action="edit_selected" data-id="alias" data-api-url='edit/alias' data-api-attr='{"expand_alias":true}' ><i class="bi bi-arrows-angle-expand"></i> {{ lang.mailbox.add_alias_expand }}</a>
- <a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addAliasModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_alias }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-secondary" data-action="edit_selected" data-id="alias" data-api-url='edit/alias' data-api-attr='{"expand_alias":true}' ><i class="bi bi-arrows-angle-expand"></i> {{ lang.mailbox.add_alias_expand }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addAliasModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_alias }}</a>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-resources.twig b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-resources.twig
index 26d5d0f..34728ed 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-resources.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-resources.twig
@@ -1,4 +1,4 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-resources" role="tabpanel" aria-labelledby="tab-resources">
+<div class="tab-pane fade" id="tab-resources" role="tabpanel" aria-labelledby="tab-resources">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-resources" data-bs-toggle="collapse" aria-controls="collapse-tab-resources">
@@ -11,7 +11,7 @@
</div>
</div>
<div id="collapse-tab-resources" class="card-body collapse" data-bs-parent="#mail-content">
- <div class="mass-actions-mailbox mb-4">
+ <div class="mass-actions-mailbox mb-4 d-none d-sm-block">
<div class="btn-group">
<a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="resource" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
<a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
@@ -20,9 +20,9 @@
<li><a class="dropdown-item" data-action="edit_selected" data-id="resource" data-api-url='edit/resource' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-id="resource" data-api-url='delete/resource' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="resource_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="resource_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="resource_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="resource_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addResourceModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_resource }}</a>
</div>
@@ -34,18 +34,18 @@
<table id="resource_table" class="table table-striped dt-responsive w-100"></table>
<div class="mass-actions-mailbox mt-4">
<div class="btn-group">
- <a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="resource" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
- <a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="resource" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" data-action="edit_selected" data-id="resource" data-api-url='edit/resource' data-api-attr='{"active":"1"}' href="#">{{ lang.mailbox.activate }}</a></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="resource" data-api-url='edit/resource' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-id="resource" data-api-url='delete/resource' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="resource_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="resource_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="resource_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="resource_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
- <a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addResourceModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_resource }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addResourceModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_resource }}</a>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-syncjobs.twig b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-syncjobs.twig
index 8ecfda5..bfd8eef 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-syncjobs.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-syncjobs.twig
@@ -1,4 +1,4 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-syncjobs" role="tabpanel" aria-labelledby="tab-syncjobs">
+<div class="tab-pane fade" id="tab-syncjobs" role="tabpanel" aria-labelledby="tab-syncjobs">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-syncjobs" data-bs-toggle="collapse" aria-controls="collapse-tab-syncjobs">
@@ -11,7 +11,7 @@
</div>
</div>
<div id="collapse-tab-syncjobs" class="card-body collapse" data-bs-parent="#mail-content">
- <div class="mass-actions-mailbox mb-4">
+ <div class="mass-actions-mailbox mb-4 d-none d-sm-block">
<div class="btn-group" data-acl="{{ acl.syncjobs }}">
<a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="syncjob" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
<a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
@@ -22,9 +22,9 @@
<li><a class="dropdown-item" data-action="edit_selected" data-id="syncjob" data-api-url='edit/syncjob' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-id="syncjob" data-api-url='delete/syncjob' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="sync_job_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="sync_job_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="sync_job_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="sync_job_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addSyncJobModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.user.create_syncjob }}</a>
</div>
@@ -32,8 +32,8 @@
<table id="sync_job_table" class="table table-striped dt-responsive w-100"></table>
<div class="mass-actions-mailbox mt-4">
<div class="btn-group" data-acl="{{ acl.syncjobs }}">
- <a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="syncjob" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
- <a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="syncjob" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" data-action="edit_selected" data-id="syncjob" data-api-url='edit/syncjob' data-api-attr='{"last_run":"","success":""}' href="#">{{ lang.mailbox.last_run_reset }}</a></li>
<li><hr class="dropdown-divider"></li>
@@ -41,11 +41,11 @@
<li><a class="dropdown-item" data-action="edit_selected" data-id="syncjob" data-api-url='edit/syncjob' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-id="syncjob" data-api-url='delete/syncjob' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="sync_job_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="sync_job_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="sync_job_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="sync_job_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
- <a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addSyncJobModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.user.create_syncjob }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addSyncJobModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.user.create_syncjob }}</a>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-templates-domains.twig b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-templates-domains.twig
index 95bd2d7..f3c6a67 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-templates-domains.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-templates-domains.twig
@@ -1,4 +1,4 @@
-<div role="tabpanel" class="tab-pane fade show" id="tab-templates-domains" role="tabpanel" aria-labelledby="tab-templates-domains">
+<div class="tab-pane fade" id="tab-templates-domains" role="tabpanel" aria-labelledby="tab-templates-domains">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-sm-block d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-templates-domains" data-bs-toggle="collapse" aria-controls="collapse-tab-templates-domains">
@@ -10,39 +10,39 @@
<button class="btn btn-xs btn-secondary refresh_table" data-draw="draw_templates_domain_table" data-table="templates_domain_table">{{ lang.admin.refresh }}</button>
</div>
</div>
- <div id="collapse-tab-templates-domains" class="card-body collapse show" data-bs-parent="#mail-content">
- <div class="mass-actions-mailbox mb-4">
+ <div id="collapse-tab-templates-domains" class="card-body collapse" data-bs-parent="#mail-content">
+ <div class="mass-actions-mailbox mb-4 d-none d-sm-block">
<div class="btn-group">
<button class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="domain_template" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</button>
<button class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</button>
<ul class="dropdown-menu">
{% if mailcow_cc_role == 'admin' %}
<li><a class="dropdown-item" data-action="delete_selected" data-id="domain_template" data-api-url='delete/domain/template' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="templates_domain_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="templates_domain_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="templates_domain_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="templates_domain_table">{{ lang.datatables.collapse_all }}</a></li>
{% endif %}
</ul>
{% if mailcow_cc_role == 'admin' %}
- <a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addDomainTemplateModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_template }}</a>
+ <button class="btn btn-sm btn-success" data-bs-toggle="modal" data-bs-target="#addDomainTemplateModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_template }}</button>
{% endif %}
</div>
</div>
<table id="templates_domain_table" class="table table-striped dt-responsive w-100"></table>
<div class="mass-actions-mailbox mt-4">
<div class="btn-group">
- <button class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="domain_template" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</button>
- <button class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</button>
+ <button class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="domain_template" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</button>
+ <button class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</button>
<ul class="dropdown-menu">
{% if mailcow_cc_role == 'admin' %}
<li><a class="dropdown-item" data-action="delete_selected" data-id="domain_template" data-api-url='delete/domain/template' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="templates_domain_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="templates_domain_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="templates_domain_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="templates_domain_table">{{ lang.datatables.collapse_all }}</a></li>
{% endif %}
</ul>
{% if mailcow_cc_role == 'admin' %}
- <a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addDomainTemplateModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_template }}</a>
+ <button class="btn btn-sm btn-xs-lg btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addDomainTemplateModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_template }}</button>
{% endif %}
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-templates-mbox.twig b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-templates-mbox.twig
index a43ec91..71edb9d 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-templates-mbox.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-templates-mbox.twig
@@ -1,4 +1,4 @@
-<div role="tabpanel" class="tab-pane fade show" id="tab-templates-mbox" role="tabpanel" aria-labelledby="tab-templates-mbox">
+<div class="tab-pane fade" id="tab-templates-mbox" role="tabpanel" aria-labelledby="tab-templates-mbox">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-sm-block d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-templates-mbox" data-bs-toggle="collapse" aria-controls="collapse-tab-templates-mbox">
@@ -10,39 +10,39 @@
<button class="btn btn-xs btn-secondary refresh_table" data-draw="draw_templates_mbox_table" data-table="templates_mbox_table">{{ lang.admin.refresh }}</button>
</div>
</div>
- <div id="collapse-tab-templates-mbox" class="card-body collapse show" data-bs-parent="#mail-content">
- <div class="mass-actions-mailbox mb-4">
+ <div id="collapse-tab-templates-mbox" class="card-body collapse" data-bs-parent="#mail-content">
+ <div class="mass-actions-mailbox mb-4 d-none d-sm-block">
<div class="btn-group">
<button class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="mailbox_template" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</button>
<button class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</button>
<ul class="dropdown-menu">
{% if mailcow_cc_role == 'admin' %}
<li><a class="dropdown-item" data-action="delete_selected" data-id="mailbox_template" data-api-url='delete/mailbox/template' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="templates_mbox_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="templates_mbox_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="templates_mbox_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="templates_mbox_table">{{ lang.datatables.collapse_all }}</a></li>
{% endif %}
</ul>
{% if mailcow_cc_role == 'admin' %}
- <a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addMailboxTemplateModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_template }}</a>
+ <button class="btn btn-sm btn-success" data-bs-toggle="modal" data-bs-target="#addMailboxTemplateModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_template }}</button>
{% endif %}
</div>
</div>
<table id="templates_mbox_table" class="table table-striped dt-responsive w-100"></table>
<div class="mass-actions-mailbox mt-4">
<div class="btn-group">
- <button class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="mailbox_template" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</button>
- <button class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</button>
+ <button class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="mailbox_template" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</button>
+ <button class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</button>
<ul class="dropdown-menu">
{% if mailcow_cc_role == 'admin' %}
<li><a class="dropdown-item" data-action="delete_selected" data-id="mailbox_template" data-api-url='delete/mailbox/template' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="templates_mbox_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="templates_mbox_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="templates_mbox_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="templates_mbox_table">{{ lang.datatables.collapse_all }}</a></li>
{% endif %}
</ul>
{% if mailcow_cc_role == 'admin' %}
- <a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addMailboxTemplateModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_template }}</a>
+ <button class="btn btn-sm btn-xs-lg btn-success" data-bs-toggle="modal" data-bs-target="#addMailboxTemplateModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_template }}</button>
{% endif %}
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-tls-policy.twig b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-tls-policy.twig
index efefcf2..3195b75 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-tls-policy.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/mailbox/tab-tls-policy.twig
@@ -1,4 +1,4 @@
-<div role="tabpanel" class="tab-pane fade{% if mailcow_cc_role != 'admin' %} d-none{% endif %}" id="tab-tls-policy" role="tabpanel" aria-labelledby="tab-tls-policy">
+<div class="tab-pane fade{% if mailcow_cc_role != 'admin' %} d-none{% endif %}" id="tab-tls-policy" role="tabpanel" aria-labelledby="tab-tls-policy">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-tls-policy" data-bs-toggle="collapse" aria-controls="collapse-tab-tls-policy">
@@ -11,7 +11,7 @@
</div>
</div>
<div id="collapse-tab-tls-policy" class="card-body collapse" data-bs-parent="#mail-content">
- <div class="mass-actions-mailbox mb-4">
+ <div class="mass-actions-mailbox mb-4 d-none d-sm-block">
<div class="btn-group">
<a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="tls-policy-map" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
<a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
@@ -20,9 +20,9 @@
<li><a class="dropdown-item" data-action="edit_selected" data-id="tls-policy-map" data-api-url='edit/tls-policy-map' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-id="tls-policy-map" data-api-url='delete/tls-policy-map' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="tls_policy_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="tls_policy_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="tls_policy_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="tls_policy_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addTLSPolicyMapAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_tls_policy_map }}</a>
</div>
@@ -31,18 +31,18 @@
<table id="tls_policy_table" class="table table-striped dt-responsive w-100"></table>
<div class="mass-actions-mailbox mt-4">
<div class="btn-group">
- <a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="tls-policy-map" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
- <a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="tls-policy-map" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" data-action="edit_selected" data-id="tls-policy-map" data-api-url='edit/tls-policy-map' data-api-attr='{"active":"1"}' href="#">{{ lang.mailbox.activate }}</a></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="tls-policy-map" data-api-url='edit/tls-policy-map' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="delete_selected" data-id="tls-policy-map" data-api-url='delete/tls-policy-map' href="#">{{ lang.mailbox.remove }}</a></li>
- <li><hr class="dropdown-divider"></li>
- <li><a class="dropdown-item" data-datatables-expand="tls_policy_table">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="tls_policy_table">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="tls_policy_table">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="tls_policy_table">{{ lang.datatables.collapse_all }}</a></li>
</ul>
- <a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addTLSPolicyMapAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_tls_policy_map }}</a>
+ <a class="btn btn-sm btn-xs-lg btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addTLSPolicyMapAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_tls_policy_map }}</a>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/modals/admin.twig b/mailcow/src/mailcow-dockerized/data/web/templates/modals/admin.twig
index 15971e5..2271ca7 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/modals/admin.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/modals/admin.twig
@@ -22,8 +22,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active" checked> {{ lang.admin.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.admin.active }}</label>
</div>
</div>
</div>
@@ -81,8 +81,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active" checked> {{ lang.admin.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.admin.active }}</label>
</div>
</div>
</div>
@@ -181,8 +181,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active" checked> {{ lang.admin.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.admin.active }}</label>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/modals/mailbox.twig b/mailcow/src/mailcow-dockerized/data/web/templates/modals/mailbox.twig
index 25185de..1f96851 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/modals/mailbox.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/modals/mailbox.twig
@@ -78,16 +78,16 @@
<div class="col-sm-10">
<div class="btn-group">
<input type="radio" class="btn-check" name="quarantine_notification" id="quarantine_notification_never" autocomplete="off" value="never">
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="quarantine_notification_never">{{ lang.user.never }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_notification_never">{{ lang.user.never }}</label>
<input type="radio" class="btn-check" name="quarantine_notification" id="quarantine_notification_hourly" autocomplete="off" value="hourly">
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="quarantine_notification_hourly">{{ lang.user.hourly }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_notification_hourly">{{ lang.user.hourly }}</label>
<input type="radio" class="btn-check" name="quarantine_notification" id="quarantine_notification_daily" autocomplete="off" value="daily">
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="quarantine_notification_daily">{{ lang.user.daily }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_notification_daily">{{ lang.user.daily }}</label>
<input type="radio" class="btn-check" name="quarantine_notification" id="quarantine_notification_weekly" autocomplete="off" value="weekly">
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="quarantine_notification_weekly">{{ lang.user.weekly }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_notification_weekly">{{ lang.user.weekly }}</label>
</div>
<p class="text-muted"><small>{{ lang.user.quarantine_notification_info }}</small></p>
</div>
@@ -97,13 +97,13 @@
<div class="col-sm-10">
<div class="btn-group">
<input type="radio" class="btn-check" name="quarantine_category" id="quarantine_category_reject" autocomplete="off" value="reject">
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="quarantine_category_reject">{{ lang.user.q_reject }}</label>
-
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_category_reject">{{ lang.user.q_reject }}</label>
+
<input type="radio" class="btn-check" name="quarantine_category" id="quarantine_category_add_header" autocomplete="off" value="add_header">
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="quarantine_category_add_header">{{ lang.user.q_add_header }}</label>
-
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_category_add_header">{{ lang.user.q_add_header }}</label>
+
<input type="radio" class="btn-check" name="quarantine_category" id="quarantine_category_all" autocomplete="off" value="all">
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="quarantine_category_all">{{ lang.user.q_all }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="quarantine_category_all">{{ lang.user.q_all }}</label>
</div>
<p class="text-muted"><small>{{ lang.user.quarantine_category_info }}</small></p>
</div>
@@ -113,10 +113,10 @@
<div class="col-sm-10">
<div class="btn-group">
<input type="checkbox" class="btn-check" name="tls_enforce_in" id="tls_enforce_in" autocomplete="off" value="1">
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="tls_enforce_in">{{ lang.user.tls_enforce_in }}</label>
-
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="tls_enforce_in">{{ lang.user.tls_enforce_in }}</label>
+
<input type="checkbox" class="btn-check" name="tls_enforce_out" id="tls_enforce_out" autocomplete="off" value="1">
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="tls_enforce_out">{{ lang.user.tls_enforce_out }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="tls_enforce_out">{{ lang.user.tls_enforce_out }}</label>
</div>
</div>
</div>
@@ -155,14 +155,13 @@
<div class="row mb-4">
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.acl.ratelimit }}</label>
<div class="col-sm-10">
- <input name="rl_value" id="rl_value" type="number" autocomplete="off" value="" class="form-control mb-2" placeholder="{{ lang.ratelimit.disabled }}">
- <select name="rl_frame" id="rl_frame" class="form-control">
- <option value="s">{{ lang.ratelimit.second }}</option>
- <option value="m">{{ lang.ratelimit.minute }}</option>
- <option value="h">{{ lang.ratelimit.hour }}</option>
- <option value="d">{{ lang.ratelimit.day }}</option>
- </select>
- <p class="text-muted mt-3">{{ lang.edit.mbox_rl_info }}</p>
+ <div class="input-group">
+ <input name="rl_value" id="rl_value" type="number" autocomplete="off" value="" class="form-control mb-2" placeholder="{{ lang.ratelimit.disabled }}">
+ <select name="rl_frame" id="rl_frame" class="form-control">
+ {% include 'mailbox/rl-frame.twig' %}
+ </select>
+ </div>
+ <p class="text-muted mt-1">{{ lang.edit.mbox_rl_info }}</p>
</div>
</div>
<div class="row mb-2">
@@ -176,8 +175,8 @@
</div>
<div class="row">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="force_pw_update" id="force_pw_update"> {{ lang.edit.force_pw_update }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="force_pw_update" id="force_pw_update"> {{ lang.edit.force_pw_update }}</label>
<small class="text-muted">{{ lang.edit.force_pw_update_info|format(ui_texts.main_name) }}</small>
</div>
</div>
@@ -185,8 +184,8 @@
{% if not skip_sogo %}
<div class="row">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="sogo_access" id="sogo_access"> {{ lang.edit.sogo_access }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="sogo_access" id="sogo_access"> {{ lang.edit.sogo_access }}</label>
<small class="text-muted">{{ lang.edit.sogo_access_info }}</small>
</div>
</div>
@@ -216,7 +215,7 @@
<input type="hidden" value="default" name="sender_acl">
<input type="hidden" value="0" name="force_pw_update">
<input type="hidden" value="0" name="sogo_access">
- <input type="hidden" value="0" name="protocol_access">
+ <input type="hidden" value="0" name="protocol_access">
<div class="row mb-4">
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="template">{{ lang.mailbox.template }}</label>
@@ -248,16 +247,16 @@
<div class="col-sm-10">
<div class="btn-group">
<input type="radio" class="btn-check" name="quarantine_notification" id="template_quarantine_notification_never" autocomplete="off" value="never">
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="template_quarantine_notification_never">{{ lang.user.never }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_quarantine_notification_never">{{ lang.user.never }}</label>
<input type="radio" class="btn-check" name="quarantine_notification" id="template_quarantine_notification_hourly" autocomplete="off" value="hourly">
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="template_quarantine_notification_hourly">{{ lang.user.hourly }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_quarantine_notification_hourly">{{ lang.user.hourly }}</label>
<input type="radio" class="btn-check" name="quarantine_notification" id="template_quarantine_notification_daily" autocomplete="off" value="daily">
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="template_quarantine_notification_daily">{{ lang.user.daily }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_quarantine_notification_daily">{{ lang.user.daily }}</label>
<input type="radio" class="btn-check" name="quarantine_notification" id="template_quarantine_notification_weekly" autocomplete="off" value="weekly">
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="template_quarantine_notification_weekly">{{ lang.user.weekly }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_quarantine_notification_weekly">{{ lang.user.weekly }}</label>
</div>
<p class="text-muted"><small>{{ lang.user.quarantine_notification_info }}</small></p>
</div>
@@ -267,13 +266,13 @@
<div class="col-sm-10">
<div class="btn-group">
<input type="radio" class="btn-check" name="quarantine_category" id="template_quarantine_category_reject" autocomplete="off" value="reject" >
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="template_quarantine_category_reject">{{ lang.user.q_reject }}</label>
-
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_quarantine_category_reject">{{ lang.user.q_reject }}</label>
+
<input type="radio" class="btn-check" name="quarantine_category" id="template_quarantine_category_add_header" autocomplete="off" value="add_header">
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="template_quarantine_category_add_header">{{ lang.user.q_add_header }}</label>
-
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_quarantine_category_add_header">{{ lang.user.q_add_header }}</label>
+
<input type="radio" class="btn-check" name="quarantine_category" id="template_quarantine_category_all" autocomplete="off" value="all">
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="template_quarantine_category_all">{{ lang.user.q_all }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_quarantine_category_all">{{ lang.user.q_all }}</label>
</div>
<p class="text-muted"><small>{{ lang.user.quarantine_category_info }}</small></p>
</div>
@@ -283,10 +282,10 @@
<div class="col-sm-10">
<div class="btn-group">
<input type="checkbox" class="btn-check" name="tls_enforce_in" id="template_tls_enforce_in" autocomplete="off" value="1">
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="template_tls_enforce_in">{{ lang.user.tls_enforce_in }}</label>
-
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_tls_enforce_in">{{ lang.user.tls_enforce_in }}</label>
+
<input type="checkbox" class="btn-check" name="tls_enforce_out" id="template_tls_enforce_out" autocomplete="off" value="1">
- <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary" for="template_tls_enforce_out">{{ lang.user.tls_enforce_out }}</label>
+ <label class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-light" for="template_tls_enforce_out">{{ lang.user.tls_enforce_out }}</label>
</div>
</div>
</div>
@@ -304,7 +303,7 @@
<div class="row mb-4">
<label class="control-label col-sm-2 text-sm-end text-sm-end">ACL</label>
<div class="col-sm-10">
- <select id="template_user_acl" name="acl" size="10" multiple class="form-control">
+ <select id="template_user_acl" name="acl" size="10" multiple class="form-control">
<option value="spam_alias" selected>{{ lang.acl["spam_alias"] }}</option>
<option value="tls_policy" selected>{{ lang.acl["tls_policy"] }}</option>
<option value="spam_score" selected>{{ lang.acl["spam_score"] }}</option>
@@ -325,14 +324,13 @@
<div class="row mb-4">
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.acl.ratelimit }}</label>
<div class="col-sm-10">
- <input name="rl_value" type="number" autocomplete="off" value="" class="form-control mb-2" placeholder="{{ lang.ratelimit.disabled }}">
- <select name="rl_frame" class="form-control">
- <option value="s">{{ lang.ratelimit.second }}</option>
- <option value="m">{{ lang.ratelimit.minute }}</option>
- <option value="h">{{ lang.ratelimit.hour }}</option>
- <option value="d">{{ lang.ratelimit.day }}</option>
- </select>
- <p class="text-muted mt-3">{{ lang.edit.mbox_rl_info }}</p>
+ <div class="input-group">
+ <input name="rl_value" type="number" autocomplete="off" value="" class="form-control mb-2" placeholder="{{ lang.ratelimit.disabled }}">
+ <select name="rl_frame" class="form-control">
+ {% include 'mailbox/rl-frame.twig' %}
+ </select>
+ </div>
+ <p class="text-muted mt-1">{{ lang.edit.mbox_rl_info }}</p>
</div>
</div>
<hr>
@@ -347,8 +345,8 @@
</div>
<div class="row">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="force_pw_update"> {{ lang.edit.force_pw_update }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="force_pw_update"> {{ lang.edit.force_pw_update }}</label>
<small class="text-muted">{{ lang.edit.force_pw_update_info|format(ui_texts.main_name) }}</small>
</div>
</div>
@@ -356,8 +354,8 @@
{% if not skip_sogo %}
<div class="row">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="sogo_access"> {{ lang.edit.sogo_access }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="sogo_access"> {{ lang.edit.sogo_access }}</label>
<small class="text-muted">{{ lang.edit.sogo_access_info }}</small>
</div>
</div>
@@ -445,8 +443,8 @@
{% if not skip_sogo %}
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" id="addDomain_gal" value="1" name="gal" checked> {{ lang.edit.gal }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" id="addDomain_gal" value="1" name="gal" checked> {{ lang.edit.gal }}</label>
<small class="text-muted">{{ lang.edit.gal_info|raw }}</small>
</div>
</div>
@@ -454,21 +452,21 @@
{% endif %}
<div class="row mb-4">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" id="addDomain_active" value="1" name="active" checked> {{ lang.add.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" id="addDomain_active" value="1" name="active" checked> {{ lang.add.active }}</label>
</div>
</div>
</div>
<hr>
<div class="row mb-4">
<label class="control-label col-sm-2 text-sm-end" for="rl_frame">{{ lang.acl.ratelimit }}</label>
- <div class="col-sm-7">
- <input name="rl_value" id="addDomain_rl_value" type="number" class="form-control" placeholder="{{ lang.ratelimit.disabled }}">
- </div>
- <div class="col-sm-3">
- <select name="rl_frame" id="addDomain_rl_frame" class="form-control">
- {% include 'mailbox/rl-frame.twig' %}
- </select>
+ <div class="col-sm-10">
+ <div class="input-group">
+ <input name="rl_value" id="addDomain_rl_value" type="number" class="form-control" placeholder="{{ lang.ratelimit.disabled }}">
+ <select name="rl_frame" id="addDomain_rl_frame" class="form-control">
+ {% include 'mailbox/rl-frame.twig' %}
+ </select>
+ </div>
</div>
</div>
<hr>
@@ -481,7 +479,7 @@
<div class="row mb-4">
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="key_size">{{ lang.admin.dkim_key_length }}</label>
<div class="col-sm-10">
- <select data-style="btn btn-secondary btn-sm" class="form-control" id="key_size" name="key_size">
+ <select data-style="btn btn-light" class="form-control" id="key_size" name="key_size">
<option data-subtext="bits" value="1024">1024</option>
<option data-subtext="bits" value="2048" selected>2048</option>
</select>
@@ -491,12 +489,12 @@
<div class="row mb-4">
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.add.backup_mx_options }}</label>
<div class="col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" id="addDomain_relay_domain" value="1" name="backupmx"> {{ lang.add.relay_domain }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" id="addDomain_relay_domain" value="1" name="backupmx"> {{ lang.add.relay_domain }}</label>
<br>
- <label><input type="checkbox" id="addDomain_relay_all" value="1" name="relay_all_recipients"> {{ lang.add.relay_all }}</label>
+ <label><input type="checkbox" class="form-check-input" id="addDomain_relay_all" value="1" name="relay_all_recipients"> {{ lang.add.relay_all }}</label>
<p>{{ lang.add.relay_all_info|raw }}</p>
- <label><input type="checkbox" id="addDomain_relay_unknown_only" value="1" name="relay_unknown_only"> {{ lang.add.relay_unknown_only }}</label>
+ <label><input type="checkbox" class="form-check-input" id="addDomain_relay_unknown_only" value="1" name="relay_unknown_only"> {{ lang.add.relay_unknown_only }}</label>
<br>
<p>{{ lang.add.relay_transport_info|raw }}</p>
</div>
@@ -508,7 +506,6 @@
{% if not skip_sogo %}
<button class="btn btn-xs-lg btn-xs-half d-block d-sm-inline btn-secondary" data-action="add_item" data-id="add_domain" data-api-url='add/domain' data-api-attr='{"tags": []}' href="#">{{ lang.add.add_domain_only }}</button>
<button class="btn btn-xs-lg btn-xs-half d-block d-sm-inline btn-secondary" data-action="add_item" data-id="add_domain" data-api-url='add/domain' data-api-attr='{"restart_sogo":"1", "tags": []}' href="#">{{ lang.add.add_domain_restart }}</button>
- <div class="clearfix visible-xs"></div>
{% else %}
<button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="add_item" data-id="add_domain" data-api-url='add/domain' data-api-attr='{"tags": []}' href="#">{{ lang.add.add }}</button>
{% endif %}
@@ -584,32 +581,29 @@
</div>
<div class="row">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="gal" checked> {{ lang.add.gal }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="gal" checked> {{ lang.add.gal }}</label>
<small class="text-muted">{{ lang.add.gal_info|raw }}</small>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active" checked> {{ lang.add.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
</div>
</div>
</div>
<hr>
<div class="row">
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.edit.ratelimit }}</label>
- <div class="col-sm-7">
- <input name="rl_value" type="number" value="" autocomplete="off" class="form-control mb-4" placeholder="{{ lang.ratelimit.disabled }}">
- </div>
- <div class="col-sm-3">
- <select name="rl_frame" class="form-control">
- <option value="s">{{ lang.ratelimit.second }}</option>
- <option value="m">{{ lang.ratelimit.minute }}</option>
- <option value="h">{{ lang.ratelimit.hour }}</option>
- <option value="d">{{ lang.ratelimit.day }}</option>
- </select>
+ <div class="col-sm-10">
+ <div class="input-group">
+ <input name="rl_value" type="number" value="" autocomplete="off" class="form-control mb-4" placeholder="{{ lang.ratelimit.disabled }}">
+ <select name="rl_frame" class="form-control">
+ {% include 'mailbox/rl-frame.twig' %}
+ </select>
+ </div>
</div>
</div>
{% endif %}
@@ -623,7 +617,7 @@
<div class="row mb-4">
<label class="control-label col-sm-2 text-sm-end text-sm-end" for="key_size">{{ lang.admin.dkim_key_length }}</label>
<div class="col-sm-10">
- <select data-style="btn btn-secondary btn-sm" class="form-control" id="key_size" name="key_size">
+ <select data-style="btn btn-light" class="form-control" id="key_size" name="key_size">
<option data-subtext="bits">1024</option>
<option data-subtext="bits" selected>2048</option>
</select>
@@ -633,12 +627,12 @@
<div class="row mb-2">
<label class="control-label col-sm-2 text-sm-end text-sm-end">{{ lang.edit.backup_mx_options }}</label>
<div class="col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="backupmx"> {{ lang.edit.relay_domain }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="backupmx"> {{ lang.edit.relay_domain }}</label>
<br>
- <label><input type="checkbox" value="1" name="relay_all_recipients"> {{ lang.edit.relay_all }}</label>
+ <label><input type="checkbox" class="form-check-input" value="1" name="relay_all_recipients"> {{ lang.edit.relay_all }}</label>
<p>{{ lang.edit.relay_all_info|raw }}</p>
- <label><input type="checkbox" value="1" name="relay_unknown_only"> {{ lang.edit.relay_unknown_only }}</label>
+ <label><input type="checkbox" class="form-check-input" value="1" name="relay_unknown_only"> {{ lang.edit.relay_unknown_only }}</label>
<br>
<p>{{ lang.edit.relay_transport_info|raw }}</p>
</div>
@@ -708,8 +702,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active" checked> {{ lang.add.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
</div>
</div>
</div>
@@ -746,19 +740,19 @@
<div class="col-sm-10">
<textarea id="textarea_alias_goto" autocorrect="off" autocapitalize="none" class="form-control" rows="5" id="goto" name="goto" required></textarea>
<p>{{ lang.add.target_address_info|raw }}</p>
- <div class="checkbox">
- <label><input class="goto_checkbox" type="checkbox" value="1" name="goto_null"> {{ lang.add.goto_null }}</label>
+ <div class="form-check">
+ <label><input class="form-check-input goto_checkbox" type="checkbox" value="1" name="goto_null"> {{ lang.add.goto_null }}</label>
</div>
- <div class="checkbox">
- <label><input class="goto_checkbox" type="checkbox" value="1" name="goto_spam"> {{ lang.add.goto_spam|raw }}</label>
+ <div class="form-check">
+ <label><input class="form-check-input goto_checkbox" type="checkbox" value="1" name="goto_spam"> {{ lang.add.goto_spam|raw }}</label>
</div>
- <div class="checkbox">
- <label><input class="goto_checkbox" type="checkbox" value="1" name="goto_ham"> {{ lang.add.goto_ham|raw }}</label>
+ <div class="form-check">
+ <label><input class="form-check-input goto_checkbox" type="checkbox" value="1" name="goto_ham"> {{ lang.add.goto_ham|raw }}</label>
</div>
{% if not skip_sogo %}
<hr>
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="sogo_visible" checked> {{ lang.edit.sogo_visible }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="sogo_visible" checked> {{ lang.edit.sogo_visible }}</label>
</div>
<p class="text-muted">{{ lang.edit.sogo_visible_info }}</p>
{% endif %}
@@ -766,8 +760,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active" checked> {{ lang.add.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
</div>
</div>
</div>
@@ -811,21 +805,21 @@
</div>
<div class="row mb-4">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active" checked> {{ lang.add.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
</div>
</div>
</div>
<hr>
<div class="row mb-2">
<label class="control-label col-sm-2 text-sm-end" for="rl_frame">{{ lang.acl.ratelimit }}</label>
- <div class="col-sm-7">
- <input name="rl_value" type="number" class="form-control" placeholder="{{ lang.ratelimit.disabled }}">
- </div>
- <div class="col-sm-3">
- <select name="rl_frame" class="form-control">
+ <div class="col-sm-10">
+ <div class="input-group">
+ <input name="rl_value" type="number" class="form-control" placeholder="{{ lang.ratelimit.disabled }}">
+ <select name="rl_frame" class="form-control">
{% include 'mailbox/rl-frame.twig' %}
- </select>
+ </select>
+ </div>
</div>
</div>
<hr>
@@ -838,7 +832,7 @@
<div class="row mb-4">
<label class="control-label col-sm-2 text-sm-end" for="key_size2">{{ lang.admin.dkim_key_length }}</label>
<div class="col-sm-10">
- <select data-style="btn btn-secondary btn-sm" class="form-control" id="key_size2" name="key_size">
+ <select data-style="btn btn-light" class="form-control" id="key_size2" name="key_size">
<option data-subtext="bits">1024</option>
<option data-subtext="bits" selected>2048</option>
</select>
@@ -967,50 +961,50 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="delete2duplicates" checked> {{ lang.add.delete2duplicates }} (--delete2duplicates)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="delete2duplicates" checked> {{ lang.add.delete2duplicates }} (--delete2duplicates)</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="delete1"> {{ lang.add.delete1 }} (--delete1)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="delete1"> {{ lang.add.delete1 }} (--delete1)</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="delete2"> {{ lang.add.delete2 }} (--delete2)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="delete2"> {{ lang.add.delete2 }} (--delete2)</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="automap" checked> {{ lang.add.automap }} (--automap)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="automap" checked> {{ lang.add.automap }} (--automap)</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="skipcrossduplicates"> {{ lang.add.skipcrossduplicates }} (--skipcrossduplicates)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="skipcrossduplicates"> {{ lang.add.skipcrossduplicates }} (--skipcrossduplicates)</label>
</div>
</div>
</div>
<div class="row mb-4">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="subscribeall" checked> {{ lang.add.subscribeall }} (--subscribeall)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="subscribeall" checked> {{ lang.add.subscribeall }} (--subscribeall)</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active" checked> {{ lang.add.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
</div>
</div>
</div>
@@ -1068,8 +1062,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active" checked> {{ lang.add.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
</div>
</div>
</div>
@@ -1121,8 +1115,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active" checked> {{ lang.add.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
</div>
</div>
</div>
@@ -1162,8 +1156,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active" checked> {{ lang.add.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
</div>
</div>
</div>
@@ -1218,8 +1212,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active" checked> {{ lang.add.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/modals/user.twig b/mailcow/src/mailcow-dockerized/data/web/templates/modals/user.twig
index 8c96397..9605184 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/modals/user.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/modals/user.twig
@@ -127,50 +127,50 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="delete2duplicates" checked> {{ lang.add.delete2duplicates }} (--delete2duplicates)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="delete2duplicates" checked> {{ lang.add.delete2duplicates }} (--delete2duplicates)</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="delete1"> {{ lang.add.delete1 }} (--delete1)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="delete1"> {{ lang.add.delete1 }} (--delete1)</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="delete2"> {{ lang.add.delete2 }} (--delete2)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="delete2"> {{ lang.add.delete2 }} (--delete2)</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="automap" checked> {{ lang.add.automap }} (--automap)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="automap" checked> {{ lang.add.automap }} (--automap)</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="skipcrossduplicates"> {{ lang.add.skipcrossduplicates }} (--skipcrossduplicates)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="skipcrossduplicates"> {{ lang.add.skipcrossduplicates }} (--skipcrossduplicates)</label>
</div>
</div>
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="subscribeall" checked> {{ lang.add.subscribeall }} (--subscribeall)</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="subscribeall" checked> {{ lang.add.subscribeall }} (--subscribeall)</label>
</div>
</div>
</div>
<div class="row mb-4">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active" checked> {{ lang.add.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
</div>
</div>
</div>
@@ -228,8 +228,8 @@
</div>
<div class="row mb-2">
<div class="offset-sm-2 col-sm-10">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active" checked> {{ lang.add.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active" checked> {{ lang.add.active }}</label>
</div>
</div>
</div>
@@ -285,15 +285,13 @@
<label class="control-label col-sm-3" for="user_old_pass">{{ lang.user.password_now }}</label>
<div class="col-sm-9">
<input type="password" class="form-control" name="user_old_pass" autocomplete="off" required>
+ {% if number_of_app_passwords > 0 %}
+ <div class="invalid-feedback d-block">
+ {{ lang.user.change_password_hint_app_passwords|format(number_of_app_passwords) }}
+ </div>
+ {% endif %}
</div>
</div>
- {% if number_of_app_passwords > 0 %}
- <div class="row mb-2">
- <div class="offset-sm-3 col-sm-9">
- <small>{{ lang.user.change_password_hint_app_passwords | replace({'{{number_of_app_passwords}}': number_of_app_passwords}) }}</small>
- </div>
- </div>
- {% endif %}
<div class="row">
<div class="offset-sm-3 col-sm-9">
<button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="edit_selected" data-id="pwchange" data-item="null" data-api-url='edit/self' data-api-attr='{}' href="#">{{ lang.user.change_password }}</button>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/quarantine.twig b/mailcow/src/mailcow-dockerized/data/web/templates/quarantine.twig
index c0b3737..79b5ea1 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/quarantine.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/quarantine.twig
@@ -16,9 +16,9 @@
<a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" id="toggle_multi_select_all" data-id="qitems" href="#"><i class="bi bi-check-all"></i> {{ lang.quarantine.toggle_all }}</a>
<a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.quarantine.quick_actions }}</a>
<ul class="dropdown-menu">
- <li><a class="dropdown-item" data-datatables-expand="quarantinetable" data-table="quarantinetable" href="#">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="quarantinetable" data-table="quarantinetable" href="#">{{ lang.datatables.collapse_all }}</a></li>
- <li><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="quarantinetable" data-table="quarantinetable" href="#">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="quarantinetable" data-table="quarantinetable" href="#">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="qitems" data-api-url='edit/qitem' data-api-attr='{"action":"release"}' href="#">{{ lang.quarantine.deliver_inbox }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="qitems" data-api-url='edit/qitem' data-api-attr='{"action":"learnspam"}' href="#">{{ lang.quarantine.learn_spam_delete }}</a></li>
@@ -37,15 +37,15 @@
</p>
{% endif %}
</p>
- <table id="quarantinetable" class="table table-striped"></table>
+ <table id="quarantinetable" class="table table-striped w-100"></table>
<div class="mass-actions-quarantine mt-4">
<div class="btn-group" data-acl="{{ acl.quarantine }}">
<a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" id="toggle_multi_select_all" data-id="qitems" href="#"><i class="bi bi-check-all"></i> {{ lang.quarantine.toggle_all }}</a>
<a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.quarantine.quick_actions }}</a>
<ul class="dropdown-menu">
- <li><a class="dropdown-item" data-datatables-expand="quarantinetable" data-table="quarantinetable" href="#">{{ lang.datatables.expand_all }}</a></li>
- <li><a class="dropdown-item" data-datatables-collapse="quarantinetable" data-table="quarantinetable" href="#">{{ lang.datatables.collapse_all }}</a></li>
- <li><hr class="dropdown-divider"></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="quarantinetable" data-table="quarantinetable" href="#">{{ lang.datatables.expand_all }}</a></li>
+ <li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="quarantinetable" data-table="quarantinetable" href="#">{{ lang.datatables.collapse_all }}</a></li>
+ <li class="table_collapse_option"><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="qitems" data-api-url='edit/qitem' data-api-attr='{"action":"release"}' href="#">{{ lang.quarantine.deliver_inbox }}</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" data-action="edit_selected" data-id="qitems" data-api-url='edit/qitem' data-api-attr='{"action":"learnspam"}' href="#">{{ lang.quarantine.learn_spam_delete }}</a></li>
@@ -66,7 +66,7 @@
var lang = {{ lang_quarantine|raw }};
var lang_datatables = {{ lang_datatables|raw }};
var csrf_token = '{{ csrf_token }}';
-var pagination_size = '{{ pagination_size }}';
+var pagination_size = Math.trunc('{{ pagination_size }}');
var role = '{{ role }}';
</script>
{% endblock %}
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/queue.twig b/mailcow/src/mailcow-dockerized/data/web/templates/queue.twig
index 1a5d4ff..e843c18 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/queue.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/queue.twig
@@ -55,7 +55,7 @@
var lang = {{ lang_queue|raw }};
var lang_datatables = {{ lang_datatables|raw }};
var csrf_token = '{{ csrf_token }}';
- var pagination_size = '{{ pagination_size }}';
+ var pagination_size = Math.trunc('{{ pagination_size }}');
var table_for_domain = '{{ domain }}';
</script>
{% endblock %}
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/user.twig b/mailcow/src/mailcow-dockerized/data/web/templates/user.twig
index 22cc00d..5536abe 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/user.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/user.twig
@@ -12,11 +12,21 @@
<li><button class="dropdown-item" role="tab" aria-selected="false" aria-controls="tab-config-f2b" data-bs-toggle="tab" data-bs-target="#tab-user-settings">{{ lang.user.mailbox_settings }}</button></li>
</ul>
</li>
+ {% if acl.spam_alias == 1 %}
<li class="nav-item" role="presentation"><button class="nav-link" role="tab" aria-selected="false" aria-controls="SpamAliases" role="tab" data-bs-toggle="tab" data-bs-target="#SpamAliases">{{ lang.user.spam_aliases }}</button></li>
+ {% endif %}
+ {% if acl.spam_score == 1 %}
<li class="nav-item" role="presentation"><button class="nav-link" role="tab" aria-selected="false" aria-controls="Spamfilter" role="tab" data-bs-toggle="tab" data-bs-target="#Spamfilter">{{ lang.user.spamfilter }}</button></li>
+ {% endif %}
+ {% if acl.syncjobs == 1 %}
<li class="nav-item" role="presentation"><button class="nav-link" role="tab" aria-selected="false" aria-controls="Syncjobs" role="tab" data-bs-toggle="tab" data-bs-target="#Syncjobs">{{ lang.user.sync_jobs }}</button></li>
+ {% endif %}
+ {% if acl.app_passwds == 1 %}
<li class="nav-item" role="presentation"><button class="nav-link" role="tab" aria-selected="false" aria-controls="AppPasswds" role="tab" data-bs-toggle="tab" data-bs-target="#AppPasswds">{{ lang.user.app_passwds }}</button></li>
+ {% endif %}
+ {% if acl.pushover == 1 %}
<li class="nav-item" role="presentation"><button class="nav-link" role="tab" aria-selected="false" aria-controls="Pushover" role="tab" data-bs-toggle="tab" data-bs-target="#Pushover">Pushover API</button></li>
+ {% endif %}
</ul>
<div class="row">
@@ -25,11 +35,11 @@
{% include 'user/tab-user-auth.twig' %}
{% include 'user/tab-user-details.twig' %}
{% include 'user/tab-user-settings.twig' %}
- {% include 'user/SpamAliases.twig' %}
- {% include 'user/Spamfilter.twig' %}
- {% include 'user/Syncjobs.twig' %}
- {% include 'user/AppPasswds.twig' %}
- {% include 'user/Pushover.twig' %}
+ {% if acl.spam_alias == 1 %}{% include 'user/SpamAliases.twig' %}{% endif %}
+ {% if acl.spam_score == 1 %}{% include 'user/Spamfilter.twig' %}{% endif %}
+ {% if acl.syncjobs == 1 %}{% include 'user/Syncjobs.twig' %}{% endif %}
+ {% if acl.app_passwds == 1 %}{% include 'user/AppPasswds.twig' %}{% endif %}
+ {% if acl.pushover == 1 %}{% include 'user/Pushover.twig' %}{% endif %}
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/user/AppPasswds.twig b/mailcow/src/mailcow-dockerized/data/web/templates/user/AppPasswds.twig
index 4e70f10..e5b6f7d 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/user/AppPasswds.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/user/AppPasswds.twig
@@ -1,10 +1,10 @@
-<div role="tabpanel" class="tab-pane fade" id="AppPasswds" role="tabpanel" aria-labelledby="AppPasswds">
+<div class="tab-pane fade" id="AppPasswds" role="tabpanel" aria-labelledby="AppPasswds">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-AppPasswds" data-bs-toggle="collapse" aria-controls="collapse-tab-AppPasswds">
{{ lang.user.app_passwds }}
</button>
- <span class="d-none d-md-block">{{ lang.user.app_passwds }}
+ <span class="d-none d-md-block">{{ lang.user.app_passwds }}</span>
</div>
<div id="collapse-tab-AppPasswds" class="card-body collapse" data-bs-parent="#user-content">
<div class="mass-actions-user mb-4">
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/user/Pushover.twig b/mailcow/src/mailcow-dockerized/data/web/templates/user/Pushover.twig
index d3304db..acc019c 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/user/Pushover.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/user/Pushover.twig
@@ -1,10 +1,10 @@
-<div role="tabpanel" class="tab-pane fade" id="Pushover" role="tabpanel" aria-labelledby="Pushover">
+<div class="tab-pane fade" id="Pushover" role="tabpanel" aria-labelledby="Pushover">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-Pushover" data-bs-toggle="collapse" aria-controls="collapse-tab-Pushover">
Pushover API
</button>
- <span class="d-none d-md-block">Pushover API
+ <span class="d-none d-md-block">Pushover API</span>
</div>
<div id="collapse-tab-Pushover" class="card-body collapse" data-bs-parent="#user-content">
<form data-id="pushover" class="form well" method="post">
@@ -80,8 +80,8 @@
</div>
</div>
<div class="col-sm-12">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="active"{% if pushover_data.active == '1' %} checked{% endif %}> {{ lang.user.active }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="active"{% if pushover_data.active == '1' %} checked{% endif %}> {{ lang.user.active }}</label>
</div>
</div>
<div class="col-sm-12">
@@ -95,11 +95,11 @@
<div class="form-group">
<label for="text">{{ lang.user.pushover_sender_regex }}</label>
<input type="text" class="form-control mb-4" name="senders_regex" value="{{ pushover_data.senders_regex }}" placeholder="/(.*@example\.org$|^foo@example\.com$)/i" regex="true">
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="evaluate_x_prio"{% if pushover_data.attributes.evaluate_x_prio == '1' %} checked{% endif %}> {{ lang.user.pushover_evaluate_x_prio|raw }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="evaluate_x_prio"{% if pushover_data.attributes.evaluate_x_prio == '1' %} checked{% endif %}> {{ lang.user.pushover_evaluate_x_prio|raw }}</label>
</div>
- <div class="checkbox">
- <label><input type="checkbox" value="1" name="only_x_prio"{% if pushover_data.attributes.only_x_prio == '1' %} checked{% endif %}> {{ lang.user.pushover_only_x_prio|raw }}</label>
+ <div class="form-check">
+ <label><input type="checkbox" class="form-check-input" value="1" name="only_x_prio"{% if pushover_data.attributes.only_x_prio == '1' %} checked{% endif %}> {{ lang.user.pushover_only_x_prio|raw }}</label>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/user/SpamAliases.twig b/mailcow/src/mailcow-dockerized/data/web/templates/user/SpamAliases.twig
index 54c7686..40b3ec7 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/user/SpamAliases.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/user/SpamAliases.twig
@@ -1,10 +1,10 @@
-<div role="tabpanel" class="tab-pane fade" id="SpamAliases" role="tabpanel" aria-labelledby="SpamAliases">
+<div class="tab-pane fade" id="SpamAliases" role="tabpanel" aria-labelledby="SpamAliases">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-SpamAliases" data-bs-toggle="collapse" aria-controls="collapse-tab-SpamAliases">
{{ lang.user.spam_aliases }}
</button>
- <span class="d-none d-md-block">{{ lang.user.spam_aliases }}
+ <span class="d-none d-md-block">{{ lang.user.spam_aliases }}</span>
</div>
<div id="collapse-tab-SpamAliases" class="card-body collapse" data-bs-parent="#user-content">
<div class="row">
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/user/Spamfilter.twig b/mailcow/src/mailcow-dockerized/data/web/templates/user/Spamfilter.twig
index 7a3baf3..280b900 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/user/Spamfilter.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/user/Spamfilter.twig
@@ -1,10 +1,10 @@
-<div role="tabpanel" class="tab-pane fade" id="Spamfilter" role="tabpanel" aria-labelledby="Spamfilter">
+<div class="tab-pane fade" id="Spamfilter" role="tabpanel" aria-labelledby="Spamfilter">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-Spamfilter" data-bs-toggle="collapse" aria-controls="collapse-tab-Spamfilter">
{{ lang.user.spamfilter }}
</button>
- <span class="d-none d-md-block">{{ lang.user.spamfilter }}
+ <span class="d-none d-md-block">{{ lang.user.spamfilter }}</span>
</div>
<div id="collapse-tab-Spamfilter" class="card-body collapse" data-bs-parent="#user-content">
<h4>{{ lang.user.spamfilter_behavior }}</h4>
@@ -45,9 +45,7 @@
<form class="form-inline mb-4" data-id="add_wl_policy_mailbox">
<div class="input-group" data-acl="{{ acl.spam_policy }}">
<input type="text" class="form-control" name="object_from" placeholder="*@example.org" required>
- <span class="input-group-btn">
- <button class="btn btn-secondary" data-action="add_item" data-id="add_wl_policy_mailbox" data-api-url='add/mailbox-policy' data-api-attr='{"username": {{ mailcow_cc_username|json_encode|raw }},"object_list":"wl"}' href="#"><i class="bi bi-plus-lg"></i> {{ lang.user.spamfilter_table_add }}</button>
- </span>
+ <button class="btn btn-secondary" data-action="add_item" data-id="add_wl_policy_mailbox" data-api-url='add/mailbox-policy' data-api-attr='{"username": {{ mailcow_cc_username|json_encode|raw }},"object_list":"wl"}' href="#"><i class="bi bi-plus-lg"></i> {{ lang.user.spamfilter_table_add }}</button>
</div>
</form>
<table id="wl_policy_mailbox_table" class="table table-striped dt-responsive w-100"></table>
@@ -69,9 +67,7 @@
<form class="form-inline mb-4" data-id="add_bl_policy_mailbox">
<div class="input-group" data-acl="{{ acl.spam_policy }}">
<input type="text" class="form-control" name="object_from" placeholder="*@example.org" required>
- <span class="input-group-btn">
- <button class="btn btn-secondary" data-action="add_item" data-id="add_bl_policy_mailbox" data-api-url='add/mailbox-policy' data-api-attr='{"username": {{ mailcow_cc_username|json_encode|raw }},"object_list":"bl"}' href="#"><i class="bi bi-plus-lg"></i> {{ lang.user.spamfilter_table_add }}</button>
- </span>
+ <button class="btn btn-secondary" data-action="add_item" data-id="add_bl_policy_mailbox" data-api-url='add/mailbox-policy' data-api-attr='{"username": {{ mailcow_cc_username|json_encode|raw }},"object_list":"bl"}' href="#"><i class="bi bi-plus-lg"></i> {{ lang.user.spamfilter_table_add }}</button>
</div>
</form>
<table id="bl_policy_mailbox_table" class="table table-striped dt-responsive w-100"></table>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/user/Syncjobs.twig b/mailcow/src/mailcow-dockerized/data/web/templates/user/Syncjobs.twig
index 322e853..1267b4f 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/user/Syncjobs.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/user/Syncjobs.twig
@@ -1,10 +1,10 @@
-<div role="tabpanel" class="tab-pane fade" id="Syncjobs" role="tabpanel" aria-labelledby="Syncjobs">
+<div class="tab-pane fade" id="Syncjobs" role="tabpanel" aria-labelledby="Syncjobs">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-Syncjobs" data-bs-toggle="collapse" aria-controls="collapse-tab-Syncjobs">
{{ lang.user.sync_jobs }}
</button>
- <span class="d-none d-md-block">{{ lang.user.sync_jobs }}
+ <span class="d-none d-md-block">{{ lang.user.sync_jobs }}</span>
</div>
<div id="collapse-tab-Syncjobs" class="card-body collapse" data-bs-parent="#user-content">
<div class="mass-actions-user mb-4">
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/user/tab-user-auth.twig b/mailcow/src/mailcow-dockerized/data/web/templates/user/tab-user-auth.twig
index 646c791..4d55b70 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/user/tab-user-auth.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/user/tab-user-auth.twig
@@ -1,10 +1,10 @@
-<div role="tabpanel" class="tab-pane fade in active show" id="tab-user-auth" role="tabpanel" aria-labelledby="tab-user-auth">
+<div class="tab-pane fade in active show" id="tab-user-auth" role="tabpanel" aria-labelledby="tab-user-auth">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-user-auth" data-bs-toggle="collapse" aria-controls="collapse-tab-user-auth">
{{ lang.user.mailbox_general }}
</button>
- <span class="d-none d-md-block">{{ lang.user.mailbox_general }}
+ <span class="d-none d-md-block">{{ lang.user.mailbox_general }}</span>
</div>
<div id="collapse-tab-user-auth" class="card-body collapse" data-bs-parent="#user-content">
{% if mailboxdata.attributes.force_pw_update == '1' %}
@@ -129,20 +129,20 @@
</div>
</div>
<div class="row">
- <div class="col-md-3 col-12 text-sm-end text-start mb-4"><i class="bi bi-file-earmark-text"></i> {{ lang.user.apple_connection_profile }}<br />{{ lang.user.with_app_password }}:</div>
+ <div class="col-md-3 col-12 text-sm-end text-start mb-4"><i class="bi bi-file-earmark-text"></i> {{ lang.user.apple_connection_profile }}<br class="d-none d-lg-block" />{{ lang.user.with_app_password }}:</div>
<div class="col-md-9 col-12">
<p><i class="bi bi-file-earmark-post"></i> <a href="/mobileconfig.php?only_email&app_password">{{ lang.user.email }}</a> <small>IMAP, SMTP</small></p>
- <p class="text-muted">{{ lang.user.apple_connection_profile_mailonly }} {{ lang.user.apple_connection_profile_with_app_password }}</p>
+ <p class="text-muted">{{ lang.user.apple_connection_profile_mailonly }}<br /> {{ lang.user.apple_connection_profile_with_app_password }}</p>
{% if not skip_sogo %}
<p><i class="bi bi-file-earmark-post"></i> <a href="/mobileconfig.php?app_password">{{ lang.user.email_and_dav }}</a> <small>IMAP, SMTP, Cal/CardDAV</small></p>
- <p class="text-muted">{{ lang.user.apple_connection_profile_complete }} {{ lang.user.apple_connection_profile_with_app_password }}</p>
+ <p class="text-muted">{{ lang.user.apple_connection_profile_complete }}<br /> {{ lang.user.apple_connection_profile_with_app_password }}</p>
{% endif %}
</div>
</div>
<hr>
<div class="row">
<div class="offset-sm-3 col-sm-9">
- <p><a target="_blank" href="https://mailcow.github.io/mailcow-dockerized-docs/client/client/#{{ clientconfigstr }}">[{{ lang.user.client_configuration }}]</a></p>
+ <p><a target="_blank" href="https://docs.mailcow.email/client/client/#{{ clientconfigstr }}">[{{ lang.user.client_configuration }}]</a></p>
<p><a href="#userFilterModal" data-bs-toggle="modal">[{{ lang.user.show_sieve_filters }}]</a></p>
<hr>
<h4 class="recent-login-success">{{ lang.user.recent_successful_connections }}</h4>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/user/tab-user-details.twig b/mailcow/src/mailcow-dockerized/data/web/templates/user/tab-user-details.twig
index 573cd49..62842fc 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/user/tab-user-details.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/user/tab-user-details.twig
@@ -1,10 +1,10 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-user-details" role="tabpanel" aria-labelledby="tab-user-details">
+<div class="tab-pane fade" id="tab-user-details" role="tabpanel" aria-labelledby="tab-user-details">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-user-details" data-bs-toggle="collapse" aria-controls="collapse-tab-user-details">
{{ lang.user.mailbox_details }}
</button>
- <span class="d-none d-md-block">{{ lang.user.mailbox_details }}
+ <span class="d-none d-md-block">{{ lang.user.mailbox_details }}</span>
</div>
<div id="collapse-tab-user-details" class="card-body collapse" data-bs-parent="#user-content">
<div class="row">
@@ -46,7 +46,7 @@
<div class="col-sm-8 col-md-9 col-12">
<p>
{% if user_get_alias_details.aliases_also_send_as == '*' %}
- {{ lang.user.sender_acl_disabled }}
+ {{ lang.user.sender_acl_disabled | raw }}
{% elseif user_get_alias_details.aliases_also_send_as %}
{{ user_get_alias_details.aliases_also_send_as }}
{% else %}
@@ -58,13 +58,13 @@
<div class="row">
<div class="col-sm-4 col-md-3 col-12 text-sm-end text-start mb-4">{{ lang.user.aliases_send_as_all }}:</div>
<div class="col-sm-8 col-md-9 col-12">
- <p>{% if not user_get_alias_details.aliases_send_as_all %}<i class="bi bi-x-lg"></i>{% endif %}</p>
+ <p>{% if not user_get_alias_details.aliases_send_as_all %}<i class="bi bi-x-lg"></i>{% else %}{{ user_get_alias_details.aliases_send_as_all }}{% endif %}</p>
</div>
</div>
<div class="row">
<div class="col-sm-4 col-md-3 col-12 text-sm-end text-start mb-4">{{ lang.user.is_catch_all }}:</div>
<div class="col-sm-8 col-md-9 col-12">
- <p>{% if not user_get_alias_details.is_catch_all %}<i class="bi bi-x-lg"></i>{% endif %}</p>
+ <p>{% if not user_get_alias_details.is_catch_all %}<i class="bi bi-x-lg"></i>{% else %}{{ user_get_alias_details.is_catch_all }}{% endif %}</p>
</div>
</div>
</div>
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/user/tab-user-settings.twig b/mailcow/src/mailcow-dockerized/data/web/templates/user/tab-user-settings.twig
index a1426fa..3fe0db3 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/user/tab-user-settings.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/user/tab-user-settings.twig
@@ -1,10 +1,10 @@
-<div role="tabpanel" class="tab-pane fade" id="tab-user-settings" role="tabpanel" aria-labelledby="tab-user-settings">
+<div class="tab-pane fade" id="tab-user-settings" role="tabpanel" aria-labelledby="tab-user-settings">
<div class="card mb-4">
<div class="card-header d-flex fs-5">
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-user-settings" data-bs-toggle="collapse" aria-controls="collapse-tab-user-settings">
{{ lang.user.mailbox_settings }}
</button>
- <span class="d-none d-md-block">{{ lang.user.mailbox_settings }}
+ <span class="d-none d-md-block">{{ lang.user.mailbox_settings }}</span>
</div>
<div id="collapse-tab-user-settings" class="card-body collapse" data-bs-parent="#user-content">
{# Show tagging options #}
@@ -12,19 +12,19 @@
<div class="col-sm-3 col-12 text-sm-end text-start text-xs-bold mb-4">{{ lang.user.tag_handling }}:</div>
<div class="col-sm-9 col-12">
<div class="btn-group" data-acl="{{ acl.delimiter_action }}">
- <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline btn-secondary{% if get_tagging_options == 'subfolder' %} active{% endif %}"
+ <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline{% if get_tagging_options == 'subfolder' %} btn-dark{% else %} btn-light{% endif %}"
data-action="edit_selected"
data-item="{{ mailcow_cc_username }}"
data-id="delimiter_action"
data-api-url='edit/delimiter_action'
data-api-attr='{"tagged_mail_handler":"subfolder"}'>{{ lang.user.tag_in_subfolder }}</button>
- <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline btn-secondary{% if get_tagging_options == 'subject' %} active{% endif %}"
+ <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline{% if get_tagging_options == 'subject' %} btn-dark{% else %} btn-light{% endif %}"
data-action="edit_selected"
data-item="{{ mailcow_cc_username }}"
data-id="delimiter_action"
data-api-url='edit/delimiter_action'
data-api-attr='{"tagged_mail_handler":"subject"}'>{{ lang.user.tag_in_subject }}</button>
- <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline btn-secondary{% if get_tagging_options == 'none' %} active{% endif %}"
+ <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline{% if get_tagging_options == 'none' %} btn-dark{% else %} btn-light{% endif %}"
data-action="edit_selected"
data-item="{{ mailcow_cc_username }}"
data-id="delimiter_action"
@@ -40,13 +40,13 @@
<div class="col-sm-3 col-12 text-sm-end text-start text-xs-bold mb-4">{{ lang.user.tls_policy }}:</div>
<div class="col-sm-9 col-12">
<div class="btn-group" data-acl="{{ acl.tls_policy }}">
- <button type="button" class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary{% if get_tls_policy.tls_enforce_in == '1' %} active"{% endif %}"
+ <button type="button" class="btn btn-sm btn-xs-half d-block d-sm-inline{% if get_tls_policy.tls_enforce_in == '1' %} btn-dark"{% else %} btn-light{% endif %}"
data-action="edit_selected"
data-item="{{ mailcow_cc_username }}"
data-id="tls_policy"
data-api-url='edit/tls_policy'
data-api-attr='{"tls_enforce_in": {% if get_tls_policy.tls_enforce_in == '1' %}0{% else %}1{% endif %} }'>{{ lang.user.tls_enforce_in }}</button>
- <button type="button" class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary{% if get_tls_policy.tls_enforce_out == '1' %} active"{% endif %}"
+ <button type="button" class="btn btn-sm btn-xs-half d-block d-sm-inline{% if get_tls_policy.tls_enforce_out == '1' %} btn-dark{% else %} btn-light{% endif %}"
data-action="edit_selected"
data-item="{{ mailcow_cc_username }}"
data-id="tls_policy"
@@ -61,25 +61,25 @@
<div class="col-sm-3 col-12 text-sm-end text-start text-xs-bold mb-4">{{ lang.user.quarantine_notification }}:</div>
<div class="col-sm-9 col-12">
<div class="btn-group" data-acl="{{ acl.quarantine_notification }}">
- <button type="button" class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary{% if quarantine_notification == 'never' %} active{% endif %}"
+ <button type="button" class="btn btn-sm btn-xs-quart d-block d-sm-inline{% if quarantine_notification == 'never' %} btn-dark{% else %} btn-light{% endif %}"
data-action="edit_selected"
data-item="{{ mailcow_cc_username }}"
data-id="quarantine_notification"
data-api-url='edit/quarantine_notification'
data-api-attr='{"quarantine_notification":"never"}'>{{ lang.user.never }}</button>
- <button type="button" class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary{% if quarantine_notification == 'hourly' %} active{% endif %}"
+ <button type="button" class="btn btn-sm btn-xs-quart d-block d-sm-inline{% if quarantine_notification == 'hourly' %} btn-dark{% else %} btn-light{% endif %}"
data-action="edit_selected"
data-item="{{ mailcow_cc_username }}"
data-id="quarantine_notification"
data-api-url='edit/quarantine_notification'
data-api-attr='{"quarantine_notification":"hourly"}'>{{ lang.user.hourly }}</button>
- <button type="button" class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary{% if quarantine_notification == 'daily' %} active{% endif %}"
+ <button type="button" class="btn btn-sm btn-xs-quart d-block d-sm-inline{% if quarantine_notification == 'daily' %} btn-dark{% else %} btn-light{% endif %}"
data-action="edit_selected"
data-item="{{ mailcow_cc_username }}"
data-id="quarantine_notification"
data-api-url='edit/quarantine_notification'
data-api-attr='{"quarantine_notification":"daily"}'>{{ lang.user.daily }}</button>
- <button type="button" class="btn btn-sm btn-xs-quart d-block d-sm-inline btn-secondary{% if quarantine_notification == 'weekly' %} active{% endif %}"
+ <button type="button" class="btn btn-sm btn-xs-quart d-block d-sm-inline{% if quarantine_notification == 'weekly' %} btn-dark{% else %} btn-light{% endif %}"
data-action="edit_selected"
data-item="{{ mailcow_cc_username }}"
data-id="quarantine_notification"
@@ -93,19 +93,19 @@
<div class="col-sm-3 col-12 text-sm-end text-start text-xs-bold mb-4">{{ lang.user.quarantine_category }}:</div>
<div class="col-sm-9 col-12">
<div class="btn-group" data-acl="{{ acl.quarantine_category }}">
- <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline btn-secondary{% if quarantine_category == 'reject' %} active{% endif %}"
+ <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline{% if quarantine_category == 'reject' %} btn-dark{% else %} btn-light{% endif %}"
data-action="edit_selected"
data-item="{{ mailcow_cc_username }}"
data-id="quarantine_category"
data-api-url='edit/quarantine_category'
data-api-attr='{"quarantine_category":"reject"}'>{{ lang.user.q_reject }}</button>
- <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline btn-secondary{% if quarantine_category == 'add_header' %} active{% endif %}"
+ <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline{% if quarantine_category == 'add_header' %} btn-dark{% else %} btn-light{% endif %}"
data-action="edit_selected"
data-item="{{ mailcow_cc_username }}"
data-id="quarantine_category"
data-api-url='edit/quarantine_category'
data-api-attr='{"quarantine_category":"add_header"}'>{{ lang.user.q_add_header }}</button>
- <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline btn-secondary{% if quarantine_category == 'all' %} active{% endif %}"
+ <button type="button" class="btn btn-sm btn-xs-third d-block d-sm-inline{% if quarantine_category == 'all' %} btn-dark{% else %} btn-light{% endif %}"
data-action="edit_selected"
data-item="{{ mailcow_cc_username }}"
data-id="quarantine_category"
diff --git a/mailcow/src/mailcow-dockerized/data/web/templates/user_domainadmin_common.twig b/mailcow/src/mailcow-dockerized/data/web/templates/user_domainadmin_common.twig
index 8a7ace3..64a2205 100644
--- a/mailcow/src/mailcow-dockerized/data/web/templates/user_domainadmin_common.twig
+++ b/mailcow/src/mailcow-dockerized/data/web/templates/user_domainadmin_common.twig
@@ -4,7 +4,7 @@
var acl = '{{ acl_json|raw }}';
var lang = {{ lang_user|raw }};
var csrf_token = '{{ csrf_token }}';
- var pagination_size = '{{ pagination_size }}';
+ var pagination_size = Math.trunc('{{ pagination_size }}');
var mailcow_cc_username = '{{ mailcow_cc_username }}';
var user_spam_score = [{{ user_spam_score }}];
var lang_datatables = {{ lang_datatables|raw }};