(function() { "use strict"; angular.module('shared') .component('folderList', { templateUrl: '/shared/js/angular/folder-list/folder-list.html', controller: 'FolderList' }) .controller('FolderList', ['$scope', '$q', 'folderListItemAmbassador', 'folders', 'messageHandler', 'folderService', 'MessageBox', 'fileCabinetRibbonService', 'loggedInInfo', '$document', function FolderList($scope, $q, folderListItemAmbassador, folders, messageHandler, folderService, MessageBox, fileCabinetRibbonService, loggedInInfo, $document) { var ctrl = this; var selectedFolder = null; var SHOWN_FOLDERS_INITIAL_DEPTH = 2; ctrl.lastSavedFolderId = 0; ctrl.folderIndex = -1; ctrl.folderList = []; ctrl.folderIdToFolderObjMap = {}; ctrl.scrollAllowed = true; ctrl.isNewFolderActive = false; ctrl.pending = true; ctrl.$onInit = function() { ctrl.newFolderName = ""; folderListItemAmbassador.registerOnActiveFolderListItemChanged($scope, onActiveFolderListItemChanged); folderListItemAmbassador.registerOnSelectedFolderListItemChanged($scope, onSelectedFolderListItemChanged); folderListItemAmbassador.resetActiveFolderListItem(); folderListItemAmbassador.resetSelectedFolderListItem(); if (loggedInInfo.member_id) { getLastPopoutFolderId().then(function (response) { createFolderList().then(function (response) { ctrl.folderIndex = -1; if (ctrl.lastSavedFolderId > 0) { var folderToSelect = ctrl.folderIdToFolderObjMap[ctrl.lastSavedFolderId]; if (folderToSelect && !folderToSelect.locked) { expandLastSavedFolder(folderToSelect); ctrl.selectFolder(folderToSelect); ctrl.folderIndex = ctrl.folderIdToFolderObjMap[ctrl.lastSavedFolderId].index; } } }); }); } }; function expandLastSavedFolder(lastSavedFolder) { var nextFolder = lastSavedFolder; var folderIdsToSave = []; while (nextFolder !== null) { folderIdsToSave.push(nextFolder.id); nextFolder = folders.findParent(nextFolder); } var allFolders = Object.values(ctrl.folderIdToFolderObjMap); allFolders.forEach(function(folder) { if (folders.getDepth(folder) < SHOWN_FOLDERS_INITIAL_DEPTH) { folderIdsToSave.push(folder.id); } }); folderListItemAmbassador.expandLastSavedFolderForShownFolders(ctrl.folderList, folderIdsToSave); } ctrl.$postLink = function() { onClickOffFolderList(); angular.element(document).ready(function() { ctrl.pending = false; }); $scope.$watch('$viewContentLoaded', function() { ctrl.pending = false; }); }; ctrl.onClickNewRootFolder = function(event) { folderListItemAmbassador.setActiveFolderListItem({id: "root"}); event.stopPropagation(); }; ctrl.saveNewFolder = function(parentId, folderName) { ctrl.scrollAllowed = false; validateFolderName(parentId, folderName).then(function(validated) { if (validated) { var data = { parent_id: parentId, folderName: folderName, shared_with: 'n', isEveryone: folders.getIsLiteracyEditor(), literacyTypeId: folders.getLiteracyTypeId() }; folderService.saveNewFolder(data).then( function (response) { folderListItemAmbassador.resetActiveFolderListItem(); folderListItemAmbassador.savePreviousShownFolders(ctrl.folderList); var result = response.data; if (result === "0") { messageHandler.publishError('Could not save new folder name.'); } else { createFolderList().then(function (response) { folderListItemAmbassador.reinstateShownFolders(ctrl.folderList, result); ctrl.selectFolder(ctrl.folderIdToFolderObjMap[result]); }); } }, function (reason) { messageHandler.publishError('Could not save new folder name.'); } ); } }); }; ctrl.selectFolder = function(folder) { if (selectedFolder) { selectedFolder.isChecked = false; } selectedFolder = folder; selectedFolder.isChecked = true; folderListItemAmbassador.setSelectedFolderListItem(selectedFolder); }; ctrl.isAddFolderButtonDisabled = function() { return !ctrl.newFolderName || ctrl.newFolderName.trim().length < 1; }; ctrl.controlEventPropagation = function(event) { event.stopPropagation(); }; function createFolderList() { if (folders.getIsLiteracyEditor()) { return createEveryoneFolderList(); } else { return createMyfilesFolderList(); } } ctrl.isLiteracyEditor = function() { return folders.getIsLiteracyEditor(); }; function createMyfilesFolderList() { return folders.getMyFoldersPromise().then( function (response) { var result = Array(); var rootFolder = {id: -1, name: 'My Files', children: response}; result.push(rootFolder); ctrl.folderList = result; populateFolderObjMaps(ctrl.folderList); }, function (reason) { messageHandler.publishError('Could not read folders'); } ) } function createEveryoneFolderList() { return folders.getEveryoneFoldersPromise().then( function (response) { markEveryoneFolders(response.data); var result = Array(); var rootFolder = {id: -1, name: folders.getLiteracyTypeName(), children: response.data, everyoneFolder:true}; result.push(rootFolder); ctrl.folderList = result; populateFolderObjMaps(ctrl.folderList); }, function (reason) { messageHandler.publishError('Could not read folders'); } ) } var counter = -1; function populateFolderObjMaps(folderList) { folderList.forEach(function (folder) { ctrl.folderIdToFolderObjMap[folder.id] = folder; ctrl.folderIdToFolderObjMap[folder.id].index = counter++; if (folder.children) { populateFolderObjMaps(folder.children); } }); } function markEveryoneFolders(folderList) { folderList.forEach(function (folder) { folder.everyoneFolder = true; if (folder.children != undefined && folder.children.length > 0) { markEveryoneFolders(folder.children); } }); } function getLastPopoutFolderId() { return folderService.getLastPopoutFolderID().then( function(response) { ctrl.lastSavedFolderId = parseInt(response.data.folderId); }, function(reason) { console.error(reason); throw reason; } ); } function onActiveFolderListItemChanged() { var activeFolderListItem = folderListItemAmbassador.getActiveFolderListItem(); // check if the root new folder is active ctrl.isNewFolderActive = activeFolderListItem.id === "root"; ctrl.newFolderName = ""; } function onSelectedFolderListItemChanged() { var selectedFolderListItem = folderListItemAmbassador.getSelectedFolderListItem(); // if selected folder was reset, uncheck the folder // ex) folder-list initalized, activeListItem was set if (selectedFolderListItem.id === 0 && selectedFolder) { selectedFolder.isChecked = false; selectedFolder = null; } } function validateFolderName(parentId, untrimmedFolderName) { return $q(function(resolve, reject) { var trimmedFolderName = untrimmedFolderName.trim(); if (!trimmedFolderName) { messageHandler.publishError("A folder name is required. Please try again."); resolve(false); } else if (checkFolderNameAtCurrentLevel(parentId, trimmedFolderName)) { var confirmId = 'confirm'; var alertMsg = "A folder called \"" + trimmedFolderName + "\" already exists. Are you sure you want to create a new folder with this name?"; MessageBox.show({ message: alertMsg, responses: [ { subtle: true, label: 'Cancel' }, { id: confirmId, confirm: true, label: 'OK' } ] }).then(function (response) { if (response.id == confirmId) { resolve(true); } else { resolve(false); } }); } else { resolve(true); } }); } function checkFolderNameAtCurrentLevel(parentId, trimmedFolderName) { var foldersAtLevel = ctrl.folderIdToFolderObjMap[parentId].children; if (foldersAtLevel) { return foldersAtLevel.find(function(folder) { return folder.name.trim() === trimmedFolderName; }); } return null; } function onClickOffFolderList() { ctrl.onDocumentMouseDown = function(event) { var isChild = angular.element(event.target).closest('.fileCabinetNav').length > 0; var isMessageBox = angular.element(event.target).closest('.message-box').length > 0; if (!isChild && !isMessageBox) { folderListItemAmbassador.resetActiveFolderListItem(); $scope.$apply(); } }; $document.on("mousedown " + getEventNames().startTouchEvent, ctrl.onDocumentMouseDown); } function getEventNames(){ if('ontouchstart' in window) return {startTouchEvent: 'touchstart', endTouchEvent: 'touchend', enterMouseEvent: 'mouseenter', leaveMouseEvent: 'mouseleave'}; else if(window.PointerEvent) return {startTouchEvent: 'pointerdown', endTouchEvent: 'pointerup', enterMouseEvent: 'pointerenter', leaveMouseEvent: 'pointerleave'}; else return {startTouchEvent: 'MSPointerDown', endTouchEvent: 'MSPointerUp', enterMouseEvent: 'mouseenter', leaveMouseEvent: 'mouseleave'}; } }]) })();