123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- // jQuery UI style "widget" for managing the "xlsx-exporter"
- $(function()
- {
- // the widget definition, where "itop" is the namespace,
- // "xlsxexporter" the widget name
- $.widget( "itop.xlsxexporter",
- {
- // default options
- options:
- {
- filter: '',
- ajax_page_url: '',
- labels: {dialog_title: 'Excel Export', export_button: 'Export', cancel_button: 'Cancel', download_button: 'Download', complete: 'Complete', cancelled: 'Cancelled' }
- },
-
- // the constructor
- _create: function()
- {
- this.element
- .addClass('itop-xlsxexporter');
-
- this.sToken = null;
- this.ajaxCall = null;
- this.oProgressBar = $('.progress-bar', this.element);
- this.oStatusMessage = $('.status-message', this.element);
- $('.progress', this.element).hide();
- $('.statistics', this.element).hide();
-
- var me = this;
-
- this.element.dialog({
- title: this.options.labels.dialog_title,
- modal: true,
- width: 500,
- height: 300,
- buttons: [
- { text: this.options.labels.export_button, 'class': 'export-button', click: function() {
- me._start();
- } },
- { text: this.options.labels.cancel_button, 'class': 'cancel-button', click: function() {
- $(this).dialog( "close" );
- } },
- ],
- close: function() { me._abort(); $(this).remove(); }
- });
- },
- // events bound via _bind are removed automatically
- // revert other modifications here
- destroy: function()
- {
- this.element
- .removeClass('itop-xlsxexporter');
- },
- // _setOptions is called with a hash of all options that are changing
- _setOptions: function()
- {
- this._superApply(arguments);
- },
- // _setOption is called for each individual option that is changing
- _setOption: function( key, value )
- {
- this._superApply(arguments);
- },
- _start: function()
- {
- var me = this;
- $('.export-options', this.element).hide();
- $('.progress', this.element).show();
- var bAdvanced = $('#export-advanced-mode').prop('checked');
- this.bAutoDownload = $('#export-auto-download').prop('checked');
- $('.export-button', this.element.parent()).button('disable');
-
- this.oProgressBar.progressbar({
- value: 0,
- change: function() {
- var progressLabel = $('.progress-label', me.element);
- progressLabel.text( $(this).progressbar( "value" ) + "%" );
- },
- complete: function() {
- var progressLabel = $('.progress-label', me.element);
- progressLabel.text( me.options.labels['complete'] );
- }
- });
- //TODO disable the "export" button
- this.ajaxCall = $.post(this.options.ajax_page_url, {filter: this.options.filter, operation: 'xlsx_start', advanced: bAdvanced}, function(data) {
- this.ajaxCall = null;
- if (data && data.status == 'ok')
- {
- me.sToken = data.token;
- me._run();
- }
- else
- {
- if (data == null)
- {
- me.oStatusMessage.html('Unexpected error (operation=xlsx_start).');
- me.oProgressBar.progressbar({value: 100});
- }
- else
- {
- me.oStatusMessage.html(data.message);
- }
- }
- }, 'json');
- },
- _abort: function()
- {
- $('.cancel-button', this.element.parent()).button('disable');
- this.oStatusMessage.html(this.options.labels['cancelled']);
- this.oProgressBar.progressbar({value: 100});
- if (this.sToken != null)
- {
- // Cancel the operation in progress... or cleanup a completed export
- // TODO
- if (this.ajaxCall)
- {
- this.ajaxCall.abort();
- this.ajaxClass = null;
- }
- var me = this;
- $.post(this.options.ajax_page_url, {token: this.sToken, operation: 'xlsx_abort'}, function(data) {
- me.sToken = null;
- });
- }
- },
- _run: function()
- {
- var me = this;
- this.ajaxCall = $.post(this.options.ajax_page_url, {token: this.sToken, operation: 'xlsx_run'}, function(data) {
- this.ajaxCall = null;
- if (data == null)
- {
- me.oStatusMessage.html('Unexpected error (operation=xlsx_run).');
- me.oProgressBar.progressbar({value: 100});
- }
- else if (data.status == 'error')
- {
- me.oStatusMessage.html(data.message);
- me.oProgressBar.progressbar({value: 100});
- }
- else if (data.status == 'done')
- {
- me.oStatusMessage.html(data.message);
- me.oProgressBar.progressbar({value: 100});
- $('.stats-data', this.element).html(data.statistics);
- me._on_completion();
- }
- else
- {
- // continue running the export in the background
- me.oStatusMessage.html(data.message);
- me.oProgressBar.progressbar({value: data.percentage});
- me._run();
- }
- }, 'json');
- },
- _on_completion: function()
- {
- var me = this;
- $('.progress', this.element).html('<form class="download-form" method="post" action="'+this.options.ajax_page_url+'"><input type="hidden" name="operation" value="xlsx_download"/><input type="hidden" name="token" value="'+this.sToken+'"/><button type="submit">'+this.options.labels['download_button']+'</button></form>');
- $('.download-form button', this.element).button().click(function() { me.sToken = null; window.setTimeout(function() { me.element.dialog('close'); }, 100); return true;});
- if (this.bAutoDownload)
- {
- me.sToken = null;
- $('.download-form').submit();
- this.element.dialog('close');
- }
- else
- {
- $('.statistics', this.element).show();
- $('.statistics .stats-toggle', this.element).click(function() { $(this).toggleClass('closed'); });
- }
- }
- });
- });
- function XlsxExportDialog(sFilter)
- {
- var sUrl = GetAbsoluteUrlAppRoot()+'pages/ajax.render.php';
- $.post(sUrl, {operation: 'xlsx_export_dialog', filter: sFilter}, function(data) {
- $('body').append(data);
- });
- }
|