Files
iD/modules/ui/section.js
Quincy Morgan 2e238b8218 Fix JS error on clicking review request
Give different instances of the raw tag editor distinct classes and disclosure states
Correctly expand raw tags section by default when selecting a feature with a fallback preset
Fix raw tag editor tests
2020-02-26 14:51:32 -08:00

140 lines
3.6 KiB
JavaScript

import {
select as d3_select
} from 'd3-selection';
import { uiDisclosure } from './disclosure';
import { utilFunctor } from '../util';
// A unit of controls or info to be used in a layout, such as within a pane.
// Can be labeled and collapsible.
export function uiSection(id, context) {
var _classes = utilFunctor('');
var _shouldDisplay;
var _content;
var _disclosure;
var _title;
var _expandedByDefault = utilFunctor(true);
var _disclosureContent;
var _disclosureExpanded;
var _containerSelection = d3_select(null);
var section = {
id: id
};
section.classes = function(val) {
if (!arguments.length) return _classes;
_classes = utilFunctor(val);
return section;
};
section.title = function(val) {
if (!arguments.length) return _title;
_title = utilFunctor(val);
return section;
};
section.expandedByDefault = function(val) {
if (!arguments.length) return _expandedByDefault;
_expandedByDefault = utilFunctor(val);
return section;
};
section.shouldDisplay = function(val) {
if (!arguments.length) return _shouldDisplay;
_shouldDisplay = utilFunctor(val);
return section;
};
section.content = function(val) {
if (!arguments.length) return _content;
_content = val;
return section;
};
section.disclosureContent = function(val) {
if (!arguments.length) return _disclosureContent;
_disclosureContent = val;
return section;
};
section.disclosureExpanded = function(val) {
if (!arguments.length) return _disclosureExpanded;
_disclosureExpanded = val;
return section;
};
// may be called multiple times
section.render = function(selection) {
_containerSelection = selection
.selectAll('.section-' + id)
.data([0]);
var sectionEnter = _containerSelection
.enter()
.append('div')
.attr('class', 'section section-' + id + ' ' + (_classes && _classes() || ''));
_containerSelection = sectionEnter
.merge(_containerSelection);
_containerSelection
.call(renderContent);
};
section.reRender = function() {
_containerSelection
.call(renderContent);
};
section.selection = function() {
return _containerSelection;
};
section.disclosure = function() {
return _disclosure;
};
// may be called multiple times
function renderContent(selection) {
if (_shouldDisplay) {
var shouldDisplay = _shouldDisplay();
selection.classed('hide', !shouldDisplay);
if (!shouldDisplay) {
selection.html('');
return;
}
}
if (_disclosureContent) {
if (!_disclosure) {
_disclosure = uiDisclosure(context, id.replace(/-/g, '_'), _expandedByDefault())
.title(_title || '')
/*.on('toggled', function(expanded) {
if (expanded) { selection.node().parentNode.scrollTop += 200; }
})*/
.content(_disclosureContent);
}
if (_disclosureExpanded !== undefined) {
_disclosure.expanded(_disclosureExpanded);
_disclosureExpanded = undefined;
}
selection
.call(_disclosure);
return;
}
if (_content) {
selection
.call(_content);
}
}
return section;
}