(function () { "use strict"; angular .module('shared') .service('assignTargetedResource', ['LazModalService', 'targetedResource', 'messageHandler', 'studentList', 'Authorization', 'memberInfo', 'SiteHelper', 'FeatureCheck', function assignTargetedResourceService(LazModalService, targetedResource, messageHandler, studentList, Authorization, memberInfo, SiteHelper, FeatureCheck) { var service = this; service.show = show; service.showResourceInfo = showResourceInfo; function showResourceInfo(resourceInfo, siteRequiredAbbrev) { var studentSelectionDisabledChecker = [ Authorization.studentWithoutPrivilegeCheckerFactory(getReadingProductAbbreviation()), studentAtTargetedResourceLimit, Authorization.studentWithoutResourceLicenseCheckerFactory( Authorization.getLicenseTypeForResourceCollection(resourceInfo.resources), resourceInfo.resources.length > 1 ? 'these resources' : 'this resource') ]; var allowEllSharedAssigning = FeatureCheck.isFeatureEnabled('ALLOW_SHARED_ELL_ASSIGNING') && siteRequiredAbbrev === SiteHelper.RAZ_ELL_SITE_ABBREVIATION; if (siteRequiredAbbrev && !allowEllSharedAssigning) { studentSelectionDisabledChecker.push(Authorization.studentWithoutPrivilegeCheckerFactory(siteRequiredAbbrev)); } studentList.annotateSelectableStudents(studentSelectionDisabledChecker); LazModalService.showModal({ templateUrl: '/shared/js/angular/targeted-resource-assignments/assign-targeted-resource-modal.html', controller: 'assignTargetedResourceModal', controllerAs: '$ctrl', hideCloseButton: 'true', inputs: { resourceInfo: resourceInfo }, overrideClass: 'js-none', overrideStyle: 'height: 95vh;' }) .catch(function (reason) { messageHandler.publishError('There was a problem showing the assignment. Please try again later.'); }) } function show(action, resourceId, translationId, bookroomCollectionId, title, siteRequiredAbbrev) { service.action = action; targetedResource.getResourceInfo(action, resourceId, translationId, bookroomCollectionId, title) .then(function (resourceInfo) { showResourceInfo(resourceInfo, siteRequiredAbbrev); }, function (reason) { messageHandler.publishError( 'There was an error retrieving the assignment information. Try again later.') }) } function studentAtTargetedResourceLimit(student) { if (student.is_at_reading_targeted_resource_limit) { return "This student is at the limit of allowed assignable resources." } } function getReadingProductAbbreviation() { if (FeatureCheck.isFeatureEnabled("RAZ_PLUS_WELDING") && memberInfo.subjects.reading) { return memberInfo.subjects.reading.site_abbrev; } return SiteHelper.RK_SITE_ABBREVIATION; } } ]) .controller('assignTargetedResourceModal', ['close', '$scope', 'resourceInfo', 'resourceSelectionHelper', 'studentList', 'serverTargetedResource', '_', 'messageHandler', 'AuthGo', '$window', 'SiteHelper', 'FeatureCheck','assignTargetedResource', 'MessageBox', function assignTargetedResourceModalCtrl(close, $scope, resourceInfo, resourceSelectionHelper, studentList, serverTargetedResource, _, messageHandler, AuthGo, $window, SiteHelper, FeatureCheck,assignTargetedResource, MessageBox) { var ctrl = this; ctrl.activityTypesByName = { READ : 'read', LISTEN : 'listen', QUIZ : 'quiz', WORKSHEET : 'worksheet', FORMATIVE_WORKSHEET : 'formative_worksheet' }; ctrl.kidsRosterUrl = AuthGo.getUrl('kaz', '/main/students'); ctrl.close = ctrl.cancel = close; ctrl.title = resourceInfo.title; ctrl.switchAnyStudents = switchAnyStudents; ctrl.quizSelected = quizSelected; ctrl.isValid = isValid; ctrl.submit = submit; ctrl.areActivitiesDisabled = areActivitiesDisabled; ctrl.isActivityDisabled = resourceSelectionHelper.isActivityDisabled; ctrl.handleResourceSelection = resourceSelectionHelper.handleResourceSelection; ctrl.vocabGameTypes = null; ctrl.selectedVocabularyGameTypes = {}; init(); function init() { var step = 1; ctrl.activities = angular.copy(resourceInfo.activities); ctrl.resources = angular.copy(resourceInfo.resources); resourceSelectionHelper.initResourceInfo(ctrl.activities, ctrl.resources); var getVocabResources = false; if (ctrl.resources !== undefined && ctrl.resources !== null && ctrl.resources.length === 1 && ctrl.resources[0]["kids_book_id"] !== undefined) { getVocabResources = resourceInfo.translation !== undefined && resourceInfo.translation === "english"; getVocabResources = getVocabResources || (ctrl.resources[0]["language_id"] !== undefined && ctrl.resources[0]["language_id"] == 1); } if (getVocabResources) { serverTargetedResource.getVocabGameTypes(ctrl.resources[0]["kids_book_id"]) .then(function (results) { if (results !== undefined && results !== null && results.length > 0) { _.each(results,function(result) { result["selected"] = false; switch (result["gameTypeId"]) { case 1: result["iconClass"] = "icon-vocabularyC"; break; case 2: result["iconClass"] = "icon-spellingC"; break; case 3: result["iconClass"] = "icon-phonicsC"; break; } }); ctrl.vocabGameTypes = results; } }, function (reason) { console.log(reason); }) } ctrl.activities.forEach(function (activityObj) { activityObj.selected = true; activityObj.iconClass = isWorksheetTypeActivity(activityObj.activity_name) ? 'icon-' + activityObj.display_name.toLowerCase() + 'C' : 'icon-' + activityObj.activity_name + 'C'; }); ctrl.resources.forEach(function (resource) { resource.selected = true; }); ctrl.showActivities = ctrl.activities.length; if (ctrl.areActivitiesDisabled() && isFormativeWorksheetOnlyResource()) { ctrl.showActivities = false; } if (ctrl.showActivities) { ctrl.activitiesStep = step++; } ctrl.showResources = ctrl.resources.length > 1; if (ctrl.showResources) { ctrl.resourcesStep = step++; } ctrl.studentsStep = step; studentList.clearSelected(); ctrl.constructedResponseEnabled = resourceInfo.constructedResponseEnabled; } document.addEventListener('keyup', checkEscape); $scope.$on('$destroy', function () { document.removeEventListener('keyup', checkEscape) }); function switchAnyStudents() { if (studentList.pending) { return "pending"; } return studentList.get().length ? "some" : "none"; } function filterSelected(collection) { return collection.filter(function (item) { return item.selected; }) } function getSelectedActivities() { return filterSelected(ctrl.activities); } function getSelectedResources() { return filterSelected(ctrl.resources); } function getActivitiesToAssign() { if (isFormativeWorksheetOnlyResource()) { return [ctrl.activityTypesByName.FORMATIVE_WORKSHEET]; } var activitiesToAssign = []; getSelectedActivities().forEach(function (selectedActivityObj) { if (selectedActivityObj.activities) { selectedActivityObj.activities.forEach(function (activity) { activitiesToAssign.push(activity); }) } else { activitiesToAssign.push(selectedActivityObj.activity_name); } }); return activitiesToAssign; } function quizSelected() { return !!_.filter(getSelectedActivities(), function (item) { return item.activity_name === ctrl.activityTypesByName.QUIZ; }).length } function formativeWorksheetResourceSelected() { return !!_.filter(getSelectedResources(), function (resource) { return resource.activities && resource.activities.includes(ctrl.activityTypesByName.FORMATIVE_WORKSHEET); }).length } function quizValid() { if (!quizSelected()) { return true; } if (formativeWorksheetValid()) { return true; } return ctrl.activities.length === 1 || getSelectedActivities().length > 1; } function formativeWorksheetValid() { if (!quizSelected()) { return true; } return formativeWorksheetResourceSelected() && getSelectedResources().length === 1 && (getSelectedActivities().length === 1 || ctrl.activities.length === 1); } function isFormativeWorksheetOnlyResource() { return ctrl.resources.length === 1 && ctrl.resources[0].activities && ctrl.resources[0].activities[0] === ctrl.activityTypesByName.FORMATIVE_WORKSHEET; } function validActivities() { if (resourceInfo.resource_type == 'assessment') { return true; } if (isFormativeWorksheetOnlyResource()) { return true; } if (getSelectedActivities().length < 1 || !quizValid()) { return false; } return anyMatchingActivities(); } function anyMatchingActivities() { if (assignTargetedResource.action !== 'getTextSetIds' && assignTargetedResource.action !== 'getHighLowTextSetIds') { return true; } var selectedResources = getSelectedResources(); var selectedActivities = getActivitiesToAssign(); var foundResource = _.find(selectedResources,function(resource) { var foundActivity = _.find(resource['activities'],function(activity) { return selectedActivities.indexOf(activity) >= 0; }); return foundActivity !== undefined; }); return foundResource !== undefined; } function isValid() { if (studentList.getSelected().length < 1 || getSelectedResources().length < 1) { return false; } return validActivities(); } function getSelectedVocabGameTypeIds() { var selectedIds = []; _.each(Object.keys(ctrl.selectedVocabularyGameTypes),function(key) { if (ctrl.selectedVocabularyGameTypes[key]) { selectedIds.push(key); } }); return selectedIds; } function submit() { console.assert(isValid(), "Invalid submit attempt"); if (!isValid()) { return; } if (resourceInfo.resource_type == 'assessment') { serverTargetedResource.addAssessment(getServerAssessment()) .then(function () { messageHandler.publishSuccess('Assessment created. Track progress on the ', 'assignments page.', assignmentRedirect); close(); }, function () { messageHandler.publishError( "There was an error adding the assessment. Try again later.") }) } else { serverTargetedResource.addAssignment(getServerAssignment()) .then(function (response) { if (response.data.status === "success") { messageHandler.publishSuccess('Assignment created. Track progress on the ', 'assignments page.', assignmentRedirect); } else { messageHandler.publishError('There was an error adding the assignment. Try again later.'); } close(); }, function (error) { var errorMessage = error.data.message; if (errorMessage.includes('limit')) { var studentIds = errorMessage.slice(errorMessage.indexOf(':') + 2, errorMessage.length).split(','); var studentNames = []; errorMessage = "The following students have exceeded their resource limit: "; for (var i = 0; i < studentList.getSelected().length; ++i) { var currentStudentId = studentList.getSelected()[i].student_id; if (studentIds.includes(currentStudentId)) { studentNames.push(studentList.getSelected()[i].student_name); } } errorMessage += studentNames.join(', '); MessageBox.show({ message: errorMessage, responses: [ { id: 'ok', confirm: true, label: 'OK' } ] }).then(function (response) { ctrl.messageBoxOpen = false; },function (reason) { alert(errorMessage); }); } else { messageHandler.publishError('There was a problem processing your request.'); } }) } } function assignmentRedirect() { $window.location.href = AuthGo.getUrl(SiteHelper.KAZ_SITE_ABBREVIATION, '/main/Assign/action/readingPractice'); } function getServerAssignment() { var serverAssignment = { activities: getActivitiesToAssign(), resources: getSelectedResources().map(function (resource) { return _.pick(resource, 'kids_book_id','activities') }), students: studentList.getSelected().map(function (student) { return _.pick(student, 'student_id') }), bookroom_collection_id: resourceInfo.bookroom_collection_id, constructed_response_enabled: ctrl.constructedResponseEnabled, due_on: ctrl.dueOn, action: assignTargetedResource.action, selectedVocabGameTypeIds: getSelectedVocabGameTypeIds() }; if (resourceInfo['resourceId'] !== undefined) { serverAssignment['resourceId'] = resourceInfo['resourceId']; } if (resourceInfo['resource_type'] !== undefined) { serverAssignment['resource_type'] = resourceInfo['resource_type']; } return serverAssignment; } function getServerAssessment() { return { kids_book_id: ctrl.resources[0].kids_book_id, students: studentList.getSelected().map(function (student) { return _.pick(student, 'student_id') }) } } function checkEscape(event) { if (event.key === "Escape") { close(); } } function areActivitiesDisabled() { return ctrl.activities.length === 1 } function isWorksheetTypeActivity(activityName) { return activityName === ctrl.activityTypesByName.WORKSHEET || activityName === ctrl.activityTypesByName.FORMATIVE_WORKSHEET; } ctrl.htmlToPlaintext = function(text) { return text ? String(text).replace(/<[^>]+>/gm, '') : ''; }; } ]); })();