// Globals
// -----------------------------------------------------------------------------
var privileges = [];
var table;
// Supplamentary functions
// -----------------------------------------------------------------------------
// array.indexOf polyfill
// --- -- -- - - -
if (!Array.prototype.indexOf)
{
Array.prototype.indexOf = function(elt /*, from*/)
{
var len = this.length >>> 0;
var from = Number(arguments[1]) || 0;
from = (from < 0)
? Math.ceil(from)
: Math.floor(from);
if (from < 0)
from += len;
for (; from < len; from++)
{
if (from in this &&
this[from] === elt)
return from;
}
return -1;
};
}
/*
// function for sorting an array by 'breadcrumb' attribute
// --- -- -- - - -
function compare_breadcrumb (a,b) {
if ( a.breadcrumb < b.breadcrumb ) { return -1; }
if ( a.breadcrumb > b.breadcrumb ) { return 1; }
return 0;
}
*/
// return category record by category-id
// --- -- -- - - -
function privilege_record(id) {
var record = 0;
privileges.forEach(el => { if (el.id == id) record = el; });
return record;
}
/*
// return children of parent
// --- -- -- - - -
function childs_of_parents(list) {
// if 'list' is integer then make it an one-item list
parents = (Number.isInteger(list)) ? [ list ] : list;
var childs = [];
if (parents.length == 0) { return []; }
parents.forEach( pid => {
categories.forEach( el => { if (el.parent == pid) childs.push(el.id)});
});
var grandchilds = childs_of_parents(childs);
return childs.concat(grandchilds);
}
*/
// create actions html (edit and delete buttons)
// --- -- -- - - -
function create_actions_html(id) {
var del, edit;
del = "";
edit = [
''
].join('\n');
return edit +' '+ del;
}
$(document).ready(function() {
// When document is ready
// -------------------------------------------------------------------------
/** init selec2 element (used to specify parent-category)
* --- -- -- - - -
*/
$("#included_id").select2({
placeholder: 'Περιλαμβάνει τα δικαιώματα της',
dropdownParent: $('#managePrivileges'),
width: '100%',
// dropdownParent: "#manageCategory" // ref: https://github.com/select2/select2-bootstrap-theme/issues/41
});
/** init_table
* --- -- -- - - -
* get categories
* constuct categories array
* render dataTable
*/
function init_table() {
// get all categories from server (ajax)
$.getJSON( "/admin/api/privileges")
.done(function( json ) {
// then ...
// reset categories
privileges.length = 0;
// construct (new) categories data
Object.keys(json).forEach( key => {
el = json[key];
privileges.push({
id: el.id,
label: el.label,
includes: ((el.includes == null) ? [] : el.includes),
included_id: ((el.included_id == null) ? 0 : el.included_id),
actions: create_actions_html(el.id)
});
});
// sort by breadcrumb
// categories.sort( compare_breadcrumb );
// destroy previous datatable table instances
$('#dt-privileges').dataTable().fnClearTable();
$('#dt-privileges').dataTable().fnDestroy();
// (re-)create categories datatable
table = $('#dt-privileges').DataTable({
language: { url: '/libs/DataTables/localization/Greek.json' },
data: privileges,
ordering: false,
columns: [
{ data: 'id' },
{ data: 'label' },
{ data: 'includes' },
{ data: 'actions' }
]
});
})
.fail(function( jqxhr, textStatus, error ) {
console.log( "Request Failed (" + error +")" );
});
}
init_table(); // init table on first run
/** When modal show-up
* -------------------------------------------------------------------------
* ... prepare the manage-category form
* ... update select2 with possible parents
*/
$('#managePrivileges').on('show.bs.modal', event => {
var button = $(event.relatedTarget); // Button that triggered the modal
var id = parseInt( button.data('id') ); // category_id from data-id
// var modal = $(this); // modal object
// update modal literature
// ---
$('#managePrivileges .modal-title').html( // modal title
(id) ? 'Ενημέρωση Επιπέδου Πρόσβασης' : 'Δημιουργία Επιπέδου Πρόσβασης'
);
$('#managePrivileges form input[name=id]').val( id ); // category id (hidden)
$('#managePrivileges form input[name=label]').val( // category label
(id) ? privilege_record(id).label : ""
);
prepare_included_element(id); // prepare