(function () { 'use strict'; var app = angular.module('claims'); var templatePath = modulesSharedResourcesUrl + 'Modules/Claims/Views/'; app.directive('claimsReview', ['myBadgesDataContext', 'myBadgesAdminDataContext', 'datacontext', 'claimsDataContext', 'common', '$modal', 'OrganisationAdminService', '$location', function (myBadgesDataContext, myBadgesAdminDataContext, datacontext, claimsDataContext, common, $modal, OrganisationAdminService, $location) { return { restrict: 'E', templateUrl: templatePath + 'claimsreview.html', scope: { hideTitle: '=', }, link: link }; function link($scope, elem, attrs) { var getLogFn = common.logger.getLogFn; var log = getLogFn('branding'); var logSuccess = getLogFn('branding', "success"); $scope.orderByPredicate = '-dateCreated'; $scope.selectedOrg = ''; $scope.claims = []; $scope.searchQueryText = ''; $scope.pageSize = 10; activate(); getClaims(); $scope.filters = [ { name: 'For Review', value: 1 }, { name: 'Complete', value: 2 }, { name: 'Requested Re-submit', value: 3 } ]; // Set the initail filter values $scope.filterValues = [1]; $scope.pagination = { current: 1 }; $scope.startFilter = function (model) { if (model.length >= 1) { $scope.pageSize = $scope.claims.length; // this should match however many results your API puts on one page $scope.pagination.current = 1; } else $scope.pageSize = 10; } // Apply the status filters $scope.updateClaims = function () { $scope.claimsLoaded = false; $scope.pagination.current = 1; $scope.pageSize = 10; $scope.searchQueryText = ''; if ($scope.filterValues.length > 0) { claimsDataContext.getCurrentClaims($scope.filterValues).then(function (data) { $scope.claims = data; $scope.claimsLoaded = true; }); } else { $scope.claims = []; $scope.claimsLoaded = true; } } function activate() { NProgress.done(); log('Activated Claims Review'); } function getClaims() { OrganisationAdminService.getCurrentOrg().then(function (org) { claimsDataContext.getCurrentClaims($scope.filterValues).then(function (data) { getIntegrations(org.id); $scope.claims = data; $scope.claimsLoaded = true; }); }); } function getAuthenticationToken(dkey, orgid) { datacontext.getAuthenticationToken(dkey, orgid).then(function (data) { // generate pop up $scope.authToken = data; }); } function getIntegrations(orgId) { datacontext.getIntegrations(orgId, 8).then(function (data) { if (data[0]) { $scope.developerKey = data[0].secondaryKey; getAuthenticationToken(data[0].secondaryKey, orgId); } else { var k = randomPKey(60, true, false, true); var integration = { organisationId: orgId, connectionType: 8, connectionCode: orgId, connectionName: "DeveloperKey", primaryKey: "", secondaryKey: k, }; datacontext.createIntegration(integration).then(function (data) { $scope.developerKey = data.secondaryKey; getAuthenticationToken(data.secondaryKey, orgId); }); } }); } function randomPKey(length, addUpper, addSymbols, addNums) { var lower = "abcdefghijklmnopqrstuvwxyz"; var upper = addUpper ? lower.toUpperCase() : ""; var nums = addNums ? "0123456789" : ""; var symbols = addSymbols ? "!#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~" : ""; var all = lower + upper + nums + symbols; while (true) { var pass = ""; for (var i = 0; i < length; i++) { pass += all[Math.random() * all.length | 0]; } // criteria: if (!/[a-z]/.test(pass)) continue; // lowercase is a must if (addUpper && !/[A-Z]/.test(pass)) continue; // check uppercase if (addSymbols && !/\W/.test(pass)) continue; // check symbols if (addNums && !/\d/.test(pass)) continue; // check nums return pass; // all good } } $scope.manageClaim = function (claim) { $location.path('claims/review/' + claim.id); }; } }]); app.directive('claimsList', ['claimsDataContext', 'common', '$modal', 'myUsersDataContext', 'myBadgesAdminService', 'datacontext', function (claimsDataContext, common, $modal, myUsersDataContext, myBadgesAdminService, datacontext) { return { restrict: 'E', templateUrl: templatePath + 'claimslist.html', scope: { hideTitle: '=', }, link: link }; function link($scope, elem, attrs) { var getLogFn = common.logger.getLogFn; var log = getLogFn('branding'); var logSuccess = getLogFn('branding', "success"); $scope.orderByPredicate = '-dateCreated'; $scope.selectedOrg = ''; $scope.claims = []; $scope.filteredClaims = []; activate(); $scope.filters = [ { name: 'Live', value: 1 }, { name: 'Withdrawn', value: 0 } ]; // Set the initail filter values $scope.filterValues = [1]; // Apply the status filters $scope.applyStatusFilter = function (value, index) { return $scope.filterValues.indexOf(value.status) !== -1; } function activate() { NProgress.done(); getOrganisations(); getBadges(); getClaims(); log('Activated Badges View'); } function getClaims() { claimsDataContext.getClaimsForUser().then(function (data) { $scope.claims = data; $scope.claimsLoaded = true; }); } function getBadges() { myBadgesAdminService.getBadgeTemplatesToIssue().then(function (data) { $scope.badges = data; $scope.badgesLoaded = true; }); } function getOrganisations() { myUsersDataContext.getOrganisationsFullFlatSimple().then(function (data) { $scope.organisations = []; for (var i = 0; i < data.length; i++) { if (data[i].type === 0) { $scope.organisations.push(data[i]) } } $scope.organisationsLoaded = true; }); } $scope.createClaim = function (claim) { claimsDataContext.saveClaimCode(claim).then(function () { logSuccess("Successfully added claim"); getClaims(); }); } $scope.updateClaim = function (claim) { claimsDataContext.updateClaimCode(claim).then(function () { logSuccess("Successfully updated claim"); getClaims(); }); } $scope.deleteClaim = function (claim) { claimsDataContext.deleteClaimCode(claim).then(function () { logSuccess("Claim code successfully withdrawn"); getClaims(); }); } $scope.manageClaim = function (claim) { if (claim) { for (i in $scope.organisations) { if ($scope.organisations[i].id == claim.organisationId) { $scope.claim = angular.copy(claim); openClaimModal(); } } } else { $scope.claim = angular.copy(claim); openClaimModal(); } } function openClaimModal() { $modal.open({ templateUrl: templatePath + 'manageclaim.html', controller: manageClaimsController, size: 'lg', backdrop: 'static', resolve: { badges: function () { return $scope.badges; }, organisations: function () { return $scope.organisations; }, Claim: function () { return $scope.claim; }, createClaim: function () { return $scope.createClaim; }, deleteClaim: function () { return $scope.deleteClaim; }, updateClaim: function () { return $scope.updateClaim; } } }); } //Controller for managing issuer var manageClaimsController = function ($scope, $modalInstance, organisations, Claim, createClaim, deleteClaim, updateClaim, badges) { $scope.organisations = organisations; $scope.createClaim = createClaim; $scope.deleteClaim = deleteClaim; $scope.updateClaim = updateClaim; $scope.badges = badges; $scope.selectedBadge = null; $scope.isEdit = false; $scope.claim = Claim; $scope.showStartDate = false; $scope.showEndDate = false; // get the current claim if it exists else we create the claim object if ($scope.claim) { $scope.claim = Claim; $scope.isEdit = true; for (i in $scope.badges) { if ($scope.badges[i].id === $scope.claim.badgeTemplateId) { $scope.selectedBadge = $scope.badges[i]; } } } else { claimsDataContext.getClaimCode().then(function (data) { $scope.claim = { code: data, organisationId: null, testimonial: null, startDate: null, endDate: null, mandatoryEvidence: false, mandatoryReview: false, public: false, multipleClaims: true, claimCodeUsage: [], badgeImageUrl: null, badgeTemplateId: null, id: null }; }); } $scope.saveClaim = function (claim) { datacontext.getIntegrations(claim.organisationId, 8).then(function (data) { if (data && data.length > 0) { if ($scope.isEdit) { $scope.updateClaim(claim); } else { $scope.createClaim(claim); } $modalInstance.dismiss('cancel'); } else { var k = randomPKey(60, true, false, true); var integration = { organisationId: claim.organisationId, connectionType: 8, connectionCode: claim.organisationId, connectionName: "DeveloperKey", primaryKey: "", secondaryKey: k, }; datacontext.createIntegration(integration).then(function (data) { if ($scope.isEdit) { $scope.updateClaim(claim); } else { $scope.createClaim(claim); } $modalInstance.dismiss('cancel'); }); } }); }; function randomPKey(length, addUpper, addSymbols, addNums) { var lower = "abcdefghijklmnopqrstuvwxyz"; var upper = addUpper ? lower.toUpperCase() : ""; var nums = addNums ? "0123456789" : ""; var symbols = addSymbols ? "!#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~" : ""; var all = lower + upper + nums + symbols; while (true) { var pass = ""; for (var i = 0; i < length; i++) { pass += all[Math.random() * all.length | 0]; } // criteria: if (!/[a-z]/.test(pass)) continue; // lowercase is a must if (addUpper && !/[A-Z]/.test(pass)) continue; // check uppercase if (addSymbols && !/\W/.test(pass)) continue; // check symbols if (addNums && !/\d/.test(pass)) continue; // check nums return pass; // all good } } $scope.withdrawClaim = function (claim) { $scope.deleteClaim(claim); $modalInstance.dismiss('cancel'); }; // close the modal $scope.cancel = function () { $modalInstance.dismiss('cancel'); }; $scope.onChange = function () { $scope.claim.badgeImageUrl = null; if ($scope.claim.badgeTemplateId) { for (i in $scope.badges) { if ($scope.badges[i].id === $scope.claim.badgeTemplateId) { $scope.claim.badgeImageUrl = $scope.badges[i].graphic.url; $scope.selectedBadge = $scope.badges[i]; } } } }; }; } }]); app.directive('reviewClaim', ['claimsDataContext', 'common', 'user', 'myBadgesDataContext', 'myBadgesAdminDataContext', 'datacontext', 'OrganisationAdminService', '$location', '$window', function (claimsDataContext, common, user, myBadgesDataContext, myBadgesAdminDataContext, datacontext, OrganisationAdminService, $location, $window) { return { restrict: 'E', templateUrl: templatePath + 'reviewclaim.html', scope: { claimId: '=', }, link: link }; function link($scope, elem, attrs) { var getLogFn = common.logger.getLogFn; var log = getLogFn('branding'); var logSuccess = getLogFn('branding', "success"); $scope.showEvidenceForm = false; $scope.newEvidence = { name: "", description: "", resourceId: null }; $scope.newMessage = { message: "" }; OrganisationAdminService.getCurrentOrg().then(function (org) { claimsDataContext.getClaimById($scope.claimId).then(function (data) { getIntegrations(org.id); $scope.claim = data; myBadgesDataContext.getClaimBadge(data.claimCode).then(function (data) { $scope.badge = data; $scope.loadedClaim = true; }); user.getUserProfile(data.userId).then(function (data) { $scope.submitter = data; }); }); }); function getAuthenticationToken(dkey, orgid) { datacontext.getAuthenticationToken(dkey, orgid).then(function (data) { // generate pop up $scope.authToken = data; }); } function getIntegrations(orgId) { datacontext.getIntegrations(orgId, 8).then(function (data) { $scope.developerKey = data[0].secondaryKey; getAuthenticationToken(data[0].secondaryKey, orgId); }); } $scope.cancel = function () { $location.path('claims/review'); }; $scope.removeEvidence = function ($index) { $scope.claim.claimEvidence.splice($index, 1); logSuccess('Evidence removed successfully'); }; $scope.removeMessage = function ($index) { $scope.claim.claimMessages.splice($index, 1); logSuccess('Message removed successfully'); }; $scope.onFileSelect = function (files) { $scope.file = files[0]; // we're not interested in multiple file uploads here // check if the user has selected an below our maximum file size of 20MB if ($scope.file && $scope.file.size < 50000000) { $scope.imageAdded = true; var reader = new FileReader(); // Generate base 64 image for preview reader.readAsDataURL($scope.file); } else { $scope.errorMessage = 'File is too large!'; return; } if ($scope.file.type === "") { $scope.errorMessage = 'File type is not valid'; return; } $scope.fileName = $scope.file.name; files.originalImageFileName = $scope.file.name; files.imageFileSize = $scope.file.size; files.imageFileType = $scope.file.type; $scope.files = files; }; $scope.removeClaim = function () { $scope.claim.status = 3; $scope.claim.apiKey = $scope.developerKey; $scope.claim.authToken = $scope.authToken; $scope.claim.claimType = "code"; myBadgesDataContext.saveUserClaim($scope.claim).then(function (data) { logSuccess('Claim successfully updated.'); $location.path('claims/review'); }); }; $scope.submitClaim = function () { $scope.claim.status = 4; $scope.claim.apiKey = $scope.developerKey; $scope.claim.authToken = $scope.authToken; $scope.claim.claimType = "code"; myBadgesDataContext.saveUserClaim($scope.claim).then(function (data) { logSuccess('Claim successfully approved.'); $location.path('claims/review'); }); }; $scope.saveClaim = function () { $scope.claim.apiKey = $scope.developerKey; $scope.claim.authToken = $scope.authToken; $scope.claim.claimType = "code"; myBadgesDataContext.saveUserClaim($scope.claim).then(function (data) { logSuccess('Claim successfully saved.'); $location.path('claims/review'); }); }; $scope.addMessageModel = function (messageModel, form) { var ev = { message: messageModel.message, id: null }; $scope.claim.claimMessages.push(ev); $scope.claim.apiKey = $scope.developerKey; $scope.claim.authToken = $scope.authToken; $scope.claim.claimType = "code"; myBadgesDataContext.saveUserClaim($scope.claim).then(function (data) { logSuccess('Message added successfully'); myBadgesDataContext.getClaimById($scope.claim.id).then(function (claim) { $scope.claim = claim; }); $scope.newMessage = { message: '', id: null }; if (form) { form.$setPristine(); } }); }; $scope.discardEvidence = function (form) { $scope.newEvidence = { name: "", description: "", resourceId: null }; $scope.showEvidenceForm = false; if (form) { form.$setPristine(); } } $scope.addEvidenceModel = function (evidenceModel, form) { if ($scope.files) { uploadEvidence($scope.files, evidenceModel); } else { var ev = { name: evidenceModel.name, description: evidenceModel.description, public: evidenceModel.public, resourceId: evidenceModel.resourceId }; $scope.claim.claimEvidence.push(ev); } logSuccess('Evidence added successfully'); $scope.newEvidence = { name: "", description: "", resourceId: null }; $scope.showEvidenceForm = false; if (form) { form.$setPristine(); } }; function uploadEvidence(files, evidenceModel) { if (files.length === 0) return; UploadProgress(1); //images are uploaded to resource server myBadgesAdminDataContext.uploadEvidence(files, $scope.fileName, $scope.file.type, UploadProgress).then(function (data) { var ev = { name: evidenceModel.name, description: evidenceModel.description, resourceId: data.data.id, evidenceId: data.data.resourceId, fileType: $scope.file.type }; $scope.claim.claimEvidence.push(ev); $scope.progress = null; $scope.newEvidence.resourceId = null; $scope.fileName = ''; $scope.files = null; }); } // Generate the image upload process percentage function UploadProgress(percentComplete) { $scope.progress = percentComplete; $scope.uploadStatus = "Uploading... " + percentComplete + "%"; } $scope.viewEvidenceFile = function (id) { myBadgesAdminDataContext.getEvidence(id).then(function (data) { if (data.fileUri) { $window.open(data.fileUri); } }); }; } }]); })();