/* * Copyright 2018 Comcast Cable Communications Management, LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ angular.module('controller.groups', []).controller('GroupsController', function ($scope, $log, $location, groupsService, profileService, utilityService, pagingService, $timeout) { //registering bootstrap modal close event to refresh data after create group action angular.element('#modal_new_group').one('hide.bs.modal', function () { $scope.closeModal(); }); $scope.groups = {items: []}; $scope.allGroup = {items: []}; $scope.groupsLoaded = false; $scope.allGroupsLoaded = false; $scope.alerts = []; $scope.ignoreAccess = false; $scope.hasGroups = false; $scope.query = ""; $scope.validEmailDomains= []; $scope.maxGroupItemsDisplay = 3000; // Paging status for group sets var groupsPaging = pagingService.getNewPagingParams(100); var allGroupsPaging = pagingService.getNewPagingParams(100); function handleError(error, type) { var alert = utilityService.failure(error, type); $scope.alerts.push(alert); $scope.processing = false; } //views //shared modal var modalDialog; $scope.openModal = function (evt) { $scope.currentGroup = {}; $scope.validDomains(); void (evt && evt.preventDefault()); if (!modalDialog) { modalDialog = angular.element('#modal_new_group').modal(); } modalDialog.modal('show'); }; $scope.closeModal = function (evt) { void (evt && evt.preventDefault()); if (!modalDialog) { modalDialog = angular.element('#modal_new_group').modal(); } modalDialog.modal('hide'); return true; }; $scope.closeEditModal = function (evt) { void (evt && evt.preventDefault()); editModalDialog = angular.element('#modal_edit_group').modal(); editModalDialog.modal('hide'); $scope.reset(); $scope.refresh(); return true; }; // Autocomplete for group search $("#group-search-text").autocomplete({ source: function( request, response ) { $.ajax({ url: "/api/groups?maxItems=100&abridged=true", dataType: "json", data: {groupNameFilter: request.term, ignoreAccess: $scope.ignoreAccess}, success: function(data) { const search = JSON.parse(JSON.stringify(data)); response($.map(search.groups, function(group) { return {value: group.name, label: group.name} })) } }); }, minLength: 1, select: function (event, ui) { $scope.query = ui.item.value; $("#group-search-text").val(ui.item.value); return false; }, open: function() { $(this).removeClass("ui-corner-all").addClass("ui-corner-top"); }, close: function() { $(this).removeClass("ui-corner-top").addClass("ui-corner-all"); } }); // Autocomplete text-highlight $.ui.autocomplete.prototype._renderItem = function(ul, item) { let txt = String(item.label).replace(new RegExp(this.term, "gi"),"$&"); return $("
  • ") .data("ui-autocomplete-item", item.value) .append("
    " + txt + "
    ") .appendTo(ul); }; $scope.createGroup = function (name, email, description) { //prevent user executing service call multiple times //if true prevent, if false allow for execution of rest of code //ng-href='/groups' $log.debug('createGroup::called', $scope.data); if ($scope.processing) { $log.debug('createGroup::processing is true; exiting'); return; } //flag to prevent multiple clicks until previous promise has resolved. $scope.processing = true; //data from user form values var payload = { 'name': name, 'email': email, 'description': description, 'members': [{id: $scope.profile.id}], 'admins': [{id: $scope.profile.id}] }; //create group success callback function success(response) { var alert = utilityService.success('Successfully Created Group: ' + name, response, 'createGroup::createGroup successful'); $scope.alerts.push(alert); $scope.closeModal(); $scope.reset(); $scope.refresh(); return response.data; } return groupsService.createGroup(payload) .then(success) .catch(function (error) { handleError(error, 'groupsService::createGroup-failure'); }); }; $scope.refresh = function () { groupsPaging = pagingService.resetPaging(groupsPaging); allGroupsPaging = pagingService.resetPaging(allGroupsPaging); groupsService .getGroupsAbridged(groupsPaging.maxItems, undefined, false, $scope.query) .then(function (result) { $log.debug('getGroups:refresh-success', result); //update groups groupsPaging.next = result.data.nextId; updateGroupDisplay(result.data.groups); if (!$scope.query.length) { $scope.hasGroups = $scope.groups.items.length > 0; } }) .catch(function (error) { handleError(error, 'getGroups::refresh-failure'); }); groupsService .getGroupsAbridged(allGroupsPaging.maxItems, undefined, true, $scope.query) .then(function (result) { $log.debug('getGroups:refresh-success', result); //update groups allGroupsPaging.next = result.data.nextId; updateAllGroupDisplay(result.data.groups); }) .catch(function (error) { handleError(error, 'getGroups::refresh-failure'); }); }; $scope.reset = function () { //reset processing flag $scope.processing = false; //fields with ng-patterns need to be set to null first then cleared $scope.createGroupForm.$commitViewValue(); //this resets $scope.currentGroup object to empty object; angular.copy({}, $scope.currentGroup); //reset all validations & error messages to pre-form submission state $scope.createGroupForm.$setUntouched(); $scope.createGroupForm.$setPristine(); return true; }; function getGroups() { function success(response) { $log.debug('groupsService::getGroups-success'); return response.data; } return groupsService .getGroups($scope.ignoreAccess, $scope.query, $scope.maxGroupItemsDisplay) .then(success) .catch(function (error) { handleError(error, 'groupsService::getGroups-failure'); }); } //Function for fetching list of valid domains $scope.validDomains=function getValidEmailDomains() { function success(response) { $log.debug('groupsService::listEmailDomains-success', response); $scope.validEmailDomains = response.data; return $scope.validEmailDomains } return groupsService .listEmailDomains($scope.ignoreAccess, $scope.query) .then(success) .catch(function (error) { handleError(error, 'groupsService::listEmailDomains-failure'); }); } // Return true if there are no groups created by the user $scope.haveNoGroups = function (groupLength) { if (!$scope.hasGroups && !groupLength && $scope.groupsLoaded && $scope.query.length == "") { return true } else { return false } } // Return true if no groups are found related to the search query $scope.searchCriteria = function (groupLength) { if (!groupLength && $scope.query.length != "") { return true } else { return false } } $scope.editGroup = function (groupInfo) { $scope.currentGroup = groupInfo; $scope.initialGroup = { name: $scope.currentGroup.name, email: $scope.currentGroup.email, description: $scope.currentGroup.description }; $scope.hasChanges = false; $scope.validDomains(); $("#modal_edit_group").modal("show"); }; // Function to check for changes $scope.checkForChanges = function() { $scope.hasChanges = $scope.currentGroup.name !== $scope.initialGroup.name || $scope.currentGroup.email !== $scope.initialGroup.email || ($scope.currentGroup.description !== $scope.initialGroup.description && !($scope.currentGroup.description === "" && $scope.initialGroup.description === undefined)); }; $scope.getGroupAndUpdate = function(groupId, name, email, description) { function success(response) { $log.debug('groupsService::getGroup-success'); $scope.currentGroup = response.data; //data from user form values var payload = { 'id': $scope.currentGroup.id, 'name': name, 'email': email, 'members': $scope.currentGroup.members, 'admins': $scope.currentGroup.admins }; if (description) { payload['description'] = description; } //update group success callback function success(response) { var alert = utilityService.success('Successfully Updated Group: ' + name, response, 'updateGroup::updateGroup successful'); $scope.alerts.push(alert); $scope.closeEditModal(); $scope.reset(); $scope.refresh(); return response.data; } return groupsService.updateGroup(groupId, payload) .then(success) .catch(function (error) { $scope.closeEditModal(); handleError(error, 'groupsService::updateGroup-failure'); }); } return groupsService .getGroup(groupId) .then(success) .catch(function (error) { handleError(error, 'groupsService::getGroup-failure'); }); }; $scope.submitEditGroup = function (name, email, description) { //prevent user executing service call multiple times //if true prevent, if false allow for execution of rest of code //ng-href='/groups' if ($scope.processing) { $log.debug('updateGroup::processing is true; exiting'); return; } //flag to prevent multiple clicks until previous promise has resolved. $scope.processing = true; $scope.getGroupAndUpdate($scope.currentGroup.id, name, email, description); }; $scope.confirmDeleteGroup = function (groupInfo) { $scope.currentGroup = groupInfo; $("#delete_group_modal").modal("show"); }; $scope.submitDeleteGroup = function () { function success(response) { $("#delete_group_modal").modal("hide"); $scope.refresh(); var alert = utilityService.success('Removed Group: ' + $scope.currentGroup.name, response, 'groupsService::deleteGroup successful'); $scope.alerts.push(alert); } groupsService.deleteGroups($scope.currentGroup.id) .then(success) .catch(function (error) { handleError(error, 'groupsService::deleteGroup-failure'); }); }; function profileSuccess(results) { //if data is provided if (results.data) { //update user profile data //make user profile available to page $scope.profile = results.data; $log.debug($scope.profile); //load data in grid $scope.refresh(); } } function profileFailure(results) { $scope.profile = $scope.profile || {}; } $scope.groupAdmin = function (group) { var isAdmin = group.admins.find(function (x) { return x.id === $scope.profile.id; }); var isSuper = $scope.profile.isSuper; return isAdmin || isSuper; } $scope.canSeeGroup = function (group) { var isMember = group.members.some(x => x.id === $scope.profile.id); var isSupport = $scope.profile.isSupport; var isSuper = $scope.profile.isSuper; return isMember || isSupport || isSuper; } //get user data on groups view load profileService.getAuthenticatedUserData() .then(profileSuccess, profileFailure) .catch(profileFailure); function updateGroupDisplay (groups) { $scope.groups.items = groups; $scope.groupsLoaded = true; $log.debug("Displaying my groups: ", $scope.groups.items); if($scope.groups.items.length > 0) { $("td.dataTables_empty").hide(); } else { $("td.dataTables_empty").show(); } } function updateAllGroupDisplay (groups) { $scope.allGroup.items = groups; $scope.allGroupsLoaded = true; $log.debug("Displaying all groups: ", $scope.allGroup.items); if($scope.allGroup.items.length > 0) { $("td.dataTables_empty").hide(); } else { $("td.dataTables_empty").show(); } } /* * Group set paging */ $scope.getGroupsPageNumber = function(tab) { switch(tab) { case 'myGroups': return pagingService.getPanelTitle(groupsPaging); case 'allGroups': return pagingService.getPanelTitle(allGroupsPaging); } }; $scope.prevPageEnabled = function(tab) { switch(tab) { case 'myGroups': return pagingService.prevPageEnabled(groupsPaging); case 'allGroups': return pagingService.prevPageEnabled(allGroupsPaging); } }; $scope.nextPageEnabled = function(tab) { switch(tab) { case 'myGroups': return pagingService.nextPageEnabled(groupsPaging); case 'allGroups': return pagingService.nextPageEnabled(allGroupsPaging); } }; $scope.prevPageMyGroups = function() { var startFrom = pagingService.getPrevStartFrom(groupsPaging); return groupsService .getGroupsAbridged(groupsPaging.maxItems, startFrom, false, $scope.query) .then(function(response) { groupsPaging = pagingService.prevPageUpdate(response.data.nextId, groupsPaging); updateGroupDisplay(response.data.groups); }) .catch(function (error) { handleError(error,'groupsService::prevPageMyGroups-failure'); }); } $scope.prevPageAllGroups = function() { var startFrom = pagingService.getPrevStartFrom(allGroupsPaging); return groupsService .getGroupsAbridged(allGroupsPaging.maxItems, startFrom, true, $scope.query) .then(function(response) { allGroupsPaging = pagingService.prevPageUpdate(response.data.nextId, allGroupsPaging); updateAllGroupDisplay(response.data.groups); }) .catch(function (error) { handleError(error,'groupsService::prevPageAllGroups-failure'); }); } $scope.nextPageMyGroups = function () { return groupsService .getGroupsAbridged(groupsPaging.maxItems, groupsPaging.next, false, $scope.query) .then(function(response) { var groupSets = response.data.groups; groupsPaging = pagingService.nextPageUpdate(groupSets, response.data.nextId, groupsPaging); if (groupSets.length > 0) { updateGroupDisplay(response.data.groups); } }) .catch(function (error) { handleError(error,'groupsService::nextPageMyGroups-failure') }); }; $scope.nextPageAllGroups = function () { return groupsService .getGroupsAbridged(allGroupsPaging.maxItems, allGroupsPaging.next, true, $scope.query) .then(function(response) { var groupSets = response.data.groups; allGroupsPaging = pagingService.nextPageUpdate(groupSets, response.data.nextId, allGroupsPaging); if (groupSets.length > 0) { updateAllGroupDisplay(response.data.groups); } }) .catch(function (error) { handleError(error,'groupsService::nextPageAllGroups-failure') }); }; $timeout($scope.refresh, 0); });