(function() { "use strict"; angular.module('shared') .service('fileCabinetDragAndDropService', [ '$timeout', function($timeout) { var targetFolder = null; var draggingFolder = null; var draggingFolderChildrenIds = []; var draggingResource = null; var toggleFolder = null; var moveToIndex = null; var moveType = null; var sourceLocation = null; var dropLocation = null; var timeoutPromise = null; var move = { insert: 0, rootSort: 1, parentSort: 2, rootInsert: 3 }; var source = { myFolders: 0, selectedFolder: 1, selectedResources: 2 }; var getTargetFolderId = function() { return targetFolder ? targetFolder.id : null; }; var getTargetFolderParentId = function() { return targetFolder ? targetFolder.parent_resource_collection_id : null; }; var getTargetFolder = function() { return targetFolder; }; var getMoveToIndex = function() { return moveToIndex; }; var setSourceLocation = function(val) { sourceLocation = val; }; var setDropDetails = function(location, index, type, folder) { dropLocation = location; moveToIndex = index; moveType = type; targetFolder = folder; }; var setDropLocation = function(location) { dropLocation = location; }; var setDraggingFolderChildrenIds = function(folderChildren) { folderChildren.forEach(function(folder) { draggingFolderChildrenIds.push(folder.id); if (folder.children) { setDraggingFolderChildrenIds(folder.children) } }); }; var setDraggingFolder = function(val) { draggingResource = null; draggingFolder = val; draggingFolderChildrenIds = []; if (draggingFolder.children) { setDraggingFolderChildrenIds(draggingFolder.children); } }; var setDraggingResource = function(val) { draggingFolder = null; draggingResource = val; }; var isTargetChildOfDraggingFolder = function(targetFolder) { return draggingFolderChildrenIds !== null ? draggingFolderChildrenIds.indexOf(targetFolder.id) !== -1 : false; }; var isDropAllowed = function(targetFolder) { var dropAllowed = false; if (draggingFolder !== null && draggingResource === null) { dropAllowed = !(draggingFolder === targetFolder || isTargetChildOfDraggingFolder(targetFolder)); } else if (draggingResource !== null && draggingFolder === null) { dropAllowed = !targetFolder.locked && !draggingResource.locked; } return dropAllowed }; var isInsert = function() { return moveType === move.insert; }; var isRootSort = function() { return moveType === move.rootSort; }; var isRootInsert = function() { return moveType === move.rootInsert; }; var isResourceDragging = function() { return draggingResource != null && draggingFolder === null; }; var isDraggingFrom = function(val) { return sourceLocation === val; }; var isDroppingOn = function(val) { return dropLocation === val; }; var setToggleOpenFolderPromise = function(targetFolder) { if (!timeoutPromise) { toggleFolder = targetFolder; timeoutPromise = $timeout(function() { if (dropLocation === source.myFolders && (draggingFolder !== null || draggingResource !== null) && toggleFolder !== null){ toggleFolder.folderOpen = true; } timeoutPromise = undefined; }, 2000); } }; var onDragOverFolder = function(targetFolder) { if (toggleFolder !== targetFolder) { cancelTimeout(); } }; var cancelTimeout = function() { if (timeoutPromise) { $timeout.cancel(timeoutPromise); timeoutPromise = undefined; } }; var resetDragover = function(currentTarget) { var dragovers = document.getElementsByClassName('dndDragover'); for (var i = 0; i < dragovers.length; i++) { var dragover = angular.element(dragovers[i])[0]; if (dragover !== currentTarget[0]){ angular.element(dragovers[i]).removeClass('dndDragover'); } } }; var resetDraggingItem = function() { draggingFolder = null; draggingResource = null; }; return { getTargetFolder: getTargetFolder, getTargetFolderId: getTargetFolderId, getTargetFolderParentId: getTargetFolderParentId, getMoveToIndex: getMoveToIndex, setSourceLocation: setSourceLocation, setDropDetails: setDropDetails, setDropLocation: setDropLocation, setDraggingFolder: setDraggingFolder, setDraggingResource: setDraggingResource, setToggleOpenFolderPromise: setToggleOpenFolderPromise, isDropAllowed: isDropAllowed, isInsert: isInsert, isRootSort: isRootSort, isRootInsert: isRootInsert, isDraggingFrom: isDraggingFrom, isDroppingOn: isDroppingOn, isResourceDragging: isResourceDragging, resetDraggingItem: resetDraggingItem, resetDragover: resetDragover, onDragOverFolder: onDragOverFolder, cancelTimeout: cancelTimeout, move: move, source: source } } ]); }());