diff --git a/js/datatable.js b/js/datatable.js new file mode 100644 index 000000000..4b75ede40 --- /dev/null +++ b/js/datatable.js @@ -0,0 +1,230 @@ +// jQuery UI style "widget" for selecting and sorting "fields" +$(function() +{ + // the widget definition, where "itop" is the namespace, + // "datatable" the widget name + $.widget( "itop.datatable", + { + // default options + options: + { + sPersistentId: '', + sFilter: '', + oColumns: {}, + sSelectMode: '', + sViewLink: 'true', + iNbObjects: 0, + iDefaultPageSize: -1, + iPageSize: -1, + iPageIndex: 0, + oClassAliases: {}, + sTableId : null, + oExtraParams: {}, + sRenderUrl: 'index.php', + oRenderParameters: {}, + oDefaultSettings: {}, + oLabels: { moveup: 'Move Up', movedown: 'Move Down' } + }, + + // the constructor + _create: function() + { + this.aDlgStateParams = ['iDefaultPageSize', 'oColumns']; + + this.element + .addClass('itop-datatable'); + + var me = this; + var sId = new String(this.element.attr('id')); + var sListId = sId.replace('datatable_', ''); + var bViewLink = (this.options.sViewLink == 'true'); + $('#sfl_'+sListId).fieldsorter({hasKeyColumn: bViewLink, labels: this.options.oLabels, fields: this.options.oColumns, onChange: function() { me._onSpecificSettings(); } }); + $('#datatable_dlg_'+sListId).find('input[name=page_size]').click(function() { me._onSpecificSettings(); }); + $('#datatable_dlg_'+sListId).find('input[name=save_settings]').click(function() { me._updateSaveScope(); }); + this.element.find('.itop_popup > ul li').popupmenu(); + this._updateSaveScope(); + this._saveDlgState(); + }, + + // called when created, and later when changing options + _refresh: function() + { + oParams = this.options.oRenderParameters; + oParams.operation = 'datatable'; + + oParams.filter = this.options.sFilter; + oParams.extra_param = this.options.oExtraParams; + oParams.start = 0; + oParams.end = this.options.iPageSize; + oParams.select_mode = this.options.sSelectMode; + oParams.display_key = this.options.sViewLink; + oParams.class_aliases = this.options.oClassAliases; + oParams.columns = this.options.oColumns; + + var sId = new String(this.element.attr('id')); + var sListId = sId.replace('datatable_', ''); + oParams.list_id = sListId; + var me = this; + $.post(this.options.sRenderUrl, oParams, function(data) { + // Nasty workaround to clear the pager's state for paginated lists !!! + // See jquery.tablesorter.pager.js / saveParams / restoreParams + if (window.pager_params) + { + window.pager_params['pager'+sListId] = undefined; + } + // End of workaround + + me.element.find('.datacontents').html(data); + }, 'html' ); + + }, + _useDefaultSettings: function(bResetAll) + { + var oParams = this.options.oRenderParameters; + oParams.operation = 'datatable_reset_settings'; + + oParams.table_id = this.options.sTableId; + oParams.defaults = bResetAll; + oParams.class_aliases = this.options.oClassAliases; + + var me = this; + $.post(this.options.sRenderUrl, oParams, function(data) { + // Do nothing... + }, 'html' ); + }, + _saveSettings: function(bSaveAsDefaults) + { + var oParams = this.options.oRenderParameters; + oParams.operation = 'datatable_save_settings'; + + oParams.page_size = this.options.iPageSize; + oParams.table_id = this.options.sTableId; + oParams.defaults = bSaveAsDefaults; + oParams.class_aliases = this.options.oClassAliases; + oParams.columns = this.options.oColumns; + + var me = this; + $.post(this.options.sRenderUrl, oParams, function(data) { + // Do nothing... + }, 'html' ); + }, + onDlgOk: function() + { + var oOptions = {}; + var sId = new String(this.element.attr('id')); + var sListId = sId.replace('datatable_', ''); + oSettings = $('#datatable_dlg_'+sListId).find('input[name=settings]:checked'); + if (oSettings.val() == 'defaults') + { + oOptions = { iPageSize: this.options.oDefaultSettings.iDefaultPageSize, + oColumns: this.options.oDefaultSettings.oColumns, + }; + } + else + { + var oDisplayColumns = {}; + var iColIdx = 0; + var iSortIdx = 0; + var sSortDirection = 'asc'; + var oColumns = $('#datatable_dlg_'+sListId).find(':itop-fieldsorter').fieldsorter('get_params'); + var iPageSize = $('#datatable_dlg_'+sListId+' input[name=page_size]').val(); + + oOptions = {oColumns: oColumns, iPageSize: iPageSize }; + } + this._setOptions(oOptions); + + // Check if we need to save the settings or not... + var oSaveCheck = $('#datatable_dlg_'+sListId).find('input[name=save_settings]'); + var oSaveScope = $('#datatable_dlg_'+sListId).find('input[name=scope]:checked'); + if (oSaveCheck.attr('checked')) + { + if (oSettings.val() == 'defaults') + { + this._useDefaultSettings((oSaveScope.val() == 'defaults')); + } + else + { + this._saveSettings((oSaveScope.val() == 'defaults')); + } + } + this._saveDlgState(); + }, + onDlgCancel: function() + { + this._restoreDlgState(); + }, + _onSpecificSettings: function() + { + var sId = new String(this.element.attr('id')); + var sListId = sId.replace('datatable_', ''); + $('#datatable_dlg_'+sListId).find('input.specific_settings').attr('checked', 'checked'); + }, + _updateSaveScope: function() + { + var sId = new String(this.element.attr('id')); + var sListId = sId.replace('datatable_', ''); + var oSaveCheck = $('#datatable_dlg_'+sListId).find('input[name=save_settings]'); + if (oSaveCheck.attr('checked')) + { + $('#datatable_dlg_'+sListId).find('input[name=scope]').removeAttr('disabled'); + } + else + { + $('#datatable_dlg_'+sListId).find('input[name=scope]').attr('disabled', 'disabled'); + } + }, + // events bound via _bind are removed automatically + // revert other modifications here + destroy: function() + { + this.element + .removeClass('itop-datatable'); + + var sId = new String(this.element.attr('id')); + var sListId = sId.replace('datatable_', ''); + $('#sfl_'+sListId).remove(); + + // call the original destroy method since we overwrote it + $.Widget.prototype.destroy.call( this ); + }, + // _setOptions is called with a hash of all options that are changing + _setOptions: function() + { + // in 1.9 would use _superApply + $.Widget.prototype._setOptions.apply( this, arguments ); + this._refresh(); + }, + // _setOption is called for each individual option that is changing + _setOption: function( key, value ) + { + // in 1.9 would use _super + $.Widget.prototype._setOption.call( this, key, value ); + }, + _saveDlgState: function() + { + this.originalState = {}; + for(k in this.aDlgStateParams) + { + this.originalState[this.aDlgStateParams[k]] = this.options[this.aDlgStateParams[k]]; + } + var sId = new String(this.element.attr('id')); + var sListId = sId.replace('datatable_', ''); + this.originalState.oFields = $('#datatable_dlg_'+sListId).find(':itop-fieldsorter').fieldsorter('get_params'); + }, + _restoreDlgState: function() + { + var sId = new String(this.element.attr('id')); + var sListId = sId.replace('datatable_', ''); + var dlgElement = $('#datatable_dlg_'+sListId); + + for(k in this.aDlgStateParams) + { + this._setOption(this.aDlgStateParams[k], this.originalState[this.aDlgStateParams[k]]); + } + + dlgElement.find('input[name=page_size]').val(this.originalState.iDefaultPageSize); + + dlgElement.find(':itop-fieldsorter').fieldsorter('option', { fields: this.originalState.oFields }); + } + }); +}); \ No newline at end of file diff --git a/js/field_sorter.js b/js/field_sorter.js new file mode 100644 index 000000000..2a5a5816e --- /dev/null +++ b/js/field_sorter.js @@ -0,0 +1,277 @@ +// jQuery UI style "widget" for selecting and sorting "fields" +$(function() +{ + // the widget definition, where "itop" is the namespace, + // "fieldsorter" the widget name + $.widget( "itop.fieldsorter", + { + // default options + options: + { + fields: {}, + labels: { moveup: 'Move Up', movedown: 'Move Down' }, + onChange: null + }, + + // the constructor + _create: function() + { + var me = this; + + this.element + .addClass('itop-fieldsorter'); + + var me = this; + this._initFields(); + + var width = 10+this.element.width(); + this.moveup_btn = $(''); + this.movedown_btn = $(''); + this.element.wrap('
'); + this.element.parent().append(this.moveup_btn).append(this.movedown_btn); + this.moveup_btn.click(function() { me._moveUp(); }); + this.movedown_btn.click(function() { me._moveDown(); }); + }, + + // called when created, and later when changing options + _refresh: function() + { + this.element.find('li').remove(); + this._initFields(); + }, + _initFields: function() + { + var me = this; + for(alias in this.options.fields) + { + for(k in this.options.fields[alias]) + { + var f = this.options.fields[alias][k]; + if (f.label != '') + { + var sChecked = ''; + if (f.checked) sChecked = ' checked'; + var sDisabled = ''; + if (f.disabled) sDisabled = ' disabled'; + var sSortOrder = ''; + + if (f.sort) + { + var sHidden = ' sort_hidden'; + + if (f.checked) sHidden = ''; + + if (f.sort == 'none') + { + sSortOrder = ' '; + } + else if (f.sort == 'asc') + { + sSortOrder = ' '; + } + else if (f.sort == 'desc') + { + sSortOrder = ' '; + } + } + var field = $('