selecton
Version:
Selecton.js combines a searchbar and a dropdown menu with nested child lists.
46 lines (35 loc) • 1.65 kB
JavaScript
import {select as d3select} from 'd3-selection';
import {event as d3event} from 'd3-selection';
import {_getInputSearch} from './elementHandler';
import {_getInputItems} from './elementHandler';
export default function (w, xDragOffset, yDragOffset){
var search = _getInputSearch(w);
var searchNode = search.node();
var draggedItem = this.parentNode;
var eventY = d3event.sourceEvent.pageY;
var eventX = d3event.sourceEvent.pageX;
var clone = d3select('div.input-item-clone').node();
var cloneTop = clone.getBoundingClientRect().top;
var cloneWidth = clone.clientWidth;
var inputItems = _getInputItems(w);
var itemsBefore = inputItems
.filter(function(){
var h = this.clientHeight;
var t = this.getBoundingClientRect().top;
return cloneTop > t - h / 2 && cloneTop < t + h / 2 && eventX < this.getBoundingClientRect().right - cloneWidth / 2;
}).nodes()[0];
var itemsAfter = inputItems
.filter(function(){
var h = this.clientHeight;
var t = this.getBoundingClientRect().top;
return cloneTop > t - h / 2 && cloneTop < t + h / 2 && eventX > this.getBoundingClientRect().left + cloneWidth / 2;
}).nodes()[0];
if(itemsBefore){
searchNode.insertBefore(draggedItem, itemsBefore);
}else if(itemsAfter && itemsBefore === undefined){
searchNode.append(draggedItem);
}
d3select('div.input-item-clone')
.style('left', eventX - xDragOffset + 'px')
.style('top', eventY - yDragOffset + 'px');
}