/** * @author arnaud marhin */ (function() { 'use strict'; angular .module('moon') .controller('ProjectListController', ProjectListController); ProjectListController.$inject = ['$rootScope', '$scope', '$filter', '$modal', 'ngTableParams', 'pdpService', 'projects']; function ProjectListController($rootScope, $scope, $filter, $modal, ngTableParams, pdpService, projects) { var list = this; /* * */ list.projects = projects; list.pdps = []; list.getProjects = getProjects; list.hasProjects = hasProjects; list.isProjectMapped = isProjectMapped; list.table = {}; list.addProject = addProject; list.deleteProject = deleteProject; list.refreshProjects = refreshProjects; list.getMappedPDPName = getMappedPDPName; list.getPdpFromProject = getPdpFromProject; list.search = { query: '', find: searchProject, reset: searchReset }; list.add = { modal: $modal({ template: 'html/project/action/project-add.tpl.html', show: false }), showModal: showAddModal }; list.del = { modal: $modal({ template: 'html/project/action/project-delete.tpl.html', show: false }), showModal: showDeleteModal }; list.map = { modal: $modal({ template: 'html/project/action/mapping/project-map.tpl.html', show: false }), showModal: showMapModal }; list.unmap = { modal: $modal({ template: 'html/project/action/mapping/project-unmap.tpl.html', show: false }), showModal: showUnmapModal }; list.view = { modal: $modal({ template: 'html/project/action/project-view.tpl.html', show: false }), showModal: showViewModal }; activate(); function activate(){ list.loadingPDPs = true; newProjectsTable(); pdpService.findAllWithCallBack(function(data){ list.pdps = data; pdpService.mapPdpsToProjects(list.projects, list.pdps); list.loadingPDPs = false; }); } /* * ---- events */ var rootListeners = { 'event:projectCreatedSuccess': $rootScope.$on('event:projectCreatedSuccess', projectCreatedSuccess), 'event:projectCreatedError': $rootScope.$on('event:projectCreatedError', projectCreatedError), 'event:projectDeletedSuccess': $rootScope.$on('event:projectDeletedSuccess', projectDeletedSuccess), 'event:projectDeletedError': $rootScope.$on('event:projectDeletedError', projectDeletedError), 'event:projectMappedSuccess': $rootScope.$on('event:projectMappedSuccess', projectMappedSuccess), 'event:projectMappedError': $rootScope.$on('event:projectMappedError', projectMappedError), 'event:projectUnmappedSuccess': $rootScope.$on('event:projectUnmappedSuccess', projectUnmappedSuccess), 'event:projectUnmappedError': $rootScope.$on('event:projectUnmappedError', projectUnmappedError) }; for (var unbind in rootListeners) { $scope.$on('$destroy', rootListeners[unbind]); } /* * ---- table */ /** * Get projects array from the Keystone Moon. * @return an array containing projects JSON */ function getProjects() { return (list.projects) ? list.projects : []; } function hasProjects() { return list.getProjects().length > 0; } function isProjectMapped(project){ return _.has(project, 'pdp'); } /** * Prerequisite, isProjectMapped should return true * @param project * @returns {*} */ function getPdpFromProject(project){ return project.pdp; } function addProject(project) { list.projects.push(project); } function deleteProject(project) { list.projects = _.chain(list.projects).reject({id: project.id}).value(); } function refreshProjects() { list.table.total(list.projects.length); list.table.reload(); } function newProjectsTable() { list.table = new ngTableParams({ page: 1, // show first page count: 10, // count per page sorting: { name: 'asc' // initial sorting } }, { total: function () { return list.getProjects().length; }, // length of data getData: function($defer, params) { var orderedData = params.sorting() ? $filter('orderBy')(list.getProjects(), params.orderBy()) : list.getProjects(); $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count())); }, $scope: { $data: {} } }); return list.table; } /** * * @param project should have project.mapping.authz.pdp.name attribute */ function getMappedPDPName(project) { return _.has(project, 'pdp') ? project.pdp.name : 'error'; } /* * ---- search */ function searchProject(project){ return (project.name.indexOf(list.search.query) !== -1 || project.description.indexOf(list.search.query) !== -1); } function searchReset() { list.search.query = ''; } /* * ---- add */ function showAddModal() { list.add.modal.$promise.then(list.add.modal.show); } function projectCreatedSuccess(event, project) { list.addProject(project); list.refreshProjects(); list.add.modal.hide(); } function projectCreatedError(event, project) { list.add.modal.hide(); } /* * ---- delete */ function showDeleteModal(project) { list.del.modal.$scope.project = project; list.del.modal.$promise.then(list.del.modal.show); } function projectDeletedSuccess(event, project) { list.deleteProject(project); list.refreshProjects(); list.del.modal.hide(); } function projectDeletedError(event, project) { list.del.modal.hide(); } /* * ---- map */ function showMapModal(project) { list.map.modal.$scope.project = project; list.map.modal.$promise.then(list.map.modal.show); } function projectMappedSuccess(event, project) { activate(); list.map.modal.hide(); } function projectMappedError(event, project) { list.map.modal.hide(); } /* * ---- unmap */ function showUnmapModal(project) { list.unmap.modal.$scope.project = project; list.unmap.modal.$promise.then(list.unmap.modal.show); } function projectUnmappedSuccess(event, project) { var index = _.findIndex(list.projects, function(aProject){ return project.id === aProject.id; }); if(index === -1){ list.unmap.modal.hide(); return false; } list.projects[index] = project; list.refreshProjects(); list.unmap.modal.hide(); } function projectUnmappedError(event, project) { list.unmap.modal.hide(); } /* * ---- view */ function showViewModal(project) { list.view.modal.$scope.project = project; list.view.modal.$promise.then(list.view.modal.show); } } })();