// jQuery UI style "widget" for managing 1:n links "in-place" $(function() { // the widget definition, where "itop" is the namespace, // "directlinks" the widget name $.widget( "itop.directlinks", { // default options options: { input_name: '', class_name: '', att_code: '', submit_to: '../pages/ajax.render.php', submit_parameters: {}, labels: { 'delete': 'Delete', modify: 'Modify...' , creation_title: 'Creation of a new object...' , create: 'Create...' } }, // the constructor _create: function() { var me = this; this.id = this.element.attr('id'); this.element .addClass('itop-directlinks'); this.datatable = this.element.find('table.listResults'); this.deleteBtn = $(''); this.modifyBtn = $(''); this.createBtn = $(''); this.indicator = $(''); this.inputToBeCreated = $(''); this.toBeCreated = {}; this.inputToBeDeleted = $(''); this.toBeDeleted = []; this.element .after(this.inputToBeCreated) .after(this.inputToBeDeleted) .after('      ') .after(this.indicator).after(this.createBtn).after('   ') .after(this.modifyBtn).after('   ') .after(this.deleteBtn); this.element.find('.selectList'+this.id).bind('change', function() { me._updateButtons(); }); this.deleteBtn.click(function() { $('.selectList'+me.id+':checked', me.element).each( function() { me._deleteRow($(this)); }); }); this.createBtn.click(function() { me._createRow(); }); this.modifyBtn.hide(); //hidden for now since it's not yet implemented this._updateButtons(); }, // called when created, and later when changing options _refresh: function() { this._updateButtons(); }, // events bound via _bind are removed automatically // revert other modifications here destroy: function() { this.element .removeClass('itop-directlinks'); // 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 ); }, // _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 ); if (key == 'fields') this._refresh(); }, _updateButtons: function() { var oChecked = $('.selectList'+this.id+':checked', this.element); switch(oChecked.length) { case 0: this.deleteBtn.attr('disabled', 'disabled'); this.modifyBtn.attr('disabled', 'disabled'); break; case 1: this.deleteBtn.removeAttr('disabled'); this.modifyBtn.removeAttr('disabled'); break; default: this.deleteBtn.removeAttr('disabled'); this.modifyBtn.attr('disabled', 'disabled'); break; } }, _updateTable: function() { var me = this; this.datatable.trigger("update").trigger("applyWidgets"); this.datatable.tableHover(); this.datatable.find('.selectList'+this.id).bind('change', function() { me._updateButtons(); }); }, _updateDlgSize: function() { this.oDlg.dialog('option', { position: { my: "center", at: "center", of: window }}); }, _createRow: function() { this.createBtn.attr('disabled', 'disabled'); this.indicator.html(''); oParams = this.options.submit_parameters; oParams.operation = 'createObject'; oParams['class'] = this.options.class_name; oParams.real_class = ''; oParams.att_code = this.options.att_code; oParams.iInputId = this.id; var me = this; $.post(this.options.submit_to, oParams, function(data){ me.oDlg = $('
'); $('body').append(me.oDlg); me.oDlg.html(data); me.oDlg.find('form').removeAttr('onsubmit').bind('submit', function() { me._onCreateRow(); return false; } ); me.oDlg.find('button.cancel').unbind('click').click( function() { me.oDlg.dialog('close'); } ); me.oDlg.dialog({ title: me.options.labels['creation_title'], modal: true, width: 'auto', height: 'auto', position: { my: "center", at: "center", of: window }, close: function() { me._onDlgClose(); } }); me.indicator.html(''); me.createBtn.removeAttr('disabled'); me._updateDlgSize(); }); }, subclassSelected: function() { var sRealClass = this.oDlg.find('select[name="class"]').val(); oParams = this.options.submit_parameters; oParams.operation = 'createObject'; oParams['class'] = this.options.class_name; oParams.real_class = sRealClass; oParams.att_code = this.options.att_code; oParams.iInputId = this.id; var me = this; me.oDlg.find('button').attr('disabled', 'disabled'); me.oDlg.find('span.indicator').html(''); $.post(this.options.submit_to, oParams, function(data){ me.oDlg.html(data); me.oDlg.find('form').removeAttr('onsubmit').bind('submit', function() { me._onCreateRow(); return false; } ); me.oDlg.find('button.cancel').unbind('click').click( function() { me.oDlg.dialog('close'); } ); me._updateDlgSize(); }); }, _onCreateRow: function() { // Validate the form var sFormId = this.oDlg.find('form').attr('id'); if (CheckFields(sFormId, true)) { // Gather the values from the form oParams = this.options.submit_parameters; var oValues = {}; this.oDlg.find(':input').each( function() { if (this.name != '') { oParams[this.name] = this.value; oValues[this.name] = this.value; } }); var nextIdx = 0; for(k in this.toBeCreated) { nextIdx++; } nextIdx++; this.toBeCreated[nextIdx] = oValues; this.inputToBeCreated.val(JSON.stringify(this.toBeCreated)); this.oDlg.dialog('close'); oParams = this.options.submit_parameters; oParams.operation = 'getLinksetRow'; oParams['class'] = this.options.class_name; oParams.att_code = this.options.att_code; oParams.iInputId = this.id; oParams.tempId = nextIdx; var me = this; this.createBtn.attr('disabled', 'disabled'); this.indicator.html(''); $.post(this.options.submit_to, oParams, function(data){ me.datatable.find('tbody').append(data); me._updateTable(); me.indicator.html(''); me.createBtn.removeAttr('disabled'); }); } }, _onDlgClose: function() { this.oDlg.remove(); this.oDlg = null; }, _deleteRow: function(oCheckbox) { var iObjKey = parseInt(oCheckbox.val(), 10); // Number in base 10 if (iObjKey > 0) { // Existing objet: add it to the "to be deleted" list this.toBeDeleted.push(iObjKey); this.inputToBeDeleted.val(JSON.stringify(this.toBeDeleted)); } else { // Object to be created, just remove it from the "to be created" list this.toBeCreated[-iObjKey] = undefined; this.inputToBeCreated.val(JSON.stringify(this.toBeCreated)); } // Now remove the row from the table oRow = oCheckbox.closest('tr'); oRow.remove(); this._updateButtons(); this._updateTable(); } }); });