Path: blob/master/webroot/rsrc/js/core/MultirowRowManager.js
12241 views
/**1* @requires javelin-install2* javelin-stratcom3* javelin-dom4* javelin-util5* @provides multirow-row-manager6* @javelin7*/8910/**11* Give a MultirowRowManager a table DOM elem to manage.12* You can add rows, and provide a given ID if you like.13* You can update rows by ID.14* Rows are automatically equipped with a removal button.15* You can listen to the 'row-removed' event on the Manager to get16* notifications of these row removals, with the DOM id of the removed17* row as event data.18*/19JX.install('MultirowRowManager', {20/**21* @param DOM element <table> root Container for rows22*/23construct : function(root, minRows) {24this._root = root;25this._rows = [];2627if (typeof minRows !== 'undefined') {28this._minRows = minRows;29} else {30this._minRows = 1;31}3233JX.DOM.listen(34this._root,35'click',36JX.MultirowRowManager._removeSigil,37JX.bind(this, this._onrowremoved));38},3940members : {41_count : 0,42_nextID : 0,43_root : null,44_rows : null,4546_generateRowID : function() {47return '' + this._nextID++;48},4950_wrapRowContents : function(row_id, row_contents) {51var row = JX.$N('tr',52{ sigil : JX.MultirowRowManager.getRowSigil(),53meta : { multirow_row_manager_row_id : row_id }54},55row_contents);5657var removeButton = JX.$N(58'td',59{ className: 'remove-column' },60JX.$N(61'a',62{ className: 'button simple',63sigil: JX.MultirowRowManager._removeSigil64},65'Remove'));6667JX.DOM.appendContent(row, removeButton);68return row;69},7071getRowID : function(row) {72return JX.Stratcom.getData(row).multirow_row_manager_row_id;73},74/**75* @param row_contents [DOM elements] New contents of row76* @param row_id row ID to update, will throw if this row has been removed77*/78updateRow : function(row_id, row_contents) {79if (__DEV__) {80if (typeof this._rows[row_id] === 'undefined') {81throw new Error('JX.MultirowRowManager.updateRow(row_id, ' +82'row_contents): provided row id does not exist.' +83' Use addRow to create a new row and make sure ' +84'not to update rows that have been deleted.');85}86}87var old_row = this._rows[row_id];88var new_row = this._wrapRowContents(row_id, row_contents);89JX.copy(JX.Stratcom.getData(new_row), JX.Stratcom.getData(old_row));9091JX.DOM.replace(old_row, new_row);92this._rows[row_id] = new_row;9394this._oncountchanged(); // Fix the new button.95return new_row;96},9798addRow : function(row_contents) {99var row_id = this._generateRowID();100var row = this._wrapRowContents(row_id, row_contents);101JX.DOM.appendContent(this._root, row);102103this._count++;104this._oncountchanged();105106this._rows[row_id] = row;107return row;108},109_onrowremoved : function(e) {110if (!JX.Stratcom.getData(e.getTarget()).enabled) {111return;112}113var row = e.getNode(JX.MultirowRowManager.getRowSigil());114var row_id = this.getRowID(row);115delete this._rows[row_id];116JX.DOM.remove(row);117118this._count--;119this._oncountchanged();120this.invoke('row-removed', row_id);121},122123_oncountchanged : function() {124var buttons = JX.DOM.scry(125this._root,126'a',127JX.MultirowRowManager._removeSigil);128129var disable = (this._minRows >= 0 && this._count <= this._minRows);130for (var i = 0; i < buttons.length; i++) {131var button = buttons[i];132JX.DOM.alterClass(button, 'disabled', disable);133JX.Stratcom.getData(button).enabled = !disable;134}135}136},137events : ['row-removed'],138statics : {139getRowSigil : function() {140return 'tools-multirow-row-manager-row';141},142_removeSigil : 'tools-multirow-row-manager-row-remove'143}144});145146147