public
nobgit
read
NobMail
Based on mailcow: dockerized
Languages
Repository composition by tracked source files.
PHP
49%
JavaScript
35%
HTML
9%
CSS
4%
Shell
2%
Python
1%
Lua
0%
Perl
0%
Ruby
0%
SCSS
0%
Create file
Wiki Documentation
Clone
https://nobgit.com/orgs/nobgit/nobmail.git
ssh://[email protected]:2222/orgs/nobgit/nobmail.git
Commit
Merge branch 'pr/FreddleSpl0it/4527' into feature/bootstrap5
5629d47c
data/web/admin.php | 4 +
data/web/css/build/001-bootstrap.min.css | 11 -
data/web/css/build/002-breakpoint.min.css | 2 +-
data/web/css/build/003-bootstrap-select.css | 487 +
data/web/css/build/003-bootstrap-select.min.css | 6 -
data/web/css/build/006-footable.bootstrap.min.css | 323 -
.../{009-animate.min.css => 008-animate.min.css} | 20 +-
...xtarea.min.css => 009-numberedtextarea.min.css} | 0
...ry.jqplot.min.css => 010-jquery.jqplot.min.css} | 0
data/web/css/build/011-datatables.css | 693 +
data/web/css/build/012-Chart.min.css | 1 -
...bootstrap-icons.css => 012-bootstrap-icons.css} | 281 +-
.../css/build/{008-mailcow.css => 013-mailcow.css} | 59 +-
data/web/css/build/014-responsive.css | 214 +-
data/web/css/themes/cerulean-bootstrap.css | 11427 ++++++++++++
data/web/css/themes/cosmo-bootstrap.css | 10997 +++++++++++
data/web/css/themes/cyborg-bootstrap.css | 11411 +++++++++++
data/web/css/themes/darkly-bootstrap.css | 11348 +++++++++++
data/web/css/themes/flatly-bootstrap.css | 11340 +++++++++++
data/web/css/themes/journal-bootstrap.css | 11312 +++++++++++
data/web/css/themes/litera-bootstrap.css | 11433 ++++++++++++
data/web/css/themes/lumen-bootstrap.css | 11560 ++++++++++++
data/web/css/themes/lux-bootstrap.css | 11108 +++++++++++
data/web/css/themes/materia-bootstrap.css | 12431 ++++++++++++
data/web/css/themes/minty-bootstrap.css | 11386 +++++++++++
data/web/css/themes/morph-bootstrap.css | 11949 ++++++++++++
data/web/css/themes/pulse-bootstrap.css | 11077 +++++++++++
data/web/css/themes/quartz-bootstrap.css | 11813 ++++++++++++
data/web/css/themes/regent-bootstrap.css | 11093 +++++++++++
data/web/css/themes/sandstone-bootstrap.css | 11400 +++++++++++
data/web/css/themes/simplex-bootstrap.css | 11384 +++++++++++
data/web/css/themes/sketchy-bootstrap.css | 11628 ++++++++++++
data/web/css/themes/slate-bootstrap.css | 11569 ++++++++++++
data/web/css/themes/solar-bootstrap.css | 11345 +++++++++++
data/web/css/themes/spacelab-bootstrap.css | 11465 ++++++++++++
data/web/css/themes/superhero-bootstrap.css | 11405 +++++++++++
data/web/css/themes/united-bootstrap.css | 11274 +++++++++++
data/web/css/themes/vapor-bootstrap.css | 11746 ++++++++++++
data/web/css/themes/yeti-bootstrap.css | 11533 ++++++++++++
data/web/css/themes/zephyr-bootstrap.css | 11458 ++++++++++++
data/web/debug.php | 1 +
data/web/edit.php | 1 +
data/web/fonts/bootstrap-icons.woff | Bin 111976 -> 137124 bytes
data/web/fonts/bootstrap-icons.woff2 | Bin 83304 -> 102536 bytes
data/web/inc/functions.customize.inc.php | 29 +
data/web/inc/header.inc.php | 1 -
data/web/inc/prerequisites.inc.php | 40 +-
data/web/inc/vars.inc.php | 7 -
data/web/js/build/000-jquery-3.6.0.min.js | 2 +
data/web/js/build/000-jquery.min.js | 4 -
data/web/js/build/001-bootstrap.bundle.min.js | 7 +
data/web/js/build/001-bootstrap.min.js | 7 -
data/web/js/build/004-bootstrap-select.js | 3583 ++++
data/web/js/build/004-bootstrap-select.min.js | 8 -
data/web/js/build/006-notifications.min.js | 2 +-
data/web/js/build/008-Chart.min.js | 7 -
data/web/js/build/008-Chartjs-plugin-datalabels.js | 7 -
data/web/js/build/008-chart.js | 13269 +++++++++++++
data/web/js/build/008-chartjs-plugin-datalabels.js | 7 +
data/web/js/build/011-datatables.js | 18694 +++++++++++++++++++
data/web/js/build/011-u2f-api.js | 778 -
data/web/js/build/012-api.js | 7 +-
data/web/js/build/013-bootstrap-tabcollapse.js | 239 -
data/web/js/build/013-footable.min.js | 10 -
data/web/js/build/014-mailcow.js | 75 +-
data/web/js/site/admin.js | 619 +-
data/web/js/site/debug.js | 910 +-
data/web/js/site/edit.js | 143 +-
data/web/js/site/mailbox.js | 1636 +-
data/web/js/site/qhandler.js | 10 +-
data/web/js/site/quarantine.js | 172 +-
data/web/js/site/user.js | 441 +-
data/web/lang/lang.cs.json | 8 +-
data/web/lang/lang.da.json | 8 +-
data/web/lang/lang.de.json | 32 +-
data/web/lang/lang.en.json | 33 +-
data/web/lang/lang.fi.json | 4 +-
data/web/lang/lang.fr.json | 8 +-
data/web/lang/lang.hu.json | 2 +-
data/web/lang/lang.it.json | 8 +-
data/web/lang/lang.ko.json | 8 +-
data/web/lang/lang.nl.json | 8 +-
data/web/lang/lang.ro.json | 8 +-
data/web/lang/lang.ru.json | 8 +-
data/web/lang/lang.sk.json | 8 +-
data/web/lang/lang.sv.json | 8 +-
data/web/lang/lang.zh.json | 8 +-
data/web/mailbox.php | 1 +
data/web/quarantine.php | 1 +
data/web/templates/admin.twig | 115 +-
data/web/templates/admin/tab-config-admins.twig | 411 +-
data/web/templates/admin/tab-config-customize.twig | 80 +-
data/web/templates/admin/tab-config-dkim.twig | 130 +-
data/web/templates/admin/tab-config-f2b.twig | 57 +-
data/web/templates/admin/tab-config-fwdhosts.twig | 40 +-
data/web/templates/admin/tab-config-oauth2.twig | 34 +-
.../admin/tab-config-password-policy.twig | 27 +-
.../web/templates/admin/tab-config-quarantine.twig | 62 +-
data/web/templates/admin/tab-config-quota.twig | 28 +-
data/web/templates/admin/tab-config-rsettings.twig | 34 +-
data/web/templates/admin/tab-config-rspamd.twig | 39 +-
.../templates/admin/tab-globalfilter-regex.twig | 33 +-
data/web/templates/admin/tab-ldap.twig | 13 +-
data/web/templates/admin/tab-mailq.twig | 44 +-
data/web/templates/admin/tab-routing.twig | 90 +-
data/web/templates/admin/tab-sys-mails.twig | 45 +-
data/web/templates/base.twig | 69 +-
data/web/templates/debug.twig | 301 +-
data/web/templates/domainadmin.twig | 36 +-
data/web/templates/edit.twig | 9 +-
data/web/templates/edit/admin.twig | 20 +-
data/web/templates/edit/alias.twig | 20 +-
data/web/templates/edit/aliasdomain.twig | 24 +-
data/web/templates/edit/app-passwd.twig | 18 +-
data/web/templates/edit/bcc.twig | 14 +-
data/web/templates/edit/domain.twig | 97 +-
data/web/templates/edit/domainadmin.twig | 30 +-
data/web/templates/edit/filter.twig | 16 +-
data/web/templates/edit/mailbox.twig | 155 +-
data/web/templates/edit/oauth2client.twig | 14 +-
data/web/templates/edit/recipient_map.twig | 14 +-
data/web/templates/edit/relayhost.twig | 18 +-
data/web/templates/edit/resource.twig | 16 +-
data/web/templates/edit/syncjob.twig | 72 +-
data/web/templates/edit/tls_policy_map.twig | 16 +-
data/web/templates/edit/transport.twig | 22 +-
data/web/templates/fido2.twig | 2 +-
data/web/templates/index.twig | 77 +-
data/web/templates/mailbox.twig | 79 +-
data/web/templates/mailbox/page-size.twig | 6 -
data/web/templates/mailbox/tab-bcc.twig | 118 +-
data/web/templates/mailbox/tab-domain-aliases.twig | 55 +-
data/web/templates/mailbox/tab-domains.twig | 59 +-
data/web/templates/mailbox/tab-filters.twig | 137 +-
.../templates/mailbox/tab-mailbox-defaults.twig | 13 +-
data/web/templates/mailbox/tab-mailboxes.twig | 209 +-
data/web/templates/mailbox/tab-mbox-aliases.twig | 71 +-
data/web/templates/mailbox/tab-resources.twig | 63 +-
data/web/templates/mailbox/tab-syncjobs.twig | 59 +-
data/web/templates/mailbox/tab-tls-policy.twig | 57 +-
data/web/templates/modals/admin.twig | 132 +-
data/web/templates/modals/footer.twig | 79 +-
data/web/templates/modals/mailbox.twig | 415 +-
data/web/templates/modals/quarantine.twig | 44 +-
data/web/templates/modals/user.twig | 150 +-
data/web/templates/oauth/authorize.twig | 10 +-
data/web/templates/qhandler.twig | 35 +-
data/web/templates/quarantine.twig | 67 +-
data/web/templates/tfa_keys.twig | 2 +-
data/web/templates/user.twig | 63 +-
data/web/templates/user/AppPasswds.twig | 47 +-
data/web/templates/user/Pushover.twig | 140 +-
data/web/templates/user/SpamAliases.twig | 75 +-
data/web/templates/user/Spamfilter.twig | 144 +-
data/web/templates/user/Syncjobs.twig | 45 +-
data/web/templates/user/tab-user-auth.twig | 75 +-
data/web/templates/user/tab-user-details.twig | 33 +-
data/web/templates/user/tab-user-settings.twig | 87 +-
data/web/templates/user_domainadmin_common.twig | 1 +
data/web/user.php | 1 +
160 files changed, 339922 insertions(+), 5861 deletions(-)
delete mode 100644 data/web/css/build/001-bootstrap.min.css
create mode 100644 data/web/css/build/003-bootstrap-select.css
delete mode 100644 data/web/css/build/003-bootstrap-select.min.css
delete mode 100644 data/web/css/build/006-footable.bootstrap.min.css
rename data/web/css/build/{009-animate.min.css => 008-animate.min.css} (99%)
rename data/web/css/build/{010-numberedtextarea.min.css => 009-numberedtextarea.min.css} (100%)
rename data/web/css/build/{011-jquery.jqplot.min.css => 010-jquery.jqplot.min.css} (100%)
create mode 100644 data/web/css/build/011-datatables.css
delete mode 100644 data/web/css/build/012-Chart.min.css
rename data/web/css/build/{013-bootstrap-icons.css => 012-bootstrap-icons.css} (83%)
rename data/web/css/build/{008-mailcow.css => 013-mailcow.css} (85%)
create mode 100644 data/web/css/themes/cerulean-bootstrap.css
create mode 100644 data/web/css/themes/cosmo-bootstrap.css
create mode 100644 data/web/css/themes/cyborg-bootstrap.css
create mode 100644 data/web/css/themes/darkly-bootstrap.css
create mode 100644 data/web/css/themes/flatly-bootstrap.css
create mode 100644 data/web/css/themes/journal-bootstrap.css
create mode 100644 data/web/css/themes/litera-bootstrap.css
create mode 100644 data/web/css/themes/lumen-bootstrap.css
create mode 100644 data/web/css/themes/lux-bootstrap.css
create mode 100644 data/web/css/themes/materia-bootstrap.css
create mode 100644 data/web/css/themes/minty-bootstrap.css
create mode 100644 data/web/css/themes/morph-bootstrap.css
create mode 100644 data/web/css/themes/pulse-bootstrap.css
create mode 100644 data/web/css/themes/quartz-bootstrap.css
create mode 100644 data/web/css/themes/regent-bootstrap.css
create mode 100644 data/web/css/themes/sandstone-bootstrap.css
create mode 100644 data/web/css/themes/simplex-bootstrap.css
create mode 100644 data/web/css/themes/sketchy-bootstrap.css
create mode 100644 data/web/css/themes/slate-bootstrap.css
create mode 100644 data/web/css/themes/solar-bootstrap.css
create mode 100644 data/web/css/themes/spacelab-bootstrap.css
create mode 100644 data/web/css/themes/superhero-bootstrap.css
create mode 100644 data/web/css/themes/united-bootstrap.css
create mode 100644 data/web/css/themes/vapor-bootstrap.css
create mode 100644 data/web/css/themes/yeti-bootstrap.css
create mode 100644 data/web/css/themes/zephyr-bootstrap.css
create mode 100644 data/web/js/build/000-jquery-3.6.0.min.js
delete mode 100644 data/web/js/build/000-jquery.min.js
create mode 100644 data/web/js/build/001-bootstrap.bundle.min.js
delete mode 100644 data/web/js/build/001-bootstrap.min.js
create mode 100644 data/web/js/build/004-bootstrap-select.js
delete mode 100644 data/web/js/build/004-bootstrap-select.min.js
delete mode 100644 data/web/js/build/008-Chart.min.js
delete mode 100644 data/web/js/build/008-Chartjs-plugin-datalabels.js
create mode 100644 data/web/js/build/008-chart.js
create mode 100644 data/web/js/build/008-chartjs-plugin-datalabels.js
create mode 100644 data/web/js/build/011-datatables.js
delete mode 100644 data/web/js/build/011-u2f-api.js
delete mode 100644 data/web/js/build/013-bootstrap-tabcollapse.js
delete mode 100644 data/web/js/build/013-footable.min.js
delete mode 100644 data/web/templates/mailbox/page-size.twig
Diff
diff --cc data/web/css/build/013-mailcow.css
index c8c21b18,77556829..67034709
--- a/data/web/css/build/013-mailcow.css
+++ b/data/web/css/build/013-mailcow.css
@@@ -1,299 -1,269 +1,306 @@@
-@font-face {
- font-family: 'Noto Sans';
- font-style: normal;
- font-weight: 400;
- src: local(''),
- url('/fonts/noto-sans-v12-latin_greek_cyrillic-regular.woff2') format('woff2'),
- url('/fonts/noto-sans-v12-latin_greek_cyrillic-regular.woff') format('woff');
-}
-
-@font-face {
- font-family: 'Noto Sans';
- font-style: normal;
- font-weight: 700;
- src: local(''),
- url('/fonts/noto-sans-v12-latin_greek_cyrillic-700.woff2') format('woff2'),
- url('/fonts/noto-sans-v12-latin_greek_cyrillic-700.woff') format('woff');
-}
-
-@font-face {
- font-family: 'Noto Sans';
- font-style: italic;
- font-weight: 400;
- src: local(''),
- url('/fonts/noto-sans-v12-latin_greek_cyrillic-italic.woff2') format('woff2'),
- url('/fonts/noto-sans-v12-latin_greek_cyrillic-italic.woff') format('woff');
-}
-
-@font-face {
- font-family: 'Noto Sans';
- font-style: italic;
- font-weight: 700;
- src: local(''),
- url('/fonts/noto-sans-v12-latin_greek_cyrillic-700italic.woff2') format('woff2'),
- url('/fonts/noto-sans-v12-latin_greek_cyrillic-700italic.woff') format('woff');
-}
-#maxmsgsize { min-width: 80px; }
-#slider1 .slider-selection {
- background: #FFD700;
-}
-#slider1 .slider-track-high {
- background: #FF4500;
-}
-#slider1 .slider-track-low {
- background: #66CD00;
-}
-.striped:nth-child(odd) {
- background-color: #fff;
-}
-.striped:nth-child(even) {
- background-color: #fafafa;
- border:1px solid white;
-}
-.btn {
- text-transform: none;
-}
-.btn * {
- pointer-events: none;
-}
-.textarea-code {
- font-family:Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace;
- background:transparent !important;
-}
-.navbar-nav {
- margin: 0;
-}
-.navbar-nav .nav-link {
- height: 44px;
- display: flex;
- align-items: center;
- margin: 0 10px;
-}
-.navbar-fixed-bottom .navbar-collapse,
-.navbar-fixed-top .navbar-collapse {
- max-height: 1000px
-}
-.bi {
- display: inline-block;
- font-size: 12pt;
-}
-.btn .bi {
- display: inline-block;
- font-size: inherit;
-}
-.btn-group-xs > .btn, .btn-xs {
- padding: .25rem .4rem;
- font-size: .875rem;
- line-height: 1rem;
- border-radius: .2rem;
-}
-.icon-spin {
- animation-name: spin;
- animation-duration: 2000ms;
- animation-iteration-count: infinite;
- animation-timing-function: linear;
- -webkit-animation: spin 2000ms infinite linear;
-}
-.dropdown-menu {
- font-size: 0.9rem;
-}
-@-webkit-keyframes spin {
- 0% {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
- }
- 100% {
- -webkit-transform: rotate(359deg);
- transform: rotate(359deg);
- }
-}
-@keyframes spin {
- 0% {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
- }
- 100% {
- -webkit-transform: rotate(359deg);
- transform: rotate(359deg);
- }
-}
-pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;}
-/* Fix modal moving content left */
-body.modal-open {
- overflow: inherit;
- padding-right: inherit !important;
-}
-body {
- font-family: "Noto Sans","Helvetica Neue",Helvetica,Arial,sans-serif;
- font-size: 10.5pt;
- line-height: 1.5;
-}
-html {
- font-family: "Noto Sans","Helvetica Neue",Helvetica,Arial,sans-serif;
- font-size: 10.5pt;
- line-height: 1.5;
-}
-#mailcow-alert {
- position: fixed;
- bottom: 8px;
- right: 25px;
- min-width: 350px;
- max-width: 550px;
- z-index: 2000;
-}
-.input-group-sm .btn { margin-top: 0 !important }
-legend {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- -o-user-select: none;
- user-select: none;
- font-size: 1.2rem;
-}
-.navbar .navbar-brand {
- padding-top: 5px;
-}
-.navbar .navbar-brand img {
- height: 40px;
-}
-.mailcow-logo img {
- max-width: 250px;
-}
-.lang-link-disabled a {
- pointer-events: none;
-}
-.lang-link-disabled {
- cursor: not-allowed;
-}
-.overlay {
- background: #fff;
- position: absolute;
- z-index: 10000;
- top: 0; right: 0; bottom: 0; left: 0;
- opacity: 0.7;
-}
-.bootstrap-select.btn-group .no-results {
- display: none;
-}
-.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary {
- color: rgb(197, 197, 197) !important;
-}
-.haveibeenpwned {
- cursor: pointer;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-.full-width-select {
- width: 100%!important;
-}
-.tooltip {
- font-family: inherit;
- font-size: 0.8rem;
-}
-.progress-bar {
- font-size: 0.8rem;
- line-height: 14px;
-}
-.footer {
- margin-top: 27px;
- margin-bottom: 20px;
- color: #959595;
- display: flex;
- flex-direction: column;
-}
-.footer .version {
- margin-left: auto;
- margin-top: 20px;
-}
-.slave-info {
- padding: 15px 0px 15px 15px;
- font-weight: bold;
-}
-.alert-hr {
- margin:3px 0px;
- border-bottom:1px solid #f5f5f5!important;
- opacity: 0.3;
-}
-.btn-input-missing,
-.btn-input-missing:hover,
-.btn-input-missing:active,
-.btn-input-missing:focus,
-.btn-input-missing:active:hover,
-.btn-input-missing:active:focus {
- color: #000 !important;
- background-color: rgba(255, 65, 54, 0.2);
- border-color: #ff291c;
-}
-.navbar-nav > li {
- font-size: 1rem !important;
-}
-.dropdown-menu > li > a {
- font-size: 1rem !important;
-}
-.label {
- font-size:inherit;
-}
-[class^="bi-"]::before, [class*=" bi-"]::before {
- vertical-align: -0.2em !important;
-}
-legend > [class^="bi-"]::before, legend > [class*=" bi-"]::before {
- vertical-align: 0em !important;
-}
-code {
- font-size: inherit;
-}
-.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark {
- margin-top: 0px;
-}
-.flag-icon {
- margin-right: 5px;
-}
-.dropdown-header {
- font-weight: 600;
-}
-
-.dataTables_info {
- margin: 15px 0 !important;
- padding: 0px !important;
-}
-.dataTables_paginate, .dataTables_length, .dataTables_filter {
- margin: 15px 0 !important;
-}
-.dtr-details {
- width: 100%;
-}
-.dtr-title {
- width: 20%;
-}
+@font-face {
+ font-family: 'Noto Sans';
+ font-style: normal;
+ font-weight: 400;
+ src: local(''),
+ url('/fonts/noto-sans-v12-latin_greek_cyrillic-regular.woff2') format('woff2'),
+ url('/fonts/noto-sans-v12-latin_greek_cyrillic-regular.woff') format('woff');
+}
+
+@font-face {
+ font-family: 'Noto Sans';
+ font-style: normal;
+ font-weight: 700;
+ src: local(''),
+ url('/fonts/noto-sans-v12-latin_greek_cyrillic-700.woff2') format('woff2'),
+ url('/fonts/noto-sans-v12-latin_greek_cyrillic-700.woff') format('woff');
+}
+
+@font-face {
+ font-family: 'Noto Sans';
+ font-style: italic;
+ font-weight: 400;
+ src: local(''),
+ url('/fonts/noto-sans-v12-latin_greek_cyrillic-italic.woff2') format('woff2'),
+ url('/fonts/noto-sans-v12-latin_greek_cyrillic-italic.woff') format('woff');
+}
+
+@font-face {
+ font-family: 'Noto Sans';
+ font-style: italic;
+ font-weight: 700;
+ src: local(''),
+ url('/fonts/noto-sans-v12-latin_greek_cyrillic-700italic.woff2') format('woff2'),
+ url('/fonts/noto-sans-v12-latin_greek_cyrillic-700italic.woff') format('woff');
+}
+#maxmsgsize { min-width: 80px; }
+#slider1 .slider-selection {
+ background: #FFD700;
+}
+#slider1 .slider-track-high {
+ background: #FF4500;
+}
+#slider1 .slider-track-low {
+ background: #66CD00;
+}
+.striped:nth-child(odd) {
+ background-color: #fff;
+}
+.striped:nth-child(even) {
+ background-color: #fafafa;
+ border:1px solid white;
+}
+.btn {
+ text-transform: none;
+}
+.btn * {
+ pointer-events: none;
+}
+.textarea-code {
+ font-family:Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace;
+ background:transparent !important;
+}
+.navbar-nav {
+ margin: 0;
+}
++.navbar-nav .nav-link {
++ height: 44px;
++ display: flex;
++ align-items: center;
++ margin: 0 10px;
++}
+.navbar-fixed-bottom .navbar-collapse,
+.navbar-fixed-top .navbar-collapse {
+ max-height: 1000px
+}
+.bi {
+ display: inline-block;
+ font-size: 12pt;
+}
+.btn .bi {
+ display: inline-block;
+ font-size: inherit;
+}
++.btn-group-xs > .btn, .btn-xs {
++ padding: .25rem .4rem;
++ font-size: .875rem;
++ line-height: 1rem;
++ border-radius: .2rem;
++}
+.icon-spin {
+ animation-name: spin;
+ animation-duration: 2000ms;
+ animation-iteration-count: infinite;
+ animation-timing-function: linear;
+ -webkit-animation: spin 2000ms infinite linear;
+}
+.dropdown-menu {
+ font-size: 0.9rem;
+}
+@-webkit-keyframes spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@keyframes spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;}
- .footable-sortable {
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- }
+/* Fix modal moving content left */
+body.modal-open {
+ overflow: inherit;
+ padding-right: inherit !important;
+}
+body {
+ font-family: "Noto Sans","Helvetica Neue",Helvetica,Arial,sans-serif;
+ font-size: 10.5pt;
+ line-height: 1.5;
+}
+html {
+ font-family: "Noto Sans","Helvetica Neue",Helvetica,Arial,sans-serif;
+ font-size: 10.5pt;
+ line-height: 1.5;
+}
+#mailcow-alert {
+ position: fixed;
+ bottom: 8px;
+ right: 25px;
+ min-width: 350px;
+ max-width: 550px;
+ z-index: 2000;
+}
+.input-group-sm .btn { margin-top: 0 !important }
+legend {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ -o-user-select: none;
+ user-select: none;
+ font-size: 1.2rem;
+}
+.navbar .navbar-brand {
+ padding-top: 5px;
+}
+.navbar .navbar-brand img {
+ height: 40px;
+}
+.mailcow-logo img {
+ max-width: 250px;
+}
+.lang-link-disabled a {
+ pointer-events: none;
+}
+.lang-link-disabled {
+ cursor: not-allowed;
+}
+.overlay {
+ background: #fff;
+ position: absolute;
+ z-index: 10000;
+ top: 0; right: 0; bottom: 0; left: 0;
+ opacity: 0.7;
+}
- #top {
- padding-top: 70px;
- }
+.bootstrap-select.btn-group .no-results {
+ display: none;
+}
- .dropdown-desc {
- display: block;
- padding: 3px 10px;
- clear: both;
- font-weight: bold;
- color: #5a5a5a;
- white-space: nowrap;
++.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary {
++ color: rgb(197, 197, 197) !important;
+}
+.haveibeenpwned {
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.full-width-select {
+ width: 100%!important;
+}
+.tooltip {
+ font-family: inherit;
+ font-size: 0.8rem;
+}
+.progress-bar {
+ font-size: 0.8rem;
+ line-height: 14px;
+}
+.footer {
+ margin-top: 27px;
+ margin-bottom: 20px;
+ color: #959595;
+ display: flex;
+ flex-direction: column;
+}
+.footer .version {
- margin-left: auto;
++ margin-left: auto;
+ margin-top: 20px;
+}
+.slave-info {
+ padding: 15px 0px 15px 15px;
+ font-weight: bold;
+}
+.alert-hr {
+ margin:3px 0px;
+ border-bottom:1px solid #f5f5f5!important;
+ opacity: 0.3;
+}
+.btn-input-missing,
+.btn-input-missing:hover,
+.btn-input-missing:active,
+.btn-input-missing:focus,
+.btn-input-missing:active:hover,
+.btn-input-missing:active:focus {
+ color: #000 !important;
- background-color: #ff4136;
++ background-color: rgba(255, 65, 54, 0.2);
+ border-color: #ff291c;
+}
- table.footable>tbody>tr.footable-empty>td {
- font-style:italic;
- font-size: 1rem;
- }
- table>tbody>tr>td>span.footable-toggle {
- opacity: 0.75;
- }
+.navbar-nav > li {
+ font-size: 1rem !important;
+}
+.dropdown-menu > li > a {
+ font-size: 1rem !important;
+}
+.label {
+ font-size:inherit;
+}
+[class^="bi-"]::before, [class*=" bi-"]::before {
+ vertical-align: -0.2em !important;
+}
+legend > [class^="bi-"]::before, legend > [class*=" bi-"]::before {
+ vertical-align: 0em !important;
+}
+code {
+ font-size: inherit;
+}
+.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark {
+ margin-top: 0px;
+}
+.flag-icon {
+ margin-right: 5px;
+}
++.dropdown-header {
++ font-weight: 600;
++}
++
++.dataTables_info {
++ margin: 15px 0 !important;
++ padding: 0px !important;
++}
++.dataTables_paginate, .dataTables_length, .dataTables_filter {
++ margin: 15px 0 !important;
++}
++.dtr-details {
++ width: 100%;
++}
++.dtr-title {
++ width: 20%;
++}
+
+.tag-box {
+ display: flex;
+ flex-wrap: wrap;
+ height: auto;
+}
+.tag-badge {
+ transition: 200ms linear;
+ margin-top: 5px;
+ margin-bottom: 5px;
+ margin-left: 2px;
+ margin-right: 2px;
+}
+.tag-badge.btn-badge {
+ cursor: pointer;
+}
+.tag-badge .bi {
+ font-size: 12px;
+}
+.tag-badge.btn-badge:hover {
+ filter: brightness(0.9);
+}
+.tag-input {
+ margin-left: 10px;
+ border: 0;
+ flex: 1;
+ height: 24px;
+ min-width: 150px;
+}
+.tag-input:focus {
+ outline: none;
+}
+.tag-add {
+ padding: 0 5px 0 5px;
+ align-items: center;
+ display: inline-flex;
+}
-
diff --cc data/web/js/build/012-api.js
index 68a61b2f,8c673f65..763bd97e
--- a/data/web/js/build/012-api.js
+++ b/data/web/js/build/012-api.js
@@@ -353,13 -340,10 +353,10 @@@ $(document).ready(function()
$("#ItemsToDelete").empty();
for (var i in data_array) {
data_array[i] = decodeURIComponent(data_array[i]);
- $("#ItemsToDelete").append("<li>" + data_array[i] + "</li>");
+ $("#ItemsToDelete").append("<li>" + escapeHtml(data_array[i]) + "</li>");
}
- });
- $('#ConfirmDeleteModal').modal({
- backdrop: 'static',
- keyboard: false
- })
+ })
+ $('#ConfirmDeleteModal').modal('show')
.one('click', '#IsConfirmed', function(e) {
if (is_active($('#IsConfirmed'))) { return false; }
$.ajax({
diff --cc data/web/js/build/014-mailcow.js
index dc550bb9,8a7898a7..fa66d023
--- a/data/web/js/build/014-mailcow.js
+++ b/data/web/js/build/014-mailcow.js
@@@ -253,71 -274,8 +274,55 @@@ $(document).ready(function()
});
})
- // responsive tabs
- $('.responsive-tabs').tabCollapse({
- tabsClass: 'hidden-xs',
- accordionClass: 'js-tabcollapse-panel-group visible-xs'
- });
- $(document).on("shown.bs.collapse shown.bs.tab", function (e) {
- var target = $(e.target);
- if($(window).width() <= 767) {
- var offset = target.offset().top - 112;
- $("html, body").stop().animate({
- scrollTop: offset
- }, 100);
- }
- if(target.hasClass('panel-collapse')){
- var id = e.target.id.replace(/-collapse$/g, '');
- if(id){
- localStorage.setItem('lastTag', '#'+id);
- }
- }
+ // Jquery Datatables, enable responsive plugin
+ $.extend($.fn.dataTable.defaults, {
+ responsive: true
});
+
+ // tag boxes
+ $('.tag-box .tag-add').click(function(){
+ addTag(this);
+ });
+ $(".tag-box .tag-input").keydown(function (e) {
+ if (e.which == 13){
+ e.preventDefault();
+ addTag(this);
+ }
+ });
+ function addTag(tagAddElem){
+ var tagboxElem = $(tagAddElem).parent();
+ var tagInputElem = $(tagboxElem).find(".tag-input")[0];
+ var tagValuesElem = $(tagboxElem).find(".tag-values")[0];
+
+ var tag = escapeHtml($(tagInputElem).val());
+ if (!tag) return;
+ var value_tags = [];
+ try {
+ value_tags = JSON.parse($(tagValuesElem).val());
+ } catch {}
+ if (!Array.isArray(value_tags)) value_tags = [];
+ if (value_tags.includes(tag)) return;
+
+ $('<span class="badge badge-primary tag-badge btn-badge"><i class="bi bi-tag-fill"></i> ' + tag + '</span>').insertBefore('.tag-input').click(function(){
+ var del_tag = unescapeHtml($(this).text());
+ var del_tags = [];
+ try {
+ del_tags = JSON.parse($(tagValuesElem).val());
+ } catch {}
+ if (Array.isArray(del_tags)){
+ del_tags.splice(del_tags.indexOf(del_tag), 1);
+ $(tagValuesElem).val(JSON.stringify(del_tags));
+ }
+ $(this).remove();
+ });
+
+ value_tags.push($(tagInputElem).val());
+ $(tagValuesElem).val(JSON.stringify(value_tags));
+ $(tagInputElem).val('');
+ }
});
+
+
+// http://stackoverflow.com/questions/24816/escaping-html-strings-with-jquery
+function escapeHtml(n){var entityMap={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="}; return String(n).replace(/[&<>"'`=\/]/g,function(n){return entityMap[n]})}
+function unescapeHtml(t){var n={"&":"&","<":"<",">":">",""":'"',"'":"'","/":"/","`":"`","=":"="};return String(t).replace(/&|<|>|"|'|/|`|=/g,function(t){return n[t]})}
diff --cc data/web/js/site/mailbox.js
index dedbe454,de86e6f9..5cf447fd
--- a/data/web/js/site/mailbox.js
+++ b/data/web/js/site/mailbox.js
@@@ -286,31 -256,24 +222,31 @@@ jQuery(function($)
item.def_quota_for_mbox = humanFileSize(item.def_quota_for_mbox);
item.max_quota_for_mbox = humanFileSize(item.max_quota_for_mbox);
item.chkbox = '<input type="checkbox" data-id="domain" name="multi_select" value="' + encodeURIComponent(item.domain_name) + '" />';
- item.action = '<div class="btn-group footable-actions">';
+ item.action = '<div class="btn-group">';
if (role == "admin") {
- item.action += '<a href="/edit/domain/' + encodeURIComponent(item.domain_name) + '" class="btn btn-xs btn-xs-third btn-default"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' +
+ item.action += '<a href="/edit/domain/' + encodeURIComponent(item.domain_name) + '" class="btn btn-xs btn-xs-third btn-secondary"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' +
'<a href="#" data-action="delete_selected" data-id="single-domain" data-api-url="delete/domain" data-item="' + encodeURIComponent(item.domain_name) + '" class="btn btn-xs btn-xs-third btn-danger"><i class="bi bi-trash"></i> ' + lang.remove + '</a>' +
- '<a href="#dnsInfoModal" class="btn btn-xs btn-xs-third btn-info" data-toggle="modal" data-domain="' + encodeURIComponent(item.domain_name) + '"><i class="bi bi-globe2"></i> DNS</a></div>';
+ '<a href="#dnsInfoModal" class="btn btn-xs btn-xs-third btn-info" data-bs-toggle="modal" data-domain="' + encodeURIComponent(item.domain_name) + '"><i class="bi bi-globe2"></i> DNS</a></div>';
}
else {
- item.action += '<a href="/edit/domain/' + encodeURIComponent(item.domain_name) + '" class="btn btn-xs btn-xs-half btn-default"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' +
- '<a href="#dnsInfoModal" class="btn btn-xs btn-xs-half btn-info" data-toggle="modal" data-domain="' + encodeURIComponent(item.domain_name) + '"><i class="bi bi-globe2"></i> DNS</a></div>';
+ item.action += '<a href="/edit/domain/' + encodeURIComponent(item.domain_name) + '" class="btn btn-xs btn-xs-half btn-secondary"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' +
+ '<a href="#dnsInfoModal" class="btn btn-xs btn-xs-half btn-info" data-bs-toggle="modal" data-domain="' + encodeURIComponent(item.domain_name) + '"><i class="bi bi-globe2"></i> DNS</a></div>';
}
+ if (Array.isArray(item.tags)){
+ var tags = '';
+ for (var i = 0; i < item.tags.length; i++)
+ tags += '<span class="badge badge-primary tag-badge"><i class="bi bi-tag-fill"></i> ' + escapeHtml(item.tags[i]) + '</span>';
+ item.tags = tags;
+ }
+
if (item.backupmx == 1) {
if (item.relay_unknown_only == 1) {
- item.domain_name = '<div class="label label-info">Relay Non-Local</div> ' + item.domain_name;
+ item.domain_name = '<div class="badge fs-5 bg-info">Relay Non-Local</div> ' + item.domain_name;
} else if (item.relay_all_recipients == 1) {
- item.domain_name = '<div class="label label-info">Relay All</div> ' + item.domain_name;
+ item.domain_name = '<div class="badge fs-5 bg-info">Relay All</div> ' + item.domain_name;
} else {
- item.domain_name = '<div class="label label-info">Relay</div> ' + item.domain_name;
+ item.domain_name = '<div class="badge fs-5 bg-info">Relay</div> ' + item.domain_name;
}
}
});
@@@ -472,50 -438,110 +411,117 @@@
'<div class="progress-bar-mailbox progress-bar progress-bar-' + item.percent_class + '" role="progressbar" aria-valuenow="' + item.percent_in_use + '" aria-valuemin="0" aria-valuemax="100" ' +
'style="min-width:2em;width:' + item.percent_in_use + '%">' + item.percent_in_use + '%' + '</div></div>';
item.username = escapeHtml(item.username);
+
+ if (Array.isArray(item.tags)){
+ var tags = '';
+ for (var i = 0; i < item.tags.length; i++)
+ tags += '<span class="badge badge-primary tag-badge"><i class="bi bi-tag-fill"></i> ' + escapeHtml(item.tags[i]) + '</span>';
+ item.tags = tags;
+ }
});
- }
- }),
- "paging": {
- "enabled": true,
- "limit": 5,
- "size": pagination_size
- },
- "state": {
- "enabled": true
- },
- "filtering": {
- "enabled": true,
- "delay": 1200,
- "position": "left",
- "connectors": false,
- //"container": "#tab-mailboxes.panel",
- "placeholder": lang.filter_table
- },
- "components": {
- "filtering": FooTable.domainFilter
- },
- "sorting": {
- "enabled": true
- },
- "on": {
- "destroy.ft.table": function(e, ft){
- $('.refresh_table').attr('disabled', 'true');
- },
- "ready.ft.table": function(e, ft){
- table_mailbox_ready(ft, 'mailbox_table');
- },
- "after.ft.filtering": function(e, ft){
- table_mailbox_ready(ft, 'mailbox_table');
+
+ return json;
}
},
- "toggleSelector": "table tbody span.footable-toggle"
+ columns: [
+ {
+ // placeholder, so checkbox will not block child row toggle
+ title: '',
+ data: null,
+ searchable: false,
+ orderable: false,
+ defaultContent: '',
+ responsivePriority: 1
+ },
+ {
+ title: '',
+ data: 'chkbox',
+ searchable: false,
+ orderable: false,
+ defaultContent: '',
+ responsivePriority: 2
+ },
+ {
+ title: lang.username,
+ data: 'username',
+ responsivePriority: 3
+ },
+ {
+ title: lang.fname,
+ data: 'name'
+ },
+ {
+ title: lang.domain,
+ data: 'domain'
+ },
+ {
+ title: lang.domain_quota,
+ data: 'quota',
+ responsivePriority: 4,
+ render: function (data, type) {
+ data = data.split("/");
+ var of_q = (data[1] == 0 ? "∞" : humanFileSize(data[1]));
+ return humanFileSize(data[0]) + " / " + of_q;
+ }
+ },
+ {
+ title: lang.tls_enforce_in,
+ data: 'tls_enforce_in'
+ },
+ {
+ title: lang.tls_enforce_out,
+ data: 'tls_enforce_out'
+ },
+ {
+ title: 'SMTP',
+ data: 'smtp_access'
+ },
+ {
+ title: 'IMAP',
+ data: 'imap_access'
+ },
+ {
+ title: 'POP3',
+ data: 'pop3_access'
+ },
+ {
+ title: lang.last_mail_login,
+ data: 'last_mail_login'
+ },
+ {
+ title: lang.last_pw_change,
+ data: 'last_pw_change'
+ },
+ {
+ title: lang.quarantine_notification,
+ data: 'quarantine_notification'
+ },
+ {
+ title: lang.quarantine_category,
+ data: 'quarantine_category'
+ },
+ {
+ title: lang.in_use,
+ data: 'in_use'
+ },
+ {
+ title: lang.msg_num,
+ data: 'messages'
+ },
+ {
+ title: lang.active,
+ data: 'active',
+ render: function (data, type) {
+ return 1==data?'<i class="bi bi-check-lg"></i>':(0==data?'<i class="bi bi-x-lg"></i>':2==data&&'—');
+ }
+ },
+ {
+ title: lang.action,
+ data: 'action',
+ className: 'text-md-end dt-sm-head-hidden dt-body-right',
+ responsivePriority: 5
+ },
+ ]
});
}
function draw_resource_table() {
@@@ -553,43 -567,65 +547,66 @@@
'</div>';
item.chkbox = '<input type="checkbox" data-id="resource" name="multi_select" value="' + encodeURIComponent(item.name) + '" />';
item.name = escapeHtml(item.name);
+ item.description = escapeHtml(item.description);
});
- }
- }),
- "paging": {
- "enabled": true,
- "limit": 5,
- "size": pagination_size
- },
- "state": {
- "enabled": true
- },
- "filtering": {
- "enabled": true,
- "delay": 1200,
- "position": "left",
- "connectors": false,
- "placeholder": lang.filter_table
- },
- "components": {
- "filtering": FooTable.domainFilter
- },
- "sorting": {
- "enabled": true
- },
- "on": {
- "destroy.ft.table": function(e, ft){
- $('.refresh_table').attr('disabled', 'true');
- },
- "ready.ft.table": function(e, ft){
- table_mailbox_ready(ft, 'resource_table');
- },
- "after.ft.filtering": function(e, ft){
- table_mailbox_ready(ft, 'resource_table');
+
+ return json;
}
},
- "toggleSelector": "table tbody span.footable-toggle"
+ columns: [
+ {
+ // placeholder, so checkbox will not block child row toggle
+ title: '',
+ data: null,
+ searchable: false,
+ orderable: false,
+ defaultContent: '',
+ responsivePriority: 1
+ },
+ {
+ title: '',
+ data: 'chkbox',
+ searchable: false,
+ orderable: false,
+ defaultContent: '',
+ responsivePriority: 2
+ },
+ {
+ title: lang.description,
+ data: 'description',
+ responsivePriority: 3
+ },
+ {
+ title: lang.alias,
+ data: 'name'
+ },
+ {
+ title: lang.kind,
+ data: 'kind'
+ },
+ {
+ title: lang.domain,
+ data: 'domain',
+ responsivePriority: 4
+ },
+ {
+ title: lang.multiple_bookings,
+ data: 'multiple_bookings'
+ },
+ {
+ title: lang.active,
+ data: 'active',
+ render: function (data, type) {
+ return 1==data?'<i class="bi bi-check-lg"></i>':(0==data?'<i class="bi bi-x-lg"></i>':2==data&&'—');
+ }
+ },
+ {
+ title: lang.action,
+ data: 'action',
+ className: 'text-md-end dt-sm-head-hidden dt-body-right',
+ responsivePriority: 5
+ },
+ ]
});
}
function draw_bcc_table() {
@@@ -1023,11 -1083,11 +1064,11 @@@
if (!item.exclude > 0) {
item.exclude = '-';
} else {
- item.exclude = '<code>' + item.exclude + '</code>';
+ item.exclude = '<code>' + escapeHtml(item.exclude) + '</code>';
}
item.server_w_port = escapeHtml(item.user1) + '@' + item.host1 + ':' + item.port1;
- item.action = '<div class="btn-group footable-actions">' +
- '<a href="/edit/syncjob/' + item.id + '" class="btn btn-xs btn-xs-half btn-default"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' +
+ item.action = '<div class="btn-group">' +
+ '<a href="/edit/syncjob/' + item.id + '" class="btn btn-xs btn-xs-half btn-secondary"><i class="bi bi-pencil-fill"></i> ' + lang.edit + '</a>' +
'<a href="#" data-action="delete_selected" data-id="single-syncjob" data-api-url="delete/syncjob" data-item="' + item.id + '" class="btn btn-xs btn-xs-half btn-danger"><i class="bi bi-trash"></i> ' + lang.remove + '</a>' +
'</div>';
item.chkbox = '<input type="checkbox" data-id="syncjob" name="multi_select" value="' + item.id + '" />';
diff --cc data/web/templates/edit/mailbox.twig
index e1c3e883,5c3d54cc..80f0449f
--- a/data/web/templates/edit/mailbox.twig
+++ b/data/web/templates/edit/mailbox.twig
@@@ -169,17 -151,13 +167,13 @@@
<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 visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default{% if get_tls_policy.tls_enforce_in == '1' %} active"{% endif %}"
- role="switch"
- aria-checked="{% if get_tls_policy.tls_enforce_in == '1' %}true{% else %}false{% endif %}"
- <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-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 visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default{% if get_tls_policy.tls_enforce_out == '1' %} active"{% endif %}"
- role="switch"
- aria-checked="{% if get_tls_policy.tls_enforce_out == '1' %}true{% else %}false{% endif %}"
- <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-secondary{% if get_tls_policy.tls_enforce_out == '1' %} active"{% endif %}">
data-action="edit_selected"
data-item="{{ mailbox }}"
data-id="tls_policy"
diff --cc data/web/templates/modals/mailbox.twig
index 4097145f,dc3ecaea..8c47f02c
--- a/data/web/templates/modals/mailbox.twig
+++ b/data/web/templates/modals/mailbox.twig
@@@ -205,14 -185,13 +205,14 @@@
</div>
</div>
<hr>
- <div class="form-group">
- <div class="col-sm-offset-2 col-sm-10 btn-group">
+ <div class="row mb-4">
+ <div class="offset-sm-2 col-sm-10 btn-group">
{% 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='{}' 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"}' href="#">{{ lang.add.add_domain_restart }}</button>
+ <button class="btn btn-xs-lg btn-xs-half visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default" 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 visible-xs-block visible-sm-inline visible-md-inline visible-lg-inline btn-default" 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='{}' href="#">{{ lang.add.add }}</button>
+ <button class="btn btn-xs-lg visible-xs-block visible-sm-inline visible-md-inline visible-lg-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 %}
</div>
</div>
diff --cc data/web/templates/user/tab-user-auth.twig
index 301f8443,51745f1b..c9b5be4b
--- a/data/web/templates/user/tab-user-auth.twig
+++ b/data/web/templates/user/tab-user-auth.twig
@@@ -117,9 -117,12 +115,9 @@@
</div>
<hr>
<div class="row">
- <div class="offset-sm-3 col-sm-9">
- {% if mailboxdata.attributes.force_pw_update == '1' %}
- <div class="alert alert-danger">{{ lang.user.force_pw_update|raw }}</div>
- {% endif %}
+ <div class="col-sm-offset-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-toggle="modal">[{{ lang.user.show_sieve_filters }}]</a></p>
+ <p><a href="#userFilterModal" data-bs-toggle="modal">[{{ lang.user.show_sieve_filters }}]</a></p>
<hr>
<h4 class="recent-login-success pull-left">{{ lang.user.recent_successful_connections }}</h4>
<div class="dropdown pull-left pull-xs-right">