jonshaffer/angular-data-table

View on GitHub
src/components/header/SortableDirective.js

Summary

Maintainability
C
7 hrs
Test Coverage
/**
* Sortable Directive
* http://jsfiddle.net/RubaXa/zLq5J/3/
* https://jsfiddle.net/hrohxze0/6/
* @param {function}
*/
Function `SortableDirective` has a Cognitive Complexity of 24 (exceeds 5 allowed). Consider refactoring.
Function `SortableDirective` has 56 lines of code (exceeds 25 allowed). Consider refactoring.
export default function SortableDirective() {
return {
restrict: 'A',
scope: {
isSortable: '=sortable',
onSortableSort: '&',
},
Function `link` has 47 lines of code (exceeds 25 allowed). Consider refactoring.
link($scope, $element) {
let dragEl;
let nextEl;
 
function isbefore(a, b) {
if (a.parentNode === b.parentNode) {
for (let cur = a; cur; cur = cur.previousSibling) {
if (cur === b) {
return true;
}
}
}
return false;
}
 
function onDragEnter(e) {
const target = e.target;
if (isbefore(dragEl, target)) {
target.parentNode.insertBefore(dragEl, target);
} else if (target.nextSibling && target.hasAttribute('draggable')) {
target.parentNode.insertBefore(dragEl, target.nextSibling.nextSibling);
}
}
 
function onDragEnd(evt) {
evt.preventDefault();
 
dragEl.classList.remove('dt-clone');
 
$element.off('dragend', onDragEnd);
$element.off('dragenter', onDragEnter);
 
if (nextEl !== dragEl.nextSibling) {
$scope.onSortableSort({
event: evt,
columnId: angular.element(dragEl).attr('data-id'),
});
}
}
 
function onDragStart(evt) {
if (!$scope.isSortable) return;
 
evt = evt.originalEvent || evt;
 
dragEl = evt.target;
nextEl = dragEl.nextSibling;
dragEl.classList.add('dt-clone');
 
evt.dataTransfer.effectAllowed = 'move';
evt.dataTransfer.setData('Text', dragEl.textContent);
 
$element.on('dragenter', onDragEnter);
$element.on('dragend', onDragEnd);
}
 
$element.on('dragstart', onDragStart);
 
$scope.$on('$destroy', () => {
$element.off('dragstart', onDragStart);
});
},
};
}