Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F75003614
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
Tue, Jul 30, 20:27
Size
3 KB
Mime Type
text/html
Expires
Thu, Aug 1, 20:27 (2 d)
Engine
blob
Format
Raw Data
Handle
19467119
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'
,
{},
JX
.
$N
(
'a'
,
{
className
:
"button"
,
sigil
:
JX
.
MultirowRowManager
.
_removeSigil
},
'-'
));
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
(
e
)
{
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