2016-12-10 03:39:02 +08:00
$ ( document ) . ready ( function ( ) {
2017-05-12 05:10:32 +08:00
// Collect values of input fields with name multi_select with same data-id to js array multi_data[data-id]
var multi _data = [ ] ;
$ ( document ) . on ( 'change' , 'input[name=multi_select]:checkbox' , function ( ) {
if ( $ ( this ) . is ( ':checked' ) && $ ( this ) . data ( 'id' ) ) {
var id = $ ( this ) . data ( 'id' ) ;
if ( typeof multi _data [ id ] == "undefined" ) {
multi _data [ id ] = [ ] ;
}
multi _data [ id ] . push ( $ ( this ) . val ( ) ) ;
}
else {
var id = $ ( this ) . data ( 'id' ) ;
multi _data [ id ] . splice ( $ . inArray ( $ ( this ) . val ( ) , multi _data [ id ] ) , 1 ) ;
}
} ) ;
// Select checkbox by click on parent tr
2017-05-12 05:18:57 +08:00
$ ( document ) . on ( 'click' , 'tbody>tr' , function ( e ) {
2017-05-12 05:10:32 +08:00
if ( e . target . type == "checkbox" ) {
e . stopPropagation ( ) ;
} else {
var checkbox = $ ( this ) . find ( ':checkbox' ) ;
checkbox . trigger ( 'click' ) ;
}
} ) ;
// Select or deselect all checkboxes with same data-id
$ ( document ) . on ( 'click' , '#toggle_multi_select_all' , function ( e ) {
e . preventDefault ( ) ;
id = $ ( this ) . data ( "id" ) ;
multi _data [ id ] = [ ] ;
var all _checkboxes = $ ( "input[data-id=" + id + "]:enabled" ) ;
all _checkboxes . prop ( "checked" , ! all _checkboxes . prop ( "checked" ) ) . change ( ) ;
} ) ;
// General API edit actions
$ ( document ) . on ( 'click' , '#edit_selected' , function ( e ) {
e . preventDefault ( ) ;
var id = $ ( this ) . data ( 'id' ) ;
if ( typeof multi _data [ id ] == "undefined" ) return ;
data _array = multi _data [ id ] ;
api _url = $ ( this ) . data ( 'api-url' ) ;
api _attr = $ ( this ) . data ( 'api-attr' ) ;
if ( Object . keys ( data _array ) . length !== 0 ) {
$ . ajax ( {
type : "POST" ,
dataType : "json" ,
2017-05-15 17:37:12 +08:00
data : { "items" : JSON . stringify ( data _array ) , "attr" : JSON . stringify ( api _attr ) , "csrf_token" : csrf _token } ,
2017-05-12 05:10:32 +08:00
url : '/api/v1/' + api _url ,
jsonp : false ,
complete : function ( data ) {
// var reponse = (JSON.parse(data.responseText));
2017-05-13 14:55:34 +08:00
// console.log(reponse.type);
// console.log(reponse.msg);
2017-05-12 05:10:32 +08:00
location . assign ( window . location ) ;
}
} ) ;
}
} ) ;
// General API delete actions
$ ( document ) . on ( 'click' , '#delete_selected' , function ( e ) {
e . preventDefault ( ) ;
var id = $ ( this ) . data ( 'id' ) ;
if ( typeof multi _data [ id ] == "undefined" || multi _data [ id ] == "" ) return ;
data _array = multi _data [ id ] ;
api _url = $ ( this ) . data ( 'api-url' ) ;
$ ( document ) . on ( 'show.bs.modal' , '#ConfirmDeleteModal' , function ( ) {
$ ( "#ItemsToDelete" ) . empty ( ) ;
for ( var i in data _array ) {
$ ( "#ItemsToDelete" ) . append ( "<li>" + data _array [ i ] + "</li>" ) ;
}
} )
$ ( '#ConfirmDeleteModal' ) . modal ( {
backdrop : 'static' ,
keyboard : false
} )
. one ( 'click' , '#IsConfirmed' , function ( e ) {
$ . ajax ( {
type : "POST" ,
dataType : "json" ,
2017-05-15 17:37:12 +08:00
data : { "items" : JSON . stringify ( data _array ) , "csrf_token" : csrf _token } ,
2017-05-12 05:10:32 +08:00
url : '/api/v1/' + api _url ,
jsonp : false ,
complete : function ( data ) {
location . assign ( window . location ) ;
}
} ) ;
} )
. one ( 'click' , '#isCanceled' , function ( e ) {
$ ( '#ConfirmDeleteModal' ) . modal ( 'hide' ) ;
} ) ; ;
} ) ;
} ) ;
jQuery ( function ( $ ) {
// Calculation human readable file sizes
2017-03-21 15:11:06 +08:00
function humanFileSize ( bytes ) {
if ( Math . abs ( bytes ) < 1024 ) {
return bytes + ' B' ;
}
var units = [ 'KiB' , 'MiB' , 'GiB' , 'TiB' , 'PiB' , 'EiB' , 'ZiB' , 'YiB' ] ;
var u = - 1 ;
do {
bytes /= 1024 ;
++ u ;
} while ( Math . abs ( bytes ) >= 1024 && u < units . length - 1 ) ;
return bytes . toFixed ( 1 ) + ' ' + units [ u ] ;
}
2017-05-12 05:10:32 +08:00
function unix _time _format ( tm ) {
var date = new Date ( tm ? tm * 1000 : 0 ) ;
return date . toLocaleString ( ) ;
}
function draw _domain _table ( ) {
ft _domain _table = FooTable . init ( '#domain_table' , {
"columns" : [
{ "name" : "chkbox" , "title" : "" , "style" : { "maxWidth" : "40px" , "width" : "40px" } , "filterable" : false , "sortable" : false , "type" : "html" } ,
{ "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" , "style" : { "whiteSpace" : "nowrap" } , "title" : lang . domain _quota , "formatter" : function ( value ) {
res = value . split ( "/" ) ;
return humanFileSize ( res [ 0 ] ) + " / " + humanFileSize ( res [ 1 ] ) ;
2017-03-21 15:11:06 +08:00
} ,
2017-05-12 05:10:32 +08:00
"sortValue" : function ( value ) {
res = value . split ( "/" ) ;
return res [ 0 ] ;
2017-03-21 15:11:06 +08:00
} ,
} ,
2017-05-12 05:10:32 +08:00
{ "name" : "max_quota_for_mbox" , "title" : lang . mailbox _quota , "breakpoints" : "xs sm" } ,
{ "name" : "backupmx" , "filterable" : false , "style" : { "maxWidth" : "120px" , "width" : "120px" } , "title" : lang . backup _mx , "breakpoints" : "xs sm" } ,
{ "name" : "active" , "filterable" : false , "style" : { "maxWidth" : "80px" , "width" : "80px" } , "title" : lang . active } ,
2017-05-16 15:51:05 +08:00
{ "name" : "action" , "filterable" : false , "sortable" : false , "style" : { "text-align" : "right" , "maxWidth" : "180px" , "width" : "180px" } , "type" : "html" , "title" : lang . action , "breakpoints" : "xs sm" }
2017-05-12 05:10:32 +08:00
] ,
"rows" : $ . ajax ( {
dataType : 'json' ,
url : '/api/v1/get/domain/all' ,
jsonp : false ,
2017-05-13 14:55:34 +08:00
error : function ( data ) {
console . log ( 'Cannot draw domain table' ) ;
2017-03-21 15:11:06 +08:00
} ,
2017-05-12 05:10:32 +08:00
success : function ( data ) {
$ . each ( data , function ( i , item ) {
item . aliases = item . aliases _in _domain + " / " + item . max _num _aliases _for _domain ;
item . mailboxes = item . mboxes _in _domain + " / " + item . max _num _mboxes _for _domain ;
item . quota = item . quota _used _in _domain + "/" + item . max _quota _for _domain ;
item . max _quota _for _mbox = humanFileSize ( item . max _quota _for _mbox ) ;
item . chkbox = '<input type="checkbox" data-id="domain" name="multi_select" value="' + item . domain _name + '" />' ;
if ( role == "admin" ) {
item . action = '<div class="btn-group">' +
'<a href="/edit.php?domain=' + encodeURI ( item . domain _name ) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang . edit + '</a>' +
'<a href="/delete.php?domain=' + encodeURI ( item . domain _name ) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang . remove + '</a>' +
'</div>' ;
}
else {
item . action = '<div class="btn-group">' +
'<a href="/edit.php?domain=' + encodeURI ( item . domain _name ) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang . edit + '</a>' +
'</div>' ;
}
} ) ;
2017-03-21 15:11:06 +08:00
}
2017-05-12 05:10:32 +08:00
} ) ,
"empty" : lang . empty ,
"paging" : {
"enabled" : true ,
"limit" : 5 ,
"size" : pagination _size
} ,
"filtering" : {
"enabled" : true ,
"position" : "left" ,
"placeholder" : lang . filter _table
} ,
"sorting" : {
"enabled" : true
}
} ) ;
}
function draw _mailbox _table ( ) {
ft _mailbox _table = FooTable . init ( '#mailbox_table' , {
"columns" : [
{ "name" : "chkbox" , "title" : "" , "style" : { "maxWidth" : "40px" , "width" : "40px" } , "filterable" : false , "sortable" : false , "type" : "html" } ,
{ "sorted" : true , "name" : "username" , "style" : { "word-break" : "break-all" , "min-width" : "120px" } , "title" : lang . username } ,
{ "name" : "name" , "title" : lang . fname , "style" : { "word-break" : "break-all" , "min-width" : "120px" } , "breakpoints" : "xs sm" } ,
{ "name" : "domain" , "title" : lang . domain , "breakpoints" : "xs sm" } ,
{ "name" : "quota" , "style" : { "whiteSpace" : "nowrap" } , "title" : lang . domain _quota , "formatter" : function ( value ) {
res = value . split ( "/" ) ;
return humanFileSize ( res [ 0 ] ) + " / " + humanFileSize ( res [ 1 ] ) ;
2017-03-21 17:02:23 +08:00
} ,
2017-05-12 05:10:32 +08:00
"sortValue" : function ( value ) {
res = value . split ( "/" ) ;
return res [ 0 ] ;
2017-03-21 17:02:23 +08:00
} ,
} ,
2017-05-12 05:10:32 +08:00
{ "name" : "spam_aliases" , "filterable" : false , "title" : lang . spam _aliases , "breakpoints" : "xs sm md" } ,
{ "name" : "in_use" , "filterable" : false , "type" : "html" , "title" : lang . in _use } ,
{ "name" : "messages" , "filterable" : false , "title" : lang . msg _num , "breakpoints" : "xs sm md" } ,
{ "name" : "active" , "filterable" : false , "title" : lang . active } ,
{ "name" : "action" , "filterable" : false , "sortable" : false , "style" : { "text-align" : "right" , "min-width" : "250px" } , "type" : "html" , "title" : lang . action , "breakpoints" : "xs sm md" }
] ,
"empty" : lang . empty ,
"rows" : $ . ajax ( {
dataType : 'json' ,
url : '/api/v1/get/mailbox/all' ,
jsonp : false ,
error : function ( ) {
2017-05-13 14:55:34 +08:00
console . log ( 'Cannot draw mailbox table' ) ;
2017-03-21 17:02:23 +08:00
} ,
2017-05-12 05:10:32 +08:00
success : function ( data ) {
$ . each ( data , function ( i , item ) {
item . quota = item . quota _used + "/" + item . quota ;
item . max _quota _for _mbox = humanFileSize ( item . max _quota _for _mbox ) ;
item . chkbox = '<input type="checkbox" data-id="mailbox" name="multi_select" value="' + item . username + '" />' ;
if ( role == "admin" ) {
item . action = '<div class="btn-group">' +
'<a href="/edit.php?mailbox=' + encodeURI ( item . username ) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang . edit + '</a>' +
'<a href="/delete.php?mailbox=' + encodeURI ( item . username ) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang . remove + '</a>' +
'<a href="/index.php?duallogin=' + encodeURI ( item . username ) + '" class="btn btn-xs btn-success"><span class="glyphicon glyphicon-user"></span> Login</a>' +
'</div>' ;
}
else {
item . action = '<div class="btn-group">' +
'<a href="/edit.php?mailbox=' + encodeURI ( item . username ) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang . edit + '</a>' +
'<a href="/delete.php?mailbox=' + encodeURI ( 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" ' +
'style="min-width:2em;width:' + item . percent _in _use + '%">' + item . percent _in _use + '%' + '</div></div>' ;
2017-03-21 17:02:23 +08:00
2017-05-12 05:10:32 +08:00
} ) ;
2017-04-24 19:13:23 +08:00
}
2017-05-12 05:10:32 +08:00
} ) ,
"paging" : {
"enabled" : true ,
"limit" : 5 ,
"size" : pagination _size
} ,
"filtering" : {
"enabled" : true ,
"position" : "left" ,
"placeholder" : lang . filter _table
} ,
"sorting" : {
"enabled" : true
}
} ) ;
}
function draw _resource _table ( ) {
ft _resource _table = FooTable . init ( '#resource_table' , {
"columns" : [
{ "name" : "chkbox" , "title" : "" , "style" : { "maxWidth" : "40px" , "width" : "40px" } , "filterable" : false , "sortable" : false , "type" : "html" } ,
{ "sorted" : true , "name" : "description" , "title" : lang . description , "style" : { "width" : "250px" } } ,
{ "name" : "kind" , "title" : lang . kind } ,
{ "name" : "domain" , "title" : lang . domain , "breakpoints" : "xs sm" } ,
{ "name" : "multiple_bookings" , "filterable" : false , "style" : { "maxWidth" : "120px" , "width" : "120px" } , "title" : lang . multiple _bookings , "breakpoints" : "xs sm" } ,
{ "name" : "active" , "filterable" : false , "style" : { "maxWidth" : "80px" , "width" : "80px" } , "title" : lang . active } ,
{ "name" : "action" , "filterable" : false , "sortable" : false , "style" : { "text-align" : "right" , "maxWidth" : "180px" , "width" : "180px" } , "type" : "html" , "title" : lang . action , "breakpoints" : "xs sm" }
] ,
"empty" : lang . empty ,
"rows" : $ . ajax ( {
dataType : 'json' ,
url : '/api/v1/get/resource/all' ,
jsonp : false ,
error : function ( ) {
2017-05-13 14:55:34 +08:00
console . log ( 'Cannot draw resource table' ) ;
2017-03-21 17:02:23 +08:00
} ,
2017-05-12 05:10:32 +08:00
success : function ( data ) {
$ . each ( data , function ( i , item ) {
item . action = '<div class="btn-group">' +
'<a href="/edit.php?resource=' + encodeURI ( item . name ) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang . edit + '</a>' +
'<a href="/delete.php?resource=' + encodeURI ( item . name ) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang . remove + '</a>' +
'</div>' ;
item . chkbox = '<input type="checkbox" data-id="resource" name="multi_select" value="' + item . name + '" />' ;
2017-04-27 15:49:04 +08:00
} ) ;
}
2017-05-12 05:10:32 +08:00
} ) ,
"paging" : {
"enabled" : true ,
"limit" : 5 ,
"size" : pagination _size
} ,
"filtering" : {
"enabled" : true ,
"position" : "left" ,
"placeholder" : lang . filter _table
} ,
"sorting" : {
"enabled" : true
}
} ) ;
}
2017-04-27 15:49:04 +08:00
2017-05-12 05:10:32 +08:00
function draw _alias _table ( ) {
ft _alias _table = FooTable . init ( '#alias_table' , {
"columns" : [
{ "name" : "chkbox" , "title" : "" , "style" : { "maxWidth" : "40px" , "width" : "40px" } , "filterable" : false , "sortable" : false , "type" : "html" } ,
{ "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" : "active" , "filterable" : false , "style" : { "maxWidth" : "50px" , "width" : "70px" } , "title" : lang . active } ,
{ "name" : "action" , "filterable" : false , "sortable" : false , "style" : { "text-align" : "right" , "maxWidth" : "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 ( ) {
2017-05-13 14:55:34 +08:00
console . log ( 'Cannot draw alias table' ) ;
2017-05-12 05:10:32 +08:00
} ,
success : function ( data ) {
$ . each ( data , function ( i , item ) {
item . action = '<div class="btn-group">' +
'<a href="/edit.php?alias=' + encodeURI ( item . address ) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang . edit + '</a>' +
'<a href="/delete.php?alias=' + encodeURI ( item . address ) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-pencil"></span> ' + lang . remove + '</a>' +
'</div>' ;
item . chkbox = '<input type="checkbox" data-id="alias" name="multi_select" value="' + item . address + '" />' ;
if ( item . is _catch _all == 1 ) {
item . address = '<div class="label label-default">Catch-All</div> ' + item . address ;
}
if ( item . in _primary _domain !== "" ) {
item . domain = "↳ " + item . domain + " (" + item . in _primary _domain + ")" ;
2017-04-27 15:49:04 +08:00
}
} ) ;
}
2017-05-12 05:10:32 +08:00
} ) ,
"paging" : {
"enabled" : true ,
"limit" : 5 ,
"size" : pagination _size
} ,
"filtering" : {
"enabled" : true ,
"position" : "left" ,
"placeholder" : lang . filter _table
} ,
"sorting" : {
"enabled" : true
}
} ) ;
}
2017-04-27 17:58:20 +08:00
2017-05-12 05:10:32 +08:00
function draw _aliasdomain _table ( ) {
ft _aliasdomain _table = FooTable . init ( '#aliasdomain_table' , {
"columns" : [
{ "name" : "chkbox" , "title" : "" , "style" : { "maxWidth" : "40px" , "width" : "40px" } , "filterable" : false , "sortable" : false , "type" : "html" } ,
{ "sorted" : true , "name" : "alias_domain" , "title" : lang . alias , "style" : { "width" : "250px" } } ,
{ "name" : "target_domain" , "title" : lang . target _domain } ,
{ "name" : "active" , "filterable" : false , "style" : { "maxWidth" : "50px" , "width" : "70px" } , "title" : lang . active } ,
{ "name" : "action" , "filterable" : false , "sortable" : false , "style" : { "text-align" : "right" , "maxWidth" : "180px" , "width" : "180px" } , "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 ( ) {
2017-05-13 14:55:34 +08:00
console . log ( 'Cannot draw alias domain table' ) ;
2017-05-12 05:10:32 +08:00
} ,
success : function ( data ) {
$ . each ( data , function ( i , item ) {
item . action = '<div class="btn-group">' +
'<a href="/edit.php?aliasdomain=' + encodeURI ( item . alias _domain ) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang . edit + '</a>' +
'<a href="/delete.php?aliasdomain=' + encodeURI ( item . alias _domain ) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang . remove + '</a>' +
'</div>' ;
item . chkbox = '<input type="checkbox" data-id="alias-domain" name="multi_select" value="' + item . alias _domain + '" />' ;
} ) ;
2017-04-27 15:49:04 +08:00
}
2017-05-12 05:10:32 +08:00
} ) ,
"paging" : {
"enabled" : true ,
"limit" : 5 ,
"size" : pagination _size
} ,
"filtering" : {
"enabled" : true ,
"position" : "left" ,
"placeholder" : lang . filter _table
} ,
"sorting" : {
"enabled" : true
}
} ) ;
}
2017-04-27 15:49:04 +08:00
2017-05-12 05:10:32 +08:00
draw _domain _table ( ) ;
draw _mailbox _table ( ) ;
draw _resource _table ( ) ;
draw _alias _table ( ) ;
draw _aliasdomain _table ( ) ;
} ) ;