[Web] organize user landing
This commit is contained in:
parent
76721ab669
commit
0846467ffb
|
@ -385,6 +385,7 @@ button[aria-expanded='true'] > .caret {
|
||||||
background-color: #f0f0f0;
|
background-color: #f0f0f0;
|
||||||
}
|
}
|
||||||
.btn.btn-outline-secondary {
|
.btn.btn-outline-secondary {
|
||||||
|
color: #000000 !important;
|
||||||
border-color: #cfcfcf !important;
|
border-color: #cfcfcf !important;
|
||||||
}
|
}
|
||||||
.btn-check:checked+.btn-outline-secondary, .btn-check:active+.btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show {
|
.btn-check:checked+.btn-outline-secondary, .btn-check:active+.btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show {
|
||||||
|
|
|
@ -77,11 +77,11 @@ jQuery(function($){
|
||||||
acl_data = JSON.parse(acl);
|
acl_data = JSON.parse(acl);
|
||||||
|
|
||||||
$('.clear-last-logins').on('click', function () {if (confirm(lang.delete_ays)) {last_logins('reset');}})
|
$('.clear-last-logins').on('click', function () {if (confirm(lang.delete_ays)) {last_logins('reset');}})
|
||||||
$(".login-history").on('click', function(e) {e.preventDefault(); last_logins('get', $(this).data('days'));$(this).addClass('active').siblings().removeClass('active');});
|
$(".login-history").on('click', function(e) {e.preventDefault(); last_logins('get', $(this).data('days'));$(this).parent().find('li a').removeClass('active');$(this).children(':first-child').addClass('active')});
|
||||||
|
|
||||||
function last_logins(action, days = 7) {
|
function last_logins(action, days = 7) {
|
||||||
if (action == 'get') {
|
if (action == 'get') {
|
||||||
$('.last-login').html('<i class="bi bi-hourglass"></i>' + lang.waiting);
|
$('#spinner-last-login').removeClass('d-none');
|
||||||
$.ajax({
|
$.ajax({
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
url: '/api/v1/get/last-login/' + encodeURIComponent(mailcow_cc_username) + '/' + days,
|
url: '/api/v1/get/last-login/' + encodeURIComponent(mailcow_cc_username) + '/' + days,
|
||||||
|
@ -90,26 +90,38 @@ jQuery(function($){
|
||||||
console.log('error reading last logins');
|
console.log('error reading last logins');
|
||||||
},
|
},
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
$('.last-login').html();
|
$('.last-ui-login').html('');
|
||||||
|
$('.last-sasl-login').html('');
|
||||||
if (data.ui.time) {
|
if (data.ui.time) {
|
||||||
$('.last-login').html('<i class="bi bi-person-fill"></i> ' + lang.last_ui_login + ': ' + unix_time_format(data.ui.time));
|
$('.last-ui-login').html('<i class="bi bi-person-fill"></i> ' + lang.last_ui_login + ': ' + unix_time_format(data.ui.time));
|
||||||
} else {
|
} else {
|
||||||
$('.last-login').text(lang.no_last_login);
|
$('.last-ui-login').text(lang.no_last_login);
|
||||||
}
|
}
|
||||||
if (data.sasl) {
|
if (data.sasl) {
|
||||||
$('.last-login').append('<ul class="list-group">');
|
$('.last-sasl-login').append('<ul class="list-group">');
|
||||||
$.each(data.sasl, function (i, item) {
|
$.each(data.sasl, function (i, item) {
|
||||||
var datetime = new Date(item.datetime.replace(/-/g, "/"));
|
var datetime = new Date(item.datetime.replace(/-/g, "/"));
|
||||||
var local_datetime = datetime.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
|
var local_datetime = datetime.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
|
||||||
var service = '<div class="badge fs-6 bg-secondary">' + item.service.toUpperCase() + '</div>';
|
var service = '<div class="badge bg-secondary">' + item.service.toUpperCase() + '</div>';
|
||||||
var app_password = item.app_password ? ' <a href="/edit/app-passwd/' + item.app_password + '"><i class="bi bi-app-indicator"></i> ' + escapeHtml(item.app_password_name || "App") + '</a>' : '';
|
var app_password = item.app_password ? ' <a href="/edit/app-passwd/' + item.app_password + '"><i class="bi bi-app-indicator"></i> ' + escapeHtml(item.app_password_name || "App") + '</a>' : '';
|
||||||
var real_rip = item.real_rip.startsWith("Web") ? item.real_rip : '<a href="https://bgp.he.net/ip/' + item.real_rip + '" target="_blank">' + item.real_rip + "</a>";
|
var real_rip = item.real_rip.startsWith("Web") ? item.real_rip : '<a href="https://bgp.he.net/ip/' + item.real_rip + '" target="_blank">' + item.real_rip + "</a>";
|
||||||
var ip_location = item.location ? ' <span class="flag-icon flag-icon-' + item.location.toLowerCase() + '"></span>' : '';
|
var ip_location = item.location ? ' <span class="flag-icon flag-icon-' + item.location.toLowerCase() + '"></span>' : '';
|
||||||
var ip_data = real_rip + ip_location + app_password;
|
var ip_data = real_rip + ip_location + app_password;
|
||||||
$(".last-login").append('<li class="list-group-item">' + local_datetime + " " + service + " " + lang.from + " " + ip_data + "</li>");
|
|
||||||
|
$(".last-sasl-login").append(`
|
||||||
|
<li class="list-group-item d-flex justify-content-between align-items-start">
|
||||||
|
<div class="ms-2 me-auto d-flex flex-column">
|
||||||
|
<div class="fw-bold">` + real_rip + `</div>
|
||||||
|
<small class="fst-italic mt-2">` + service + ` ` + local_datetime + `</small>
|
||||||
|
</div>
|
||||||
|
<span>` + ip_location + `</span>
|
||||||
|
</li>
|
||||||
|
`);
|
||||||
})
|
})
|
||||||
$('.last-login').append('</ul>');
|
$('.last-sasl-login').append('</ul>');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$('#spinner-last-login').addClass('d-none');
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
} else if (action == 'reset') {
|
} else if (action == 'reset') {
|
||||||
|
|
|
@ -1,80 +1,83 @@
|
||||||
{% extends 'base.twig' %}
|
{% extends 'base.twig' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h3>{{ lang.user.user_settings }}</h3>
|
<div class="row">
|
||||||
<div class="card">
|
<div class="col-md-12">
|
||||||
<div class="card-header">{{ lang.user.user_settings }}</div>
|
<div class="card">
|
||||||
<div class="card-body">
|
<div class="card-header">{{ lang.user.user_settings }}</div>
|
||||||
<div class="row">
|
<div class="card-body">
|
||||||
<div class="offset-sm-3 col-sm-9">
|
<div class="row">
|
||||||
<p><a href="#pwChangeModal" data-bs-toggle="modal">[{{ lang.user.change_password }}]</a></p>
|
<div class="offset-sm-3 col-sm-9">
|
||||||
<div class="last-login"></div>
|
<p><a href="#pwChangeModal" data-bs-toggle="modal">[{{ lang.user.change_password }}]</a></p>
|
||||||
<span class="clear-last-logins">{{ lang.user.clear_recent_successful_connections }}</span>
|
<div class="last-ui-login"></div>
|
||||||
</div>
|
<span class="clear-last-logins">{{ lang.user.clear_recent_successful_connections }}</span>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
</div>
|
||||||
|
<hr>
|
||||||
|
|
||||||
{# TFA #}
|
{# TFA #}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-3 col-5 text-end">{{ lang.tfa.tfa }}</div>
|
<div class="col-sm-3 col-5 text-end">{{ lang.tfa.tfa }}</div>
|
||||||
<div class="col-sm-9 col-7">
|
<div class="col-sm-9 col-7">
|
||||||
<p id="tfa_pretty">{{ tfa_data.pretty }}</p>
|
<p id="tfa_pretty">{{ tfa_data.pretty }}</p>
|
||||||
{% include 'tfa_keys.twig' %}
|
{% include 'tfa_keys.twig' %}
|
||||||
<br>
|
<br>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-3 col-5 text-end">{{ lang.tfa.set_tfa }}</div>
|
<div class="col-sm-3 col-5 text-end">{{ lang.tfa.set_tfa }}</div>
|
||||||
<div class="col-sm-9 col-7">
|
<div class="col-sm-9 col-7">
|
||||||
<select id="selectTFA" class="selectpicker" title="{{ lang.tfa.select }}">
|
<select id="selectTFA" class="selectpicker" title="{{ lang.tfa.select }}">
|
||||||
<option value="yubi_otp">{{ lang.tfa.yubi_otp }}</option>
|
<option value="yubi_otp">{{ lang.tfa.yubi_otp }}</option>
|
||||||
<option value="webauthn">{{ lang.tfa.webauthn }}</option>
|
<option value="webauthn">{{ lang.tfa.webauthn }}</option>
|
||||||
<option value="totp">{{ lang.tfa.totp }}</option>
|
<option value="totp">{{ lang.tfa.totp }}</option>
|
||||||
<option value="none">{{ lang.tfa.none }}</option>
|
<option value="none">{{ lang.tfa.none }}</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
{# FIDO2 #}
|
{# FIDO2 #}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-3 col-5 text-end">
|
<div class="col-sm-3 col-5 text-end">
|
||||||
<p><i class="bi bi-shield-fill-check"></i> {{ lang.fido2.fido2_auth }}</p>
|
<p><i class="bi bi-shield-fill-check"></i> {{ lang.fido2.fido2_auth }}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-3 col-5 text-end">{{ lang.fido2.known_ids }}:</div>
|
<div class="col-sm-3 col-5 text-end">{{ lang.fido2.known_ids }}:</div>
|
||||||
<div class="col-sm-9 col-7">
|
<div class="col-sm-9 col-7">
|
||||||
<div class="table-responsive">
|
<div class="table-responsive">
|
||||||
<table class="table table-striped table-hover table-condensed w-100" id="fido2_keys">
|
<table class="table table-striped table-hover table-condensed w-100" id="fido2_keys">
|
||||||
<tr>
|
<tr>
|
||||||
<th>ID</th>
|
<th>ID</th>
|
||||||
<th style="min-width:240px;text-align: right">{{ lang.admin.action }}</th>
|
<th style="min-width:240px;text-align: right">{{ lang.admin.action }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
{% include 'fido2.twig' %}
|
{% include 'fido2.twig' %}
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<br>
|
<br>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="offset-sm-3 col-sm-9">
|
|
||||||
<div class="btn-group">
|
|
||||||
<button class="btn btn-sm btn-primary" id="register-fido2">{{ lang.fido2.set_fido2 }}</button>
|
|
||||||
<button type="button" class="btn btn-sm btn-xs-lg btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></button>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
<li><a class="dropdown-item" href="#" id="register-fido2-touchid"><i class="bi bi-shield-fill-check"></i> {{ lang.fido2.set_fido2_touchid }}</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="row">
|
||||||
<br>
|
<div class="offset-sm-3 col-sm-9">
|
||||||
<div class="row" id="status-fido2">
|
<div class="btn-group">
|
||||||
<div class="col-sm-3 col-5 text-end">{{ lang.fido2.register_status }}:</div>
|
<button class="btn btn-sm btn-primary" id="register-fido2">{{ lang.fido2.set_fido2 }}</button>
|
||||||
<div class="col-sm-9 col-7">
|
<button type="button" class="btn btn-sm btn-xs-lg btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></button>
|
||||||
<div id="fido2-alerts">-</div>
|
<ul class="dropdown-menu">
|
||||||
|
<li><a class="dropdown-item" href="#" id="register-fido2-touchid"><i class="bi bi-shield-fill-check"></i> {{ lang.fido2.set_fido2_touchid }}</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<div class="row" id="status-fido2">
|
||||||
|
<div class="col-sm-3 col-5 text-end">{{ lang.fido2.register_status }}:</div>
|
||||||
|
<div class="col-sm-9 col-7">
|
||||||
|
<div id="fido2-alerts">-</div>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<br>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -33,7 +33,6 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style="margin-bottom:200px;"></div>
|
|
||||||
{% include 'user_domainadmin_common.twig' %}
|
{% include 'user_domainadmin_common.twig' %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -39,10 +39,10 @@
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-6 my-3">
|
<div class="col-lg-6 my-3 d-flex flex-column">
|
||||||
<h4>{{ lang.user.spamfilter_wl }}</h4>
|
<h4>{{ lang.user.spamfilter_wl }}</h4>
|
||||||
<p>{{ lang.user.spamfilter_wl_desc|raw }}</p>
|
<p>{{ lang.user.spamfilter_wl_desc|raw }}</p>
|
||||||
<form class="form-inline mb-4" data-id="add_wl_policy_mailbox">
|
<form class="form-inline mb-4 mt-auto" data-id="add_wl_policy_mailbox">
|
||||||
<div class="input-group" data-acl="{{ acl.spam_policy }}">
|
<div class="input-group" data-acl="{{ acl.spam_policy }}">
|
||||||
<input type="text" class="form-control" name="object_from" placeholder="*@example.org" required>
|
<input type="text" class="form-control" name="object_from" placeholder="*@example.org" required>
|
||||||
<span class="input-group-btn">
|
<span class="input-group-btn">
|
||||||
|
@ -63,10 +63,10 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-6 my-3">
|
<div class="col-lg-6 my-3 d-flex flex-column">
|
||||||
<h4>{{ lang.user.spamfilter_bl }}</h4>
|
<h4>{{ lang.user.spamfilter_bl }}</h4>
|
||||||
<p>{{ lang.user.spamfilter_bl_desc|raw }}</p>
|
<p>{{ lang.user.spamfilter_bl_desc|raw }}</p>
|
||||||
<form class="form-inline mb-4" data-id="add_bl_policy_mailbox">
|
<form class="form-inline mb-4 mt-auto" data-id="add_bl_policy_mailbox">
|
||||||
<div class="input-group" data-acl="{{ acl.spam_policy }}">
|
<div class="input-group" data-acl="{{ acl.spam_policy }}">
|
||||||
<input type="text" class="form-control" name="object_from" placeholder="*@example.org" required>
|
<input type="text" class="form-control" name="object_from" placeholder="*@example.org" required>
|
||||||
<span class="input-group-btn">
|
<span class="input-group-btn">
|
||||||
|
|
|
@ -8,157 +8,193 @@
|
||||||
</div>
|
</div>
|
||||||
<div id="collapse-tab-user-auth" class="card-body collapse" data-bs-parent="#user-content">
|
<div id="collapse-tab-user-auth" class="card-body collapse" data-bs-parent="#user-content">
|
||||||
{% if mailboxdata.attributes.force_pw_update == '1' %}
|
{% if mailboxdata.attributes.force_pw_update == '1' %}
|
||||||
<div class="alert alert-danger">{{ lang.user.force_pw_update|raw }}</div>
|
<div class="alert alert-danger">{{ lang.user.force_pw_update|raw }}</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if not skip_sogo %}
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="hidden-xs col-md-3 col-xs-5 text-right"></div>
|
<div class="col-xl-9 col-lg-7 col-md-12 col-12 d-flex flex-column mb-4">
|
||||||
<div class="col-md-3 col-xs-12">
|
{% if not skip_sogo %}
|
||||||
{% if dual_login and allow_admin_email_login == 'n' or mailboxdata.attributes.force_pw_update == '1' %}
|
<div class="row mb-4">
|
||||||
<button disabled class="btn btn-secondary btn-block btn-xs-lg">
|
<div class="col-12 col-lg-6 col-xl-4">
|
||||||
<i class="bi bi-inbox-fill"></i> {{ lang.user.open_webmail_sso }}
|
{% if dual_login and allow_admin_email_login == 'n' or mailboxdata.attributes.force_pw_update == '1' %}
|
||||||
</button>
|
<button disabled class="btn btn-secondary btn-block btn-xs-lg w-100">
|
||||||
{% else %}
|
{{ lang.user.open_webmail_sso }} <i class="bi bi-arrow-right"></i>
|
||||||
<a target="_blank" href="/sogo-auth.php?login={{ mailcow_cc_username }}" role="button" class="btn btn-secondary btn-block btn-xs-lg">
|
</button>
|
||||||
<i class="bi bi-inbox-fill"></i> {{ lang.user.open_webmail_sso }}
|
{% else %}
|
||||||
</a>
|
<a target="_blank" href="/sogo-auth.php?login={{ mailcow_cc_username }}" role="button" class="btn btn-primary btn-lg btn-block btn-xs-lg w-100">
|
||||||
|
{{ lang.user.open_webmail_sso }} <i class="bi bi-arrow-right"></i>
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
|
||||||
</div>
|
<legend>{{ lang.user.overview }}</legend>
|
||||||
<hr>
|
<hr>
|
||||||
<div class="row">
|
<div class="d-flex">
|
||||||
<div class="d-none d-sm-flex col-md-3 col-5 text-end"></div>
|
<h5><i class="bi bi-envelope-fill"></i> {{ mailboxdata.messages }} {{ lang.user.messages }}</h5>
|
||||||
<div class="col-md-9 col-12">
|
<h5 class="ms-auto">{{ mailboxdata.quota_used|formatBytes(2) }} / {% if mailboxdata.quota == 0 %}∞{% else %}{{ mailboxdata.quota|formatBytes(2) }}{% endif %}</h5>
|
||||||
<p class="text-muted text-muted-mt-0">{{ lang.user.direct_protocol_access|raw }}</p>
|
</div>
|
||||||
{% if mailboxdata.attributes.imap_access == 1 %}<div class="badge fs-6 bg-success mb-2">IMAP <i class="bi bi-check-lg"></i></div>{% else %}<div class="badge fs-6 bg-danger">IMAP <i class="bi bi-x-lg"></i></div>{% endif %}
|
<div class="progress mb-4" style="height: 20px";>
|
||||||
{% if mailboxdata.attributes.smtp_access == 1 %}<div class="badge fs-6 bg-success mb-2">SMTP <i class="bi bi-check-lg"></i></div>{% else %}<div class="badge fs-6 bg-danger">SMTP <i class="bi bi-x-lg"></i></div>{% endif %}
|
|
||||||
{% if mailboxdata.attributes.sieve_access == 1 %}<div class="badge fs-6 bg-success mb-2">Sieve <i class="bi bi-check-lg"></i></div>{% else %}<div class="badge fs-6 bg-danger">Sieve <i class="bi bi-x-lg"></i></div>{% endif %}
|
|
||||||
{% if mailboxdata.attributes.pop3_access == 1 %}<div class="badge fs-6 bg-success mb-2">POP3 <i class="bi bi-check-lg"></i></div>{% else %}<div class="badge fs-6 bg-danger">POP3 <i class="bi bi-x-lg"></i></div>{% endif %}
|
|
||||||
{% if mailboxdata.attributes.sogo_access == 1 %}<div class="badge fs-6 bg-success mb-2">SOGo <i class="bi bi-check-lg"></i></div>{% else %}<div class="badge fs-6 bg-danger">SOGo <i class="bi bi-x-lg"></i></div>{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<hr>
|
|
||||||
{% endif %}
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-3 col-12 text-sm-end text-start mb-4">{{ lang.user.in_use }}:</div>
|
|
||||||
<div class="col-md-5 col-12">
|
|
||||||
<div class="progress">
|
|
||||||
<div class="progress-bar bg-{{ mailboxdata.percent_class }}" role="progressbar" aria-valuenow="{{ mailboxdata.percent_in_use }}" aria-valuemin="0" aria-valuemax="100" style="min-width:2em;width: {{ mailboxdata.percent_in_use }}%;">
|
<div class="progress-bar bg-{{ mailboxdata.percent_class }}" role="progressbar" aria-valuenow="{{ mailboxdata.percent_in_use }}" aria-valuemin="0" aria-valuemax="100" style="min-width:2em;width: {{ mailboxdata.percent_in_use }}%;">
|
||||||
{{ mailboxdata.percent_in_use }}%
|
{{ mailboxdata.percent_in_use }}%
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p>{{ mailboxdata.quota_used|formatBytes(2) }} / {% if mailboxdata.quota == 0 %}∞{% else %}{{ mailboxdata.quota|formatBytes(2) }}{% endif %}<br>{{ mailboxdata.messages }} {{ lang.user.messages }}</p>
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12 col-md-3 d-flex">
|
||||||
|
<span class="mt-2 w-100 text-md-end">{{ lang.user.protocols }}:</span>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-md-9 d-flex">
|
||||||
|
<i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill m-2 ms-0" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.user.direct_protocol_access|raw }}"></i>
|
||||||
|
<div class="d-flex flex-wrap">
|
||||||
|
{% if mailboxdata.attributes.imap_access == 1 %}<div class="badge fs-6 bg-success m-2">IMAP <i class="bi bi-check-lg"></i></div>{% else %}<div class="badge fs-6 bg-danger">IMAP <i class="bi bi-x-lg"></i></div>{% endif %}
|
||||||
|
{% if mailboxdata.attributes.smtp_access == 1 %}<div class="badge fs-6 bg-success m-2">SMTP <i class="bi bi-check-lg"></i></div>{% else %}<div class="badge fs-6 bg-danger">SMTP <i class="bi bi-x-lg"></i></div>{% endif %}
|
||||||
|
{% if mailboxdata.attributes.sieve_access == 1 %}<div class="badge fs-6 bg-success m-2">Sieve <i class="bi bi-check-lg"></i></div>{% else %}<div class="badge fs-6 bg-danger">Sieve <i class="bi bi-x-lg"></i></div>{% endif %}
|
||||||
|
{% if mailboxdata.attributes.pop3_access == 1 %}<div class="badge fs-6 bg-success m-2">POP3 <i class="bi bi-check-lg"></i></div>{% else %}<div class="badge fs-6 bg-danger">POP3 <i class="bi bi-x-lg"></i></div>{% endif %}
|
||||||
|
{% if not skip_sogo %}{% if mailboxdata.attributes.sogo_access == 1 %}<div class="badge fs-6 bg-success m-2">SOGo <i class="bi bi-check-lg"></i></div>{% else %}<div class="badge fs-6 bg-danger">SOGo <i class="bi bi-x-lg"></i></div>{% endif %}{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mt-2">
|
||||||
|
<div class="col-12 col-md-3 d-flex">
|
||||||
|
<span class="mt-2 w-100 text-md-end">{{ lang.user.apple_connection_profile }}:</span>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-md-8">
|
||||||
|
<div class="d-flex">
|
||||||
|
<i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill me-2" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.user.apple_connection_profile_mailonly }}"></i>
|
||||||
|
<a href="/mobileconfig.php?only_email">{{ lang.user.email }} <small>[IMAP, SMTP]</small></a>
|
||||||
|
</div>
|
||||||
|
{% if not skip_sogo %}
|
||||||
|
<div class="d-flex">
|
||||||
|
<i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill me-2" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.user.apple_connection_profile_complete }}"></i>
|
||||||
|
<a href="/mobileconfig.php">{{ lang.user.email_and_dav }} <small>[IMAP, SMTP, Cal/CardDAV]</small></a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mt-2">
|
||||||
|
<div class="col-12 col-md-3 d-flex">
|
||||||
|
<span class="mt-2 w-100 text-md-end">{{ lang.user.apple_connection_profile }}<br>{{ lang.user.with_app_password }}:</span>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-md-9">
|
||||||
|
<div class="d-flex">
|
||||||
|
<i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill me-2" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.user.apple_connection_profile_mailonly }} {{ lang.user.apple_connection_profile_with_app_password }}"></i>
|
||||||
|
<a href="/mobileconfig.php?only_email&app_password">{{ lang.user.email }} <small>[IMAP, SMTP]</small></a>
|
||||||
|
</div>
|
||||||
|
{% if not skip_sogo %}
|
||||||
|
<div class="d-flex">
|
||||||
|
<i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill me-2" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.user.apple_connection_profile_complete }} {{ lang.user.apple_connection_profile_with_app_password }}"></i>
|
||||||
|
<a href="/mobileconfig.php?app_password">{{ lang.user.email_and_dav }} <small>[IMAP, SMTP, Cal/CardDAV]</small></a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12 d-flex flex-column text-center align-items-center mt-4">
|
||||||
|
<a target="_blank" href="https://mailcow.github.io/mailcow-dockerized-docs/client/client/#{{ clientconfigstr }}">{{ lang.user.client_configuration }}</a>
|
||||||
|
<a class="mt-2" href="#userFilterModal" data-bs-toggle="modal">{{ lang.user.show_sieve_filters }}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{# TFA #}
|
||||||
|
<legend class="mt-4">{{ lang.user.authentication }}</legend>
|
||||||
<hr>
|
<hr>
|
||||||
<p><a href="#pwChangeModal" data-bs-toggle="modal"><i class="bi bi-pencil-fill"></i> {{ lang.user.change_password }}</a></p>
|
<div class="row">
|
||||||
</div>
|
<div class="col-12 col-md-3 d-flex"></div>
|
||||||
</div>
|
<div class="col-12 col-md-9 d-flex flex-wrap justify-content-center justify-content-sm-start">
|
||||||
<hr>
|
<a class="btn btn-secondary" href="#pwChangeModal" data-bs-toggle="modal"><i class="bi bi-pencil-fill"></i> {{ lang.user.change_password }}</a>
|
||||||
{# TFA #}
|
</div>
|
||||||
<div class="row">
|
</div>
|
||||||
<div class="col-sm-3 col-xs-5 text-right">{{ lang.tfa.tfa }}:</div>
|
<div class="row mt-4">
|
||||||
<div class="col-sm-9 col-xs-7">
|
<div class="col-12 col-md-3 d-flex">
|
||||||
<p id="tfa_pretty">{{ tfa_data.pretty }}</p>
|
<span class="mt-2 w-100 text-md-end">{{ lang.tfa.tfa }}:</span>
|
||||||
{% include 'tfa_keys.twig' %}
|
</div>
|
||||||
<br>
|
<div class="col-12 col-md-9 d-flex flex-wrap justify-content-center justify-content-sm-start">
|
||||||
</div>
|
<span id="tfa_pretty">{{ tfa_data.pretty }}</span>
|
||||||
</div>
|
{% include 'tfa_keys.twig' %}
|
||||||
<div class="row">
|
</div>
|
||||||
<div class="col-sm-3 col-xs-5 text-right">{{ lang.tfa.set_tfa }}:</div>
|
</div>
|
||||||
<div class="col-sm-9 col-xs-7">
|
<div class="row mt-2 mb-4">
|
||||||
<select data-style="btn btn-sm dropdown-toggle bs-placeholder btn-secondary" data-width="fit" id="selectTFA" class="selectpicker" title="{{ lang.tfa.select }}">
|
<div class="col-12 col-md-3 d-flex">
|
||||||
<option value="yubi_otp">{{ lang.tfa.yubi_otp }}</option>
|
<span class="mt-2 w-100 text-md-end">{{ lang.tfa.set_tfa }}:</span>
|
||||||
<option value="webauthn">{{ lang.tfa.webauthn }}</option>
|
</div>
|
||||||
<option value="totp">{{ lang.tfa.totp }}</option>
|
<div class="col-12 col-md-9 d-flex flex-wrap align-items-center justify-content-center justify-content-sm-start">
|
||||||
<option value="none">{{ lang.tfa.none }}</option>
|
<i style="font-size: 16px; cursor: pointer;" class="bi bi-patch-question-fill m-2 ms-0" data-bs-toggle="tooltip" data-bs-html="true" data-bs-placement="bottom" title="{{ lang.user.tfa_info|raw }}"></i>
|
||||||
</select>
|
<select data-style="ms-2 btn btn-sm dropdown-toggle bs-placeholder btn-secondary" data-width="fit" id="selectTFA" class="selectpicker" title="{{ lang.tfa.select }}">
|
||||||
</div>
|
<option value="yubi_otp">{{ lang.tfa.yubi_otp }}</option>
|
||||||
</div>
|
<option value="webauthn">{{ lang.tfa.webauthn }}</option>
|
||||||
<hr>
|
<option value="totp">{{ lang.tfa.totp }}</option>
|
||||||
{# FIDO2 #}
|
<option value="none">{{ lang.tfa.none }}</option>
|
||||||
<div class="row">
|
</select>
|
||||||
<div class="col-sm-3 col-12 text-sm-end text-start">
|
</div>
|
||||||
<p><i class="bi bi-shield-fill-check"></i> {{ lang.fido2.fido2_auth }}</p>
|
</div>
|
||||||
</div>
|
{# FIDO2 #}
|
||||||
</div>
|
<div class="row mt-4">
|
||||||
<div class="row">
|
<div class="col-sm-3 col-12 text-sm-end text-start">
|
||||||
<div class="col-sm-3 col-12 text-sm-end text-start mb-4">
|
<p><i class="bi bi-shield-fill-check"></i> {{ lang.fido2.fido2_auth }}</p>
|
||||||
{{ lang.fido2.known_ids }}:
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-9 col-12">
|
<div class="row">
|
||||||
<div class="table-responsive">
|
<div class="col-sm-3 col-12 text-sm-end text-start mb-4">
|
||||||
<table class="table table-striped table-hover table-condensed" id="fido2_keys">
|
{{ lang.fido2.known_ids }}:
|
||||||
<tr>
|
</div>
|
||||||
<th>ID</th>
|
<div class="col-sm-9 col-12">
|
||||||
<th style="min-width:240px;text-align: right">{{ lang.admin.action }}</th>
|
<div class="table-responsive">
|
||||||
</tr>
|
<table class="table table-striped table-hover table-condensed" id="fido2_keys">
|
||||||
{% include 'fido2.twig' %}
|
<tr>
|
||||||
</table>
|
<th>ID</th>
|
||||||
|
<th style="min-width:240px;text-align: right">{{ lang.admin.action }}</th>
|
||||||
|
</tr>
|
||||||
|
{% include 'fido2.twig' %}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="offset-sm-3 col-sm-9">
|
||||||
|
<div class="btn-group nowrap">
|
||||||
|
<button class="btn btn-sm btn-primary d-block d-sm-inline" id="register-fido2">{{ lang.fido2.set_fido2 }}</button>
|
||||||
|
<button type="button" class="btn btn-sm btn-xs-lg btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></button>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a class="dropdown-item" href="#" id="register-fido2-touchid"><i class="bi bi-apple"></i> {{ lang.fido2.set_fido2_touchid }}</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<br>
|
<br>
|
||||||
</div>
|
<div class="row" id="status-fido2">
|
||||||
</div>
|
<div class="col-sm-3 col-5 text-end">{{ lang.fido2.register_status }}:</div>
|
||||||
<div class="row">
|
<div class="col-sm-9 col-7">
|
||||||
<div class="offset-sm-3 col-sm-9">
|
<div id="fido2-alerts">-</div>
|
||||||
<div class="btn-group nowrap">
|
</div>
|
||||||
<button class="btn btn-sm btn-primary d-block d-sm-inline" id="register-fido2">{{ lang.fido2.set_fido2 }}</button>
|
<br>
|
||||||
<button type="button" class="btn btn-sm btn-xs-lg btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></button>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
<li><a class="dropdown-item" href="#" id="register-fido2-touchid"><i class="bi bi-apple"></i> {{ lang.fido2.set_fido2_touchid }}</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="ms-auto col-xl-3 col-lg-5 col-md-12 col-12 d-flex flex-column well flex-grow-1">
|
||||||
<br>
|
<legend class="d-flex">
|
||||||
<div class="row" id="status-fido2">
|
<span>{{ lang.user.recent_successful_connections }}</span>
|
||||||
<div class="col-sm-3 col-5 text-end">{{ lang.fido2.register_status }}:</div>
|
<div id="spinner-last-login" class="ms-auto my-auto spinner-border spinner-border-sm d-none" role="status">
|
||||||
<div class="col-sm-9 col-7">
|
<span class="visually-hidden">Loading...</span>
|
||||||
<div id="fido2-alerts">-</div>
|
</div>
|
||||||
</div>
|
</legend>
|
||||||
<br>
|
|
||||||
</div>
|
|
||||||
<hr>
|
|
||||||
<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 }}:</div>
|
|
||||||
<div class="col-md-9 col-12">
|
|
||||||
<p><i class="bi bi-file-earmark-post"></i> <a href="/mobileconfig.php?only_email">{{ lang.user.email }}</a> <small>IMAP, SMTP</small></p>
|
|
||||||
<p class="text-muted">{{ lang.user.apple_connection_profile_mailonly }}</p>
|
|
||||||
{% if not skip_sogo %}
|
|
||||||
<p><i class="bi bi-file-earmark-post"></i> <a href="/mobileconfig.php">{{ lang.user.email_and_dav }}</a> <small>IMAP, SMTP, Cal/CardDAV</small></p>
|
|
||||||
<p class="text-muted">{{ lang.user.apple_connection_profile_complete }}</p>
|
|
||||||
{% endif %}
|
|
||||||
</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-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>
|
|
||||||
{% 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>
|
|
||||||
{% 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 href="#userFilterModal" data-bs-toggle="modal">[{{ lang.user.show_sieve_filters }}]</a></p>
|
|
||||||
<hr>
|
<hr>
|
||||||
<h4 class="recent-login-success">{{ lang.user.recent_successful_connections }}</h4>
|
<h6 class="last-ui-login"></h6>
|
||||||
<div class="dropdown mt-2">
|
<div class="d-flex">
|
||||||
<button class="btn btn-secondary btn-xs btn-xs-lg dropdown-toggle" type="button" id="history_sasl_days" data-bs-toggle="dropdown">{{ lang.user.login_history }}</button>
|
<span class="clear-last-logins mt-auto mb-2">
|
||||||
<ul class="dropdown-menu">
|
{{ lang.user.clear_recent_successful_connections }}
|
||||||
<li class="login-history" data-days="1"><a class="dropdown-item" href="#">1 {{ lang.user.day }}</a></li>
|
</span>
|
||||||
<li class="login-history" data-days="7"><a class="dropdown-item active" href="#">1 {{ lang.user.week }}</a></li>
|
<div class="dropdown mt-4 mb-2 ms-auto">
|
||||||
<li class="login-history" data-days="14"><a class="dropdown-item" href="#">2 {{ lang.user.weeks }}</a></li>
|
<button class="btn btn-secondary btn-xs btn-xs-lg dropdown-toggle" type="button" id="history_sasl_days" data-bs-toggle="dropdown">{{ lang.user.login_history }}</button>
|
||||||
<li class="login-history" data-days="31"><a class="dropdown-item" href="#">1 {{ lang.user.month }}</a></li>
|
<ul class="dropdown-menu">
|
||||||
</ul>
|
<li class="login-history" data-days="1"><a class="dropdown-item" href="#">1 {{ lang.user.day }}</a></li>
|
||||||
|
<li class="login-history" data-days="7"><a class="dropdown-item active" href="#">1 {{ lang.user.week }}</a></li>
|
||||||
|
<li class="login-history" data-days="14"><a class="dropdown-item" href="#">2 {{ lang.user.weeks }}</a></li>
|
||||||
|
<li class="login-history" data-days="31"><a class="dropdown-item" href="#">1 {{ lang.user.month }}</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="last-login mt-4"></div>
|
<ul class="list-group last-sasl-login overflow-auto" style="flex: 1 1 0; min-height: 400px;"></ul>
|
||||||
<span class="clear-last-logins mt-2">
|
|
||||||
{{ lang.user.clear_recent_successful_connections }}
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -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-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="col-sm-9 col-12">
|
||||||
<div class="btn-group" data-acl="{{ acl.delimiter_action }}">
|
<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 btn-outline-secondary{% if get_tagging_options == 'subfolder' %} active{% endif %}"
|
||||||
data-action="edit_selected"
|
data-action="edit_selected"
|
||||||
data-item="{{ mailcow_cc_username }}"
|
data-item="{{ mailcow_cc_username }}"
|
||||||
data-id="delimiter_action"
|
data-id="delimiter_action"
|
||||||
data-api-url='edit/delimiter_action'
|
data-api-url='edit/delimiter_action'
|
||||||
data-api-attr='{"tagged_mail_handler":"subfolder"}'>{{ lang.user.tag_in_subfolder }}</button>
|
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 btn-outline-secondary{% if get_tagging_options == 'subject' %} active{% endif %}"
|
||||||
data-action="edit_selected"
|
data-action="edit_selected"
|
||||||
data-item="{{ mailcow_cc_username }}"
|
data-item="{{ mailcow_cc_username }}"
|
||||||
data-id="delimiter_action"
|
data-id="delimiter_action"
|
||||||
data-api-url='edit/delimiter_action'
|
data-api-url='edit/delimiter_action'
|
||||||
data-api-attr='{"tagged_mail_handler":"subject"}'>{{ lang.user.tag_in_subject }}</button>
|
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 btn-outline-secondary{% if get_tagging_options == 'none' %} active{% endif %}"
|
||||||
data-action="edit_selected"
|
data-action="edit_selected"
|
||||||
data-item="{{ mailcow_cc_username }}"
|
data-item="{{ mailcow_cc_username }}"
|
||||||
data-id="delimiter_action"
|
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-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="col-sm-9 col-12">
|
||||||
<div class="btn-group" data-acl="{{ acl.tls_policy }}">
|
<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 btn-outline-secondary{% if get_tls_policy.tls_enforce_in == '1' %} active"{% endif %}"
|
||||||
data-action="edit_selected"
|
data-action="edit_selected"
|
||||||
data-item="{{ mailcow_cc_username }}"
|
data-item="{{ mailcow_cc_username }}"
|
||||||
data-id="tls_policy"
|
data-id="tls_policy"
|
||||||
data-api-url='edit/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>
|
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 btn-outline-secondary{% if get_tls_policy.tls_enforce_out == '1' %} active"{% endif %}"
|
||||||
data-action="edit_selected"
|
data-action="edit_selected"
|
||||||
data-item="{{ mailcow_cc_username }}"
|
data-item="{{ mailcow_cc_username }}"
|
||||||
data-id="tls_policy"
|
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-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="col-sm-9 col-12">
|
||||||
<div class="btn-group" data-acl="{{ acl.quarantine_notification }}">
|
<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 btn-outline-secondary{% if quarantine_notification == 'never' %} active{% endif %}"
|
||||||
data-action="edit_selected"
|
data-action="edit_selected"
|
||||||
data-item="{{ mailcow_cc_username }}"
|
data-item="{{ mailcow_cc_username }}"
|
||||||
data-id="quarantine_notification"
|
data-id="quarantine_notification"
|
||||||
data-api-url='edit/quarantine_notification'
|
data-api-url='edit/quarantine_notification'
|
||||||
data-api-attr='{"quarantine_notification":"never"}'>{{ lang.user.never }}</button>
|
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 btn-outline-secondary{% if quarantine_notification == 'hourly' %} active{% endif %}"
|
||||||
data-action="edit_selected"
|
data-action="edit_selected"
|
||||||
data-item="{{ mailcow_cc_username }}"
|
data-item="{{ mailcow_cc_username }}"
|
||||||
data-id="quarantine_notification"
|
data-id="quarantine_notification"
|
||||||
data-api-url='edit/quarantine_notification'
|
data-api-url='edit/quarantine_notification'
|
||||||
data-api-attr='{"quarantine_notification":"hourly"}'>{{ lang.user.hourly }}</button>
|
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 btn-outline-secondary{% if quarantine_notification == 'daily' %} active{% endif %}"
|
||||||
data-action="edit_selected"
|
data-action="edit_selected"
|
||||||
data-item="{{ mailcow_cc_username }}"
|
data-item="{{ mailcow_cc_username }}"
|
||||||
data-id="quarantine_notification"
|
data-id="quarantine_notification"
|
||||||
data-api-url='edit/quarantine_notification'
|
data-api-url='edit/quarantine_notification'
|
||||||
data-api-attr='{"quarantine_notification":"daily"}'>{{ lang.user.daily }}</button>
|
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 btn-outline-secondary{% if quarantine_notification == 'weekly' %} active{% endif %}"
|
||||||
data-action="edit_selected"
|
data-action="edit_selected"
|
||||||
data-item="{{ mailcow_cc_username }}"
|
data-item="{{ mailcow_cc_username }}"
|
||||||
data-id="quarantine_notification"
|
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-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="col-sm-9 col-12">
|
||||||
<div class="btn-group" data-acl="{{ acl.quarantine_category }}">
|
<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 btn-outline-secondary{% if quarantine_category == 'reject' %} active{% endif %}"
|
||||||
data-action="edit_selected"
|
data-action="edit_selected"
|
||||||
data-item="{{ mailcow_cc_username }}"
|
data-item="{{ mailcow_cc_username }}"
|
||||||
data-id="quarantine_category"
|
data-id="quarantine_category"
|
||||||
data-api-url='edit/quarantine_category'
|
data-api-url='edit/quarantine_category'
|
||||||
data-api-attr='{"quarantine_category":"reject"}'>{{ lang.user.q_reject }}</button>
|
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 btn-outline-secondary{% if quarantine_category == 'add_header' %} active{% endif %}"
|
||||||
data-action="edit_selected"
|
data-action="edit_selected"
|
||||||
data-item="{{ mailcow_cc_username }}"
|
data-item="{{ mailcow_cc_username }}"
|
||||||
data-id="quarantine_category"
|
data-id="quarantine_category"
|
||||||
data-api-url='edit/quarantine_category'
|
data-api-url='edit/quarantine_category'
|
||||||
data-api-attr='{"quarantine_category":"add_header"}'>{{ lang.user.q_add_header }}</button>
|
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 btn-outline-secondary{% if quarantine_category == 'all' %} active{% endif %}"
|
||||||
data-action="edit_selected"
|
data-action="edit_selected"
|
||||||
data-item="{{ mailcow_cc_username }}"
|
data-item="{{ mailcow_cc_username }}"
|
||||||
data-id="quarantine_category"
|
data-id="quarantine_category"
|
||||||
|
|
Loading…
Reference in New Issue