(function () { 'use strict'; var mod = angular.module('frameworksModule', [ 'breeze.angular', 'common', 'common.bootstrap', 'ui.bootstrap', 'ui.bootstrap.modal' ]); var conf = { frameworkRemoteServiceName: frameworkOdataServiceName, modulesSharedResourcesUrl: modulesSharedResourcesUrl, apigatewayUrl: apigatewayUrl, publishedFrameworksBaseUrl: publishedFrameworksBaseUrl }; mod.value('frameworksConfiguration', conf); mod.factory('entityManagerFactory', ['breeze', 'config', emFactory]); function emFactory(breeze) { breeze.NamingConvention.camelCase.setAsDefault(); new breeze.ValidationOptions({ validateOnAttach: false }).setAsDefault(); breeze.config.initializeAdapterInstances({ dataService: "webApiOData" }); var provider = {}; return provider; } mod.factory('frameworks', ['breeze', 'common', 'entityManagerFactory', 'frameworksConfiguration', '$q', '$http', frameworkService]); function frameworkService(breeze, common, entityManagerFactory, frameworksConfiguration, $q, $http) { var getLogFn = common.logger.getLogFn; var logError = getLogFn(serviceId, "error"); var metadataStore = new breeze.MetadataStore(); var serviceName = frameworksConfiguration.frameworkRemoteServiceName; var manager = new breeze.EntityManager({ serviceName: serviceName, metadataStore: metadataStore }); var EntityQuery = breeze.EntityQuery; var FilterQueryOp = breeze.FilterQueryOp; var Predicate = breeze.Predicate; var currentSkinName = ''; var service = { getFrameworks: getFrameworks, getPublicFrameworks: getPublicFrameworks, getPrivateFrameworks:getPrivateFrameworks, getOrganisationsFrameworks:getOrganisationsFrameworks, getFrameworksByUser: getFrameworksByUser, getCompetencies: getCompetencies, pageAmount: 200, //the default max number of frameworks getFrameworkList: getFrameworkList, setupCompetencies: setupCompetencies, formatFrameworkList: formatFrameworkList, getCompetencyIds: getCompetencyIds, getCurrentSkinName: getCurrentSkinName, setCurrentSkinName: setCurrentSkinName, sortSelfOrGroupFrameworks: sortSelfOrGroupFrameworks, getPublishedFrameworks: getPublishedFrameworks, unassignFrameworks: unassignFrameworks, assignFrameworks: assignFrameworks, getassignedFrameworks: getassignedFrameworks, getFrameworkWithBranches: getFrameworkWithBranches }; return service; /*** implementation ***/ function handleError(response) { // The API response from the server should be returned in a // nomralized format. However, if the request was not handled by the // server (or what not handles properly - ex. server error), then we // may have to normalize it on our end, as best we can. if ( !angular.isObject(response.data) || !response.data.message ) { return ($q.reject("An unknown error occurred.")); } // Otherwise, use expected error message. return ($q.reject(response.data.message)); } // I transform the successful response, unwrapping the application data // from the API response payload. function handleSuccess(response) { return (response.data); } function getPublishedFrameworks() { var request = $http({ method: "get", url: frameworksConfiguration.apigatewayUrl + '/deployedassignment/deploymentforme/default' }); return (request.then(handleSuccess, handleError)); } function getassignedFrameworks() { var request = $http({ method: "get", url: frameworksConfiguration.apigatewayUrl + '/deployedassignment/deploymentforme/user' }); return (request.then(handleSuccess, handleError)); } function assignFrameworks(assignmentId) { var request = $http({ method: "put", url: frameworksConfiguration.apigatewayUrl + '/AssignmentDeployedToUser/addReadAccess/' + assignmentId }); return (request.then(handleSuccess, handleError)); } function unassignFrameworks(assignmentId) { var request = $http({ method: "put", url: frameworksConfiguration.apigatewayUrl + '/AssignmentDeployedToUser/removeReadAccess/' + assignmentId }); return (request.then(handleSuccess, handleError)); } function getCompetencies(forceRefresh, id, notracking,onlyWantThese) { return getFrameworkWithBranches(id, notracking) .then(success).catch(failed); function success(response) { return response; } function failed(error) { var message = error.message || "standards query failed"; logError(message, error, true); } } function getCompetencyIds(frameworkId) { return getCompetencies(false, frameworkId, false).then(function (data) { var competencyIds = []; setupCompetencyIds([data], competencyIds); return competencyIds; }); } function setupCompetencyIds(competencies,comps) { if (!competencies) return null; for (var i = 0; i < competencies.length; i++) { if (competencies[i] && competencies[i].id) { comps.push(competencies[i].id); if (competencies[i].branches && competencies[i].branches.length > 0) setupCompetencyIds(competencies[i].branches, comps); } } return comps; } function getFrameworkWithBranches(frameworkId) { var request = $http({ method: "get", url: frameworksConfiguration.publishedFrameworksBaseUrl + '/PublishedFrameworks/' + frameworkId + '/public' }); return (request.then(handleSuccess, handleError)); } function getFrameworks(publicOnly, useridOnly, skip, order, top, fromCache, searchTerms, orgIdsOnly) { var query = EntityQuery.from('FrameworkTemplates').inlineCount(true); if (top) query = query.take(top); else query = query.take(service.pageAmount); if (publicOnly) query = query.where("public", "==", true); else query = query.where("public", "==", false); if (useridOnly) query = query.where("author", "==", useridOnly); if (skip) query = query.skip(skip); if (order) { switch (order) { case "0": query = query.orderBy('name'); break; case "1": query = query.orderBy('name desc'); break; case "2": break; case "3": query = query.orderBy('created desc'); break; case "4": query = query.orderBy('status, public'); break; } } if (searchTerms) { var pred = Predicate. create('name', FilterQueryOp.Contains, searchTerms) .or('description', FilterQueryOp.Contains, searchTerms) .or('firstName', FilterQueryOp.Contains, searchTerms) .or('lastName', FilterQueryOp.Contains, searchTerms); query = query.where(pred); } if (orgIdsOnly) { var jsonOrgs = JSON.parse(orgIdsOnly); var criteriaPredicate = null; $.each(jsonOrgs, function (index, item) { criteriaPredicate = (index === 0) ? Predicate.create('organisation', '==', item) : criteriaPredicate.or('organisation', '==', item); }); query = query.where(criteriaPredicate); } return query.using(manager).execute().then(success).catch(failed); function success(response) { //logSuccess('Got ' + response.results.length + ' framework(s)', response, true); return response.results; } function failed(error) { var message = error.message || "frameworks query failed"; logError(message, error, true); } } function getFrameworksByUser(userId, skip) { return getFrameworks(true, userId, skip); } function getPublicFrameworks(skip) { return getFrameworks(true, null, skip, null, null, false, null); } function getPrivateFrameworks(skip) { return getFrameworks(false, null, skip, null, null, false, null); } function getOrganisationsFrameworks(orgIds, skip) { return getFrameworks(false, null, skip, null, null, false, null, orgIds); } function getFrameworkList(theFrameworks) { var promises = []; theFrameworks.forEach(function (theFramework) { var frameworkId = theFramework.id; if (!frameworkId) frameworkId = theFramework; promises.push(EntityQuery.from("FrameworkTemplates(guid'" + frameworkId + "')").expand("OrginalFrameworkTemplate").noTracking(true).using(manager).execute()); }); //changing the implementation of this to get the frameworks individually - the filter query (commented out below) doesn't fetch back private frameworks if you are not the author. return $q.all(promises).then(function (data) { var results = []; for (var i = 0; i < data.length; i++) { for (var k = 0; k < theFrameworks.length; k++) { if (data[i].results[0] && theFrameworks[k].id === data[i].results[0].id) { data[i].results[0].deactivated = theFrameworks[k].deactivated; data[i].results[0].groupAllocated = theFrameworks[k].groupAllocated ? true : false; data[i].results[0].selfAllocated = theFrameworks[k].selfAllocated ? true : false; data[i].results[0].isDefaultAssignment = theFrameworks[k].isDefaultAssignment ? true : false; break; } } if (data[i].results[0]) results.push(data[i].results[0]); } return results; }); //var preds = []; //theFrameworks.forEach(function (theFramework) { // var frameworkId = theFramework.id; // if (!frameworkId) // frameworkId = theFramework; // preds.push(Predicate.create("id", FilterQueryOp.Equals, frameworkId)); //}); //var query = EntityQuery.from("FrameworkTemplates").expand("OrginalFrameworkTemplate, RootCompetency") // .where(Predicate.or(preds)); //query = query.where("public", "==", true); //return query.using(manager).execute() // .then(success).catch(failed); //function success(response) { // for (var j = 0; j < theFrameworks.length; j++) { // for (var k = 0; k < response.results.length; k++) { // if (theFrameworks[j].id === response.results[k].id) { // response.results[k].deactivated = theFrameworks[j].deactivated; // break; // } // } // } // return response.results; //} //function failed(error) { // var message = error.message || "Frameworks query failed"; // logError(message, error, true); //} } function formatFrameworkList(data, hideDeactivatedFrameworks) { var deactivatedFrameworks = []; var activatedFrameworks = []; var deferred = $q.defer(); for (var i = 0; i < data.length; i++) { var name = data[i].name; if (data[i].deactivated ) { if (!hideDeactivatedFrameworks) { name = name + ' - deactivated'; deactivatedFrameworks.push({ id: data[i].id, deactivated: true, name: name, groupAllocated: data[i].groupAllocated }); } } else activatedFrameworks.push({ id: data[i].id, deactivated: false, name: name, groupAllocated: data[i].groupAllocated }); } var result = activatedFrameworks.concat(deactivatedFrameworks); deferred.resolve(result); return deferred.promise; } function setupCompetencies(competencies) { if (!competencies) return null; var comps = []; for (var i = 0; i < competencies.length; i++) { if (competencies[i] && competencies[i].name && competencies[i].id) { var comp = {}; comp.name = competencies[i].name; if (competencies[i].description) comp.description = competencies[i].description; comp.id = competencies[i].id; if (competencies[i].branches && competencies[i].branches.length > 0) comp.branches = setupCompetencies(competencies[i].branches); else comp.branches = []; comps.push(comp); } } return comps; } function getCurrentSkinName(){ return currentSkinName || 'default'; } function setCurrentSkinName(skinName){ currentSkinName = skinName; } /* * Sort a list of frameworks based on the scope 'allocated' value of self or group */ function sortSelfOrGroupFrameworks(frameworksList, selfAllocated, groupAllocated) { var sortedFrameworks = []; if (selfAllocated || groupAllocated) { //Filter out self allocated or groupallocated as required for (var f in frameworksList) { //We are asking for selfallocated and this is a self allocated item if ((selfAllocated && frameworksList[f].selfAllocated) || //OR //We are asking for groupallocated and this is a group allocated item (groupAllocated && frameworksList[f].groupAllocated)) { var sortedFramework = { id: frameworksList[f].id, name: frameworksList[f].name, description: frameworksList[f].description, firstName: frameworksList[f].firstName, lastName: frameworksList[f].lastName, createdDate: frameworksList[f].created.toDateString(), isPublic: frameworksList[f].public, groupAllocated: groupAllocated, selfAllocated: selfAllocated, }; sortedFrameworks.push(sortedFramework); } } } return sortedFrameworks; } } mod.directive('frameworkChooser', ['frameworks', '$modal', 'frameworksConfiguration', 'terminology', function (frameworks, $modal, frameworksConfiguration, terminology) { return { restrict: 'EA', scope: { chosenFrameworks: '=', //users chosen frameworks chosenSortedFrameworks: '=', //users chosen frameworks, sorted by group or self allocated showActivated: '=', //only show activated frameworks onSave: '&', groupAllocated: '=', selfAllocated: '=' }, templateUrl: frameworksConfiguration.modulesSharedResourcesUrl + 'Modules/Frameworks/chooser.html?version=160718', link: link }; function link(scope, elem, attrs) { scope.terminology = terminology; scope.possibleFrameworks = []; scope.checked_possibleFrameworks = []; scope.checked_frameworks = []; scope.isCollapsed = true; scope.excludePublicFrameworks = false; scope.showOnlyChecked = false; scope.isSaving = false; scope.assignFrameworks = []; scope.chosenFrameworks = []; function getAvailableFrameworks() { return frameworks.getPublishedFrameworks().then(function (publicFrameworks) { frameworks.getassignedFrameworks().then(function (assignedFrameworks) { scope.assignFrameworks = assignedFrameworks; scope.chosenSortedFrameworks = frameworks.sortSelfOrGroupFrameworks(scope.chosenFrameworks); for (var k = 0; k < assignedFrameworks.length; k++) { var addedFramework = { id: assignedFrameworks[k].id, name: assignedFrameworks[k].name, description: assignedFrameworks[k].description, createdDate: assignedFrameworks[k].createdOn, frameworkId: assignedFrameworks[k].frameworkId, isDefaultAssignment: assignedFrameworks[k].isDefaultAssignment, deactivated: false } scope.chosenFrameworks.push(addedFramework); }; for (var i = 0; i < publicFrameworks.length; i++) { var exists = false; for (var j = 0; j < scope.chosenFrameworks.length; j++) { if (scope.chosenFrameworks[j].id === publicFrameworks[i].id) { exists = true; break; } } if (!exists) { console.log(publicFrameworks[i]); var availableFramework = { id: publicFrameworks[i].id, name: publicFrameworks[i].name, description: publicFrameworks[i].description, createdDate: publicFrameworks[i].createdOn, frameworkId: publicFrameworks[i].frameworkId, isDefaultAssignment: publicFrameworks[i].isDefaultAssignment, isPublic: true }; scope.possibleFrameworks.push(availableFramework); } } }); scope.chosenOrder('name'); scope.availableOrder('name'); }); } //are there any deactivated frameworks function areThereAnyDeactivatedFrameworks() { for (var i = 0; i < scope.chosenFrameworks.length; i++) { if (scope.chosenFrameworks[i].deactivated) { scope.anyDeactivatedFrameworks = true; break; } } } scope.publicFilter = function (framework) { if (scope.excludePublicFrameworks) return !framework.isPublic; return true; } scope.removeFramework = function (framework) { frameworks.unassignFrameworks(framework.id).then(function () { scope.possibleFrameworks.push(framework); var index = scope.chosenFrameworks.indexOf(framework); if (index > -1) scope.chosenFrameworks.splice(index, 1); if (scope.chosenSortedFrameworks) { index = scope.chosenSortedFrameworks.indexOf(framework); if (index > -1) scope.chosenSortedFrameworks.splice(index, 1); } }); }; scope.addFramework = function (framework) { frameworks.assignFrameworks(framework.id).then(function () { scope.chosenFrameworks.push(framework); var index = scope.possibleFrameworks.indexOf(framework); if (index > -1) scope.possibleFrameworks.splice(index, 1); }); } //deactivate chosen frameworks scope.deactivateFrameworks = function () { for (var i = 0; i < scope.checked_frameworks.length; i++) { for (var j = 0; j < scope.chosenFrameworks.length; j++) { if (scope.chosenFrameworks[j].id === scope.checked_frameworks[i]) { scope.chosenFrameworks[j].deactivated = true; break; } } } scope.anyDeactivatedFrameworks = true; scope.checked_frameworks = []; } //reactivate chosen deactivated frameworks scope.reactivateFrameworks = function () { for (var i = 0; i < scope.checked_deactivatedFrameworks.length; i++) { for (var j = 0; j < scope.chosenFrameworks.length; j++) { if (scope.chosenFrameworks[j].id === scope.checked_deactivatedFrameworks[i]) { scope.chosenFrameworks[j].deactivated = false; break; } } } areThereAnyDeactivatedFrameworks(); scope.checked_deactivatedFrameworks = []; } scope.chosenOrder = function(name) { scope.chosenReverse = (scope.chosenName === name) ? !scope.chosenReverse : false; scope.chosenName = name; }; scope.availableOrder = function (name) { scope.availableReverse = (scope.availableName === name) ? !scope.availableReverse : false; scope.availableName = name; }; scope.saveFrameworks = function () { if (scope.onSave) scope.onSave()(); } //view framework competencies in a modal scope.viewCompetencies = function (theFramework) { $modal.open({ templateUrl: frameworksConfiguration.modulesSharedResourcesUrl + 'Modules/Frameworks/competencies.html?version=160718', controller: viewCompetenciesController, size: 'lg', resolve: { theFramework: function () { return theFramework; } } }); } //add selected frameworks scope.addSelectedFrameworks = function () { for (var i = 0; i < scope.checked_possibleFrameworks.length; i++) { for (var j = 0; j < scope.possibleFrameworks.length; j++) { if (scope.possibleFrameworks[j].id === scope.checked_possibleFrameworks[i]) { var addedFramework = { id: scope.possibleFrameworks[j].id, name: scope.possibleFrameworks[j].name, description: scope.possibleFrameworks[j].description, createdDate: scope.possibleFrameworks[j].createdOn, frameworkId: scope.possibleFrameworks[j].frameworkId, isPublic: true } scope.chosenFrameworks.push(addedFramework); scope.possibleFrameworks.splice(j, 1); break; } } } scope.checked_possibleFrameworks = []; } //remove selected frameworks scope.removeFrameworks = function () { for (var i = 0; i < scope.checked_frameworks.length; i++) { for (var j = 0; j < scope.chosenFrameworks.length; j++) { if (scope.chosenFrameworks[j].id === scope.checked_frameworks[i]) { var removedFramework = { id: scope.possibleFrameworks[j].id, name: scope.possibleFrameworks[j].name, description: scope.possibleFrameworks[j].description, createdDate: scope.possibleFrameworks[j].createdOn, frameworkId: scope.possibleFrameworks[j].frameworkId, isPublic: true } scope.possibleFrameworks.push(removedFramework); scope.chosenFrameworks.splice(j, 1); break; } } } } ////watch the passed in chosen frameworks so we can change the UI //scope.$watch('chosenSortedFrameworks', function (frameworks, oldvalue) { // if (frameworks !== oldvalue) { // getAvailableFrameworks(); // scope.frameworksProcesed = true; // } //}); //modal controller for viewing competencies in a framework var viewCompetenciesController = function ($scope, $modalInstance, theFramework) { $scope.framework = theFramework; $scope.viewType = 'tree'; $scope.modulesSharedResourcesUrl = frameworksConfiguration.modulesSharedResourcesUrl; getCompetencies($scope.framework.frameworkId); //get competencies for the framework function getCompetencies(frameworkId) { return frameworks.getCompetencies(false, frameworkId, false).then(function (data) { $scope.competencies = frameworks.setupCompetencies(data.frameworkVersion.branches); console.log($scope.competencies); }); } //close the modal $scope.cancel = function () { $modalInstance.dismiss('cancel'); }; }; getAvailableFrameworks(); } }]); })();