Files
iD/modules/ui/disclosure.js
2016-10-04 21:15:30 -04:00

73 lines
1.6 KiB
JavaScript

import * as d3 from 'd3';
import { utilRebind } from '../util/rebind';
import { uiToggle } from './toggle';
export function uiDisclosure() {
var dispatch = d3.dispatch('toggled'),
title,
expanded = false,
content = function () {};
var disclosure = function(selection) {
var hideToggle = selection.selectAll('.hide-toggle')
.data([0]);
hideToggle = hideToggle.enter()
.append('a')
.attr('href', '#')
.attr('class', 'hide-toggle')
.merge(hideToggle);
hideToggle
.text(title)
.on('click', toggle)
.classed('expanded', expanded);
var wrap = selection.selectAll('div')
.data([0]);
wrap = wrap.enter()
.append('div')
.merge(wrap);
wrap
.classed('hide', !expanded)
.call(content);
function toggle() {
expanded = !expanded;
hideToggle.classed('expanded', expanded);
wrap.call(uiToggle(expanded));
dispatch.call('toggled', this, expanded);
}
};
disclosure.title = function(_) {
if (!arguments.length) return title;
title = _;
return disclosure;
};
disclosure.expanded = function(_) {
if (!arguments.length) return expanded;
expanded = _;
return disclosure;
};
disclosure.content = function(_) {
if (!arguments.length) return content;
content = _;
return disclosure;
};
return utilRebind(disclosure, dispatch, 'on');
}