Add footable

master
root 2017-03-21 10:02:23 +01:00
parent 51230f780f
commit 892f2197cb
7 changed files with 286 additions and 60 deletions

View File

@ -1 +1 @@
server_name logs.servercow.de autodiscover.* autoconfig.*;
server_name mail.develcow.de autodiscover.* autoconfig.*;

View File

@ -4422,7 +4422,7 @@ function mailbox_get_resource_details($resource) {
$resourcedata['name'] = $row['username'];
$resourcedata['kind'] = $row['kind'];
$resourcedata['multiple_bookings'] = $row['multiple_bookings'];
$resourcedata['multiple_bookings_int'] = $row['multiple_bookings'];
$resourcedata['multiple_bookings_int'] = $row['multiple_bookings_int'];
$resourcedata['description'] = $row['name'];
$resourcedata['active'] = $row['active'];
$resourcedata['active_int'] = $row['active_int'];

View File

@ -15,6 +15,7 @@
<link rel="stylesheet" href="/css/bootstrap-select.min.css">
<link rel="stylesheet" href="/css/bootstrap-slider.min.css">
<link rel="stylesheet" href="/css/bootstrap-switch.min.css">
<link rel="stylesheet" href="/css/footable.bootstrap.min.css">
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Source+Sans+Pro:400,600,700&subset=latin,latin-ext">
<link rel="stylesheet" href="/inc/languages.min.css">
<link rel="stylesheet" href="/css/mailcow.css">

View File

@ -28,22 +28,23 @@ $(document).ready(function() {
item.quota = humanFileSize(item.quota_used_in_domain) + " / " + humanFileSize(item.max_quota_for_domain);
item.max_quota_for_mbox = humanFileSize(item.max_quota_for_mbox);
item.action = '<div class="btn-group">' +
'<a href="/edit.php?domain=' + item.domain_name + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> Edit</a>' +
'<a href="/delete.php?domain=' + item.domain_name + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> Remove</a>' +
'<a href="/edit.php?domain=' + item.domain_name + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="/delete.php?domain=' + item.domain_name + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'</div>';
});
$('#domain_table').footable({
"columns": [
{"sorted": true,"name":"domain_name","title":lang_domain},
{"name":"aliases","title":lang_aliases,"breakpoints":"xs sm"},
{"name":"mailboxes","title":lang_mailboxes},
{"name":"quota","title":lang_domain_quota},
{"name":"max_quota_for_mbox","title":lang_mailbox_quota},
{"name":"backupmx","title":lang_backup_mx,"breakpoints":"xs sm"},
{"name":"active","title":lang_active,"breakpoints":"xs sm"},
{"name":"action","type":"html","title":lang_action,"breakpoints":"xs sm"}
{"sorted": true,"name":"domain_name","title":lang.domain,"style":{"width":"250px"}},
{"name":"aliases","title":lang.aliases,"breakpoints":"xs sm"},
{"name":"mailboxes","title":lang.mailboxes},
{"name":"quota","title":lang.domain_quota},
{"name":"max_quota_for_mbox","title":lang.mailbox_quota},
{"name":"backupmx","title":lang.backup_mx,"breakpoints":"xs sm"},
{"name":"active","style":{"maxWidth":"50px","width":"70px"},"title":lang.active},
{"name":"action","sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
],
"rows": data,
"empty": lang.empty,
"paging": {
"enabled": true,
"limit": 5,
@ -51,7 +52,8 @@ $(document).ready(function() {
},
"filtering": {
"enabled": true,
"position": "left"
"position": "left",
"placeholder": lang.search
},
"sorting": {
"enabled": true
@ -72,8 +74,8 @@ $(document).ready(function() {
item.quota = humanFileSize(item.quota_used) + " / " + humanFileSize(item.quota);
item.max_quota_for_mbox = humanFileSize(item.max_quota_for_mbox);
item.action = '<div class="btn-group">' +
'<a href="/edit.php?mailbox=' + item.username + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> Edit</a>' +
'<a href="/delete.php?mailbox=' + item.username + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> Remove</a>' +
'<a href="/edit.php?mailbox=' + item.username + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="/delete.php?mailbox=' + item.username + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'</div>';
item.in_use = '<div class="progress">' +
'<div class="progress-bar progress-bar-' + item.percent_class + ' role="progressbar" aria-valuenow="' + item.percent_in_use + '" aria-valuemin="0" aria-valuemax="100" ' +
@ -82,16 +84,17 @@ $(document).ready(function() {
});
$('#mailbox_table').footable({
"columns": [
{"sorted": true,"name":"username","title":lang_username},
{"name":"name","title":lang_fname,"breakpoints":"xs sm"},
{"name":"domain","title":lang_domain},
{"name":"quota","title":lang_domain_quota},
{"name":"spam_aliases","title":lang_spam_aliases},
{"name":"in_use","type":"html","title":lang_in_use},
{"name":"messages","title":lang_msg_num,"breakpoints":"xs sm"},
{"name":"active","title":lang_active,"breakpoints":"xs sm"},
{"name":"action","type":"html","title":lang_action,"breakpoints":"xs sm"}
{"sorted": true,"name":"username","title":lang.username,"style":{"width":"250px"}},
{"name":"name","title":lang.fname,"breakpoints":"xs sm"},
{"name":"domain","title":lang.domain},
{"name":"quota","title":lang.domain_quota},
{"name":"spam_aliases","title":lang.spam_aliases},
{"name":"in_use","type":"html","title":lang.in_use},
{"name":"messages","title":lang.msg_num,"breakpoints":"xs sm"},
{"name":"active","style":{"maxWidth":"50px","width":"70px"},"title":lang.active},
{"name":"action","sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
],
"empty": lang.empty,
"rows": data,
"paging": {
"enabled": true,
@ -100,7 +103,8 @@ $(document).ready(function() {
},
"filtering": {
"enabled": true,
"position": "left"
"position": "left",
"placeholder": lang.search
},
"sorting": {
"enabled": true
@ -109,4 +113,130 @@ $(document).ready(function() {
}
});
$.ajax({
dataType: 'json',
url: '/json_api.php?action=resource_table_data',
jsonp: false,
error: function () {
alert('Cannot receive history');
},
success: function (data) {
$.each(data, function (i, item) {
item.action = '<div class="btn-group">' +
'<a href="/edit.php?resource=' + item.name + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="/delete.php?resource=' + item.name + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'</div>';
});
$('#resources_table').footable({
"columns": [
{"sorted": true,"name":"description","title":lang.description,"style":{"width":"250px"}},
{"name":"kind","title":lang.kind,"breakpoints":"xs sm"},
{"name":"domain","title":lang.domain},
{"name":"multiple_bookings","title":lang.multiple_bookings},
{"name":"domain","title":lang.domain},
{"name":"active","style":{"maxWidth":"50px","width":"70px"},"title":lang.active},
{"name":"action","sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
],
"empty": lang.empty,
"rows": data,
"paging": {
"enabled": true,
"limit": 5,
"size": 25
},
"filtering": {
"enabled": true,
"position": "left",
"placeholder": lang.search
},
"sorting": {
"enabled": true
}
});
}
});
$.ajax({
dataType: 'json',
url: '/json_api.php?action=domain_alias_table_data',
jsonp: false,
error: function () {
alert('Cannot receive history');
},
success: function (data) {
$.each(data, function (i, item) {
item.action = '<div class="btn-group">' +
'<a href="/edit.php?aliasdomain=' + item.alias_domain + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="/delete.php?aliasdomain=' + item.alias_domain + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'</div>';
});
$('#aliasdomain_table').footable({
"columns": [
{"sorted": true,"name":"alias_domain","title":lang.alias,"style":{"width":"250px"}},
{"name":"target_domain","title":lang.target_domain,"breakpoints":"xs sm"},
{"name":"active","style":{"maxWidth":"50px","width":"70px"},"title":lang.active},
{"name":"action","sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
],
"empty": lang.empty,
"rows": data,
"paging": {
"enabled": true,
"limit": 5,
"size": 25
},
"filtering": {
"enabled": true,
"position": "left",
"placeholder": lang.search
},
"sorting": {
"enabled": true
}
});
}
});
$.ajax({
dataType: 'json',
url: '/json_api.php?action=alias_table_data',
jsonp: false,
error: function () {
alert('Cannot receive history');
},
success: function (data) {
$.each(data, function (i, item) {
if (item.is_catch_all == 1) {
item.address = '<div class="label label-default">Catch-All</div> ' + item.address;
}
item.action = '<div class="btn-group">' +
'<a href="/edit.php?alias=' + item.address + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="/delete.php?alias=' + item.address + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'</div>';
});
$('#alias_table').footable({
"columns": [
{"sorted": true,"name":"address","title":lang.alias,"style":{"width":"250px"}},
{"name":"goto","title":lang.target_address},
{"name":"domain","title":lang.domain},
{"name":"active","style":{"maxWidth":"50px","width":"70px"},"title":lang.active},
{"name":"action","sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
],
"empty": lang.empty,
"rows": data,
"paging": {
"enabled": true,
"limit": 5,
"size": 5
},
"filtering": {
"enabled": true,
"position": "left",
"placeholder": lang.search
},
"sorting": {
"enabled": true
}
});
}
});
});

View File

@ -2,13 +2,104 @@
require_once 'inc/prerequisites.inc.php';
error_reporting(E_ALL);
if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_username'])) {
if ($_GET['action'] && $_GET['object']) {
if (isset($_GET['action'])) {
$action = $_GET['action'];
$object = $_GET['object'];
switch ($action) {
case "domain_table_data":
$domains = mailbox_get_domains();
if (!empty($domains)) {
foreach ($domains as $domain) {
$data[] = mailbox_get_domain_details($domain);
}
if (!isset($data) || empty($data)) {
echo '{}';
}
else {
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}
}
break;
case "mailbox_table_data":
$domains = mailbox_get_domains();
if (!empty($domains)) {
foreach ($domains as $domain) {
$mailboxes = mailbox_get_mailboxes($domain);
if (!empty($mailboxes)) {
foreach ($mailboxes as $mailbox) {
$data[] = mailbox_get_mailbox_details($mailbox);
}
}
}
if (!isset($data) || empty($data)) {
echo '{}';
}
else {
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}
}
break;
case "resource_table_data":
$domains = mailbox_get_domains();
if (!empty($domains)) {
foreach ($domains as $domain) {
$resources = mailbox_get_resources($domain);
if (!empty($resources)) {
foreach ($resources as $resource) {
$data[] = mailbox_get_resource_details($resource);
}
}
}
if (!isset($data) || empty($data)) {
echo '{}';
}
else {
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}
}
break;
case "domain_alias_table_data":
$domains = mailbox_get_domains();
if (!empty($domains)) {
foreach ($domains as $domain) {
$alias_domains = mailbox_get_alias_domains($domain);
if (!empty($alias_domains)) {
foreach ($alias_domains as $alias_domain) {
$data[] = mailbox_get_alias_domain_details($alias_domain);
}
}
}
if (!isset($data) || empty($data)) {
echo '{}';
}
else {
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}
}
break;
case "alias_table_data":
$domains = array_merge(mailbox_get_domains(), mailbox_get_alias_domains());
if (!empty($domains)) {
foreach ($domains as $domain) {
$aliases = mailbox_get_aliases($domain);
if (!empty($aliases)) {
foreach ($aliases as $alias) {
$data[] = mailbox_get_alias_details($alias);
}
}
}
if (!isset($data) || empty($data)) {
echo '{}';
}
else {
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}
}
break;
case "get_mailbox_details":
if (!isset($_GET['object'])) { return false; }
$object = $_GET['object'];
$data = mailbox_get_mailbox_details($object);
if (!$data || empty($data)) {
if (!isset($data) || empty($data)) {
echo '{}';
}
else {
@ -16,8 +107,10 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
}
break;
case "get_domain_details":
if (!isset($_GET['object'])) { return false; }
$object = $_GET['object'];
$data = mailbox_get_domain_details($object);
if (!$data || empty($data)) {
if (!isset($data) || empty($data)) {
echo '{}';
}
else {
@ -25,6 +118,8 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
}
break;
case "get_u2f_reg_challenge":
if (!isset($_GET['object'])) { return false; }
$object = $_GET['object'];
if (
($_SESSION["mailcow_cc_role"] == "admin" || $_SESSION["mailcow_cc_role"] == "domainadmin")
&&
@ -40,6 +135,8 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
}
break;
case "get_u2f_auth_challenge":
if (!isset($_GET['object'])) { return false; }
$object = $_GET['object'];
if (isset($_SESSION['pending_mailcow_cc_username']) && $_SESSION['pending_mailcow_cc_username'] == $object) {
$reqs = json_encode($u2f->getAuthenticateData(get_u2f_registrations($object)));
$_SESSION['authReq'] = $reqs;

View File

@ -5,6 +5,15 @@ if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "adm
require_once "inc/header.inc.php";
$_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
?>
<style>
table.footable>tbody>tr.footable-empty>td {
font-size:15px !important;
font-style:italic;
}
.pagination a {
text-decoration: none !important;
}
</style>
<div class="container">
<div class="row">
<div class="col-md-12">
@ -51,14 +60,12 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
<a href="/add.php?resource"><span class="glyphicon glyphicon-plus"></span></a>
</div>
</div>
<div class="panel-body">
<div class="table-responsive">
<table id="resources_table" class="table table-striped"></table>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="panel panel-default">
@ -68,14 +75,12 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
<a href="/add.php?aliasdomain"><span class="glyphicon glyphicon-plus"></span></a>
</div>
</div>
<div class="panel-body">
<div class="table-responsive">
<table id="aliasdomain_table" class="table table-striped"></table>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
@ -86,28 +91,18 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
<a href="/add.php?alias"><span class="glyphicon glyphicon-plus"></span></a>
</div>
</div>
<div class="panel-body">
<div class="table-responsive">
<table id="alias_table" class="table table-striped"></table>
</div>
</div>
</div>
</div>
</div>
</div> <!-- /container -->
<script>
var lang_domain = '<?=$lang['mailbox']['domain'];?>';
var lang_aliases = '<?=$lang['mailbox']['aliases'];?>';
var lang_mailboxes = '<?=$lang['mailbox']['mailboxes'];?>';
var lang_mailbox_quota = '<?=$lang['mailbox']['mailbox_quota'];?>';
var lang_domain_quota = '<?=$lang['mailbox']['domain_quota'];?>';
var lang_backup_mx = '<?=$lang['mailbox']['backup_mx'];?>';
var lang_active = '<?=$lang['mailbox']['active'];?>';
var lang_username = '<?=$lang['mailbox']['username'];?>';
var lang_fname = '<?=$lang['mailbox']['fname'];?>';
var lang_spam_aliases = '<?=$lang['mailbox']['spam_aliases'];?>';
var lang_in_use = '<?=$lang['mailbox']['in_use'];?>';
var lang_msg_num = '<?=$lang['mailbox']['msg_num'];?>';
<script type='text/javascript'>
<?php
$lang_mailbox = json_encode($lang['mailbox']);
echo "var lang = ". $lang_mailbox . ";\n";
?>
</script>
<script src="js/footable.min.js"></script>
<script src="js/mailbox.js"></script>

View File

@ -261,6 +261,9 @@ networks:
volumes:
vmail-vol-1:
driver: nfs
driver_opts:
share: io.servercow.de:/nfs_test
mysql-vol-1:
dkim-vol-1:
redis-vol-1: