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
[BS5] Replace FooTable with jquery Datatables
0ece065c
.../{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
.../{012-datatables.css => 011-datatables.css} | 0
...bootstrap-icons.css => 012-bootstrap-icons.css} | 0
.../css/build/{008-mailcow.css => 013-mailcow.css} | 507 +++++++------
data/web/debug.php | 1 +
data/web/js/site/debug.js | 797 +++++++++++----------
data/web/js/site/mailbox.js | 744 +++++++++----------
data/web/templates/admin.twig | 2 +-
data/web/templates/admin/tab-config-admins.twig | 6 +-
data/web/templates/debug.twig | 1 +
data/web/templates/mailbox.twig | 2 +-
data/web/templates/mailbox/page-size.twig | 6 -
data/web/templates/mailbox/tab-bcc.twig | 12 -
data/web/templates/mailbox/tab-domain-aliases.twig | 9 +-
data/web/templates/mailbox/tab-domains.twig | 6 +-
data/web/templates/mailbox/tab-filters.twig | 8 +-
data/web/templates/mailbox/tab-mailboxes.twig | 4 -
data/web/templates/mailbox/tab-mbox-aliases.twig | 8 +-
data/web/templates/mailbox/tab-resources.twig | 4 -
data/web/templates/mailbox/tab-syncjobs.twig | 8 +-
data/web/templates/mailbox/tab-tls-policy.twig | 8 +-
23 files changed, 1077 insertions(+), 1076 deletions(-)
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%)
rename data/web/css/build/{012-datatables.css => 011-datatables.css} (100%)
rename data/web/css/build/{013-bootstrap-icons.css => 012-bootstrap-icons.css} (100%)
rename data/web/css/build/{008-mailcow.css => 013-mailcow.css} (91%)
delete mode 100644 data/web/templates/mailbox/page-size.twig
Diff
diff --git a/data/web/css/build/009-animate.min.css b/data/web/css/build/008-animate.min.css
similarity index 99%
rename from data/web/css/build/009-animate.min.css
rename to data/web/css/build/008-animate.min.css
index 104f7c40..e7dd6550 100644
--- a/data/web/css/build/009-animate.min.css
+++ b/data/web/css/build/008-animate.min.css
@@ -1,11 +1,11 @@
-@charset "UTF-8";
-
-/*!
- * animate.css -http://daneden.me/animate
- * Version - 3.5.2
- * Licensed under the MIT license - http://opensource.org/licenses/MIT
- *
- * Copyright (c) 2017 Daniel Eden
- */
-
+@charset "UTF-8";
+
+/*!
+ * animate.css -http://daneden.me/animate
+ * Version - 3.5.2
+ * Licensed under the MIT license - http://opensource.org/licenses/MIT
+ *
+ * Copyright (c) 2017 Daniel Eden
+ */
+
.animated{animation-duration:1s;animation-fill-mode:both}.animated.infinite{animation-iteration-count:infinite}.animated.hinge{animation-duration:2s}.animated.bounceIn,.animated.bounceOut,.animated.flipOutX,.animated.flipOutY{animation-duration:.75s}@keyframes bounce{0%,20%,53%,80%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1);transform:translateZ(0)}40%,43%{animation-timing-function:cubic-bezier(.755,.05,.855,.06);transform:translate3d(0,-30px,0)}70%{animation-timing-function:cubic-bezier(.755,.05,.855,.06);transform:translate3d(0,-15px,0)}90%{transform:translate3d(0,-4px,0)}}.bounce{animation-name:bounce;transform-origin:center bottom}@keyframes flash{0%,50%,to{opacity:1}25%,75%{opacity:0}}.flash{animation-name:flash}@keyframes pulse{0%{transform:scaleX(1)}50%{transform:scale3d(1.05,1.05,1.05)}to{transform:scaleX(1)}}.pulse{animation-name:pulse}@keyframes rubberBand{0%{transform:scaleX(1)}30%{transform:scale3d(1.25,.75,1)}40%{transform:scale3d(.75,1.25,1)}50%{transform:scale3d(1.15,.85,1)}65%{transform:scale3d(.95,1.05,1)}75%{transform:scale3d(1.05,.95,1)}to{transform:scaleX(1)}}.rubberBand{animation-name:rubberBand}@keyframes shake{0%,to{transform:translateZ(0)}10%,30%,50%,70%,90%{transform:translate3d(-10px,0,0)}20%,40%,60%,80%{transform:translate3d(10px,0,0)}}.shake{animation-name:shake}@keyframes headShake{0%{transform:translateX(0)}6.5%{transform:translateX(-6px) rotateY(-9deg)}18.5%{transform:translateX(5px) rotateY(7deg)}31.5%{transform:translateX(-3px) rotateY(-5deg)}43.5%{transform:translateX(2px) rotateY(3deg)}50%{transform:translateX(0)}}.headShake{animation-timing-function:ease-in-out;animation-name:headShake}@keyframes swing{20%{transform:rotate(15deg)}40%{transform:rotate(-10deg)}60%{transform:rotate(5deg)}80%{transform:rotate(-5deg)}to{transform:rotate(0deg)}}.swing{transform-origin:top center;animation-name:swing}@keyframes tada{0%{transform:scaleX(1)}10%,20%{transform:scale3d(.9,.9,.9) rotate(-3deg)}30%,50%,70%,90%{transform:scale3d(1.1,1.1,1.1) rotate(3deg)}40%,60%,80%{transform:scale3d(1.1,1.1,1.1) rotate(-3deg)}to{transform:scaleX(1)}}.tada{animation-name:tada}@keyframes wobble{0%{transform:none}15%{transform:translate3d(-25%,0,0) rotate(-5deg)}30%{transform:translate3d(20%,0,0) rotate(3deg)}45%{transform:translate3d(-15%,0,0) rotate(-3deg)}60%{transform:translate3d(10%,0,0) rotate(2deg)}75%{transform:translate3d(-5%,0,0) rotate(-1deg)}to{transform:none}}.wobble{animation-name:wobble}@keyframes jello{0%,11.1%,to{transform:none}22.2%{transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{transform:skewX(6.25deg) skewY(6.25deg)}44.4%{transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{transform:skewX(.390625deg) skewY(.390625deg)}88.8%{transform:skewX(-.1953125deg) skewY(-.1953125deg)}}.jello{animation-name:jello;transform-origin:center}@keyframes bounceIn{0%,20%,40%,60%,80%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:scale3d(.3,.3,.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(.9,.9,.9)}60%{opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{transform:scale3d(.97,.97,.97)}to{opacity:1;transform:scaleX(1)}}.bounceIn{animation-name:bounceIn}@keyframes bounceInDown{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}to{transform:none}}.bounceInDown{animation-name:bounceInDown}@keyframes bounceInLeft{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}to{transform:none}}.bounceInLeft{animation-name:bounceInLeft}@keyframes bounceInRight{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}.bounceInRight{animation-name:bounceInRight}@keyframes bounceInUp{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}to{transform:translateZ(0)}}.bounceInUp{animation-name:bounceInUp}@keyframes bounceOut{20%{transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;transform:scale3d(1.1,1.1,1.1)}to{opacity:0;transform:scale3d(.3,.3,.3)}}.bounceOut{animation-name:bounceOut}@keyframes bounceOutDown{20%{transform:translate3d(0,10px,0)}40%,45%{opacity:1;transform:translate3d(0,-20px,0)}to{opacity:0;transform:translate3d(0,2000px,0)}}.bounceOutDown{animation-name:bounceOutDown}@keyframes bounceOutLeft{20%{opacity:1;transform:translate3d(20px,0,0)}to{opacity:0;transform:translate3d(-2000px,0,0)}}.bounceOutLeft{animation-name:bounceOutLeft}@keyframes bounceOutRight{20%{opacity:1;transform:translate3d(-20px,0,0)}to{opacity:0;transform:translate3d(2000px,0,0)}}.bounceOutRight{animation-name:bounceOutRight}@keyframes bounceOutUp{20%{transform:translate3d(0,-10px,0)}40%,45%{opacity:1;transform:translate3d(0,20px,0)}to{opacity:0;transform:translate3d(0,-2000px,0)}}.bounceOutUp{animation-name:bounceOutUp}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.fadeIn{animation-name:fadeIn}@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-100%,0)}to{opacity:1;transform:none}}.fadeInDown{animation-name:fadeInDown}@keyframes fadeInDownBig{0%{opacity:0;transform:translate3d(0,-2000px,0)}to{opacity:1;transform:none}}.fadeInDownBig{animation-name:fadeInDownBig}@keyframes fadeInLeft{0%{opacity:0;transform:translate3d(-100%,0,0)}to{opacity:1;transform:none}}.fadeInLeft{animation-name:fadeInLeft}@keyframes fadeInLeftBig{0%{opacity:0;transform:translate3d(-2000px,0,0)}to{opacity:1;transform:none}}.fadeInLeftBig{animation-name:fadeInLeftBig}@keyframes fadeInRight{0%{opacity:0;transform:translate3d(100%,0,0)}to{opacity:1;transform:none}}.fadeInRight{animation-name:fadeInRight}@keyframes fadeInRightBig{0%{opacity:0;transform:translate3d(2000px,0,0)}to{opacity:1;transform:none}}.fadeInRightBig{animation-name:fadeInRightBig}@keyframes fadeInUp{0%{opacity:0;transform:translate3d(0,100%,0)}to{opacity:1;transform:none}}.fadeInUp{animation-name:fadeInUp}@keyframes fadeInUpBig{0%{opacity:0;transform:translate3d(0,2000px,0)}to{opacity:1;transform:none}}.fadeInUpBig{animation-name:fadeInUpBig}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.fadeOut{animation-name:fadeOut}@keyframes fadeOutDown{0%{opacity:1}to{opacity:0;transform:translate3d(0,100%,0)}}.fadeOutDown{animation-name:fadeOutDown}@keyframes fadeOutDownBig{0%{opacity:1}to{opacity:0;transform:translate3d(0,2000px,0)}}.fadeOutDownBig{animation-name:fadeOutDownBig}@keyframes fadeOutLeft{0%{opacity:1}to{opacity:0;transform:translate3d(-100%,0,0)}}.fadeOutLeft{animation-name:fadeOutLeft}@keyframes fadeOutLeftBig{0%{opacity:1}to{opacity:0;transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{animation-name:fadeOutLeftBig}@keyframes fadeOutRight{0%{opacity:1}to{opacity:0;transform:translate3d(100%,0,0)}}.fadeOutRight{animation-name:fadeOutRight}@keyframes fadeOutRightBig{0%{opacity:1}to{opacity:0;transform:translate3d(2000px,0,0)}}.fadeOutRightBig{animation-name:fadeOutRightBig}@keyframes fadeOutUp{0%{opacity:1}to{opacity:0;transform:translate3d(0,-100%,0)}}.fadeOutUp{animation-name:fadeOutUp}@keyframes fadeOutUpBig{0%{opacity:1}to{opacity:0;transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{animation-name:fadeOutUpBig}@keyframes flip{0%{transform:perspective(400px) rotateY(-1turn);animation-timing-function:ease-out}40%{transform:perspective(400px) translateZ(150px) rotateY(-190deg);animation-timing-function:ease-out}50%{transform:perspective(400px) translateZ(150px) rotateY(-170deg);animation-timing-function:ease-in}80%{transform:perspective(400px) scale3d(.95,.95,.95);animation-timing-function:ease-in}to{transform:perspective(400px);animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;animation-name:flip}@keyframes flipInX{0%{transform:perspective(400px) rotateX(90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateX(-20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotateX(10deg);opacity:1}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;animation-name:flipInX}@keyframes flipInY{0%{transform:perspective(400px) rotateY(90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateY(-20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotateY(10deg);opacity:1}80%{transform:perspective(400px) rotateY(-5deg)}to{transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;animation-name:flipInY}@keyframes flipOutX{0%{transform:perspective(400px)}30%{transform:perspective(400px) rotateX(-20deg);opacity:1}to{transform:perspective(400px) rotateX(90deg);opacity:0}}.flipOutX{animation-name:flipOutX;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@keyframes flipOutY{0%{transform:perspective(400px)}30%{transform:perspective(400px) rotateY(-15deg);opacity:1}to{transform:perspective(400px) rotateY(90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;animation-name:flipOutY}@keyframes lightSpeedIn{0%{transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{transform:skewX(20deg);opacity:1}80%{transform:skewX(-5deg);opacity:1}to{transform:none;opacity:1}}.lightSpeedIn{animation-name:lightSpeedIn;animation-timing-function:ease-out}@keyframes lightSpeedOut{0%{opacity:1}to{transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{animation-name:lightSpeedOut;animation-timing-function:ease-in}@keyframes rotateIn{0%{transform-origin:center;transform:rotate(-200deg);opacity:0}to{transform-origin:center;transform:none;opacity:1}}.rotateIn{animation-name:rotateIn}@keyframes rotateInDownLeft{0%{transform-origin:left bottom;transform:rotate(-45deg);opacity:0}to{transform-origin:left bottom;transform:none;opacity:1}}.rotateInDownLeft{animation-name:rotateInDownLeft}@keyframes rotateInDownRight{0%{transform-origin:right bottom;transform:rotate(45deg);opacity:0}to{transform-origin:right bottom;transform:none;opacity:1}}.rotateInDownRight{animation-name:rotateInDownRight}@keyframes rotateInUpLeft{0%{transform-origin:left bottom;transform:rotate(45deg);opacity:0}to{transform-origin:left bottom;transform:none;opacity:1}}.rotateInUpLeft{animation-name:rotateInUpLeft}@keyframes rotateInUpRight{0%{transform-origin:right bottom;transform:rotate(-90deg);opacity:0}to{transform-origin:right bottom;transform:none;opacity:1}}.rotateInUpRight{animation-name:rotateInUpRight}@keyframes rotateOut{0%{transform-origin:center;opacity:1}to{transform-origin:center;transform:rotate(200deg);opacity:0}}.rotateOut{animation-name:rotateOut}@keyframes rotateOutDownLeft{0%{transform-origin:left bottom;opacity:1}to{transform-origin:left bottom;transform:rotate(45deg);opacity:0}}.rotateOutDownLeft{animation-name:rotateOutDownLeft}@keyframes rotateOutDownRight{0%{transform-origin:right bottom;opacity:1}to{transform-origin:right bottom;transform:rotate(-45deg);opacity:0}}.rotateOutDownRight{animation-name:rotateOutDownRight}@keyframes rotateOutUpLeft{0%{transform-origin:left bottom;opacity:1}to{transform-origin:left bottom;transform:rotate(-45deg);opacity:0}}.rotateOutUpLeft{animation-name:rotateOutUpLeft}@keyframes rotateOutUpRight{0%{transform-origin:right bottom;opacity:1}to{transform-origin:right bottom;transform:rotate(90deg);opacity:0}}.rotateOutUpRight{animation-name:rotateOutUpRight}@keyframes hinge{0%{transform-origin:top left;animation-timing-function:ease-in-out}20%,60%{transform:rotate(80deg);transform-origin:top left;animation-timing-function:ease-in-out}40%,80%{transform:rotate(60deg);transform-origin:top left;animation-timing-function:ease-in-out;opacity:1}to{transform:translate3d(0,700px,0);opacity:0}}.hinge{animation-name:hinge}@keyframes jackInTheBox{0%{opacity:0;transform:scale(.1) rotate(30deg);transform-origin:center bottom}50%{transform:rotate(-10deg)}70%{transform:rotate(3deg)}to{opacity:1;transform:scale(1)}}.jackInTheBox{animation-name:jackInTheBox}@keyframes rollIn{0%{opacity:0;transform:translate3d(-100%,0,0) rotate(-120deg)}to{opacity:1;transform:none}}.rollIn{animation-name:rollIn}@keyframes rollOut{0%{opacity:1}to{opacity:0;transform:translate3d(100%,0,0) rotate(120deg)}}.rollOut{animation-name:rollOut}@keyframes zoomIn{0%{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{animation-name:zoomIn}@keyframes zoomInDown{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInDown{animation-name:zoomInDown}@keyframes zoomInLeft{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(10px,0,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInLeft{animation-name:zoomInLeft}@keyframes zoomInRight{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInRight{animation-name:zoomInRight}@keyframes zoomInUp{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInUp{animation-name:zoomInUp}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;transform:scale3d(.3,.3,.3)}to{opacity:0}}.zoomOut{animation-name:zoomOut}@keyframes zoomOutDown{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform-origin:center bottom;animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutDown{animation-name:zoomOutDown}@keyframes zoomOutLeft{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}to{opacity:0;transform:scale(.1) translate3d(-2000px,0,0);transform-origin:left center}}.zoomOutLeft{animation-name:zoomOutLeft}@keyframes zoomOutRight{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}to{opacity:0;transform:scale(.1) translate3d(2000px,0,0);transform-origin:right center}}.zoomOutRight{animation-name:zoomOutRight}@keyframes zoomOutUp{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform-origin:center bottom;animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutUp{animation-name:zoomOutUp}@keyframes slideInDown{0%{transform:translate3d(0,-100%,0);visibility:visible}to{transform:translateZ(0)}}.slideInDown{animation-name:slideInDown}@keyframes slideInLeft{0%{transform:translate3d(-100%,0,0);visibility:visible}to{transform:translateZ(0)}}.slideInLeft{animation-name:slideInLeft}@keyframes slideInRight{0%{transform:translate3d(100%,0,0);visibility:visible}to{transform:translateZ(0)}}.slideInRight{animation-name:slideInRight}@keyframes slideInUp{0%{transform:translate3d(0,100%,0);visibility:visible}to{transform:translateZ(0)}}.slideInUp{animation-name:slideInUp}@keyframes slideOutDown{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate3d(0,100%,0)}}.slideOutDown{animation-name:slideOutDown}@keyframes slideOutLeft{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate3d(-100%,0,0)}}.slideOutLeft{animation-name:slideOutLeft}@keyframes slideOutRight{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate3d(100%,0,0)}}.slideOutRight{animation-name:slideOutRight}@keyframes slideOutUp{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate3d(0,-100%,0)}}.slideOutUp{animation-name:slideOutUp}
\ No newline at end of file
diff --git a/data/web/css/build/010-numberedtextarea.min.css b/data/web/css/build/009-numberedtextarea.min.css
similarity index 100%
rename from data/web/css/build/010-numberedtextarea.min.css
rename to data/web/css/build/009-numberedtextarea.min.css
diff --git a/data/web/css/build/011-jquery.jqplot.min.css b/data/web/css/build/010-jquery.jqplot.min.css
similarity index 100%
rename from data/web/css/build/011-jquery.jqplot.min.css
rename to data/web/css/build/010-jquery.jqplot.min.css
diff --git a/data/web/css/build/012-datatables.css b/data/web/css/build/011-datatables.css
similarity index 100%
rename from data/web/css/build/012-datatables.css
rename to data/web/css/build/011-datatables.css
diff --git a/data/web/css/build/013-bootstrap-icons.css b/data/web/css/build/012-bootstrap-icons.css
similarity index 100%
rename from data/web/css/build/013-bootstrap-icons.css
rename to data/web/css/build/012-bootstrap-icons.css
diff --git a/data/web/css/build/008-mailcow.css b/data/web/css/build/013-mailcow.css
similarity index 91%
rename from data/web/css/build/008-mailcow.css
rename to data/web/css/build/013-mailcow.css
index e2e17b68..932857da 100644
--- a/data/web/css/build/008-mailcow.css
+++ b/data/web/css/build/013-mailcow.css
@@ -1,256 +1,253 @@
-@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-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: .5;
- 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;
-}
-.bootstrap-select.btn-group .no-results {
- display: none;
-}
-.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: #ff4136;
- border-color: #ff291c;
-}
-table.footable>tbody>tr.footable-empty>td {
- font-style:italic;
- font-size: 1rem;
-}
-.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;
+@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-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: .5;
+ 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;
+}
+.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: #ff4136;
+ 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 !important;
+ padding: 0px !important;
+}
+.dataTables_paginate, .dataTables_length, .dataTables_filter {
+ margin: 15px !important;
}
\ No newline at end of file
diff --git a/data/web/debug.php b/data/web/debug.php
index 2c1baec0..9cee06b9 100644
--- a/data/web/debug.php
+++ b/data/web/debug.php
@@ -53,6 +53,7 @@ $template_data = [
'clamd_status' => $clamd_status,
'containers' => $containers,
'lang_admin' => json_encode($lang['admin']),
+ 'lang_datatables' => json_encode($lang['datatables']),
];
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/footer.inc.php';
diff --git a/data/web/js/site/debug.js b/data/web/js/site/debug.js
index 8f4c0f65..9a239159 100644
--- a/data/web/js/site/debug.js
+++ b/data/web/js/site/debug.js
@@ -52,9 +52,7 @@ jQuery(function($){
$(".refresh_table").on('click', function(e) {
e.preventDefault();
var table_name = $(this).data('table');
- $('#' + table_name).find("tr.footable-empty").remove();
- draw_table = $(this).data('draw');
- eval(draw_table + '()');
+ $('#' + table_name).DataTable().ajax.reload();
});
function table_log_ready(ft, name) {
heading = ft.$el.parents('.card').find('.card-header')
@@ -73,408 +71,435 @@ jQuery(function($){
localStorage.setItem('current_page', JSON.stringify(current_page));
}
function draw_autodiscover_logs() {
- ft_autodiscover_logs = FooTable.init('#autodiscover_log', {
- "columns": [
- {"name":"time","formatter":function unix_time_format(tm) { var date = new Date(tm ? tm * 1000 : 0); return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});},"title":lang.time,"style":{"width":"170px"}},
- {"name":"ua","title":"User-Agent","style":{"min-width":"200px"}},
- {"name":"user","title":"Username","style":{"min-width":"200px"}},
- {"name":"ip","title":"IP","style":{"min-width":"200px"}},
- {"name":"service","title":"Service"},
- ],
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/logs/autodiscover/100',
- jsonp: false,
- error: function () {
- console.log('Cannot draw autodiscover log table');
- },
- success: function (data) {
+ $('#autodiscover_log').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/logs/autodiscover/100",
+ dataSrc: function(data){
return process_table_data(data, 'autodiscover_log');
}
- }),
- "empty": lang.empty,
- "paging": {"enabled": true,"limit": 5,"size": log_pagination_size},
- "filtering": {"enabled": true,"delay": 1200,"position": "left","placeholder": lang.filter_table,"connectors": false},
- "sorting": {"enabled": true},
- "on": {
- "destroy.ft.table": function(e, ft){
- $('.refresh_table').attr('disabled', 'true');
+ },
+ columns: [
+ {
+ title: lang.time,
+ data: 'time',
+ render: function(data, type){
+ var date = new Date(data ? data * 1000 : 0);
+ return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
+ }
+ },
+ {
+ title: 'User-Agent',
+ data: 'ua'
},
- "ready.ft.table": function(e, ft){
- table_log_ready(ft, 'autodiscover_logs');
+ {
+ title: 'Username',
+ data: 'user'
},
- "after.ft.paging": function(e, ft){
- table_log_paging(ft, 'autodiscover_logs');
+ {
+ title: 'IP',
+ data: 'ip'
+ },
+ {
+ title: 'Service',
+ data: 'service'
}
- }
+ ]
});
}
function draw_postfix_logs() {
- ft_postfix_logs = FooTable.init('#postfix_log', {
- "columns": [
- {"name":"time","formatter":function unix_time_format(tm) { var date = new Date(tm ? tm * 1000 : 0); return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});},"title":lang.time,"style":{"width":"170px"}},
- {"name":"priority","title":lang.priority,"style":{"width":"80px"}},
- {"name":"message","title":lang.message},
- ],
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/logs/postfix',
- jsonp: false,
- error: function () {
- console.log('Cannot draw postfix log table');
- },
- success: function (data) {
+ $('#postfix_log').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/logs/postfix",
+ dataSrc: function(data){
return process_table_data(data, 'general_syslog');
}
- }),
- "empty": lang.empty,
- "paging": {"enabled": true,"limit": 5,"size": log_pagination_size},
- "filtering": {"enabled": true,"delay": 1200,"position": "left","placeholder": lang.filter_table,"connectors": false},
- "sorting": {"enabled": true},
- "on": {
- "destroy.ft.table": function(e, ft){
- $('.refresh_table').attr('disabled', 'true');
+ },
+ columns: [
+ {
+ title: lang.time,
+ data: 'time',
+ render: function(data, type){
+ var date = new Date(data ? data * 1000 : 0);
+ return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
+ }
},
- "ready.ft.table": function(e, ft){
- table_log_ready(ft, 'postfix_logs');
+ {
+ title: lang.priority,
+ data: 'priority'
},
- "after.ft.paging": function(e, ft){
- table_log_paging(ft, 'postfix_logs');
+ {
+ title: lang.message,
+ data: 'message'
}
- }
+ ]
});
}
function draw_watchdog_logs() {
- ft_watchdog_logs = FooTable.init('#watchdog_log', {
- "columns": [
- {"name":"time","formatter":function unix_time_format(tm) { var date = new Date(tm ? tm * 1000 : 0); return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});},"title":lang.time,"style":{"width":"170px"}},
- {"name":"service","title":"Service"},
- {"name":"trend","title":"Trend"},
- {"name":"message","title":lang.message},
- ],
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/logs/watchdog',
- jsonp: false,
- error: function () {
- console.log('Cannot draw watchdog log table');
- },
- success: function (data) {
+ $('#watchdog_log').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/logs/watchdog",
+ dataSrc: function(data){
return process_table_data(data, 'watchdog');
}
- }),
- "empty": lang.empty,
- "paging": {"enabled": true,"limit": 5,"size": log_pagination_size},
- "filtering": {"enabled": true,"delay": 1200,"position": "left","connectors": false,"placeholder": lang.filter_table,"connectors": false},
- "sorting": {"enabled": true},
- "on": {
- "destroy.ft.table": function(e, ft){
- $('.refresh_table').attr('disabled', 'true');
+ },
+ columns: [
+ {
+ title: lang.time,
+ data: 'time',
+ render: function(data, type){
+ var date = new Date(data ? data * 1000 : 0);
+ return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
+ }
+ },
+ {
+ title: 'Service',
+ data: 'service'
},
- "ready.ft.table": function(e, ft){
- table_log_ready(ft, 'postfix_logs');
+ {
+ title: 'Trend',
+ data: 'trend'
},
- "after.ft.paging": function(e, ft){
- table_log_paging(ft, 'postfix_logs');
+ {
+ title: lang.message,
+ data: 'message'
}
- }
+ ]
});
}
function draw_api_logs() {
- ft_api_logs = FooTable.init('#api_log', {
- "columns": [
- {"name":"time","formatter":function unix_time_format(tm) { var date = new Date(tm ? tm * 1000 : 0); return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});},"title":lang.time,"style":{"width":"170px"}},
- {"name":"uri","title":"URI","style":{"width":"310px"}},
- {"name":"method","title":"Method","style":{"width":"80px"}},
- {"name":"remote","title":"IP","style":{"width":"80px"}},
- {"name":"data","title":"Data","breakpoints": "all","style":{"word-break":"break-all"}},
- ],
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/logs/api',
- jsonp: false,
- error: function () {
- console.log('Cannot draw api log table');
- },
- success: function (data) {
+ $('#api_log').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/logs/api",
+ dataSrc: function(data){
return process_table_data(data, 'apilog');
}
- }),
- "empty": lang.empty,
- "paging": {"enabled": true,"limit": 5,"size": log_pagination_size},
- "filtering": {"enabled": true,"delay": 1200,"position": "left","connectors": false,"placeholder": lang.filter_table,"connectors": false},
- "sorting": {"enabled": true},
- "on": {
- "destroy.ft.table": function(e, ft){
- $('.refresh_table').attr('disabled', 'true');
+ },
+ columns: [
+ {
+ title: lang.time,
+ data: 'time',
+ render: function(data, type){
+ var date = new Date(data ? data * 1000 : 0);
+ return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
+ }
+ },
+ {
+ title: 'URI',
+ data: 'uri'
+ },
+ {
+ title: 'Method',
+ data: 'method'
},
- "ready.ft.table": function(e, ft){
- table_log_ready(ft, 'api_logs');
+ {
+ title: 'IP',
+ data: 'remote'
},
- "after.ft.paging": function(e, ft){
- table_log_paging(ft, 'api_logs');
+ {
+ title: 'Data',
+ data: 'data'
}
- }
+ ]
});
}
function draw_rl_logs() {
- ft_rl_logs = FooTable.init('#rl_log', {
- "columns": [
- {"name":"indicator","title":" ","style":{"width":"50px"}},
- {"name":"time","formatter":function unix_time_format(tm) { var date = new Date(tm ? tm * 1000 : 0); return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});},"title":lang.last_applied,"style":{"width":"170px"}},
- {"name":"rl_name","title":lang.rate_name},
- {"name":"from","title":lang.sender},
- {"name":"rcpt","title":lang.recipients},
- {"name":"user","title":lang.authed_user},
- {"name":"message_id","title":"Msg ID","breakpoints": "all","style":{"word-break":"break-all"}},
- {"name":"header_from","title":"Header From","breakpoints": "all","style":{"word-break":"break-all"}},
- {"name":"header_subject","title":"Subject","breakpoints": "all","style":{"word-break":"break-all"}},
- {"name":"rl_hash","title":"Hash","breakpoints": "all","style":{"word-break":"break-all"}},
- {"name":"qid","title":"Rspamd QID","breakpoints": "all","style":{"word-break":"break-all"}},
- {"name":"ip","title":"IP","breakpoints": "all","style":{"word-break":"break-all"}},
- {"name":"action","title":lang.action,"breakpoints": "all","style":{"word-break":"break-all"}},
- ],
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/logs/ratelimited',
- jsonp: false,
- error: function () {
- console.log('Cannot draw rl log table');
- },
- success: function (data) {
+ $('#rl_log').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/logs/ratelimited",
+ dataSrc: function(data){
return process_table_data(data, 'rllog');
}
- }),
- "empty": lang.empty,
- "paging": {"enabled": true,"limit": 5,"size": log_pagination_size},
- "filtering": {"enabled": true,"delay": 1200,"position": "left","connectors": false,"placeholder": lang.filter_table,"connectors": false},
- "sorting": {"enabled": true},
- "on": {
- "destroy.ft.table": function(e, ft){
- $('.refresh_table').attr('disabled', 'true');
+ },
+ columns: [
+ {
+ title: ' ',
+ data: 'indicator'
+ },
+ {
+ title: lang.time,
+ data: 'time',
+ render: function(data, type){
+ var date = new Date(data ? data * 1000 : 0);
+ return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
+ }
+ },
+ {
+ title: lang.rate_name,
+ data: 'rl_name'
+ },
+ {
+ title: lang.sender,
+ data: 'from'
},
- "ready.ft.table": function(e, ft){
- table_log_ready(ft, 'rl_logs');
+ {
+ title: lang.recipients,
+ data: 'rcpt'
},
- "after.ft.paging": function(e, ft){
- table_log_paging(ft, 'rl_logs');
+ {
+ title: lang.authed_user,
+ data: 'user'
+ },
+ {
+ title: 'Msg ID',
+ data: 'message_id'
+ },
+ {
+ title: 'Header From',
+ data: 'header_from'
+ },
+ {
+ title: 'Subject',
+ data: 'header_subject'
+ },
+ {
+ title: 'Hash',
+ data: 'rl_hash'
+ },
+ {
+ title: 'Rspamd QID',
+ data: 'qid'
+ },
+ {
+ title: 'IP',
+ data: 'ip'
+ },
+ {
+ title: lang.action,
+ data: 'action'
}
- }
+ ]
});
}
function draw_ui_logs() {
- ft_api_logs = FooTable.init('#ui_logs', {
- "columns": [
- {"name":"time","formatter":function unix_time_format(tm) { var date = new Date(tm ? tm * 1000 : 0); return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});},"title":lang.time,"style":{"width":"170px"}},
- {"name":"type","title":"Type"},
- {"name":"task","title":"Task"},
- {"name":"user","title":"User"},
- {"name":"role","title":"Role"},
- {"name":"remote","title":"IP"},
- {"name":"msg","title":lang.message,"style":{"word-break":"break-all"}},
- {"name":"call","title":"Call","breakpoints": "all"}
- ],
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/logs/ui',
- jsonp: false,
- error: function () {
- console.log('Cannot draw ui log table');
- },
- success: function (data) {
+ $('#ui_logs').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/logs/ui",
+ dataSrc: function(data){
return process_table_data(data, 'mailcow_ui');
}
- }),
- "empty": lang.empty,
- "paging": {"enabled": true,"limit": 5,"size": log_pagination_size},
- "filtering": {"enabled": true,"delay": 1200,"position": "left","connectors": false,"placeholder": lang.filter_table,"connectors": false},
- "sorting": {"enabled": true},
- "on": {
- "destroy.ft.table": function(e, ft){
- $('.refresh_table').attr('disabled', 'true');
+ },
+ columns: [
+ {
+ title: lang.time,
+ data: 'time',
+ render: function(data, type){
+ var date = new Date(data ? data * 1000 : 0);
+ return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
+ }
+ },
+ {
+ title: 'Type',
+ data: 'type'
+ },
+ {
+ title: 'Task',
+ data: 'task'
+ },
+ {
+ title: 'User',
+ data: 'user'
},
- "ready.ft.table": function(e, ft){
- table_log_ready(ft, 'ui_logs');
+ {
+ title: 'Role',
+ data: 'role'
},
- "after.ft.paging": function(e, ft){
- table_log_paging(ft, 'ui_logs');
+ {
+ title: 'IP',
+ data: 'remote'
+ },
+ {
+ title: lang.message,
+ data: 'msg'
+ },
+ {
+ title: 'Call',
+ data: 'call'
}
- }
+ ]
});
}
function draw_sasl_logs() {
- ft_api_logs = FooTable.init('#sasl_logs', {
- "columns": [
- {"name":"username","title":lang.username},
- {"name":"service","title":lang.service},
- {"name":"real_rip","title":"IP"},
- {"sorted": true,"sortValue": function(value){res = new Date(value);return res.getTime();},"direction":"DESC","name":"datetime","formatter":function date_format(datetime) { var date = new Date(datetime.replace(/-/g, "/")); return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});},"title":lang.login_time,"style":{"width":"170px"}},
- ],
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/logs/sasl',
- jsonp: false,
- error: function () {
- console.log('Cannot draw sasl log table');
- },
- success: function (data) {
+ $('#sasl_logs').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/logs/sasl",
+ dataSrc: function(data){
return process_table_data(data, 'sasl_log_table');
}
- }),
- "empty": lang.empty,
- "paging": {"enabled": true,"limit": 5,"size": log_pagination_size},
- "filtering": {"enabled": true,"delay": 1200,"position": "left","connectors": false,"placeholder": lang.filter_table,"connectors": false},
- "sorting": {"enabled": true},
- "on": {
- "destroy.ft.table": function(e, ft){
- $('.refresh_table').attr('disabled', 'true');
- },
- "ready.ft.table": function(e, ft){
- table_log_ready(ft, 'sasl_logs');
- },
- "after.ft.paging": function(e, ft){
- table_log_paging(ft, 'sasl_logs');
+ },
+ columns: [
+ {
+ title: lang.username,
+ data: 'username'
+ },
+ {
+ title: lang.service,
+ data: 'service'
+ },
+ {
+ title: 'IP',
+ data: 'real_rip'
+ },
+ {
+ title: lang.login_time,
+ data: 'datetime',
+ render: function(data, type){
+ var date = new Date(data.replace(/-/g, "/"));
+ return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
+ }
}
- }
+ ]
});
}
function draw_acme_logs() {
- ft_acme_logs = FooTable.init('#acme_log', {
- "columns": [
- {"name":"time","formatter":function unix_time_format(tm) { var date = new Date(tm ? tm * 1000 : 0); return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});},"title":lang.time,"style":{"width":"170px"}},
- {"name":"message","title":lang.message,"style":{"word-break":"break-all"}},
- ],
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/logs/acme',
- jsonp: false,
- error: function () {
- console.log('Cannot draw acme log table');
- },
- success: function (data) {
+ $('#acme_log').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/logs/acme",
+ dataSrc: function(data){
return process_table_data(data, 'general_syslog');
}
- }),
- "empty": lang.empty,
- "paging": {"enabled": true,"limit": 5,"size": log_pagination_size},
- "filtering": {"enabled": true,"delay": 1200,"position": "left","connectors": false,"placeholder": lang.filter_table,"connectors": false},
- "sorting": {"enabled": true},
- "on": {
- "destroy.ft.table": function(e, ft){
- $('.refresh_table').attr('disabled', 'true');
- },
- "ready.ft.table": function(e, ft){
- table_log_ready(ft, 'acme_logs');
+ },
+ columns: [
+ {
+ title: lang.time,
+ data: 'time',
+ render: function(data, type){
+ var date = new Date(data ? data * 1000 : 0);
+ return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
+ }
},
- "after.ft.paging": function(e, ft){
- table_log_paging(ft, 'acme_logs');
+ {
+ title: lang.message,
+ data: 'message'
}
- }
+ ]
});
}
function draw_netfilter_logs() {
- ft_netfilter_logs = FooTable.init('#netfilter_log', {
- "columns": [
- {"name":"time","formatter":function unix_time_format(tm) { var date = new Date(tm ? tm * 1000 : 0); return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});},"title":lang.time,"style":{"width":"170px"}},
- {"name":"priority","title":lang.priority,"style":{"width":"80px"}},
- {"name":"message","title":lang.message},
- ],
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/logs/netfilter',
- jsonp: false,
- error: function () {
- console.log('Cannot draw netfilter log table');
- },
- success: function (data) {
+ $('#netfilter_log').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/logs/netfilter",
+ dataSrc: function(data){
return process_table_data(data, 'general_syslog');
}
- }),
- "empty": lang.empty,
- "paging": {"enabled": true,"limit": 5,"size": log_pagination_size},
- "filtering": {"enabled": true,"delay": 1200,"position": "left","connectors": false,"placeholder": lang.filter_table,"connectors": false},
- "sorting": {"enabled": true},
- "on": {
- "destroy.ft.table": function(e, ft){
- $('.refresh_table').attr('disabled', 'true');
+ },
+ columns: [
+ {
+ title: lang.time,
+ data: 'time',
+ render: function(data, type){
+ var date = new Date(data ? data * 1000 : 0);
+ return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
+ }
},
- "ready.ft.table": function(e, ft){
- table_log_ready(ft, 'netfilter_logs');
+ {
+ title: lang.priority,
+ data: 'priority'
},
- "after.ft.paging": function(e, ft){
- table_log_paging(ft, 'netfilter_logs');
+ {
+ title: lang.message,
+ data: 'message'
}
- }
+ ]
});
}
function draw_sogo_logs() {
- ft_sogo_logs = FooTable.init('#sogo_log', {
- "columns": [
- {"name":"time","formatter":function unix_time_format(tm) { var date = new Date(tm ? tm * 1000 : 0); return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});},"title":lang.time,"style":{"width":"170px"}},
- {"name":"priority","title":lang.priority,"style":{"width":"80px"}},
- {"name":"message","title":lang.message},
- ],
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/logs/sogo',
- jsonp: false,
- error: function () {
- console.log('Cannot draw sogo log table');
- },
- success: function (data) {
+ $('#sogo_log').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/logs/sogo",
+ dataSrc: function(data){
return process_table_data(data, 'general_syslog');
}
- }),
- "empty": lang.empty,
- "paging": {"enabled": true,"limit": 5,"size": log_pagination_size},
- "filtering": {"enabled": true,"delay": 1200,"position": "left","connectors": false,"placeholder": lang.filter_table,"connectors": false},
- "sorting": {"enabled": true},
- "on": {
- "destroy.ft.table": function(e, ft){
- $('.refresh_table').attr('disabled', 'true');
+ },
+ columns: [
+ {
+ title: lang.time,
+ data: 'time',
+ render: function(data, type){
+ var date = new Date(data ? data * 1000 : 0);
+ return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
+ }
},
- "ready.ft.table": function(e, ft){
- table_log_ready(ft, 'sogo_logs');
+ {
+ title: lang.priority,
+ data: 'priority'
},
- "after.ft.paging": function(e, ft){
- table_log_paging(ft, 'sogo_logs');
+ {
+ title: lang.message,
+ data: 'message'
}
- }
+ ]
});
}
function draw_dovecot_logs() {
- ft_dovecot_logs = FooTable.init('#dovecot_log', {
- "columns": [
- {"name":"time","formatter":function unix_time_format(tm) { var date = new Date(tm ? tm * 1000 : 0); return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});},"title":lang.time,"style":{"width":"170px"}},
- {"name":"priority","title":lang.priority,"style":{"width":"80px"}},
- {"name":"message","title":lang.message},
- ],
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/logs/dovecot',
- jsonp: false,
- error: function () {
- console.log('Cannot draw dovecot log table');
- },
- success: function (data) {
+ $('#dovecot_log').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/logs/dovecot",
+ dataSrc: function(data){
return process_table_data(data, 'general_syslog');
}
- }),
- "empty": lang.empty,
- "paging": {"enabled": true,"limit": 5,"size": log_pagination_size},
- "filtering": {"enabled": true,"delay": 1200,"position": "left","connectors": false,"placeholder": lang.filter_table,"connectors": false},
- "sorting": {"enabled": true},
- "on": {
- "destroy.ft.table": function(e, ft){
- $('.refresh_table').attr('disabled', 'true');
+ },
+ columns: [
+ {
+ title: lang.time,
+ data: 'time',
+ render: function(data, type){
+ var date = new Date(data ? data * 1000 : 0);
+ return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
+ }
},
- "ready.ft.table": function(e, ft){
- table_log_ready(ft, 'dovecot_logs');
+ {
+ title: lang.priority,
+ data: 'priority'
},
- "after.ft.paging": function(e, ft){
- table_log_paging(ft, 'dovecot_logs');
+ {
+ title: lang.message,
+ data: 'message'
}
- }
+ ]
});
}
function rspamd_pie_graph() {
@@ -537,53 +562,75 @@ jQuery(function($){
});
}
function draw_rspamd_history() {
- ft_rspamd_history = FooTable.init('#rspamd_history', {
- "columns": [
- {"name":"unix_time","formatter":function unix_time_format(tm) { var date = new Date(tm ? tm * 1000 : 0); return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});},"title":lang.time,"style":{"width":"170px"}},
- {"name": "ip","title": "IP address","breakpoints": "all","style": {"minWidth": 88}},
- {"name": "sender_mime","title": "From","breakpoints": "xs sm md","style": {"minWidth": 100}},
- {"name": "rcpt","title": "To","breakpoints": "xs sm md","style": {"minWidth": 100}},
- {"name": "subject","title": "Subject","breakpoints": "all","style": {"word-break": "break-all","minWidth": 150}},
- {"name": "action","title": "Action","style": {"minwidth": 82}},
- {"name": "score","title": "Score","style": {"maxWidth": 110},},
- {"name": "symbols","title": "Symbols","breakpoints": "all",},
- {"name": "size","title": "Msg size","breakpoints": "all","style": {"minwidth": 50},"formatter": function(value){return humanFileSize(value);}},
- {"name": "scan_time","title": "Scan time","breakpoints": "all","style": {"maxWidth": 72},},
- {"name": "message-id","title": "ID","breakpoints": "all","style": {"minWidth": 130,"overflow": "hidden","textOverflow": "ellipsis","wordBreak": "break-all","whiteSpace": "normal"}},
- {"name": "user","title": "Authenticated user","breakpoints": "xs sm md","style": {"minWidth": 100}}
- ],
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/logs/rspamd-history',
- jsonp: false,
- error: function () {
- console.log('Cannot draw rspamd history table');
- },
- success: function (data) {
+ $('#rspamd_history').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/logs/rspamd-history",
+ dataSrc: function(data){
return process_table_data(data, 'rspamd_history');
}
- }),
- "empty": lang.empty,
- "paging": {"enabled": true,"limit": 5,"size": log_pagination_size},
- "filtering": {"enabled": true,"delay": 1200,"position": "left","connectors": false,"placeholder": lang.filter_table,"connectors": false},
- "sorting": {"enabled": true},
- "on": {
- "destroy.ft.table": function(e, ft){
- $('.refresh_table').attr('disabled', 'true');
- },
- "ready.ft.table": function(e, ft){
- table_log_ready(ft, 'rspamd_history');
- heading = ft.$el.parents('.card').find('.card-header')
- $(heading).children('.table-lines').text(function(){
- var ft_paging = ft.use(FooTable.Paging)
- return ft_paging.totalRows;
- })
- rspamd_pie_graph();
- },
- "after.ft.paging": function(e, ft){
- table_log_paging(ft, 'rspamd_history');
+ },
+ columns: [
+ {
+ title: lang.time,
+ data: 'time',
+ render: function(data, type){
+ var date = new Date(data ? data * 1000 : 0);
+ return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
+ }
+ },
+ {
+ title: 'IP address',
+ data: 'ip'
+ },
+ {
+ title: 'From',
+ data: 'sender_mime'
+ },
+ {
+ title: 'To',
+ data: 'rcpt'
+ },
+ {
+ title: 'Subject',
+ data: 'subject'
+ },
+ {
+ title: 'Action',
+ data: 'action'
+ },
+ {
+ title: 'Score',
+ data: 'score'
+ },
+ {
+ title: 'Subject',
+ data: 'header_subject'
+ },
+ {
+ title: 'Symbols',
+ data: 'symbols'
+ },
+ {
+ title: 'Msg size',
+ data: 'size'
+ },
+ {
+ title: 'Scan Time',
+ data: 'scan_time'
+ },
+ {
+ title: 'ID',
+ data: 'message-id'
+ },
+ {
+ title: 'Authenticated user',
+ data: 'user'
}
- }
+ ]
});
}
function process_table_data(data, table) {
@@ -708,7 +755,7 @@ jQuery(function($){
if (item === null) { return true; }
item.username = escapeHtml(item.username);
item.service = '<div class="badge fs-5 bg-secondary">' + item.service.toUpperCase() + '</div>';
- });
+ });
} else if (table == 'general_syslog') {
$.each(data, function (i, item) {
if (item === null) { return true; }
@@ -769,17 +816,19 @@ jQuery(function($){
console.log("no data-table or data-nrows or log_url or data-post-process attr found");
return;
}
- if (ft = FooTable.get($('#' + log_table))) {
- var heading = ft.$el.parents('.card').find('.card-header')
- var ft_paging = ft.use(FooTable.Paging)
- var load_rows = (ft_paging.totalRows + 1) + '-' + (ft_paging.totalRows + new_nrows)
+
+ // BUG TODO: loading 100 results in loading 10 - loading 1000 results in loading 100
+ if (table = $('#' + log_table).DataTable()) {
+ var heading = $('#' + log_table).closest('.card').find('.card-header');
+ var load_rows = (table.page.len() + 1) + '-' + (table.page.len() + new_nrows)
+
$.get('/api/v1/get/logs/' + log_url + '/' + load_rows).then(function(data){
if (data.length === undefined) { mailcow_alert_box(lang.no_new_rows, "info"); return; }
var rows = process_table_data(data, post_process);
- var rows_now = (ft_paging.totalRows + data.length);
+ var rows_now = (table.page.len() + data.length);
$(heading).children('.table-lines').text(rows_now)
mailcow_alert_box(data.length + lang.additional_rows, "success");
- ft.rows.load(rows, true);
+ table.rows.add(rows).draw();
});
}
})
diff --git a/data/web/js/site/mailbox.js b/data/web/js/site/mailbox.js
index 7b0841aa..5a3cf8a7 100644
--- a/data/web/js/site/mailbox.js
+++ b/data/web/js/site/mailbox.js
@@ -54,22 +54,6 @@ $(document).ready(function() {
// }
// });
// Set paging
- $('[data-page-size]').on('click', function(e){
- e.preventDefault();
- var new_size = $(this).data('page-size');
- var parent_ul = $(this).closest('ul');
- var table_id = $(parent_ul).data('table-id');
- FooTable.get('#' + table_id).pageSize(new_size);
- //$(this).parent().addClass('active').siblings().removeClass('active')
- heading = $(this).parents('.card').find('.card-header')
- var n_results = $(heading).children('.table-lines').text().split(' / ')[1];
- $(heading).children('.table-lines').text(function(){
- if (new_size > n_results) {
- new_size = n_results;
- }
- return new_size + ' / ' + n_results;
- })
- });
// Clone mailbox mass actions
$("div").find("[data-actions-header='true'").each(function() {
$(this).html($(this).nextAll('.mass-actions-mailbox:first').html());
@@ -242,9 +226,7 @@ jQuery(function($){
$(".refresh_table").on('click', function(e) {
e.preventDefault();
var table_name = $(this).data('table');
- $('#' + table_name).find("tr.footable-empty").remove();
- draw_table = $(this).data('draw');
- eval(draw_table + '()');
+ $('#' + table_name).DataTable().ajax.reload();
});
function table_mailbox_ready(ft, name) {
if(is_dual) {
@@ -662,7 +644,7 @@ jQuery(function($){
},
columns: [
{
- title: "ID",
+ title: 'ID',
data: 'id'
},
{
@@ -706,163 +688,152 @@ jQuery(function($){
});
}
function draw_recipient_map_table() {
- ft_recipient_map_table = FooTable.init('#recipient_map_table', {
- "columns": [
- {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"},
- {"sorted": true,"name":"id","title":"ID","style":{"min-width":"60px","width":"60px","text-align":"center"}},
- {"name":"recipient_map_old","title":lang.recipient_map_old},
- {"name":"recipient_map_new","title":lang.recipient_map_new},
- {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
- {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"180px","width":"180px"},"type":"html","title":(role == "admin" ? lang.action : ""),"breakpoints":"xs sm"}
- ],
- "empty": lang.empty,
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/recipient_map/all',
- jsonp: false,
- error: function () {
- console.log('Cannot draw recipient map table');
- },
- success: function (data) {
- if (role == "admin") {
- $.each(data, function (i, item) {
- item.recipient_map_old = escapeHtml(item.recipient_map_old);
- item.recipient_map_new = escapeHtml(item.recipient_map_new);
- item.action = '<div class="btn-group footable-actions">' +
- '<a href="/edit/recipient_map/' + 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-recipient_map" data-api-url="delete/recipient_map" 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="recipient_map" name="multi_select" value="' + item.id + '" />';
- });
- }
- }
- }),
- "paging": {
- "enabled": true,
- "limit": 5,
- "size": pagination_size
- },
- "state": {
- "enabled": true
- },
- "filtering": {
- "enabled": true,
- "delay": 1200,
- "position": "left",
- "connectors": false,
- "placeholder": lang.filter_table
- },
- "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, 'recipient_map_table');
- },
- "after.ft.filtering": function(e, ft){
- table_mailbox_ready(ft, 'recipient_map_table');
+ $('#recipient_map_table').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/recipient_map/all",
+ dataSrc: function(json){
+ if (role !== "admin") return null;
+
+ $.each(json, function (i, item) {
+ item.recipient_map_old = escapeHtml(item.recipient_map_old);
+ item.recipient_map_new = escapeHtml(item.recipient_map_new);
+ item.action = '<div class="btn-group footable-actions">' +
+ '<a href="/edit/recipient_map/' + 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-recipient_map" data-api-url="delete/recipient_map" 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="recipient_map" name="multi_select" value="' + item.id + '" />';
+ });
+
+ console.log(json);
+ return json;
}
},
- "toggleSelector": "table tbody span.footable-toggle"
+ columns: [
+ {
+ title: 'ID',
+ data: 'id'
+ },
+ {
+ title: lang.recipient_map_old,
+ data: 'recipient_map_old'
+ },
+ {
+ title: lang.recipient_map_new,
+ data: 'recipient_map_new'
+ },
+ {
+ 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>';
+ }
+ },
+ {
+ title: lang.action,
+ data: null,
+ render: function (data, type) {
+ return `<div class="btn-group">
+ <a href="/edit/admin/admin" class="btn btn-xs btn-xs-half btn-secondary">
+ <i class="bi bi-pencil-fill"></i> Bearbeiten
+ </a>
+ <a href="#" data-action="delete_selected" data-id="single-admin" data-api-url="delete/admin" data-item="admin" class="btn btn-xs btn-xs-half btn-danger">
+ <i class="bi bi-trash"></i> Entfernen
+ </a>
+ </div>`;
+ }
+ },
+ ]
});
}
function draw_tls_policy_table() {
- ft_tls_policy_table = FooTable.init('#tls_policy_table', {
- "columns": [
- {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"},
- {"sorted": true,"name":"id","title":"ID","style":{"min-width":"60px","width":"60px","text-align":"center"}},
- {"name":"dest","title":lang.tls_map_dest},
- {"name":"policy","title":lang.tls_map_policy},
- {"name":"parameters","title":lang.tls_map_parameters},
- {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
- {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"180px","width":"180px"},"type":"html","title":(role == "admin" ? lang.action : ""),"breakpoints":"xs sm"}
- ],
- "empty": lang.empty,
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/tls-policy-map/all',
- jsonp: false,
- error: function () {
- console.log('Cannot draw tls policy map table');
- },
- success: function (data) {
- if (role == "admin") {
- $.each(data, function (i, item) {
- item.dest = escapeHtml(item.dest);
- item.policy = '<b>' + escapeHtml(item.policy) + '</b>';
- if (item.parameters == '') {
- item.parameters = '<code>-</code>';
- } else {
- item.parameters = '<code>' + escapeHtml(item.parameters) + '</code>';
- }
- item.action = '<div class="btn-group footable-actions">' +
- '<a href="/edit/tls_policy_map/' + 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-tls-policy-map" data-api-url="delete/tls-policy-map" 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="tls-policy-map" name="multi_select" value="' + item.id + '" />';
- });
- }
- }
- }),
- "paging": {
- "enabled": true,
- "limit": 5,
- "size": pagination_size
- },
- "state": {
- "enabled": true
- },
- "filtering": {
- "enabled": true,
- "delay": 1200,
- "position": "left",
- "connectors": false,
- "placeholder": lang.filter_table
- },
- "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, 'tls_policy_table');
- },
- "after.ft.filtering": function(e, ft){
- table_mailbox_ready(ft, 'tls_policy_table');
+ $('#tls_policy_table').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/tls-policy-map/all",
+ dataSrc: function(json){
+ if (role !== "admin") return null;
+
+ $.each(json, function (i, item) {
+ item.dest = escapeHtml(item.dest);
+ item.policy = '<b>' + escapeHtml(item.policy) + '</b>';
+ if (item.parameters == '') {
+ item.parameters = '<code>-</code>';
+ } else {
+ item.parameters = '<code>' + escapeHtml(item.parameters) + '</code>';
+ }
+ item.action = '<div class="btn-group footable-actions">' +
+ '<a href="/edit/tls_policy_map/' + 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-tls-policy-map" data-api-url="delete/tls-policy-map" 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="tls-policy-map" name="multi_select" value="' + item.id + '" />';
+ });
+
+ console.log(json);
+ return json;
}
},
- "toggleSelector": "table tbody span.footable-toggle"
+ columns: [
+ {
+ title: 'ID',
+ data: 'id'
+ },
+ {
+ title: lang.tls_map_dest,
+ data: 'dest'
+ },
+ {
+ title: lang.tls_map_policy,
+ data: 'policy'
+ },
+ {
+ title: lang.tls_map_parameters,
+ data: 'parameters'
+ },
+ {
+ title: lang.domain,
+ data: 'domain'
+ },
+ {
+ title: lang.active,
+ data: 'active',
+ render: function (data, type) {
+ return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';
+ }
+ },
+ {
+ title: lang.action,
+ data: null,
+ render: function (data, type) {
+ return `<div class="btn-group">
+ <a href="/edit/admin/admin" class="btn btn-xs btn-xs-half btn-secondary">
+ <i class="bi bi-pencil-fill"></i> Bearbeiten
+ </a>
+ <a href="#" data-action="delete_selected" data-id="single-admin" data-api-url="delete/admin" data-item="admin" class="btn btn-xs btn-xs-half btn-danger">
+ <i class="bi bi-trash"></i> Entfernen
+ </a>
+ </div>`;
+ }
+ },
+ ]
});
}
function draw_alias_table() {
- ft_alias_table = FooTable.init('#alias_table', {
- "columns": [
- {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"},
- {"name":"id","title":"ID","style":{"min-width":"60px","width":"60px","text-align":"center"}},
- {"sorted": true,"name":"address","title":lang.alias,"style":{"width":"250px"}},
- {"name":"goto","title":lang.target_address},
- {"name":"domain","title":lang.domain,"breakpoints":"xs sm"},
- {"name":"public_comment","title":lang.public_comment,"breakpoints":"all"},
- {"name":"private_comment","title":lang.private_comment,"breakpoints":"all"},
- {"name":"sogo_visible","title":lang.sogo_visible,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';},"breakpoints":"all"},
- {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
- {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
- ],
- "empty": lang.empty,
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/alias/all',
- jsonp: false,
- error: function () {
- console.log('Cannot draw alias table');
- },
- success: function (data) {
- $.each(data, function (i, item) {
+ $('#alias_table').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/alias/all",
+ dataSrc: function(json){
+ $.each(json, function (i, item) {
item.action = '<div class="btn-group footable-actions">' +
'<a href="/edit/alias/' + encodeURIComponent(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-alias" data-api-url="delete/alias" data-item="' + encodeURIComponent(item.id) + '" class="btn btn-xs btn-xs-half btn-danger"><i class="bi bi-trash"></i> ' + lang.remove + '</a>' +
@@ -900,64 +871,78 @@ jQuery(function($){
item.domain = '<i data-domainname="' + item.domain + '" class="bi bi-info-circle-fill alias-domain-info text-info" data-bs-toggle="tooltip" title="' + lang.target_domain + ': ' + item.in_primary_domain + '"></i> ' + item.domain;
}
});
- }
- }),
- "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, 'alias_table');
- $('.alias-domain-info').tooltip();
- },
- "after.ft.filtering": function(e, ft){
- table_mailbox_ready(ft, 'alias_table');
+
+ console.log(json);
+ return json;
}
},
- "toggleSelector": "table tbody span.footable-toggle"
+ columns: [
+ {
+ title: 'ID',
+ data: 'id'
+ },
+ {
+ title: lang.alias,
+ data: 'address'
+ },
+ {
+ title: lang.target_address,
+ data: 'goto'
+ },
+ {
+ title: lang.bcc_destinations,
+ data: 'bcc_dest'
+ },
+ {
+ title: lang.domain,
+ data: 'domain'
+ },
+ {
+ title: lang.public_comment,
+ data: 'public_comment'
+ },
+ {
+ title: lang.private_comment,
+ data: 'private_comment'
+ },
+ {
+ title: lang.sogo_visible,
+ data: 'sogo_visible'
+ },
+ {
+ title: lang.active,
+ data: 'active',
+ render: function (data, type) {
+ return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';
+ }
+ },
+ {
+ title: lang.action,
+ data: null,
+ render: function (data, type) {
+ return `<div class="btn-group">
+ <a href="/edit/admin/admin" class="btn btn-xs btn-xs-half btn-secondary">
+ <i class="bi bi-pencil-fill"></i> Bearbeiten
+ </a>
+ <a href="#" data-action="delete_selected" data-id="single-admin" data-api-url="delete/admin" data-item="admin" class="btn btn-xs btn-xs-half btn-danger">
+ <i class="bi bi-trash"></i> Entfernen
+ </a>
+ </div>`;
+ }
+ },
+ ]
});
}
-
function draw_aliasdomain_table() {
- ft_aliasdomain_table = FooTable.init('#aliasdomain_table', {
- "columns": [
- {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"},
- {"sorted": true,"name":"alias_domain","title":lang.alias,"style":{"width":"250px"}},
- {"name":"target_domain","title":lang.target_domain,"type":"html"},
- {"name":"active","filterable": false,"style":{"min-width":"80px","width":"80px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
- {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"250px","width":"250px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
- ],
- "empty": lang.empty,
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/alias-domain/all',
- jsonp: false,
- error: function () {
- console.log('Cannot draw alias domain table');
- },
- success: function (data) {
- $.each(data, function (i, item) {
+ $('#aliasdomain_table').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/alias-domain/all",
+ dataSrc: function(json){
+ $.each(json, function (i, item) {
item.action = '<div class="btn-group footable-actions">' +
'<a href="/edit/aliasdomain/' + encodeURIComponent(item.alias_domain) + '" 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-alias-domain" data-api-url="delete/alias-domain" data-item="' + encodeURIComponent(item.alias_domain) + '" class="btn btn-xs btn-xs-third btn-danger"><i class="bi bi-trash"></i> ' + lang.remove + '</a>' +
@@ -970,67 +955,66 @@ jQuery(function($){
item.target_domain = '<span><a href="/edit/domain/' + item.target_domain + '">' + item.target_domain + '</a></span>';
}
});
- }
- }),
- "paging": {
- "enabled": true,
- "limit": 5,
- "size": pagination_size
- },
- "state": {
- "enabled": true
- },
- "filtering": {
- "enabled": true,
- "delay": 1200,
- "position": "left",
- "connectors": false,
- "placeholder": lang.filter_table
- },
- "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, 'aliasdomain_table');
- },
- "after.ft.filtering": function(e, ft){
- table_mailbox_ready(ft, 'aliasdomain_table');
+
+ console.log(json);
+ return json;
}
},
- "toggleSelector": "table tbody span.footable-toggle"
+ columns: [
+ {
+ title: lang.alias,
+ data: 'alias_domain'
+ },
+ {
+ title: lang.target_domain,
+ data: 'target_domain'
+ },
+ {
+ title: lang.bcc_local_dest,
+ data: 'local_dest'
+ },
+ {
+ title: lang.bcc_destinations,
+ data: 'bcc_dest'
+ },
+ {
+ title: lang.domain,
+ data: 'domain'
+ },
+ {
+ title: lang.active,
+ data: 'active',
+ render: function (data, type) {
+ return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';
+ }
+ },
+ {
+ title: lang.action,
+ data: null,
+ render: function (data, type) {
+ return `<div class="btn-group">
+ <a href="/edit/admin/admin" class="btn btn-xs btn-xs-half btn-secondary">
+ <i class="bi bi-pencil-fill"></i> Bearbeiten
+ </a>
+ <a href="#" data-action="delete_selected" data-id="single-admin" data-api-url="delete/admin" data-item="admin" class="btn btn-xs btn-xs-half btn-danger">
+ <i class="bi bi-trash"></i> Entfernen
+ </a>
+ </div>`;
+ }
+ },
+ ]
});
}
-
function draw_sync_job_table() {
- ft_syncjob_table = FooTable.init('#sync_job_table', {
- "columns": [
- {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px","text-align":"center"},"filterable": false,"sortable": false,"type":"html"},
- {"sorted": true,"name":"id","title":"ID","style":{"min-width":"60px","width":"60px","text-align":"center"}},
- {"name":"user2","title":lang.owner},
- {"name":"server_w_port","title":"Server","breakpoints":"xs sm md","style":{"word-break":"break-all"}},
- {"name":"exclude","title":lang.excludes,"breakpoints":"all"},
- {"name":"mins_interval","title":lang.mins_interval,"breakpoints":"all"},
- {"name":"last_run","title":lang.last_run,"breakpoints":"xs sm md"},
- {"name":"exit_status","filterable": false,"title":lang.syncjob_last_run_result},
- {"name":"log","title":"Log"},
- {"name":"active","filterable": false,"style":{"min-width":"70px","width":"70px"},"title":lang.active,"formatter": function(value){return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';}},
- {"name":"is_running","filterable": false,"style":{"min-width":"120px","width":"100px"},"title":lang.status},
- {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
- ],
- "empty": lang.empty,
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/syncjobs/all/no_log',
- jsonp: false,
- error: function () {
- console.log('Cannot draw sync job table');
- },
- success: function (data) {
- $.each(data, function (i, item) {
+ $('#sync_job_table').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/syncjobs/all/no_log",
+ dataSrc: function(json){
+ $.each(json, function (i, item) {
item.log = '<a href="#syncjobLogModal" data-bs-toggle="modal" data-syncjob-id="' + encodeURIComponent(item.id) + '">' + lang.open_logs + '</a>'
item.user2 = escapeHtml(item.user2);
if (!item.exclude > 0) {
@@ -1065,63 +1049,82 @@ jQuery(function($){
}
item.exit_status = item.success + ' ' + item.exit_status;
});
- }
- }),
- "paging": {
- "enabled": true,
- "limit": 5,
- "size": pagination_size
- },
- "state": {
- "enabled": true
- },
- "filtering": {
- "enabled": true,
- "delay": 1200,
- "position": "left",
- "connectors": false,
- "placeholder": lang.filter_table
- },
- "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, 'sync_job_table');
- },
- "after.ft.filtering": function(e, ft){
- table_mailbox_ready(ft, 'sync_job_table');
+
+ console.log(json);
+ return json;
}
},
- "toggleSelector": "table tbody span.footable-toggle"
+ columns: [
+ {
+ title: 'ID',
+ data: 'id'
+ },
+ {
+ title: lang.owner,
+ data: 'user2'
+ },
+ {
+ title: 'Server',
+ data: 'server_w_port'
+ },
+ {
+ title: lang.excludes,
+ data: 'exclude'
+ },
+ {
+ title: lang.mins_interval,
+ data: 'mins_interval'
+ },
+ {
+ title: lang.last_run,
+ data: 'last_run'
+ },
+ {
+ title: lang.syncjob_last_run_result,
+ data: 'exit_status'
+ },
+ {
+ title: lang.status,
+ data: 'is_running'
+ },
+ {
+ title: lang.active,
+ data: 'active',
+ render: function (data, type) {
+ return 1==value?'<i class="bi bi-check-lg"></i>':0==value&&'<i class="bi bi-x-lg"></i>';
+ }
+ },
+ {
+ title: 'Log',
+ data: 'log'
+ },
+ {
+ title: lang.action,
+ data: null,
+ render: function (data, type) {
+ return `<div class="btn-group">
+ <a href="/edit/admin/admin" class="btn btn-xs btn-xs-half btn-secondary">
+ <i class="bi bi-pencil-fill"></i> Bearbeiten
+ </a>
+ <a href="#" data-action="delete_selected" data-id="single-admin" data-api-url="delete/admin" data-item="admin" class="btn btn-xs btn-xs-half btn-danger">
+ <i class="bi bi-trash"></i> Entfernen
+ </a>
+ </div>`;
+ }
+ },
+ ]
});
}
-
function draw_filter_table() {
- ft_filter_table = FooTable.init('#filter_table', {
- "columns": [
- {"name":"chkbox","title":"","style":{"min-width":"60px","width":"60px","text-align":"center"},"filterable": false,"sortable": false,"type":"html"},
- {"name":"id","title":"ID","style":{"min-width":"60px","width":"60px","text-align":"center"}},
- {"name":"active","style":{"min-width":"80px","width":"80px"},"title":lang.active},
- {"name":"filter_type","style":{"min-width":"80px","width":"80px"},"title":"Type"},
- {"sorted": true,"name":"username","title":lang.owner,"style":{"min-width":"550px","width":"350px"}},
- {"name":"script_desc","title":lang.description,"breakpoints":"xs"},
- {"name":"script_data","title":"Script","breakpoints":"all"},
- {"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","min-width":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
- ],
- "empty": lang.empty,
- "rows": $.ajax({
- dataType: 'json',
- url: '/api/v1/get/filters/all',
- jsonp: false,
- error: function () {
- console.log('Cannot draw filter table');
- },
- success: function (data) {
- $.each(data, function (i, item) {
+ $('#filter_table').DataTable({
+ processing: true,
+ serverSide: false,
+ language: lang_datatables,
+ ajax: {
+ type: "GET",
+ url: "/api/v1/get/filters/all",
+ dataSrc: function(json){
+ $.each(json, function (i, item) {
if (item.active == 1) {
item.active = '<span id="active-script" class="badge fs-5 bg-success">' + lang.active + '</span>';
} else {
@@ -1135,38 +1138,51 @@ jQuery(function($){
'</div>';
item.chkbox = '<input type="checkbox" data-id="filter_item" name="multi_select" value="' + item.id + '" />'
});
- }
- }),
- "paging": {
- "enabled": true,
- "limit": 5,
- "size": pagination_size
- },
- "state": {
- "enabled": true
- },
- "filtering": {
- "enabled": true,
- "delay": 1200,
- "position": "left",
- "connectors": false,
- "placeholder": lang.filter_table
- },
- "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, 'filter_table');
- },
- "after.ft.filtering": function(e, ft){
- table_mailbox_ready(ft, 'filter_table');
+
+ console.log(json);
+ return json;
}
},
- "toggleSelector": "table tbody span.footable-toggle"
+ columns: [
+ {
+ title: 'ID',
+ data: 'id'
+ },
+ {
+ title: lang.active,
+ data: 'active'
+ },
+ {
+ title: lang.filter_type,
+ data: 'Type'
+ },
+ {
+ title: lang.owner,
+ data: 'username'
+ },
+ {
+ title: lang.description,
+ data: 'script_desc'
+ },
+ {
+ title: 'Script',
+ data: 'script_data'
+ },
+ {
+ title: lang.action,
+ data: null,
+ render: function (data, type) {
+ return `<div class="btn-group">
+ <a href="/edit/admin/admin" class="btn btn-xs btn-xs-half btn-secondary">
+ <i class="bi bi-pencil-fill"></i> Bearbeiten
+ </a>
+ <a href="#" data-action="delete_selected" data-id="single-admin" data-api-url="delete/admin" data-item="admin" class="btn btn-xs btn-xs-half btn-danger">
+ <i class="bi bi-trash"></i> Entfernen
+ </a>
+ </div>`;
+ }
+ },
+ ]
});
};
@@ -1177,12 +1193,12 @@ jQuery(function($){
draw_domain_table();
draw_mailbox_table();
draw_resource_table();
- // draw_alias_table();
- // draw_aliasdomain_table();
- // draw_sync_job_table();
- // draw_filter_table();
+ draw_alias_table();
+ draw_aliasdomain_table();
+ draw_sync_job_table();
+ draw_filter_table();
draw_bcc_table();
- // draw_recipient_map_table();
- // draw_tls_policy_table();
+ draw_recipient_map_table();
+ draw_tls_policy_table();
});
diff --git a/data/web/templates/admin.twig b/data/web/templates/admin.twig
index 2e0e07ac..65d5358d 100644
--- a/data/web/templates/admin.twig
+++ b/data/web/templates/admin.twig
@@ -63,7 +63,7 @@
<script type='text/javascript'>
var lang = {{ lang_admin|raw }};
-var lang_datatables = {{ lang_datatables|raw }}
+var lang_datatables = {{ lang_datatables|raw }};
var admin_username = '{{ mailcow_cc_username }}';
var csrf_token = '{{ csrf_token }}';
var pagination_size = '{{ pagination_size }}';
diff --git a/data/web/templates/admin/tab-config-admins.twig b/data/web/templates/admin/tab-config-admins.twig
index 8f2c62a8..bf946029 100644
--- a/data/web/templates/admin/tab-config-admins.twig
+++ b/data/web/templates/admin/tab-config-admins.twig
@@ -1,9 +1,8 @@
<div role="tabpanel" 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">{{ lang.admin.admin_details }}</div>
+ <table id="adminstable" class="table table-striped dt-responsive nowrap w-100"></table>
<div class="card-body">
- <table id="adminstable" class="table table-striped dt-responsive nowrap" style="width:100%">
- </table>
<div class="mass-actions-admin">
<div class="btn-group">
<a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" id="toggle_multi_select_all" data-id="admins" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
@@ -224,9 +223,8 @@
<div class="card mb-4">
<div class="card-header">{{ lang.admin.domain_admins }}</div>
+ <table id="domainadminstable" class="table table-striped dt-responsive nowrap w-100"></table>
<div class="card-body">
- <table id="domainadminstable" class="table table-striped dt-responsive nowrap" style="width:100%">
- </table>
<div class="mass-actions-admin">
<div class="btn-group">
<a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" id="toggle_multi_select_all" data-id="domain_admins" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
diff --git a/data/web/templates/debug.twig b/data/web/templates/debug.twig
index de110ff1..a7324de8 100644
--- a/data/web/templates/debug.twig
+++ b/data/web/templates/debug.twig
@@ -322,6 +322,7 @@
<script type='text/javascript'>
var lang = {{ lang_admin|raw }};
+ var lang_datatables = {{ lang_datatables|raw }};
var csrf_token = '{{ csrf_token }}';
var log_pagination_size = '{{ log_pagination_size }}';
</script>
diff --git a/data/web/templates/mailbox.twig b/data/web/templates/mailbox.twig
index cba189d7..182dcd78 100644
--- a/data/web/templates/mailbox.twig
+++ b/data/web/templates/mailbox.twig
@@ -47,7 +47,7 @@
<script type='text/javascript'>
var acl = '{{ acl_json|raw }}';
var lang = {{ lang_mailbox|raw }};
- var lang_datatables = {{ lang_datatables|raw }}
+ var lang_datatables = {{ lang_datatables|raw }};
var csrf_token = '{{ csrf_token }}';
var pagination_size = '{{ pagination_size }}';
var role = '{{ role }}';
diff --git a/data/web/templates/mailbox/page-size.twig b/data/web/templates/mailbox/page-size.twig
deleted file mode 100644
index 7ddb928c..00000000
--- a/data/web/templates/mailbox/page-size.twig
+++ /dev/null
@@ -1,6 +0,0 @@
-<li><a class="dropdown-item" href="#" data-page-size="3">{{ lang.mailbox.table_size_show_n|format(3) }}</a></li>
-<li><a class="dropdown-item" href="#" data-page-size="10">{{ lang.mailbox.table_size_show_n|format(10) }}</a></li>
-<li><a class="dropdown-item" href="#" data-page-size="20">{{ lang.mailbox.table_size_show_n|format(20) }}</a></li>
-<li><a class="dropdown-item" href="#" data-page-size="50">{{ lang.mailbox.table_size_show_n|format(50) }}</a></li>
-<li><a class="dropdown-item" href="#" data-page-size="100">{{ lang.mailbox.table_size_show_n|format(100) }}</a></li>
-<li><a class="dropdown-item" href="#" data-page-size="200">{{ lang.mailbox.table_size_show_n|format(200) }}</a></li>
diff --git a/data/web/templates/mailbox/tab-bcc.twig b/data/web/templates/mailbox/tab-bcc.twig
index 2e2178a1..3dc2e91d 100644
--- a/data/web/templates/mailbox/tab-bcc.twig
+++ b/data/web/templates/mailbox/tab-bcc.twig
@@ -5,12 +5,6 @@
<div class="btn-group ms-auto d-none d-sm-flex">
<button class="btn btn-xs btn-success" href="#" data-acl="{{ acl.bcc_maps }}" data-bs-toggle="modal" data-bs-target="#addBCCModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_bcc_entry }}</button>
<button class="btn btn-xs btn-secondary refresh_table" data-draw="draw_bcc_table" data-table="bcc_table">{{ lang.admin.refresh }}</button>
- <button type="button" class="btn btn-xs btn-secondary dropdown-toggle" data-bs-toggle="dropdown">{{ lang.mailbox.table_size }}
-
- </button>
- <ul class="dropdown-menu" data-table-id="bcc_table" role="menu">
- {% include 'mailbox/page-size.twig' %}
- </ul>
</div>
</div>
<p style="margin:10px" class="text-muted">{{ lang.mailbox.bcc_info|raw }}</p>
@@ -39,12 +33,6 @@
<div class="btn-group ms-auto d-none d-sm-flex">
<button class="btn btn-xs btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addRecipientMapModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_recipient_map_entry }}</button>
<button class="btn btn-xs btn-secondary refresh_table" data-draw="draw_recipient_map_table" data-table="recipient_map_table">{{ lang.admin.refresh }}</button>
- <button type="button" class="btn btn-xs btn-secondary dropdown-toggle" data-bs-toggle="dropdown">{{ lang.mailbox.table_size }}
-
- </button>
- <ul class="dropdown-menu" data-table-id="recipient_map_table" role="menu">
- {% include 'mailbox/page-size.twig' %}
- </ul>
</div>
</div>
<p style="margin:10px" class="text-muted">{{ lang.mailbox.recipient_map_info }}</p>
diff --git a/data/web/templates/mailbox/tab-domain-aliases.twig b/data/web/templates/mailbox/tab-domain-aliases.twig
index a7ec8d15..22d7b96e 100644
--- a/data/web/templates/mailbox/tab-domain-aliases.twig
+++ b/data/web/templates/mailbox/tab-domain-aliases.twig
@@ -5,17 +5,10 @@
<div class="btn-group ms-auto d-none d-sm-flex">
<button class="btn btn-xs 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 }}</button>
<button class="btn btn-xs btn-secondary refresh_table" data-draw="draw_aliasdomain_table" data-table="aliasdomain_table">{{ lang.admin.refresh }}</button>
- <button type="button" class="btn btn-xs btn-secondary dropdown-toggle" data-bs-toggle="dropdown">{{ lang.mailbox.table_size }}
- </button>
- <ul class="dropdown-menu" data-table-id="aliasdomain_table" role="menu">
- {% include 'mailbox/page-size.twig' %}
- </ul>
</div>
</div>
{# <div class="mass-actions-mailbox" data-actions-header="true"></div>#}
- <div class="table-responsive">
- <table id="aliasdomain_table" class="table table-striped"></table>
- </div>
+ <table id="aliasdomain_table" class="table table-striped dt-responsive nowrap w-100"></table>
<div class="mass-actions-mailbox">
<div class="btn-group">
<a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" id="toggle_multi_select_all" data-id="alias-domain" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
diff --git a/data/web/templates/mailbox/tab-domains.twig b/data/web/templates/mailbox/tab-domains.twig
index 495fa5f8..36473070 100644
--- a/data/web/templates/mailbox/tab-domains.twig
+++ b/data/web/templates/mailbox/tab-domains.twig
@@ -7,14 +7,10 @@
<button class="btn btn-xs btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addDomainModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_domain }}</button>
{% endif %}
<button class="btn btn-xs btn-secondary refresh_table" data-draw="draw_domain_table" data-table="domain_table">{{ lang.admin.refresh }}</button>
- <button type="button" class="btn btn-xs btn-secondary dropdown-toggle" data-bs-toggle="dropdown">{{ lang.mailbox.table_size }}</button>
- <ul class="dropdown-menu" data-table-id="domain_table" role="menu">
- {% include 'mailbox/page-size.twig' %}
- </ul>
</div>
</div>
{# <div class="mass-actions-mailbox" data-actions-header="true"></div>#}
- <table id="domain_table" class="table table-striped dt-responsive nowrap" style="width:100%"></table>
+ <table id="domain_table" class="table table-striped dt-responsive nowrap w-100"></table>
<div class="mass-actions-mailbox">
<div class="btn-group">
<a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" id="toggle_multi_select_all" data-id="domain" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
diff --git a/data/web/templates/mailbox/tab-filters.twig b/data/web/templates/mailbox/tab-filters.twig
index 71aa1645..e0c7d1e5 100644
--- a/data/web/templates/mailbox/tab-filters.twig
+++ b/data/web/templates/mailbox/tab-filters.twig
@@ -5,19 +5,13 @@
<div class="btn-group ms-auto d-none d-sm-flex">
<button class="btn btn-xs btn-success" href="#" data-acl="{{ acl.filters }}" data-bs-toggle="modal" data-bs-target="#addFilterModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_filter }}</button>
<button class="btn btn-xs btn-secondary refresh_table" data-draw="draw_filter_table" data-table="filter_table">{{ lang.admin.refresh }}</button>
- <button type="button" class="btn btn-xs btn-secondary dropdown-toggle" data-bs-toggle="dropdown">{{ lang.mailbox.table_size }}</button>
- <ul class="dropdown-menu" data-table-id="filter_table" role="menu">
- {% include 'mailbox/page-size.twig' %}
- </ul>
</div>
</div>
<div class="card-body">
<p class="text-muted">{{ lang.mailbox.sieve_info|raw }}</p><br>
</div>
{# <div class="mass-actions-mailbox" data-actions-header="true"></div>#}
- <div class="table-responsive">
- <table class="table table-striped" id="filter_table"></table>
- </div>
+ <table id="filter_table" class="table table-striped dt-responsive nowrap w-100"></table>
<div class="mass-actions-mailbox">
<div class="btn-group" data-acl="{{ acl.filters }}">
<a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" id="toggle_multi_select_all" data-id="filter_item" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
diff --git a/data/web/templates/mailbox/tab-mailboxes.twig b/data/web/templates/mailbox/tab-mailboxes.twig
index 85eabdb3..c6999a12 100644
--- a/data/web/templates/mailbox/tab-mailboxes.twig
+++ b/data/web/templates/mailbox/tab-mailboxes.twig
@@ -5,10 +5,6 @@
<div class="btn-group ms-auto d-none d-sm-flex">
<button class="btn btn-xs btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addMailboxModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_mailbox }}</button>
<button class="btn btn-xs btn-secondary refresh_table" data-draw="draw_mailbox_table" data-table="mailbox_table">{{ lang.admin.refresh }}</button>
- <button type="button" class="btn btn-xs btn-secondary dropdown-toggle" data-bs-toggle="dropdown">{{ lang.mailbox.table_size }}</button>
- <ul class="dropdown-menu" data-table-id="mailbox_table" role="menu">
- {% include 'mailbox/page-size.twig' %}
- </ul>
</div>
</div>
<div class="mass-actions-mailbox d-none d-sm-flex" data-actions-header="true"></div>
diff --git a/data/web/templates/mailbox/tab-mbox-aliases.twig b/data/web/templates/mailbox/tab-mbox-aliases.twig
index 7b5b66bf..6e3a43e7 100644
--- a/data/web/templates/mailbox/tab-mbox-aliases.twig
+++ b/data/web/templates/mailbox/tab-mbox-aliases.twig
@@ -5,19 +5,13 @@
<div class="btn-group ms-auto d-none d-sm-flex">
<button class="btn btn-xs btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addAliasModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_alias }}</button>
<button class="btn btn-xs btn-secondary refresh_table" data-draw="draw_alias_table" data-table="alias_table">{{ lang.admin.refresh }}</button>
- <button type="button" class="btn btn-xs btn-secondary dropdown-toggle" data-bs-toggle="dropdown">{{ lang.mailbox.table_size }}</button>
- <ul class="dropdown-menu" data-table-id="alias_table" role="menu">
- {% include 'mailbox/page-size.twig' %}
- </ul>
</div>
</div>
<div class="card-body text-muted">
{{ lang.mailbox.alias_domain_alias_hint|raw }}
</div>
<!-- <div class="mass-actions-mailbox" data-actions-header="true"></div> -->
- <div class="table-responsive">
- <table id="alias_table" class="table table-striped"></table>
- </div>
+ <table id="alias_table" class="table table-striped dt-responsive nowrap w-100"></table>
<div class="mass-actions-mailbox">
<div class="btn-group">
<a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" id="toggle_multi_select_all" data-id="alias" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
diff --git a/data/web/templates/mailbox/tab-resources.twig b/data/web/templates/mailbox/tab-resources.twig
index e53d815f..7e633532 100644
--- a/data/web/templates/mailbox/tab-resources.twig
+++ b/data/web/templates/mailbox/tab-resources.twig
@@ -5,10 +5,6 @@
<div class="btn-group ms-auto d-none d-sm-flex">
<button class="btn btn-xs btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addResourceModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_resource }}</button>
<button class="btn btn-xs btn-secondary refresh_table" data-draw="draw_resource_table" data-table="resource_table">{{ lang.admin.refresh }}</button>
- <button type="button" class="btn btn-xs btn-secondary dropdown-toggle" data-bs-toggle="dropdown">{{ lang.mailbox.table_size }}</button>
- <ul class="dropdown-menu" data-table-id="resource_table" role="menu">
- {% include 'mailbox/page-size.twig' %}
- </ul>
</div>
</div>
<div class="card-body text-muted">
diff --git a/data/web/templates/mailbox/tab-syncjobs.twig b/data/web/templates/mailbox/tab-syncjobs.twig
index b0f5f54f..18ccf31e 100644
--- a/data/web/templates/mailbox/tab-syncjobs.twig
+++ b/data/web/templates/mailbox/tab-syncjobs.twig
@@ -5,16 +5,10 @@
<div class="btn-group ms-auto d-none d-sm-flex">
<button data-acl="{{ acl.syncjobs }}" class="btn btn-xs btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addSyncJobModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.user.create_syncjob }}</button>
<button class="btn btn-xs btn-secondary refresh_table" data-draw="draw_sync_job_table" data-table="sync_job_table">{{ lang.admin.refresh }}</button>
- <button type="button" class="btn btn-xs btn-secondary dropdown-toggle" data-bs-toggle="dropdown">{{ lang.mailbox.table_size }}</button>
- <ul class="dropdown-menu" data-table-id="sync_job_table" role="menu">
- {% include 'mailbox/page-size.twig' %}
- </ul>
</div>
</div>
<!-- <div class="mass-actions-mailbox" data-actions-header="true"></div> -->
- <div class="table-responsive">
- <table class="table table-striped" id="sync_job_table"></table>
- </div>
+ <table id="sync_job_table" class="table table-striped dt-responsive nowrap w-100"></table>
<div class="mass-actions-mailbox">
<div class="btn-group" data-acl="{{ acl.syncjobs }}">
<a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" id="toggle_multi_select_all" data-id="syncjob" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
diff --git a/data/web/templates/mailbox/tab-tls-policy.twig b/data/web/templates/mailbox/tab-tls-policy.twig
index bc6a83ea..d4a02a03 100644
--- a/data/web/templates/mailbox/tab-tls-policy.twig
+++ b/data/web/templates/mailbox/tab-tls-policy.twig
@@ -5,17 +5,11 @@
<div class="btn-group ms-auto d-none d-sm-flex">
<button class="btn btn-xs btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addTLSPolicyMapAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_tls_policy_map }}</button>
<button class="btn btn-xs btn-secondary refresh_table" data-draw="draw_tls_policy_table" data-table="tls_policy_table">{{ lang.admin.refresh }}</button>
- <button type="button" class="btn btn-xs btn-secondary dropdown-toggle" data-bs-toggle="dropdown">{{ lang.mailbox.table_size }}</button>
- <ul class="dropdown-menu" data-table-id="tls_policy_table" role="menu">
- {% include 'mailbox/page-size.twig' %}
- </ul>
</div>
</div>
<p style="margin:10px" class="text-muted">{{ lang.mailbox.tls_policy_maps_info|raw }}</p>
{# <div class="mass-actions-mailbox" data-actions-header="true"></div>#}
- <div class="table-responsive">
- <table class="table table-striped" id="tls_policy_table"></table>
- </div>
+ <table id="tls_policy_table" class="table table-striped dt-responsive nowrap w-100"></table>
<div class="mass-actions-mailbox">
<div class="btn-group">
<a class="btn btn-sm btn-xs-half d-block d-sm-inline 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>