// 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 * -> choose selected parent * @param may_included (array): array of possible included privileges * @param selected (int): selected included privilege */ function set_included_options(may_included, selected) { // sort parents by breadcrumb // parents.sort( compare_breadcrumb ); // remove any olded options from select2 $('#included_id option').each(function() { $(this).remove(); }); // first option is the root category $('#included_id').append('') // add all other parent options may_included.forEach( i => { $('#included_id').append(``); }); if (selected == -1) { // new category; remove any parent pre-selection $('#included_id').val(0).trigger('change'); } else { // category exists; choose selected parent $('#included_id').val(selected).trigger('change'); } } // When form is submited // ------------------------------------------------------------------------- $('#manageCategory form').submit( event => { event.preventDefault(); // prepare data to POST var data = { id: parseInt($('#manageCategory form input[name=id]').val()), label: $('#manageCategory form input[name=label]').val(), parent_id: parseInt($('#parent_id').select2('data')[0].id) }; // select action url (add or update) var request = '/admin/api/category/' + ((data.id == 0) ? 'add' : 'update'); // send POST request $.post(request, data) .done(function( data ) { $('#manageCategory').modal('hide'); // when done, close modal init_table(); // reload table of categories }); }); });