(function () { "use strict"; angular .module('shared') .service('assignTargetedScienceMaterialResource', ['LazModalService', 'targetedResource', 'messageHandler', 'studentList', 'Authorization', 'SiteHelper', function assignTargetedScienceMaterialResourceService(LazModalService, targetedResource, messageHandler, studentList, Authorization, SiteHelper) { var service = this; service.show = show; service.showResourceInfo = showResourceInfo; function showResourceInfo(resourceInfo, parts, showLevelsSelector) { studentList.annotateSelectableStudents([ Authorization.studentWithoutPrivilegeCheckerFactory(SiteHelper.SAZ_SITE_ABBREVIATION), studentAtTargetedResourceLimit, Authorization.studentWithoutResourceLicenseCheckerFactory( Authorization.getLicenseTypeForResourceCollection(resourceInfo[0].resources), Object.keys(resourceInfo).length === 1 ? 'this resource' : 'these resources')]); LazModalService.showModal({ templateUrl: '/shared/js/angular/targeted-resource-assignments/assign-targeted-science-material-resource-modal.html', controller: 'assignTargetedScienceMaterialResourceModal', controllerAs: '$ctrl', hideCloseButton: 'true', inputs: { resourceInfo: resourceInfo, parts: parts, showLevelsSelector: showLevelsSelector }, overrideClass: 'js-none', overrideStyle: 'height: 95vh;' }) .catch(function (reason) { messageHandler.publishError('There was a problem showing the assignment. Please try again later.'); }) } function show(minimumMaterialId, unitId, materialTypeId, rkResourceId, scienceCategoryId, languageId, parts, showLevelsSelector) { targetedResource.getScienceMaterialResourceInfo(minimumMaterialId, unitId, materialTypeId, rkResourceId, scienceCategoryId, languageId) .then(function (resourceInfo) { showResourceInfo(resourceInfo, parts, showLevelsSelector); }, function (reason) { messageHandler.publishError( 'There was an error retrieving the assignment information. Try again later.') }) } function studentAtTargetedResourceLimit(student) { if (student.is_at_science_targeted_resource_limit) { return "This student is at the limit of allowed assignable resources." } } } ]) .controller('assignTargetedScienceMaterialResourceModal', ['close', '$scope', 'resourceInfo', 'parts', 'showLevelsSelector', 'studentList', 'serverTargetedResource', '_', 'messageHandler', 'AuthGo', '$window', 'SiteHelper', 'resourceHelper', '$q', 'studentScienceAssignmentLevel', function assignTargetedScienceMaterialResourceModalCtrl(close, $scope, resourceInfo, parts, showLevelsSelector, studentList, serverTargetedResource, _, messageHandler, AuthGo, $window, SiteHelper, resourceHelper, $q, studentScienceAssignmentLevel) { var ctrl = this; ctrl.kidsRosterUrl = AuthGo.getUrl('kaz', '/main/students'); ctrl.close = ctrl.cancel = close; resourceHelper.setResourceInfo(resourceInfo); ctrl.title = resourceHelper.getTitle(); ctrl.activities = resourceHelper.activities; ctrl.switchAnyStudents = switchAnyStudents; ctrl.isValid = isValid; ctrl.submit = submit; ctrl.getISLParts = getISLParts; ctrl.getSelectedActivities = resourceHelper.getSelectedActivities; ctrl.getResourceLevels = resourceHelper.getResourceLevels; init(); function init() { var step = 1; setIconClassForActivities(); setSelectForActivities(); ctrl.showActivities = !resourceHelper.areActivitiesDisabled() || (!resourceHelper.isWorksheet && !resourceHelper.isInteractiveComponent); if (ctrl.showActivities) { ctrl.activitiesStep = step++; } ctrl.isSitN = resourceHelper.isSitN; ctrl.showLevels = showLevelsSelector == true && hasMultipleLevels(); if(ctrl.showLevels) { ctrl.showLevelsStep = step++; } if(resourceHelper.isISL) { ctrl.isISL = resourceHelper.isISL; ctrl.showPartsStep = step++; } ctrl.studentsStep = step; studentList.clearSelected(); ctrl.chosenLevel = ctrl.isSitN ? 'Early' : getDefaultChosenLevel(); ctrl.chosenPart = []; _.each(ctrl.getISLParts(ctrl.chosenLevel), function(part) { ctrl.chosenPart[part.displayOrder] = true; }); 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 quizValid() { return !resourceHelper.quizSelected() || ctrl.activities.length === 1 || ctrl.getSelectedActivities().length > 1; } function validActivities() { return ctrl.getSelectedActivities().length && quizValid(); } function isValid() { return studentList.getSelected().length && validActivities() && resourceHelper.getSelectedResources(ctrl.chosenPart).length; } function submit() { console.assert(isValid(), "Invalid submit attempt"); if (!isValid()) { return; } var requestDataObjectArray = buildRequestDataObjects(); var requests = []; requestDataObjectArray.forEach(function(requestData) { requests.push(serverTargetedResource.addAssignment(requestData)); }); $q.all(requests) .then(function(requestResponses) { var isSuccessful = true; requestResponses.forEach(function(requestResponse) { if(requestResponse.data.status !== "success") { isSuccessful = false; } }); if(isSuccessful) { 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() { messageHandler.publishError( "There was an error adding the assignment. Try again later.") }); } function assignmentRedirect() { $window.location.href = AuthGo.getUrl(SiteHelper.KAZ_SITE_ABBREVIATION, '/main/Assign/action/readingPractice#!/tabs/science'); } function AssignmentDataBuilder(activities, constructedResponseEnabled, dueOn) { return { students: function(students) { return { resources: function(resources) { var resourceIds = resources.map(function(resource) { return {'kids_book_id': resource['rkResourceId']}; }); var studentIds = students.map(function(student) { return {'student_id': student['student_id']}; }); return { activities: activities, constructed_response_enabled: constructedResponseEnabled, due_on: dueOn, students: studentIds, resources: resourceIds } } } } }; } function buildRequestDataObjects() { var result = []; var resourcesFilteredByPartSelection = resourceHelper.getSelectedResources(ctrl.chosenPart); if(ctrl.showLevels) { resourcesFilteredByPartSelection = resourceHelper.filterResourcesByLevel(resourcesFilteredByPartSelection, ctrl.chosenLevel); } var selectedStudents = studentList.getSelected(); var levels = _.uniq(_.pluck(resourcesFilteredByPartSelection,'readingLevel')); var activities = _.pluck(ctrl.getSelectedActivities(), 'activity_name'); var assignmentDataBuilder = AssignmentDataBuilder(activities, ctrl.constructedResponseEnabled, ctrl.dueOn); if(levels.length > 1) { result = buildAssignmentObjectsForMultipleLevels(assignmentDataBuilder, levels, resourcesFilteredByPartSelection, selectedStudents); } else { var assignmentData = assignmentDataBuilder .students(selectedStudents) .resources(resourcesFilteredByPartSelection); result.push(assignmentData) } return result; } function buildAssignmentObjectsForMultipleLevels(assignmentDataBuilder, levels, resources, students) { var result = []; var unitStageId = resources[0]['stageId']; var levelToStudentsMap = []; var levelToResourcesMap = []; levels.forEach(function(level) { levelToStudentsMap[level] = []; levelToResourcesMap[level] = filterResourcesByLevel(level, resources); }); putStudentsInLevelToStudentsMap(levelToStudentsMap, students, Number(unitStageId)); levels.forEach(function(level) { var assignmentData = assignmentDataBuilder .students(levelToStudentsMap[level]) .resources(levelToResourcesMap[level]); if(assignmentData.students.length > 0) { result.push(assignmentData); } }); return result; } function filterResourcesByLevel(level, resources) { return resources.filter(function(resource) { return resource['readingLevel'] == level; }); } function putStudentsInLevelToStudentsMap(levelToStudentsMap, students, unitStageId) { for(var i=0; i < students.length; i++) { var student = students[i]; var studentAssignmentLevel = studentScienceAssignmentLevel.determineStudentAssignmentLevel( unitStageId, student['science_stage_id'], student['science_level']); if(levelToStudentsMap[studentAssignmentLevel]) { levelToStudentsMap[studentAssignmentLevel].push(student); } else { //low doesnt exist on ISL, so assign student to 'mid' resource levelToStudentsMap["mid"].push(student); } } } function checkEscape(event) { if (event.key === "Escape") { close(); } } function setSelectForActivities() { resourceHelper.activities.forEach(function (activity) { activity.selected = true; }); } function setIconClassForActivities() { resourceHelper.activities.forEach(function (activity) { if(activity.activity_name === resourceHelper.activityTypesByName.WORKSHEET) { activity.iconClass = 'icon-' + activity.display_name.toLowerCase() + 'C'; } else if(activity.activity_name === resourceHelper.activityTypesByName.INTERACTIVE) { activity.iconClass = 'icon-scienceInteractiveC'; } else { activity.iconClass = 'icon-' + activity.activity_name + 'C'; } }); } function getISLParts(chosenLevel) { var onlyShowCertainParts = !!parts; return _.reduce(resourceHelper.resources, function(memo, resource) { if(resource.readingLevel === chosenLevel && !_.contains(memo, resource.displayOrder) && (!onlyShowCertainParts || (parts.indexOf(resource.displayOrder) !== -1))) { memo.push(resource); } return memo; }, []); } function hasMultipleLevels() { return resourceHelper.getResourceLevels().length > 1; } function getDefaultChosenLevel() { if(_.contains(resourceHelper.getResourceLevels(), "low")) { return "low"; } else if(_.contains(resourceHelper.getResourceLevels(), "mid")) { return "mid"; } else if(_.contains(resourceHelper.getResourceLevels(), "high")) { return "high"; } else { return "none"; } } } ]); })();