(function () { 'use strict'; var app = angular.module('items'); var templatePath = modulesSharedResourcesUrl + 'Modules/Items/Views/Directives/'; var manageTemplates = templatePath + 'Manage/'; var previewTemplates = templatePath + 'Preview/'; var showcaseTemplates = templatePath + 'Showcases/'; var myprogressTemplates = templatePath + 'MyProgress/'; // A directive that displays a form to manage a showcase item app.directive('manageItemForm', function () { return { restrict: 'E', transclude: true, templateUrl: showcaseTemplates + 'manage-item-form.html', }; }); // A directive that displays a form to manage a showcase add-in item app.directive('manageAddinItemForm', function () { return { restrict: 'E', transclude: true, templateUrl: showcaseTemplates + 'manage-addin-item-form.html', }; }); // A directive that shows a collage of items to add app.directive('addItemCollage', function () { return { restrict: 'E', scope: { createNewItem: '=', selectedFolder: '=', availableFolders: '=' }, templateUrl: templatePath + 'add-item-collage.html', link: function (scope) { scope.itemsToAdd = [ { type: 'status', thumbnail: 'https://uiframework.mkmapps.com/latest/lib/products/myshowcase/images/metro/text-note.png?version=270122', title: 'Create a text note', body: 'Create some text content, a blog post, some news or just some thoughts and reflections' }, { type: 'image', thumbnail: 'https://uiframework.mkmapps.com/latest/lib/products/myshowcase/images/metro/image.png?version=270122', title: 'Upload an image', body: 'Upload an image file (JPG, GIF, PNG) directly into your Myshowcase account.' }, { type: 'video', thumbnail: 'https://uiframework.mkmapps.com/latest/lib/products/myshowcase/images/metro/video.png?version=270122', title: 'Upload a video', body: 'Upload a video file directly into your Myshowcase account.' }, { type: 'badge', thumbnail: 'https://uiframework.mkmapps.com/latest/lib/products/myshowcase/images/metro/openbadge.png?version=270122', title: 'Upload a badge', body: 'Upload a badge file (PNG) directly into your Myshowcase account.' }, { type: 'badgecollection', thumbnail: 'https://uiframework.mkmapps.com/latest/lib/products/myshowcase/images/metro/badgecollection.png?version=270122', title: 'Add a badge collection', body: 'Add a badge collection as an item within your Myshowcase.me account' }, { type: 'file', thumbnail: 'https://uiframework.mkmapps.com/latest/lib/products/myshowcase/images/metro/file.png?version=270122', title: 'Upload a file', body: 'Upload documents, presentations, spreadsheets, etc. directly into your Myshowcase account.' }, { type: 'embed', embedType: 'embed-item', thumbnail: 'https://uiframework.mkmapps.com/latest/lib/products/myshowcase/images/metro/embed.png?version=270122', title: 'Add an embed item', body: 'Embed a link to a web site' }, { type: 'embed', embedType: 'flickr', thumbnail: 'https://uiframework.mkmapps.com/latest/lib/products/myshowcase/images/metro/flickr.png?version=270122', title: 'Add a Flickr photo', body: 'Import any publicly shared photo from Flickr.' }, { type: 'embed', embedType: 'slideshare', thumbnail: 'https://uiframework.mkmapps.com/latest/lib/products/myshowcase/images/metro/slideshare.png?version=270122', title: 'Add from SlideShare', body: 'Import a presentation shared on SlideShare.' }, { type: 'embed', embedType: 'google-maps', thumbnail: 'https://uiframework.mkmapps.com/latest/lib/products/myshowcase/images/metro/map.png?version=270122', title: 'Add a Google Map', body: 'Import a map or satellite image using Google Maps.' }, { type: 'embed', embedType: 'vimeo', thumbnail: 'https://uiframework.mkmapps.com/latest/lib/products/myshowcase/images/metro/vimeo.png?version=270122', title: 'Add a Vimeo video', body: 'Import any publicly shared video from Vimeo.' }, { type: 'embed', embedType: 'youtube', thumbnail: 'https://uiframework.mkmapps.com/latest/lib/products/myshowcase/images/metro/youtube.png?version=270122', title: 'Add a Youtube video', body: 'Import any publicly shared video from YouTube.' }, { type: 'embed', embedType: 'prezi', thumbnail: 'https://uiframework.mkmapps.com/latest/lib/products/myshowcase/images/metro/prezi.png?version=270122', title: 'Add from Prezi', body: 'Import a presentation created with Prezi.' }, { type: 'embed', embedType: 'sketchfab', thumbnail: 'https://uiframework.mkmapps.com/latest/lib/products/myshowcase/images/metro/sketchfab.png?version=270122', title: 'Add a Sketchfab model', body: 'Import any publicly shared 3D model from Sketchfab.' }, { type: 'embed', embedType: 'dailymotion', thumbnail: 'https://uiframework.mkmapps.com/latest/lib/products/myshowcase/images/metro/dailymotion.png?version=270122', title: 'Add a Dailymotion video', body: 'Import any publicly shared video from Dailymotion.' }, { type: 'weblink', thumbnail: 'https://uiframework.mkmapps.com/latest/lib/products/myshowcase/images/metro/web-link.png?version=270122', title: 'Add a weblink', body: 'Add a link to a web site' }, { type: 'zip', thumbnail: 'https://uiframework.mkmapps.com/latest/lib/products/myshowcase/images/metro/zip-file.png?version=270122', title: 'Extract Zip File', body: 'Add a zip file and extract all content items' }, ]; } } }); // A directive to preview the content of an item before it is created app.directive('itemPreview', ['cloudinaryConfig', function (config) { return { restrict: 'E', scope: { item: '=', fileData: '=', previewUrl: '=' }, templateUrl: previewTemplates + 'item-preview.html', link: function (scope) { scope.cloudinaryVideoBaseUrl = config.videoBaseUrl; } } }]); // A directive to view an item's content - such as an image or embed item app.directive('itemViewer', ['cloudinaryConfig', function (config) { return { restrict: 'E', scope: { item: '=', onFormEdited: '&' }, templateUrl: previewTemplates + 'item-viewer.html', link: function (scope) { scope.cloudinaryVideoBaseUrl = config.videoBaseUrl; } } }]); // A directive to edit an item's content and details app.directive('itemDetailsEditor', function () { return { restrict: 'E', templateUrl: manageTemplates + 'details-editor.html' } }); // A directive to edit an item's metadata (tags and frameworks) app.directive('itemMetadataEditor', function () { return { restrict: 'E', templateUrl: manageTemplates + 'metadata-editor.html' } }); // A directive to display folders available app.directive('itemFolderEditor', function () { return { restrict: 'E', templateUrl: manageTemplates + 'folder-editor.html' } }); // A directive to edit evidence / competencies for a framework app.directive('itemFrameworksEditor', function () { return { restrict: 'E', controller: 'competencyTreeController', templateUrl: manageTemplates + 'frameworks-editor.html', link: function (scope, _e, _a, ctrl) { // Get all competencies for the selected framework scope.setFramework = function (id) { return ctrl.setFrameworkAndGetCompetencies(id).then(function (data) { scope.retrievedAssignments[id] = data; }); }; // Check if an item has a competency scope.itemHasEvidence = function (competency) { return scope.item && scope.item.competencies && scope.item.competencies.indexOf(competency.id) !== -1; } // Toggle evidence / a competency for an item scope.toggleItemEvidence = function (competency) { if (!scope.item.competencies) { scope.item.competencies = []; } var index = scope.item.competencies.indexOf(competency.id); if (index > -1) { scope.item.competencies.splice(index, 1); } else if (index == -1) { scope.item.competencies.push(competency.id); } } } } }); // A directive for embed items app.directive('itemEmbedUpload', ['validation', function (validation) { return { restrict: 'E', scope: { url: '=', item: '=', embedCode: '=' }, templateUrl: manageTemplates + 'item-embed-upload.html', controller: 'itemEmbedController', link: function (scope) { if (scope.item.embedType !== 'embed-item') scope.pattern = validation.getEmbedPattern(scope.item.embedType); if (scope.item.embedType === 'embed-item') scope.pattern = null; scope.placeholder = validation.getEmbedPlaceholder(scope.item.embedType); } } }]); // A directive for embedding a flickr image app.directive('flickrEmbedUpload', [function () { return { restrict: 'E', scope: { url: '=' }, templateUrl: manageTemplates + 'flickr-embed-upload.html', controller: 'itemEmbedController', link: function (scope) { // Ensure that the url is in the correct format scope.formatUrl = function (url) { if (url) { scope.ensureProtocol(url); //lookup '/in/' and remove it and anything after it if (url.indexOf('/in/') !== -1) { var position = url.indexOf('/in/'); var replacedUrl = scope.url.substring(0, position); scope.url = replacedUrl; } } } } } }]); // A directive for previewing an image item app.directive('imageItemPreview', ['cloudinaryConfig', function (config) { return { restrict: 'E', scope: { item: '=', w: '@' }, template: '
', link: function (scope) { scope.baseImageUrl = config.baseUrl; scope.w = scope.w || 600; } }; }]); // A directive for previewing a weblink item app.directive('weblinkItemPreview', ['cloudinaryConfig', function (config) { return { restrict: 'E', scope: { item: '=', w: '@' }, template: '
', link: function (scope) { scope.baseImageUrl = config.urlToPngBaseUrl; scope.w = scope.w || 600; } }; }]); // A directive for previewing a badge item app.directive('badgeItemPreview', ['cloudinaryConfig', function (config) { return { restrict: 'E', scope: { item: '=', w: '@' }, templateUrl: previewTemplates + 'preview-badge.html', link: function (scope) { scope.baseImageUrl = config.urlToPngBaseUrl; scope.w = scope.w || 600; } } }]); // A directive for previewing a badge collection item app.directive('badgeCollectionItemPreview', ['config', function (config) { return { restrict: 'E', scope: { item: '=' }, template: '', link: function (scope) { scope.collectionUrl = config.siteUrl + 'view/#!/collection?collectionid=' + scope.item.mybadgesCollectionId + '&preview=true'; } }; }]); // A directive for previewing a file item app.directive('fileItemPreview', ['userDataContext', function (userDataContext) { return { restrict: 'E', scope: { item: '=' }, templateUrl: previewTemplates + 'preview-file-item.html', link: function (scope) { // Get the users upload token userDataContext.getUploadBucketSas().then(function (sas) { scope.sasToken = sas.sas; }); } }; }]); // A directive for previewing an assessment item app.directive('assessmentItemPreview', function () { return { restrict: 'E', templateUrl: previewTemplates + 'preview-assessment-item.html' }; }); // A directive for showing upload progress of an image item app.directive('fileUploadProgress', function () { return { restrict: 'E', scope: { uploadPercentage: '=' }, templateUrl: manageTemplates + 'file-upload-progress.html' }; }); // A directive for managing an image item app.directive('manageImageItem', function () { return { restrict: 'E', templateUrl: manageTemplates + 'manage-image-item.html' }; }); // A directive for managing a video item app.directive('manageVideoItem', function () { return { restrict: 'E', templateUrl: manageTemplates + 'manage-video-item.html' }; }); // A directive for managing a badge item app.directive('manageBadgeItem', function () { return { restrict: 'E', templateUrl: manageTemplates + 'manage-badge-item.html' }; }); // A directive for managing a badge collection item app.directive('manageBadgeCollectionItem', ['config', 'datacontext', function (config, datacontext) { return { restrict: 'E', transclude: true, templateUrl: manageTemplates + 'manage-badge-collection-item.html', link: function (scope) { // Badge collections data scope.data = { collections: [], loaded: false }; // Get all available published and public collections scope.collectionUrl = config.siteUrl + 'view/#!/collection?collectionid=' + scope.item.mybadgesCollectionId + '&preview=true'; scope.noCollectionSelected = true; scope.selectedCollection = scope.item.mybadgesCollectionId; // todo: move this function out of datacontext (maybe to badges module?) datacontext.getCollectionsForUser().then(function (data) { scope.data.collections = data.reduce(function (collections, collection) { if (collection.published && collection.publishedCollection.public) { collections.push(collection); } return collections; }, []); scope.data.loaded = true; }); // Set the preview url when badge collection is selected scope.setCollectionPreview = function (collection) { scope.noCollectionSelected = false; scope.collectionUrl = config.siteUrl + 'view/#!/collection?collectionid=' + collection + '&preview=true'; scope.item.mybadgesCollectionId = collection; } } } }]); // A directive for managing a weblink item app.directive('manageWeblinkItem', function () { return { restrict: 'E', templateUrl: manageTemplates + 'manage-weblink-item.html' }; }); // A directive for managing a file item app.directive('manageFileItem', function () { return { restrict: 'E', templateUrl: manageTemplates + 'manage-file-item.html' }; }); // A directive for managing a zip item app.directive('manageZipItem', function () { return { restrict: 'E', templateUrl: manageTemplates + 'manage-zip-item.html' }; }); // MyProgress Assessment items app.directive('showcaseItemAssessmentPreview', function () { return { restrict: 'E', templateUrl: myprogressTemplates + 'assessment2.html', scope: { myShowcaseItem: '=item', accessToken: '=' }, link: function ($scope) { $scope.templatePath = myprogressTemplates; $scope.getLetter = function (index) { if (0 <= index && index <= 25) { return String.fromCharCode(65 + index); } else if (26 <= index <= 51) { return String.fromCharCode(71 + index); } else { return ''; } } $scope.getAssessmentItemResultFromCustomText = function (customText) { var assessmentItemIdentifier = $scope.getAssessmentItemIdentifier(customText); if (assessmentItemIdentifier.length > 0) { var result = $scope.getAssessmentItemResult(assessmentItemIdentifier); return result; } return null; } $scope.getAssessmentItemResult = function (assessmentItemIdentifier) { var resultArray = $scope.myShowcaseItem.jsonResponse.Result.itemResults.filter(function (assessmentItemResult) { return assessmentItemResult.identifier === assessmentItemIdentifier; }) if (resultArray.length > 0) { return resultArray[0]; } else { return null; } } $scope.getAssessmentItemIdentifier = function (customText) { var identifierString = 'identifier:'; if (customText && customText.length > 0 && customText.indexOf(identifierString) > -1) { var startIndex = customText.indexOf(identifierString) + identifierString.length; return customText.substring(startIndex); } return ''; } $scope.isAssessmentItemHidden = function (customText) { if (customText && customText.length > 0) { for (var i = 0; i < $scope.myShowcaseItem.jsonResponse.HiddenAssessmentItemIdentifiers.length; i++) { if (customText.includes($scope.myShowcaseItem.jsonResponse.HiddenAssessmentItemIdentifiers[i])) { return true; } } } return false; } } }; }); app.directive('myprogressAssessmentItemPreview', function () { return { restrict: 'E', templateUrl: myprogressTemplates + 'assessmentResponseItem.html', scope: { myShowcaseItem: '=', assessmentItem: '=', itemResult: '=', accessToken: '=' }, link: function ($scope) { $scope.getSelectedInteractionOptions = function (assessmentItemResult, responseIdentifier) { if (assessmentItemResult && responseIdentifier) { var responseValues = assessmentItemResult.responseValues.filter(function (responseValue) { return responseValue.identifier === responseIdentifier; }) if (responseValues.length > 0) { return responseValues[0].values; } else { return null; } } else { return null; } } $scope.getSingleResponseValue = function (assessmentItemResult, responseIdentifier) { if (assessmentItemResult && responseIdentifier) { var responseValues = assessmentItemResult.responseValues.filter(function (responseValue) { return responseValue.identifier === responseIdentifier; }) if (responseValues && responseValues.length > 0) { var responseValueArray = responseValues[0].values; if (responseValueArray && responseValueArray.length > 0) { return responseValueArray[0]; } else { return null; } } else { return null; } } else { return null; } } $scope.isInCorrectValues = function (responseValue, correctValues, correctValue, correctDate, correctTime, dateFormat) { return responseValue && responseValue.length && (correctValues && correctValues.length > 0 && correctValues.includes(responseValue)) || (correctValue && correctValue.length > 0 && correctValue == responseValue) || (correctDate && correctDate.length > 0 && $scope.compareDateStrings(correctDate, responseValue, dateFormat)) || (correctTime && correctTime.length > 0 && $scope.compareTimeStrings(correctTime, responseValue)); } $scope.compareTimeStrings = function (time1, time2) { if (time1 && time2) { var t1 = time1.split(':'); var t2 = time2.split(':'); var h1 = parseInt(t1[0]); var h2 = parseInt(t2[0]); var m1 = parseInt(t1[1]); var m2 = parseInt(t2[1]); return (h1 == h2 && m1 == m2); } else { return false; } } $scope.compareDateStrings = function (correctDate, responseDate, dateFormat) { var dateCorrect = new Date(correctDate); var dayCorrect = dateCorrect.getDate(); var monthCorrect = (dateCorrect.getMonth() + 1).toString(); if (monthCorrect.length == 1) { monthCorrect = '0' + monthCorrect; } var yearCorrect = dateCorrect.getFullYear().toString(); var stringCorrect = ''; if (dateFormat == 'DATE') { stringCorrect = dayCorrect + '/' + monthCorrect + '/' + yearCorrect; } else { var hoursCorrect = dateCorrect.getHours().toString(); var minutesCorrect = dateCorrect.getMinutes().toString(); if (hoursCorrect.length == 1) { hoursCorrect = '0' + hoursCorrect; } if (minutesCorrect.length == '1') { minutesCorrect = '0' + minutesCorrect; } stringCorrect = dayCorrect + '/' + monthCorrect + '/' + yearCorrect + ' ' + hoursCorrect + ':' + minutesCorrect; } return stringCorrect == responseDate } } }; }); app.directive('myprogressInteractionChoicePreview', function () { return { restrict: 'E', templateUrl: myprogressTemplates + 'assessmentResponseChoice.html', scope: { simpleChoice: '=', selectedValues: '=', correctValues: '=' }, link: function ($scope) { $scope.isSelected = function () { return $scope.selectedValues && $scope.selectedValues.length > 0 && $scope.selectedValues.includes($scope.simpleChoice.Identifier); } $scope.isCorrect = function () { return $scope.correctValues && $scope.correctValues.length > 0 && $scope.correctValues.includes($scope.simpleChoice.Identifier); } $scope.isIncorrect = function () { //value is incorrect only if there are defined correct values return $scope.correctValues && $scope.correctValues.length > 0 && !$scope.correctValues.includes($scope.simpleChoice.Identifier); } } }; }); app.directive('myProgressInteractionGridPreview', function () { return { restrict: 'E', templateUrl: myprogressTemplates + 'assessmentResponseGrid.html', scope: { sourceItems: '=', targetItems: '=', selectedValues: '=' }, link: function ($scope) { $scope.isSelected = function (sourceId, targetId) { return $scope.selectedValues && $scope.selectedValues.length > 0 && $scope.selectedValues.includes(sourceId + ' ' + targetId); } } } }); app.directive('myProgressInteractionFilePreview', ['$http', '$timeout', '$window', function ($http, $timeout, $window) { return { restrict: 'E', templateUrl: myprogressTemplates + 'assessmentResponseFile.html', scope: { myShowcaseItemId: '=', streamedResourceData: '=', responseString: '=', accessToken: '=' }, link: function ($scope) { function fileNameFromResponse() { if ($scope.responseString && $scope.responseString.indexOf(',') > 0) { return $scope.responseString.substring($scope.responseString.indexOf(',') + 1) } else { return ''; } } function fileGuidFromResponse() { if ($scope.responseString && $scope.responseString.indexOf(',') > 0) { return $scope.responseString.substring(0, $scope.responseString.indexOf(',')) } else { return ''; } } $scope.fileName = fileNameFromResponse(); $scope.fileGuid = fileGuidFromResponse(); //&userid=9F33C4E1-7A70-47B4-9C1C-A46A40B67D8D function fileDownloadUrl() { if ($scope.fileGuid && $scope.fileGuid.length > 0 && $scope.fileName && $scope.fileName.length > 0) { return '/api/myitem/' + $scope.myShowcaseItemId + '/zipcontents?name=' + $scope.fileGuid + '&originalName=' + $scope.fileName; } return ''; } function resourceIsImage() { if ($scope.streamedResourceData) { var isImage = false; for (var i = 0; i < $scope.streamedResourceData.length; i++) { if ($scope.streamedResourceData[i].ResourceId == $scope.fileGuid) { isImage = ($scope.streamedResourceData[i].Type.toLowerCase().indexOf('image') >= 0); break; } } return isImage; } } function getResourceType() { if ($scope.streamedResourceData) { var rType = ''; for (var i = 0; i < $scope.streamedResourceData.length; i++) { if ($scope.streamedResourceData[i].ResourceId == $scope.fileGuid) { rType = $scope.streamedResourceData[i].Type; break; } } return rType; } } $scope.fileUrl = fileDownloadUrl(); $scope.isImage = resourceIsImage(); $scope.resourceType = getResourceType(); function getResourceAsBase64Url() { var maxSizeForBase64 = 3000050; //4Gb max data url for IE - 50 bytes for metadata var url = $scope.fileUrl; var request = $http({ method: "get", url: url, headers: { Authorization: 'Bearer ' + $scope.accessToken }, responseType: 'arraybuffer' }); return (request.then(function (response) { var arrayBuffer = response.data; if (arrayBuffer) { var u8 = new Uint8Array(arrayBuffer); if (u8.length <= maxSizeForBase64) { var len = u8.byteLength; var binary = ''; for (var i = 0; i < len; i++) { binary += String.fromCharCode(u8[i]); } var b64encoded = window.btoa(binary); var mimetype = $scope.resourceType; return "data:" + mimetype + ";base64," + b64encoded; } else { return ''; } } else { return ''; } }, $scope.handleError)); } $scope.handleError = function (response) { console.log(response); } $scope.handleSuccess = function (response) { return (response.data); } function downloadFileUrl() { //var maxSizeForBase64 = 1048576; //1024 * 1024 //use dataurl if it exists - only get data again if base64Url hasn't been generated //if (!$scope.base64Url || $scope.base64Url.length == 0) { var request = $http({ method: "get", url: $scope.fileUrl, headers: { Authorization: 'Bearer ' + $scope.accessToken }, responseType: 'arraybuffer' }); return (request.then(function (response) { var str = response.data; var windowUrl = window.URL || window.webkitURL; if (typeof windowUrl.createObjectURL === 'function') { var blob = new Blob([str], { type: $scope.resourceType }); var url = windowUrl.createObjectURL(blob); return url; } else { return ''; } }, $scope.handleError)); //} //else { // return new Promise(function(resolve, reject) { // return resolve($scope.base64Url); // //return reject('error'); // }) //} } //getResourceAsBase64Url().then(function (response) { // $scope.base64Url = response; // downloadFileUrl().then(function (response) { // $scope.downloadFileLocation = response; // }) //}) downloadFileUrl().then(function (response) { $scope.downloadFileLocation = response; }) $scope.useIEDownload = window.navigator.msSaveOrOpenBlob; $scope.doIEDownload = function () { var request = $http({ method: "get", url: $scope.fileUrl, headers: { Authorization: 'Bearer ' + $scope.accessToken }, responseType: 'arraybuffer' }); return (request.then(function (response) { var str = response.data; var windowUrl = window.URL || window.webkitURL; if (typeof windowUrl.createObjectURL === 'function') { var blob = new Blob([str], { type: $scope.resourceType }); window.navigator.msSaveOrOpenBlob(blob, $scope.fileName); } else { return ''; } }, $scope.handleError)); } } } }]); })();