// Globals // ----------------------------------------------------------------------------- var categories = []; var privileges = []; var lessons = []; 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; }; } // Supplamentary functions // ----------------------------------------------------------------------------- // function for sorting an array by 'label' attribute // --- -- -- - - - function compare_label (a,b) { if ( a.label < b.label ) { return -1; } if ( a.label > b.label ) { return 1; } return 0; } // 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 lesson_record(id) { var record = 0; lessons.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(el) { var pub, del, edit; // preapre [show|hide]-file as reference if (el.status == 1) { pub = ''; } else { pub = ''; } del = ""; fast_edit = [ '' ].join('\n'); edit = [ '', '', '' ].join('\n'); return pub +' '+ fast_edit +' '+ edit +' '+ del; } $(document).ready(function() { // When document is ready // ------------------------------------------------------------------------- // inti category (select2) // ... $("#privilege_id").select2({ placeholder: 'Επίπεδο Πρόσβασης', width: '100%' }); /** init selec2 element (used to specify parent-category) * --- -- -- - - - */ $("#course_id").select2({ placeholder: 'Κεφάλαιο', dropdownParent: $('#manageLessons'), width: '100%', }); /** init_table * --- -- -- - - - * get categories * constuct categories array * render dataTable */ function init_table() { // get all categories from server (ajax) $.getJSON( "/admin/api/lessons") .done(function( json ) { // then ... // reset categories lessons.length = 0; // construct (new) categories data Object.keys(json).forEach( key => { el = json[key]; lessons.push({ id: parseInt(el.id), title: el.title, course_id: el.course_id, privilege_id: el.privilege_id, actions: create_actions_html(el) }); }); // sort by breadcrumb // categories.sort( compare_breadcrumb ); // destroy previous datatable table instances $('#dt-lessons').dataTable().fnClearTable(); $('#dt-lessons').dataTable().fnDestroy(); // (re-)create categories datatable table = $('#dt-lessons').DataTable({ language: { url: '/libs/DataTables/localization/Greek.json' }, data: lessons, ordering: false, columns: [ { data: 'id' }, { data: 'title' }, { data: 'course_id' }, { data: 'privilege_id' }, { data: 'actions' } ] }); }) .fail(function( jqxhr, textStatus, error ) { console.log( "Request Failed (" + error +")" ); }); } $.when( // when loaded posts and categories $.getJSON( "/admin/api/categories" ), $.getJSON( "/admin/api/privileges" ) ).done( function( categories_response, privileges_response ) { // construct categories data // --- Object.keys(categories_response[0]).forEach( key => { cat = categories_response[0][key]; categories.push({ id: cat.rec.id, label: cat.breadcrumb.replaceAll('\t', ' / ') }); }); categories.sort( compare_label ); // sort categories by breadcrumb // construct provileges data // --- Object.keys(privileges_response[0]).forEach( key => { priv = privileges_response[0][key]; privileges.push({ id: priv.id, label: priv.label }); }); privileges.sort( compare_label ); // sort categories by breadcrumb set_parent_options( $('#course_id'), categories ); set_parent_options( $('#privilege_id'), privileges ); init_table(); // init table on first run }); /** set_parent_options() * * -> create options for parents should be a select2 control * * @param parents (array): array of parents * @param selected (int): selected parent */ function set_parent_options(selector, list, selected_value = false) { list.forEach( li => { // attach options into for parents }) // /** prepare_parents_element() // * --- // * @param id (int) : id of selected category // * -> Get all posible parents // * -> call set_parent_options() to render the options // */ // function prepare_parents_element(id) { // var parents = []; // // if (id) { // get all possible parents // // // id-category and subcategories are fobiden parents // var forbiden = childs_of_parents(id); // forbiden.push(id); // // // filter catogories adn prepare parents // categories.forEach( el => { // if (!forbiden.includes(el.id)) { // parents.push({ // id: el.id, // breadcrumb: el.breadcrumb, // }); // } // }); // set_parent_options(parents, category_record(id).parent); // // // } else { // new record; all categories are possible parrents // categories.forEach( el => { // parents.push({ // id: el.id, // breadcrumb: el.breadcrumb, // }); // }) // set_parent_options(parents, -1); // } // } /** set_parent_options() * -> create options for parents