AutorÃa | Ultima modificación | Ver Log |
define(['jquery', 'jqueryui', 'core/log', 'core/ajax', 'core/notification', 'core/modal_events','block_dash/preferences_modal', 'block_dash/datepicker', 'block_dash/select2', 'core/fragment', 'core/templates'],function($, UI, Log, Ajax, Notification, ModalEvents, PreferencesModal, DatePicker, Select2, Fragment, Templates) {var DashInstance = function(root, blockInstanceId, blockContextid, editing, istotara, pagelayout, pagecontext) {this.root = $(root);this.blockInstanceId = blockInstanceId;this.blockContextid = blockContextid;this.currentPage = 0;this.blockPreferencesModal = null;this.editing = editing;this.sortField = null;this.sortDirections = {};this.isTotara = istotara;this.pageLayout = pagelayout;this.pageContext = pagecontext;this.init();};DashInstance.prototype.BLOCK_CONTENT_SELECTOR = '.dash-block-content';DashInstance.prototype.FILTER_FORM_SELECTOR = '.filter-form';DashInstance.prototype.init = function() {Log.debug('Initializing dash instance', this);// Select datasource for configuration.if (this.getRoot().find('.dash-configuration-form').length > 0) {this.getRoot().find('.dash-configuration-form').removeClass('hide');this.getRoot().find('[data-target="subsource-config"] [type=radio], [name="config_data_source_idnumber"]').addClass('norefresh');// Hide the preference link for others.this.getRoot().find('.dash-edit-preferences').hide();// Select the parent datasource for the sub config.this.getRoot().on('change', '[data-target="subsource-config"] [type=radio]', function(e) {var subConfig;if (e.target.closest('[data-target="subsource-config"]')) {subConfig = e.target.closest('[data-target="subsource-config"]');if (subConfig.parentNode !== null) {var dataSource = subConfig.parentNode.querySelector('[name="config_data_source_idnumber"]');dataSource.click(); // = true;}}}.bind(this));this.getRoot().find('.dash-configuration-form [name="config_data_source_idnumber"]').on('change', function() {var dataSource = this.getRoot().find('.dash-configuration-form');var formData = $(dataSource).find('form').serialize();// Now we can continue...Ajax.call([{methodname: 'block_dash_submit_preferences_form',args: {contextid: this.blockContextid,jsonformdata: JSON.stringify(formData)},done: function() {// Hide the preference link for others.this.getRoot().find('.dash-edit-preferences').show();this.refresh();}.bind(this),}])[0].fail(Notification.exception);}.bind(this));}this.initDatePickers();this.initSelect2();if (this.editing) {this.blockPreferencesModal = new PreferencesModal(this.getRoot().find('.dash-edit-preferences'),this.blockContextid, function() {// Preferences changed, go back to first page.this.currentPage = 0;this.refresh();}.bind(this));}this.getRoot().on('change', 'select:not(.norefresh), input:not(.select2-search__field, .norefresh)',function(e) {e.preventDefault();Log.debug('Submitting filter form');Log.debug(e);Log.debug($(e.target).serializeArray());// Filter results, go back to first page.this.currentPage = 0;this.refresh();}.bind(this));this.getRoot().on('submit', '.downloadreport .reportoption form', function(e) {e.preventDefault();let params = new URLSearchParams($(e.target).serialize());let sortDirection = null;if (this.sortField && this.sortDirections.hasOwnProperty(this.sortField)) {sortDirection = this.sortDirections[this.sortField];}var args = {'download' : params.get('download'),"block_instance_id": this.blockInstanceId,"filter_form_data": JSON.stringify(this.getFilterForm().serializeArray()),"page": this.currentPage,"sort_field": this.sortField,"sort_direction": sortDirection,};let url = M.cfg.wwwroot + '/blocks/dash/download.php';// Create a new form element.const form = $('<form>', {method: 'post',action: url,target: '_self',});// Add input fields with your dataform.append($('<input>', { type: 'hidden', name: 'download', value: args.download }));form.append($('<input>', { type: 'hidden', name: 'block_instance_id', value: args.block_instance_id }));form.append($('<input>', { type: 'hidden', name: 'filter_form_data', value: args.filter_form_data }));form.append($('<input>', { type: 'hidden', name: 'page', value: args.page }));form.append($('<input>', { type: 'hidden', name: 'sort_field', value: args.sort_field }));form.append($('<input>', { type: 'hidden', name: 'sort_direction', value: args.sort_direction }));// Append the form to the body and submit itform.appendTo('body').submit();}.bind(this));// Adding support for tab filters.this.getRoot().on('click', 'button.tab-filter', function(e) {e.preventDefault();var elem = $(e.currentTarget);var value = $(e.currentTarget).attr('data-value');var select = $(e.currentTarget).parents('.sort-group').find('select');var prevVal = select.val();// Remove checked is already checked.if (elem.hasClass('is-checked')) {elem.removeClass('is-checked');elem.removeClass('btn-primary');if (select.prop('multiple')) {var index = prevVal.indexOf(value.toString());if (index > -1) {prevVal.splice(index, 1);value = prevVal;}}} else {elem.addClass('is-checked');elem.addClass('btn-primary');if (select.prop('multiple')) {prevVal.push(value);value = prevVal;}}// Set value for select.select.val(value);// Filter results, go back to first page.this.currentPage = 0;this.refresh();}.bind(this));this.getBlockContentArea().on('click', '.page-link', function(e) {e.preventDefault();this.currentPage = $(e.target).data('page');this.refresh();}.bind(this));this.getBlockContentArea().on('click', '.dash-sort', function(e) {const $target = $(e.target);this.sortField = $target.data('sort');// Set sorting to asc by default.if (!this.sortDirections.hasOwnProperty(this.sortField)) {this.sortDirections[this.sortField] = 'asc';} else {// Toggle sort direction on field.this.sortDirections[this.sortField] = this.sortDirections[this.sortField] === 'asc' ? 'desc' : 'asc';}this.refresh();}.bind(this));if (this.isTotara) {this.setDynamicTable();}};/*** Get the root element of this dash instance.** @method getRoot* @return {object} jQuery object*/DashInstance.prototype.getRoot = function() {return this.root;};/*** Get the content element of this dash instance.** @method getRoot* @return {object} jQuery object*/DashInstance.prototype.getBlockContentArea = function() {return this.getRoot().find(this.BLOCK_CONTENT_SELECTOR);};/*** Get filter form element.** @returns {object} jQuery object*/DashInstance.prototype.getFilterForm = function() {return this.getRoot().find(this.FILTER_FORM_SELECTOR);};DashInstance.prototype.getBlockContent = function() {let sortDirection = null;if (this.sortField && this.sortDirections.hasOwnProperty(this.sortField)) {sortDirection = this.sortDirections[this.sortField];}var request = {methodname: 'block_dash_get_block_content',args: {"block_instance_id": this.blockInstanceId,"filter_form_data": JSON.stringify(this.getFilterForm().serializeArray()),"page": this.currentPage,"sort_field": this.sortField,"sort_direction": sortDirection,"pagelayout" : this.pageLayout,"pagecontext" : this.pageContext,}};return Ajax.call([request])[0];};DashInstance.prototype.refresh = function() {this.getBlockContentArea().css('opacity', 0.5);this.getBlockContent().then(function(response) {this.getBlockContentArea().html(response.html);this.getBlockContentArea().css('opacity', 1);this.initDatePickers();this.initSelect2();if (response.scripts) {Templates.runTemplateJS($(response.scripts).html() || response.scripts);}}.bind(this)).catch(Notification.exception);};DashInstance.prototype.initDatePickers = function() {this.getRoot().find('.datepicker').datepicker2({autoclose: true,format: "dd/mm/yyyy"});};DashInstance.prototype.initSelect2 = function() {this.getRoot().find('.select2').each(function(index, element) {let placeholder = null;if ($(element).find("option[value='-1']")) {placeholder = {id: '-1', // The value of the option.text: $(element).find("option[value='-1']").text()};}$(element).select2({dropdownParent: this.getRoot(),allowClear: true,theme: 'bootstrap4',placeholder: placeholder}).on('select2:unselecting', function() {$(this).data('unselecting', true);}).on('select2:opening', function(e) {if ($(this).data('unselecting')) {$(this).removeData('unselecting');e.preventDefault();}});}.bind(this));};DashInstance.prototype.setDynamicTable = function() {$('body').delegate('[data-table-dynamic="true"] thead th a', 'click', function(e) {e.preventDefault();updateTable($(this));});$('body').delegate('.modal-body .paging a', 'click', function(e) {e.preventDefault();updateTable($(this));});var updateTable = function(element) {var table = element.parents('.modal-body').find('table');var href = element.attr('href');var params = new URL(href).searchParams;var page = params.get('page');var sortfield = params.get('tsort');if (sortfield == '') {sortfield = table.data('table-sort');}var tablehandler = table.data('table-handler');var filter = table.data('table-filter');var uniqueid = table.data('table-uniqueid');var context = table.data('table-context');var data = {handler: tablehandler,filter: filter,uniqueid: uniqueid,sort: sortfield,page: page};Fragment.loadFragment('block_dash', 'loadtable', context, data).then((html, js) => {$('.modal-body').html(html);Templates.runTemplateJS(js);return html;}).catch(Notification.exception);};};return DashInstance;});