Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F75528977
MultirowRowManager.js
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Fri, Aug 2, 18:53
Size
4 KB
Mime Type
text/html
Expires
Sun, Aug 4, 18:53 (2 d)
Engine
blob
Format
Raw Data
Handle
19564235
Attached To
rPH Phabricator
MultirowRowManager.js
View Options
/**
* @requires javelin-install
* javelin-stratcom
* javelin-dom
* javelin-util
* @provides multirow-row-manager
* @javelin
*/
/**
* Give a MultirowRowManager a table DOM elem to manage.
* You can add rows, and provide a given ID if you like.
* You can update rows by ID.
* Rows are automatically equipped with a removal button.
* You can listen to the 'row-removed' event on the Manager to get
* notifications of these row removals, with the DOM id of the removed
* row as event data.
*/
JX.install('MultirowRowManager', {
/**
* @param DOM element <table> root Container for rows
*/
construct : function(root, minRows) {
this._root = root;
this._rows = [];
if (typeof minRows !== 'undefined') {
this._minRows = minRows;
} else {
this._minRows = 1;
}
JX.DOM.listen(
this._root,
'click',
JX.MultirowRowManager._removeSigil,
JX.bind(this, this._onrowremoved));
},
members : {
_count : 0,
_nextID : 0,
_root : null,
_rows : null,
_generateRowID : function() {
return '' + this._nextID++;
},
_wrapRowContents : function(row_id, row_contents) {
var row = JX.$N('tr',
{ sigil : JX.MultirowRowManager.getRowSigil(),
meta : { multirow_row_manager_row_id : row_id }
},
row_contents);
var removeButton = JX.$N(
'td',
{ className: 'remove-column' },
JX.$N(
'a',
{ className: 'button simple',
sigil: JX.MultirowRowManager._removeSigil
},
'Remove'));
JX.DOM.appendContent(row, removeButton);
return row;
},
getRowID : function(row) {
return JX.Stratcom.getData(row).multirow_row_manager_row_id;
},
/**
* @param row_contents [DOM elements] New contents of row
* @param row_id row ID to update, will throw if this row has been removed
*/
updateRow : function(row_id, row_contents) {
if (__DEV__) {
if (typeof this._rows[row_id] === 'undefined') {
throw new Error('JX.MultirowRowManager.updateRow(row_id, ' +
'row_contents): provided row id does not exist.' +
' Use addRow to create a new row and make sure ' +
'not to update rows that have been deleted.');
}
}
var old_row = this._rows[row_id];
var new_row = this._wrapRowContents(row_id, row_contents);
JX.copy(JX.Stratcom.getData(new_row), JX.Stratcom.getData(old_row));
JX.DOM.replace(old_row, new_row);
this._rows[row_id] = new_row;
this._oncountchanged(); // Fix the new button.
return new_row;
},
addRow : function(row_contents) {
var row_id = this._generateRowID();
var row = this._wrapRowContents(row_id, row_contents);
JX.DOM.appendContent(this._root, row);
this._count++;
this._oncountchanged();
this._rows[row_id] = row;
return row;
},
_onrowremoved : function(e) {
if (!JX.Stratcom.getData(e.getTarget()).enabled) {
return;
}
var row = e.getNode(JX.MultirowRowManager.getRowSigil());
var row_id = this.getRowID(row);
delete this._rows[row_id];
JX.DOM.remove(row);
this._count--;
this._oncountchanged();
this.invoke('row-removed', row_id);
},
_oncountchanged : function() {
var buttons = JX.DOM.scry(
this._root,
'a',
JX.MultirowRowManager._removeSigil);
var disable = (this._minRows >= 0 && this._count <= this._minRows);
for (var i = 0; i < buttons.length; i++) {
var button = buttons[i];
JX.DOM.alterClass(button, 'disabled', disable);
JX.Stratcom.getData(button).enabled = !disable;
}
}
},
events : ['row-removed'],
statics : {
getRowSigil : function() {
return 'tools-multirow-row-manager-row';
},
_removeSigil : 'tools-multirow-row-manager-row-remove'
}
});
Event Timeline
Log In to Comment