[ADD] support for generic alternative content in right-hand side

dd.alternatives triggers "widget", each (dt, dd) is an alternative with
dt being the alternative (and radio button) label and dd being the
actual content to display on selection.
This commit is contained in:
Xavier Morel
2015-04-16 11:57:02 +02:00
parent eb20f603b5
commit 15c51c9845
3 changed files with 165 additions and 32 deletions
+14
View File
@@ -153,3 +153,17 @@ blockquote.highlights {
margin-bottom: 0;
text-align: center;
}
/*
lists of alternatives
*/
.alternatives-controls label {
display: block;
}
dl.alternatives > dt,
dl.alternatives > dd {
display: none;
}
dl.alternatives > dd {
margin-left: 0;
}
+50 -2
View File
@@ -1,5 +1,52 @@
(function () {
document.addEventListener('DOMContentLoaded', function () {
alternatives()
checks_handling();
});
/** alternatives display:
* - prepend control for each <dt>
* - radio input with link to following dd
* - label is <dt> content
* - hide all first-level dt and dd (CSS)
* - on change
* - hide all dds
* - show dd corresponding to the selected radio
* - automatically select first control on startup
*/
function alternatives() {
$('dl.alternatives').each(function (index) {
var $list = $(this),
$contents = $list.children('dd');
var $controls = $('<div class="alternatives-controls">').append(
$list.children('dt').map(function () {
var label = document.createElement('label'),
input = document.createElement('input');
input.setAttribute('type', 'radio');
input.setAttribute('name', 'alternatives-' + index);
var sibling = this;
while ((sibling = sibling.nextSibling) && sibling.nodeType !== 1);
input.content = sibling;
label.appendChild(input);
label.appendChild(document.createTextNode(' '));
label.appendChild(document.createTextNode(this.textContent));
return label;
}))
.insertBefore($list)
.on('change', 'input', function (e) {
// change event triggers only on newly selected input, not
// on the one being deselected
$contents.css('display', '');
var content = e.target.content;
content && (content.style.display = 'block');
})
.find('input:first').click();
});
}
function checks_handling() {
var $section = $('.checks-handling');
if (!$section.length) { return; }
@@ -9,7 +56,7 @@
while (this.firstChild) {
this.removeChild(this.firstChild)
}
$('<label style="display: block;">')
.append('<input type="radio" name="checks-handling">')
.append(' ')
@@ -28,5 +75,6 @@
}).eq(idx).prop('checked', true);
$ul.nextAll('div').hide().eq(idx).show();
}
});
}
})();