camunda-modeler
Version:
Camunda Modeler for BPMN, DMN and CMMN, based on bpmn.io
100 lines (73 loc) • 1.97 kB
JavaScript
;
var getParent = require('util/dom/get-parent');
/**
* Generic drop down functionality that may be used
* to create mouse down + mouse click aware drop downs.
*
* Expected HTML:
*
* <div class={active?}>
* <span class="primary"></span>
* <ul class="dropdown">
* <li class="entry">FOO</li>
* <li class="entry {active?}">BAR</li>
* </ul>
* </div>
*
* @return {Function} mouseDown initializer for dropdown
*/
function dropdown() {
var el, activeDropdown;
function close() {
el.classList.remove('active');
if (activeDropdown) {
activeDropdown.classList.remove('active');
}
document.body.removeEventListener('mouseup', up);
el.removeEventListener('mouseover', hover);
el.removeEventListener('mouseout', out);
}
function hover(event) {
var li = getParent(event.target, 'entry', 2);
if (li) {
li.classList.add('active');
activeDropdown = li;
}
}
function out(event) {
var li = getParent(event.target, 'entry', 2);
if (li) {
li.classList.remove('active');
activeDropdown = null;
}
}
function up(event) {
var target = event.target;
if (getParent(target, 'multi-button', 5) && !
getParent(target, 'dropdown', 3)) {
return;
}
close();
}
function down(event) {
var target = event.target;
var isPrimary = getParent(target, 'primary', 2),
isDropdown = getParent(target, 'dropdown', 3);
var currentTarget = el = event.currentTarget;
var classes = currentTarget.classList;
if (!classes.contains('active')) {
if (!isPrimary) {
document.body.addEventListener('mouseup', up);
currentTarget.addEventListener('mouseover', hover);
currentTarget.addEventListener('mouseout', out);
classes.add('active');
}
} else {
if (!isDropdown) {
close();
}
}
}
return down;
}
module.exports = dropdown;