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['name'] = $row['username'];
$resourcedata['kind'] = $row['kind']; $resourcedata['kind'] = $row['kind'];
$resourcedata['multiple_bookings'] = $row['multiple_bookings']; $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['description'] = $row['name'];
$resourcedata['active'] = $row['active']; $resourcedata['active'] = $row['active'];
$resourcedata['active_int'] = $row['active_int']; $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-select.min.css">
<link rel="stylesheet" href="/css/bootstrap-slider.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/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="//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="/inc/languages.min.css">
<link rel="stylesheet" href="/css/mailcow.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.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.max_quota_for_mbox = humanFileSize(item.max_quota_for_mbox);
item.action = '<div class="btn-group">' + 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="/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> Remove</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>'; '</div>';
}); });
$('#domain_table').footable({ $('#domain_table').footable({
"columns": [ "columns": [
{"sorted": true,"name":"domain_name","title":lang_domain}, {"sorted": true,"name":"domain_name","title":lang.domain,"style":{"width":"250px"}},
{"name":"aliases","title":lang_aliases,"breakpoints":"xs sm"}, {"name":"aliases","title":lang.aliases,"breakpoints":"xs sm"},
{"name":"mailboxes","title":lang_mailboxes}, {"name":"mailboxes","title":lang.mailboxes},
{"name":"quota","title":lang_domain_quota}, {"name":"quota","title":lang.domain_quota},
{"name":"max_quota_for_mbox","title":lang_mailbox_quota}, {"name":"max_quota_for_mbox","title":lang.mailbox_quota},
{"name":"backupmx","title":lang_backup_mx,"breakpoints":"xs sm"}, {"name":"backupmx","title":lang.backup_mx,"breakpoints":"xs sm"},
{"name":"active","title":lang_active,"breakpoints":"xs sm"}, {"name":"active","style":{"maxWidth":"50px","width":"70px"},"title":lang.active},
{"name":"action","type":"html","title":lang_action,"breakpoints":"xs sm"} {"name":"action","sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":lang.action,"breakpoints":"xs sm"}
], ],
"rows": data, "rows": data,
"empty": lang.empty,
"paging": { "paging": {
"enabled": true, "enabled": true,
"limit": 5, "limit": 5,
@ -51,7 +52,8 @@ $(document).ready(function() {
}, },
"filtering": { "filtering": {
"enabled": true, "enabled": true,
"position": "left" "position": "left",
"placeholder": lang.search
}, },
"sorting": { "sorting": {
"enabled": true "enabled": true
@ -72,8 +74,8 @@ $(document).ready(function() {
item.quota = humanFileSize(item.quota_used) + " / " + humanFileSize(item.quota); item.quota = humanFileSize(item.quota_used) + " / " + humanFileSize(item.quota);
item.max_quota_for_mbox = humanFileSize(item.max_quota_for_mbox); item.max_quota_for_mbox = humanFileSize(item.max_quota_for_mbox);
item.action = '<div class="btn-group">' + 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="/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> Remove</a>' + '<a href="/delete.php?mailbox=' + item.username + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'</div>'; '</div>';
item.in_use = '<div class="progress">' + 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" ' + '<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({ $('#mailbox_table').footable({
"columns": [ "columns": [
{"sorted": true,"name":"username","title":lang_username}, {"sorted": true,"name":"username","title":lang.username,"style":{"width":"250px"}},
{"name":"name","title":lang_fname,"breakpoints":"xs sm"}, {"name":"name","title":lang.fname,"breakpoints":"xs sm"},
{"name":"domain","title":lang_domain}, {"name":"domain","title":lang.domain},
{"name":"quota","title":lang_domain_quota}, {"name":"quota","title":lang.domain_quota},
{"name":"spam_aliases","title":lang_spam_aliases}, {"name":"spam_aliases","title":lang.spam_aliases},
{"name":"in_use","type":"html","title":lang_in_use}, {"name":"in_use","type":"html","title":lang.in_use},
{"name":"messages","title":lang_msg_num,"breakpoints":"xs sm"}, {"name":"messages","title":lang.msg_num,"breakpoints":"xs sm"},
{"name":"active","title":lang_active,"breakpoints":"xs sm"}, {"name":"active","style":{"maxWidth":"50px","width":"70px"},"title":lang.active},
{"name":"action","type":"html","title":lang_action,"breakpoints":"xs sm"} {"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, "rows": data,
"paging": { "paging": {
"enabled": true, "enabled": true,
@ -100,7 +103,8 @@ $(document).ready(function() {
}, },
"filtering": { "filtering": {
"enabled": true, "enabled": true,
"position": "left" "position": "left",
"placeholder": lang.search
}, },
"sorting": { "sorting": {
"enabled": true "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'; require_once 'inc/prerequisites.inc.php';
error_reporting(E_ALL); error_reporting(E_ALL);
if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_username'])) { if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_username'])) {
if ($_GET['action'] && $_GET['object']) { if (isset($_GET['action'])) {
$action = $_GET['action']; $action = $_GET['action'];
$object = $_GET['object'];
switch ($action) { 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": case "get_mailbox_details":
if (!isset($_GET['object'])) { return false; }
$object = $_GET['object'];
$data = mailbox_get_mailbox_details($object); $data = mailbox_get_mailbox_details($object);
if (!$data || empty($data)) { if (!isset($data) || empty($data)) {
echo '{}'; echo '{}';
} }
else { else {
@ -16,8 +107,10 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
} }
break; break;
case "get_domain_details": case "get_domain_details":
if (!isset($_GET['object'])) { return false; }
$object = $_GET['object'];
$data = mailbox_get_domain_details($object); $data = mailbox_get_domain_details($object);
if (!$data || empty($data)) { if (!isset($data) || empty($data)) {
echo '{}'; echo '{}';
} }
else { else {
@ -25,6 +118,8 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
} }
break; break;
case "get_u2f_reg_challenge": case "get_u2f_reg_challenge":
if (!isset($_GET['object'])) { return false; }
$object = $_GET['object'];
if ( if (
($_SESSION["mailcow_cc_role"] == "admin" || $_SESSION["mailcow_cc_role"] == "domainadmin") ($_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; break;
case "get_u2f_auth_challenge": 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) { if (isset($_SESSION['pending_mailcow_cc_username']) && $_SESSION['pending_mailcow_cc_username'] == $object) {
$reqs = json_encode($u2f->getAuthenticateData(get_u2f_registrations($object))); $reqs = json_encode($u2f->getAuthenticateData(get_u2f_registrations($object)));
$_SESSION['authReq'] = $reqs; $_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"; require_once "inc/header.inc.php";
$_SESSION['return_to'] = $_SERVER['REQUEST_URI']; $_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="container">
<div class="row"> <div class="row">
<div class="col-md-12"> <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> <a href="/add.php?resource"><span class="glyphicon glyphicon-plus"></span></a>
</div> </div>
</div> </div>
<div class="panel-body">
<div class="table-responsive"> <div class="table-responsive">
<table id="resources_table" class="table table-striped"></table> <table id="resources_table" class="table table-striped"></table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="panel panel-default"> <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> <a href="/add.php?aliasdomain"><span class="glyphicon glyphicon-plus"></span></a>
</div> </div>
</div> </div>
<div class="panel-body">
<div class="table-responsive"> <div class="table-responsive">
<table id="aliasdomain_table" class="table table-striped"></table> <table id="aliasdomain_table" class="table table-striped"></table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="row"> <div class="row">
<div class="col-md-12"> <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> <a href="/add.php?alias"><span class="glyphicon glyphicon-plus"></span></a>
</div> </div>
</div> </div>
<div class="panel-body">
<div class="table-responsive"> <div class="table-responsive">
<table id="alias_table" class="table table-striped"></table> <table id="alias_table" class="table table-striped"></table>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
</div> <!-- /container --> </div> <!-- /container -->
<script> <script type='text/javascript'>
var lang_domain = '<?=$lang['mailbox']['domain'];?>'; <?php
var lang_aliases = '<?=$lang['mailbox']['aliases'];?>'; $lang_mailbox = json_encode($lang['mailbox']);
var lang_mailboxes = '<?=$lang['mailbox']['mailboxes'];?>'; echo "var lang = ". $lang_mailbox . ";\n";
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> </script>
<script src="js/footable.min.js"></script> <script src="js/footable.min.js"></script>
<script src="js/mailbox.js"></script> <script src="js/mailbox.js"></script>

View File

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