{"version":3,"sources":["app.js","exceptions/exception.js","exceptions/modelException.js","helpers/roleMapsMixin.js","helpers/typeMapsMixin.js","assessment.js","assignments.js","billing.js","breadcrumbs.js","careerPathService.js","catalog.js","catalogSearchParameters.js","categories.js","countries.js","courses.js","css.js","document.js","evaluation.js","groups.js","help.js","insights.js","insightsDecisionMapService.js","jobs.js","locations.js","messages.js","myDocumentsService.js","nmls.js","offerings.js","organizations.js","playlist.js","proxy.js","queuePollingIntervalValue.js","roster.js","rules.js","search.js","settings.js","skill.js","sortService.js","states.js","survey.js","tasks.js","team.js","timezones.js","transcripts.js","user.js","controllers/account.js","controllers/actionButton.js","controllers/adminHeader.js","controllers/applicationLibrary.js","controllers/assignments.js","controllers/baiCatalogHeader.js","controllers/catalog.js","controllers/courses.js","controllers/dashboard.js","controllers/footer.js","controllers/help.js","controllers/index.js","controllers/insights.js","controllers/management.js","controllers/messages.js","controllers/navigation.js","controllers/nmls.js","controllers/offerings.js","controllers/proxy.js","controllers/reports.js","controllers/rules.js","controllers/users.js","directives/BioSigModal.js","directives/MaxTimeString.js","directives/addAssignmentsWithLibraryModal.js","directives/adminOverlay.js","directives/angularPrint.js","directives/baiCourseActionButton.js","directives/baiDocumentActionButton.js","directives/baiMainContent.js","directives/baiNumbersOnlyInput.js","directives/baiScheduleCourseModal.js","directives/baiUserProfileModal.js","directives/baiUserStats.js","directives/baiValidator.js","directives/blurDelay.js","directives/breadcrumbs.js","directives/calendar.js","directives/calendarAssignmentList.js","directives/courseGroupSlideDown.js","directives/displayTimeToggle.js","directives/documentHeart.js","directives/documentUpload.js","directives/doughnutChart.js","directives/dropdown.js","directives/enterKeyHandler.js","directives/iltCalendarAssignmentList.js","directives/imageExists.js","directives/lmsDatepicker.js","directives/loginFormSwitcher.js","directives/messagingBuilder.js","directives/minTimeString.js","directives/nestedContainer.js","directives/playlistHeart.js","directives/regexValidator.js","directives/resizer.js","directives/scroll.js","directives/singleAutoComplete.js","directives/slideDown.js","directives/spinner.js","directives/subContainer.js","directives/templateSwitcher.js","directives/tree.js","directives/viewAddAssignmentsModal.js","directives/viewResourcesSlideDown.js","filters/assignmentAssetTypeName.js","filters/associativeArrayEmpty.js","filters/duration.js","filters/sortByPropertyContains.js","filters/trimmer.js","filters/unique.js","helpers/orgFunctions.js","helpers/peopleGroupFunctions.js","helpers/treeHelpers.js","utilities/IltRosterUtilities.js","utilities/address.js","utilities/course.formatter.js","utilities/date.js","utilities/errorDisplayer.js","utilities/http.js","utilities/login-background.js","utilities/messagingDisplayer.js","utilities/pathFormatter.js","utilities/popupcheck.js","utilities/session.formatter.js","utilities/sqlguid.js","utilities/successDisplayer.js","utilities/urlParams.js","controllers/assignments/admin.js","controllers/courses/admin.js","controllers/dashboard/admin.js","controllers/insights/admin.js","controllers/insights/decisionMaker.js","controllers/management/admin.js","controllers/messages/admin.js","controllers/offerings/admin.js","controllers/offerings/instructor.js","controllers/public/cataloghome.js","controllers/public/navigation.js","controllers/rules/admin.js","controllers/users/admin.js","controllers/users/instructor.js","controllers/users/manager.js","controllers/users/student.js","controllers/users/studentTiles.js","directives/catalog/applicationLibraryMenu.js","directives/catalog/baiCatalogHeader.js","directives/catalog/baiCatalogHeaderLms.js","directives/catalog/baiCatalogSearchResults.js","directives/catalog/baiCopyLink.js","directives/catalog/baiProductDetails.js","directives/catalog/catalogLibraryTiles.js","directives/catalog/downloadCatalogLinks.js","directives/insights/baiDecisionMapSummary.js","directives/insights/baiInsightsCourseSearchModal.js","directives/insights/baiInsightsDecisionMapCourses.js","directives/insights/baiInsightsDecisionMapCreate.js","directives/insights/baiInsightsDecisionMapReport.js","directives/insights/baiInsightsDecisionMapWizard.js","directives/insights/baiInsightsDecisionMapWizardStep.js","directives/insights/insightsSeeComments.js","directives/studentui/assignmentActionButton.js","directives/studentui/studentCareerPathList.js","directives/studentui/studentSectionHeader.js","directives/studentui/studentSectionSubHeader.js","directives/studentui/studentTileContainer.js","directives/studentui/studentTiles.js"],"names":["publicCatalogHosts","reactRoutes","unsupportedRoutes","app","window","customDocumentsEnabled","fromWeb","reduce","isFromWeb","catalogHost","location","hostname","loggedin","timeout","angular","module","catalog","Exception","message","code","this","getMessage","getCode","ModelException","console","warn","getPotentialFactoryName","controllerName","currentUserRole","potentialFactoryName","capitalize","findProvider","providerName","foundIt","_invokeQueue","forEach","value","angularProviderName","mapPageAndRoleToOverride","$injector","$scope","myServiceFunction","get","log","TypeMapsMixin","config","$compileProvider","$mdThemingProvider","$httpProvider","$routeProvider","$locationProvider","$rootScopeProvider","$mdDateLocaleProvider","momentPickerProvider","digestTtl","theme","primaryPalette","parseDate","dateString","m","moment","isValid","toDate","Date","NaN","concat","route","when","template","path","templateUrl","controller","toString","name","jQuery","inArray","html5Mode","interceptors","push","$q","response","data","responseError","rejection","ErrorMessage","Message","ErrorCode","Cookies","indexOf","StatusCode","reject","options","format","startView","today","locale","minView","maxView","autoclose","keyboard","leftArrow","rightArrow","yearsFormat","monthsFormat","daysFormat","hoursFormat","minutesFormat","localeData","longDateFormat","replace","secondsFormat","minutesStep","secondsStep","run","$rootScope","$location","$http","$window","$route","CssService","UsersService","SettingsService","urlParamsUtil","popupcheckUtil","$templateRequest","$templateCache","$interval","queuePollingInterval","original","reload","lastRoute","un","current","$on","$$path","params","$$url","$$absUrl","apply","setFromCookies","e","put","treeTemplate","checkCss","resetCache","videoShownThisSession","sysSettings","css","cssDoneLoading","metaTags","title","description","keywords","event","next","search","isLoggedIn","getSettings","then","success","getPortalCode","portal","length","purgeResults","remove","fetchByPortalId","appendTo","html","getId","fetchByUserId","navigateToHome","openPopUp","clearSession","url","failure","peopleGroupPollingInterval","cancel","query","loc","toLowerCase","document","getElementsByTagName","classList","add","cookie","cookieName","sqlguid","getTime","toUTCString","service","_this","singleResponse","fetchSingle","userId","assessmentId","req","method","headers","Content-Type","dateUtil","errorDisplayerUtil","courseFormatterUtil","courseGroupID","fetch","id","type","updateDueDate","managerId","studentId","courseId","dueDate","getAssignmentsBystateAndType","assignmentType","courseState","startDate","endDate","StudentId","Type","CourseState","StartDate","EndDate","getCourseGroupCourses","courseType","certCurrId","getCareerPathsSummary","getCareerPathCourses","careerPathCourseId","submitAssignment","assignment","assignmentCopy","copy","assignCourseGroupCourses","checkForCuncurrentOpen","concurrentOpen","resourceLaunchWithContent","courseAssets","asset","approveDenyEnrollment","offeringId","transcriptId","approveDeny","removeAssignment","assignmentCourseId","status","productType","ruleId","assignmentId","waiveAssignment","waived","JSON","stringify","unformat","updateAssignments","assignedOn","utcDate","completedDate","jsDate","utc","endDateTime","startDateTime","enrolledDate","dates","currAssignment","nmlsCourseInResults","cutOffTime","setHours","getHours","node","curriculumName","CourseGroupName","courseGroupId","curriculumId","certificationName","certificationId","isInCourseGroup","allowedEnrollments","totalEnrollmentAttempts","enrollmentAttemptsRemaining","enrollmentAttemptsAllowed","$","formatDate","offer","undefined","sessions","locationName","instructor","overDue","within24Hours","codeForImage","getCourseCodeForImage","tileImage","isNMLS","error","create","containsNMLSCourse","formatToSend","constructor","Array","hasOwnProperty","course","Object","_","each","dataPoint","isCourseRelaunchable","assignAssignment","assignments","getPrereqs","prereqData","searchUrl","p","substring","split","lastIndexOf","submitSimpleAssignment","duedate","required","userIds","CourseId","DueDate","Required","getOverdueInvoices","formatInvoices","getInvoicePDF","invoiceId","responseType","invoices","totalOverdue","i","totalDue","dateDue","toLocaleDateString","currencyFormatter","overdueInvoices","totalOverdueFormatted","Intl","NumberFormat","style","currency","PathFormatter","crumbs","pushCrumb","link","isHome","crumb","getCrumbs","reset","createBreadcrumbs","pipeDelimitedPath","baseRoute","catalogType","parentLink","results","c","formatPathParamsWithEncode","createHomeBreadcrumb","homeRole","createSummary","careerPath","children","summary","courses","skills","total","completed","where","percentComplete","Math","round","child","skill","acquired","existingSkill","findWhere","format_FlattenCatalogData","getBaiCatalogData","refresh","formattedDataCatalog","originalFlatArray","resolve","format_CatalogData","newArrayForCatlogData","formattedCatalogTree","formattedCatalogTreeData","formattedCoursesData","format_CatalogCoursesAndTreeData","format_CatalogTreeData","getBaiCatalogDataFromCache","nodes","nodeId","map","parentId","getCustomCatalog","formatCustomCatalog","courseTypes","courseTypesInData","api_name","isCareerPathEnabled","courseTypeObj","courseTypeName","courseTypeDisplayName","courseSubGroup","courseTypeFullName","removeDuplicates","arr","prop","new_arr","lookup","getCatalogCourses","sortBy","uniqueCourses","lastCourseId","searchParameters","breadcrumbs","productBreadcrumbs","fromBrowse","browseFilter","searchTerm","filter","queryType","top","skip","navigator","userAgent","addQueryText","queryText","clearBreadcrumbs","getSearchParameters","clearFilters","setPage","selectedPage","setFilters","f","addFacetFilters","facets","filterText","formattedValue","filterValues","values","selected","isString","negate","addNotString","addString","addCollection","addNotStringAnd","addStringAnd","addCollectionAnd","facet","join","getQueryToSend","queryToSend","$filter","filterName","allCustomCategoriesForPortal","fullCatalog","shouldFormatCustom","endpoint","Cache-Control","filterByName","formatForManage","filteredResponse","cats","displayCategories","s","contentType","lineItem","subcategoryName","categoryname","categoryID","categoryNodeID","parentNodeId","canEdit","isEditable","isActive","active","subcategoryID","imageName","image","categoryType","newSubcategory","createCategory","subcategory","formatForSubcategory","addCategoryType","editCategory","idxCat","findIndex","parseInt","splice","sisterSubcategory","subcategoryId","subEndDate","subIsActive","category","categoryName","cat","fullDate","RemoveDocumentPolicies","nonPolicies","includes","getCountryList","user","find","homeAddress","countryName","key","getLatitudeCountryList","structureId","Upload","searchableCatalog","meetings","session","offerings","offeringMeeting","meetingNode","assignedOffering","assignedOfferingMeeting","assignedOfferingMeetingNode","sessionIndex","sessionNode","currentSession","displayEnd","catalogId","duration","shortDescription","formatSimple","catalogEntry","isObject","toISOString","format_skinned","getSingle","getCourseUrl","courseResponse","getCoursePreviewUrl","scheduleOffering","completeTask","taskId","Content-type","fetchMany","courseIds","requestManagerialApproval","getSingleCourse","singleCourseResponse","getContentTypes","createCourse","courseObj","checkLatestCourse","equal","newlatest","latestCourse","getActiveCoursesForOrg","formatForTA","allActiveCoursesForOrg","allActiveCategories","allActiveLibraries","formattedResponse","courseFormattedDates","formatForTACoursesTab","sortedList","getCoursesForOrg","currentCourseSet","customCourses","baiOnly","topOneHundred","getActiveCoursesForOrgFromCache","getSearchableCatalog","getInactiveCoursesForOrg","getCoursesByType","updateCourse","updateCoursePrerequisits","prereqsToUpdate","newPrereqList","Key","Value","displayStart","startDateFormatted","endDateFormatted","getCourseGroup","courseGroupType","formatCourseIds","pluck","getSingleCourseOfferings","getSingleCourseOfferingsOpen","getImodifyUrl","CreateIModifyCourse","resetIModifyCourseContent","resetCourseStatus","getSummaryCounts","getSummaryCountsByCourse","getUserSummariesByCourse","courseID","formatResponse","getCoursePrereqs","formatStatus","date","result","getCourseWithAssignment","getPreviewStatus","uploadScormPackage","scormPackage","shellType","upload","file","getDocumentDetailsforAttachedLaunch","resourceId","currentcss","RGBtoGrey","color","R","G","trim","toUpperCase","test","B","isColorTooLight","shouldTextBeLight","extractColorFromCSS","res","exec","getAlternateColor","handleContrastProblems","Y","adminTabSvgColorAsString","portalId","_getDocumentMimeGroup","filterBy","_format","_formatDocuments","_findObjectById","final","documents","_document","isParent","postedDate","uploadUrlToRepository","Url","attachUrlToCourse","launchWithContent","uploadDocumentToStorage","mimeGroup","uploadDocumentUrl","uploadDocumentToRepository","uploadDocument","attachDocumentFromRepositoryToCourse","getDocumentRepositoryList","getDocumentsForCourse","getSingleDocumentInfo","getAllCoursesByResource","deleteDocumentById","Id","updateSingleAsset","replaceAsset","assetId","fileType","deleteAsset","fileId","getDocumentPath","isDirectLaunchType","typeLower","getDocumentTypeByExt","ext","mimeType","typeMap","application/vnd.ms-word.document.macroEnabled.12","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","text/rtf","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/zip","application/pdf","audio/mp3","audio/3gpp","audio/3gpp2","audio/mp4","audio/ogg","audio/mpeg4-generic","audio/mpeg","audio/rtp-midi","audio/vorbis","audio/ac3","text/html","text/csv","image/jpeg","image/png","image/tiff","image/gif","video/quicktime","video/ogg","video/mpeg4-generic","video/mp4","video/VP8","video/jpeg2000","video/JPEG","video/H264","video/3gpp","application/vnd.openxmlformats-officedocument.presentationml.presentation","application/vnd.ms-powerpoint","evaluationId","locationsService","LocationsService","tempStateData","setData","getData","getCurrentNode","currentnode","peopleGroupStructure","groupId","format_peopleGroupStructure","getPeopleGroupFilters","cache","format_getPeopleGroupFilters","getContainerOperands","formatDisplayNameForOperands","getPeopleGroups","formatForPeopleGroups","allGroupsData","getPeopleGroupUsers","queueSpot","getQueueStatus","lastProcessedDate","dateQueued","processedEndDate","processEndDate","processStartDate","addGroupToProcessingQueue","getPeoplePreview","GroupData","dataCopy","formatGroupDataToSend","getUsersByGroupId","formatPGUsers","userNode","getPageOfUsers","ar","page","pageSize","totalUserCount","currentPage","currentIndex","setEndDate","savePeopleGroup","groupData","dataToSend","endDateRootContainer","setMinutes","getMinutes","obj","displayNames","operandName","operandValue","charAt","displayName","containerOperandsRequired","sendArr","elem","criteriasData","subContainers","subContainersData","subContainerData","criteria","criteriaName","isDate","isBool","valueLabel","formatBool","groupsList","groups","group","groupName","recordDateTime","criteriaArr","operatorsData","autoCompleteData","isDropdown","operands","operand","activePositions","positions","position","secondaryFormatGroupStructure","orgData","jobsData","countriesData","stateData","secondaryFormatGroupStructue_orgData","secondaryFormatGroupStructue_groupData","secondaryFormatGroupStructue_jobsData","secondaryFormatGroupStructue_countriesData","secondaryFormatGroupStructue_userData","secondaryFormatGroupStructure_groupStructure","groupStructure","secondaryFormatGroupStructue_groupStructure","groupStructures","secondaryFormatGroupStructue_01","peopleGroupCleanUpBeforeRender","secondaryFormatGroupStructue_02","criterias","primaryNodes","secondaryFormatGroupStructue_03","selectedItem","additionalDetails","countryId","stateAbbreviation","stateName","filterDataForAutoComplete","fieldName","skinnedAutoCompleteData","personStatuses","output","state","skinnedItem","searchAttribute","pageNumber","advancedSearch","filteredFromUsers","uniq","compact","item","fullNameContains","roleId","fullName","org","enabled","job","country","personTypes","typ","mapUsersForPreview","pgCriteria","generateGuid","generateRootContainer","isSuccessful","deferred","defer","rootContainerObj","containerId","operandId","followHierarchy","parentContainerId","hasChildren","isRoot","promise","generateSubContainer","subContainerObj","groupCriteriaId","criteriaId","folowHierarchy","generateCriteria","formatPeopleGroupsForCopy","output_arr","newPeopleGroupObj","newName","saveCopiedGroup","responseComplete","formatSend","decisionMap","apiDecisionMap","apiRisks","risks","riskRating","created","statusChanged","confirmedDateTime","ruleCreatedDateTime","rank","formatDecisionMap","clientRisks","r","getDecisionMapShell","createDecisionMap","copyComments","updateDecisionMap","getPeerGroups","getDecisionMapById","decisionMapID","deleteDecisionMap","getDecisionMapSummaries","viewArchived","dm","getDecisionMapComputedCourses","getDecisionMapPeerCourses","getComments","commentType","createDate","getAllComments","v","k","saveComment","comment","deleteComment","commentID","getDecisionMapWizardOptions","wizardStep","decisionMapId","getUnrelated","requestEndPoint","getResponsibilityCategories","renameDecisionReport","newReportName","reportName","getHistory","currentStep","h","updated","getRiskDetails","resetDecisionMapConfirmation","decisionMakers","confirmed","getDecisionMap","setFunction","functionValue","role","function","confirmRoleSelection","confirmResponsibilitiesSelection","confirmRisksSelection","confirmCourseSelection","setRole","roleValue","responsibilities","clearFunction","setDecisionMap","setResponsibilites","choices","setExperiences","experiences","setRisks","setSelectedCourses","shouldShowModal","step","resetModalFlag","$httpParamSerializer","getAllJobs","jobsList","searchJobs","updateJob","jobObj","createJob","lastUpdate","types","edit","getAll","getAllActive","request","dateOrged","typeOrged","$broadcast","count","setRequest","getRequest","getResponse","orderByType","keys","messages","label","orderByDate","ref","yesterday","clone","startOf","subtract","unix","sent","isSame","Yesterday","getAllAssignments","currDocument","getBioSigUri","redirectUrl","courseItemIdentifier","activity","nmlsID","email","d4","d5","Email","RedirectUrl","CourseItemIdentifier","Activity","getBioSigHelpPage","addressUtil","messagingDisplayerUtil","sessionFormatterUtil","RosterService","formatableDates","header","formatOfferingsOnly","fetchInstructorAssignments","tense","cancelOffering","completeOffering","curOffering","offering","generic","createGenericOffering","extend","closestSession","closestSessionKey","highestSessionDateForOffering","lowestSessionDateForOffering","courseTypeLabel","getCourseTypeLabel","roster","parse","_generateRosterObjects","formatSessions","extractOfferings","addressExists","isThereAnAddress","address","cityStateZipLabel","getCityStateZipLabel","studentSessions","single","registrationEndDateTime","isAssigned","sessionsExist","setFromOfferingsService","attendingStudents","droppedStudents","pendingApprovalStudents","waitlistedStudents","hasAttendingStudents","getAttendingStudents","getIncompleteUserCount","isOfferingCancellable","students","possibleCompletions","registrationStatus","getAllSession","getLowestSessionIdByDate","lowestSession","lowestSessionId","removeStudentFromWaitList","person","student","createOfferings","formatForSend","formatOfferingsForSend","dateFields","removableFields","formatSessionsForSend","enrollmentRestrictions","instructionalLanguageId","languageId","maxStudentsPerDealer","maxAllowedSize","trainingType","parseIntFields","accordionOpen","localId","instructorIds","instructorPills","isLoading","rosterUser","updateOffering","updateOfferingsBatch","OrgFunctions","updateOrganization","format_AddOrgFields","pOrg","parentOrgName","getOrganizationHierarchy","getOrgTree","getSingleOrg","orgId","createOrgObj","orgObj","typeId","typeName","announcements","updateDateTime","updateUserId","sourceCode","abbreviation","getPortalId","portalCode","isTopLevelOrg","AssignmentsService","CatalogSearchParameters","getPlaylist","addCourseToPlaylist","deleteCourseFromPlaylist","$cookies","roleObj","originalResponse","userApplicationType","auth","currentRole","roles","authedUser","isTopLevel","view","rule","createProxy","proxyData","editProxy","iAudit_ImpersonationID","getAllProxy","getManagerList","advancedSearchStruct","getUrlsForProxy","waitlistStudents","updateSinglePersonOnRoster","offeringType","substituteUser","oldUser","newUser","updateSessionByUserOnOffering","member","formattableDates","memNode","cancellingPerson","sessionUpdateIsLoading","statusForDropdown","getDropDownStatus","hasCompletedTheOffering","set","formatFromOfferingService","completionStatuses","userCount","completionDate","incompleteUsersInAttendingRoster","getWaitlistedStudents","getPendingApprovalStudents","generateMailToFromUsers","emails","getCorrectSessionFromUser","personId","sessionId","curSession","updateMultiplePersonOnRoster","enrollSingle","newStartD","newEndD","newEndDate","newStartDate","isAfter","setPortalEndTime","formatSingleRule","afterDueNotificationDays","beforeDueNotificationDays","formatCourseObj","newCoursesArr","ruleCourseObj","ruleCourseId","dueDateFixed","acceptPassingScoreDate","dueDateDaysFromKey","dueDateDaysFromValue","recordUserId","foriegnSystemId","recurrence","formatRuleForCopy","startDateCopy","endDateCopy","newRuleObj","setPortalStartTime","isAddYear","getAllRules","getSingleRule","ruleGeneralCall","format_courseDates","flagDueDateMethod","getRuleAssignments","getRuleCounts","updateRuleAssignments","Courses","saveCopiedRule","getRuleStatusOptions","createRuleObj","reoccurance","lastUpdatedByUser","lastUpdatedByUserId","lastProcessedOn","lastUpdatedOn","getRuleHistoryByStep","ruleStep","oldVNew","oldDateTimeValue","newDateTimeValue","synonymsMap","catalogPaths","documentCatalogPaths","currentDocumentCount","executeProductSearch","param","formatSearchResults","azureResults","formatted","formatDocument","getSynonymsMap","synonyms","formatSynonyms","synonymsString","synonymsArray","j","synonymArray","term","getSuggestions","encodeURI","suggestions","formatSuggestions","x","Name","searchText","courseCode","CourseCode","detailsUri","getDetailsUri","library","getShortLibraryName","getTopLevelPath","Paths","getProductById","productId","azureDocument","Description","Duration","displayDuration","displayImageCode","ImageCode","displayInteractivity","InteractivityTypes","displayNotes","Notes","displayRoles","Roles","displaySkills","Skills","displayTopics","Topics","product","detailsUriBase","detailsUriSuffix","getCatalog","paths","getDocumentCatalog","formatCatalogPaths","azurePaths","taxonomy","libraries","azurePath","getDocumentCount","short","TimezoneService","insightsAccess","maxEnrollmentAttemptsAllowed","features","cacheOptions","getSettingsWithAudit","random","updateSettings","enrollmentAttempts","Error","sysProperties","retakeLimitDetails","sysPropInstructorLed","sysPropCourseGroups","sysPropTasks","sysPropIDesign","sysPropVirtualClassroom","sysPropLDConnect","sysPropEarlyAccess","sysPropTrainingInsights","sysPropCareerPath","sysPropCareerPathDashboard","sysPropProxyMode","sysPropRusticiAccess","sysPropDocument","enableOverdueBanner","enableLmsPlmIntegration","timezones","getAllTimezones","details","getTimeZoneById","lastUpdateOn","toLocaleString","beforeValue","previousTimezone","beforeValueText","timezone","sysPropDefaultMasteryScore","enrollmentLimitType","enrollmentLimitCount","enrollmentLimitDays","enrollmentLimitRefreshMonth","enrollmentLimitRefreshDate","typeDate","sort","a","b","lastUpdateBy","countDate","daysDate","monthDate","dateDate","latestDate","max","rollingLastUpdated","annualLastUpdated","retakeCount","retakeDays","retakeMonth","retakeDate","isPlmIntegrationEnabled","isILTEnabled","isCareerPathDashboardEnabled","isTrainingInsightsEnabled","isProxyModeEnabled","isDocumentsEnabled","isOverdueBannerEnabled","getCoursesNotUsingDefaultRetake","formatCourses","resetCoursesToPortalDefault","courseSetting","retakeRestriction","retakeRestrictionName","fetchUserSkills","fetchSkillsForCourses","sortByPropertyContains","viewValue","propToFilter","index","getLatitudeStateList","getLatitudeAllStateList","surveyId","getTasksApprovalTA","taskApproval","isComplete","getSummary","fullyRecursive","pieChartData","complete","incomplete","overdue","getCareerPathSummary","getCareerPathStudentSummary","teamType","getTeamList","alternate","managerUserId","addChartDataToTeamList","teamList","tempTeamList","slice","profileExpanded","getTeamMgrAssignmentSummary","getDirectTeamList","currentUserId","getAlternateTeamList","getDirectTeamListByManagerId","searchAssignments","keyword","encodeURIComponent","formatAssignments","getTasksForApproval","formatTask","getListOfAssignmentsToApprove","getRollup","recursiveTeamList","all","teamMember","isManager","checked","hidden","getSummariesByUserId","ids","tasks","task","getStudentSummary","totals","getOverdueAssignments","localTimeZone","getMyTimeZoneAbbreviation","d","timeZoneName","pop","tz","rangeFetch","formatToSendForCreate","batchCreate","maxEAA","isSaba","uniqueIds","editable","getSingleTranscript","updateTranscript","updateSingle","stuId","fetchCompletionCounts","fetchLatest","userIsChangingPw","userIsEditingProfile","goingToTranscript","setChangingPwFlag","setEditProfileFlag","setHomeRole","getCurrentRoleType","optionalType","formatMultipleUsers","validatePassword","username","password","Password","UserName","refreshReactCookieStore","requestTemporaryPassword","resetPassword","userName","formatSingleUser","login","setUpCreds","updateFromReact","responseData","changeUserContext","revokeImpersonation","switchProfile","clearLocalSessionState","sessionStorage","removeItem","baseUri","querySelector","href","LEGACY_GLOBALS","refreshCookieStore","editMyProfile","userCopy","editProfile","taEditProfile","getManagerSabaReportUrlIRR","callback","currentTimezone","getManagerSabaReportUrl","reportCalled","getAllUsersForTa","allUsersData","deactivateUser","activateUser","batchUpdateUsers","users","updatedPropertiesAndValues","u","requestMsg","getUserTrainingAudit","getIdesignUrl","getNavigation","userType","getUserType","display","alternateManagers","droppingStudent","showCheck","showEx","String","fromCharCode","Uint8Array","pako","inflate","atob","decodeURIComponent","taDomains","activeDomain","impersonate","pausePortal","localStorage","setItem","getItem","hasRole","getRoleObjectByName","setCurrentRoleCookie","getObject","userCookie","getUrlsForRoles","roleName","isUserAboveStudent","setUserContext","topLevelOrganizationId","isSubDomainAdmin","putObject","getCurrentRole","isAdmin","isInstructor","customLogoUrl","isStudent","getName","firstName","lastName","getJobPosition","jobType","getUserName","getCountryId","getStateId","stateId","getAddress","formattedAddress","formatAddress","getHireDate","hireDate","newdt2","newDate","dateObj","newdt1","setStartTime","hour","minute","second","getSeconds","millisecond","getMilliseconds","setEndTime","format_advancedSearch","getSabaManagerReportUriFromCookie","createUser","userObj","getAllInstructors","isInFuture","isUserActive","isSSO","getManagerTree","getUsersResponsibilities","hasCareerPathAccess","hasAdminRole","displayTime","displayDueDateTime","getSignedJwt","payload","getPlmAlerts","$timeout","BreadcrumbsService","CountriesService","StatesService","TranscriptsService","CoursesService","apiError","passwordChangeSuccess","showPasswordForm","showEditProfileForm","StateId","latitudeCountryList","stateList","isLoadImmediate","homeTemplate","settings","showResponsibilities","hasCareerPaths","loadStateAndCountry","loadStates","resetMessages","profileUpdateSuccess","clearDisplays","displayLoading","displayApiError","displaySuccess","displayPasswordChangeSuccess","displayProfileUpdateSuccess","toggleEditProfileForm","togglePasswordForm","changePassword","baiform","$viewValue","toggle","clearForm","resetpw","AssessmentService","SurveyService","EvaluationService","IltRosterUtilities","actionText","statusText","successMessage","productError","hidePrereq","hide","hideAttached","executeAction","currentRoute","attachTriggered","launchCourseCallback","courseUrlPromise","closeAction","launchedCourse","configureActionButton","executeWbtPromise","wbtCloseAction","executeWbtAttachPromise","attachCloseAction","checkPrereqsAndLaunch","setActionButtonBehavior","executeAssessmentPromise","nonWbtCloseAction","launch","executeSurveyPromise","executeEvaluationPromise","isHideActionButtonIlt","offeringIsUserRegisteredILT","isUserRegisteredForOffering","showIltSchedule","configureCourseGroupFamily","careerPathCourseID","isManagerApprovalRequired","assignCareerPath","setActionButtonCourseGroupManagerApproval","executeDocumentPromise","assignCourseGroup","uri","uriAfterOriginCheck","contentLaunchUrl","startsWith","origin","open","launchUri","element","modal","setTimeout","resourceUri","setErrorMessage","closeID","timer","setInterval","bases","closed","clearInterval","transcript","refreshTimer","requestManagerApprovalWbt","setActionButtonLaunchCourse","launchCourse","prereqCall","prereqModalData","launcherUrlTitle","assignCourseGroupOrCareerPath","requestManagerApprovalCourseGroup","careerPathStatus","setError","completion","assignmentPromises","futureOfferings","openOfferings","offerStartDate","BillingService","settingsIsLoading","isDashboardDisabledBecauseOfTraffic","overdueBannerLoading","enableAdminDashboardTab","enableCareerPathingTab","enableTrainingInsightsTab","isOverdue","goToHomeTab","openMenu","$mdMenu","ev","logout","adminTabIds","people","content","rules","management","insights","careerPathing","freeze","getSelectedAdminTab","selectedAdminTab","redirectByActiveTab","helpMenuClick","menuItem","getPDF","pdfError","occurred","pdf","Blob","pdfURL","URL","createObjectURL","isMenuOpen","toggleMenu","isPlmEnabled","hasNotifications","initiated","alertCount","fetchNotifications","formatUserParams","givenName","surname","signedToken","btoa","$sce","RoleMapsMixin","currentMethod","courseFailure","homeAction","dump","overrideScope","SearchServices","documentPromises","showDocuments","isSettingsLoading","documentCount","showSuggestions","showLDConnect","minLength","currentFocus","delayedSuggestions","skipDiv","executeSearch","pathname","queryTextOriginal","closeAllLists","getSynonyms","products","valLower","delaySuggestions","delay","handleKeys","keyCode","handleEscape","getElementById","handleEnterOnInput","getElementsByClassName","handleArrowDown","handleArrowUp","handleEnterOnSuggestion","handleMouseOver","removeActive","resetCurrentFocus","clickSynonym","text","clickProduct","clickSeeAll","addActive","skipThis","divId","onclick","targetIsSuggestion","parentIsSuggestion","SUGGESTION_ROW","target","matches","msMatchesSelector","parentNode","$digest","preventDefault","getAttribute","openLibrary","openDocumentsLibrary","openIltCalendar","controllerRoute","breadcrumbType","requestingApproval","certificateAction","defaultHeader","assignmentGet","assignmentGetSuccess","completionView","launchButtonText","fullTypeName","generateBreadCrumbs","CourseStatus","trustAsHtml","selectAll","checkAll","rows","row","select","addOriginInfo","isDocument","launchCourseLoader","curTranscript","breadcrumbParam","mainErrorFailure","mainErrorFailureMessage","slideDown","slideUp","iltCalendarAction","copyrightYear","$anchorScroll","isPremiumContent","hasInstructorRole","hasManagerRole","hasTaRole","taHasInsights","dmHasInsights","scrollTo","scrollId","hash","studentAction","studentquickstartAction","studentdemovideoAction","instructorAction","instructorquickstartAction","instructordemovideoAction","managerAction","managerquickstartAction","managerdemovideoAction","taAction","taquickstartAction","tademovideoAction","traininginsightsAction","forcedScrollTo","loginBackgroundUtil","forgotPassTemplateSwitcher","loading","iframeLoaded","lockOut","loginstate","iframeLoadedCallBack","ieWarningMessage","createElement","backgroundColor","width","fontSize","padding","innerHTML","body","insertBefore","firstChild","loginStatus","submitPasswordReset","forgotForm","slideTime","errorMessage","checkNewPassword","forgotPassClick","MessagesService","messaging","inboxAction","tooMany","messageCount","overrideScopeByRole","TasksService","TeamService","ProxyService","showLogout","logoUrl","goHome","nextUrl","goToRoute","goToBreadcrumbHome","messageBubbleCompletedRequestTotal","messageBubbleTotalPossibleRequests","showNotifications","loadSettings","showProxyMode","hasAccess","getProxyAccess","isSabaUser","hasStudentRole","hasProxyModeRole","hasDecisionMakerRole","navLinks","openSideNav","slideToggle","closeMessagePopup","$event","currentTarget","parents","fadeOut","scoperole","viewType","changeUserScope","scope","changeUserScopeForProxy","toggles","querySelectorAll","addEventListener","contains","$watch","newVal","oldVal","$compile","NMLSService","action","OfferingsService","cancellingOffering","offeringDate","userSearchOptions","searched","rosterStatus","selectedSession","sessionOrder","statuses","GroupsService","myManagementsActive","myAccessActive","proxyListError","sortPropertyName","currentRoleTA","currentRoleManager","userSelected","managerSelected","loggedInUserId","portalStartTime","proxy","portalEndTime","setEditProxyEndTime","initNewProxyStartDate","propertyName","reverse","property","proxyList","impersonatorID","views","managerList","noResults","userTypeahead","iHR_ImpersonatingUserID","searchUserPromise","noResultsMgrs","managerTypeahead","iHR_ImpersonatedUserID","searchManagerPromise","managerUserTypeahead","searchManagerUserPromise","setProxyUser","selectedUser","setProxyManager","selectedManager","savingProxy","errorThrown","submitView","proxyName","getSingleProxy","impersonationID","closeEditProxyModal","deactivate","udpatingProxy","exportLoading","getProxyListCSV","guess","userManualHref","taRoleOrgIds","isPremium","launchReports","openReportVideo","src","new_page_title","write","addApiError","apiActionLoader","dateRangeError","day","eodToday","isFutureSelected","myDate","offeringsAreLoading","orderProperty","filterView","showCompletionButton","singleIsLoading","userAcceptsRisk","currentAssignmentFilter","searchEndDate","searchStartDate","setYear","getFullYear","transcriptSearch","pageOptions","calendarAction","properFiltering","assignmentFilter","getRequiredAssignments","fetchAssignments","editCourse","alert","deleteCourseGroup","courseGroup","confirm","scheduleCourse","requestManagerApprovalCareerPath","requestManagerApprovalInProcess","addCareerPathError","closeSlider","siblings","removeClass","addClass","getNewestAssignmentsCareerPath","assignmentLaunched","showFailure","fileFormat","typeParam","openTranscriptCreator","transcriptAddModal","createTranscript","transcriptAddLoader","openCertificate","getTransriptStatus","getTranscriptScoreText","score","getCourseCode","changeUrl","getCompletedAssignments","isRequired","getNewestAssignments","getMyPicks","isUserAssigned","getInProgress","getSurveysAndEvaluations","click","resetAddTranscriptModal","form","$setUntouched","$setPristine","completeAssignment","viewTypeId","apiErrorMessage","apiActionError","dropElectiveCourse","switchFilter","mapStatusLabel","inProgress","new","pendingApproval","successful","unsuccessful","mapStatusFromRosterCounts","getStatusForOfferingFromRoster","mapStatusForCssFromRosterCounts","attend","loggedinUser","attendingRoster","atten","waitL","waitlistRoster","wait","pender","pendingRoster","pend","isUserRegisteredInILT","isMaxWaitlistLimitReachedILT","overTheMaxWaitlistLimit","maxWaitlistSize","attendingRosterCount","getDueState","isBefore","isBetween","getTranscriptDefaultCompletedOnDate","defaultCompletedOnDate","getTranscriptDefaultCompletedBeforeDate","changeInstructorCourseTense","viewCertificate","toggleDescription","opened","attr","closeWelcomeVideoModal","neverShowAgain","is","getFullAssignmentTypeName","openManagerSearchFilters","openAdvManagerSearchFilters","isOpenForEnrollment","openToEnroll","requestedOn","setDefaultStartDateTime","newdt","setDefaultEndDateTime","setDueDateEndTimeForMomentObj","momentObj","getEndDateTimeFromPicker","triggerTranscriptSearch","startDate2","isCourseGroupType","includeCareerPath","directive","restrict","transclude","attrs","ctrl","isError","isbioSigModalLoading","bioSigLoader","showBioSigFrame","reloadAssignments","openBioSigModal","context","nmlsEmail","callBioSig","require","$validators","maxTimeString","modelValue","valid","maxTime","parseTime","valueTime","$attrs","CatalogService","CategoriesService","addAssignmentsWithLibrary","noUsersSelectedError","initialIsLoading","initialFailed","offeringError","TYPE_ENUM","SIMPLE","WITH_DATE","TEAM_SELECT","parameter","displaytype","userid","STEP_ENUM","ASSIGNMENTS","DUE_DATE","AUDIENCE","SEARCH_TAB_ENUM","PLEASE_BEGIN","LOADING","ERROR","NO_RESULTS","RESULTS_FOUND","searchTabState","AUDIENCE_TAB_ENUM","SELECT_USERS","SUCCESS","audienceTabState","searchCatalog","searchLibraries","searchCategories","searchFields","dueDates","evt","showOfferingsOnAssignments","displayType","stepThreeView","getTeamRecursiveList","apiDueDate","apiDate","fullyRecursiveBottom","teamTree","audienceRoot","alternateDataList","setPropertyOnAllNodes","coursePromises","coursesData","catalogTree","assignCatalog","rootNodeId","rootNodeDescription","friendlyName","catalogDropdownValues","courseTypeDropdownValues","coursesApiAreLoading","errorCode","viewCoursesError","rootId","rootDescription","childNode","searchResults","queuedAssignments","assignmentsToggledForRemoval","clearAddAssignmentsModal","viewOfferings","selectedOffering","enrollError","audienceData","selectedUsers","autoOpenedList","noAssignmentsSelectedError","anySelected","selectedCount","activateAssignmentsPill","buttonDisabled","selectAssignments","deleteAssignmentsToggledForRemoval","activateDueDatePill","selectUsersRecursively","alternateTeamList","assignmentsToRemoveIds","selectDueDate","nextButton","submitAssignmentsForSelectedUsers","selectAudience","stubResults","checkKeyword","checkCatalog","checkType","queueAssignment","toggleAssignmentForRemoval","toggleUser","recursive","assignmentIds","offeringAssignments","applyNewAssignmentsCta","selectCourseInList","prev","idx","offeringInProgressMessage","offeringInProgress","offeringWaitlistMessage","offeringWaitlist","offeringErrorMessage","submitAssignmentPromises","Promise","promises","assignmentKey","on","cpFilter","direct","alterate","sub","addAssignmentsAction","addAssignmentsActionForAllTeams","setDefaultAssignmentType","setDueDateEndTime","mgrUpdateDueDate","editAssignment","finalDate","openCalendar","changingDueDate","getShortAssignmentAssetTypeName","addAllCourses","offeringsLoading","getRosterStatus","hasEnrolledOfferings","some","enrolled","hideOfferings","withRosterStatus","pending","attending","waitlist","updateSelection","overlayDiv","toBoolean","string","AngularPrint","post","print","$animate","printIf","appendChild","createTextNode","head","sheet","insertRule","printTable","div","tds","className","DocumentActionButtonController","baiMainContentLink","hideFooter","$parsers","transformedInput","$setViewValue","$render","ScheduleCourseController","isMaxWaitlistLimitReachedILTSearch","waitlistedRosterCount","requestApproval","approval","assignmentID","assignID","apiMessage","show","apiScheduleErrorMessage","closeSubordinateProfileModal","SkillService","openUserProfileStats","transcriptCountsLoaded","transcriptLoadedError","responsibilitiesLoaded","showAchievementsError","achievementsError","careerPathsLoading","skillsLoading","coursesCompleted","eventsCompleted","courseGroupsCompleted","usersResponsibilities","careerPathsCompleted","usersSkills","cc","ec","cgc","$element","ngModel","dateChecker","transcriptAdd","$setValidity","batchAddTranscript","batchStartDate","batchCompletionDate","passwordMatch","passwordReset","passwordmatch","passwordRules","$validate","integer","patternBased","pattern","checkForRequiredStatus","RegExp","noDefault","$touched","elm","model","invalidIfValueExistsIn","ngModelValue","arrayOfValues","$eval","baiInvalidIfValueExistsIn","currentValue","baiNgPatternIfFieldNotDisabled","disabled","ngDisabled","ngPattern","el","validate","val1","val2","date1","date2","isInclusive","dateOrEquals","dateBefore","unshift","dateAfter","baiMax","invalidIfValueExistsInSubcategoryNames","baiSubcategoryNameUnique","$parent","subcategoryForm","parentCatID","valueExistsAlready","ngBlurDelay","templates","isOfferingsCalendar","month","number","isCurrentMonth","isToday","year","week","selectedView","dateInLoop","start","_removeTime","_buildMonth","days","weekStart","_buildWeek","previous","filterCourseByDay","input","monthForCalender","filterOfferingByDay","dayView","curDay","weekView","monthView","toScheduleAssignmentId","toScheduleAssignmentType","toScheduleSessionId","args","done","weeks","monthIndex","CareerPathService","managerView","managerview","openCloseInfo","showInfoLinkText","hideInfoLinkText","singleCourseSlideDown","viewResourceElem","modIndex","modulo","parent","found","lastIndex","triangleSideWidth","triangleHeight","triangleShift","endOfRow","lastChild","mover","skillsCount","achievedSkillsCount","getCourseGroupData","after","openCareerPathInfo","childCourseOrderProperty","openCourseGroupInfo","isScheduled","courseGroupdata","skillsList","totalCourses","totalCompletedCourses","completedCourses","courseGroupCourses","displayTimeUserSetting","toggleDisplayTime","documentHeartController","MyDocumentsService","addToMyDocuments","setHeartToRemove","refreshMyDocumentsSignal","removeFromMyDocuments","setHeartToAdd","myDocumentsActionFunction","imageSource","myDocumentsText","haveDocumentHeart","ProductType","CourseType","isInMyDocuments","showText","files","DocumentService","deletedFiles","addDocumentToCourseError","documentCourseList","setResourceLaunchWithContent","resource","deleteFile","delFile","hideDropdownIn","btnDisabled","addNewDocumentCta","addDocumentsWithLibrary","queuedDocuments","documentsToggledForRemoval","clearAddDocumentsModal","noDocumentsSelectedError","searchDocuments","queueDocument","toggleDocumentForRemoval","submitDocumentsForSelectedUsers","addFileFromDocRepo","fileToAdd","fromRepo","fileOrUrl","circleMessage","ctx","getContext","Chart","Doughnut","objects","selectedObj","optionalRowDisplayer","optionalSelectedRowDisplayer","optionalOnClick","pickerVisible","togglePicker","hidePicker","chooseObj","which","$apply","baiEnterKeyHandler","imageExists","_getDefaultImage","minDate","maxDate","showTimeToggle","onChange","placeholderOverride","displayInline","onAssignonChange","isDefined","onDateTimeChange","newValue","oldValue","currentTime","retObj","retObjAssignOn","toggleDateTimedisplay","pages","errorMicro","warning","errorPreformatted","neverHide","dontDisappear","minTimeString","minTime","sortService","selectOptionsData","containerOperandsData","parentData","containerOperands","typeaheadMinLength","typeaheadWaitTime","level","matchParent","containerLimit","singleCriteriaOperands","singleCriteria","datapoint","setOperandsDataInCriteria","isArray","dataForSubcontainers","append","updateNgModel","selectedOperandId","option","$item","$model","$label","criteriaDataPoint","drilldownOperatorSelect","$index","selectedCriteriaId","isDropDown","formattingDate","setContainerOperandName","invalidPeople","subind","addMoreActions","addFilterRule","newCriteria","addChild","addSibling","$emit","removeFilterRule","removeChild","containerPopover","isOpen","mouseenter","parentElement","mouseleave","playlistHeartController","PlaylistServices","addToPlaylist","refreshPlaylistSignal","removeFromPlaylist","playlistActionFunction","playlistText","haveHeart","isInPlaylist","flags","regexValidateFlags","regex","regexValidate","$formatters","$document","mousemove","y","resizer","pageX","resizerMax","resizerMin","left","resizerLeft","resizerRight","innerHeight","pageY","bottom","resizerTop","resizerHeight","resizerBottom","height","mouseup","off","previousScroll","currentScroll","scrollTop","onScroll","$direct","optRunOnSelect","autocompleteVisible","filterRows","hideAutocomplete","showAutocomplete","objName","scoped","childCourseIndex","passedInAssignment","openCourseInfo","eventName","isInACourseGroup","courseGroupList","getAssignment","iltNoOfferingsMessage","propToCheck","isDroppable","source","getCourse","getOfferings","getTask","getEvaluation","getAssessment","getSurvey","showCompleteTaskButton","parentCourseGroupId","enforceOrder","showScheduleCourseButton","flag","useCourseId","evaluation","assignedBy","survey","coursePromise","requestApprovalInProcess","hideappReqSubModal","getHtml","secondary","offeringListOpener","offeringIsOpenForEnrollment","activator","icon","class","inputData","onClick","nodeNowHidden","treeError","currentlyHighlightedNode","tempId","selected_group","toggleTreeVisibility","treeClosed","backgroundTasks","_id","_group_id","predicate","object","lowerCaseName","lowerCaseSearch","originalData","newTree","getNodeIfItExistsInTreeByInternalId","potentialNode","searchUpdateCallback","rootNodeIsTopLevel","addIds","addGroupIds","nodeIndex","initiallySelectedNodeName","getNodeIfItExistsInTreeByPredicate","initiallyOpened","showLocks","canDrillDown","iconClick","peopleGroupId","iconClickCourseEdit","requiredOptions","viewAssignmentsCta","assignmentsAreLoading","viewAssignmentsError","assignmentsData","errorSpinner","prescriptiveRuleId","displayStatus","typeToDisplay","originalDueDate","disableRequiredDropdown","requiredDropdownTitleText","disableDueDatePicker","noDueDateText","dueDateTitleText","assignedById","originalIsRequired","viewAssignments","addNewAssignmentCta","assignmentModalhide","closeNewAssignmentModal","courseModal","courseSearch","modalBodyShow","coursesAreLoading","assignmentsAddedSuccessfully","getCoursesCta","selectedCourseCount","formattedCourseData","formatCoursesData","courseData","getSelectedCourses","checkForLength","applyCourseError","coursesAreApplying","selectedCourses","selectedCoursesArray","changedAssignments","changeDueDate","updateAssignmentsCta","getChangedAssignments","applyCtaViewAssignments","toggleRemoveAssignmentConfirmation","closePopup","toggleWaiveAssignmentConfirmation","toggleReactivateAssignmentConfirmation","adminRemoveAssignment","offeringsLoaded","removeAssignmentOfferings","getRosteredOfferings","removeSingleAssignment","adminWaiveorReactivateAssignment","invalidScore","updateFailed","successfulAssignment","markSuccessful","completionMaxDate","completionMinDate","closeMarkSuccessfulModal","updateSuccessfulAssignment","markingSuccessful","scopeError","originalStatus","originalScore","transcripterror","resetAssignment","resetAssignmentStatus","closeResetStatusModal","resettingCourseStatus","assignmentOfferings","fullDateWithTime","viewRosteredOfferings","toggleRemoveOfferingConfirmation","removeSingleOffering","removed","removeList","OfferingId","RegistrationStatus","AssignmentType","openResourceInfo","resources","fileFormatName","prototype","val","wordwise","tail","substr","lastspace","collection","keyname","factory","createOrgHierarchyList","organization","dictionaryToSaveOrgsTo","currentPathArray","orgFolder","currentPathArrayCopy","orgObject","unflatten","idMarkerString","parentIdMarkerString","rootCheckerFunction","includeFilterFunction","arrElem","mappedElem","tree","mappedArr","len","getSubIdsRecursively","rootNode","listToStoreIdsIn","idMarker","OrganizationsService","JobsService","peopleGroupActions","userRole","assessment","ilt","vle","wbt","courseGroupCurricula","courseGroupCertification","addressObj","addressLine1","addressLine2","addressLine3","city","postalCode","getPortalTimeZoneSettings","localStartTime","localEndTime","portalTz","ianaName","startTimeHours","startTimeMinutes","endTimeHours","endTimeMinutes","localTz","testTimeStringFormat","timeString","zoneAbbr","mmt","dayName","monthNumber","time","dateAsObj","dateTime","generateNormalTimeFormat","hours","minutes","_convertMinutesToDoubleValue","parseFloat","convertDoubleToMinutes","str","toFixed","splits","leftoverSplits","ampm","isTimeFormatValid","validMonth","validDate","daysInMonth","thrown","_headers","_getHeader","_getHeaders","_setHeader","_request","getHeader","getHeaders","setHeader","parseColor","array","drawBackground","canvas","image_uri","background_image","Image","onload","drawImage","multiplyColor","rgbaColorArray","pix","imgData","getImageData","n","putImageData","formatPathParams","parentPath","nameFormatted","expireObj","popup_window","popupsAllowed","focus","close","existingSessionRanges","_sorted","formatSession","meeting","_organizeSessions","hoursSpent","_round","createSessionsByStandardRepeat","sessionCreator","repeatType","repeatAmount","endDateClone","startDateClone","endTime","startTime","canCreateSession","includeWeekdaysOnly","offeringName","_checkForSessionOverlap","createSessionsByRepeatingDays","dayDifference","startDateDay","nextSession","_getTimeForTimeFields","nextSort","shift","_valueState","_insertIntoCorrectSpot","curDate","nextDate","valueDate","rndhex","webcrypto","nodecrypto","crypto","getRandomValues","msCrypto","bytecount","o","process","release","randomBytes","err","floor","guid","queries","_add","_create","delete","_delete","$routeParams","WizardHandler","filterRowsByCatalogId","hideCatalogSearch","activeTab","tab2_Options","contentSearch","showTrainingInsights","allCoursesData","baiCatalogTreeFilter","baiCatalogIsLoading","customCatalogIsLoading","rowsAreLoading","baiCatalogCta","customCatalogCta","baiCatalogError","baiCatalogOptions","baiCatalogTreeTitle","orgRowDisplayer","orgPathIndex","orgName","selectedOrgDisplayer","allCourses","baiCatalogPromiseData","baiCatalogData","assignmentTableError","manageCourse","categoryRows","courseCodes","baiCatalogNodeClick","coursesArray","filteredCoursesFromCatalog","mapCatalogCoursesToCourseDetails","catalogCoursesData","nodeSubset","displayCourseList","customCatalogError","customCatalogOptions","customCatalogTreeTitle","changeFilter","selectedCourseCategory","rowDisplayer","categoryPathIndex","categoryPathArray","selectedDisplayer","changeCommonDates","editAction","potentialCourseCategory","typeFullName","BAIOnly","categoryRow","fetchSingleCourse","maxEnrollmentAttempts","extra","save","tempCourse","ASSIGNMENT_TYPE_ENUM","WBT","ILT","COURSEGROUP","TASK","EVALUATION","SURVEY","ASSESSMENT","ASSIGNMENT_TYPE_TITLE_ENUM","currentAssignmentType","formData","createdCourse","documentList","maxEnrollmentAttemptsIsUnlimited","enrollmentAttemptsRegex","nonScoring","selectAssignment","currentAssignmentTypeFullName","wizard","goBackToStep2","hideModal","_attachFiles","scormPackages","filesToUpload","fileObject","addScormPackage","$files","isNotZipFile","uniqueId","now","removeScormPackage","fileToRemove","_clearCourseCreateForm","courseList","passingScore","_showCreateError","serverErrorResponse","_showWizardSuccessScreen","_showWizardErrorScreen","addCourseToCourseGroupList","selectedCourse","_course","removeCourseFromCourseGroupList","courseToRemove","addExtraCourseProperties","createAction","wizardTitle","$uibModal","TreeHelpers","hasOfferingErrors","IsRusticiFlag","showCareerPath","shouldShowDocuments","originalRowData","customCatalogData","setStartandEndIndex","general","sequenceCourseSave","courseactivetab","showcoursesactivetab","filterBySearch","searchProp","filtered","calculatePages","startIndex","endIndex","home","limit","maxVisiblePages","nextPage","onSessionsTab","onOfferingsTab","onRosterTab","showDocumentURLInput","showDocumentFileInput","availableSkills","prereqsToInsert","prereqsToRemove","iModifyLoading","previewStatus","filterby","childrenUpdated","normalizedProductType","documentCourseId","parentBAICourseId","getDocumentName","DescriptionSelectModalTitle","rusticiCourseId","cancelMessage","getSecondaryDataForEdit","setEvaluations","getCoursePrerequisits","taxonomyOptions","subcategoryDisabled","createUniqueCategoryList","selectCategory","setSecondaryProperties","getCourseOfferings","coursePrerequisitsOnLoad","prereq","courseContentTypes","launchUrl","updatePassingScorelaunchUrl","errorDate","viewMore","ready","processing","statusID","processed","docType","documentName","showDocumentName","setDocumentPreviewStatus","sendEditCourseCall","courseAssetsUpdate","prereqsIdsToUpdate","skillsUpdated","confirmIsOpen","allPromises","documentUpload","$dirty","urlUpload","docUpload","documentType","filename","childCourses","getOrderedChildCourses","courseIltUpdate","updateCourseIlt","courseCommonUpdate","updateCourseCommonProp","updateCourseAssets","success2","toggleConfirmation","editCourseOfferingsError","editCourseOfferingsRosterError","updatepromisedefer","addpromisedefer","batchUpdateOfferings","batchAddOfferings","offeringsUpsertPromises","isDirty","maxRegistrationEndDateTime","offeringCopy","errormessage","deferredOfferingsPromise","updateditem","updateOfferingRoster","setOfferingAccordionHeading","apiSession","sd","ed","createdItem","registerToRoster","isExisting","batchUpdateUserInRoster","updateCourseOfferingRoster","stepSix","editOfferingsIsLoading","showOfferingsLoading","stepFive","showOfferingsWithStatus","displayedOfferings","initializeSessionCreator","courseOfferingsPromise","locationsPromise","instructorsPromise","offeringsMetaDataPromises","locations","stepFour","instructors","setOfferingInstructors","setSessions","hasError","SetCourseEndDateBoundaries","SetCourseStartDateBoundaries","getCourseSessions","offeringIsDirty","offeringsForm","$invalid","hasInvalidOfferings","offCheck","getOfferingwithNoSession","hasOfferingWithNoSession","setIltSessionMinMaxDates","allSessions","offeringStatus","courseOfferings","inst","matchInstr","rosterSaving","successCalls","failedCalls","successUser","singleUserToRosterError","repeatOptions","addMoreItems","last","offeringsWithStatus","getCourseOfferingsRoster","editRosterIsLoading","refreshCourseOfferingsRoster","attendingStudent","catalogTreeDataCopy","custContIdx","custDocIdx","customDocumentsCatalogData","policiesIdx","documentTreeData","taxon","catalogNodeType","coursesSelected","baiDocumentsCatalogData","catalogNodeClick","catalogParentNode","selectedNodes","call","baiCourses","baiDocuments","customDocuments","emptyArray","showDocumentsCatalog","getInactiveCourses","getActiveCourses","createCourseArrays","popoverIsOpen","offeringInUse","selectInstructor","instructorReader","instructorLabel","selectLocation","facilityId","mailingAddress","cloneOffering","courseUpdateMethod","setOfferingEnrollmentOpensDateBoundries","setOfferingEnrollmentEndDateBoundries","setNewOfferingDefaults","displayOfferingsWithStatus","removeUserForInstructorList","removeOffering","offeringUpdateMethod","allsessionscopy","sessionKey","selectDayForSessionCreator","hasClass","toggleClass","createSessions","errorCount","repeat","removeSession","createOfferingsCall","offeringsToCreate","offeringsToUpdate","updateOfferingsDeferred","allOfferingsPromises","createOfferingsDeferred","nOffering","uiOfferingUpdated","ofr","setCourseCancelMessage","maxEnrollmentAttemptsToggle","newCareerPath","assignmentTypeIndex","visible","stepTwo","getEnabledSteps","goTo","jsStartDate","previouslyAddedCourses","courseToUpdate","courseLoadPromises","allSuccess","setNonScoring","masteryScore","_initAdditionalStep","exists","_stepFourAction","autoCompleteError","_stepSixAction","currentCompletedTotal","currentSuccessTotal","totalCompletionsPossible","addUsersToRosterCall","updateUserInRoster","trackUserToRosterCompletions","singleUserToRosterSuccess","getTotalSessionsForAllOfferings","totalSessions","searchForUsers","searchAttributes","existingUser","selectUsersForRoster","removeUserFromRoster","stepThree","performSecondaryAction","launchEditor","changeSortBy","evaluationsNsurveys","getEvaluations","filteredData","formatCoursesPrerequisiteData","allCoursesFromCache","courseSearchModal","getAllCoursesCta","getAllCoursesWithSkills","courseIDs","skillsString","skillsToString","sorted","getAllCoursesPrerequisiteCta","applyNewPrerequisiteCta","existingIdx","removedIdx","addIdx","removePrereqCourse","removeCourse","addNewPrerequisiteCta","nodeClick","courseGroupSubset","output_Arr","coursesSubset","allCustomCourses","courseDataOriginal","launchIModify","IModifyMessage","IModifySuccessThrow","IModifyErrorThrow","CreateNewIModifyCourse","IModifyRedirect","launchIdesign","treeOptions","nodeChildren","injectClasses","ul","li","liSelected","iExpanded","iCollapsed","iLeaf","labelSelected","setSelectedOffering","mostrecentOffering","initStep5","localTimezoneString","step5OfferingSelectChanged","validateSessionCreatorDates","minDateToCheck","maxDateToCheck","dt","currentOffering","minSessionDate","maxSessionDate","maxCourseStartDate","minCourseEndDate","effectiveStartDateChanged","effectiveEndDateChanged","initStep4","setEnrollmentDateBoundries","setSelectedOfferingForOfferings","initStep6","selectedOfferingIndex","numOfOfferingsToLoad","minimumEnrollment","cancelDays","waitlistDays","earliestSessionDate","accordionHeading","accordingHeading","enrollmentClosesChanged","prtEndTime","enrollmentOpensChanged","prtStartTime","maxRequestedOnDate","minRegistrationEndDateTime","offeringNameChanged","maxAllowedSizeChanged","noSessionOffering","openInstructorDeskModal","windowClass","backdrop","switchDomains","onActiveDomainChanged","oldDomain","hideFromCatalogChanged","hideFromCatalog","enrollmentClose","ValidateCourseRetakeMonth","ValidateCourseRetakeDate","startDatetime","endDatetime","getParentElement","targetNodeName","nodeName","dragOver","srcElement","tr","tbody","nextSibling","dragEnd","dragStart","dataTransfer","effectAllowed","ex","el1","el2","cur","previousSibling","orderedList","curId","skillsTypeahead","courseSkillsLimit","existsInOutput","setCourseSkill","courseSkill","canRemove","skillID","removeCourseSkill","skillIndex","imageList","imageSelect","shownImages","fetchImageList","Images","first","temp","tileImageSelectModalTitle","closeImageSelectionModal","selectedstring","finalizeSelection","rebuildSubcategoryOptions","subcategories","setCourseCatalogID","uniqueCategories","selectedCatalog","parentCategory","openPreview","setDocumentContent","documentUploadName","uploadDocumentContent","fromWizard","uploadDocumentFile","setDocumentType","contentTemplate","showList","dashboardLoading","dashboardSummaryError","listLoading","listErrorThrown","showCareerPathWelcomeMessage","dashboardSummaryCounts","dashboardSummaryErrorMessage","careerPathList","createCareerPathDoughnut","listErrorMessage","cpData","totalStudentEnrolledCount","doughnutCounter","dataOrdered","totalCPs","careerPathDoughnutData","extraCPs","assignmentsCount","completionsCount","enrollmentsCount","inProgressCount","notStartedCount","skillsDevelopingCount","createTooltip","sixthCPLabel","cpdnut","setupDoughnut","cpName","defaultDoughnutOptions","showTooltips","customTooltips","tooltip","innerHtml","tooltipEl","opacity","chart","offsetLeft","offsetTop","animation","percentageInnerCutout","careerpathData","setup","exportFullReport","loadDetails","showDetails","detailsLoading","detailsErrorThrown","detailRows","detailsErrorMessage","openVideo","InsightsService","InsightsDecisionMapService","commentSection","decisionMakerName","createdecisionmapAction","decisionmapcoursesAction","wizardAction","currentWizardStep","decisionmapreportAction","createNewDecisionMap","decisionMakerContent","decisionmapreport","successDisplayerUtil","getCategories","showCustomContent","allUniqueCategories","showOnlyDocumentTaxonomy","managementSearch","scopedViewListData","modalIncludes","OrgTreeTitle","orgTableError","OrgOptions","OrgData","lockIcon","orgCutoff","originalOrgList","deleteModal","CoursesData","vieworganizationsAction","filterSel","orgTableIsLoading","isOrgsListPage","orgSelected","orgFilter","orgExpanded","OrgNodeClick","SearchData","peopleSearch","isJobsListPage","updateOrg","orgform","organizationCta","viewOrgForm","createorgAction","createHeader","orgCreateObj","organizationsDataPromise","orgList","formatOrgDataForTypeahead","editorganizationAction","singleOrgPromise","selectParentOrganization","temporgList","activeOrgs","aorg","searchParams","jobs","originalJobs","viewjobsAction","jobSelected","jobFilter","jobExpanded","selectJobFilter","editJob","baiForm","closePopover","popoverOpen","editjobAction","jobId","jobNames","optionalToggleActiveStatus","inputJobName","createjobAction","defaultJobHeader","containerOptions","showLock","manageLocation","countriesLoading","createLocation","editLocation","createlocationAction","countries","selectedCountry","getStates","initNewLocationStartDate","sendCreateLocationCall","locationData","editlocationAction","locationId","locationAddress","physicalAddress","defaultCountry","states","sendEditLocationCall","locationsList","treeData","isLocationsListPage","viewlocationsAction","locationSelected","locationFilter","locationExpanded","locationsListData","filterLocations","DocTreeTitle","docTableError","DocOptions","DocData","docTableIsLoading","viewdocumentsAction","isDocsListPage","docSelected","docsListData1","docsListData","DocNodeClick","docFilter","updateDocument","createdocumentAction","sendDocumentCreateCall","clickDeleteDocument","courseName","closeSuccesssModal","clickDocumentSave","confirmSaveDocument","sendDocumentEditCall","toggleSaveDocumentTooltip","singleDocument","documentToUpload","originalName","editDocumentPromise","editdocumentAction","documentFormIsLoading","docId","successData","SettingsTreeTitle","settingsError","settingsSuccess","SettingsOptions","SettingsData","editsettingsAction","SettingsNodeClick","sendSettingsEditCall","setting","sysPropContentRecommendations","sortedRows","items","ValidatePortalRetakeMonth","ValidatePortalRetakeDate","formatToSkinnyOrgData","allorgs","pick","toggleSaveSettingsTooltip","toggleScoreSettingsTooltip","hidePopUpModal","coursesRetakeResetSuccess","settingsRetakeReportIsLoading","GetCoursesNotDefaultRetakeReport","OpenCourseModal","coursesNotDefaultRetakeReport","ResetCoursesRetake","ResetCoursesScore","courseTaxonomyList","iscourseTaxonomyPage","documentTaxonomyList","isdocumentTaxonomyPage","filterTaxonomy","taxonomyFilter","courseAndDocumentTaxonomy","courseTaxonomy","viewcustomcontentAction","courseTaxonomyListIsLoading","filterContentType","courseTaxonomySelected","courseTaxonomyExpanded","docTaxonomySelected","docTaxonomyExpanded","courseTaxonomyData","imageID","categoryList","categoryError","subcatDeactivate","createcategoryAction","CreateCategoryValues","disableCategoryDropDown","editcategoryAction","hideCategoryTypeDropdown","createCategoryLoading","disableCategoryTypeDropdown","nameInHeading","subCatType","selectedImage","saveCategory","Popover","requestsAction","getAssignmentsToApprove","getTasksToApprove","enrollmentsAction","tasksAction","approveOrDenyRequestCall","approveOrDenyTaskCall","$uibModalInstance","$mdDialog","totalCompleteCalls","groupSaveTotal","totalSavedFromGroupCall","allHours","rosterViewOptions","waitlistViewOptions","pendingOptions","dialogOptions","hasDecimal","userCompletionStatuses","substitutor","updateStudentInBatch","successCallback","errorCallback","finalSuccessCallback","finalErrorCallback","groupSaveCounter","viewAction","userEmailList","offeringComplete","isCancellable","rosterAction","sessionsForDropdown","curIndex","waitlistAction","waitlistroster","pendingApprovalAction","showCancelOfferingModal","focusOnOpen","targetEvent","preserveScope","clickOutsideToClose","answer","closeModal","showCompleteOfferingModal","showDropUserModal","droppedPerson","dropStudent","completingOffering","changeAllStatuses","toStatus","setAllGrades","allGrade","allGrades","gradeRangeError","setHoursSpent","savePersonForFullOffering","changeSession","savePersonPerSession","correctSession","saveAllUsersForCurrentSession","saveAllForFullOffering","fullOfferingUpdateIsLoading","openAdditionModal","openSubstituteModal","substitutee","userSearch","addStudentLoader","setCountOfSelectedUsers","addStudents","substituteStudent","showWaitlistRemoveConfirmationModal","reallyRemoveFromWaitList","locals","removingWaitListStudent","getCorrectLabelForStatusDropdown","highlightDates","curMonth","curYear","dismiss","isSelectedTab","overMaxWaitlister","launchIRRReport","z","hideMaxWaitlist","consentCookieExists","cookies","addConsentCookie","consent","cookieEndDate","setDate","getDate","dataLayer","displayChromeWarning","versionStrCompare","v1","v2","a1","a2","Number","raw","match","chromeVersion","RulesService","PeopleGroupFunctions","filterFilter","rulesSearch","activeRuleData","activeRuleOptions","ruleFilter","activeRuleTreeIsLoading","activeRuleNowHidden","activeRuleTitle","activeRuleError","ruleSelected","listAllRules","isCreate","goToPrevious","createRule","rulesTableError","rulesRowsAreLoading","allRulesData","ruleCreateError","ruleCreateIsLoading","createFailure","isDisabled","create_peopleAction","generalInfoPromise","generalInfo_update","generalInfo","startDateStartOfDay","endDateEndOfDay","endOf","ruleIdForCreate","ruleStartDate","ruleCreateInProgress","createRule_PeopleGroup","createPeopleGroup","isHeaderOpen","createContainerOptions","showRulePeopleGroup","create_assignmentsAction","updatePeopleGroup","create_datesAction","addAssignments","setDefaults","assignmentsPromise","assignOnDate","formatAcceptPriorDates","create_previewAction","isAssignOnDateValid","ruleCount","create_activateAction","updateGeneralInfo","rule_Success","AddAssignmentsOpen","ruleEditTabs","selectedTab","update_getGeneralAction","editRuleGeneralErrror","editRuleGeneralIsLoading","singleRuleInfo","ruleStatusOptions","showEditRuleGeneral","statusOptions","beforeDaysList","singleRule","validateStartDate","getAssigmentsForDateValidation","uniqueNotificationBefore","int","beforeDays","duplicateBefore","dayInt","diff","uniqueNotificationAfter","duplicateAfter","isRuleStartDateEditable","_isValid","closedRule","updateStatus","editPeopleGroup","editRulePeopleError","editRulePeopleIsLoading","update_getPeopleAction","showCourseDateHistory","showGeneralHistory","showCourseHistory","showPeopleGroupHistory","showPeopleGroup","peopleGroupError","peopleGroupIsLoading","reFormattingPeopleGroupStructure","editRuleAssignmentsErrror","editRuleAssignmentsIsLoading","update_getAssignmentsAction","showRuleAssignments","isAssignOnDateEditable","validateCourseDates","modalBodyToggle","update_getDatesAction","todaysDate","batchEditModal","selectedCoursesForEdit","batchEditForm","dueDateDaysStatus","dueDateFixedStatus","assignOnDateStatus","acceptPassingScoreDateStatus","isEditableModal_01","isEditableModal_02","showEditForm","saveBatchEditChanges","toggleDatesSelectionModal_01","toggleDatesSelectionModal_02","ruleUpdateError","ruleUpdateIsLoading","updateRule","resetHistory","updatePeopleandAssignments","fail","peoplePromise","updateRuleGeneralCall","groupStructurePromise","IsRuleCaller","IsRulePreview","previewPeopleError","previewPeopleIsLoading","previewPeople","showPreview","people_rows","invalidPeopleError","invalidPeopleIsLoading","tripleOr","invalidTitle","activeRuleNodeClick","inactiveRuleNodeClick","draftRuleNodeClick","templateRuleNodeClick","copyRuleError","copyRuleIsLoading","copyRuleModal","selectedRules","showCopyTable","rows_In_CopyModal","copyRule","exportPeoplePreviewFormSubmit","peopleGroupCriteriaToSend","inactiveRuleData","inactiveRuleOptions","inactiveRuleTreeIsLoading","inactiveRuleNowHidden","inactiveRuleTitle","inactiveRuleError","draftRuleData","draftRuleOptions","draftRuleTreeIsLoading","draftRuleNowHidden","draftRuleTitle","draftRuleRuleError","templateRuleData","templateRuleOptions","templateRuleTreeIsLoading","templateRuleNowHidden","templateRuleTitle","templateRuleError","dueDateOptions","dueDateMethods","pushInArray","selectUsers","ruleCreate_Step","nextTabName","generalHistory","courseHistory","courseDateHistory","peopleGroupHistory","toggleHistory","totalCount","showHistory","loadingHistory","totalRecords","homeRoute","currentview","advSearch","sendAdvancedSearchQueryToServerAndDisplayUsers","pgrps","pplgrpRows","orgTree","OrgTreeFilter","OrgTreeIsLoading","PeopleTreeIsLoading","managerTreeIsLoading","listFilter","isGroupQueued","selectedGroupName","peopleSelected","advancedSearchParams","has","group_name","nodeSource","PeopleData","peopleExpanded","group_id","peopleList","peopleGroupUsers","runAdvancedSearch","welcome","fetchAllUsersPaged","checkSearchisEmpty","searchisEmpty","equals","isEmpty","advancedSearchStructForPaging","orgTreeError","hasActiveUsersAssigned","orgTreeData","getOrganizationHierarchyData","orgArray","domainsArray","nameAndOrgObjOnly","pathToOrg","getPositionsData","peopleGroupData","PeopleOptions","editPencil","PeopleTreeTitle","peopleGroupsError","peopleGroupsLoading","getAllPeopleGroups","areActive","originalPeopleGroups","pg","peoplegroups","processQueue","peopleGroupQueueStatusChecker","managerTreeTitle","managerTreeError","managerData","managerOptions","pagingAttributes","sortAscending","activeUsers","setRowSelection","userTableError","managerNodeClick","managerAttribute","getuserDataForManagerstree","managerTree","statusCode","primaryManagersOnly","mgrarray","hasDirectReports","showAdvancedSearch","advancedSearchCta","editUser","clearAdvancedSearch","selectJob","selectOrganization","organizationId","selectManager","temp1","selectAlternateManager","temp2","alternateManagerId","toggleTrainingAdministrator","isTa","toggleInstructor","selectedAltManager","searchAll","closeAdvancedSearch","isEditing","getUserToEdit","initNewUserTimeZone","timeZone","portalSettings","initNewUserStartDate","selectedAlternateManager","addUser","isUserTA","trainingAdministrator","ldConnectAccess","toggleLDConnectAccess","addToTranscript","toggleAddTranscript","confirmDeactivateUserError","confirmDeactivateUserLoading","confirmDeactivateUser","Response","toggleDeactivateUserTooltip","confirmActivate","confirmActivateUserError","UserLoading","confirmActivateUser","ActivateUser","confirmActivateUserLoading","peopleGroupRequestUpdateError","confirmSaveUser","toggleSaveUserTooltip","confirmCancelUser","toggleCancelUserTooltip","clearCancelBool","selectedNode","filterRowsByOrgId","limitToSingleOrg","PeopleNodeClick","urlparam","propertyToSortBy","initialQueueStatusLoading","queuedPeopleGroup","processStatusId","getUsersByPeopleGroup","pplgroup","grpmatch","userAuditInfo","auditAction","audits","htmlSortName","batch","OrgNodeNowHidden","editUserForm","callUserEdit","managerName","organizationName","languageOptions","locationError","clearSelection","rowsToDeselect","selectedUsersForm","showSelectUsersTooltip","selectUserRow","applySelectionChanges","deselectrow","toggleSelectUsersTooltip","closeSelectUsersModal","undoSelectedUserChanges","userRows","every","selectedPeopleGroups","pushInPplGrpArray","pplgrp","copyPeopleGroupError","copyPeopleGroupIsLoading","copyPeopleGroupsModal","copyPeopleGroups","showPopover","popoverIsVisible","hidePopover","clearBatchForm","locationLoading","clearBatchEditModal","editUserModal","selectedActiveUsers","refreshView","editResultsModal","refreshUsers","failureMessage","hideModals","clearBatchAddTranscriptForm","updateFieldsOnUsersToUpload","usersToUpload","fields","field","terminationDateRemove","managerRemove","manager","alternateManagerRemove","alternateManagerName","alternateManager","scrollBarConfig","autoHideScrollbar","advanced","updateOnContentResize","setHeight","scrollInertia","scrollButtons","scrollAmount","enable","applyChanges","propertiesToUpdate","failedUsers","clearUserBatchCheckboxes","addTranscriptModal","showBatchTranscriptConfirmationModal","submitBatchAddToTranscript","batchAddTranscriptData","usr","closeViewAssignmentModal","jobsTreeLoading","jobsTreeTitle","jobsTreeError","jobsTreeOptions","jobCutoff","jobsNodeClick","inputPeopleGroupName","pplGrpEditView","peoplegroupAction","showActiveGroups","defaultPeopleGroupHeader","createPeoplegroup","tempData","getPeopleGroupsStructure","peopleGroupsAreLoading","viewPeopleGroupStructure","failurePeopleGroup","showGroupStatus","cancelPeopleGroup","peopleGroupSaveError","savePeopleGroupCta","savePeopleGroupAreLoading","payLoad","groupEndDate","jsonLabel","showHideJson","disableJson","showJson","countriesIsLoading","locationsIsLoading","addAction","engLanguage","makeTrainingAdministratorBool","makeinstructorBool","addLDConnectBool","addTranscriptAccessBool","addUserSave","transcriptsAction","editTranscript","edittranscriptAction","timeCapsule","_a","saveTranscript","utcOffset","userTypeahaed","roleid","sortProperty","getTreeData","jobsTree","enableRenderOnScroll","childrenLimitToRenderOnScroll","onNodeToggle","isExpanded","tempjobs","activeJobs","onDomainSelectedChanged","domainsSelected","initSelectedDomains","setDefaultStartTime","setDefaultEndTime","setCurrentTime","isPastSelected","fetchInstructorOfferingsList","firstDayOfYear","showCareerPaths","dashboardSummary","teamSummary","enrollmentRequests","managerApprovalRequests","stylesheet","rgb","styleSheets","ownerNode","cssRules","selectorText","fill","hex","defaultStartDate","setMonth","setFullYear","currentDateRange","summaryExpanded","toggleSummary","teamContextMenuExpanded","toggleTeamContextMenu","closeAllContextMenus","lookupContextMenuExpanded","closest","selectedTeamEnum","DEFAULT","DIRECT_TEAM","ALTERNATE_TEAM","selectedTeam","directTeamManagerList","selectedDirectTeamManagerId","SEARCH_FILTER_ENUM","ALL","PEOPLE","ROLES","GROUPS","searchFilter","changeSearchFilter","defaultDoughnutData","setDoughnutData","defaults","setTeamList","totalCourse","percentage","teamdoughnut","teamdoughnutMessage","breadCrumbs","breadCrumbsVisible","currentUserName","pushBreadCrumb","clearBreadCrumbs","toggleProfile","displayDirectTeam","dtl","lenght","teamCount","displayAlternateTeam","getTeamMgrDirectSummary","teamMgrAssignmentSummary","displayDirectTeamByManager","displayDirectTeamByManagerId","testTeamList","recreateBreadCrumbs","managerObj","breadCrumbName","onlineCourseIncomplete","onlineCourseDueSoon","onlineCourseCompleted","onlineCourseOverdue","onlineCourseCount","instructorLedIncomplete","instructorLedDueSoon","instructorLedCompleted","instructorLedOverdue","instructorLedCount","courseGroupsIncomplete","courseGroupsDueSoon","courseGroupsOverdue","courseGroupsCount","tasksIncomplete","tasksDueSoon","tasksCompleted","tasksOverdue","tasksCount","totalsIncomplete","totalsDueSoon","totalsCompleted","totalsOverdue","totalsCount","onlineCourse","dueSoon","instructorLed","courseGroups","teamSummary2","subMdoughnut","subdoughnutMessage","stackTrace","stack","getTeamMgrDirectBreadcrumb","breadCrumbIndex","managerIdx","drillDirectTeamByBreadCrumb","originalBreadCrumbLength","getManagerCareerPathSummary","summaryPromise","finalDoughnut","assignedUsersCount","totalReports","doughnutMessage","getManagerCareerPathStudentSummary","cpStudentError","stuSummaryPromise","cpStudentSummaryIsLoading","cpStudentErrorMessage","careerPathDetailsForOtherFilter","careerPathDetails","assigned","careerPathComplete","careerPathInProgress","cpI","doughnutDetails","showViewByUser","showByCareerPath","studentSummary","byCareerPathView","cpath","cpIndex","careerPathId","addUserToCareerPath","careerPathName","careerPathImage","studentsCompleted","studentsInProgress","studentsEnrolled","showByEmployee","careerPathData","arrayToAddTo","skipAction","myAssignmentsActive","myCareerPathsActive","showme","getManagerSummary","teamListTitle","breadcrumb","toggleFullyRecursive","toggleFullyRecursiveBottom","toggleFullyRecursiveCareerPath","summaryData","listAction","fetchStudentAssignments","searchForUnderlings","underlings","allIds","enrollmentRequestsAction","assignmentData","approvalAssignments","ApproveRequest","DenyRequest","sucess","approvalsAction","taskData","approvalTasks","CompletedTask","NotCompletedTask","userKey","addAssignmentsWithLibraryActionForAllTeams","assignmentTeamModalhide","updateDatesForSummaries","getTranscriptAction","confirmRemove","studentCall","managerListViewHeader","x3","dataSortedById","x2","apostrophe","studentFullName","toggleThisAssignmentsCalender","overdueAssignments","callExport","openOverdueModal","closeOverdueModal","exportOverdueAssignments","openSubordinateProfileModal","changeCPStudentSummaryFilter","includeSubordinates","isNMLSGroup","isNMLSProvisioned","messagesCount","userSkills","requiredAssignments","recommendedAssignments","electives","myDocuments","oldDoughnutData","segmentStrokeColor","oldDoughnutOptions","assignmentPaddingClass","childPromises","filterInProgress","childPromise","summarizeCareerPaths","assignmentDueStatusToggle","careerPaths","newDoughnut","doughnut","openCatalog","openDocumentsCatalog","rowLength","showingMore","seeMoreText","seeMoreGlyphClass","popoverFlags","list","cp","launchButtonPromises","deferredCareerPathPromise","deferredCareerPathOfferingsPromise","hideActionButton","comparison","LaunchResource","spinner","removeAttr","isDuplicated","hasDuplicate","assignmentsToRemove","orderAssignmentsBy","courseSectionName","deferredCoursePromise","dueDateStyle","showHeart","catalogID","showDocumentHeart","myDocumentCourse","playlistCourse","isNMLSSafeHarbor","isNMLSReporting","setCourseGroupDetailsHtml","HandleCareerPathDropdown","careerPathSummary","innerText","order","childrenPassed","childrenTotal","skillCountPassed","skillCountTotal","openSlideDown","singleGroupIsLoading","IsLoading","closeAllPopovers","openPopover","seeMoreClick","viewMoreClick","isResources","inGroup","relevantAssignment","regexid","showSlideButton","matchedClose","detaildiv","currentDetails","currentResources","courseDiv","ceil","topdiv","resourcesSlideDown","fillBasicSlideDown","fillILTSlideDown","fillTaskSlideDown","fillCourseGroupSlideDown","outerdiv","groupOfferingsDisplay","offeringsDisplay","launchPromises","slideType","$$state","groupSecondaryButton","secondaryButton","focusedID","novalidofferings","currentDate","courseGroupStatus","courseGroupIsManagerApprovalRequired","displayTypeName","beingDropped","viewMorePathClick","currentOpen","matched","unknown","removeFromPlaylistTiles","removeFromMyDocumentsTiles","isRowEnd","isVisible","CatalogSearchController","searchResultError","viewAll","viewAllText","constantViewAllText","constantViewLessText","maxFacetValuesDisplayed","clearAll","selectedFacetValues","addBrowseFilter","pagination","activate","selectFacetFilter","facetName","filterValue","facetIndex","filterIndex","chosenFilter","existingIndex","selectFacetFilterAnd","addFacetFiltersAnd","expandCollapseFacet","isCollapsed","selectProduct","backCrumbLink","backCrumb","productNameCrumb","itemsPerPage","maxPagesDisplayed","showCatalogDownloadLinks","catalogtype","routeParams","resultsToken","$$search","token","currentPlaylistCourseIds","pipeDelimited","shareLink","currentMyDocumentsCourseIds","needPlaylistRefresh","needMyDocumentsRefresh","getShareLink","shareResults","filters","filterList","enablePlaylistRefresh","enableMyDocumentsRefresh","setBreadcrumbsAndFilter","showFacet","typeFilter","typeValue","catalogPDFName","parseToken","parsed","parseCatalogPath","playlistPromisePosition","myDocumentsPromisePosition","downloadCatalogId","allResult","showPlaylistHeart","showMyDocumentsHeart","parentBAICourseID","hideLibraries","addFacet","DurationRange","CEAccreditationOrg","appendPreviouslySelectedValues","subSelectedFacetFilters","shortIndex","mediumIndex","longIndex","durationRangeOrdered","existingFacetIndex","facetValues","newFacet","showViewAll","newFacetIndex","copyLinkController","setAttribute","copyUrl","execCommand","Element","popover","ProductDetailsController","productLink","outputPromises","setMetadataAndBreadcrumbs","ErrorNumber","emptyOfferingsPromise","links","deferredDocumentPromise","deferredEmptyOfferingsPromise","playlist","catalogBreadcrumbs","compareByOrdinal","ordinal","compareByName","formatPath","getLevel","showExportLinks","singular","plural","categories","formatCategories","azureFacet","productCount","childCount","catalogAction","catalogListAction","exportCatalogLoading","exportCatalog","exportListLoading","exportCatalogList","isEditLoading","hideSummaryTable","reverseSort","archiveLinkText","pageLimit","actionsPopoverFlags","getDecisionMapSummaryError","deleteSuccess","editClickError","currentAction","includeArchived","decisionMaps","loadSummaryTable","pgORorg","businessOrganizationName","includeOrganizationHierarchy","peopleGroupName","dms","decisionMakerSort","closeAllActionMenus","pagedDecisionMaps","editClick","copyDecisonMap","sourceDecisionMapId","createdBy","modifiedBy","modified","archiveUnarchiveDecisionMap","archivedMapIdx","setPopoverAction","archiveDecisonMap","confirmAction","popoverIndex","dmId","viewArchivedReports","openReportRenameModal","decisionReport","reportToRename","renameResult","reportId","reportIdx","fromFilter","selectedCourseType","ct","friendlyTypeName","getFullAssignmentAssetTypeName","deselectAllCourses","filterDocCourse","filterDocCatalog","addAdditionalCourses","closeAdditionalCourseSearchModal","isNextLoading","selectedMinutes","selectedDuration","commentLayout","newCommentText","commentsClass","stepTips","unrelatedModal","removedSelections","peerPopoverFlags","relatedPopoverFlags","previewCourseLoading","previewCourseError","notApplyText","currentWizardStepPretty","decMapGetCourses","peerCourses","decMap","relatedCourses","preSelectCourses","showModal","decisionMapName","preSelectedCourses","relatedIndex","relatedIndexP","peerPropertyName","peerReverse","sortByPeers","openCourseSearch","canPreview","relatedCourse","peerIndex","relIndex","pIndex","removeAllSelections","removeSelection","saveModalSelectionsOnPage","relatedCoursesIndex","previewCourse","previewCourseErrorMessage","gotToNextStep","decisionMapUpdate","savePromises","goBackInWizard","canSelectOrg","canSelectPG","showCommentChk","copyWithComments","modeTitle","modeButtonTxt","disableHierarchyCheckbox","selectedOrg","businessOrganizationId","userNotSelected","resultsLoading","setDecisionMapUser","removeDecisionMaker","userID","decisionMakerRole","dmIndex","getPeopleGroupData","pgArray","pgNameandID","selectPeopleGroup","selectedPG","ChangeSelectedPeerGroup","selectedVal","peerGroup","toggleCopyWithComments","savingDecisionMap","decisionMapConfirmScreen","loadStartTemplate","setDecisionMapStartStatus","previewMembers","loadCreateDecisionMap","selectedPeerGroup","peerGroups","showPeopleGroupSelector","pgGroup","selectedPeopleGroup","showOrganizationSelector","selectedOrganization","copiedOrg","getDecisionMapReportError","decisionMapPromise","commentsPromise","decisionMapResult","commentsResults","decisionMapComments","decisionMapStatusConfirmed","ruleBtnText","ruleName","decisionMapChanged","numDecisionMakersConfirmed","oldStatus","userInd","editRule","createDraftRule","newRule","draftRule","addPeopleGroupToRule","addCoursesToRule","pgCriteriaContainer","operaIndex","orgIndex","Criteria","setRuleCreateFailure","formattedCourses","draftRuleConfirmationAction","exportDecisionMap","portalBackgroundColor","headerTextColor","isNextEnabled","updateDecisionMapError","functionStep","roleStep","responsibilitiesStep","experiencesStep","risksStep","backStepUrl","nextStepUrl","saveDecisionmap","goToPreviousStep","enableNextButton","disableNextButton","relatedChoices","unrelatedChoices","setupStep","createCategoryRows","question","low","medium","high","shouldSeeMore","selectSingle","selectWithCategories","getStepError","seeMoreError","seeMoreLinkText","seeMoreLoading","preSelectChoice","choice","selectedValue","preSelectMultiChoice","questionText","preSelectFunction","preSelectFunctionParams","selectRiskRating","unrelatedCountIdx","unrelatedCount","responsibilityCategories","populateResponsibilityCategories","riskDetails","populateRiskDetails","activeRatings","seeMore","seeMoreChoicesPromise","selectedChoiceKey","selectedResponsibilities","uc","tempChoice","rc","arrayToCheck","choicesGrouped","choiceSelectionChanged","selectedChoice","multiChoiceSelectionChanged","selectedChoices","relIndUnchecked","relInd","changeRiskRating","riskId","ratedChoices","catIndex","size","newArr","detailIdx","detail","choicesIndex","parentCtrl","savingComment","comments","commentsActive","noComment","commentRowsAreLoading","showComments","commentErrorMessage","commentErrorThrown","comIdx","toggleDeletePrompts","toggleComments","history","studentSectionHeaderController","studentSectionSubHeaderLink","studentSectionOutlineController","fillCss","filled","noTopBorder","outerCss","noGutters","seeMoreColor"],"mappings":"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","file":"app.min.js","sourcesContent":["var publicCatalogHosts = [\n \"catalog-dev3.bai.org\", // dev\n \"catalog-dev-uscz.lms.ld.az.bai.org\", //dev EKS\n \"catalog-qa4.bai.org\", // qa\n \"catalog-uat2.bai.org\", // uatAZ\n \"catalog.bai.org\", // prodAZ\n \"catalog.web.local\", // localhost\n];\n\n// the public catalog is now all React. (EA-10930)\nvar reactRoutes = [\n \"/\",\n \"/react/:path*\",\n \"/student/:path*\",\n \"/student/messages/inbox\",\n \"/student/messages/requests\",\n \"/student/messages/enrollments\",\n \"/student/messages/tasks\",\n \"/help\",\n \"/help/student\",\n \"/help/instructor\",\n \"/help/traininginsights\",\n \"/help/ta\",\n \"/help/manager\",\n \"/help/studentdemovideo\",\n \"/help/instructordemovideo\",\n \"/help/traininginsightsdemovideo\",\n \"/help/managerdemovideo\",\n \"/student/home\",\n \"/student/profile\",\n \"/student/profile/edit-profile\",\n \"/student/profile/change-password\",\n \"/student/transcripts\",\n \"/catalog\",\n \"/catalog/:path*\",\n \"/courses\",\n \"/courses/certificate\",\n \"/courses/certificate/assignments\",\n \"/courses/certificate/assignments/:path*\",\n \"/documents-catalog\",\n \"/documents-catalog/:path*\",\n \"/admin/messages/enrollments\",\n \"/admin/messages/requests\",\n \"/admin/messages/tasks\",\n \"/admin\",\n \"/admin/:path*\",\n \"/admin-react\",\n \"/admin-react/:path*\",\n];\nvar unsupportedRoutes = [\n // These routes used to exist, but have been changed in React. TODO: Add redirects in React\n \"/messages/inbox\",\n \"/messages/requests\",\n \"/messages/enrollments\",\n \"/messages/tasks\",\n \"/users/account\",\n];\n\nwindow.customDocumentsEnabled = true;\nwindow.fromWeb = publicCatalogHosts.reduce(function (isFromWeb, catalogHost) {\n if (isFromWeb || window.location.hostname === catalogHost) {\n return true;\n }\n return false;\n}, false);\nwindow.loggedin = false;\nwindow.timeout = 15000;\n\n/* App Module */\nvar app = angular.module(\"baiApp\", [\n \"ngRoute\",\n \"ngAnimate\",\n \"ngCookies\",\n \"ui.bootstrap\",\n \"AngularPrint\",\n \"ngMessages\",\n \"ngMaterial\",\n \"ngSanitize\",\n \"dibari.angular-ellipsis\",\n \"chart.js\",\n \"ngTagsInput\",\n \"ngTagsInput\",\n \"ngFileUpload\",\n \"mgo-angular-wizard\",\n \"treeControl\",\n \"infinite-scroll\",\n \"moment-picker\",\n \"timer\",\n \"baiCatalog\",\n]);\n\nvar catalog = angular.module(\"baiCatalog\", []);\n\n/**\n * Application configuration.\n */\napp.config([\n \"$compileProvider\",\n \"$mdThemingProvider\",\n \"$httpProvider\",\n \"$routeProvider\",\n \"$locationProvider\",\n \"$rootScopeProvider\",\n \"$mdDateLocaleProvider\",\n \"momentPickerProvider\",\n function (\n $compileProvider,\n $mdThemingProvider,\n $httpProvider,\n $routeProvider,\n $locationProvider,\n $rootScopeProvider,\n $mdDateLocaleProvider,\n momentPickerProvider\n ) {\n var controllerName = \"\";\n $rootScopeProvider.digestTtl(15);\n\n $mdThemingProvider.theme(\"default\").primaryPalette(\"light-blue\");\n\n $mdDateLocaleProvider.parseDate = function (dateString) {\n var m = moment(dateString);\n //window.alert('Parsing \"'+ dateString + '\" isValid: ' + m.isValid());\n //console.log('parsing ' ); //+ dateString);\n return m.isValid() ? m.toDate() : new Date(NaN);\n };\n\n console.log(\"fromWeb:\", window.fromWeb);\n\n reactRoutes.concat(unsupportedRoutes).forEach(function (route) {\n $routeProvider.when(route, {\n template: function (location) {\n console.log(\n '\"' +\n location.path +\n '\" is a React route. Delegating control to the React application.'\n );\n return '
';\n },\n });\n });\n\n if (!window.fromWeb) {\n $routeProvider\n .when(\"/:controller/\", {\n templateUrl: function (location) {\n controllerName = location.controller;\n return \"app/templates/\" + controllerName + \"/index.html\";\n },\n controller: function () {\n if (controllerName.toString() === \"\") {\n controllerName = \"index\";\n }\n\n return controllerName + \"Controller\";\n },\n })\n .when(\"/:controller/:name/\", {\n templateUrl: function (location) {\n // Base URLs that are going to have the second parameter be dynamic, hence the location.name will never resolve to a template\n var unfindable = [\"catalog\", \"search\", \"documents-catalog\"];\n controllerName = location.controller;\n if (location.name === null) {\n location.name = \"index\";\n }\n\n if (jQuery.inArray(controllerName, unfindable) !== -1) {\n if (controllerName === \"search\") {\n return \"app/templates/\" + controllerName + \"/mutable.html\";\n } else {\n if (location.name === \"search\") {\n return (\n \"app/templates/\" + controllerName + \"/catalogSearch.html\"\n );\n }\n return (\n \"app/templates/\" + controllerName + \"/catalogLibrary.html\"\n );\n }\n } else {\n return (\n \"app/templates/\" +\n controllerName +\n \"/\" +\n location.name +\n \".html\"\n );\n }\n },\n controller: function () {\n if (controllerName.toString() === \"\") {\n controllerName = \"index\";\n }\n\n return controllerName + \"Controller\";\n },\n })\n .when(\"/:controller/:name/:param*\", {\n templateUrl: function (location) {\n // Base URLs that are going to have the second parameter be dynamic, hence the location.name will never resolve to a template\n var unfindable = [\"catalog\", \"documents\", \"documents-catalog\"];\n\n controllerName = location.controller;\n\n if (location.name === null) {\n location.name = \"index\";\n }\n\n if (jQuery.inArray(controllerName, unfindable) !== -1) {\n if (controllerName === \"search\") {\n return \"app/templates/\" + controllerName + \"/mutable.html\";\n } else {\n if (location.name === \"search\") {\n return (\n \"app/templates/\" + controllerName + \"/catalogSearch.html\"\n );\n } else if (location.name === \"product\") {\n return \"app/templates/\" + controllerName + \"/product.html\";\n }\n return (\n \"app/templates/\" + controllerName + \"/catalogLibrary.html\"\n );\n }\n } else {\n return (\n \"app/templates/\" +\n controllerName +\n \"/\" +\n location.name +\n \".html\"\n );\n }\n },\n controller: function () {\n if (controllerName.toString() === \"\") {\n controllerName = \"index\";\n }\n\n return controllerName + \"Controller\";\n },\n });\n }\n\n $locationProvider.html5Mode(true);\n\n $httpProvider.interceptors.push(function ($q) {\n return {\n // handel both the old-way and new-way of in-bound AJAX payloads\n response: function (response) {\n /**\n * response can be null\n */\n if (typeof response.data.response !== \"undefined\") {\n response.data = response.data.response;\n }\n\n return response;\n },\n\n responseError: function (rejection) {\n var data = rejection.data;\n\n if (\n typeof data !== \"undefined\" &&\n data !== null &&\n typeof data.message !== \"undefined\" &&\n data.message !== null &&\n typeof data.ErrorMessage === \"undefined\"\n ) {\n data.ErrorMessage = data.message;\n }\n\n if (\n typeof data !== \"undefined\" &&\n data !== null &&\n typeof data.Message !== \"undefined\" &&\n data.Message !== null &&\n typeof data.ErrorMessage === \"undefined\"\n ) {\n data.ErrorMessage = data.Message;\n }\n\n // First check is for when there is a timeout\n if (data === null || typeof data.ErrorMessage === \"undefined\") {\n // Resets the data to an object in case what we got from the API was not a valid object for us.\n data = {};\n\n data.ErrorCode = 0;\n data.ErrorMessage =\n \"An unknown error has occurred. Please contact your organization's training administrator.\";\n if (\n typeof window.Cookies.get(\"userRole\") !== \"undefined\" &&\n window.Cookies.get(\"userRole\").indexOf(\"TA\") > 0\n ) {\n data.ErrorMessage =\n \"Time out error. Please try again. If the issue persists, please contact BAI Customer Support Services\";\n }\n data.StatusCode = 500;\n }\n\n return $q.reject(data);\n },\n };\n });\n\n //$compileProvider.preAssignBindingsEnabled(true);\n\n momentPickerProvider.options({\n format: \"L LT\",\n startView: \"month\",\n today: true,\n locale: \"en\",\n minView: \"decade\",\n maxView: \"month\",\n autoclose: true,\n keyboard: false,\n /* Extra: Views properties */\n leftArrow: \"←\",\n rightArrow: \"→\",\n yearsFormat: \"YYYY\",\n monthsFormat: \"MMM\",\n daysFormat: \"D\",\n hoursFormat: \"HH:[00]\",\n minutesFormat: moment\n .localeData()\n .longDateFormat(\"LT\")\n .replace(/[aA]/, \"\"),\n secondsFormat: \"ss\",\n minutesStep: 15,\n secondsStep: 1,\n });\n },\n]);\n\napp.run([\n \"$rootScope\",\n \"$location\",\n \"$http\",\n \"$window\",\n \"$route\",\n \"CssService\",\n \"UsersService\",\n \"SettingsService\",\n \"urlParamsUtil\",\n \"popupcheckUtil\",\n \"$templateRequest\",\n \"$templateCache\",\n \"$interval\",\n \"queuePollingInterval\",\n function (\n $rootScope,\n $location,\n $http,\n $window,\n $route,\n CssService,\n UsersService,\n SettingsService,\n urlParamsUtil,\n popupcheckUtil,\n $templateRequest,\n $templateCache,\n $interval,\n queuePollingInterval\n ) {\n //allows changing path without reloading controller\n var original = $location.path;\n $location.path = function (path, reload) {\n if (reload === false) {\n var lastRoute = $route.current;\n var un = $rootScope.$on(\"$locationChangeSuccess\", function () {\n $route.current = lastRoute;\n un();\n });\n }\n\n if (\n $location.$$path === \"/reports/\" &&\n $route &&\n $route.current &&\n $route.current.params &&\n $route.current.params.controller === \"users\" &&\n $route.current.params.name === \"home\"\n ) {\n /** EA-14021 This is needed for the following scenario:\n * 1. As a user with multiple roles (admin, manager, instructor)\n * 2. Navigate among the various /users/home pages (Admininstration, Manager Dashboard, Instructors)\n * 3. Go to Reports\n * 4. Navigate among the various /users/home pages (Admininstration, Manager Dashboard, Instructors)\n * Expected Result: the pages navigate normally\n * Actual Result without the code in this block: The second page the user navigates to brings the user\n * back to the /reports/ page.\n */\n $location.$$path = \"/users/home/\";\n $location.$$url = \"/users/home/\";\n $location.$$absUrl = $location.$$absUrl.replace(\n \"/reports/\",\n \"/users/home/\"\n );\n }\n\n return original.apply($location, [path]);\n };\n\n /**\n * This cannot continually run in the $locationChangeStart, based on SLY-2328\n * This has to run once. If it runs multiple times, the moment dates will have a value of\n * Invalid Date, as\n */\n UsersService.setFromCookies();\n \n\n /* I would put this in an ng-include but I can't\n * due to the way wix's angular tree imports templates. see\n * https://github.com/wix/angular-tree-control/pull/251\n * and\n * https://github.com/wix/angular-tree-control/issues/167\n *\n * SLY-3952, SLY-3953 implemented a limit-to attribute on the treecontrol directive to limit the number of nodes / sub-nodes that are rendered. setting\n * is global to the tree.\n */\n var treeTemplate = \"\";\n treeTemplate += \"\";\n\n $templateCache.put(\"tree.html\", treeTemplate);\n\n /**\n * Application globals\n */\n // Bool to see if custom css should be checked for. If XHR request was made, checkCss will be false.\n $rootScope.checkCss = true;\n // Bool to see if cache should be reset for a singular XHR request\n $rootScope.resetCache = true;\n // Bool to ensure the video is shown ONLY once a session\n $rootScope.videoShownThisSession = false;\n // sysSettings Objects which holds the data from SettingsService for feature enabling.\n $rootScope.sysSettings = {};\n\n $rootScope.css = \"\";\n $rootScope.cssDoneLoading = false;\n $rootScope.fromWeb = window.fromWeb;\n if ($rootScope.fromWeb === true) {\n $rootScope.metaTags = {};\n $rootScope.metaTags.title = \"\";\n $rootScope.metaTags.description = \"\";\n $rootScope.metaTags.keywords = \"\";\n }\n\n // Logic to run on every page turn.\n $rootScope.$on(\"$locationChangeStart\", function (event, next, current) {\n // the public catalog is all handled by react now\n if ($rootScope.fromWeb) {\n return;\n }\n\n var css = null;\n var search = \"\";\n var sysSettings = null;\n\n if (UsersService.isLoggedIn()) {\n sysSettings = SettingsService.getSettings();\n sysSettings.then(\n function (success) {\n $rootScope.sysSettings = success;\n },\n function () {}\n );\n\n if (\n UsersService.getPortalCode() !== null &&\n $rootScope.checkCss === true\n ) {\n $location.search(\"portal\", null);\n }\n\n if (\n typeof $location.search().portal !== \"undefined\" &&\n $rootScope.checkCss === true\n ) {\n if (jQuery(\"#portalStyles\").length > 0) {\n CssService.purgeResults();\n\n jQuery(\"#portalStyles\").remove();\n }\n\n search = $location.search().portal;\n css = CssService.fetchByPortalId(search);\n css.then(\n function (success) {\n $rootScope.cssDoneLoading = true;\n\n $rootScope.css = success;\n\n jQuery(\"\")\n .appendTo(\"body\")\n .html(success);\n },\n function () {\n $location.search(\"portal\", null);\n }\n );\n\n $rootScope.checkCss = false;\n } else if ($rootScope.checkCss === true) {\n if (jQuery(\"#portalStyles\").length > 0) {\n CssService.purgeResults();\n\n jQuery(\"#portalStyles\").remove();\n }\n\n search = UsersService.getId();\n css = CssService.fetchByUserId(search);\n\n css.then(\n function (success) {\n $rootScope.cssDoneLoading = true;\n\n $rootScope.css = success;\n\n jQuery(\"\")\n .appendTo(\"body\")\n .html(success);\n },\n function () {\n $location.search(\"portal\", null);\n }\n );\n\n $rootScope.checkCss = false;\n }\n\n if ($location.path() === \"/\") {\n UsersService.navigateToHome();\n }\n\n popupcheckUtil.openPopUp();\n } else {\n if ($location.path() !== \"/\") {\n var logout = UsersService.clearSession();\n logout.then(\n function (success) {\n $location.url(\"/\");\n return;\n },\n function (failure) {}\n );\n\n if ($rootScope.fromWeb === false) {\n $location.path(\"/\");\n }\n }\n }\n\n // If the location changes cancel intervals\n if (queuePollingInterval.peopleGroupPollingInterval !== null) {\n $interval.cancel(queuePollingInterval.peopleGroupPollingInterval);\n }\n });\n\n $rootScope.$on(\"$routeChangeSuccess\", function (e, current) {\n $rootScope.query = \"\";\n if ($rootScope.fromWeb === true) {\n $rootScope.metaTags.title = \"\";\n $rootScope.metaTags.description = \"\";\n $rootScope.metaTags.keywords = \"\";\n }\n if (typeof $location.search().portal !== \"undefined\") {\n $rootScope.query = \"?portal=\" + $location.search().portal;\n }\n });\n /* add css class to non-production environments to distinguish from production */\n (function () {\n var loc = window.location.hostname.toLowerCase();\n var e = document.getElementsByTagName(\"body\")[0];\n if (e && e.classList) {\n if (loc === \"lmgr.bai.org\" || loc === \"catalog.bai.org\") {\n /* don't add any classes in production */\n } else if (\n loc === \"lmgr-dev.bai.org\" ||\n loc === \"catalog-dev.bai.org\"\n ) {\n e.classList.add(\"lmgr-dev\");\n } else if (loc === \"lmgr-qa.bai.org\" || loc === \"catalog-qa.bai.org\") {\n e.classList.add(\"lmgr-qa\");\n } else if (\n loc === \"lmgr-uat.bai.org\" ||\n loc === \"catalog-uat.bai.org\"\n ) {\n e.classList.add(\"lmgr-uat\");\n } else {\n e.classList.add(\"not-production\");\n }\n }\n })();\n /* Add long-lived device cookie for debug tracing and internal analytics in log files.\n\tWe can't rely on presence of Google cookies due to ad-blockers, and do not want\n\tto log session IDs for security reasons. Web server logging (nginx) should be\n\tchanged to log this cookie instead of session cookies */\n (function () {\n var cookieName = \"udg\";\n if (document.cookie.indexOf(cookieName + \"=\") === -1) {\n document.cookie =\n cookieName +\n \"=\" +\n sqlguid() +\n \";Secure;Path=/;Domain=bai.org;Expires=\" +\n new Date(\n new Date().getTime() + 10 * 365 * 24 * 60 * 60 * 1000\n ).toUTCString();\n }\n })();\n\n /* set timeout to 15 seconds on dev and qa. 60 seconds on prod and uat */\n (function () {\n var loc = window.location.hostname.toLowerCase();\n if (loc === \"lmgr.bai.org\" || loc === \"lmgr-uat.bai.org\") {\n window.timeout = 60000;\n }\n })();\n },\n]);\n","function Exception(message, code) {\n this.message = message;\n this.code = code;\n\n return {\n getMessage: function() {\n return this.message;\n },\n getCode: function() {\n return this.code;\n }\n };\n}","function ModelException() {\n console.warn('using model esxception!');\n}\n\nModelException.prototype.constructor = new Exception();","/***** This mixin maps roles and pages to page/role specific override mixins. *****\n *\n * The mixins are used on a page by page basis\n * to override certain parts of the page for specific roles.\n *\n * You call the mapRoleAndPageToOverride function with a copy of the UsersService and $route\n * objects. (UsersService is from /BAI.LMS.Web/App/js/services/user.js) ($route is from\n * https://docs.angularjs.org/api/ngRoute/service/$route)\n *\n * The function returns a mixin (dictionary)\n *\n * *********** HOW MIXINS ARE STRUCTURED AND STORED\n *\n * Mixins in this case are dictionaries returned by factories with this naming convention\n * _Override\n * Think of a mixin as a named dictionary containing some methods and variables.\n *\n * Where is the name of the controller without the word\n * Controller in it. The first letter is always capitalized.\n * For the usersController, it would be Users\n *\n * If there's more than one capital letter in the controller name, that capital is left as-is.\n * The first letter is auto-capitalized.\n *\n * is the value in UsersService.auth.currentRole with a capital first letter.\n * For a student, it will be Student.\n *\n * Ex: /users/home/ could have an override called Users_InstructorOverride\n *\n * These mixins are only for overriding controllers. Not services. Not other mixins. Not factories.\n * Just controllers.\n *\n * They're stored in BAI.LMS.Web/App/js/controllers//.js\n *\n * Where is the name of the controller without the word controller in it\n * UsersController will be users\n *\n * And is the name of the role in lowercase. Instructor will be instructor.\n *\n * So an Instructor override for the UsersController will be in\n * BAI.LMS.Web/App/js/controllers/users/instructor.js\n *\n * *********** WHAT TO PUT INTO A MIXIN\n *\n * You can put any method or variable you want into the mixin.\n *\n * The idea is that you override specific functions like homeAction or iltCalendarAction\n * and then those pages will do something different. homeAction/iltCalendarAction in this case\n * correspond to the homeAction/iltCalendarAction in the UsersController.\n * Then, the /users/home (homeAction) and the /users/ilt-calendar/ (iltCalendarAction)\n * pages will be slightly different for an Instructor if you do the below:\n\n app.factory('Users_InstructorOverride', [function() {\n return {\n function($scope) {\n\n },\n homeAction: function() {\n // your specific functionality here\n },\n iltCalendarAction: function() {\n // your specific functionality here\n },\n homeTemplate: 'app/templates/users/home/instructor.html'\n }\n}]);\n\n * If you have a template override, put that as a variable. The controller your working\n * with should have a variable that specifies what template you should use.\n *\n * *********** HOW THE MIXIN WORKS\n *\n * In your controller, inject RoleMapsMixin near the top.\n *\n * Then, near the bottom of your controller (but before you call any route specific functions like\n * homeAction or iltCalendarAction), call\n *\n * var override = RoleMapsMixin.overrideScope();\n * Store the value of that and use angular.merge to merge it with the scope\n *\n * angular.merge($scope, override);\n *\n * Then call your page specific setup function like homeAction.\n *\n * Now your page will be overridden for a specific role.\n *\n * Only pages which are different depending on the role need a mixin.\n *\n * If there isn't a mixin for a page and there's a student mixin, the page\n * Will use the student mixin instead.\n *\n * *********** IMPORTANT NOTES\n *\n * MAKE SURE YOU USE THE PROPER CASING AND SYNTAX FOR NAMING YOUR OVERRIDES\n * OTHERWISE THE SYSTEM WONT FIND YOUR OVERRIDE.\n *\n * There are some built in logging functions to help with this.\n * If you call RoleMapsMixin.overrideScope() in your controller\n * and the system doesn't find the override, it will log the controllers it tried to find.\n *\n * See HOW MIXINS ARE STORED AND STRUCTURED for information on how mixins are named.\n *\n */\n\n\n/* Utility function for capitalizing the first letter of a string */\nString.prototype.capitalize = function() {\n return this.charAt(0).toUpperCase() + this.slice(1);\n};\n\n/* Returns a factory name for a controller and role */\nfunction getPotentialFactoryName(controllerName, currentUserRole) {\n // @TODO: @sfrohm [must talk to @adass to get standardization] get API to return admin, instead of TA\n currentUserRole = currentUserRole === 'ta' ? 'admin' : currentUserRole;\n\n var potentialFactoryName = '';\n\n controllerName = controllerName.capitalize();\n potentialFactoryName += controllerName + '_';\n\n currentUserRole = currentUserRole.capitalize();\n potentialFactoryName += currentUserRole + \"Override\";\n\n return potentialFactoryName;\n}\n\n/* Returns true if an angular provider exists */\nfunction findProvider(providerName) {\n var foundIt = false;\n\n angular.module('baiApp')._invokeQueue.forEach(function(value) {\n // These magic numbers [2][0] are angular black magic.\n var angularProviderName = value[2][0];\n if (providerName === angularProviderName) {\n foundIt = true;\n }\n });\n\n return foundIt;\n}\n\n/* The meat of the role overrider is here\n* Maps the controller/user role to the override and calls the override\n*/\nfunction mapPageAndRoleToOverride(controllerName, currentUserRole, $injector, $scope) {\n // Used to hold name of factory for overriding a page.\n // Marked as potential because we might not find one.\n var potentialFactoryName = getPotentialFactoryName(controllerName, currentUserRole);\n\n // Check the list of existing angular providers\n // That way we don't try to create a provider that doesn't exist.\n var foundTheProvider = findProvider(potentialFactoryName);\n // If we didn't find a provider, look for the student version of that provider.\n if (!foundTheProvider) {\n potentialFactoryName = getPotentialFactoryName(controllerName, 'student');\n foundTheProvider = findProvider(potentialFactoryName);\n }\n\n // If we found the provider, instantiate it and override the page.\n if (foundTheProvider) {\n var myServiceFunction = $injector.get(potentialFactoryName);\n\n console.log(\"using: \" + potentialFactoryName + \" for override\");\n\n new myServiceFunction($scope);\n }\n}\n\n\n/* The exposed part of this helper. Rest of helper is internal functions.\n* Map the controller name, route name and user role to an override */\napp.factory('RoleMapsMixin', ['$route', 'UsersService', '$injector', function($route, UsersService, $injector) {\n return {\n findProvider: findProvider, // used in the UsersAdminOverride factory\n overrideScope: function($scope) {\n var controllerName = $route.current.params.controller;\n var currentUserRole = UsersService.getCurrentRoleType();\n\n return mapPageAndRoleToOverride(controllerName, currentUserRole, $injector, $scope);\n },\n overrideScopeByRole: function ($scope, userRole) {\n var controllerName = $route.current.params.controller;\n\n return mapPageAndRoleToOverride(controllerName, userRole, $injector, $scope);\n }\n };\n}]);\n","/* This is a mixin to contain any function\n * that maps any type string from the database\n * To an english name\n * For instance, mapping assignment types like 'wbt' to 'Web Based'\n */\n\nfunction TypeMapsMixin() {}\n\nTypeMapsMixin.prototype.getFullAssignmentTypeName = function(type) {\n // Maps an assignment.status field to an english name\n // See any page that uses a Course Type for an example\n // Ex: The assignments list page /lms-web/users/list/\n var types = {\n 'assessment': 'Assessment',\n 'survey': 'Survey',\n 'evaluation': 'Evaluation',\n 'ext': 'External',\n 'ilt': 'Instructor Led Training',\n 'task': 'Task',\n 'vle': 'Video Learning Elective',\n 'wbt': 'Web Based',\n 'courseGroup': 'Course Group',\n 'courseGroupCurricula': 'Course Group Curricula',\n 'courseGroupCertification': 'Course Group Certification'\n };\n\n return types[type];\n};\n\napp.factory('TypeMapsMixin', [function() {\n return new TypeMapsMixin();\n}]);\n","app.service('AssessmentService', ['$http', '$q', function ($http, $q) {\n var _this = this;\n\n _this.singleResponse = null;\n\n _this.fetchSingle = function (userId, assessmentId) {\n\n var url = 'api/user/' + userId + '/assessment/' + assessmentId + '/';\n\n var req = {\n method: 'GET',\n url: url,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.singleResponse = success.data;\n\n return _this.singleResponse;\n }, function (failure) {\n throw failure;\n });\n };\n}]);\n","/**\n * Service \"class\" that contains all logic for any assignment related calls to the API.\n */\napp.service('AssignmentsService',\n ['$http', 'dateUtil', 'UsersService', 'errorDisplayerUtil', 'courseFormatterUtil', function(\n $http, dateUtil, UsersService, errorDisplayerUtil, courseFormatterUtil)\n{\n var _this = this;\n\n _this.response = null;\n\n _this.UsersService = UsersService;\n _this.courseGroupID = null;\n\n _this.fetch = function(userId) {\n var req = {\n method: 'GET',\n url: 'api/assignments/' + userId + '/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.fetchSingle = function(id, type) {\n\n // ~/api/Assignments/Single/{assignmentId}/{assignmentType}\n var req = {\n method: 'GET',\n //url: 'api/user/' + user_id + '/course/' + id, // Old single assignment get\n url: 'api/assignments/single/' + id + '/' + type,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.format([success.data])[0];\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n /**\n *\n * url: '/api/assignments/updateduedate/{userId}/{studentId}/{assignmentCourseId}',\n */\n _this.updateDueDate = function(managerId, studentId, courseId, dueDate) {\n var req = {\n method: 'PUT',\n url: 'api/assignments/updateduedate/' + managerId + '/' + studentId + '/' + courseId,\n data: '\"' + dueDate + '\"',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = success.data;\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n /**\n *\n * @param studentId\n * @param assignmentType\n * @param courseState\n * @returns {*}\n */\n _this.getAssignmentsBystateAndType = function (studentId, assignmentType, courseState, startDate, endDate) {\n var data = {\n 'StudentId': studentId,\n 'Type': assignmentType,\n 'CourseState': courseState,\n 'StartDate': startDate,\n 'EndDate': endDate\n };\n\n var req = {\n method: 'POST',\n url: 'api/assignments/query',\n data: data,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getCourseGroupCourses = function (studentId, courseType, certCurrId) {\n //pi/assignments/{userId}/coursegroup/{type}/list/courses/{courseGroupCourseId}\"\n var req = {\n method: 'GET',\n url: 'api/assignments/' + studentId + '/coursegroup/' + courseType + '/list/courses/'+certCurrId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.courseGroupID = certCurrId;\n _this.response = _this.format(success.data);\n _this.courseGroupID = null;\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getCareerPathsSummary = function (userId) {\n var req = {\n method: 'GET',\n url: 'api/course/careerpathssummary/' + userId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getCareerPathCourses = function (studentId, careerPathCourseId) {\n //api/assignments/{userId}/coursegroup/{type}/list/courses/{courseGroupCourseId}\" \n var req = {\n method: 'GET',\n url: 'api/assignments/' + studentId + '/careerpath/courses/' + careerPathCourseId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n return $http(req).then(function (success) {\n _this.courseGroupID = careerPathCourseId;\n _this.response = _this.format(success.data);\n _this.courseGroupID = null;\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n // No return value, just a 200 response code if successful\n // See /api/assignments/add in swagger for details\n _this.submitAssignment = function(studentId, assignment) {\n \n var assignmentCopy = angular.copy(assignment);\n\n assignmentCopy.studentId = studentId;\n assignmentCopy = [assignmentCopy];\n\n var req = {\n method: 'POST',\n url: 'api/assignments/add/',\n data: assignmentCopy,\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.assignCourseGroupCourses = function (studentId, certCurrId) {\n var req = {\n method: 'POST',\n url: 'api/assignments/' + studentId + '/coursegroup/' + certCurrId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.courseGroupID = certCurrId;\n _this.response = _this.format(success.data);\n _this.courseGroupID = null;\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n //open resource flaged to launch with content type URL at the same time \n _this.checkForCuncurrentOpen = function (assignment) {\n var concurrentOpen = false;\n var resourceLaunchWithContent = null;\n if (assignment.resourceLaunchWithContent !== 0 && typeof assignment.courseAssets !== \"undefined\" && assignment.courseAssets !== null) {\n assignment.courseAssets.forEach(function (asset) {\n if (asset.id === assignment.resourceLaunchWithContent) {\n resourceLaunchWithContent = asset;\n }\n });\n }\n if (resourceLaunchWithContent !== null && resourceLaunchWithContent.type.toLowerCase() === \"url\") {\n concurrentOpen = true;\n }\n return concurrentOpen;\n };\n /* Gets the enrollments that need manager approval\n * Returns data in this format.\n * { \"studentId\": 0, \"firstName\": null, \"lastName\": null, \"assignmentName\": \"\", \"assignmentType\": \"\", \"offeringId\": , \"transcriptId\": 0, \"startDate\": null, \"endDate\": null, \"location\": null, \"requestedDate\": \"\"}\n *\n */\n _this.approveDenyEnrollment = function (studentId, offeringId, transcriptId, assignmentType, approveDeny) {\n var req = {\n method: 'PUT',\n url: 'api/team/enroll/'+ studentId + '/course/'+ offeringId + '/' + transcriptId + '/' + assignmentType + '/' + approveDeny,\n timeout: window.timeout\n };\n\n return $http.put(req.url).then(function (success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.removeAssignment = function (assignment) {\n var data = {\n 'id': assignment.id,\n 'assignmentCourseId': assignment.assignmentCourseId,\n 'name': assignment.name,\n 'code': assignment.code,\n 'type': assignment.type,\n 'status': assignment.status,\n 'offeringId': assignment.offeringId,\n 'studentId': assignment.studentId,\n 'transcriptId': assignment.transcriptId,\n 'productType': assignment.productType,\n 'ruleId': assignment.ruleId,\n 'assignmentId': assignment.assignmentId\n };\n var stuCourse = { studentId: assignment.studentId, AssignmentCourseId: assignment.assignmentCourseId };\n var req = {\n method: 'POST',\n url: 'api/assignments/',\n data: data,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n\n }, function (failure) {\n\n });\n };\n\n _this.waiveAssignment = function (assignment, waived) {\n var req = {\n method: 'PUT',\n url: 'api/assignments/' + waived,\n data: JSON.stringify(_this.unformat(assignment)),\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n\n }, function (failure) {\n\n });\n };\n\n _this.updateAssignments = function (assignment) {\n var req = {\n method: 'PUT',\n url: 'api/assignments/update',\n data: _this.unformat(assignment),\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n console.log(\"Success\");\n }, function (failure) {\n console.log(\"Failed\");\n });\n };\n\n _this.unformat = function (assignment) {\n // unformat the same set of dates that are formated in the format function below.\n var copy = angular.copy(assignment);\n\n if (copy.assignedOn !== null && typeof copy.assignedOn !== 'undefined' && copy.assignedOn.utcDate !== null && typeof copy.assignedOn.utcDate !== 'undefined')\n copy.assignedOn = copy.assignedOn.utcDate.format();\n if (copy.completedDate !== null && typeof copy.completedDate !== 'undefined' && copy.completedDate.utcDate !== null && typeof copy.completedDate.utcDate !== 'undefined')\n copy.completedDate = copy.completedDate.utcDate.format();\n if (copy.dueDate !== null && typeof copy.dueDate !== 'undefined' && copy.dueDate.utcDate !== null && typeof copy.dueDate.utcDate !== 'undefined')\n copy.dueDate = copy.dueDate.utcDate.format();\n // this is for the scenario where due date was just set and the page hasn't been refreshed yet\n if (copy.dueDate !== null && typeof copy.dueDate !== 'undefined' && copy.dueDate.jsDate !== null && typeof copy.dueDate.jsDate !== 'undefined')\n copy.dueDate = moment(copy.dueDate.jsDate).utc().format();\n\n\n if (copy.endDateTime !== null && typeof copy.endDateTime !== 'undefined' && copy.endDateTime.utcDate !== null && typeof copy.endDateTime.utcDate !== 'undefined')\n copy.endDateTime = copy.endDateTime.utcDate.format();\n if (copy.endDate !== null && typeof copy.endDate !== 'undefined' && copy.endDate.utcDate !== null && typeof copy.endDate.utcDate !== 'undefined')\n copy.endDate = copy.endDate.utcDate.format();\n if (copy.startDate !== null && typeof copy.startDate !== 'undefined' && copy.startDate.utcDate !== null && typeof copy.startDate.utcDate !== 'undefined')\n copy.startDate = copy.startDate.utcDate.format();\n if (copy.startDateTime !== null && typeof copy.startDateTime !== 'undefined' && copy.startDateTime.utcDate !== null && typeof copy.startDateTime.utcDate !== 'undefined')\n copy.startDateTime = copy.startDateTime.utcDate.format();\n\n if (copy.enrolledDate !== null && typeof copy.enrolledDate !== 'undefined' && copy.enrolledDate.utcDate !== null && typeof copy.enrolledDate.utcDate !== 'undefined')\n copy.enrolledDate = copy.enrolledDate.utcDate.format();\n\n return copy;\n };\n\n /**\n * Format all data that comes in\n *\n * Currently, nothing needs to be formatted immediately on response\n */\n _this.format = function (response) {\n var dates = ['assignedOn', 'completedDate', 'dueDate', 'endDateTime', 'startDate', 'startDateTime', 'enrolledDate'];\n\n var currAssignment = null;\n var nmlsCourseInResults = false;\n var cutOffTime = new Date();\n cutOffTime.setHours(cutOffTime.getHours() + 24);\n\n if(response !== null) {\n for(var assignment in response) {\n currAssignment = response[assignment];\n\n if (currAssignment.curriculumName !== null && currAssignment.curriculumName !== \"\") {\n currAssignment.CourseGroupName = currAssignment.curriculumName;\n currAssignment.courseGroupId = currAssignment.curriculumId;\n }\n else if (currAssignment.certificationName !== null && currAssignment.certificationName !== \"\") {\n currAssignment.CourseGroupName = currAssignment.certificationName;\n currAssignment.courseGroupId = currAssignment.certificationId;\n } else {\n\n }\n\n if (_this.courseGroupID !== null) {\n currAssignment.isInCourseGroup = _this.courseGroupID;\n }\n\n if (currAssignment.allowedEnrollments > 0 && currAssignment.totalEnrollmentAttempts >= 0) {\n currAssignment.enrollmentAttemptsRemaining = (currAssignment.allowedEnrollments - currAssignment.totalEnrollmentAttempts) < 0 ? 0 : (currAssignment.allowedEnrollments - currAssignment.totalEnrollmentAttempts);\n }\n else {\n currAssignment.enrollmentAttemptsAllowed = -1;\n currAssignment.enrollmentAttemptsRemaining = -1;\n }\n\n for(var node in currAssignment) {\n if(currAssignment[node] !== null && $.inArray(node, dates) !== -1) {\n currAssignment[node] = dateUtil.formatDate(currAssignment[node]);\n } else if(node === 'offerings' || node === 'sessions' || node === 'assignedOffering') {\n if(currAssignment[node] !== null && node === 'assignedOffering') {\n currAssignment[node] = [currAssignment[node]];\n\n currAssignment[node] = _this.format(currAssignment[node])[0];\n } else {\n currAssignment[node] = _this.format(currAssignment[node]);\n }\n\n if (node === 'offerings') {\n for (var offer in currAssignment[node]) {\n if (currAssignment[node][offer].sessions !== undefined && currAssignment[node][offer].sessions.length > 0)\n {\n currAssignment[node][offer].location = currAssignment[node][offer].sessions[0].locationName;\n currAssignment[node][offer].instructor = currAssignment[node][offer].sessions[0].instructor;\n }\n }\n }\n }\n }\n\n if (typeof currAssignment.dueDate !== 'undefined' && currAssignment.dueDate !== null) {\n if (currAssignment.dueDate.jsDate < new Date()) {\n currAssignment.dueDate.overDue = true;\n } else {\n currAssignment.dueDate.within24Hours = currAssignment.dueDate.jsDate <= cutOffTime ? true : false;\n }\n \n }\n\n if(currAssignment !== null && typeof currAssignment.code !== 'undefined') {\n currAssignment.codeForImage = courseFormatterUtil.getCourseCodeForImage(currAssignment.code,currAssignment.tileImage);\n }\n\n if (currAssignment !== null && typeof currAssignment.isNMLS !== 'undefined' && currAssignment.isNMLS)\n {\n nmlsCourseInResults = true;\n }\n\n currAssignment.error = errorDisplayerUtil.create();\n }\n //Set the NMLS course in results flag to true if there are any courses in the assignment that are NMLS\n response.containsNMLSCourse = nmlsCourseInResults;\n }\n\n return response;\n };\n\n _this.formatToSend = function(data) {\n var dates = ['endDate', 'startDate', 'displayStart', 'displayEnd', 'newStartDate', 'newEndDate', 'lastProcessedOn', 'lastUpdatedOn', 'acceptPassingScoreDate', 'dueDateFixed', 'enrolledDate'];\n\n if (data.constructor !== Array) {\n for (var node in data) {\n if (typeof data[node] !== 'undefined' && data[node] !== null && typeof data[node] === 'object' && $.inArray(node, dates) !== -1) {\n data[node] = dateUtil.formatDate(data[node].jsDate).utcDate;\n }\n }\n }\n\n if (data.hasOwnProperty('course') && data.course.constructor === Object ) {\n _this.formatToSend(data.course);\n }\n\n if (data.constructor === Array) {\n _.each(data, function(dataPoint) {\n _this.formatToSend(dataPoint);\n });\n }\n\n return data;\n };\n\n _this.isCourseRelaunchable = function (assignment) {\n if (assignment && (assignment.status === 'inProgress' || (assignment.totalEnrollmentAttempts < assignment.allowedEnrollments || assignment.totalEnrollmentAttempts === null || assignment.allowedEnrollments === null)))\n {\n return true;\n } else {\n return false;\n }\n };\n\n _this.assignAssignment = function(assignments) {\n /**\n * @TODO: @sneilan You do not have to do this. data:data will pass this along correctly, as long as assignment\n * is an object. That logic should be in the controller, regardless.\n */\n var assignmentCopy = angular.copy(assignments);\n\n var req = {\n method: 'POST',\n url: 'api/assignments/add/',\n data: _this.formatToSend(assignmentCopy),\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getPrereqs = function (courseId) {\n var req = {\n method: 'GET',\n url: 'api/assignments/prereqs/' + courseId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n var prereqData = success.data;\n var searchUrl = \"\";\n //If there are prereqs - create the search Url to link to and set the scoped variable for the prereq details\n prereqData.forEach(function (p) {\n if (p.code.substring(0, 5) === 'IDSGN' && p.code.split(\"-\").length - 1 === 2) {\n searchUrl += (searchUrl.length > 0 ? ',' : '') + p.code.substring(p.code.lastIndexOf(\"-\") + 1);\n } else {\n searchUrl += (searchUrl.length > 0 ? ',' : '') + p.code;\n }\n\n });\n prereqData.searchUrl = \"search/?q=\" + searchUrl;\n return prereqData;\n\n }, function (failure) {\n throw failure;\n });\n\n };\n\n _this.submitSimpleAssignment = function (courseId, duedate, required, userIds) {\n var data = {\n 'CourseId': courseId,\n 'DueDate': duedate,\n 'Required': required,\n 'userIds': userIds\n };\n var req = {\n method: 'POST',\n url: 'api/assignments/addSimple',\n data: data,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n \n\n}]);\n","app.service(\"BillingService\", [\r\n \"$http\",\r\n function ($http) {\r\n var _this = this;\r\n\r\n _this.singleResponse = null;\r\n\r\n _this.getOverdueInvoices = function () {\r\n var url = \"api/billing/invoice/overdue\";\r\n\r\n var req = {\r\n method: \"GET\",\r\n url: url,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n timeout: window.timeout,\r\n };\r\n\r\n return $http(req).then(\r\n function (success) {\r\n return _this.formatInvoices(success.data);\r\n },\r\n function (failure) {\r\n throw failure;\r\n }\r\n );\r\n };\r\n\r\n _this.getInvoicePDF = function(invoiceId) {\r\n var url = \"api/billing/invoice/\" + invoiceId + \"/pdf\";\r\n var req = {\r\n method: \"GET\",\r\n url: url,\r\n timeout: window.timeout,\r\n responseType: 'arraybuffer'\r\n };\r\n\r\n return $http(req).then(\r\n function (success) {\r\n return success.data;\r\n },\r\n function (failure) {\r\n throw failure;\r\n }\r\n );\r\n\r\n };\r\n\r\n _this.formatInvoices = function(invoices){\r\n var totalOverdue = 0;\r\n for(var i = 0; i < invoices.length; i++){\r\n totalOverdue += invoices[i].totalDue; \r\n invoices[i].dateDue = new Date(invoices[i].dateDue).toLocaleDateString();\r\n invoices[i].totalDue = _this.currencyFormatter.format(invoices[i].totalDue);\r\n }\r\n return { overdueInvoices: invoices, totalOverdue: totalOverdue, totalOverdueFormatted: _this.currencyFormatter.format(totalOverdue) };\r\n };\r\n\r\n _this.currencyFormatter = new Intl.NumberFormat('en-US', {\r\n style: 'currency',\r\n currency: 'USD',\r\n });\r\n },\r\n]);\r\n","// Global singleton for displaying crumbs on the header\n// If you want to have your controller have navigation crumbs\n// Inject BreadcrumbsService and use .pushCrumb for every navigation\n// crumb you wish to add.\n// Do not worry about clearing breadcrumbs. Breadcrumbs are cleared\n// when the url changes. Just .pushCrumb in your controller.\n\n// *** Breadcrumbs are cleared on every controller instantiation ***\napp.service('BreadcrumbsService', ['$rootScope', 'PathFormatter', function ($rootScope, PathFormatter) {\n var _this = this;\n\n _this.crumbs = [];\n\n _this.pushCrumb = function (name, link, isHome) {\n // Takes a crumb name as a string\n // And an optional link.\n // If you don't pass a link,\n // the crumb will be rendered as a string\n var crumb = {};\n crumb.name = name;\n\n if (link) {\n crumb.link = link;\n }\n\n if (isHome) {\n crumb.isHome = isHome;\n }\n else {\n crumb.isHome = false;\n }\n\n _this.crumbs.push(crumb);\n };\n\n _this.getCrumbs = function() {\n // Returns a list of crumbs in the form of \n // {'name': name, 'link': link}\n // link will be undefined (not null) if not specified\n // Used only when displaying the crumbs\n return _this.crumbs;\n };\n\n _this.reset = function() {\n _this.crumbs = [];\n };\n\n _this.createBreadcrumbs = function(pipeDelimitedPath, fromWeb, baseRoute, catalogType) {\n var crumbs = pipeDelimitedPath.split('|');\n var results = [];\n if (crumbs[0] === \"\") {\n return results;\n }\n\n var parentLink = baseRoute;\n if (!fromWeb) {\n results.push({ name: catalogType, link: baseRoute });\n }\n _.each(crumbs, function(crumb) {\n var c = {};\n c.name = crumb;\n c.link = PathFormatter.formatPathParamsWithEncode(parentLink, crumb);\n parentLink = c.link;\n results.push(c);\n });\n return results;\n };\n\n _this.createHomeBreadcrumb = function (homeRole) {\n console.log('homeRole: ', homeRole);\n var name = '';\n if (homeRole === 'manager') {\n name = 'team management';\n } else if (homeRole === 'instructor') {\n name = 'instructor desk';\n } else if (homeRole === 'ta') {\n name = 'administration';\n } else if (homeRole === 'decisionMaker') {\n name = 'training insights';\n } else { //student or nothing\n name = 'my dashboard';\n }\n\n _this.pushCrumb(name, '', true);\n };\n\n // Reset the crumbs whenever we change the URL.\n $rootScope.$on('$routeChangeStart', function(next, current) {\n _this.reset();\n });\n}]);\n","app.service('CareerPathService', [function () {\n\n var _this = this;\n\n _this.createSummary = function (careerPath, children) {\n var summary = {};\n summary.courses = {};\n summary.skills = {};\n summary.skills.total = 0;\n\n summary.courses.total = children.length;\n summary.courses.completed = _.where(children, { status: \"successful\" }).length;\n summary.courses.percentComplete = Math.round(summary.courses.completed / summary.courses.total * 100);\n\n var skills = [];\n children.forEach(function (child) {\n child.skills.forEach(function (skill) {\n\n if (child.status === 'successful') {\n skill.acquired = true;\n } else {\n skill.acquired = false;\n }\n\n var existingSkill = _.findWhere(skills, { id: skill.id });\n if (existingSkill === undefined) {\n skills.push(skill);\n }\n else {\n if (skill.acquired === true) {\n existingSkill.acquired = true;\n }\n }\n });\n });\n\n summary.skills.total = skills.length;\n summary.skills.completed = _.where(skills, { acquired: true }).length;\n\n return summary;\n };\n\n}]);","app.service('CatalogService', ['$http', '$q', 'SettingsService', function ($http, $q, SettingsService) { \n var _this = this;\n\n /**** This is all related to BAI Catalog on Assignments Tab - TA Stuff ****/\n\n _this.getBaiCatalogData = function (refresh) {\n\n if (refresh === undefined) {\n refresh = false;\n }\n\n if (_this.formattedDataCatalog.originalFlatArray !== undefined && _this.formattedDataCatalog.originalFlatArray.length > 0 && !refresh) {\n return $q.resolve(_this.formattedDataCatalog);\n } else {\n\n var req = {\n method: 'GET',\n url: 'api/Catalog/',\n headers: {\n 'Content-Type': 'application/json'\n }\n };\n\n return $http(req).then(function (success) {\n return _this.format_CatalogData(success.data);\n }, function (failure) {\n throw failure;\n });\n }\n };\n\n _this.formattedDataCatalog = [];\n _this.format_CatalogData = function(data) {\n _this.newArrayForCatlogData = [];\n _this.formattedDataCatalog.originalFlatArray = [];\n _this.formattedDataCatalog.formattedCatalogTree = [];\n _this.formattedDataCatalog.formattedCatalogTreeData = [];\n _this.formattedDataCatalog.formattedCoursesData = [];\n _this.formattedDataCatalog.originalFlatArray = format_FlattenCatalogData(data);\n\n format_CatalogCoursesAndTreeData(_this.newArrayForCatlogData);\n format_CatalogTreeData(_this.formattedDataCatalog.formattedCatalogTree);\n\n return _this.formattedDataCatalog;\n };\n\n _this.getBaiCatalogDataFromCache = function () {\n if (_this.formattedDataCatalog.originalFlatArray !== undefined && _this.formattedDataCatalog.originalFlatArray.length > 0) {\n\n return _this.formattedDataCatalog;\n }\n };\n\n var format_FlattenCatalogData = function(data) {\n _.each(data, function(node) {\n node.name = node.title;\n node.nodes = node.children;\n node.id = node.nodeId;\n\n delete node.title;\n delete node.children;\n\n _this.newArrayForCatlogData.push(node);\n if (node.nodes) {\n format_FlattenCatalogData(node.nodes);\n }\n });\n\n return _this.newArrayForCatlogData; \n };\n\n var format_CatalogCoursesAndTreeData = function(data) {\n _.each(data, function(node) {\n node.nodes = [];\n if (node.courseId !== null && node.courseId !== undefined && node.nodes.length === 0) {\n _this.formattedDataCatalog.formattedCoursesData.push(node);\n } else {\n _this.formattedDataCatalog.formattedCatalogTree.push(node);\n }\n\n });\n };\n\n var format_CatalogTreeData = function(data) {\n // map is a reference to the current node\n var map = {}, node;\n\n _.each(data, function(node) {\n map[node.nodeId] = node;\n if (node.parentId !== null) {\n map[node.parentId].nodes.push(node);\n } else {\n _this.formattedDataCatalog.formattedCatalogTreeData.push(node);\n }\n\n });\n };\n\n _this.getCustomCatalog = function () {\n var req = {\n method: 'GET',\n url: 'api/course/custom',\n //SLY-3847 New courses not showing up in custom catalog until page is refreshed.\n //cache: true,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return _this.formatCustomCatalog(success.data);\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.formatCustomCatalog = function(data) {\n var courseTypes = ['wbt', 'ilt', 'vle', 'task', 'survey', 'evaluation', 'courseGroups', 'assessment', 'careerPaths'];\n var courseTypesInData = [];\n\n if (data !== null) {\n for (var node in data) {\n if (data[node] !== null && data[node] !== 'undefined' && node !== 'courseGroups' && node !== 'careerPaths') {\n courseTypesInData.push(\n {\n 'api_name' : node,\n 'nodes': [],\n 'courses': data[node]\n }\n );\n }\n\n if (data[node] !== null && data[node] !== 'undefined' && (node === 'courseGroups' || (node === 'careerPaths' && SettingsService.isCareerPathEnabled()))) {\n courseTypesInData.push(\n {\n 'api_name' : node,\n 'courses': data[node]\n }\n );\n }\n }\n }\n\n _.each(courseTypesInData, function(courseTypeObj) {\n var courseTypeName = courseTypeObj.api_name;\n if (courseTypeName !== 'undefined' && courseTypeName !== null && $.inArray(courseTypeName, courseTypes) !== -1) {\n courseTypeObj.name = _this.courseTypeDisplayName(courseTypeName);\n\n if (courseTypeName === 'courseGroups') {\n _.each(courseTypeObj.nodes, function (courseSubGroup) {\n courseSubGroup.courses = courseSubGroup.children;\n courseSubGroup.api_name = 'courseGroups';\n delete courseSubGroup.children;\n });\n }\n } else if (courseTypeName === 'careerPaths') {\n _.each(courseTypeObj.nodes, function (courseSubGroup) {\n courseSubGroup.courses = courseSubGroup.children;\n courseSubGroup.api_name = 'careerPaths';\n delete courseSubGroup.children;\n });\n }\n });\n\n return courseTypesInData;\n };\n\n _this.courseTypeDisplayName = function (courseTypeName) {\n var courseTypeFullName;\n if (courseTypeName === 'wbt') {\n courseTypeFullName = 'Web Based Training';\n } else if (courseTypeName === 'ilt') {\n courseTypeFullName = 'Instructor Led Training';\n } else if (courseTypeName === 'vle') {\n courseTypeFullName = 'Virtual Classroom';\n } else if (courseTypeName === 'task') {\n courseTypeFullName = 'Tasks';\n } else if (courseTypeName === 'survey') {\n courseTypeFullName = 'Surveys';\n } else if (courseTypeName === 'evaluation') {\n courseTypeFullName = 'Evaluations';\n } else if (courseTypeName === 'assessment') {\n courseTypeFullName = 'Assessments';\n } else if (courseTypeName === 'courseGroups') {\n courseTypeFullName = 'Course Groups';\n } else if (courseTypeName === 'careerPaths') {\n courseTypeFullName = \"Career Paths\";\n }\n\n return courseTypeFullName;\n };\n\n /* Removes Duplicates from any array based on property.\n */\n _this.removeDuplicates = function(arr, prop) {\n var new_arr = [];\n var lookup = {};\n \n for (var i in arr) {\n lookup[arr[i][prop]] = arr[i];\n }\n \n for (i in lookup) {\n new_arr.push(lookup[i]);\n }\n \n return new_arr;\n }; \n\n /**** End of BAI Catalog on Assignments Tab - TA Stuff ****/\n\n // Return a unique, flat list of catalog courses sorted alphabetically by course name.\n _this.getCatalogCourses = function() {\n var catalogPromise = _this.getBaiCatalogData();\n return catalogPromise.then(function(success) {\n success.formattedCoursesData = _.sortBy(success.formattedCoursesData, 'courseId');\n var uniqueCourses = [];\n var lastCourseId = -1;\n _.each(success.formattedCoursesData, function(course) {\n // The catalog returns the same course under different parents. Make sure the course only exists once in the unrelated course list\n if (lastCourseId !== course.courseId) {\n course.id = course.courseId;\n uniqueCourses.push(course);\n }\n lastCourseId = course.courseId;\n });\n uniqueCourses = _.sortBy(uniqueCourses, 'name');\n return uniqueCourses;\n }, function(failure) {\n return failure;\n }\n );\n };\n\n}]);\n","catalog.service('CatalogSearchParameters', [function () {\n var _this = this;\n\n _this.breadcrumbs = [];\n _this.productBreadcrumbs = [];\n _this.fromBrowse = false;\n _this.browseFilter = {};\n\n var searchParameters = {\n searchTerm: \"\",\n filter: \"\",\n queryType: \"\",\n top: 15,\n skip: 0\n };\n\n if (navigator.userAgent.toLowerCase().indexOf(\"prerender\") > -1) {\n searchParameters.top = 1000;\n }\n\n _this.addQueryText = function (queryText) {\n searchParameters.searchTerm = queryText;\n searchParameters.filter = \"\";\n searchParameters.queryType = \"\";\n searchParameters.skip = 0;\n };\n\n _this.clearBreadcrumbs = function () {\n _this.breadcrumbs = [];\n };\n\n _this.getSearchParameters = function() {\n return searchParameters;\n };\n\n _this.clearFilters = function() {\n searchParameters.filter = \"\";\n searchParameters.queryType = \"\";\n };\n\n _this.setPage = function(selectedPage) {\n searchParameters.skip = (selectedPage - 1) * searchParameters.top;\n };\n\n _this.setFilters = function(f) {\n searchParameters.filter = f;\n };\n\n _this.addFacetFilters = function (facets) {\n var filterText = \"\";\n var i = 0;\n var f = 0;\n for (i = 0; i < facets.length; i++) {\n var filterValues = [];\n for (f = 0; f < facets[i].values.length; f++) {\n if (facets[i].values[f].selected === true) {\n var formattedValue = facets[i].values[f].value.replace(/\\'/g, '\\\\\\'\\\\\\'');\n filterValues.push(formattedValue);\n }\n }\n \n if (filterValues.length > 0) {\n if (filterText === \"\") {\n if(facets[i].isString){\n if (facets[i].negate) \n {\n filterText += _this.addNotString(facets[i], filterValues);\n }\n else\n {\n filterText += _this.addString(facets[i], filterValues);\n }\n }\n else {\n filterText += _this.addCollection(facets, i, filterValues);\n }\n } else {\n if (facets[i].isString) {\n if (facets[i].negate) \n {\n filterText += _this.addNotStringAnd(facets[i], filterValues);\n }\n else\n {\n filterText += _this.addStringAnd(facets[i], filterValues);\n }\n }\n else {\n filterText += _this.addCollectionAnd(facets, i, filterValues);\n }\n }\n }\n }\n searchParameters.filter = filterText;\n };\n\n _this.addString = function (facet, filterValues) {\n return facet.name + \" eq '\" + filterValues[0] + \"'\";\n };\n\n _this.addStringAnd = function (facet, filterValues) {\n return \" and \" + facet.name + \" eq '\" + filterValues[0] + \"'\";\n };\n\n _this.addNotString = function (facet, filterValues) {\n return facet.name + \" ne '\" + filterValues[0] + \"'\";\n };\n\n _this.addNotStringAnd = function (facet, filterValues) {\n return \" and \" + facet.name + \" ne '\" + filterValues[0] + \"'\";\n };\n _this.addCollection = function (facets, i, filterValues) {\n return facets[i].name + \"/any(\" + facets[i].name[0] + \": search.in(\" + facets[i].name[0] + \", '\" + filterValues.join('^') + \"', '^'))\";\n };\n\n _this.addCollectionAnd = function (facets, i, filterValues) {\n return \" and \" + facets[i].name + \"/any(\" + facets[i].name[0] + \": search.in(\" + facets[i].name[0] + \", '\" + filterValues.join('^') + \"', '^'))\";\n };\n\n _this.getQueryToSend = function () {\n var queryToSend = { search: '\"\"', top: 0, skip: 0 };\n if (!_this.fromBrowse) {\n queryToSend.search = '\"\\\\\"' + searchParameters.searchTerm + '\\\\\"\"';\n }\n queryToSend.top = searchParameters.top;\n queryToSend.skip = searchParameters.skip;\n console.log(queryToSend);\n if (searchParameters.filter !== \"\") {\n queryToSend.filter = \"\\\"\"+searchParameters.filter+\"\\\"\";\n }\n if (searchParameters.queryType !== \"\") {\n queryToSend.queryType = \"\\\"full\\\"\";\n }\n\n return queryToSend;\n };\n\n}]);","app.service('CategoriesService', ['$http', '$q', '$rootScope', '$filter', 'dateUtil', function ($http, $q, $rootScope, $filter, dateUtil) {\n var _this = this;\n\n _this.response = null;\n _this.filterName = null;\n _this.allCustomCategoriesForPortal = null;\n _this.fullCatalog = null;\n\n _this.fetch = function (filterName, refresh, shouldFormatCustom) {\n\n _this.filterName = filterName || null;\n\n if (refresh === undefined) {\n refresh = true;\n }\n\n if (_this.allCustomCategoriesForPortal !== undefined && _this.allCustomCategoriesForPortal !== null && !refresh && _this.filterName === null && shouldFormatCustom) {\n return $q.resolve(_this.allCustomCategoriesForPortal);\n } else if (_this.fullCatalog !== undefined && _this.fullCatalog !== null && !refresh && !shouldFormatCustom) {\n return $q.resolve(_this.fullCatalog);\n } else {\n var endpoint = 'api/category/';\n if ($rootScope.fromWeb === true) {\n endpoint = 'api/public/category/';\n }\n var req = {\n method: 'GET',\n url: endpoint,\n headers: {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'max-age=86400'\n }\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.filterByName(success.data);\n if (shouldFormatCustom) {\n _this.response = _this.formatForManage(_this.response);\n }\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n }\n };\n\n _this.filterByName = function (data) {\n if (_this.filterName !== null) {\n var filteredResponse = [];\n for (var i in data) {\n if (data[i].name === _this.filterName) {\n filteredResponse.push(data[i]);\n break;\n }\n }\n return filteredResponse;\n }\n\n _this.fullCatalog = data;\n return data;\n };\n\n /* Formatter for allCustomCategoriesForPortal service layer object - from categories get */\n _this.formatForManage = function (data) {\n var cats = [];\n var displayCategories = [];\n\n data.forEach(function (s) {\n if (s.name === \"Custom Content\" || s.name === \"Custom Documents\" || s.name === \"Policies\") {\n s.children.forEach(function (e) {\n e.contentType = (s.name === \"Custom Content\" ? \"Course\" : \"Document\");\n e.name = (s.name === \"Policies\" ? (e.name + \" (Policies)\") : e.name);\n cats.push(e);\n });\n }\n }); \n\n if (cats !== null) {\n cats.forEach(function (m) {\n if (m.children !== null) {\n m.children.forEach(function (child) {\n var lineItem = { 'subcategoryName': child.name, 'categoryname': m.name, 'description': child.description, 'categoryID': m.id, 'categoryNodeID': child.parentNodeId, 'canEdit': child.isEditable, 'isActive': child.active, 'subcategoryID': child.id, 'imageName': child.image, 'endDate': (child.endDate === null ? null : dateUtil.formatDate(child.endDate)), 'categoryType': m.contentType }; \n displayCategories.push(lineItem);\n });\n }\n });\n }\n\n _this.allCustomCategoriesForPortal = displayCategories;\n return displayCategories;\n };\n\n _this.newSubcategory = null;\n _this.createCategory = function (subcategory) {\n\n //Create new subcategory object that matches subcategories in the UI - to be used on success to add to this service's allCustomCategoriesForPortal\n _this.newSubcategory = _this.formatForSubcategory(subcategory);\n\n var req = {\n method: 'POST',\n url: 'api/category/',\n data: _this.formatToSend(subcategory),\n headers: {\n 'Content-Type': 'application/json'\n }\n };\n\n return $http(req).then(function (success) {\n _this.newSubcategory.subcategoryID = success.data.id;\n /* add the category type */\n _this.addCategoryType(_this.newSubcategory); \n //Add this new subcategory to allCustomCategoriesForPortal so that it appears on the Custom Content view\n _this.allCustomCategoriesForPortal.push(_this.newSubcategory);\n return success;\n }, function (failure) {\n throw failure;\n });\n\n };\n\n _this.editCategory = function (subcategory) {\n\n //Create new subcategory object that matches subcategories in the UI - to be used on success to add to this service's allCustomCategoriesForPortal\n _this.newSubcategory = _this.formatForSubcategory(subcategory);\n\n var req = {\n method: 'PUT',\n url: 'api/category/',\n data: _this.formatToSend(subcategory),\n headers: {\n 'Content-Type': 'application/json' \n }\n };\n\n return $http(req).then(function (success) {\n //update the service layer variable to reflect the changes\n if (_this.allCustomCategoriesForPortal !== undefined && _this.allCustomCategoriesForPortal !== null) {\n\n //On successful update - going to remove the edited subcategory and re-add it to allCustomCategoriesForPortal\n var idxCat = _.findIndex(_this.allCustomCategoriesForPortal, { 'subcategoryID': parseInt(success.data.id) });\n if (idxCat >= 0) { _this.allCustomCategoriesForPortal.splice(idxCat, 1); }\n _this.addCategoryType(_this.newSubcategory);\n _this.allCustomCategoriesForPortal.push(_this.newSubcategory);\n }\n return success;\n }, function (failure) {\n throw failure;\n });\n\n };\n\n _this.addCategoryType = function (subcategory) {\n /* get the category type based off of the sibling's category type */\n var sisterSubcategory = $filter('filter')(_this.allCustomCategoriesForPortal, { categoryID: subcategory.categoryID });\n if (sisterSubcategory.length > 0) { subcategory.categoryType = sisterSubcategory[0].categoryType; }\n }; \n\n /* formatter for this service layer subcategory to add to allCustomCategoriesForPortal */\n _this.formatForSubcategory = function (subcategory) {\n var subcategoryId = ((subcategory.subcategoryID === undefined || subcategory.subcategoryID === null) ? null : subcategory.subcategoryID);\n var subEndDate = ((subcategory.endDate === undefined || subcategory.endDate === null) ? null : dateUtil.formatDate(subcategory.endDate));\n var subIsActive = ((subcategory.isActive === undefined || subcategory.isActive === null) ? true : subcategory.isActive);\n \n return { 'subcategoryName': subcategory.subcategoryName, 'categoryname': subcategory.category.categoryName, 'description': subcategory.description, 'categoryID': subcategory.category.categoryID, 'canEdit': true, 'isActive': subIsActive, 'subcategoryID': subcategoryId, 'categoryNodeID': subcategory.category.categoryNodeID, 'imageName': subcategory.imageName, 'endDate': subEndDate };\n };\n\n _this.formatToSend = function (subcategory) {\n\n var cat = {};\n cat.parentId = subcategory.category.categoryID;\n cat.name = subcategory.subcategoryName;\n cat.description = (subcategory.description === undefined ? ' ' : subcategory.description);\n cat.active = subcategory.isActive;\n cat.endDate = ((subcategory.endDate === undefined || subcategory.endDate === null) ? null : dateUtil.formatDate(subcategory.endDate).fullDate);\n cat.parentNodeId = subcategory.category.categoryNodeID;\n cat.image = subcategory.imageName;\n if (subcategory.subcategoryID !== undefined && subcategory.subcategoryID !== null) {\n cat.id = subcategory.subcategoryID;\n }\n\n return cat;\n\n\n\n };\n\n _this.RemoveDocumentPolicies = function (data) {\n var nonPolicies = [];\n data.forEach(function (m) {\n if (!m.categoryname.includes(\"(Policies)\")) {\n nonPolicies.push(m);\n }\n });\n return nonPolicies;\n };\n\n}]);\n","app.service('CountriesService', ['$http', 'UsersService', function($http, UsersService) {\n var _this = this;\n\n _this.getCountryList = function() {\n var req = {\n method: 'GET',\n url: 'app/json/CountriesWithIsoCodes.json',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http.get(req.url).then(function (success) {\n // inject the user's country in the drop-list data if its not already there.\n //console.log(success.data);\n //console.log(success.data.find);\n \n _this.user = UsersService.user;\n var alreadyThere = success.data.find(function (c)\n\n { return c.value === _this.user.homeAddress.countryName; });\n if (!alreadyThere)\n success.data.push({ key: _this.user.homeAddress.countryName, value: _this.user.homeAddress.countryName });\n\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getLatitudeCountryList = function (structureId) {\n var req = {\n method: 'GET',\n url: 'api/user/countries/' + structureId + '/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http.get(req.url).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n}]);\n","app.service('CoursesService', ['$http', '$q', '$filter', 'courseFormatterUtil', 'dateUtil', 'Upload', function ($http, $q, $filter, courseFormatterUtil, dateUtil, Upload) {\n var _this = this;\n\n _this.response = null;\n _this.searchableCatalog = [];\n /**\n * Format all data that comes in\n *\n * Currently, nothing needs to be formatted immediately on response\n */\n _this.format = function (response) {\n var dates = ['assignedOn', 'completedDate', 'dueDate', 'startDate', 'endDate', 'endDateTime', 'startDateTime', 'displayStart', 'displayEnd', 'requestedOn', 'registrationEndDateTime'];\n\n var current, meetings = null;\n var nmlsCourseInResults = false;\n\n if (response !== null) {\n for (var assignment in response) {\n current = response[assignment];\n for (var node in current) {\n if (current[node] !== null && $.inArray(node, dates) !== -1) {\n current[node] = dateUtil.formatDate(current[node]);\n }\n // It's possible this way will find sessions during some api responses but not all\n else if (node === 'offerings') {\n for (var session in current.offerings) {\n if (typeof current.offerings[session].sessions !== 'undefined' && current.offerings[session].sessions.length > 0) {\n current.offerings[session].location = current.offerings[session].sessions[0].locationName;\n meetings = current.offerings[session].sessions;\n for (var offeringMeeting in meetings) {\n for (var meetingNode in meetings[offeringMeeting]) {\n if (meetings[offeringMeeting][meetingNode] !== null && $.inArray(meetingNode, dates) !== -1) {\n meetings[offeringMeeting][meetingNode] = dateUtil.formatDate(meetings[offeringMeeting][meetingNode]);\n }\n }\n }\n }\n }\n } else if (node === 'assignedOffering') {\n if (typeof current.assignedOffering !== 'undefined' && current.assignedOffering !== null && typeof current.assignedOffering.sessions !== 'undefined' && current.assignedOffering.sessions.length > 0) {\n meetings = current.assignedOffering.sessions;\n for (var assignedOfferingMeeting in meetings) {\n for (var assignedOfferingMeetingNode in meetings[assignedOfferingMeeting]) {\n if (meetings[assignedOfferingMeeting][assignedOfferingMeetingNode] !== null && $.inArray(assignedOfferingMeetingNode, dates) !== -1) {\n meetings[assignedOfferingMeeting][assignedOfferingMeetingNode] = dateUtil.formatDate(meetings[assignedOfferingMeeting][assignedOfferingMeetingNode]);\n }\n }\n }\n }\n }\n // This finds sessions coming back from api/offering/courseid/{courseId}/\n else if (node === 'sessions') {\n var sessions = current[node];\n for (var sessionIndex in sessions) {\n var currentSession = sessions[sessionIndex];\n for (var sessionNode in sessions[sessionIndex]) {\n if (currentSession[sessionNode] !== null && $.inArray(sessionNode, dates) !== -1) {\n currentSession[sessionNode] = dateUtil.formatDate(currentSession[sessionNode]);\n }\n }\n\n }\n }\n }\n\n\n current.codeForImage = courseFormatterUtil.getCourseCodeForImage(current.code, current.tileImage);\n\n if (typeof current.displayEnd === \"undefined\" || current.displayEnd === null) {\n current.isActive = true;\n } else {\n current.isActive = current.displayEnd.jsDate > new Date();\n }\n current.catalogId = parseInt(current.catalogId, 10) > 0 ? current.catalogId : null;\n \n if (current !== null && typeof current.isNMLS !== 'undefined' && current.isNMLS) {\n nmlsCourseInResults = true;\n }\n if (current.duration !== null) {\n current.duration = Math.round(current.duration * 60); // Convert hours to minutes for display\n }\n\n if (current.description !== null && current.description !== undefined && current.description.length > 50) {\n current.shortDescription = current.description.substring(0, 82) + ' ...';\n } else {\n current.shortDescription = current.description;\n }\n }\n\n //Set the NMLS course in results flag to true if there are any courses in the assignment that are NMLS\n response.containsNMLSCourse = nmlsCourseInResults;\n }\n\n return response;\n };\n\n /**\n * Format all data that comes in for a 'simple' course\n *\n */\n _this.formatSimple = function (response) {\n var dates = ['displayStart', 'displayEnd'];\n\n if (response !== null) {\n for (var assignment in response) {\n current = response[assignment];\n for (var node in current) {\n if (current[node] !== null && $.inArray(node, dates) !== -1) {\n current[node] = dateUtil.formatDate(current[node]);\n }\n\n current.catalogId = parseInt(current.catalogId, 10) > 0 ? current.catalogId : null;\n var catalogEntry = {};\n catalogEntry.name = current.name;\n catalogEntry.code = current.code;\n _this.searchableCatalog.push(catalogEntry);\n\n\n\n\n if (current.description !== null && current.description !== undefined && current.description.length > 50) {\n current.shortDescription = current.description.substring(0, 82) + ' ...';\n } else {\n current.shortDescription = current.description;\n }\n }\n if (current.type === \"mP4\") {\n current.type = \"mp4\";\n }\n if (current.type === \"mP3\") {\n current.type = \"mp3\";\n }\n }\n }\n\n return response;\n };\n\n _this.formatToSend = function(data) {\n var dates = ['endDate', 'startDate', 'displayStart', 'displayEnd', 'lastProcessedOn', 'lastUpdatedOn', 'acceptPassingScoreDate', 'dueDateFixed'];\n\n if (data.constructor !== Array) {\n for (var node in data) {\n if (typeof data[node] !== 'undefined' && data[node] !== null && $.inArray(node, dates) !== -1) {\n\n if (typeof data[node].moment !== \"undefined\" && data[node].moment !== null && _.isObject(data[node].moment)) {\n data[node] = data[node].moment.toISOString();\n } else {\n data[node] = null;\n }\n }\n if (node === \"duration\") {\n if (data[node] !== null) {\n data[node] = data[node] / 60; // Convert duration from minutes to hours for API, if it has a value.\n }\n }\n if (typeof data[node] !== 'undefined' && data[node] !== null && data[node].constructor === Array) {\n _this.formatToSend(data[node]);\n }\n }\n }\n\n if (data.constructor === Array) {\n _.each(data, function(dataPoint) {\n _this.formatToSend(dataPoint);\n });\n }\n\n return data;\n };\n\n _this.format_skinned = function(data) {\n var dates = ['assignedOn', 'completedDate', 'dueDate', 'startDate', 'endDate', 'endDateTime', 'startDateTime', 'displayStart', 'displayEnd'];\n\n if (data.constructor !== Array) {\n for (var node in data) {\n if (typeof data[node] !== 'undefined' && data[node] !== null && $.inArray(node, dates) !== -1) {\n if (data[node]) {\n data[node] = dateUtil.formatDate(data[node]);\n } \n }\n if (node === \"duration\") {\n if (data[node] !== null) {\n data[node] = Math.round(data[node] * 60); // Convert duration from hours to minutes for UI\n }\n }\n if (typeof data[node] !== 'undefined' && data[node] !== null && data[node].constructor === Array) {\n _this.format_skinned(data[node]);\n }\n }\n }\n\n if (data.constructor === Array) {\n _.each(data, function(dataPoint) {\n _this.format_skinned(dataPoint);\n });\n }\n\n return data;\n };\n\n _this.getSingle = function(userId, courseId, offeringId) {\n offeringId = (typeof offeringId !== 'undefined' && offeringId !== null) ? (offeringId + '/') : '';\n var url = 'api/course/' + courseId + '/' + offeringId;\n\n var req = {\n method: 'GET',\n url: url,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.singleResponse = _this.format([success.data]);\n\n return _this.singleResponse;\n }, function(failure) {\n throw failure;\n });\n };\n //[Route(\"~/api/course/courseurl/{courseId}/{assignmentType}\")]\n _this.getCourseUrl = function(assignmentId, type, userId) {\n var req = {\n method: 'GET',\n url: 'api/course/courseurl/' + assignmentId + '/' + type + '/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.courseResponse = success.data;\n return _this.courseResponse;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.getCoursePreviewUrl = function (courseId) {\n var req = {\n method: 'GET',\n url: 'api/course/coursepreviewurl/' + courseId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n //[Route(\"~/api/course/schedule/{userId}/{courseId}/{offeringId}/{type}\")]\n _this.scheduleOffering = function(assignmentId, userId, type, offeringId) {\n var req = {\n method: 'POST',\n url: 'api/course/schedule/' + userId + '/' + assignmentId + '/' + offeringId + '/' + type + '/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n return success.data;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.completeTask = function(taskId, userId) {\n var req = {\n method: 'POST',\n url: 'api/user/' + userId + '/task/' + taskId + '/',\n headers: {\n 'Content-type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = success.data;\n\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.fetchMany = function(userId, courseIds) {\n var req = {\n method: 'POST',\n url: 'api/course/' + userId + '/',\n data: courseIds,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.requestManagerialApproval = function(courseId, type, userId, offeringId) {\n var url = 'api/course/approval/' + userId + '/' + courseId + '/' + offeringId + '/' + type + '/';\n\n //if(typeof offeringId !== 'undefined' && offeringId !== null && type !== 'wbt') {\n // url += '/user/' + userId + '/' + type + '/requestapproval/' + offeringId;\n //} else {\n // url += '/requestapprovalwbt';\n //}\n\n var req = {\n method: 'POST',\n url: url,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n return success.data;\n }, function(failure) {\n throw failure;\n });\n };\n\n ///api/Courses/{courseId}\n _this.getSingleCourse = function(courseId) {\n var url = 'api/course/' + courseId;\n\n var req = {\n method: 'GET',\n url: url,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.singleCourseResponse = _this.format([success.data])[0];\n return _this.singleCourseResponse;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.getContentTypes = function () {\n var url = 'api/course/courseContentTypes/';\n\n var req = {\n method: 'GET',\n url: url,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n /* This creates a course and returns a course ID\n * Needs a course object in this format\n * var course = {};\n *\n * Route:https://localhost/lms-web/api/course/add\n { \"type\":\"task\",\n \"name\":\"New CourseAfter Refactor\",\n \"Enabled\":\"true\",\n \"DisplayStart\":\"12-03-2016\",\n \"DisplayEnd\":\"12-13-2016\",\n \"code\":\"tsk322\",\n \"uri\":\"http://www.bai.org\",\n \"description\":\"Bai Task Desscription..\" }\n */\n _this.createCourse = function(courseObj) {\n var req = {\n method: 'POST',\n url: 'api/course/',\n data: _this.formatToSend(courseObj),\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n var response = _this.format_skinned(success.data);\n\n return response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.checkLatestCourse = function () {\n var latestmatch = false;\n var equal = {\n method: 'GET',\n url: 'api/course/latestCourse',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n return $http(equal).then(function (success) {\n var newlatest = success.data;\n if (_this.latestCourse !== undefined && newlatest === _this.latestCourse) {\n _this.latestCourse = newlatest;\n return true;\n }\n else {\n _this.latestCourse = newlatest;\n return false;\n }\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getActiveCoursesForOrg = function (refresh, formatForTA) {\n if (refresh === undefined) {\n refresh = true;\n }\n if (_this.allActiveCoursesForOrg !== undefined && _this.allActiveCoursesForOrg !== null && !refresh) {\n if (formatForTA && _this.allActiveCoursesForOrg.sortedList === undefined) {\n //if the course data is cached from calls other than from TA - make sure there is the TA formatted data - if not, add it\n _this.formatForTACoursesTab(_this.allActiveCoursesForOrg);\n }\n return $q.resolve(_this.allActiveCoursesForOrg);\n\n\n } else {\n\n _this.allActiveCategories = [];\n _this.allActiveLibraries = [];\n _this.searchableCatalog = [];\n var req = {\n method: 'GET',\n url: 'api/course/Activecourses',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n var formattedResponse = _this.formatSimple(success.data);\n\n\n _this.allActiveCoursesForOrg = _this.courseFormattedDates(formattedResponse);\n\n if (formatForTA) {\n _this.formatForTACoursesTab(_this.allActiveCoursesForOrg);\n }\n\n return _this.allActiveCoursesForOrg;\n }, function (failure) {\n throw failure;\n });\n }\n \n };\n\n\n _this.getCoursesForOrg = function() {\n var req = {\n method: 'GET',\n url: 'api/course/courses',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n var formattedResponse = _this.format(success.data);\n\n\n _this.response = _this.courseFormattedDates(formattedResponse);\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n\n _this.formatForTACoursesTab = function () {\n\n /**\n * Format the course data to use on the TA courses tab\n */\n _this.allActiveCoursesForOrg.sortedList = $filter('orderBy')(_this.allActiveCoursesForOrg, 'name');\n _this.allActiveCoursesForOrg.currentCourseSet = angular.copy(_this.allActiveCoursesForOrg.sortedList);\n _this.allActiveCoursesForOrg.customCourses = $filter('filter')(_this.allActiveCoursesForOrg, { baiOnly: false, displayEnd: null });\n var copy = angular.copy(_this.allActiveCoursesForOrg.sortedList);\n _this.allActiveCoursesForOrg.topOneHundred = copy.splice(0, 100);\n };\n\n _this.getActiveCoursesForOrgFromCache = function () {\n return _this.allActiveCoursesForOrg;\n };\n\n\n _this.getSearchableCatalog = function () {\n return _this.searchableCatalog;\n };\n\n _this.getInactiveCoursesForOrg = function () {\n var req = {\n method: 'GET',\n url: 'api/course/inactivecourses',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n var formattedResponse = _this.formatSimple(success.data);\n\n\n _this.response = _this.courseFormattedDates(formattedResponse);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getCoursesByType = function (type, userId) {\n var userIdParam = userId === undefined ? 0 : userId;\n var req = {\n method: 'GET',\n url: 'api/course/bytype/'+type+'/'+userIdParam,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n var formattedResponse = _this.format(success.data);\n\n return formattedResponse;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.updateCourse = function(data) {\n var req = {\n method: 'PUT',\n url: 'api/course/',\n data: _this.formatToSend(data),\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n return $http(req).then(function(success) {\n return _this.format_skinned(success.data);\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.updateCoursePrerequisits = function (courseId, prereqsToUpdate, newPrereqList) {\n var pdata = { Key: prereqsToUpdate, Value: newPrereqList };\n\n var req = {\n method: 'POST',\n url: 'api/course/prerequpdate/' + courseId,\n data: JSON.stringify(pdata),\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n\n\n\n };\n\n _this.courseFormattedDates = function(data) {\n _.each(data, function(dataPoint) {\n if (dataPoint.displayStart !== null && dataPoint.displayStart !== undefined)\n dataPoint.startDateFormatted = dataPoint.displayStart.fullDate;\n if (dataPoint.displayEnd !== null && dataPoint.displayEnd !== undefined)\n dataPoint.endDateFormatted = dataPoint.displayEnd.fullDate;\n });\n\n return data;\n };\n\n _this.getCourseGroup = function(courseGroupId, courseGroupType) {\n var req = {\n method: 'GET',\n url: 'api/coursegroup/' + courseGroupId + '/' + courseGroupType,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n return success.data;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.formatCourseIds = function(data) {\n if (data.length > 0) {\n return _.pluck(data, 'id');\n }\n };\n\n _this.getSingleCourseOfferings = function(courseId) {\n \n var req = {\n method: 'GET',\n url: 'api/offering/courseid/' + courseId + '/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: 100000\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format(success.data);\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.getSingleCourseOfferingsOpen = function (courseId) {\n\n var req = {\n method: 'GET',\n url: 'api/offering/courseid/' + courseId + '/open/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: 100000\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format(success.data);\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getImodifyUrl = function (courseId) {\n var req = {\n method: 'GET',\n url: 'api/course/imodify/' + courseId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: 100000\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.CreateIModifyCourse = function (courseId) {\n var req = {\n method: 'POST',\n url: 'api/course/imodify/' + courseId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: 100000\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.resetIModifyCourseContent = function (courseId) {\n var req = {\n method: 'POST',\n url: 'api/course/resetimodify/' + courseId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: 100000\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.resetCourseStatus = function(courseId, userId) {\n var req = {\n method: 'POST',\n url: 'api/course/reset/' + courseId + '/' + userId,\n headers: {\n 'Content-Type': 'application/json'\n }\n };\n\n return $http(req).then(function(success) {\n return success.data;\n }, function(failure) {\n throw failure;\n });\n };\n\n\n _this.getSummaryCounts = function () {\n var req = {\n method: 'GET',\n url: 'api/course/summary',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: 100000\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getSummaryCountsByCourse = function () {\n var req = {\n method: 'GET',\n url: 'api/course/summarybycourse',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: 100000\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getUserSummariesByCourse = function (courseID) {\n var req = {\n method: 'GET',\n url: 'api/course/usersummariesbycourse/' + courseID,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return _this.formatResponse(success.data);\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getCoursePrereqs = function (courseID) {\n var req = {\n method: 'GET',\n url: 'api/course/prereq/' + courseID,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.formatResponse = function (data) {\n _.each(data, function (summary) {\n summary.assignment.enrolledDate = _this.formatDate(summary.assignment.enrolledDate);\n summary.assignment.assignedOn = _this.formatDate(summary.assignment.assignedOn);\n summary.assignment.completedDate = _this.formatDate(summary.assignment.completedDate);\n summary.assignment.status = _this.formatStatus(summary.assignment.status);\n });\n return data;\n };\n\n _this.formatDate = function (date) {\n return date === null ? null : dateUtil.formatDate(date);\n };\n\n _this.formatStatus = function (status) {\n var result = {};\n switch (status) {\n case 'new':\n result = 'New';\n break;\n case 'inProgress':\n result = 'In Progress';\n break;\n case 'successful':\n result = 'Succesful';\n break;\n default:\n result = 'Unknown';\n break;\n }\n return result;\n };\n\n _this.getCourseWithAssignment = function(courseId) {\n var req = {\n method: 'GET',\n url: 'api/course/' + courseId + '/assignment',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n console.log(\"failed\");\n throw failure;\n });\n };\n\n _this.getPreviewStatus = function (courseId) {\n var req = {\n method: 'GET',\n url: 'api/course/preview/status/' + courseId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.uploadScormPackage = function (scormPackage, courseId, shellType) {\n return Upload.upload({\n url: 'api/course/content/' + courseId + '/' + shellType + '/',\n data: { file: scormPackage },\n }).then(function (success) {\n return success;\n }, function (error) {\n throw error;\n });\n };\n\n _this.getDocumentDetailsforAttachedLaunch = function (resourceId) {\n var req = {\n method: 'GET',\n url: 'api/course/attachedDocumentLaunch/' + resourceId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n\n };\n\n}]);\n","app.service('CssService', ['$http', '$q', function ($http, $q) {\n var _this = this;\n\n _this.response = null;\n\n _this.currentcss = null;\n\t\n\t_this.RGBtoGrey = function (color) {\n // See http://stackoverflow.com/a/689547/761726\n // For how this works.\n\t\t/* function which takes a color in CSS RGB format and returns its\n\t\tgrescale value on a scale of 0-255 */\n\t\tvar Y,\n\t\tR,\n\t\tG,\n\t\tB;\n\t\t/*regex to check that input is of correct CSS RGB form \"#0a0b0c\" or \"#0ab\"*/\n\t\tvar re = /^#([0-9A-F]{6}|[0-9A-F]{3})$/;\n\t\tif (typeof color !== \"string\") {\n\t\t\treturn undefined;\n\t\t}\n\t\tcolor = color.trim().toUpperCase();\n\n\t\t/* check that the string is a CSS RGB color */\n\t\tif (!re.test(color)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t/* if we get a shorthand 4-character color code\n\t\treplicate the values to make it a standard 6-character */\n\t\tif (color.length === 4) {\n\t\t\tcolor = '#' + color[1] + color[1] + color[2] + color[2] + color[3] + color[3];\n\t\t}\n\n\t\t/*break string into components and calculate greyscale value */\n\t\tR = parseInt(color.substring(1, 3), 16);\n\t\tG = parseInt(color.substring(3, 5), 16);\n\t\tB = parseInt(color.substring(5, 7), 16);\n\n\t\t//console.log(R,G,B);\n\n\t\t/* calculate greyscale value */\n\t\tY = 0.2126 * R + 0.7152 * G + 0.0722 * B;\n\n\t\treturn Math.round(Y, 0);\n\t};\n\n // Return true if color is too light\n _this.isColorTooLight = function(color) {\n var Y = _this.RGBtoGrey(color);\n // *** IS COLOR TOO LIGHT ***\n if (Y >= 255 * 0.85) {\n return true;\n }\n return false;\n };\n\n\t_this.shouldTextBeLight = function (color) {\n\t\t/* based on input color, return true\n\t\tif the input color is so light that\n\t\twhite text would be unreadable */\n\n\t\tvar Y = _this.RGBtoGrey(color);\n\n\t\t/* use dark grey as threshold */\n\t\tif (Y <= 255 * 0.3) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t_this.extractColorFromCSS = function (css) {\n\t\t/* extract the portalBackground color from CSS returned via API\n\t\tthis regex is very specific to the CSS being returned from current API */\n\t\tvar re = /\\.portalBackground\\s*\\{\\s*background-color:\\s*(#[a-fA-F0-9]{6}|#[a-fA-F0-9]{3})!important/;\n\t\tvar res;\n\n\t\t//console.log(css.test(re));\n\t\tres = re.exec(css);\n\n\t\t/* return the match of the first named capture in parenthesis\n\t\tafter testing that result indicates something was found by\n\t\tregex */\n\t\tif (res && typeof res === 'object' && typeof res[1] === 'string') {\n\t\t\treturn res[1];\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t};\n\n\t_this.getAlternateColor = function (color) {\n\t\t/* return an alternate darker color\n\t\tcould be modified to be some function to darken color passed in\n\t\tor similar in the future. */\n\n\t\t/* right now just return 50% grey */\n return '#808080';\n\t};\n\n\t_this.handleContrastProblems = function (css) {\n\t\tvar color = _this.extractColorFromCSS(css);\n\n\t\tvar adminTabSelectedColor = color ? \" .admin-tab-selected-color { color: \" + color + \" !important; > svg { stroke: \" + color + \" !important; fill: \" + color + \" !important; } }\" : \" .admin-tab-selected-color { color: #1EABE3 !important; > svg { stroke: #1EABE3 !important; fill: #1EABE3 !important; } }\";\n\t\tcss += adminTabSelectedColor;\n\n // couldn't find the color so just pass CSS back through\n\t\tif (!color) {\n\t\t\treturn css;\n\t\t}\n\n // Y is the luminosity value\n // See http://stackoverflow.com/a/689547/761726\n var Y = _this.RGBtoGrey(color);\n // *** IS COLOR TOO LIGHT ***\n // If the color is too light, change the buttons and \n\t // calendar selected box and date highlight colors\n\t // and radio / checkbox colors to an alternate color\n\t\tif (Y >= 255 * 0.85) {\n\t\t css += \"html body button.btn-default { background-color: \" + _this.getAlternateColor(color) + \" !important; }\";\n\t\t css += \"html body a.btn-default { background-color: \" + _this.getAlternateColor(color) + \"!important; }\";\n\t\t css += \"html body button.md-primary { background-color: \" + _this.getAlternateColor(color) + \"!important; }\";\n css += \"html body #calendarMonthView .selected { background-color: \" + _this.getAlternateColor(color) + \" !important; }\";\n css += \".checkboxHolder input[type='checkbox']:checked + label::after { color: \" + _this.getAlternateColor(color) + \" !important; }\";\n css += \".radio input[type='radio']:checked + label::after { background-color: \" + _this.getAlternateColor(color) + \"!important; }\";\n\t\t css += \".md-calendar-date.md-calendar-date-today { color: \" + _this.getAlternateColor(color) + \"!important; }\";\n\t\t css += \".md-calendar-date.md-calendar-selected-date .md-calendar-date-selection-indicator { background-color: \" + color + \" !important; }\";\n\t\t css += \".insightsPortalTooLightFontColor { color: black !important; }\";\n\t\t css += \".insightsPortalTooLightFontColor:hover { color: black !important; }\";\n\t\t css += \".tipsImage { background-image:url('/lms-web/App/images/icons/lightbulb_black.svg') !important;}\";\n\t\t css += \".stepActiveText { color: \" + _this.getAlternateColor(color) + \"!important; }\";\n\t\t css += \".stepActiveText:hover { color: \" + _this.getAlternateColor(color) + \"!important; }\";\n\t\t css += \"#insightsHeader ul.glommer .active { background:\" + _this.getAlternateColor(color) + \"!important; }\";\n\t\t css += \"#insightsHeader ul.glommer li.active.portalBackground::before { background:\" + _this.getAlternateColor(color) + \"!important; }\";\n\t\t css += \".portalCheck input[type='checkbox']:checked + label::after {border-color: \" + _this.getAlternateColor(color) + \"!important; }\";\n\t\t css += \"ul.bai-tab-nav li.active>a { color: black !important; }\";\n\t\t\tcss += \"bai-catalog-header button.catalog-button.btn-div { background-color: \" + _this.getAlternateColor(color) + \" !important; }\";\n\t\t\tcss += \"bai-catalog-header-lms button.catalog-button.btn-div { background-color: \" + _this.getAlternateColor(color) + \" !important; }\";\n\t\t\tcss += adminTabSvgColorAsString;\n return css;\n }\n\n // Calendar text should be bright if the color is too dark.\n // The text on the calendar is dark by default.\n if (Y <= 255 * 0.45) {\n css += '.selected .portalLightText { color: white !important; }';\n css += \".md-calendar-date.md-calendar-selected-date .md-calendar-date-selection-indicator { background-color: \" + color + \" !important; color: white !important;}\";\n return css;\n }\n\n\t\t// no fixes needed, return original CSS\n return css;\n\t};\n\n\n _this.fetchByUserId = function (query) {\n if(_this.response !== null) {\n\t\t\treturn $q(function(resolve) {\n\t\t\t\tresolve(_this.response);\n\t\t\t});\n }\n\n var req = {\n method: 'GET',\n url: 'api/account/customcss/user/' + query,\n headers: {\n 'Content-type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n /* apply contrast fixes to css response */\n\t\t\t_this.response = _this.handleContrastProblems(success.data);\n\t\t\t_this.currentcss = success.data;\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.fetchByPortalId = function (portalId) {\n if (_this.response !== null) {\n return $q(function (resolve) {\n resolve(_this.response);\n });\n }\n\n var req = {\n method: 'GET',\n url: 'api/account/customcss/company/' + portalId,\n headers: {\n 'Content-type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n /* apply contrast fixes to css response */\n _this.response = _this.handleContrastProblems(success.data);\n _this.currentcss = success.data;\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n\n\t/**\n\t * This method is required to get rid of any existing results. Reason is if you switch between portals,\n\t * which who would do that, you will get cached data. Homey don't play, tho.\n\t */\n\t_this.purgeResults = function() {\n\t\t_this.response = null;\n\t};\n}]);\n","app.service('DocumentService', ['$http', '$q', 'dateUtil', 'Upload', function($http, $q, dateUtil, Upload) {\n var _this = this;\n\n _this.data = null;\n\n _this.fetch = function(filterBy) {\n // Return the old data if this function is called twice.\n //I commenteded out this code because it looked like the pointer to the cached data was alive, but the data set was empty (PV 6/15/16)\n //if (_this.data !== null) {\n // return $q(function (resolve) {\n // _this.data = _this._format(filterBy);\n // resolve(_this.data);\n // });\n //}\n\n var url = 'api/asset';\n\n var req = {\n method: 'GET',\n url: url,\n headers: {\n 'Content-Type': 'application/json'\n }\n };\n\n return $http(req).then(function(success) {\n _this.data = success.data;\n _this._format(filterBy);\n\n return _this.data;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this._format = function(filterBy) {\n\n return _this._formatDocuments([_this.data])[0];\n };\n\n /*\n _this.filterBy = function () {\n var documents = _this.data;\n\n var nesting = _this.filter;\n if (nesting !== null) {\n for (var i in documents) {\n if (documents[i].nodeId === nesting) {\n _this.data = documents[i].children;\n\n return;\n }\n }\n }\n\n _this.data = documents;\n };\n */\n\n _this._findObjectById = function(id, children) {\n var data = typeof children === 'undefined' ? _this.data : children;\n var final = null;\n\n if (id !== null) {\n for (var i in data) {\n if (data[i].nodeId === parseInt(id, 10)) {\n _this.data = data[i];\n } else {\n if (typeof data[i].children !== 'undefined') {\n final = _this._findObjectById(id, data[i].children);\n }\n }\n }\n\n return final;\n } else {\n _this.data = data;\n }\n };\n\n // Formats the datetimes in the documents\n // retrieved from the server\n _this._formatDocuments = function(documents) {\n var child = null;\n\n for (var _document in documents) {\n if (documents[_document].isParent === undefined) {\n continue;\n }\n if (documents[_document].isParent === true) {\n documents[_document].children = _this._formatDocuments(documents[_document].children);\n } else {\n documents[_document].postedDate = dateUtil.formatDate(documents[_document].postedDate);\n }\n }\n\n return documents;\n };\n\n /* Takes a url as a string, puts it\n * in the document repository\n * and returns an id of that url */\n _this.uploadUrlToRepository = function(url) {\n var data = { 'Url': url };\n var req = {\n method: 'POST',\n url: 'api/asset/url/',\n headers: {\n 'Content-Type': 'application/json'\n },\n data: data,\n timeout: window.timeout\n };\n return $http(req).then(function(success) {\n return success;\n }, function(failure) {\n throw failure;\n });\n };\n\n /* Takes a url as a string, attaches it as a resource\n * to a course specified by courseId\n * returns nothing of importance */\n _this.attachUrlToCourse = function (url, courseId, launchWithContent) {\n if (launchWithContent === undefined) { launchWithContent = false; }\n var data = { 'Url': url };\n\n var req = {\n method: 'POST',\n url: 'api/asset/url/' + courseId + '/' + launchWithContent,\n headers: {\n 'Content-Type': 'application/json'\n },\n data: data,\n timeout: window.timeout\n };\n return $http(req).then(function(success) {\n return success;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.uploadDocumentToStorage = function (file, courseId) {\n var mimeGroup = _getDocumentMimeGroup(file.type);\n return Upload.upload({\n url: 'api/course/document/' + courseId + '/' + mimeGroup,\n data: { file: file },\n }).then(function (success) {\n return success;\n }, function (error) {\n throw error;\n });\n };\n\n _this.uploadDocumentUrl = function (url, courseId) {\n var data = { 'Url': url };\n\n var req = {\n method: 'POST',\n url: 'api/course/document/url/' + courseId,\n headers: {\n 'Content-Type': 'application/json'\n },\n data: data,\n timeout: window.timeout\n };\n return $http(req).then(function (success) {\n return success;\n }, function (failure) {\n throw failure;\n });\n };\n\n /* Takes a file object from ngf-select and uploads it\n * to the document repository\n */\n _this.uploadDocumentToRepository = function(file) {\n var mimeGroup = _getDocumentMimeGroup(file.type);\n return Upload.upload({\n url: 'api/asset/' + mimeGroup,\n data: { file: file },\n }).then(function(success) {\n return success;\n }, function(error) {\n throw error;\n });\n };\n\n /* Takes a file object from ngf-select and a courseId\n * and attaches it to the course specified by that ID\n */\n _this.uploadDocument = function (file, courseId, launchWithContent) {\n if (launchWithContent === undefined) { launchWithContent = false;}\n\n var mimeGroup = _getDocumentMimeGroup(file.type);\n\n return Upload.upload({\n url: 'api/asset/doc/' + courseId + '/' + mimeGroup + '/' + launchWithContent,\n data: { file: file },\n }).then(function(success) {\n return success;\n }, function(error) {\n throw error;\n });\n };\n\n _this.attachDocumentFromRepositoryToCourse = function(resourceId, courseId) {\n return $http.put('api/asset/' + courseId + '/' + resourceId + '/').then(function(success) {\n return success;\n }, function(error) {\n throw error;\n });\n };\n\n _this.getDocumentRepositoryList = function() {\n var url = 'api/asset/';\n\n var req = {\n method: 'GET',\n url: url\n };\n\n return $http.get(req.url).then(function(success) {\n _this.response = success.data;\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getDocumentsForCourse = function(courseId) {\n\n var url = 'api/asset/' + courseId + '/course';\n var req = {\n method: 'GET',\n url: url\n };\n\n return $http(req).then(function(success) {\n _this.response = success.data;\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.getSingleDocumentInfo = function(id) {\n var url = 'api/asset/' + id + '/';\n\n var req = {\n method: 'GET',\n url: url\n };\n\n return $http.get(req.url).then(function(success) {\n _this.response = success.data;\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n _this.getAllCoursesByResource = function (id) {\n var url = 'api/course/document/' + id;\n\n var req = {\n method: 'GET',\n url: url\n };\n\n return $http.get(req.url).then(function (success) {\n _this.response = success.data;\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n _this.deleteDocumentById = function (Id) {\n\n var req = {\n method: 'DELETE',\n url: 'api/asset/document/' + Id,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = success.data;\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n\n };\n\n _this.updateSingleAsset = function(asset) {\n\n var req = {\n method: 'PUT',\n url: 'api/asset/update/',\n data: asset,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = success.data;\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.replaceAsset = function(file, assetId, fileType) {\n var mimeGroup;\n \n if (fileType === 'file') {\n mimeGroup = _getDocumentMimeGroup(file.type);\n return Upload.upload({\n url: 'api/asset/' + assetId + '/' + mimeGroup + '/'+0,\n data: { file: file },\n }).then(function(success) {\n return success;\n }, function(error) {\n throw error;\n });\n } else if (fileType === 'url') {\n var data = { 'Url': file };\n var req = {\n method: 'PUT',\n url: 'api/asset/' + assetId,\n headers: {\n 'Content-Type': 'application/json'\n },\n data: data,\n timeout: window.timeout\n };\n return $http(req).then(function(success) {\n return success;\n }, function(failure) {\n throw failure;\n });\n }\n };\n\n _this.deleteAsset = function (courseId, fileId) {\n\n var req = {\n method: 'DELETE',\n url: 'api/asset/' + courseId + '/' + fileId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = success.data;\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.uploadDocumentToStorage = function (file, courseId) {\n var mimeGroup = _getDocumentMimeGroup(file.type);\n return Upload.upload({\n url: 'api/course/document/' + courseId + '/' + mimeGroup,\n data: { file: file },\n }).then(function (success) {\n return success;\n }, function (error) {\n throw error;\n });\n };\n\n _this.uploadDocumentUrl = function (url, courseId) {\n var req = {\n method: 'POST',\n url: 'api/course/document/url/' + courseId,\n headers: {\n 'Content-Type': 'application/json'\n },\n data: url,\n timeout: window.timeout\n };\n return $http(req).then(function (success) {\n return success;\n }, function (failure) {\n throw failure;\n });\n }; \n\n _this.getDocumentPath = function (courseId) {\n var req = {\n method: 'GET',\n url: 'api/course/document/path/' + courseId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.isDirectLaunchType = function (type) {\n var typeLower = type.toLowerCase();\n if (typeLower === 'word' || typeLower === 'excel' || typeLower === 'other' || typeLower === 'url') {\n return true;\n }\n return false;\n };\n\n _this.getDocumentTypeByExt = function (ext) {\n var result;\n switch (ext.toLowerCase()) {\n case \".mp3\":\n result = \"mp3\";\n break;\n case \".mp4\":\n result = \"mp4\";\n break;\n case \".pdf\":\n result = \"pdf\";\n break;\n case \".doc\":\n case \".docx\":\n case \".dot\":\n case \".dotx\":\n result = \"word\";\n break;\n case \".xls\":\n case \".xlsx\":\n case \".xlt\":\n case \".xltx\":\n result = \"excel\";\n break;\n default:\n result = \"other\";\n break;\n }\n\n return result;\n };\n\n var _getDocumentMimeGroup = function(mimeType) {\n var typeMap = {};\n /* pdf, word,powerpoint,excel, text, audio,video, picture, url, zip\n * Server accepts those types. If not found, return text type.\n * @TODO technical debt Move this to C# side.\n */\n\n typeMap['application/vnd.ms-word.document.macroEnabled.12'] = 'word';\n typeMap['application/msword'] = 'word';\n typeMap['application/vnd.openxmlformats-officedocument.wordprocessingml.document'] = 'word';\n typeMap['text/rtf'] = 'word';\n\n typeMap['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'] = 'excel';\n\n typeMap['application/zip'] = 'zip';\n typeMap['application/pdf'] = 'pdf';\n\n typeMap['audio/mp3'] = 'audio';\n typeMap['audio/3gpp'] = 'audio';\n typeMap['audio/3gpp2'] = 'audio';\n typeMap['audio/mp4'] = 'audio';\n typeMap['audio/ogg'] = 'audio';\n typeMap['audio/mpeg4-generic'] = 'audio';\n typeMap['audio/mpeg'] = 'audio';\n typeMap['audio/rtp-midi'] = 'audio';\n typeMap['audio/vorbis'] = 'audio';\n typeMap['audio/ac3'] = 'audio';\n\n typeMap['text/html'] = 'text';\n typeMap['text/csv'] = 'text';\n\n typeMap['image/jpeg'] = 'picture';\n typeMap['image/png'] = 'picture';\n typeMap['image/tiff'] = 'picture';\n\n typeMap['image/gif'] = 'video';\n typeMap['video/quicktime'] = 'video';\n typeMap['video/ogg'] = 'video';\n typeMap['video/mpeg4-generic'] = 'video';\n typeMap['video/mp4'] = 'video';\n typeMap['video/VP8'] = 'video';\n typeMap['video/jpeg2000'] = 'video';\n typeMap['video/JPEG'] = 'video';\n typeMap['video/H264'] = 'video';\n typeMap['video/3gpp'] = 'video';\n\n typeMap['application/vnd.openxmlformats-officedocument.presentationml.presentation'] = 'powerpoint';\n typeMap['application/vnd.ms-powerpoint'] = 'powerpoint';\n if (mimeType in typeMap) {\n return typeMap[mimeType];\n }\n\n return 'text';\n };\n\n}]);\n","app.service('EvaluationService', ['$http', '$q', function ($http, $q) {\n var _this = this;\n\n _this.singleResponse = null;\n\n _this.fetchSingle = function (userId, evaluationId) {\n\n var url = 'api/user/' + userId + '/evaluation/' + evaluationId + '/';\n\n var req = {\n method: 'GET',\n url: url,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.singleResponse = success.data;\n\n return _this.singleResponse;\n }, function (failure) {\n throw failure;\n });\n };\n}]);\n","app.service('GroupsService', ['$http', '$q', '$filter', 'dateUtil', 'UsersService', 'LocationsService', function ($http, $q, $filter, dateUtil, UsersService, locationsService) {\n\n var _this = this;\n _this.response = null;\n _this.UsersService = UsersService;\n _this.LocationsService = locationsService;\n\n _this.tempStateData = {};\n _this.setData = function(data) {\n _this.tempStateData = data;\n };\n _this.getData = function () {\n return _this.tempStateData;\n };\n _this.getCurrentNode = function() {\n if (_this.tempStateData !== null && typeof _this.tempStateData.currentnode !== \"undefined\") {\n return _this.tempStateData.currentnode;\n }\n\n return \"active\";\n };\n\n\n _this.peopleGroupStructure = function (groupId) {\n //using json file locally for timebeing will toggle it later to end point\n var req = {\n method: 'GET',\n url: 'api/PeopleGroup?groupId=' + groupId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format_peopleGroupStructure(success.data);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getPeopleGroupFilters = function () {\n var req = {\n method: 'GET',\n url: 'api/peoplegroup/filters',\n cache: true,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format_getPeopleGroupFilters(success.data);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getContainerOperands = function () {\n\n var req = {\n method: 'GET',\n url: 'api/peoplegroup/operands',\n cache: true,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n\n };\n\n return $http(req).then(function (success) {\n _this.response = _.each(success.data, function (dataPoint) { _this.formatDisplayNameForOperands(dataPoint); });\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getPeopleGroups = function (active) {\n var url = '';\n if (typeof active !== \"undefined\" && active !== null) {\n url = 'api/user/groups/?isactive=' + active;\n } else {\n url = 'api/user/groups';\n }\n\n var req = {\n method: 'GET',\n url: url,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.formatForPeopleGroups(success.data);\n // DON'T delete allGroupsData., its being used for people groups and rules\n _this.allGroupsData = success;\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getPeopleGroupUsers = function (groupId) {\n var req = {\n method: 'GET',\n url: 'api/groups/' + groupId + '/users',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = success.data;\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n _this.queueSpot = 0;\n _this.getQueueStatus = function (groupId) {\n var req = {\n method: \"GET\",\n url: \"api/peoplegroup/\" + groupId + \"/queuestatus\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n if (success.data.lastProcessedDate !== null) {\n success.data.lastProcessedDate = new Date(success.data.lastProcessedDate);\n }\n if (success.data.dateQueued !== null) {\n success.data.dateQueued = new Date(success.data.dateQueued);\n }\n if (success.data.processedEndDate !== null) {\n success.data.processEndDate = new Date(success.data.processEndDate);\n }\n if (success.data.processStartDate !== null) {\n success.data.processStartDate = new Date(success.data.processStartDate);\n }\n return success.data;\n });\n };\n\n _this.addGroupToProcessingQueue = function (groupId) {\n var req = {\n method: \"POST\",\n url: \"api/peoplegroup/\" + groupId + \"/addToQueue\",\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n if (success.data.lastProcessedDate !== null) {\n success.data.lastProcessedDate = new Date(success.data.lastProcessedDate);\n }\n if (success.data.dateQueued !== null) {\n success.data.dateQueued = new Date(success.data.dateQueued);\n }\n if (success.data.processedEndDate !== null) {\n success.data.processEndDate = new Date(success.data.processEndDate);\n }\n if (success.data.processStartDate !== null) {\n success.data.processStartDate = new Date(success.data.processStartDate);\n }\n return success.data;\n });\n };\n\n _this.getPeoplePreview = function (GroupData) {\n var dataCopy = angular.copy(GroupData);\n var dataToSend = _this.formatGroupDataToSend(dataCopy); \n\n var req = {\n method: 'POST',\n url: 'api/peoplegroup/preview',\n data: dataToSend,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = success.data;\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getUsersByGroupId = function (groupId) {\n var req = {\n method: \"GET\",\n url: \"api/peoplegroup/\" + groupId,\n timeout: window.timeout\n };\n console.log(\"GroupId = \" + groupId);\n return $http(req).then(function (success) {\n _this.response = _this.formatPGUsers(success.data);\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.formatPGUsers = function (data) {\n var dates = ['endDate', 'startDate', 'displayStart', 'displayEnd', 'hireDate'];\n \n if (data.constructor !== Array) {\n for (var userNode in data) {\n if (typeof data[userNode] !== 'undefined' && data[userNode] !== null && $.inArray(userNode, dates) !== -1) {\n data[userNode] = dateUtil.formatDate(data[userNode]);\n }\n }\n }\n if (data.constructor === Array) {\n _.each(data, function (dataPoint) {\n _this.formatPGUsers(dataPoint);\n });\n }\n\n return data;\n };\n _this.getPageOfUsers = function (ar, page, pageSize, totalUserCount) {\n var currentPage = page - 1;\n var result = [];\n for (var i = 0; i < pageSize; i++) {\n var currentIndex = currentPage * pageSize + i;\n if (currentIndex >= totalUserCount) {\n break; // Don't go past total size of array\n }\n result.push(ar[currentIndex]);\n }\n return result;\n };\n\n _this.setEndDate = function (status) {\n var endDate;\n if (status === 'deactivate') {\n endDate = dateUtil.formatDate(new Date());\n } else if (status === 'activate' || status === 'update' || status === 'save') {\n endDate = null;\n }\n\n return endDate;\n };\n\n _this.savePeopleGroup = function (groupData, status) {\n var dataCopy = angular.copy(groupData);\n\n var endDateRootContainer;\n \n if (typeof status !== 'undefined' && status === \"deactivate\") {\n endDateRootContainer = _this.setEndDate(status);\n dataCopy.endDate = endDateRootContainer;\n } else if (typeof status !== 'undefined' && status === \"activate\") {\n endDateRootContainer = _this.setEndDate(status);\n dataCopy.endDate = endDateRootContainer;\n }\n\n var dataToSend = _this.formatGroupDataToSend(dataCopy);\n dataToSend.status = status;\n // make the time 5 minutes earlier to solve the small date issue\n dataToSend.startDate.setMinutes(dataToSend.startDate.getMinutes()-5);\n var method = '';\n //todo\n if (status.includes(\"update\") || status.includes(\"activate\")) {\n method = 'PUT';\n } else if (status.includes(\"create\")) {\n method = 'POST';\n }\n\n var req = {\n method: method,\n url: 'api/peoplegroup',\n data: dataToSend,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format_peopleGroupStructure(success.data);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.formatDisplayNameForOperands = function (obj) {\n var displayNames = [\"equals\", \"greater than\", \"less than\", \"less than or equals to\", \"greater than or equals to\"];\n var iChars = \"!&=-<>?\";\n\n var operandName = obj.name || obj.operandValue;\n for (var i = 0; i < operandName.length; i++) {\n if (iChars.indexOf(operandName.charAt(i)) !== -1) {\n if (operandName === \"=\") {\n obj.displayName = displayNames[0];\n } else if (operandName === \">\") {\n obj.displayName = displayNames[1];\n } else if (operandName === \"<\") {\n obj.displayName = displayNames[2];\n } else if (operandName === \"<=\") {\n obj.displayName = displayNames[3];\n } else if (operandName === \">=\") {\n obj.displayName = displayNames[4];\n }\n } else {\n obj.displayName = obj.name || obj.operandValue;\n }\n }\n\n return obj;\n };\n\n _this.containerOperandsRequired = function (data) {\n var arr = [\"AND\", \"OR\", \"NOT\"];\n var sendArr = [];\n _.each(data, function (dataPoint) {\n _.each(arr, function (elem) {\n if (elem === dataPoint.operandValue) {\n sendArr.push(dataPoint);\n }\n });\n });\n\n return sendArr;\n };\n\n _this.format_peopleGroupStructure = function (data) {\n\n var dates = ['startDate', 'endDate'];\n\n if (data.subContainers.length > 0) {\n var subContainersData = data.subContainers;\n _.each(subContainersData, function (subContainerData) {\n _this.format_peopleGroupStructure(subContainerData);\n });\n }\n\n if (data.criteria.length > 0) {\n var criteriasData = data.criteria;\n _.each(criteriasData, function (criteria) {\n if (criteria.criteriaName.includes(\"Date\")) {\n criteria.value = dateUtil.formatDate(criteria.value);\n criteria.isDate = true;\n criteria.isString = false;\n criteria.isBool = false;\n } else if (criteria.criteriaName === \"Is Manager\") {\n criteria.valueLabel = _this.formatBool(criteria);\n criteria.isDate = false;\n criteria.isString = false;\n criteria.isBool = true;\n } else {\n criteria.isDate = false;\n criteria.isString = true;\n criteria.isBool = false;\n }\n });\n }\n\n for (var node in data) {\n if (data[node] !== null && $.inArray(node, dates) !== -1) {\n data[node] = dateUtil.formatDate(data[node]);\n }\n\n }\n\n return data;\n };\n\n _this.formatForPeopleGroups = function (data) {\n var groupsList = data.groups;\n _.each(groupsList, function (group) {\n group.nodes = [];\n group.name = group.groupName;\n if (group.recordDateTime !== null) {\n group.recordDateTime = new Date(group.recordDateTime);\n }\n\n group.startDate = dateUtil.formatDate(group.startDate);\n if (group.endDate !== null) {\n group.endDate = dateUtil.formatDate(group.endDate);\n }\n });\n\n return data;\n };\n\n _this.formatGroupDataToSend = function (data) {\n\n if (data.startDate !== 'undefined' && data.startDate !== null) {\n data.startDate = data.startDate.jsDate;\n }\n\n if (typeof(data.endDate) !== 'undefined' && data.endDate !== null) {\n data.endDate = data.endDate.jsDate;\n }\n\n if (data.criteria.length > 0 || data.subContainers.length > 0) {\n var criteriaArr = data.criteria;\n _.each(criteriaArr, function (criteria) {\n\n if (criteria.criteriaName.includes(\"Date\") && criteria.value !== 'undefined' && criteria.value !== null) {\n criteria.value = criteria.value.moment.toISOString(); \n }\n\n if (criteria.criteriaName.includes(\"By Name\")) {\n if (criteria.valueLabel !== null && typeof criteria.valueLabel !== 'undefined') {\n if (typeof criteria.valueLabel.name !== 'undefined' && criteria.valueLabel.name !== null) {\n criteria.value = criteria.valueLabel.name; //if autocomplete/typeahead selection used\n }\n else {\n criteria.value = criteria.valueLabel; //typed with no selection\n }\n }\n else {\n criteria.value = ''; //empty field\n }\n }\n if (criteria.criteriaName.includes(\"Custom\") || (criteria.criteriaName.includes(\"Location\"))) {\n\n\n if (criteria.valueLabel !== null && typeof criteria.valueLabel !== 'undefined') {\n if (typeof criteria.valueLabel.name !== 'undefined' && criteria.valueLabel.name !== null) {\n criteria.value = criteria.valueLabel.name; //if autocomplete/typeahead selection used\n }\n else {\n criteria.value = criteria.valueLabel; //typed with no selection\n }\n }\n else {\n criteria.value = ''; //empty field\n }\n }\n delete criteria.operatorsData;\n delete criteria.autoCompleteData;\n delete criteria.isString;\n delete criteria.isDropdown;\n delete criteria.isDate;\n delete criteria.isBool;\n\n });\n\n _.each(data.subContainers, function (subContainerData) {\n _this.formatGroupDataToSend(subContainerData);\n });\n }\n\n return data;\n };\n\n _this.format_getPeopleGroupFilters = function (data) {\n\n _.each(data, function (dataPoint) {\n if (dataPoint.operands) {\n _.each(dataPoint.operands, function (operand) {\n _this.formatDisplayNameForOperands(operand);\n });\n }\n });\n\n return data;\n };\n\n // Use this method to return list of active positions for portal\n _this.activePositions = function (positions) {\n var output = $filter('filter')(positions, function (position) {\n if (position.isActive === true) {\n return position;\n }\n });\n\n return output;\n };\n\n _this.secondaryFormatGroupStructure = function (orgData, groupData, jobsData, countriesData, stateData) {\n _this.secondaryFormatGroupStructue_orgData = orgData;\n _this.secondaryFormatGroupStructue_groupData = groupData;\n _this.secondaryFormatGroupStructue_jobsData = _this.activePositions(jobsData);\n _this.secondaryFormatGroupStructue_countriesData = countriesData;\n _this.secondaryFormatGroupStructue_userData = stateData;\n };\n\n _this.secondaryFormatGroupStructure_groupStructure = function (groupStructure) {\n _this.secondaryFormatGroupStructue_groupStructure = groupStructure;\n var groupStructures = [_this.secondaryFormatGroupStructue_groupStructure];\n _this.secondaryFormatGroupStructue_01(groupStructures);\n\n return _this.peopleGroupCleanUpBeforeRender([groupStructure]);\n };\n\n _this.peopleGroupCleanUpBeforeRender = function (secondaryFormatGroupStructure) {\n\n _.each(secondaryFormatGroupStructure, function (groupStructure) {\n if (groupStructure.criteria.length > 0) {\n _.each(groupStructure.criteria, function (criteria) {\n if (typeof criteria.valueLabel === 'undefined' || criteria.valueLabel === null) {\n criteria.valueLabel = criteria.value;\n }\n });\n }\n if (groupStructure.subContainers.length > 0) {\n _this.peopleGroupCleanUpBeforeRender(groupStructure.subContainers);\n }\n });\n\n return secondaryFormatGroupStructure[0];\n\n };\n\n _this.secondaryFormatGroupStructue_01 = function (groupStructures) {\n _.each(groupStructures, function (groupStructure) {\n if (groupStructure.criteria.length > 0) {\n _this.secondaryFormatGroupStructue_02(groupStructure.criteria);\n }\n if (groupStructure.subContainers.length > 0) {\n _this.secondaryFormatGroupStructue_01(groupStructure.subContainers);\n }\n });\n\n return groupStructures;\n };\n\n _this.secondaryFormatGroupStructue_02 = function (criterias) {\n var primaryNodes = ['People Group', 'Manager', 'Organization', 'Position', 'Person', 'Country', 'State/Province'];\n var current = null;\n var node;\n\n if (criterias.length > 0) {\n for (var criteria in criterias) {\n current = criterias[criteria];\n\n for (node in current) {\n if (typeof current[node] !== 'undefined' && current[node] !== null && $.inArray(current[node], primaryNodes) !== -1) {\n _this.secondaryFormatGroupStructue_03(current);\n }\n }\n }\n }\n\n return criterias;\n };\n\n _this.secondaryFormatGroupStructue_03 = function (criteria) {\n var selectedItem;\n\n if (criteria.criteriaName === \"Person\" || criteria.criteriaName === \"Manager\") {\n //selectedItem = $filter('filter')(_this.secondaryFormatGroupStructue_userData, { id: criteria.value });\n //var userpromise = UsersService.fetch(criteria.value);\n //userpromise.then(function (success) {\n // selectedItem = success;\n\n // if (typeof selectedItem !== 'undefined' && selectedItem !== null) {\n // criteria.valueLabel = selectedItem.fullName;\n // } else {\n // criteria.valueLabel = criteria.value;\n // }\n //});\n criteria.valueLabel = criteria.additionalDetails;\n\n }\n\n if (criteria.criteriaName === \"Position\") {\n selectedItem = $filter('filter')(_this.secondaryFormatGroupStructue_jobsData, { id: criteria.value });\n if (typeof selectedItem !== 'undefined' && selectedItem !== null && selectedItem.length !== 0) {\n criteria.valueLabel = selectedItem[0].name;\n } else {\n criteria.valueLabel = criteria.value;\n }\n }\n\n if (criteria.criteriaName === \"People Group\") {\n selectedItem = $filter('filter')(_this.secondaryFormatGroupStructue_groupData, { id: criteria.value });\n if (typeof selectedItem !== 'undefined' && selectedItem !== null && selectedItem.length !== 0) {\n criteria.valueLabel = selectedItem[0].groupName;\n } else {\n criteria.valueLabel = criteria.value;\n }\n }\n\n if (criteria.criteriaName === \"Organization\") {\n selectedItem = $filter('filter')(_this.secondaryFormatGroupStructue_orgData, { id: criteria.value });\n if (typeof selectedItem !== 'undefined' && selectedItem !== null && selectedItem.length !== 0) {\n criteria.valueLabel = selectedItem[0].name;\n } else {\n criteria.valueLabel = criteria.value;\n }\n }\n\n if (criteria.criteriaName === \"Country\") {\n selectedItem = $filter('filter')(_this.secondaryFormatGroupStructue_countriesData, { countryId: criteria.value });\n if (typeof selectedItem !== 'undefined' && selectedItem !== null && selectedItem.length !== 0) {\n criteria.valueLabel = selectedItem[0].countryName;\n } else {\n criteria.valueLabel = criteria.value;\n }\n }\n\n if (criteria.criteriaName === \"State/Province\") {\n selectedItem = $filter('filter')(_this.secondaryFormatGroupStructue_userData, { stateAbbreviation: criteria.value });\n if (typeof selectedItem !== 'undefined' && selectedItem !== null && selectedItem.length !== 0) {\n criteria.valueLabel = selectedItem[0].stateName;\n } else {\n criteria.valueLabel = criteria.value;\n }\n }\n\n return criteria;\n };\n\n _this.filterDataForAutoComplete = function (criteria, searchTerm) {\n var selectedCriteria = criteria;\n var fieldName;\n\n //LMS-7986 Add Custom Fields 0.6-9 as Criteria in People Groups and Rules\n if (selectedCriteria.criteriaName === 'Custom0') {\n fieldName = 'custom0';\n } else if (selectedCriteria.criteriaName === 'Custom1') {\n fieldName = 'custom1';\n } else if (selectedCriteria.criteriaName === 'Custom2') {\n fieldName = 'custom2';\n } else if (selectedCriteria.criteriaName === 'Custom3') {\n fieldName = 'custom3';\n } else if (selectedCriteria.criteriaName === 'Custom4') {\n fieldName = 'custom4';\n } else if (selectedCriteria.criteriaName === 'Custom5') {\n fieldName = 'custom5';\n } else if (selectedCriteria.criteriaName === 'Custom6') {\n fieldName = 'custom6';\n } else if (selectedCriteria.criteriaName === 'Custom7') {\n fieldName = 'custom7';\n } else if (selectedCriteria.criteriaName === 'Custom8') {\n fieldName = 'custom8';\n } else if (selectedCriteria.criteriaName === 'Custom9') {\n fieldName = 'custom9';\n } else if (selectedCriteria.criteriaName === 'Person Status') {\n fieldName = 'personStatus';\n } else if (selectedCriteria.criteriaName === 'Location') {\n fieldName = 'location';\n } else if (selectedCriteria.criteriaName === 'Person') {\n fieldName = 'person';\n } else if (selectedCriteria.criteriaName === 'Country') {\n fieldName = 'country';\n } else if (selectedCriteria.criteriaName === 'State/Province') {\n fieldName = 'stateName';\n } else if (selectedCriteria.criteriaName === 'City') {\n fieldName = 'city';\n } else if (selectedCriteria.criteriaName === 'Person Type') {\n fieldName = 'personType';\n } else if (selectedCriteria.criteriaName === 'Username') {\n fieldName = 'userName';\n } else if (selectedCriteria.criteriaName === 'First Name') {\n fieldName = 'firstName';\n } else if (selectedCriteria.criteriaName === 'Last Name') {\n fieldName = 'lastName';\n } else if (selectedCriteria.criteriaName === 'Manager') {\n fieldName = 'manager';\n } else if (selectedCriteria.criteriaName === 'Position') {\n fieldName = 'positionId';\n } else if (selectedCriteria.criteriaName === 'Organization') {\n fieldName = 'organizationId';\n } else if (selectedCriteria.criteriaName === 'Email Address') {\n fieldName = 'email';\n } else if (selectedCriteria.criteriaName === 'People Group') {\n fieldName = 'groupId';\n } else if (selectedCriteria.criteriaName === 'Organization By Name') {\n fieldName = 'organizationName';\n } else if (selectedCriteria.criteriaName === 'Position By Name') {\n fieldName = 'positionName';\n } else if (selectedCriteria.criteriaName === 'Is Manager') {\n fieldName = 'isManager';\n }\n\n return _this.skinnedAutoCompleteData(fieldName, searchTerm);\n };\n\n _this.skinnedAutoCompleteData = function (fieldName, searchTerm) {\n var output = [];\n var searchAttribute;\n var searchUserPromise;\n\n //LMS-7986 Add Custom Fields 0.6-9 as Criteria in People Groups and Rules\n var otherFields = ['firstName', 'lastName', 'userName', 'custom0', 'custom1', 'custom2', 'custom3', 'custom4', 'custom5', 'custom6', 'custom7', 'custom8', 'custom9', 'email', 'stateName', 'city', 'location'];\n var boolOptions = [{ \"name\": 'True', \"value\": \"1\" }, { \"name\": 'False', \"value\": \"0\" }];\n\n if (typeof fieldName !== 'undefined' && fieldName !== null && $.inArray(fieldName, otherFields) !== -1) {\n if (fieldName === \"stateName\") {\n _.each(_this.secondaryFormatGroupStructue_userData, function (state) {\n if (state.stateName.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1) {\n var skinnedItem = {};\n skinnedItem.id = state.stateAbbreviation;\n skinnedItem.name = state.stateName;\n output.push(skinnedItem);\n }\n });\n return $q(function (resolve, reject) { resolve(output); });\n }\n else {\n searchAttribute = {};\n searchAttribute[fieldName] = searchTerm;\n searchAttribute.pageNumber = 1;\n searchAttribute.pageSize = 25;\n searchUserPromise = UsersService.advancedSearch(searchAttribute);\n\n return searchUserPromise.then(function (success) {\n var filteredFromUsers = _.uniq(_.compact(_.pluck(success, fieldName)));\n _.each(filteredFromUsers, function (item) {\n var skinnedItem = {};\n skinnedItem.id = item;\n skinnedItem.name = item;\n output.push(skinnedItem);\n });\n return output;\n });\n\n }\n\n } else {\n\n if (fieldName === \"person\" || fieldName === \"manager\") {\n\n searchAttribute = {};\n searchAttribute.fullNameContains = searchTerm;\n\n if (fieldName === \"manager\") {\n searchAttribute.roleId = 11;\n }\n\n searchUserPromise = UsersService.advancedSearch(searchAttribute);\n\n return searchUserPromise.then(function (success) {\n _.each(success, function (user) {\n if (user.fullName.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1) {\n var skinnedItem = {};\n skinnedItem.id = user.id;\n skinnedItem.name = user.fullName;\n output.push(skinnedItem);\n }\n });\n return output;\n });\n }\n\n if (fieldName === \"groupId\") {\n _.each(_this.secondaryFormatGroupStructue_groupData, function (group) {\n if (group.groupName.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1) {\n var skinnedItem = {};\n skinnedItem.id = group.id;\n skinnedItem.name = group.groupName;\n output.push(skinnedItem);\n }\n });\n return $q(function (resolve, reject) { resolve(output); });\n }\n\n if (fieldName === \"organizationId\" || fieldName === 'organizationName') {\n _.each(_this.secondaryFormatGroupStructue_orgData, function (org) {\n //LMS-6623 Added another condition to bring up only active organisation in the Sub Container in Rules\n if (org.name.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1 && org.enabled) {\n var skinnedItem = {};\n if (fieldName === 'organizationName') {\n skinnedItem.id = org.name;\n }\n else {\n skinnedItem.id = org.id;\n }\n\n skinnedItem.name = org.name;\n output.push(skinnedItem);\n }\n\n });\n return $q(function (resolve, reject) { resolve(output); });\n }\n\n if (fieldName === \"positionId\" || fieldName === 'positionName') {\n _.each(_this.secondaryFormatGroupStructue_jobsData, function (job) {\n if (job.name.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1) {\n var skinnedItem = {};\n if (fieldName === 'positionName') {\n skinnedItem.id = job.name;\n }\n else {\n skinnedItem.id = job.id;\n }\n skinnedItem.name = job.name;\n output.push(skinnedItem);\n }\n });\n return $q(function (resolve, reject) { resolve(output); });\n }\n\n if (fieldName === \"country\") {\n _.each(_this.secondaryFormatGroupStructue_countriesData, function (country) {\n if (country.countryName.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1) {\n var skinnedItem = {};\n skinnedItem.id = country.countryName;\n skinnedItem.name = country.countryName;\n output.push(skinnedItem);\n }\n });\n return $q(function (resolve, reject) { resolve(output); });\n }\n\n if (fieldName === \"personType\") {\n var personTypes = _this.UsersService.personTypes;\n\n _.each(personTypes, function (typ) {\n if (typ.name.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1) {\n var skinnedItem = {};\n skinnedItem.id = typ.value;\n skinnedItem.name = typ.name;\n output.push(skinnedItem);\n }\n });\n return $q(function (resolve, reject) { resolve(output); });\n }\n\n if (fieldName === \"personStatus\") {\n var personStatuses = _this.UsersService.personStatuses;\n\n _.each(personStatuses, function (status) {\n if (status.name.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1) {\n var skinnedItem = {};\n skinnedItem.id = status.value;\n skinnedItem.name = status.name;\n output.push(skinnedItem);\n }\n });\n return $q(function (resolve, reject) { resolve(output); });\n }\n\n if (fieldName === \"isManager\") {\n _.each(boolOptions, function (typ) {\n if (typ.name.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1) {\n var skinnedItem = {};\n skinnedItem.id = typ.value;\n skinnedItem.name = typ.name;\n output.push(skinnedItem);\n }\n });\n return $q(function (resolve, reject) { resolve(output); });\n }\n\n }\n };\n\n _this.mapUsersForPreview = function (userIds) {\n var output = [];\n _.each(userIds, function (userId) {\n _.each(_this.secondaryFormatGroupStructue_userData, function (user) {\n if (user.id === userId) {\n output.push(user);\n }\n });\n });\n\n return output;\n };\n\n _this.formatBool = function (pgCriteria) {\n if (pgCriteria.value === \"1\") {\n return \"True\";\n } else return \"False\";\n };\n\n // Generates GUID using sqlguid utility function that prevents collisions\n _this.generateGuid = sqlguid;\n\n _this.generateRootContainer = function (isSuccessful) {\n\n var deferred = $q.defer();\n\n var rootContainerObj = {\n \"data\": {\n \"containerId\": _this.generateGuid(),\n \"groupId\": null,\n \"name\": \"\",\n \"startDate\": dateUtil.formatDate(moment()),\n \"endDate\": null,\n \"subContainers\": [],\n \"criteria\": [],\n \"operandId\": 1,\n \"operandName\": \"AND (1)\",\n // \"structureId\": UsersService.getPortalId(),\n \"followHierarchy\": false,\n \"parentContainerId\": null,\n \"hasChildren\": false,\n \"isRoot\": true\n }\n\n };\n\n if (isSuccessful === true) {\n deferred.resolve(rootContainerObj.data);\n } else {\n deferred.reject(\"No Object available!!\");\n }\n\n return deferred.promise;\n };\n\n _this.generateSubContainer = function (isSuccessful) {\n\n var deferred = $q.defer();\n\n var subContainerObj = {\n \"data\": {\n \"containerId\": _this.generateGuid(),\n \"groupId\": \"\",\n \"name\": \"Container\",\n \"startDate\": null,\n \"endDate\": null,\n \"subContainers\": [],\n \"criteria\": [{\n \"groupCriteriaId\": _this.generateGuid(),\n \"criteriaId\": \"\",\n \"criteriaName\": \"\",\n \"operandId\": \"\",\n \"operandName\": \"\",\n \"value\": \"\",\n \"isString\": true,\n \"folowHierarchy\": true\n }],\n \"operandId\": 2,\n \"operandName\": \"OR (2)\",\n \"followHierarchy\": false,\n \"parentContainerId\": null,\n \"hasChildren\": false,\n \"isRoot\": false\n }\n\n };\n\n if (isSuccessful === true) {\n deferred.resolve(subContainerObj.data);\n } else {\n deferred.reject(\"No Object available!!\");\n }\n\n return deferred.promise;\n };\n\n _this.generateCriteria = function () {\n var criteriaObj = {\n \"groupCriteriaId\": _this.generateGuid(),\n \"criteriaId\": \"\",\n \"criteriaName\": \"\",\n \"operandId\": \"\",\n \"operandName\": \"\",\n \"value\": \"\",\n \"isString\": true,\n \"folowHierarchy\": false\n };\n\n return criteriaObj;\n };\n\n\n _this.formatPeopleGroupsForCopy = function (data) {\n var output_arr = [];\n\n _.each(data, function (dataPoint) {\n var newPeopleGroupObj = {};\n newPeopleGroupObj.id = dataPoint.id;\n newPeopleGroupObj.groupName = dataPoint.groupName;\n newPeopleGroupObj.newName = dataPoint.name + '_copy';\n output_arr.push(newPeopleGroupObj);\n });\n\n return output_arr;\n };\n\n _this.saveCopiedGroup = function (data) {\n var req = {\n method: 'POST',\n url: 'api/peoplegroup/copy',\n data: data,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n console.warn(req.data);\n return $http(req).then(function (success) {\n _this.response = (success.data);\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n var ChangeTimeZoneToUTC = function (dateTime) {\n var year = dateTime.getFullYear();\n var month = dateTime.getMonth();\n var date = dateTime.getDate();\n var hour = dateTime.getHours();\n var minute = dateTime.getMinutes();\n var second = dateTime.getSeconds();\n\n var result = new Date(Date.UTC(year, month,date,hour,minute,second));\n return result;\n };\n}]);\n","app.service('HelpService', ['$http', '$q', function ($http, $q) {\n var _this = this;\n\n _this.user = null;\n _this.response = null;\n _this.filter = null;\n _this.data = null;\n _this.responseComplete = true;\n}]);\n","/**\n * Service \"class\" that contains all logic for any insights related calls to the API.\n */\napp.service('InsightsService',\n ['$http', '$q', 'dateUtil', 'UsersService', 'SettingsService', 'errorDisplayerUtil', 'courseFormatterUtil', function (\n $http, $q, dateUtil, UsersService, SettingsService, errorDisplayerUtil, courseFormatterUtil) {\n var _this = this;\n\n var formatSend = function (decisionMap) {\n var apiDecisionMap = angular.copy(decisionMap);\n var i = 0;\n // The API needs risks to have an id and name. The UI needs risks to have a key, value property so this transforms key, value to id, name to pass to api\n var apiRisks = [];\n for (i = 0; i < decisionMap.risks.length; i++) {\n apiRisks.push({ id: decisionMap.risks[i].key, name: decisionMap.risks[i].value, riskRating: decisionMap.risks[i].riskRating });\n }\n apiDecisionMap.risks = apiRisks;\n apiDecisionMap.created = apiDecisionMap.created === null ? null : apiDecisionMap.created.jsDate;\n apiDecisionMap.statusChanged = apiDecisionMap.statusChanged === null ? apiDecisionMap.statusChanged : apiDecisionMap.statusChanged.jsDate;\n apiDecisionMap.confirmedDateTime = apiDecisionMap.confirmedDateTime === null ? apiDecisionMap.confirmedDateTime : apiDecisionMap.confirmedDateTime.jsDate;\n apiDecisionMap.ruleCreatedDateTime = apiDecisionMap.ruleCreatedDateTime === null ? apiDecisionMap.ruleCreatedDateTime : apiDecisionMap.ruleCreatedDateTime.jsDate;\n return apiDecisionMap;\n };\n\n _this.response = null;\n _this.format = function (response) {\n\n angular.forEach(response,\n function (value, key)\n {\n /* assign a rank based on the order the API put the courses in */\n value.rank = key + 1;\n /*convert the duration to minutes for easy addition with the 'unrelated' course selections */\n value.duration = Math.round(value.duration * 60); \n });\n return response;\n };\n\n _this.formatDecisionMap = function (response) {\n response.created = dateUtil.formatDate(response.created);\n response.statusChanged = dateUtil.formatDate(response.statusChanged);\n if (response.confirmedDateTime !== null) {\n response.confirmedDateTime = dateUtil.formatDate(response.confirmedDateTime);\n }\n if (response.ruleCreatedDateTime !== null) {\n response.ruleCreatedDateTime = dateUtil.formatDate(response.ruleCreatedDateTime);\n }\n\n //Change the risks to a key/value pair with and extra rating attached for Client side work\n var clientRisks = [];\n angular.forEach(response.risks, function (r) {\n clientRisks.push({ key: r.id, value: r.name, riskRating: r.riskRating});\n });\n response.risks = clientRisks;\n\n angular.forEach(response.courses, function(c) {\n c.duration = Math.round(c.duration * 60);\n });\n\n return response;\n };\n\n _this.getDecisionMapShell = function () {\n var req = {\n method: 'GET',\n url: 'api/insights/decisionmap/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.createDecisionMap = function (decisionMap, copyComments) {\n var decisionMapToSend = formatSend(decisionMap);\n if (typeof copyComments === \"undefined\") {\n copyComments = true;\n }\n\n var req = {\n method: 'POST',\n url: 'api/insights/decisionmap/' + copyComments,\n data: decisionMapToSend,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.updateDecisionMap = function (decisionMap) {\n var decisionMapToSend = formatSend(decisionMap);\n var req = {\n method: 'PUT',\n url: 'api/insights/decisionmap/',\n data: decisionMapToSend,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getPeerGroups = function () {\n var req = {\n method: 'GET',\n url: 'api/insights/peerGroups',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n\n };\n\n\t\t_this.getDecisionMapById = function(decisionMapID) {\n var req = {\n method: 'GET',\n url: 'api/insights/' + decisionMapID,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.formatDecisionMap(success.data);\n return success.data;\n }, function(failure) {\n throw failure;\n });\n\t\t};\n\n _this.deleteDecisionMap = function(decisionMapID) {\n var req = {\n method: 'DELETE',\n url: 'api/insights/' + decisionMapID,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n return success.data;\n }, function(failure) {\n throw failure;\n });\n };\n\n\t\t_this.getDecisionMapSummaries = function (viewArchived) {\n\n\t\t if (viewArchived === undefined) {\n\t\t viewArchived = false;\n\t\t }\n\n\t\t var req = {\n\t\t method: 'GET',\n\t\t url: 'api/insights/decisionmaps/' + viewArchived,\n\t\t headers: {\n\t\t 'Content-Type': 'application/json'\n\t\t },\n\t\t timeout: window.timeout\n\t\t };\n\n\t\t return $http(req).then(function (success) {\n\t\t _.each(success.data, function(dm) {\n\t\t dm.created = dateUtil.formatDate(dm.created);\n\t\t });\n\t\t return success.data;\n\t\t }, function (failure) {\n\t\t throw failure;\n\t\t });\n\t\t};\n\t\t\n _this.getDecisionMapComputedCourses = function (decisionMapID) {\n var req = {\n method: 'GET',\n url: 'api/insights/' + decisionMapID + '/courses',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getDecisionMapPeerCourses = function (decisionMapID) {\n var req = {\n method: 'GET',\n url: 'api/insights/' + decisionMapID + '/peercourses',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getComments = function (decisionMapID, commentType) {\n var req = {\n method: 'GET',\n url: 'api/insights/comments/' + decisionMapID + '/' + commentType,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n angular.forEach(success.data, function (value, key) {\n if (value.createDate !== null) { value.createDate = dateUtil.formatDate(value.createDate); }// new Date(value.createDate).toLocaleString(); } //dateUtil.formatDate(value.createDate); }//new Date(retakeLimitDetails[0].lastUpdateOn).toLocaleString();\n });\n _this.response = success.data;\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getAllComments = function (decisionMapID) {\n var req = {\n method: 'GET',\n url: 'api/insights/comments/' + decisionMapID,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n angular.forEach(success.data, function (value, key) {\n angular.forEach(value, function (v, k) {\n if (v.createDate !== null) {\n v.createDate = dateUtil.formatDate(v.createDate);\n } // new Date(value.createDate).toLocaleString(); } //dateUtil.formatDate(value.createDate); }//new Date(retakeLimitDetails[0].lastUpdateOn).toLocaleString();\n });\n });\n _this.response = success.data;\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n\n _this.saveComment = function (decisionMapID, comment, commentType) {\n var commentObj = { 'comment': comment };\n var req = {\n method: 'PUT',\n url: 'api/insights/comments/' + decisionMapID + '/' + commentType,\n headers: {\n 'Content-Type': 'application/json'\n },\n data: commentObj,\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = success.data;\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.deleteComment = function (commentID) {\n var req = {\n method: 'DELETE',\n url: 'api/insights/comments/' + commentID,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = success.data;\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n // getUnrelated is a boolean\n _this.getDecisionMapWizardOptions = function (wizardStep, decisionMapId, getUnrelated) {\n var requestEndPoint = \"api/insights/\" + wizardStep + \"/\" + decisionMapId;\n if (getUnrelated !== undefined) {\n requestEndPoint += \"/\" + getUnrelated;\n }\n var req = {\n method: 'GET',\n url: requestEndPoint,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getResponsibilityCategories = function () {\n var requestEndPoint = \"api/insights/responsibilityCategories\";\n var req = {\n method: 'GET',\n url: requestEndPoint,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.renameDecisionReport = function (decisionMapID, newReportName) {\n var nameObj = { 'reportName': newReportName };\n var req = {\n method: 'PUT',\n url: 'api/insights/rename/' + decisionMapID,\n headers: {\n 'Content-Type': 'application/json'\n },\n data: nameObj,\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = success.data;\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getHistory = function (decisionMapId, currentStep) {\n\n var req = {\n method: 'GET',\n url: 'api/insights/history/' + decisionMapId + '/' + currentStep,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _.each(success.data, function (h) {\n h.updated = dateUtil.formatDate(h.updated);\n });\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getRiskDetails = function () {\n var requestEndPoint = \"api/insights/riskdetails\";\n var req = {\n method: 'GET',\n url: requestEndPoint,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n }]);","app.service('InsightsDecisionMapService', [function () {\n var _this = this;\n var decisionMap = {};\n var clearRole = function() {\n decisionMap.role.key = 0;\n decisionMap.role.value = null;\n };\n\n var clearResponsibilities = function () {\n var emptyResponsibilty = [];\n decisionMap.responsibilities = emptyResponsibilty;\n };\n\n var clearExperiences = function () {\n var emptyExperiences = [];\n decisionMap.experiences = emptyExperiences;\n };\n\n var clearRisks = function () {\n decisionMap.risks = [];\n };\n\n var clearSelectedCourses = function () {\n decisionMap.courses = [];\n };\n\n var resetDecisionMapConfirmation = function () {\n\n //reset all the decision makers confirmations \n _.each(decisionMap.decisionMakers, function (dm) {\n dm.confirmed = 'false';\n });\n \n if (decisionMap.status === 'Confirmed') {\n decisionMap.status = 'Started';\n decisionMap.confirmedDateTime = null;\n }\n };\n\n _this.reset = function() {\n decisionMap = {};\n };\n\n _this.getDecisionMap = function () { return decisionMap; };\n\n _this.setFunction = function (functionValue) {\n // If we change selected function and already have a role, set the flags to confirm previous selections\n if (decisionMap.role.key > 0 && decisionMap.function.key !== functionValue.key) {\n decisionMap.confirmRoleSelection = true;\n decisionMap.confirmResponsibilitiesSelection = true;\n decisionMap.confirmRisksSelection = true;\n decisionMap.confirmCourseSelection = true;\n }\n\n resetDecisionMapConfirmation();\n decisionMap.function = functionValue;\n };\n\n _this.setRole = function (roleValue) {\n // If we change the role and we already have responsibilities selected, set the flags to confirm previous selections\n if (decisionMap.responsibilities.length > 0 && decisionMap.role.key !== roleValue.key) {\n decisionMap.confirmResponsibilitiesSelection = true;\n decisionMap.confirmRisksSelection = true;\n decisionMap.confirmCourseSelection = true;\n }\n\n resetDecisionMapConfirmation();\n decisionMap.role = roleValue;\n };\n\n _this.clearFunction = function() {\n decisionMap.function.key = 0;\n decisionMap.function.value = null;\n };\n\n _this.setDecisionMap = function(dm) {\n decisionMap = dm;\n };\n\n _this.setResponsibilites = function (choices) {\n if (decisionMap.responsibilities === undefined) {\n decisionMap.responsibilities = [];\n }\n //check the length of resp before and after, if the new selection has less, set the flags to confirm previous selections\n //if the responsibilities were only added to, then risks remain the same\n if (choices.length < decisionMap.responsibilities.length) {\n decisionMap.confirmRisksSelection = true;\n decisionMap.confirmCourseSelection = true;\n }\n\n resetDecisionMapConfirmation();\n decisionMap.responsibilities = choices;\n };\n\n _this.setExperiences = function (choices) {\n if (decisionMap.experiences === undefined) {\n decisionMap.experiences = [];\n }\n resetDecisionMapConfirmation();\n decisionMap.experiences = choices;\n };\n\n _this.setRisks = function (choices) {\n if (decisionMap.risks === undefined) {\n decisionMap.risks = [];\n }\n\n if (choices.length < decisionMap.risks.length) {\n decisionMap.confirmCourseSelection = true;\n }\n\n resetDecisionMapConfirmation();\n decisionMap.risks = choices;\n };\n\n _this.setSelectedCourses = function (courses) {\n if (decisionMap.courses === null) {\n decisionMap.courses = [];\n }\n\n //If the length of the arrays are different, then the course list changed\n if (decisionMap.courses.length !== courses.length) {\n resetDecisionMapConfirmation();\n } else {\n //if they are the same, loop through each to determine if courses were added/deleted\n _.each(courses, function (c) {\n if (c.id > 0) {\n var relatedIndex = _.findIndex(decisionMap.courses, { \"id\": c.id });\n if (relatedIndex === -1) {\n resetDecisionMapConfirmation();\n return;\n }\n }\n });\n }\n\n decisionMap.courses = courses;\n\n };\n\n /* Returns should show the confirm modal flag for the given step */\n _this.shouldShowModal = function (step) {\n if (step === 'role')\n return decisionMap.confirmRoleSelection;\n\n if (step === 'responsibilities')\n return decisionMap.confirmResponsibilitiesSelection;\n\n if (step === 'risks')\n return decisionMap.confirmRisksSelection;\n\n if (step === 'courses')\n return decisionMap.confirmCourseSelection;\n\n };\n\n\n /* For the given step, set the should show confirm modal flag to false */\n _this.resetModalFlag = function (step) {\n if (step === 'role')\n decisionMap.confirmRoleSelection = false;\n\n if (step === 'responsibilities')\n decisionMap.confirmResponsibilitiesSelection = false;\n\n if (step === 'risks')\n decisionMap.confirmRisksSelection = false;\n\n if (step === 'courses')\n decisionMap.confirmCourseSelection = false;\n };\n\n}]);","app.service('JobsService', ['$http', '$httpParamSerializer', function($http, $httpParamSerializer) {\n /* Jobs come back in this format.\n [ { \"id\": 200000471, \"code\": \"*Business Developmen\", \"name\": \"*Business Development <<000046484O>>\", \"groupId\": 0 }, ... ]\n */\n var _this = this;\n\n _this.getAllJobs = function() {\n var req = {\n method: 'GET',\n url: 'api/jobs/?=',\n timeout: window.timeout\n };\n\n return $http(req).then(function(jobsList) {\n //return _this.format(jobsList.data);\n return (jobsList.data);\n }, function(error) {\n return error;\n });\n };\n\n // See getAllJobs for format of jobs\n _this.searchJobs = function(query) {\n query = $httpParamSerializer(query);\n var req = {\n method: 'GET',\n url: 'api/jobs/?' + query,\n timeout: window.timeout\n };\n\n return $http(req).then(function(jobsList) {\n return _this.format(jobsList.data);\n }, function(error) {\n return error;\n });\n };\n\n // See getAllJobs for format of jobs\n _this.updateJob = function(jobObj) {\n var req = {\n method: 'PUT',\n url: 'api/jobs/',\n timeout: window.timeout,\n data: jobObj,\n headers: {\n 'Content-Type': 'application/json'\n },\n };\n\n return $http(req).then(function(success) {\n // Success will be a boolean true if it worked\n return success;\n }, function(error) {\n throw error;\n });\n };\n\n //Create new Position\n _this.createJob = function (jobObj) {\n var req = {\n method: 'POST',\n url: 'api/jobs/',\n timeout: window.timeout,\n data: jobObj,\n headers: {\n 'Content-Type': 'application/json'\n },\n };\n\n return $http(req).then(function (success) {\n // Success will be a boolean true if it worked\n return success;\n }, function (error) {\n throw error;\n });\n };\n\n _this.format = function(jobsList) {\n for (var i = 0; i < jobsList.length; i += 1) {\n /* This line adds a nodes attribute\n * to every job in the jobsList retrieved from\n * JobsService.getAllJobs or JobsService.searchJobs\n * Without a nodes attribute, the tree component will fail \n * to render the jobs tree in the premium admin.\n */\n jobsList[i].nodes = [];\n\n jobsList[i].lastUpdate = moment(jobsList[i].lastUpdate);\n }\n return jobsList;\n };\n}]);\n","/**\n * Location service to communicate with the locations API\n *\n * NOTE: on the API, locations are called facilities. This should be the only instance of the word facility in the\n * front end code, for sake of consistency, based on business requirements.\n */\napp.service('LocationsService', ['$http', 'dateUtil', function($http, dateUtil) {\n var _this = this;\n\n /**\n * Contains all possible values for location types\n *\n * Note: Super-default value (--default--) exists to ensure that dropdowns are always populated, and we\n * can force validation and no empty spaces\n *\n * @type {array|objects}\n */\n _this.types = [{\n 'name': 'Branch',\n 'value': 'branch'\n },\n {\n 'name': 'Classroom',\n 'value': 'classroom'\n },\n {\n 'name': 'City',\n 'value': 'city'\n },\n {\n 'name': 'Online',\n 'value': 'online'\n },\n {\n 'name': 'Other',\n 'value': 'other'\n },\n {\n 'name': 'Technical',\n 'value': 'technical'\n }, {\n 'name': 'Unknown',\n 'value': 'unknown'\n }, {\n 'name': 'Vendor',\n 'value': 'vendor'\n }, {\n 'name': 'Webinar',\n 'value': 'webinar'\n },\n ];\n\n /**\n * Creates a location on the api\n *\n * @param {Object} location - Location to be created on API\n * @returns {Object} $http - angular promise\n */\n _this.create = function(location) {\n var req = {\n method: 'POST',\n url: 'api/facility',\n headers: {\n 'Content-Type': 'application/json'\n },\n data: location,\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n return success;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.edit = function(location) {\n var req = {\n method: 'PUT',\n url: 'api/facility/' + location.id,\n headers: {\n 'Content-Type': 'application/json'\n },\n data: location,\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n return success;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.getSingle = function(id) {\n var req = {\n method: 'GET',\n url: 'api/facility/' + id + '/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.format([success.data])[0];\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.getAll = function() {\n var req = {\n method: 'GET',\n url: 'api/facility/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.getAllActive = function () {\n var req = {\n method: 'GET',\n url: 'api/facilityActive/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.format = function(data) {\n for(var i = 0; i < data.length; i++) {\n data[i].startDate = dateUtil.formatDate(data[i].startDate);\n }\n\n return data;\n };\n}]);\n","app.service('MessagesService', ['$rootScope', '$http', '$q', function($rootScope, $http, $q) {\n var _this = this;\n\n _this.response = null;\n _this.responseComplete = false;\n _this.request = '';\n\n _this.dateOrged = {};\n _this.typeOrged = {};\n\n _this.fetch = function() {\n if(typeof _this.response !== 'undefined' && _this.responseComplete === true) {\n return $q(function(resolve) {\n _this.format();\n\n resolve(_this.data);\n });\n }\n\n var req = {\n method: 'GET',\n url: 'api/message/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = success.data;\n\n $rootScope.$broadcast('messages:model:success', success.data);\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.count = function() {\n return _this.response.length;\n };\n\n _this.setRequest = function(request) {\n _this.request = request;\n };\n\n _this.getRequest = function() {\n return _this.request;\n };\n\n _this.getResponse = function() {\n return _this.response;\n };\n\n //This is the return value\n /*\n Object {organization: Object, system: Object}\n organization:Object label:\"organization\"\n messages:Array[1]0:Object\n description:\"WELCOME APPLE STAFF MEMBERS!\n ↵\n ↵If you have any questions or concerns, please contact the Training Department.\"\n endDate:null\n id:0\n name:\"\"\n startDate:null\n type:\"organization\"\n\n */\n _this.orderByType = function() {\n if(Object.keys(_this.typeOrged).length !== 0) {\n return _this.typeOrged;\n }\n\n var messages = _this.response;\n var types = ['organization', 'system'];\n\n for(var i in messages) {\n for(var node in messages[i]) {\n if (typeof _this.typeOrged[node] === 'undefined') {\n if (jQuery.inArray(messages[i].type, types) > -1) {\n _this.typeOrged[messages[i].type] = {\n label: messages[i].type,\n messages: []\n };\n\n _this.typeOrged[messages[i].type].messages.push(messages[i]);\n\n break;\n }\n }\n }\n }\n\n return _this.typeOrged;\n };\n\n _this.orderByDate = function() {\n var messages = _this.response.data;\n\n var ref = moment();\n var today = ref.clone().startOf('day');\n var yesterday = ref.clone().subtract(1, 'days').startOf('day');\n\n var date = null;\n var label = '';\n\n for(var i in messages) {\n date = moment.unix(messages[i].sent);\n\n if(date.isSame(yesterday, 'd')) {\n if(typeof _this.dateOrged.Yesterday === 'undefined') {\n _this.dateOrged.Yesterday = {\n label: 'Yesterday',\n messages: []\n };\n }\n\n _this.dateOrged.Yesterday.messages.push(messages[i]);\n } else {\n label = date.format('MMMM Do, YYYY');\n if(typeof _this.dateOrged[label] === 'undefined') {\n _this.dateOrged[label] = {\n label: label,\n messages: []\n };\n }\n\n _this.dateOrged[label].messages.push(messages[i]);\n }\n }\n\n return _this.dateOrged;\n };\n}]);\n","app.service('MyDocumentsService', ['$http', 'dateUtil', 'courseFormatterUtil', function ($http, dateUtil, courseFormatterUtil) {\n\n var _this = this;\n\n _this.getAll = function () {\n var req = {\n method: 'GET',\n url: 'api/mydocuments',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getAllAssignments = function () {\n var req = {\n method: 'GET',\n url: 'api/mydocuments/assignments',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n return $http(req).then(function (success) {\n var returnSuccess = _this.format(success.data);\n return returnSuccess;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.add = function (courseId) {\n var req = {\n method: 'POST',\n url: 'api/mydocuments/' + courseId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.remove = function (courseId) {\n var req = {\n method: 'DELETE',\n url: 'api/mydocuments/' + courseId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.format = function (response) {\n var dates = ['assignedOn'];\n\n if (response !== null) {\n for (var document in response) {\n currDocument = response[document];\n\n for (var node in currDocument) {\n if (currDocument[node] !== null && $.inArray(node, dates) !== -1) {\n currDocument[node] = dateUtil.formatDate(currDocument[node]);\n }\n }\n\n if (currDocument !== null && typeof currDocument.code !== 'undefined') {\n currDocument.codeForImage = courseFormatterUtil.getCourseCodeForImage(currDocument.code, currDocument.tileImage);\n }\n\n }\n }\n\n return response;\n\n };\n\n}]);","app.service('NMLSService', ['$http', '$q', function($http, $q) {\n var _this = this;\n\n _this.response = null;\n\n _this.getBioSigUri = function (redirectUrl, courseId, courseItemIdentifier, activity, nmlsID, email, d4, d5) {\n var data = {\n 'Id': nmlsID,\n 'Email': email,\n 'RedirectUrl': redirectUrl,\n 'CourseId': courseId,\n 'CourseItemIdentifier': courseItemIdentifier,\n 'Activity': activity,\n 'd4': d4,\n 'd5':d5\n };\n\n var req = {\n method: 'POST',\n url: 'api/NMLS/BSIoutbound',\n headers: {\n 'Content-Type': 'application/json'\n },\n data: data,\n timeout: 100000\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getBioSigHelpPage = function () {\n \n var req = {\n method: 'GET',\n url: 'api/NMLS/GetBSIHelpPage',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: 100000\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n}]);\n","app.service('OfferingsService', ['$http', 'addressUtil', 'dateUtil', 'messagingDisplayerUtil', 'sessionFormatterUtil', 'RosterService',\n function ($http, addressUtil, dateUtil, messagingDisplayerUtil, sessionFormatterUtil, RosterService) {\n var _this = this;\n\n _this.formatableDates = ['endDateTime', 'registrationEndDateTime', 'startDateTime'];\n\n _this.offerings = _this.response = null;\n\n /**\n * Fetch an offering for a single STUDENT\n *\n * @param userId student's user ID\n * @param type type of course this will be: either VLE or ILT\n * @returns $http offering call promise\n */\n _this.fetch = function (userId, type) {\n var req = {\n method: 'GET',\n url: 'api/course/' + userId + '/' + type + '/',\n headers: {'Content-Type': 'application/json'},\n timeout: 300000 //5 minutes to allow for loading large number of ilts (SLY-6454)\n };\n\n return $http(req).then(function (success) {\n _this.offerings = _this.format(success.data);\n }, function (failure) {\n throw failure;\n });\n };\n\n /**\n * Gets a single offering only. Will contain sessions and roster\n *\n * @param offeringId\n * @param type\n */\n _this.fetchSingle = function (offeringId, type) {\n var req = {\n method: 'GET',\n url: 'api/offering/' + offeringId + '/' + type + '/',\n header: {'Content-Type': 'application/json'},\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.formatOfferingsOnly([success.data])[0];\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.fetchInstructorAssignments = function (tense) {\n var req = {\n method: 'GET',\n url: 'api/offering/' + tense + '/',\n headers: {'Content-Type': 'application/json'},\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.formatOfferingsOnly(success.data);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.cancelOffering = function (offeringId, type) {\n var req = {\n method: 'PUT',\n url: 'api/offering/cancel/' + offeringId + '/' + type + '/',\n headers: {'Content-Type': 'application/json'},\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.completeOffering = function (offeringId, type) {\n var req = {\n method: 'PUT',\n url: 'api/offering/deliver/' + offeringId + '/' + type + '/',\n headers: {'Content-Type': 'application/json'},\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n /**\n * Format all data that comes in\n *\n * This is specific to when we get FULL course data, but need to pull offerings out\n */\n _this.format = function (response) {\n var current, curOffering, meetings = null;\n\n if (response !== null) {\n\n for (var course in response) {\n current = response[course];\n for (var offering in current.offerings) {\n curOffering = current.offerings[offering];\n\n if(curOffering.hasOwnProperty(offering)) {\n continue;\n }\n\n /**\n * Merge data base obj with generic obj for view goodies\n */\n generic = _this.createGenericOffering(curOffering.id, curOffering.courseId);\n\n _.extend(generic, curOffering);\n\n curOffering.assignmentId = response[course].id;\n curOffering.status = response[course].status;\n\n if (typeof curOffering.sessions !== 'undefined' && curOffering.sessions !== null && curOffering.sessions.length > 0) {\n //\n curOffering.closestSession = null;\n curOffering.closestSessionKey = null;\n // Keep track of highest session end date to pass to student completion service\n curOffering.highestSessionDateForOffering = null;\n // Keep track of lowest session start date for display purposes\n curOffering.lowestSessionDateForOffering = null;\n\n curOffering.courseTypeLabel = _this.getCourseTypeLabel(curOffering.type);\n // curOffering.address.cityStateZipLabel = _this.getCityStateZipLabel(curOffering.address);\n\n curOffering.roster = JSON.parse(JSON.stringify(_this._generateRosterObjects(curOffering.roster)));\n\n curOffering.type = response[course].type;\n\n curOffering = sessionFormatterUtil.formatSessions(curOffering);\n curOffering.instructor = curOffering.sessions[0].instructor;\n curOffering.locationName = curOffering.location;\n }\n }\n }\n\n response = _this.extractOfferings(response);\n \n }\n\n return response;\n };\n /**\n * Format all data that comes in\n *\n * This is specific to when we get FULL course data, but need to pull offerings out\n */\n _this.formatOfferingsOnly = function (response) {\n var current, curOffering, meetings = null;\n\n if (response !== null) {\n var generic = null;\n\n for (var i = 0; i < response.length; i++) {\n curOffering = response[i];\n\n for (var node in curOffering) {\n if (curOffering[node] !== null && $.inArray(node, _this.formatableDates) !== -1) {\n curOffering[node] = dateUtil.formatDate(curOffering[node]);\n }\n }\n\n /**\n * Merge data base obj with generic obj for view goodies\n */\n generic = _this.createGenericOffering(curOffering.id, curOffering.courseId);\n\n _.extend(generic, curOffering);\n\n //\n curOffering.closestSession = null;\n curOffering.closestSessionKey = null;\n // Keep track of highest session end date to pass to student completion service\n curOffering.highestSessionDateForOffering = null;\n // Keep track of lowest session start date for display purposes\n curOffering.lowestSessionDateForOffering = null;\n\n curOffering.addressExists = addressUtil.isThereAnAddress(curOffering.address);\n curOffering.courseTypeLabel = _this.getCourseTypeLabel(curOffering.type);\n curOffering.roster = _this._generateRosterObjects(curOffering.roster);\n curOffering.type = curOffering.assignmentType;\n\n curOffering.address.cityStateZipLabel = addressUtil.getCityStateZipLabel(curOffering.address);\n\n if (curOffering.sessions || curOffering.studentSessions) {\n curOffering = sessionFormatterUtil.formatSessions(curOffering);\n }\n \n }\n }\n\n return response;\n };\n\n _this.extractOfferings = function (courses) {\n var single = null;\n\n var offerings = [];\n\n for (var course in courses) {\n for (var offering in courses[course].offerings) {\n \n single = courses[course].offerings[offering];\n\n //exclude offerring that have a past end date\n if (single.registrationEndDateTime !== null && new Date(single.registrationEndDateTime) >= new Date()) {\n single.isAssigned = false;\n\n if (_this.sessionsExist(courses[course]) && courses[course].assignedOffering.id === single.id) {\n single.isAssigned = true;\n }\n\n offerings.push(single);\n } \n }\n }\n\n return offerings;\n };\n\n _this.sessionsExist = function (course) {\n return typeof course.assignedOffering !== 'undefined' && course.assignedOffering !== null && typeof course.assignedOffering.sessions !== 'undefined' && course.assignedOffering.sessions.length > 0;\n };\n\n _this.getCourseTypeLabel = function (type) {\n switch (type) {\n case 'ilt':\n return 'Instructor Led Training';\n case 'vle':\n return 'Virtually Led Elective';\n }\n\n return 'Instructor Led Training';\n };\n\n /**\n * Roster area!\n */\n\n /**\n * Set all the different rosters; this way we can have one concentrated area for rosters with methods\n * on the offerings class.\n *\n * @param roster Object containing the roster children\n * @returns {RosterService} instance of the roster service\n */\n _this._generateRosterObjects = function (roster) {\n RosterService.setFromOfferingsService('attendingStudents', roster.attendingStudents);\n RosterService.setFromOfferingsService('droppedStudents', roster.droppedStudents);\n RosterService.setFromOfferingsService('pendingApprovalStudents', roster.pendingApprovalStudents);\n RosterService.setFromOfferingsService('waitlistStudents', roster.waitlistedStudents);\n\n return RosterService;\n };\n\n _this.hasAttendingStudents = function () {\n return _this.getAttendingStudents().length === 0;\n };\n\n _this.getAttendingStudents = function () {\n return _this.response.attendingStudents;\n };\n\n _this.getIncompleteUserCount = function () {\n return _this.response.roster.getIncompleteUserCount();\n };\n\n _this.isOfferingCancellable = function() {\n var students = _this.response.roster.getAttendingStudents();\n\n var possibleCompletions = ['cancelledNoShow', 'successful', 'unsuccessful'];\n\n for(var i in students) {\n if(jQuery.inArray(students[i].registrationStatus, possibleCompletions) > -1) {\n return false;\n }\n }\n\n return true;\n };\n\n _this.getAllSession = function() {\n return _this.response.sessions;\n };\n\n _this.getLowestSessionIdByDate = function() {\n var lowestSession = null;\n var lowestSessionId = null;\n var sessions = _this.response.sessions;\n\n if(sessions.length > 0) {\n for(var i = 0; i < sessions.length; i++) {\n if(sessions[i].startDateTime.original < lowestSession || lowestSession === null) {\n lowestSession = sessions[i].startDateTime.original;\n lowestSessionId = sessions[i].id;\n }\n }\n }\n\n return lowestSessionId;\n };\n\n _this.removeStudentFromWaitList = function (person, offeringId) {\n var req = {\n method: 'PUT',\n url: 'api/roster/updatestatus/' + person.student.id + '/' + offeringId + '/Cancelled/ilt/',\n headers: { 'Content-Type': 'application/json' },\n timeout: window.timeout\n };\n\n /**\n * @TODO: @sfrohm: figure out why you return original response, not the response coming back from the\n * server.\n */\n return $http(req).then(function (success) {\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n /**\n * Create the offerings and respective sessions on the DS\n *\n * @param offerings {obj} Object containing all offerings and sessions to be created\n */\n _this.createOfferings = function (offerings) {\n var req = {\n method: 'POST',\n url: 'api/offering/multi',\n data: _this.formatForSend(offerings),\n headers: { 'Content-Type': 'application/json' },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n /**\n * Response will contain full offering/session structures. Re-format to guarantee accuracy and not\n * lose any information the view needs.\n */\n //for(var i in success.data) {\n // success.data[i] = success.data[i].offering;\n //}\n\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n /**\n *\n * @param offerings\n */\n _this.formatForSend = function(offerings) {\n return _this.formatOfferingsForSend(offerings);\n };\n\n /**\n *\n */\n _this.formatOfferingsForSend = function(offerings) {\n var dateFields = ['requestedOn', 'registrationEndDateTime'];\n var removableFields = ['error', 'instructorLabel', 'instructorPills', 'instructorReader', 'locationId', 'accordionOpen', 'rosterUser'];\n\n var offering = null;\n\n for(var i = 0; i < offerings.length; i++) {\n offering = offerings[i];\n\n for(var node in offering) {\n if (typeof offering[node] !== 'undefined' && offering[node] !== null && jQuery.inArray(node, dateFields) > -1) {\n if (offering[node].jsDate) {\n offering[node] = offering[node].jsDate.toISOString();\n } else {\n offering[node] = null;\n }\n } else if(jQuery.inArray(node, removableFields) > -1) {\n delete offering[node];\n }\n }\n\n if (typeof offering.sessions !== 'undefined' && offering.sessions !== null) {\n if (offering.sessions.length > 0)\n offering.sessions = _this.formatSessionsForSend(offering.sessions);\n }\n\n /**\n * These values are defaults that are require by Latitude; do not remove unless user driven\n * data will exist.\n */\n offering.enrollmentRestrictions = '';\n offering.instructionalLanguageId = 9;\n offering.languageId = 9;\n offering.maxStudentsPerDealer = offering.maxAllowedSize;\n offering.trainingType = 3;\n }\n\n return offerings;\n };\n\n _this.formatSessionsForSend = function(sessions) {\n var dateFields = ['startDateTime', 'endDateTime'];\n var parseIntFields = ['id'];\n var removableFields = ['instructorPills', 'error', 'instructorReader', 'offeringId', 'startDate', 'endDate', 'startTime', 'endTime'];\n\n var session = null;\n\n for(var i = 0; i < sessions.length; i++) {\n session = sessions[i];\n\n /**\n * Clean up the session\n */\n for(var node in session) {\n if(jQuery.inArray(node, dateFields) > -1) {\n session[node] = session[node].jsDate.toISOString();\n } if(jQuery.inArray(node, parseIntFields) > -1) {\n session[node] = parseInt(session[node], 10);\n } else if(jQuery.inArray(node, removableFields) > -1) {\n delete session[node];\n }\n }\n }\n\n return sessions;\n };\n\n /**\n * Generate a default offering object to help with view logic\n *\n * @param id {int} Generic value for angular's two way binding\n * @param courseId {int} ID of the course that is being tied to the offering\n * @returns {object}\n */\n _this.createGenericOffering = function(id, courseId) {\n var offering = {\n accordionOpen: false,\n assignmentType: 'ilt',\n courseId: courseId,\n localId: id,\n instructorIds: [],\n instructorPills: [], // used to keep track of cutesy pills\n search: {\n isLoading: false,\n error: messagingDisplayerUtil.create()\n },\n rosterUser: '',\n roster: {\n attendingStudents: []\n },\n sessions: []\n };\n\n return offering;\n };\n\n _this.updateOffering = function (offering) {\n var req = {\n method: 'PUT',\n url: 'api/offering/updateoffering',\n data: _this.formatForSend([offering])[0],\n headers: { 'Content-Type': 'application/json' },\n timeout: window.timeout\n };\n\n /**\n * @TODO: @sfrohm: figure out why you return original response, not the response coming back from the\n * server.\n */\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n\n _this.updateOfferingsBatch = function (offerings) {\n var req = {\n method: 'PUT',\n url: 'api/offering/batchupdate',\n data: _this.formatForSend(offerings),\n headers: { 'Content-Type': 'application/json' },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n }\n]);\n","/* Services file for the premium admin page */\napp.service('OrganizationsService', ['$http', '$q', 'OrgFunctions', 'UsersService', function($http, $q, OrgFunctions, UsersService) {\n\n var _this = this;\n\n /* Creates a new organization. Needs a portalId too.\n * portalId should be the portalId from\n * UsersService.getPortalId(); */\n _this.updateOrganization = function(orgData, method) {\n \n var req = {\n method: method,\n url: 'api/organization/',\n data: orgData,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(response) {\n return response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.format_AddOrgFields = function(orgData) {\n\n if (orgData !== 'undefined' && orgData !== null) {\n _.each(orgData, function(org){\n _.each(orgData, function(pOrg){\n if (org.parentId === pOrg.id) {\n org.parentOrgName = pOrg.name;\n }\n });\n\n if (org.enabled === true) {\n org.status = 'Enabled';\n } else if (org.enabled === false) {\n org.status = 'Disabled';\n }\n\n });\n }\n \n return orgData;\n };\n\n _this.getOrganizationHierarchy = function() {\n var req = {\n method: 'GET',\n url: 'api/organizationHierarchy/',\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = (success.data);\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.getOrgTree = function () {\n var req = {\n method: 'GET',\n url: 'api/organizationTree/',\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getSingleOrg = function(orgId) {\n var req = {\n method: 'GET',\n url: 'api/organization/' + orgId,\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = success.data;\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.createOrgObj = function(isSuccessful) {\n\n var deferred = $q.defer();\n\n var orgObj = {\n \"data\": {\n \"id\": 0,\n \"name\": \"\",\n \"typeId\": null,\n \"type\": \"dealer\",\n \"parentId\": null,\n \"typeName\": \"\",\n \"announcements\": \"\",\n \"description\": \"\",\n \"enabled\": null,\n \"updateDateTime\": moment().format(),\n \"updateUserId\": null,\n \"sourceCode\": \"\",\n \"abbreviation\": \"\",\n \"portalId\": UsersService.getPortalId(),\n \"portalCode\": \"\",\n \"isTopLevelOrg\": null\n }\n };\n\n\n if (isSuccessful === true) {\n deferred.resolve(orgObj.data);\n } else {\n deferred.reject(\"No Object available!!\");\n }\n\n return deferred.promise;\n };\n\n\n}]);\n","app.service('PlaylistServices', ['$http', '$q', '$rootScope', 'AssignmentsService', 'dateUtil', 'CatalogSearchParameters', 'courseFormatterUtil', function ($http, $q, $rootScope, AssignmentsService, dateUtil, CatalogSearchParameters, courseFormatterUtil) {\n var _this = this;\n\n _this.getPlaylist = function () {\n var req = {\n method: 'GET',\n url: 'api/playlist',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.addCourseToPlaylist = function (courseId) {\n var req = {\n method: 'POST',\n url: 'api/playlist/' + courseId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.deleteCourseFromPlaylist = function (courseId) {\n var req = {\n method: 'DELETE',\n url: 'api/playlist/' + courseId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n}]);","app.service('ProxyService', ['$http', '$cookies', 'dateUtil', function ($http, $cookies, dateUtil) {\n var _this = this;\n _this.response = null;\n _this.roleObj = null;\n _this.user = null;\n _this.originalResponse = null;\n _this.singleResponse = null;\n _this.userApplicationType = null;\n _this.auth = {\n currentRole: null,\n isLoggedIn: false,\n roles: null,\n authedUser: null,\n isTopLevel: null\n };\n\n\n _this.view = [{\n 'name': 'Team Management',\n 'value': 0\n },\n {\n 'name': 'Reports Desk',\n 'value': 1\n }];\n\n /**\n * Format the response; mainly to format all dates to UI.\n */\n _this.format = function (response) {\n var dates = ['endDate', 'startDate'];\n\n var current = null;\n var node;\n\n if (response.length > 0) {\n for (var rule in response) {\n current = response[rule];\n\n for (node in current) {\n if (typeof current[node] !== 'undefined' && current[node] !== null && $.inArray(node, dates) !== -1) {\n current[node] = dateUtil.formatDate(current[node]);\n }\n }\n }\n } else {\n for (node in response) {\n if (typeof response[node] !== 'undefined' && response[node] !== null && $.inArray(node, dates) !== -1) {\n response[node] = dateUtil.formatDate(response[node]);\n }\n }\n }\n\n return response;\n };\n\n\n _this.createProxy = function (proxyData) {\n var req = {\n method: 'POST',\n url: 'api/proxy/create/',\n data: proxyData,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.editProxy = function (proxyData) {\n var req = {\n method: 'PUT',\n url: 'api/proxy/' + proxyData.iAudit_ImpersonationID,\n data: proxyData,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getSingle = function (id) {\n var req = {\n method: 'GET',\n url: 'api/proxy/' + id + '/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format([success.data])[0];\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getAllProxy = function () {\n var req = {\n method: 'GET',\n url: 'api/proxy/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getManagerList = function () {\n var req = {\n method: 'GET',\n url: 'api/proxy/managers/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return _this.format(success.data);\n }, function (failure) {\n throw failure;\n });\n };\n\n /* Sample advanced search struct\n * See the UsersService.advancedSearch for complete list of fields\n */\n /* Returns a list of user objects */\n _this.advancedSearch = function (advancedSearchStruct) {\n // See if the user entered anything in the date fields\n\n var req = {\n method: 'GET',\n url: 'api/proxy/search/' + advancedSearchStruct + '/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n\n return $http(req).then(function (success) {\n return _this.format(success.data);\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getUrlsForProxy = function () {\n\n var req = {\n method: 'GET',\n url: 'api/proxy/serach/userproxy/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format([success.data])[0];\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n}]);","///* Value service to hold queue polling intervals. Right now only contains people groups but could be expanded to hold intervals for rules, etc. */\napp.value('queuePollingInterval', { peopleGroupPollingInterval: null });","app.service('RosterService', ['$http', 'dateUtil', 'errorDisplayerUtil', 'sessionFormatterUtil', function ($http, dateUtil, errorDisplayerUtil, sessionFormatterUtil) {\n var _this = this;\n\n _this.response = null;\n _this.attendingStudents = null;\n _this.waitlistStudents = null;\n _this.pendingApprovalStudents = null;\n\n /**\n * HTTP requests section\n */\n /**\n * Returns you a promise which will contain the single offering data from the GET call.\n *\n * @param offeringId id of the single offering we are going to\n * @returns {*} promise for the single offering GET\n */\n _this.fetch = function (offeringId, type) {\n var req = {\n method: 'GET',\n url: 'api/roster/' + offeringId + '/' + type,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function(failure) {\n\n });\n };\n\n /* Format a single transcript that goes out */\n\n _this.formatToSend = function (data) {\n var dates = ['completionDate'];\n\n if (data.constructor !== Array) {\n for (var node in data) {\n if (typeof data[node] !== 'undefined' && data[node] !== null && typeof data[node] === 'object' && $.inArray(node, dates) !== -1) {\n data[node] = dateUtil.formatDate(data[node].jsDate).utcDate;\n }\n }\n }\n\n if (data.constructor === Array) {\n _.each(data, function (dataPoint) {\n _this.formatToSend(dataPoint);\n });\n }\n\n return data;\n };\n\n /**\n * api/roster/updatestatus/{studentId}/{offeringId}/{registrationStatus}\n *\n * Update the roster on the OFFERING level\n *\n * @param studentId\n * @param offeringId\n * @param registrationStatus\n * @param data\n * @returns {*}\n */\n _this.updateSinglePersonOnRoster = function(studentId, offeringId, registrationStatus, offeringType, data) {\n var req = {\n method: 'PUT',\n url: 'api/roster/updatestatus/' + studentId + '/' + offeringId + '/' + registrationStatus + '/' + offeringType,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n if(typeof data !== \"undefined\" && data !== null) {\n req.data = _this.formatToSend(data);\n }\n\n return $http(req);\n };\n\n _this.substituteUser = function(oldUser, newUser, offeringId, offeringType) {\n var req = {\n method: 'PUT',\n url: 'api/roster/substitute/' + offeringId + '/' + oldUser + '/' + newUser + '/' + offeringType,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req);\n };\n\n /**\n * Update the roster on the SESSION level\n *\n * @TODO: Should this be moved into the user or the session service?\n *\n * @param studentId\n * @param offeringId\n * @param data\n * @returns {*}\n */\n _this.updateSessionByUserOnOffering = function(studentId, offeringId, data) {\n var req = {\n method: 'PUT',\n data: data,\n url: 'api/roster/updatesession/' + studentId + '/' + offeringId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req);\n };\n\n _this.format = function(response) {\n if(response !== null) {\n var formattableDates = ['completionDate', 'registrationDate'];\n var member, student, studentSessions = null;\n\n for(var single in response) {\n if(response[single].length > 0) {\n member = response[single];\n\n for(var memNode in member) {\n /**\n * Have to add this in for now\n * @TODO: find out if there's a proper pattern for looping over objects\n */\n if(typeof member[memNode] === 'function') {\n continue;\n }\n\n student = member[memNode];\n\n for(var node in student.student) {\n if (student.student[node] !== null && $.inArray(node, formattableDates) !== -1) {\n student.student[node] = dateUtil.formatDate(student.student[node]);\n }\n }\n\n // Keep track of highest session end date to pass to student completion service\n student.highestSessionDateForOffering = null;\n // Keep track of lowest session start date for display purposes\n student.lowestSessionDateForOffering = null;\n\n student.cancellingPerson = false;\n student.error = errorDisplayerUtil.create();\n student.isLoading = false;\n student.sessionUpdateIsLoading = false;\n student.success = false;\n\n /**\n * Due to angular's lack of reasonable dropdown logic, this has to exist. We set the\n * statusForDropdown attribute to either default (Change Status label in the drop down), or the\n * appropriate completion status.\n *\n * hasCompletedTheOffering attribute contains logic because switching between completion status and\n * default status causes dropdowns to disappear, which we can't have.\n */\n student.statusForDropdown = _this.getDropDownStatus(student.student.registrationStatus);\n student.hasCompletedTheOffering = student.statusForDropdown !== 'default';\n\n student = sessionFormatterUtil.formatSessions(student);\n }\n\n _this[single] = response[single];\n }\n }\n\n _this.set('attendingStudents', response.attendingStudents);\n _this.set('droppedStudents', response.droppedStudents);\n _this.set('pendingApprovalStudents', response.pendingApprovalStudents);\n _this.set('waitlistStudents', response.waitlistStudents);\n }\n\n return response;\n };\n\n /**\n * Format the user objects that come back in the roster object from the offerings service.\n *\n * @TODO: migrate the offerings service's roster object to be identical to roster object from roster service\n *\n * @param response Object roster object to filter\n * @returns {*}\n */\n _this.formatFromOfferingService = function(response) {\n if(typeof response !== 'undefined' && response !== null) {\n var formattableDates = ['completionDate', 'registrationDate'];\n var member, student, studentSessions = null;\n\n // Loop over each roster type (attending, waitlisted, etc.)\n for(var single in response) {\n if(response[single].length > 0) {\n member = response[single];\n\n // Loop over each roster type's student\n for(var memNode in member) {\n /**\n * Have to add this in for now\n * @TODO: find out if there's a proper pattern for looping over objects\n */\n if(typeof member === 'function' || typeof member[memNode] === 'function' || typeof member[memNode] !== 'undefined') {\n continue;\n }\n\n student = member[memNode];\n\n for(var node in student.student) {\n /**\n * Have to add this in for now\n * @TODO: find out if there's a proper pattern for looping over objects\n */\n if(typeof student.student[i] === 'function') {\n continue;\n }\n\n if (student.student[node] !== null && $.inArray(node, formattableDates) !== -1) {\n student.student[node] = dateUtil.formatDate(student.student[node]);\n }\n }\n\n student.cancellingPerson = false;\n student.error = errorDisplayerUtil.create();\n student.isLoading = false;\n student.sessionUpdateIsLoading = false;\n student.success = false;\n\n /**\n * Due to angular's lack of reasonable dropdown logic, this has to exist. We set the\n * statusForDropdown attribute to either default (Change Status label in the drop down), or the\n * appropriate completion status.\n *\n * hasCompletedTheOffering attribute contains logic because switching between completion status and\n * default status causes dropdowns to disappear, which we can't have.\n */\n student.statusForDropdown = _this.getDropDownStatus(student.registrationStatus);\n student.hasCompletedTheOffering = student.statusForDropdown !== 'default';\n }\n\n _this[single] = response[single];\n }\n }\n } else {\n response = [];\n }\n\n return response;\n };\n\n _this.getDropDownStatus = function(status) {\n var completionStatuses = ['cancelledNoShow', 'successful', 'unsuccessful'];\n\n if(jQuery.inArray(status, completionStatuses) > -1) {\n return completionStatuses[jQuery.inArray(status, completionStatuses)];\n }\n\n return 'default';\n };\n\n _this.getIncompleteUserCount = function() {\n var userCount = 0;\n\n if(_this.attendingStudents.length === 0) {\n return userCount - 1;\n }\n\n for(var i in _this.attendingStudents) {\n if(_this.attendingStudents[i].completionDate === null) {\n userCount++;\n }\n }\n\n return userCount;\n };\n\n _this.incompleteUsersInAttendingRoster = function() {\n return _this.getIncompleteUserCount() === 0;\n };\n\n _this.get = function(key) {\n return _this[key];\n };\n\n _this.set = function(key, value) {\n _this[key] = value;\n\n return _this;\n };\n\n _this.setFromOfferingsService = function(key, value) {\n var data = _this.formatFromOfferingService(value);\n\n _this[key] = data;\n\n return _this;\n };\n\n _this.getAttendingStudents = function() {\n return _this.attendingStudents;\n };\n\n _this.getWaitlistedStudents = function() {\n return _this.waitlistStudents;\n };\n\n _this.getPendingApprovalStudents = function() {\n return _this.pendingApprovalStudents;\n };\n\n _this.generateMailToFromUsers = function(key) {\n var emails = [];\n var single = null;\n\n var students = _this.get(key);\n\n for(var i in students) {\n single = students[i];\n\n if(single.email !== null && single.email !== '') {\n emails.push(single.email);\n }\n }\n\n return emails;\n };\n\n _this.getCorrectSessionFromUser = function(personId, sessionId) {\n var attendingStudents = _this.getAttendingStudents();\n\n for(var student in attendingStudents) {\n if(attendingStudents[student].student.id === personId) {\n for(var session in attendingStudents[student].sessions) {\n var curSession = attendingStudents[student].sessions[session];\n\n if(curSession.id === sessionId) {\n return curSession;\n }\n }\n }\n }\n };\n\n _this.updateMultiplePersonOnRoster = function (data) {\n var req = {\n method: 'PUT',\n url: 'api/roster/updatestatus/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout,\n data: data\n };\n\n return $http(req).then(function (success) {\n return success.data;\n },function(failure) {\n throw failure;\n });\n };\n\n _this.enrollSingle = function (studentId, offeringId) {\n var req = {\n method: 'POST',\n url: 'api/roster/' + studentId + '/ilt/' + offeringId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n return $http(req);\n };\n}]);\n","app.service('RulesService', ['$http', '$q', 'dateUtil', function($http, $q, dateUtil) {\n var _this = this;\n\n _this.response = null;\n\n /**\n * Format the response; mainly to format all dates to UI.\n */\n _this.format = function(response) {\n var dates = ['endDate', 'startDate', 'lastProcessedOn', 'lastUpdatedOn', 'dueDateFixed', 'acceptPassingScoreDate', 'assignOnDate' ];\n\n var current = null;\n var node;\n\n if (response.length > 0) {\n for (var rule in response) {\n current = response[rule];\n\n for (node in current) {\n if (typeof current[node] !== 'undefined' && current[node] !== null && $.inArray(node, dates) !== -1) {\n current[node] = dateUtil.formatDate(current[node]);\n }\n }\n }\n } else {\n for (node in response) {\n if (typeof response[node] !== 'undefined' && response[node] !== null && $.inArray(node, dates) !== -1) {\n response[node] = dateUtil.formatDate(response[node]);\n }\n }\n }\n\n return response;\n };\n\n _this.formatToSend = function(data) {\n var dates = ['endDate', 'startDate', 'displayStart', 'displayEnd', 'newStartDate', 'newEndDate', 'lastProcessedOn', 'lastUpdatedOn', 'acceptPassingScoreDate', 'dueDateFixed', 'assignOnDate'];\n\n if (data.constructor !== Array) {\n for (var node in data) {\n if (typeof data[node] !== 'undefined' && data[node] !== null && _.isObject(data[node]) && $.inArray(node, dates) !== -1) {\n if (typeof data[node].moment !== \"undefined\" && _.isObject(data[node].moment)) {\n data[node] = data[node].moment.toISOString();\n } else {\n data[node] = null;\n }\n } \n }\n }\n\n if (data.hasOwnProperty('course') && data.course.constructor === Object ) {\n _this.formatToSend(data.course);\n }\n\n if (data.constructor === Array) {\n _.each(data, function (dataPoint) {\n //SLY-3935 Check if end date is before the start date, if so, add a year to the start date and use that as the end date\n if (typeof dataPoint.newEndDate !== 'undefined' && dataPoint.newEndDate !== null) {\n var newStartD = angular.copy(dataPoint.newStartDate.moment);\n var newEndD = angular.copy(dataPoint.newEndDate.moment);\n if (newStartD.isAfter(newEndD)) {\n dataPoint.newEndDate = dateUtil.formatDate(dateUtil.setPortalEndTime(newStartD.add(1, 'year').toDate()));\n }\n }\n _this.formatToSend(dataPoint);\n });\n }\n\n return data;\n };\n\n _this.formatSingleRule = function(rule) {\n if (rule.afterDueNotificationDays !== 'undefined' && rule.afterDueNotificationDays !== null && rule.beforeDueNotificationDays !== 'undefined' && rule.beforeDueNotificationDays !== null) {\n return rule;\n } else {\n rule.afterDueNotificationDays = [];\n rule.beforeDueNotificationDays = [];\n }\n\n return rule;\n };\n\n _this.formatCourseObj = function(data) {\n var courseData = data;\n var newCoursesArr = [];\n _.each(courseData, function (course) {\n var ruleCourseObj = {};\n ruleCourseObj.ruleCourseId = \"\";\n if (course.type === \"careerPath\") {\n ruleCourseObj.required = false;\n } else {\n ruleCourseObj.required = true;\n }\n ruleCourseObj.dueDateFixed = null;\n ruleCourseObj.acceptPassingScoreDate = null;\n ruleCourseObj.dueDateDaysFromKey = \"\";\n ruleCourseObj.dueDateDaysFromValue = \"\";\n ruleCourseObj.recordUserId = \"\";\n ruleCourseObj.foriegnSystemId = \"\";\n ruleCourseObj.recurrence = \"\";\n ruleCourseObj.course = course;\n\n newCoursesArr.push(ruleCourseObj);\n\n });\n\n return _this.format(newCoursesArr);\n };\n\n _this.formatRuleForCopy = function (data) {\n var output_arr = [];\n\n _.each(data, function (dataPoint) {\n var startDateCopy = angular.copy(dataPoint.startDate);\n var endDateCopy = angular.copy(dataPoint.endDate);\n var newRuleObj = {};\n newRuleObj.id = dataPoint.id;\n newRuleObj.name = dataPoint.name;\n newRuleObj.newName = dataPoint.name + '_copy';\n newRuleObj.startDate = dataPoint.startDate;\n newRuleObj.endDate = dataPoint.endDate;\n newRuleObj.newStartDate = dateUtil.formatDate(dateUtil.setPortalStartTime(startDateCopy.moment.add(1, 'year').toDate()));\n if (endDateCopy !== null) {\n newRuleObj.newEndDate = dateUtil.formatDate(dateUtil.setPortalEndTime(endDateCopy.moment.add(1, 'year').toDate()));\n }\n else {\n newRuleObj.newEndDate = dataPoint.endDate;\n }\n newRuleObj.isAddYear = null;\n\n output_arr.push(newRuleObj);\n });\n\n return output_arr;\n };\n\n _this.getAllRules = function() {\n var req = {\n method: 'GET',\n url: 'api/rules/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.getSingleRule = function(id) {\n var req = {\n method: 'GET',\n url: 'api/rules/' + id,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.format(success.data);\n\n _this.rule = _this.formatSingleRule(_this.response);\n\n return _this.rule;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.ruleGeneralCall = function(data, status) {\n\n var method;\n if (status !== 'undefined' && status !== null && status === 'create') {\n method = 'POST';\n } else if (status !== 'undefined' && status !== null && status === 'update') {\n method = 'PUT';\n }\n\n var req = {\n method: method,\n url: 'api/rules/',\n data: _this.formatToSend(data),\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.format_courseDates = function(data) {\n var courses = data;\n _.each(courses, function(course) {\n if (course.dueDateDaysFromValue === null) {\n course.flagDueDateMethod = 0;\n } else if (course.dueDateFixed === null) {\n course.flagDueDateMethod = 1;\n }\n });\n\n return courses;\n };\n\n _this.getRuleAssignments = function(ruleId) {\n\n var req = {\n method: 'GET',\n url: 'api/rules/' + ruleId + '/courses',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.format_courseDates(_this.format(success.data));\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.getRuleCounts = function(ruleId) {\n\n var req = {\n method: 'GET',\n url: 'api/rules/' + ruleId + '/counts',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = success.data;\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.updateRuleAssignments = function(ruleId, Courses) {\n\n var req = {\n method: 'PUT',\n url: 'api/rules/' + ruleId + '/courses',\n data: _this.formatToSend(Courses),\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.saveCopiedRule = function (data) {\n var req = {\n method: 'PUT',\n url: 'api/rules/copy',\n data: _this.formatToSend(data),\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n console.warn(req.data);\n\n return $http(req).then(function(success) {\n _this.response = _this.format(success.data);\n return _this.response;\n }, function(failure) { \n throw failure;\n }); \n };\n\n _this.getRuleStatusOptions = function(isSuccessful) {\n\n var deferred = $q.defer();\n\n var statusArr = {\n \"data\": [{\n \"id\": 0,\n \"name\": \"draft\"\n }, {\n \"id\": 1,\n \"name\": \"active\"\n }, {\n \"id\": 2,\n \"name\": \"closed\"\n }]\n };\n\n if (isSuccessful === true) {\n deferred.resolve(statusArr.data);\n } else {\n deferred.reject(\"No Object available!!\");\n }\n\n return deferred.promise;\n };\n\n _this.createRuleObj = function(isSuccessful) {\n\n var deferred = $q.defer();\n\n var ruleObj = {\n \"data\": {\n \"id\": null,\n \"name\": \"\",\n \"description\": \"\",\n \"startDate\": null,\n \"endDate\": null,\n \"reoccurance\": true,\n \"groupId\": null,\n \"lastUpdatedByUser\": \"\",\n \"lastUpdatedByUserId\": \"\",\n \"beforeDueNotificationDays\": [],\n \"afterDueNotificationDays\": [],\n \"lastProcessedOn\": \"\",\n \"lastUpdatedOn\": \"\",\n \"status\": \"\"\n }\n };\n\n\n if (isSuccessful === true) {\n deferred.resolve(ruleObj.data);\n } else {\n deferred.reject(\"No Object available!!\");\n }\n\n return deferred.promise;\n };\n\n\n _this.getRuleHistoryByStep = function (ruleId, ruleStep, page, pageSize) {\n\n var req = {\n method: 'GET',\n url: 'api/rules/' + ruleId + '/' + ruleStep + '/' + page + '/' + pageSize,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _.each(success.data, function (s) {\n if (s.updated !== 'undefined') {\n s.updated = dateUtil.formatDate(s.updated);\n }\n _.each(s.oldVNew, function (h) {\n if (h.oldDateTimeValue !== null) {\n h.oldDateTimeValue = dateUtil.formatDate(h.oldDateTimeValue);\n }\n if (h.newDateTimeValue !== null) {\n h.newDateTimeValue = dateUtil.formatDate(h.newDateTimeValue);\n }\n }); \n });\n return success.data;\n\n }, function (failure) {\n throw failure;\n });\n };\n\n}]);\n","app.service('SearchServices', ['$http', '$q', '$rootScope', 'AssignmentsService', 'dateUtil', 'CatalogSearchParameters', 'courseFormatterUtil', function ($http, $q, $rootScope, AssignmentsService, dateUtil, CatalogSearchParameters, courseFormatterUtil) {\n var _this = this;\n var synonymsMap = null;\n var catalogPaths = null;\n var documentCatalogPaths = null;\n _this.currentDocumentCount = -1;\n\n _this.executeProductSearch = function (query) {\n var queryToSend = CatalogSearchParameters.getQueryToSend();\n\n console.log(\"query to send\");\n console.log(queryToSend);\n var endpoint = 'api/productsearch';\n if ($rootScope.fromWeb === true) {\n endpoint = 'api/public/productsearch';\n }\n var req = {\n method: 'POST',\n url: endpoint,\n data: $.param(queryToSend),\n headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n if (success.data === \"\") {\n throw { StatusCode: 0, ErrorMessage: \"Unable to retrieve search results at this time\" };\n } else {\n var data = JSON.parse(success.data);\n if (data.error !== undefined) {\n throw { StatusCode: 0, ErrorMessage: \"Invalid search request\" };\n } else {\n var results = {\n count: data['@odata.count'],\n facets: data['@search.facets'],\n results: _this.formatSearchResults(data.value)\n };\n // Left this in to debug queries\n console.log(\"Azure results\");\n console.log(results);\n return results;\n }\n }\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.formatSearchResults = function(azureResults) {\n var result = [];\n _.each(azureResults, function(r) {\n var formatted = _this.formatDocument(r);\n result.push(formatted);\n });\n\n return result;\n };\n\n\n _this.getSynonymsMap = function () {\n var endpoint = 'api/productsearch/synonyms';\n if ($rootScope.fromWeb === true) {\n endpoint = 'api/public/productsearch/synonyms';\n }\n if (synonymsMap === null) {\n var req = {\n method: 'GET',\n url: endpoint,\n headers: {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'max-age=86400'\n },\n timeout: window.timeout\n };\n\n return $http.get(req.url).then(function (success) {\n var synonyms = JSON.parse(success.data).synonyms;\n synonymsMap = _this.formatSynonyms(synonyms);\n return synonymsMap;\n }, function (failure) {\n throw failure;\n });\n }\n else {\n return $q.resolve(synonymsMap);\n }\n\n \n };\n\n _this.formatSynonyms = function (synonymsString) {\n var result = {};\n var synonymsArray = synonymsString.split('\\n');\n\n var i;\n for (i = 0; i < synonymsArray.length - 1; i++) {\n\n var synonymArray = synonymsArray[i].split(\", \");\n var term = synonymArray[0].toLowerCase().trim();\n result[term] = {synonyms: []};\n \n var j;\n for (j = 1; j < synonymArray.length; j++) {\n result[term].synonyms.push(synonymArray[j]);\n }\n }\n return result;\n };\n\n\n _this.getSuggestions = function (searchTerm) {\n var endpoint = 'api/productsearch/suggestions?q=';\n if ($rootScope.fromWeb === true) {\n endpoint = 'api/public/productsearch/suggestions?q=';\n }\n var req = {\n method: 'GET',\n url: endpoint + encodeURI(searchTerm),\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http.get(req.url).then(function (success) {\n var suggestions = JSON.parse(success.data).value;\n return _this.formatSuggestions(suggestions);\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.formatSuggestions = function (azureResults) {\n var results = [];\n azureResults.forEach(function (course) {\n var x = {\n name: course.Name,\n searchText: course[\"@search.text\"],\n courseId: course.CourseId,\n courseCode: course.CourseCode,\n detailsUri: _this.getDetailsUri(course)\n };\n\n if ($rootScope.fromWeb === true) {\n x.library = _this.getShortLibraryName(_this.getTopLevelPath(course.Paths));\n }\n results.push(x);\n });\n return results;\n };\n\n _this.getProductById = function (productId) {\n var endpoint = 'api/getproduct/' + productId;\n if ($rootScope.fromWeb === true) {\n endpoint = 'api/public/getproduct/' + productId;\n }\n var req = {\n method: 'GET',\n url: endpoint,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http.get(req.url).then(function (success) {\n if ($rootScope.fromWeb === false) {\n if (success.data === \"\") {\n throw { StatusCode: 0, ErrorMessage: \"Product Not Found\" };\n }\n }\n var result = {\n document: JSON.parse(success.data)\n };\n if ($rootScope.fromWeb === true) {\n if (result.document.value.length === 0) {\n throw { StatusCode: 0, ErrorMessage: \"Product Not Found\" };\n } else {\n result.document = result.document.value[0];\n }\n }\n result.document = _this.formatDocument(result.document);\n\n return result;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.formatDocument = function (azureDocument) {\n if (azureDocument.Description.length > 152) {\n azureDocument.shortDescription = azureDocument.Description.substring(0, 148) + ' ...';\n } else {\n azureDocument.shortDescription = azureDocument.Description;\n }\n if (azureDocument.Duration === null) {\n azureDocument.displayDuration = \"\";\n } else {\n azureDocument.displayDuration = Math.round(azureDocument.Duration * 60) + \" minutes\"; // Convert hours to minutes for display\n }\n azureDocument.displayImageCode = courseFormatterUtil.getCourseCodeForImage(azureDocument.CourseCode, azureDocument.ImageCode);\n azureDocument.displayInteractivity = azureDocument.InteractivityTypes.join(', ');\n azureDocument.displayNotes = azureDocument.Notes.join(', ');\n azureDocument.displayRoles = azureDocument.Roles.join(', ');\n azureDocument.displaySkills = azureDocument.Skills.join(', ');\n azureDocument.displayInteractivity = azureDocument.InteractivityTypes.join(', ');\n azureDocument.displayTopics = azureDocument.Topics.join(', ');\n azureDocument.detailsUri = _this.getDetailsUri(azureDocument);\n return azureDocument;\n };\n\n _this.getDetailsUri = function (product) {\n var detailsUriBase = \"\";\n var detailsUriSuffix = \"\";\n var detailsUri = \"\";\n\n if ($rootScope.fromWeb === false) {\n detailsUriBase = \"catalog/product/\";\n detailsUriSuffix = product.CourseId;\n } else {\n detailsUriBase = \"product/\";\n detailsUriSuffix = product.CourseCode.replace(/(\\s|\\/)/g, '-') +\n \"-\" + product.Name.toLowerCase().replace(/(\\s|\\/)/g, '-').replace(/&/g, 'and');\n }\n detailsUri = detailsUriBase + detailsUriSuffix;\n return detailsUri;\n };\n\n _this.getCatalog = function () {\n var endpoint = 'api/productsearch/catalog';\n if ($rootScope.fromWeb === true) {\n endpoint = 'api/public/productsearch/catalog';\n }\n if (catalogPaths === null) {\n var req = {\n method: 'GET',\n url: endpoint,\n headers: {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'max-age=86400'\n },\n timeout: window.timeout\n };\n\n return $http.get(req.url).then(function (success) {\n var paths = JSON.parse(success.data)[\"@search.facets\"].Paths;\n catalogPaths = paths;\n return catalogPaths;\n }, function (failure) {\n throw failure;\n });\n }\n else {\n return $q.resolve(catalogPaths);\n }\n };\n\n _this.getDocumentCatalog = function () {\n var endpoint = 'api/productsearch/documentcatalog';\n if (documentCatalogPaths === null) {\n var req = {\n method: 'GET',\n url: endpoint,\n headers: {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'max-age=86400'\n },\n timeout: window.timeout\n };\n\n return $http.get(req.url).then(function (success) {\n var paths = JSON.parse(success.data)[\"@search.facets\"].Paths;\n documentCatalogPaths = paths;\n return documentCatalogPaths;\n }, function (failure) {\n throw failure;\n });\n }\n else {\n return $q.resolve(documentCatalogPaths);\n }\n };\n\n _this.formatCatalogPaths = function (azurePaths) {\n var taxonomy = {};\n taxonomy.libraries = [];\n taxonomy.paths = [];\n //get the top levels\n azurePaths.forEach(function (azurePath) {\n if (azurePath.value.indexOf('|') === -1) {\n taxonomy.libraries.push(azurePath);\n }\n else {\n taxonomy.paths.push(azurePath);\n }\n });\n return taxonomy;\n };\n\n\n\n _this.getDocumentCount = function (refresh) {\n if (refresh === undefined) {\n refresh = false;\n }\n\n if (_this.currentDocumentCount !== undefined && _this.currentDocumentCount > -1 && !refresh) {\n return $q.resolve(_this.currentDocumentCount);\n } else {\n var req = {\n method: 'GET',\n url: 'api/productsearch/documentcount/',\n headers: {\n 'Content-Type': 'application/json'\n }\n };\n\n return $http(req).then(function (success) {\n var data = JSON.parse(success.data);\n _this.currentDocumentCount = data['@odata.count'];\n return _this.currentDocumentCount;\n }, function (failure) {\n throw failure;\n });\n }\n };\n\n _this.getTopLevelPath = function (azurePaths) {\n return azurePaths[0].split(\"|\")[0];\n };\n\n _this.getShortLibraryName = function (library) {\n var short = {};\n switch (library.toLowerCase()) {\n case \"banking series\":\n short = \"Bank\";\n break;\n case \"credit union series\":\n short = \"Credit Union\";\n break;\n case \"mortgage series\":\n short = \"Mortgage\";\n break;\n case \"nonbank series\":\n short = \"Nonbank\";\n break;\n default:\n short = \"\";\n }\n return short;\n };\n}]);\n","app.service('SettingsService', ['$http', '$q', 'TimezoneService', function ($http, $q, TimezoneService) {\n var _this = this;\n\n _this.response = null;\n _this.maxEnrollmentAttemptsAllowed = -1;\n _this.features = {};\n var insightsAccess = \"\";\n\n _this.getSettings = function (cacheOptions) {\n\n var req = {\n method: 'GET',\n url: 'api/settings/',\n headers: {\n 'Content-Type': 'application/json',\n },\n cache: true,\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.getSettingsWithAudit = function () {\n var req = {\n method: 'GET',\n url: 'api/settings/audit' + '?v=' + Math.random(),\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.updateSettings = function (key, value) {\n var req = {\n method: 'POST',\n url: 'api/settings/' +key,\n data: value,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n\n };\n\n /**\n * Format all data that comes in\n *\n * parse force it to an int\n */\n _this.format = function (response) {\n if (response.enrollmentAttempts === parseInt(response.enrollmentAttempts, 10)) {\n _this.maxEnrollmentAttemptsAllowed = parseInt(response.enrollmentAttempts, 10);\n } else {\n throw new Error('Could not convert maxEnrollmentAttemptsAllowed data to integer.');\n }\n\n if (response.features === null || response.features === undefined) {\n throw new Error(\"Could not convert features data to an object\");\n }\n\n var sysProperties = response.features;\n\n if (sysProperties.sysPropInstructorLed === null || sysProperties.sysPropInstructorLed === undefined) \n sysProperties.sysPropInstructorLed = false;\n if (sysProperties.sysPropCourseGroups === null || sysProperties.sysPropCourseGroups === undefined) \n sysProperties.sysPropCourseGroups = false;\n if (sysProperties.sysPropTasks === null || sysProperties.sysPropTasks === undefined) \n sysProperties.sysPropTasks = false;\n if (sysProperties.sysPropIDesign === null || sysProperties.sysPropIDesign === undefined) \n sysProperties.sysPropIDesign = false;\n if (sysProperties.sysPropVirtualClassroom === null || sysProperties.sysPropVirtualClassroom === undefined) \n sysProperties.sysPropVirtualClassroom = false;\n if (sysProperties.sysPropLDConnect === null || sysProperties.sysPropLDConnect === undefined) \n sysProperties.sysPropLDConnect = false;\n if (sysProperties.sysPropEarlyAccess === null || sysProperties.sysPropEarlyAccess === undefined) \n sysProperties.sysPropEarlyAccess = false;\n if (sysProperties.sysPropTrainingInsights === null || sysProperties.sysPropTrainingInsights === undefined)\n sysProperties.sysPropTrainingInsights = false;\n if (sysProperties.sysPropCareerPath === null || sysProperties.sysPropCareerPath === undefined) {\n sysProperties.sysPropCareerPath = false;\n }\n if (sysProperties.sysPropCareerPathDashboard === undefined || sysProperties.sysPropCareerPathDashboard === null) {\n sysProperties.sysPropCareerPathDashboard = false;\n }\n if (sysProperties.sysPropProxyMode === null || sysProperties.sysPropProxyMode === undefined) {\n sysProperties.sysPropProxyMode = false;\n }\n if (sysProperties.sysPropRusticiAccess === null || sysProperties.sysPropRusticiAccess === undefined) {\n sysProperties.sysPropRusticiAccess = false;\n }\n if (sysProperties.sysPropDocument === null || sysProperties.sysPropDocument === undefined) {\n sysProperties.sysPropDocument = false;\n }\n if (sysProperties.enableOverdueBanner === null || sysProperties.enableOverdueBanner === undefined) {\n sysProperties.enableOverdueBanner = false;\n }\n if (sysProperties.enableLmsPlmIntegration === null || sysProperties.enableLmsPlmIntegration === undefined){\n sysProperties.enableLmsPlmIntegration = false;\n }\n \n insightsAccess = sysProperties.sysPropTrainingInsights;\n\n if (typeof sysProperties['orgProp.timezone'] !== 'undefined' && sysProperties['orgProp.timezone'] !== null) {\n if (TimezoneService.timezones === 'undefined' || TimezoneService.timezones === null)\n { TimezoneService.getAllTimezones(); }\n\n sysProperties['orgProp.timezone'].details = TimezoneService.getTimeZoneById(parseInt(sysProperties['orgProp.timezone'].value, 10));\n if (typeof sysProperties['orgProp.timezone'].lastUpdateOn !== 'undefined')\n sysProperties['orgProp.timezone'].lastUpdateOn = new Date(sysProperties['orgProp.timezone'].lastUpdateOn).toLocaleString();\n if (typeof sysProperties['orgProp.timezone'].beforeValue !== 'undefined' && sysProperties['orgProp.timezone'].beforeValue !== null) {\n var previousTimezone = TimezoneService.getTimeZoneById(parseInt(sysProperties['orgProp.timezone'].beforeValue, 10));\n sysProperties['orgProp.timezone'].beforeValueText = previousTimezone.displayName; \n }\n response.timezone = sysProperties['orgProp.timezone'];\n }\n\n if (typeof sysProperties.sysPropDefaultMasteryScore !== 'undefined' && sysProperties.sysPropDefaultMasteryScore !== null) {\n if (typeof sysProperties.sysPropDefaultMasteryScore.lastUpdateOn !== \"undefined\")\n sysProperties.sysPropDefaultMasteryScore.lastUpdateOn = new Date(sysProperties.sysPropDefaultMasteryScore.lastUpdateOn).toLocaleString();\n }\n\n if (sysProperties.enrollmentLimitType === undefined) {\n sysProperties.enrollmentLimitType = { lastUpdateOn: \"2000-01-01T00:00:00Z\" };\n }\n if (sysProperties.enrollmentLimitCount === undefined) {\n sysProperties.enrollmentLimitCount = { lastUpdateOn: \"2000-01-01T00:00:00Z\" };\n }\n if (sysProperties.enrollmentLimitDays === undefined) {\n sysProperties.enrollmentLimitDays = { lastUpdateOn: \"2000-01-01T00:00:00Z\" };\n }\n if (sysProperties.enrollmentLimitRefreshMonth === undefined) {\n sysProperties.enrollmentLimitRefreshMonth = { lastUpdateOn: \"2000-01-01T00:00:00Z\" };\n }\n if (sysProperties.enrollmentLimitRefreshDate === undefined) {\n sysProperties.enrollmentLimitRefreshDate = { lastUpdateOn: \"2000-01-01T00:00:00Z\" };\n }\n\n var retakeLimitDetails = [\n sysProperties.enrollmentLimitType,\n sysProperties.enrollmentLimitCount,\n sysProperties.enrollmentLimitDays,\n sysProperties.enrollmentLimitRefreshMonth,\n sysProperties.enrollmentLimitRefreshDate\n ];\n\n retakeLimitDetails.sort(function (a, b) { return new Date(b.lastUpdateOn) - new Date(a.lastUpdateOn); });\n response.retakeLimitDetails = {};\n response.retakeLimitDetails.lastUpdateOn = new Date(retakeLimitDetails[0].lastUpdateOn).toLocaleString();\n response.retakeLimitDetails.lastUpdateBy = retakeLimitDetails[0].lastUpdateBy;\n\n var typeDate = new Date(sysProperties.enrollmentLimitType.lastUpdateOn);\n var countDate = new Date(sysProperties.enrollmentLimitCount.lastUpdateOn);\n var daysDate = new Date(sysProperties.enrollmentLimitDays.lastUpdateOn);\n var monthDate = new Date(sysProperties.enrollmentLimitRefreshMonth.lastUpdateOn);\n var dateDate = new Date(sysProperties.enrollmentLimitRefreshDate.lastUpdateOn);\n var latestDate = new Date(Math.max.apply(null, [typeDate, countDate, daysDate, monthDate, dateDate]));\n var rollingLastUpdated = new Date(Math.max.apply(null, [countDate, daysDate]));\n var annualLastUpdated = new Date(Math.max.apply(null, [countDate, monthDate, dateDate]));\n\n var retakeCount = null,\n retakeDays = null,\n retakeMonth = null,\n retakeDate = null;\n // type change\n if (typeDate >= latestDate) {\n if (sysProperties.enrollmentLimitType.beforeValue === \"2\") {\n response.retakeLimitDetails.beforeValueText = \"Unlimited\";\n }\n else if (sysProperties.enrollmentLimitType.beforeValue === \"4\") {//rolling\n retakeCount = rollingLastUpdated >= countDate && countDate < latestDate ? sysProperties.enrollmentLimitCount.value : sysProperties.enrollmentLimitCount.beforeValue;\n retakeDays = rollingLastUpdated >= daysDate ? sysProperties.enrollmentLimitDays.value : sysProperties.enrollmentLimitDays.beforeValue;\n response.retakeLimitDetails.beforeValueText = retakeCount + \" attempts every \" + retakeDays + \" days.\";\n }\n else if (sysProperties.enrollmentLimitType.beforeValue === \"5\") {//annual\n retakeCount = annualLastUpdated >= countDate && countDate < latestDate ? sysProperties.enrollmentLimitCount.value : sysProperties.enrollmentLimitCount.beforeValue;\n retakeMonth = annualLastUpdated >= monthDate ? sysProperties.enrollmentLimitRefreshMonth.value : sysProperties.enrollmentLimitRefreshMonth.beforeValue;\n retakeDate = annualLastUpdated >= dateDate ? sysProperties.enrollmentLimitRefreshDate.value : sysProperties.enrollmentLimitRefreshDate.beforeValue;\n response.retakeLimitDetails.beforeValueText = retakeCount + \" attempts starting annually on \" + retakeMonth + \"/\" + retakeDate + \".\";\n }\n }\n // change in rolling\n else if (sysProperties.enrollmentLimitType.value === \"4\") {\n retakeCount = countDate < rollingLastUpdated ? sysProperties.enrollmentLimitCount.value : sysProperties.enrollmentLimitCount.beforeValue;\n retakeDays = daysDate < rollingLastUpdated ? sysProperties.enrollmentLimitDays.value : sysProperties.enrollmentLimitDays.beforeValue;\n response.retakeLimitDetails.beforeValueText = retakeCount + \" attempts every \" + retakeDays + \" days.\";\n }\n \n //change in annual\n else {\n retakeCount = countDate < annualLastUpdated ? sysProperties.enrollmentLimitCount.value : sysProperties.enrollmentLimitCount.beforeValue;\n retakeMonth = monthDate < annualLastUpdated ? sysProperties.enrollmentLimitRefreshMonth.value : sysProperties.enrollmentLimitRefreshMonth.beforeValue;\n retakeDate = dateDate < annualLastUpdated ? sysProperties.enrollmentLimitRefreshDate.value : sysProperties.enrollmentLimitRefreshDate.beforeValue;\n response.retakeLimitDetails.beforeValueText = retakeCount + \" attempts starting annually on \" + retakeMonth + \"/\" + retakeDate + \".\";\n }\n\n // Assign for later getters\n _this.features = sysProperties;\n\n return response;\n };\n\n _this.isPlmIntegrationEnabled = function () {\n return _this.features.enableLmsPlmIntegration === true;\n };\n \n _this.isILTEnabled = function() {\n return _this.features.sysPropInstructorLed === true;\n };\n\n _this.isCareerPathEnabled = function() {\n return _this.features.sysPropCareerPath === true;\n };\n\n _this.isCareerPathDashboardEnabled = function () {\n return _this.isCareerPathEnabled() && _this.features.sysPropCareerPathDashboard === true;\n };\n\n _this.isTrainingInsightsEnabled = function () {\n return insightsAccess;\n };\n\n _this.isProxyModeEnabled = function () {\n return _this.features.sysPropProxyMode === true;\n };\n\n _this.isDocumentsEnabled = function () {\n return _this.features.sysPropDocument === true;\n };\n\n _this.isOverdueBannerEnabled = function () {\n return _this.features.enableOverdueBanner === true;\n };\n\n _this.getCoursesNotUsingDefaultRetake = function () {\n var req = {\n method: 'GET',\n url: 'api/settings/getcourses',\n headers: {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-cache'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return _this.formatCourses(success);\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.resetCoursesToPortalDefault = function (courseSetting) {\n var req = {\n method: 'POST',\n url: 'api/settings/resetcourses/' + courseSetting,\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.formatCourses = function (response){\n var courses = response.data;\n var i;\n for(i = 0; i < courses.length; i++)\n {\n switch (courses[i].retakeRestriction){\n case 'annual':\n courses[i].retakeRestrictionName = 'Annual';\n break;\n case 'allowedEnrollments':\n courses[i].retakeRestrictionName = 'Rolling';\n break;\n case 'unlimited':\n courses[i].retakeRestrictionName = 'Unlimited';\n break;\n }\n }\n return courses;\n };\n\n}]);","app.service('SkillService', ['$http', '$q', function ($http, $q) {\n var _this = this;\n\n _this.skills = null;\n\n _this.fetch = function () {\n\n var url = 'api/skill/';\n\n var req = {\n method: 'GET',\n url: url,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.skills = success.data;\n return _this.skills;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.fetchUserSkills = function(userId) {\n var url = 'api/skill/user/' + userId;\n\n var req = {\n method: 'GET',\n url: url,\n headers: {\n \"Content-Type\": 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.fetchSkillsForCourses = function (courseIds) {\n var url = 'api/skill/courses';\n\n var req = {\n method: 'POST',\n url: url,\n data: courseIds,\n headers: {\n \"Content-Type\": 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n}]);","app.service('sortService', function() {\n var _this = this;\n\n // TODO: Make it work for non string types. Possibly convert to a string? Assume viewValue is always a string?\n // Sort in the order that contains the viewValue string first\n _this.sortByPropertyContains = function (arr, viewValue, propToFilter) {\n if (viewValue === undefined) {\n viewValue = \"\";\n }\n var result = _.sortBy(arr, function (s) {\n var index = s[propToFilter].toLowerCase().indexOf(viewValue.toLowerCase());\n // If the string doesn't exist return arbitrarily long number to put the result at the end\n // Assumption is that list passed in already contains viewValue but just in case it doesn't, this will make sure strings that don't contain it show up last\n return index === -1 ? 1000000 : index;\n });\n return result;\n };\n});","app.service('StatesService', ['$http', '$q', function($http, $q) {\n var _this = this;\n\n _this.getLatitudeStateList = function (countryId) {\n var req = {\n method: 'GET',\n url: 'api/user/states/' + countryId + '/'\n };\n\n return $http.get(req.url).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n\n _this.getLatitudeAllStateList = function () {\n var req = {\n method: 'GET',\n url: 'api/user/states/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http.get(req.url).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n}]);","app.service('SurveyService', ['$http', '$q', function ($http, $q) {\n var _this = this;\n\n _this.singleResponse = null;\n\n _this.fetchSingle = function (userId, surveyId) {\n\n var url = 'api/user/' + userId + '/survey/' + surveyId + '/';\n\n var req = {\n method: 'GET',\n url: url,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.singleResponse = success.data;\n\n return _this.singleResponse;\n }, function (failure) {\n throw failure;\n });\n };\n}]);\n","app.service('TasksService', ['$http', 'dateUtil', 'errorDisplayerUtil', function($http, dateUtil, errorDisplayerUtil) {\n var _this = this;\n\n _this.response = null;\n\n _this.fetchSingle = function(taskId, userId) {\n var req = {\n method: 'GET',\n url: 'api/user/' + userId + '/task/' + taskId + '/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.getTasksApprovalTA = function() {\n // api/tasks/requireapproval\n var req = {\n method: 'GET',\n url: 'api/tasks/requireapproval',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.taskApproval = function (userId, taskId, isComplete) {\n var req = {\n method: 'POST',\n url: 'api/team/user/'+ userId + '/task/'+ taskId + '/' + isComplete,\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n // the dreaded format function.. it appears in different places\n // like those monsters in the Akrham Horror board game.\n _this.format = function (response) {\n var dates = ['assignedOn', 'completedDate', 'dueDate', 'endDateTime', 'startDate', 'startDateTime', 'requestedDate', 'endDate', 'createdDate'];\n\n var current = null;\n\n if (response !== null) {\n for (var assignment in response) {\n current = response[assignment];\n\n for (var node in current) {\n if (current[node] !== null && $.inArray(node, dates) !== -1) {\n current[node] = dateUtil.formatDate(current[node]);\n } else if (node === 'offerings' || node === 'sessions' || node === 'assignedOffering') {\n if (node === 'assignedOffering') {\n current[node] = [current[node]];\n\n current[node] = _this.format(current[node])[0];\n } else {\n current[node] = _this.format(current[node]);\n }\n }\n }\n\n current.error = errorDisplayerUtil.create();\n current.isLoading = false;\n }\n }\n\n return response;\n };\n}]);\n","/**\n * Service \"class\" that contains all logic for any team related calls to the API.\n */\napp.service('TeamService', ['$http', 'UsersService', 'dateUtil', 'courseFormatterUtil', 'errorDisplayerUtil', '$q', function ($http, UsersService, dateUtil, courseFormatterUtil, errorDisplayerUtil, $q) {\n var _this = this;\n\n _this.getSummary = function (startDate, endDate, fullyRecursive, dueDate) {\n var req = {\n method: 'GET',\n url: 'api/team/summary/' + startDate + '/' + endDate + '/' + fullyRecursive + '/' + dueDate,\n headers: {\n 'Content-Type': 'application/json'\n },\n //5 minutes to allow summary query on extremely large manager hierarchies\n timeout: 300000 \n };\n\n return $http(req).then(function(response) {\n response = response.data;\n\n // Insert the pie chart fields manually\n response.pieChartData = [response.complete, (response.incomplete - response.overdue), response.overdue];\n\n return response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.getCareerPathSummary = function (fullyRecursive) {\n var req = {\n method: 'GET',\n url: 'api/team/careerpath/summary/' + fullyRecursive,\n headers: {\n 'Content-Type': 'application/json'\n },\n //5 minutes to allow summary query on extremely large manager hierarchies\n timeout: 300000\n };\n\n return $http(req).then(function (response) {\n response = response.data;\n\n // Insert the pie chart fields manually\n //response.pieChartData = [response.complete, (response.incomplete - response.overdue), response.overdue];\n\n return response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getCareerPathStudentSummary = function (fullyRecursive, teamType) {\n var req = {\n method: 'GET',\n url: 'api/team/careerpath/studentsummary/' + fullyRecursive + '/' + teamType,\n headers: {\n 'Content-Type': 'application/json'\n },\n //5 minutes to allow summary query on extremely large manager hierarchies\n timeout: 300000\n };\n\n return $http(req).then(function (response) {\n response = response.data;\n return response;\n }, function (failure) {\n throw failure;\n });\n };\n\n\n /* Internal function which returns a promise which grabs the team list\n * Takes two required parameters:\n * 1) Alternate is a boolean which if true, returns the alternate team\n * If alternate is false, returns direct team\n * 2) managerUserId,\n */\n _this.getTeamList = function(alternate, managerUserId, startDate, endDate, fullyRecursive, dueDate) {\n // Returns team list in this format\n /*\n * See /api/team/list/{userId}/{teamType} in swagger\n * for return format\n * pieChartData noted below is added to each entry\n pieChartData:{\n \"complete\":10,\n \"incomplete\":10\n }\n */\n\n // Specify direct or alternate team\n var teamType = \"direct\";\n if (alternate) {\n teamType = \"alternate\";\n }\n\n if (typeof fullyRecursive === 'undefined' || fullyRecursive === null) { fullyRecursive = false; }\n\n var req = {\n method: 'GET',\n url: 'api/team/list/' + managerUserId + '/' + teamType + '/' + startDate + '/' + endDate + '/' + fullyRecursive + '/' + dueDate,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (response) {\n return _this.addChartDataToTeamList(response.data);\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.addChartDataToTeamList = function(teamList) {\n // Takes a team list from the ManagerService\n // and adds the chart data to it.\n //\n // Inserts\n /*\n pieChartData:{\n \"complete\":10,\n \"incomplete\":10\n }\n For every row of data.\n */\n var tempTeamList = teamList.slice();\n\n for (var i = 0; i < tempTeamList.length; i += 1) {\n // the 0 is for overdue in pie chart of bottom portion in manager page.\n // may be modified if there is any requirment in the future.\n tempTeamList[i].pieChartData = [tempTeamList[i].complete, tempTeamList[i].incomplete, 0];\n\n tempTeamList[i].error = errorDisplayerUtil.create();\n tempTeamList[i].isLoading = false;\n tempTeamList[i].profileExpanded = false;\n }\n\n return tempTeamList;\n };\n\n _this.getTeamMgrAssignmentSummary = function (managerId, dueDate) {\n var req = {\n method: 'GET',\n url: 'api/team/list/assignmentSummary/' + managerId + '/' + dueDate,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (response) {\n response = response.data;\n return response;\n }, function (failure) {\n throw failure;\n }\n );};\n\n\n /** Exposed functions for getting the team list **/\n // These two functions are for the initial team selectors\n // on the top left of the team list\n _this.getDirectTeamList = function (startDate, endDate, fullyRecursive, dueDate) {\n var currentUserId = UsersService.getId();\n return _this.getTeamList(false, currentUserId, startDate, endDate, fullyRecursive, dueDate);\n };\n\n _this.getAlternateTeamList = function (startDate, endDate, fullyRecursive, dueDate) {\n var currentUserId = UsersService.getId();\n return _this.getTeamList(true, currentUserId, startDate, endDate, fullyRecursive, dueDate);\n };\n\n // Used for drilling down by manager\n _this.getDirectTeamListByManagerId = function (managerId, startDate, endDate, fullyRecursive, dueDate) {\n return _this.getTeamList(false, managerId, startDate, endDate, fullyRecursive, dueDate);\n };\n\n /* Allows the user to search for a list of assignments.\n * Used in the addAssignment modal on the manager page\n * Takes a keyword that's not encoded and an assignmentType which is one of\n * 'wbt'\n * 'ilt'\n * 'vle'\n * 'coursegroup'\n * 'unknown' for all\n *\n * See /api/team/courses/{assignmentType} in swagger for return value\n */\n _this.searchAssignments = function(keyword, assignmentType) {\n var req = {\n method: 'GET',\n url: 'api/team/courses/' + assignmentType + '?q=' + encodeURIComponent(keyword),\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n var response = _this.formatAssignments(success.data);\n\n return response;\n }, function (failure) {\n throw failure;\n });\n };\n\n /* Gets the tasks that need manager approval\n * Returns data in this format.\n * see api/team/tasks/ for response format.\n */\n _this.getTasksForApproval = function() {\n var req = {\n method: 'GET',\n url: 'api/team/tasks/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.formatTask(success.data);\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n /**\n * Gets the enrollments that need approval\n *\n * @return {obj} Object which contains HTTP promise\n */\n _this.getListOfAssignmentsToApprove = function () {\n var req = {\n method: 'GET',\n url: 'api/team/enrollments/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n /**\n * Gets the team summary data from the rollup API\n * adds \"pieChartData\": [10, 0] manually\n * Where the first value in \"pieChartData\" is complete count and the last is incomplete count\n *\n * @param userId {int} ID of the user who's team roll up we want to get\n * @param startDate {date} start date of the range of assignments to get\n * @param endDate {date} end date of the range of assignments to get\n *\n * @return {obj} Object which contains HTTP promise\n */\n _this.getRollup = function (userId, startDate, endDate) {\n var req = {\n method: 'GET',\n url: 'api/team/rollup/' + userId + '/direct/' + startDate + '/' + endDate,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(response) {\n response = response.data;\n\n // Insert the pie chart fields manually\n response.pieChartData = [response.complete, response.incomplete];\n\n return response;\n }, function(failure) {\n throw failure;\n });\n };\n\n // Recursive promise tree to create\n // a hierarchy of teams on the frontend\n /* Returns a tree of subordinates @TODO @sneilan return type\n * First level is []\n */\n _this.recursiveTeamList = function (managerUserId, startDate, endDate, dueDate) {\n\n var req = {\n method: 'GET',\n url: 'api/team/list/' + managerUserId + '/direct/' + startDate + '/' + endDate + '/false/' + dueDate,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(response) {\n var teamList = response.data;\n\n return $q.all(teamList.map(function(teamMember) {\n if (teamMember.isManager) {\n _this.recursiveTeamList(teamMember.studentId, startDate, endDate, dueDate).then(function(teamList) {\n teamMember.checked = false;\n teamMember.hidden = true;\n\n teamMember.teamList = teamList;\n }, function(failure) {\n throw failure;\n });\n }\n\n return teamMember;\n }));\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.getSummariesByUserId = function(ids, startDate, endDate) {\n var req = {\n method: 'POST',\n url: 'api/team/list/' + startDate + '/' + endDate,\n data: JSON.stringify(ids),\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return _this.addChartDataToTeamList(success.data); \n }, function(failure) {\n throw failure;\n });\n };\n\n /* Formats each task in Tasks by adding\n * error and isLoading\n */\n _this.formatTask = function(data) {\n _this.tasks = _this.format(data);\n\n _this.tasks.forEach(function(task) {\n task.isLoading = false;\n task.error = errorDisplayerUtil.create();\n });\n\n return _this.tasks;\n };\n\n _this.formatAssignments = function(data) {\n for(var i in data) {\n data[i].checked = false;\n\n data[i].error = errorDisplayerUtil.create();\n }\n\n return data;\n };\n\n // the dreaded format function.. it appears in different places\n // like those monsters in the Akrham Horror board game.\n _this.format = function (response) {\n var dates = ['assignedOn', 'completedDate', 'dueDate', 'endDateTime', 'startDate', 'startDateTime', 'requestedDate', 'endDate'];\n\n var current = null;\n\n if (response !== null) {\n for (var assignment in response) {\n current = response[assignment];\n\n for (var node in current) {\n if (current[node] !== null && $.inArray(node, dates) !== -1) {\n current[node] = dateUtil.formatDate(current[node]);\n } else if (node === 'offerings' || node === 'sessions' || node === 'assignedOffering') {\n if (node === 'assignedOffering') {\n current[node] = [current[node]];\n\n current[node] = _this.format(current[node])[0];\n } else {\n current[node] = _this.format(current[node]);\n }\n }\n }\n\n current.error = errorDisplayerUtil.create();\n current.isLoading = false;\n\n if (current !== null && typeof current.code !== 'undefined') {\n current.codeForImage = courseFormatterUtil.getCourseCodeForImage(current.code,current.tileImage);\n }\n }\n }\n\n return response;\n };\n\n // get the summary of a single student\n _this.getStudentSummary = function () {\n var req = {\n method: 'GET',\n url: 'api/assignments/studentdash/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n return $http(req).then(\n function (success) {\n success = success.data;\n // manually insert pie chart data\n success.pieChartData = [success.complete, success.incomplete, success.totals.overdue];\n return success;\n }, function (failure) {\n throw failure;\n }\n );\n };\n\n _this.getOverdueAssignments = function (startDate, endDate, fullyRecursive, dueDate) {\n var req = {\n method: 'GET',\n url: 'api/team/overdue/' + startDate + '/' + endDate + '/' + fullyRecursive + '/' + dueDate,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n return $http(req).then(\n function (success) {\n return _this.format(success.data);\n }, function (failure) {\n throw failure;\n }\n );\n };\n\n\n}]);","app.service('TimezoneService', ['$http', '$q', function ($http, $q) {\n var _this = this;\n\n _this.timezones = [];\n _this.localTimeZone = null;\n \n /**\n * Unfortunate this has to exist. This files must exist because there is no valid api, but we need api data.\n * When we get an api, we can move this away \"gold\" and leverage the api, but only the data source will be changing.\n */\n _this.getAllTimezones = function() {\n var req = {\n method: 'GET',\n // url: 'api/Catalog/',\n url: 'app/json/latitude_countries.json',\n timeout: window.timeout,\n cache: true,\n };\n\n return $http.get(req.url).then(function (success) {\n _this.timezones = success.data;\n return success.data;\n }, function(failure) {\n throw failure;\n });\n };\n\n //initializes _this.timezones\n _this.getAllTimezones();\n\n _this.getMyTimeZoneAbbreviation = function () {\n if (_this.localTimeZone === null) {\n var d = new Date();\n _this.localTimeZone = d.toLocaleString(\"en\", { timeZoneName: \"short\" }).split(' ').pop();\n }\n return _this.localTimeZone;\n };\n\n _this.getTimeZoneById = function (id) {\n return _this.timezones.find(function (tz) {\n return tz.id === id;\n });\n };\n\n}]);\n","app.service('TranscriptsService', ['$http', '$q', 'courseFormatterUtil', 'dateUtil', 'SettingsService', 'UsersService', \n function ($http, $q, courseFormatterUtil, dateUtil, SettingsService, UsersService) {\n var _this = this;\n\n _this.response = null;\n\n _this.fetch = function(userId) {\n var req = {\n method: 'GET',\n url: 'api/transcript/' + userId + '/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n \n _this.rangeFetch = function(userId, startDate, endDate) {\n var url = 'api/transcript/' + userId + '/';\n if(startDate !== null && endDate !== null) {\n url += startDate + '/' + endDate + '/';\n }\n\n var req = {\n method: 'GET',\n url: url,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function(success) {\n _this.response = _this.format(success.data);\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.create = function(data) {\n // If user is adding transcript for himself then data.userId will be null\n // if user(manager) is adding a transcript for a student then data.userId will not be null.\n var req = {};\n if (data.userId !== null && data.userId !== undefined) {\n req = {\n method: 'POST',\n data: _this.formatToSendForCreate(data),\n url: 'api/transcript/user/' + data.userId + '/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n } else {\n req = {\n method: 'POST',\n data: _this.formatToSendForCreate(data),\n url: 'api/transcript/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n }\n \n return $http(req).then(function(success) {\n _this.response = success.data;\n\n return _this.response;\n }, function(failure) {\n throw failure;\n });\n };\n\n _this.batchCreate = function (data) {\n \n var req = {\n method: 'PUT',\n url: 'api/transcript/batchadd/',\n timeout: 300000,\n data: _this.formatToSendForCreate(data),\n headers: {\n 'Content-Type': 'application/json'\n }\n };\n\n return $http(req).then(function (success) {\n _this.response = success.data;\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.formatToSendForCreate = function(data) {\n\n if (data.constructor !== Array) {\n for (var node in data) {\n if (node === \"duration\") {\n if (data[node] !== null) {\n data[node] = data[node] / 60; // Convert duration from minutes to hours for API, if it has a value.\n }\n break;\n }\n }\n }\n\n if (data.constructor === Array) {\n _.each(data, function(dataPoint) {\n _this.formatToSendForCreate(dataPoint);\n });\n }\n\n return data;\n };\n\n /**\n * Format all data that comes in\n *\n * Currently, nothing needs to be formatted immediately on response\n */\n _this.format = function (response) {\n \n var dates = ['assignedOn', 'completedDate', 'dueDate', 'startDate', 'enrolledDate'];\n\n var current = null;\n var maxEAA = null;\n if (UsersService.isSaba()) { maxEAA = parseInt(SettingsService.maxEnrollmentAttemptsAllowed, 10); }\n\n if (response !== null) {\n for (var assignment in response) {\n current = response[assignment];\n\n // calc and add enrollmentAttemptsAllowed and enrollmentAttemptsRemaining properties to each assignment\n if (!UsersService.isSaba()) { maxEAA = current.allowedEnrollments; }\n if (maxEAA > 0) {\n current.enrollmentAttemptsAllowed = maxEAA;\n current.enrollmentAttemptsRemaining = (maxEAA - current.totalEnrollmentAttempts) > 0 ? maxEAA - current.totalEnrollmentAttempts : 0;\n }\n else {\n current.enrollmentAttemptsAllowed = -1;\n current.enrollmentAttemptsRemaining = -1;\n }\n for (var node in current) {\n if (current[node] !== null && $.inArray(node, dates) !== -1) { current[node] = dateUtil.formatDate(current[node]);\n }\n }\n }\n\n // Sort the transcripts in descending order\n var compare = function (a, b) {\n // completedDate.original is a string \n // \"2016-06-27T15:38:52.4-05:00\"\n // and javascript > <'s can\n // be used to compare datestrings.\n if (a.completedDate.original < b.completedDate.original) return 1;\n if (a.completedDate.original > b.completedDate.original) return -1;\n return 0;\n };\n\n response = response.sort(compare);\n\n // Detect which completed transcripts are editable.\n // Only the last updated transcript for each course is editable\n // At this point the transcripts are sorted by completedDate descending so the first one for each course should be marked editable\n var uniqueIds = [];\n for (var i = 0; i < response.length; i++) {\n if (response[i].status === \"successful\" || response[i].status === \"unsuccessful\") {\n if ($.inArray(response[i].id, uniqueIds) === -1) {\n response[i].editable = true;\n uniqueIds.push(response[i].id);\n }\n }\n if (response[i].isNMLS) {\n response[i].editable = false;\n }\n }\n }\n\n return response;\n };\n\n _this.getSingleTranscript = function (userId, id) {\n var req = {\n method: 'GET',\n url: 'api/transcript/' + userId + '/' + id,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format([success.data])[0];\n\n _this.response.codeForImage = courseFormatterUtil.getCourseCodeForImage(_this.response.code, _this.response.tileImage);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n /* Format a single transcript that goes out\n */\n\n _this.formatToSend = function (data) {\n var dates = ['assignedOn', 'dueDate', 'endDateTime', 'startDate', 'startDateTime', 'enrolledDate', 'completedDate'];\n\n if (data.constructor !== Array) {\n for (var node in data) {\n\n if (typeof data[node] !== 'undefined' && data[node] !== null && typeof data[node] === 'object' && $.inArray(node, dates) !== -1) {\n if (typeof data[node].moment !== \"undefined\" && _.isObject(data[node].moment)) {\n data[node] = data[node].moment.toISOString();\n } else {\n data[node] = null;\n }\n }\n\n if (node === \"duration\") {\n if (data[node] !== null) {\n data[node] = data[node] / 60; // Convert duration from minutes to hours for API, if it has a value.\n }\n }\n }\n }\n\n if (data.constructor === Array) {\n _.each(data, function (dataPoint) {\n _this.formatToSend(dataPoint);\n });\n }\n\n return data;\n };\n\n _this.updateTranscript = function(assignment) {\n var req = {\n method: 'PUT',\n url: 'api/transcript/user/' + assignment.studentId + '/',\n headers: {\n 'Content-Type': 'application/json'\n },\n data: _this.formatToSend(assignment),\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\t\t\n\t\t\n _this.updateSingle = function (stuId, assignment) {\n var req = {\n method: 'PUT',\n url: 'api/transcript/user/' + stuId + '/',\n data: _this.formatToSend(assignment),\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n //return success.data;\n }, function (failure) {\n throw failure;\n });\n\t\t};\n\n _this.fetchCompletionCounts = function (userId) {\n\n var req = {\n method: 'GET',\n url: 'api/transcript/completioncounts/' + userId + '/',\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n\n };\n\n _this.fetchLatest = function (userId) {\n var req = {\n method: 'GET',\n url: 'api/transcript/Latest/' + userId + '/',\n timeout: window.timeout\n };\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n\n };\n\n}]);\n","app.service('UsersService', ['$rootScope', '$cookies', '$http', '$location', '$q', 'addressUtil', 'dateUtil', 'messagingDisplayerUtil', '$httpParamSerializer', 'SettingsService',\n function ($rootScope, $cookies, $http, $location, $q, addressUtil, dateUtil, messagingDisplayerUtil, $httpParamSerializer, SettingsService) {\n var _this = this;\n\n _this.roleObj = null;\n _this.user = null;\n _this.response = null;\n _this.originalResponse = null;\n _this.singleResponse = null;\n _this.userApplicationType = null;\n _this.auth = {\n currentRole: null,\n isLoggedIn: false,\n roles: null,\n authedUser: null,\n isTopLevel: null\n };\n _this.userIsChangingPw = false;\n _this.userIsEditingProfile = false;\n _this.homeRole = 'student';\n _this.goingToTranscript = false;\n\n _this.setChangingPwFlag = function (value) {\n _this.userIsChangingPw = value;\n };\n\n _this.setEditProfileFlag = function (value) {\n _this.userIsEditingProfile = value;\n };\n\n _this.setHomeRole = function () {\n if (_this.goingToTranscript === false) {\n _this.homeRole = _this.getCurrentRoleType();\n }\n _this.goingToTranscript = false;\n };\n /**\n * Contains possible values for Person types\n *\n * @type {array|objects}\n */\n _this.personTypes = [{\n 'name': 'Regular',\n 'value': 'regular'\n }, {\n 'name': 'Part Time',\n 'value': 'partTime'\n }, {\n 'name': 'Independent Contractor',\n 'value': 'independentContractor'\n }, {\n 'name': 'Intern',\n 'value': 'intern'\n }, {\n 'name': 'Outsourced',\n 'value': 'outsourced'\n }, {\n 'name': 'Seasonal',\n 'value': 'seasonal'\n }, {\n 'name': 'Temporary',\n 'value': 'temporary'\n }, {\n 'name': 'Unknown',\n 'value': 'unknown'\n }\n ];\n\n /**\n * Contains possible values for Person types\n *\n * @type {array|objects}\n */\n _this.personStatuses = [{\n 'name': 'Prior-To-Hire',\n 'value': 'priorToHire'\n }, {\n 'name': 'Active',\n 'value': 'active'\n }, {\n 'name': 'Terminated',\n 'value': 'terminated'\n }, {\n 'name': 'Leave',\n 'value': 'leave'\n }, {\n 'name': 'Paid Leave Of Absence',\n 'value': 'paidLeaveOfAbsence'\n }, {\n 'name': 'Suspend',\n 'value': 'suspend'\n }, {\n 'name': 'Retired',\n 'value': 'retired'\n }, {\n 'name': 'Unknown',\n 'value': 'unknown'\n }\n ];\n\n /**\n * Fetch a single user\n *\n * @param id User ID\n * @returns {*}\n *\n * NOTE: Ignores the id that you pass in. Only returns the currently logged in user.\n * See _this.formatSingleUser\n */\n _this.fetch = function (id) {\n var req = {\n method: 'GET',\n url: 'api/user/single/' + id + '/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format([success.data]);\n\n return _this.response[0];\n }, function (failure) {\n throw failure;\n });\n };\n\n /**\n * Fetch a single user\n *\n * @param id User ID\n * @returns {*}\n */\n _this.fetchSingle = function (id) {\n var req = {\n method: 'GET',\n url: 'api/user/single/' + id + '/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n\n return $http.get(req.url).then(function (success) {\n _this.response = success.data;\n\n return _this.response;\n }, function (failure) {\n\n });\n };\n\n _this.search = function (query, optionalType) {\n if (!optionalType)\n optionalType = 'all';\n\n var req = {\n method: 'GET',\n url: 'api/searchuser/' + optionalType + '?q=' + query,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.formatMultipleUsers(success.data);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n /**\n * Validate a user's password. This reruns login, based on API logic. Will fully login a person. This\n * should only be run after a user has reset their password.\n *\n * @param username\n * @param password\n * @returns {*}\n */\n _this.validatePassword = function (username, password) {\n var req = {\n method: 'POST',\n url: 'api/account/login/',\n data: {\n 'Password': password,\n 'UserName': username\n },\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.refreshReactCookieStore();\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n /**\n * Send a request to generate a new password, when a user forgets their current password.\n *\n * @param username\n * @returns {*}\n */\n _this.requestTemporaryPassword = function (username) {\n _this.username = username;\n\n var req = {\n method: 'POST',\n url: 'api/account/forgotpassword/',\n data: {\n 'UserName': _this.username\n },\n headers: {\n 'Content-type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = success.data;\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n /**\n * Reset a user's password. This will either grab the current user's username or a preset username.\n *\n * @param password\n * @returns {*}\n */\n _this.resetPassword = function (password) {\n _this.password = password;\n _this.username = typeof _this.username === 'undefined' ? _this.user.userName : _this.username;\n\n var req = {\n method: 'POST',\n url: 'api/account/savepassword/',\n data: {\n 'Password': _this.password,\n 'UserName': _this.username\n },\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.formatSingleUser(success.data);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n /**\n * Login a user into the application\n *\n * @param username\n * @param password\n * @returns {*}\n */\n _this.login = function (username, password) {\n _this.password = password;\n _this.username = username;\n\n var req = {\n method: 'POST',\n url: 'api/account/login/',\n data: {\n 'Password': _this.password,\n 'UserName': _this.username\n },\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n\n _this.originalResponse = _this.response = success.data;\n\n _this.response = _this.formatSingleUser(success.data);\n\n _this.setUpCreds();\n\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n /**\n *\n * @param response\n * @returns {undefined}\n */\n _this.updateFromReact = function (responseData) {\n _this.originalResponse = _this.response = responseData;\n _this.response = _this.formatSingleUser(responseData);\n _this.setUpCreds();\n };\n\n\n /**\n * Changing to user context for proxy mode\n *\n * @param username\n * @returns {*}\n */\n _this.changeUserContext = function (username) {\n _this.username = username;\n\n var req = {\n method: 'POST',\n url: 'api/account/changeUserContext/',\n data: {\n 'UserName': _this.username\n },\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n\n _this.originalResponse = _this.response = success.data;\n _this.response = _this.formatSingleUser(success.data);\n\n _this.setUpCreds();\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n /**\n * Revoking impersonation\n *\n * @returns {*}\n */\n _this.revokeImpersonation = function () {\n var req = {\n method: 'POST',\n url: 'api/account/revoke/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.originalResponse = _this.response = success.data;\n _this.response = _this.formatSingleUser(success.data);\n\n _this.setUpCreds();\n\n return _this.response;\n });\n };\n\n /*\n * Switches the user's active profile to the one attached to the org passed in by orgId\n */\n _this.switchProfile = function (orgId) {\n var req = {\n method: 'POST',\n url: 'api/account/switchprofile/' + orgId,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n return $http(req).then(function (success) {\n }, function (failure) {\n throw failure;\n });\n\n };\n\n /**\n * Log out of the app entirely.\n * @returns $http Instance of $http object, with all references to the log out call\n */\n _this.clearSession = function () {\n var req = {\n method: 'POST',\n url: 'api/account/logout/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n _this.clearLocalSessionState();\n sessionStorage.removeItem('disableDashboard');\n\n return $http(req).then(function (success) {\n var baseUri = document.querySelector('base').href.split('/')[3];\n\n Cookies.remove('userRole', {\n path: '/' + baseUri\n });\n\n _this.refreshReactCookieStore();\n\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n\n /**\n *\n *\n */\n _this.clearLocalSessionState = function () {\n // Unset all local variables\n _this.auth = {\n isLoggedIn: false,\n roles: null,\n authedUser: null\n };\n\n _this.user = null;\n _this.response = null;\n _this.originalResponse = null;\n };\n\n\n /**\n * Refreshes the cookie store in React.\n * This ensures auth or proxy state changes propogate to React.\n *\n * @returns {undefined}\n */\n _this.refreshReactCookieStore = function () {\n try {\n window.LEGACY_GLOBALS.refreshCookieStore();\n } catch (e) {\n console.warn('Failed to refresh React cookie store.');\n console.warn(e);\n }\n };\n\n /**\n * update my profile\n *\n * @returns {*}\n */\n _this.editMyProfile = function () {\n var userCopy = angular.copy(_this.user);\n var req = {\n method: 'PUT',\n url: 'api/User/updateMyProfile/',\n data: _this.formatToSend(userCopy),\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n //The call will update the user cookie with the saved information\n var response = _this.format(success.data);\n _this.user = response.user;\n\n }, function (failure) {\n throw failure;\n });\n };\n\n /**\n * Edit a user's profile\n *\n * @returns {*}\n */\n _this.editProfile = function () {\n var req = {\n method: 'PUT',\n url: 'api/user/' + _this.getId() + '/',\n data: _this.user,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n jQuery.extend(_this.originalResponse.user, _this.user);\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n /**\n * @TODO: @adass Get this removed IMMEDIATELY and standardized with above call. PUT api/user/ for TA\n * is taken over by DEACTIVATE.\n *\n * Temporary method to update a user's profile from the TA role ONLY. Will be removed\n *\n * @param callback\n * @returns {*}\n */\n _this.taEditProfile = function (user) {\n var req = {\n method: 'PUT',\n url: 'api/user/update/',\n data: _this.formatToSend(user),\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format(success.data);\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getManagerSabaReportUrlIRR = function (callback, currentTimezone) {\n var req = {\n method: 'GET',\n url: 'api/user/reportlink/IRN/?currentTimezone=' + currentTimezone,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n /**\n * Let the callback run regardless; we only want the saba manager role\n */\n return $http(req).then(function (success) {\n return success.data;\n }, function () {\n callback();\n });\n };\n\n _this.getManagerSabaReportUrl = function (reportCalled, callback) {\n var req = {\n method: 'GET',\n url: 'api/user/reportlink/' + reportCalled + '/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n /**\n * Let the callback run regardless; we only want the saba manager role\n */\n return $http(req).then(function (success) {\n return success.data;\n }, function () {\n callback();\n });\n };\n\n _this.getLatitudeStateList = function (countryId) {\n var req = {\n method: 'GET',\n url: 'api/user/states/' + countryId + '/'\n };\n\n return $http.get(req.url).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getAllUsersForTa = function () {\n var req = {\n method: 'GET',\n url: 'api/user/search',\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = success.data;\n // DON'T delete allUsersData., its being used for people groups and rules\n _this.allUsersData = success.data;\n /*\n for (var i = 0; i < _this.response.length; i += 1) {\n _this.response[i].nodes = [];\n }\n */\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.deactivateUser = function (userId) {\n /* When deactivating a user without specifying a date\n * use today's date so the user is deactivated\n * as soon as this function is called */\n var data;\n var deactivationDate = new Date();\n data = deactivationDate.toISOString();\n\n var req = {\n method: 'PUT',\n url: 'api/User/' + userId,\n data: '\"' + data + '\"',\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = success.data;\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.activateUser = function (userId) {\n /* When deactivating a user without specifying a date\n * use today's date so the user is deactivated\n * as soon as this function is called */\n\n var req = {\n method: 'PUT',\n url: 'api/User/Activate/' + userId,\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = success.data;\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.batchUpdateUsers = function (users, updatedPropertiesAndValues) {\n var userIds = [];\n _.each(users, function (u) {\n return userIds.push(u.id);\n });\n var key = userIds.join(',');\n var requestMsg = {};\n requestMsg[key] = updatedPropertiesAndValues;\n\n var req = {\n method: 'PUT',\n url: 'api/user/batchupdate',\n timeout: window.timeout,\n data: requestMsg,\n headers: {\n 'Content-Type': 'application/json'\n }\n };\n\n return $http(req).then(function (success) {\n _this.response = success.data;\n\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getUserTrainingAudit = function (id) {\n var req = {\n method: 'GET',\n url: 'api/user/' + id + '/trainingaudit/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = _this.format(success.data.response);\n\n return _this.response;\n }, function (failure) {\n /**\n * throw failure; no longer works. Need to throw for some reason.\n *\n * @TODO: talk to appropriate people on what happened here.\n */\n throw failure;\n });\n };\n\n\n _this.getIdesignUrl = function () {\n var req = {\n method: 'GET',\n url: 'api/user/idesign',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: 100000\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n /**\n * End of HTTP requests\n */\n\n /**\n * Generate navigation per user\n *\n * @returns {*[]}\n */\n _this.getNavigation = function () {\n var userType = _this.getUserType();\n\n switch (userType) {\n case 1:\n return [{\n id: 1,\n display: 'myDashboard',\n label: 'My Dashboard',\n url: null // this needs to be set to null and NOT 'student/home' to make sure the logic in NavigationController.changeUserScope() works correctly.\n }, {\n id: 3,\n display: 'transcripts',\n label: 'Transcript',\n url: 'users/transcripts/'\n }, {\n id: 4,\n display: 'myProfile',\n label: 'Profile',\n url: 'student/profile/'\n }];\n }\n };\n\n _this.getUserType = function () {\n return 1;\n };\n\n /**\n * Format the response; mainly to format all dates.\n *\n * @param response\n * @returns {*}\n */\n _this.format = function (user) {\n var dates = ['hireDate', 'endDate', 'assignmentAddedDate', 'assignmentRemovedDate'];\n var current = null;\n\n for (var userNode in user) {\n current = user[userNode];\n\n for (var node in current) {\n if (typeof current[node] !== 'undefined' && current[node] !== null && $.inArray(node, dates) !== -1) {\n if (!_.isObject(current[node].moment)) {\n current[node] = dateUtil.formatDate(current[node]);\n }\n }\n if (typeof current[node] !== 'undefined' && current[node] !== null && node === \"timeZone\") {\n current[node] = parseInt(current[node], 10);\n }\n }\n }\n\n if (user.hasOwnProperty('alternateManagers')) {\n if (typeof user.alternateManagers === 'undefined' || user.alternateManagers === null) {\n user.alternateManagers = [];\n }\n }\n\n user.droppingStudent = false;\n user.error = messagingDisplayerUtil.create();\n user.isLoading = false;\n user.showCheck = false; // @TODO: remove this potentially?\n user.showEx = false; // @TODO: remove this potentially?\n user.success = messagingDisplayerUtil.create();\n\n return user;\n };\n\n _this.formatToSend = function (data) {\n var dates = ['endDate', 'startDate', 'displayStart', 'displayEnd', 'hireDate'];\n\n if (data.constructor !== Array) {\n for (var node in data) {\n if (typeof data[node] !== 'undefined' && data[node] !== null && $.inArray(node, dates) !== -1) {\n\n if (data[node].moment && _.isObject(data[node].moment)) {\n data[node] = data[node].moment.toISOString();\n } else {\n data[node] = null;\n }\n\n }\n\n if (typeof data[node] !== 'undefined' && data[node] !== null && data[node].constructor === Array) {\n _this.formatToSend(data[node]);\n }\n }\n }\n\n if (data.constructor === Array) {\n _.each(data, function (dataPoint) {\n _this.formatToSend(dataPoint);\n });\n }\n\n return data;\n };\n\n _this.formatSingleUser = function (response) {\n\n response = _this.response = typeof _this.response !== 'undefined' ? _this.response : JSON.parse(String.fromCharCode.apply(null, new Uint8Array(pako.inflate(atob(decodeURIComponent(Cookies.get('user')))))));\n\n if (response !== null) {\n response = _this.format(response);\n }\n\n return response;\n };\n\n _this.formatMultipleUsers = function (response) {\n if (response.length > 0) {\n for (var i in response) {\n response[i] = _this.format(response[i]);\n }\n }\n\n return response;\n };\n\n /**\n * Set up all credentials for the UsersService to be easily accessed throughout the application\n */\n _this.setUpCreds = function () {\n _this.originalResponse = (typeof _this.originalResponse !== 'undefined' && _this.originalResponse !== null) ? _this.originalResponse : JSON.parse(String.fromCharCode.apply(null, new Uint8Array(pako.inflate(atob(decodeURIComponent(Cookies.get('user')))))));\n _this.originalResponse = _this.format(_this.originalResponse);\n _this.response = (typeof _this.response !== 'undefined' && _this.response !== null) ? _this.response : _this.originalResponse;\n _this.auth.isLoggedIn = true;\n _this.user = _this.auth.authedUser = _this.response.user;\n _this.auth.roles = _this.response.roles;\n _this.userApplicationType = _this.auth.userApplicationType = _this.response.userApplicationType;\n _this.auth.isTopLevel = _this.response.isTopLevel;\n _this.auth.taDomains = _this.response.taDomains;\n _this.auth.activeDomain = _this.response.activeDomain;\n _this.impersonate = _this.response.impersonate;\n _this.pausePortal = _this.response.pausePortal;\n localStorage.setItem(\"userInfo\", JSON.stringify(_this.response));\n\n\n /**\n Get a role if set from saba and set the current role\n This will ensure we go to manager or instructor screen if selected in Saba\n */\n if (localStorage.getItem(\"sabaRole\") === \"Manager\") {\n //make sure the user has manager role available\n if (_this.hasRole(\"manager\")) {\n _this.auth.currentRole = _this.getRoleObjectByName(\"manager\");\n _this.roleObj = _this.auth.currentRole;\n _this.setCurrentRoleCookie();\n\n localStorage.removeItem(\"sabaRole\");\n } else {\n _this.roleObj = _this.response.currentRole;\n _this.setCurrentRoleCookie();\n }\n } else if (localStorage.getItem(\"sabaRole\") === \"Instructor\") {\n //make sure the user has instructor role available\n if (_this.hasRole(\"instructor\")) {\n _this.auth.currentRole = _this.getRoleObjectByName(\"instructor\");\n _this.roleObj = _this.auth.currentRole;\n _this.setCurrentRoleCookie();\n\n localStorage.removeItem(\"sabaRole\");\n } else {\n _this.roleObj = _this.response.currentRole;\n _this.setCurrentRoleCookie();\n }\n } else {\n _this.auth.currentRole = _this.roleObj = typeof $cookies.getObject('userRole') !== 'undefined' && $cookies.getObject('userRole') !== 'null' ? $cookies.getObject('userRole') : _this.response.currentRole;\n\n _this.setCurrentRoleCookie();\n }\n _this.refreshReactCookieStore();\n };\n\n /**\n * Run setUpCreds if the user is already logged in, and returning from an external site/reopening a browser/etc.\n */\n _this.setFromCookies = function () {\n var cookie = Cookies.get('user');\n if (typeof cookie !== 'undefined') {\n var userCookie = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(pako.inflate(atob(decodeURIComponent(Cookies.get('user')))))));\n if (userCookie) {\n _this.response = _this.formatSingleUser(userCookie);\n\n\n\n _this.setUpCreds();\n }\n }\n };\n\n /**\n * Return if user is logged in\n *\n * @returns {boolean}\n */\n _this.isLoggedIn = function () {\n return _this.auth.isLoggedIn;\n };\n\n /**\n * Generate array of view ready data for the FE to consumer in between SABA and Latitude transition\n *\n * @returns array roles\n */\n _this.getUrlsForRoles = function () {\n var role = null;\n var roles = [];\n\n for (var i in _this.auth.roles) {\n /**\n * Go through each possible role; add links and view changers;\n * Required for SABA vs Latitude work;\n * Links required to redirect to Sabara;\n * View changers required for switching between user contexts\n */\n switch (_this.auth.roles[i].type) {\n case 'student':\n {\n role = {\n 'display': 'student',\n 'label': 'student',\n 'value': 'student',\n 'roleName': 'student'\n };\n\n roles.push(role);\n\n break;\n }\n case 'instructor':\n {\n role = {\n 'display': 'instructor',\n 'label': 'Instructor',\n 'roleName': 'instructor'\n };\n\n roles.push(role);\n\n break;\n }\n case 'manager':\n {\n role = {\n 'display': 'teamManagement',\n 'label': 'Team Management',\n 'value': 'manager',\n 'roleName': 'manager'\n };\n\n roles.push(role);\n\n break;\n }\n case 'admin':\n {\n role = {\n 'display': 'administration',\n 'label': 'Administration',\n 'roleName': 'admin'\n };\n\n roles.push(role);\n\n break;\n }\n case 'ta':\n {\n // This is for latitude specifically\n role = {\n 'display': 'premiumAdmin',\n 'label': 'Administration',\n 'value': 'admin',\n 'roleName': 'ta'\n };\n\n roles.push(role);\n\n break;\n }\n case 'premiumAdmin':\n {\n role = {\n 'display': 'premiumAdmin',\n 'label': 'Premium Admin',\n 'value': 'admin',\n 'roleName': 'admin'\n };\n\n roles.push(role);\n\n break;\n }\n case 'decisionMaker':\n {\n role = {\n 'display': 'decisionMaker',\n 'label': 'Decision Map',\n 'value': 'decisionMaker',\n 'roleName': 'decisionMaker'\n };\n\n roles.push(role);\n\n break;\n }\n }\n }\n\n return roles;\n };\n\n /**\n * Generally bool-ery\n *\n * @param role string Name of search string\n * @returns boolean Returns if user has current role in list\n */\n _this.hasRole = function (role) {\n var obj = typeof _this.getRoleObjectByName(role) === 'object' ? true : false;\n\n return obj;\n };\n\n /**\n * See if user is more than just a student\n *\n * @returns {boolean}\n */\n _this.isUserAboveStudent = function () {\n var roleCount = _this.auth.roles.length;\n\n return roleCount > 1;\n };\n\n /**\n * All user getters/setters can be found below\n */\n _this.setUserContext = function (role) {\n if (_this.hasRole(role)) {\n _this.roleObj = _this.getRoleObjectByName(role);\n if (_this.roleObj.name === \"TA\" && !_this.isSaba() && _this.auth.isTopLevel === false) {\n if (_this.taDomains()[0] !== undefined) {\n var switchProfilePromiseTa = _this.switchProfile(_this.taDomains()[0].id);\n return switchProfilePromiseTa.then(function (success) {\n _this.auth.activeDomain = _this.taDomains()[0];\n _this.setCurrentRoleCookie();\n }, function (failure) {\n throw failure;\n });\n }\n } else if (_this.roleObj.name === \"Instructor\" && !_this.isSaba()) {\n var switchProfilePromiseInstructor = _this.switchProfile(_this.auth.authedUser.topLevelOrganizationId);\n return switchProfilePromiseInstructor.then(function (success) {\n _this.setCurrentRoleCookie();\n }, function (failure) {\n throw failure;\n });\n } else {\n return $q(function (resolve) {\n _this.setCurrentRoleCookie();\n resolve();\n });\n }\n } else {\n // @TODO: @sfrohm figure out what to do when user is mucking around.\n }\n };\n\n _this.isSubDomainAdmin = function () {\n if (_this.auth.isTopLevel !== null) {\n return _this.auth.isTopLevel === false && _this.auth.currentRole.type === 'ta';\n } else {\n return false;\n }\n };\n\n _this.taDomains = function () {\n return _this.auth.taDomains;\n };\n\n _this.activeDomain = function () {\n return _this.auth.activeDomain;\n };\n\n _this.topLevelOrganizationId = function () {\n return _this.auth.authedUser.topLevelOrganizationId;\n };\n\n /**\n * Set the current role cookie to ensure application knows what permissions a user has\n *\n * @param role\n */\n _this.setCurrentRoleCookie = function (role) {\n _this.auth.currentRole = _this.roleObj;\n\n var baseUri = document.querySelector('base').href.split('/')[3];\n\n $cookies.putObject('userRole', _this.auth.currentRole, {\n path: '/' + baseUri\n });\n _this.refreshReactCookieStore();\n };\n\n /**\n * Return a role, found by name, if role exists in current user's roles\n * @param role\n * @returns {*}\n */\n _this.getRoleObjectByName = function (role) {\n var roles = _this.auth.roles;\n\n if (role !== null && roles.length > 0) {\n for (var i in roles) {\n if (roles[i].type === role) {\n return roles[i];\n }\n }\n }\n\n return false;\n };\n\n /**\n * Return user's current role\n *\n * @returns {null}\n */\n _this.getCurrentRole = function () {\n return _this.auth.currentRole;\n };\n\n /**\n * Return user's current role type\n *\n * @returns {null}\n *\n * This is similar to getCurrentRole\n * except it returns the string\n * representing the current role\n * instead of a dictionary\n */\n _this.getCurrentRoleType = function () {\n return _this.auth.currentRole.type;\n };\n\n /**\n * Return if a user is a admin\n *\n * @returns {boolean}\n */\n _this.isAdmin = function () {\n return _this.auth.currentRole.type === 'ta';\n };\n\n /**\n * Return if a user is a manager\n *\n * @returns {boolean}\n */\n _this.isManager = function () {\n return _this.auth.currentRole.type === 'manager';\n };\n\n /**\n * Return if a user is an instructor\n *\n * @returns {boolean}\n */\n _this.isInstructor = function () {\n return _this.auth.currentRole.type === 'instructor';\n };\n\n _this.customLogoUrl = function () {\n return _this.response.customLogoUrl;\n };\n\n /**\n * Return if a user is a student\n *\n * @returns {boolean}\n */\n _this.isStudent = function () {\n return _this.auth.currentRole.type === 'student';\n };\n\n /**\n * Return a users full name\n *\n * @returns {string}\n */\n _this.getName = function () {\n return _this.user.firstName + ' ' + _this.user.lastName;\n };\n\n /**\n * Return users job position\n *\n * @returns {string}\n */\n _this.getJobPosition = function () {\n return _this.user.jobType;\n };\n\n /**\n * Return if current user is a SABA user\n *\n * @returns {boolean}\n */\n _this.isSaba = function () {\n return _this.userApplicationType.toLowerCase() === 'saba';\n };\n\n /**\n * Return a users BAI referential ID\n *\n * @returns {int}\n */\n _this.getId = function () {\n return _this.user.id;\n };\n\n /**\n * Return a users BAI username/ loginid\n *\n * @returns {string}\n */\n _this.getUserName = function () {\n return _this.user.userName;\n };\n\n /**\n * Return a user's Structure Id (for Latitude API's of getting the countries and states\n *\n * @returns {int}\n */\n _this.getPortalId = function () {\n return _this.user.portalId;\n };\n\n _this.getCountryId = function () {\n if (_this.user.homeAddress !== null) {\n return _this.user.homeAddress.countryId;\n }\n };\n\n _this.getStateId = function () {\n if (_this.user.homeAddress !== null) {\n return _this.user.homeAddress.stateId;\n }\n\n };\n\n /**\n * Return a users portal code\n *\n * @returns {int}\n */\n _this.getPortalCode = function () {\n var portalCode = typeof _this.user !== 'undefined' && _this.user.portalCode !== null && _this.user.portalCode !== '' ? _this.user.portalCode : null;\n\n return portalCode;\n };\n\n /**\n *\n * @returns {string}\n */\n _this.getAddress = function () {\n var homeAddress = _this.user.homeAddress;\n if (homeAddress !== null) {\n _this.user.formattedAddress = addressUtil.formatAddress(homeAddress);\n }\n };\n\n /**\n *\n * @returns {string}\n */\n _this.getHireDate = function () {\n return _this.user.hireDate.fullDate;\n };\n\n /* Sample advanced search struct\n * See the UsersService.advancedSearch for complete list of fields\n */\n var advancedSearch = {};\n advancedSearch.firstName = 'Sean';\n advancedSearch.lastName = 'Neilan';\n\n /* Returns a list of user objects */\n _this.advancedSearch = function (advancedSearchStruct) {\n // See if the user entered anything in the date fields\n var dateFields = ['terminatedAfter',\n 'terminatedBefore',\n 'startedOnOrBefore',\n 'startedOnOrAfter'\n ];\n for (i = 0; i < dateFields.length; i += 1) {\n if (advancedSearchStruct[dateFields[i]]) {\n var dateObj = advancedSearchStruct[dateFields[i]];\n if (typeof dateObj === \"undefined\" || typeof dateObj.moment === \"undefined\") {\n advancedSearchStruct[dateFields[i]] = null;\n } else if (typeof dateObj.moment !== \"undefined\" && dateObj.moment !== null && _.isObject(dateObj.moment)) {\n\n if (dateFields[i] === \"startedOnOrAfter\" || dateFields[i] === \"terminatedAfter\") {\n var newdt1 = dateUtil.setStartTime(dateObj.moment.toDate());\n dateObj.moment.set({ hour: newdt1.getHours(), minute: newdt1.getMinutes(), second: newdt1.getSeconds(), millisecond: newdt1.getMilliseconds() });\n } else if (dateFields[i] === \"startedOnOrBefore\" || dateFields[i] === \"terminatedBefore\") {\n var newdt2 = dateUtil.setEndTime(dateObj.moment.toDate());\n dateObj.moment.set({ hour: newdt2.getHours(), minute: newdt2.getMinutes(), second: newdt2.getSeconds(), millisecond: newdt2.getMilliseconds() });\n }\n\n var newDate = new Date(dateObj.moment.format('L LT'));\n advancedSearchStruct[dateFields[i]] = (newDate.toISOString());\n }\n }\n }\n\n var req = {\n method: 'GET',\n url: 'api/user/search/?' + $httpParamSerializer(advancedSearchStruct),\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return _this.format(success.data);\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.format_advancedSearch = function () {\n\n };\n\n _this.getSabaManagerReportUriFromCookie = function () {\n var url = typeof Cookies.get('managerReportSabaURI') !== 'undefined' && _this.getCurrentRoleType() === 'manager' ? Cookies.get('managerReportSabaURI') : null;\n\n return url;\n };\n\n /* Creates a user */\n _this.createUser = function (userObj) {\n var req = {\n method: 'POST',\n url: 'api/user/',\n timeout: window.timeout,\n data: [_this.formatToSend(userObj)]\n };\n\n return $http(req).then(function (success) {\n return success.data;\n }, function (failure) {\n throw failure;\n });\n };\n\n /**\n *\n */\n _this.getAllInstructors = function () {\n var req = {\n method: 'GET',\n url: 'api/user/instructors/',\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return _this.formatMultipleUsers(success.data);\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.isInFuture = function (user) {\n var today = new Date();\n var startDate = user.hireDate.jsDate;\n /* User hasn't started yet */\n if (today < startDate) {\n return true;\n } else {\n return false;\n }\n };\n\n /* Takes a user object and returns true\n * if the user is active. False if inactive */\n _this.isUserActive = function (user) {\n var today = new Date();\n\n if (typeof user.hireDate !== \"undefined\" && user.hireDate.jsDate <= today && (typeof user.endDate === \"undefined\" || user.endDate === null || user.endDate.jsDate > today)) {\n return true;\n } else {\n return false;\n }\n };\n\n _this.isSSO = function () {\n var req = {\n method: 'GET',\n url: 'api/user/isSSO/',\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n _this.response = success.data;\n return _this.response;\n }, function (failure) {\n throw failure;\n });\n\n };\n\n _this.getManagerTree = function () {\n var req = {\n method: 'GET',\n url: 'api/user/managers/',\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return (success.data);\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getUsersResponsibilities = function (userId) {\n var req = {\n method: 'GET',\n url: 'api/user/responsibilities/' + userId,\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return (success.data);\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.hasCareerPathAccess = function () {\n var req = {\n method: 'GET',\n url: 'api/user/hascareerpath/',\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return (success.data);\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.hasAdminRole = function () {\n var results = _this.auth.roles.filter(function (r) { return r.name === \"TA\"; });\n return results.length > 0;\n };\n\n _this.displayTime = function () {\n return _this.user.displayDueDateTime;\n };\n\n _this.getSignedJwt = function (payload) {\n _this.payload = payload;\n var req = {\n method: 'POST',\n url: 'api/user/getsignedjwt',\n data: _this.payload,\n headers: {\n 'Content-Type': 'application/json'\n },\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return (success);\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.getPlmAlerts = function () {\n var req = {\n method: 'GET',\n url: 'api/user/getplmalerts',\n timeout: window.timeout\n };\n\n return $http(req).then(function (success) {\n return (success.data);\n }, function (failure) {\n throw failure;\n });\n };\n\n _this.navigateToHome = function () {\n var currentUserRole = _this.getCurrentRoleType();\n // in the React codebase, index.tsx, the home path for ta, manager, and instructor is /users/home\n if (!currentUserRole) {\n return; // not sure if this could happen\n }\n switch (currentUserRole.toLowerCase()) {\n case 'student':\n case 'decisionMaker'.toLowerCase():\n $location.url('student/home/');\n break;\n case 'instructor':\n case 'manager':\n case 'ta':\n this.setUserContext(currentUserRole);\n if (currentUserRole.toLowerCase() === 'ta' && SettingsService.isILTEnabled()) {\n $location.url('admin/dashboard/');\n } else {\n $location.url('users/home/');\n }\n break;\n default:\n $location.url('student/home/');\n break;\n }\n };\n }\n]);","/* This controls the profile page */\napp.controller('accountController', ['$location', '$scope', '$window', '$timeout', '$filter', 'BreadcrumbsService', 'CountriesService', 'StatesService', 'UsersService', 'TranscriptsService', 'SettingsService', 'CoursesService', function ($location, $scope, $window, $timeout, $filter, BreadcrumbsService, CountriesService, StatesService, UsersService, TranscriptsService, SettingsService, CoursesService) {\n $scope.user = UsersService;\n\n $scope.apiError = false;\n $scope.isLoading = false;\n $scope.success = false;\n $scope.passwordChangeSuccess = false;\n $scope.showPasswordForm = false;\n $scope.showEditProfileForm = false;\n $scope.isSaba = false;\n $scope.countryId = null;\n $scope.StateId = null;\n $scope.latitudeCountryList = null;\n $scope.stateList = [];\n $scope.isSaba = false;\n $scope.isLoadImmediate = true;\n $scope.userId = UsersService.getId();\n $scope.homeTemplate = \"app/templates/account/index.html\";\n $scope.settings = { displayTime: $scope.user.displayTime() };\n\n /* Training Insights and Career Path access determined by the organization settings */\n var sett = SettingsService.getSettings().then(function (success) {\n $scope.showResponsibilities = SettingsService.isTrainingInsightsEnabled();\n //if dashboard is disabled, Jason wants this disabled\n $scope.hasCareerPaths = SettingsService.isCareerPathDashboardEnabled();\n });\n\n\n $scope.loadStateAndCountry = function () {\n if (typeof $scope.user.getCountryId() === 'undefined' || $scope.user.user.homeAddress === null) {\n $scope.user.user.homeAddress = {};\n }\n\n CountriesService.getLatitudeCountryList(UsersService.getPortalId()).then(\n function (latitudeCountryList) {\n $scope.latitudeCountryList = latitudeCountryList;\n\n var countryId = $scope.user.getCountryId();\n if (typeof countryId !== 'undefined' && countryId !== null) {\n StatesService.getLatitudeStateList(countryId).then(\n function (stateList) {\n $scope.stateList = stateList;\n $scope.user.user.homeAddress.stateId = $scope.user.getStateId();\n });\n }\n });\n };\n\n\n $scope.user.getAddress();\n $scope.loadStateAndCountry();\n \n $scope.loadStates = function (countryId) {\n if (countryId === null) {\n $scope.stateList = [];\n $scope.user.stateId = null;\n }\n else {\n StatesService.getLatitudeStateList(countryId).then(function (stateList) { \n\t\t\t\t$scope.stateList = stateList; \n\t\t\t});\n }\n };\n\n // Use these wrapper functions to show/hide menus\n // Instead of booleans.\n // Booleans can quickly become unmanageable.\n $scope.resetMessages = function() {\n $scope.apiError = false;\n $scope.isLoading = false;\n $scope.success = false;\n $scope.passwordChangeSuccess = false;\n $scope.profileUpdateSuccess = false;\n };\n\n $scope.clearDisplays = function() {\n $scope.resetMessages();\n $scope.showPasswordForm = false;\n $scope.showEditProfileForm = false;\n };\n\n $scope.displayLoading = function() {\n $scope.resetMessages();\n $scope.isLoading = true;\n };\n\n $scope.displayApiError = function() {\n $scope.resetMessages();\n $scope.apiError = true;\n };\n\n $scope.displaySuccess = function() {\n $scope.resetMessages();\n $scope.success = true;\n };\n\n $scope.displayPasswordChangeSuccess = function() {\n $scope.resetMessages();\n $scope.passwordChangeSuccess = true;\n };\n\n $scope.displayProfileUpdateSuccess = function () {\n $scope.resetMessages();\n $scope.profileUpdateSuccess = true;\n };\n // End wrappers\n\n $scope.toggleEditProfileForm = function () {\n $scope.showPasswordForm = false;\n if ($scope.showEditProfileForm === false) {\n $scope.settings.displayTime = $scope.user.displayTime();\n }\n $scope.showEditProfileForm = !$scope.showEditProfileForm;\n };\n $scope.togglePasswordForm = function () {\n $scope.showEditProfileForm = false;\n $scope.showPasswordForm = !$scope.showPasswordForm;\n };\n\n $scope.changePassword = function() {\n $scope.displayLoading();\n\n var passwordChange = UsersService.resetPassword(this.baiform.password.$viewValue);\n\n passwordChange.then(function() {\n // Remove refresh and trigger a okay message\n //$window.location.reload();\n $scope.displayPasswordChangeSuccess();\n }, function() {\n $scope.displayApiError();\n }).then(function() {\n $timeout(function() {\n jQuery('#showForm').toggle();\n $scope.clearDisplays();\n //$scope.password = null;\n //$scope.passwordmatch = null;\n }, 3000);\n });\n };\n\n $scope.editProfile = function() {\n $scope.displayLoading();\n\n UsersService.user.displayDueDateTime = $scope.settings.displayTime;\n\n var profile = UsersService.editMyProfile();\n \n profile.then(function () {\n $scope.user.getAddress();\n $scope.loadStateAndCountry();\n $scope.displayProfileUpdateSuccess();\n \n }, function() {\n $scope.displayApiError();\n }).then(function () {\n $timeout(function () {\n jQuery('#showForm').toggle();\n $scope.clearDisplays();\n }, 3000);\n });\n };\n\n $scope.clearForm = function() {\n $window.location.reload();\n };\n\n if ((typeof $location.search().resetpw !== 'undefined' && $location.search().resetpw === 'true') || UsersService.userIsChangingPw === true) {\n $scope.togglePasswordForm();\n UsersService.setChangingPwFlag(false);\n } else if (UsersService.userIsEditingProfile === true) {\n $scope.toggleEditProfileForm();\n UsersService.setEditProfileFlag(false);\n }\n\n BreadcrumbsService.createHomeBreadcrumb(UsersService.homeRole);\n BreadcrumbsService.pushCrumb('profile');\n}]);\n","(function () {\n app.controller('actionButtonController', ['$scope', '$route', '$timeout', '$window', '$q', 'CoursesService', 'AssessmentService', 'SurveyService', 'EvaluationService', 'UsersService', 'errorDisplayerUtil', 'AssignmentsService', 'IltRosterUtilities', actionButtonController]);\n\n function actionButtonController($scope, $route, $timeout, $window, $q, CoursesService, AssessmentService, SurveyService, EvaluationService, UsersService, errorDisplayerUtil, AssignmentsService, IltRosterUtilities) {\n $scope.assignment = {};\n $scope.actionText = \"\";\n $scope.statusText = \"\";\n $scope.successMessage = \"\";\n $scope.isLoading = false;\n $scope.productError = errorDisplayerUtil.create();\n $scope.hidePrereq = function () { jQuery('#preReqModal' + $scope.assignment.id).hide(); };\n $scope.hideAttached = function () { jQuery('#attachedModal' + $scope.assignment.id).hide(); };\n $scope.executeAction = function () { };\n $scope.currentRoute = \"\";\n $scope.attachTriggered = false;\n\n var launchCourseCallback = null;\n var courseUrlPromise = {};\n var closeAction = function () { };\n var launchedCourse = null;\n var concurrentOpen = false;\n\n $q.all($scope.assignmentPromises).then(function (success) {\n $scope.assignment = success[0];\n var openOfferings = _.where(success[1], { status: \"open\" });\n $scope.assignment.offerings = findFutureOfferingsWithSessions(openOfferings);\n\n //This assigns the career path status to the same variable that is normally used by all the other course types.\n if ($scope.assignment.type === \"careerPath\" && $scope.assignment.careerPathStatus !== undefined) {\n $scope.assignment.status = $scope.assignment.careerPathStatus;\n }\n configureActionButton();\n });\n\n function findFutureOfferingsWithSessions(openOfferings) {\n var futureOfferings = [];\n _.each(openOfferings, function (offering) {\n if (offering.sessions) {\n if (offering.sessions.length > 0) {\n var offerStartDate = _.sortBy(offering.sessions, \"startDateTime\")[0].startDateTime.jsDate;\n var today = new Date();\n if (offerStartDate > today) {\n futureOfferings.push(offering);\n }\n }\n }\n });\n return futureOfferings;\n }\n\n function configureActionButton() {\n if ($route.current.params.param !== undefined && $route.current.params.param !== null) {\n var params = $route.current.params.param.split('/');\n if (params.length > 0) {\n $scope.currentRoute = params[0].toLowerCase();\n }\n }\n switch ($scope.assignment.type) {\n case \"wbt\":\n configureWbt();\n setActionButtonBehavior();\n break;\n case \"assessment\":\n configureAssessment();\n setActionButtonBehavior();\n break;\n case \"survey\":\n configureSurvey();\n setActionButtonBehavior();\n break;\n case \"evaluation\":\n configureEvaluation();\n setActionButtonBehavior();\n break;\n case \"ilt\":\n configureIlt();\n setActionButtonLaunchIlt();\n break;\n case \"courseGroupCertification\":\n configureCourseGroupFamily();\n break;\n case \"courseGroup\":\n configureCourseGroupFamily();\n break;\n case \"courseGroupCurricula\":\n configureCourseGroupFamily();\n break;\n case \"careerPath\":\n configureCareerPath();\n break;\n case \"task\":\n configureTask();\n break;\n case \"mP4\":\n case \"mP3\":\n case \"pdf\":\n case \"excel\":\n case \"word\":\n case \"url\":\n case \"other\":\n configureDocument();\n setActionButtonBehavior();\n break;\n default:\n break;\n }\n }\n\n function configureWbt() {\n if ($scope.assignment.resourceLaunchWithContent === null || $scope.assignment.resourceLaunchWithContent === 0)\n {\n courseUrlPromise = executeWbtPromise;\n closeAction = wbtCloseAction;\n $scope.executeAction = checkPrereqsAndLaunch;\n }\n else\n {\n courseUrlPromise = executeWbtAttachPromise;\n closeAction = attachCloseAction;\n $scope.executeAction = checkPrereqsAndLaunch;\n }\n }\n\n function executeWbtPromise() {\n CoursesService.getCourseUrl($scope.assignment.id, $scope.assignment.type, UsersService.getId()).then(success, failure);\n }\n\n function executeWbtAttachPromise() {\n var assignment = $scope.assignment;\n assignment.courseAssets.forEach(function (asset) {\n if (asset.id === assignment.resourceLaunchWithContent || asset.courseId === assignment.resourceLaunchWithContent) {\n CoursesService.getCourseUrl(parseInt(asset.courseId), asset.type, UsersService.getId()).then(success, failure);\n }\n });\n }\n\n function configureIlt() {\n $scope.executeAction = checkPrereqsAndLaunch;\n }\n\n function configureAssessment() {\n courseUrlPromise = executeAssessmentPromise;\n closeAction = nonWbtCloseAction;\n $scope.executeAction = launch;\n }\n function executeAssessmentPromise() {\n AssessmentService.fetchSingle(UsersService.getId(), $scope.assignment.id).then(success, failure);\n }\n\n function configureSurvey() {\n courseUrlPromise = executeSurveyPromise;\n closeAction = nonWbtCloseAction;\n $scope.executeAction = launch;\n }\n function executeSurveyPromise() {\n SurveyService.fetchSingle(UsersService.getId(), $scope.assignment.id).then(success, failure);\n }\n\n function configureEvaluation() {\n courseUrlPromise = executeEvaluationPromise;\n closeAction = nonWbtCloseAction;\n $scope.executeAction = launch;\n }\n function executeEvaluationPromise() {\n EvaluationService.fetchSingle(UsersService.getId(), $scope.assignment.id).then(success, failure);\n }\n\n function configureCareerPath() {\n //For career paths, the course id is either the carreer course id or the id, depending if it is manager approval requested or assigned.\n if ($scope.assignment.id === undefined) {\n $scope.assignment.id = $scope.assignment.careerPathCourseID;\n }\n\n if ($scope.assignment.isManagerApprovalRequired === false && $scope.assignment.status === undefined) {\n\n $scope.actionText = \"Add Career Path\";\n\n $scope.executeAction = assignCareerPath;\n } else if ($scope.assignment.isManagerApprovalRequired === true || $scope.assignment.status === \"pendingApproval\") {\n setActionButtonCourseGroupManagerApproval();\n } else {\n $scope.actionText = \"\";\n }\n }\n\n function configureCourseGroupFamily() {\n if ($scope.assignment.isManagerApprovalRequired === false && $scope.assignment.status === \"unknown\") {\n $scope.actionText = \"Add to Electives\";\n \n $scope.executeAction = assignCourseGroup;\n\n } else if ($scope.assignment.isManagerApprovalRequired === true || $scope.assignment.status === \"pendingApproval\") {\n setActionButtonCourseGroupManagerApproval();\n } else {\n $scope.actionText = \"\";\n }\n\n }\n\n function configureTask() {\n $scope.actionText = \"Complete Task\";\n $scope.executeAction = completeTask;\n }\n\n function configureDocument() {\n $scope.actionText = \"Launch\";\n courseUrlPromise = executeDocumentPromise;\n closeAction = nonWbtCloseAction;\n $scope.executeAction = launch;\n }\n\n function executeDocumentPromise() {\n CoursesService.getCourseUrl($scope.assignment.id, $scope.assignment.type, UsersService.getId()).then(success, failure);\n }\n\n function success(success) {\n var assignment = $scope.assignment;\n var uri = null;\n\n if (typeof success !== 'undefined' && typeof success.uri !== 'undefined') {\n uri = success.uri;\n } else if (typeof success !== 'undefined' && typeof success.contentLaunchUrl !== 'undefined') {\n uri = success.contentLaunchUrl;\n } else {\n uri = success;\n }\n var uriAfterOriginCheck = uri.startsWith(\"http\") ? uri : addOriginInfo(uri);\n launchedCourse = window.open(uriAfterOriginCheck);\n\n //open resource flaged to launch with content type URL at the same time\n concurrentOpen = AssignmentsService.checkForCuncurrentOpen(assignment);\n\n //If there is a resource flaged to launch with content, then open that resource\n if (assignment.resourceLaunchWithContent !== 0 && typeof assignment.courseAssets !== \"undefined\" && assignment.courseAssets !== null) {\n assignment.courseAssets.forEach(function (asset) {\n if (asset.id === assignment.resourceLaunchWithContent || asset.courseId === assignment.resourceLaunchWithContent) {\n //new style launch\n if (asset.launchUri === null && $scope.attachTriggered === false) {\n $scope.attachTriggered = true;\n angular.element(document.querySelector('#attachedModal' + $scope.assignment.id)).modal();\n }\n }\n //old style launch\n else {\n setTimeout(function () {\n $window.open(resourceUri, \"popup\", \"width=900,height=600,left=200,top=100\");\n }, 1500);\n }\n \n });\n }\n closeAction();\n }\n\n function failure(failure) {\n setErrorMessage(failure);\n }\n\n function wbtCloseAction() {\n var closeID = $scope.assignment.id;\n $scope.attachTriggered = false;\n\n var timer = setInterval(function () {\n if ((launchedCourse !== null && launchedCourse.closed) || launchedCourse === null) {\n clearInterval(timer);\n\n // set base url as absolute path\n var url = '/';\n\n // get all base tags\n var bases = document.getElementsByTagName('base');\n\n // if there are any reset url to be base 0's href; this way we don't break the Url pattern\n if (bases.length > 0) {\n url = bases[0].href;\n }\n\n\n var transcript = AssignmentsService.fetchSingle(closeID, 'wbt');\n transcript.then(function (transcript) {\n var typeParam = \"assignments\";\n url += 'courses/certificate/' + typeParam + '/' + transcript.transcriptId + '/';\n\n $window.location.href = url;\n });\n }\n }, 500);\n }\n\n function attachCloseAction() {\n var timer = setInterval(function () {\n if ((launchedCourse !== null && launchedCourse.closed) || launchedCourse === null || concurrentOpen) {\n clearInterval(timer);\n $scope.hideAttached();\n courseUrlPromise = executeWbtPromise;\n closeAction = wbtCloseAction;\n $scope.executeAction = checkPrereqsAndLaunch;\n $scope.executeAction();\n }\n }, 500);\n }\n\n function nonWbtCloseAction() {\n var refreshTimer = setInterval(function () {\n if (launchedCourse.closed) {\n clearInterval(refreshTimer);\n $window.location.reload();\n }\n }, 500);\n }\n\n function setActionButtonBehavior() {\n //add NMLS enrollment case\n if ($scope.assignment.isManagerApprovalRequired === true || $scope.assignment.status === \"pendingApproval\") {\n setActionButtonManagerApproval();\n } else {\n setActionButtonLaunchCourse();\n }\n }\n\n function setActionButtonManagerApproval() {\n if ($scope.assignment.status === \"pendingApproval\") {\n $scope.actionText = \"\";\n $scope.statusText = \"Pending Approval\";\n } else if ($scope.assignment.status === 'new' || $scope.assignment.status === 'unsuccessful' || $scope.assignment.status === 'successful' || $scope.assignment.status === 'unknown' || $scope.assignment.status === 'waived') {\n $scope.actionText = \"Request\";\n $scope.executeAction = requestManagerApprovalWbt;\n } else {\n setActionButtonLaunchCourse();\n }\n }\n\n function setActionButtonLaunchCourse() {\n if ($scope.assignment.type === \"courseGroup\" || $scope.assignment.type === \"courseGroupCertification\" || $scope.assignment.type === \"courseGroupCurricula\") {\n $scope.actionText = \"\";\n } else {\n $scope.actionText = \"Launch\";\n launchCourseCallback = launchCourse;\n }\n }\n\n function setActionButtonLaunchIlt() {\n if ($scope.assignment.status === \"pendingApproval\") {\n $scope.statusText = \"Pending Approval\";\n } else if (isHideActionButtonIlt()) {\n $scope.actionText = \"\";\n $scope.statusText = \"\";\n } else {\n $scope.actionText = \"Schedule Course\";\n launchCourseCallback = showIltSchedule;\n }\n }\n\n function isHideActionButtonIlt() {\n var i = 0;\n var result = true;\n for (i = 0; i < $scope.assignment.offerings.length; i++) {\n if (!offeringIsUserRegisteredILT($scope.assignment.offerings[i])) {\n result = false;\n }\n }\n return result || $scope.assignment.offerings.length === 0 || ($scope.assignment.assignedOffering && hasAssignmentStarted());\n }\n\n function hasAssignmentStarted() {\n return $scope.assignment.status === \"inProgress\" || $scope.assignment.status === \"waitlisted\";\n }\n\n function offeringIsUserRegisteredILT(session) {\n return IltRosterUtilities.isUserRegisteredForOffering(session, UsersService.getId());\n }\n\n function showIltSchedule() {\n $scope.isLoading = false;\n $scope.$broadcast(\"openIltScheduleModal\", { assignment: $scope.assignment });\n }\n\n function launch() {\n $scope.isLoading = true;\n launchCourseCallback();\n }\n\n function checkPrereqsAndLaunch() {\n var prereqCall = AssignmentsService.getPrereqs($scope.assignment.id);\n var assignmentLaunched = $scope.assignment;\n\n $scope.isLoading = true;\n prereqCall.then(function (success) {\n if (success.length === 0) {\n launchCourseCallback();\n } else {\n $scope.prereqModalData = success;\n angular.element(document.querySelector('#preReqModal'+$scope.assignment.id)).modal();\n $scope.isLoading = false;\n }\n }, function (failure) {\n setErrorMessage(failure);\n });\n }\n\n function launchCourse() {\n var assignment = $scope.assignment;\n if (assignment.isInCourseGroup) {\n var enrollCoursePromise = CoursesService.getCourseUrl(assignment.isInCourseGroup, assignment.type, UsersService.getId()); // Getting the URL will also enroll (create transcript) for the course.\n enrollCoursePromise.then(function (success) {\n var temp = success;\n });\n }\n $scope.launcherUrlTitle = assignment.name;\n courseUrlPromise();\n }\n\n function assignCourseGroup() {\n assignCourseGroupOrCareerPath(\"Course successfully added to Electives\");\n }\n\n function assignCareerPath() {\n assignCourseGroupOrCareerPath(\"Course successfully added to Career Paths\");\n }\n\n function assignCourseGroupOrCareerPath(successMessage) {\n $scope.isLoading = true;\n var assignCourseGroups = AssignmentsService.assignCourseGroupCourses(UsersService.getId(), $scope.assignment.id);\n assignCourseGroups.then(function (success) {\n $scope.assignment.status = \"new\";\n $scope.actionText = \"\";\n $scope.successMessage = successMessage;\n $scope.isLoading = false;\n $timeout(function () {\n $scope.successMessage = \"\";\n }, 1500);\n }, function (failure) {\n setErrorMessage(failure);\n });\n }\n\n function requestManagerApprovalCourseGroup() {\n $scope.isLoading = true;\n\n var assignCourseGroups = AssignmentsService.assignCourseGroupCourses(UsersService.getId(), $scope.assignment.id);\n assignCourseGroups.then(function (success) {\n\n var approval = CoursesService.requestManagerialApproval($scope.assignment.id, $scope.assignment.type, UsersService.getId(), 0);\n approval.then(function (success) {\n $scope.isLoading = false;\n $scope.actionText = \"\";\n if ($scope.assignment.type.toLowerCase() === \"careerpath\") {\n $scope.assignment.careerPathStatus = \"pendingApproval\";\n } else {\n $scope.assignment.status = \"pendingApproval\";\n }\n $scope.statusText = \"Pending Approval\";\n }, function (failure) {\n setErrorMessage(failure);\n });\n $timeout(function () {\n $scope.successMessage = \"\";\n }, 1500);\n }, function (failure) {\n setErrorMessage(failure);\n });\n }\n\n function setActionButtonCourseGroupManagerApproval() {\n if ($scope.assignment.status === \"pendingApproval\") {\n $scope.actionText = \"\";\n $scope.statusText = \"Pending Approval\";\n } else if ($scope.assignment.status === 'new' || $scope.assignment.status === 'unsuccessful' || $scope.assignment.status === 'successful' || $scope.assignment.status === 'unknown' || $scope.assignment.status === 'waived' || $scope.assignment.status === undefined) {\n $scope.actionText = \"Request\";\n $scope.executeAction = requestManagerApprovalCourseGroup;\n }\n }\n\n function setErrorMessage(failure) {\n $scope.isLoading = false;\n $scope.statusText = \"\";\n $scope.productError.setError(failure.ErrorCode, failure.ErrorMessage);\n $timeout(function () {\n $scope.productError.reset();\n }, 3000);\n }\n\n function addOriginInfo(uri) {\n /**\n * Origin is undefined in IE, which it then takes and uses as a string to concatenate.\n * We need to ensure that location.origin is set, so we don't get funky URLs.\n */\n var origin = typeof window.location.origin !== 'undefined' ? window.location.origin : '';\n\n if (uri.indexOf(origin) === -1) {\n uri = origin + uri;\n }\n\n return uri;\n }\n\n function requestManagerApprovalWbt() {\n $scope.isLoading = true;\n var approval = CoursesService.requestManagerialApproval($scope.assignment.id, $scope.assignment.type, UsersService.getId(), 0);\n approval.then(function (success) {\n $scope.isLoading = false;\n $scope.actionText = \"\";\n $scope.statusText = \"Pending Approval\";\n $scope.assignment.status = \"pendingApproval\";\n }, function (failure) {\n setErrorMessage(failure);\n });\n }\n\n function completeTask() {\n var completion = CoursesService.completeTask($scope.assignment.id, UsersService.getId());\n $scope.isLoading = true;\n\n completion.then(function (success) {\n $scope.actionText = \"\";\n $scope.successMessage = \"Task completed successfully\";\n $scope.isLoading = false;\n $timeout(function () {\n $scope.successMessage = \"\";\n window.location.reload();\n }, 1500);\n\n }, function (failure) {\n setErrorMessage(failure);\n });\n }\n }\n\n})();","app.controller(\"adminHeaderController\", [\n \"$rootScope\",\n \"$location\",\n \"SettingsService\",\n \"UsersService\",\n \"BillingService\",\n function ($rootScope, $location, SettingsService, UsersService, BillingService) {\n $rootScope.settingsIsLoading = true;\n $rootScope.isDashboardDisabledBecauseOfTraffic = sessionStorage.getItem('disableDashboard') === 'true';\n $rootScope.invoices = {};\n $rootScope.overdueBannerLoading = true;\n $rootScope.isAdmin = UsersService.hasAdminRole();\n\n var getOverdueBanner = function(){\n {\n var overdueInvoices = BillingService.getOverdueInvoices();\n overdueInvoices.then(function (success) {\n $rootScope.invoices = success;\n if($rootScope.invoices.totalOverdue >= 100){\n $rootScope.overdueBannerLoading = false;\n }\n }, function(failure){\n throw failure;\n });\n }\n };\n\n SettingsService.getSettings().then(function (success) {\n $rootScope.enableAdminDashboardTab = SettingsService.isILTEnabled();\n $rootScope.enableCareerPathingTab = SettingsService.isCareerPathEnabled();\n $rootScope.enableTrainingInsightsTab =\n SettingsService.isTrainingInsightsEnabled();\n $rootScope.isOverdue = SettingsService.isOverdueBannerEnabled();\n $rootScope.settingsIsLoading = false;\n\n var path = $location.$$path.toLowerCase();\n if (\n (path.startsWith(\"/insights/\") &&\n !$rootScope.enableTrainingInsightsTab) ||\n (path.startsWith(\"/dashboard/\") && !$rootScope.enableCareerPathingTab)\n ) {\n if ($rootScope.enableAdminDashboardTab) {\n $location.url(\"admin/dashboard\");\n } else {\n $location.url(\"users/home\");\n }\n }\n\n if($rootScope.isOverdue && !$rootScope.settingsIsLoading && $rootScope.isAdmin){\n getOverdueBanner(); \n }\n });\n\n $rootScope.goToHomeTab = function () {\n if ($rootScope.enableAdminDashboardTab && !$rootScope.isDashboardDisabledBecauseOfTraffic) {\n $location.url(\"admin/dashboard\");\n } else {\n $location.url(\"users/home\");\n }\n };\n\n var originatorEv;\n\n $rootScope.openMenu = function ($mdMenu, ev) {\n originatorEv = ev;\n $mdMenu.open(ev);\n };\n\n $rootScope.logout = function () {\n var portalCode = UsersService.getPortalCode();\n var logout = UsersService.clearSession();\n logout.then(\n function (success) {\n // If a user's portal code existed while being logged in, persist it on the logged out state.\n if (portalCode !== \"\" && portalCode !== null) {\n // alert('logging out with portalCode');\n portalCode = \"?portal=\" + portalCode;\n }\n\n $location.url(\"/\" + portalCode);\n },\n function (failure) {}\n );\n };\n\n $rootScope.adminTabIds = {\n people: \"people\",\n content: \"content\",\n rules: \"rules\",\n management: \"management\",\n insights: \"insights\",\n careerPathing: \"careerPathing\",\n };\n\n Object.freeze($rootScope.adminTabIds);\n\n $rootScope.getSelectedAdminTab = function () {\n var path = $location.$$path.toLowerCase();\n if (path.includes(\"/users/\")) {\n return $rootScope.adminTabIds.people;\n } else if (path.startsWith(\"/courses/\")) {\n return $rootScope.adminTabIds.content;\n } else if (path.startsWith(\"/rules/\")) {\n return $rootScope.adminTabIds.rules;\n } else if (path.startsWith(\"/management/\")) {\n return $rootScope.adminTabIds.management;\n } else if (path.startsWith(\"/insights/\")) {\n return $rootScope.adminTabIds.insights;\n } else if (path.startsWith(\"/dashboard/\")) {\n return $rootScope.adminTabIds.careerPathing;\n } else {\n return $rootScope.adminTabIds.people;\n }\n };\n\n $rootScope.selectedAdminTab = $rootScope.getSelectedAdminTab();\n\n $rootScope.redirectByActiveTab = function () {\n switch ($rootScope.selectedAdminTab) {\n case \"dashboard\":\n window.open(\n \"https://ld-connect.bai.org/learning-manager/training-administrator-user-manual/#Dashboard\",\n \"_blank\"\n );\n break;\n case \"people\":\n window.open(\n \"https://ld-connect.bai.org/learning-manager/training-administrator-user-manual/#People\",\n \"_blank\"\n );\n break;\n case \"content\":\n window.open(\n \"https://ld-connect.bai.org/learning-manager/training-administrator-user-manual/#Content\",\n \"_blank\"\n );\n break;\n case \"rules\":\n window.open(\n \"https://ld-connect.bai.org/learning-manager/training-administrator-user-manual/#Rules\",\n \"_blank\"\n );\n break;\n case \"management\":\n window.open(\n \"https://ld-connect.bai.org/learning-manager/training-administrator-user-manual/#Management\",\n \"_blank\"\n );\n break;\n case \"recommendations\":\n window.open(\n \"https://ld-connect.bai.org/learning-manager/training-administrator-user-manual/#Recommendations\",\n \"_blank\"\n );\n break;\n case \"insights\":\n window.open(\n \"https://ld-connect.bai.org/learning-manager/training-administrator-user-manual/#Training-Insights\",\n \"_blank\"\n );\n break;\n case \"careerPathing\":\n window.open(\n \"https://ld-connect.bai.org/learning-manager/training-administrator-user-manual/#Create-Career-Path\",\n \"_blank\"\n );\n break;\n default:\n break;\n }\n };\n\n $rootScope.helpMenuClick = function (menuItem) {\n switch (menuItem) {\n case \"usermanuals\":\n $rootScope.redirectByActiveTab();\n break;\n case \"trainingvideos\":\n console.log(\"clicked\");\n window.open(\n \"https://ld-connect.bai.org/learning-manager/watch-instructional-videos/\",\n \"_blank\"\n );\n break;\n case \"faqs\":\n window.open(\n \"https://ld-connect.bai.org/learning-manager/frequently-asked-questions/\",\n \"_blank\"\n );\n break;\n case \"walkthroughs\":\n window.open(\n \"https://ld-connect.bai.org/learning-manager/walkthrough-videos/\",\n \"_blank\"\n );\n break;\n case \"ldconnect\":\n window.open(\"https://ld-connect.bai.org/\", \"_blank\");\n break;\n case \"contactus\":\n window.open(\n \"https://ld-connect.bai.org/learning-manager/technical-support/\",\n \"_blank\"\n );\n break;\n default:\n break;\n }\n };\n\n $rootScope.getPDF = function(invoiceId) {\n $rootScope.pdfError = { occurred: false, invoiceId: invoiceId};\n var pdf = BillingService.getInvoicePDF(invoiceId);\n pdf.then(function (success) {\n var pdf = new Blob([success], {type: 'application/pdf'});\n var pdfURL = window.URL.createObjectURL(pdf);\n window.open(pdfURL);\n }, function(failure){\n $rootScope.pdfError.occurred = true;\n });\n };\n },\n]);\n","(function () {\n catalog.controller(\"applicationLibraryMenuController\", [\n \"$scope\",\n \"$http\",\n \"UsersService\",\n \"SettingsService\",\n \"CssService\",\n applicationLibraryMenuController,\n ]);\n\n function applicationLibraryMenuController(\n $scope,\n $http,\n UsersService,\n SettingsService\n ) {\n $scope.isMenuOpen = false;\n\n $scope.toggleMenu = function () {\n $scope.isMenuOpen = !$scope.isMenuOpen;\n };\n\n SettingsService.getSettings().then(function (success) {\n $scope.isPlmEnabled = success.features.enableLmsPlmIntegration;\n });\n\n $scope.hasNotifications = false;\n $scope.initiated = false;\n $scope.alertCount = 0;\n\n $scope.fetchNotifications = function () {\n UsersService.getPlmAlerts().then(\n function (response) {\n $scope.alertCount = response;\n $scope.hasNotifications = $scope.alertCount > 0;\n $scope.initiated = true;\n },\n function error(error) {\n console.error(\"Error fetching notifications: \", error);\n $scope.initiated = true;\n }\n );\n };\n\n $scope.formatUserParams = function () {\n var payload = {};\n\n //handle user id with context service\n if (UsersService.user.firstName) {\n payload.givenName = UsersService.user.firstName.toString();\n }\n if (UsersService.user.lastName) {\n payload.surname = UsersService.user.lastName.toString();\n }\n if (UsersService.user.email) {\n payload.email = UsersService.user.email.toString();\n }\n if (UsersService.user.userName) {\n payload.username = UsersService.user.userName.toString();\n }\n //handle guid in api service\n\n var loc = window.location.hostname.toLowerCase();\n var redirectUrl = \"https://policy.bai.org/lms_router\";\n if (loc.includes(\"dev\")) {\n redirectUrl = \"https://plm-dev-app1.bai.org/lms_router\";\n }\n if (loc.includes(\"qa\")) {\n redirectUrl = \"https://plm-qa-app1.bai.org/lms_router\";\n }\n if (loc.includes(\"uat\")) {\n redirectUrl = \"https://plm-qa-app1.bai.org/lms_router\";\n }\n if (loc.includes(\"local\")) {\n redirectUrl = \"https://plm-dev-app1.bai.org/lms_router\";\n }\n\n UsersService.getSignedJwt(payload).then(function (response) {\n var signedToken = response.data;\n var stateUrl = btoa(window.location.hostname.toLowerCase());\n window.location.href = redirectUrl + \"?id_token=\" + signedToken;\n });\n };\n\n $scope.fetchNotifications();\n }\n})();\n","/* This controller displays the successful/unsuccessful certificates */\napp.controller('assignmentsTaController', ['$sce', '$scope', '$route', '$window', 'RoleMapsMixin', 'UsersService', 'BreadcrumbsService', function ($sce, $scope, $route, $window, RoleMapsMixin, UsersService, BreadcrumbsService) {\n var currentMethod = $route.current.params.name;\n\n var _this = this;\n\n $scope.courseFailure = false;\n $scope.isLoading = true;\n\n $scope.user = UsersService;\n\n $scope.homeAction = function() {};\n\n $scope.dump = function(data) { console.warn(data); };\n\n\n /**** Load role specific functionality ****/\n /* This function takes the scope object\n * and overrides anything specific to the current page\n * or role.\n */\n RoleMapsMixin.overrideScope($scope);\n\n /* Call route action like homeAction here.\n * Return 404 if action doesn't exist after\n * injecting mixin. For example, if a certain role\n * doesn't have an ILT calendar, they will get a 404\n * Not every role needs every page.\n * Please follow the routing structure; non-alphanumeric characters should not be used.\n */\n $scope[currentMethod + 'Action']();\n}]);\n","(function () {\n catalog.controller('baiCatalogHeaderController', ['$scope', '$rootScope', '$location', '$timeout', '$q', 'CatalogSearchParameters', 'SearchServices', 'UsersService', 'SettingsService', baiCatalogHeaderController]);\n\n function baiCatalogHeaderController($scope, $rootScope, $location, $timeout, $q, CatalogSearchParameters, SearchServices, UsersService, SettingsService) {\n\n var _this = this;\n $scope.showDocuments = false;\n $scope.isSettingsLoading = true;\n $scope.fromWeb = $rootScope.fromWeb;\n\n var documentPromises = [];\n documentPromises.push(SettingsService.getSettings());\n documentPromises.push(SearchServices.getDocumentCount());\n\n if (!$scope.fromWeb) {\n $q.all(documentPromises).then(function (success) {\n $scope.isSettingsLoading = false;\n var isDocumentsEnabled = SettingsService.isDocumentsEnabled();\n var documentCount = success[1];\n if (isDocumentsEnabled === true && documentCount > 0) {\n $scope.showDocuments = true;\n }\n }, function (failure) {\n $scope.isSettingsLoading = false;\n });\n }\n\n $scope.synonyms = [];\n $scope.showSuggestions = false;\n $scope.showLDConnect = false;\n if ($scope.fromWeb) {\n $scope.showLDConnect = false;\n } else {\n $scope.showLDConnect = UsersService.hasAdminRole();\n }\n\n _this.synonymsMap = [];\n _this.minLength = 3;\n _this.currentFocus = -1;\n _this.delayedSuggestions = null;\n _this.skipDiv = [\"synonyms-divider\", \"suggestions-header\", \"courses-header\"];\n\n $scope.executeSearch = function () {\n if ($scope.queryText.length < _this.minLength) {\n return;\n }\n if ($scope.fromWeb === false) {\n var context = UsersService.setUserContext('student');\n context.then(function () {\n CatalogSearchParameters.clearBreadcrumbs();\n CatalogSearchParameters.fromBrowse = false;\n CatalogSearchParameters.browseFilter = {};\n CatalogSearchParameters.addQueryText($scope.queryText);\n $location.url('catalog/search/?query=' + $scope.queryText);\n });\n } else {\n CatalogSearchParameters.clearBreadcrumbs();\n CatalogSearchParameters.breadcrumbs.push({ name: \"Home\", link: \"/\" });\n CatalogSearchParameters.breadcrumbs.push({ name: \"search\", link: \"\" });\n CatalogSearchParameters.fromBrowse = false;\n CatalogSearchParameters.browseFilter = {};\n CatalogSearchParameters.addQueryText($scope.queryText);\n $location.path('search');\n }\n };\n\n $scope.queryText = \"\";\n if (window.query) {\n if (!window.location.pathname.includes(\"/courses/certificate/assignments\")) {\n $scope.queryText = window.query;\n $scope.executeSearch();\n }\n delete window.query;\n }\n $scope.queryTextOriginal = $scope.queryText;\n\n _this.getSynonymsMap = function () {\n var map = SearchServices.getSynonymsMap();\n map.then(function (success) {\n _this.synonymsMap = success;\n }, function (error) {\n console.log(error);\n });\n };\n _this.getSynonymsMap();\n\n _this.getSuggestions = function () {\n _this.closeAllLists();\n\n if (typeof $scope.queryText === 'undefined') {\n return;\n }\n\n $scope.queryTextOriginal = $scope.queryText;\n //special handling for 2 character synonyms\n if ($scope.queryText.length === 2) {\n $scope.synonyms = _this.getSynonyms($scope.queryText);\n $scope.showSuggestions = $scope.synonyms.length > 0;\n return;\n } else if ($scope.queryText.length < _this.minLength) {\n return;\n }\n\n var suggestions = SearchServices.getSuggestions($scope.queryText);\n suggestions.then(function (success) {\n _this.delayedSuggestions = null;\n $scope.products = success;\n $scope.synonyms = _this.getSynonyms($scope.queryText);\n $scope.showSuggestions = $scope.products.length > 0 || $scope.synonyms.length > 0;\n }, function (error) {\n _this.delayedSuggestions = null;\n console.log(error);\n });\n };\n\n _this.getSynonyms = function (term) {\n var valLower = term.toLowerCase().trim();\n if (typeof _this.synonymsMap[valLower] !== 'undefined') {\n return _this.synonymsMap[valLower].synonyms;\n }\n else return [];\n };\n\n $scope.delaySuggestions = function () {\n\n if (_this.delayedSuggestions !== null) {\n $timeout.cancel(_this.delayedSuggestions);\n }\n\n _this.delayedSuggestions = _this.delay();\n };\n\n _this.delay = function () {\n return $timeout(function () {\n return _this.getSuggestions();\n }, 500);\n };\n\n $scope.handleKeys = function (e) {\n //escape will close the dropdown and revert to original text\n if (e.keyCode === 27) {\n _this.handleEscape(e, x);\n return;\n }\n\n var x = document.getElementById(\"autocomplete-list\");\n\n if (x === null) {\n if (e.keyCode === 13) {\n //enter and no suggestions open\n _this.handleEnterOnInput(e, x);\n return;\n }\n }\n\n if (x) {\n x = x.getElementsByClassName(\"suggestion-row\");\n }\n\n if (e.keyCode === 40) {\n //arrow down\n _this.handleArrowDown(e, x);\n\n } else if (e.keyCode === 38) {\n //up arrow\n _this.handleArrowUp(e, x);\n } else if (e.keyCode === 13) {\n //enter\n _this.handleEnterOnSuggestion(e, x);\n }\n };\n\n $scope.handleMouseOver = function (e) {\n $scope.removeActive();\n $scope.resetCurrentFocus();\n };\n\n $scope.clickSynonym = function (e, text) {\n $scope.removeActive();\n _this.closeAllLists();\n $scope.queryText = text;\n _this.getSuggestions();\n };\n\n $scope.clickProduct = function (e, product) {\n $scope.removeActive();\n _this.closeAllLists();\n $scope.queryText = product.name;\n if ($scope.fromWeb) {\n $location.url(product.detailsUri);\n }\n else {\n var context = UsersService.setUserContext('student');\n context.then(function () {\n $location.url(product.detailsUri);\n });\n }\n };\n\n $scope.clickSeeAll = function (e, text) {\n $scope.removeActive();\n _this.closeAllLists();\n $scope.queryText = text;\n $scope.executeSearch();\n };\n\n $scope.addActive = function (x) {\n if (!x) return false;\n $scope.removeActive(x);\n x[_this.currentFocus].classList.add(\"autocomplete-active\");\n };\n\n $scope.removeActive = function (x) {\n if (typeof x === 'undefined') {\n x = document.getElementById(\"autocomplete-list\").getElementsByTagName(\"div\");\n }\n for (var i = 0; i < x.length; i++) {\n x[i].classList.remove(\"autocomplete-active\");\n }\n };\n\n $scope.resetCurrentFocus = function () {\n _this.currentFocus = -1;\n };\n\n _this.closeAllLists = function () {\n $scope.resetCurrentFocus();\n $scope.queryTextOriginal = \"\";\n $scope.showSuggestions = false;\n $scope.products = [];\n $scope.synonyms = [];\n };\n\n _this.skipThis = function (divId) {\n if (typeof divId === 'undefined') {\n return false;\n }\n\n var skip = false;\n for (var i = 0; i < _this.skipDiv.length; i++) {\n if (_this.skipDiv[i] === divId) {\n return true;\n }\n }\n return skip;\n };\n\n //close when clicking outside the suggestions drop-down\n window.onclick = function (e) {\n var SUGGESTION_ROW = '.suggestion-row';\n var targetIsSuggestion;\n if (e.target) {\n if (e.target.matches) {\n targetIsSuggestion = e.target.matches(SUGGESTION_ROW);\n } else if (e.target.msMatchesSelector) {\n targetIsSuggestion = e.target.msMatchesSelector(SUGGESTION_ROW);\n }\n }\n var parentIsSuggestion;\n if (e.target.parentNode) {\n if (e.target.parentNode.matches) {\n parentIsSuggestion = e.target.parentNode.matches(SUGGESTION_ROW);\n } else if (e.target.parentNode.msMatchesSelector) {\n parentIsSuggestion = e.target.parentNode.msMatchesSelector(SUGGESTION_ROW);\n }\n }\n if (!targetIsSuggestion && !parentIsSuggestion) {\n $scope.showSuggestions = false;\n $scope.$digest();\n }\n };\n\n _this.handleArrowDown = function (e, x) {\n if (x === null) {\n if ($scope.queryText.length >= _this.minLength) {\n _this.getSuggestions();\n }\n else if ($scope.queryText.length === 2) {\n $scope.queryTextOriginal = $scope.queryText;\n $scope.synonyms = _this.getSynonyms($scope.queryText);\n $scope.showSuggestions = $scope.synonyms.length > 0;\n }\n return;\n }\n\n e.preventDefault();\n _this.currentFocus++;\n\n if (x !== null && typeof x[_this.currentFocus] !== 'undefined')\n while (_this.skipThis(x[_this.currentFocus].id)) {\n _this.currentFocus++;\n }\n if (_this.currentFocus < x.length) {\n $scope.addActive(x);\n if (x) {\n $scope.queryText = x[_this.currentFocus].getAttribute(\"term\");\n }\n }\n else {\n _this.currentFocus--;\n }\n };\n\n _this.handleArrowUp = function (e, x) {\n if (x === null || _this.currentFocus === -1) {\n return;\n }\n\n e.preventDefault();\n _this.currentFocus--;\n\n while (_this.skipThis(x[_this.currentFocus].id) && _this.currentFocus > 0) {\n _this.currentFocus--;\n }\n\n if (_this.currentFocus === 0) {\n $scope.queryText = $scope.queryTextOriginal;\n _this.closeAllLists();\n }\n else {\n $scope.addActive(x);\n $scope.queryText = x[_this.currentFocus].getAttribute(\"term\");\n }\n };\n\n _this.handleEnterOnSuggestion = function (e, x) {\n e.preventDefault();\n if (x) {\n var productId = x[_this.currentFocus].getAttribute(\"productId\");\n var detailsUri = x[_this.currentFocus].getAttribute(\"detailsUri\");\n\n if (productId !== null) {\n $scope.removeActive();\n _this.closeAllLists();\n if ($scope.fromWeb) {\n $location.url(detailsUri);\n }\n else {\n var context = UsersService.setUserContext('student');\n context.then(function () {\n $location.url(detailsUri);\n });\n }\n\n } else if (_this.currentFocus > -1) {\n $scope.queryText = x[_this.currentFocus].getAttribute(\"term\");\n _this.closeAllLists();\n $scope.executeSearch();\n }\n }\n };\n\n _this.handleEscape = function (e, x) {\n var queryText = $scope.queryTextOriginal === \"\" ? $scope.queryText : $scope.queryTextOriginal;\n _this.closeAllLists();\n $scope.queryText = queryText;\n };\n _this.handleEnterOnInput = function (e, x) {\n e.preventDefault();\n if ($scope.queryText.length >= _this.minLength) {\n $scope.executeSearch();\n }\n };\n\n $scope.openLibrary = function () {\n var context = UsersService.setUserContext('student');\n context.then(function () {\n $location.url('catalog');\n });\n };\n\n $scope.openDocumentsLibrary = function () {\n var context = UsersService.setUserContext('student');\n context.then(function () {\n $location.url('documents-catalog');\n });\n };\n\n $scope.openIltCalendar = function () {\n var context = UsersService.setUserContext('student');\n context.then(function () {\n $location.url('users/ilt-calendar');\n });\n };\n }\n})();","(function () {\n catalog.controller(\"catalogController\", [\"$scope\", \"$route\", catalogController]);\n\n function catalogController($scope, $route) {\n console.log($route);\n var controllerRoute = $route.current.params.controller;\n $scope.homeTemplate = \"app/templates/\"+ controllerRoute+ \"/home.html\";\n if ($route.current.params.name === \"search\") {\n $scope.homeTemplate = \"app/templates/\"+ controllerRoute+ \"/search.html\";\n }\n else if ($route.current.params.name === \"product\") {\n $scope.homeTemplate = \"app/templates/\"+ controllerRoute+ \"/productDetails.html\";\n }\n else if ($route.current.params.controller === \"documents-catalog\") {\n $scope.homeTemplate = \"app/templates/documents-catalog/home.html\";\n }\n }\n})();","/* This controller displays the successful/unsuccessful certificates */\napp.controller('coursesController', ['$sce', '$scope', '$route', '$window', '$location', 'RoleMapsMixin', 'CoursesService', 'UsersService', 'SettingsService', 'BreadcrumbsService', 'AssignmentsService', 'TranscriptsService', function ($sce, $scope, $route, $window, $location, RoleMapsMixin, CoursesService, UsersService, SettingsService, BreadcrumbsService, AssignmentsService, TranscriptsService) {\n var currentMethod = $route.current.params.name;\n\n var _this = this;\n var breadcrumbType = \"\";\n var concurrentOpen = false;\n\n $scope.courseFailure = false;\n $scope.isLoading = true;\n $scope.requestingApproval = false;\n $scope.attachTriggered = false;\n $scope.hideAttached = function () { jQuery('#attachedModal' + $scope.assignment.id).hide(); };\n\n $scope.user = UsersService;\n\n $scope.certificateAction = function () {\n $scope.defaultHeader = false;\n $scope.homeTemplate = \"app/templates/courses/components/certHome.html\";\n var params = $route.current.params.param.split('/');\n /* By default this page works for an admin user\n * who is able to view the transcript of any student at any time\n * If they're not an admin user and they're just completing a course\n * take the user id from the currently logged in user\n * because this is a student completing courses under their own name */\n breadcrumbType = params[0];\n var transcriptId = params[1];\n var studentId = params[2];\n if (studentId === \"\") {\n studentId = $scope.user.user.id;\n }\n \n if (SettingsService.maxEnrollmentAttemptsAllowed === -1)\n {\n var settings = SettingsService.getSettings();\n\n settings.then(function (success) {\n _this.assignmentGet(studentId, transcriptId);\n }, function (failure) {\n _this.assignmentGet(studentId, transcriptId);\n });\n }\n else\n {\n _this.assignmentGet(studentId, transcriptId);\n } \n };\n\n _this.assignmentGet = function (studentId, transcriptId) {\n var assignment = TranscriptsService.getSingleTranscript(studentId, transcriptId); \n\n assignment.then(function(success) {\n _this.assignmentGetSuccess(success);\n },\n function(error) {\n $scope.courseFailure = true;\n $scope.isLoading = false;\n });\n };\n\n _this.assignmentGetSuccess = function(success) {\n $scope.completionView = 'app/templates/courses/components/unsuccessful.html';\n\n $scope.assignment = success;\n $scope.launchButtonText = \"Relaunch\";\n $scope.requestingApproval = false;\n $scope.isLoading = false;\n\n $scope.isSaba = UsersService.isSaba();\n \n if (!$scope.isSaba && (success.isManagerApprovalRequired && success.isManagerApprovalRequired === true) && success.status !== \"inProgress\") {\n $scope.launchButtonText = \"Request Approval\";\n $scope.requestingApproval = true;\n }\n\n _this.BreadcrumbsService = BreadcrumbsService;\n\n // Assign english name to assignment\n if ($scope.assignment.type === 'wbt') {\n $scope.fullTypeName = 'Web Based';\n } else if ($scope.assignment.type === 'ilt') {\n $scope.fullTypeName ='Instructor Led';\n } else {\n $scope.fullTypeName = $scope.assignment.type;\n }\n\n //NMLS - If bsiAuth is set to true, set it to false. This ensures that the user will be prompted by \n //biosig if they relaunch the NMLS course\n if (localStorage.getItem('bsiAuthenticated') !== null && localStorage.getItem('bsiAuthenticated') === 'true') {\n localStorage.setItem('bsiAuthenticated', 'false');\n }\n\n if (success.status === \"successful\") {\n // format the completion date\n $scope.completionView = 'app/templates/courses/components/successful.html';\n\n $scope.generateBreadCrumbs('Successful');\n } else {\n $scope.generateBreadCrumbs('Unsuccessful');\n }\n };\n\n $scope.generateBreadCrumbs = function (CourseStatus) {\n var breadcrumbs = '';\n\n var homeBreadcrumbName = \"My Dashboard\";\n var homeBreadcrumbPath = \"student/home\";\n if (breadcrumbType === \"careerpaths\") {\n homeBreadcrumbName = \"career Paths\";\n homeBreadcrumbPath = \"users/home/careerpaths\";\n _this.BreadcrumbsService.create(homeBreadcrumbName, homeBreadcrumbPath);\n }\n BreadcrumbsService.createHomeBreadcrumb(UsersService.homeRole);\n _this.BreadcrumbsService.pushCrumb(\"transcripts\", 'users/transcripts');\n\n if (CourseStatus === \"unsuccessful\") {\n _this.BreadcrumbsService.pushCrumb('Unsuccessful');\n } else if (CourseStatus === \"successful\") {\n _this.BreadcrumbsService.pushCrumb('Successful');\n } else {\n _this.BreadcrumbsService.pushCrumb(CourseStatus);\n }\n\n $scope.breadcrumbs = $sce.trustAsHtml(breadcrumbs);\n };\n\n $scope.selectAll = {};\n $scope.checkAll = function () {\n _.each($scope.rows, function (row) {\n row.select = $scope.selectAll.checked;\n });\n };\n\n $scope.addOriginInfo = function (uri) {\n\n /**\n * Origin is undefined in IE, which it then takes and uses as a string to concatenate.\n * We need to ensure that location.origin is set, so we don't get funky URLs.\n */\n var origin = typeof window.location.origin !== 'undefined' ? window.location.origin : '';\n\n if (uri.indexOf(origin) === -1) {\n uri = origin + uri;\n }\n\n return uri;\n };\n\n $scope.launchCourse = function (assignment) {\n if (assignment.type !== 'wbt' && assignment.type !== 'survey' && assignment.type !== 'evaluation') {\n return;\n }\n\n var isDocument = false;\n var launchedCourse = null;\n var single = {};\n \n $scope.assignment = assignment;\n $scope.launcherUrlTitle = assignment.name;\n\n $scope.launchCourseLoader = true;\n jQuery('#launchCourseLoader-' + assignment.id).toggle();\n jQuery('#launchCourseLoaderPlayButton-' + assignment.id).toggle();\n\n if ($scope.requestingApproval === true) {\n jQuery('#launchbutton-' + assignment.id).toggle();\n }\n if ((assignment.resourceLaunchWithContent !== 0 && typeof assignment.courseAssets !== \"undefined\" && assignment.courseAssets !== null) && !($scope.attachTriggered))\n {\n assignment.courseAssets.forEach(function (asset) {\n if (asset.id === assignment.resourceLaunchWithContent || asset.courseId === assignment.resourceLaunchWithContent) {\n //asset.type = \"other\";\n isDocument = true;\n single = CoursesService.getCourseUrl(parseInt(asset.courseId), asset.type, UsersService.getId());\n }\n });\n }\n else \n {\n switch (assignment.type) {\n case 'wbt':\n single = CoursesService.getCourseUrl(assignment.id, assignment.type, UsersService.getId());\n \n break;\n case 'evaluation':\n single = EvaluationService.fetchSingle(UsersService.getId(), assignment.offeringId);\n \n break;\n case 'survey':\n single = SurveyService.fetchSingle(UsersService.getId(), assignment.id);\n \n break;\n } \n }\n\n single.then(function (success) {\n var uri = null;\n\n if (typeof success !== 'undefined' && typeof success.uri !== 'undefined') {\n uri = success.uri;\n } else if (typeof success !== 'undefined' && typeof success.contentLaunchUrl !== 'undefined') {\n uri = success.contentLaunchUrl;\n } else {\n uri = success;\n }\n\n // If the course is in a course group, make a transcript for the course group as well.\n if (assignment.isInCourseGroup) {\n var enrollCoursePromise = CoursesService.getCourseUrl(assignment.isInCourseGroup, assignment.type, UsersService.getId()); // Getting the URL will also enroll (create transcript) for the course.\n enrollCoursePromise.then(function (success) {\n // Don't do anything. There is no url for the course group course but we still need to create a transcript\n });\n }\n\n //NMLS - If the course is not new and it is a NMLS course, set the NMLSResumeCourse value to true \n // to be used as a parameter posted to BioSig\n if (assignment.isNMLS && assignment.status.toLowerCase() !== 'new') {\n localStorage.setItem(\"NMLSResumeCourse\", \"true\");\n } else { localStorage.setItem(\"NMLSResumeCourse\", \"false\"); }\n\n var uriAfterOriginCheck = uri.startsWith(\"http\") ? uri : $scope.addOriginInfo(uri);\n var launchedCourse = window.open(uriAfterOriginCheck);\n\n //open resource flaged to launch with content type URL at the same time\n concurrentOpen = AssignmentsService.checkForCuncurrentOpen(assignment);\n\n //If there is a resource flaged to launch with content, then open that resource\n if (assignment.resourceLaunchWithContent !== 0 && typeof assignment.courseAssets !== \"undefined\" && assignment.courseAssets !== null) {\n assignment.courseAssets.forEach(function (asset) {\n if (asset.id === assignment.resourceLaunchWithContent || asset.courseId === assignment.resourceLaunchWithContent) {\n //new style launch\n if (asset.launchUri === null && $scope.attachTriggered === false) {\n angular.element(document.querySelector('#attachedModal' + $scope.assignment.id)).modal();\n $scope.attachTriggered = true;\n }\n }\n //old style launch\n else {\n setTimeout(function () {\n $window.open(resourceUri, \"popup\", \"width=900,height=600,left=200,top=100\");\n }, 1500);\n }\n });\n }\n\n /**\n * Ensure we don't show certificate page on this type;\n */\n if(assignment.type !== 'wbt') {\n return;\n }\n\n var curTranscript = null;\n\n var transcript = AssignmentsService.fetchSingle(assignment.id, assignment.type);\n transcript.then(function(transcript) {\n curTranscript = transcript;\n });\n\n var timer = setInterval(function () {\n if ((launchedCourse !== null && launchedCourse.closed) || launchedCourse === null || concurrentOpen) {\n clearInterval(timer);\n\n if ($scope.attachTriggered && isDocument)\n {\n $scope.hideAttached();\n $scope.launchCourse(assignment);\n }\n else{\n\n // set base url as absolute path\n var url = '/';\n\n // get all base tags\n var bases = document.getElementsByTagName('base');\n\n // if there are any reset url to be base 0's href; this way we don't break the Url pattern\n if (bases.length > 0) {\n url = bases[0].href;\n }\n var breadcrumbParam = \"assignments\";\n if (breadcrumbType && breadcrumbType !== \"\") {\n breadcrumbParam = breadcrumbType;\n }\n \n // combine and enjoy\n url += 'courses/certificate/'+ breadcrumbParam + '/' + curTranscript.transcriptId + '/';\n\n $window.location.href = url;\n }\n }\n }, 500);\n }, function (failure) {\n if ($scope.requestingApproval || failure.ErrorMessage.indexOf(\"pending manager approval\") > 0) {\n UsersService.navigateToHome();\n }\n jQuery('#launchCourseLoader-' + assignment.id).toggle();\n jQuery('#launchCourseLoaderPlayButton-' + assignment.id).toggle();\n\n $scope.launchCourseLoader = false;\n $scope.mainErrorFailure = true;\n $scope.mainErrorFailureMessage = 'There was a problem launching your course! Please try again later.';\n\n jQuery('#topErrorMessage').slideDown(function () {\n var _this = jQuery(this);\n\n setTimeout(function () {\n _this.slideUp(500);\n\n $scope.mainErrorFailure = false;\n }, 2000);\n });\n });\n };\n $scope.dump = function(data) { console.warn(data); };\n\n\n /**** Load role specific functionality ****/\n /* This function takes the scope object\n * and overrides anything specific to the current page\n * or role.\n */\n RoleMapsMixin.overrideScope($scope);\n\n /* Call route action like homeAction here.\n * Return 404 if action doesn't exist after\n * injecting mixin. For example, if a certain role\n * doesn't have an ILT calendar, they will get a 404\n * Not every role needs every page.\n * Please follow the routing structure; non-alphanumeric characters should not be used.\n */\n if (currentMethod === 'ilt-calendar') {\n $scope.iltCalendarAction();\n } else {\n $scope[currentMethod + 'Action']();\n }\n}]);\n","app.controller('dashboardController', ['$route', '$scope', 'RoleMapsMixin', function ($route, $scope, RoleMapsMixin) {\n var currentMethod = $route.current.params.name;\n\n /**** Load role specific functionality ****/\n /* This function takes the scope object\n * and overrides anything specific to the current page\n * or role.\n */\n RoleMapsMixin.overrideScope($scope);\n\n /* Call route action like homeAction here.\n * Return 404 if action doesn't exist after\n * injecting mixin. For example, if a certain role\n * doesn't have an ILT calendar, they will get a 404\n * Not every role needs every page.\n * Please follow the routing structure; non-alphanumeric characters should not be used.\n */\n $scope[currentMethod + 'Action']();\n}]);\n","/* The footer at the bottom of every page */\napp.controller('footerController', ['$scope', function ($scope) {\n $scope.copyrightYear = moment().format('YYYY');\n}]);\n","/* The help tile view and actual content */\napp.controller('helpController', ['$scope', '$route', '$location', '$anchorScroll', 'BreadcrumbsService', 'UsersService', 'SettingsService',\n function ($scope, $route, $location, $anchorScroll, BreadcrumbsService, UsersService, SettingsService) {\n var _this = this;\n var currentMethod = $route.current.params.name;\n\n $scope.isPremiumContent = false;\n $scope.isLoading = false;\n $scope.hasInstructorRole = _.findWhere(UsersService.auth.roles, { type: 'instructor' }) ? true : false;\n $scope.hasManagerRole = _.findWhere(UsersService.auth.roles, { type: 'manager' }) ? true : false;\n $scope.hasTaRole = _.findWhere(UsersService.auth.roles, { type: 'ta' }) ? true : false;\n /* Training Insights access determined by the organization settings */\n var sett = SettingsService.getSettings().then(function (success) {\n $scope.taHasInsights = $scope.hasTaRole && SettingsService.isTrainingInsightsEnabled() ? true : false;\n $scope.dmHasInsights = _.findWhere(UsersService.auth.roles, { type: 'decisionMaker' }) && SettingsService.isTrainingInsightsEnabled() ? true : false;\n });\n\n $scope.scrollTo = function (scrollId) {\n $location.hash(scrollId);\n $anchorScroll();\n };\n\n _this.studentAction = function () {\n BreadcrumbsService.pushCrumb('help', 'help/');\n BreadcrumbsService.pushCrumb('student user manual');\n };\n\n _this.studentquickstartAction = function () {\n BreadcrumbsService.pushCrumb('help', 'help/');\n BreadcrumbsService.pushCrumb('student quick start');\n };\n\n _this.studentdemovideoAction = function () {\n BreadcrumbsService.pushCrumb('help', 'help/');\n BreadcrumbsService.pushCrumb('student demo video');\n };\n\n\n _this.instructorAction = function () {\n BreadcrumbsService.pushCrumb('help', 'help/');\n BreadcrumbsService.pushCrumb('instructor user manual');\n };\n\n _this.instructorquickstartAction = function () {\n BreadcrumbsService.pushCrumb('help', 'help/');\n BreadcrumbsService.pushCrumb('instructor quick start');\n };\n\n _this.instructordemovideoAction = function () {\n BreadcrumbsService.pushCrumb('help', 'help/');\n BreadcrumbsService.pushCrumb('instructor demo video');\n };\n\n\n _this.managerAction = function () {\n BreadcrumbsService.pushCrumb('help', 'help/');\n BreadcrumbsService.pushCrumb('manager user manual');\n };\n\n _this.managerquickstartAction = function () {\n BreadcrumbsService.pushCrumb('help', 'help/');\n BreadcrumbsService.pushCrumb('manager quick start');\n };\n\n _this.managerdemovideoAction = function () {\n BreadcrumbsService.pushCrumb('help', 'help/');\n BreadcrumbsService.pushCrumb('manager demo video');\n };\n\n _this.taAction = function () {\n BreadcrumbsService.pushCrumb('help', 'help/');\n BreadcrumbsService.pushCrumb('training administrator user manual');\n };\n\n _this.taquickstartAction = function () {\n BreadcrumbsService.pushCrumb('help', 'help/');\n BreadcrumbsService.pushCrumb('training administrator quick start');\n };\n\n _this.tademovideoAction = function () {\n BreadcrumbsService.pushCrumb('help', 'help/');\n BreadcrumbsService.pushCrumb('training administrator demo video');\n };\n\n _this.traininginsightsAction = function() {\n BreadcrumbsService.pushCrumb('help', 'help/');\n BreadcrumbsService.pushCrumb('Training Insights');\n };\n\n\n\n if (typeof currentMethod === 'undefined') {\n return;\n } else {\n switch (currentMethod.toLowerCase()) {\n case \"student\":\n _this.studentAction();\n break;\n case \"studentquickstart\":\n _this.studentquickstartAction();\n break;\n case \"studentdemovideo\":\n _this.studentdemovideoAction();\n break;\n\n case \"instructor\":\n _this.instructorAction();\n break;\n case \"instructorquickstart\":\n _this.instructorquickstartAction();\n break;\n case \"instructordemovideo\":\n _this.instructordemovideoAction();\n break;\n\n case \"manager\":\n _this.managerAction();\n break;\n case \"managerquickstart\":\n _this.managerquickstartAction();\n break;\n case \"managerdemovideo\":\n _this.managerdemovideoAction();\n break;\n \n case \"ta\":\n _this.taAction();\n break;\n case \"taquickstart\":\n _this.taquickstartAction();\n break;\n case \"tademovideo\":\n _this.tademovideoAction();\n break;\n case \"traininginsights\":\n _this.traininginsightsAction();\n break;\n default:\n break;\n }\n }\n\n $scope.forcedScrollTo = function () {\n if (location.hash) {\n $anchorScroll();\n }\n };\n}]);\n","/* The login page */\napp.controller('indexController', ['$rootScope', '$scope', '$timeout', '$location', '$route', 'UsersService', 'SearchServices', 'loginBackgroundUtil', 'messagingDisplayerUtil', function ($rootScope, $scope, $timeout, $location, $route, UsersService, SearchServices, loginBackgroundUtil, messagingDisplayerUtil) {\n $scope.forgotPassTemplateSwitcher = false;\n $scope.loading = false;\n $scope.iframeLoaded = false;\n $scope.lockOut = false;\n $scope.copyrightYear = moment().format('YYYY');\n\n var failures = 0;\n\n $scope.loginstate = {};\n $scope.loginstate.error = messagingDisplayerUtil.create();\n\n window.iframeLoadedCallBack = function () {\n $scope.iframeLoaded = true;\n };\n\n // added to show the IE message on login page \n var ieWarningMessage = document.createElement(\"div\");\n ieWarningMessage.style.backgroundColor = \"#fcbdbd\";\n ieWarningMessage.style.width = \"100%\";\n ieWarningMessage.style.fontSize = \"1em !important\";\n ieWarningMessage.style.padding = \"0.5em\";\n ieWarningMessage.innerHTML = \"

âš  Warning! Microsoft is ending web application support for Internet Explorer soon. This site is following Microsoft's support lifecycle for Internet Explorer. If you still need IE for certain sites or applications, we recommend using Microsoft Edge with IE Mode enabled for only those sites. If you do not need IE any longer, you can choose any modern browser such as Firefox, Chrome, or Edge.

\";\n if (window.navigator.userAgent.indexOf(\"Trident/\") > 0) {\n document.body.insertBefore(ieWarningMessage, document.body.firstChild);\n }\n\n $scope.login = function () {\n if(failures >= 10) {\n return;\n }\n\n var username = this.username;\n var password = this.password;\n\n $scope.loading = true;\n\n UsersService.login(username, password).then(\n function (success) {\n var userLoginStatus = success.loginStatus;\n if (userLoginStatus === 'resetPassword') {\n $scope.password = \"\";\n\n jQuery('.signin').toggle();\n jQuery('.resetpassword').toggle();\n }\n else {\n $location.url('/student/home/?welcome=true');\n }\n\n }, function (failure) {\n $scope.loading = false;\n\n if (failure.StatusCode === 401 && failure.ErrorMessage === \"Access to this account is restricted at this time\\r\\n\") {\n $location.path('/portal/pause/');\n }\n else {\n $scope.loginstate.error.setError(failure.StatusCode, failure.ErrorMessage);\n }\n }\n );\n };\n\n $scope.submitPasswordReset = function () {\n var username = this.username;\n\n UsersService.requestTemporaryPassword(username).then(\n function (success) {\n $scope.forgotForm(2);\n\n // Clear the password box to prevent autofill\n // This password box shouldn't autofilled\n // because it's a temporary password\n // I would do autocomplete=\"off\" but browsers/plugins\n // Don't respect that as much anymore.\n // http://stackoverflow.com/a/23234498/761726\n $scope.password = \"\";\n\n setTimeout(function () {\n $scope.forgotForm(3);\n }, 1000);\n }, function (failure) {\n $scope.loading = false;\n\n var errorMessage = failure;\n var slideTime = 500;\n if (errorMessage.indexOf('Invalid User') > 0) {\n $scope.errorMessage = 'Username Not Found';\n } else {\n $scope.errorMessage = 'This is a SSO Username. Please contact your Training Administrator if you are experiencing any error while attempting to Log In using SSO.';\n slideTime =8000;\n }\n\n jQuery('#username-error').slideDown(500, function () {\n var _this = jQuery(this);\n\n setTimeout(function () {\n _this.slideUp(parseInt(500));\n }, slideTime);\n });\n }\n );\n };\n\n $scope.checkNewPassword = function () {\n var password = this.password;\n var username = this.username;\n\n /**\n * Runs login, not reset. Password will already have been reset.\n */\n UsersService.validatePassword(username, password).then(\n function () {\n $scope.password = \"\";\n $scope.forgotForm(4);\n\n setTimeout(function () {\n $scope.forgotForm(5);\n }, 1000);\n }, function () {\n $scope.loading = false;\n\n jQuery('#reset-error').slideDown(500, function () {\n var _this = jQuery(this);\n\n setTimeout(function () {\n _this.slideUp(500);\n }, 1000);\n });\n }\n );\n };\n\n $scope.resetPassword = function () {\n var password = this.password;\n var username = this.username;\n\n /**\n * Runs login, not reset. Password will already have been reset.\n */\n UsersService.resetPassword(password).then(function() {\n $scope.forgotForm(6);\n UsersService.login(username, password).then(\n function () {\n $location.url('/student/home/');\n }, function () {\n\n }\n );\n }, function(failure) {\n $scope.loading = false;\n\n jQuery('#reset-error').slideDown(500, function () {\n var _this = jQuery(this);\n\n setTimeout(function () {\n _this.slideUp(500);\n }, 1000);\n });\n });\n };\n\n $scope.forgotPassClick = function (value) {\n $scope.forgotPassTemplateSwitcher = value;\n };\n\n}]);\n","app.controller('insightsController', ['$route', '$scope', 'RoleMapsMixin', 'UsersService', function ($route, $scope, RoleMapsMixin, UsersService) {\n var currentMethod = $route.current.params.name;\n\n UsersService.setHomeRole();\n /**** Load role specific functionality ****/\n /* This function takes the scope object\n * and overrides anything specific to the current page\n * or role.\n */\n RoleMapsMixin.overrideScope($scope);\n\n /* Call route action like homeAction here.\n * Return 404 if action doesn't exist after\n * injecting mixin. For example, if a certain role\n * doesn't have an ILT calendar, they will get a 404\n * Not every role needs every page.\n * Please follow the routing structure; non-alphanumeric characters should not be used.\n */\n if ($scope[currentMethod + 'Action']) {\n $scope[currentMethod + 'Action']();\n }\n}]);\n","app.controller('managementController', ['$route', '$scope', 'RoleMapsMixin', function ($route, $scope, RoleMapsMixin) {\n var currentMethod = $route.current.params.name;\n\n /**** Load role specific functionality ****/\n /* This function takes the scope object\n * and overrides anything specific to the current page\n * or role.\n */\n RoleMapsMixin.overrideScope($scope);\n\n /* Call route action like homeAction here.\n * Return 404 if action doesn't exist after\n * injecting mixin. For example, if a certain role\n * doesn't have an ILT calendar, they will get a 404\n * Not every role needs every page.\n * Please follow the routing structure; non-alphanumeric characters should not be used.\n */\n $scope[currentMethod + 'Action']();\n}]);\n","\n/* This controller displays the successful/unsuccessful certificates */\napp.controller('messagesController', ['$sce', '$scope', '$route', '$window', 'RoleMapsMixin', 'MessagesService', 'UsersService', 'errorDisplayerUtil','BreadcrumbsService',\n function ($sce, $scope, $route, $window, RoleMapsMixin, MessagesService, UsersService, errorDisplayerUtil, BreadcrumbsService) {\n var currentMethod = $route.current.params.name;\n\n $scope.dump = function(data) { console.warn(data); };\n\n $scope.messaging = {};\n $scope.messaging.error = errorDisplayerUtil.create();\n $scope.messaging.isLoading = false;\n $scope.role = UsersService.hasRole(\"ta\") === true ? 'admin' : 'student';\n\n \n BreadcrumbsService.createHomeBreadcrumb(UsersService.homeRole);\n BreadcrumbsService.pushCrumb('messages');\n \n $scope.inboxAction = function() {\n\n $scope.homeTemplate = 'app/templates/messages/inbox/' + $scope.role + '.html';\n\n $scope.messaging.isLoading = true;\n\n var message = MessagesService.fetch();\n message.then(function (success) {\n $scope.messaging.isLoading = false;\n\n $scope.messages = success;\n $scope.tooMany = false;\n $scope.messageCount = $scope.messages.length;\n\n if ($scope.messageCount > 2) {\n var messages = [];\n\n messages.push($scope.messages[0]);\n\n $scope.messages = messages;\n $scope.tooMany = true;\n }\n }, function (failure) {\n $scope.isLoading = false;\n\n $scope.messaging.error.setError(failure.ErrorCode, failure.ErrorMessage);\n });\n };\n\n /**** Load role specific functionality ****/\n /* This function takes the scope object\n * and overrides anything specific to the current page\n * or role.\n */\n RoleMapsMixin.overrideScopeByRole($scope, $scope.role);\n\n /* Call route action like homeAction here.\n * Return 404 if action doesn't exist after\n * injecting mixin. For example, if a certain role\n * doesn't have an ILT calendar, they will get a 404\n * Not every role needs every page.\n * Please follow the routing structure; non-alphanumeric characters should not be used.\n */\n $scope[currentMethod + 'Action']();\n }\n]);\n","app.controller('navigationController', ['$location', '$q', '$route', '$rootScope', '$scope', '$window', 'BreadcrumbsService', 'MessagesService', 'TasksService', 'TeamService', 'UsersService','SettingsService','ProxyService', '$timeout',\r\n function ($location, $q, $route, $rootScope, $scope, $window, BreadcrumbsService, MessagesService, TasksService, TeamService, UsersService, SettingsService, ProxyService, $timeout) {\r\n var _this = this;\r\n \r\n $scope.showLogout = showLogout();\r\n\r\n function showLogout() {\r\n if (UsersService.roleObj.type === 'student' && $route.current.params.name === 'home' && typeof $route.current.params.param === 'undefined') {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n $scope.logoUrl = \"app/images/BAI_HorizontalLockup_Primary_CMYK.png\";\r\n var customLogoUrl = UsersService.customLogoUrl();\r\n if (typeof customLogoUrl !== 'undefined' && customLogoUrl !== null) {\r\n $scope.logoUrl = customLogoUrl;\r\n }\r\n\r\n //// added to show the IE message on student home page \r\n var homeRole = UsersService.homeRole;\r\n if (homeRole === \"student\" && $location.path() === '/users/home/') {\r\n UsersService.navigateToHome();\r\n }\r\n\r\n /**\r\n * Keep _this and $scope so we can trigger scope change one all calls are finished.\r\n *\r\n * @type {int}\r\n */\r\n _this.messageCount = 0;\r\n $scope.messageCount = 0;\r\n\r\n $scope.goHome = function (nextUrl) {\r\n var homeRole = UsersService.homeRole;\r\n var context = UsersService.setUserContext(homeRole);\r\n context.then(function (success) {\r\n UsersService.navigateToHome();\r\n if (nextUrl) { // If we can't use href in combination with goHome\r\n $timeout(function() {\r\n $scope.goToRoute(nextUrl);\r\n });\r\n }\r\n });\r\n };\r\n\r\n $scope.goToBreadcrumbHome = function (nextUrl) {\r\n var homeRole = UsersService.homeRole;\r\n var context = UsersService.setUserContext(homeRole);\r\n context.then(function (success) {\r\n if (homeRole === 'decisionMaker') {\r\n $location.url('insights/home');\r\n } else {\r\n if (homeRole === 'ta') {\r\n UsersService.navigateToHome();\r\n } else {\r\n $location.url('users/home');\r\n }\r\n }\r\n if (nextUrl) { // If we can't use href in combination with goHome\r\n $timeout(function() {\r\n $scope.goToRoute(nextUrl);\r\n });\r\n }\r\n });\r\n };\r\n\r\n $scope.goToRoute = function(route) {\r\n $location.url(route);\r\n };\r\n\r\n /**\r\n * Due to lack of way to get a group of promises to not fail if one/many of the calls fails, we must do it the old\r\n * fashioned way with a counter. There is a 3rd party lib, but we will not be implementing that until hardening\r\n * period, potentially after that (use https://github.com/ohjames/angular-promise-extras).\r\n *\r\n * Until then, we will keep track of calls. There will always be at least one call; there will be two if the\r\n * user is currently in the admin role.\r\n */\r\n _this.messageBubbleCompletedRequestTotal = 0; // total number of completed calls\r\n _this.messageBubbleTotalPossibleRequests = 1; // total number of calls to be made\r\n\r\n var message = MessagesService.fetch();\r\n message.then(function (success) {\r\n // call completed; increment\r\n _this.messageBubbleCompletedRequestTotal++;\r\n\r\n /**\r\n * This is for the toaster bubbles. This is currently disabled in the view.\r\n */\r\n $scope.messages = success;\r\n $scope.tooMany = false;\r\n\r\n _this.messageCount += $scope.messages.length;\r\n\r\n if ($scope.messageCount > 2) {\r\n var messages = [];\r\n\r\n messages.push($scope.messages[0]);\r\n\r\n $scope.messages = messages;\r\n $scope.tooMany = true;\r\n }\r\n\r\n _this.showNotifications();\r\n }, function (failure) {\r\n // call completed; increment\r\n _this.messageBubbleCompletedRequestTotal++;\r\n\r\n _this.showNotifications();\r\n });\r\n\r\n /**\r\n * Only run if the user is an admin, as the API will fail for 1/2 of the personas, thus wasting a call.\r\n */\r\n if (UsersService.isAdmin() === true) {\r\n // add numer of total calls that exist\r\n _this.messageBubbleTotalPossibleRequests += 2;\r\n\r\n /**\r\n * Get all the approval requests.\r\n */\r\n var requests = TeamService.getListOfAssignmentsToApprove();\r\n requests.then(function (success) {\r\n _this.messageBubbleCompletedRequestTotal++;\r\n\r\n _this.messageCount += success.length;\r\n\r\n _this.showNotifications();\r\n }, function (failure) {\r\n // call completed; increment\r\n _this.messageBubbleCompletedRequestTotal++;\r\n\r\n _this.showNotifications();\r\n });\r\n\r\n /**\r\n * Get all the task approvals\r\n */\r\n var tasks = TasksService.getTasksApprovalTA();\r\n tasks.then(function (success) {\r\n _this.messageBubbleCompletedRequestTotal++;\r\n\r\n _this.messageCount += success.length;\r\n\r\n _this.showNotifications();\r\n }, function (failure) {\r\n // call completed; increment\r\n _this.messageBubbleCompletedRequestTotal++;\r\n\r\n _this.showNotifications();\r\n });\r\n }\r\n\r\n /**\r\n * This method has to run on every completion. Sometimes, AJAX can go failure, success, failure. That means we won't\r\n * get proper triggering. This method will run on all failures and successes, so eventually n will equal n, which\r\n * means we will be able render the message properly.\r\n */\r\n _this.showNotifications = function () {\r\n if (_this.messageBubbleCompletedRequestTotal === _this.messageBubbleTotalPossibleRequests) {\r\n $scope.messageCount = _this.messageCount;\r\n }\r\n };\r\n\r\n\r\n\r\n $scope.loadSettings = function () {\r\n\r\n SettingsService.getSettings().then(function (success) {\r\n /* Proxy Mode determined by the organization settings */\r\n $scope.showProxyMode = SettingsService.isProxyModeEnabled();\r\n });\r\n };\r\n\r\n $scope.hasAccess = false;\r\n $scope.getUrlsForRoles = UsersService.getUrlsForRoles();\r\n $scope.getProxyAccess = function () {\r\n var acess = ProxyService.getUrlsForProxy();\r\n acess.then(function (success) {\r\n $scope.hasAccess = success.length > 0 ? true : false;\r\n }, function (failure) {\r\n });\r\n };\r\n $scope.getProxyAccess();\r\n $scope.isSabaUser = UsersService.isSaba();\r\n $scope.hasStudentRole = _.findWhere($scope.getUrlsForRoles, {roleName: \"student\"}) ? true : false;\r\n $scope.hasManagerRole = _.findWhere($scope.getUrlsForRoles, {roleName: \"manager\"}) ? true : false;\r\n $scope.hasInstructorRole = _.findWhere($scope.getUrlsForRoles, {roleName: \"instructor\"}) ? true : false;\r\n $scope.hasAdminRole = _.findWhere($scope.getUrlsForRoles, { roleName: \"admin\" }) || _.findWhere($scope.getUrlsForRoles, { roleName: \"ta\" }) ? true : false;\r\n $scope.hasProxyModeRole = _.findWhere($scope.getUrlsForRoles, { roleName: \"ta\" }) || _.findWhere($scope.getUrlsForRoles, { roleName: \"manager\" }) ? true : false;\r\n $scope.hasDecisionMakerRole = _.findWhere($scope.getUrlsForRoles, { roleName: \"decisionMaker\" }) ? true : false;\r\n $scope.navLinks = UsersService.getNavigation();\r\n $scope.user = UsersService.user;\r\n $scope.impersonate = UsersService.impersonate;\r\n \r\n $scope.openSideNav = function () {\r\n jQuery('#flyout').slideToggle();\r\n };\r\n\r\n $scope.closeMessagePopup = function ($event) {\r\n var clicked = jQuery($event.currentTarget);\r\n clicked.parents('.message').fadeOut(500);\r\n };\r\n\r\n $scope.revokeImpersonation = function () {\r\n var scoperole = \"\";\r\n\r\n if($scope.impersonate.viewType !== '' && $scope.impersonate.viewType > 0)\r\n {\r\n var proxy = UsersService.revokeImpersonation();\r\n\r\n proxy.then(function () { \r\n $scope.getUrlsForRoles = UsersService.getUrlsForRoles();\r\n for (var i = 0; i < $scope.getUrlsForRoles.length; i++) {\r\n if ($scope.getUrlsForRoles[i].roleName === 'ta') {\r\n scoperole = 'ta';\r\n break;\r\n }\r\n if ($scope.getUrlsForRoles[i].roleName === 'manager') {\r\n scoperole = 'manager';\r\n break;\r\n }\r\n }\r\n //console.log(scoperole);\r\n if (scoperole === 'ta' || scoperole === 'manager') {\r\n var admincontext = UsersService.setUserContext(scoperole);\r\n admincontext.then(function () {\r\n $location.url('proxy/home/');\r\n });\r\n } else { \r\n var studentcontext = UsersService.setUserContext('student');\r\n studentcontext.then(function () {\r\n $location.url('proxy/home/');\r\n });\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.logout = function () {\r\n var portalCode = UsersService.getPortalCode();\r\n var logout = UsersService.clearSession();\r\n logout.then(function (success) {\r\n\r\n // If a user's portal code existed while being logged in, persist it on the logged out state.\r\n if (portalCode !== '' && portalCode !== null) {\r\n // alert('logging out with portalCode');\r\n portalCode = '?portal=' + portalCode;\r\n }\r\n\r\n $location.url('/' + portalCode);\r\n }, function (failure) {\r\n\r\n });\r\n\r\n };\r\n\r\n $scope.changeUserScope = function (scope, uri) {\r\n\r\n if (uri === 'users/transcripts/') {\r\n $location.url('student/transcripts/');\r\n UsersService.goingToTranscript = true;\r\n }\r\n /**\r\n * Since we may be waiting for an API call, we have to wait for it to finish. Does not\r\n * affect non-api calls.\r\n */\r\n var context = UsersService.setUserContext(scope);\r\n\r\n context.then(function () {\r\n if (scope === 'decisionMaker') {\r\n $location.url('insights/home');\r\n } else if (scope === 'catalogLibrary') {\r\n $location.url('catalog/');\r\n } else {\r\n if (typeof uri !== 'undefined' && uri !== null) {\r\n $location.url(uri);\r\n } else if ($location.url() === '/users/home/') {\r\n $location.url(''); // EA-14021 to force a rerender when it navigates back to /users/home (in case if user toggles between Administration and Team Management)\r\n $scope.openSideNav(); // closes menu\r\n if (scope === 'ta') {\r\n UsersService.navigateToHome();\r\n }\r\n } else if (scope === 'ta') {\r\n UsersService.navigateToHome();\r\n } else {\r\n $location.url('users/home');\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.changeUserScopeForProxy = function () {\r\n var scoperole = \"\";\r\n\r\n if ($scope.hasAdminRole === true) {\r\n scoperole = 'ta';\r\n } else if ($scope.hasManagerRole === true) {\r\n scoperole = 'manager';\r\n }\r\n\r\n if ($scope.hasProxyModeRole === true) {\r\n var context = UsersService.setUserContext(scoperole);\r\n\r\n context.then(function () {\r\n $location.url('proxy/home/');\r\n });\r\n }\r\n else if ($scope.hasAccess === true) {\r\n $location.url('proxy/home/');\r\n } \r\n };\r\n\r\n var toggles = document.querySelectorAll(\".c-hamburger\");\r\n\r\n for (var i = toggles.length - 1; i >= 0; i--) {\r\n var toggle = toggles[i];\r\n toggleHandler(toggle);\r\n }\r\n\r\n function toggleHandler(toggle) {\r\n toggle.addEventListener(\"click\", function (e) {\r\n e.preventDefault();\r\n var active = (this.classList.contains(\"is-active\") === true) ? this.classList.remove(\"is-active\") : this.classList.add(\"is-active\");\r\n });\r\n }\r\n\r\n // Breadcrumbs are generated by individual services.\r\n // Put this in a watch function because sometimes crumbs\r\n // are updated in ajax calls.\r\n\r\n $scope.$watch(function () {\r\n return BreadcrumbsService.getCrumbs();\r\n }, function (newVal, oldVal) {\r\n $scope.breadcrumbs = newVal;\r\n }, true);\r\n\r\n $scope.$watch('$viewContentLoaded',\r\n function () {\r\n $timeout(function () {\r\n $scope.loadSettings();\r\n }, 1000);\r\n });\r\n\r\n /**\r\n * Subcriber to the publisher that exists in the messages/admin controller. Only way to trigger a re-calculation\r\n * of the total number of requests without doing a new call.\r\n */\r\n $scope.$on('requestApprovals:action:success', function () {\r\n // Ensure that there will be at least request after subtracting one.\r\n if ($scope.messageCount - 1 > 0) {\r\n $scope.messageCount -= 1;\r\n } else {\r\n $scope.messageCount = 0;\r\n }\r\n });\r\n }\r\n]);","\napp.controller('nmlsController', ['$compile', '$filter', '$location', '$rootScope', '$route', '$scope', '$sce', '$window', 'NMLSService', function ($compile, $filter, $location, $rootScope, $route, $scope, $sce, $window, NMLSService) {\n\n var action = $route.current.params.status;\n $scope.success = false;\n $scope.failure = false;\n \n if (action !== null && action.toLowerCase() === 'success') {\n //success - Show success message\n $scope.success = true;\n\n } else if (action !== null && action.toLowerCase() === 'openbiosighelppage') {\n\n var helpCall = NMLSService.getBioSigHelpPage();\n helpCall.then(function(success) {\n $window.location.href = success;\n }, function (failure) {\n $scope.failure = true;\n });\n }\n else {\n //failure - Show failure message\n $scope.failure = true;\n }\n\n \n}]);\n","app.controller('offeringsController', ['$scope', '$location', '$route', '$window', 'errorDisplayerUtil', 'OfferingsService', 'RoleMapsMixin', 'RosterService', 'UsersService', function ($scope, $location, $route, $window, errorDisplayerUtil, OfferingsService, RoleMapsMixin, RosterService, UsersService) {\n var _this = this;\n\n var currentMethod = $route.current.params.name;\n\n $scope.data = $scope.offering = {};\n $scope.cancellingOffering = false;\n $scope.isLoading = false;\n $scope.offeringDate = new Date();\n\n /**\n * Set loading, error, etc. options onto the generic API action.\n *\n * @type {{}}\n */\n $scope.userSearchOptions = {};\n\n $scope.userSearchOptions.error = errorDisplayerUtil.create();\n $scope.userSearchOptions.searched = false;\n $scope.userSearchOptions.selected = 0;\n\n $scope.rosterStatus = 'default';\n $scope.selectedSession = 1;\n $scope.sessions = null;\n $scope.sessionOrder = 'lowestSessionDateForOffering.startDate';\n $scope.statuses = $scope.completionStatuses;\n\n\n /**** Load role specific functionality ****/\n /* This function takes the scope object\n * and overrides anything specific to the current page\n * or role.\n */\n RoleMapsMixin.overrideScope($scope);\n\n $scope[currentMethod + 'Action']();\n}]);\n","app.controller('proxyController', ['$location', '$q', '$route', '$rootScope', '$scope', '$window', 'errorDisplayerUtil', 'ProxyService', 'MessagesService', 'UsersService', 'SettingsService', 'GroupsService', 'dateUtil',\n function ($location, $q, $route, $rootScope, $scope, $window, errorDisplayerUtil, ProxyService, MessagesService, UsersService, SettingsService, GroupsService, dateUtil) {\n var _this = this;\n var currentMethod = $route.current.params.name;\n \n $scope.currentRoute = \"\";\n $scope.myManagementsActive = \"\";\n $scope.myAccessActive = \"\";\n $scope.proxyListError = errorDisplayerUtil.create();\n $scope.sortPropertyName = 'fullDateWithTime';\n $scope.currentRoleTA = false;\n $scope.currentRoleManager = false;\n $scope.userSelected = false;\n $scope.managerSelected = false;\n $scope.isLoading = true;\n\n var sett = SettingsService.getSettings().then(function (success) {\n /* Proxy Mode determined by the organization settings */\n $scope.showProxyMode = SettingsService.isProxyModeEnabled();\n });\n $scope.impersonate = UsersService.impersonate;\n /* establish scope variable to determine if the user is a TA */\n /* proxy list differ for TA and Manager */\n //var currentUserRole = UsersService.getCurrentRoleType();\n var isManager = UsersService.hasRole('manager');\n var isTA = UsersService.hasRole('ta');\n if (isTA === true) {\n $scope.currentRoleTA = true;\n }\n else if (isManager === true) {\n $scope.currentRoleManager = true;\n }\n\n $scope.loggedInUserId = UsersService.getId();\n\n $scope.setStartTime = function (dateObj) {\n if (typeof dateObj !== \"undefined\" && dateObj !== null &&\n typeof dateObj.moment !== \"undefined\" && _.isObject(dateObj.moment)) {\n if ((typeof dateObj.displayTime === \"undefined\" || dateObj.displayTime === null)) {\n var portalStartTime = dateUtil.setPortalStartTime(dateObj.moment.toDate());\n dateObj = dateUtil.formatDate(portalStartTime);\n } else {\n dateObj = dateUtil.formatDate(dateObj.moment.toDate(), dateObj.displayTime);\n }\n $scope.proxy.StartDate = dateUtil.formatDate(dateObj.jsDate);\n } else {\n $scope.proxy.StartDate = null;\n dateObj = null;\n }\n return dateObj;\n };\n\n $scope.setEndTime = function (dateObj) {\n if (typeof dateObj !== \"undefined\" && dateObj !== null &&\n typeof dateObj.moment !== \"undefined\" && _.isObject(dateObj.moment)) {\n if ((typeof dateObj.displayTime === \"undefined\" || dateObj.displayTime === null)) {\n var portalEndTime = dateUtil.setPortalEndTime(dateObj.moment.toDate());\n dateObj = dateUtil.formatDate(portalEndTime);\n } else {\n dateObj = dateUtil.formatDate(dateObj.moment.toDate(), dateObj.displayTime);\n }\n $scope.proxy.EndDate = dateUtil.formatDate(dateObj.jsDate);\n } else {\n $scope.proxy.EndDate = null;\n dateObj = null;\n }\n return dateObj;\n };\n\n $scope.setEditProxyEndTime = function (dateObj) {\n if (typeof dateObj !== \"undefined\" && dateObj !== null &&\n typeof dateObj.moment !== \"undefined\" && _.isObject(dateObj.moment)) {\n if ((typeof dateObj.displayTime === \"undefined\" || dateObj.displayTime === null)) {\n var portalEndTime = dateUtil.setPortalEndTime(dateObj.moment.toDate());\n dateObj = dateUtil.formatDate(portalEndTime);\n } else {\n dateObj = dateUtil.formatDate(dateObj.moment.toDate(), dateObj.displayTime);\n }\n $scope.proxy.endDate = dateUtil.formatDate(dateObj.jsDate);\n } else {\n $scope.proxy.endDate = null;\n dateObj = null;\n }\n return dateObj;\n };\n\n\n $scope.initNewProxyStartDate = function () {\n if (typeof $scope.proxy !== \"undefined\" && (typeof $scope.proxy.StartDate === 'undefined' || $scope.proxy.StartDate === null)) {\n var startDateTime = dateUtil.setPortalStartTime(new Date());\n $scope.proxy.StartDate = dateUtil.formatDate(startDateTime);\n }\n };\n\n /* This makes coloumns of a table sortables */\n $scope.propertyName = 'endDate';\n $scope.reverse = false;\n\n $scope.sortBy = function (propertyName) {\n $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;\n $scope.propertyName = propertyName;\n };\n\n $scope.property = \"$\";\n\n $scope.homeAction = function () {\n $scope.proxy = {};\n $scope.proxyList = {};\n //$scope.proxyList.isLoading = false;\n $scope.proxyList.options = {};\n $scope.errorMessage = \"\";\n\n if ($route.current.params.param !== undefined && $route.current.params.param !== null) {\n var params = $route.current.params.param.split('/');\n if (params.length > 0) {\n $scope.currentRoute = params[0].toLowerCase();\n }\n }\n\n if ($scope.currentRoute === \"management\") {\n\n //$scope.proxyList.isLoading = true;\n $scope.isLoading = true;\n\n var proxies = ProxyService.getAllProxy();\n proxies.then(function (success) {\n //$scope.proxyList.isLoading = false;\n $scope.isLoading = false;\n $scope.proxyList.data = success;\n\n }, function (failure) {\n //$scope.proxyList.isLoading = false;\n $scope.isLoading = false;\n $scope.proxyListError.setError(failure.ErrorCode, failure.ErrorMessage);\n });\n\n $scope.homeTemplate = 'app/templates/proxy/management.html';\n $scope.myManagementsActive = true;\n }\n else {\n\n if ($scope.impersonate.impersonatorID > 0) {\n UsersService.navigateToHome();\n }\n $scope.views = ProxyService.view;\n $scope.isLoading = true;\n\n var managers = ProxyService.getManagerList();\n managers.then(function (success) {\n $scope.managerList = success;\n $scope.isLoading = false;\n }, function (failure) {\n $scope.isLoading = false;\n });\n\n $scope.homeTemplate = 'app/templates/proxy/access.html';\n $scope.myManagementsActive = false;\n }\n };\n\n $scope.noResults = '';\n $scope.userTypeahead = {};\n $scope.userTypeahead.search = function (value) {\n\n if ($scope.proxy.iHR_ImpersonatingUserID === null || $scope.proxy.iHR_ImpersonatingUserID === undefined) {\n $scope.userSelected = false;\n }\n\n if (value === null) {\n /* validation - if the value is null, then just return after setting validation variable */\n return;\n }\n\n var fieldName = 'fullNameContains';\n searchAttribute = {};\n searchAttribute[fieldName] = value;\n searchUserPromise = UsersService.advancedSearch(searchAttribute);\n\n return searchUserPromise.then(function (success) {\n //$scope.resultsLoading = false;\n var output = [];\n var filteredFromUsers = _.uniq(_.compact(success));\n _.each(filteredFromUsers, function (item) {\n var skinnedItem = {};\n skinnedItem.id = item.id;\n skinnedItem.name = item.fullName;\n output.push(skinnedItem);\n });\n return output;\n });\n };\n\n $scope.noResultsMgrs = '';\n $scope.managerTypeahead = {};\n $scope.managerTypeahead.search = function (value) {\n\n if ($scope.proxy.iHR_ImpersonatedUserID === null || $scope.proxy.iHR_ImpersonatedUserID === undefined) {\n $scope.managerSelected = false;\n }\n\n if (value === null) {\n return;\n }\n var fieldName = 'fullNameContains';\n searchAttribute = {};\n searchAttribute[fieldName] = value;\n searchManagerPromise = UsersService.advancedSearch(searchAttribute);\n\n return searchManagerPromise.then(function (success) {\n //$scope.resultsLoading1 = false;\n var output = [];\n var filteredFromUsers = _.uniq(_.compact(success));\n _.each(filteredFromUsers, function (item) {\n if (item.isManager === true) {\n var skinnedItem = {};\n skinnedItem.id = item.id;\n skinnedItem.name = item.fullName;\n output.push(skinnedItem);\n }\n });\n return output;\n });\n };\n\n\n $scope.managerUserTypeahead = {};\n $scope.managerUserTypeahead.search = function (value) {\n\n if ($scope.proxy.iHR_ImpersonatingUserID === null || $scope.proxy.iHR_ImpersonatingUserID === undefined) {\n $scope.userSelected = false;\n }\n\n if (value === null) {\n /* validation - if the value is null, then just return after setting validation variable */\n return;\n }\n\n searchManagerUserPromise = ProxyService.advancedSearch(value);\n\n return searchManagerUserPromise.then(function (success) {\n var output = [];\n var filteredFromUsers = _.uniq(_.compact(success));\n _.each(filteredFromUsers, function (item) {\n var skinnedItem = {};\n skinnedItem.id = item.id;\n skinnedItem.name = item.fullName;\n output.push(skinnedItem);\n });\n return output;\n });\n };\n\n $scope.setProxyUser = function (selectedUser) { \n $scope.proxy.iHR_ImpersonatingUserID = selectedUser.id;\n $scope.userSelected = true;\n };\n\n $scope.setProxyManager = function (selectedManager) {\n $scope.proxy.iHR_ImpersonatedUserID = selectedManager.id;\n $scope.managerSelected = true;\n };\n\n /* Call to the API to create a new decision map */\n $scope.createProxy = function () {\n $scope.savingProxy = true;\n $scope.isLoading = true;\n \n var proxyData = angular.copy($scope.proxy);\n\n if (typeof $scope.proxy.StartDate !== \"undefined\" && typeof $scope.proxy.StartDate.moment !== \"undefined\") {\n proxyData.StartDate = proxyData.StartDate.moment.toISOString();\n } else {\n proxyData.StartDate = null;\n }\n\n if (typeof $scope.proxy.EndDate !== \"undefined\" && typeof $scope.proxy.EndDate.moment !== \"undefined\") {\n proxyData.EndDate = proxyData.EndDate.moment.toISOString();\n } else {\n proxyData.EndDate = null;\n }\n\n\n var createProxy = ProxyService.createProxy(proxyData);\n $scope.errorMessage = \"\";\n createProxy.then(function (success) {\n $scope.savingProxy = false;\n //Save the returned decision map ID to the decisionMap\n //$scope.proxy.id = success;\n $scope.errorThrown = false;\n $scope.isLoading = false;\n $window.location.reload();\n }, function (failure) {\n $scope.savingProxy = false;\n $scope.errorMessage = failure.ErrorMessage;\n $scope.errorThrown = true;\n $scope.isLoading = false;\n });\n };\n\n $scope.submitView = function () {\n // var accessData = angular.copy($scope.proxy);\n $scope.isLoading = true;\n var olduserId = UsersService.getUserName();\n var username = $scope.proxy.proxyName;\n\n var context = UsersService.changeUserContext(username);\n\n context.then(function (success) {\n var role = UsersService.setUserContext('manager');\n\n role.then(function () {\n if ($scope.proxy.viewType === 0) {\n UsersService.navigateToHome();\n }\n else {\n $location.url('reports/');\n }\n $scope.isLoading = false;\n });\n }, function (failure) {\n $scope.errorMessage = failure.ErrorMessage;\n $scope.errorThrown = true;\n $scope.isLoading = false;\n });\n };\n\n $scope.getSingleProxy = function (impersonationID) {\n $scope.errorMessage = \"\";\n $scope.id = impersonationID;\n var getProxyByID = ProxyService.getSingle($scope.id);\n\n getProxyByID.then(function (success) {\n $scope.row = success;\n $scope.errorThrown = false;\n }, function (failure) {\n $scope.errorMessage = failure.ErrorMessage;\n $scope.errorThrown = true;\n });\n //-------------------\n angular.element(document.querySelector('#editProxyModal')).modal();\n\n };\n\n $scope.closeEditProxyModal = function () {\n angular.element(document.querySelector('#editProxyModal')).modal('hide');\n $scope.errorMessage = \"\";\n $scope.errorThrown = \"\";\n };\n\n $scope.editProxy = function (deactivate) {\n angular.element(document.querySelector('#editProxyModal')).modal('hide');\n $scope.isLoading = true;\n $scope.udpatingProxy = true;\n var proxyData = angular.copy($scope.row);\n\n if ($scope.row.endDate !== null) { \n var endDateTime = dateUtil.setPortalEndTime(proxyData.endDate.moment.toDate());\n proxyData.endDate = endDateTime.toISOString();\n }\n\n proxyData.startDate = proxyData.startDate.moment.toISOString();\n\n if (typeof deactivate !== 'undefined') {\n if (deactivate === true) {\n proxyData.endDate = new Date();\n proxyData.endDate.setMinutes(proxyData.endDate.getMinutes() - 1);\n }\n }\n\n var udpateProxy = ProxyService.editProxy(proxyData);\n\n udpateProxy.then(function (success) {\n $scope.udpatingProxy = false;\n $scope.errorThrown = false;\n $scope.isLoading = false;\n $window.location.reload();\n }, function (failure) {\n $scope.udpatingProxy = false;\n $scope.errorMessage = failure.ErrorMessage;\n $scope.errorThrown = true;\n $scope.isLoading = false;\n });\n };\n\n $scope.exportLoading = false;\n $scope.getProxyListCSV = function () {\n $scope.currentTimezone = moment.tz.guess();\n $scope.exportLoading = true;\n };\n\n $scope[currentMethod + 'Action']();\n\n }]);","(function () {\n app.controller(\"reportsController\", [\"$scope\", \"$window\", \"UsersService\", \"SettingsService\", reportsController]);\n\n function reportsController($scope, $window, UsersService, SettingsService) {\n $scope.homeTemplate = \"app/templates/reports/home.html\";\n $scope.isDocumentsEnabled = false;\n\n /*This will route users to the appropiate user manual based on active tab*/\n $scope.userManualHref = 'https://ld-connect.bai.org/learning-manager/reports-user-manual/';\n\n /*Verifies if user is a TA*/\n $scope.isAdmin = UsersService.user.taRoleOrgIds.length > 0 ? true : false;\n\n SettingsService.getSettings().then(function (success) {\n $scope.isDocumentsEnabled = SettingsService.isDocumentsEnabled();\n $scope.isPremium = SettingsService.isILTEnabled();\n }, function (failure) {\n // Do nothing, worst case, the DDR is not showing but other reports will be.\n // If settings call fails consistently, the app will have a lot of other issues.\n });\n\n\n $scope.launchReports = function (reportCalled) {\n var reportLinkCall = UsersService.getManagerSabaReportUrl(reportCalled);\n reportLinkCall.then(\n function (success) {\n var link = success;\n var popup = $window.open(\"about:blank\", \"_blank\");\n popup.location = link;\n },\n function (failure) {\n }\n );\n };\n\n $scope.openReportVideo = function (src, new_page_title) {\n\n var new_window = window.open('', '_blank', 'location=1,status=1,toolbar=1,scrollbars=1,resizeable=1,width=800,height=600');\n new_window.document.write('' + new_page_title + '');\n\n };\n }\n})();","/* This controller displays the successful/unsuccessful certificates */\napp.controller('rulesController', ['$sce', '$scope', '$route', '$window', 'RoleMapsMixin', 'UsersService', 'BreadcrumbsService', function ($sce, $scope, $route, $window, RoleMapsMixin, UsersService, BreadcrumbsService) {\n var currentMethod = $route.current.params.name;\n\n var _this = this;\n\n $scope.courseFailure = false;\n $scope.isLoading = true;\n\n $scope.user = UsersService;\n\n $scope.homeAction = function() {};\n\n $scope.dump = function(data) { console.warn(data); };\n\n\n /**** Load role specific functionality ****/\n /* This function takes the scope object\n * and overrides anything specific to the current page\n * or role.\n */\n RoleMapsMixin.overrideScope($scope);\n\n /* Call route action like homeAction here.\n * Return 404 if action doesn't exist after\n * injecting mixin. For example, if a certain role\n * doesn't have an ILT calendar, they will get a 404\n * Not every role needs every page.\n * Please follow the routing structure; non-alphanumeric characters should not be used.\n */\n $scope[currentMethod + 'Action']();\n}]);\n","/* This is for the home, list, calendar ILT view and transcripts page.\n* /student/home/ is the home (dashboard) view\n* /users/home/ is the home (admin) view\n* /users/list/ is the list view\n* /users/calendar/ is the calendar view\n* /users/ilt-calendar/ is the ilt calendar view\n* /users/transcripts/ is the transcripts page\n*\n* Role specific functionality is at the end.\n*/\napp.controller('usersController', ['$compile', '$filter', '$location', '$rootScope', '$route', '$scope', '$sce', '$window', '$timeout', 'dateUtil', 'AssignmentsService', 'CoursesService', 'EvaluationService', 'AssessmentService', 'OfferingsService', 'SurveyService', 'TranscriptsService', 'UsersService', 'BreadcrumbsService', 'TypeMapsMixin', 'RoleMapsMixin', 'errorDisplayerUtil', function ($compile, $filter, $location, $rootScope, $route, $scope, $sce, $window, $timeout, dateUtil, AssignmentsService, CoursesService, EvaluationService, AssessmentService, OfferingsService, SurveyService, TranscriptsService, UsersService, BreadcrumbsService, TypeMapsMixin, RoleMapsMixin, errorDisplayerUtil) {\n var currentMethod = $route.current.params.name;\n var added = [];\n var totalChildren = 0;\n var lastIndex = -1;\n var _this = this;\n var cloneSlider = null;\n\n $scope.addApiError = false;\n $scope.apiActionLoader = false;\n $scope.apiError = false;\n $scope.dateRangeError = false;\n $scope.day = moment();\n $scope.eodToday = moment().set({ hour: 23, minute: 0, second: 0, millisecond: 0 });\n $scope.isFutureSelected = true;\n $scope.isLoading = true;\n $scope.launchCourseLoader = false;\n $scope.mainErrorFailure = false;\n $scope.myDate = new Date();\n $scope.offeringsAreLoading = false;\n $scope.orderProperty = 'dueDate.original';\n $scope.responseComplete = false;\n $scope.role = UsersService.getCurrentRoleType(); // ensure buttons show up for current user, as slidedown is used by two roles but only available should show buttons for student\n $scope.filterView = 'app/templates/users/partials/filters/' + $scope.role + '.html';\n $scope.showCompletionButton = false;\n $scope.singleIsLoading = false;\n $scope.user = UsersService;\n $scope.userAcceptsRisk = false;\n $scope.currentAssignmentFilter = 'getRequiredAssignments';\n $scope.sortBy = 'name';\n $scope.searchEndDate = moment(new Date()).format('YYYY-MM-DD');\n $scope.searchStartDate =new Date();\n $scope.searchStartDate = moment($scope.searchStartDate.setYear($scope.searchStartDate.getFullYear() - 1)).format('YYYY-MM-DD');\n $scope.transcriptSearch = {};\n $scope.transcriptSearch.endDate = dateUtil.formatDate($scope.eodToday.toDate());\n $scope.transcriptSearch.startDate = dateUtil.formatDate(moment().subtract(1, 'years').set({ hour: 01, minute: 0, second: 0, millisecond: 0 }).toDate());\n\n _this.BreadcrumbsService = BreadcrumbsService;\n\n /**\n * General page options to show page level loading, errors, etc.\n */\n $scope.pageOptions = {};\n $scope.pageOptions.error = errorDisplayerUtil.create();\n $scope.pageOptions.isLoading = false;\n\n // Removed per SLY-1962 but, only commented out to show how to put back in\n\n //if(localStorage.getItem('welcomeVideo') !== 'watched') {\n // if($rootScope.videoShownThisSession === false) {\n // $rootScope.videoShownThisSession = true;\n //\n // // The modal doesn't exist for a split second as it gets\n // // downloaded; timeout allows for the download to complete\n // setTimeout(function () {\n // jQuery('#welcomeVideoModal').modal();\n // }, 500);\n // }\n //}\n\n /**\n * Triggers that come from outside of this scope\n */\n $scope.$on('slideDownDirective:refreshCurrentPage', function () {\n $scope.isLoading = true;\n\n if (currentMethod === 'ilt-calendar') {\n $scope.iltCalendarAction();\n } else {\n $scope[currentMethod + 'Action']();\n }\n });\n\n $scope.iltCalendarAction = function () {\n $scope.homeTemplate = 'app/templates/users/ilt-calendar/student.html';\n\n var context = UsersService.setUserContext('student');\n context.then(function () {\n \n \n /* Unfortunate anti-pattern */\n /* Original system had ILT offerings as a modal\n * Which called the calenderAction first\n * So we have to replicate some of the functionality\n * from the calendar action here */\n\n /* Begin actual work on iltCalendarAction */\n $scope.offeringsAreLoading = true;\n\n var offerings = OfferingsService.fetch(UsersService.getId(), 'ilt');\n offerings.then(function (success) {\n $scope.offeringsAreLoading = false;\n\n $scope.offerings = OfferingsService.offerings;\n $scope.isLoading = false;\n }, function (failure) {\n $scope.offeringsAreLoading = false;\n\n $scope.apiError = true;\n $scope.isLoading = false;\n });\n\n if (BreadcrumbsService.getCrumbs().length === 0) {\n BreadcrumbsService.createHomeBreadcrumb(UsersService.homeRole);\n BreadcrumbsService.pushCrumb(\"instructor led\");\n }\n });\n };\n\n $scope.calendarAction = function (tense) {\n $scope.properFiltering = 'dueDate';\n\n $scope.assignmentFilter = $scope.getRequiredAssignments;\n $scope.orderProperty = 'dueDate.original';\n $scope.role = 'student';\n\n $scope.fetchAssignments();\n\n BreadcrumbsService.createHomeBreadcrumb(UsersService.homeRole);\n _this.BreadcrumbsService.pushCrumb(\"calendar\");\n };\n\n $scope.editCourse = function () { alert(\"This is where the manager edits the course\"); };\n\n /* Defined here temporarily for list view. Will need to be factored out into an override */\n $scope.fetchAssignments = function () {\n var assignments = AssignmentsService.fetch(UsersService.getId());\n\n $scope.filterView = 'app/templates/users/partials/filters/' + $scope.role + '.html';\n\n assignments.then(\n function (success) {\n var data = success;\n\n $scope.apiError = false;\n $scope.assignments = data;\n\n $scope.isLoading = false; // We're no longer loading!\n $scope.responseComplete = true;\n },\n function (failure) {\n $scope.apiError = true;\n $scope.isLoading = false;\n $scope.responseComplete = true;\n\n //returning the appropriate error\n if (failure.status === 404) {\n $scope.errorMessage = 'Sorry, there were no results found for your request.';\n } else {\n $scope.errorMessage = 'There was an error processing your request! Please try again later!';\n }\n }\n );\n };\n\n $scope.deleteCourseGroup = function (courseGroup, $event) {\n\n var confirmDrop = confirm(\"Are you sure you want to drop?\");\n\n if (confirmDrop) {\n \n var deleteCourseGroup = AssignmentsService.removeAssignment(courseGroup);\n\n deleteCourseGroup.then(function (success) {\n $scope.apiActionLoader = false;\n\n jQuery('#singlecourse').slideUp(500, function () {\n $scope.isLoading = true;\n $window.location.reload();\n });\n\n },\n function (failure) {\n alert(\"There was a problem deleting the Course Group\");\n });\n }\n };\n\n $scope.scheduleCourse = function (assignment) {\n\n };\n\n $scope.trim = function (value, length) {\n return $filter('trimmer')(value, true, length);\n };\n\n $scope.addOriginInfo = function (uri) {\n\n /**\n * Origin is undefined in IE, which it then takes and uses as a string to concatenate.\n * We need to ensure that location.origin is set, so we don't get funky URLs.\n */\n var origin = typeof window.location.origin !== 'undefined' ? window.location.origin : '';\n \n if (uri.indexOf(origin) === -1) {\n uri = origin + uri;\n }\n\n return uri;\n };\n\n $scope.hidePrereq = function () { jQuery('#preReqModal').hide(); };\n\n $scope.requestManagerApprovalCareerPath = function (assignment) {\n\n assignment.isLoading = true;\n assignment.requestManagerApprovalInProcess = true;\n\n var assignCareerCourseGroup = AssignmentsService.assignCourseGroupCourses(UsersService.getId(), assignment.id);\n assignCareerCourseGroup.then(function (success) {\n\n var managerApproval = CoursesService.requestManagerialApproval(assignment.id, assignment.type, UsersService.getId(), 0);\n managerApproval.then(function (success) {\n assignment.isLoading = false;\n //assignment.requestApprovalInProcess = false;\n\n $route.reload();\n\n }, function (failure) {\n assignment.isLoading = false;\n //assignment.requestApprovalInProcess = false;\n assignment.addCareerPathError.setError(failure.StatusCode, failure.ErrorMessage);\n $timeout(function () {\n assignment.addCareerPathError.reset();\n }, 3000);\n });\n }, function (failure) {\n assignment.addCareerPathError.setError(failure.StatusCode, failure.ErrorMessage);\n $timeout(function () {\n assignment.addCareerPathError.reset();\n }, 3000);\n });\n };\n\n $scope.launchCourse = function (assignment) {\n if (assignment.type !== 'wbt' && assignment.type !== 'survey' && assignment.type !== 'evaluation' && assignment.type !== 'assessment' && assignment.type !== 'careerPath') {\n return;\n }\n\n if (assignment.type === 'careerPath') {\n assignment.isLoading = true;\n\n var assignCourseGroups = AssignmentsService.assignCourseGroupCourses(UsersService.getId(), assignment.id);\n assignCourseGroups.then(function (success) {\n // Reload assignments to reflect changes\n var careerPaths = CoursesService.getCoursesByType(\"careerPath\");\n careerPaths.then(function(success) {\n $scope.assignments = success;\n\n _.each($scope.assignments, function(assignment) {\n assignment.isLoading = false;\n assignment.addCareerPathError = errorDisplayerUtil.create();\n });\n $window.scrollTo(0, 0);\n $scope.closeSlider();\n jQuery('span.filterItem').siblings('.filterItem').removeClass('selected');\n jQuery(jQuery('span.filterItem').siblings('#assignedFilter')[0]).addClass(\"selected\");\n\n $scope.currentAssignmentFilter = 'getNewestAssignmentsCareerPath';\n $scope.assignmentFilter = $scope.getNewestAssignmentsCareerPath;\n $scope.$broadcast('assignmentFilter', $scope.assignmentFilter);\n }, function (failure) {\n assignment.isLoading = false;\n // If we can't refresh the assignments, reload the route. If this call fails they probably didn't see any career paths to add anyway\n $route.reload();\n });\n }, function (failure) {\n assignment.isLoading = false;\n assignment.addCareerPathError.setError(failure.StatusCode, failure.ErrorMessage);\n $timeout(function() {\n assignment.addCareerPathError.reset();\n }, 3000);\n });\n return;\n }\n\n // call Prereq api to see if any are there prereqs that the user needs to take before launching this course\n // if any are there, send message and don't launch the course\n\n var prereqCall = AssignmentsService.getPrereqs(assignment.id);\n $scope.assignmentLaunched = assignment;\n\n prereqCall.then(function (success) {\n if (success.length === 0) {\n //if nothing, do nothing, move on\n _this.launchCourse($scope.assignmentLaunched);\n } else {\n //If there are prereqs - set the scoped variable for the prereq details \n $scope.prereqModalData = success;\n angular.element(document.querySelector('#preReqModal')).modal();\n }\n\n }, function (failure) {\n _this.showFailure($scope.assignmentLaunched, failure);\n });\n\n\n };\n \n\n\n \n _this.launchCourse = function(assignment){\n var single = {};\n\n $scope.assignment = assignment;\n $scope.launchCourseLoader = true;\n $scope.launcherUrlTitle = assignment.name;\n\n jQuery('#launchCourseLoader-' + assignment.id).toggle();\n jQuery('#launchCourseLoaderPlayButton-' + assignment.id).toggle();\n\n switch (assignment.type) {\n case 'wbt':\n single = CoursesService.getCourseUrl(assignment.id, assignment.type, UsersService.getId());\n\n break;\n case 'evaluation':\n single = EvaluationService.fetchSingle(UsersService.getId(), assignment.id);\n\n break;\n case 'assessment':\n single = AssessmentService.fetchSingle(UsersService.getId(), assignment.id);\n\n break;\n case 'survey':\n single = SurveyService.fetchSingle(UsersService.getId(), assignment.id);\n\n break;\n }\n\n single.then(function (success) {\n var uri = null;\n\n if (typeof success !== 'undefined' && typeof success.uri !== 'undefined') {\n uri = success.uri;\n } else if (typeof success !== 'undefined' && typeof success.contentLaunchUrl !== 'undefined') {\n uri = success.contentLaunchUrl;\n } else {\n uri = success;\n }\n\n // If the course is in a course group, make a transcript for the course group as well.\n if (assignment.isInCourseGroup) {\n var enrollCoursePromise = CoursesService.getCourseUrl(assignment.isInCourseGroup, assignment.type, UsersService.getId()); // Getting the URL will also enroll (create transcript) for the course.\n enrollCoursePromise.then(function(success) {\n // Don't do anything. There is no url for the course group course but we still need to create a transcript\n });\n }\n\n //NMLS - If the course is not new and it is a NMLS course, set the NMLSResumeCourse value to true \n // to be used as a parameter posted to BioSig\n if (assignment.isNMLS && assignment.status.toLowerCase() !== 'new') {\n localStorage.setItem(\"NMLSResumeCourse\", \"true\");\n } else { localStorage.setItem(\"NMLSResumeCourse\", \"false\"); }\n\n var uriAfterOriginCheck = uri.startsWith(\"http\") ? uri : $scope.addOriginInfo(uri);\n var launchedCourse = window.open(uriAfterOriginCheck);\n\n //If there is a resource flaged to launch with content, then open that resource\n if (assignment.resourceLaunchWithContent !== 0 && typeof assignment.courseAssets !== \"undefined\" && assignment.courseAssets !== null) {\n assignment.courseAssets.forEach(function (asset) {\n if (asset.id === assignment.resourceLaunchWithContent) {\n var resourceUri = asset.fileFormat !== 'url' ? $scope.addOriginInfo(asset.launchUri) : asset.launchUri;\n setTimeout(function () {\n $window.open(resourceUri, \"popup\", \"width=900,height=600,left=200,top=100\");\n }, 1500);\n }\n });\n }\n\n /**\n * Ensure we don't show certificate page on this type;\n */\n if (assignment.type === 'wbt') {\n\n\n var closeID = assignment.id;\n\n\n var timer = setInterval(function () {\n if ((launchedCourse !== null && launchedCourse.closed) || launchedCourse === null) {\n clearInterval(timer);\n\n // set base url as absolute path\n var url = '/';\n\n // get all base tags\n var bases = document.getElementsByTagName('base');\n\n // if there are any reset url to be base 0's href; this way we don't break the Url pattern\n if (bases.length > 0) {\n url = bases[0].href;\n }\n\n\n var transcript = AssignmentsService.fetchSingle(closeID, 'wbt');\n transcript.then(function (transcript) {\n var typeParam = $scope.currentRoute === \"\" ? \"assignments\" : $scope.currentRoute;\n url += 'courses/certificate/' + typeParam + '/' + transcript.transcriptId + '/';\n\n $window.location.href = url;\n });\n // combine and enjoy\n }\n }, 500);\n }\n else {\n var refreshTimer = setInterval(function () {\n if (launchedCourse.closed) {\n clearInterval(refreshTimer);\n $window.location.reload();\n }\n }, 500);\n\n }\n }, function (failure) {\n if (failure.ErrorMessage.indexOf(\"pending manager approval\") > 0) {\n UsersService.navigateToHome();\n }\n \n _this.showFailure(assignment, failure);\n });\n \n };\n \n _this.showFailure = function (assignment, failure) {\n jQuery('#launchCourseLoader-' + assignment.id).toggle();\n jQuery('#launchCourseLoaderPlayButton-' + assignment.id).toggle();\n\n $scope.launchCourseLoader = false;\n $scope.mainErrorFailure = true;\n $scope.mainErrorFailureMessage = 'There was a problem launching your course! Please try again later.';\n\n jQuery('#topErrorMessage').slideDown(function () {\n var _this = jQuery(this);\n\n setTimeout(function () {\n _this.slideUp(500);\n\n $scope.mainErrorFailure = false;\n }, 2000);\n });\n };\n\n $scope.openTranscriptCreator = function () {\n $scope.isLoading = false;\n\n $scope.success = false;\n\n $scope.addApiError = false;\n\n $scope.transcriptAddModal = {};\n $scope.transcriptAddModal.transcript = null;\n\n jQuery('#transcriptAddModal').modal();\n };\n\n $scope.createTranscript = function () {\n // If user is adding transcript for himself then route params will be null\n var userId = '';\n if ($route.current.params.param !== undefined && $route.current.params.param !== null) {\n var params = $route.current.params.param.split('/');\n userId = params[0];\n } else {\n userId = null;\n //Set user context to student if saving transcript for themselves\n UsersService.setUserContext('student');\n }\n\n var data = angular.copy(this.transcriptAddModal.transcript);\n data.userId = userId;\n\n $scope.transcriptAddLoader = true;\n\n data.startDate = data.startDate.moment.toDate();\n data.completedDate = data.completedDate.moment.toDate();\n \n var creation = TranscriptsService.create(data);\n\n creation.then(function () {\n $window.location.reload();\n }, function () {\n $scope.addApiError = true;\n $scope.transcriptAddLoader = false;\n $scope.isLoading = false;\n\n jQuery('#transcriptAddError').slideDown(500, function () {\n var _this = jQuery(this);\n\n setTimeout(function () {\n _this.slideUp(500);\n }, 1500);\n });\n });\n };\n\n $scope.openCertificate = function (assignment) {\n $scope.assignment = assignment;\n $scope.user = UsersService;\n\n jQuery('#certificateModal').modal();\n };\n\n $scope.getTransriptStatus = function (status) {\n status = status === 'successful' ? 'Successfully' : 'Unsuccessfully';\n\n return status + ' completed this course';\n };\n\n $scope.getTranscriptScoreText = function (assignment) {\n /* These types don't have scores.\n * See SLY-2921\n */\n if (assignment.type === 'courseGroup' || \n assignment.type === 'task' ||\n assignment.type === 'evaluation' ||\n assignment.type === 'survey') {\n\n return '';\n }\n\n var score = assignment.score;\n if (typeof score === 'undefined' || score === null || score === 0) {\n return ' with a score of 0';\n }\n\n return ' with a score of ' + score;\n };\n\n $scope.getCourseCode = function (courseCode) {\n if (courseCode === null || typeof courseCode === 'undefined') {\n return '00000';\n }\n return courseCode;\n };\n\n $scope.changeUrl = function (assignment) {\n var typeParam = $scope.currentRoute === \"\" ? \"assignments\" : $scope.currentRoute;\n $location.path('/courses/certificate/' + typeParam + '/' + assignment.transcriptId + '/').replace();\n };\n\n\n /**\n * User scope level filters\n */\n\n /**\n *\n * @param item current assignment to be iterated\n * @returns {boolean}\n */\n $scope.getCompletedAssignments = function (item) {\n return item.completedDate !== null && (item.status === 'completed' || item.status === 'successful');\n };\n\n $scope.getRequiredAssignments = function (item) {\n return item.isRequired === true && item.status !== 'successful';\n };\n\n $scope.getNewestAssignments = function (item) {\n return item.completedDate === null && item.status === 'new';\n };\n\n $scope.getNewestAssignmentsCareerPath = function(item) {\n return item.completedDate === null && (item.status === 'new' || item.status === 'pendingApproval' || item.status === 'inProgress');\n };\n\n $scope.getMyPicks = function (item) {\n return item.isUserAssigned === true;\n };\n\n $scope.getInProgress = function (item) {\n return item.status === 'inProgress';\n };\n\n $scope.getSurveysAndEvaluations = function (item) {\n return item.type === 'evaluation' || item.type === 'survey';\n };\n\n // Toggle highlights on the filter by on the assignments page\n jQuery('.filterItem').click(function () {\n jQuery(this).siblings('.filterItem').removeClass('selected');\n\n jQuery(this).addClass('selected');\n });\n\n $scope.clearForm = function () {\n $window.location.reload();\n };\n\n $scope.resetAddTranscriptModal = function (form) {\n if (typeof form !== 'undefined' && form !== null) {\n form.$setUntouched();\n form.$setPristine();\n }\n };\n\n $scope.completeAssignment = function (id, $event) {\n var completion = CoursesService.completeTask(id, UsersService.getId());\n\n $scope.apiActionLoader = true;\n\n completion.then(function (success) {\n\n jQuery('#singlecourse').slideUp(1000, function () {\n var courseCode = id;\n var viewTypeId = jQuery('#courseList-' + courseCode).length > 0 ? '#courseList-' + courseCode : '#courseTiles-' + courseCode;\n jQuery(viewTypeId).slideUp(500);\n });\n\n //Reload the page\n $scope.isLoading = true;\n $scope.homeAction();\n $window.location.reload();\n //$scope.switchFilter($scope.currentAssignmentFilter, $event);\n $scope.currentAssignmentFilter = 'InProgress';\n \n },\n\n function (failure) {\n jQuery('#offeringSlide').slideUp();\n $scope.apiErrorMessage = 'We\\'re sorry! We couldn\\'t complete the course. Please try again.';\n\n $scope.apiActionError = true;\n\n jQuery('#underButtonError').slideDown(500, function () {\n var _this = jQuery(this);\n\n setTimeout(function () {\n _this.slideUp(500);\n\n $scope.apiActionError = false;\n }, 1500);\n });\n });\n };\n\n $scope.dropElectiveCourse = function (assignment, $event) {\n $scope.apiActionError = false;\n $scope.apiActionLoader = true;\n\n var confirmDrop = confirm(\"Are you sure you want to drop?\");\n\n if (confirmDrop) {\n var assignmentDrop = AssignmentsService.removeAssignment(assignment);\n\n assignmentDrop.then(function (success) {\n $scope.apiActionLoader = false;\n\n jQuery('#singlecourse').slideUp(500, function () {\n // Force a re-render of the page; can't see another way except to fetch data for now;\n // couldn't get a refresh to work for whatever reason...\n $scope.isLoading = true;\n\n $scope.homeAction();\n $scope.switchFilter($scope.currentAssignmentFilter, $event);\n });\n }, function (response) {\n $scope.apiActionError = true;\n $scope.apiErrorMessage = 'Sorry! There was an issue dropping your course. Please try again!';\n $scope.apiActionLoader = false;\n\n jQuery('#transcriptAddError').slideDown(500, function () {\n var _this = jQuery(this);\n\n setTimeout(function () {\n _this.slideUp(500);\n }, 1500);\n });\n });\n } else {\n $scope.apiActionLoader = false;\n }\n };\n\n $scope.mapStatusLabel = function (status) {\n /* For mapping assignment status to a css class\n * The word new should be colored green for instance on the assignments page.\n * See https://projects.invisionapp.com/share/QS765VMF3#/screens/157758405/comments\n */\n var statuses = {\n 'completed': 'Completed',\n 'inProgress': 'In Progress',\n 'new': 'New',\n 'pendingApproval': 'Pending Approval',\n 'successful': 'Successful',\n 'unsuccessful': 'Unsuccessful'\n };\n\n if (status in statuses) {\n return statuses[status];\n }\n\n return status;\n };\n\n /**\n * Based on the design of the data layer, the correct status for upcoming ILTs must be inferred\n * from the roster counts.\n */\n $scope.mapStatusFromRosterCounts = function (offering) {\n var status = _this.getStatusForOfferingFromRoster(offering);\n\n switch (status) {\n case 'attending':\n return 'Confirmed';\n case 'waitlist':\n return 'Waitlisted';\n case 'pendingApproval':\n return 'Pending Manager Approval';\n default:\n return 'Not Registered';\n }\n };\n\n $scope.mapStatusForCssFromRosterCounts = function (offering) {\n return _this.getStatusForOfferingFromRoster(offering);\n };\n\n _this.getStatusForOfferingFromRoster = function (offering) {\n var defaultStatus = 'notRegistered';\n var loggedinUser = $scope.user.getId();\n //The roster now returns the total counts for attending and waitlisted students\n //If the logged in person is in the roster, their userid will be populated in the roster list\n //loop through the attending/waitlist/pendingApproval students and if a userID is not a dummy ie. 0\n //then return the roster status\n var attendingRoster = offering.roster.attendingStudents;\n for(var attend in attendingRoster)\n {\n var atten = attendingRoster[attend];\n if (typeof atten.id !== 'undefined' && atten.id !== 0 && loggedinUser === atten.id)\n {return atten.rosterStatus;}\n }\n\n var waitlistRoster = offering.roster.waitlistStudents;\n for(var waitL in waitlistRoster)\n {\n var wait = waitlistRoster[waitL];\n if (typeof wait.id !== 'undefined' && wait.id !== 0 && loggedinUser === wait.id)\n {return wait.rosterStatus;}\n }\n\n var pendingRoster = offering.roster.pendingApprovalStudents;\n for(var pender in pendingRoster)\n {\n var pend = pendingRoster[pender];\n if (typeof pend.id !== 'undefined' && pend.id !== 0 && loggedinUser === pend.id)\n {return pend.rosterStatus;}\n }\n \n return defaultStatus;\n };\n\n /**\n * Method to call to check if a user is registered for a course. If getStatusForOfferingFromRoster() returns the\n * string of not registered, that means the user is NOT registered. Hence, we need to check if the string that is\n * return is notRegistered. If it is the person is not registered; else they are.\n *\n * @param offering\n * @returns {boolean}\n */\n $scope.isUserRegisteredInILT = function (offering) {\n return _this.getStatusForOfferingFromRoster(offering) !== 'notRegistered';\n };\n \n $scope.isMaxWaitlistLimitReachedILT = function (offering) {\n var overTheMaxWaitlistLimit = false;\n if ((offering.roster.waitlistStudents.length >= offering.maxWaitlistSize) && (offering.attendingRosterCount >= offering.maxAllowedSize))\n { overTheMaxWaitlistLimit = true; }\n\n return overTheMaxWaitlistLimit;\n };\n\n /**\n * Return a CSS class name that represents due state of a course. This will override all other colors.\n *\n * @param date\n Example @param date\n startDateTime : Object\n apiDate : \"YYYY-MM-DD\"\n day : 20\n dayName : \"Mon\"\n fullDate : \"06.20.2016\"\n fullDateWithTime : \"06.20.2016 9:00 AM\"\n moment : Moment\n month : \"Jun\"\n monthForCalender : 5\n monthNumber : 6\n original : \"2016-06-20T14:00:00+00:00\"\n time : \"9:00 AM\"\n year : 2016\n\n where startDateTime.moment can be constructed with\n moment(startDateTime.original)\n\n Testing for off by one errors can be done via angular inspect of\n an assignment on the calendar view, grabbing an original time\n and playing with\n moment(\"2016-06-23T13:20:00+00:00\").isBetween(moment(), moment().add(7, 'days'))\n where \"2016-06-23T13:20:00+00:00\" is the date you want to test\n moment.js will convert \"2016-06-23T13:20:00+00:00\" into GMT time.\n and the return values of moment() will return GMT.\n\n * @returns {*}\n */\n $scope.getDueState = function (date) {\n if (date === null || typeof date.moment === 'undefined' || date.moment === null || date.moment === true) {\n return false;\n }\n \n if (date.moment.isBefore(moment())) {\n return 'overdue';\n }\n\n if (date.moment.isBetween(moment(), moment().add(7, 'days'))) {\n return 'duesoon';\n }\n\n return false;\n };\n\n $scope.getTranscriptDefaultCompletedOnDate = function () {\n var defaultCompletedOnDate = new Date();\n defaultCompletedOnDate.setYear(defaultCompletedOnDate.getFullYear() - 1);\n return defaultCompletedOnDate;\n };\n\n $scope.getTranscriptDefaultCompletedBeforeDate = function () {\n var defaultCompletedBeforeDate = new Date();\n return defaultCompletedBeforeDate;\n };\n\n $scope.closeSlider = function () {\n $rootScope.$broadcast('slider:view:close', _this);\n };\n\n $scope.changeInstructorCourseTense = function (tense) {\n $scope.homeAction(tense);\n };\n\n $scope.viewCertificate = function (transcriptId) {\n $location.url('courses/certificate/assignments/' + transcriptId);\n };\n\n $scope.toggleDescription = function (target) {\n // Get the description of the assignment we requested more info on\n var description = jQuery(target.currentTarget).parents('.title').children('.description');\n\n // Get all description boxes with data-opened=true\n // Except the one we clicked on\n // open all those mini descriptions on those boxes. and mark them as data-opened=false\n var descriptionBoxes = jQuery('.description[data-opened=\"true\"]');\n descriptionBoxes.each(function (i, e) {\n if ($(e).attr('data-assignment-id') === $(description).attr('data-assignment-id')) {\n return;\n }\n $(e).attr('data-opened', 'false');\n $(e).slideDown();\n });\n\n // *NOTE* We have a marker called data-opened which is a boolean\n // storing whether the larger description is open or not.\n // So if data-opened is true, the description element that we query for\n // in the first part of the function should be closed. if data-opened is false\n // the description element should be open. it's inverted.\n\n // Check if we have an open/close marker yet, if not, add one and mark it as open\n // Close the mini description\n var opened = description.attr('data-opened');\n if (opened === undefined) {\n console.log('undefined');\n description.attr('data-opened', 'true');\n description.slideUp();\n } else if (opened === 'true') {\n console.log('close the description');\n description.attr('data-opened', 'false');\n description.slideDown();\n } else if (opened === 'false') {\n console.log('open the description');\n description.attr('data-opened', 'true');\n description.slideUp();\n }\n };\n\n $scope.switchFilter = function (method, $event) {\n $scope.closeSlider();\n\n $scope.currentAssignmentFilter = method;\n\n $scope.assignmentFilter = method !== null ? $scope[method] : null;\n\n $scope.$broadcast('assignmentFilter', $scope.assignmentFilter);\n jQuery($event.currentTarget).siblings('.filterItem').removeClass('selected');\n\n jQuery($event.currentTarget).addClass('selected');\n };\n\n $scope.closeWelcomeVideoModal = function () {\n var neverShowAgain = jQuery('#repeat').is(':checked') ? 'watched' : 'false';\n\n localStorage.setItem('welcomeVideo', neverShowAgain);\n\n jQuery('#welcomeVideoModal').modal('hide');\n };\n\n /* Maps assignment.status to an english name. See TypeMaps mixin */\n $scope.getFullAssignmentTypeName = TypeMapsMixin.getFullAssignmentTypeName;\n\n /**\n * This must live down here because getRequiredAssignment must exist...Oy.\n */\n $scope.assignmentFilter = $scope.getRequiredAssignments;\n\n $scope.dump = function (value) { console.warn(value); };\n\n $scope.openManagerSearchFilters = function () {\n jQuery('#managerSearchFilter').slideToggle();\n };\n\n $scope.openAdvManagerSearchFilters = function () {\n jQuery('#advManagerSearchFilter').slideToggle();\n };\n\n $scope.isOpenForEnrollment = function (offering) {\n var openToEnroll = false;\n var today = new Date();\n\n if (typeof offering.requestedOn.jsDate === \"undefined\") {\n offering.requestedOn = dateUtil.formatDate(offering.requestedOn);\n }\n \n if (offering.requestedOn.jsDate <= today) {\n openToEnroll = true;\n }\n\n return openToEnroll;\n };\n\n $scope.setDefaultStartDateTime = function (dateObj) {\n if (typeof dateObj !== 'undefined' && dateObj !== null && _.isObject(dateObj.moment)) {\n var newdt = dateUtil.setPortalStartTime(dateObj.moment.toDate());\n dateObj = dateUtil.formatDate(newdt);\n } else {\n dateObj = null;\n }\n return dateObj;\n };\n\n $scope.setDefaultEndDateTime = function (dateObj) {\n if (typeof dateObj !== 'undefined' && dateObj !== null && _.isObject(dateObj.moment)) {\n var newdt = dateUtil.setPortalEndTime(dateObj.moment.toDate());\n dateObj = dateUtil.formatDate(newdt);\n } else {\n dateObj = null;\n }\n return dateObj;\n };\n\n $scope.setDueDateEndTimeForMomentObj = function (momentObj) {\n if (typeof dateObj !== 'undefined' && dateObj !== null) {\n var newdt = dateUtil.setPortalEndTime(momentObj.toDate());\n momentObj.set({ hour: newdt.getHours(), minute: newdt.getMinutes(), second: newdt.getSeconds(), millisecond: newdt.getMilliseconds() });\n }\n };\n\n $scope.getEndDateTimeFromPicker = function (dateObj) {\n var result;\n\n if (typeof dateObj !== 'undefined' && dateObj !== null && _.isObject(dateObj)) {\n if (typeof dateObj.moment !== 'undefined' && dateObj.moment !== null) {\n if (_.isObject(dateObj.moment)) {\n if (typeof dateObj.displayTime === \"undefined\" || dateObj.displayTime === null) {\n dateObj = $scope.setDefaultEndDateTime(dateObj);\n }\n result = dateUtil.formatDate(dateObj.moment.toDate());\n result.displayTime = dateObj.displayTime;\n } else {\n result = null;\n }\n } else {\n $scope.setDueDateEndTimeForMomentObj(dateObj);\n result = dateUtil.formatDate(dateObj.toDate());\n }\n } else {\n result = null;\n }\n\n return result;\n };\n\n $scope.triggerTranscriptSearch = function (studentId) {\n\n if ($scope.transcriptSearch.startDate === null || $scope.transcriptSearch.endDate === null ||\n !_.isObject($scope.transcriptSearch.startDate.moment) || !_.isObject($scope.transcriptSearch.endDate.moment)) {\n return;\n }\n else if ($scope.transcriptSearch.startDate.moment.toDate() > $scope.transcriptSearch.endDate.moment.toDate() ) {\n $scope.dateRangeError = true;\n return;\n }\n else {\n\n var startDate2 = $scope.transcriptSearch.startDate.moment.format('YYYY-MM-DD');\n var endDate = $scope.transcriptSearch.endDate.moment.format('YYYY-MM-DD');\n\n $scope.pageOptions.error.reset();\n $scope.pageOptions.isLoading = true;\n $scope.responseComplete = false;\n\n var transcript = TranscriptsService.rangeFetch(studentId, startDate2, endDate);\n\n transcript.then(function (success) {\n $scope.apiError = false;\n $scope.assignments = success;\n $scope.pageOptions.isLoading = false; // We're no longer loading!\n $scope.responseComplete = true;\n }, function (failure) {\n $scope.pageOptions.error.setError(failure.ErrorCode, failure.ErrorMessage);\n\n $scope.assignments = null;\n\n $scope.pageOptions.isLoading = false; // We're no longer loading!\n\n });\n }\n };\n\n $scope.isCourseGroupType = function (type, includeCareerPath) {\n if (type === 'courseGroupCertification' || type === 'courseGroupCurricula' || type === 'courseGroup' || (includeCareerPath && type === 'careerPath')) {\n return true;\n }\n return false;\n };\n\n\n\n /**** Load role specific functionality ****/\n /* This function takes the scope object\n * and overrides anything specific to the current page\n * or role.\n */\n RoleMapsMixin.overrideScope($scope);\n\n /* Call route action like homeAction here.\n * Return 404 if action doesn't exist after\n * injecting mixin. For example, if a certain role\n * doesn't have an ILT calendar, they will get a 404\n * Not every role needs every page.\n * Please follow the routing structure; non-alphanumeric characters should not be used.\n */\n if (currentMethod === 'ilt-calendar') {\n $scope.iltCalendarAction();\n } else {\n $scope[currentMethod + 'Action']();\n }\n // @TODO implement 404 action\n}]);\n","\napp.directive(\"bioSigModal\", ['$rootScope', '$sce', '$route', 'UsersService', 'NMLSService', function ($rootScope, $sce, $route, UsersService, NMLSService) {\n // returns the Directive Definition Object\n return {\n restrict: 'E',\n transclude: true,\n templateUrl: 'app/templates/users/home/modals/BioSigModal.html',\n link: function (scope, element, attrs, ctrl) {\n\n scope.isError = false;\n scope.isbioSigModalLoading = true;\n scope.bioSigLoader = true;\n scope.showBioSigFrame = false;\n scope.reloadAssignments = false;\n\n scope.openBioSigModal = function (context) {\n if (document.getElementById(\"bioSigFrameOpen\") !== null) {\n document.getElementById(\"bioSigFrameOpen\").src = \"\";\n document.getElementById(\"bioSigFrameOpen\").id = \"bioSigFrame\";\n }\n var user = UsersService.fetch(UsersService.getId());\n user.then(function (success) {\n //Set the scoped NMLS values\n scope.user = success;\n if (typeof scope.user.nmlsEmail === 'undefined' || scope.user.nmlsEmail === \"\") {\n scope.user.nmlsEmail = scope.user.email;\n }\n \n scope.isbioSigModalLoading = false;\n scope.bioSigLoader = false;\n scope.showBioSigFrame = false;\n }, function (failure) {\n scope.isbioSigModalLoading = false;\n scope.bioSigLoader = false;\n });\n\n document.getElementById(context + \"bioSig\").querySelector('#bioSigFrame').id = \"bioSigFrameOpen\";\n angular.element(document.getElementById(context + \"bioSig\").querySelector('#bioSigModal')).modal();\n };\n\n scope.callBioSig = function (user) {\n scope.isbioSigModalLoading = true;\n var nmlsID = user.nmlsID;\n var nmlsEmail = user.nmlsEmail;\n scope.bioSigLoader = true;\n //No redirectUrl set for enrollment, inbound BSI call will add url to redirect to\n var redirectUrl = \"\";\n \n //Make a call to get BioSig URL (redirectUrl, courseId, courseItemIdentifier, activity, nmlsID, email, d4, d5)\n var bioSigCall = NMLSService.getBioSigUri(redirectUrl, '0', 'Enrollment', 'enroll', nmlsID, nmlsEmail, 'Enroll Course', '0');\n bioSigCall.then(function (success) {\n scope.bioSigLoader = false;\n scope.showBioSigFrame = true;\n scope.reloadAssignments = true;\n document.getElementById(\"bioSigFrameOpen\").src = success;\n }, function () {\n scope.isError = true;\n scope.errorMessage = 'We were unable to get a connection to BioSig, please try again.';\n scope.isbioSigModalLoading = false;\n scope.bioSigLoader = false;\n });\n };\n\n scope.refresh = function (reloadAssignments) {\n \n if (document.getElementById(\"bioSigFrameOpen\") !== null) {\n document.getElementById(\"bioSigFrameOpen\").src = \"\";\n document.getElementById(\"bioSigFrameOpen\").id = \"bioSigFrame\";\n }\n scope.isError = false;\n scope.isbioSigModalLoading = true;\n scope.bioSigLoader = true;\n scope.showBioSigFrame = false;\n\n if (reloadAssignments) {\n $route.reload();\n }\n\n };\n\n } // end link object\n}; // end directive return\n}]);\n","/*\n Directive to handle a maximum time as a string. Parses the time string and compares it to the value. Invalid if the time entered is greater than the minimum value.\n*/\napp.directive('maxTimeString', ['dateUtil', function (dateUtil) {\n\n return {\n // restrict to an attribute type.\n restrict: 'A',\n\n // element must have ng-model attribute.\n require: 'ngModel',\n\n // scope = the parent scope\n // elem = the element the directive is on\n // attr = a dictionary of attributes on the element\n // ctrl = the controller for ngModel.\n link: function (scope, elem, attr, ctrl) {\n\n ctrl.$validators.maxTimeString = function (modelValue) {\n var valid = true;\n var maxTime = dateUtil.parseTime(attr.maxTimeString);\n // If it can't parse the time, it's the wrong format so don't even bother trying to validate against the max time.\n // But we want to assume this is valid if the format is wrong, otherwise, this validation could cover up a regex validation that validates the time format.\n if (maxTime !== null) {\n var valueTime = dateUtil.parseTime(modelValue);\n if (valueTime !== null) {\n if (valueTime > maxTime) {\n valid = false;\n }\n }\n }\n return valid;\n };\n } // end link function\n }; // end return\n}]);","app.directive('addAssignmentsWithLibraryModal', [function () {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/users/home/modals/add-assignment-with-library.html',\n controller: ['$scope', '$location', '$attrs', '$timeout', '$filter', '$route', '$q', 'errorDisplayerUtil', 'UsersService', 'AssignmentsService', 'CoursesService', 'TeamService', 'dateUtil', 'TranscriptsService', 'CatalogService', 'CategoriesService','RosterService',\n function ($scope, $location, $attrs, $timeout, $filter, $route, $q, errorDisplayerUtil, UsersService, AssignmentsService, CoursesService, TeamService, dateUtil, TranscriptsService, CatalogService, CategoriesService,RosterService) {\n\n\n$scope.addAssignmentsWithLibrary = {};\n\n$scope.addAssignmentsWithLibrary.error = errorDisplayerUtil.create();\n\n/**\n * Fix for 2403. Since JS is loose, not defining an attribute on an object returns undefined, which resolves to false,\n * which is bad for us, since we need it to resolve to true later.\n */\n$scope.addAssignmentsWithLibrary.noUsersSelectedError = false;\n$scope.addAssignmentsWithLibrary.initialIsLoading = true;\n$scope.addAssignmentsWithLibrary.initialFailed = false;\n$scope.addAssignmentsWithLibrary.offeringError = false;\n\n /* Stores which version of the modal we should be using */\n$scope.addAssignmentsWithLibrary.TYPE_ENUM = {\n SIMPLE: 1,\n WITH_DATE: 2,\n TEAM_SELECT: 3\n};\n\n$scope.parameter = typeof $attrs.displaytype !== 'undefined' ? $attrs.displaytype : 1;\n$scope.addAssignmentsWithLibrary.displaytype = parseInt($scope.parameter);\n\n$scope.studentId = typeof $attrs.userid !== 'undefined' ? $attrs.userid : null;\n\n\n\n/* Stores which step of the add assignments modal to track */\n$scope.addAssignmentsWithLibrary.STEP_ENUM = {\n ASSIGNMENTS: 1,\n DUE_DATE: 2,\n AUDIENCE: 3\n};\n\n/* Stores what's currently displayed on the search tab */\n$scope.addAssignmentsWithLibrary.SEARCH_TAB_ENUM = {\n PLEASE_BEGIN: 0, /* Haven't typed anything yet or deleted search term */\n LOADING: 1,\n ERROR: 2,\n NO_RESULTS: 3,\n RESULTS_FOUND: 4\n};\n$scope.addAssignmentsWithLibrary.searchTabState = $scope.addAssignmentsWithLibrary.SEARCH_TAB_ENUM.PLEASE_BEGIN;\n\n/* Stores what's currently displayed on the audience tab */\n$scope.addAssignmentsWithLibrary.AUDIENCE_TAB_ENUM = {\n SELECT_USERS: 0,\n LOADING: 1,\n ERROR: 2,\n SUCCESS: 3\n};\n$scope.addAssignmentsWithLibrary.audienceTabState = $scope.addAssignmentsWithLibrary.AUDIENCE_TAB_ENUM.SELECT_USERS;\n\n$scope.addAssignmentsWithLibrary.searchCatalog = Array();\n$scope.addAssignmentsWithLibrary.searchLibraries = Array();\n$scope.addAssignmentsWithLibrary.searchCategories = Array();\n$scope.addAssignmentsWithLibrary.searchFields = Array();\n$scope.dueDates = {};\n\n$scope.$on('openAddAssignmentsModal', function (evt, params) {\n $scope.addAssignmentsWithLibrary.displaytype = params.displaytype;\n $scope.studentId = params.studentId;\n $scope.showOfferingsOnAssignments = SetShowOfferingsOnAssignments($location.path(), $scope.addAssignmentsWithLibrary.displaytype);\n jQuery('#addAssignmentsWithLibraryModal').modal();\n if ($scope.addAssignmentsWithLibrary.displaytype === $scope.addAssignmentsWithLibrary.TYPE_ENUM.TEAM_SELECT) {\n $scope.stepThreeView = 'app/templates/users/home/modals/addAssignmentViews/step3.audience.fullTeam.library.html';\n var teamMember = UsersService.user;\n teamMember.studentId = UsersService.getId();\n getTeamRecursiveList(teamMember);\n var alternateTeam = null;\n if ($scope.apiDueDate !== null) {\n alternateTeam = TeamService.getAlternateTeamList($scope.startDate.apiDate, $scope.endDate.apiDate, $scope.fullyRecursiveBottom, $scope.apiDueDate);\n }\n else {\n alternateTeam = TeamService.getAlternateTeamList($scope.startDate.apiDate, $scope.endDate.apiDate, $scope.fullyRecursiveBottom, null);\n }\n alternateTeam.then(function (teamTree) {\n teamTree = teamTree;\n\n var audienceRoot = {};\n\n audienceRoot.firstName = teamMember.firstName;\n audienceRoot.lastName = teamMember.lastName;\n audienceRoot.studentId = teamMember.studentId;\n audienceRoot.teamList = teamTree;\n\n $scope.addAssignmentsWithLibrary.alternateDataList = audienceRoot; // needs to be in array because\n // end result is list of lists\n\n // add my team (direct) list to audienceData\n\n // Make all team members hidden by default\n $scope.setPropertyOnAllNodes($scope.addAssignmentsWithLibrary.alternateDataList, 'hidden', true);\n\n // uncheck all team members by default\n $scope.setPropertyOnAllNodes($scope.addAssignmentsWithLibrary.alternateDataList, 'checked', false);\n }, function (failure) {\n // @TODO do something if we can't load the modal\n console.log(failure);\n });\n }\n if ($scope.addAssignmentsWithLibrary.searchCatalog.length === 0) {\n var coursePromises = [];\n coursePromises.push(CatalogService.getBaiCatalogData()); // Used for catalog info\n coursePromises.push(CoursesService.getActiveCoursesForOrg()); // Used as course list, filtered using 2 above\n $q.all(coursePromises).then(function (coursesData) {\n var catalogTree = coursesData[0];\n $scope.addAssignmentsWithLibrary.searchCatalog = coursesData[1];\n _.each(catalogTree.formattedCatalogTreeData, function (catalog) {\n $scope.assignCatalog(catalog, catalog.nodeId, catalog.name);\n });\n // Create unique lists of catalogs and course types for dropdowns\n _.each($scope.addAssignmentsWithLibrary.searchCatalog, function (c) {\n if (c.rootNodeId !== null && typeof c.rootNodeId !== 'undefined' && _.findIndex($scope.addAssignmentsWithLibrary.searchLibraries, { \"nodeId\": c.rootNodeId }) === -1) {\n $scope.addAssignmentsWithLibrary.searchLibraries.push({ \"nodeId\": c.rootNodeId, \"name\": c.rootNodeDescription });\n }\n if (_.findIndex($scope.addAssignmentsWithLibrary.searchCategories, { \"friendlyName\": $filter('assignmentAssetTypeName')(c.type) }) === -1) {\n $scope.addAssignmentsWithLibrary.searchCategories.push({ \"type\": c.type, \"friendlyName\": $filter('assignmentAssetTypeName')(c.type) });\n }\n });\n $scope.addAssignmentsWithLibrary.searchFields = CoursesService.getSearchableCatalog();\n $scope.addAssignmentsWithLibrary.initialIsLoading = false;\n $scope.addAssignmentsWithLibrary.selectAll = false;\n $scope.catalogDropdownValues = _.sortBy($scope.catalogDropdownValues, \"name\");\n $scope.courseTypeDropdownValues = _.sortBy($scope.courseTypeDropdownValues, \"type\");\n $scope.courseTypeDropdownValues = $scope.courseTypeDropdownValues.reverse();\n }, function (failure) {\n $scope.coursesApiAreLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.viewCoursesError.error.setError(errorCode, message);\n });\n \n }\n else {\n $scope.addAssignmentsWithLibrary.initialIsLoading = false;\n }\n});\n\n$scope.assignCatalog = function (node, rootId, rootDescription) {\n var nodeId = node.nodeId;\n _.each($scope.addAssignmentsWithLibrary.searchCatalog, function (course) {\n if (course.catalogId === nodeId) {\n course.rootNodeId = rootId;\n course.rootNodeDescription = rootDescription;\n } else if (course.catalogId === null) {\n course.rootNodeId = 0;\n course.rootNodeDescription = \"Custom Catalog\";\n }\n });\n\n if (node.nodes) {\n _.each(node.nodes, function (childNode) {\n $scope.assignCatalog(childNode, rootId, rootDescription);\n });\n }\n};\n\n\n/* Stores assignments */\n// This one stores the list of assignments in the\n// search page\n$scope.addAssignmentsWithLibrary.searchResults = Array();\n// This one stores assignments indexed by ID\n// we can add assignments with\n// $scope.addAssignmentsWithLibrary.queuedAssignments[assignment.id] = assignment;\n// and delete them with\n// delete $scope.addAssignmentsWithLibrary.queuedAssignments[assignment.id];\n// and check if an assignment exists with\n// if (assignment.id in $scope.addAssignmentsWithLibrary.queuedAssignments)\n$scope.addAssignmentsWithLibrary.queuedAssignments = {};\n$scope.addAssignmentsWithLibrary.selectAll = false;\n// Used on due date tab. keeps list of assignments that have been unchecked\n// If the user goes to the first or last tabs, this variable will be used to remove assignments\n// from the list of queued assignments\n// Used in same manner as $scope.addAssignmentsWithLibrary.queuedAssignments except it's the opposite\n$scope.addAssignmentsWithLibrary.assignmentsToggledForRemoval = {};\n\n$scope.addAssignmentsWithLibrary.clearAddAssignmentsModal = function () {\n\n _.each($scope.addAssignmentsWithLibrary.searchResults, function (assignment) {\n\n assignment.checked = false; \n\n if (assignment.type === 'ilt') {\n\n assignment.viewOfferings = false;\n assignment.selectedOffering = null;\n assignment.offerings = null;\n assignment.enrollError = false;\n }\n });\n\n if ($scope.addAssignmentsWithLibrary.alternateDataList) {\n $scope.setPropertyOnAllNodes($scope.addAssignmentsWithLibrary.alternateDataList, 'checked', false);\n }\n if ($scope.addAssignmentsWithLibrary.audienceData !== null || $scope.addAssignmentsWithLibrary.audienceData !== undefined) {\n $scope.setPropertyOnAllNodes($scope.addAssignmentsWithLibrary.audienceData, 'checked', false);\n }\n $scope.addAssignmentsWithLibrary.queuedAssignments = {};\n $scope.addAssignmentsWithLibrary.assignmentsToggledForRemoval = {};\n $scope.addAssignmentsWithLibrary.selectedUsers = {};\n $scope.addAssignmentsWithLibrary.keyword = '';\n $scope.addAssignmentsWithLibrary.library = null;\n $scope.addAssignmentsWithLibrary.contentType = null;\n $scope.addAssignmentsWithLibrary.selectAll = false;\n $scope.addAssignmentsWithLibrary.noUsersSelectedError = false;\n $scope.addAssignmentsWithLibrary.step = $scope.addAssignmentsWithLibrary.STEP_ENUM.ASSIGNMENTS;\n $scope.addAssignmentsWithLibrary.searchResults = Array();\n $scope.addAssignmentsWithLibrary.searchTabState = $scope.addAssignmentsWithLibrary.SEARCH_TAB_ENUM.PLEASE_BEGIN;\n $scope.addAssignmentsWithLibrary.audienceTabState = $scope.addAssignmentsWithLibrary.AUDIENCE_TAB_ENUM.SELECT_USERS;\n $scope.addAssignmentsWithLibrary.autoOpenedList = false;\n $scope.addAssignmentsWithLibrary.noAssignmentsSelectedError = false;\n $scope.addAssignmentsWithLibrary.anySelected = false;\n $scope.addAssignmentsWithLibrary.selectAll = false;\n $scope.addAssignmentsWithLibrary.selectedCount = 0;\n $scope.addAssignmentsWithLibrary.error.reset();\n $scope.addAssignmentsWithLibrary.offeringError = false;\n activateAssignmentsPill();\n\n};\n\n\n\n// Stores the list of selected users\n// Used same way as $scope.addAssignmentsWithLibrary.queuedAssignments\n// See that $scope.addAssignmentsWithLibrary.queuedAssignments for details\n$scope.addAssignmentsWithLibrary.selectedUsers = {};\n\n// On audience tab, stores whether the Everyone, Alternate or Direct Team boxes are checked\n// When these are checked, when the user is submitting in tab 3, these will be checked\n// and will change the content / override $scope.addAssignmentsWithLibrary.selectedUsers\n\n/* Used for storing search data for filtering assignments at top of modal */\n$scope.addAssignmentsWithLibrary.keyword = '';\n\n$scope.addAssignmentsWithLibrary.step = $scope.addAssignmentsWithLibrary.STEP_ENUM.ASSIGNMENTS;\n\n// Keeps track of whether we should disable the next/submit button\n$scope.addAssignmentsWithLibrary.buttonDisabled = false;\n\n// Flag to automatically open the team list in the add assignment modals.\n$scope.addAssignmentsWithLibrary.autoOpenedList = false;\n\n// In addition to revealing the select assignments tab\n// this function checks the list of assignments toggled for removal\n// and removes those assignments from the queue\n$scope.addAssignmentsWithLibrary.selectAssignments = function () {\n // reset the last tab in case the user wants to assign more assignments\n $scope.addAssignmentsWithLibrary.audienceTabState = $scope.addAssignmentsWithLibrary.AUDIENCE_TAB_ENUM.SELECT_USERS;\n\n /* Check if any assignments are in the list of assignments toggled for removal\n * Remove those assignments */\n deleteAssignmentsToggledForRemoval($scope.addAssignmentsWithLibrary.queuedAssignments, $scope.addAssignmentsWithLibrary.assignmentsToggledForRemoval);\n $scope.addAssignmentsWithLibrary.assignmentsToggledForRemoval = {}; // need to figure out how to clear this inside the function\n\n $scope.addAssignmentsWithLibrary.step = $scope.addAssignmentsWithLibrary.STEP_ENUM.ASSIGNMENTS;\n activateAssignmentsPill();\n};\n\n/* These three functions are necessary\n * because there isn't a clear way to override how bootstrap pills work\n * If there's a way to do it, override these functions\n */\nvar activateAssignmentsPill = function () {\n setTimeout(function () {\n //angular.element('#assignmentsTabSelector').addClass('active');\n //angular.element('#dueDateTabSelector').removeClass('active');\n //angular.element('#audienceTabSelector').removeClass('active');\n\n angular.element('#assignmentsTabSelector > a').addClass('portalBackground');\n angular.element('#assignmentsTabSelector > .nav-arrow').addClass('portalBorderLeft');\n if ($scope.addAssignmentsWithLibrary.displaytype >= $scope.addAssignmentsWithLibrary.TYPE_ENUM.WITH_DATE) {\n angular.element('#dueDateTabSelector > a').removeClass('portalBackground');\n angular.element('#dueDateTabSelector > .nav-arrow').removeClass('portalBorderLeft');\n angular.element('#dueDateTabSelector > .nav-wedge').removeClass('portalBorderTop portalBorderRight portalBorderBottom');\n\n if ($scope.addAssignmentsWithLibrary.displaytype === $scope.addAssignmentsWithLibrary.TYPE_ENUM.TEAM_SELECT) {\n angular.element('#audienceTabSelector > a').removeClass('portalBackground');\n angular.element('#audienceTabSelector > .nav-arrow').removeClass('portalBorderLeft');\n angular.element('#audienceTabSelector > .nav-wedge').removeClass('portalBorderTop portalBorderRight portalBorderBottom');\n }\n }\n }, 1);\n};\n\nvar activateDueDatePill = function () {\n setTimeout(function () {\n //angular.element('#assignmentsTabSelector').removeClass('active');\n //angular.element('#dueDateTabSelector').addClass('active');\n //angular.element('#audienceTabSelector').removeClass('active');\n\n // Clear extra colors coming from custom CSS call for first tab\n angular.element('#assignmentsTabSelector > a').removeClass('portalBackground');\n angular.element('#assignmentsTabSelector > .nav-arrow').removeClass('portalBorderLeft');\n\n // Add extra colors coming from custom CSS call for second tab\n angular.element('#dueDateTabSelector > a').addClass('portalBackground');\n angular.element('#dueDateTabSelector > .nav-arrow').addClass('portalBorderLeft');\n angular.element('#dueDateTabSelector > .nav-wedge').addClass('portalBorderTop portalBorderRight portalBorderBottom');\n if ($scope.addAssignmentsWithLibrary.displaytype === $scope.addAssignmentsWithLibrary.TYPE_ENUM.TEAM_SELECT) {\n angular.element('#audienceTabSelector > a').removeClass('portalBackground');\n angular.element('#audienceTabSelector > .nav-arrow').removeClass('portalBorderLeft');\n angular.element('#audienceTabSelector > .nav-wedge').removeClass('portalBorderTop portalBorderRight portalBorderBottom');\n }\n }, 1);\n};\n\nvar activateAudiencePill = function () {\n setTimeout(function () {\n //angular.element('#assignmentsTabSelector').removeClass('active');\n //angular.element('#dueDateTabSelector').removeClass('active');\n //angular.element('#audienceTabSelector').addClass('active');\n\n angular.element('#assignmentsTabSelector > a').removeClass('portalBackground');\n angular.element('#assignmentsTabSelector > .nav-arrow').removeClass('portalBorderLeft');\n\n // Clear colors coming from custom CSS call for second tab\n angular.element('#dueDateTabSelector > a').removeClass('portalBackground');\n angular.element('#dueDateTabSelector > .nav-arrow').removeClass('portalBorderLeft');\n angular.element('#dueDateTabSelector > .nav-wedge').removeClass('portalBorderTop portalBorderRight portalBorderBottom');\n\n // Add extra colors coming from custom CSS call for third tab\n angular.element('#audienceTabSelector > a').addClass('portalBackground');\n angular.element('#audienceTabSelector > .nav-wedge').addClass('portalBorderTop portalBorderRight portalBorderBottom');\n }, 1);\n};\n\n// This function goes through every assignment toggled for removal\n// in the assignmentsToggledForRemoval variable\n// and removes it from the list of queuedAssignments\n\nvar deleteAssignmentsToggledForRemoval = function (queuedAssignments, assignmentsToggledForRemoval) {\n var assignmentsToRemoveIds = Object.keys(assignmentsToggledForRemoval);\n\n for (var i = 0; i < assignmentsToRemoveIds.length; i += 1) {\n if (assignmentsToRemoveIds[i] in queuedAssignments) {\n delete queuedAssignments[assignmentsToRemoveIds[i]];\n }\n }\n};\n\n// This function also checks if we've selected some assignments,\n// if not, it puts the user back on the select assignments tab.\n$scope.addAssignmentsWithLibrary.selectDueDate = function () {\n // reset the last tab in case the user wants to assign more assignments\n $scope.addAssignmentsWithLibrary.audienceTabState = $scope.addAssignmentsWithLibrary.AUDIENCE_TAB_ENUM.SELECT_USERS;\n\n // If the user hasn't selected any assignments, don't let them go to the due date tab\n if (Object.keys($scope.addAssignmentsWithLibrary.queuedAssignments).length === 0) {\n $scope.addAssignmentsWithLibrary.step = $scope.addAssignmentsWithLibrary.STEP_ENUM.ASSIGNMENTS;\n activateAssignmentsPill();\n $scope.addAssignmentsWithLibrary.noAssignmentsSelectedError = true;\n return;\n }\n\n // otherwise let the user eat cake!\n $scope.addAssignmentsWithLibrary.step = $scope.addAssignmentsWithLibrary.STEP_ENUM.DUE_DATE;\n $scope.addAssignmentsWithLibrary.noAssignmentsSelectedError = false;\n\n // Mark career paths recommended and all other course types recommended\n _.each($scope.addAssignmentsWithLibrary.queuedAssignments, function (assignment) {\n if (assignment.type === \"careerPath\" || assignment.productType === \"Document\") {\n assignment.isRequired = false;\n } else {\n assignment.isRequired = true;\n }\n });\n\n activateDueDatePill();\n};\n\n$scope.addAssignmentsWithLibrary.nextButton = function () {\n switch ($scope.addAssignmentsWithLibrary.displaytype) {\n case $scope.addAssignmentsWithLibrary.TYPE_ENUM.SIMPLE:\n $scope.addAssignmentsWithLibrary.submitAssignmentsForSelectedUsers();\n\n break;\n case $scope.addAssignmentsWithLibrary.TYPE_ENUM.WITH_DATE:\n switch ($scope.addAssignmentsWithLibrary.step) {\n case $scope.addAssignmentsWithLibrary.STEP_ENUM.ASSIGNMENTS:\n $scope.addAssignmentsWithLibrary.selectDueDate();\n\n break;\n case $scope.addAssignmentsWithLibrary.STEP_ENUM.DUE_DATE:\n $scope.addAssignmentsWithLibrary.submitAssignmentsForSelectedUsers();\n\n break;\n }\n break;\n case $scope.addAssignmentsWithLibrary.TYPE_ENUM.TEAM_SELECT:\n switch ($scope.addAssignmentsWithLibrary.step) {\n case $scope.addAssignmentsWithLibrary.STEP_ENUM.ASSIGNMENTS:\n $scope.addAssignmentsWithLibrary.selectDueDate();\n\n break;\n case $scope.addAssignmentsWithLibrary.STEP_ENUM.DUE_DATE:\n $scope.addAssignmentsWithLibrary.selectAudience();\n\n break;\n // Assign the selected assignments to all selected users\n case $scope.addAssignmentsWithLibrary.STEP_ENUM.AUDIENCE:\n $scope.addAssignmentsWithLibrary.submitAssignmentsForSelectedUsers();\n //jQuery('#addAssignmentsWithLibraryModal').modal('hide');\n\n break;\n }\n break;\n }\n};\n\n\n/*** search assignments tab logic */\n/* On the select assignments tab, this function allows the user to\n * search for assignments by assignment type. It handles calling the service\n * and displaying the data.\n * Also checks if assignments were already queued. if so, premarks them as checked\n */\n $scope.addAssignmentsWithLibrary.searchAssignments = function (keyword) {\n /* Adding this class fixes the issue where a nested modal, when the child is closed, */\n /* removes the class required to scroll to see the full parent modal */\n\n $('body').addClass('modal-open');\n\n return $q(function (resolve, reject) {\n // If no search criteria, return nothing\n if ((typeof keyword === 'undefined' || keyword === null || keyword === \"\") &&\n ($scope.addAssignmentsWithLibrary.library === null || typeof $scope.addAssignmentsWithLibrary.library === 'undefined' || $scope.addAssignmentsWithLibrary.library === \"\") &&\n ($scope.addAssignmentsWithLibrary.contentType === null || typeof $scope.addAssignmentsWithLibrary.contentType === 'undefined' || $scope.addAssignmentsWithLibrary.contentType === \"\")) {\n $scope.addAssignmentsWithLibrary.searchResults = null;\n resolve(null); // Don't return anything\n }\n\n var checkKeyword = false;\n if (typeof keyword !== 'undefined' && keyword !== null && keyword !== \"\") {\n var stubResults = $filter('filter')($scope.addAssignmentsWithLibrary.searchFields, keyword);\n $scope.addAssignmentsWithLibrary.searchResults = $filter('filter')($scope.addAssignmentsWithLibrary.searchCatalog, function (course) {\n for (i = 0; i < stubResults.length; i++) {\n if (course.code === stubResults[i].code) {\n return course;\n }\n }\n });\n checkKeyword = true;\n }\n\n var checkCatalog = false;\n if ($scope.addAssignmentsWithLibrary.library !== null && typeof $scope.addAssignmentsWithLibrary.library !== 'undefined' && $scope.addAssignmentsWithLibrary.library !== \"\") {\n checkCatalog = true;\n if (checkKeyword) {\n $scope.addAssignmentsWithLibrary.searchResults = $filter('filter')($scope.addAssignmentsWithLibrary.searchResults, function (course) {\n if (course.rootNodeDescription === $scope.addAssignmentsWithLibrary.library.name) {\n return course;\n }\n });\n } else {\n $scope.addAssignmentsWithLibrary.searchResults = $filter('filter')($scope.addAssignmentsWithLibrary.searchCatalog, function (course) {\n if (course.rootNodeDescription === $scope.addAssignmentsWithLibrary.library.name) {\n return course;\n }\n });\n }\n }\n if ($scope.addAssignmentsWithLibrary.contentType !== null && typeof $scope.addAssignmentsWithLibrary.contentType !== 'undefined' && $scope.addAssignmentsWithLibrary.contentType !== \"\") {\n checkType = true;\n if (checkKeyword || checkCatalog) {\n $scope.addAssignmentsWithLibrary.searchResults = $filter('filter')($scope.addAssignmentsWithLibrary.searchResults, function (course) {\n if (course.type === $scope.addAssignmentsWithLibrary.contentType.type) {\n return course;\n }\n });\n } else {\n $scope.addAssignmentsWithLibrary.searchResults = $filter('filter')($scope.addAssignmentsWithLibrary.searchCatalog, function (course) {\n if (course.type === $scope.addAssignmentsWithLibrary.contentType.type) {\n return course;\n }\n });\n }\n }\n if ($scope.addAssignmentsWithLibrary.searchResults === null || $scope.addAssignmentsWithLibrary.searchResults.length === 0) {\n $scope.addAssignmentsWithLibrary.searchTabState = $scope.addAssignmentsWithLibrary.SEARCH_TAB_ENUM.NO_RESULTS;\n } else {\n $scope.addAssignmentsWithLibrary.searchTabState = $scope.addAssignmentsWithLibrary.SEARCH_TAB_ENUM.RESULTS_FOUND;\n }\n });\n \n};\n\n$scope.addAssignmentsWithLibrary.selectedCount = 0;\n\n\n// When you select an assignment in the search tab, it gets\n// added to the list of queued assignments here\n$scope.addAssignmentsWithLibrary.queueAssignment = function (assignment) {\n if (assignment.id in $scope.addAssignmentsWithLibrary.queuedAssignments) {\n delete $scope.addAssignmentsWithLibrary.queuedAssignments[assignment.id];\n $scope.addAssignmentsWithLibrary.selectedCount--;\n $scope.addAssignmentsWithLibrary.selectAll = false;\n if (Object.keys($scope.addAssignmentsWithLibrary.queuedAssignments).length === 0) {\n $scope.addAssignmentsWithLibrary.noAssignmentsSelectedError = true;\n $scope.addAssignmentsWithLibrary.anySelected = false;\n }\n if (assignment.selectedOffering) {\n\n assignment.selectedOffering = null; \n _.each(assignment.offerings, function (offering) { offering.checked = false; });\n }\n } else {\n $scope.addAssignmentsWithLibrary.queuedAssignments[assignment.id] = assignment;\n $scope.addAssignmentsWithLibrary.selectedCount++;\n if ($scope.addAssignmentsWithLibrary.selectedCount === $scope.addAssignmentsWithLibrary.searchResults.length) {\n $scope.addAssignmentsWithLibrary.selectAll = true;\n }\n // if you've selected something then you shouldn't see this error\n $scope.addAssignmentsWithLibrary.noAssignmentsSelectedError = false;\n $scope.addAssignmentsWithLibrary.anySelected = true;\n }\n};\n\n/*** due date tab stuff */\n// when you click remove, remove the course from the list\n$scope.addAssignmentsWithLibrary.toggleAssignmentForRemoval = function (assignment) {\n if (assignment.id in $scope.addAssignmentsWithLibrary.queuedAssignments) {\n //assignment is removed so deselect it, if they go back, they can reselect the course if they want\n assignment.checked = false;\n $scope.addAssignmentsWithLibrary.selectedCount--;\n $scope.addAssignmentsWithLibrary.selectAll = false;\n delete $scope.addAssignmentsWithLibrary.queuedAssignments[assignment.id];\n }\n\n if (Object.keys($scope.addAssignmentsWithLibrary.queuedAssignments).length === 0) {\n $scope.addAssignmentsWithLibrary.noAssignmentsSelectedError = true;\n }\n};\n\n/*** audience tab stuff */\n// Stores the list of trees in the audience tab\n$scope.addAssignmentsWithLibrary.audienceData = [];\n\n/* Handles group checking in the audience tab */\nvar selectUsersRecursively = function (item, checked) {\n item.checked = checked;\n\n // if the item is checked, add it to list of selected users\n if (item.checked) {\n $scope.addAssignmentsWithLibrary.selectedUsers[item.studentId] = item;\n } else {\n // @TODO @sneilan check if any other trees of users are checked\n // don't delete the user if it's checked somewhere else\n delete $scope.addAssignmentsWithLibrary.selectedUsers[item.studentId];\n }\n\n if (item.teamList && item.teamList.length > 0) {\n for (var i = 0; i < item.teamList.length; i += 1) {\n selectUsersRecursively(item.teamList[i], checked);\n }\n }\n\n if (item.alternateTeamList && item.alternateTeamList.length > 0) {\n for (var j = 0; j < item.alternateTeamList.length; j += 1) {\n selectUsersRecursively(item.alternateTeamList[j], checked);\n }\n }\n};\n\n$scope.addAssignmentsWithLibrary.toggleUser = function (item, recursive) {\n // By default remove the error\n // We'll renable the no users selected error near the bottom\n // If the user hasn't selected any users\n $scope.addAssignmentsWithLibrary.noUsersSelectedError = false;\n\n // toggle the checkbox\n item.checked = !item.checked;\n\n // if the item is checked, add it to list of selected users\n if (item.checked) {\n $scope.addAssignmentsWithLibrary.selectedUsers[item.studentId] = item;\n } else {\n // @TODO @sneilan check if any other trees of users are checked\n // don't delete the user if it's checked somewhere else\n delete $scope.addAssignmentsWithLibrary.selectedUsers[item.studentId];\n }\n\n if (recursive === true && item.teamList && item.teamList.length > 0) {\n for (var i = 0; i < item.teamList.length; i += 1) {\n selectUsersRecursively(item.teamList[i], item.checked);\n }\n }\n\n // if no users are selected, display an error\n /**\n * This code is never run unless this method is called\n */\n if (Object.keys($scope.addAssignmentsWithLibrary.selectedUsers).length === 0) {\n $scope.addAssignmentsWithLibrary.noUsersSelectedError = true;\n }\n};\n\n/* Handles visibility of team member lists in the audience tab */\n$scope.addAssignmentsWithLibrary.toggle = function (item) {\n item.hidden = !item.hidden;\n};\n\n/* list, object, property.. */\n//_this.setPropertyOnAllNodes = function (data, name, value) {\n// for (var i = 0; i < data.length; i += 1) {\n// data[i][name] = value;\n\n// // if there are subnodes,\n// // set them to hidden also\n// /**\n// * This never recurses.\n// */\n// if (typeof data[i].teamList !== 'undefined' && data[i].teamList.length > 0) {\n// _this.setPropertyOnAllNodes(data[i].teamList, name, value);\n// }\n// }\n//};\n\n// This function gets the assignments from\n// $scope.addAssignmentsWithLibrary.queuedAssignments = {}\n// and users from\n// $scope.addAssignmentsWithLibrary.selectedUsers = {};\n// and submits the assignments\n// it's called by the next button but only on the audience tab\n$scope.addAssignmentsWithLibrary.submitAssignmentsForSelectedUsers = function () {\n var assignmentIds;\n var userIds;\n /**\n * This check must be performed instead of the noUsersSelectedError check because\n * toggleUsers (the only place that is changed to true) is not inherently run, as it relies\n * on an user's action. We have to check how many\n */\n if ($scope.addAssignmentsWithLibrary.displaytype === $scope.addAssignmentsWithLibrary.TYPE_ENUM.SIMPLE) {\n if ($route.current.params.controller === 'rules'){\n $scope.applyNewAssignmentsCta($scope.addAssignmentsWithLibrary.queuedAssignments);\n }\n else{\n $scope.selectCourseInList($scope.addAssignmentsWithLibrary.queuedAssignments);\n }\n jQuery('#addAssignmentsWithLibraryModal').modal('hide');\n $scope.addAssignmentsWithLibrary.clearAddAssignmentsModal();\n return;\n }\n if ($scope.studentId !== null) {\n\n assignmentIds = Object.keys($scope.addAssignmentsWithLibrary.queuedAssignments);\n\n userIds = [$scope.studentId];\n\n //CALL ENROLLMENT API FOR EACH ASSIGNMENT'S SELECTED OFFERING\n\n var offeringAssignments = _.filter($scope.addAssignmentsWithLibrary.queuedAssignments, function(assignment){\n\n return assignment.selectedOffering;\n });\n\n var submitOffering = function (assignment) {\n\n return RosterService.enrollSingle($scope.studentId, assignment.selectedOffering)\n .then(\n function (success) {\n\n assignment.selectedOffering = null;\n\n if (success.data.status === 'InProgress') {\n assignment.offeringInProgressMessage = success.data.message;\n assignment.offeringInProgress = true;\n\n $timeout(function () {\n assignment.offeringInProgress = false;\n jQuery(\"#\" + assignment.id + \"-offeringInProgress\").hide();\n }, 3000);\n }\n\n if (success.data.status === 'Waitlisted') {\n assignment.offeringWaitlistMessage = success.data.message;\n assignment.offeringWaitlist = true;\n\n $timeout(function () {\n assignment.offeringWaitlist = false;\n jQuery(\"#\" + assignment.id + \"-offeringWaitlist\").hide();\n }, 3000);\n }\n },\n function (error) {\n assignment.offeringErrorMessage = error.ErrorMessage;\n assignment.offeringError = true;\n assignment.enrollError = true;\n assignment.selectedOffering = null;\n $scope.addAssignmentsWithLibrary.offeringError = true;\n\n $timeout(function () {\n\n assignment.offeringError = false;\n jQuery(\"#\" + assignment.id + \"-offeringError\").hide();\n }, 3000);\n });\n };\n \n var submitSequential = function (assignments) {\n\n return assignments.reduce(function (prev, assignment,idx) {\n return prev.then(function () {\n\n return submitOffering(assignment);\n }).then(function (result) {\n\n if (idx === assignments.length - 1) {\n $timeout(function () { $scope.addAssignmentsWithLibrary.submitAssignmentPromises(assignmentIds, userIds); }, 3000);\n }\n });\n }, Promise.resolve());\n };\n\n if (offeringAssignments.length > 0) { submitSequential(offeringAssignments); }\n else { $scope.addAssignmentsWithLibrary.submitAssignmentPromises(assignmentIds, userIds); }\n }\n else {\n if (Object.keys($scope.addAssignmentsWithLibrary.selectedUsers).length === 0) {\n $scope.addAssignmentsWithLibrary.noUsersSelectedError = true;\n\n return;\n }\n\n $scope.addAssignmentsWithLibrary.audienceTabState = $scope.addAssignmentsWithLibrary.AUDIENCE_TAB_ENUM.LOADING;\n\n assignmentIds = Object.keys($scope.addAssignmentsWithLibrary.queuedAssignments);\n\n userIds = Object.keys($scope.addAssignmentsWithLibrary.selectedUsers);\n\n $scope.addAssignmentsWithLibrary.submitAssignmentPromises(assignmentIds, userIds);\n } \n};\n\n$scope.addAssignmentsWithLibrary.submitAssignmentPromises = function (assignmentIds, userIds) {\n var promises = [];\n\n var createPromiseToSubmitAssignments = function (assignmentId, dueDate, required, users) {\n return AssignmentsService.submitSimpleAssignment(assignmentId, dueDate, required, users);\n };\n\n for (var i = 0; i < assignmentIds.length; i += 1) {\n var assignmentKey = Object.keys($scope.addAssignmentsWithLibrary.queuedAssignments)[i];\n\n var assignment = $scope.addAssignmentsWithLibrary.queuedAssignments[assignmentKey];\n if (assignment.dueDate !== null && typeof assignment.dueDate !== 'undefined' && typeof assignment.dueDate.moment !== \"undefined\" && _.isObject(assignment.dueDate.moment))\n assignment.dueDate = assignment.dueDate.moment.utc().format();\n else assignment.dueDate = null;\n\n if (!assignment.enrollError) {\n promises.push(createPromiseToSubmitAssignments(assignment.id, assignment.dueDate, assignment.isRequired, userIds));\n }\n }\n\n $q.all(promises).then(function (values) {\n $scope.addAssignmentsWithLibrary.audienceTabState = $scope.addAssignmentsWithLibrary.AUDIENCE_TAB_ENUM.SUCCESS;\n switch ($scope.addAssignmentsWithLibrary.displaytype) {\n case $scope.addAssignmentsWithLibrary.TYPE_ENUM.WITH_DATE:\n\n if (!$scope.addAssignmentsWithLibrary.offeringError) { jQuery('#addAssignmentsWithLibraryModal').modal('hide'); }\n\n jQuery('#addAssignmentsWithLibraryModal').on('hidden.bs.modal', function () {\n angular.element(document.querySelector('#viewAssignmentsModal')).modal();\n $scope.addAssignmentsWithLibrary.clearAddAssignmentsModal();\n });\n break;\n case $scope.addAssignmentsWithLibrary.TYPE_ENUM.TEAM_SELECT:\n jQuery('#addAssignmentsWithLibraryModal').modal('hide');\n\n jQuery('#addAssignmentsWithLibraryModal').on('hidden.bs.modal', function () {\n $scope.addAssignmentsWithLibrary.clearAddAssignmentsModal();\n $scope.homeAction();\n });\n $scope.cpFilter.direct = true;\n $scope.cpFilter.alterate = false;\n $scope.cpFilter.sub = false;\n break;\n }\n\n }, function (failure) {\n $scope.addAssignmentsWithLibrary.audienceTabState = $scope.addAssignmentsWithLibrary.AUDIENCE_TAB_ENUM.ERROR;\n\n $scope.addAssignmentsWithLibrary.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n};\n\n// In addition to revealing the select audience tab\n// this function checks the list of assignments toggled for removal\n// and removes those assignments from the queue\n$scope.addAssignmentsWithLibrary.selectAudience = function () {\n // If the user hasn't selected any assignments, don't let them go to the audience tab\n if (Object.keys($scope.addAssignmentsWithLibrary.queuedAssignments).length === 0) {\n $scope.addAssignmentsWithLibrary.step = $scope.addAssignmentsWithLibrary.STEP_ENUM.ASSIGNMENTS;\n\n activateAssignmentsPill();\n\n $scope.addAssignmentsWithLibrary.noAssignmentsSelectedError = true;\n\n return;\n }\n\n /* Check if any assignments are in the list of assignments toggled for removal\n * Remove those assignments.\n * If there are no assignments in the queue, send us back to the select assignments tab\n * trigger a tooltip on the select audience tab stating an error.\n */\n\n var numQueuedAssignments = Object.keys($scope.addAssignmentsWithLibrary.queuedAssignments).length;\n var numAssignmentsMarkedForDeletion = Object.keys($scope.addAssignmentsWithLibrary.assignmentsToggledForRemoval).length;\n\n // if the user has marked all assignments for deletion, don't let them continue\n if (numQueuedAssignments === numAssignmentsMarkedForDeletion) {\n $scope.addAssignmentsWithLibrary.step = $scope.addAssignmentsWithLibrary.STEP_ENUM.DUE_DATE;\n\n activateDueDatePill();\n\n $scope.addAssignmentsWithLibrary.noAssignmentsSelectedError = true;\n\n return;\n }\n\n deleteAssignmentsToggledForRemoval($scope.addAssignmentsWithLibrary.queuedAssignments, $scope.addAssignmentsWithLibrary.assignmentsToggledForRemoval);\n\n $scope.addAssignmentsWithLibrary.assignmentsToggledForRemoval = {};\n\n $scope.addAssignmentsWithLibrary.step = $scope.addAssignmentsWithLibrary.STEP_ENUM.AUDIENCE;\n\n activateAudiencePill();\n};\n\n/*** Create the modal here */\n// Creates the add assignments modal\n// called by the Add Assignment button\n// next to each team member\n/**\n * Opens the add assignments modal for a specific user within a manager's team. They can be at any level of\n * the team tree.\n *\n * @param teamMember Object\n */\n$scope.addAssignmentsAction = function (teamMember) {\n _this.getTeamRecursiveList(teamMember);\n\n $scope.stepThreeView = 'app/templates/users/home/modals/addAssignmentViews/step3.audience.subTeam.library.html';\n\n jQuery('#addAssignmentsModal').modal();\n};\n\n/*** Create the modal here */\n// Creates the add assignments modal\n// called by the Add Assignment button\n// next to each team member\n/**\n * Opens the add assignments modal for the entire team of the logged in manager.\n *\n * @param teamMember Object\n */\n$scope.addAssignmentsActionForAllTeams = function () {\n var teamMember = UsersService.user;\n\n teamMember.studentId = UsersService.getId();\n\n _this.getTeamRecursiveList(teamMember);\n\n var alternateTeam = null;\n if ($scope.apiDueDate !== null) {\n alternateTeam = TeamService.getAlternateTeamList($scope.startDate.apiDate, $scope.endDate.apiDate, $scope.fullyRecursiveBottom, $scope.apiDueDate);\n }\n else {\n alternateTeam = TeamService.getAlternateTeamList($scope.startDate.apiDate, $scope.endDate.apiDate, $scope.fullyRecursiveBottom, null);\n }\n alternateTeam.then(function (teamTree) {\n teamTree = teamTree;\n\n var audienceRoot = {};\n\n audienceRoot.firstName = teamMember.firstName;\n audienceRoot.lastName = teamMember.lastName;\n audienceRoot.studentId = teamMember.studentId;\n audienceRoot.teamList = teamTree;\n\n $scope.addAssignmentsWithLibrary.alternateDataList = audienceRoot; // needs to be in array because\n // end result is list of lists\n\n // add my team (direct) list to audienceData\n\n // Make all team members hidden by default\n $scope.setPropertyOnAllNodes($scope.addAssignmentsWithLibrary.alternateDataList, 'hidden', true);\n\n // uncheck all team members by default\n $scope.setPropertyOnAllNodes($scope.addAssignmentsWithLibrary.alternateDataList, 'checked', false);\n }, function (failure) {\n // @TODO do something if we can't load the modal\n console.log(failure);\n });\n\n $scope.stepThreeView = 'app/templates/users/home/modals/addAssignmentViews/step3.audience.fullTeam.library.html';\n\n jQuery('#addAssignmentsModal').modal();\n\n $scope.setDefaultAssignmentType();\n};\n\n$scope.setDueDateEndTime = function (dateObj) {\n if (typeof dateObj !== 'undefined' && dateObj !== null && typeof dateObj.moment !== 'undefined' && _.isObject(dateObj.moment)) {\n var newdt = dateUtil.setPortalEndTime(dateObj.moment.toDate());\n dateObj = dateUtil.formatDate(newdt);\n } else {\n dateObj = null;\n }\n return dateObj;\n};\n\n\n$scope.mgrUpdateDueDate = function (dateObj, assignment) {\n assignment.dueDate = $scope.getEndDateTimeFromPicker(dateObj);\n $scope.editAssignment(assignment);\n};\n\n\n/**\n * Method for a manager to change the due date for a single individual\n *\n * @param assignment Object selected assigned which will have its due date changed.\n */\n$scope.editAssignment = function (assignment) {\n var params = $route.current.params.param.split('/');\n var studentId = params[0];\n var courseId = assignment.assignmentCourseId;\n\n var finalDate = null;\n if (assignment.dueDate !== null && assignment.dueDate.moment !== null && assignment.dueDate.moment.isValid()) {\n finalDate = assignment.dueDate.moment.toISOString();\n }\n\n assignment.error.reset();\n assignment.openCalendar = false;\n assignment.changingDueDate = true;\n\n var change = AssignmentsService.updateDueDate(UsersService.getId(), studentId, courseId, finalDate);\n change.then(function (success) {\n assignment.changingDueDate = false;\n }, function (error) {\n assignment.error.setError(error.status, error.message);\n assignment.changingDueDate = false;\n });\n };\n\nvar getTeamRecursiveList = function (teamMember) {\n var audienceRoot = {};\n\n audienceRoot.firstName = teamMember.firstName;\n audienceRoot.lastName = teamMember.lastName;\n audienceRoot.studentId = teamMember.studentId;\n audienceRoot.hidden = false;\n\n // Preload the audience tab data\n if ($scope.apiDueDate !== null) {\n TeamService.recursiveTeamList(teamMember.studentId, $scope.startDate.apiDate, $scope.endDate.apiDate, $scope.apiDueDate).then(function (teamTree) {\n audienceRoot.teamList = teamTree;\n\n $scope.addAssignmentsWithLibrary.audienceData = [audienceRoot]; // needs to be in array because\n }, function () {\n /**\n * If there's a failure, let's at least show one person.\n */\n $scope.addAssignmentsWithLibrary.audienceData = [audienceRoot]; // needs to be in array because\n });\n }\n else {\n TeamService.recursiveTeamList(teamMember.studentId, $scope.startDate.apiDate, $scope.endDate.apiDate, null).then(function (teamTree) {\n audienceRoot.teamList = teamTree;\n\n $scope.addAssignmentsWithLibrary.audienceData = [audienceRoot]; // needs to be in array because\n }, function () {\n /**\n * If there's a failure, let's at least show one person.\n */\n $scope.addAssignmentsWithLibrary.audienceData = [audienceRoot]; // needs to be in array because\n });\n }\n};\n$scope.getShortAssignmentAssetTypeName = function (courseTypeName) {\n var courseTypeFullName = null;\n switch (courseTypeName) {\n case 'Web Based Training':\n courseTypeFullName = 'wbt';\n break;\n case 'Instructor Led Training':\n courseTypeFullName = 'ilt';\n break;\n case 'Virtual Classroom':\n courseTypeFullName = 'vle';\n break;\n case 'Tasks':\n courseTypeFullName = 'task';\n break;\n case 'Surveys':\n courseTypeFullName = 'survey';\n break;\n case 'Evaluations':\n courseTypeFullName = 'evaluation';\n break;\n case 'Assessments':\n courseTypeFullName = 'assessment';\n break;\n case 'Course Group':\n courseTypeFullName = 'courseGroup';\n break;\n case 'Course Groups (Certification)':\n courseTypeFullName = 'courseGroupCertification';\n break;\n case 'Course Groups (Curricula)':\n courseTypeFullName = 'courseGroupCurricula';\n break;\n case 'Career Path':\n courseTypeFullName = 'careerPath';\n break;\n case 'Word Document':\n courseTypeFullName = 'word';\n break;\n case 'Excel Spreadsheet':\n courseTypeFullName = 'excel';\n break;\n case 'PDF':\n courseTypeFullName = 'pdf';\n break;\n case 'MP4':\n courseTypeFullName = 'mP4';\n break;\n case 'MP3':\n courseTypeFullName = 'mP3';\n break;\n case 'URL':\n courseTypeFullName = 'url';\n break;\n case 'OTHER':\n courseTypeFullName = 'other';\n break;\n default:\n courseTypeFullName = 'failed to match';\n break;\n }\n return courseTypeFullName;\n};\n$scope.addAssignmentsWithLibrary.addAllCourses = function (selected) {\n for (i = 0; i < $scope.addAssignmentsWithLibrary.searchResults.length; i++) {\n if ($scope.addAssignmentsWithLibrary.searchResults[i].checked === selected || $scope.addAssignmentsWithLibrary.searchResults[i].checked === undefined){\n $scope.addAssignmentsWithLibrary.searchResults[i].checked = !selected;\n $scope.addAssignmentsWithLibrary.queueAssignment($scope.addAssignmentsWithLibrary.searchResults[i]);\n }\n }\n};\n$scope.setPropertyOnAllNodes = function (data, name, value) {\n for (var i = 0; i < data.length; i += 1) {\n data[i][name] = value;\n\n // if there are subnodes,\n // set them to hidden also\n /**\n * This never recurses.\n */\n if (typeof data[i].teamList !== 'undefined' && data[i].teamList.length > 0) {\n $scope.setPropertyOnAllNodes(data[i].teamList, name, value);\n }\n }\n };\n\n $scope.viewOfferings = function (assignment) {\n if (!assignment.offerings && !assignment.offeringsLoading) {\n assignment.offeringsLoading = true;\n assignment.viewOfferings = true;\n var offerings = CoursesService.getSingleCourseOfferingsOpen(assignment.id);\n offerings.then(function (success) {\n\n assignment.offerings = $scope.getRosterStatus(success);\n assignment.hasEnrolledOfferings = assignment.offerings.some(function (offering) { return offering.enrolled === true; });\n assignment.offeringsLoading = false;\n }, function (error) {\n assignment.offeringsLoading = false;\n });\n } else {\n assignment.viewOfferings = true;\n }\n };\n\n $scope.hideOfferings = function (assignment) {\n assignment.viewOfferings = false;\n };\n\n function SetShowOfferingsOnAssignments(path, displayType) {\n //admin view when viewing assignments\n if (path.startsWith('/users/edit/')) {\n return true;\n }\n //manager view when viewing an individual's assignments\n if (path.startsWith('/users/home/') && displayType !== $scope.addAssignmentsWithLibrary.TYPE_ENUM.TEAM_SELECT) {\n return true;\n }\n return false;\n }\n\n $scope.getRosterStatus = function (offerings) {\n\n withRosterStatus = offerings;\n _.each(withRosterStatus, function (offering) {\n\n offering.enrolled = false;\n offering.checked = false;\n\n if (offering.roster.attendingStudents.length > 0) {\n var attending = offering.roster.attendingStudents;\n _.each(attending, function (student) {\n if (student.id === $scope.studentId && student.completionDate === null) { offering.enrolled = true; return false; }\n });\n }\n\n if (offering.roster.waitlistedStudents.length > 0 && !offering.enrolled) {\n var waitlist = offering.roster.waitlistedStudents;\n _.each(waitlist, function (student) {\n if (student.id === $scope.studentId && student.completionDate === null) { offering.enrolled = true; return false; }\n });\n }\n\n if (offering.roster.pendingApprovalStudents.length > 0 && !offering.enrolled) {\n var pending = offering.roster.pendingApprovalStudents;\n _.each(pending, function (student) {\n if (student.id === $scope.studentId && student.completionDate === null) { offering.enrolled = true; return false; }\n });\n }\n if (offering.enrolled) { offering.checked = true; }\n });\n return withRosterStatus; \n };\n\n $scope.updateSelection = function (selected, assignment) {\n\n selected.checked = !selected.checked;\n angular.forEach(assignment.offerings, function (offering) {\n if (selected.id !== offering.id && !offering.enrolled) {\n offering.checked = false;\n }\n else if (selected.id === offering.id && selected.checked) {\n\n assignment.selectedOffering = selected.id;\n\n if (!assignment.checked) { \n assignment.checked = true;\n $scope.addAssignmentsWithLibrary.queueAssignment(assignment);\n }\n }\n else if (selected.id === offering.id && !selected.checked) {\n\n assignment.selectedOffering = null;\n\n if (assignment.checked) {\n assignment.checked = false;\n $scope.addAssignmentsWithLibrary.queueAssignment(assignment);\n }\n \n }\n });\n };\n }]\n };\n}\n]);","app.directive('adminOverlay', ['$compile', function ($compile) {\n return {\n scope: true,\n restrict: 'A',\n link: function (scope, element, attrs) {\n\n var issublevelAdmin = scope.isSubDomainAdmin;\n\n //UsersService.isSubDomainAdmin().then(function (success) {\n // issublevelAdmin = success;\n //},function(failure) {\n // issublevelAdmin = false;\n //});\n\n if (issublevelAdmin === true) {\n var overlayDiv = angular.element('
');\n overlayDiv.appendTo(element);\n $compile(overlayDiv)(scope);\n }\n \n }\n };\n}]);","(function () {\n // https://github.com/samwiseduzer/angularPrint\n 'use strict';\n\n var lowercase = function (string) { return (typeof string === 'string') ? string.toLowerCase() : string; };\n function toBoolean(value) {\n if (typeof value === 'function') {\n value = true;\n } else if (value && value.length !== 0) {\n var v = lowercase('' + value);\n value = !(v === 'f' || v === '0' || v === 'false' || v === 'no' || v === 'n' || v === '[]');\n } else {\n value = false;\n }\n return value;\n }\n var AngularPrint = angular.module('AngularPrint', []);\n AngularPrint.directive('printSection', function () {\n return {\n restrict: 'A',\n link: function (scope, element) {\n element[0].classList.add('printSection');\n }\n };\n });\n AngularPrint.directive('printHide', function () {\n return {\n restrict: 'A',\n link: function (scope, element) {\n element[0].classList.add('printHide');\n }\n };\n });\n AngularPrint.directive('printRemove', function () {\n return {\n restrict: 'A',\n link: function (scope, element) {\n element[0].classList.add('printRemove');\n }\n };\n });\n AngularPrint.directive('printOnly', function () {\n return {\n restrict: 'A',\n link: {\n post: function (scope, element) {\n element[0].classList.add('printOnly');\n }\n }\n };\n });\n AngularPrint.directive('printAvoidBreak', function () {\n return {\n restrict: 'A',\n link: function (scope, element) {\n element[0].classList.add('avoidPageBreak');\n }\n };\n });\n AngularPrint.directive('printBtn', ['$window', function ($window) {\n return {\n restrict: 'A',\n link: function (scope, element) {\n element.on('click', function () {\n $window.print();\n });\n }\n };\n }]);\n AngularPrint.directive('printIf', ['$animate', function ($animate) {\n return function (scope, element, attr) {\n scope.$watch(attr.printIf, function applyPrint(value) {\n if ('printOnly' in attr) {\n $animate[toBoolean(value) ? 'removeClass' : 'addClass'](element, 'printRemove');\n }\n else {\n $animate[toBoolean(value) ? 'addClass' : 'removeClass'](element, 'printSection');\n }\n });\n };\n }]);\n AngularPrint.directive('printLandscape', function () {\n return {\n restrict: 'A',\n link: function () {\n var sheet = (function () {\n var style = document.createElement('style');\n style.appendChild(document.createTextNode(''));\n document.head.appendChild(style);\n return style.sheet;\n })();\n sheet.insertRule('@page{size:landscape;}', 0);\n }\n };\n });\n AngularPrint.directive('printTable', function () {\n return function (scope, element, attr) {\n scope.$watch(attr.printTable, function makeTable(value) {\n setTimeout(function () {\n if (value === null) return;\n var elem = element[0];\n elem.classList.add('printSection');\n elem.id = 'print-table';\n var tds = elem.getElementsByTagName('td');\n for (var i = 0, content, div; i < tds.length; i++) {\n content = tds[i].innerHTML;\n tds[i].innerHTML = '';\n div = document.createElement('div');\n div.className = 'avoidPageBreak';\n div.innerHTML = content;\n tds[i].appendChild(div);\n }\n element[0] = elem;\n }, 1000);\n });\n };\n });\n})();","(function() {\n app.directive('baiCourseActionButton', [\n function() {\n return {\n restrict: 'E',\n scope: {\n assignmentPromises: '=',\n productId: '='\n },\n templateUrl: 'App/templates/components/baiCourseActionButton.html',\n controller: 'actionButtonController'\n };\n }\n ]);\n})();","(function() {\n app.directive('baiDocumentActionButton', [\n function() {\n return {\n restrict: 'E',\n scope: {\n promises: '=',\n productId: '='\n },\n templateUrl: 'App/templates/components/baiDocumentActionButton.html',\n\n controller: ['$scope', '$q', DocumentActionButtonController]\n };\n }\n ]);\n\n function DocumentActionButtonController($scope, $q) {\n $scope.document = {};\n\n $q.all($scope.promises).then(function (success) {\n $scope.document = success[0];\n });\n }\n\n})();","(function () {\n catalog.directive('baiMainContent', ['$location', 'UsersService',\n function ($location, UsersService) {\n return {\n restrict: 'E',\n templateUrl: function() { \n return 'App/templates/components/' + (\n UsersService.getCurrentRoleType().toLowerCase() === 'ta' &&\n ['/users/', '/courses/', '/rules/', '/management/', '/insights/', '/dashboard/'].filter(function (item) { return $location.$$path.toLowerCase().startsWith(item); }).length > 0 ?\n 'adminMainContent.html' : 'mainContent.html'\n ); },\n link: baiMainContentLink,\n controller: ['$location', '$scope', function BaiMainContentCtrl($location, $scope) {\n $scope.goToRoute = function(url) {\n $location.url(url);\n };\n }]\n };\n }\n ]);\n\n function baiMainContentLink(scope, element, attrs) {\n if (attrs !== undefined) {\n scope.hideFooter = attrs.hideFooter === \"true\";\n }\n }\n\n})();","/* Directive to only accept numbers in an inpupt field */\napp.directive('baiNumbersOnlyInput', function () {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function (scope, element, attr, ctrl) {\n function fromUser(text) {\n if (text) {\n var transformedInput = text.replace(/[^0-9]/g, '');\n\n if (transformedInput !== text) {\n ctrl.$setViewValue(transformedInput);\n ctrl.$render();\n }\n return transformedInput;\n }\n return null;\n }\n ctrl.$parsers.push(fromUser);\n }\n };\n});","(function() {\n app.directive('baiScheduleCourseModal', [\n function() {\n return {\n restrict: 'E',\n scope: {\n courseId: '='\n },\n templateUrl: 'App/templates/users/home/modals/ScheduleCourse.html',\n controller: ['$scope', '$q', '$route', 'CoursesService', 'UsersService', 'IltRosterUtilities', ScheduleCourseController]\n };\n }\n ]);\n\n function ScheduleCourseController($scope, $q, $route, CoursesService, UsersService, IltRosterUtilities) {\n $scope.assignment = { id: $scope.courseId };\n $scope.offeringIsUserRegisteredILT = offeringIsUserRegisteredILT;\n $scope.isMaxWaitlistLimitReachedILTSearch = isMaxWaitlistLimitReachedILTSearch;\n $scope.requestApproval = requestApproval;\n $scope.scheduleOffering = scheduleOffering;\n $scope.apiMessage = \"\";\n $scope.apiScheduleErrorMessage = \"\";\n\n $scope.$on('openIltScheduleModal', function (evt, params) {\n $scope.assignment = params.assignment;\n jQuery('#ScheduleCourseModal' + $scope.assignment.id).modal('show');\n });\n\n function offeringIsUserRegisteredILT(session) {\n return IltRosterUtilities.isUserRegisteredForOffering(session, UsersService.getId());\n }\n\n function isMaxWaitlistLimitReachedILTSearch(session) {\n var overTheMaxWaitlistLimit = false;\n if (session.waitlistedRosterCount >= session.maxWaitlistSize && session.attendingRosterCount >= session.maxAllowedSize)\n { overTheMaxWaitlistLimit = true; }\n return overTheMaxWaitlistLimit;\n }\n\n function requestApproval(courseId, type, offeringId) {\n var requestApprovalInProcess = true;\n\n var userId = UsersService.getId();\n\n // Loading bars\n jQuery('.managerApprovalRequired-' + courseId).toggle();\n jQuery('#showCourseLoader-' + courseId).toggle();\n\n var approval = CoursesService.requestManagerialApproval(courseId, type, userId, offeringId);\n\n var assignmentID = courseId;\n\n approval.then(function (success) {\n var assignID = assignmentID;\n $scope.apiMessage = 'Request for approval was successfully sent.';\n jQuery('#AvailableOfferings' + assignID).hide();\n jQuery('#scheduleSuccess' + assignID).show();\n requestApprovalInProcess = false;\n setTimeout(function () {\n jQuery('#ScheduleCourseModal' + assignID).modal('hide');\n jQuery('#scheduleSuccess' + assignID).hide();\n $route.reload();\n }, 1500);\n\n }, function (failure) {\n requestApprovalInProcess = false;\n jQuery('#launchCourseLoaderPlayButton-' + courseId).toggle();\n jQuery('#launchCourseLoader-' + courseId).toggle();\n jQuery('.managerApprovalRequired-' + courseId).toggle();\n jQuery('#showCourseLoader-' + courseId).toggle();\n\n if (failure.StatusCode === 500 && failure.ErrorMessage === \"The person was successfully registered in the given offering but, cannot move forward until their manager approves the action\") {\n $scope.apiMessage = 'Request for approval was successfully sent.';\n jQuery('#fullSuccess-' + $scope.assignmentID).show();\n\n setTimeout(function () {\n jQuery('#fullSuccess-' + $scope.assignmentID).hide();\n $route.reload();\n }, 2000);\n }\n else {\n if (failure.StatusCode === 409) { $scope.apiScheduleErrorMessage = 'Sorry! Cannot register because there is a scheduling conflict.'; }\n else {\n $scope.apiScheduleErrorMessage = 'Sorry! There was a problem requesting approval. Please try again.';\n }\n\n jQuery('#apiScheduleError' + assignmentID).slideDown(500, function () {\n var _this = jQuery(this);\n\n setTimeout(function () {\n _this.slideUp(500);\n\n }, 2500);\n });\n }\n });\n }\n\n function scheduleOffering(assignmentId, assignmentType, sessionId, isInCourseGroup) {\n var offering = CoursesService.scheduleOffering(assignmentId, UsersService.getId(), assignmentType, sessionId);\n var assignmentID = assignmentId;\n\n offering.then(function (success) {\n\n if (isInCourseGroup) {\n var enrollCoursePromise = CoursesService.getCourseUrl(isInCourseGroup, 'wbt', UsersService.getId()); // Getting the URL will also enroll (create transcript) for the course.\n enrollCoursePromise.then(function (success) {\n // Don't do anything. There is no url for the course group course but we still need to create a transcript\n });\n }\n\n var obj = null;\n var assignID = assignmentID;\n\n switch (success) {\n case 'confirmed':\n case 'inProgress':\n obj = jQuery('#scheduleSuccess' + assignID);\n\n $scope.apiMessage = 'Registration for this course was successful.';\n\n break;\n case 'waitlisted':\n obj = jQuery('#waitlistedSchedSuccess' + assignID);\n\n $scope.apiMessage = 'The current course is full. You have been added to the course waitlist.';\n\n break;\n }\n jQuery('#AvailableOfferings' + assignID).hide();\n obj.show();\n\n setTimeout(function () {\n jQuery('#ScheduleCourseModal' + assignID).modal('hide');\n obj.hide();\n $route.reload();\n }, 1500);\n\n }, function (failure) {\n\n if (failure.ErrorMessage.indexOf('Prereq') > -1) {\n $scope.apiScheduleErrorMessage = 'Prerequisites need to be completed for registering for this course. Registration could not be completed.';\n }\n else if (failure.ErrorMessage.indexOf('it is full') > -1) {\n $scope.apiScheduleErrorMessage = 'The current course is full. Registration could not be completed.';\n }\n else if (failure.StatusCode === 409) { $scope.apiScheduleErrorMessage = 'Sorry! Cannot register because there is a scheduling conflict.'; }\n else {\n $scope.apiScheduleErrorMessage = 'Sorry! There was a problem scheduling your offering. Please try again.';\n }\n\n jQuery('#apiScheduleError' + assignmentID).slideDown(500, function () {\n var _this = jQuery(this);\n\n setTimeout(function () {\n _this.slideUp(500);\n }, 2500);\n });\n\n });\n }\n }\n\n})();","app.directive('baiUserProfileModal', [function () {\n return {\n restrict: 'E',\n templateUrl: 'app/templates/users/home/modals/baiUserProfileModal.html',\n controller: ['$scope',\n function ($scope) {\n $scope.$on('openUserProfileModal', function (e) {\n angular.element(document.querySelector('#viewUserProfile')).modal();\n $scope.$broadcast(\"openUserProfileStats\");\n });\n\n $scope.closeSubordinateProfileModal = function () {\n angular.element(document.querySelector('#viewUserProfile')).modal('hide');\n };\n }]\n };\n}]);","app.directive('baiUserStats', [function () {\n return {\n restrict: 'E',\n templateUrl: 'app/templates/users/partials/account/baiUserStats.html', \n controller: ['$scope', '$filter', 'SettingsService', 'UsersService', 'TranscriptsService', 'CoursesService', 'AssignmentsService', 'SkillService',\n function ($scope, $filter, SettingsService, UsersService, TranscriptsService, CoursesService, AssignmentsService, SkillService) {\n /* Training Insights and Career Path access determined by the organization settings */\n var sett = SettingsService.getSettings().then(function (success) {\n $scope.showResponsibilities = SettingsService.isTrainingInsightsEnabled();\n $scope.hasCareerPaths = SettingsService.isCareerPathEnabled();\n });\n\n var openUserProfileStats = function(e) {\n $scope.transcriptCountsLoaded = false;\n $scope.transcriptLoadedError = false;\n $scope.responsibilitiesLoaded = false;\n $scope.showAchievementsError = false;\n $scope.achievementsError = '';\n $scope.careerPathsLoading = true;\n $scope.skillsLoading = true;\n $scope.coursesCompleted = 0;\n $scope.eventsCompleted = 0;\n $scope.courseGroupsCompleted = 0;\n $scope.usersResponsibilities = [];\n $scope.careerPathsCompleted = [];\n $scope.usersSkills = [];\n\n /* Retrieve the user's transcripts to count the number of Course Groups/ILTs/WBTs completed */\n var transCallAllTime = TranscriptsService.fetchCompletionCounts($scope.userId);\n transCallAllTime.then(function(success) {\n var cc = $filter('filter')(success, { \"key\": \"courses\" }, true);\n $scope.coursesCompleted = cc.length > 0 ? cc[0].value : 0;\n var ec = $filter('filter')(success, { \"key\": \"events\" }, true);\n $scope.eventsCompleted = ec.length > 0 ? ec[0].value : 0;\n var cgc = $filter('filter')(success, { \"key\": \"coursegroups\" }, true);\n $scope.courseGroupsCompleted = cgc.length > 0 ? cgc[0].value : 0;\n $scope.transcriptCountsLoaded = true;\n }, function(failure) {\n $scope.transcriptCountsLoaded = true;\n $scope.transcriptLoadedError = true;\n });\n\n /**********************************************************/\n /** Responsibilities **/\n /**********************************************************/\n\n var userResp = UsersService.getUsersResponsibilities($scope.userId);\n userResp.then(function(success) {\n $scope.usersResponsibilities = success;\n $scope.responsibilitiesLoaded = true;\n }, function(failure) {\n $scope.responsibilitiesLoaded = true;\n $scope.showAchievementsError = true;\n $scope.achievementsError += 'Responsibilities failed to load
';\n });\n\n /**********************************************************/\n /** Skills **/\n /**********************************************************/\n\n var userSkills = SkillService.fetchUserSkills($scope.userId);\n userSkills.then(function (success) {\n $scope.usersSkills = success;\n $scope.skillsLoading = false;\n }, function (failure) {\n $scope.skillsLoading = false;\n $scope.showAchievementsError = true;\n $scope.achievementsError += 'Skills failed to load
';\n });\n\n /**********************************************************/\n /** Career Paths **/\n /**********************************************************/\n\n var careerPaths = CoursesService.getCoursesByType(\"careerPath\", $scope.userId);\n //var careerPaths = AssignmentsService.fetch($scope.userId);\n careerPaths.then(function(success) {\n $scope.careerPathsLoading = false;\n $scope.careerPathsCompleted = $filter('filter')(success, { \"status\": \"successful\" }, true);\n }, function(failure) {\n $scope.careerPathsLoading = false;\n if (failure.StatusCode === 404) {\n $scope.careerPathsCompleted = [];\n } else {\n $scope.achievementsError += 'Career paths failed to load';\n $scope.showAchievementsError = true;\n }\n });\n };\n\n if ($scope.isLoadImmediate === true) {\n openUserProfileStats();\n } else {\n $scope.$on('openUserProfileStats', openUserProfileStats);\n }\n }]\n };\n}]);","/**\n * Small validation directive to validate dates.\n */\napp.directive('baiDateChecker', function () {\n return {\n require: 'ngModel',\n link: function ($scope, $element, $attrs, ngModel) {\n ngModel.$validators.dateChecker = function (modelValue) {\n if (typeof $scope.transcriptAdd !== 'undefined') {\n var startDate = $scope.transcriptAdd.startDate.$viewValue;\n var completionDate = $scope.transcriptAdd.completionDate.$viewValue;\n\n if (typeof startDate !== 'undefined' && typeof completionDate !== 'undefined') {\n if (startDate > completionDate) {\n return false;\n } else {\n $scope.transcriptAdd.completionDate.$setValidity('dateChecker', true);\n $scope.transcriptAdd.startDate.$setValidity('dateChecker', true);\n\n jQuery('.md-datepicker-input-container.md-datepicker-invalid').removeClass('md-datepicker-invalid');\n }\n }\n } else if (typeof $scope.batchAddTranscript !== 'undefined') {\n var batchStartDate = $scope.batchAddTranscript.startDate.$viewValue;\n var batchCompletionDate = $scope.batchAddTranscript.completionDate.$viewValue;\n if (typeof batchStartDate !== 'undefined' && typeof batchCompletionDate !== 'undefined') {\n if (batchStartDate > batchCompletionDate) {\n return false;\n } else {\n $scope.batchAddTranscript.completionDate.$setValidity('dateChecker', true);\n $scope.batchAddTranscript.startDate.$setValidity('dateChecker', true);\n\n jQuery('.md-datepicker-input-container.md-datepicker-invalid').removeClass('md-datepicker-invalid');\n }\n }\n }\n\n\n return true;\n };\n }\n };\n});\n\n/**\n * Small validation directive to validate passwords based on BAI requirements\n *\n * NOTE: If you use this in a form, your form MUST be named baiform\n * Ex:
\n */\napp.directive('baiValidatorsPasswords', function() {\n return {\n require: 'ngModel',\n link: function($scope, $element, $attrs, ngModel) {\n ngModel.$validators.passwordMatch = function (modelValue) {\n var form = $scope.passwordReset || $scope.baiform;\n if (typeof form.password !== 'undefined' && typeof form.passwordmatch !== 'undefined') {\n var password = form.password.$viewValue;\n var passwordmatch = form.passwordmatch.$viewValue;\n\n if (typeof password !== 'undefined' && typeof passwordmatch !== 'undefined' && password !== null && passwordmatch !== null) {\n if (password !== passwordmatch) {\n return false;\n }\n }\n }\n\n return true;\n };\n\n ngModel.$validators.passwordRules = function (password) {\n if (typeof password !== 'undefined' && password !== null && password !== '') {\n var passwordRegex = /^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\\s).{8,}$/;\n\n if (!passwordRegex.test(password)) {\n return false;\n }\n }\n\n return true;\n };\n }\n };\n});\n\n\napp.directive('baiValidatorsMatchPasswords', function() {\n return {\n require: 'ngModel',\n link: function($scope, $element, $attrs, ngModel) {\n ngModel.$validators.passwordMatch = function (modelValue) {\n var form = $scope.passwordReset || $scope.baiform;\n if (typeof form.password !== 'undefined' && typeof form.passwordmatch !== 'undefined') {\n var password = form.password.$viewValue;\n var passwordmatch = form.passwordmatch.$viewValue;\n\n if (typeof password !== 'undefined' && typeof passwordmatch !== 'undefined' && password !== null && passwordmatch !== null) {\n if (password !== passwordmatch) {\n return false;\n }\n }\n }\n return true;\n };\n }\n };\n});\n\n\napp.directive('baiValidatorsRulesPasswords', function() {\n return {\n require: 'ngModel',\n link: function($scope, $element, $attrs, ngModel) {\n ngModel.$validators.passwordRules = function (password) {\n var form = $scope.passwordReset || $scope.baiform;\n if (typeof password !== 'undefined' && password !== null && password !== '') {\n var passwordRegex = /^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\\s).{8,}$/;\n\n if (!passwordRegex.test(password)) {\n return false;\n }\n }\n form.passwordmatch.$validate();\n return true;\n };\n }\n };\n});\n\n/**\n * Small validation directive to validate integers\n */\napp.directive('baiValidatorsInteger', function() {\n return {\n require: 'ngModel',\n link: function($scope, $element, $attrs, ngModel) {\n ngModel.$validators.integer = function(value) {\n // Return true if value is null or empty.\n if(value === null || value === '') {\n return true;\n }\n\n return /(\\d{9}$)/.test(value);\n };\n }\n };\n});\n\n/**\n * Will reset and clear a form that is marked as optional. These fields will be controlled by another field\n * on the page.\n *\n * There will be several validations.\n */\napp.directive('baiOptionalField', function() {\n return {\n require: 'ngModel',\n link: function($scope, $element, $attrs, ngModel) {\n var _this = this;\n\n /**\n * Deals with pattern based in puts\n *\n * @param value\n * @returns {boolean}\n */\n ngModel.$validators.patternBased = function(value) {\n var pattern = $attrs.pattern;\n\n var valid = _this.checkForRequiredStatus();\n\n /**\n * If field is not required, continue. Field will have been reset.\n */\n if(valid === true) {\n return true;\n }\n\n pattern = RegExp(pattern);\n\n return pattern.test(value) === true;\n };\n\n _this.checkForRequiredStatus = function() {\n if($attrs.required === false) {\n // clear and fully reset the field\n ngModel.$setViewValue(null);\n ngModel.$render();\n\n return true;\n }\n\n return false;\n };\n }\n };\n});\n\n/**\n * Small validation directive to check for default values; patterned to fit in Angular's model for\n * dropdowns\n */\napp.directive('baiNoDefault', function() {\n return {\n require: 'ngModel',\n link: function($scope, $element, $attrs, ngModel) {\n ngModel.$validators.noDefault = function(value) {\n var DEFAULT_VALUE = '--default--';\n \n if(ngModel.$touched === true) {\n return value !== DEFAULT_VALUE;\n }\n\n return true;\n };\n }\n };\n});\n\n/**\n * Checks if the value in ng-model exists in an array of values. \n * If so, makes the input field attached to it invalid\n */\napp.directive('baiInvalidIfValueExistsIn', function() {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function(scope, elm, attr, model) {\n model.$validators.invalidIfValueExistsIn = function(ngModelValue) {\n /* Get the value of the scope variable passed to this validator\n * It should be an array\n * (Slight angular hack to make this work.)\n * http://stackoverflow.com/a/26817720/761726\n *\n * The reason we have to use eval here is because\n * the attribute passed to the validator becomes a string.\n * That string corresponds to a scope variable.\n * So evaluate the string in the angular evaluator to get the scope variable!\n */\n var arrayOfValues = scope.$eval(attr.baiInvalidIfValueExistsIn);\n var currentValue = model.$viewValue;\n\n if (_.indexOf(arrayOfValues, currentValue) === -1) {\n model.$setValidity('valueExistsAlready', true);\n }\n else {\n model.$setValidity('valueExistsAlready', false);\n }\n\n return ngModelValue;\n };\n }\n };\n});\n\n\n/**\n * Directive is exactly the same as ng-pattern except\n * also checks if field it's operating on is disabled. If it's \n * disabled, then all checks pass automagically\n */\napp.directive('baiNgPatternIfFieldNotDisabled', function() {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function(scope, elm, attr, model) {\n model.$validators.baiNgPatternIfFieldNotDisabled = function(ngModelValue) {\n // If model is disabled, remmove validity check\n var disabled = false;\n if (typeof scope.$eval(attr.ngDisabled) !== 'undefined' && scope.$eval(attr.ngDisabled)) {\n disabled = true;\n }\n\n /* Exit and mark everything as okay\n * if the model is disabled */\n if (disabled) {\n model.$setValidity('pattern', true);\n return ngModelValue;\n }\n\n\n var ngPattern = attr.baiNgPatternIfFieldNotDisabled;\n /* If the user put /'s in the front / back of the regex,\n * Remove them because we can't create a Regexp object with those\n * in there */\n if (ngPattern[0] === '/' && ngPattern[ngPattern.length-1]) {\n ngPattern = ngPattern.slice(1, ngPattern.length-1);\n }\n\n ngPattern = RegExp(ngPattern);\n /* If the regexp doesn't match the view value\n * trigger a pattern issue. Otherwise remove the pattern issue */\n if (!ngPattern.test(ngModelValue)) {\n // Trigger the validation issue\n model.$setValidity('pattern', false);\n } else {\n // Untrigger the validation issue\n model.$setValidity('pattern', true);\n }\n\n /* Make sure you return this\n * otherwise you'll have issues with errors on other\n * validators */\n return ngModelValue;\n };\n }\n };\n});\n\napp.directive('dateBefore', function() {\n return {\n require: 'ngModel',\n link: function(scope, el, attrs, ctrl) {\n var isInclusive = attrs.dateOrEquals ? scope.$eval(attrs.dateOrEquals) : false,\n validate = function (val1, val2) {\n\n var isValid = true;\n if (typeof val1 === \"undefined\" || typeof val2 === \"undefined\" || val1 === null || val1 === \"\" || val2 === null || val2 === \"\") {\n ctrl.$setValidity(\"dateBefore\", isValid);\n return;\n }\n val1 = replaceAll(val1, \"-\", \"/\");\n \n var date1 = new Date(val1);\n var date2;\n\n if (val2 !== \"undefined\") {\n date2 = new Date(val2);\n isValid = isInclusive ? date1 <= date2 : date1 < date2;\n }\n\n ctrl.$setValidity(\"dateBefore\", isValid);\n };\n // Watch the value to compare - trigger validate()\n scope.$watch(attrs.dateBefore, function() {\n validate(ctrl.$viewValue, scope.$eval(attrs.dateBefore));\n });\n\n ctrl.$parsers.unshift(function (value) {\n validate(value, scope.$eval(attrs.dateBefore));\n return value;\n });\n\n function replaceAll(str, find, replace) {\n return str.replace(new RegExp(find, \"g\"), replace);\n }\n }\n };\n});\n\napp.directive('dateAfter', function() {\n return {\n require: 'ngModel',\n link: function(scope, el, attrs, ctrl) {\n var isInclusive = attrs.dateOrEquals ? scope.$eval(attrs.dateOrEquals) : false,\n validate = function (val1, val2) {\n var isValid = true;\n\n if (typeof val1 === \"undefined\" || typeof val2 === \"undefined\" || val1 === null || val1 === \"\" || val2 === null || val2 === \"\") {\n ctrl.$setValidity(\"dateAfter\", isValid);\n return;\n }\n val1 = replaceAll(val1,\"-\", \"/\");\n var date1 = new Date(val1);\n var date2;\n\n if (val2 !== 'undefined') {\n date2 = new Date(val2);\n isValid = isInclusive ? date1 >= date2 : date1 > date2;\n }\n\n ctrl.$setValidity(\"dateAfter\", isValid);\n };\n // Watch the value to compare - trigger validate()\n scope.$watch(attrs.dateAfter, function () {\n validate(ctrl.$viewValue, scope.$eval(attrs.dateAfter));\n });\n\n ctrl.$parsers.unshift(function (value) {\n validate(value, scope.$eval(attrs.dateAfter));\n return value;\n });\n\n function replaceAll(str, find, replace) {\n return str.replace(new RegExp(find, \"g\"), replace);\n }\n }\n };\n});\n\n/* Directive that validates a max number on a text input field.\nThe build in AngularJS ng-max directive works for input type=number but IE 11 doesn't support this input type so we need our own */\napp.directive('baiMax', function() {\n return {\n require: 'ngModel',\n link: function (scope, el, attrs, ctrl) {\n ctrl.$validators.baiMax = function (value) {\n if (value > parseInt(attrs.baiMax)) {\n return false;\n }\n return true;\n };\n }\n };\n});\n\n/**\n * Checks if the value in ng-model exists in an array of values. \n * If so, makes the input field attached to it invalid\n * This is specific to subcategory in Management\n */\napp.directive('baiSubcategoryNameUnique', function () {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function (scope, elm, attr, model) {\n model.$validators.invalidIfValueExistsInSubcategoryNames = function (ngModelValue) {\n /* Get the value of the scope variable passed to this validator\n * It should be an array\n * (Slight angular hack to make this work.)\n * http://stackoverflow.com/a/26817720/761726\n *\n * The reason we have to use eval here is because\n * the attribute passed to the validator becomes a string.\n * That string corresponds to a scope variable.\n * So evaluate the string in the angular evaluator to get the scope variable!\n */\n var arrayOfValues = scope.$eval(attr.baiSubcategoryNameUnique);\n //var currentValue = model.$viewValue;\n\n var subcategoryName = scope.$parent.subcategoryForm.subcategoryName.$viewValue;\n var parentCatID = scope.$parent.subcategoryForm.category.$viewValue;\n\n if (parentCatID === undefined || parentCatID === null) {\n //parent not selected yet - cannot compare\n scope.$parent.subcategoryForm.$setValidity('valueExistsAlready', true);\n scope.$parent.subcategoryForm.valueExistsAlready = false;\n } else if ((parentCatID !== undefined || parentCatID !== null) && subcategoryName !== undefined) {\n //Parent is selected - now compare the subcategory name \n var existsAlready = _.filter(arrayOfValues, function (category) {\n if (category.categoryID === parentCatID.categoryID && category.subcategoryName.toLowerCase() === subcategoryName.toLowerCase()) {\n return category;\n }\n });\n if (existsAlready.length > 0) {\n //Subcategory name belongs to the selected parent - does not pass validation\n scope.$parent.subcategoryForm.$setValidity('valueExistsAlready', false);\n scope.$parent.subcategoryForm.valueExistsAlready = true;\n } else {\n //Subcategory name does not belongs to the selected parent - passes validation\n scope.$parent.subcategoryForm.$setValidity('valueExistsAlready', true);\n scope.$parent.subcategoryForm.valueExistsAlready = false;\n }\n }\n\n return ngModelValue;\n };\n }\n };\n});","/* Same as ng-blur but with a 200 ms delay.\n * For form elements like autocomplete and pickers.\n * That way if a user picks something in an autocomplete but\n * clicks off the input, the pick will be fired first and then the\n * autocomplete will hide\n */\napp.directive('ngBlurDelay',['$timeout',function($timeout){\n return {\n scope:{\n ngBlurDelay:'&'\n },\n link:function(scope, element, attr){\n element.on('blur',function(){\n $timeout(scope.ngBlurDelay,200);\n });\n }\n };\n}]);\n\n","catalog.directive('breadcrumbs', [ function () {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/components/breadcrumbs.html',\n scope: {\n breadcrumbs: '='\n }\n };\n }\n]);","app.directive(\"calendar\", ['$rootScope', 'UsersService', 'CoursesService', 'AssignmentsService', function ($rootScope, UsersService, CoursesService, AssignmentsService) {\n var templates = {\n day: {\n template: 'app/templates/components/calendar/day.html'\n },\n week: {\n template: 'app/templates/components/calendar/week.html'\n },\n month: {\n template: 'app/templates/components/calendar/month.html'\n }\n };\n\n return {\n restrict: \"E\",\n scope : false,\n link: function(scope, element, attrs) {\n scope.isOfferingsCalendar = attrs.type === 'offerings' ? true : false;\n scope.selected = moment();\n\n scope.day = _createDay(scope.selected.clone(), scope.selected);\n scope.week = scope.selected.clone();\n scope.month = scope.selected.clone();\n\n scope.view = templates.month.template;\n scope.selectedView = 'month';\n scope.dateInLoop = scope.selected.clone();\n scope.type = 'dueDate';\n\n if(scope.isOfferingsCalendar === true) {\n scope.type = 'lowestSessionDateForOffering';\n }\n\n scope.assignmentFilter = {\n isRequired: true\n };\n\n var start = scope.selected.clone();\n\n start.date(1);\n\n _removeTime(start.day(0));\n\n _buildMonth(scope, start, scope.month);\n\n scope.select = function (day) {\n scope.day = day;\n scope.selected = day.date;\n };\n\n scope.next = function () {\n if(scope.selectedView === 'month') {\n var next = scope.month.clone();\n\n _removeTime(next.month(next.month() + 1).date(1));\n\n scope.month.month(scope.month.month() + 1);\n\n _buildMonth(scope, next, scope.month);\n } else if(scope.selectedView === 'week') {\n var weekStart = scope.week.clone().startOf('week');\n\n _removeTime(weekStart.week(weekStart.week() + 1).startOf('week'));\n scope.days = [];\n\n scope.week = weekStart;\n\n var days = _buildWeek(weekStart, scope.month);\n\n scope.days = days;\n }\n };\n\n scope.previous = function () {\n if(scope.selectedView === 'month') {\n var previous = scope.month.clone();\n\n _removeTime(previous.month(previous.month() - 1).date(1));\n\n scope.month.month(scope.month.month() - 1);\n\n _buildMonth(scope, previous, scope.month);\n } else if(scope.selectedView === 'week') {\n var weekStart = scope.week.clone().startOf('week');\n\n _removeTime(weekStart.week(weekStart.week() - 1).startOf('week'));\n scope.days = [];\n\n scope.week = weekStart;\n\n var days = _buildWeek(weekStart, scope.month);\n\n scope.days = days;\n }\n };\n\n scope.filterCourseByDay = function(day) {\n return function(input) {\n return typeof input[scope.type] !== 'undefined' && input[scope.type] !== null &&\n input[scope.type].day === day.number && input[scope.type].monthForCalender === day.month && input[scope.type].year === day.year;\n };\n };\n\n scope.filterOfferingByDay = function(day) {\n return function(input) {\n return typeof input[scope.type] !== 'undefined' &&\n input[scope.type] !== null &&\n input[scope.type].day === day.number &&\n input[scope.type].monthForCalender === day.month &&\n input[scope.type].year === day.year;\n };\n };\n\n scope.dayView = function(day) {\n if(jQuery('#calendarAssignmentsList').length > 0) {\n jQuery('#calendarAssignmentsList').hide();\n\n jQuery('#courseCalendarHolder').css('width', '100%');\n jQuery('#courseCalendarAssignmentHolder').css('width', '0%');\n }\n\n day = typeof day !== 'undefined' ? day : scope.day;\n\n scope.day = day;\n\n scope.curDay = day.date.format('dddd L');// + ' the, ' + day.format('Do') + ' of ' + day.format('MMMM, YYYY');\n\n scope.view = templates.day.template;\n scope.selectedView = 'day';\n };\n\n scope.weekView = function() {\n if(jQuery('#calendarAssignmentsList').length > 0) {\n jQuery('#calendarAssignmentsList').hide();\n\n jQuery('#courseCalendarHolder').css('width', '60%');\n jQuery('#courseCalendarAssignmentHolder').css('width', '40%');\n }\n\n var weekStart = scope.week = scope.selected.clone().startOf('week');\n\n scope.days = [];\n\n var days = _buildWeek(weekStart, scope.month);\n\n scope.days = days;\n\n scope.view = templates.week.template;\n\n scope.selectedView = 'week';\n };\n\n scope.monthView = function() {\n if(jQuery('#calendarAssignmentsList').length > 0) {\n jQuery('#calendarAssignmentsList').hide();\n\n jQuery('#courseCalendarHolder').css('width', '60%');\n jQuery('#courseCalendarAssignmentHolder').css('width', '40%');\n }\n\n start = scope.month.clone();\n\n start.date(1);\n\n _removeTime(start.day(0));\n\n _buildMonth(scope, start, scope.month);\n\n scope.view = templates.month.template;\n\n scope.selectedView = 'month';\n };\n\n scope.getCompletedAssignments = function(item) {\n return item.completedDate !== null;\n };\n\n scope.getRequiredAssignments = function(item) {\n return item.completedDate === null && item.isRequired === true && (item.status === 'new' || item.status === 'inProgress');\n };\n\n scope.getNewestAssignments = function(item) {\n return item.completedDate === null && item.status === 'new';\n };\n\n scope.getMyPicks = function(item) {\n return item.isUserAssigned === true && (item.status === 'new' || item.status === 'inProgress');\n };\n\n scope.scheduleOffering = function (assignmentId, assignmentType, sessionId) {\n\n scope.toScheduleAssignmentId = assignmentId;\n scope.toScheduleAssignmentType = assignmentType;\n scope.toScheduleSessionId = sessionId;\n\n // call Prereq api to see if any are there prereqs that the user needs to take before launching this course\n // if any are there, open modal and don't launch the course\n\n var prereqCall = AssignmentsService.getPrereqs(assignmentId);\n\n prereqCall.then(function (success) {\n\n if (success.length === 0) {\n //if nothing, do nothing, move on, schedule\n scheduleOffering(scope.toScheduleAssignmentId, scope.toScheduleAssignmentType, scope.toScheduleSessionId);\n } else {\n //If there are prereqs - set the scoped variable for the prereq details \n scope.prereqModalData = success;\n angular.element(document.querySelector('#preReqModal')).modal();\n }\n\n }, function (failure) {\n //if failure, the schedule api will catch that there is a prereq and show a failure message\n scheduleOffering(scope.toScheduleAssignmentId, scope.toScheduleAssignmentType, scope.toScheduleSessionId);\n\n });\n\n };\n\n var scheduleOffering = function (assignmentId, assignmentType, sessionId) {\n\n var offering = CoursesService.scheduleOffering(assignmentId, UsersService.getId(), assignmentType, sessionId);\n\n offering.then(function(success) {\n var obj = null;\n\n jQuery('#offeringSlide').slideUp();\n\n switch(success) {\n case 'confirmed':\n case 'inProgress':\n obj = jQuery('#fullSuccess');\n\n scope.apiMessage = 'Registration for this course was successful.';\n\n break;\n case 'waitlisted':\n obj = jQuery('#waitlistedSuccess');\n\n scope.apiMessage = 'The current course is full. You have been added to the course waitlist.';\n\n break;\n case 'pendingApproval':\n obj = jQuery('#fullSuccess');\n\n scope.apiMessage = 'Request for approval was successfully sent.';\n break;\n }\n\n obj.slideDown(500, function () {\n var _this = jQuery(this);\n\n setTimeout(function () {\n _this.slideUp(500);\n\n scope.apiActionError = false;\n\n $rootScope.$broadcast('slideDownDirective:refreshCurrentPage');\n }, 1500);\n });\n }, function (failure) {\n\n \n jQuery('#offeringSlide').slideUp();\n\n if (failure.ErrorMessage.indexOf('Prereq') > -1) {\n scope.apiErrorMessage = 'Prerequisites need to be completed for registering for this course. Registration could not be completed.';\n }\n else if (failure.ErrorMessage.indexOf('ILT because it is full') > -1) {\n scope.apiErrorMessage = 'The current course is full. Registration could not be completed.';\n }\n else if (failure.StatusCode === 409) { scope.apiErrorMessage = 'Sorry! Cannot register because there is a scheduling conflict.'; }\n else {\n scope.apiErrorMessage = 'Sorry! There was a problem saving your offering. Please try again.';\n }\n\n scope.apiActionError = true;\n\n jQuery('#underButtonError').slideDown(500, function () {\n var _this = jQuery(this);\n\n setTimeout(function () {\n _this.slideUp(500);\n\n scope.apiActionError = false;\n }, 2500);\n });\n \n });\n };\n\n scope.requestApproval = function (courseId, type, offeringId) {\n jQuery('.showLoader').toggle();\n jQuery('.managerApprovalRequired-' + courseId).toggle();\n var userId = UsersService.getId();\n\n var approval = CoursesService.requestManagerialApproval(courseId, type, userId, offeringId);\n\n approval.then(function (success) {\n jQuery('.showLoader').toggle();\n jQuery('#offeringSlide').slideUp();\n\n scope.apiMessage = 'Request for approval was successfully sent.';\n\n jQuery('#fullSuccess').slideDown(500, function () {\n var _this = jQuery(this);\n\n setTimeout(function () {\n _this.slideUp(500);\n\n scope.apiActionError = false;\n\n $rootScope.$broadcast('slideDownDirective:refreshCurrentPage');\n }, 1500);\n });\n }, function (failure) {\n jQuery('.showLoader').toggle();\n jQuery('.managerApprovalRequired-' + courseId).toggle();\n if (failure.StatusCode === 409) { scope.apiErrorMessage = 'Sorry! Cannot register because there is a scheduling conflict.'; }\n else {\n scope.apiErrorMessage = 'Sorry! There was a problem requesting approval. Please try again.';\n }\n\n scope.apiActionError = true;\n\n jQuery('#underButtonError').slideDown(500, function () {\n var _this = jQuery(this);\n\n setTimeout(function () {\n _this.slideUp(500);\n\n scope.apiActionError = false;\n }, 2500);\n });\n });\n };\n\n scope.completeAssignment = function(id, $event) {\n var completion = CoursesService.completeTask(id, UsersService.getId());\n\n scope.apiActionLoader = true;\n\n completion.then(function(success) {\n jQuery($event.currentTarget).html('Task Completed!');\n\n setTimeout(function() {\n scope.apiActionError = false;\n scope.apiActionLoader = false;\n\n $rootScope.$broadcast('slideDownDirective:refreshCurrentPage');\n }, 1000);\n }, function(failure) {\n scope.apiActionError = true;\n scope.apiActionLoader = false;\n\n scope.apiErrorMessage = 'We\\'re sorry! We couldn\\'t complete the course. Please try again.';\n\n setTimeout(function() {\n scope.apiActionError = false;\n }, 1000);\n });\n };\n\n\n scope.$on(\"assignmentFilter\", function (event, args) {\n scope.assignmentFilter = args;\n });\n\n }\n };\n\n function _removeTime(date) {\n return date.day(0).hour(0).minute(0).second(0).millisecond(0);\n }\n\n function _buildMonth(scope, start, month) {\n scope.weeks = [];\n var done = false, date = start.clone(), monthIndex = date.month(), count = 0;\n while (!done) {\n scope.weeks.push({days: _buildWeek(date.clone(), month)});\n date.add(1, \"w\");\n\n // done IFF there are at least 2 weeks and the month as incremented\n done = count++ > 2 && monthIndex !== date.month();\n\n // set month to the month of the date at current week interval;\n monthIndex = date.month();\n }\n }\n\n function _buildWeek(date, month) {\n var days = [];\n for (var i = 0; i < 7; i++) {\n days.push({\n name: date.format(\"dd\").substring(0, 1),\n number: date.date(),\n isCurrentMonth: date.month() === month.month(),\n month: date.month(),\n isToday: date.isSame(new Date(), \"day\"),\n date: date,\n year: date.year()\n });\n date = date.clone();\n date.add(1, \"d\");\n }\n\n return days;\n }\n\n function _createDay(date, month) {\n var day = {\n name: date.format(\"dd\").substring(0, 1),\n number: date.date(),\n isCurrentMonth: date.month() === month.month(),\n month: date.month(),\n isToday: date.isSame(new Date(), \"day\"),\n date: date,\n year: date.year()\n };\n\n return day;\n }\n}]);\n","app.directive(\"calendarAssignmentList\", function () {\n return {\n restrict: \"E\",\n templateUrl : 'app/templates/components/calendar/assignmentList.html',\n scope: false,\n link: function (scope, element, attrs) {\n\n scope.$on(\"assignmentFilter\", function (event, args) {\n scope.assignmentFilter = args;\n });\n\n }\n };\n});\n","app.directive(\"courseGroupSlideDown\", ['$rootScope', '$sce', 'AssignmentsService', 'CoursesService', 'TasksService', 'UsersService', 'EvaluationService', 'SurveyService', 'CareerPathService', function ($rootScope, $sce, AssignmentsService, CoursesService, TasksService, UsersService, EvaluationService, SurveyService, CareerPathService) {\n // returns the Directive Definition Object\n return {\n restrict: 'E',\n transclude: true,\n templateUrl: 'app/templates/users/partials/courseGroupSlideDown.html',\n link: function (scope, element, attrs, ctrl) {\n \n scope.managerView = typeof attrs.managerview !== 'undefined' && attrs.managerview === 'true' ? true : false;\n\n scope.$on('slider:view:close', function (event, data) {\n scope.closeSlider();\n });\n\n var lastIndex = -1;\n var showInfoLinkText = \"Read More\";\n var hideInfoLinkText = \"Read Less\";\n\n element = element.children('#courseGroupList');\n\n var openCloseInfo = function ($event, assignment, showInfoLinkText, hideInfoLinkText) {\n jQuery('.more').html(showInfoLinkText);\n jQuery('.courseGroupMore').html(showInfoLinkText);\n\n if (jQuery(element).data('state') === 'opened') {\n jQuery('#offeringSlide').slideUp();\n\n if (jQuery('.arrow').length > 0) {\n jQuery('.arrow').hide(1, function () {\n jQuery('#courseGroupList').slideUp();\n\n });\n } else {\n jQuery(element).slideUp();\n }\n\n jQuery(element).data('state', 'closed');\n }\n\n //Close any single course slide downs\n var singleCourseSlideDown = jQuery('#singlecourse');\n if (jQuery(singleCourseSlideDown).data('state') === 'opened') {\n jQuery('#offeringSlide').slideUp();\n if (jQuery('.arrow').length > 0) {\n jQuery('.arrow').hide(1, function () {\n jQuery('#singlecourse').slideUp();\n });\n } else {\n jQuery(singleCourseSlideDown).slideUp();\n }\n\n jQuery(singleCourseSlideDown).data('state', 'closed');\n }\n\n //Look for any View Resources list open and close them\n var viewResourceElem = jQuery('#viewResources');\n if (jQuery(viewResourceElem).data('state') === 'opened') {\n if (jQuery('.arrow').length > 0) {\n jQuery('.arrow').hide(1, function () {\n jQuery('#viewResources').slideUp();\n });\n } else {\n jQuery(viewResourceElem).slideUp();\n }\n\n jQuery(viewResourceElem).data('state', 'closed');\n jQuery('.resource').html('View Resources');\n }\n\n scope.apiError = false;\n scope.singleIsLoading = false;\n\n var children, lastChild, mover, parent = null;\n var currentIndex, endOfRow, modIndex, modulo = 0;\n var found = false;\n var target = $event.currentTarget;\n\n currentIndex = 0;\n\n children = jQuery(target).parents('#courseList').children('.col-md-4');\n if (children.length > 0) {\n parent = jQuery(target).parents('.col-md-4')[0];\n\n modulo = jQuery(window).width() > 768 ? 3 : 1;\n\n children.each(function (index) {\n var id = jQuery(parent).prop('id');\n\n jQuery(parent).prop('id', null);\n\n if (jQuery(this)[0] === parent) {\n currentIndex = index + 1;\n\n found = true;\n }\n\n jQuery(parent).prop('id', id);\n if (found === true) {\n found = false;\n\n jQuery('.col-md-4').removeClass('selected');\n jQuery(parent).addClass('selected');\n\n return;\n }\n });\n\n if (currentIndex === lastIndex) {\n lastIndex = -1;\n\n return;\n }\n\n jQuery(parent).children('.arrow').show(1, function () {\n jQuery(element).slideDown();\n });\n\n /* Create the dimensions of the arrow on the slide down menu */\n var assignmentContainerWidth = jQuery(parent).width();\n // Set the sides of the triangle \n var triangleSideWidth = assignmentContainerWidth / 2;\n jQuery(parent).children('.arrow').children('.point').css('border-left',\n triangleSideWidth + \"px solid transparent\");\n jQuery(parent).children('.arrow').children('.point').css('border-right',\n triangleSideWidth + \"px solid transparent\");\n\n // Set the height of the triangle and move it a bit down so it doesn't\n // overlap anything\n var triangleHeight = 40;\n jQuery(parent).children('.arrow').children('.point').css('border-top',\n triangleHeight + \"px solid #e5e5e5\");\n\n // .75 is based on the height of .arrowTopBorder.\n // So if the triangle is 40px high, needs to be shifted by 30px to not overlap\n // if triangle is 20px high, needs to be shifted by 20px to not overlap.\n // To make this clearer, replace .75 with something based on .arrowTopBorder height\n var triangleShift = triangleHeight * 0.75; // .75 is arbitrary right meow.\n jQuery(parent).children('.arrow').children('.point').css('top',\n triangleShift + \"px\");\n\n // Set endOfRow as current index - 1, as\n endOfRow = currentIndex - 1;\n modIndex = currentIndex % modulo; // modulo is 4 3 or 1 depending on columns\n\n if (modIndex > 0) {\n endOfRow = (currentIndex - modIndex) + (modulo - 1); // Subtract one from module because we are accessing array\n }\n\n lastChild = children[endOfRow];\n if (typeof lastChild === 'undefined') {\n lastChild = children[children.length - 1];\n }\n\n mover = jQuery(lastChild);\n } else {\n target = jQuery($event.currentTarget);\n parent = target.parents('.col-md-12');\n\n currentIndex = parseInt(parent.prop('id').split('-')[1], 10) + 1;\n\n if (currentIndex === lastIndex) {\n lastIndex = -1;\n\n return;\n }\n\n jQuery(element).slideDown();\n jQuery(parent).children('.arrow').slideDown();\n\n mover = jQuery(parent);\n }\n\n scope.courseGroup = assignment;\n scope.courseGroup.skillsCount = 0;\n scope.courseGroup.achievedSkillsCount = 0;\n scope.getCourseGroupData(assignment);\n\n // Assign english name to assignment\n if (assignment.type === 'wbt') {\n scope.courseGroup.fullTypeName = 'Web Based';\n } else if (assignment.type === 'courseGroupCertification') {\n scope.courseGroup.fullTypeName = 'Certification';\n } else if (assignment.type === 'courseGroupCurricula') {\n scope.courseGroup.fullTypeName = 'Curricula';\n }\n else {\n scope.courseGroup.fullTypeName = assignment.type;\n }\n\n if (jQuery($event.currentTarget).children().length > 0) {\n jQuery($event.currentTarget).children('.more').html(hideInfoLinkText);\n } else {\n jQuery($event.currentTarget).html(hideInfoLinkText);\n }\n\n jQuery(element).data('state', 'opened');\n\n jQuery(mover).after(jQuery(element));\n\n lastIndex = currentIndex;\n };\n\n scope.openCareerPathInfo = function ($event, assignment) {\n scope.childCourseOrderProperty = null;\n showInfoLinkText = \"Course List\";\n hideInfoLinkText = \"Hide Course List\";\n\n openCloseInfo($event, assignment, showInfoLinkText, hideInfoLinkText);\n };\n\n scope.openCourseGroupInfo = function ($event, assignment) {\n scope.childCourseOrderProperty = scope.orderProperty;\n openCloseInfo($event, assignment, showInfoLinkText, hideInfoLinkText);\n };\n\n scope.closeSlider = function() {\n jQuery('#courseGroupList').slideUp(500, function () {\n jQuery('.arrow').hide();\n\n jQuery('.more').html(showInfoLinkText);\n });\n\n lastIndex = -1;\n };\n\n scope.getCourseGroupData = function (assignment) {\n scope.apiError = false;\n scope.singleIsLoading = true;\n\n var courseGroupID = assignment.courseGroupId || assignment.id;\n var courseType = assignment.type;\n var student = assignment.studentId;\n var courseGroupType = courseType;\n\n if (courseType === 'courseGroupCurricula') { courseGroupType = 'Curricula'; }\n else if (courseType === 'courseGroupCertification') { courseGroupType = 'Certification'; }\n\n var courseGroups = AssignmentsService.getCourseGroupCourses(student, courseType, courseGroupID);\n\n courseGroups.then(\n function (success) {\n success.isScheduled = false;\n var courseGroupdata = success;\n if (courseType === 'careerPath') {\n for (i = courseGroupdata.length - 1; i >= 0; --i) {\n current = courseGroupdata[i];\n current.skillsList = \"\";\n if (current.skills !== null) {\n for (s = 0; s < current.skills.length; s++) {\n if (s === 0) {\n current.skillsList = current.skills[s].name;\n } else {\n current.skillsList += '; ' + current.skills[s].name;\n }\n }\n }\n }\n\n var summary = CareerPathService.createSummary(assignment, courseGroupdata);\n scope.courseGroup.skillsCount = summary.skills.total;\n scope.courseGroup.achievedSkillsCount = summary.skills.completed;\n scope.courseGroup.totalCourses = summary.courses.total;\n scope.courseGroup.totalCompletedCourses = summary.courses.completed;\n } else {\n var completedCourses = 0;\n //Get the amount of courseGroup courses before we take out successful records\n scope.courseGroup.totalCourses = courseGroupdata.length;\n for (i = courseGroupdata.length - 1; i >= 0; --i) {\n current = courseGroupdata[i];\n //Remove any successful results, student does not see successful courses\n if (current.status === 'successful') {\n courseGroupdata.splice(i, 1);\n completedCourses++;\n }\n }\n\n scope.courseGroup.totalCompletedCourses = completedCourses;\n }\n scope.courseGroupCourses = courseGroupdata;\n scope.singleIsLoading = false;\n }, function (failure) {\n scope.totals = false;\n scope.courseGroupCourses = [];\n if (failure.StatusCode !== 404) {\n scope.apiError = true;\n }\n scope.singleIsLoading = false;\n }\n );\n }; \n }\n };\n}]);\n","app.directive('displayTimeToggle',['$cookies', function ($cookies) {\n\n var template = 'app/templates/components/displayTimeToggle.html';\n\n return {\n restrict: 'AEC',\n templateUrl: template,\n controller: [\n '$scope', function($scope) {\n\n $scope.displayTime = false;\n\n function init() {\n var displayTimeUserSetting = $cookies.getObject('userSetting.displayTime');\n if (typeof displayTimeUserSetting !== 'undefined' && displayTimeUserSetting !== 'null') {\n $scope.displayTime = displayTimeUserSetting;\n }\n }\n\n $scope.toggleDisplayTime = function(displayTime) {\n $cookies.put('userSetting.displayTime', displayTime);\n };\n\n init();\n\n }\n ]\n };\n}]);","(function () {\n app.directive('documentHeart', [\n function () {\n return {\n restrict: 'E',\n scope: {\n course: \"=\",\n refreshMyDocumentsSignal: '=',\n showText: '='\n },\n templateUrl: 'App/templates/components/documentHeart.html',\n controller: ['$scope', '$timeout', 'MyDocumentsService', documentHeartController],\n };\n }\n ]);\n\n function documentHeartController($scope, $timeout, MyDocumentsService) {\n var inProgress = false;\n\n $scope.haveDocumentHeart = (typeof $scope.course.ProductType !== 'undefined' && $scope.course.ProductType.toLowerCase() === \"document\") ||\n (typeof $scope.course.CourseType !== 'undefined' && $scope.course.CourseType.toLowerCase() === \"document\");\n\n setHeartToAdd();\n if ($scope.course.isInMyDocuments) {\n setHeartToRemove();\n }\n\n function addToMyDocuments(courseId) {\n if (!inProgress) {\n setHeartToRemove();\n if ($scope.refreshMyDocumentsSignal !== undefined) {\n $scope.refreshMyDocumentsSignal(courseId, false);\n }\n inProgress = true;\n\n MyDocumentsService.add(courseId).then(function (success) {\n $timeout(function () { inProgress = false; }, 100);\n }, function (failure) {\n console.log('Unable to add document. CourseID: ' + courseId);\n });\n }\n }\n\n function removeFromMyDocuments(courseId) {\n if (!inProgress) {\n setHeartToAdd();\n if ($scope.refreshMyDocumentsSignal !== undefined) {\n $scope.refreshMyDocumentsSignal(courseId, true);\n }\n inProgress = true;\n\n MyDocumentsService.remove(courseId).then(function (success) {\n $timeout(function () { inProgress = false; }, 100);\n }, function (failure) {\n console.log('Unable to remove document. CourseID: ' + courseId);\n });\n }\n }\n\n function setHeartToAdd() {\n $scope.myDocumentsActionFunction = addToMyDocuments;\n $scope.imageSource = \"app/images/heart-outline.png\";\n $scope.myDocumentsText = \"Add to My Documents\";\n }\n\n function setHeartToRemove() {\n $scope.myDocumentsActionFunction = removeFromMyDocuments;\n $scope.imageSource = \"app/images/heart-filled.png\";\n $scope.myDocumentsText = \"Remove from My Documents\";\n }\n }\n})();","app.directive('documentUpload', [function () {\n return {\n restrict: 'E',\n scope: {\n files: '=',\n courseType: '=',\n launchWithContent: '='\n },\n templateUrl: 'app/templates/components/documentUpload.html',\n controller: ['$scope', '$rootScope', '$filter', '$route', '$q', 'errorDisplayerUtil', 'CoursesService', 'dateUtil', 'CatalogService', 'DocumentService',\n function ($scope, $rootScope, $filter, $route, $q, errorDisplayerUtil, CoursesService, dateUtil, CatalogService, DocumentService) {\n\n\n //Document Upload\n var _this = this;\n\n // Stores a list of files to be uploaded to the server\n $scope.files = [];\n $scope.files.deletedFiles = [];\n\n $scope.addDocumentToCourseError = {};\n $scope.addDocumentToCourseError.error = errorDisplayerUtil.create();\n\n $scope.documentCourseList = {};\n $scope.documentCourseList.error = errorDisplayerUtil.create();\n\n _this.params = $route.current.params;\n\n if (_this.params.name === \"edit\" && _this.params.param !== 'undefined' && _this.params.param !== null) {\n var courseId = _this.params.param.split('/')[0];\n\n DocumentService.getDocumentsForCourse(courseId).then(function (success) {\n $scope.documentCourseList.error.reset();\n $scope.files = success;\n $scope.files.deletedFiles = [];\n\n //With the given resourceID, set the launchWithContent flag\n $scope.files.forEach(function (f) {\n if (f.id === $scope.launchWithContent) {\n f.launchWithContent = true;\n }\n });\n\n }, function (failure) {\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.documentCourseList.error.setError(errorCode, message);\n });\n }\n\n $scope.setResourceLaunchWithContent = function (resource) {\n $scope.launchWithContent = resource.id;\n $scope.files.forEach(function (f) {\n if (f.launchWithContent === true && resource === f) {\n f.launchWithContent = false;\n $scope.launchWithContent = 0;\n }\n else\n f.launchWithContent = resource === f;\n });\n };\n\n ///////// DELETION\n /* Deletes a file or url when you click the \n * x button */\n $scope.deleteFile = function (id) {\n\n for (var i = 0; i < $scope.files.length; i++) {\n if ($scope.files[i].id === id) { $scope.files.splice(i, 1); i = $scope.files.length + 1; }\n }\n\n //Add the fileID to the deleted files array to delete upon save\n var delFile = {};\n delFile.id = id;\n $scope.files.deletedFiles.push(delFile);\n if ($scope.hideDropdownIn) { $scope.btnDisabled = false; }\n\n //If a deleted file was set to launch with content, then remove that content launch flag\n if (id === $scope.launchWithContent) {\n $scope.launchWithContent = 0;\n }\n };\n\n $scope.addNewDocumentCta = function () {\n $scope.$broadcast('openAddAssignmentsModal', { displaytype: 2 });\n };\n //Document upload finish \n // asignement model\n $rootScope.addDocumentsWithLibrary = {};\n\n $rootScope.addDocumentsWithLibrary.error = errorDisplayerUtil.create();\n\n /**\n * Fix for 2403. Since JS is loose, not defining an attribute on an object returns undefined, which resolves to false,\n * which is bad for us, since we need it to resolve to true later.\n */\n $rootScope.addDocumentsWithLibrary.initialIsLoading = true;\n $rootScope.addDocumentsWithLibrary.initialFailed = false;\n\n $rootScope.addDocumentsWithLibrary.searchCatalog = Array();\n $rootScope.addDocumentsWithLibrary.searchLibraries = Array();\n $rootScope.addDocumentsWithLibrary.searchCategories = Array();\n $rootScope.addDocumentsWithLibrary.searchFields = Array();\n $rootScope.dueDates = {};\n\n $scope.$on('openAddAssignmentsModal', function (evt, params) {\n jQuery('#addAssignmentsWithLibraryModal').modal();\n \n if ($rootScope.addDocumentsWithLibrary.searchCatalog.length === 0) {\n var coursePromises = [];\n coursePromises.push(CatalogService.getBaiCatalogData()); // Used for catalog info\n coursePromises.push(DocumentService.getDocumentRepositoryList()); // Used as course list, filtered using 2 above\n $q.all(coursePromises).then(function (coursesData) {\n var catalogTree = coursesData[0];\n $rootScope.addDocumentsWithLibrary.searchCatalog = coursesData[1];\n _.each(catalogTree.formattedCatalogTreeData, function (catalog) {\n $scope.assignCatalog(catalog, catalog.nodeId, catalog.name);\n });\n // Create unique lists of catalogs and course types for dropdowns\n _.each($rootScope.addDocumentsWithLibrary.searchCatalog, function (c) {\n if (c.rootNodeId !== null && typeof c.rootNodeId !== 'undefined' && _.findIndex($rootScope.addDocumentsWithLibrary.searchLibraries, { \"nodeId\": c.rootNodeId }) === -1 && c.productType === \"Document\") {\n $rootScope.addDocumentsWithLibrary.searchLibraries.push({ \"nodeId\": c.rootNodeId, \"name\": c.rootNodeDescription });\n }\n if (_.findIndex($rootScope.addDocumentsWithLibrary.searchCategories, { \"friendlyName\": $filter('assignmentAssetTypeName')(c.type) }) === -1) {\n $rootScope.addDocumentsWithLibrary.searchCategories.push({ \"type\": c.type, \"friendlyName\": $filter('assignmentAssetTypeName')(c.type) });\n }\n });\n $rootScope.addDocumentsWithLibrary.searchFields = CoursesService.getSearchableCatalog();\n $rootScope.addDocumentsWithLibrary.initialIsLoading = false;\n $rootScope.addDocumentsWithLibrary.selectAll = false;\n $rootScope.catalogDropdownValues = _.sortBy($rootScope.catalogDropdownValues, \"name\");\n $rootScope.courseTypeDropdownValues = _.sortBy($rootScope.courseTypeDropdownValues, \"type\");\n $rootScope.courseTypeDropdownValues = $rootScope.courseTypeDropdownValues.reverse();\n }, function (failure) {\n $rootScope.coursesApiAreLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $rootScope.viewCoursesError.error.setError(errorCode, message);\n });\n\n }\n else {\n $rootScope.addDocumentsWithLibrary.initialIsLoading = false;\n }\n });\n\n $scope.assignCatalog = function (node, rootId, rootDescription) {\n var nodeId = node.nodeId;\n _.each($rootScope.addDocumentsWithLibrary.searchCatalog, function (course) {\n if (course.catalogId === nodeId) {\n course.rootNodeId = rootId;\n course.rootNodeDescription = rootDescription;\n } else if (course.catalogId === null) {\n course.rootNodeId = 0;\n course.rootNodeDescription = \"Custom Catalog\";\n }\n });\n\n if (node.nodes) {\n _.each(node.nodes, function (childNode) {\n $scope.assignCatalog(childNode, rootId, rootDescription);\n });\n }\n };\n\n\n /* Stores assignments */\n // This one stores the list of documents in the\n // search page\n $rootScope.addDocumentsWithLibrary.searchResults = Array();\n $rootScope.addDocumentsWithLibrary.queuedDocuments = {};\n $rootScope.addDocumentsWithLibrary.selectAll = false;\n // Used on due date tab. keeps list of documents that have been unchecked\n // If the user goes to the first or last tabs, this variable will be used to remove assignments\n // from the list of queued assignments\n // Used in same manner as $rootScope.addAssignmentsWithLibrary.queuedAssignments except it's the opposite\n $rootScope.addDocumentsWithLibrary.documentsToggledForRemoval = {};\n\n $rootScope.addDocumentsWithLibrary.clearAddDocumentsModal = function () {\n for (i = 0; i < $rootScope.addDocumentsWithLibrary.searchResults.length; i++) {\n $rootScope.addDocumentsWithLibrary.searchResults[i].checked = false;\n }\n $rootScope.addDocumentsWithLibrary.queuedDocuments = {};\n $rootScope.addDocumentsWithLibrary.documentsToggledForRemoval = {};\n $rootScope.addDocumentsWithLibrary.keyword = '';\n $rootScope.addDocumentsWithLibrary.library = null;\n $rootScope.addDocumentsWithLibrary.contentType = null;\n $rootScope.addDocumentsWithLibrary.selectAll = false;\n $rootScope.addDocumentsWithLibrary.searchResults = Array();\n $rootScope.addDocumentsWithLibrary.RESULTS_FOUND = false;\n $rootScope.addDocumentsWithLibrary.autoOpenedList = false;\n $rootScope.addDocumentsWithLibrary.noDocumentsSelectedError = false;\n $rootScope.addDocumentsWithLibrary.anySelected = false;\n $rootScope.addDocumentsWithLibrary.selectAll = false;\n $rootScope.addDocumentsWithLibrary.selectedCount = 0;\n $rootScope.addDocumentsWithLibrary.error.reset();\n };\n\n /* Used for storing search data for filtering assignments at top of modal */\n $rootScope.addDocumentsWithLibrary.keyword = '';\n\n // Keeps track of whether we should disable the next/submit button\n $rootScope.addDocumentsWithLibrary.buttonDisabled = false;\n\n // This function goes through every document toggled for removal\n // in the assignmentsToggledForRemoval variable\n // and removes it from the list of queuedAssignments\n\n var deleteDocumentsToggledForRemoval = function (queuedDocuments, documentsToggledForRemoval) {\n var documentsToRemoveIds = Object.keys(documentsToggledForRemoval);\n\n for (var i = 0; i < documentsToRemoveIds.length; i += 1) {\n if (documentsToRemoveIds[i] in queuedDocuments) {\n delete queuedDocuments[documentsToRemoveIds[i]];\n }\n }\n }; \n\n $rootScope.addDocumentsWithLibrary.searchDocuments = function (keyword) {\n return $q(function (resolve, reject) {\n // If no search criteria, return nothing\n if ((typeof keyword === 'undefined' || keyword === null || keyword === \"\") &&\n ($rootScope.addDocumentsWithLibrary.library === null || typeof $rootScope.addDocumentsWithLibrary.library === 'undefined' || $rootScope.addDocumentsWithLibrary.library === \"\") &&\n ($rootScope.addDocumentsWithLibrary.contentType === null || typeof $rootScope.addDocumentsWithLibrary.contentType === 'undefined' || $rootScope.addDocumentsWithLibrary.contentType === \"\")) {\n $rootScope.addDocumentsWithLibrary.searchResults = null;\n resolve(null); // Don't return anything\n }\n\n var checkKeyword = false;\n if (typeof keyword !== 'undefined' && keyword !== null && keyword !== \"\") {\n var stubResults = $filter('filter')($rootScope.addDocumentsWithLibrary.searchFields, keyword);\n $rootScope.addDocumentsWithLibrary.searchResults = $filter('filter')($rootScope.addDocumentsWithLibrary.searchCatalog, function (course) {\n for (i = 0; i < stubResults.length; i++) {\n if (course.code === stubResults[i].code) {\n return course;\n }\n }\n });\n checkKeyword = true;\n }\n\n var checkCatalog = false;\n if ($rootScope.addDocumentsWithLibrary.library !== null && typeof $rootScope.addDocumentsWithLibrary.library !== 'undefined' && $rootScope.addDocumentsWithLibrary.library !== \"\") {\n checkCatalog = true;\n if (checkKeyword) {\n $rootScope.addDocumentsWithLibrary.searchResults = $filter('filter')($rootScope.addDocumentsWithLibrary.searchResults, function (course) {\n if (course.rootNodeDescription === $rootScope.addDocumentsWithLibrary.library.name) {\n return course;\n }\n });\n } else {\n $rootScope.addDocumentsWithLibrary.searchResults = $filter('filter')($rootScope.addDocumentsWithLibrary.searchCatalog, function (course) {\n if (course.rootNodeDescription === $rootScope.addDocumentsWithLibrary.library.name) {\n return course;\n }\n });\n }\n }\n if ($rootScope.addDocumentsWithLibrary.contentType !== null && typeof $rootScope.addDocumentsWithLibrary.contentType !== 'undefined' && $rootScope.addDocumentsWithLibrary.contentType !== \"\") {\n checkType = true;\n if (checkKeyword || checkCatalog) {\n $rootScope.addDocumentsWithLibrary.searchResults = $filter('filter')($rootScope.addDocumentsWithLibrary.searchResults, function (course) {\n if (course.type === $rootScope.addDocumentsWithLibrary.contentType.type) {\n return course;\n }\n });\n } else {\n $rootScope.addDocumentsWithLibrary.searchResults = $filter('filter')($rootScope.addDocumentsWithLibrary.searchCatalog, function (course) {\n if (course.type === $rootScope.addDocumentsWithLibrary.contentType.type) {\n return course;\n }\n });\n }\n }\n if ($rootScope.addDocumentsWithLibrary.searchResults === null || $rootScope.addDocumentsWithLibrary.searchResults.length === 0) {\n $rootScope.addDocumentsWithLibrary.NO_RESULTS = true;\n } else {\n $rootScope.addDocumentsWithLibrary.RESULTS_FOUND = true;\n $rootScope.addDocumentsWithLibrary.NO_RESULTS = false;\n }\n });\n\n };\n\n $rootScope.addDocumentsWithLibrary.selectedCount = 0;\n\n\n // When you select a document in the search tab, it gets\n // added to the list of queued assignments here\n $rootScope.addDocumentsWithLibrary.queueDocument = function (document) {\n if (document.id in $rootScope.addDocumentsWithLibrary.queuedDocuments) {\n delete $rootScope.addDocumentsWithLibrary.queuedDocuments[document.id];\n $rootScope.addDocumentsWithLibrary.selectedCount--;\n $rootScope.addDocumentsWithLibrary.selectAll = false;\n if (Object.keys($rootScope.addDocumentsWithLibrary.queuedDocuments).length === 0) {\n $rootScope.addDocumentsWithLibrary.noDocumentsSelectedError = true;\n $rootScope.addDocumentsWithLibrary.anySelected = false;\n }\n } else {\n $rootScope.addDocumentsWithLibrary.queuedDocuments[document.id] = document;\n $rootScope.addDocumentsWithLibrary.selectedCount++;\n if ($rootScope.addDocumentsWithLibrary.selectedCount === $rootScope.addDocumentsWithLibrary.searchResults.length) {\n $rootScope.addDocumentsWithLibrary.selectAll = true;\n }\n // if you've selected something then you shouldn't see this error\n $rootScope.addDocumentsWithLibrary.noDocumentsSelectedError = false;\n $rootScope.addDocumentsWithLibrary.anySelected = true;\n }\n };\n\n /*** due date tab stuff */\n // when you click remove, remove the document from the list\n $rootScope.addDocumentsWithLibrary.toggleDocumentForRemoval = function (document) {\n if (document.id in $rootScope.addDocumentsWithLibrary.queuedDocuments) {\n //document is removed so deselect it, if they go back, they can reselect the document if they want\n document.checked = false;\n $rootScope.addDocumentsWithLibrary.selectedCount--;\n $rootScope.addDocumentsWithLibrary.selectAll = false;\n delete $rootScope.addDocumentsWithLibrary.queuedDocuments[document.id];\n }\n\n if (Object.keys($rootScope.addDocumentsWithLibrary.queuedDocuments).length === 0) {\n $rootScope.addDocumentsWithLibrary.noDocumentsSelectedError = true;\n }\n };\n\n // This function gets the course from\n // $rootScope.addAssignmentsWithLibrary.queuedAssignments = {}\n // and add document to the list\n $rootScope.addDocumentsWithLibrary.submitDocumentsForSelectedUsers = function () {\n var assignmentIds;\n assignmentIds = Object.keys($rootScope.addDocumentsWithLibrary.queuedDocuments);\n _.each(assignmentIds, function (a) {\n $scope.addFileFromDocRepo(parseInt(a));\n });\n }; \n\n $scope.addFileFromDocRepo = function (a) {\n // Map the document id to a file object\n var fileToAdd = _.filter($rootScope.addDocumentsWithLibrary.searchCatalog, function (file) {\n if (file.id === a)\n return true;\n });\n\n fileToAdd = fileToAdd[0];\n\n /* If the file is already in the list\n * exit the function */\n for (var i = 0; i < $scope.files.length; i += 1) {\n if ($scope.files[i].id === a) {\n jQuery('#addAssignmentsWithLibraryModal').modal('hide');\n $scope.documentCourseList.error.setError(409, \"Docuemnt already present in the list..\");\n return;\n }\n }\n\n fileToAdd.fromRepo = true;\n fileToAdd.fileOrUrl = 'file';\n\n $scope.files.push(angular.copy(fileToAdd));\n\n // Clear the model \n jQuery('#addAssignmentsWithLibraryModal').modal('hide');\n\n jQuery('#addAssignmentsWithLibraryModal').on('hidden.bs.modal', function () {\n angular.element(document.querySelector('#viewAssignmentsModal')).modal();\n $rootScope.addDocumentsWithLibrary.clearAddDocumentsModal();\n });\n };\n \n $rootScope.addDocumentsWithLibrary.addAllCourses = function (selected) {\n for (i = 0; i < $rootScope.addDocumentsWithLibrary.searchResults.length; i++) {\n if ($rootScope.addDocumentsWithLibrary.searchResults[i].checked === selected || $rootScope.addDocumentsWithLibrary.searchResults[i].checked === undefined) {\n $rootScope.addDocumentsWithLibrary.searchResults[i].checked = !selected;\n $rootScope.addDocumentsWithLibrary.queueDocument($rootScope.addDocumentsWithLibrary.searchResults[i]);\n }\n }\n };\n\n //\n }]\n };\n}\n]);","app.directive('doughnutChart', [function () {\n return {\n restrict: 'E',\n scope: {\n config: '=',\n circleMessage: '='\n },\n templateUrl: 'app/templates/components/doughnutChart.html',\n link: function (scope, element, attr) {\n var canvas = element.find('canvas')[0];\n var ctx = canvas.getContext(\"2d\");\n \n scope.$watch('config', function (newVal) {\n scope.config = newVal;\n if (scope.config !== undefined) {\n new Chart(ctx).Doughnut(scope.config.data, scope.config.options);\n }\n });\n }\n };\n}]);\n","app.directive('dropdown', function() {\n return {\n restrict: 'E',\n scope: {\n 'objects': '=',\n 'selectedObj': '=',\n 'optionalRowDisplayer': '=?',\n 'optionalSelectedRowDisplayer': '=?',\n 'optionalOnClick': '=?'\n },\n link: function(scope, element, attrs) {\n scope.pickerVisible = false;\n\n scope.togglePicker = function() {\n /* Toggle picker is the entry to the dropdown\n * so if it's disabled only need to disable here */\n if (scope.disabled) {\n return ;\n }\n scope.pickerVisible = !scope.pickerVisible;\n };\n\n scope.hidePicker = function() {\n scope.pickerVisible = false;\n };\n\n scope.chooseObj = function(obj) {\n scope.selectedObj = obj;\n scope.hidePicker();\n if (scope.optionalOnClick) {\n scope.optionalOnClick(obj);\n }\n };\n },\n templateUrl: 'app/templates/components/dropdown.html'\n };\n});\n","/* For input fields, adds an enter key handler\n * Useful for inline editing\n * Copied from http://stackoverflow.com/a/17472118/761726 */\napp.directive('baiEnterKeyHandler', function () {\n return function (scope, element, attrs) {\n element.on(\"keydown keypress\", function (event) {\n if(event.which === 13) {\n scope.$apply(function (){\n scope.$eval(attrs.baiEnterKeyHandler);\n });\n\n event.preventDefault();\n }\n });\n };\n});\n","app.directive(\"iltCalendarAssignmentList\", function () {\n return {\n restrict: \"E\",\n templateUrl : 'app/templates/components/calendar/iltAssignmentList.html',\n scope: false,\n link: function(scope, element, attrs) {\n }\n };\n});\n","app.directive('imageExists', function() {\n return {\n restrict: 'AEC',\n scope: {\n imageExists: '='\n },\n link: function(scope, element, attrs) {\n element.on('error', function() {\n jQuery(element).prop('src', _getDefaultImage(attrs.imageExists));\n });\n\n var _getDefaultImage = function(type) {\n switch(type) {\n case 'catOnly':\n return 'app/images/cat0000.jpg';\n case 'icons-white':\n return 'app/images/icons/default_white.svg';\n case 'icons-black':\n return 'app/images/icons/default_black.svg';\n case 'catalog-tile':\n return 'app/images/catalog/default.png';\n default:\n return 'app/images/00000.png';\n }\n };\n }\n };\n});\n","app.directive('lmsDatePicker', ['dateUtil', function (dateUtil) {\n\n var template = 'app/templates/components/lmsDatepicker.html';\n\n return {\n restrict: 'E',\n templateUrl: template,\n scope: {\n dateObj: '=date',\n minDate: '=?',\n maxDate: '=?',\n showTimeToggle: '=?',\n isEditable: \"=\",\n onChange: \"&?\",\n isRequired: \"=?\",\n id: \"@\",\n placeholderOverride: \"@?\",\n displayInline: \"=?\",\n onAssignonChange: \"&?\"\n },\n link: function (scope, element) {\n\n scope.displayInline = (angular.isDefined(scope.displayInline) && scope.displayInline === true) ? scope.displayInline : undefined;\n\n scope.showTimeToggle = angular.isDefined(scope.showTimeToggle) ? scope.showTimeToggle : true;\n\n scope.onDateTimeChange = function (newValue, oldValue) {\n \n //to ensure portal default time is set only the first time a date is selected. (assuming portal default time is set in the controllers on-change method)\n //(have to find a better way to do this)\n if (typeof scope.dateObj !== \"undefined\" && scope.dateObj !== null) {\n if (typeof newValue === \"undefined\" || typeof scope.dateObj.moment === \"undefined\") {\n scope.dateObj.displayTime = null;\n }\n }\n \n\n if (typeof scope.onChange !== \"undefined\") {\n if (typeof scope.dateObj !== \"undefined\" && typeof scope.dateObj.moment !== \"undefined\") {\n var retObj = scope.onChange({ dateObj: scope.dateObj });\n if (typeof retObj !== \"undefined\") {\n scope.dateObj = retObj;\n }\n }\n } else if (typeof scope.onAssignonChange !== \"undefined\") {\n // the only difference from above is that we don't check if the moment object is undefined - didn't want to make this change to ALL date pickers\n //the function that is being called for assign on handles null moment and won't break, can't say the same for all other date pickers\n if (typeof scope.dateObj !== \"undefined\") {\n var retObjAssignOn = scope.onAssignonChange({ dateObj: scope.dateObj });\n if (typeof retObjAssignOn !== \"undefined\") {\n scope.dateObj = retObjAssignOn;\n }\n }\n } else {\n if (typeof newValue !== \"undefined\" && newValue !== null && _.isObject(newValue)) {\n var currentTime = new Date();\n if (typeof scope.dateObj !== \"undefined\" && typeof scope.dateObj.moment !== \"undefined\" && _.isObject(scope.dateObj.moment)) {\n scope.dateObj.moment.set({ hour: currentTime.getHours(), minute: currentTime.getMinutes(), second: currentTime.getSeconds(), millisecond: currentTime.getMilliseconds() });\n scope.dateObj = dateUtil.formatDate(scope.dateObj.moment.toDate(), scope.dateObj.displayTime);\n }\n else {\n newValue.set({ hour: currentTime.getHours(), minute: currentTime.getMinutes(), second: currentTime.getSeconds(), millisecond: currentTime.getMilliseconds() });\n scope.dateObj = dateUtil.formatDate(newValue.toDate());\n }\n }\n }\n };\n\n scope.toggleDateTimedisplay = function (dateObj) {\n if (typeof dateObj === \"undefined\" || dateObj === null || typeof dateObj.moment === \"undefined\" || typeof dateObj.displayTime === \"undefined\" || dateObj.displayTime === null) {\n return;\n }\n\n dateObj.displayTime = !dateObj.displayTime;\n };\n\n\n }\n };\n}]);","app.directive('loginFormSwitcher',['UsersService' , function(UsersService) {\n var pages = ['.signin', '.forgotpassword', '.loading', '.enterpin', '.loading', '.resetpassword', '.loading'];\n\n var template = 'app/templates/users/partials/signin.html';\n\n return {\n link: function($scope) {\n $scope.forgotForm = function(value) {\n if(value === 0) {\n jQuery(pages[value]).toggle();\n\n jQuery(pages[value + 1]).toggle();\n } else {\n jQuery(pages[value - 1]).toggle();\n\n jQuery(pages[value]).toggle();\n }\n };\n\n $scope.reset = function() {\n for (var i in pages) {\n if (pages[i] === '.resetpassword') {\n $scope.loading = false;\n UsersService.clearSession();\n }\n jQuery(pages[i]).hide();\n }\n\n jQuery(pages[0]).show();\n };\n },\n restrict: 'A',\n templateUrl: template\n };\n}]);","app.directive(\"messagingBuilder\", function () {\n var templates = {\n error: {\n template: 'app/templates/components/messaging/error.html'\n },\n errorMicro: {\n template: 'app/templates/components/messaging/error-micro.html'\n },\n success: {\n template: 'app/templates/components/messaging/success.html'\n },\n warning: {\n template: 'app/templates/components/messaging/warning.html'\n },\n errorPreformatted: {\n template: 'app/templates/components/messaging/error-preformatted.html'\n }\n };\n\n return {\n restrict: \"E\",\n scope: {\n active: '=',\n message: '=',\n neverHide: '=',\n dontDisappear: '=',\n view: '='\n },\n link: function (scope, element, attrs) {\n\n scope.view = templates[attrs.view].template;\n\n if(typeof attrs.neverHide === 'undefined' || attrs.neverHide !== 'true') {\n scope.$watch('active', function (newVal) {\n if (newVal === true) {\n jQuery(element).show();\n\n if (!attrs.dontDisappear) {\n setTimeout(function () {\n scope.active = false;\n\n jQuery(element).slideUp().css('display', 'block');\n }, 5000);\n }\n }\n });\n }\n },\n templateUrl: 'app/templates/components/messaging.html'\n };\n});\n","/*\n Directive to handle a minimum time as a string. Parses the time string and compares it to the value. Invalid if the time entered is less than the minimum value\n*/\napp.directive('minTimeString', ['dateUtil', function (dateUtil) {\n\n return {\n // restrict to an attribute type.\n restrict: 'A',\n\n // element must have ng-model attribute.\n require: 'ngModel',\n\n // scope = the parent scope\n // elem = the element the directive is on\n // attr = a dictionary of attributes on the element\n // ctrl = the controller for ngModel.\n link: function (scope, elem, attr, ctrl) {\n ctrl.$validators.minTimeString = function(modelValue) {\n var valid = true;\n var minTime = dateUtil.parseTime(attr.minTimeString);\n // If it can't parse the time, it's the wrong format so don't even bother trying to validate against the min time.\n // But we want to assume this is valid if the format is wrong, otherwise, this validation could cover up a regex validation that validates the time format.\n if (minTime !== null) {\n var valueTime = dateUtil.parseTime(modelValue);\n if (valueTime !== null) {\n if (valueTime < minTime) {\n valid = false;\n }\n }\n }\n return valid;\n };\n } // end link function\n }; // end return\n}]);","app.directive('nestedContainer', ['$filter', '$compile', 'GroupsService', 'UsersService', 'dateUtil', 'sortService', \n function ($filter, $compile, GroupsService, UsersService, dateUtil, sortService) {\n\n return {\n restrict: 'E',\n scope: {\n 'data': '=',\n 'selectOptionsData': '=',\n 'containerOperandsData': '=',\n 'parentData': '=',\n 'options': '='\n },\n templateUrl: 'app/templates/components/nestedcontainer.html',\n link: function(scope, element, attrs) {\n var _this = this;\n\n scope.containerOperands = scope.containerOperandsData;\n // When viewing/updating a people group, the end-point will return list of criteris.\n // Since, we are iterating thorugh criterias and have a cascading dropdown\n // We need to format the data in such a way that each criteria has its own operands data\n // based on the returning field value.\n scope.criterias = scope.data.criteria;\n scope.typeaheadMinLength = 2;\n scope.typeaheadWaitTime = 800;\n if (!scope.parentData)\n {\n scope.data.level = 0;\n scope.data.matchParent = false;\n }\n else {\n scope.data.level = scope.$parent.$parent.data.level + 1;\n if (scope.$parent.$parent.data.operandId === scope.data.operandId)\n scope.data.matchParent = true;\n else {\n scope.data.matchParent = false;\n }\n }\n\n if (scope.data.level > 14) {\n scope.containerLimit = true;\n }\n \n\n _this.singleCriteriaOperands = function(singleCriteria) {\n _.each(scope.selectOptionsData, function(datapoint) {\n if (singleCriteria.criteriaId === datapoint.id) {\n singleCriteria.operatorsData = datapoint.operands;\n }\n });\n\n return singleCriteria;\n };\n\n _this.setOperandsDataInCriteria = function(data) {\n if (data.length > 0) {\n _.each(data, function(singleCriteria) {\n _this.singleCriteriaOperands(singleCriteria);\n });\n\n return data;\n }\n };\n\n _this.setOperandsDataInCriteria(scope.data.criteria);\n\n\n if (angular.isArray(scope.data.subContainers)) {\n\n scope.dataForSubcontainers = scope.data.subContainers;\n\n var template = \"
\";\n var linkFn = $compile(template);\n var content = linkFn(scope);\n element.append(content);\n\n }\n\n scope.noResults = '';\n\n scope.updateNgModel = function(datapoint) {\n var selectedOperandId = datapoint.operandId;\n\n _.each(scope.selectOptionsData, function(option) {\n _.each(option.operands, function(operand) {\n if (operand.id === selectedOperandId) {\n datapoint.operandName = operand.name;\n }\n });\n\n });\n };\n\n scope.selectedItem = function($item, $model, $label, $event, criteriaDataPoint) {\n criteriaDataPoint.value = $item.id;\n };\n\n scope.drilldownOperatorSelect = function(datapoint, $index) {\n\n var selectedCriteriaId = datapoint.criteriaId;\n datapoint.value = \"\";\n _.each(scope.selectOptionsData, function(option) {\n if (option.id === selectedCriteriaId) {\n datapoint.operatorsData = option.operands;\n // Since, we are unable to update both id and name on select., we are\n // forcing from JS to update the model\n datapoint.criteriaName = option.name;\n }\n });\n\n //datapoint.autoCompleteData = GroupsService.filterDataForAutoComplete(datapoint);\n\n if (datapoint.criteriaName.includes(\"Date\")) {\n datapoint.isDate = true;\n datapoint.isString = false;\n datapoint.isDropdown = false;\n datapoint.isBool = false;\n datapoint.value = dateUtil.formatDate(dateUtil.setPortalStartTime(new Date()));\n } else if (datapoint.criteriaName === \"Group Name\") {\n datapoint.isDropdown = true;\n datapoint.isDate = false;\n datapoint.isString = false;\n datapoint.isBool = false;\n }\n else if (datapoint.criteriaName === 'Is Manager') {\n datapoint.isDropDown = false;\n datapoint.isDate = false;\n datapoint.isString = false;\n datapoint.isBool = true;\n }\n else {\n datapoint.isDate = false;\n datapoint.isString = true;\n datapoint.isDropdown = false;\n datapoint.isBool = false;\n }\n };\n\n scope.formattingDate = function(criteriaDataPoint) {\n //no changes required at this point\n };\n\n scope.setContainerOperandName = function(data) {\n var operandId = data.operandId;\n\n _.each(scope.containerOperandsData, function(operand) {\n if (operand.operandId === operandId) {\n data.operandName = operand.operandValue;\n }\n });\n if (scope.parentData && scope.$parent.$parent.data.operandId === operandId) {\n scope.matchParent = true;\n if (scope.$parent.$parent.data.matchParent === true && scope.data.operandId === 2)\n { scope.invalidPeople('The way you are creating this People Group may result in poor processing performance. There also are less time consuming ways for you to create it. If you need assistance please contact BAI Customer Support at (800)264-7600.', 'Warning'); }\n }\n else scope.matchParent = false;\n for (index = 0; index < scope.data.subContainers.length; ++index) {\n if (scope.data.subContainers[index].operandId === operandId){\n scope.data.subContainers[index].matchParent = true;\n if (scope.matchParent === true && scope.data.operandId === 2)\n { scope.invalidPeople('The way you are creating this People Group may result in poor processing performance. There also are less time consuming ways for you to create it. If you need assistance please contact BAI Customer Support at (800)264-7600.', 'Warning'); }\n else {\n for (subind = 0; subind < scope.data.subContainers[index].subContainers.length; ++subind) {\n if (scope.data.subContainers[index].subContainers[subind].matchParent)\n { scope.invalidPeople('The way you are creating this People Group may result in poor processing performance. There also are less time consuming ways for you to create it. If you need assistance please contact BAI Customer Support at (800)264-7600.', 'Warning'); }\n \n }\n }\n }\n else scope.data.subContainers[index].matchParent = false;\n }\n\n };\n\n // Root container shouldn't have a trash icon and sibling button.\n scope.addMoreActions = false;\n if (scope.data.isRoot === false) {\n scope.addMoreActions = true;\n }\n\n scope.addFilterRule = function() {\n var newCriteria = GroupsService.generateCriteria();\n newCriteria.criteriaId = undefined;\n newCriteria.operandId = undefined;\n scope.data.criteria.push(newCriteria);\n };\n\n scope.addChild = function () {\n if (scope.parentData && scope.$parent.$parent.data.matchParent === true && scope.data.matchParent === true && scope.data.operandId === 2)\n {\n scope.invalidPeople('The way you are creating this People Group may result in poor processing performance. There also are less time consuming ways for you to create it. If you need assistance please contact BAI Customer Support at (800)264-7600.', 'Warning');\n }\n var newSubContainer = GroupsService.generateSubContainer(true);\n newSubContainer.then(function(success) {\n scope.data.subContainers.push(success);\n success.parentContainerId = scope.data.containerId;\n success.groupId = scope.data.groupId;\n success.criteria[0].criteriaId = undefined;\n success.criteria[0].operandId = undefined;\n success.level = scope.data.level + 1;\n if (scope.data.subContainers.length > 0) {\n scope.data.hasChildren = true;\n }\n\n }, function(failure) {\n // TODO Mani\n });\n\n };\n\n scope.addSibling = function() {\n var newSubContainer = GroupsService.generateSubContainer(true);\n newSubContainer.then(function(success) {\n scope.parentData.push(success);\n success.parentContainerId = scope.parentData[0].parentContainerId;\n success.groupId = scope.parentData[0].groupId;\n success.criteria[0].criteriaId = undefined;\n success.criteria[0].operandId = undefined;\n success.level = scope.data.level;\n }, function(failure) {\n // TODO Mani\n });\n\n };\n scope.invalidPeople = function(message, title) {\n scope.$emit('invalidPeopleModalOpen', [message, title]);\n };\n\n scope.removeFilterRule = function(index) {\n // if (scope.data.criteria.length > 1) \n scope.data.criteria.splice(index, 1);\n };\n\n scope.removeChild = function(datapoint) {\n scope.parentData.splice(scope.parentData.indexOf(datapoint), 1);\n };\n\n scope.containerPopover = {};\n scope.containerPopover.isOpen = false;\n\n /*\n While user interacting with a particular container that particular container will have a hover effect\n and user will notice a border across that container.\n Used Angular jqLite to manupulate the DOM.\n ngMouseenter and ngMouseLeave didnt work because of nesting.\n */\n function enterHandler(ev) {\n var target = angular.element(ev.target);\n var elId = target.attr('id');\n if (target.is(\".childContainer\")) {\n angular.element(this).css(\"border\", \"2px solid #7f7f7f\");\n angular.element(this.parentElement.parentNode).css(\"border\", \"none\");\n }\n }\n\n var mouseEnterHandler = angular.element(document.getElementsByClassName(\"childContainer\"));\n mouseEnterHandler.mouseenter(enterHandler);\n\n function leaveHandler(ev) {\n var target = angular.element(ev.target);\n var elId = target.attr('id');\n if (target.is(\".childContainer\")) {\n angular.element(this).css(\"border\", \"none\");\n if (this.parentElement.className === \"parentContainer ng-isolate-scope\") {\n angular.element(this.parentElement).css(\"border\", \"none\");\n } else {\n angular.element(this.parentElement.parentNode).css(\"border\", \"2px solid #7f7f7f\");\n }\n }\n }\n\n angular.element(document.getElementsByClassName(\"childContainer\")).mouseleave(leaveHandler);\n\n /*\n * Search for users\n */\n scope.userTypeahead = {};\n scope.userTypeahead.search = function (fieldName, value) {\n scope.userTypeahead.isLoading = true;\n return GroupsService.filterDataForAutoComplete(fieldName, value).then(function (success) {\n // The object returned from filterDataForAutoComplete always contains id and name so always using 'name' property is OK\n var sortedResult = sortService.sortByPropertyContains(success, value, 'name');\n return sortedResult;\n });\n };\n }\n };\n }\n]);","(function () {\n app.directive('playlistHeart', [\n function () {\n return {\n restrict: 'E',\n scope: {\n course: \"=\",\n refreshPlaylistSignal: '=',\n showText: '='\n },\n templateUrl: 'App/templates/components/playlistHeart.html',\n controller: ['$scope', '$timeout', 'PlaylistServices', playlistHeartController],\n };\n }\n ]);\n\n function playlistHeartController($scope, $timeout, PlaylistServices) {\n var inProgress = false;\n\n $scope.haveHeart = $scope.course.CourseType.toLowerCase() !== \"documents\" && ($scope.course.ProductType === undefined || $scope.course.ProductType.toLowerCase() !== \"document\");\n setHeartToAdd();\n if ($scope.course.isInPlaylist) {\n setHeartToRemove();\n }\n\n function addToPlaylist(courseId) {\n if (!inProgress) {\n setHeartToRemove();\n if ($scope.refreshPlaylistSignal !== undefined) {\n $scope.refreshPlaylistSignal($scope.course.CourseId, true);\n }\n inProgress = true;\n\n PlaylistServices.addCourseToPlaylist(courseId).then(function (success) {\n $timeout(function () { inProgress = false; }, 100);\n }, function (failure) {\n // TODO: Handle error, should it even show anything?\n });\n }\n }\n\n function removeFromPlaylist(courseId) {\n if (!inProgress) {\n setHeartToAdd();\n if ($scope.refreshPlaylistSignal !== undefined) {\n $scope.refreshPlaylistSignal($scope.course.CourseId, false);\n }\n inProgress = true;\n\n PlaylistServices.deleteCourseFromPlaylist(courseId).then(function (success) {\n $timeout(function () { inProgress = false; }, 100);\n }, function (failure) {\n // TODO: Handl error, should it even show anything?\n });\n }\n }\n\n function setHeartToAdd() {\n $scope.playlistActionFunction = addToPlaylist;\n $scope.imageSource = \"app/images/heart-outline.png\";\n $scope.playlistText = \"Add to Electives\";\n }\n\n function setHeartToRemove() {\n $scope.playlistActionFunction = removeFromPlaylist;\n $scope.imageSource = \"app/images/heart-filled.png\";\n $scope.playlistText = \"Remove from Electives\";\n }\n }\n})();","/* Directive to do a generic regex validation on a string. Copied from and test at http://jsfiddle.net/johnwun/mnTUt/ */\napp.directive('regexValidate', function () {\n return {\n // restrict to an attribute type.\n restrict: 'A',\n\n // element must have ng-model attribute.\n require: 'ngModel',\n\n // scope = the parent scope\n // elem = the element the directive is on\n // attr = a dictionary of attributes on the element\n // ctrl = the controller for ngModel.\n link: function (scope, elem, attr, ctrl) {\n\n //get the regex flags from the regex-validate-flags=\"\" attribute (optional)\n var flags = attr.regexValidateFlags || '';\n // create the regex obj.\n var regex = new RegExp(attr.regexValidate, flags);\n\n // add a parser that will process each time the value is \n // parsed into the model when the user updates it.\n ctrl.$parsers.unshift(function (value) {\n // test and set the validity after update.\n var valid = regex.test(value);\n ctrl.$setValidity('regexValidate', valid);\n\n // if it's valid, return the value to the model, \n // otherwise return undefined.\n return valid ? value : undefined;\n });\n\n // add a formatter that will process each time the value \n // is updated on the DOM element.\n ctrl.$formatters.unshift(function (value) {\n // validate.\n ctrl.$setValidity('regexValidate', regex.test(value));\n\n // return the value or nothing will be written to the DOM.\n return value;\n });\n }\n };\n});","app.directive(\"resizer\", function($document) {\n\n\treturn function($scope, $element, $attrs) {\n\n\t\t$element.on('mousedown', function(event) {\n\t\t\tevent.preventDefault();\n\n\t\t\t$document.on('mousemove', mousemove);\n\t\t\t$document.on('mouseup', mouseup);\n\t\t});\n\n\t\tfunction mousemove(event) {\n\n\t\t\tif ($attrs.resizer === 'vertical') {\n\t\t\t\t// Handle vertical resizer\n\n\t\t\t\t// There's no pre-calculated percentage property so\n\t\t\t\t// We get the pageX and convert to percentage wrt width of page\n\n\t\t\t\tvar x = event.pageX / $(window).width() * 100;\n\n\t\t\t\tif ($attrs.resizerMax && x > $attrs.resizerMax) {\n\t\t\t\t\tx = parseInt($attrs.resizerMax);\n\t\t\t\t} else if ($attrs.resizerMax && x < $attrs.resizerMin) {\n\t\t\t\t\tx = parseInt($attrs.resizerMin);\n\t\t\t\t}\n\n\t\t\t\t$element.css({\n\t\t\t\t\tleft: x + '%'\n\t\t\t\t});\n\n\t\t\t\t$($attrs.resizerLeft).css({\n\t\t\t\t\twidth: x + '%'\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t$($attrs.resizerRight).css({\n\t\t\t\t\twidth: (100 - x) + '%'\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\t// Handle horizontal resizer - Not in use as of now in this application.\n\t\t\t\tvar y = window.innerHeight - event.pageY;\n\n\t\t\t\t$element.css({\n\t\t\t\t\tbottom: y + 'px'\n\t\t\t\t});\n\n\t\t\t\t$($attrs.resizerTop).css({\n\t\t\t\t\tbottom: (y + parseInt($attrs.resizerHeight)) + 'px'\n\t\t\t\t});\n\t\t\t\t$($attrs.resizerBottom).css({\n\t\t\t\t\theight: y + 'px'\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction mouseup() {\n\t\t\t$document.off('mousemove', mousemove);\n\t\t\t$document.off('mouseup', mouseup);\n\t\t}\n\t};\n});","app.directive(\"onScroll\", [function () {\n var previousScroll = 0;\n var link = function ($scope, $element, attrs) {\n $element.on('scroll', function (evt) {\n var currentScroll = $element.scrollTop();\n $scope.$eval(attrs.onScroll, {$event: evt, $direct: currentScroll > previousScroll ? 1 : -1});\n previousScroll = currentScroll;\n });\n };\n return {\n restrict: \"A\",\n link: link\n };\n}]);\n","/* This directive creates an autocomplete field that lets you select a single object\n * from a list of objects.\n * It gives you an input field and a toggleable\n * dropdown to select something from rows.\n *\n * You'll need a list of objects where each object is a dictionary\n * with ONE required parameter called 'name'\n * Example:\n * $scope.objects = [];\n * $scope.objects.push({'name': 'blah'});\n * $scope.objects.push({'name': 'blah2'});\n * $scope.objects.push({'name': 'blah3'});\n *\n * You'll also need a variable to store the selected object.\n * This can be defined as so\n *\n * $scope.selectedObj = null;\n *\n * If the user selects 'blah', $scope.selectedObj will become\n * {'name': 'blah'}\n * \n * If the user deselects 'blah', $scope.selectedObj will become null\n *\n * You can inject this into your template like so\n * \n *\n * You can add an id to it so that you can add a label\n * \n * \n *\n * Here is the full example\n * $scope.objects = [];\n * $scope.objects.push({'name': 'blah'});\n * $scope.objects.push({'name': 'blah2'});\n * $scope.objects.push({'name': 'blah3'});\n * $scope.selectedObj = null;\n * // In your template put this\n * \n *\n * You can also optionally run a function when the user selects an object\n *\n * pass a parameter called opt-run-on-select which takes a function name\n * $scope.doSomething = function() {\n * console.log($scope.selectedObj);\n * };\n * \n *\n */\napp.directive('singleAutoComplete', function() {\n return {\n restrict: 'E',\n scope: {\n objects: '=',\n selectedObj: '=',\n optRunOnSelect: '=?'\n },\n link: function(scope, element, attrs) {\n /* Global vars and utility functions */\n scope.autocompleteVisible = false;\n scope.query = '';\n scope.selectedObj = null;\n scope.filterRows = function(query) {\n return function( item ) {\n return item.name.toLowerCase().indexOf(query.toLowerCase()) !== -1;\n };\n };\n\n /* If someone sets the selected object\n * to null outside the directive,\n * set the query to blank.\n * Otherwise forms will have \n * stale data. */\n scope.$watch('selectedObj', function(newValue, oldValue) {\n if (newValue === null) {\n scope.query = '';\n }\n });\n\n scope.chooseObj = function(obj) {\n scope.hideAutocomplete();\n scope.query = obj.name;\n scope.selectedObj = obj;\n if (scope.optRunOnSelect)\n scope.optRunOnSelect(scope.selectedObj);\n };\n\n scope.showAutocomplete = function() {\n scope.autocompleteVisible = true;\n };\n\n scope.hideAutocomplete = function() {\n scope.autocompleteVisible = false;\n\n query = scope.query.trim();\n\n /* If they deleted everything in the search box,\n * that means they deselected the object */\n if (query === '') {\n scope.selectedObj = null;\n scope.query = '';\n\n if (scope.optRunOnSelect)\n scope.optRunOnSelect(null);\n }\n\n /* If the user deleted part of the query but not the whole query\n * that doesn't count as a deselection. Restore the full query \n * In other words, you can hide the autocomplete\n * without selecting a query, so check that first.\n */\n if (scope.selectedObj) {\n var objName = scope.selectedObj.name;\n if (query !== '' && scope.selectedObj !== null && query !== objName) {\n scope.query = objName;\n }\n }\n\n };\n\n },\n templateUrl: 'app/templates/components/singleAutoComplete.html'\n };\n});\n","app.directive(\"slideDown\", ['$rootScope', '$sce', '$route', 'AssignmentsService', 'CoursesService', 'TasksService', 'UsersService', 'EvaluationService', 'SurveyService', function ($rootScope, $sce, $route, AssignmentsService, CoursesService, TasksService, UsersService, EvaluationService, SurveyService) {\n // returns the Directive Definition Object\n return {\n restrict: 'E',\n transclude: true,\n templateUrl: 'app/templates/users/partials/singleCourseSlideDown.html',\n link: function (scope, element, attrs, ctrl) {\n /**\n * Flag to see if we want to make an assignments scoped search, or a more generally scoped call. This\n * is to get the right data on a per course basis.\n */\n // http://thedailywtf.com/articles/What_Is_Truth_0x3f_\n scope.scoped = typeof attrs.scoped !== 'undefined' && attrs.scoped === 'true' ? true : false;\n\n scope.$on('slider:view:close', function(event, data) {\n scope.closeSlider();\n });\n\n var lastIndex = -1;\n var childCourseIndex = -1;\n var passedInAssignment = null;\n var _this = this;\n\n element = element.children('#singlecourse');\n\n scope.openCourseInfo = function ($event, assignment, index) {\n childCourseIndex = index;\n passedInAssignment = assignment;\n var eventName = $event.target.innerHTML;\n jQuery('.more').html('Read More');\n\n var isInACourseGroup = (typeof assignment.CourseGroupName !== 'undefined') ? assignment.CourseGroupName : assignment.isInCourseGroup;\n\n //Look for any open course info and close them\n if (jQuery(element).data('state') === 'opened') {\n if (isInACourseGroup === undefined || isInACourseGroup === '') {\n jQuery('#offeringSlide').slideUp();\n\n if (jQuery('.arrow').length > 0) {\n jQuery('.arrow').hide(1, function () {\n jQuery('#singlecourse').slideUp();\n });\n } else {\n jQuery(element).slideUp();\n }\n\n jQuery(element).data('state', 'closed');\n }\n else if (eventName === 'Read less')\n {\n jQuery('#courseGroupList .arrow').hide();\n jQuery('#singlecourse').slideUp();\n }\n else \n { jQuery('#courseGroupList .arrow').hide(); }\n }\n\n //Look for any course group lists open and close them\n var courseGroupList = jQuery('#courseGroupList');\n \n if (jQuery(courseGroupList).data('state') === 'opened' && (isInACourseGroup === undefined ||isInACourseGroup === '')) {\n jQuery('#offeringSlide').slideUp();\n jQuery('.courseGroupMore').html('Read More');\n\n if (jQuery('.arrow').length > 0) {\n jQuery('.arrow').hide(1, function () {\n jQuery('#courseGroupList').slideUp();\n\n });\n } else {\n jQuery(courseGroupList).slideUp();\n }\n\n jQuery(courseGroupList).data('state', 'closed');\n }\n\n //Look for any View Resources list open and close them\n var viewResourceElem = jQuery('#viewResources');\n if (jQuery(viewResourceElem).data('state') === 'opened') {\n if (jQuery('.arrow').length > 0) {\n jQuery('.arrow').hide(1, function () {\n jQuery('#viewResources').slideUp();\n });\n } else {\n jQuery(viewResourceElem).slideUp();\n }\n\n jQuery(viewResourceElem).data('state', 'closed');\n jQuery('.resource').html('View Resources');\n }\n\n scope.apiError = false;\n scope.singleIsLoading = false;\n\n var children, lastChild, mover, parent = null;\n var currentIndex, endOfRow, modIndex, modulo = 0;\n var found = false;\n var target = $event.currentTarget;\n\n currentIndex = 0;\n\n children = jQuery(target).parents('#courseList').children('.col-md-4');\n if (children.length > 0) {\n //This if handles the tile page course read more\n parent = jQuery(target).parents('.col-md-4')[0];\n\n modulo = jQuery(window).width() > 768 ? 3 : 1;\n\n children.each(function(index) {\n var id = jQuery(parent).prop('id');\n\n jQuery(parent).prop('id', null);\n\n if(jQuery(this)[0] === parent) {\n currentIndex = index + 1;\n\n found = true;\n }\n\n jQuery(parent).prop('id', id);\n if(found === true) {\n found = false;\n\n jQuery('.col-md-4').removeClass('selected');\n jQuery(parent).addClass('selected');\n\n return;\n }\n });\n\n if (currentIndex === lastIndex || (isInACourseGroup && eventName === 'Read less')) {\n lastIndex = -1;\n\n return;\n }\n\n jQuery(parent).children('.arrow').show(1, function() {\n jQuery(element).slideDown();\n });\n\n /* Create the dimensions of the arrow on the slide down menu */\n var assignmentContainerWidth = jQuery(parent).width();\n // Set the sides of the triangle \n var triangleSideWidth = assignmentContainerWidth / 2;\n jQuery(parent).children('.arrow').children('.point').css('border-left',\n triangleSideWidth + \"px solid transparent\");\n jQuery(parent).children('.arrow').children('.point').css('border-right',\n triangleSideWidth + \"px solid transparent\");\n\n // Set the height of the triangle and move it a bit down so it doesn't\n // overlap anything\n var triangleHeight = 40;\n jQuery(parent).children('.arrow').children('.point').css('border-top',\n triangleHeight + \"px solid #e5e5e5\");\n\n // .75 is based on the height of .arrowTopBorder.\n // So if the triangle is 40px high, needs to be shifted by 30px to not overlap\n // if triangle is 20px high, needs to be shifted by 20px to not overlap.\n // To make this clearer, replace .75 with something based on .arrowTopBorder height\n var triangleShift = triangleHeight * 0.75; // .75 is arbitrary right meow.\n jQuery(parent).children('.arrow').children('.point').css('top',\n triangleShift + \"px\");\n\n // Set endOfRow as current index - 1, as\n endOfRow = currentIndex - 1;\n modIndex = currentIndex % modulo; // modulo is 4 3 or 1 depending on columns\n\n if(modIndex > 0) {\n endOfRow = (currentIndex - modIndex) + (modulo - 1); // Subtract one from module because we are accessing array\n }\n\n lastChild = children[endOfRow];\n if(typeof lastChild === 'undefined') {\n lastChild = children[children.length - 1];\n }\n\n if (isInACourseGroup !== undefined && isInACourseGroup !== '' && isInACourseGroup !== null) {\n target = jQuery($event.currentTarget);\n parent = target.parents('.col-md-12');\n currentIndex = parseInt(parent.prop('id').split('-')[1], 10) + 1;\n\n //jQuery(parent).css('border-bottom', '6px solid #e5e5e5');\n\n jQuery(element).slideDown();\n jQuery(parent).children('.arrow').slideDown();\n\n mover = jQuery(parent);\n\n } else {\n mover = jQuery(lastChild);\n }\n\n \n } else {\n //This else handles the list view read more \n target = jQuery($event.currentTarget);\n parent = target.parents('.col-md-12');\n\n currentIndex = parseInt(parent.prop('id').split('-')[1], 10) + 1;\n\n if(currentIndex === lastIndex) {\n lastIndex = -1;\n\n return;\n }\n\n jQuery(element).slideDown();\n // jQuery(parent).children('.arrow').slideDown();\n\n mover = jQuery(parent);\n }\n\n scope.task = null;\n scope.getAssignment(assignment);\n\n // Assign english name to assignment\n if (assignment.type === 'wbt') {\n scope.fullTypeName = 'Web Based';\n } else {\n scope.fullTypeName = assignment.type;\n }\n\n if(jQuery($event.currentTarget).children().length > 0) {\n jQuery($event.currentTarget).children('.more').html('Read less');\n } else {\n jQuery($event.currentTarget).html('Read less');\n }\n\n jQuery(element).data('state', 'opened');\n\n jQuery(mover).after(jQuery(element));\n\n lastIndex = currentIndex;\n };\n\n scope.closeSlider = function() {\n jQuery('#singlecourse').slideUp(500, function() {\n jQuery('.arrow').hide();\n\n jQuery('.more').html('Read More');\n });\n\n lastIndex = -1;\n };\n\n scope.getAssignment = function (assignment) {\n scope.apiError = false;\n scope.singleIsLoading = true;\n\n var courseId = assignment.courseId || assignment.id;\n var courseType = assignment.type;\n scope.iltNoOfferingsMessage = false;\n\n /**\n * This was changed to get single course, not get single assignment. This is not correct.\n * This method must get a single assignment, to ensure proper retrieval of assignment based\n * information for the student.\n */\n // var singleCourse = CoursesService.getSingleCourse(courseId);\n var singleAssignment = AssignmentsService.fetchSingle(courseId, courseType);\n\n singleAssignment.then(\n function (success) {\n var propToCheck = \"assignedById\";\n if (success.type === 'ilt') {\n propToCheck = \"assignedOffering\";\n }\n // If there is an assignment and we're in the student role, use it\n if (success[propToCheck] !== null && scope.role === 'student') {\n success.isScheduled = false;\n if (assignment.isInCourseGroup !== undefined && assignment.isInCourseGroup !== '') {\n //within the context of a course group, the course is not droppable\n success.isDroppable = ((success.type === 'ilt' || success.type === 'vle') && success.isDroppable);\n success.isInCourseGroup = assignment.isInCourseGroup;\n // EA-5142 If the assignment belongs to a career path and career path is assigned make career path the child course source.\n // If not assigned, make source blank\n if (scope.courseGroup !== undefined && typeof scope.courseGroup !== 'undefined') {\n if (scope.courseGroup.type === \"careerPath\") {\n if (scope.courseGroup.status !== 'unknown') {\n success.source = scope.courseGroup.name;\n } else {\n success.source = \"\";\n }\n }\n }\n } else {\n success.source = passedInAssignment.source;\n }\n scope.assignment = success;\n\n //LMS-5878 when type is ilt and assignedOffering is not null: overwrite offerings for this course\n if (success.type === 'ilt' && success.assignedOffering !== null) {\n var offeringsPromise = CoursesService.getSingleCourseOfferings(courseId);\n offeringsPromise.then(function (success) {\n scope.assignment.offerings = success;\n }, function (failure) {\n scope.apiError = true;\n scope.singleIsLoading = false;\n });\n }\n\n scope.singleIsLoading = false;\n }\n // If there is not an assignment, get the course info\n else {\n if (success.type === 'ilt' || success.type === 'vle') {\n // Saba will return offerings with the course, latitude has these in 2 different api calls, so we need to use 1 or the other here.\n if (UsersService.isSaba()) {\n scope.getCourse(assignment);\n } else {\n scope.getOfferings(assignment);\n }\n } else if (success.type === 'task') {\n scope.assignment = assignment;\n\n scope.getTask(assignment);\n } else if (success.type === 'evaluation') {\n scope.assignment = assignment;\n\n scope.getEvaluation(assignment);\n } else if (success.type === 'assessment') {\n scope.assignment = assignment;\n\n scope.getAssessment(assignment);\n } else if (success.type === 'survey') {\n scope.assignment = assignment;\n\n scope.getSurvey(assignment);\n } else {\n scope.getCourse(assignment);\n }\n } // end else no assignedOn date so find info from course\n },\n function (failure) { // Failed to find assignment\n scope.apiError = true;\n scope.singleIsLoading = false;\n\n //scope.options.error.setError(failure.StatusCode, failure.ErrorMessage);\n }\n );\n };\n\n scope.showCompleteTaskButton = function () {\n if (scope.role === 'student' && scope.assignment !== 'undefined' && typeof scope.assignment !== 'undefined' && scope.assignment.type === 'task' && (scope.assignment.status === 'new' || scope.assignment.status === 'inProgress' || scope.assignment.status === 'successful')) {\n if (passedInAssignment !== null && scope.courseGroup !== undefined && typeof scope.courseGroup !== 'undefined' && scope.courseGroup.id === passedInAssignment.parentCourseGroupId) {\n if (scope.courseGroup.type === \"careerPath\") {\n if (passedInAssignment.status === 'successful') {\n return false;\n } else {\n if (scope.courseGroup.enforceOrder === true) {\n if (childCourseIndex !== 0) {\n return false;\n }\n }\n }\n }\n }\n\n // Not career path\n return true;\n }\n\n return false;\n };\n\n scope.showScheduleCourseButton = function () {\n var result = false;\n var flag = false;\n if (scope.assignment) {\n // If scope.courseGroup eixsts\n // If scope.courseGroup.id === assignment.parentCourseGroupid\n // If scope.courseGroup.enforceOrder === true\n // If course group course list index !== 0 (Not first course in list gets button)\n // Dont' show schedule button\n if (passedInAssignment !== null && scope.courseGroup !== undefined && typeof scope.courseGroup !== 'undefined' && scope.courseGroup.id === passedInAssignment.parentCourseGroupId) {\n if (scope.courseGroup.type === \"careerPath\") {\n if (scope.courseGroup.enforceOrder === true) {\n if (childCourseIndex !== 0) {\n return false;\n }\n }\n }\n }\n\n if (scope.assignment.offerings) { \n if (scope.role === 'student' && (!scope.assignment.assignedOffering || scope.assignment.status !== 'inProgress') && (scope.assignment.type === 'ilt' || scope.assignment.type === 'vle') && scope.assignment.offerings !== null && scope.assignment.offerings.length > 0) {\n var futureOfferings = [];\n _.each(scope.assignment.offerings, function (offering) { \n if (offering.sessions) {\n if (offering.sessions.length > 0 && offering.status === \"open\") {\n var offerStartDate = _.sortBy(offering.sessions, \"startDateTime\")[0].startDateTime.jsDate;\n var today = new Date();\n if (offerStartDate > today) {\n result = true;\n //Add to the array of future offerings\n futureOfferings.push(offering);\n }\n }\n }\n \n // check if there is any available offering that the user have not registered\n if (!flag && !scope.offeringIsUserRegisteredILT(offering)) {\n flag = true;\n }\n });\n scope.assignment.offerings = futureOfferings;\n }\n } // end if there is offerings\n } // end if there is an assignment\n return result && flag;\n };\n\n scope.completeAssignment = function (id, $event) {\n var completion = CoursesService.completeTask(id, UsersService.getId());\n scope.apiActionLoader = true;\n\n completion.then(function (success) {\n scope.apiActionError = false;\n scope.apiActionLoader = false;\n scope.closeSlider();\n\n $route.reload();\n\n }, function (failure) {\n scope.apiActionError = true;\n scope.apiActionLoader = false;\n scope.closeSlider();\n\n scope.apiErrorMessage = 'We\\'re sorry! We couldn\\'t complete the course. Please try again.';\n\n setTimeout(function () {\n scope.apiActionError = false;\n }, 1000);\n });\n };\n\n scope.getCourse = function(assignment, useCourseId) {\n scope.apiError = false;\n scope.singleIsLoading = true;\n \n var courseId = useCourseId === true && typeof assignment.courseId !== 'undefined' ? assignment.courseId : assignment.id;\n\n var singleAssignment = CoursesService.getSingleCourse(courseId);\n\n singleAssignment.then(\n function (success) {\n success.isScheduled = false;\n\n scope.assignment = success;\n scope.singleIsLoading = false;\n }, function (failure) {\n scope.apiError = true;\n scope.singleIsLoading = false;\n\n //scope.options.error.setError(failure.StatusCode, failure.ErrorMessage);\n }\n );\n };\n\n scope.getTask = function(assignment) {\n scope.apiError = false;\n scope.singleIsLoading = true;\n\n var task = TasksService.fetchSingle(assignment.id, UsersService.getId());\n\n task.then(function(success) {\n scope.task = success;\n\n scope.singleIsLoading = false;\n }, function() {\n scope.apiError = true;\n scope.singleIsLoading = false;\n\n //scope.options.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n scope.getEvaluation = function (assignment) {\n scope.apiError = false;\n scope.singleIsLoading = true;\n\n var evaluation = EvaluationService.fetchSingle(UsersService.getId(), assignment.offeringId);\n\n evaluation.then(function (success) {\n scope.evaluation = success;\n assignment.source = scope.evaluation.assignedBy;\n scope.assignment.source = scope.evaluation.assignedBy;\n\n scope.singleIsLoading = false;\n }, function (failure) {\n scope.apiError = true;\n scope.singleIsLoading = false;\n\n //scope.options.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n scope.getSurvey = function (assignment) {\n scope.apiError = false;\n scope.singleIsLoading = true;\n\n var survey = SurveyService.fetchSingle(UsersService.getId(), assignment.offeringId);\n\n survey.then(function (success) {\n scope.survey = success;\n\n scope.singleIsLoading = false;\n }, function (failure) {\n scope.apiError = true;\n scope.singleIsLoading = false;\n\n //scope.options.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n scope.getOfferings = function (assignment) {\n scope.apiError = false;\n scope.singleIsLoading = true;\n var courseId = typeof assignment.courseId !== 'undefined' && assignment.courseId !== null ? assignment.courseId : assignment.id;\n var coursePromise = CoursesService.getSingleCourse(courseId);\n var isInCourseGroup = assignment.isInCourseGroup;\n\n coursePromise.then(function (success) {\n success.isScheduled = false;\n scope.assignment = success;\n scope.assignment.isInCourseGroup = isInCourseGroup;\n var offeringsPromise = CoursesService.getSingleCourseOfferings(courseId);\n return offeringsPromise.then(function (success) {\n scope.assignment.offerings = success;\n scope.assignment.offeringId = null;\n scope.assignment.assignedOffering = null;\n scope.singleIsLoading = false;\n scope.iltNoOfferingsMessage = false;\n if (scope.assignment.offerings.length === 0) {\n scope.iltNoOfferingsMessage = true;\n }\n }, function (failure) {\n scope.singleIsLoading = false;\n\n if (failure.StatusCode === 404) {\n //If the offerings get returns a 404, there is no error, there are just no offerings available\n scope.iltNoOfferingsMessage = true;\n } else {\n scope.apiError = true;\n }\n\n // scope.options.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n }, function (failure) {\n scope.apiError = true;\n scope.singleIsLoading = false;\n // scope.options.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n scope.requestApproval = function(courseId, type, offeringId) {\n scope.requestApprovalInProcess = true;\n\n var userId = UsersService.getId();\n\n jQuery('.managerApprovalRequired-' + courseId).toggle();\n jQuery('#launchCourseLoaderPlayButton-' + courseId).toggle();\n jQuery('#launchCourseLoader-' + courseId).toggle();\n jQuery('#showCourseLoader-' + courseId).toggle();\n\n var approval = CoursesService.requestManagerialApproval(courseId, type, userId, offeringId);\n\n scope.assignmentID = courseId;\n\n approval.then(function(success) {\n var assignID = scope.assignmentID;\n scope.apiMessage = 'Request for approval was successfully sent.'; \n jQuery('#appReqSubModal').show();\n jQuery('#AvailableOfferings' + assignID).hide();\n jQuery('#scheduleSuccess' + assignID).show();\n scope.requestApprovalInProcess = false;\n setTimeout(function () {\n jQuery('#ScheduleCourseModal' + assignID).modal('hide');\n jQuery('#scheduleSuccess' + assignID).hide();\n $rootScope.$broadcast('slideDownDirective:refreshCurrentPage');\n }, 1500);\n\n }, function (failure) {\n scope.requestApprovalInProcess = false;\n jQuery('#launchCourseLoaderPlayButton-' + courseId).toggle();\n jQuery('#launchCourseLoader-' + courseId).toggle();\n jQuery('.managerApprovalRequired-' + courseId).toggle();\n jQuery('#showCourseLoader-' + courseId).toggle();\n //check for SABA wbt manager approval pending response\n if (failure.StatusCode === 500 && failure.ErrorMessage === \"The person was successfully registered in the given offering but, cannot move forward until their manager approves the action\") {\n scope.apiMessage = 'Request for approval was successfully sent.';\n jQuery('#fullSuccess-' + scope.assignmentID).show();\n\n setTimeout(function () {\n jQuery('#fullSuccess-' + scope.assignmentID).hide();\n $rootScope.$broadcast('slideDownDirective:refreshCurrentPage');\n }, 2000);\n }\n else {\n if (failure.StatusCode === 409) { scope.apiScheduleErrorMessage = 'Sorry! Cannot register because there is a scheduling conflict.'; }\n else {\n scope.apiScheduleErrorMessage = 'Sorry! There was a problem requesting approval. Please try again.';\n }\n\n jQuery('#apiScheduleError' + scope.assignmentID).slideDown(500, function () {\n var _this = jQuery(this);\n\n setTimeout(function () {\n _this.slideUp(500);\n\n }, 2500);\n });\n }\n });\n };\n\n scope.hideappReqSubModal = function () {\n jQuery('#appReqSubModal').hide();\n //$rootScope.$broadcast('slideDownDirective:refreshCurrentPage');\n };\n\n scope.scheduleOffering = function (assignmentId, assignmentType, sessionId, isInCourseGroup) {\n var offering = CoursesService.scheduleOffering(assignmentId, UsersService.getId(), assignmentType, sessionId);\n scope.assignmentID = assignmentId;\n\n offering.then(function (success) {\n\n // If the course is in a course group, make a transcript for the course group as well.\n if (isInCourseGroup) {\n var enrollCoursePromise = CoursesService.getCourseUrl(isInCourseGroup, 'wbt', UsersService.getId()); // Getting the URL will also enroll (create transcript) for the course.\n enrollCoursePromise.then(function (success) {\n // Don't do anything. There is no url for the course group course but we still need to create a transcript\n });\n }\n\n var obj = null; \n var assignID = scope.assignmentID;\n\n switch(success) {\n case 'confirmed':\n case 'inProgress':\n obj = jQuery('#scheduleSuccess' + assignID);\n\n scope.apiMessage = 'Registration for this course was successful.';\n \n break;\n case 'waitlisted':\n obj = jQuery('#waitlistedSchedSuccess' + assignID);\n\n scope.apiMessage = 'The current course is full. You have been added to the course waitlist.';\n\n break;\n }\n jQuery('#AvailableOfferings' + assignID).hide();\n obj.show();\n\n setTimeout(function () {\n jQuery('#ScheduleCourseModal' + assignID).modal('hide');\n obj.hide();\n $rootScope.$broadcast('slideDownDirective:refreshCurrentPage'); \n }, 1500);\n \n }, function (failure) {\n \n if (failure.ErrorMessage.indexOf('Prereq') > -1) {\n scope.apiErrorMessage = 'Prerequisites need to be completed for registering for this course. Registration could not be completed.';\n }\n else if (failure.ErrorMessage.indexOf('it is full') > -1) {\n scope.apiScheduleErrorMessage = 'The current course is full. Registration could not be completed.';\n }\n else if (failure.StatusCode === 409) { scope.apiScheduleErrorMessage = 'Sorry! Cannot register because there is a scheduling conflict.'; }\n else {\n scope.apiScheduleErrorMessage = 'Sorry! There was a problem scheduling your offering. Please try again.';\n }\n\n jQuery('#apiScheduleError' + scope.assignmentID).slideDown(500, function () {\n var _this = jQuery(this);\n\n setTimeout(function () {\n _this.slideUp(500);\n }, 2500);\n }); \n \n });\n };\n\n scope.getHtml = function(html, secondary){\n var string = typeof secondary !== 'undefined' ? secondary + html : html;\n\n if(typeof string === 'string') {\n return $sce.trustAsHtml(string);\n }\n };\n\n scope.getMyPicks = function(item) {\n return item.isUserAssigned === true;\n };\n\n scope.hidePrereq = function () { jQuery('#preReqModal').hide(); };\n\n scope.offeringListOpener = function ($event, assignment) {\n\n // call Prereq api to see if any are there prereqs that the user needs to take before launching this course\n // if any are there, open modal and don't launch the course\n\n var prereqCall = AssignmentsService.getPrereqs(assignment.id);\n\n prereqCall.then(function (success) {\n\n if (success.length === 0) {\n //if nothing, do nothing, move on, open scheduling modal\n jQuery('#ScheduleCourseModal' + assignment.id).modal('show');\n } else {\n //If there are prereqs - set the scoped variable for the prereq details \n scope.prereqModalData = success;\n angular.element(document.querySelector('#preReqModal')).modal();\n }\n\n }, function (failure) {\n //if failure, show the schedule modal and their scheduling will catch that there is a prereq and show a failure message\n jQuery('#ScheduleCourseModal' + assignment.id).modal('show');\n\n });\n \n };\n\n scope.offeringIsOpenForEnrollment = function(session) {\n var openToEnroll = false;\n var today = new Date();\n\n if (typeof session.requestedOn.jsDate === \"undefined\") {\n session.requestedOn = dateUtil.formatDate(session.requestedOn);\n }\n\n if (session.requestedOn.jsDate <= today) {\n openToEnroll = true;\n }\n\n return openToEnroll;\n };\n\n scope.isMaxWaitlistLimitReachedILTSearch = function (session) {\n var overTheMaxWaitlistLimit = false;\n if (session.waitlistedRosterCount >= session.maxWaitlistSize && session.attendingRosterCount >= session.maxAllowedSize) \n { overTheMaxWaitlistLimit = true; }\n return overTheMaxWaitlistLimit;\n };\n\n _this.getStatusForOfferingFromRoster = function (offering) {\n var defaultStatus = 'notRegistered';\n var loggedinUser = UsersService.getId();\n //The roster now returns the total counts for attending and waitlisted students\n //If the logged in person is in the roster, their userid will be populated in the roster list\n //loop through the attending/waitlist/pendingApproval students and if a userID is not a dummy ie. 0\n //then return the roster status\n var attendingRoster = offering.roster.attendingStudents;\n for (var attend in attendingRoster) {\n var atten = attendingRoster[attend];\n if (typeof atten.id !== 'undefined' && atten.id !== 0 && loggedinUser === atten.id)\n { return atten.rosterStatus; }\n }\n\n var waitlistRoster = offering.roster.waitlistStudents;\n for (var waitL in waitlistRoster) {\n var wait = waitlistRoster[waitL];\n if (typeof wait.id !== 'undefined' && wait.id !== 0 && loggedinUser === wait.id)\n { return wait.rosterStatus; }\n }\n\n var pendingRoster = offering.roster.pendingApprovalStudents;\n for (var pender in pendingRoster) {\n var pend = pendingRoster[pender];\n if (typeof pend.id !== 'undefined' && pend.id !== 0 && loggedinUser === pend.id)\n { return pend.rosterStatus; }\n }\n \n return defaultStatus;\n };\n\n scope.offeringIsUserRegisteredILT = function (session) {\n return _this.getStatusForOfferingFromRoster(session) !== 'notRegistered';\n };\n\n } // end link object\n }; // end directive return\n}]);\n","app.directive(\"loadingSpinner\", function () {\n return {\n restrict: \"E\",\n scope: {\n activator: '='\n },\n link: function(scope, element, attrs) {\n },\n templateUrl: 'app/templates/components/spinner.html'\n };\n});\n","app.directive('subContainer', ['$filter', function($filter) {\n return {\n restrict: 'E',\n scope: {\n 'data': '='\n },\n templateUrl: 'app/templates/users/editpeoplegroup/partials/peopleGroupContainer.html',\n link: function(scope, element, attrs) {\n \tscope.criterias = scope.data.criteria;\n // console.log(scope.criterias);\n console.log(scope.data);\n\n }\n };\n}\n]);","app.directive('templateSwitcher', function() {\n return {\n replace: true,\n link: function(scope, el, attr) {\n scope.views = [{\n label: 'tiles',\n name: 'Tiles',\n template: 'app/templates/users/partials/tiles.html',\n icon: '',\n class: \"assignmentFilter selected\"\n }, {\n label: 'list',\n name: 'List',\n template: 'app/templates/users/partials/list.html',\n icon: '',\n class: \"assignmentFilter\"\n }, {\n label: 'calendar',\n name: 'Calendar',\n template: 'app/templates/users/partials/calendar.html',\n icon: '',\n class: \"assignmentFilter\"\n }];\n\n jQuery('.assignmentFilter').click(function() {\n jQuery(this).siblings('.assignmentFilter').removeClass('selected');\n\n jQuery(this).addClass('selected');\n });\n\n },\n controller: ['$scope', function($scope){\n \n }]\n };\n});","/* This directive creates a collapsable, searchable tree with onclick events\n * on every node\n* Create tree directive like so\n* \n*\n* where nodeClick is a function like\n* where item is the currently clicked node\n* item.nodes is filtered if you have already filtered the tree\n* $scope.nodeClick = function(item) {\n* // do something with item.name, item._id\n* }\n* data is like $scope.data below\n* search is an input box tied to ng-model\n* So create an input field like this near your tree\n \n And write $scope.search = \"\"; in your controller\n Then pass search to the tree\n\n node-now-hidden takes a function which gets called if the currently selected node becomes hidden after the user starts filtering stuff\n something like \n node-now-hidden=\"nodeNowHidden\" where\n $scope.nodeNowHidden = function() {\n $scope.rows = [];\n }\n In this case scope.rows on the people page becomes null if the currently selected node becomes hidden\n\n search-update-callback is an OPTIONAL function that takes the currently highlighted node or the root org if there's no highlighted row and does whatever you need to do\n when the search updates\n $scope.options.searchUpdateCallback = function(node) {\n // if something isn't active, do something\n }\n\n title is just a string specified something like\n $scope.title = \"Managers\"\n\n Options are specified like so\n $scope.options = {};\n $scope.options.initiallyOpened = true;\n $scope.options.rootNodeIsTopLevel = false;\n $scope.options.initiallySelectedNodeName = \"\";\n $scope.options.searchUpdateCallback = function(node) {\n // do something when the user updates their search variable\n }\n $scope.options.showLocks = false;\n\n initiallyOpened will make the tree opened by default. The tree is still openable and closable\n\n rootNodeIsTopLevel makes the highest level node in the tree also the large title row. Otherwise the large title row won't be a clickable node.\n\n showLocks will show a lock on the left of every row if its set to true\n*\n* initiallySelectedNodeName finds a node with a certain name and then makes that node selected when the tree loads.\n* Searches through nodes via name & then selects a node via name\n*\n* That will create a searchable stylable highlightable tree.\n*/\n\n/*\n * Example data for this tree object\n $scope.data = [{\n \"name\": \"Node-1\",\n \"color\": \"blue\",\n \"nodes\": [\n {\n \"name\": \"A\",\n \"color\": \"red\",\n \"nodes\": [\n {\n \"name\": \"B\",\n \"nodes\": [ ]\n }\n ]\n },\n {\n \"name\": \"C\",\n \"nodes\": [\n {\n \"name\": \"D\",\n \"nodes\": [ ]\n },\n {\n \"name\": \"E\",\n \"nodes\": [ ]\n },\n {\n \"name\": \"F\",\n \"nodes\": [ ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"Node-2\",\n \"nodes\": [\n {\n \"name\": \"G\",\n \"nodes\": [\n {\n \"name\": \"H\",\n \"nodes\": [ ]\n },\n {\n \"name\": \"I\",\n \"nodes\": [ ]\n }\n ]\n },\n {\n \"name\": \"J\",\n \"nodes\": [\n {\n \"name\": \"K\",\n \"nodes\": [ ]\n },\n {\n \"name\": \"L\",\n \"nodes\": [ ]\n },\n {\n \"name\": \"M\",\n \"nodes\": [ ]\n }\n ]\n },\n {\n \"name\": \"N\",\n \"nodes\": [\n {\n \"name\": \"O\",\n \"nodes\": [ ]\n },\n {\n \"name\": \"P\",\n \"nodes\": [\n {\n \"name\": \"Q\",\n \"nodes\": [ ]\n },\n {\n \"name\": \"R\",\n \"nodes\": [ ]\n }\n ]\n },\n {\n \"name\": \"S\",\n \"nodes\": [ ]\n }\n ]\n },\n {\n \"name\": \"T\",\n \"nodes\": [\n {\n \"name\": \"U\",\n \"nodes\": [\n {\n \"name\": \"V\",\n \"nodes\": [ ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"W\",\n \"nodes\": [\n {\n \"name\": \"X\",\n \"nodes\": [ ]\n }\n ]\n }\n ]\n },\n {\n \"name\": \"Node-3\",\n \"nodes\": [ ]\n }\n];\n*/\n\napp.directive(\"tree\", ['$location', function ($location) {\n return {\n restrict: \"E\",\n scope: {\n inputData: '=',\n onClick: '=',\n nodeNowHidden: '=?',\n search: '=',\n title: '=',\n options: '=',\n treeError: '='\n },\n link: function(scope, element, attrs) {\n var _this = this;\n\n // GLOBAL VARIABLES\n // Stores the currently highlighted node.\n // starts at null by default.\n // Stores an ID not a node reference\n // The template html checks every\n // node to see if it has the ID\n // stored in this variable.\n // If so, it highlights the node\n scope.currentlyHighlightedNode = null;\n\n /* list, object, property.. */\n function setPropertyOnAllNodes(data, name, value) {\n for (var i = 0; i < data.length; i += 1) {\n data[i][name] = value;\n // if there are subnodes, \n // set them to hidden also\n if (data[i].nodes) {\n setPropertyOnAllNodes(data[i].nodes, name, value);\n }\n }\n }\n\n\n // This is used for retaining state after filtering\n function setPropertyOnSpecificId(data, _id, name, value) {\n for (var i = 0; i < data.length; i += 1) {\n if (data[i]._id === _id) {\n data[i][name] = value;\n break;\n }\n // if there are subnodes, \n // set them to hidden also\n if (data[i].nodes) {\n setPropertyOnSpecificId(data[i].nodes, _id, name, value);\n }\n }\n }\n\n // Assign ID's to all the objects\n // Used for keeping track of highlighting etc etc\n var tempId = 0;\n function addIds(data) {\n for (var i = 0; i < data.length; i += 1) {\n data[i]._id = tempId;\n tempId += 1;\n // if there are subnodes, \n // set them to hidden also\n if (data[i].nodes) {\n addIds(data[i].nodes);\n }\n }\n }\n\n // Returns a node by its id if it exists in the tree\n function getNodeIfItExistsInTreeByInternalId(nodeId, data) {\n // if the node we're looking for exists in the top level list of nodes, return it\n for (var i = 0; i < data.length; i += 1) {\n if (data[i]._id === nodeId) {\n return data[i];\n }\n }\n\n // otherwise recursively look for the node\n var potentialNode = false;\n for (var j = 0; j < data.length; j += 1) {\n if (data[j].nodes) {\n for (var k = 0; k < data[j].nodes.length; k += 1) {\n potentialNode = getNodeIfItExistsInTreeByInternalId(nodeId, data[j].nodes);\n }\n }\n }\n return potentialNode;\n }\n\n // Exactly the same as getNodeIfItExistsInTreeByInternalId except uses a search predicate\n function getNodeIfItExistsInTreeByPredicate(predicate, data) {\n // if the node we're looking for exists in the top level list of nodes, return it\n for (var i = 0; i < data.length; i += 1) {\n if (predicate(data[i])) {\n return data[i];\n }\n }\n\n // otherwise recursively look for the node\n var potentialNode = false;\n for (var j = 0; j < data.length; j += 1) {\n if (data[j].nodes) {\n for (var k = 0; k < data[j].nodes.length; k += 1) {\n potentialNode = getNodeIfItExistsInTreeByPredicate(predicate, data[j].nodes);\n }\n }\n }\n return potentialNode;\n }\n\n // make every top level node (you can have multiple)\n // have a group Id. Make every node above those top level nodes have the same group ID\n // The group ID of the top level nodes will just be the id\n // the group ID of the nodes below it will be _group_id\n // This function recursively adds groupIds\n // If groupId isn't passed, call itself with the groupId of each top level element\n // the recursive calls will pass in group id\n function addGroupIds(data, groupId) {\n if (groupId === undefined) {\n for (var i = 0; i < data.length; i += 1) {\n addGroupIds(data[i], data[i]._id);\n }\n } else {\n data._group_id = groupId;\n\n if(typeof data.nodes !== 'undefined') {\n for (var nodeIndex = 0; nodeIndex < data.nodes.length; nodeIndex += 1) {\n addGroupIds(data.nodes[nodeIndex], groupId);\n }\n }\n }\n }\n // This stores an ID not a node reference\n // @TODO @sneilan Most likely should be initialized to null.\n scope.selected_group = \"\";\n\n scope.toggleTreeVisibility = function() {\n scope.treeClosed = !scope.treeClosed;\n };\n\n // Called by tree html.\n // This function does any background related tasks\n // when we click on a node.\n scope.backgroundTasks = function(item) {\n // Highlight the currently clicked node\n // For now it just highlights the node we clicked on\n scope.currentlyHighlightedNode = item._id;\n\n // set the top level group to be highlighted\n scope.selected_group = item._group_id;\n };\n\n scope.toggle = function(item) {\n item.hidden = !item.hidden;\n };\n\n // For every leaf of the tree, check if it matches the\n // function predicate\n // If it doesn't match, don't delete the node from the tree\n // otherwise, delete the node from the tree\n _this.predicate = function(object, search) {\n var lowerCaseName = object.name.toLowerCase();\n var lowerCaseSearch = search.toLowerCase();\n\n return lowerCaseName.indexOf(lowerCaseSearch) !== -1;\n };\n\n // Prunes a tree via predicate\n function filter(data, search) {\n var newTree = Array();\n for (var i = 0; i < data.length; i += 1) {\n // If this particular node matches,\n // just toss the whole thing onto the stack\n if (_this.predicate(data[i], search)) {\n newTree.push(data[i]);\n } else {\n // If any of the children match\n // toss the whole thing onto the stack\n var newVal = filter(data[i].nodes, search);\n if (newVal.length > 0) {\n data[i].nodes = newVal;\n newTree.push(data[i]);\n }\n // if none of the children match\n // and this node doesn't match\n // don't return anything\n }\n }\n return newTree;\n }\n\n /**\n * @TODO: @sneilan: what is this method for? It looks like it should be running whenever search is update,\n * but it is not.\n */\n var runSearch = function() {\n // when the tree is first created, it may not have data loaded\n // so check if we've loaded data, then do the internal stuff\n if (!scope.originalData) {\n return;\n }\n\n scope.data = filter(angular.copy(scope.originalData), scope.search);\n /*\n if (scope.currentlyHighlightedNode !== null) {\n setPropertyOnSpecificId(scope.data, scope.currentlyHighlightedNode, 'highlight', true);\n }\n */\n\n // also need to call the onclick function to recalculate anything on the right hand side\n // lets say you click on a node, the filtering function runs and filters the list of users on the right hand side by organization\n // if an organization was filtered away, all users in that organization shouldn't show up\n var node = getNodeIfItExistsInTreeByInternalId(scope.currentlyHighlightedNode, scope.data);\n if (node) {\n if (scope.options && scope.options.searchUpdateCallback) {\n scope.options.searchUpdateCallback(node);\n }\n // scope.onClick(node);\n } else {\n // if there's no highlighted node, that means the user hasn't started clicking around yet\n // so don't highlight the root node\n // but load the data for it\n // creates a more seamless experience\n // only applies if the root node is the top level node.\n if (scope.currentlyHighlightedNode === null && scope.options.rootNodeIsTopLevel) {\n if (scope.options && scope.options.searchUpdateCallback)\n scope.options.searchUpdateCallback(scope.data[0]);\n // scope.onClick(scope.data[0]);\n } else {\n if (scope.nodeNowHidden) \n scope.nodeNowHidden();\n }\n }\n };\n\n // Commeneted By Mani -- Don't know what it does but throwing erros on UI., Need to look into it.Tahnks\n scope.$watch('search', runSearch);\n\n // set a watch on the data so when it comes in from the API\n // we re-run everything\n \n scope.$watch('inputData', function(newValue, oldValue) {\n // when the tree is first created, it may not have data loaded\n // so check if we've loaded data, then do the internal stuff\n\n // inputData -> data -> originalData\n if (scope.inputData) {\n // every node should have a unique ID for internal purposes\n scope.data = angular.copy(scope.inputData);\n\n addIds(scope.data);\n\n // Make all nodes hidden by default\n setPropertyOnAllNodes(scope.data, 'hidden', true);\n\n // make every node below a top level root node have a group ID\n addGroupIds(scope.data);\n\n // make a copy of the original data so that when we filter\n // it doesn't permanently destroy data\n scope.originalData = angular.copy(scope.data);\n\n if (scope.options.initiallySelectedNodeName) {\n node = getNodeIfItExistsInTreeByPredicate(function(node) {\n if (scope.options.initiallySelectedNodeName === node.name) {\n return true;\n }\n return false;\n }, scope.data);\n if (node) {\n scope.currentlyHighlightedNode = node._id;\n }\n\n // Unset this variable so this loop doesn't run again\n scope.options.initiallySelectedNodeName = false;\n }\n }\n });\n\n // read through options and set default values\n if (scope.options) {\n if (scope.options.initiallyOpened) {\n scope.treeClosed = false;\n } else {\n scope.treeClosed = true;\n }\n\n if (scope.options.showLocks === undefined) {\n scope.options.showLocks = true;\n }\n\n if (scope.options.canDrillDown === undefined) {\n scope.options.canDrillDown = true;\n }\n\n } else {\n // By default we show locks right now.\n scope.options = {};\n scope.options.showLocks = true;\n }\n\n scope.iconClick = function(item) {\n\n var peopleGroupId = item.id;\n $location.path('users/peoplegroup/' + peopleGroupId + '/');\n };\n\n scope.iconClickCourseEdit = function(item) {\n if (item.api_name === 'courseGroups' && typeof item.id !== 'undefined' & typeof item.id !== null) {\n $location.path('courses/edit/' + item.id + '/');\n }\n };\n\n },\n templateUrl: 'app/templates/components/tree.html'\n };\n}\n]);\n","app.directive('viewAddAssignmentsModal', [function () {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/users/partials/admin.viewAssignmentsModal.html',\n controller: ['$scope', '$timeout', '$filter','$q','errorDisplayerUtil', 'UsersService', 'AssignmentsService', 'CoursesService', 'dateUtil', 'TranscriptsService', 'RosterService',\n function ($scope, $timeout, $filter, $q, errorDisplayerUtil, UsersService, AssignmentsService, CoursesService, dateUtil, TranscriptsService, RosterService) {\n\n\n $scope.defer = null;\n $scope.requiredOptions = [{\n \"name\": \"Yes\",\n \"value\": true\n }, {\n \"name\": \"No\",\n \"value\": false\n }];\n\n /* establish scope variable to determine if the user is a TA */\n /* rules differ for TA and Manager */\n $scope.currentRoleTA = false;\n var currentUserRole = UsersService.getCurrentRoleType();\n if (currentUserRole === 'ta') {\n $scope.currentRoleTA = true;\n }\n\n $scope.loggedInUserId = UsersService.getId();\n\n /* Called on initial load of the modal*/\n $scope.viewAssignments = function (firstName, userId) {\n $scope.userName = firstName;\n $scope.studentId = userId;\n\n angular.element(document.querySelector('#viewAssignmentsModal')).modal();\n };\n\n $scope.viewAssignmentsError = {};\n $scope.viewAssignmentsError.error = errorDisplayerUtil.create();\n /* displays all assignments in the modal */\n var viewAssignmentsCta = function (userId) {\n\n $scope.assignmentsAreLoading = true;\n //Initial pageload - this will set the ascending sorting on coursename\n $scope.propertyName = 'name';\n\n // Reset the Error\n $scope.viewAssignmentsError.error.reset();\n $scope.assignmentsData = null;\n\n // API Call to get assignments\n var assignmentsPromise = AssignmentsService.fetch(userId);\n\n assignmentsPromise.then(function (success) {\n $scope.assignmentsData = formatViewAssignments(success);\n $scope.assignmentsAreLoading = false;\n\n }, function (failure) {\n $scope.assignmentsAreLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n\n $scope.viewAssignmentsError.error.setError(errorCode, message);\n });\n };\n\n /* date, pretty status, etc formatting for Assignments*/ \n var formatViewAssignments = function (data) {\n _.each(data, function (datapoint) {\n datapoint.errorSpinner = false;\n if (datapoint.isDroppable && datapoint.prescriptiveRuleId !== null)\n { datapoint.isDroppable = false; }\n datapoint.displayStatus = (datapoint.status === 'inProgress') ? 'In Progress' : capitalize(datapoint.status);\n datapoint.typeToDisplay = $filter(\"assignmentAssetTypeName\")(datapoint.type);\n\n if (datapoint.dueDate !== null && typeof datapoint.dueDate.jsDate !== 'undefined') {\n datapoint.originalDueDate = datapoint.dueDate.jsDate.getTime();\n }\n else {\n datapoint.originalDueDate = null;\n }\n\n datapoint.disableRequiredDropdown = false;\n datapoint.requiredDropdownTitleText = \"\";\n datapoint.disableDueDatePicker = false;\n datapoint.noDueDateText = \"\";\n datapoint.dueDateTitleText = \"\";\n if ($scope.currentRoleTA) {\n if (datapoint.prescriptiveRuleId !== null) {\n datapoint.disableRequiredDropdown = true;\n datapoint.requiredDropdownTitleText = \"Required status for Rule assignments cannot be modified\";\n } else if (datapoint.studentId === datapoint.assignedById) {\n datapoint.disableRequiredDropdown = true;\n datapoint.requiredDropdownTitleText = \"Required status for ad hoc enrollments cannot be modified\";\n }\n\n if (datapoint.dueDate !== null && (datapoint.prescriptiveRuleId !== null || datapoint.assignedById === datapoint.studentId)) {\n datapoint.disableDueDatePicker = true;\n if (datapoint.prescriptiveRuleId !== null) {\n datapoint.dueDateTitleText = \"Due dates for Rule assignments cannot be modified.\";\n } else {\n if (datapoint.assignedById === datapoint.studentId) {\n datapoint.dueDateTitleText = \"Due dates for ad hoc enrollments cannot be modified.\";\n }\n }\n } else if (datapoint.dueDate === null && (datapoint.prescriptiveRuleId !== null || datapoint.assignedById === datapoint.studentId)) {\n datapoint.disableDueDatePicker = true;\n datapoint.noDueDateText = \"No Due Date\";\n if (datapoint.prescriptiveRuleId !== null) {\n datapoint.dueDateTitleText = \"Due dates for Rule assignments cannot be modified.\";\n } else {\n if (datapoint.assignedById === datapoint.studentId) {\n datapoint.dueDateTitleText = \"Due dates for ad hoc enrollments cannot be modified.\";\n }\n }\n }\n } else {\n if (datapoint.assignedById !== $scope.loggedInUserId) {\n datapoint.disableRequiredDropdown = true;\n datapoint.requiredDropdownTitleText = \"Required status can only be updated for courses you assigned\";\n datapoint.disableDueDatePicker = true;\n datapoint.dueDateTitleText = \"Due dates can only be updated for courses you assigned\";\n if (datapoint.dueDate === null) {\n datapoint.noDueDateText = \"No Due Date\";\n }\n } else {\n if (datapoint.dueDate !== null && (datapoint.prescriptiveRuleId !== null || datapoint.assignedById === datapoint.studentId)) {\n datapoint.disableDueDatePicker = true;\n if (datapoint.prescriptiveRuleId !== null) {\n datapoint.dueDateTitleText = \"Due dates for Rule assignments cannot be modified.\";\n } else {\n if (datapoint.assignedById === datapoint.studentId) {\n datapoint.dueDateTitleText = \"Due dates for ad hoc enrollments cannot be modified.\";\n }\n }\n } else if (datapoint.dueDate === null && (datapoint.prescriptiveRuleId !== null || datapoint.assignedById === datapoint.studentId)) {\n datapoint.disableDueDatePicker = true;\n datapoint.noDueDateText = \"No Due Date\";\n if (datapoint.prescriptiveRuleId !== null) {\n datapoint.dueDateTitleText = \"Due dates for Rule assignments cannot be modified.\";\n } else {\n if (datapoint.assignedById === datapoint.studentId) {\n datapoint.dueDateTitleText = \"Due dates for ad hoc enrollments cannot be modified.\";\n }\n }\n }\n }\n }\n\n datapoint.originalIsRequired = datapoint.isRequired; // Necessary to keep track of which assignments changed for the update function \n });\n\n return data;\n };\n\n /* Switches the modal view to the add assignments modal */\n $scope.addNewAssignmentCta = function () {\n angular.element(document.querySelector('#viewAssignmentsModal')).modal('hide');\n $scope.$broadcast('openAddAssignmentsModal', { displaytype: 2, studentId: $scope.studentId });\n $scope.assignmentModalhide = false;\n \n };\n\n\n jQuery('#viewAssignmentsModal').on('shown.bs.modal', function () {\n $scope.closeNewAssignmentModal();\n });\n /* Switches the modal view to the view assignments modal */\n $scope.closeNewAssignmentModal = function () {\n\n $scope.assignmentModalhide = true;\n\n viewAssignmentsCta($scope.studentId);\n $scope.courseModal.courseSearch = '';\n $scope.modalBodyShow = false;\n };\n\n\n /* add assignments course search */\n $scope.courseModal = {};\n $scope.courseModal.courseSearch = '';\n $scope.courseModal.selectAll = false;\n $scope.viewCoursesError = {};\n $scope.viewCoursesError.error = errorDisplayerUtil.create();\n $scope.coursesAreLoading = true;\n $scope.assignmentsAddedSuccessfully = false;\n $scope.getCoursesCta = function (keyword) {\n $scope.modalBodyShow = true;\n $scope.selectedCourseCount = 0;\n $scope.viewCoursesError.error.reset();\n $scope.courseModal.selectAll = false;\n $scope.coursesAreLoading = true;\n\n // API Call to get assignments\n var addCoursePromise = CoursesService.getActiveCoursesForOrg(false, false);\n addCoursePromise.then(function (success) {\n var formattedCourseData = formatCoursesData(success);\n\n if (typeof keyword !== 'undefined' && keyword !== null) {\n\n formattedCourseData = $filter('filter')(formattedCourseData, keyword);\n $scope.courseData = $filter('filter')(formattedCourseData, { 'productType': '!Document' });\n\n\n } else {\n $scope.courseData = $filter('filter')(formattedCourseData, { 'productType': '!Document' });\n }\n\n $scope.coursesAreLoading = false;\n }, function (failure) {\n $scope.coursesAreLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.viewCoursesError.error.setError(errorCode, message);\n });\n };\n\n var formatCoursesData = function (data) {\n _.each(data, function (datapoint) {\n datapoint.select = false;\n });\n\n return data;\n };\n\n $scope.addAllCourses = function (value) {\n _.each($scope.courseData, function (course) {\n course.select = value;\n });\n if (value === true) {\n $scope.selectedCourseCount = $scope.courseData.length;\n } else {\n $scope.selectedCourseCount = 0;\n }\n };\n\n $scope.selectedCourseCount = 0;\n $scope.checkForLength = function (value) {\n if (value === true) {\n $scope.selectedCourseCount++;\n } else {\n $scope.selectedCourseCount--;\n }\n };\n\n /* Add the selected courses to the students assigments */\n $scope.applyCourseError = {};\n $scope.applyCourseError.error = errorDisplayerUtil.create();\n $scope.coursesAreApplying = false;\n $scope.applyNewAssignmentsCta = function (data) {\n var selectedCourses = getSelectedCourses(data);\n\n $scope.assignmentsAddedSuccessfully = true;\n $scope.coursesAreApplying = true;\n $scope.applyCourseError.error.reset();\n\n var applyCoursesPromise = AssignmentsService.assignAssignment(selectedCourses);\n applyCoursesPromise.then(function (success) {\n $scope.coursesAreApplying = false;\n $scope.assignmentsAddedSuccessfully = true;\n $scope.courseModal.courseSearch = '';\n\n $timeout(function () {\n $scope.assignmentsAddedSuccessfully = false;\n $scope.closeNewAssignmentModal();\n }, 3000);\n }, function (failure) {\n $scope.coursesAreApplying = false;\n\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n\n $scope.viewCoursesError.error.setError(errorCode, message);\n });\n\n };\n\n var getSelectedCourses = function (data) {\n var selectedCoursesArray = [];\n var userId = $scope.studentId;\n\n _.each(data, function (datapoint) {\n if (datapoint.select === true) {\n datapoint.StudentId = userId;\n if (datapoint.type === \"careerPath\" || ($scope.currentRoleTA && $scope.loggedInUserId === userId)) {\n datapoint.isRequired = false;\n } else {\n datapoint.isRequired = true;\n }\n selectedCoursesArray.push(datapoint);\n }\n });\n\n return selectedCoursesArray;\n };\n\n\n $scope.changeDueDate = function (dateObj, assignment) {\n assignment.dueDate = $scope.getEndDateTimeFromPicker(dateObj);\n };\n\n /* Get all assignments that were edited */\n var changedAssignments = [];\n $scope.getChangedAssignments = function () {\n var assignments = $scope.assignmentsData;\n for (var i in assignments) {\n if (_.isObject(assignments[i])) {\n if ((assignments[i].dueDate === null && assignments[i].originalDueDate !== null) ||\n (assignments[i].dueDate !== null && assignments[i].originalDueDate === null)) {\n changedAssignments.push(assignments[i]);\n continue; // Only add the assignment once\n }\n else if (assignments[i].originalDueDate !== null && assignments[i].dueDate !== null) {\n if (_.isObject(assignments[i].dueDate)) {\n if (assignments[i].dueDate.moment.toDate().getTime() !== assignments[i].originalDueDate) {\n changedAssignments.push(assignments[i]);\n continue; // Only add the assignment once\n }\n }\n }\n\n // TODO: How do we know if Required dropdown changed?\n if (assignments[i].isRequired !== assignments[i].originalIsRequired) {\n console.log(\"Required changed\");\n changedAssignments.push(assignments[i]);\n }\n }\n }\n };\n\n /* save any changes to assignments and close the modal */\n $scope.applyCtaViewAssignments = function () {\n $scope.getChangedAssignments();\n var assignmentsData = changedAssignments;\n\n _.each(assignmentsData, function (assignment) {\n updateAssignmentsCta(assignment);\n });\n\n changedAssignments = [];\n angular.element(document.querySelector('#viewAssignmentsModal')).modal('hide');\n\n if (!$scope.currentRoleTA) {\n $scope.homeAction();\n }\n };\n\n var updateAssignmentsCta = function (assignment) {\n assignment.errorSpinner = true;\n\n var userId = UsersService.getId();\n var studentId = $scope.studentId;\n var assignmentCourseId = assignment.assignmentCourseId;\n var finalDate = null;\n if (assignment.dueDate !== null && assignment.dueDate.moment.isValid()) {\n finalDate = assignment.dueDate.moment.toISOString();\n }\n\n var changePromise = AssignmentsService.updateAssignments(assignment);\n changePromise.then(function (success) {\n assignment.errorSpinner = false;\n }, function (failure) {\n assignment.errorSpinner = false;\n\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n\n assignment.error.setError(errorCode, message);\n });\n };\n\n $scope.toggleRemoveAssignmentConfirmation = function (assignment, closePopup) {\n jQuery('.removeCourseContainer .confirmSave.confirmRemove').toggle(false);\n\n if (typeof closePopup !== 'undefined' && closePopup === true) {\n jQuery('#removeConfirmation-' + assignment.assignmentCourseId).toggle(false);\n } else {\n jQuery('#removeConfirmation-' + assignment.assignmentCourseId).toggle(true);\n }\n\n };\n\n $scope.toggleWaiveAssignmentConfirmation = function (assignment, closePopup) {\n jQuery('.removeCourseContainer .confirmSave.confirmRemove').toggle(false);\n if (typeof closePopup !== 'undefined' && closePopup === true) {\n jQuery('#waiveConfirmation-' + assignment.assignmentCourseId).toggle(false);\n } else {\n jQuery('#waiveConfirmation-' + assignment.assignmentCourseId).toggle(true);\n }\n\n };\n\n $scope.toggleReactivateAssignmentConfirmation = function (assignment, closePopup) {\n jQuery('.removeCourseContainer .confirmSave.confirmRemove').toggle(false);\n if (typeof closePopup !== 'undefined' && closePopup === true) {\n jQuery('#reactivateConfirmation-' + assignment.assignmentCourseId).toggle(false);\n } else {\n jQuery('#reactivateConfirmation-' + assignment.assignmentCourseId).toggle(true);\n }\n\n };\n\n /**\n * Remove Assignments - Delete a user's assignment\n *\n * @param assignment Object the assignment that will be dropped\n */\n $scope.adminRemoveAssignment = function (assignment) {\n\n if (assignment.type === 'ilt')\n {\n //get offerings to remove if unloaded\n if (!assignment.offeringsLoaded) \n {\n $scope.defer = $q.defer();\n $scope.getRosteredOfferings(assignment);\n $scope.defer.promise.then(\n function(){ $scope.removeAssignmentOfferings(assignment); });\n }\n else\n { \n $scope.removeAssignmentOfferings(assignment); \n }\n }\n $scope.removeSingleAssignment(assignment);\n };\n\n $scope.removeSingleAssignment = function (assignment) \n { \n $scope.assignmentsAreLoading = true;\n\n var adminAssignmentRemove = AssignmentsService.removeAssignment(assignment);\n adminAssignmentRemove.then(\n function (success)\n {\n viewAssignmentsCta($scope.studentId);\n setTimeout(function ()\n {\n $scope.assignmentsAreLoading = false;\n jQuery('#removeConfirmation').show();\n setTimeout(function ()\n {\n jQuery('#removeConfirmation').hide();\n }, 3000);\n }, 2000);\n },\n function (failure)\n {\n $scope.assignmentsAreLoading = false;\n jQuery('#removeAssignmentError').show();\n\n setTimeout(function ()\n {\n jQuery('#removeAssignmentError').hide();\n }, 2000);\n });\n };\n /**\n * Waive or reactivate a user's assignment\n *\n * @param assignment Object the assignment that will be dropped\n */\n $scope.adminWaiveorReactivateAssignment = function (assignment, waived) {\n\n $scope.assignmentsAreLoading = true;\n var adminAssignmentReactivate = AssignmentsService.waiveAssignment(assignment, waived);\n\n adminAssignmentReactivate.then(\n function (success) {\n viewAssignmentsCta($scope.studentId);\n },\n function (failure) {\n $scope.assignmentsAreLoading = false;\n });\n };\n\n /******* MARK ASSIGNMENT SUCCESSFUL ********/\n $scope.invalidScore = false;\n $scope.updateFailed = false;\n $scope.studentId = {};\n $scope.successfulAssignment = {};\n\n $scope.markSuccessful = function (assignment) {\n if ($scope.currentRoleTA) {\n $scope.completionDate = moment();\n $scope.completionMaxDate = moment().set({ hour: 23, minute: 59, second: 59, millisecond: 0 });\n $scope.completionMinDate = assignment.startDate.moment;\n $scope.completionMinDate.set({hour: 0, minute: 0});\n\n angular.element(document.querySelector('#viewAssignmentsModal')).modal('hide');\n angular.element(document.querySelector('#markSuccessfulModal')).modal();\n\n $scope.successfulAssignment = assignment;\n }\n };\n\n $scope.closeMarkSuccessfulModal = function () {\n angular.element(document.querySelector('#markSuccessfulModal')).modal('hide');\n angular.element(document.querySelector('#viewAssignmentsModal')).modal();\n $scope.successfulAssignment = null;\n };\n\n $scope.updateSuccessfulAssignment = function (userId, assignment, date) {\n\n $scope.invalidScore = false;\n $scope.markingSuccessful = true;\n $scope.scopeError = \"\";\n //check valid score\n if (typeof assignment.score === 'undefined' || assignment.score === null || assignment.score < 0 || assignment.score > 100 || $.trim(assignment.score) === \"\") {\n assignment.score = 0;\n }\n\n var originalStatus = assignment.status; //retain old values in case of failure\n var originalScore = assignment.score;\n assignment.status = \"successful\";\n assignment.completedDate = dateUtil.formatDate(dateUtil.setPortalEndTime(date.moment.toDate()));\n\n var taUpdateTranscript = TranscriptsService.updateSingle(userId, assignment);\n\n taUpdateTranscript.then(function (success) {\n\n $scope.markingSuccessful = false; //stop spinner\n $scope.closeMarkSuccessfulModal(); //close modal\n viewAssignmentsCta($scope.studentId); //refresh assignments\n\n }, function (failure) {\n assignment.status = originalStatus; //assign original values\n assignment.score = originalScore;\n assignment.completedDate = null;\n\n $scope.markingSuccessful = false; //stop spinner\n $scope.updateFailed = true; // show error\n $scope.transcripterror = failure.ErrorMessage;\n setTimeout(function () {\n $scope.updateFailed = false; // hide error\n }, 2000);\n });\n\n };\n\n $scope.resetAssignment = {};\n $scope.resetAssignmentStatus = function (assignment) {\n \n if ($scope.currentRoleTA) {\n angular.element(document.querySelector('#viewAssignmentsModal')).modal('hide');\n angular.element(document.querySelector('#resetStatusModal')).modal();\n\n $scope.resetAssignment = assignment;\n }\n };\n\n $scope.closeResetStatusModal = function () {\n angular.element(document.querySelector('#resetStatusModal')).modal('hide');\n angular.element(document.querySelector('#viewAssignmentsModal')).modal();\n $scope.resetAssignment = null;\n };\n\n $scope.resetCourseStatus = function (assignment, userId) {\n $scope.markingSuccessful = true;\n var resetCoursePromise = CoursesService.resetCourseStatus(assignment.id, userId);\n\n resetCoursePromise.then(function (success) {\n $scope.resettingCourseStatus = false; //stop spinner\n $scope.closeResetStatusModal(); //close modal\n viewAssignmentsCta($scope.studentId); //refresh assignments\n }, function (failure) {\n $scope.markingSuccessful = false; //stop spinner\n $scope.updateFailed = true; // show error\n setTimeout(function () {\n $scope.updateFailed = false; // hide error\n }, 2000);\n });\n };\n\n $scope.sortBy = function (propertyName) {\n $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;\n $scope.propertyName = propertyName;\n };\n\n function capitalize(s) {\n\n return s && s[0].toUpperCase() + s.slice(1);\n\n }\n\n\n /******* OFFERINGS ********/\n $scope.getRosteredOfferings = function (assignment) {\n\n if (!assignment.offerings && !assignment.offeringsLoaded)\n {\n var offerings = [];\n assignment.offeringsLoaded = false;\n\n var getOfferings = CoursesService.getSingleCourseOfferings(assignment.id);\n getOfferings.then(\n function (success)\n {\n assignmentOfferings = success;\n \n //return only rostered offerings\n if (assignmentOfferings.length > 0)\n {\n _.each(assignmentOfferings, function (offering)\n {\n if (offering.roster.attendingStudents.length > 0)\n {\n var attending = offering.roster.attendingStudents;\n _.each(attending, function (student)\n {\n if (student.id === $scope.studentId && student.completionDate === null) { offerings.push(offering); }\n });\n }\n\n if (offering.roster.waitlistedStudents.length > 0)\n {\n var waitlist = offering.roster.waitlistedStudents;\n _.each(waitlist, function (student)\n {\n if (student.id === $scope.studentId && student.completionDate === null) { offerings.push(offering); }\n });\n }\n\n if (offering.roster.pendingApprovalStudents.length > 0)\n {\n var pending = offering.roster.pendingApprovalStudents;\n _.each(pending, function (student)\n {\n if (student.id === $scope.studentId && student.completionDate === null) { offerings.push(offering); }\n });\n }\n \n assignment.offerings = offerings.sort(function (a, b) \n {\n return new Date(a.sessions[0].startDateTime.fullDateWithTime) - new Date(b.sessions[0].startDateTime.fullDateWithTime);\n });\n });\n }\n \n //offerings now loaded\n assignment.offeringsLoaded = true;\n $scope.defer.resolve();\n },\n function (error)\n {\n assignment.offeringsLoaded = true;\n\n jQuery('#getOfferingsError').show();\n setTimeout(function ()\n {\n jQuery('#getOfferingsError').hide();\n }, 3000);\n $scope.defer.resolve();\n }\n );\n }\n };\n\n $scope.viewRosteredOfferings = function (assignment) {\n\n assignment.viewOfferings = true;\n $scope.defer = $q.defer();\n $scope.getRosteredOfferings(assignment);\n };\n\n $scope.toggleRemoveOfferingConfirmation = function (offering, assignment, closePopup) {\n\n //Close any existing modals\n jQuery('.removeCourseContainer .confirmSave.confirmRemove').toggle(false);\n\n //Open or Close current modal\n if (closePopup === true) {\n jQuery('#removeConfirmation-' + offering.id + '-' + assignment.assignmentId).toggle(false);\n }\n if (closePopup === false)\n {\n jQuery('#removeConfirmation-' + offering.id + '-' + assignment.assignmentId).toggle(true);\n }\n };\n\n $scope.removeSingleOffering = function (offering, assignment) {\n\n assignment.offeringsLoaded = false;\n var offeringRemovePromise = RosterService.updateSinglePersonOnRoster($scope.studentId,offering.id,'cancelled','ilt');\n\n offeringRemovePromise.then(\n function (success) {\n assignment.offerings = _.filter(assignment.offerings, function (removed) { return removed.id !== offering.id; });\n \n /* Remove assignment if...\n 1. no other offerings \n 2. is elective \n */\n if (assignment.offerings.length === 0 && assignment.isUserAssigned) \n {\n assignment.offeringsLoaded = true;\n $scope.removeSingleAssignment(assignment);\n }\n else\n {\n assignment.offeringsLoaded = true;\n jQuery('#removeOfferingSuccess').show();\n setTimeout(function ()\n {\n jQuery('#removeOfferingSuccess').hide();\n }, 3000);\n }\n },\n function (failure) {\n assignment.offeringsLoaded = true;\n jQuery('#removeOfferingError').show();\n setTimeout(function () {\n jQuery('#removeOfferingError').hide();\n }, 3000);\n }\n );\n };\n\n $scope.removeAssignmentOfferings = function (assignment) \n {\n if (assignment.offerings.length > 0)\n {\n var removeList = [];\n _.each(assignment.offerings, function (offering)\n {\n\n var node = {};\n node.StudentId = $scope.studentId;\n node.OfferingId = offering.id;\n node.RegistrationStatus = 'cancelled';\n node.AssignmentType = 'ilt';\n\n removeList.push(node);\n });\n\n var offeringsRemovePromise = RosterService.updateMultiplePersonOnRoster(removeList);\n offeringsRemovePromise.then(\n function (success) \n {\n console.log(success);\n }, \n function (failure) \n {\n console.log(failure);\n }\n );\n }\n };\n }]\n };\n}\n]);","app.directive(\"viewResourcesSlideDown\", ['$rootScope', '$sce', 'AssignmentsService', 'CoursesService', 'TasksService', 'UsersService', 'EvaluationService', 'SurveyService', function ($rootScope, $sce, AssignmentsService, CoursesService, TasksService, UsersService, EvaluationService, SurveyService) {\n // returns the Directive Definition Object\n return {\n restrict: 'E',\n transclude: true,\n templateUrl: 'app/templates/users/partials/viewResourceSlideDown.html',\n link: function (scope, element, attrs, ctrl) {\n\n scope.$on('slider:view:close', function (event, data) {\n scope.closeSlider();\n });\n\n var lastIndex = -1;\n\n element = element.children('#viewResources');\n\n scope.openResourceInfo = function ($event, assignment) {\n\n scope.assignment = assignment;\n var isInACourseGroup = (typeof assignment.CourseGroupName !== 'undefined') ? assignment.CourseGroupName : assignment.isInCourseGroup;\n var resources = assignment.courseAssets;\n for (var r in resources) {\n current = resources[r];\n if (current.fileFormat === 'pdf') { resources[r].fileFormatName = '.PDF'; }\n else if (current.fileFormat === 'excel') { resources[r].fileFormatName = '.XLS'; }\n else if (current.fileFormat === 'url') { resources[r].fileFormatName = 'URL'; }\n else if (current.fileFormat === 'word') { resources[r].fileFormatName = '.DOCX'; }\n else if (current.fileFormat === 'powerpoint') { resources[r].fileFormatName = '.PPT'; }\n else if (current.fileFormat === 'text') { resources[r].fileFormatName = '.TXT'; }\n else if (current.fileFormat === 'audio') { resources[r].fileFormatName = '.MP3'; }\n else if (current.fileFormat === 'video') { resources[r].fileFormatName = '.MP4'; }\n else if (current.fileFormat === 'picture') { resources[r].fileFormatName = '.PNG'; }\n else if (current.fileFormat === 'zip') { resources[r].fileFormatName = '.ZIP'; }\n }\n\n scope.resources = resources;\n var eventName = $event.target.innerHTML;\n\n jQuery('.resource').html('View Resources');\n\n if (jQuery(element).data('state') === 'opened') {\n if (isInACourseGroup === undefined || isInACourseGroup === '') {\n if (jQuery('#courseGroupArrow').length > 0) {\n jQuery('#courseGroupArrow').hide(1, function () {\n jQuery('#viewResources').slideUp();\n\n });\n } else {\n jQuery(element).slideUp();\n }\n\n jQuery(element).data('state', 'closed');\n }\n else\n {\n jQuery('#courseGroupList .arrow').hide();\n jQuery('#viewResources').slideUp();\n }\n }\n\n //Close any read more course details\n var singleCourseSlideDown = jQuery('#singlecourse');\n if (jQuery(singleCourseSlideDown).data('state') === 'opened') {\n jQuery('#offeringSlide').slideUp();\n if (jQuery('.arrow').length > 0) {\n jQuery('.arrow').hide(1, function () {\n jQuery('#singlecourse').slideUp();\n });\n } else {\n jQuery(singleCourseSlideDown).slideUp();\n }\n\n jQuery('.more').html('Read More');\n jQuery(singleCourseSlideDown).data('state', 'closed');\n }\n\n //Look for any course group lists open and close them\n var courseGroupList = jQuery('#courseGroupList');\n\n if (jQuery(courseGroupList).data('state') === 'opened' && (isInACourseGroup === undefined || isInACourseGroup === '')) {\n jQuery('#offeringSlide').slideUp();\n jQuery('.courseGroupMore').html('Read More');\n\n if (jQuery('.arrow').length > 0) {\n jQuery('.arrow').hide(1, function () {\n jQuery('#courseGroupList').slideUp();\n\n });\n } else {\n jQuery(courseGroupList).slideUp();\n }\n\n jQuery(courseGroupList).data('state', 'closed');\n }\n\n scope.apiError = false;\n scope.singleIsLoading = false;\n\n var children, lastChild, mover, parent = null;\n var currentIndex, endOfRow, modIndex, modulo = 0;\n var found = false;\n var target = $event.currentTarget;\n\n currentIndex = 0;\n\n children = jQuery(target).parents('#courseList').children('.col-md-4');\n if (children.length > 0) {\n parent = jQuery(target).parents('.col-md-4')[0];\n\n modulo = jQuery(window).width() > 768 ? 3 : 1;\n\n children.each(function (index) {\n var id = jQuery(parent).prop('id');\n\n jQuery(parent).prop('id', null);\n\n if (jQuery(this)[0] === parent) {\n currentIndex = index + 1;\n\n found = true;\n }\n\n jQuery(parent).prop('id', id);\n if (found === true) {\n found = false;\n\n jQuery('.col-md-4').removeClass('selected');\n jQuery(parent).addClass('selected');\n\n return;\n }\n });\n\n if (currentIndex === lastIndex || (isInACourseGroup && eventName === 'Hide Resources')) {\n lastIndex = -1;\n\n return;\n }\n\n jQuery(parent).children('.arrow').show(1, function () {\n jQuery(element).slideDown();\n });\n\n /* Create the dimensions of the arrow on the slide down menu */\n var assignmentContainerWidth = jQuery(parent).width();\n // Set the sides of the triangle \n var triangleSideWidth = assignmentContainerWidth / 2;\n jQuery(parent).children('.arrow').children('.point').css('border-left',\n triangleSideWidth + \"px solid transparent\");\n jQuery(parent).children('.arrow').children('.point').css('border-right',\n triangleSideWidth + \"px solid transparent\");\n\n // Set the height of the triangle and move it a bit down so it doesn't\n // overlap anything\n var triangleHeight = 40;\n jQuery(parent).children('.arrow').children('.point').css('border-top',\n triangleHeight + \"px solid #e5e5e5\");\n\n // .75 is based on the height of .arrowTopBorder.\n // So if the triangle is 40px high, needs to be shifted by 30px to not overlap\n // if triangle is 20px high, needs to be shifted by 20px to not overlap.\n // To make this clearer, replace .75 with something based on .arrowTopBorder height\n var triangleShift = triangleHeight * 0.75; // .75 is arbitrary right meow.\n jQuery(parent).children('.arrow').children('.point').css('top',\n triangleShift + \"px\");\n\n // Set endOfRow as current index - 1, as\n endOfRow = currentIndex - 1;\n modIndex = currentIndex % modulo; // modulo is 4 3 or 1 depending on columns\n\n if (modIndex > 0) {\n endOfRow = (currentIndex - modIndex) + (modulo - 1); // Subtract one from module because we are accessing array\n }\n\n lastChild = children[endOfRow];\n if (typeof lastChild === 'undefined') {\n lastChild = children[children.length - 1];\n }\n\n if (isInACourseGroup !== undefined && isInACourseGroup !== '') {\n target = jQuery($event.currentTarget);\n parent = target.parents('.col-md-12');\n currentIndex = parseInt(parent.prop('id').split('-')[1], 10) + 1;\n\n jQuery(element).slideDown();\n jQuery(parent).children('.arrow').slideDown();\n\n mover = jQuery(parent);\n\n } else {\n mover = jQuery(lastChild);\n }\n\n } else {\n target = jQuery($event.currentTarget);\n parent = target.parents('.col-md-12');\n\n currentIndex = parseInt(parent.prop('id').split('-')[1], 10) + 1;\n\n if (currentIndex === lastIndex) {\n lastIndex = -1;\n\n return;\n }\n\n jQuery(element).slideDown();\n\n mover = jQuery(parent);\n }\n\n scope.task = null;\n\n if (jQuery($event.currentTarget).children().length > 0) {\n jQuery($event.currentTarget).children('.resource').html('Hide Resources');\n } else {\n jQuery($event.currentTarget).html('Hide Resources');\n }\n\n jQuery(element).data('state', 'opened');\n\n jQuery(mover).after(jQuery(element));\n\n lastIndex = currentIndex;\n };\n\n scope.closeSlider = function () {\n jQuery('#viewResources').slideUp(500, function () {\n jQuery('.arrow').hide();\n\n jQuery('.resource').html('View Resources');\n });\n\n lastIndex = -1;\n };\n\n\n }\n };\n}]);\n","// Returns \n\napp.filter('assignmentAssetTypeName', function(){\n return function(courseTypeName) {\n var courseTypeFullName;\n\n switch (courseTypeName) {\n case 'wbt':\n case 'Web Based':\n courseTypeFullName = 'Web Based Training';\n break;\n case 'ilt':\n case 'Instructor Led':\n courseTypeFullName = 'Instructor Led Training';\n break;\n case 'vle':\n courseTypeFullName = 'Virtual Classroom';\n break;\n case 'task':\n courseTypeFullName = 'Task';\n break; \n case 'survey':\n courseTypeFullName = 'Survey';\n break;\n case 'evaluation':\n courseTypeFullName = 'Evaluation';\n break;\n case 'assessment':\n courseTypeFullName = 'Assessment';\n break;\n case 'courseGroup':\n courseTypeFullName = 'Course Group';\n break;\n case 'courseGroupCurricula':\n case 'Curricula':\n courseTypeFullName = 'Curricula';\n break;\n case 'courseGroupCertification':\n case 'Certification':\n courseTypeFullName = 'Certification';\n break;\n //Adding Career Path to filter\n case 'careerPath':\n courseTypeFullName = 'Career Path';\n break;\n case 'mp3':\n case 'mP3':\n courseTypeFullName = 'MP3';\n break;\n case 'mp4':\n case 'mP4':\n courseTypeFullName = 'MP4';\n break;\n case 'word':\n courseTypeFullName = 'Word';\n break;\n case 'pdf':\n courseTypeFullName = 'PDF';\n break;\n case 'excel':\n courseTypeFullName = 'Excel';\n break;\n case 'url':\n courseTypeFullName = 'URL';\n break;\n case 'other':\n courseTypeFullName = 'Other';\n break;\n default:\n courseTypeFullName = 'Unknown';\n break;\n } \n return courseTypeFullName;\n };\n});","// Returns true if an associative array is empty\n// Used like so\napp.filter('associativeArrayEmpty', function() {\n return function(object) {\n return !!(object && Object.keys(object).length === 0);\n };\n});\n","//Filter logic for duration values\napp.filter('duration', function () {\n return function (val, source) {\n if (source) return ((val) ? (Math.round(val * 60).toString() + \" min\") : \"\");\n\n return ((val) ? val + \" min\" : \"\");\n };\n});","app.filter('sortByPropertyContains', ['sortService', function (sortService) {\n return function (arr, viewValue, propToFilter) {\n return sortService.sortByPropertyContains(arr, viewValue, propToFilter);\n };\n}]);","app.filter('trimmer', ['$sce', function ($sce) {\n return function (value, wordwise, max, tail) {\n if (!value) return '';\n\n max = parseInt(max, 10);\n if (!max) return value;\n if (value.length <= max) return value;\n\n value = value.substr(0, max);\n if (wordwise) {\n var lastspace = value.lastIndexOf(' ');\n if (lastspace !== -1) {\n value = value.substr(0, lastspace);\n }\n }\n\n return value + (tail || ' …');\n };\n}]);","app.filter('unique', function() {\n return function(collection, keyname) {\n var output = [], \n keys = [];\n\n angular.forEach(collection, function(item) {\n var key = item[keyname];\n if(keys.indexOf(key) === -1) {\n keys.push(key);\n output.push(item);\n }\n });\n\n return output;\n };\n});","/* Various helper functions for manipulating organization trees from OrganizationsService */\n\n/**\n * @TODO: @sneilan move this to organizations model.\n */\napp.factory('OrgFunctions', [function() {\n /* This function takes the root organization\n * and returns a list of organizations with their org tree paths\n * Saves data to dictionaryToSaveOrgsTo\n * Do something like var dictionaryToSaveOrgsTo = {};\n * organization should be the return value of OrganizationsService.getOrganizationHierarchy;\n * whereas you'll send in the first number\n * var orgTreePromise = OrganizationsService.getOrganizationHierarchy();\n * orgTreePromise.then(function(orgTreeData) {\n * var dictionaryToSaveOrgsTo = {};\n * createOrgHierarchyList(orgTreeData[0], dictionaryToSaveOrgsTo);\n * // dictionaryToSaveOrgsTo now has data!! :)\n * }\n * dictionaryToSaveOrgsTo will look like this\n * dictionaryToSaveOrgsTo[organization.id] = [{name: name, _id: organization.id, orgObject: organization}... and so forth]\n * whereas the first node in each row of that dictionary is the root and it goes down.\n */\n function createOrgHierarchyList(organization, dictionaryToSaveOrgsTo, currentPathArray) {\n /**\n * We are assuming this will always be there. That is not the case. We need to ensure that we are doing a check,\n * otherwise there will be a failure and JS error.\n */\n if(typeof organization === 'undefined') {\n return;\n }\n\n if (currentPathArray === undefined) {\n currentPathArray = [];\n }\n\n var orgFolder = {};\n\n orgFolder.name = organization.name;\n orgFolder._id = organization.id;\n orgFolder.orgObject = organization;\n\n // Javascript passes everything by reference which interferes with programming\n // recursive functions. This type of recursion only works if the arguments are passed by\n // value and not reference.\n\n var currentPathArrayCopy = angular.copy(currentPathArray);\n\n currentPathArrayCopy.push(orgFolder);\n\n dictionaryToSaveOrgsTo[organization.id] = currentPathArrayCopy;\n\n if (organization.nodes) {\n for (var i = 0; i < organization.nodes.length; i += 1) {\n createOrgHierarchyList(organization.nodes[i], dictionaryToSaveOrgsTo, currentPathArrayCopy);\n }\n }\n }\n\n // http://stackoverflow.com/a/31247960/761726\n /** Takes a flat list of tree nodes and turns them into a tree\n * Each node needs a marker for the id, parentId & something to say\n * whether it's a root node. (We're actually mapping multiple trees)\n *\n * Example: You can have a array of nodes like this\n * { 'id' : 1, 'parentId': 3, 'isTopLevelOrg' : false}\n * where 'id' is what's in idMarkerString,\n * 'parentId' is what's in parentIdMarkerString\n * function(node) { return node.isTopLeveLorg; } is a function to determine if something is a top level node. (rootCheckerFunction)\n *\n * each id should be unique. each parentId should point to another node\n * If a node is a top level node, the rootCheckerFunction should return true.\n *\n * So the call for this array would be \n * var arr = [{ 'id' : 1, 'parentId': 3, 'isTopLevelOrg' : false}];\n * var tree = unflatten(arr, 'id', 'parentId', function(node) { return node.isTopLevelOrg; });\n *\n * If you had something like this\n * var arr = [{ 'id' : 1, 'managerId': 3, 'managerId' : 123},\n * { 'id' : 2, 'managerId': 3, 'managerId' : 0}];\n * Where managerId is 0 if the node is a top level node, you could call unflatten like so\n * var tree = unflatten(arr, 'id', 'managerId', function(node) { return node.managerId === 0; });\n *\n *\n * In ancient times, Jesus turned water into wine\n * But he did not take a flat list of organizations and\n * transmute it into a tree structure.\n *\n * @var idMarkerTring string Definition of idMarkerSTring\n */\n function unflatten(arr, idMarkerString, parentIdMarkerString, rootCheckerFunction, includeFilterFunction) {\n var tree = [],\n mappedArr = {},\n arrElem,\n mappedElem;\n\n // First map the nodes of the array to an object -> create a hash table.\n for(var i = 0, len = arr.length; i < len; i++) {\n arrElem = arr[i];\n mappedArr[arrElem[idMarkerString]] = arrElem;\n mappedArr[arrElem[idMarkerString]].nodes = [];\n }\n\n for (var id in mappedArr) {\n if (mappedArr.hasOwnProperty(id)) {\n mappedElem = mappedArr[id];\n // If the element is not at the root level, add it to its parent array of children.\n if (!rootCheckerFunction(mappedElem)) {\n /* To account for bad data, check if someone's managerId points to a user\n * That's not actually a manager */\n //SLY-4000 use filter function here to exclude nodes from the tree if defined.\n if (typeof mappedArr[mappedElem[parentIdMarkerString]] !== 'undefined' && (typeof includeFilterFunction !== 'function' || includeFilterFunction(mappedElem))) \n mappedArr[mappedElem[parentIdMarkerString]].nodes.push(mappedElem);\n }\n // If the element is at the root level, add it to first level elements array.\n else {\n tree.push(mappedElem);\n }\n }\n }\n return tree;\n }\n\n /* Recursively Gets a list of node ids under this node.\n * Useful for filtering rows by a tree or subtree\n *\n * Takes a rootnode with nodes below it.\n * A dictionary to store the list of ids.\n * An id marker to know what we should build a list of\n *\n * Returns a list of ids under the node\n *\n * Recommended: use createOrgHierarchyList to create a rootNode\n * listToStoreOrgIdsIn should be an array\n * id marker will be a string\n *\n * var rootNode = createOrgHierarchyList(..); // SEE definition for details\n * var listToStoreIdsIn = [];\n * var idMarker = 'id';\n * getSubIdsRecursively(rootNode, listToStoreIdsIn, idMarker);\n * console.log(listToStoreOrgIdsIn);\n *\n * The top level organization ID will also be in the list of ids returned */\n function getSubIdsRecursively(rootNode, listToStoreIdsIn, idMarker) {\n listToStoreIdsIn.push(rootNode[idMarker]);\n if (rootNode.nodes) {\n for (var i = 0; i < rootNode.nodes.length; i += 1) {\n getSubIdsRecursively(rootNode.nodes[i], listToStoreIdsIn, idMarker);\n }\n }\n }\n\n return {\n createOrgHierarchyList: createOrgHierarchyList,\n unflatten: unflatten,\n getSubIdsRecursively: getSubIdsRecursively\n };\n}]);\n\n","app.factory('PeopleGroupFunctions', ['$http', '$q', '$filter', 'GroupsService', 'UsersService', 'OrganizationsService', 'JobsService', 'CountriesService', 'StatesService', function ($http, $q, $filter, GroupsService, UsersService, OrganizationsService, JobsService, CountriesService, StatesService) {\n\n function peopleGroupActions(peopleGroupId) {\n var peopleGroupStructure;\n if (typeof peopleGroupId === 'undefined' || peopleGroupId === null) {\n peopleGroupStructure = GroupsService.generateRootContainer(true);\n } else if (typeof peopleGroupId !== 'undefined' && peopleGroupId !== null && peopleGroupId !== 'ruleTab') {\n peopleGroupStructure = GroupsService.peopleGroupStructure(peopleGroupId);\n } else if (typeof peopleGroupId !== 'undefined' && peopleGroupId === 'ruleTab') {\n peopleGroupStructure = null;\n }\n\n var selectOptionsData = GroupsService.getPeopleGroupFilters();\n var containerOperandsDataPromise = GroupsService.getContainerOperands();\n var orgTreePromiseGroups = OrganizationsService.getOrganizationHierarchy();\n var peopleGroupsTreePromise = GroupsService.getPeopleGroups();\n var jobs = JobsService.getAllJobs();\n var countries = CountriesService.getLatitudeCountryList(UsersService.getPortalId());\n var states = StatesService.getLatitudeAllStateList();\n\n var all = [peopleGroupStructure, selectOptionsData, containerOperandsDataPromise, orgTreePromiseGroups, peopleGroupsTreePromise, jobs, countries, states];\n\n return all;\n\n }\n\n return {\n peopleGroupActions: peopleGroupActions\n };\n\n\n}]);\n","app.factory('TreeHelpers', [function() {\n var _this = this;\n /* Takes a tree in the form of \n * [{ 'property': value, 'nodes': [{'property': value, 'nodes':[] ]}, ...]\n * And sets name = value on every node in the tree including the root */\n _this.setPropertyOnAllNodes = function(data, name, value) {\n for (var i = 0; i < data.length; i += 1) {\n data[i][name] = value;\n // if there are subnodes, \n // set them to hidden also\n if (data[i].nodes) {\n _this.setPropertyOnAllNodes(data[i].nodes, name, value);\n }\n }\n };\n\n // make every top level node (you can have multiple)\n // have a group Id. Make every node above those top level nodes have the same group ID\n // The group ID of the top level nodes will just be the id\n // the group ID of the nodes below it will be _group_id\n // This function recursively adds groupIds\n // If groupId isn't passed, call itself with the groupId of each top level element\n // the recursive calls will pass in group id\n _this.addGroupIds = function(data, groupId) {\n if (groupId === undefined) {\n for (var i = 0; i < data.length; i += 1) {\n _this.addGroupIds(data[i], data[i]._id);\n }\n } else {\n data._group_id = groupId;\n\n if(typeof data.nodes !== 'undefined') {\n for (var nodeIndex = 0; nodeIndex < data.nodes.length; nodeIndex += 1) {\n _this.addGroupIds(data.nodes[nodeIndex], groupId);\n }\n }\n }\n };\n\n return _this;\n}]);\n","(function() {\n app.factory('IltRosterUtilities', [IltRosterUtilities]);\n\n function IltRosterUtilities() {\n // Public API\n return {\n isUserRegisteredForOffering: isUserRegisteredForOffering\n };\n\n function isUserRegisteredForOffering(offering, userId) {\n return getStatusForOfferingFromRoster(offering, userId) !== 'notRegistered';\n }\n\n function getStatusForOfferingFromRoster(offering, userId) {\n var defaultStatus = 'notRegistered';\n var loggedinUser = userId;\n //The roster now returns the total counts for attending and waitlisted students\n //If the logged in person is in the roster, their userid will be populated in the roster list\n //loop through the attending/waitlist/pendingApproval students and if a userID is not a dummy ie. 0\n //then return the roster status\n var attendingRoster = offering.roster.attendingStudents;\n for (var attend in attendingRoster) {\n var atten = attendingRoster[attend];\n if (typeof atten.id !== 'undefined' && atten.id !== 0 && loggedinUser === atten.id)\n { return atten.rosterStatus; }\n }\n\n var waitlistRoster = offering.roster.waitlistStudents;\n for (var waitL in waitlistRoster) {\n var wait = waitlistRoster[waitL];\n if (typeof wait.id !== 'undefined' && wait.id !== 0 && loggedinUser === wait.id)\n { return wait.rosterStatus; }\n }\n\n var pendingRoster = offering.roster.pendingApprovalStudents;\n for (var pender in pendingRoster) {\n var pend = pendingRoster[pender];\n if (typeof pend.id !== 'undefined' && pend.id !== 0 && loggedinUser === pend.id)\n { return pend.rosterStatus; }\n }\n\n return defaultStatus;\n }\n }\n})();","app.factory('addressUtil', [function () {\n return {\n /**\n * Format an address into a full string\n *\n * @param addressObj\n * @returns {string}\n */\n formatAddress: function(addressObj) {\n var address = '';\n\n if(typeof(addressObj.addressLine1) !== 'undefined' && addressObj.addressLine1 !== '' && addressObj.addressLine1 !== null && addressObj.addressLine1 !== '') {\n address = addressObj.addressLine1;\n\n if(typeof(addressObj.addressLine2) !== 'undefined' && addressObj.addressLine2 !== '' && addressObj.addressLine2 !== null && addressObj.addressLine2 !== '') {\n address += ' ' + addressObj.addressLine2;\n\n if(typeof(addressObj.addressLine3) !== 'undefined' && addressObj.addressLine3 !== '' && addressObj.addressLine3 !== null && addressObj.addressLine3 !== '') {\n address += ' ' + addressObj.addressLine3;\n }\n } else if(typeof(addressObj.addressLine3) !== 'undefined' && addressObj.addressLine3 !== '' && addressObj.addressLine3 !== null && addressObj.addressLine3 !== '') {\n address += ' ' + addressObj.addressLine3;\n }\n } else if(typeof(addressObj.addressLine2) !== 'undefined' && addressObj.addressLine2 !== '' && addressObj.addressLine2 !== null && addressObj.addressLine2 !== '') {\n address = addressObj.addressLine2;\n\n if(typeof(addressObj.addressLine3) !== 'undefined' && addressObj.addressLine3 !== '' && addressObj.addressLine3 !== null && addressObj.addressLine3 !== '') {\n address += ' ' + addressObj.addressLine3;\n }\n } else if(typeof(addressObj.addressLine3) !== 'undefined' && addressObj.addressLine3 !== '' && addressObj.addressLine3 !== null && addressObj.addressLine3 !== '') {\n address = addressObj.addressLine3;\n }\n\n address += \" \" + this.getCityStateZipLabel(addressObj);\n\n return address;\n },\n getCityStateZipLabel: function(address) {\n var final = '';\n\n // Ensure there is an address object\n if(typeof address !== 'undefined' && address !== null) {\n // Ensure there is a city string, ifso, append it to the final return value\n if(typeof address.city !== 'undefined' && address.city !== null && address.city !== '') {\n final += address.city;\n\n // Ensure there is a state string; ifso, append it to the final return value\n if(typeof address.stateName !== 'undefined' && address.stateName !== null && address.stateName !== '') {\n final += ', ' + address.stateName;\n\n // Ensure there is a zip string; ifso, append it to the final return value\n if(typeof address.postalCode !== 'undefined' && address.postalCode !== null && address.postalCode !== '') {\n final += ' ' + address.postalCode;\n }\n }\n } else if(typeof address.stateName !== 'undefined' && address.stateName !== null && address.stateName !== '') {\n final += ', ' + address.stateName;\n\n // Ensure there is a zip string; ifso, append it to the final return value\n if(typeof address.postalCode !== 'undefined' && address.postalCode !== null && address.postalCode !== '') {\n final += ' ' + address.postalCode;\n }\n } else if(typeof address.postalCode !== 'undefined' && address.postalCode !== null && address.postalCode !== '') {\n final += address.postalCode;\n }\n }\n\n return final;\n },\n isThereAnAddress: function(address) {\n if(typeof address === 'undefined' || address === null) {\n return false;\n }\n\n address = this.formatAddress(address);\n\n return address !== null;\n }\n };\n}]);","app.factory('courseFormatterUtil', [function () {\n return {\n getCourseCodeForImage: function (courseCode, tileImage) {\n ///regex the tileimage//image start + tileImage\n if (tileImage === null) {\n return 'tile_images/00000';\n }\n else {\n return tileImage;\n }\n }\n };\n}]);","app.factory('dateUtil', ['$rootScope', 'SettingsService', function ($rootScope, SettingsService) {\n\n var _this = this;\n\n _this.portalTz = {};\n\n _this.localTz = {};\n _this.localTz.zoneAbbr = moment.tz(moment.tz.guess()).zoneAbbr();\n _this.localTz.name = moment.tz.guess();\n\n function getPortalTimeZoneSettings() {\n if (typeof $rootScope.sysSettings !== \"undefined\" && $rootScope.sysSettings !== null) {\n if (typeof $rootScope.sysSettings.features !== \"undefined\" && typeof $rootScope.sysSettings.features['orgProp.timezone'] !== \"undefined\") {\n _this.portalTz = $rootScope.sysSettings.features['orgProp.timezone'].details;\n }\n }\n else {\n var portalSettings = SettingsService.getSettings();\n portalSettings.then(function (settings) {\n _this.portalTz = settings.timezone.details;\n });\n }\n\n if (typeof _this.portalTz.ianaName === \"undefined\" || _this.portalTz.ianaName === null) {\n _this.portalTz.startTimeHours = \"03\";\n _this.portalTz.startTimeMinutes = \"00\";\n _this.portalTz.endTimeHours = \"20\";\n _this.portalTz.endTimeMinutes = \"59\";\n return;\n }\n \n var portalEndTime = moment(new Date()).tz(_this.portalTz.ianaName).set({ hour: 20, minute: 59, second: 0, millisecond: 0 });\n var portalStartTime = moment(new Date()).tz(_this.portalTz.ianaName).set({ hour: 3, minute: 0, second: 0, millisecond: 0 });\n\n var localStartTime = moment(portalStartTime).tz(_this.localTz.name);\n var localEndTime = moment(portalEndTime).tz(_this.localTz.name);\n\n _this.portalTz.startTimeHours = localStartTime.format(\"HH\");\n _this.portalTz.startTimeMinutes = localStartTime.format(\"mm\");\n _this.portalTz.endTimeHours = localEndTime.format(\"HH\");\n _this.portalTz.endTimeMinutes = localEndTime.format(\"mm\");\n }\n\n \n\n function testTimeStringFormat(timeString) {\n var regex = new RegExp('^\\\\b((1[0-2]|0[1-9]):([0-5][0-9]) ([AaPp][Mm]))$');\n return regex.test(timeString);\n }\n\n return {\n formatDate: function(date, displayTime) {\n var final = {};\n var mmt = moment(date);\n final.original = date;\n final.apiDate = mmt.format(\"YYYY-MM-DD\");\n final.day = parseInt(mmt.format(\"D\"), 10);\n final.dayName = mmt.format(\"ddd\");\n final.fullDate = mmt.format(\"L\");\n final.fullDateWithTime = mmt.format(\"L LT\");\n final.month = mmt.format(\"MMM\");\n final.monthNumber = parseInt(mmt.format(\"M\"), 10);\n final.monthForCalender = mmt.month();\n final.year = parseInt(mmt.format(\"YYYY\"), 10);\n final.time = mmt.format(\"LT\");\n final.moment = mmt;\n\n final.utcDate = moment(date).utc();\n\n final.dateAsObj = {};\n final.dateAsObj.day = final.day;\n final.dateAsObj.month = final.monthNumber;\n final.dateAsObj.year = final.year;\n\n final.jsDate = new Date(date);\n\n final.displayTime = typeof displayTime === \"undefined\" ? false : displayTime; // default\n\n return final;\n },\n\n setStartTime: function(dateTime) {\n if (dateTime !== undefined && dateTime !== null) {\n var newdt = new Date(dateTime);\n newdt.setHours(0, 0, 0, 0);\n return newdt;\n } else\n return dateTime;\n },\n setEndTime: function(dateTime) {\n if (dateTime !== undefined && dateTime !== null) {\n var newdt = new Date(dateTime);\n newdt.setHours(23, 59, 0, 0);\n return newdt;\n } else\n return dateTime;\n },\n /**\n *\n * @param dateTime\n */\n generateNormalTimeFormat: function(dateTime) {\n var hours = dateTime.getHours();\n var minutes = this._convertMinutesToDoubleValue(dateTime.getMinutes());\n\n return parseFloat(hours + minutes);\n },\n /**\n * Convert minutes into a decimal of an hour.\n *\n * @param minutes Minutes of an hour\n * @returns {number} Calculated percentage of an hour\n */\n _convertMinutesToDoubleValue: function(minutes) {\n return minutes / 60;\n },\n /**\n * Get a decimal (1.5) as time (1:30:00)\n *\n * @param value Minutes to convert to minutes\n * @returns {number} Calculated string containing full time\n */\n convertDoubleToMinutes: function(value) {\n var str = parseFloat(value).toFixed(2).toString().split('.');\n\n //var minutes = (parseInt(str[1], 10) * 60) / 100;\n\n return (parseInt(str[0], 10) + ((parseInt(str[1], 10) * 60) / 10000)).toFixed(2).toString().replace(/\\./g, ':') + ':00';\n },\n\n /**\n * Return a default date with the time parsed from the string\n *\n * @param timeString time to be converted\n * @returns {date} JS Date object of 1/1/1970 with time set to parsed parameter or null if timeString is not in the correct format\n */\n parseTime: function(timeString) {\n if (!testTimeStringFormat(timeString)) {\n return null;\n }\n var splits = timeString.split(':');\n var hours = splits[0];\n var leftover = splits[1];\n var leftoverSplits = leftover.split(' ');\n var minutes = leftoverSplits[0];\n var ampm = leftoverSplits[1];\n hours = parseInt(hours);\n // Convert hours to 24 hour clock\n if (ampm.toLowerCase() === \"pm\" && hours < 12) {\n hours += 12; // If its pm add 12 hours to it\n }\n\n if (ampm.toLowerCase() === \"am\" && hours === 12) {\n hours = 0; // If its 12 am, that's 0 in the 24 clock\n }\n\n var result = new Date(1970, 0, 1);\n result.setHours(hours, minutes, 0, 0);\n\n return result;\n },\n\n /**\n * Test if the time string matches the consistent input format: hh:mm AM/PM\n *\n * @param timeString time to be tested\n * @returns true if timeString matches format, false otherwise\n */\n isTimeFormatValid: function(timeString) {\n return testTimeStringFormat(timeString);\n },\n\n validMonth: function(month) {\n if (month > 12)\n month = 12;\n return month;\n },\n\n validDate: function(month, date) {\n var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\n if (date > daysInMonth[month - 1])\n date = daysInMonth[month - 1];\n\n return date;\n },\n\n setPortalStartTime: function (dateTime) {\n if (typeof dateTime !== 'undefined' && dateTime !== null) {\n \n getPortalTimeZoneSettings();\n var newdt = new Date(dateTime);\n newdt.setHours(_this.portalTz.startTimeHours, _this.portalTz.startTimeMinutes, 0, 0);\n return newdt;\n } else\n return dateTime;\n },\n setPortalEndTime: function (dateTime) {\n if (typeof dateTime !== 'undefined' && dateTime !== null) {\n \n getPortalTimeZoneSettings();\n var newdt = new Date(dateTime);\n newdt.setHours(_this.portalTz.endTimeHours, _this.portalTz.endTimeMinutes, 0, 0);\n return newdt;\n\n } else\n return dateTime;\n }\n\n };\n \n}]);","/**\n * @TODO: @sfrohm - migrate this to generate messaging utility object\n *\n * Class to generalize and abstract how all errors should be piped to the front-end.\n */\napp.factory('errorDisplayerUtil', [function() {\n return {\n create: function() {\n var errorDisplayer = function() {\n this.code = 0;\n this.message = null;\n this.neverHide = false;\n this.thrown = false;\n\n this.reset = function() {\n this.code = 0;\n this.message = null;\n this.neverHide = false;\n this.thrown = false;\n };\n\n this.setError = function(code, message, neverHide) {\n this.code = code;\n this.message = message;\n this.neverHide = neverHide;\n this.thrown = true;\n };\n };\n\n return new errorDisplayer();\n }\n };\n}]);","app.factory('httpUtil', ['$rootScope', 'urlParamsUtil', function httpUtil($rootScope, urlParamsUtil) {\n var _this = this;\n\n _this._headers = {};\n\n /**\n * Returns a header value if it exists; if not, it returns false.\n *\n * @param header Header name\n * @returns {*}\n * @private\n */\n _this._getHeader = function(header) {\n if(typeof _this._headers[header] !== 'undefined') {\n return _this._headers[header];\n }\n\n return false;\n };\n\n /**\n * Returns all headers\n *\n * @returns {{}|*}\n * @private\n */\n _this._getHeaders = function() {\n return _this._headers;\n };\n\n /**\n * Set a header\n *\n * @param key Name of key in headers object\n * @param value Value to map of the key\n * @private\n */\n _this._setHeader = function(key, value) {\n _this._headers[key] = value;\n };\n\n /**\n * Method called internally by angular. This method is called by the HTTP interceptor. This method\n * will attach all headers necessary to refresh call on certain calls.\n *\n * @param config Object containing XHR request paramaters\n * @returns {*}\n * @private\n */\n _this._request = function(config) {\n config.url += urlParamsUtil.create();\n\n if($rootScope.resetCache === true) {\n _this._setHeader('Cache-Control', 'no-cache');\n\n angular.extend(config.headers, _this._headers);\n\n $rootScope.resetCache = false;\n\n }\n\n return config;\n };\n\n return {\n getHeader: _this._getHeader,\n getHeaders: _this._getHeaders,\n request: _this._request,\n setHeader: _this._setHeader\n };\n}]);","app.factory('loginBackgroundUtil', [function () {\n function parseColor(input) {\n // Takes an 'rgba(1,2,3,4)' string. (From background-color in css stylesheet.)\n // Returns [1,2,3,4] in [r,g,b,a] format\n // @TODO If the users decide to use other ways of specifying colors\n // For instance #00ff00, implement that here.\n var values = input.split(\"(\")[1].split(\")\")[0].split(\",\");\n function formatIntegers(element, index, array) {\n array[index] = parseInt(element);\n }\n values.forEach(formatIntegers);\n return values;\n }\n\n function blendColorToContext(canvas, rgbaColorArray) {\n // Write the colors to the canvas\n // From: http://albertogasparin.it/articles/2011/05/html5-multiply-filter-canvas/\n // Takes a canvas\n // An rgbaColorArray in the form of [r,g,b,a]\n // And uses the multiply filter to blend the color to the canvas\n \n var ctx = canvas.getContext(\"2d\");\n\n var imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n var pix = imgData.data;\n\n function multiply(topValue, bottomValue){\n return topValue * bottomValue / 255;\n }\n\n // Loop over each pixel and change the color.\n var i = 0;\n var n = 0;\n\n for (i = 0, n = pix.length; i < n; i += 4) {\n pix[i] = multiply(rgbaColorArray[0], pix[i]); // red\n pix[i+1] = multiply(rgbaColorArray[1], pix[i+1]); // green\n pix[i+2] = multiply(rgbaColorArray[2], pix[i+2]); // blue\n // pix[i+3] is alpha channel (ignored)\n }\n // Draw the result on the canvas\n ctx.putImageData(imgData, 0, 0);\n }\n\n function drawBackground() {\n // Hide original portal login background image\n // Show canvas background\n // Load original portal login background image data\n // Put original portal login background image onto canvas\n // Get background color of .portalLoginFormOverlay1\n // Overlay background color onto canvas\n // ???\n // Profit!\n \n // GO!\n \n // Enable the canvas\n $('.portalLoginBackground,.portalLoginFormOverlay1').hide();\n $('#portalLoginBackgroundCanvas').show();\n var canvas = document.getElementById(\"portalLoginBackgroundCanvas\");\n canvas.width = $(window).width();\n canvas.height = $(window).height(); \n\n // Get a canvas context\n var ctx = canvas.getContext(\"2d\");\n\n // Draw the image to the canvas\n var image_uri = $('.portalLoginBackground').css('background-image');\n image_uri = image_uri.replace('url(\"','');\n image_uri = image_uri.replace('\")','');\n\n var background_image = new Image();\n\n // @TODO Turn this into promises.\n background_image.onload = function() {\n // Draw image differently depending on window height\n if (background_image.width < canvas.width || \n background_image.height < canvas.height) {\n ctx.drawImage(background_image, 0, 0, canvas.width, canvas.height);\n } else {\n ctx.drawImage(background_image, 0, 0);\n }\n\n // Get the overlay color and draw to screen\n var background_color = $('.portalLoginFormOverlay1').css('background-color');\n var multiplyColor = parseColor(background_color);\n blendColorToContext(canvas, multiplyColor);\n };\n\n background_image.src = image_uri;\n }\n\n return {\n 'drawBackground': drawBackground\n };\n}]);\n","/**\n * @TODO: @sfrohm - migrate this to generate messaging utility object\n *\n * Class to generalize and abstract how all errors should be piped to the front-end.\n */\napp.factory('messagingDisplayerUtil', [function() {\n return {\n create: function() {\n var messagingDisplayer = function() {\n this.code = 0;\n this.message = null;\n this.neverHide = false;\n this.thrown = false;\n\n this.reset = function() {\n this.code = 0;\n this.message = null;\n this.neverHide = false;\n this.thrown = false;\n };\n\n this.setError = function(code, message, neverHide) {\n this.code = code;\n this.message = message;\n this.neverHide = neverHide;\n this.thrown = true;\n };\n };\n\n return new messagingDisplayer();\n }\n };\n}]);","(function() {\n app.factory('PathFormatter', pathFormatter);\n\n function pathFormatter() {\n var service = {\n formatPathParams: formatPathParams,\n formatPathParamsWithEncode: formatPathParamsWithEncode\n };\n return service;\n\n\n function formatPathParams(parentPath, name) {\n //replace whitespace and / with dashes and encode the rest\n var nameFormatted = name.toLowerCase().replace(/(\\s|\\/)/g, '-');\n return parentPath === \"\" ? nameFormatted : parentPath + '/' + nameFormatted;\n }\n\n function formatPathParamsWithEncode(parentPath, name) {\n //replace whitespace and / with dashes and encode the rest\n var nameFormatted = encodeURI(name.toLowerCase().replace(/(\\s|\\/)/g, '-'));\n return parentPath === \"\" ? nameFormatted : parentPath + '/' + nameFormatted;\n }\n }\n})();","app.factory('popupcheckUtil', [function () {\n return {\n openPopUp: function () {\n var expireObj = null;\n var popup_window = null;\n\n if (!localStorage.popupsAllowed) {\n // local storage popup field does not exist - so check to see if popup blocker is up\n popup_window = window.open(\"../App/images/spacer.gif\", \"myWindow\", \"toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=yes, width=1, height=1\");\n try {\n popup_window.focus();\n popup_window.close();\n }\n catch (e) {\n alert(\"Pop-up Blocker is enabled! Please add this site to your exception list.\");\n }\n\n // if the browser popup blocker is turned off - set the cookie anyway to be consistent\n expireObj = new Date((new Date()).getTime() + (12 * 60 * 60 * 1000));\n localStorage.setItem(\"popupsAllowed\", expireObj);\n }\n else\n {\n // local storage popup field does exist so check to see if it is out of date and if not skip the checks\n var dater = Date.parse(localStorage.popupsAllowed);\n\n if (dater < Date.parse(new Date()))\n {\n popup_window = window.open(\"../App/images/spacer.gif\", \"myWindow\", \"toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=yes, width=1, height=1\");\n try {\n popup_window.focus();\n popup_window.close();\n\n expireObj = new Date((new Date()).getTime() + (12 * 60 * 60 * 1000));\n localStorage.setItem(\"popupsAllowed\", expireObj);\n }\n catch (e) {\n alert(\"Pop-up Blocker is enabled! Please add this site to your exception list.\");\n\n expireObj = new Date((new Date()).getTime() + (12 * 60 * 60 * 1000));\n localStorage.setItem(\"popupsAllowed\", expireObj);\n }\n }\n }\n }\n }\n ;\n}]);","app.factory('sessionFormatterUtil', ['dateUtil', function (dateUtil) {\n return {\n existingSessionRanges: [\n\n ],\n formatableDates: [\n 'endDateTime',\n 'registrationEndDateTime',\n 'startDateTime'\n ],\n /**\n * Used only by the recursive _organizeSessions method\n *\n * Need to store data somewhere for the recursion part of the method.\n */\n _sorted: [],\n /**\n *\n * @param session\n * @returns {*}\n */\n formatSession: function(session) {\n return session;\n },\n /**\n *\n * @param curOffering\n * @returns {*}\n */\n formatSessions: function (curOffering) {\n var meetings = curOffering.sessions || curOffering.studentSessions;\n\n this._sorted = [];\n\n this._organizeSessions(meetings);\n\n meetings = this._sorted;\n\n var today = moment();\n\n for(var meeting in meetings) {\n if(typeof meetings[meeting] === 'function') {\n continue;\n }\n\n for(var meetingNode in meetings[meeting]) {\n if(typeof meetings[meeting][meetingNode] === 'function') {\n continue;\n }\n\n if(meetings[meeting][meetingNode] !== null && $.inArray(meetingNode, this.formatableDates) !== -1) {\n meetings[meeting][meetingNode] = dateUtil.formatDate(meetings[meeting][meetingNode]);\n\n // Find the lowest possible session in the set\n if(meetingNode === 'startDateTime' && (curOffering.lowestSessionDateForOffering === null || moment(meetings[meeting].startDateTime.original).isBefore(curOffering.lowestSessionDateForOffering.original))) {\n curOffering.lowestSessionDateForOffering = meetings[meeting].startDateTime;\n }\n\n // Find the session closest to today without going under (can be today).\n if(meetingNode === 'startDateTime' && moment(meetings[meeting].startDateTime.original).isAfter(today)) {\n if(curOffering.closestSession === null || moment(meetings[meeting].startDateTime.original).isBefore(moment(curOffering.closestSession))) {\n curOffering.closestSessionKey = parseInt(meeting, 10) + 1;\n\n curOffering.closestSession = meetings[meeting];\n }\n }\n\n // Find the highest possible session in the set\n if(meetingNode === 'endDateTime' && (curOffering.highestSessionDateForOffering === null || moment(meetings[meeting].endDateTime.original).isAfter(curOffering.highestSessionDateForOffering.original))) {\n curOffering.highestSessionDateForOffering = meetings[meeting].endDateTime;\n }\n }\n }\n\n if(typeof meetings[meeting] !== 'undefined' && meetings[meeting] !== null && typeof meetings[meeting].hoursSpent !== 'undefined' && meetings[meeting].hoursSpent !== null) {\n /**\n * Absolute biggest garbage ever. Angular requires a DATE TIME for inputs, type of time.\n */\n meetings[meeting].hoursSpent = this._round(meetings[meeting].hoursSpent, 1);\n }\n }\n\n if(curOffering.closestSession === null) {\n curOffering.closestSession = meetings[meetings.length - 1];\n\n curOffering.closestSessionKey = meetings.length;\n }\n\n curOffering.sessions = meetings;\n\n return curOffering;\n },\n _round: function(value) {\n value = value > 0 ? +((Math.round(value * 100) / 100).toFixed(2)) : 0;\n\n return value;\n },\n /**\n *\n *\n * @param sessionCreator\n * @param repeatType\n * @param repeatAmount\n * @returns {Array}\n */\n createSessionsByStandardRepeat: function (sessionCreator, offerings, repeatType, repeatAmount) {\n var session = null;\n var sessions = [];\n var offering = _.findWhere(offerings, { localId: sessionCreator.offering });\n\n var endDate = sessionCreator.endDate.moment;\n var endDateClone = null;\n var startDate = sessionCreator.startDate.moment;\n var startDateClone = null;\n var endTime = (dateUtil.parseTime(sessionCreator.endTime));\n var startTime = (dateUtil.parseTime(sessionCreator.startTime));\n\n do {\n // We set the endDateClone and startDateClone both to start date here because these are only the start and end dates of each individual session, not times, and sessions can't span multiple days so the start and end date for a session\n // will always be the same date. If endDate is used here, it will use the date of the last session, which is not what we want.\n endDateClone = moment(startDate);\n endDateClone.set({ hour: endTime.getHours(), minute: endTime.getMinutes(), second: 0, millisecond: 0 });\n\n startDateClone = moment(startDate);\n startDateClone.set({ hour: startTime.getHours(), minute: startTime.getMinutes(), second: 0, millisecond: 0 });\n \n if(startDateClone.isAfter(endDateClone)) {\n break;\n }\n\n var canCreateSession = true;\n\n if (repeatType === 'days') {\n if (sessionCreator.includeWeekdaysOnly === true) {\n var day = startDateClone.day();\n var isWeekend = (day === 6) || (day === 0);\n if (isWeekend === true) {\n canCreateSession = false;\n }\n }\n }\n\n if (canCreateSession === true) {\n session = {};\n\n session.offeringId = sessionCreator.offering;\n session.offeringName = offering.name;\n offering.includeWeekdaysOnly = sessionCreator.includeWeekdaysOnly;\n\n session.endDateTime = dateUtil.formatDate(endDateClone.toDate());\n session.startDateTime = dateUtil.formatDate(startDateClone.toDate());\n\n session.endDate = endDateClone.toDate();\n session.endTime = endTime;\n session.startDate = startDateClone.toDate();\n session.startTime = startTime;\n\n session.error = this._checkForSessionOverlap(session, offerings);\n sessions.push(session);\n }\n startDate.add(repeatAmount, repeatType);\n } while (startDate.isBefore(endDate, 'day') || startDate.isSame(endDate, 'day') );\n\n return sessions;\n },\n /**\n * Cycle over the days selected, and create sessions for each day\n *\n * @param sessionCreator\n * @returns {Array}\n */\n createSessionsByRepeatingDays: function(sessionCreator, offerings) {\n var session = null;\n var sessions = [];\n var offering = _.findWhere(offerings, { localId: sessionCreator.offering });\n\n var endDate = moment(sessionCreator.endDate.moment);\n var endDateClone = null;\n var startDate = moment(sessionCreator.startDate.moment);\n var startDateClone = null;\n\n var endTime = moment(dateUtil.parseTime(sessionCreator.endTime));\n var startTime = moment(dateUtil.parseTime(sessionCreator.startTime));\n\n var startDateDay = startDate.day();\n var dayDifference = 0;\n\n var repeatAmount = sessionCreator.repeatAmount;\n\n for(var i = 0; i < repeatAmount; i++) {\n for(var j = 0; j < sessionCreator.days.length; j++) {\n endDateClone = moment(startDate);\n startDateClone = moment(startDate);\n\n session = null;\n session = {};\n\n dayDifference = sessionCreator.days[j] - startDateDay;\n /**\n * Only skip when day difference is less than 0 AND it's the first cycle.\n *\n * E.g.: Sun/Sat selected as repeater days, but initial day is a Tuesday. Initial\n * Sunday must be ignored.\n *\n * One more will have to be added to the loop... and if last day is more\n * than start date, it will need to be omitted.\n */\n if(dayDifference < 0 && i === 0) {\n repeatAmount++;\n\n continue;\n }\n\n endDateClone = endDateClone.add(dayDifference, 'days');\n startDateClone = startDateClone.add(dayDifference, 'days');\n\n if(startDateClone.isAfter(endDate)) {\n break;\n }\n\n session.offeringId = sessionCreator.offering;\n session.offeringName = offering.name;\n offering.includeWeekdaysOnly = sessionCreator.includeWeekdaysOnly;\n\n session.endDateTime = dateUtil.formatDate(endDateClone.hours(endTime.hours()).minutes(endTime.minutes()));\n session.startDateTime = dateUtil.formatDate(startDateClone.hours(startTime.hours()).minutes(startTime.minutes()));\n\n session.endDate = endDateClone.toDate();\n session.endTime = endTime.toDate();\n session.startDate = startDateClone.toDate();\n session.startTime = startTime.toDate();\n\n session.error = this._checkForSessionOverlap(session, offerings);\n\n sessions.push(session);\n }\n\n startDate = startDate.add(1, 'weeks');\n }\n\n return sessions;\n },\n _checkForSessionOverlap: function(session, offerings) {\n var endDateTime = session.endDateTime.moment;\n var startDateTime = session.startDateTime.moment;\n\n var nextSession = null;\n\n var offering = _.find(offerings, function(offering) {\n return parseInt(offering.localId, 10) === parseInt(session.offeringId);\n });\n\n if(typeof offering.sessions === 'undefined' || offering.sessions === null || offering.sessions.length === 0) {\n return false;\n }\n\n for(var i = 0; i < offering.sessions.length; i++) {\n nextSession = offering.sessions[i];\n\n /**\n * If either the starting datetime or the ending date time falls in between an existing session, we have\n * to skip it.\n */\n if(startDateTime.isSame(nextSession.startDateTime.moment) || endDateTime.isSame(nextSession.endDateTime.moment)) {\n return true;\n } else if(startDateTime.isAfter(nextSession.startDateTime.moment) && startDateTime.isBefore(nextSession.endDateTime.moment)) {\n return true;\n } else if(endDateTime.isAfter(nextSession.startDateTime.moment) && endDateTime.isBefore(nextSession.endDateTime.moment)) {\n return true;\n }\n }\n\n return false;\n },\n /**\n *\n * @param time\n * @returns {Date|*}\n * @private\n */\n _getTimeForTimeFields: function(time) {\n time = time === 0 ? \"01:00:00\" : time;\n\n time = time.split(':');\n\n time = new Date(1970, 0, 1, time[0], time[1], time[2]);\n\n return time;\n },\n _organizeSessions: function(sessions, nextSort) {\n /**\n * 1. Check if we're dealing with an empty _sorted array. If so, let's go ahead and kick that off.\n * 2. If there is something in sorted, let's start some logic.\n * 2a. If the current value is the lowest, insert it at 0.\n * 2b. If the current value is the highest, insert it at _sorted.length - 1\n * 2c. If the current value is in between, find where to insert it.\n * 1. Loop over _sorted array\n * 2. When previous array spot is first to be lower, split array at current spot, prepend before array spot\n * and join arrays back together.\n */\n if(typeof nextSort === 'undefined') {\n this._sorted.push(sessions[0]);\n\n sessions.shift();\n\n if(typeof sessions[0] !== 'undefined') {\n this._organizeSessions(sessions, sessions[0]);\n }\n\n return;\n } else {\n var i = 0;\n\n while(sessions.length > 0) {\n switch(this._valueState(sessions[i])) {\n case 0:\n this._sorted.unshift(sessions[i]);\n\n break;\n case 1:\n this._sorted.push(sessions[i]);\n\n break;\n\n case 2:\n this._insertIntoCorrectSpot(sessions[i]);\n\n break;\n }\n\n sessions.shift();\n\n if(typeof sessions[0] !== 'undefined') {\n this._organizeSessions(sessions, sessions[0]);\n }\n\n i++;\n }\n }\n },\n _valueState: function(value) {\n if(moment(value.startDateTime).isBefore(moment(this._sorted[0].startDateTime))) {\n return 0;\n } else if(moment(value.startDateTime).isAfter(moment(this._sorted[this._sorted.length - 1].startDateTime))) {\n return 1;\n } else {\n return 2;\n }\n },\n _insertIntoCorrectSpot: function(value) {\n var curDate = null;\n var nextDate = null;\n\n var valueDate = moment(value.startDateTime);\n\n for(var i = 0; i < this._sorted.length; i++) {\n if(typeof this._sorted[i] === 'function') {\n continue;\n }\n\n i = parseInt(i, 10);\n\n curDate = moment(this._sorted[i].startDateTime);\n nextDate = moment(this._sorted[i + 1].startDateTime);\n\n if(valueDate.isAfter(curDate) && valueDate.isBefore(nextDate)) {\n this._sorted.splice(i + 1, 0, value);\n\n return;\n }\n }\n }\n };\n}]);","/** @license Copyright 2016 BAI, all rights reserved */\n/* Generate a GUID in string form from JS that is in a \nperformance-friendly format for MS SQL Server */\nvar sqlguid = (function () {\n\t/*right six bytes are derived from millisecond since 1970-01-01 UTC, will wrap\n\tto zero in year 10889 so who cares I will be dead\n\tthis is the primary sort portion of the uniqueidentifier data type for MS SQL Server, so GUIDs will\n\tbe \"mostly sorted\" so long as clocks are reasonably accurate. Prevents index\n\tfragmentation in the SQL Server database*/\n\tvar rndhex,\n\twebcrypto;\n\t/*use cryptographic random number generator if available*/\n\t/*check for browser crypto first\n\t/* use standard web Crypto API if possible */\n\tif ((typeof window === \"object\") && (typeof window.crypto === \"object\") && (typeof window.crypto.getRandomValues === \"function\")) {\n\t\twebcrypto = window.crypto;\n\t}\n\t/*look for msCrypto to handle IE11 */\n\tif ((typeof window === \"object\") && (typeof window.msCrypto === \"object\") && (typeof window.msCrypto.getRandomValues === \"function\")) {\n\t\twebcrypto = window.msCrypto;\n\t}\n\tif ((typeof webcrypto === \"object\") && (typeof webcrypto.getRandomValues === \"function\")) {\n\t\trndhex = function (bytecount) {\n\t\t\tvar a = new Uint8Array(bytecount);\n\t\t\tvar o = \"\";\n\t\t\tvar i = 0;\n\t\t\twebcrypto.getRandomValues(a);\n\t\t\t/* convert to hex string output */\n\t\t\tfor (i = 0; i < bytecount; i++) {\n\t\t\t\to += (\"0\" + a[i].toString(16)).slice(-2);\n\t\t\t}\n\t\t\treturn o;\n\t\t};\n\t}\n\t/* check for node.js */\n\telse if ((typeof process === \"object\") && (typeof process.release === \"object\") && (process.release.name === \"node\")) {\n\t\tvar nodecrypto;\n\t\ttry {\n\t\t\tnodecrypto = require('crypto');\n\t\t\trndhex = function (bytecount) {\n\t\t\t\tvar a = nodecrypto.randomBytes(bytecount);\n\t\t\t\treturn a.toString(\"hex\");\n\t\t\t};\n\t\t} catch (err) {\n\t\t\t/*we'll fall back to using Math.random */\n\t\t}\n\n\t} else if (typeof rndhex !== \"function\") {\n\t\t/* if no crypto RNG available, fallback to Math.random, which can't be trusted to\n\t\treturn more than 32 bits of entropy on each call in some browsers or runtimes.\n\t\tThis isn't great for creating GUIDs, but the time-based component of the SQL Server\n\t\toptimized GUIDs will save us from collisions here */\n\t\tif((typeof console === \"object\") && (typeof console.warn === \"function\")) {\n\t\t\tconsole.warn(\"Cryptographic APIs unavailable, falling back to Math.random\");\n\t\t}\n\t\trndhex = function (bytecount) {\n\t\t\tvar o = \"\";\n\t\t\twhile (o.length < 2 * bytecount) {\n\t\t\t\to = (\"00000000\" + Math.floor(Math.random() * 0x100000000).toString(16)).slice(-8);\n\t\t\t}\n\t\t\treturn o.slice( - (2 * bytecount));\n\t\t};\n\t}\n\t/* now set up the generating function which we will export */\n\tvar genguid = function () {\n\t\tvar guid = (\"000000000000\" + (new Date()).getTime().toString(16)).slice(-12);\n\t\t/* build up rest of guid (10 bytes) as random to prevent collisions within miliseconds */\n\t\tguid = rndhex(2) + \"-\" + guid;\n\t\tguid = rndhex(2) + \"-\" + guid;\n\t\tguid = rndhex(2) + \"-\" + guid;\n\t\tguid = rndhex(4) + \"-\" + guid;\n\t\treturn guid.toUpperCase();\n\t};\n\treturn genguid;\n})();\n\n//unit test code, uncomment to run in browser console or node.js\n// var sqlguid_test = function () {\n\t// var testcnt = 100000,\n\t// errcount = 0,\n\t// testdata = (new Array(testcnt)),\n\t// x = \"\",\n\t// i = 0,\n\t// st = (new Date()).getTime(),\n\t// et;\n\t// for (i = 0; i < testcnt; i++) {\n\t\t// x = sqlguid();\n\t\t// testdata[i] = x; \n\t// }\n\t// et = (new Date()).getTime();\n\t// testdata.sort();\n\t// for (i = 1; i < testcnt; i++) {\n\t\t// if (testdata[i] === testdata[i - 1]) {\n\t\t\t// console.error(\"ERROR duplicate GUID encountered: \" + testdata[i]);\n\t\t\t// errcount += 1;\n\t\t// }\n\t\t// if (testdata[i].length !== 36) {\n\t\t\t// console.error(\"ERROR GUID not 36 characters: \" + testdata[i]);\n\t\t\t// errcount += 1;\n\t\t// }\n\t// }\n\t// if (errcount === 0) {\n\t\t// console.log(\"SUCCESS, generated \"+testcnt+\" unique GUIDs at \" + Math.round((testcnt * 1000 / (et - st)), 0).toString() + \" GUID/sec\");\n\t// }\n\t// return errcount;\n// };\n// console.log(\"one time test : \" + sqlguid());\n// sqlguid_test();\n","/**\n * Class to generalize and abstract how all errors should be piped to the front-end.\n */\napp.factory('successDisplayerUtil', [function() {\n return {\n create: function() {\n var successDisplayer = function() {\n this.code = 200;\n this.message = null;\n this.neverHide = false;\n this.thrown = false;\n\n this.reset = function() {\n this.code = 200;\n this.message = null;\n this.neverHide = false;\n this.thrown = false;\n };\n\n this.set = function(message, neverHide) {\n this.message = message;\n this.neverHide = neverHide;\n this.thrown = true;\n };\n };\n\n return new successDisplayer();\n }\n };\n}]);","app.factory('urlParamsUtil', ['$location', function urlParamsUtil($location) {\n var _this = this;\n\n _this.queries = [];\n\n /**\n * Add a key value pair to be generated into a GET param\n *\n * @param key\n * @param value\n * @private\n */\n _this._add = function(key, value) {\n var query = key + '=' + value;\n\n if(jQuery.inArray(query, _this.queries) > -1) {\n return;\n }\n\n _this.queries.push(query);\n };\n\n /**\n * Create the final query string\n *\n * @returns {*}\n * @private\n */\n _this._create = function() {\n var query = '';\n\n if(_this.queries.length === 0) {\n return query;\n }\n\n query = _this.queries.join('&');\n\n return '?' + query;\n };\n\n return {\n add: _this._add,\n create: _this._create,\n delete: _this._delete,\n request: _this._request\n };\n}]);","/* This page is a demo page for various components related to the premiumAdmin */\n\napp.factory('Assignments_AdminOverride', ['BreadcrumbsService', 'UsersService', 'OrganizationsService', 'CatalogService', '$http', '$routeParams', 'RoleMapsMixin', '$injector', '$filter', 'errorDisplayerUtil', '$route', 'CoursesService', 'OrgFunctions', 'AssignmentsService', '$location', 'TypeMapsMixin', 'SettingsService', '$rootScope', 'DocumentService', '$sce', 'WizardHandler',\n function (BreadcrumbsService, UsersService, OrganizationsService, CatalogService, $http, $routeParams, RoleMapsMixin, $injector, $filter, errorDisplayerUtil, $route, CoursesService, OrgFunctions, AssignmentsService, $location, TypeMapsMixin, SettingsService, $rootScope, DocumentService, $sce, WizardHandler) {\n return function ($scope) {\n var _this = this;\n\n $scope.defaultHeader = true; // This Sets the page to full width of the screen.\n $scope.hideCatalogSearch = true;\n /* This will make the navigation tab active on certain page */\n $scope.activeTab = 'tab-active-class';\n //Need an obj reference to pass scope to ng-include attr in html.\n $scope.tab2_Options = {};\n $scope.contentSearch = \"assignmentsSearch.name\";\n \n /* TODO: Training Insights set to false originally, will not be addressed until we tackle Go-Live stories */\n $scope.showTrainingInsights = false;\n\n $scope.rows = Array();\n\n _this.allCoursesData = Array(); // Stores a list of all courses from the server\n\n $scope.tab2_Options.baiCatalogTreeFilter = \"\";\n $scope.baiCatalogIsLoading = true;\n $scope.customCatalogIsLoading = true;\n $scope.rowsAreLoading = true;\n\n $scope.homeAction = function () {\n $scope.homeTemplate = 'app/templates/assignments/home/admin.html';\n\n _this.baiCatalogCta();\n _this.customCatalogCta();\n };\n\n $scope.baiCatalogError = {};\n $scope.baiCatalogOptions = {};\n $scope.baiCatalogOptions.initiallyOpened = true;\n $scope.baiCatalogError.error = errorDisplayerUtil.create();\n $scope.baiCatalogTreeTitle = \"BAI Catalog\";\n\n /* Used to display organization rows / selected row in the dropdown.\n * These exist because the dropdown selected organization\n * needs to display it's name differently than the list\n * of orgs in the dropdown list.\n *\n * Normally we can just use obj.name like every other dropdown.\n */\n $scope.orgRowDisplayer = function (org) {\n var orgName = \"\";\n\n for (var orgPathIndex in org) {\n orgName = org[orgPathIndex].name;\n }\n\n return orgName;\n };\n\n $scope.selectedOrgDisplayer = function (org) {\n if (!org) {\n return '';\n }\n\n // get the last org path in the org array because it's a path\n // See OrgFunctions create org hierarchy list\n\n return org[org.length - 1].name;\n };\n\n\n _this.baiCatalogCta = function () {\n $scope.baiCatalogError.error.reset();\n\n _this.allCourses();\n var baiCatalogPromise = CatalogService.getBaiCatalogData();\n\n return baiCatalogPromise.then(function (success) {\n _this.baiCatalogPromiseData = success;\n $scope.baiCatalogData = success.formattedCatalogTreeData;\n $scope.baiCatalogIsLoading = false;\n\n }, function (failure) {\n $scope.baiCatalogIsLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n\n $scope.baiCatalogError.error.setError(errorCode, message);\n });\n };\n\n $scope.assignmentTableError = {};\n $scope.assignmentTableError.error = errorDisplayerUtil.create();\n\n _this.allCourses = function () {\n $scope.assignmentTableError.error.reset();\n var allCoursesData = CoursesService.getCoursesForOrg();\n return allCoursesData.then(function (success) {\n $scope.rowsAreLoading = false;\n $scope.rows = success;\n\n _this.allCoursesData = success;\n\n if (typeof $scope.edit === 'undefined') {\n $scope.edit = {};\n }\n $scope.manageCourse.categoryRows = _this.allCoursesData;\n\n /* Compose a list of course codes so that\n * users don't create courses with codes\n * that already exist. on step 2 of the wizard\n */\n $scope.courseCodes = _.uniq(_.map(_this.allCoursesData, function (row) { return row.code; }));\n }, function (failure) {\n $scope.baiCatalogIsLoading = false;\n $scope.rowsAreLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.assignmentTableError.error.setError(errorCode, message);\n });\n };\n\n\n /* This gets called when you click on any node in the tree.\n * Filter the items on the right when you click on the node\n */\n $scope.baiCatalogNodeClick = function (item) {\n if (item === \"root\") {\n $scope.rows = _this.allCoursesData;\n } else {\n _this.coursesArray = [];\n $scope.rows = [];\n var filteredCoursesFromCatalog = filterRowsByCatalogId(item);\n /* There might be some courses which may be associated to multiple sub-categories.\n * Its better to remove all duplicates and pass it to UI or else ng-repeat will\n * throw errors. (Error: ngRepeat:dupes Duplicate Key in Repeater)\n */\n $scope.rows = CatalogService.removeDuplicates(mapCatalogCoursesToCourseDetails(filteredCoursesFromCatalog), \"id\");\n }\n };\n\n var filterRowsByCatalogId = function (node) {\n var catalogCoursesData = _this.baiCatalogPromiseData.formattedCoursesData;\n var nodeId = node.nodeId;\n _.each(catalogCoursesData, function (course) {\n if (course.parentId === nodeId) {\n _this.coursesArray.push(course);\n }\n });\n\n if (node.nodes) {\n _.each(node.nodes, function (nodeSubset) {\n filterRowsByCatalogId(nodeSubset);\n });\n }\n\n return _this.coursesArray;\n };\n\n /* the baiCatalog returns the catalog Taxanomy and courses related \n * to the sub categories too. But the course object doesnt contain\n * all the required properties. so inorder to map the courses from \n * catalog api to get all courses api. we run this method to map.\n */\n var mapCatalogCoursesToCourseDetails = function (arr) {\n var displayCourseList = [];\n\n _.each(arr, function (elem) {\n _.each(_this.allCoursesData, function (course) {\n if (course.id === elem.courseId) {\n displayCourseList.push(course);\n }\n });\n });\n\n return displayCourseList;\n };\n\n $scope.customCatalogError = {};\n $scope.customCatalogOptions = {};\n $scope.customCatalogError.error = errorDisplayerUtil.create();\n $scope.customCatalogTreeTitle = \"Custom Catalog\";\n $scope.customCatalogOptions.initiallyOpened = false;\n\n _this.customCatalogCta = function () {\n $scope.customCatalogIsLoading = false;\n var errorCode = '404';\n var message = 'The method or operation is not implemented.';\n $scope.customCatalogError.error.setError(errorCode, message);\n };\n\n /* This makes coloumns of a table sortables */\n $scope.propertyName = 'name';\n $scope.reverse = false;\n\n $scope.sortBy = function (propertyName) {\n $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;\n $scope.propertyName = propertyName;\n };\n\n $scope.property = \"$\";\n $scope.changeFilter = function (property) {\n if (property === \"all\") {\n $scope.property = \"$\";\n } else {\n $scope.property = property;\n }\n };\n\n /* This will check all the rows in the table in that instance */\n /// TO DO //\n $scope.selectAll = {};\n $scope.checkAll = function () {\n _.each($scope.rows, function (row) {\n row.select = $scope.selectAll.checked;\n });\n };\n\n /********* EDIT ASSIGNMENT *******/\n $scope.edit = {};\n $scope.edit.course = {};\n $scope.edit.error = errorDisplayerUtil.create();\n $scope.edit.isLoading = false;\n $scope.edit.selectedCourseCategory = null;\n\n\n /* Used to display category rows / selected category in the dropdown.\n * These exist because the dropdown selected organization\n * needs to display it's name differently than the list\n * of orgs in the dropdown list.\n *\n * Normally we can just use obj.name like every other dropdown.\n */\n $scope.edit.rowDisplayer = function (category) {\n var categoryPathArray = [];\n\n for (var categoryPathIndex in category) {\n categoryPathArray.push(category[categoryPathIndex].name);\n }\n\n return categoryPathArray.join('>');\n };\n\n $scope.edit.selectedDisplayer = function (category) {\n if (!category) {\n return '';\n }\n\n // get the last category path in the category array because it's a path\n // See OrgFunctions create category hierarchy list\n return category[category.length - 1].name;\n };\n\n // $scope.edit.form = {};\n\n // $scope.edit.submit\n\n $scope.edit.changeCommonDates = function () {\n var startDate = $scope.edit.course.displayStart;\n var endDate = $scope.edit.course.displayEnd;\n\n if ((startDate !== null && endDate !== null) || (startDate === null && endDate === null)) {\n if (startDate > endDate) {\n $scope.edit.form.dateRangeError = true;\n\n return;\n } else {\n $scope.edit.form.dateRangeError = false;\n }\n }\n if (endDate === null) {\n $scope.edit.form.dateRangeError = false;\n }\n };\n\n $scope.editAction = function () {\n $scope.homeTemplate = 'app/templates/assignments/edit/admin.html';\n\n $scope.edit.isLoading = true;\n $scope.edit.error.reset();\n\n var courseId = parseInt($route.current.params.param.split('/')[0]);\n // Load the catalog data & then try to find the course to edit\n _this.allCourses().then(function (success) {\n $scope.edit.course = _.filter(_this.allCoursesData, function (courseObj) {\n if (courseObj.id === courseId) {\n return true;\n }\n return false;\n });\n\n if ($scope.edit.course.length === 0) {\n // trigger error here\n var errorCode = '404';\n var message = \"There's no course under that ID\";\n $scope.edit.error.setError(errorCode, message);\n $scope.edit.isLoading = false;\n return;\n }\n\n $scope.edit.course = $scope.edit.course[0];\n $scope.edit.course.typeFullName = TypeMapsMixin.getFullAssignmentTypeName($scope.edit.course.type);\n\n $scope.edit.course.BAIOnly = true;\n\n /* If this course already has a catalogId, try to find that category\n * corresponding to the catalogId in the list of courses.\n * If we don't find it, make the selected course category null */\n if ($scope.edit.course.catalogId !== 0) {\n var potentialCourseCategory = _.filter($scope.manageCourse.categoryRows, function (categoryRow) {\n return (categoryRow.id === $scope.edit.course.catalogId);\n });\n if (potentialCourseCategory.length > 0) {\n $scope.edit.selectedCourseCategory = potentialCourseCategory[0];\n }\n } else {\n $scope.edit.selectedCourseCategory = null;\n }\n\n //var course = AssignmentsService.asdf();\n var course = AssignmentsService.fetchSingleCourse($scope.edit.course.id);\n course.then(function (success) {\n var extra = success;\n $scope.edit.course.maxEnrollmentAttempts = extra.maxEnrollmentAttempts;\n\n if ($scope.edit.course.displayEnd) {\n $scope.edit.course.displayEnd = moment(extra.displayEnd).toDate();\n } else\n $scope.edit.course.displayEnd = null;\n\n $scope.edit.course.displayStart = moment(extra.displayStart).toDate();\n $scope.edit.course.isManagerApprovalRequired = extra.isManagerApprovalRequired;\n $scope.edit.course.BAIOnly = true;\n\n $scope.edit.isLoading = false;\n }, function (error) {\n var errorCode = error.ErrorCode;\n var message = error.ErrorMessage;\n $scope.edit.error.setError(errorCode, message);\n\n $scope.edit.isLoading = false;\n });\n }, function (error) {\n var errorCode = error.ErrorCode;\n var message = error.ErrorMessage;\n $scope.edit.error.setError(errorCode, message);\n\n $scope.edit.isLoading = false;\n });\n _this.customCatalogCta();\n };\n\n $scope.edit.save = function (course) {\n var tempCourse = angular.copy(course);\n\n /* If the user selected a course category\n * put the course we're editing under that ID */\n if ($scope.edit.selectedCourseCategory) {\n tempCourse.catalogId = $scope.edit.selectedCourseCategory.id;\n }\n\n tempCourse.displayStart = moment(tempCourse.displayStart).toDate();\n\n if (tempCourse.displayEnd) {\n tempCourse.displayEnd = moment(tempCourse.displayEnd).toDate();\n } else {\n tempCourse.displayEnd = null;\n }\n $scope.customCatalogOptions.initiallyOpened = false;\n\n $scope.edit.isLoading = true;\n\n CoursesService.editCourse(tempCourse).then(function (success) {\n $scope.baiCatalogTreeFilter = \"\";\n $scope.baiCatalogIsLoading = true;\n $scope.customCatalogIsLoading = true;\n $scope.rowsAreLoading = true;\n\n $scope.homeAction();\n\n $location.path('assignments/home/');\n $scope.edit.isLoading = false;\n }, function (error) {\n $scope.edit.isLoading = false;\n\n var errorCode = error.ErrorCode;\n var message = error.ErrorMessage;\n $scope.edit.error.setError(errorCode, message);\n });\n };\n /********* CREATE ASSIGNMENT ACTION **********/\n ///////// GLOBAL VARIABLES\n // you're a wizard harry!\n $scope.create = {};\n\n $scope.create.ASSIGNMENT_TYPE_ENUM = {\n 'WBT': 'wbt',\n 'ILT': 'ilt',\n 'COURSEGROUP': 'courseGroup',\n 'TASK': 'task',\n 'EVALUATION': 'evaluation',\n 'SURVEY': 'survey',\n 'ASSESSMENT': 'assessment'\n };\n\n $scope.create.ASSIGNMENT_TYPE_TITLE_ENUM = {\n 'wbt': 'Web Based Training',\n 'ilt': 'Instructor Led Training',\n 'courseGroup': 'Course Group',\n 'task': 'Task',\n 'evaluation': 'Evaluation',\n 'survey': 'Survey',\n 'assessment': 'Assessment'\n };\n\n $scope.create.currentAssignmentType = null;\n $scope.create.formData = {};\n $scope.create.error = errorDisplayerUtil.create();\n $scope.create.isLoading = false;\n /* stores the course returned by the server\n * when we create a course on step 2 */\n $scope.create.createdCourse = null;\n $scope.create.documentList = [];\n\n //////// WATCH STATEMENTS\n /* Disable the validation on the max enrollment attempts field\n * if enrollment attempts are unlimited */\n $scope.$watch('create.maxEnrollmentAttemptsIsUnlimited', function (maxEnrollmentAttemptsIsUnlimited) {\n if (maxEnrollmentAttemptsIsUnlimited) {\n $scope.create.enrollmentAttemptsRegex = new RegExp('');\n $scope.create.formData.maxEnrollmentAttempts = 0;\n } else {\n $scope.create.enrollmentAttemptsRegex = /^\\d+$/;\n }\n });\n\n $scope.$watch('create.nonScoring', function (nonScoring) {\n if ($scope.create.nonScoring) {\n $scope.create.formData.score = null;\n }\n });\n\n $scope.create.selectAssignment = function (assignmentType) {\n // Assigning this twice. Should probably refactor.\n $scope.create.currentAssignmentType = assignmentType;\n $scope.create.formData.type = assignmentType;\n\n $scope.create.currentAssignmentTypeFullName = $scope.create.ASSIGNMENT_TYPE_TITLE_ENUM[assignmentType];\n\n // Set a default value for the course code, format like 'wbt20170714141522923' with time including ms to encourage uniqueness\n $scope.create.formData.code = ($scope.create.currentAssignmentType + (new Date()).toISOString().replace(/[^0-9]/g,''));\n\n WizardHandler.wizard('Course').next();\n };\n\n $scope.create.goBackToStep2 = function () {\n delete $scope.create.formData.id;\n WizardHandler.wizard('Course').previous();\n };\n\n $scope.create.hideModal = function () {\n jQuery('#courseCreateSuccessModal').modal('hide');\n $location.url('assignments/home/');\n };\n\n _this._attachFiles = function (courseId, courseType, scormPackages, documentList) {\n var filesToUpload = [];\n\n for (var i = 0; i < scormPackages.length; i += 1) {\n filesToUpload.push(DocumentService.uploadScormPackage(scormPackages[i], courseId));\n }\n\n for (var j = 0; j < documentList.length; j += 1) {\n // Uploading a document from browser\n if (documentList[j].fileOrUrl === 'file' && !documentList[j].fromRepo) {\n filesToUpload.push(DocumentService.uploadDocument(documentList[j].fileObject, courseId, false));\n }\n\n // Attaching document from repository\n if (documentList[j].fileOrUrl === 'file' && documentList[j].fromRepo) {\n filesToUpload.push(DocumentService.attachDocumentFromRepositoryToCourse(documentList[j].id, courseId));\n }\n\n // Attaching a URL\n if (documentList[j].fileOrUrl === 'url') {\n filesToUpload.push(DocumentService.attachUrlToCourse(documentList[j].name, courseId, false));\n }\n }\n\n return Promise.all(filesToUpload);\n };\n\n $scope.create.addScormPackage = function ($files) {\n $scope.isNotZipFile = false;\n\n if ($files.length === 0) {\n return;\n }\n\n var file = $files[0];\n\n if (file.type !== 'application/zip') {\n $scope.isNotZipFile = true;\n return;\n }\n\n file.uniqueId = Date.now();\n $scope.create.scormPackages.push(file);\n };\n\n /* Called when you press the X button on the gray box\n * in the scorm package list */\n $scope.create.removeScormPackage = function (fileToRemove) {\n $scope.create.scormPackages = _.filter($scope.create.scormPackages, function (file) {\n return (file.uniqueId !== fileToRemove.uniqueId);\n });\n };\n\n /* Called by $scope.createAction */\n _this._clearCourseCreateForm = function () {\n $scope.create.formData = {};\n $scope.create.scormPackages = [];\n $scope.create.documentList = [];\n $scope.create.formData.courseList = [];\n $scope.create.formData.displayStart = new Date();\n\n // angular hack to make form on detail page validate on page load\n $scope.create.formData.passingScore = null;\n\n /* This will get set once because we load sysSettings in app.run\n * make sure we default make enrollment attempts to the system setting */\n $rootScope.$watch('sysSettings', function (sysSettings) {\n if (typeof sysSettings.enrollmentAttempts !== 'undefined') {\n if (sysSettings.enrollmentAttempts === 0) {\n $scope.create.formData.maxEnrollmentAttempts = null;\n $scope.create.maxEnrollmentAttemptsIsUnlimited = true;\n } else {\n $scope.create.formData.maxEnrollmentAttempts = sysSettings.enrollmentAttempts;\n $scope.create.maxEnrollmentAttemptsIsUnlimited = false;\n }\n }\n });\n\n $scope.create.enrollmentAttemptsRegex = /^\\d+$/;\n };\n\n _this._showCreateError = function (serverErrorResponse) {\n var errorCode = serverErrorResponse.StatusCode;\n var message = serverErrorResponse.ErrorMessage;\n $scope.create.error.setError(errorCode, message);\n };\n\n _this._showWizardSuccessScreen = function () {\n $scope.create.isLoading = false;\n\n $scope.create.error.reset();\n\n jQuery('#courseCreateSuccessModal').modal();\n\n _this._clearCourseCreateForm();\n };\n\n _this._showWizardErrorScreen = function (serverErrorResponse) {\n $scope.create.isLoading = false;\n _this._showCreateError(serverErrorResponse);\n };\n\n /* Used on course group detail page\n * when the user presses enter on the input field\n * adds an extra course to the course groups list */\n $scope.create.addCourseToCourseGroupList = function () {\n var course = _.filter(_this.allCoursesData, function (course) {\n return course.name === $scope.create.selectedCourse;\n });\n\n if (course.length > 0) {\n $scope.create.selectedCourse = '';\n\n course = course[0];\n var alreadyExists = _.filter($scope.create.formData.courseList, function (_course) {\n return (course.id === _course.id);\n });\n\n if (alreadyExists.length > 0) {\n return;\n }\n\n course.uniqueId = Date.now();\n\n $scope.create.formData.courseList.push(course);\n }\n };\n\n /* Called when you press the X button on the gray box\n * in the course group list */\n $scope.create.removeCourseFromCourseGroupList = function (courseToRemove) {\n $scope.create.formData.courseList = _.filter($scope.create.formData.courseList, function (course) {\n return (course.uniqueId !== courseToRemove.uniqueId);\n });\n };\n\n // Used on the common properties pagge\n $scope.create.createCourse = function () {\n $scope.create.isLoading = true;\n $scope.create.error.reset();\n\n var newCourse = CoursesService.createCourse($scope.create.formData);\n newCourse.then(function (success) {\n $scope.create.isLoading = false;\n $scope.create.formData = success;\n WizardHandler.wizard('Assignment').next();\n\n /* Create these here so angular can validate\n * forms on step3 */\n if ($scope.create.formData.type === 'courseGroup') {\n $scope.create.formData.courseList = [];\n }\n if ($scope.create.formData.type === 'wbt') {\n $scope.create.formData.score = null;\n }\n }, function (error) {\n $scope.create.isLoading = false;\n _this._showCreateError(error);\n });\n };\n\n // Only used on the details page\n $scope.create.addExtraCourseProperties = function () {\n // create the course object\n // var courseObj = {};\n\n $scope.create.isLoading = true;\n\n $scope.create.error.reset();\n var updatedCourse = CoursesService.editCourse($scope.create.formData);\n updatedCourse.then(function (success) {\n var filesToUpload = _this._attachFiles($scope.create.formData.id, $scope.create.currentAssignmentType, $scope.create.scormPackages, $scope.create.documentList);\n\n filesToUpload.then(function (success) {\n _this._showWizardSuccessScreen();\n }, function (error) {\n _this._showWizardErrorScreen(error);\n });\n }, function (error) {\n _this._showWizardErrorScreen(error);\n });\n };\n\n $scope.createAction = function () {\n $scope.homeTemplate = 'app/templates/assignments/create/admin.html';\n $scope.wizardTitle = \"Add New Assignment\";\n\n _this._clearCourseCreateForm();\n\n _this.baiCatalogCta();\n _this.customCatalogCta();\n };\n\n };\n }\n]);\n","app.factory('Courses_AdminOverride', ['$injector', '$location' , '$q', '$filter', '$rootScope', '$route', '$timeout', '$window', '$uibModal', 'CatalogService', 'CoursesService', 'DocumentService', 'LocationsService', 'OfferingsService', 'RosterService', 'SettingsService', 'UsersService', 'dateUtil', 'messagingDisplayerUtil', 'sessionFormatterUtil', 'WizardHandler', 'TreeHelpers', 'sortService', 'CategoriesService', 'SkillService',\n function ($injector, $location , $q, $filter, $rootScope, $route, $timeout, $window, $uibModal, CatalogService, CoursesService, DocumentService, LocationsService, OfferingsService, RosterService, SettingsService, UsersService, dateUtil, messagingDisplayerUtil, sessionFormatterUtil, WizardHandler, TreeHelpers, sortService, CategoriesService, SkillService) {\n return function ($scope) {\n var _this = this;\n\n $scope.requiredOptions = [{\n \"name\": \"Yes\",\n \"value\": true\n }, {\n \"name\": \"No\",\n \"value\": false\n }]; \n\n $scope.defaultHeader = true; // This Sets the page to full width of the screen.\n $scope.hideCatalogSearch = true;\n\n /* This will make the navigation tab active on certain page */\n $scope.activeTab = 'tab-active-class';\n\n /*This will route users to the appropiate user manual based on active tab*/\n $scope.userManualHref = 'https://ld-connect.bai.org/learning-manager/training-administrator-user-manual/#Content';\n\n //Need an obj reference to pass scope to ng-include attr in html.\n $scope.tab2_Options = {};\n $scope.contentSearch = \"assignmentsSearch.name\";\n /* Training Insights access determined by the organization settings */\n var sett = SettingsService.getSettings().then(function (success) {\n $scope.IsRusticiFlag = success.features.sysPropRusticiAccess;\n $scope.showTrainingInsights = SettingsService.isTrainingInsightsEnabled();\n $scope.showCareerPath = SettingsService.isCareerPathEnabled();\n $scope.isDocumentsEnabled = SettingsService.isDocumentsEnabled();\n _this.shouldShowDocuments();\n });\n\n $scope.rows = Array();\n\n _this.originalRowData = Array(); // stores the original data from the response\n\n $scope.tab2_Options.baiCatalogTreeFilter = \"\";\n $scope.baiCatalogIsLoading = true;\n $scope.rowsAreLoading = true;\n\n _this.currentCourseSet = [];\n $scope.customCatalogData = [];\n\n _this.params = $route.current.params;\n /* This makes coloumns of a table sortables */\n $scope.propertyName = 'name';\n $scope.reverse = false;\n\n $scope.sortBy = function (propertyName) {\n $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;\n $scope.propertyName = propertyName;\n\n _this.setStartandEndIndex();\n };\n\n $scope.general = {};\n $scope.general.search = null;\n $scope.general.typeaheadMinLength = 3;\n $scope.general.typeaheadWaitTime = 800;\n\n $scope.sequenceCourseSave = false;\n $scope.courseactivetab = false;\n $scope.showcoursesactivetab = true;\n $scope.general.filterBySearch = function () {\n var searchTerm = $scope.general.search;\n var rows = angular.copy(_this.allCoursesData);\n\n var searchProp = $scope.property;\n var filtered = {};\n var filterExpression = {};\n filterExpression[searchProp] = searchTerm;\n switch (searchProp) {\n case 'displayStart':\n filtered = $filter('filter')(rows, { displayStart: { fullDate: searchTerm } });\n break;\n case 'displayEnd':\n filtered = $filter('filter')(rows, { displayEnd: { fullDate: searchTerm } });\n break;\n default:\n //filtered = $filter('filter')(rows, filterExpression);\n filtered = $filter('filter')(rows, function (rows) {\n if (searchProp === \"name\")\n return (rows.name.toLowerCase()).indexOf((searchTerm.toLowerCase()) || '') !== -1;\n else if (searchProp === \"code\")\n return (rows.code.toLowerCase()).indexOf((searchTerm.toLowerCase()) || '') !== -1;\n else if (searchProp === \"type\")\n return (rows.type.toLowerCase()).indexOf((searchTerm.toLowerCase()) || '') !== -1;\n else\n return ((rows.name.toLowerCase()).indexOf((searchTerm.toLowerCase()) || '') !== -1 ||\n (rows.code.toLowerCase()).indexOf((searchTerm.toLowerCase()) || '') !== -1 ||\n (rows.type.toLowerCase()).indexOf((searchTerm.toLowerCase()) || '') !== -1);\n });\n break;\n }\n\n _this.calculatePages(filtered);\n _this.setStartandEndIndex();\n $scope.rows = filtered.slice($scope.startIndex, $scope.endIndex);\n };\n\n /**\n * Generic controller level controls\n * @type {{}}\n */\n $scope.courses = {};\n $scope.courses.isILTEnabled = false;\n $scope.courses.isDocumentsEnabled = false;\n\n /**\n * Subscriber to ensure that we set views properly\n *\n * Note: this is not a great pattern but it's the only way to truly do away with race conditions, since\n * either the service may not be done or the template my not be loaded\n */\n $scope.$watch(function () {\n return $rootScope.sysSettings;\n }, function () {\n $scope.courses.isILTEnabled = SettingsService.isILTEnabled();\n $scope.courses.isDocumentsEnabled = window.customDocumentsEnabled;\n });\n\n $scope.property = \"$\";\n $scope.changeFilter = function (property) {\n if (property === \"all\") {\n $scope.property = \"$\";\n } else {\n $scope.property = property;\n }\n };\n\n $scope.baiCatalogError = {};\n $scope.baiCatalogOptions = {};\n $scope.baiCatalogError.error = messagingDisplayerUtil.create();\n $scope.baiCatalogTreeTitle = \"BAI Catalog\";\n $scope.baiCatalogOptions.initiallyOpened = true;\n\n $scope.assignmentTableError = {};\n $scope.assignmentTableError.error = messagingDisplayerUtil.create();\n\n $scope.home = {};\n\n $scope.homeAction = function () {\n $scope.home.page = 1;\n $scope.home.limit = 100;\n $scope.home.total = 0;\n $scope.home.maxVisiblePages = 10;\n\n $scope.homeTemplate = 'app/templates/courses/home/admin.html';\n /* this extremely small timeout is for IE - makes the courses home page load with loading bars and then call the api\n otherwise it appears as if the courses tab was not selected\n */\n setTimeout(function () {\n _this.allCourses();\n }, 2);\n };\n\n $scope.home.nextPage = function () {\n var start = ($scope.home.page * $scope.home.limit) - $scope.home.limit;\n\n var copy = angular.copy(_this.currentCourseSet);\n\n $scope.rows = copy.splice(start, $scope.home.limit);\n };\n\n $scope.manageCourse = {};\n $scope.manageCourse.error = messagingDisplayerUtil.create();\n $scope.manageCourse.isLoading = false;\n $scope.manageCourse.success = messagingDisplayerUtil.create();\n\n $scope.manageCourse.onSessionsTab = false;\n $scope.manageCourse.onOfferingsTab = false;\n $scope.manageCourse.onRosterTab = false;\n\n $scope.manageCourse.showDocumentURLInput = false;\n $scope.manageCourse.showDocumentFileInput = false;\n\n $scope.editCourse = {};\n $scope.editCourse.error = messagingDisplayerUtil.create();\n $scope.editCourse.isLoading = false;\n $scope.availableSkills = null;\n $scope.prereqsToInsert = []; /* holds an array of all courseIDs for prereqs that were added or removed in a session */\n $scope.prereqsToRemove = [];\n $scope.editAction = function () {\n $scope.homeTemplate = 'app/templates/courses/edit/admin.html';\n $scope.manageCourse.isLoading = true;\n $scope.manageCourse.course.iModifyLoading = false;\n $scope.manageCourse.course.previewStatus = {};\n\n var params = $route.current.params.param.split('/');\n var courseId = params[0];\n\n var coursePromises = [CoursesService.getSingleCourse(courseId), SkillService.fetch(), CategoriesService.fetch(null, false, true)];\n $q.all(coursePromises).then(function (success) {\n $scope.manageCourse.course = success[0];\n $scope.manageCourse.childrenUpdated = false;\n\n if ($scope.manageCourse.course.normalizedProductType === \"document\") {\n var documentCourseId = $scope.manageCourse.course.baiOnly ? $scope.manageCourse.course.parentBAICourseId : courseId;\n _this.getDocumentName(documentCourseId, $scope.manageCourse.course.type);\n $scope.DescriptionSelectModalTitle = \"Enter a document description\";\n }\n if ($scope.manageCourse.course.normalizedProductType === \"course\" || $scope.manageCourse.course.type === 'ilt' || $scope.manageCourse.course.type === 'wbt' || $scope.manageCourse.course.type === 'assessment' ||$scope.manageCourse.course.type === 'courseGroup' || $scope.manageCourse.course.type === 'courseGroupCertification' || $scope.manageCourse.course.type === 'task' || $scope.manageCourse.course.type === 'evaluation'||$scope.manageCourse.course.type === 'survey' || $scope.manageCourse.course.type === 'courseGroupCurricula' || $scope.manageCourse.course.type === 'careerPath' ) {\n $scope.DescriptionSelectModalTitle = \"Enter a course description\";\n }\n\n if ($scope.manageCourse.course.type === \"wbt\" || ($scope.manageCourse.course.normalizedProductType === \"document\" && !DocumentService.isDirectLaunchType($scope.manageCourse.course.type))) {\n var rusticiCourseId = $scope.manageCourse.course.parentBAICourseId !== null ? $scope.manageCourse.course.parentBAICourseId : courseId;\n _this.getPreviewStatus(rusticiCourseId, $scope.manageCourse.course.baiOnly);\n }\n\n $scope.availableSkills = success[1];\n if ($scope.manageCourse.course.type !== 'ilt') {\n // All other cours types only have course details, only ILTs have more\n $scope.manageCourse.isLoading = false;\n }\n $scope.manageCourse.cancelMessage = \"Are you sure want to cancel?\";\n _this.getSecondaryDataForEdit();\n _this.setEvaluations();\n\n if ($scope.manageCourse.course.type === 'ilt' || $scope.manageCourse.course.type === 'wbt') {\n _this.getCoursePrerequisits();\n }\n if ($scope.manageCourse.course.type === 'wbt') {\n // even if we do not find record in manifest table it should be default selected to SCORM\n if ($scope.manageCourse.course.shellType === null) {\n $scope.manageCourse.course.shellType = 1;\n }\n _this.getContentTypes();\n }\n\n $scope.showcoursesactivetab = false;\n\n //if the course is a custom course - configure the category selects\n if (!$scope.manageCourse.course.baiOnly) {\n var filterby = $scope.manageCourse.course.productType === 'Document' ? 'document' : 'course';\n if (filterby !== 'document') {\n success[2] = CategoriesService.RemoveDocumentPolicies(success[2]);\n }\n $scope.taxonomyOptions = $filter('filter')(success[2], { categoryType: filterby });\n $scope.subcategoryDisabled = true;\n $scope.createUniqueCategoryList();\n\n //pre-fill selects if a catalog ID is already selected\n if ($scope.manageCourse.course.catalogId !== null) {\n\n $scope.selectCategory();\n\n }\n }\n\n }, function (failure) {\n $scope.manageCourse.isLoading = false;\n\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n\n $scope.manageCourse.error.setError(errorCode, message);\n });\n };\n\n _this.getSecondaryDataForEdit = function () {\n _this.setSecondaryProperties($scope.manageCourse.course.type);\n switch ($scope.manageCourse.course.type) {\n case 'ilt':\n $scope.manageCourse.getCourseOfferings();\n break;\n }\n };\n\n $scope.coursePrerequisitsOnLoad = [];\n _this.getCoursePrerequisits = function () {\n var prereqCall = CoursesService.getCoursePrereqs($scope.manageCourse.course.id);\n prereqCall.then(function (success) {\n $scope.manageCourse.course.prereq = success;\n $scope.coursePrerequisitsOnLoad = angular.copy(success);\n });\n };\n\n _this.getContentTypes = function () {\n var contentTypes = CoursesService.getContentTypes();\n contentTypes.then(function (success) {\n $scope.courseContentTypes = success;\n });\n };\n\n $scope.launchUrl = function (url) {\n //SLY-3933\n _this.updatePassingScorelaunchUrl(url);\n\n };\n\n _this.getPreviewStatus = function (courseID, baiOnly) {\n var previewStatus = CoursesService.getPreviewStatus(courseID);\n previewStatus.then(function (success) {\n var status = {};\n status.message = null;\n status.viewMore = false;\n status.ready = false;\n status.processing = false;\n\n if (success !== null) {\n if (success.statusID === 1 || success.statusID === 4) {\n if ($scope.manageCourse.course.type === \"wbt\") {\n status.message = 'Notice - Your course is still being processed, please wait and check back later.';\n } else {\n status.message = 'Notice - Your document is still being processed, please wait and check back later.';\n }\n status.warning = true;\n status.processing = true;\n \n } else if (success.statusID === 2) {\n status.ready = true;\n } else if (success.statusID === 3) {\n if (!baiOnly) {\n status.message = 'Error - The manifest failed to load to the system.';\n status.error = true;\n var errorDate = new Date(success.processed).toString();\n status.errorMessage = errorDate + ' ' + success.errorMessage;\n }\n }\n } else {\n //no record exists in rustici queue so has not been created\n status.message = 'No content loaded.';\n status.warning = true;\n }\n\n $scope.manageCourse.course.previewStatus = status;\n \n });\n };\n\n _this.getDocumentName = function (courseID, docType) {\n var result = DocumentService.getDocumentPath(courseID);\n result.then(function (success) {\n if (success !== null) {\n if (docType.toLowerCase() === \"url\") {\n $scope.manageCourse.course.documentName = success;\n }\n else {\n $scope.manageCourse.course.documentName = success.split('\\\\').pop().split('/').pop();\n }\n\n $scope.manageCourse.course.showDocumentName = true;\n _this.setDocumentPreviewStatus(true);\n }\n else {\n _this.setDocumentPreviewStatus(false);\n }\n });\n };\n\n _this.setDocumentPreviewStatus = function (ready) {\n var status = {};\n status.message = null;\n status.viewMore = false;\n status.ready = ready;\n status.processing = false;\n\n if (!ready) {\n status.message = 'No content loaded.';\n status.warning = true;\n }\n\n $scope.manageCourse.course.previewStatus = status;\n };\n\n var hasOfferingErrors = false;\n\n $scope.sendEditCourseCall = function (deactivate, confirmed) {\n\n if (($scope.manageCourse.childrenUpdated === true || $scope.manageCourse.skillsUpdated === true) && confirmed !== true) {\n $scope.manageCourse.confirmIsOpen = true;\n return;\n }\n else { $scope.manageCourse.confirmIsOpen = false; }\n\n $scope.editCourse.isLoading = true;\n\n if (typeof deactivate !== 'undefined' && deactivate === true) {\n $scope.manageCourse.course.displayEnd = dateUtil.formatDate(new Date());\n $scope.manageCourse.course.isActive = false;\n } else if (typeof deactivate !== 'undefined' && deactivate === false) {\n $scope.manageCourse.course.displayEnd = null;\n $scope.manageCourse.course.isActive = true;\n }\n\n var allPromises = [];\n\n if ($scope.manageCourse.course.normalizedProductType === \"document\" &&\n ((typeof $scope.manageCourse.baiform.documentUpload !== 'undefined' && $scope.manageCourse.baiform.documentUpload.$dirty) ||\n (typeof $scope.manageCourse.baiform.urlUpload !== 'undefined' && $scope.manageCourse.baiform.urlUpload.$dirty))) {\n\n\n //set the new document type before the common course update\n var docUpload = {};\n if ($scope.manageCourse.documentType === 'url' && $scope.manageCourse.urlUpload !== null) {\n $scope.manageCourse.course.type = 'url';\n $scope.manageCourse.course.documentName = $scope.manageCourse.urlUpload;\n $scope.manageCourse.course.showDocumentName = true;\n docUpload = DocumentService.uploadDocumentUrl($scope.manageCourse.urlUpload, $scope.manageCourse.course.id);\n allPromises.push(docUpload);\n } else {\n if ($scope.manageCourse.documentUpload !== null) {\n var filename = $scope.manageCourse.documentUpload.name;\n $scope.manageCourse.course.documentName = $scope.manageCourse.documentUpload.name;\n $scope.manageCourse.course.showDocumentName = true;\n var ext = filename.substring(filename.lastIndexOf('.'), filename.length);\n $scope.manageCourse.course.type = DocumentService.getDocumentTypeByExt(ext);\n docUpload = DocumentService.uploadDocumentToStorage($scope.manageCourse.documentUpload, $scope.manageCourse.course.id);\n allPromises.push(docUpload);\n }\n }\n }\n\n var course = angular.copy($scope.manageCourse.course);\n if (course.type === 'careerPath') {\n course.childCourses = _this.getOrderedChildCourses(course.childCourses);\n }\n\n //set the resourceID to launch with content based on the selected resource ID in document uploader\n course.resourceLaunchWithContent = $scope.manageCourse.course.resourceLaunchWithContent;\n\n if (typeof course.type !== 'undefined' && course.type === \"ilt\") {\n var courseIltUpdate = _this.updateCourseIlt(course);\n if (typeof courseIltUpdate !== 'undefined' && courseIltUpdate !== null) {\n allPromises.push(courseIltUpdate);\n }\n }\n\n var courseCommonUpdate = _this.updateCourseCommonProp(course);\n if (typeof courseCommonUpdate !== 'undefined' && courseCommonUpdate !== null) {\n allPromises.push(courseCommonUpdate);\n }\n\n var courseAssetsUpdate = _this.updateCourseAssets(course);\n if (typeof courseAssetsUpdate !== 'undefined' && courseAssetsUpdate !== null && !$scope.sequenceCourseSave) {\n //If we do not need to sequence the save, then add resource api calls to allPromises and proceed with async api calls\n allPromises.push(courseAssetsUpdate);\n }\n\n //for WBT or ILT, if there are any prereqs to remove or to insert, call the prereq update \n if (typeof course.type !== 'undefined' && (course.type === \"ilt\" || course.type === \"wbt\") && ($scope.prereqsToRemove.length > 0 || $scope.prereqsToInsert.length > 0)) {\n var prereqsIdsToUpdate = course.id + (($scope.prereqsToRemove.length > 0) ? '|' : '') + $scope.prereqsToRemove.join('|') + '|' + $scope.prereqsToInsert.join('|');\n var newPrereqList = [];\n $scope.manageCourse.course.prereq.forEach(function (p) { newPrereqList.push(p.id); });\n var prereqCall = CoursesService.updateCoursePrerequisits(course.id, prereqsIdsToUpdate, newPrereqList);\n allPromises.push(prereqCall);\n }\n\n $q.all(allPromises).then(function (success) {\n $scope.editCourse.isLoading = false;\n $scope.manageCourse.childrenUpdated = false;\n $scope.manageCourse.skillsUpdated = false;\n\n if ($scope.sequenceCourseSave) {\n //If sequenceCourseSave is true, that means there is a new doc/url that is set to launch with the course\n //this api needs to be called AFTER the course save API because we need to save the new resourceID to the course\n //without it being overridden by the course update API call\n $q.all(courseAssetsUpdate).then(function (success2) {\n $scope.manageCourse.success.setError(200, 'Successfully saved Course changes', true);\n });\n } else if (course.type === \"ilt\") {\n if (hasOfferingErrors === false)\n $scope.manageCourse.success.setError(200, 'Successfully saved Course changes', true);\n } else {\n $scope.manageCourse.success.setError(200, 'Successfully saved Course changes', true);\n }\n //Clear out the prereq arrays in case the user stays on the page and edits the prereqs again\n $scope.prereqsToInsert = [];\n $scope.prereqsToRemove = [];\n $scope.coursePrerequisitsOnLoad = angular.copy($scope.manageCourse.course.prereq);\n //get the latest preview status if WBT\n if ($scope.manageCourse.course.type === \"wbt\" || $scope.manageCourse.course.normalizedProductType === \"document\" && !DocumentService.isDirectLaunchType($scope.manageCourse.course.type)) {\n var rusticiCourseId = $scope.manageCourse.course.parentBAICourseId !== null ? $scope.manageCourse.course.parentBAICourseId : $scope.manageCourse.course.id;\n _this.getPreviewStatus(rusticiCourseId, $scope.manageCourse.course.baiOnly);\n }\n\n /* after course edit - reload the courses for the TA Courses home */\n CoursesService.getActiveCoursesForOrg(true, true);\n\n }, function (failure) {\n $rootScope.$broadcast(\"RefreshDocList\", { courseId: course.id });\n $scope.editCourse.isLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.manageCourse.error.setError(errorCode, message);\n });\n\n };\n\n $scope.toggleConfirmation = function () {\n jQuery('.confirmiltSave').toggle();\n };\n\n _this.updateCourseIlt = function (course) {\n hasOfferingErrors = false;\n $scope.manageCourse.editCourseOfferingsError.reset();\n $scope.manageCourse.editCourseOfferingsRosterError.reset();\n\n var batchUpdateOfferings = [];\n var batchAddOfferings = [];\n _.each($scope.manageCourse.course.offerings, function (offering) {\n //only update the offerings that have been touched. SLY-6551\n if (offering.isDirty) {\n\n offering.assignmentType = 'ilt';\n\n if (offering.requestedOn !== undefined) {\n offering.requestedOn = dateUtil.formatDate(new Date(offering.requestedOn.fullDateWithTime));\n }\n if (offering.registrationEndDateTime === undefined || offering.registrationEndDateTime === null) {\n offering.registrationEndDateTime = dateUtil.formatDate(offering.maxRegistrationEndDateTime);\n }\n\n offering.registrationEndDateTime = dateUtil.formatDate(new Date(offering.registrationEndDateTime.fullDateWithTime));\n\n var offeringCopy = angular.copy(offering);\n var sessions = offeringCopy.sessions;\n if (typeof sessions !== 'undefined' && sessions !== null && sessions.length > 0) {\n for (var i = 0; i < sessions.length; i++) {\n\n var endDate = moment(sessions[i].endDate);\n var endTime = moment(sessions[i].endTime);\n var startDate = moment(sessions[i].startDate);\n var startTime = moment(sessions[i].startTime);\n\n var endDateClone = moment(endDate);\n endDateClone.set({ hour: endTime.hours(), minute: endTime.minutes(), second: 0, millisecond: 0 });\n var startDateClone = moment(startDate);\n startDateClone.set({ hour: startTime.hours(), minute: startTime.minutes(), second: 0, millisecond: 0 });\n\n sessions[i].endDateTime = dateUtil.formatDate(endDateClone.toDate());\n sessions[i].startDateTime = dateUtil.formatDate(startDateClone.toDate());\n }\n }\n\n if (typeof offering.id !== 'undefined') {\n batchUpdateOfferings.push(offeringCopy);\n } else {\n batchAddOfferings.push(offeringCopy);\n }\n }\n });\n\n var offeringsUpsertPromises = [];\n var errormessage = \"\";\n\n if (batchUpdateOfferings.length > 0) {\n\n var updatepromisedefer = $q.defer();\n\n var batchupdatepromise = OfferingsService.updateOfferingsBatch(batchUpdateOfferings);\n\n batchupdatepromise.then(function (success) {\n\n _.each(success, function (updateditem) {\n\n var offering = _.findWhere($scope.manageCourse.course.offerings, { id: updateditem.offering.id });\n\n if (updateditem.status === \"Success\") {\n offering.isDirty = false;\n\n if (offering.roster.isDirty) {\n _this.updateOfferingRoster(offering);\n }\n else {\n offering.roster = updateditem.offering.roster;\n _this.setOfferingAccordionHeading(offering);\n }\n\n // Update UI sessions with ids from sessions in API response\n _.each(offering.sessions, function (session) {\n // Find each api session where start date matches UI session start date and end date matches UI session end date\n var apiSession = _.find(updateditem.offering.sessions, function (s) {\n var sd = new Date(s.startDateTime);\n var ed = new Date(s.endDateTime);\n return session.startDate.toLocaleString() === sd.toLocaleString() && session.endDate.toLocaleString() === ed.toLocaleString();\n });\n // Set UI session id = api session id. This is necessary so API knows which sessions are new or existing\n session.id = apiSession.id;\n });\n } else {\n errormessage = errormessage === \"\" ? updateditem.status : errormessage + \"\\r\\n\" + updateditem.status;\n }\n });\n\n updatepromisedefer.resolve();\n\n }, function (failure) {\n errormessage = errormessage === \"\" ? failure.ErrorMessage : errormessage + \"\\r\\n\" + failure.ErrorMessage;\n updatepromisedefer.resolve();\n });\n\n offeringsUpsertPromises.push(updatepromisedefer.promise);\n }\n\n if (batchAddOfferings.length > 0) {\n var addpromisedefer = $q.defer();\n var batchAddPromise = OfferingsService.createOfferings(batchAddOfferings);\n\n batchAddPromise.then(function (success) {\n\n _.each(success, function (createdItem) {\n\n var offering = _.findWhere($scope.manageCourse.course.offerings, { localId: createdItem.offering.localId, name: createdItem.offering.name });\n\n if (createdItem.status === \"Success\") {\n offering.isDirty = false;\n\n offering.id = createdItem.offering.id;\n offering.code = createdItem.offering.code;\n if (offering.roster.isDirty) {\n _this.updateOfferingRoster(offering);\n }\n } else {\n errormessage = errormessage === \"\" ? createdItem.status : errormessage + \"\\r\\n\" + createdItem.status;\n }\n });\n\n addpromisedefer.resolve();\n\n }, function (failure) {\n errormessage = errormessage === \"\" ? failure.ErrorMessage : errormessage + \"\\r\\n\" + failure.ErrorMessage;\n addpromisedefer.resolve();\n });\n\n offeringsUpsertPromises.push(addpromisedefer.promise);\n }\n\n var deferredOfferingsPromise = $q.defer();\n $q.all(offeringsUpsertPromises).then(function (data) {\n if (errormessage !== \"\") {\n hasOfferingErrors = true;\n $scope.manageCourse.editCourseOfferingsError.setError(\"\", errormessage);\n }\n\n deferredOfferingsPromise.resolve(\"success\");\n });\n\n return deferredOfferingsPromise.promise;\n };\n\n _this.updateOfferingRoster = function (offering) {\n var roster = offering.roster.attendingStudents;\n if (roster !== 'undefined') {\n var registerToRoster = [];\n _.each(roster, function (user) {\n user.error = messagingDisplayerUtil.create();\n if (typeof user.isExisting === 'undefined' || user.isExisting === null) {\n var rosterUser = {};\n rosterUser.StudentId = user.id;\n rosterUser.OfferingId = offering.id;\n rosterUser.RegistrationStatus = 'confirmed';\n rosterUser.AssignmentType = 'ilt';\n\n registerToRoster.push(rosterUser);\n }\n });\n\n if (registerToRoster.length > 0)\n _this.batchUpdateUserInRoster(registerToRoster, offering);\n }\n };\n\n\n $scope.updateCourseOfferingRoster = function (course) {\n $scope.manageCourse.stepSix = {};\n\n var registerToRoster = [];\n\n var offerings = course.offerings;\n _.each(offerings, function (offering) {\n var roster = offering.roster.attendingStudents;\n registerToRoster = [];\n _.each(roster, function (user) {\n user.error = messagingDisplayerUtil.create();\n if (typeof offering.id === 'undefined') {\n user.error.setError(\"\", \"Offering does not exist.\");\n return;\n }\n\n if (typeof user.isExisting === 'undefined' || user.isExisting === null) {\n var rosterUser = {};\n rosterUser.StudentId = user.id;\n rosterUser.OfferingId = offering.id;\n rosterUser.RegistrationStatus = 'confirmed';\n rosterUser.AssignmentType = 'ilt';\n\n registerToRoster.push(rosterUser);\n }\n });\n\n if (registerToRoster.length > 0)\n _this.batchUpdateUserInRoster(registerToRoster, offering);\n\n });\n };\n\n _this.updateCourseCommonProp = function (course) {\n var coursePromise = CoursesService.updateCourse(course);\n return coursePromise;\n };\n\n _this.updateCourseAssets = function (course) {\n var courseCustomPromise = _this._attachFiles(course.id, $scope.manageCourse.scormPackages, $scope.manageCourse.course.documentList, $scope.manageCourse.course.shellType);\n return courseCustomPromise;\n };\n\n $scope.manageCourse.editCourseOfferingsRosterError = messagingDisplayerUtil.create();\n $scope.manageCourse.editCourseOfferingsError = messagingDisplayerUtil.create();\n $scope.manageCourse.editOfferingsIsLoading = true;\n $scope.manageCourse.showOfferingsLoading = true;\n $scope.manageCourse.stepFive = {};\n $scope.manageCourse.stepFive.error = messagingDisplayerUtil.create();\n\n $scope.manageCourse.showOfferingsWithStatus = \"open\";\n $scope.displayedOfferings = [];\n\n\n $scope.manageCourse.getCourseOfferings = function () {\n var courseId = $route.current.params.param.split('/')[0];\n $scope.manageCourse.editCourseOfferingsError.reset();\n $scope.manageCourse.editOfferingsIsLoading = true;\n $scope.manageCourse.showOfferingsLoading = true;\n $scope.manageCourse.initializeSessionCreator();\n\n if (typeof $scope.manageCourse.course.offerings !== 'undefined' && $scope.manageCourse.course.offerings !== null) {\n $scope.manageCourse.editOfferingsIsLoading = false;\n $scope.manageCourse.showOfferingsLoading = false;\n $scope.manageCourse.isLoading = false;\n return true;\n }\n\n var courseOfferingsPromise = CoursesService.getSingleCourseOfferings(courseId);\n\n var locationsPromise = LocationsService.getAllActive();\n var instructorsPromise = UsersService.getAllInstructors();\n\n var offeringsMetaDataPromises = [];\n offeringsMetaDataPromises.push(courseOfferingsPromise);\n offeringsMetaDataPromises.push(locationsPromise);\n offeringsMetaDataPromises.push(instructorsPromise);\n\n locationsPromise.then(function (success) {\n $scope.manageCourse.locations = success;\n }, function (failure) {\n });\n\n instructorsPromise.then(function (success) {\n $scope.manageCourse.stepFour.instructors = success;\n // We want to run course offerings after instructor finishes\n return courseOfferingsPromise;\n }, function (failure) {\n // We want to run course offerings after instructor finishes even if it fails.\n return courseOfferingsPromise;\n }).then(function (success) { // Chained course offerings promise\n\n $scope.manageCourse.course.offerings = success; // offerings\n //_.each(_.where(success, { \"status\": $scope.manageCourse.showOfferingsWithStatus }).slice(0, 20), function(o) {\n // $scope.displayedOfferings.push(o);\n //});\n\n _this.setOfferingInstructors();\n _this.setSessions(success);\n\n _.each($scope.manageCourse.course.offerings, function (offering) {\n offering.hasError = false;\n _this.setOfferingAccordionHeading(offering);\n });\n\n _this.SetCourseEndDateBoundaries();\n _this.SetCourseStartDateBoundaries();\n\n }, function (failure) {\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n if (failure.ErrorMessage !== \"There are no items to display.\") {\n $scope.manageCourse.editCourseOfferingsError.setError(errorCode, message);\n }\n\n });\n\n\n $q.all(offeringsMetaDataPromises).then(function (success) {\n // Only remove loading bars when all promises are done\n $scope.manageCourse.editOfferingsIsLoading = false;\n $scope.manageCourse.showOfferingsLoading = false;\n $scope.manageCourse.isLoading = false;\n }, function (failure) {\n // Or fail\n $scope.manageCourse.editOfferingsIsLoading = false;\n $scope.manageCourse.showOfferingsLoading = false;\n $scope.manageCourse.isLoading = false;\n });\n\n $scope.manageCourse.getCourseSessions();\n };\n\n $scope.$on('$includeContentLoaded', function (event, url) {\n\n if (url === 'app/templates/courses/create/partials/step4/partials/admin.step4.offeringRepeater.html') {\n $scope.manageCourse.showOfferingsLoading = false;\n return;\n }\n });\n\n $scope.manageCourse.offeringIsDirty = function (offering, i) {\n if (offering.accordionOpen === true) {\n $scope.manageCourse.stepFive.sessionCreator.offering = offering.localId;\n offering.isDirty = true;\n\n if ($scope.manageCourse.offeringsForm['registrationEndDateTime-' + i].$invalid) {\n if (offering.registrationEndDateTime.moment < offering.maxRegistrationEndDateTime) {\n $scope.manageCourse.offeringsForm['registrationEndDateTime-' + i].$setValidity('maxDate', true);\n }\n }\n\n offering.hasError = ($scope.manageCourse.offeringsForm['name-' + i].$invalid ||\n $scope.manageCourse.offeringsForm['description-' + i].$invalid ||\n $scope.manageCourse.offeringsForm['location-' + i].$invalid ||\n $scope.manageCourse.offeringsForm['minimumEnrollment-' + i].$invalid ||\n $scope.manageCourse.offeringsForm['maxAllowedSize-' + i].$invalid ||\n $scope.manageCourse.offeringsForm['enrollmentOpen-' + i].$invalid ||\n $scope.manageCourse.offeringsForm['registrationEndDateTime-' + i].$invalid ||\n $scope.manageCourse.offeringsForm['cancelDays-' + i].$invalid ||\n $scope.manageCourse.offeringsForm['waitlistDays-' + i].$invalid ||\n $scope.manageCourse.offeringsForm['MaxWaitlistSize-' + i].$invalid ||\n $scope.manageCourse.offeringsForm['instructors-reader-' + i].$invalid);\n $scope.manageCourse.course.hasInvalidOfferings = typeof _.findWhere($scope.manageCourse.course.offerings, { 'hasError': true }) !== \"undefined\";\n var offCheck = _this.getOfferingwithNoSession();\n $scope.manageCourse.course.hasOfferingWithNoSession = typeof offCheck.localId !== \"undefined\";\n _this.setIltSessionMinMaxDates();\n\n }\n };\n\n _this.setSessions = function (offerings) {\n var course = $scope.manageCourse.course;\n var allSessions = [];\n\n _.each(offerings, function (offering) {\n offering.localId = offering.id;\n _.each(offering.sessions, function (session) {\n session.offeringName = offering.name;\n session.offeringId = offering.id;\n session.startDate = session.startDateTime.jsDate;\n session.startTime = session.startDateTime.jsDate;\n session.endDate = session.endDateTime.jsDate;\n session.endTime = session.endDateTime.jsDate;\n session.error = false;\n session.offeringStatus = offering.status;\n allSessions.push(session);\n });\n });\n\n $scope.manageCourse.stepFive.allSessions = allSessions;\n };\n\n _this.setOfferingInstructors = function () {\n var instructors = $scope.manageCourse.stepFour.instructors;\n var courseOfferings = $scope.manageCourse.course.offerings;\n\n if (typeof courseOfferings !== 'undefined' && courseOfferings !== null) {\n\n _.each(courseOfferings, function (offer) {\n offer.instructorPills = [];\n if (typeof offer.instructorIds !== 'undefined' && offer.instructorIds !== null && offer.instructorIds.length > 0) {\n _.each(offer.instructorIds, function (inst) {\n var matchInstr = _.findWhere(instructors, { id: inst });\n if (typeof matchInstr !== 'undefined') {\n offer.instructorPills.push(matchInstr);\n }\n else {\n //get the inactive instructor by id\n var inactiveInstructor = UsersService.fetch(inst);\n\n inactiveInstructor.then(function (response) {\n offer.instructorPills.push(response);\n });\n }\n\n\n });\n }\n });\n }\n };\n\n\n _this.batchUpdateUserInRoster = function (registerToRoster, offering) {\n\n $scope.manageCourse.stepSix.rosterSaving = true;\n\n var updateRosterStatus = RosterService.updateMultiplePersonOnRoster(registerToRoster);\n updateRosterStatus.then(function (success) {\n\n var successCalls = _.where(success, { success: true });\n var failedCalls = _.where(success, { success: false });\n\n //var offering = _.findWhere($scope.manageCourse.course.offerings, { id: registerToRoster[0].OfferingId });\n var roster = offering.roster.attendingStudents;\n\n _.each(successCalls, function (s) {\n var successUser = _.findWhere(roster, { id: s.studentId });\n //prevents users from being resubmitted\n successUser.isExisting = true;\n\n successUser.success = messagingDisplayerUtil.create();\n successUser.success.setError(200, 'Successfully added ' + successUser.fullName + ' to roster!', false);\n });\n\n _.each(failedCalls, function (f) {\n var failedUser = _.findWhere(roster, { id: f.studentId });\n failedUser.error.setError(\"\", f.message);\n });\n\n if (typeof failedCalls !== 'undefined' && failedCalls !== null && failedCalls.length > 0) {\n hasOfferingErrors = true;\n $scope.manageCourse.editCourseOfferingsRosterError.setError(\"\", \"Roster Error: There were errors saving roster changes for \" + offering.name);\n }\n\n _this.setOfferingAccordionHeading(offering);\n $scope.manageCourse.stepSix.rosterSaving = false;\n\n }, function (failure) {\n hasOfferingErrors = true;\n $scope.manageCourse.editCourseOfferingsRosterError.setError(\"\", offering.name + \"Roster Error: There were errors saving roster changes for \" + offering.name);\n _.each(offering.roster.attendingStudents, function (r) {\n $scope.manageCourse.singleUserToRosterError(failure, r);\n });\n $scope.manageCourse.stepSix.rosterSaving = false;\n });\n };\n\n\n\n $scope.manageCourse.getCourseSessions = function () {\n var sessions = $scope.manageCourse.stepFive.allSessions;\n\n $scope.manageCourse.stepFive.repeatOptions = [{\n id: 1,\n label: 'Daily'\n }, {\n id: 2,\n label: 'Weekly'\n }, {\n id: 4,\n label: 'Monthly'\n }, {\n id: 5,\n label: 'Yearly'\n }];\n };\n\n $scope.manageCourse.addMoreItems = function () {\n\n var last = $scope.displayedOfferings.length;\n var offeringsWithStatus = _.where($scope.manageCourse.course.offerings, { \"status\": $scope.manageCourse.showOfferingsWithStatus });\n\n if (last < offeringsWithStatus.length) {\n _.each(offeringsWithStatus.slice(last, last + 20), function (o) {\n $scope.displayedOfferings.push(o);\n });\n }\n\n };\n\n // ASSUMPTION: Offerings are already loaded\n $scope.manageCourse.getCourseOfferingsRoster = function () {\n var offerings = $scope.manageCourse.course.offerings;\n $scope.manageCourse.editRosterIsLoading = true;\n if (typeof offerings !== 'undefined' && offerings.length > 0) {\n _.each(offerings, function (offering) {\n offering.search = {};\n offering.search.error = messagingDisplayerUtil.create();\n\n var roster = offering.roster.attendingStudents;\n _.each(roster, function (user) {\n user.isExisting = true;\n });\n });\n }\n\n $scope.manageCourse.editRosterIsLoading = false;\n };\n\n $scope.manageCourse.refreshCourseOfferingsRoster = function () {\n var offerings = $scope.manageCourse.course.offerings;\n $scope.manageCourse.editRosterIsLoading = true;\n if (typeof offerings !== 'undefined' && offerings.length > 0) {\n _.each(offerings, function (offering) {\n offering.search = {};\n offering.search.error = messagingDisplayerUtil.create();\n\n var singleRosterPromise = RosterService.fetch(offering.id, 'ilt');\n singleRosterPromise.then(function (success) {\n if (typeof success !== 'undefined' && success !== null) {\n offering.roster = {};\n offering.roster.attendingStudents = [];\n\n var attendingStudents = success.attendingStudents;\n if (attendingStudents.length > 0) {\n _.each(success.attendingStudents, function (attendingStudent) {\n attendingStudent.student.isExisting = true;\n offering.roster.attendingStudents.push(attendingStudent.student);\n });\n }\n }\n }, function (failure) {\n console.log(failure);\n });\n });\n }\n\n $scope.manageCourse.editRosterIsLoading = false;\n\n };\n\n /* build the tree */\n /* also handles Custom Content */\n _this.baiCatalogCta = function () {\n $scope.baiCatalogError.error.reset();\n\n var baiCatalogPromise = CatalogService.getBaiCatalogData();\n\n baiCatalogPromise.then(function (success) {\n _this.baiCatalogPromiseData = success;\n\n //Make a copy of the tree data so that manipulation of it does not flow to the service\n var catalogTreeDataCopy = angular.copy(success.formattedCatalogTreeData);\n $scope.manageCourse.categoryRows = success.formattedCatalogTree;\n TreeHelpers.setPropertyOnAllNodes(catalogTreeDataCopy, 'lockIcon', true);\n\n //If the org has a custom catalog, remove it from the BAI Catalog and put all nodes in the Custom Content section\n var custContIdx = _.findIndex(catalogTreeDataCopy, { \"name\": \"Custom Content\" });\n if (custContIdx >= 0) {\n $scope.customCatalogData = [{ 'name': 'Custom Content', 'nodes': catalogTreeDataCopy[custContIdx].nodes }];\n catalogTreeDataCopy.splice(custContIdx, 1);\n }\n\n var custDocIdx = _.findIndex(catalogTreeDataCopy, { \"name\": \"Custom Documents\" });\n if (custDocIdx >= 0) {\n $scope.customDocumentsCatalogData = [{ 'name': 'Custom Documents', 'nodes': catalogTreeDataCopy[custDocIdx].nodes }];\n catalogTreeDataCopy.splice(custDocIdx, 1);\n var policiesIdx = _.findIndex(catalogTreeDataCopy, { \"name\": \"Policies\" });\n if (policiesIdx >= 0 && $scope.customDocumentsCatalogData.length > 0) { $scope.customDocumentsCatalogData[0].nodes.push(catalogTreeDataCopy[policiesIdx]); }\n }\n\n //TODO:LXPDoc:CustomDocuments - need to filter out custom document nodes\n $scope.documentTreeData = catalogTreeDataCopy.filter(function (taxon) {\n return taxon.catalogNodeType.toLowerCase() === \"document\";\n });\n\n _this.shouldShowDocuments();\n\n catalogTreeDataCopy = catalogTreeDataCopy.filter(function (taxon) {\n return taxon.catalogNodeType.toLowerCase() !== \"document\";\n });\n\n $scope.baiCatalogData = [{ 'name': 'BAI Catalog', 'nodes': catalogTreeDataCopy }];\n $scope.baiCatalogIsLoading = false;\n $scope.coursesSelected = $scope.baiCatalogData[0];\n\n $scope.baiDocumentsCatalogData = [{ 'name': 'BAI Documents', 'nodes': $scope.documentTreeData }];\n\n }, function (failure) {\n $scope.baiCatalogIsLoading = false;\n\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n\n $scope.baiCatalogError.error.setError(errorCode, message);\n });\n };\n\n /* This gets called when you click on any node in the tree.\n * Filter the items on the right when you click on the node\n */\n $scope.catalogNodeClick = function (item, catalogParentNode) {\n\n //clear out the search value since we aren't using it\n $scope.general.search = \"\";\n\n //Clear previously selected nodes in different trees\n var selectedNodes = document.getElementsByClassName(\"tree-selected\");\n Array.prototype.forEach.call(selectedNodes, function (x) {\n $(x).removeClass(\"tree-selected\");\n });\n\n //default to bai courses \n $scope.coursesSelected = _this.baiCourses;\n if (catalogParentNode === \"custom\") {\n $scope.coursesSelected = _this.customCourses;\n } else if (catalogParentNode === \"documents\") {\n $scope.coursesSelected = _this.baiDocuments;\n } else if (catalogParentNode === \"customDocuments\") {\n $scope.coursesSelected = _this.customDocuments;\n }\n\n $scope.rowsAreLoading = true;\n var rows = [];\n\n if (typeof _this.params.name !== 'undefined' && _this.params.name !== null && _this.params.name === \"home\") {\n\n if (typeof item.nodeId === 'undefined') {\n rows = $scope.coursesSelected;\n\n } else {\n _this.emptyArray = [];\n rows = _this.filterRowsByCatalogId(item);\n }\n\n _this.currentCourseSet = rows;\n\n /**\n * Reset page size and info for paginator\n */\n _this.calculatePages(rows);\n\n var copy = angular.copy(rows);\n\n rows = copy.splice(0, $scope.home.limit);\n\n $scope.rows = rows;\n $scope.rowsAreLoading = false;\n } else {\n $location.path('/courses/home');\n }\n };\n\n /* function to check if the documents catalog node should show */\n _this.shouldShowDocuments = function () {\n /*function is called in multiple areas so that there are no race conditions */\n $scope.showDocumentsCatalog = false;\n if ($scope.isDocumentsEnabled && $scope.documentTreeData !== undefined && $scope.documentTreeData.length > 0) {\n $scope.showDocumentsCatalog = true;\n }\n };\n\n //Inactive tab Click event to get the inactive records\n $scope.getInactiveCourses = function () {\n //Clear previously selected nodes in different trees\n var selectedNodes = document.getElementsByClassName(\"tree-selected\");\n Array.prototype.forEach.call(selectedNodes, function (x) {\n $(x).removeClass(\"tree-selected\");\n });\n $scope.rowsAreLoading = true;\n $scope.courseactivetab = true;\n //console.log('Inactive Button Click');\n var allInactiveCoursesData = CoursesService.getInactiveCoursesForOrg();\n\n return allInactiveCoursesData.then(function (success) {\n $scope.rowsAreLoading = false;\n\n _this.allCoursesData = _.sortBy(success, $scope.propertyName);\n var rows = [];\n rows = _this.allCoursesData;\n _this.currentCourseSet = rows;\n _this.customCourses = $filter('filter')(_this.currentCourseSet, { baiOnly: false });\n _this.baiDocuments = _this.currentCourseSet.filter(function (c) { return c.baiOnly && c.normalizedProductType === \"document\"; });\n _this.baiCourses = _this.currentCourseSet.filter(function (c) { return c.baiOnly && c.normalizedProductType !== \"document\"; });\n _this.customDocuments = _this.currentCourseSet.filter(function (c) { return !c.baiOnly && c.normalizedProductType === \"document\"; });\n /**\n * Reset page size and info for paginator\n */\n _this.calculatePages(rows);\n var copy = angular.copy(rows);\n rows = copy.splice(0, $scope.home.limit);\n $scope.rows = rows;\n //$scope.manageCourse.evaluationsNsurveys = _this.getEvaluations(copy);\n }, function (failure) {\n $scope.baiCatalogIsLoading = false;\n $scope.rowsAreLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.assignmentTableError.error.setError(errorCode, message);\n });\n };\n\n $scope.getActiveCourses = function () {\n //Clear previously selected nodes in different trees\n var selectedNodes = document.getElementsByClassName(\"tree-selected\");\n Array.prototype.forEach.call(selectedNodes, function (x) {\n $(x).removeClass(\"tree-selected\");\n });\n $scope.courseactivetab = false;\n $scope.showcoursesactivetab = true;\n $scope.rowsAreLoading = true;\n var allActiveCoursesData = CoursesService.getActiveCoursesForOrg(false, true);\n\n return allActiveCoursesData.then(function (success) {\n $scope.rowsAreLoading = false;\n _this.createCourseArrays(success);\n\n }, function (failure) {\n $scope.baiCatalogIsLoading = false;\n $scope.rowsAreLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.assignmentTableError.error.setError(errorCode, message);\n });\n };\n\n /********* CREATE ASSIGNMENT ACTION **********/\n ///////// GLOBAL VARIABLES\n\n $scope.createAction = function () {\n $scope.homeTemplate = 'app/templates/courses/create/admin.html';\n $scope.wizardTitle = \"Add New Content\";\n\n $scope.manageCourse.popoverIsOpen = false;\n\n $scope.create = {};\n $scope.create.isLoading = true;\n $scope.showcoursesactivetab = false;\n\n $scope.manageCourse.ASSIGNMENT_TYPE_ENUM = [\n { id: \"WBT\", code: \"wbt\", title: \"Web Based Training\" },\n { id: \"CERTIFICATION\", code: \"courseGroupCertification\", title: \"Certification\" },\n { id: \"COURSEGROUP\", code: \"courseGroup\", title: \"Course Group\" },\n { id: \"CURRICULA\", code: \"courseGroupCurricula\", title: \"Curricula\" },\n { id: \"TASK\", code: \"task\", title: \"Task\" },\n { id: \"EVALUATION\", code: \"evaluation\", title: \"Evaluation\" },\n { id: \"SURVEY\", code: \"survey\", title: \"Survey\" },\n { id: \"ASSESSMENT\", code: \"assessment\", title: \"Assessment\" }\n ];\n\n _this._clearCourseCreateForm();\n _this.setEvaluations();\n _this.getContentTypes();\n $scope.$watch(function () {\n return $rootScope.sysSettings;\n }, function () {\n $scope.create.isLoading = false;\n\n $scope.courses.isILTEnabled = SettingsService.isILTEnabled();\n $scope.courses.isCareerPathEnabled = SettingsService.isCareerPathEnabled();\n if ($scope.courses.isILTEnabled) {\n $scope.manageCourse.ASSIGNMENT_TYPE_ENUM.splice(1, 0, { id: \"ILT\", code: \"ilt\", title: \"Instructor Led Training\" });\n if ($scope.courses.isDocumentsEnabled === true) {\n $scope.manageCourse.ASSIGNMENT_TYPE_ENUM.splice(2, 0, { id: \"DOC\", code: \"doc\", title: \"Document\" });\n\n if ($scope.courses.isCareerPathEnabled === true) {\n $scope.manageCourse.ASSIGNMENT_TYPE_ENUM.splice(3, 0, { id: \"CAREERPATH\", code: \"careerPath\", title: \"Career Path\" });\n }\n }\n else {\n if ($scope.courses.isCareerPathEnabled === true) {\n $scope.manageCourse.ASSIGNMENT_TYPE_ENUM.splice(2, 0, { id: \"CAREERPATH\", code: \"careerPath\", title: \"Career Path\" });\n }\n }\n }\n else {\n $scope.manageCourse.ASSIGNMENT_TYPE_ENUM = [];\n $scope.manageCourse.ASSIGNMENT_TYPE_ENUM.push({ id: \"DOC\", code: \"doc\", title: \"Document\" });\n }\n });\n };\n\n $scope.manageCourse.currentAssignmentType = null;\n $scope.manageCourse.course = {};\n $scope.manageCourse.error = messagingDisplayerUtil.create();\n $scope.manageCourse.isLoading = false;\n $scope.manageCourse.scormPackages = [];\n $scope.manageCourse.urlUpload = null;\n $scope.manageCourse.documentUpload = null;\n $scope.offeringInUse = {};//SLY-3974-Inactivate Save button if no session for an offering.\n\n /**\n * Insert an instructor into the appropirate offering\n *\n * @param $item {obj} Selected item\n * @param $model {obj} Selected item\n * @param $label {string} Label that contains selected info\n * @param $event {obj} Click event\n * @param offering {obj}\n */\n $scope.manageCourse.selectInstructor = function ($item, $model, $label, $event, offering) {\n offering.instructorReader = $label;\n\n offering.instructorLabel = '';\n\n offering.instructorIds.push($item.id);\n offering.instructorPills.push($item);\n };\n\n /**\n * Attach appropriate location info to offering\n *\n * @param offering {obj} Offering to have location data inserted into\n */\n $scope.manageCourse.selectLocation = function (offering) {\n var location = _.find($scope.manageCourse.locations, function (location) {\n return location.id === offering.facilityId;\n });\n\n offering.location = location.name;\n offering.address = location.mailingAddress;\n\n _this.setOfferingAccordionHeading(offering);\n };\n\n /**\n * Create a new offering\n */\n $scope.manageCourse.cloneOffering = function () {\n\n var courseUpdateMethod = $route.current.params.name;\n if (typeof courseUpdateMethod !== 'undefined' && courseUpdateMethod === 'edit') {\n if (typeof $scope.manageCourse.course.offerings === 'undefined') {\n $scope.manageCourse.course.offerings = [];\n }\n }\n\n var offering = OfferingsService.createGenericOffering($scope.manageCourse.course.offerings.length + 1, $scope.manageCourse.course.id);\n _this.setOfferingEnrollmentOpensDateBoundries(offering); // This is to initialize the enrollment open dates and date bounds of the new offering\n _this.setOfferingEnrollmentEndDateBoundries(offering); // This is to initialize the enrollment closes dates and date bounds of the new offering\n offering.accordionOpen = true;\n $scope.offeringInUse = offering;//SLY-3974-Inactivate Save button if no session for an offering.\n $scope.manageCourse.course.hasInvalidOfferings = true;\n _this.setNewOfferingDefaults(offering);\n\n var today = dateUtil.setPortalStartTime(new Date());\n\n if (today >= $scope.manageCourse.course.displayStart.jsDate) {\n offering.requestedOn = dateUtil.formatDate(today);\n } else {\n offering.requestedOn = $scope.manageCourse.course.displayStart;\n }\n\n _this.setOfferingAccordionHeading(offering);\n\n $scope.manageCourse.showOfferingsWithStatus = \"open\";\n $scope.manageCourse.displayOfferingsWithStatus();\n\n $scope.displayedOfferings.unshift(offering);\n $scope.manageCourse.course.offerings.unshift(offering);\n\n $scope.manageCourse.stepFive.sessionCreator.offering = offering.localId;\n };\n\n /**\n * Remove instructors from appropriate lists\n *\n * @param offering {obj} Offering to be modified\n * @param index {int} Index to be removed from instructor lists\n */\n $scope.manageCourse.removeUserForInstructorList = function (offering, index) {\n offering.instructorIds.splice(index, 1);\n offering.instructorPills.splice(index, 1);\n\n if (offering.instructorPills.length === 0) {\n offering.instructorLabel = '';\n offering.instructorReader = '';\n }\n };\n\n /**\n * Delete an offering\n *\n * @param $index {int} Index of offering\n */\n $scope.manageCourse.removeOffering = function ($index, offering) {\n\n var offeringUpdateMethod = $route.current.params.name;\n if (typeof offeringUpdateMethod !== 'undefined' && (offeringUpdateMethod === 'edit' || offeringUpdateMethod === 'create')) {\n\n if (typeof offering.id === 'undefined') {\n $scope.manageCourse.course.offerings.splice($index, 1);\n $scope.displayedOfferings.splice($index, 1);\n\n if (typeof $scope.manageCourse.stepFive.allSessions !== 'undefined' && $scope.manageCourse.stepFive.allSessions.length > 0) {\n var allsessionscopy = ($scope.manageCourse.stepFive.allSessions);\n _.each(allsessionscopy, function (session) {\n if (session.offeringId === offering.localId) {\n var sessionKey = $scope.manageCourse.stepFive.allSessions.indexOf(session);\n $scope.manageCourse.stepFive.allSessions.splice(sessionKey, 1);\n }\n });\n }\n\n } else {\n _this.removeOffering(offering);\n }\n }\n\n //SLY-3974-Inactivate Save button if no session for an offering.\n $scope.offeringInUse = _this.getOfferingwithNoSession();\n if (typeof $scope.offeringInUse.localId === \"undefined\") {\n $scope.manageCourse.course.hasOfferingWithNoSession = false;\n\n $scope.manageCourse.course.hasInvalidOfferings = typeof _.findWhere($scope.manageCourse.course.offerings, { 'hasError': true }) !== \"undefined\";\n }\n };\n\n _this.removeOffering = function (offering) {\n var removeOfferingPromise = OfferingsService.cancelOffering(offering.id, 'ilt');\n removeOfferingPromise.then(function (success) {\n offering.status = \"cancelled\";\n if (typeof $scope.manageCourse.stepFive.allSessions !== 'undefined' && $scope.manageCourse.stepFive.allSessions.length > 0) {\n var allsessionscopy = ($scope.manageCourse.stepFive.allSessions);\n _.each(allsessionscopy, function (session) {\n if (session.offeringId === offering.id) {\n session.offeringStatus = \"cancelled\";\n }\n });\n }\n _this.setOfferingAccordionHeading(offering);\n $scope.manageCourse.displayOfferingsWithStatus();\n\n }, function (failure) {\n console.log(failure);\n });\n };\n\n /**\n * Keep track of all days that need to be repeated over\n *\n * @param day\n * @param $event\n */\n $scope.manageCourse.selectDayForSessionCreator = function (day, $event) {\n if (jQuery($event.currentTarget).hasClass('active')) {\n var index = $scope.manageCourse.stepFive.sessionCreator.days.indexOf(day);\n\n $scope.manageCourse.stepFive.sessionCreator.days.splice(index, 1);\n } else {\n $scope.manageCourse.stepFive.sessionCreator.days.push(day);\n }\n\n $scope.manageCourse.stepFive.sessionCreator.day = day;\n\n jQuery($event.currentTarget).toggleClass('active');\n };\n\n /**\n * Create all sessions.\n */\n $scope.manageCourse.createSessions = function () {\n var sessionCreator = angular.copy($scope.manageCourse.stepFive.sessionCreator);\n\n var sessions = [];\n\n $scope.manageCourse.stepFive.error.reset();\n $scope.manageCourse.stepFive.errorCount = 0;\n\n if (sessionCreator.startDate.moment.isAfter(sessionCreator.endDate.moment)) {\n $scope.manageCourse.stepFive.error.setError(500, 'No sessions added. Start date must be less than end date');\n return;\n }\n\n /**\n * Three flows:\n *\n * 1. Check if frequency is set. If it is, ignore dates; just create sessions on frequency * number\n * of repetitions\n * 2. Days were selected. Repeat number of weeks with days.\n * 3. One session is being created. Carry on.\n */\n switch (sessionCreator.repeat) {\n // daily\n case 1:\n sessions = sessionFormatterUtil.createSessionsByStandardRepeat(sessionCreator, $scope.manageCourse.course.offerings, 'days', 1);\n\n break;\n case 2:\n sessions = sessionFormatterUtil.createSessionsByRepeatingDays(sessionCreator, $scope.manageCourse.course.offerings);\n\n break;\n case 3:\n sessions = sessionFormatterUtil.createSessionsByStandardRepeat(sessionCreator, $scope.manageCourse.course.offerings, 'weeks', 2);\n\n break;\n case 4:\n sessions = sessionFormatterUtil.createSessionsByStandardRepeat(sessionCreator, $scope.manageCourse.course.offerings, 'months', 1);\n\n break;\n case 5:\n sessions = sessionFormatterUtil.createSessionsByStandardRepeat(sessionCreator, $scope.manageCourse.course.offerings, 'years', 1);\n\n break;\n }\n\n /**\n * Get total count of errors; filter out the session\n * concatenation.\n */\n sessions = _.filter(sessions, function (session) {\n session.offeringStatus = 'open';\n if (session.error === true) {\n $scope.manageCourse.stepFive.errorCount++;\n } else {\n return session;\n }\n });\n\n if ($scope.manageCourse.stepFive.errorCount > 0) {\n $scope.manageCourse.stepFive.error.setError(500, $scope.manageCourse.stepFive.errorCount + ' sessions were not added, due to date time conflicts!');\n }\n\n if (typeof $scope.manageCourse.stepFive.allSessions !== 'undefined') {\n $scope.manageCourse.stepFive.allSessions = _.sortBy($scope.manageCourse.stepFive.allSessions.concat(sessions), 'startDate');\n }\n else {\n $scope.manageCourse.stepFive.allSessions = sessions;\n }\n\n var offering = _.find($scope.manageCourse.course.offerings, function (offering) {\n return offering.localId === sessionCreator.offering;\n });\n\n if (typeof offering.sessions !== 'undefined' && offering.sessions !== null) {\n offering.sessions = _.sortBy(offering.sessions.concat(sessions), 'startDate');\n } else {\n offering.sessions = sessions;\n }\n\n _this.setOfferingEnrollmentEndDateBoundries(offering);\n if (offering.registrationEndDateTime === undefined || offering.registrationEndDateTime === null) {\n offering.registrationEndDateTime = dateUtil.formatDate(offering.maxRegistrationEndDateTime);\n }\n\n _this.setOfferingAccordionHeading(offering);\n offering.isDirty = true;\n };\n\n /**\n * Get the appropriate offering name\n *\n * @param id {int} ID of selected offering\n */\n // $scope.manageCourse.getOfferingName = function(id) {\n // var offering = _.find($scope.manageCourse.stepFive.allSessions, function(offering) {\n // return parseInt(offering.localId, 10) === parseInt(id, 10);\n // });\n\n // return offering.name;\n\n // };\n\n /**\n * Remove a session from an offering\n *\n * @param session {obj} session to be removed\n */\n $scope.manageCourse.removeSession = function (session) {\n var offering = _.find($scope.manageCourse.course.offerings, function (offering) {\n return parseInt(offering.localId, 10) === parseInt(session.offeringId, 10);\n });\n\n /**\n * Remove session off of the offering\n *\n * @type {*}\n */\n var sessionKey = offering.sessions.indexOf(session);\n\n offering.sessions.splice(sessionKey, 1);\n $scope.offeringInUse = offering;//SLY-3974-Inactivate Save button if no session for an offering.\n /**\n * Remove the session off of the general list of sessions\n */\n sessionKey = $scope.manageCourse.stepFive.allSessions.indexOf(session);\n\n $scope.manageCourse.stepFive.allSessions.splice(sessionKey, 1);\n\n _this.setOfferingAccordionHeading(offering);\n offering.isDirty = true;\n };\n\n /**\n * Send the offering data to the offering service for creation\n */\n $scope.manageCourse.createOfferingsCall = function () {\n $scope.manageCourse.stepFive.error.reset();\n var i = 0;\n for (i = 0; i < $scope.manageCourse.course.offerings.length; i++) {\n if ($scope.manageCourse.course.offerings[i].sessions.length === 0) {\n $scope.manageCourse.stepFive.error.setError(\"\", \"All offerings must have sessions prior to saving\");\n $scope.manageCourse.onSessionsTab = true;\n return;\n }\n }\n\n $scope.manageCourse.stepFive.isLoading = true;\n\n // Find all offerings that need to be created or updated\n var offeringsToCreate = [];\n var offeringsToUpdate = [];\n for (i = 0; i < $scope.manageCourse.course.offerings.length; i++) {\n if (typeof $scope.manageCourse.course.offerings[i].id === 'undefined' || $scope.manageCourse.course.offerings[i].id === 0) {\n offeringsToCreate.push($scope.manageCourse.course.offerings[i]);\n } else {\n if ($scope.manageCourse.course.offerings[i].isDirty) {\n offeringsToUpdate.push($scope.manageCourse.course.offerings[i]);\n }\n }\n }\n\n var allOfferingsPromises = [];\n var errormessage = \"\";\n\n if (offeringsToCreate.length > 0) {\n // Copy offerings to create to not disrupt the UI and setup create promise in offerings service\n var offerings = angular.copy(offeringsToCreate);\n /* To update the Format with Time */\n for (k = 0; k < offerings.length; k++) {\n if (offerings[k].requestedOn !== undefined) {\n offerings[k].requestedOn = dateUtil.formatDate(new Date(offerings[k].requestedOn.fullDateWithTime));\n }\n if (offerings[k].registrationEndDateTime === undefined || offerings[k].registrationEndDateTime === null) {\n offerings[k].registrationEndDateTime = dateUtil.formatDate(offerings[k].maxRegistrationEndDateTime);\n }\n\n offerings[k].registrationEndDateTime = dateUtil.formatDate(new Date(offerings[k].registrationEndDateTime.fullDateWithTime));\n }\n /* End */\n var createOfferingsDeferred = $q.defer();\n var createOfferingsPromise = OfferingsService.createOfferings(offerings);\n\n // Handle the create offerings return\n createOfferingsPromise.then(function (success) {\n\n _.each(success, function (item) {\n\n if (item.status === \"Success\") {\n var single = item.offering;\n\n var nOffering = _.findWhere($scope.manageCourse.course.offerings, { localId: single.localId, name: single.name });\n nOffering.isDirty = false;\n nOffering.id = single.id;\n nOffering.code = single.code;\n // Update UI sessions with ids from sessions in API response\n _.each(nOffering.sessions, function (session) {\n // Find each api session where start date matches UI session start date and end date matches UI session end date\n var apiSession = _.find(single.sessions, function (s) {\n var sd = new Date(s.startDateTime);\n var ed = new Date(s.endDateTime);\n return session.startDate.toLocaleString() === sd.toLocaleString() && session.endDate.toLocaleString() === ed.toLocaleString();\n });\n // Set UI session id = api session id. This is needed for saving so the API knows what is new or existing.\n session.id = apiSession.id;\n });\n\n } else {\n errormessage = errormessage === \"\" ? item.status : errormessage + \"\\r\\n\" + item.status;\n }\n });\n if (errormessage !== \"\") {\n $scope.manageCourse.editCourseOfferingsError.setError(\"\", errormessage);\n }\n\n createOfferingsDeferred.resolve();\n\n }, function (failure) {\n errormessage = errormessage === \"\" ? failure.ErrorMessage : errormessage + \"\\r\\n\" + failure.ErrorMessage;\n createOfferingsDeferred.resolve();\n });\n\n allOfferingsPromises.push(createOfferingsDeferred.promise);\n }\n\n if (offeringsToUpdate.length > 0) {\n var updateOfferingsDeferred = $q.defer();\n // Setup promises for all offerings that need to be updated\n var updateOfferingsPromise = OfferingsService.updateOfferingsBatch(offeringsToUpdate);\n\n // For each offering that needs to be updated, handle the response\n updateOfferingsPromise.then(function (success) {\n _.each(success, function (item) {\n if (item.status === \"Success\") {\n var single = item.offering;\n\n var uiOfferingUpdated = _.find($scope.manageCourse.course.offerings, function (ofr) {\n return (typeof ofr.id !== \"undefined\" && ofr.id === single.id);\n });\n\n uiOfferingUpdated.isDirty = false;\n uiOfferingUpdated.code = single.code;\n // Update UI sessions with ids from sessions in API response\n _.each(uiOfferingUpdated.sessions, function (session) {\n // Find each api session where start date matches UI session start date and end date matches UI session end date\n // Set UI session id = api session id\n var apiSession = _.find(single.sessions, function (s) {\n return session.startDateTime.toLocaleString() === s.startDateTime.toLocaleString() && session.endDateTime.toLocaleString() === s.endDateTime.toLocaleString();\n });\n\n session.id = apiSession.id;\n });\n } else {\n errormessage = errormessage === \"\" ? item.status : errormessage + \"\\r\\n\" + item.status;\n }\n });\n\n if (errormessage !== \"\") {\n $scope.manageCourse.editCourseOfferingsError.setError(\"\", errormessage);\n }\n\n updateOfferingsDeferred.resolve();\n\n }, function (failure) {\n errormessage = errormessage === \"\" ? failure.ErrorMessage : errormessage + \"\\r\\n\" + failure.ErrorMessage;\n updateOfferingsDeferred.resolve();\n });\n\n allOfferingsPromises.push(updateOfferingsDeferred.promise);\n }\n\n $q.all(allOfferingsPromises).then(function (success) {\n if (errormessage === \"\") {\n $scope.manageCourse.stepFive.isLoading = false;\n WizardHandler.wizard('Content').next();\n $scope.manageCourse.cancelMessage = _this.setCourseCancelMessage(6);\n } else {\n $scope.manageCourse.onSessionsTab = true;\n $scope.manageCourse.stepFive.isLoading = false;\n $scope.manageCourse.stepFive.error.setError(\"\", errormessage);\n }\n });\n };\n\n $scope.manageCourse.maxEnrollmentAttemptsToggle = true;\n\n /* stores the course returned by the server\n * when we create a course on step 2 */\n $scope.manageCourse.createdCourse = null;\n $scope.manageCourse.documentList = [];\n //$scope.manageCourse.cancelMessage = _this.setCourseCancelMessage(1);\n $scope.manageCourse.selectAssignment = function (assignmentType) {\n // Assigning this twice. Should probably refactor.\n $scope.manageCourse.currentAssignmentType = assignmentType;\n $scope.manageCourse.course.type = assignmentType;\n $scope.manageCourse.course.productType = \"Course\";\n switch (assignmentType) {\n case 'wbt':\n $scope.manageCourse.course.tileImage = 'grab_bag/0';\n break;\n case 'ilt':\n $scope.manageCourse.course.tileImage = 'grab_bag/1';\n break;\n case 'vle':\n break;\n case 'task':\n $scope.manageCourse.course.tileImage = 'grab_bag/2';\n break;\n case 'survey':\n $scope.manageCourse.course.tileImage = 'grab_bag/3';\n break;\n case 'evaluation':\n $scope.manageCourse.course.tileImage = 'grab_bag/4';\n break;\n case 'assessment':\n $scope.manageCourse.course.tileImage = 'grab_bag/5';\n break;\n case 'courseGroup':\n case 'courseGroupCurricula':\n case 'courseGroupCertification':\n $scope.manageCourse.course.tileImage = 'grab_bag/8';\n break;\n case 'careerPath':\n $scope.manageCourse.course.tileImage = 'grab_bag/9';\n $scope.manageCourse.newCareerPath = true;\n break;\n case 'doc':\n $scope.manageCourse.course.tileImage = 'grab_bag/102';\n $scope.manageCourse.course.productType = 'Document';\n break;\n default:\n break;\n }\n var skillsPromise = SkillService.fetch();\n skillsPromise.then(function (success) {\n $scope.availableSkills = success;\n }, function (failure) {\n\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n\n $scope.manageCourse.error.setError(errorCode, message);\n });\n var assignmentTypeIndex = _.findIndex($scope.manageCourse.ASSIGNMENT_TYPE_ENUM, { code: assignmentType });\n if (assignmentTypeIndex > -1) {\n $scope.manageCourse.currentAssignmentTypeFullName = $scope.manageCourse.ASSIGNMENT_TYPE_ENUM[assignmentTypeIndex].title;\n }\n\n // Set a default value for the course code, format like 'wbt20170714141522923' with time including ms to encourage uniqueness\n $scope.manageCourse.course.code = ($scope.manageCourse.currentAssignmentType + (new Date()).toISOString().replace(/[^0-9]/g, ''));\n //Set Initial Radio Values for EA-2776\n $scope.manageCourse.course.visible = true;\n $scope.manageCourse.course.isManagerApprovalRequired = false;\n\n //EA-6351 For all course types - get list of custom categories to select from\n var categories = CategoriesService.fetch(null, false, true);\n\n categories.then(function (success) {\n var filterby = $scope.manageCourse.currentAssignmentType.toLowerCase() === 'doc' ? 'document' : 'course';\n if (filterby !== 'document') {\n success = CategoriesService.RemoveDocumentPolicies(success);\n }\n $scope.taxonomyOptions = $filter('filter')(success, { categoryType: filterby });\n $scope.subcategoryDisabled = true;\n $scope.createUniqueCategoryList();\n\n }, function (error) {\n $scope.manageCourse.stepTwo.error.setError(error.ErrorCode, error.ErrorMessage);\n });\n\n\n _this.setSecondaryProperties($scope.manageCourse.course.type);\n\n WizardHandler.wizard('Content').next();\n $scope.manageCourse.cancelMessage = _this.setCourseCancelMessage(2);\n };\n\n\n\n $scope.manageCourse.goBackToStep2 = function () {\n // delete $scope.manageCourse.course.id;\n // If we delete the courseId., evrytime user toggle between step 2-3 ., a new course\n // is created., so we shouldn't delete the courseid. see line 930., it is being used in that func\n\n WizardHandler.wizard('Content').previous();\n if (WizardHandler.wizard(\"Course\").getEnabledSteps().length >= 3) {\n WizardHandler.wizard(\"Course\").getEnabledSteps()[2].selected = false;\n WizardHandler.wizard(\"Course\").getEnabledSteps()[2].completed = false;\n }\n $scope.manageCourse.cancelMessage = _this.setCourseCancelMessage(2);\n\n $scope.selectCategory();\n };\n\n /**\n * Jump to given step in wizard\n *\n * @param step {int} Step to go to\n */\n $scope.manageCourse.goTo = function (step) {\n WizardHandler.wizard('Content').goTo(step);\n WizardHandler.wizard(\"Course\").getEnabledSteps()[step + 1].selected = false;\n WizardHandler.wizard(\"Course\").getEnabledSteps()[step + 1].completed = false;\n $scope.manageCourse.cancelMessage = _this.setCourseCancelMessage(step + 1);\n\n return;\n };\n\n $scope.manageCourse.hideModal = function () {\n jQuery('#courseCreateSuccessModal').modal('hide');\n $timeout(function() {\n $location.url('courses/home/');\n }, 400); // Wait for modal to finish leaving\n };\n\n _this._attachFiles = function (courseId, scormPackages, documentList, shellType) {\n var filesToUpload = [];\n\n if (typeof scormPackages !== 'undefined' && scormPackages.length > 0) {\n for (var i = 0; i < scormPackages.length; i += 1) {\n filesToUpload.push(CoursesService.uploadScormPackage(scormPackages[i], courseId, shellType));\n }\n }\n\n if (typeof documentList !== 'undefined' && documentList.length > 0) {\n for (var j = 0; j < documentList.length; j += 1) {\n // Uploading a document from browser\n if (documentList[j].fileOrUrl === 'file' && !documentList[j].fromRepo) {\n //If this doc is set to launch with content, sequence the save so that the correct resourceID is saved to the course\n if (documentList[j].launchWithContent === true) { $scope.sequenceCourseSave = true; }\n filesToUpload.push(DocumentService.uploadDocument(documentList[j].fileObject, courseId, documentList[j].launchWithContent));\n }\n\n // Attaching document from repository\n if (documentList[j].fileOrUrl === 'file' && documentList[j].fromRepo) {\n filesToUpload.push(DocumentService.attachDocumentFromRepositoryToCourse(documentList[j].id, courseId));\n }\n\n // Attaching a URL\n if (documentList[j].fileOrUrl === 'url') {\n //If this url is set to launch with content, sequence the save so that the correct resourceID is saved to the course\n if (documentList[j].launchWithContent === true) { $scope.sequenceCourseSave = true; }\n filesToUpload.push(DocumentService.attachUrlToCourse(documentList[j].name, courseId, documentList[j].launchWithContent));\n }\n }\n }\n\n //See if there are any deleted files, if so, add the delete api call to the array\n if (typeof documentList !== 'undefined' && typeof documentList.deletedFiles !== 'undefined' && documentList.deletedFiles.length > 0) {\n for (var e = 0; e < documentList.deletedFiles.length; e += 1) {\n if (typeof documentList.deletedFiles[e].id !== 'undefined')\n filesToUpload.push(DocumentService.deleteAsset(courseId, documentList.deletedFiles[e].id));\n }\n }\n\n\n return $q.all(filesToUpload);\n };\n\n $scope.manageCourse.addScormPackage = function ($files) {\n $scope.isNotZipFile = false;\n\n if ($files.length === 0) {\n return;\n }\n\n var file = $files[0];\n\n if (!(file.type === 'application/zip' || file.type === 'application/x-zip-compressed')) {\n $scope.isNotZipFile = true;\n\n return;\n }\n\n file.uniqueId = Date.now();\n\n $scope.manageCourse.scormPackages.push(file);\n };\n\n /* Called when you press the X button on the gray box\n * in the scorm package list */\n $scope.manageCourse.removeScormPackage = function (fileToRemove) {\n $scope.manageCourse.scormPackages = _.filter($scope.manageCourse.scormPackages, function (file) {\n return (file.uniqueId !== fileToRemove.uniqueId);\n });\n };\n\n /* Called by $scope.createAction */\n _this._clearCourseCreateForm = function () {\n $scope.manageCourse.course = {};\n $scope.manageCourse.scormPackages = [];\n $scope.manageCourse.documentList = [];\n $scope.manageCourse.course.courseList = [];\n var jsStartDate = dateUtil.setPortalStartTime(new Date());\n $scope.manageCourse.course.displayStart = dateUtil.formatDate(jsStartDate);\n\n // Used to maintain all courses for course groups per SLY-3542\n $scope.manageCourse.previouslyAddedCourses = [];\n\n $scope.manageCourse.enrollmentAttemptsRegex = /^\\d+$/;\n };\n\n _this._showWizardSuccessScreen = function () {\n $scope.manageCourse.isLoading = false;\n\n $scope.manageCourse.error.reset();\n\n jQuery('#courseCreateSuccessModal').modal();\n\n _this._clearCourseCreateForm();\n };\n\n // Used on the common properties page\n $scope.manageCourse.createCourse = function () {\n $scope.manageCourse.stepTwo.isLoading = true;\n $scope.manageCourse.error.reset();\n\n // This is used to promt the user with warning about skills changeing career path, disabling it so it affect the next step\n $scope.manageCourse.skillsUpdated = false;\n\n var courseId = $scope.manageCourse.course.id;\n var course;\n //Make a copy of the course object to update so that the manageCourse is not altered\n var courseToUpdate = angular.copy($scope.manageCourse.course);\n if (courseToUpdate.displayStart !== undefined && courseToUpdate.displayStart !== null)\n courseToUpdate.displayStart = dateUtil.formatDate(new Date(courseToUpdate.displayStart.fullDate.toString() + ' 02:59 AM'));\n if (courseToUpdate.displayEnd !== undefined && courseToUpdate.displayEnd !== null)\n courseToUpdate.displayEnd = dateUtil.formatDate(new Date(courseToUpdate.displayEnd.fullDate.toString() + ' 02:59 AM'));\n if (typeof courseId === 'undefined' || courseId === null) {\n course = CoursesService.createCourse(courseToUpdate);\n } else if (courseId) {\n course = _this.updateCourseCommonProp(courseToUpdate);\n }\n\n var courseLoadPromises = [course, SkillService.fetch()];\n\n $q.all(courseLoadPromises).then(function (allSuccess) {\n var success = allSuccess[0];\n $scope.availableSkills = allSuccess[1];\n $scope.manageCourse.stepTwo.isLoading = false;\n /**\n * After moving sessions to proper place, overwriting the course object with the response causes\n * functionally required nodes to disappear. Merging objects fixes this.\n */\n $scope.manageCourse.course = _.extend($scope.manageCourse.course, success);\n if ($scope.manageCourse.course.type === 'wbt') {\n $scope.manageCourse.course.shellType = 1;\n\n }\n var courseGroupTypes = [\n 'courseGroup',\n 'courseGroupCertification',\n 'courseGroupCurricula'\n ];\n\n if (jQuery.inArray($scope.manageCourse.course.type, courseGroupTypes) > -1) {\n $scope.manageCourse.course.childCourses = angular.copy($scope.manageCourse.previouslyAddedCourses);\n }\n\n WizardHandler.wizard('Content').next();\n $scope.manageCourse.cancelMessage = _this.setCourseCancelMessage(3);\n /* after course creation - reload the courses for the TA Courses home */\n CoursesService.getActiveCoursesForOrg(true, true);\n }, function (error) {\n $scope.manageCourse.stepTwo.isLoading = false;\n\n $scope.manageCourse.stepTwo.error.setError(error.ErrorCode, error.ErrorMessage);\n });\n };\n\n $scope.manageCourse.setNonScoring = function (value) {\n if (value) {\n $scope.manageCourse.course.masteryScore = 0;\n }\n };\n\n /**\n *\n * To set a proper mesage on cancel action for a respective step in course create.\n * @param step {int} course step\n */\n _this.setCourseCancelMessage = function (step) {\n switch (step) {\n case 2:\n return \"This will take you out of Course creation.\\nDo you wish to continue?\";\n case 3:\n return \"Changes you made to this step will not be saved.\\nDo you wish to continue?\";\n case 4:\n case 5:\n case 6:\n return \"Changes you made will not be saved.\\nDo you wish to continue?\";\n\n default:\n return \"Are you sure want to cancel?\";\n\n }\n };\n\n /**\n *\n *\n * @param type {string} Course type\n */\n _this.setSecondaryProperties = function (type) {\n _this._initAdditionalStep('Two', 'Properties');\n _this._initAdditionalStep('Three', 'Details');\n\n switch (type) {\n case 'wbt':\n $scope.manageCourse.course.score = null;\n\n break;\n case 'ilt':\n _this._initAdditionalStep('Four', 'Offerings');\n //_this._initAdditionalStep('Five', 'Sessions');\n _this._initAdditionalStep('Six', 'Roster');\n\n break;\n }\n };\n\n /**\n * Initialize extra steps for the wizard, in case more than three are needed\n *\n * @param step\n * @param name\n *\n * @private\n */\n _this._initAdditionalStep = function (step, name) {\n $scope.manageCourse['step' + step] = {};\n\n var currentStep = $scope.manageCourse['step' + step];\n\n currentStep.error = messagingDisplayerUtil.create();\n currentStep.isLoading = false;\n currentStep.allSessions = [];\n currentStep.errorCount = 0;\n currentStep.exists = true;\n currentStep.name = name;\n };\n\n /**\n * Create appropriate data for the fourth step. Only happens when fourth step exists.\n *\n * @private\n */\n $scope.manageCourse._stepFourAction = function () {\n switch ($scope.manageCourse.course.type) {\n case 'ilt':\n $scope.manageCourse.stepFour.autoCompleteError = false;\n\n $scope.manageCourse.course.offerings = [];\n var offering = OfferingsService.createGenericOffering(1, $scope.manageCourse.course.id);\n offering.accordionOpen = true;\n\n _this.setNewOfferingDefaults(offering);\n\n _this.setOfferingAccordionHeading(offering);\n\n $scope.manageCourse.course.offerings.push(offering);\n /* step five has been merged into step four, so merge the inits */\n $scope.manageCourse.initializeSessionCreator();\n\n break;\n default:\n break;\n }\n };\n\n /**\n * Create appropriate data for the fifth step. Only happens when fifth step exists.\n *\n * @private\n */\n $scope.manageCourse.initializeSessionCreator = function () {\n switch ($scope.manageCourse.course.type) {\n case 'ilt':\n $scope.manageCourse.stepFive.sessionCreator = {};\n $scope.ilt = {};\n\n $scope.manageCourse.stepFive.sessionCreator.days = [];\n\n $scope.manageCourse.stepFive.sessionCreator.endDate = null;\n\n $scope.manageCourse.stepFive.sessionCreator.endTime = null;\n $scope.manageCourse.stepFive.sessionCreator.startDate = null;\n $scope.manageCourse.stepFive.sessionCreator.startTime = null;\n\n $scope.manageCourse.stepFive.repeatOptions = [{\n id: 1,\n label: 'Daily'\n }, {\n id: 2,\n label: 'Weekly'\n }, {\n // @TODO: @sfrohm - find out if Karen really wants bi-weekly.\n // id: 3,\n // label: 'Bi-weekly'\n // }, {\n id: 4,\n label: 'Monthly'\n }, {\n id: 5,\n label: 'Yearly'\n }];\n $scope.manageCourse.stepFive.sessionCreator.includeWeekdaysOnly = false;\n\n break;\n default:\n break;\n } // end switch\n }; // end $scope.manageCourse.initializeSessionCreator\n\n /**\n * Create appropriate data for the sixth step. Only happens when sixth step exists.\n *\n * @private\n */\n $scope.manageCourse._stepSixAction = function () {\n switch ($scope.manageCourse.course.type) {\n case 'ilt':\n $scope.manageCourse.stepSix.currentCompletedTotal = 0;\n $scope.manageCourse.stepSix.currentSuccessTotal = 0;\n $scope.manageCourse.stepSix.totalCompletionsPossible = 0;\n\n break;\n default:\n break;\n }\n };\n\n /**\n * Create or update the roster\n */\n $scope.manageCourse.addUsersToRosterCall = function () {\n /**\n * Reset all values becuase we're restarting the calls\n */\n $scope.manageCourse.stepSix.currentCompletedTotal = 0;\n $scope.manageCourse.stepSix.currentSuccessTotal = 0;\n $scope.manageCourse.stepSix.totalCompletionsPossible = 0;\n\n var offerings = $scope.manageCourse.course.offerings;\n\n var roster, user = null;\n\n $scope.manageCourse.stepSix.isLoading = true;\n\n for (var i = 0; i < offerings.length; i++) {\n roster = offerings[i].roster.attendingStudents;\n\n if (roster.length > 0) {\n $scope.manageCourse.stepSix.totalCompletionsPossible += roster.length;\n\n for (var j = 0; j < roster.length; j++) {\n user = roster[j];\n\n if (typeof user.error === \"undefined\" || user.error === null) {\n user.error = messagingDisplayerUtil.create();\n }\n else {\n user.error.reset();\n }\n\n if (typeof user.success === \"undefined\" || user.success === null) {\n user.success = messagingDisplayerUtil.create();\n } else if (user.success.thrown === true) {\n /**\n * Make this one less because one person already succeeded. Otherwise,\n * we'll be in an infinite loop.\n */\n $scope.manageCourse.stepSix.totalCompletionsPossible--;\n\n continue;\n }\n\n _this.updateUserInRoster(offerings[i], user);\n }\n }\n }\n\n /**\n * Run the completion state anyways. No one was added to the roster, which is valid.\n */\n if ($scope.manageCourse.stepSix.totalCompletionsPossible === 0) {\n _this.trackUserToRosterCompletions();\n }\n };\n\n _this.updateUserInRoster = function (offering, user) {\n user.isLoading = true;\n\n user.call = RosterService.updateSinglePersonOnRoster(user.id, offering.id, 'confirmed', 'ilt');\n user.call.then(function (success) {\n $scope.manageCourse.stepSix.currentCompletedTotal++;\n $scope.manageCourse.stepSix.currentSuccessTotal++;\n\n $scope.manageCourse.singleUserToRosterSuccess(user);\n }, function (failure) {\n $scope.manageCourse.stepSix.currentCompletedTotal++;\n\n $scope.manageCourse.singleUserToRosterError(failure, user);\n });\n };\n\n $scope.manageCourse.singleUserToRosterError = function (failure, user) {\n user.isLoading = false;\n\n user.error.setError(failure.ErrorCode, failure.ErrorMessage);\n\n _this.trackUserToRosterCompletions();\n };\n\n $scope.manageCourse.singleUserToRosterSuccess = function (user) {\n user.isLoading = false;\n\n user.success.setError(200, 'Successfully added ' + user.fullName + ' to roster!');\n\n _this.trackUserToRosterCompletions();\n };\n\n _this.trackUserToRosterCompletions = function () {\n $scope.manageCourse.stepSix.isLoading = false;\n\n if ($scope.manageCourse.stepSix.currentSuccessTotal === $scope.manageCourse.stepSix.totalCompletionsPossible) {\n jQuery('#courseCreateSuccessModal').modal();\n } else if ($scope.manageCourse.stepSix.currentCompletedTotal === $scope.manageCourse.stepSix.totalCompletionsPossible) {\n\n }\n };\n\n $scope.manageCourse.getTotalSessionsForAllOfferings = function () {\n var offerings = $scope.manageCourse.course.offerings;\n\n var totalSessions = 0;\n\n _.each(offerings, function (offering) {\n totalSessions += offering.sessions.length;\n });\n\n return totalSessions;\n };\n\n /**\n * Search for users\n *\n * @param value {string} Search value\n * @param offering {obj} Offering whose roster will be used to filter already selected users\n */\n $scope.manageCourse.searchForUsers = function (value, offering) {\n if (typeof offering.search === \"undefined\") {\n offering.search = {};\n offering.search.error = messagingDisplayerUtil.create();\n }\n offering.search.error.reset();\n offering.search.isLoading = true;\n\n var searchAttributes = {};\n searchAttributes.pageNumber = 1;\n searchAttributes.pageSize = 25;\n searchAttributes.fullNameContains = value;\n\n var users = UsersService.advancedSearch(searchAttributes);\n\n //var users = UsersService.search(value);\n return users.then(function (success) {\n offering.search.isLoading = false;\n\n if (offering.roster.attendingStudents.length > 0) {\n /**\n * Filter out existing existing people that are in the roster. We don't want dupes\n *\n * @type {Array}\n */\n success = _.filter(success, function (user) {\n var existingUser = _.findWhere(offering.roster.attendingStudents, { id: user.id });\n\n if (typeof existingUser !== \"undefined\" && existingUser !== null && user.id === existingUser.id) {\n return false;\n }\n return user;\n });\n\n if (success.length === 0) {\n offering.rosterUser = \"\";\n offering.search.error.setError(404, 'There are no items to display.');\n return false;\n }\n }\n var finalSorted = sortService.sortByPropertyContains(success, value, 'fullName');\n return finalSorted;\n }, function (failure) {\n offering.search.isLoading = false;\n offering.search.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n /**\n * Insert the user into an offering's roster\n *\n * @param $item {obj} Selected item\n * @param $model {obj} Selected item\n * @param $label {string} Label that contains selected info\n * @param $event {obj} Click event\n * @param offering {obj} Offering to insert users into an roster\n */\n $scope.manageCourse.selectUsersForRoster = function ($item, $model, $label, $event, offering) {\n offering.rosterUser = '';\n if (offering.roster.attendingStudents.length < offering.maxAllowedSize) {\n offering.roster.attendingStudents.push($item);\n offering.isDirty = true;\n offering.roster.isDirty = true;\n }\n };\n\n /**\n * Remove user from an offering's roster\n *\n * @param user {obj} User to be removed\n * @param offering {obj} Offering whose roster will be modified\n */\n $scope.manageCourse.removeUserFromRoster = function (user, offering) {\n var index = offering.roster.attendingStudents.indexOf(user);\n\n offering.roster.attendingStudents.splice(index, 1);\n\n var courseUpdateMethod = $route.current.params.name;\n if (typeof courseUpdateMethod !== 'undefined' && courseUpdateMethod === 'edit') {\n user.isLoading = true;\n var user_deleteFromRoster = RosterService.updateSinglePersonOnRoster(user.id, offering.id, 'cancelled', 'ilt');\n user_deleteFromRoster.then(function (success) {\n user.isLoading = false;\n\n }, function (failure) {\n user.isLoading = false;\n user.error.setError(failure.ErrorCode, failure.ErrorMessage);\n });\n }\n };\n\n // Only used on the details page\n $scope.manageCourse.addExtraCourseProperties = function (confirmed) {\n\n if ($scope.manageCourse.skillsUpdated === true && confirmed !== true) {\n $scope.manageCourse.childrenUpdated = false;\n $scope.manageCourse.confirmIsOpen = true;\n return;\n }\n else {\n $scope.manageCourse.confirmIsOpen = false;\n }\n\n $scope.manageCourse.stepThree.isLoading = true;\n\n $scope.manageCourse.stepThree.error.reset();\n\n var courseToUpdate = angular.copy($scope.manageCourse.course);\n if (courseToUpdate.type === 'careerPath') {\n courseToUpdate.childCourses = _this.getOrderedChildCourses(courseToUpdate.childCourses);\n }\n\n if (courseToUpdate.productType === 'Document') {\n //Stub area for EA-8842 to set course type\n //Until upload is finalized, add success message\n $scope.manageCourse.stepThree.isLoading = false;\n _this.performSecondaryAction();\n }\n\n var updatedCourse = CoursesService.updateCourse(courseToUpdate);\n updatedCourse.then(function () {\n var documentList = (typeof $scope.manageCourse.course.documentList !== 'undefined') ? $scope.manageCourse.course.documentList : $scope.manageCourse.documentList;\n var filesToUpload = _this._attachFiles($scope.manageCourse.course.id, $scope.manageCourse.scormPackages, documentList, $scope.manageCourse.course.shellType);\n\n filesToUpload.then(function () {\n $scope.manageCourse.stepThree.isLoading = false;\n $rootScope.$broadcast(\"RefreshDocList\", { courseId: $scope.manageCourse.course.id });\n _this.performSecondaryAction();\n }, function (error) {\n $rootScope.$broadcast(\"RefreshDocList\", { courseId: $scope.manageCourse.course.id });\n $scope.manageCourse.stepThree.isLoading = false;\n $scope.manageCourse.stepThree.error.setError(error.ErrorCode, error.ErrorMessage);\n });\n\n }, function (error) {\n $scope.manageCourse.stepThree.isLoading = false;\n\n $scope.manageCourse.stepThree.error.setError(error.ErrorCode, error.ErrorMessage);\n });\n };\n\n //Launch Latitude's assessment editor for surveys/evaluations during the creation process\n $scope.launchEditor = function (url) {\n\n\n //sly-3910/3911 need to update so a script can run\n var courseToUpdate = angular.copy($scope.manageCourse.course);\n var updatedCourse = CoursesService.updateCourse(courseToUpdate);\n updatedCourse.then(function () {\n console.log(\"eval success\");\n $scope.launchUrl(url, '_blank');\n }\n );\n };\n\n\n\n\n _this.filterRowsByCatalogId = function (node) {\n var nodeId = node.nodeId;\n _.each($scope.coursesSelected, function (course) {\n if (course.catalogId === nodeId) {\n _this.emptyArray.push(course);\n }\n });\n\n if (node.nodes) {\n _.each(node.nodes, function (childNode) {\n _this.filterRowsByCatalogId(childNode);\n });\n }\n\n return _this.emptyArray;\n };\n\n /**\n * Method generalizes the course saving method. This way, we can have alternate paths, in case we need\n * to do something else other than attaching files/creating sessions/etc.\n *\n * @void\n */\n _this.performSecondaryAction = function (edit) {\n switch ($scope.manageCourse.course.type) {\n case 'ilt':\n if (edit === true) {\n\n } else {\n for (var i = 0; i < $scope.manageCourse.course.offerings.length; i++) {\n $scope.manageCourse.course.offerings[i].courseId = $scope.manageCourse.course.id;\n }\n }\n\n // Get locations for the next screen.\n var locations = LocationsService.getAllActive();\n locations.then(function (success) {\n $scope.manageCourse.locations = success;\n\n }, function () {\n // @TODO: what do we do if there are no locations?\n });\n\n var instructors = UsersService.getAllInstructors();\n instructors.then(function (success) {\n $scope.manageCourse.stepFour.instructors = success;\n }, function (failure) {\n\n });\n\n WizardHandler.wizard('Content').next();\n $scope.manageCourse.cancelMessage = _this.setCourseCancelMessage(4);\n break;\n default:\n _this._showWizardSuccessScreen();\n\n break;\n }\n };\n\n $scope.changeSortBy = function (sortBy) {\n $scope.propertyName = sortBy;\n\n $scope.reverse = ($scope.propertyName === sortBy) ? !$scope.reverse : false;\n\n if (sortBy.indexOf('displayStart') >= 0) {\n _this.currentCourseSet = _.sortBy(_this.currentCourseSet, function (c) {\n var dt = new Date(c.displayStart.apiDate);\n return dt;\n });\n } else if (sortBy.indexOf('displayEnd') >= 0) {\n _this.currentCourseSet = _.sortBy(_this.currentCourseSet, function (c) {\n if (c.displayEnd !== 'undefined' && c.displayEnd !== null) {\n var dt = new Date(c.displayEnd.apiDate);\n return dt;\n }\n return -1;\n });\n } else {\n _this.currentCourseSet = _.sortBy(_this.currentCourseSet, $scope.propertyName);\n }\n\n\n if ($scope.reverse === true) {\n _this.currentCourseSet.reverse();\n }\n\n /**\n * Reset page size and info for paginator\n */\n _this.calculatePages(_this.currentCourseSet);\n\n var start = ($scope.home.page * $scope.home.limit) - $scope.home.limit;\n\n var copy = angular.copy(_this.currentCourseSet);\n\n $scope.rows = copy.splice(start, $scope.home.limit);\n };\n\n $scope.selectedCourseCount = 0;\n $scope.checkForLength = function (value) {\n if (value === true) {\n $scope.selectedCourseCount++;\n } else {\n $scope.selectedCourseCount--;\n }\n };\n\n $scope.addAllCourses = function (value) {\n\n _.each($scope.courseData, function (course) {\n course.select = value;\n });\n\n if (value === true) {\n $scope.selectedCourseCount = $scope.courseData.length;\n } else {\n $scope.selectedCourseCount = 0;\n }\n };\n\n _this.allCourses = function () {\n $scope.assignmentTableError.error.reset();\n var latestmatch = CoursesService.checkLatestCourse();\n latestmatch.then(function (success) {\n var allCoursesData = CoursesService.getActiveCoursesForOrg(!success, true);\n\n return allCoursesData.then(function (success) {\n $scope.rowsAreLoading = false;\n _this.createCourseArrays(success);\n\n if (typeof $scope.edit === 'undefined') {\n $scope.edit = {};\n }\n /* Compose a list of evaluations from complete list of courses available.\n needed to populate evaluation dropdown. \n */\n if (typeof _this.params.name !== 'undefined' && _this.params.name !== null && _this.params.name === \"edit\") {\n //only need to do this if allCourses is called on Edit course \n $scope.manageCourse.evaluationsNsurveys = _this.getEvaluations(_this.allCoursesData);\n }\n }, function (failure) {\n $scope.baiCatalogIsLoading = false;\n $scope.rowsAreLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.assignmentTableError.error.setError(errorCode, message);\n });\n });\n };\n\n _this.formatCoursesData = function (data) {\n var filteredData = [];\n _.each(data, function (datapoint) {\n datapoint.select = false;\n if (datapoint.type !== 'courseGroup' &&\n datapoint.type !== 'courseGroupCertification' &&\n datapoint.type !== 'courseGroupCurricula' &&\n datapoint.type !== 'careerPath') {\n filteredData.push(datapoint);\n }\n });\n\n return filteredData;\n };\n\n\n _this.createCourseArrays = function (courses) {\n\n /**\n * Keep data in memory and away from angular\n */\n _this.allCoursesData = courses.sortedList;\n\n _this.currentCourseSet = courses.currentCourseSet;\n\n /* set the bai courses / bai documents / custom courses array to use for catalog filtering */\n _this.customCourses = courses.customCourses;\n _this.baiDocuments = _this.currentCourseSet.filter(function (c) { return c.baiOnly && c.normalizedProductType === \"document\"; });\n _this.baiCourses = _this.currentCourseSet.filter(function (c) { return c.baiOnly && c.normalizedProductType !== \"document\"; });\n _this.customDocuments = _this.currentCourseSet.filter(function (c) { return !c.baiOnly && c.normalizedProductType === \"document\"; });\n\n /**\n * Reset page size and info for paginator\n */\n _this.calculatePages(_this.allCoursesData);\n\n /**\n * Get the top 100 courses to render on the screen\n */\n $scope.rows = courses.topOneHundred;\n\n };\n\n // do not filter out course groups, curricula or certifications\n _this.formatCoursesPrerequisiteData = function (data) {\n var filteredData = [];\n _.each(data, function (datapoint) {\n datapoint.select = false;\n if (datapoint.type !== 'courseGroup' &&\n datapoint.type !== 'courseGroupCertification' &&\n datapoint.type !== 'courseGroupCurricula' &&\n datapoint.type !== 'careerPath' &&\n datapoint.type !== 'task' &&\n datapoint.type !== 'assessment' &&\n datapoint.type !== 'evaluation' &&\n datapoint.type !== 'survey' &&\n datapoint.type !== 'vle') {\n filteredData.push(datapoint);\n }\n });\n\n return filteredData;\n };\n\n _this.getEvaluations = function (data) {\n /* Compose a list of evaluations from complete list of courses available.\n needed to populate evaluation dropdown. \n */\n var output = [];\n var tempCourse = {\n name: 'Select One',\n type: 'default',\n evaluationId: 0,\n id: 0\n };\n $filter('filter')(data, function (course) {\n if (course.type === 'evaluation' || course.type === 'survey')\n output.push(course);\n });\n var result = _.sortBy(output, 'name');\n result.unshift(tempCourse);\n\n return result;\n };\n _this.setEvaluations = function () {\n var allCoursesFromCache = CoursesService.getActiveCoursesForOrgFromCache();\n if (allCoursesFromCache !== undefined && allCoursesFromCache !== null) {\n $scope.manageCourse.evaluationsNsurveys = _this.getEvaluations(allCoursesFromCache);\n }\n else {\n _this.allCourses();\n }\n };\n\n $scope.courseSearchModal = {};\n $scope.courseSearchModal.courseSearch = '';\n $scope.courseSearchModal.selectAll = false;\n $scope.courseSearchModal.coursesAreLoading = true;\n\n $scope.viewCoursesError = {};\n $scope.viewCoursesError.error = messagingDisplayerUtil.create();\n\n $scope.getAllCoursesCta = function (keyword) {\n //changes start here\n $scope.modalBodyShow = true;\n $scope.selectedCourseCount = 0;\n $scope.viewCoursesError.error.reset();\n $scope.courseSearchModal.coursesAreLoading = true;\n $scope.courseSearchModal.selectAll = false;\n\n var allCoursesData = CoursesService.getActiveCoursesForOrg(false, false);\n allCoursesData.then(function (success) {\n var formattedCourseData = _this.formatCoursesData(success);\n\n if (typeof keyword !== 'undefined' && keyword !== null) {\n\n formattedCourseData = $filter('filter')(formattedCourseData, keyword);\n $scope.courseData = $filter('filter')(formattedCourseData, { 'productType': '!Document' });\n\n } else {\n $scope.courseData = $filter('filter')(formattedCourseData, { 'productType': '!Document' });\n }\n\n $scope.courseSearchModal.coursesAreLoading = false;\n\n }, function (error) {\n $scope.courseSearchModal.coursesAreLoading = false;\n var errorCode = error.StatusCode;\n var message = error.ErrorMessage;\n $scope.viewCoursesError.error.setError(errorCode, message);\n });\n };\n\n /* course search for modal to add courses to a Career Path */\n $scope.getAllCoursesWithSkills = function (keyword) {\n $scope.modalBodyShow = true;\n $scope.selectedCourseCount = 0;\n $scope.viewCoursesError.error.reset();\n $scope.courseSearchModal.coursesAreLoading = true;\n $scope.courseSearchModal.selectAll = false;\n\n var allCoursesData = CoursesService.getActiveCoursesForOrg(false, false);\n allCoursesData.then(function (success) {\n var formattedCourseData = _this.formatCoursesData(success);\n var courseIDs = [];\n\n _.each(formattedCourseData, function (course) {\n courseIDs.push(course.id);\n });\n\n var courseSkills = SkillService.fetchSkillsForCourses(courseIDs);\n courseSkills.then(function (success) {\n _.each(formattedCourseData, function (course) {\n course.skills = _.where(success, { courseID: course.id });\n course.skillsString = _this.skillsToString(course.skills);\n });\n\n if (typeof keyword !== 'undefined' && keyword !== null) {\n\n formattedCourseData = $filter('filter')(formattedCourseData, keyword);\n $scope.courseData = $filter('filter')(formattedCourseData, { 'productType': '!Document' });\n\n } else {\n $scope.courseData = $filter('filter')(formattedCourseData, { 'productType': '!Document' });\n\n }\n\n $scope.courseSearchModal.coursesAreLoading = false;\n\n }, function (error) {\n $scope.courseSearchModal.coursesAreLoading = false;\n var errorCode = error.StatusCode;\n var message = error.ErrorMessage;\n $scope.viewCoursesError.error.setError(errorCode, message);\n });\n\n\n\n }, function (error) {\n $scope.courseSearchModal.coursesAreLoading = false;\n var errorCode = error.StatusCode;\n var message = error.ErrorMessage;\n $scope.viewCoursesError.error.setError(errorCode, message);\n });\n };\n\n _this.skillsToString = function (skills) {\n var sorted = _.sortBy(skills, 'name');\n var skillsString = '';\n var i;\n for (i = 0; i < skills.length; i++) {\n if (i !== 0) {\n skillsString += ', ';\n }\n skillsString += sorted[i].name;\n }\n return skillsString;\n };\n\n $scope.getAllCoursesPrerequisiteCta = function (keyword) {\n $scope.courseactivetab = false;\n $scope.modalBodyShow = true;\n $scope.selectedCourseCount = 0;\n $scope.viewCoursesError.error.reset();\n $scope.courseSearchModal.coursesAreLoading = true;\n $scope.courseSearchModal.selectAll = false;\n\n var allCoursesData = CoursesService.getActiveCoursesForOrg(false, false);\n allCoursesData.then(function (success) {\n var formattedCourseData = _this.formatCoursesPrerequisiteData(success);\n\n if (typeof keyword !== 'undefined' && keyword !== null) {\n\n formattedCourseData = $filter('filter')(formattedCourseData, keyword);\n $scope.courseData = $filter('filter')(formattedCourseData, { 'productType': '!Document' });\n\n } else {\n $scope.courseData = $filter('filter')(formattedCourseData, { 'productType': '!Document' });\n }\n\n $scope.courseSearchModal.coursesAreLoading = false;\n\n }, function (error) {\n $scope.courseSearchModal.coursesAreLoading = false;\n var errorCode = error.StatusCode;\n var message = error.ErrorMessage;\n $scope.viewCoursesError.error.setError(errorCode, message);\n });\n };\n\n $scope.applyNewAssignmentsCta = function (data) {\n var selectedCourses = _this.getSelectedCourses(data);\n var selectedCourseIds = [];\n _.each(selectedCourses, function (course) {\n if (typeof ($scope.manageCourse.course.childCourses) !== 'undefined' && $scope.manageCourse.course.childCourses.indexOf(course) === -1) {\n $scope.manageCourse.course.childCourses.push(course);\n }\n if (typeof ($scope.manageCourse.previouslyAddedCourses) !== 'undefined' && $scope.manageCourse.previouslyAddedCourses.indexOf(course) === -1) {\n $scope.manageCourse.previouslyAddedCourses.push(course);\n }\n });\n $scope.manageCourse.course.childCourses = _this.uniqueCourses($scope.manageCourse.course.childCourses);\n };\n\n $scope.applyNewPrerequisiteCta = function (data) {\n var selectedCourses = _this.getSelectedCourses(data);\n\n _.each(selectedCourses, function (course) {\n if ($scope.manageCourse.course.prereq === null) {\n $scope.manageCourse.course.prereq = [];\n }\n\n var existingIdx = _.findIndex($scope.coursePrerequisitsOnLoad, { \"id\": course.id });\n var removedIdx = $scope.prereqsToRemove.indexOf(course.id);\n var addIdx = $scope.prereqsToInsert.indexOf(course.id);\n //If the added prereq exists in the removed and the original prereq list - remove it from the removed array because it is being re-added\n if (existingIdx > -1 && removedIdx > -1) {\n $scope.prereqsToRemove.splice(removedIdx, 1);\n } else if (addIdx === -1 && existingIdx === -1) {\n $scope.prereqsToInsert.push(course.id);\n }\n $scope.manageCourse.course.prereq.push(course);\n\n });\n\n $scope.manageCourse.course.prereq = _this.uniqueCourses($scope.manageCourse.course.prereq);\n };\n\n\n _this.getSelectedCourses = function (data) {\n var selectedCoursesArray = [];\n\n _.each(data, function (datapoint) {\n if (datapoint.select === true) {\n selectedCoursesArray.push(datapoint);\n }\n });\n\n return selectedCoursesArray;\n };\n\n _this.uniqueCourses = function (data) {\n var output = [],\n keys = [];\n\n _.each(data, function (datapoint) {\n var key = datapoint.course.id;\n if (keys.indexOf(key) === -1) {\n keys.push(key);\n output.push(datapoint);\n }\n });\n\n return output;\n };\n\n $scope.removePrereqCourse = function (course) {\n\n //if the prereq is in the original list of prereqs, add it to the list of prereqs to remove\n var existingIdx = _.findIndex($scope.coursePrerequisitsOnLoad, { \"id\": course.id });\n var removedIdx = $scope.prereqsToRemove.indexOf(course.id);\n var addIdx = $scope.prereqsToInsert.indexOf(course.id);\n if (existingIdx > -1 && removedIdx === -1) {\n $scope.prereqsToRemove.push(course.id);\n } else if (addIdx > -1) {\n //If the removed prereq is in the insert list, remove it from the insert list\n $scope.prereqsToInsert.splice(addIdx, 1);\n }\n $scope.manageCourse.course.prereq.splice($scope.manageCourse.course.prereq.indexOf(course), 1);\n };\n\n $scope.removeCourse = function (course) {\n $scope.manageCourse.course.childCourses.splice($scope.manageCourse.course.childCourses.indexOf(course), 1);\n };\n\n\n /***** Add New Courses Modal *****/\n $scope.addNewAssignmentCta = function () {\n $scope.courseSearchModal.courseSearch = '';\n $scope.selectedCourseCount = 0;\n $scope.courseSearchModal.selectAll = false;\n _this.formatCoursesData($scope.courseData);\n angular.element(document.querySelector('#viewAssignmentsModal')).modal('hide');\n angular.element(document.querySelector('#addNewAssignmentModal')).modal(); \n };\n\n $scope.addNewPrerequisiteCta = function () {\n $scope.courseSearchModal.courseSearch = '';\n $scope.selectedCourseCount = 0;\n $scope.courseSearchModal.selectAll = false;\n //_this.formatCoursesData($scope.courseData);\n angular.element(document.querySelector('#viewAssignmentsModal')).modal('hide');\n angular.element(document.querySelector('#addNewPrerequisiteModal')).modal();\n };\n\n $scope.customCatalogError = {};\n $scope.customCatalogOptions = {};\n $scope.customCatalogError.error = messagingDisplayerUtil.create();\n $scope.customCatalogTreeTitle = \"Custom Content\";\n $scope.customCatalogOptions.showLocks = false;\n $scope.customCatalogOptions.initiallyOpened = true;\n $scope.customCatalogOptions.nodeClick = function (node) {\n if (node.api_name === 'courseGroups' && typeof node.id !== 'undefined' & typeof node.id !== null) {\n $location.path('courses/edit/' + node.id + '/');\n }\n };\n\n _this.uniqueCourses = function (data) {\n var output = [],\n keys = [];\n\n _.each(data, function (datapoint) {\n var key = datapoint.id;\n if (keys.indexOf(key) === -1) {\n keys.push(key);\n output.push(datapoint);\n }\n });\n\n /**\n * Reset page size and info for paginator\n */\n _this.calculatePages(output);\n\n _this.currentCourseSet = angular.copy(output);\n\n if (output.length > $scope.home.limit) {\n output = output.splice(0, $scope.home.pageSize);\n }\n\n return output;\n };\n\n _this.courseGroupSubset = function (item) {\n var output_Arr = [];\n if (item !== 'undefined' && item !== null) {\n _.each(item.nodes, function (node) {\n var courses = _this.coursesSubset(node);\n\n _.each(courses, function (course) {\n output_Arr.push(course);\n });\n });\n }\n\n return output_Arr;\n };\n\n _this.allCustomCourses = function (data) {\n var output_Arr = [],\n courses;\n\n _.each(data, function (datapoint) {\n if (datapoint.hasOwnProperty('courses')) {\n courses = _this.coursesSubset(datapoint);\n _.each(courses, function (course) {\n output_Arr.push(course);\n });\n }\n\n if (datapoint.hasOwnProperty('nodes')) {\n courses = _this.courseGroupSubset(datapoint);\n _.each(courses, function (course) {\n output_Arr.push(course);\n });\n }\n });\n\n return output_Arr;\n };\n\n _this.coursesSubset = function (item) {\n var courses = item.courses;\n if (typeof courses !== 'undefined' && typeof courses !== null) {\n var courseIds = _.pluck(courses, 'id');\n var courseDataOriginal = _this.allCoursesData;\n var output_Arr = [];\n\n _.each(courseDataOriginal, function (course) {\n _.each(courseIds, function (courseId) {\n if (course.id === courseId) {\n output_Arr.push(course);\n }\n });\n });\n\n return output_Arr;\n }\n };\n\n /**\n * Begin IModify functions\n */\n $scope.launchIModify = function (courseId) {\n var IModifyLinkCall = CoursesService.getImodifyUrl(courseId);\n IModifyLinkCall.then(\n function (success) {\n var link = success;\n var popup = $window.open(\"about:blank\", \"_blank\");\n popup.location = link;\n },\n function (failure) {\n //silent fail \n }\n );\n };\n\n $scope.resetIModifyCourseContent = function (courseId) {\n $scope.manageCourse.course.iModifyLoading = true;\n var IModifyResetCall = CoursesService.resetIModifyCourseContent(courseId);\n IModifyResetCall.then(\n function (success) {\n $scope.manageCourse.course.iModifyLoading = false;\n $scope.IModifyMessage = \"BAI IModify content was successfully reset\";\n $scope.IModifySuccessThrow = true;\n },\n function (failure) {\n $scope.manageCourse.course.iModifyLoading = false;\n $scope.IModifyMessage = failure.ErrorMessage;\n $scope.IModifyErrorThrow = true;\n }\n );\n };\n\n $scope.CreateNewIModifyCourse = function (courseId) {\n $scope.manageCourse.course.iModifyLoading = true;\n var IModifyLinkCall = CoursesService.CreateIModifyCourse(courseId);\n IModifyLinkCall.then(\n function (success) {\n $scope.manageCourse.course.iModifyLoading = false;\n var courseId = success.id;\n //Redirect to edit the new IModify course\n $scope.IModifyRedirect(courseId);\n },\n function (failure) {\n $scope.manageCourse.course.iModifyLoading = false;\n $scope.IModifyMessage = failure.ErrorMessage;\n $scope.IModifyErrorThrow = true;\n }\n );\n };\n\n $scope.IModifyRedirect = function (courseId) {\n return $location.url('courses/edit/' + courseId);\n };\n\n\n /**\n * End IModify functions\n */\n\n $scope.launchIdesign = function () {\n var IdesignLinkCall = UsersService.getIdesignUrl();\n IdesignLinkCall.then(\n function (success) {\n var link = success;\n var popup = $window.open(\"about:blank\", \"_blank\");\n popup.location = link;\n },\n function (failure) {\n //silent fail \n }\n );\n };\n\n /**\n * Uncomment these lines to turn on tree\n */\n _this.baiCatalogCta();\n\n $scope.treeOptions = {\n nodeChildren: 'nodes',\n templateUrl: 'tree.html',\n injectClasses: {\n ul: \"a1\",\n li: \"a2\",\n liSelected: \"a7\",\n iExpanded: \"a3\",\n iCollapsed: \"a4\",\n iLeaf: \"a5\",\n label: \"a6\",\n labelSelected: \"a8\"\n }\n };\n\n _this.calculatePages = function (courses) {\n $scope.home.page = 1;\n\n /**\n * Total number of elements\n */\n $scope.home.total = courses.length;\n\n $scope.home.pageSize = $scope.home.page * $scope.home.limit;\n _this.currentCourseSet = courses;\n };\n\n _this.setStartandEndIndex = function () {\n $scope.startIndex = ($scope.home.page * $scope.home.limit) - $scope.home.limit;\n $scope.endIndex = $scope.startIndex + $scope.home.limit;\n };\n\n $timeout(function () {\n var paginationEl = $('#pagination');\n paginationEl.find('a').addClass(\"portalBackground\");\n }, 3000);\n\n _this.setSelectedOffering = function () {\n if (typeof $scope.manageCourse.stepFive.sessionCreator.offering === 'undefined' || $scope.manageCourse.stepFive.sessionCreator.offering === null) {\n var mostrecentOffering = _.findWhere($scope.manageCourse.course.offerings, { \"status\": $scope.manageCourse.showOfferingsWithStatus });\n //findWhere retruns undefined if no match is found, or if list is empty.\n $scope.manageCourse.stepFive.sessionCreator.offering = typeof mostrecentOffering !== \"undefined\" ? mostrecentOffering.localId : null;\n }\n\n };\n\n // Right now this is to setup step 5 for ILTs. I think that's currently the only course type with a step 5 so not bothering to include other course types here but they could be with a switch statement.\n $scope.initStep5 = function () {\n\n $scope.manageCourse.onSessionsTab = true;\n $scope.manageCourse.onOfferingsTab = false;\n $scope.manageCourse.onRosterTab = false;\n\n _this.setSelectedOffering();\n\n _this.setIltSessionMinMaxDates();\n\n if (WizardHandler && WizardHandler.wizard('Content')) {\n WizardHandler.wizard('Content').next();\n $scope.manageCourse.cancelMessage = _this.setCourseCancelMessage(5);\n }\n\n var dateObj = new Date().toString();\n $scope.localTimezoneString = dateObj.substring(dateObj.indexOf('(') + 1, dateObj.indexOf(')'));\n jQuery('.taModal').modal('hide');\n };\n\n $scope.step5OfferingSelectChanged = function () {\n _this.setIltSessionMinMaxDates();\n };\n\n this.validateSessionCreatorDates = function (selectedOffering) {\n\n var minDateToCheck = null;\n _.each([(typeof selectedOffering !== \"undefined\" && selectedOffering !== null) ? selectedOffering.registrationEndDateTime : null, $scope.manageCourse.course.displayStart], function (dt) {\n if (typeof dt !== \"undefined\" && dt !== null && _.isObject(dt.moment)) {\n if (minDateToCheck === null) {\n minDateToCheck = dt.moment;\n } else if (minDateToCheck.isAfter(dt.moment)) {\n minDateToCheck = dt.moment;\n }\n }\n });\n\n var maxDateToCheck = null;\n if (typeof $scope.manageCourse.course.displayEnd !== \"undefined\" && $scope.manageCourse.course.displayEnd !== null && _.isObject($scope.manageCourse.course.displayEnd.moment)) {\n maxDateToCheck = $scope.manageCourse.course.displayEnd.moment;\n }\n\n //StartDate\n if ($scope.manageCourse.stepFive.sessionCreator.startDate !== null && _.isObject($scope.manageCourse.stepFive.sessionCreator.startDate.moment)) {\n if ($scope.manageCourse.stepFive.sessionCreator.startDate.moment.isBefore(minDateToCheck)) {\n $scope.manageCourse.stepFive.sessionCreator.startDate = null;\n }\n\n if ($scope.manageCourse.stepFive.sessionCreator.startDate.moment.isAfter(maxDateToCheck)) {\n $scope.manageCourse.stepFive.sessionCreator.startDate = null;\n }\n }\n\n //EndDate\n if ($scope.manageCourse.stepFive.sessionCreator.endDate !== null && _.isObject($scope.manageCourse.stepFive.sessionCreator.endDate.moment)) {\n if ($scope.manageCourse.stepFive.sessionCreator.endDate.moment.isBefore(minDateToCheck)) {\n $scope.manageCourse.stepFive.sessionCreator.endDate = null;\n }\n\n if ($scope.manageCourse.stepFive.sessionCreator.endDate.moment.isAfter(maxDateToCheck)) {\n $scope.manageCourse.stepFive.sessionCreator.endDate = null;\n }\n }\n };\n\n _this.setIltSessionMinMaxDates = function () {\n var currentOfferingIndex = $scope.manageCourse.stepFive.sessionCreator.offering;\n\n var currentOffering = null;\n if (currentOfferingIndex) {\n currentOffering = _.find($scope.manageCourse.course.offerings, function (offering) {\n return parseInt(offering.localId, 10) === parseInt($scope.manageCourse.stepFive.sessionCreator.offering, 10);\n });\n }\n\n _this.validateSessionCreatorDates(currentOffering);\n\n if (typeof currentOffering !== \"undefined\" && currentOffering !== null) {\n var registrationEndDateTime = currentOffering.registrationEndDateTime;\n if (registrationEndDateTime) {\n if (registrationEndDateTime.moment) {\n $scope.ilt.minSessionDate = registrationEndDateTime.moment;\n if ($scope.manageCourse.course.displayEnd) {\n if ($scope.manageCourse.course.displayEnd.moment) {\n $scope.ilt.maxSessionDate = $scope.manageCourse.course.displayEnd.moment;\n } else {\n $scope.ilt.maxSessionDate = null;\n }\n } else {\n $scope.ilt.maxSessionDate = null;\n }\n } else {\n $scope.ilt.minSessionDate = $scope.manageCourse.course.displayStart.moment;\n\n if ($scope.manageCourse.course.displayEnd) {\n if ($scope.manageCourse.course.displayEnd.moment) {\n $scope.ilt.maxSessionDate = $scope.manageCourse.course.displayEnd.moment;\n } else {\n $scope.ilt.maxSessionDate = null;\n }\n } else {\n $scope.ilt.maxSessionDate = null;\n }\n }\n } else {\n if (currentOffering.requestedOn && currentOffering.requestedOn.moment) {\n $scope.ilt.minSessionDate = currentOffering.requestedOn.moment;\n } else {\n $scope.ilt.minSessionDate = $scope.manageCourse.course.displayStart.moment;\n }\n\n\n if ($scope.manageCourse.course.displayEnd) {\n if ($scope.manageCourse.course.displayEnd.moment) {\n $scope.ilt.maxSessionDate = $scope.manageCourse.course.displayEnd.moment;\n } else {\n $scope.ilt.maxSessionDate = null;\n }\n } else {\n $scope.ilt.maxSessionDate = null;\n }\n }\n } // end if there is a current offering selected\n else {\n $scope.ilt.minSessionDate = $scope.manageCourse.course.displayStart.moment;\n if ($scope.manageCourse.course.displayEnd) {\n if ($scope.manageCourse.course.displayEnd.moment) {\n $scope.ilt.maxSessionDate = $scope.manageCourse.course.displayEnd.moment;\n } else {\n $scope.ilt.maxSessionDate = null;\n }\n } else {\n $scope.ilt.maxSessionDate = null;\n }\n } // end there is no current offering selected\n };\n\n _this.SetCourseStartDateBoundaries = function () {\n var maxCourseStartDate = null;\n\n if ($scope.manageCourse.course.offerings) {\n for (var i = 0; i < $scope.manageCourse.course.offerings.length; i++) {\n var offering = $scope.manageCourse.course.offerings[i];\n\n if (offering.requestedOn) {\n if (offering.requestedOn.jsDate) {\n if (maxCourseStartDate === null) {\n maxCourseStartDate = offering.requestedOn.jsDate;\n } else if (maxCourseStartDate > offering.requestedOn.jsDate) {\n maxCourseStartDate = offering.requestedOn.jsDate;\n }\n }\n }\n\n if (offering.registrationEndDateTime) {\n if (offering.registrationEndDateTime.jsDate) {\n if (maxCourseStartDate === null) {\n maxCourseStartDate = offering.registrationEndDateTime.jsDate;\n } else if (maxCourseStartDate > offering.registrationEndDateTime.jsDate) {\n maxCourseStartDate = offering.registrationEndDateTime.jsDate;\n }\n }\n }\n if (offering.sessions) {\n for (var j = 0; j < offering.sessions.length; j++) {\n var session = offering.sessions[j];\n if (maxCourseStartDate === null) {\n maxCourseStartDate = session.endDateTime.jsDate;\n } else if (maxCourseStartDate > session.endDateTime.jsDate) {\n maxCourseStartDate = session.endDateTime.jsDate;\n }\n }\n }\n }\n }\n\n if (maxCourseStartDate === null) {\n if (typeof $scope.manageCourse.course.displayEnd !== \"undefined\" && $scope.manageCourse.course.displayEnd !== null && typeof $scope.manageCourse.course.displayEnd.moment !== \"undefined\" && _.isObject($scope.manageCourse.course.displayEnd.moment)) {\n $scope.manageCourse.course.maxCourseStartDate = $scope.manageCourse.course.displayEnd;\n } else {\n $scope.manageCourse.course.maxCourseStartDate = null;\n }\n } else {\n $scope.manageCourse.course.maxCourseStartDate = dateUtil.formatDate(maxCourseStartDate);\n }\n };\n\n _this.SetCourseEndDateBoundaries = function () {\n var minCourseEndDate = null;\n\n if ($scope.manageCourse.course.offerings) {\n for (var i = 0; i < $scope.manageCourse.course.offerings.length; i++) {\n var offering = $scope.manageCourse.course.offerings[i];\n\n if (offering.requestedOn) {\n if (offering.requestedOn.jsDate) {\n if (minCourseEndDate === null) {\n minCourseEndDate = offering.requestedOn.jsDate;\n } else if (minCourseEndDate < offering.requestedOn.jsDate) {\n minCourseEndDate = offering.requestedOn.jsDate;\n }\n }\n }\n\n if (offering.registrationEndDateTime) {\n if (offering.registrationEndDateTime.jsDate) {\n if (minCourseEndDate === null) {\n minCourseEndDate = offering.registrationEndDateTime.jsDate;\n } else if (minCourseEndDate < offering.registrationEndDateTime.jsDate) {\n minCourseEndDate = offering.registrationEndDateTime.jsDate;\n }\n }\n }\n if (offering.sessions) {\n for (var j = 0; j < offering.sessions.length; j++) {\n var session = offering.sessions[j];\n if (minCourseEndDate === null) {\n minCourseEndDate = session.endDateTime.jsDate;\n } else if (minCourseEndDate < session.endDateTime.jsDate) {\n minCourseEndDate = session.endDateTime.jsDate;\n }\n }\n }\n }\n }\n\n if (minCourseEndDate === null) {\n $scope.manageCourse.course.minCourseEndDate = $scope.manageCourse.course.displayStart;\n } else {\n $scope.manageCourse.course.minCourseEndDate = dateUtil.formatDate(minCourseEndDate);\n }\n };\n\n $scope.effectiveStartDateChanged = function (dateObj) {\n if (typeof dateObj !== \"undefined\" && dateObj !== null &&\n typeof dateObj.moment !== \"undefined\" && _.isObject(dateObj.moment)) {\n if ((typeof dateObj.displayTime === \"undefined\" || dateObj.displayTime === null)) {\n var portalStartTime = dateUtil.setPortalStartTime(dateObj.moment.toDate());\n dateObj = dateUtil.formatDate(portalStartTime);\n } else {\n dateObj = dateUtil.formatDate(dateObj.moment.toDate(), dateObj.displayTime);\n }\n $scope.manageCourse.course.displayStart = dateUtil.formatDate(dateObj.jsDate);\n } else {\n $scope.manageCourse.course.displayStart = null;\n dateObj = null;\n }\n return dateObj;\n };\n\n $scope.effectiveEndDateChanged = function (dateObj) {\n if (typeof dateObj !== \"undefined\" && dateObj !== null &&\n typeof dateObj.moment !== \"undefined\" && _.isObject(dateObj.moment)) {\n if ((typeof dateObj.displayTime === \"undefined\" || dateObj.displayTime === null)) {\n var portalEndTime = dateUtil.setPortalEndTime(dateObj.moment.toDate());\n dateObj = dateUtil.formatDate(portalEndTime);\n } else {\n dateObj = dateUtil.formatDate(dateObj.moment.toDate(), dateObj.displayTime);\n }\n $scope.manageCourse.course.displayEnd = dateUtil.formatDate(dateObj.jsDate);\n } else {\n $scope.manageCourse.course.displayEnd = null;\n dateObj = null;\n }\n return dateObj;\n };\n\n // Right now this is to setup step 5 for ILTs. I think that's currently the only course type with a step 5 so not bothering to include other course types here but they could be with a switch statement.\n $scope.initStep4 = function () {\n $scope.manageCourse.onOfferingsTab = true;\n $scope.manageCourse.onRosterTab = false;\n\n\n _this.setEnrollmentDateBoundries();\n _this.setSelectedOfferingForOfferings();\n\n _this.setSelectedOffering();\n\n _this.setIltSessionMinMaxDates();\n\n var dateObj = new Date().toString();\n $scope.localTimezoneString = dateObj.substring(dateObj.indexOf('(') + 1, dateObj.indexOf(')'));\n jQuery('.taModal').modal('hide');\n };\n\n $scope.initStep6 = function () {\n $scope.manageCourse.onSessionsTab = false;\n $scope.manageCourse.onOfferingsTab = false;\n $scope.manageCourse.onRosterTab = true;\n\n if (WizardHandler && WizardHandler.wizard('Content')) {\n WizardHandler.wizard('Content').next();\n $scope.manageCourse.cancelMessage = _this.setCourseCancelMessage(5);\n }\n\n _this.setSelectedOffering();\n\n jQuery('.taModal').modal('hide');\n };\n\n _this.setSelectedOfferingForOfferings = function () {\n var numOfOfferingsToLoad = 20;\n\n if (typeof $scope.manageCourse.stepFive.sessionCreator.offering !== 'undefined' && $scope.manageCourse.stepFive.sessionCreator.offering !== null) {\n\n var selectedOfferingIndex = _.findIndex($scope.manageCourse.course.offerings, function (offering) {\n return parseInt(offering.localId, 10) === parseInt($scope.manageCourse.stepFive.sessionCreator.offering, 10);\n });\n if (selectedOfferingIndex !== -1) {\n numOfOfferingsToLoad = selectedOfferingIndex > 19 ? selectedOfferingIndex + 1 : 20;\n $scope.manageCourse.course.offerings[selectedOfferingIndex].accordionOpen = true;\n }\n }\n $scope.displayedOfferings.length = 0;\n _.each(_.where($scope.manageCourse.course.offerings, { \"status\": $scope.manageCourse.showOfferingsWithStatus }).slice(0, numOfOfferingsToLoad), function (o) {\n $scope.displayedOfferings.push(o);\n });\n };\n\n _this.setNewOfferingDefaults = function (offering) {\n // Set defaults\n // Defaulting name to something random enough and it looks official\n offering.name = 'OFR' + Math.floor(Math.random() * 1000000000).toString();\n offering.minimumEnrollment = 0;\n offering.maxAllowedSize = 39;\n offering.cancelDays = 0;\n offering.waitlistDays = 0;\n offering.maxWaitlistSize = 0;\n offering.status = 'open';\n offering.isDirty = true;\n // var today = new Date();\n // today.setHours(0, 0, 0, 0); // Don't care about time\n // if (today >= $scope.manageCourse.course.displayStart.jsDate) {\n // offering.requestedOn = dateUtil.formatDate(today);\n // } else {\n // offering.requestedOn = $scope.manageCourse.course.displayStart;\n //}\n };\n\n _this.setOfferingAccordionHeading = function (offering) {\n offering.accordionHeading = \"\";\n if (offering.name) {\n offering.accordionHeading += offering.name + \" | \";\n }\n if (offering.location) {\n offering.accordionHeading += offering.location + \" | \";\n }\n if (offering.sessions) {\n if (offering.sessions.length > 0) {\n var earliestSessionDate = null;\n\n earliestSessionDate = _.sortBy(offering.sessions, \"startDateTime\")[0].startDateTime;\n\n if (earliestSessionDate !== null) {\n offering.accordionHeading += earliestSessionDate.fullDate + \" | \";\n }\n }\n }\n if (offering.status) {\n offering.accordionHeading += offering.status + \" | \";\n }\n if (offering.roster) {\n if (offering.roster.attendingStudents) {\n offering.accordionHeading += offering.roster.attendingStudents.length + \" / \";\n } else {\n offering.accordingHeading += \"0 / \";\n }\n } else {\n offering.accordingHeading += \"0 / \";\n }\n if (offering.maxAllowedSize) {\n offering.accordionHeading += offering.maxAllowedSize;\n }\n };\n\n _this.setEnrollmentDateBoundries = function () {\n _.each($scope.manageCourse.course.offerings, function (offering) {\n _this.setOfferingEnrollmentOpensDateBoundries(offering);\n _this.setOfferingEnrollmentEndDateBoundries(offering);\n });\n };\n\n $scope.enrollmentClosesChanged = function (currentOffering, dateObj) {\n if (typeof dateObj.moment === \"undefined\" || dateObj.moment === null || dateObj.moment === true) {\n currentOffering.registrationEndDateTime = undefined;\n return;\n }\n if ((typeof dateObj.displayTime === \"undefined\" || dateObj.displayTime === null)) {\n var prtEndTime = dateUtil.setPortalStartTime(dateObj.moment.toDate());\n currentOffering.registrationEndDateTime = dateUtil.formatDate(prtEndTime);\n dateObj = dateUtil.formatDate(prtEndTime);\n }\n _this.setOfferingEnrollmentOpensDateBoundries(currentOffering);\n return dateObj;\n };\n\n $scope.enrollmentOpensChanged = function (currentOffering, dateObj) {\n if ((typeof dateObj.displayTime === \"undefined\" || dateObj.displayTime === null)) {\n var prtStartTime = dateUtil.setPortalStartTime(dateObj.moment.toDate());\n currentOffering.requestedOn = dateUtil.formatDate(prtStartTime);\n dateObj = dateUtil.formatDate(prtStartTime);\n }\n _this.setOfferingEnrollmentEndDateBoundries(currentOffering);\n return dateObj;\n };\n\n _this.setOfferingEnrollmentOpensDateBoundries = function (currentOffering) {\n var i;\n var earliestSessionDate = null;\n if (currentOffering.registrationEndDateTime) {\n if (currentOffering.registrationEndDateTime.moment) {\n currentOffering.maxRequestedOnDate = currentOffering.registrationEndDateTime.moment;\n } else {\n if (currentOffering.sessions) {\n earliestSessionDate = null;\n for (i = 0; i < currentOffering.sessions.length; i++) {\n if (earliestSessionDate === null) {\n earliestSessionDate = currentOffering.sessions[i].startDateTime.jsDate;\n }\n if (earliestSessionDate > currentOffering.sessions[i].startDateTime.jsDate) {\n earliestSessionDate = currentOffering.sessions[i].startDateTime.jsDate;\n }\n\n }\n\n if (earliestSessionDate === null) {\n if ($scope.manageCourse.course.displayEnd) {\n if ($scope.manageCourse.course.displayEnd.moment) {\n currentOffering.maxRequestedOnDate = $scope.manageCourse.course.displayEnd.moment;\n } else {\n currentOffering.maxRequestedOnDate = null;\n }\n } else {\n currentOffering.maxRequestedOnDate = null;\n }\n } else {\n currentOffering.maxRequestedOnDate = moment(earliestSessionDate);\n }\n } else {\n if ($scope.manageCourse.course.displayEnd) {\n if ($scope.manageCourse.course.displayEnd.moment) {\n currentOffering.maxRequestedOnDate = $scope.manageCourse.course.displayEnd.moment;\n } else {\n currentOffering.maxRequestedOnDate = null;\n }\n } else // otherwise displayEnd doesn't exist\n {\n currentOffering.maxRequestedOnDate = null;\n }\n }\n }\n } else {\n // no registrationEndDateTime exists\n if (currentOffering.sessions) {\n earliestSessionDate = null;\n for (i = 0; i < currentOffering.sessions.length; i++) {\n if (earliestSessionDate === null) {\n earliestSessionDate = currentOffering.sessions[i].startDateTime.jsDate;\n }\n if (earliestSessionDate > currentOffering.sessions[i].startDateTime.jsDate) {\n earliestSessionDate = currentOffering.sessions[i].startDateTime.jsDate;\n }\n\n }\n\n if (earliestSessionDate === null) {\n if ($scope.manageCourse.course.displayEnd) {\n if ($scope.manageCourse.course.displayEnd.moment) {\n currentOffering.maxRequestedOnDate = $scope.manageCourse.course.displayEnd.moment;\n } else {\n currentOffering.maxRequestedOnDate = null;\n }\n } else {\n currentOffering.maxRequestedOnDate = null;\n }\n } else {\n currentOffering.maxRequestedOnDate = moment(earliestSessionDate);\n }\n } else {\n if ($scope.manageCourse.course.displayEnd) {\n if ($scope.manageCourse.course.displayEnd.moment) {\n currentOffering.maxRequestedOnDate = $scope.manageCourse.course.displayEnd.moment;\n } else {\n currentOffering.maxRequestedOnDate = null;\n }\n } else // otherwise displayEnd doesn't exist\n {\n currentOffering.maxRequestedOnDate = null;\n }\n }\n } // end registrationEndDateTime doesn't exist\n };\n\n _this.setOfferingEnrollmentEndDateBoundries = function (currentOffering) {\n if (currentOffering.requestedOn) {\n if (currentOffering.requestedOn.moment) {\n currentOffering.minRegistrationEndDateTime = currentOffering.requestedOn.moment;\n } else {\n currentOffering.minRegistrationEndDateTime = $scope.manageCourse.course.displayStart.moment;\n }\n } else {\n currentOffering.minRegistrationEndDateTime = $scope.manageCourse.course.displayStart.moment;\n }\n\n if (currentOffering.sessions) {\n var earliestSessionDate = null;\n for (var i = 0; i < currentOffering.sessions.length; i++) {\n if (earliestSessionDate === null) {\n earliestSessionDate = currentOffering.sessions[i].startDateTime.jsDate;\n }\n if (earliestSessionDate > currentOffering.sessions[i].startDateTime.jsDate) {\n earliestSessionDate = currentOffering.sessions[i].startDateTime.jsDate;\n }\n\n }\n\n if (earliestSessionDate === null) {\n if ($scope.manageCourse.course.displayEnd) {\n if ($scope.manageCourse.course.displayEnd.moment) {\n currentOffering.maxRegistrationEndDateTime = $scope.manageCourse.course.displayEnd.moment;\n } else {\n currentOffering.maxRegistrationEndDateTime = null;\n }\n } else {\n currentOffering.maxRegistrationEndDateTime = null;\n }\n } else {\n currentOffering.maxRegistrationEndDateTime = moment(earliestSessionDate);\n }\n } else {\n if ($scope.manageCourse.course.displayEnd) {\n if ($scope.manageCourse.course.displayEnd.moment) {\n currentOffering.maxRegistrationEndDateTime = $scope.manageCourse.course.displayEnd.moment;\n } else {\n currentOffering.maxRegistrationEndDateTime = null;\n }\n } else {\n currentOffering.maxRegistrationEndDateTime = null;\n }\n }\n }; // end setOfferingEnrollmentEndDateBoundaries\n\n $scope.offeringNameChanged = function (offering) {\n // If there are sessions and the offering name changes, change all session names to match the new offering name.\n // TODO: The offeringName is passed on each session but the api only needs offering.name but we're also storing the name on each session.\n // There could be an easier way to figure out what offering we're on when adding sessions and use the offering.name property in the UI as well. Then we won't have to keep track of this below.\n if (typeof offering.sessions !== 'undefined' && offering.sessions !== null) {\n _.each(offering.sessions, function (session) {\n session.offeringName = offering.name;\n });\n }\n\n _this.setOfferingAccordionHeading(offering);\n };\n\n $scope.maxAllowedSizeChanged = function (offering) {\n _this.setOfferingAccordionHeading(offering);\n };\n\n /**\n *\n * To get offering that has no session attached yet.\n */\n _this.getOfferingwithNoSession = function () {\n var offerings = $scope.manageCourse.course.offerings;\n var noSessionOffering = {};\n _.each(offerings, function (offering) {\n if (!(offering.sessions && offering.sessions.length > 0)) {\n noSessionOffering = offering;\n return;\n }\n });\n\n return noSessionOffering;\n };\n\n /**\n * SLY-3933\n * Update passing score if its is change and open the LAT\n * assessment engine in new tab.\n *\n * @param url {string} url for assessment engine.\n */\n _this.updatePassingScorelaunchUrl = function (url) {\n var course = $scope.manageCourse.course;\n\n //update course\n var courseToUpdate = angular.copy($scope.manageCourse.course);\n var updatedCourse = CoursesService.updateCourse(courseToUpdate);\n updatedCourse.then(function (success) {\n window.open(url, '_blank');\n }, function (error) {\n console.log('Error saving course: ' + error);\n });\n\n\n };\n\n $scope.manageCourse.displayOfferingsWithStatus = function () {\n\n $scope.manageCourse.showOfferingsLoading = true;\n $scope.manageCourse.editOfferingsIsLoading = true;\n\n $scope.manageCourse.stepFive.sessionCreator.offering = null;\n\n if ($scope.manageCourse.onSessionsTab) {\n\n _this.setSelectedOffering();\n _this.setIltSessionMinMaxDates();\n\n }\n\n if ($scope.manageCourse.onRosterTab) {\n\n _this.setSelectedOffering();\n\n }\n\n if ($scope.manageCourse.onOfferingsTab) {\n $scope.displayedOfferings.length = 0;\n _.each(_.where($scope.manageCourse.course.offerings, { \"status\": $scope.manageCourse.showOfferingsWithStatus }).slice(0, 20), function (o) {\n $scope.displayedOfferings.push(o);\n });\n }\n\n\n $scope.manageCourse.showOfferingsLoading = false;\n $scope.manageCourse.editOfferingsIsLoading = false;\n };\n\n $scope.openInstructorDeskModal = function (offering) {\n\n var modalInstance = $uibModal.open({\n templateUrl: 'app/templates/courses/create/modals/manageIltRoster.html',\n controller: 'Offerings_AdminController',\n //scope: $scope,\n //size:'lg',\n windowClass: 'rosterModal',\n backdrop: 'static',\n resolve: {\n offeringId: function () {\n return offering.id;\n }\n }\n });\n //LMS-7462-\n //modalInstance.result.then(\n // //close\n // function (result) {\n // //on modal close - refresh the offering details\n\n // $scope.manageCourse.editOfferingsIsLoading = true;\n // $scope.manageCourse.showOfferingsLoading = true;\n // var courseOfferingsPromise = CoursesService.getSingleCourseOfferings(offering.courseId);\n // courseOfferingsPromise.then(function (success) {\n // $scope.manageCourse.course.offerings = success; // offerings\n // _this.setOfferingInstructors();\n // _this.setSessions(success);\n\n // _.each($scope.manageCourse.course.offerings, function (offering) {\n // _this.setOfferingAccordionHeading(offering);\n // });\n // $scope.manageCourse.editOfferingsIsLoading = false;\n // $scope.manageCourse.showOfferingsLoading = false;\n // $scope.manageCourse.isLoading = false;\n // }, function (failure) {\n // $scope.manageCourse.editOfferingsIsLoading = false;\n // $scope.manageCourse.showOfferingsLoading = false;\n // $scope.manageCourse.isLoading = false;\n // var errorCode = failure.StatusCode;\n // var message = failure.ErrorMessage;\n // $scope.manageCourse.error.setError(errorCode, message);\n // });\n // },\n // //dismiss\n // function (result) {\n // var a = result;\n // });\n };\n\n // SLY-5342 Sub domain management for courses admin tab\n $scope.isSubDomainAdmin = UsersService.isSubDomainAdmin();\n $scope.taDomains = UsersService.taDomains();\n $scope.activeDomain = UsersService.activeDomain();\n $scope.switchDomains = {};\n $scope.switchDomains.error = messagingDisplayerUtil.create();\n\n $scope.onActiveDomainChanged = function (activeDomain, oldDomain) {\n var switchProfilePromise = UsersService.switchProfile(activeDomain.id);\n switchProfilePromise.then(function (success) {\n location.reload();\n }, function (failure) {\n $scope.switchDomains.error.setError(failure.StatusCode, failure.ErrorMessage);\n jQuery(\"#switchDomainsError\").show();\n setTimeout(function () {\n $scope.switchDomains.error.reset();\n jQuery(\"#switchDomainsError\").hide();\n }, 2000);\n });\n };\n\n $scope.hideFromCatalogChanged = function () {\n if ($scope.manageCourse.course.hideFromCatalog === true)\n $scope.manageCourse.course.enrollmentClose = dateUtil.setStartTime(moment().utc());\n else\n $scope.manageCourse.course.enrollmentClose = null;\n };\n\n $scope.ValidateCourseRetakeMonth = function (course) {\n course.enrollmentLimitRefreshMonth = dateUtil.validMonth(course.enrollmentLimitRefreshMonth);\n course.enrollmentLimitRefreshDate = dateUtil.validDate(course.enrollmentLimitRefreshMonth, course.enrollmentLimitRefreshDate);\n };\n\n $scope.ValidateCourseRetakeDate = function (course) {\n course.enrollmentLimitRefreshDate = dateUtil.validDate(course.enrollmentLimitRefreshMonth, course.enrollmentLimitRefreshDate);\n };\n\n $scope.setStartTime = function (dateObj) {\n if ((typeof dateObj !== \"undefined\" && dateObj !== null && typeof dateObj.moment !== \"undefined\" && _.isObject(dateObj.moment))) {\n var startDatetime = dateObj.moment.set({ hour: 0, minute: 0, second: 0, millisecond: 0 });\n dateObj = dateUtil.formatDate(startDatetime);\n }\n return dateObj;\n };\n\n $scope.setEndTime = function (dateObj) {\n if ((typeof dateObj !== \"undefined\" && dateObj !== null && typeof dateObj.moment !== \"undefined\" && _.isObject(dateObj.moment))) {\n var endDatetime = dateObj.moment.set({ hour: 23, minute: 59, second: 0, millisecond: 0 });\n dateObj = dateUtil.formatDate(endDatetime);\n }\n return dateObj;\n };\n\n //career path\n $scope.selected = null;\n\n _this.getParentElement = function (targetNodeName, element) {\n if (targetNodeName.toLowerCase() === element.nodeName.toLowerCase()) {\n return element;\n }\n return _this.getParentElement(targetNodeName, element.parentNode);\n };\n\n $scope.dragOver = function (e) {\n //IE11\n var target = e.target || e.srcElement;\n\n var tr = _this.getParentElement('tr', target);\n var tbody = _this.getParentElement('tbody', tr);\n if ($scope.isBefore($scope.selected, tr)) {\n tbody.insertBefore($scope.selected, tr);\n }\n else {\n tbody.insertBefore($scope.selected, tr.nextSibling);\n }\n\n };\n\n $scope.dragEnd = function () {\n $scope.selected = null;\n $scope.manageCourse.course.childCourses = _this.getOrderedChildCourses($scope.manageCourse.course.childCourses);\n $scope.manageCourse.childrenUpdated = true;\n\n $scope.$apply();\n };\n\n $scope.dragStart = function (e) {\n\n e.dataTransfer.effectAllowed = 'move';\n //attempt modern browser first, then fall back to IE11\n try {\n e.dataTransfer.setData('text/html', null);\n }\n catch (ex) {\n e.dataTransfer.setData('text', 'foo');\n }\n\n var selected = e.target || e.srcElement;\n $scope.selected = _this.getParentElement('tr', selected);\n\n };\n\n $scope.isBefore = function (el1, el2) {\n var cur;\n if (el2.parentNode === el1.parentNode) {\n for (cur = el1.previousSibling; cur; cur = cur.previousSibling) {\n if (cur === el2) return true;\n }\n } else return false;\n };\n\n _this.getOrderedChildCourses = function (courses) {\n var orderedList = [];\n\n $('#orderedCourseList > tr').each(function () {\n var curId = $(this).attr('id');\n var course = _.find(courses, function (course) { return 'id-' + course.id === curId; });\n orderedList.push(course);\n });\n\n return orderedList;\n };\n\n $scope.remove = function (array, index) {\n array.splice(index, 1);\n $scope.manageCourse.childrenUpdated = true;\n };\n\n /*\n * Course Skill search typeahead\n */\n $scope.noResults = '';\n $scope.skillsTypeahead = {};\n $scope.courseSkillsLimit = 5;\n $scope.skillsTypeahead.search = function (value) {\n if (value === null) {\n /* validation - if the value is null, then just return after setting validation variable */\n return;\n }\n\n var output = [];\n var filteredFromUsers = $filter('filter')($scope.availableSkills, function (rows) {\n return ((rows.name.toLowerCase()).indexOf((value.toLowerCase()) || '') !== -1);\n });\n _.each(filteredFromUsers, function (item) {\n var skinnedItem = {};\n skinnedItem.id = item.id;\n skinnedItem.name = item.name;\n output.push(skinnedItem);\n });\n\n // If user typed value doesn't appear in type-ahead list, add it to the bottom as a new skill. All new skills have id = 0\n var existsInOutput = false;\n _.each(output, function (s) {\n if (s.name.toLowerCase() === value.toLowerCase()) {\n existsInOutput = true;\n }\n });\n if (existsInOutput === false) {\n output.push({ id: 0, name: value });\n }\n return output;\n };\n\n $scope.setCourseSkill = function (course, skill) {\n var skillIndex = -1;\n var courseSkillIndex = -1;\n\n $scope.manageCourse.skillsUpdated = true;\n\n if (course.skills === undefined || course.skills === null) {\n course.skills = [];\n }\n\n courseSkillIndex = _.findIndex(course.skills, { \"name\": skill.name });\n if (courseSkillIndex === -1) {\n\n var courseSkill = {};\n courseSkill.canRemove = true;\n courseSkill.name = skill.name;\n courseSkill.skillID = skill.id;\n courseSkill.courseID = course.id;\n\n course.skills.push(courseSkill);\n }\n\n skillIndex = _.findIndex($scope.availableSkills, { \"name\": skill.name });\n if (skillIndex === -1) {\n $scope.availableSkills.push(skill);\n }\n };\n\n $scope.removeCourseSkill = function (course, skill) {\n var skillIndex = -1;\n $scope.manageCourse.skillsUpdated = true;\n\n if (!skill.canRemove) {\n return;\n }\n\n skillIndex = _.findIndex(course.skills, { \"name\": skill.name });\n if (skillIndex > -1) {\n course.skills.splice(skillIndex, 1);\n }\n };\n\n $scope.imageList = [];\n $scope.imageSelect = function () {\n angular.element(document.querySelector('#imageSelectionModal')).modal();\n $scope.current = $scope.manageCourse.course.tileImage;\n $scope.shownImages = [];\n $scope.fetchImageList();\n //scroll to top\n\n //Clear selected from other choices\n var Images = jQuery('.tileImage');\n jQuery(Images).removeClass(\"selected\");\n jQuery('.tileImage').first().addClass(\"selected\");\n //load in proper images\n //order images\n };\n\n $scope.fetchImageList = function () {\n var temp = '';\n //Currently, default image based on type is mapped to images 1-20 here. 19 is currently used as the default 'This doesn't actually have a tileimage\" image\n switch ($scope.manageCourse.course.type) {\n case 'wbt':\n temp = '0';\n break;\n case 'ilt':\n temp = '1';\n break;\n case 'vle':\n break;\n case 'task':\n temp = '2';\n break;\n case 'survey':\n temp = '3';\n break;\n case 'evaluation':\n temp = '4';\n break;\n case 'assessment':\n temp = '5';\n break;\n case 'courseGroup':\n case 'courseGroupCurricula':\n case 'courseGroupCertification':\n temp = '8';\n break;\n case 'careerPath':\n temp = '9';\n break;\n case 'doc':\n case 'pdf':\n case 'url':\n case 'mP3':\n case 'mP4':\n case 'word':\n case 'other':\n temp = '102';\n break;\n default:\n break;\n }\n $scope.shownImages.push($scope.current);\n if ($scope.current.toString() !== ('grab_bag/' + temp)) { $scope.shownImages.push('grab_bag/' + temp); }\n if ($scope.manageCourse.course.productType === 'Document') {\n $scope.tileImageSelectModalTitle = \"Document Tile Images\";\n\n for (i = 71; i < 102; i++) {\n if (i === 81) { //Number 81 already existed in the grab_bag, we skip that number.\n continue;\n }\n temp = \"grab_bag/\" + i.toString();\n if ($scope.current !== temp) $scope.shownImages.push(temp);\n }\n }\n else {\n $scope.tileImageSelectModalTitle = \"Course Tile Images\";\n for (i = 21; i <= 162; i++) {\n \n // Since we are adding new course images and we do not want to change the existing images \n // that customers may have selected for documents ( images 71 thru 102 ) we will skip those \n // and continue the loop\n if (i >= 71 && i <= 102 ) {\n continue;\n }\n temp = \"grab_bag/\" + i.toString();\n if ($scope.current !== temp) $scope.shownImages.push(temp);\n }\n }\n };\n $scope.current = '0';\n $scope.closeImageSelectionModal = function () {\n angular.element(document.querySelector('#imageSelectionModal')).modal('hide');\n };\n\n $scope.select = function ($event, selectedstring) {\n var target = $event.currentTarget;\n var Images = jQuery('.tileImage');\n jQuery(Images).removeClass(\"selected\");\n jQuery(target).addClass(\"selected\");\n $scope.current = selectedstring;\n };\n\n $scope.finalizeSelection = function () {\n //set larger scope variable to current\n angular.element(document.querySelector('#imageSelectionModal')).modal('hide');\n $scope.manageCourse.course.tileImage = $scope.current;\n };\n\n\n $scope.rebuildSubcategoryOptions = function (category) {\n\n $scope.manageCourse.course.catalogId = null;\n\n if (category === null) {\n $scope.subcategoryDisabled = true;\n $scope.subcategories = [];\n } else {\n $scope.subcategoryDisabled = false;\n $scope.subcategories = _.filter($scope.taxonomyOptions, { \"categoryID\": category.categoryID, \"isActive\": true });\n }\n\n };\n\n $scope.setCourseCatalogID = function (subcategory) {\n if (subcategory !== undefined) {\n $scope.manageCourse.course.catalogId = subcategory.subcategoryID;\n }\n };\n\n $scope.createUniqueCategoryList = function () {\n\n //unique categories for the category dropdown\n $scope.uniqueCategories = [];\n $scope.taxonomyOptions.forEach(function (item) {\n var catInd = _.filter($scope.uniqueCategories, { \"categoryID\": item.categoryID });\n if (catInd.length < 1) {\n var cat = { 'categoryName': item.categoryname, 'categoryID': item.categoryID, 'categoryNodeID': item.categoryNodeID };\n $scope.uniqueCategories.push(cat);\n }\n });\n\n };\n\n $scope.selectCategory = function () {\n $scope.subcategoryDisabled = false;\n //Get the selected catalog for the course and prepopulate drop downs\n var selectedCatalog = _.filter($scope.taxonomyOptions, { \"subcategoryID\": $scope.manageCourse.course.catalogId });\n\n if (selectedCatalog.length > 0) {\n //category drop down\n $scope.parentCategory = { 'categoryName': selectedCatalog[0].categoryname, 'categoryID': selectedCatalog[0].categoryID, 'categoryNodeID': selectedCatalog[0].categoryNodeID };\n\n //subcategory drop down\n $scope.subcategories = _.filter($scope.taxonomyOptions, { \"categoryID\": selectedCatalog[0].categoryID });\n\n // set the selected subcateory\n $scope.subcategory = selectedCatalog[0];\n }\n };\n\n $scope.openPreview = function (courseId) {\n var launchLink = CoursesService.getCoursePreviewUrl(courseId);\n launchLink.then(function (success) {\n window.open(success, \"_blank\");\n }, function (failure) {\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n\n $scope.manageCourse.error.setError(errorCode, message);\n });\n };\n\n $scope.setDocumentContent = function (content) {\n if ($scope.manageCourse.documentType === \"url\") {\n //handle as a URL \n $scope.manageCourse.documentUpload = null;\n }\n //Otherwise, it's a file \n else {\n $scope.manageCourse.urlUpload = null;\n\n if (content[0].name.length > 200) {\n $scope.manageCourse.error.setError(500, \"File name must be under 200 characters\");\n }\n $scope.manageCourse.documentUpload = content[0];\n $scope.manageCourse.documentUploadName = content[0].name;\n }\n };\n\n $scope.uploadDocumentContent = function (fromWizard) {\n if (fromWizard) {\n $scope.manageCourse.stepThree.isLoading = true;\n }\n if ($scope.manageCourse.documentType === 'url') {\n _this.uploadDocumentUrl(fromWizard);\n } else {\n _this.uploadDocumentFile(fromWizard);\n }\n };\n\n _this.uploadDocumentFile = function (fromWizard) {\n if ($scope.manageCourse.documentUpload === null) {\n return;\n }\n\n var uploadDoc = DocumentService.uploadDocumentToStorage($scope.manageCourse.documentUpload, $scope.manageCourse.course.id);\n uploadDoc.then(function (success) {\n console.log('successfully uploaded');\n if (fromWizard) {\n _this._showWizardSuccessScreen();\n }\n else {\n _this.setDocumentPreviewStatus(true);\n }\n }, function (failure) {\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.manageCourse.stepThree.error.setError(errorCode, message);\n $scope.manageCourse.stepThree.isLoading = false;\n _this.setDocumentPreviewStatus(false);\n });\n };\n\n _this.uploadDocumentUrl = function (fromWizard) {\n if ($scope.manageCourse.urlUpload === null) {\n return;\n }\n var uploadUrl = DocumentService.uploadDocumentUrl($scope.manageCourse.urlUpload, $scope.manageCourse.course.id);\n uploadUrl.then(function (success) {\n if (fromWizard) {\n _this._showWizardSuccessScreen();\n }\n else {\n _this.setDocumentPreviewStatus(true);\n }\n }, function (failure) {\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.manageCourse.stepThree.error.setError(errorCode, message);\n $scope.manageCourse.stepThree.isLoading = false;\n _this.setDocumentPreviewStatus(false);\n });\n };\n\n $scope.setDocumentType = function (type) {\n $scope.manageCourse.documentType = type;\n if (type === 'url') {\n $scope.manageCourse.showDocumentURLInput = true;\n $scope.manageCourse.showDocumentFileInput = false;\n } else { //file \n $scope.manageCourse.showDocumentURLInput = false;\n $scope.manageCourse.showDocumentFileInput = true;\n }\n };\n };\n }\n]);\n\n","app.factory('Dashboard_AdminOverride', ['$httpParamSerializer', '$injector', '$timeout', 'CoursesService', 'errorDisplayerUtil', 'SettingsService',\nfunction ($httpParamSerializer, $injector, $timeout, CoursesService, errorDisplayerUtil, SettingsService) {\n return function ($scope) {\n\n var _this = this;\n\n $scope.defaultHeader = true; // This Sets the page to full width of the screen.\n $scope.hideCatalogSearch = true;\n /* This will make the navigation tab active on certain page */\n $scope.activeTab = 'tab-active-class';\n\n /*This will route users to the appropiate user manual based on active tab*/\n $scope.userManualHref = 'https://ld-connect.bai.org/learning-manager/training-administrator-user-manual/#Create-Career-Path';\n\n $scope.currentFocus='list';\n\n var sett = SettingsService.getSettings().then(function (success) {\n /* Career Path access determined by the organization settings */\n $scope.showTrainingInsights = SettingsService.isTrainingInsightsEnabled();\n $scope.showCareerPath = SettingsService.isCareerPathEnabled();\n if ($scope.showCareerPath) {\n $scope.homeTemplate = 'app/templates/dashboard/partials/admin.content.html';\n }\n });\n\n \n $scope.homeAction = function () {\n $scope.contentTemplate = 'app/templates/dashboard/home/admin.html';\n $scope.showList();\n $scope.dashboardLoading = true;\n $scope.dashboardSummaryError = false;\n $scope.listLoading = true;\n $scope.listErrorThrown = false;\n $scope.showCareerPathWelcomeMessage = false;\n\n /* Get Summary Counts */\n var summarycountsCall = CoursesService.getSummaryCounts();\n summarycountsCall.then(function (success) {\n $scope.dashboardLoading = false;\n $scope.dashboardSummaryCounts = success;\n }, function (failure) {\n $scope.dashboardLoading = false;\n $scope.dashboardSummaryError = true;\n $scope.dashboardSummaryErrorMessage = \"There was an error loading Career Path summary data\";\n });\n\n var summarycountsByCourseCall = CoursesService.getSummaryCountsByCourse();\n summarycountsByCourseCall.then(function (success) {\n $scope.listLoading = false;\n $scope.careerPathList = success;\n $scope.showCareerPathWelcomeMessage = success.length > 0 ? false : true;\n createCareerPathDoughnut(success);\n }, function(failure) {\n $scope.listLoading = false;\n $scope.listErrorThrown = true;\n $scope.listErrorMessage = \"There was an error loading the Career Path list data\";\n });\n };\n\n /* sort and group career path data for the doughnut */\n var createCareerPathDoughnut = function (cpData) {\n\n /* filter out any CPs with 0 enrollments and sort on enrollmentscount to get top 5 */\n cpData = cpData.filter(function (e) { return e.totalStudentEnrolledCount > 0; });\n var dataOrdered = _.sortBy(cpData, 'totalStudentEnrolledCount');\n \n var totalCPs = dataOrdered.length;\n if (totalCPs === 0) {\n //create a greyed out doughnut\n $scope.careerPathDoughnutData = [{\n value: 1,\n color: \"#808080\",\n label: \"\",\n displayName: \"abcdefghijklmnop\"\n }];\n } else {\n\n var i = (dataOrdered.length > 5) ? dataOrdered.length - 5 : dataOrdered.length;\n var count = 0;\n var doughnutCounter = 0;\n $scope.extraCPs = {\n assignmentsCount: 0,\n completionsCount: 0,\n enrollmentsCount: 0,\n inProgressCount: 0,\n notStartedCount: 0,\n skillsDevelopingCount: 0,\n totalStudentEnrolledCount: 0\n };\n /* put each career path either in the top five list or the 'other' list (and add up all values for 'others') */\n dataOrdered.forEach(function (x) {\n if (count < i && (totalCPs > 5)) {\n $scope.extraCPs.assignmentsCount += x.assignmentsCount;\n $scope.extraCPs.completionsCount += x.completionsCount;\n $scope.extraCPs.enrollmentsCount += x.enrollmentsCount;\n $scope.extraCPs.inProgressCount += x.inProgressCount;\n $scope.extraCPs.notStartedCount += x.notStartedCount;\n $scope.extraCPs.skillsDevelopingCount += x.skillsDevelopingCount;\n $scope.extraCPs.totalStudentEnrolledCount += x.totalStudentEnrolledCount;\n } else {\n $scope.careerPathDoughnutData[doughnutCounter].value = x.totalStudentEnrolledCount;\n $scope.careerPathDoughnutData[doughnutCounter].label = createTooltip(x.course.name, x);\n $scope.careerPathDoughnutData[doughnutCounter].displayName = x.course.name;\n doughnutCounter++;\n }\n count++;\n });\n\n if ($scope.extraCPs.totalStudentEnrolledCount > 0) {\n $scope.careerPathDoughnutData[5].value = $scope.extraCPs.totalStudentEnrolledCount;\n /* If there are 6 CPs then the sixth CP should display the name of the CP (not 'Other') */\n var sixthCPLabel = totalCPs === 6 ? dataOrdered[0].course.name : 'Other';\n $scope.careerPathDoughnutData[5].label = createTooltip(sixthCPLabel, $scope.extraCPs);\n $scope.careerPathDoughnutData[5].displayName = sixthCPLabel;\n }\n }\n\n $scope.cpdnut = $scope.setupDoughnut($scope.careerPathDoughnutData);\n };\n\n /* Creates the formatted tool tip for the doughnut */\n var createTooltip = function (cpName, path) {\n return '' + cpName + '
Assigned ' + path.assignmentsCount +\n '
Enrollments ' + path.enrollmentsCount + '
Completions ' + path.completionsCount +\n '
In Progress ' + path.inProgressCount + '
Not Started ' + path.notStartedCount +\n '
Skills Developing ' + path.skillsDevelopingCount;\n };\n\n /* set up default doughnut data */\n $scope.careerPathDoughnutData = [\n {\n value: 0,\n color: \"#80379B\",\n label: \"Career Path One\",\n displayName: \"abcdefghijklmnop\"\n },\n {\n value: 0,\n color: \"#00A1DE\",\n label: \"Career Path Two\",\n displayName: \"abcdefghijklmnop\"\n },\n {\n value: 0,\n color: \"#E87722\",\n label: \"Career Path Three\",\n displayName: \"abcdefghijklmnop\"\n },\n {\n value: 0,\n color: \"#EBB700\",\n label: \"Career Path Four\",\n displayName: \"abcdefghijklmnop\"\n },\n {\n value: 0,\n color: \"#92D400\",\n label: \"Career Path Five\",\n displayName: \"abcdefghijklmnop\"\n },\n {\n value: 0,\n color: \"#00A599\",\n label: \"Career Path Six\",\n displayName: \"abcdefghijklmnop\"\n }\n ];\n\n /* set up the default doughnut options - with special function for the tooltip styling */\n $scope.defaultDoughnutOptions = {\n showTooltips: true,\n customTooltips: function (tooltip) {\n var tooltipEl = $('#chartjs-tooltip');\n\n if (!tooltip) {\n tooltipEl.css({\n opacity: 0\n });\n return;\n }\n\n // split out the label and value, don't show value\n var parts = tooltip.text.split(\":\");\n var innerHtml = '' + parts[0].trim() + '';\n tooltipEl.html(innerHtml);\n\n tooltipEl.css({\n opacity: 1,\n left: tooltip.chart.canvas.offsetLeft + tooltip.x + 'px',\n top: tooltip.chart.canvas.offsetTop + tooltip.y + 'px',\n });\n },\n animation: true,\n percentageInnerCutout: 60\n };\n\n $scope.setupDoughnut = function (careerpathData) {\n var setup = {};\n setup.data = careerpathData;\n setup.options = $scope.defaultDoughnutOptions;\n return setup;\n };\n\n // Used to submit the export report form.\n // This is because the export needs to bypass angular's $http service to return a downloaded file\n // so this posts the form to the server directly from the template instead of going through the insights service.\n $scope.exportLoading = false;\n $scope.exportFullReport = function () {\n $scope.currentTimezone = moment.tz.guess();\n $scope.exportLoading = true;\n\n $timeout(function () {\n $scope.exportLoading = false;\n }, 3000);\n };\n\n $scope.sortBy = function (propertyName) {\n $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;\n $scope.propertyName = propertyName;\n };\n\n $scope.loadDetails = function (course) {\n $scope.selectedCourse = course;\n $scope.showDetails();\n $scope.detailsLoading = true;\n $scope.detailsErrorThrown = false;\n\n var courseDetailsCall = CoursesService.getUserSummariesByCourse(course.id);\n courseDetailsCall.then(function (success) {\n $scope.detailRows = success;\n $scope.detailsLoading = false;\n }, function (failure) {\n $scope.detailsLoading = false;\n $scope.detailsErrorThrown = true;\n $scope.detailsErrorMessage = 'There was an error loading career path details data.';\n });\n };\n\n $scope.showDetails = function () {\n $scope.currentFocus = 'details';\n $scope.sortBy('assignment.studentLastName');\n \n };\n\n $scope.showList = function () {\n $scope.currentFocus = 'list';\n $scope.sortBy('course.name');\n $scope.detailRows = null;\n };\n\n\n $scope.openVideo = function (src, new_page_title) {\n\n var new_window = window.open('', '_blank', 'location=1,status=1,toolbar=1,scrollbars=1,resizeable=1,width=1000,height=800');\n new_window.document.write('' + new_page_title + '');\n\n };\n\n };\n}]);\n","app.factory('Insights_AdminOverride', ['$httpParamSerializer', '$injector', '$location', '$q', '$route', '$timeout', '$filter', 'RoleMapsMixin', 'InsightsService', 'CoursesService', 'errorDisplayerUtil', 'UsersService', 'InsightsDecisionMapService', 'OrganizationsService', 'SettingsService',\nfunction ($httpParamSerializer, $injector, $location, $q, $route, $timeout, $filter, RoleMapsMixin, InsightsService, CoursesService, errorDisplayerUtil, UsersService, InsightsDecisionMapService, OrganizationsService, SettingsService) {\n return function ($scope) {\n\n var _this = this;\n\n $scope.defaultHeader = true; // This Sets the page to full width of the screen.\n $scope.hideCatalogSearch = true;\n /* This will make the navigation tab active on certain page */\n $scope.activeTab = 'tab-active-class';\n\n /*This will route users to the appropiate user manual based on active tab*/\n $scope.userManualHref = 'https://ld-connect.bai.org/learning-manager/training-administrator-user-manual/#Training-Insights';\n\n var sett = SettingsService.getSettings().then(function (success) {\n /* Training Insights access determined by the organization settings */\n $scope.showTrainingInsights = SettingsService.isTrainingInsightsEnabled();\n $scope.showCareerPath = SettingsService.isCareerPathEnabled();\n if ($scope.showTrainingInsights) {\n $scope.homeTemplate = 'app/templates/insights/partials/admin.content.html';\n }\n });\n \n\n /* get the decisionMapID from the URL, save in the current scope */\n $scope.decisionMapID = 0;\n _this.commentSection = '';\n $scope.decisionMap = [];\n $scope.criteriaDataPoint = '';\n $scope.decisionMakerName = '';\n\n\n\n $scope.homeAction = function () {\n $scope.contentTemplate = 'app/templates/insights/home/admin.html';\n };\n\n $scope.createdecisionmapAction = function () {\n $scope.contentTemplate = 'app/templates/insights/mappingdecisions/createandstart.html';\n };\n\n $scope.decisionmapcoursesAction = function () {\n var params = $route.current.params.param.split('/');\n $scope.decisionMapID = params[0];\n\n $scope.contentTemplate = 'app/templates/insights/mappingdecisions/courses.html'; \n };\n\n $scope.wizardAction = function () {\n var params = $route.current.params.param.split('/');\n $scope.currentWizardStep = params[0];\n $scope.contentTemplate = \"app/templates/insights/mappingdecisions/wizard/wizardContainer.html\";\n };\n\n $scope.decisionmapreportAction = function() {\n var params = $route.current.params.param.split('/');\n $scope.decisionMapID = params[0];\n $scope.contentTemplate = 'app/templates/insights/mappingdecisions/report.html';\n };\n\n $scope.createNewDecisionMap = function () {\n InsightsDecisionMapService.reset();\n $location.path(\"insights/createdecisionmap\");\n };\n $scope.openVideo = function (src, new_page_title) {\n\n var new_window = window.open('', '_blank', 'location=1,status=1,toolbar=1,scrollbars=1,resizeable=1,width=1000,height=800');\n new_window.document.write('' + new_page_title + '');\n\n };\n };\n}]);\n\n","app.factory('Insights_DecisionMakerOverride', ['$route', '$location', 'BreadcrumbsService', 'InsightsDecisionMapService', function ($route, $location, BreadcrumbsService, InsightsDecisionMapService) {\n return function ($scope) {\n\n $scope.homeTemplate = 'app/templates/insights/decisionMaker/decisionmaker.html';\n $scope.homeAction = function () {\n $scope.decisionMakerContent = 'app/templates/insights/decisionMaker/decisionmapsummaries.html';\n BreadcrumbsService.pushCrumb(\"Training Insights\", \"insights/home\");\n BreadcrumbsService.pushCrumb(\"Decision Reports\", \"\");\n };\n\n $scope.createdecisionmapAction = function () {\n $scope.decisionMakerContent = 'app/templates/insights/mappingdecisions/createandstart.html';\n BreadcrumbsService.pushCrumb(\"Training Insights\", \"insights/home\");\n BreadcrumbsService.pushCrumb(\"Create Decision Report\", \"\");\n };\n\n $scope.wizardAction = function () {\n var params = $route.current.params.param.split('/');\n $scope.currentWizardStep = params[0];\n $scope.decisionMakerContent = \"app/templates/insights/mappingdecisions/wizard/wizardContainer.html\";\n BreadcrumbsService.pushCrumb(\"Training Insights\", \"insights/home\");\n BreadcrumbsService.pushCrumb(\"Decision Report Wizard\", \"\");\n };\n\n $scope.decisionmapcoursesAction = function () {\n //Add get the decisionmapID from the URL and populate the course page with it\n var params = $route.current.params.param.split('/');\n $scope.decisionMapID = params[0];\n\n $scope.decisionMakerContent = 'app/templates/insights/mappingdecisions/courses.html';\n\n BreadcrumbsService.pushCrumb(\"Training Insights\", \"insights/home\");\n BreadcrumbsService.pushCrumb(\"Decision Report Courses\", \"\");\n };\n\n $scope.decisionmapreportAction = function () {\n var params = $route.current.params.param.split('/');\n $scope.decisionMapID = params[0];\n $scope.decisionMakerContent = 'app/templates/insights/mappingdecisions/report.html';\n BreadcrumbsService.pushCrumb(\"Training Insights\", \"insights/home\");\n BreadcrumbsService.pushCrumb(\"Decision Report Report\", \"\");\n };\n\n $scope.createNewDecisionMap = function () {\n InsightsDecisionMapService.reset();\n $location.path(\"insights/createdecisionmap\");\n };\n\n $scope.decisionmapreport = function() {\n $location.path('insights/home');\n };\n $scope.openVideo = function (src, new_page_title) {\n\n var new_window = window.open('', '_blank', 'location=1,status=1,toolbar=1,scrollbars=1,resizeable=1,width=1000,height=800');\n new_window.document.write('' + new_page_title + '');\n\n };\n };\n}]);","app.factory('Management_AdminOverride', ['$httpParamSerializer', '$injector', '$location', '$q', '$route', '$timeout', '$filter', 'CountriesService', 'DocumentService', 'JobsService', 'LocationsService', 'OrganizationsService', 'TimezoneService', 'UsersService', 'RoleMapsMixin', 'OrgFunctions', 'dateUtil', 'errorDisplayerUtil', 'successDisplayerUtil', 'SettingsService', 'StatesService', 'TreeHelpers', 'CategoriesService', 'CatalogService',\n function ($httpParamSerializer, $injector, $location, $q, $route, $timeout, $filter, CountriesService, DocumentService, JobsService, LocationsService, OrganizationsService, TimezoneService, UsersService, RoleMapsMixin, OrgFunctions, dateUtil, errorDisplayerUtil, successDisplayerUtil, SettingsService, StatesService, TreeHelpers, CategoriesService, CatalogService) {\n return function($scope) {\n $scope.SettingsService = SettingsService;\n var _this = this;\n\n /* This will hide the breadcrumbs and search form on the top right of header */\n $scope.defaultHeader = true;\n $scope.hideCatalogSearch = true;\n\n /* This will make the navigation tab active on certain page */\n $scope.activeTab = 'tab-active-class';\n\n /*This will route users to the appropiate user manual based on active tab*/\n $scope.userManualHref = 'https://ld-connect.bai.org/learning-manager/training-administrator-user-manual/#Management';\n\n $scope.customDocumentsEnabled = window.customDocumentsEnabled;\n\n /* Training Insights access determined by the organization settings */\n var sett = SettingsService.getSettings().then(function (success) {\n $scope.showTrainingInsights = SettingsService.isTrainingInsightsEnabled();\n $scope.showCareerPath = SettingsService.isCareerPathEnabled();\n $scope.showCustomContent = SettingsService.isILTEnabled();\n //need to add this here because of race conditions\n if ($route.current.params.name === 'createcategory' || $route.current.params.name === 'editcategory') {\n if (!$scope.showCustomContent && $scope.allUniqueCategories !== undefined) { $scope.showOnlyDocumentTaxonomy(); }\n }\n });\n\n /**\n * Keeps the search value for all the different types of right side searches\n *\n * @type {string}\n */\n $scope.management = {};\n $scope.management.managementSearch = '';\n $scope.propertyName = 'name';\n $scope.reverse = false;\n\n $scope.home = {};\n $scope.home.limit = 50;\n $scope.home.maxVisiblePages = 10;\n _this.scopedViewListData = [];\n\n $scope.modalIncludes = {};\n\n /* This gets called by the UsersController\n * Consider it the entry point of the TA page.\n */\n $scope.homeAction = function () {\n $scope.home.page = 1;\n $scope.home.total = 0;\n $scope.homeTemplate = 'app/templates/management/home/admin.html';\n };\n\n\t\t\t\n $scope.containerPopover = {};\t\n $scope.containerPopover.isOpen = false;\n // Organization's related logic follows below\n\n $scope.OrgTreeTitle = \"Organizations\";\n $scope.orgTableError = {};\n $scope.orgTableError.error = errorDisplayerUtil.create();\n $scope.OrgOptions = {};\n $scope.OrgData = [{ 'name': 'Organizations', 'nodes': [] }];\n $scope.OrgData[0].nodes.push({ 'nodes': [], 'name': 'Active', 'lockIcon': true });\n $scope.OrgData[0].nodes.push({ 'nodes': [], 'name': 'Inactive', 'lockIcon': true });\n $scope.orgCutoff = 100;\n _this.originalOrgList = [];\n\n $scope.deleteModal = {};\n $scope.deleteModal.CoursesData = [];\n\n $scope.vieworganizationsAction = function () {\n $scope.home.page = 1;\n $scope.homeTemplate = 'app/templates/management/vieworganizations/admin.html';\n\n $scope.management.managementSearch = '';\n\n $scope.orgTableError.error.reset();\n $scope.orgTableIsLoading = true;\n _this.isOrgsListPage = true;\n $scope.OrgOptions.initiallyOpened = true;\n $scope.OrgOptions.showLocks = false;\n $scope.orgSelected = $scope.OrgData[0];\n\n //Determine if there is any filter selected, if so, expand Organizations and select the node\n if (typeof ($route.current.params.orgFilter) !== 'undefined') {\n var filterSel = $route.current.params.orgFilter.toLowerCase() === 'active' ? 0 : 1;\n $scope.orgSelected = $scope.OrgData[0].nodes[filterSel];\n $scope.orgExpanded = [$scope.OrgData[0]];\n }\n\n var organizationsDataPromise = OrganizationsService.getOrganizationHierarchy();\n organizationsDataPromise.then(function (success) {\n _this.originalOrgList = success;\n\n if ($route.current.params.orgFilter) {\n $scope.OrgOptions.initiallyOpened = true;\n var filter = $route.current.params.orgFilter;\n $scope.OrgNodeClick({ 'name': filter });\n } else {\n _this.scopedViewListData = (success);\n $scope.rows = success.slice(0, $scope.home.limit);\n _this.calculatePages(success);\n $scope.orgTableIsLoading = false;\n }\n }, function(failure) {\n $scope.orgTableIsLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.orgTableError.error.setError(errorCode, message);\n });\n };\n\n $scope.home.nextPage = function () {\n var searchTerm = $scope.management.managementSearch;\n if (searchTerm) {\n _this.SearchData();\n } else {\n _this.setStartandEndIndex();\n $scope.rows = _this.scopedViewListData.slice($scope.startIndex, $scope.endIndex);\n }\n };\n\n $scope.general = {};\n $scope.general.peopleSearch = null;\n\n $scope.general.filterBySearch = function () {\n $scope.home.page = 1;\n _this.SearchData();\n };\n\n //this function is used for the 'simple search'\n _this.SearchData = function() {\n var searchTerm = $scope.management.managementSearch;\n \n\n var filtered = [];\n if (_this.isOrgsListPage) {\n filtered = $filter('filter')(_this.scopedViewListData, function (row) {\n return ((row.name.toLowerCase()).indexOf((searchTerm.toLowerCase()) || '') !== -1 ||\n (!row.isTopLevelOrg && (row.parentOrgName.toLowerCase()).indexOf((searchTerm.toLowerCase()) || '') !== -1)\n );\n }\n );\n } else if (_this.isJobsListPage) {\n filtered = $filter('filter')(_this.scopedViewListData, function (row) {\n return ((row.name.toLowerCase()).indexOf((searchTerm.toLowerCase()) || '') !== -1 ||\n ((row.code.toLowerCase()).indexOf((searchTerm.toLowerCase()) || '') !== -1)\n );\n }\n );\n }\n\n _this.calculatePages(filtered);\n _this.setStartandEndIndex();\n $scope.rows = filtered.slice($scope.startIndex, $scope.endIndex);\n };\n\n // Organization object that gets sent to server\n $scope.organization = {};\n // create organization namespace\n $scope.updateOrg = {};\n // holds angular error/form logic for creating organizations\n $scope.updateOrg.orgform = {};\n $scope.updateOrg.error = errorDisplayerUtil.create();\n $scope.updateOrg.isLoading = false;\n\n $scope.updateOrg.organizationCta = function() {\n /* portalId of the organization should always\n * be the user's portalId */\n $scope.updateOrg.isLoading = true;\n var orgData = $scope.organization;\n var params = $route.current.params;\n orgData.updateDateTime = moment().format();\n\n var method;\n if (params.name.includes('create')) {\n method = 'POST';\n } else if (params.name.includes('edit')) {\n method = 'PUT';\n }\n\n var organization = OrganizationsService.updateOrganization(orgData, method);\n organization.then(function(success) {\n $scope.updateOrg.isLoading = false;\n $location.url('management/vieworganizations/');\n }, function(failure) {\n $scope.updateOrg.isLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.updateOrg.error.setError(errorCode, message);\n });\n };\n\n $scope.viewOrgForm = {};\n $scope.viewOrgForm.error = errorDisplayerUtil.create();\n $scope.viewOrgForm.isLoading = false;\n\n /******* CREATE ORGANIZATION ******/\n $scope.createorgAction = function() {\n $scope.homeTemplate = 'app/templates/management/createorg/admin.html';\n $scope.createHeader = true;\n $scope.viewOrgForm.isLoading = true;\n\n var orgCreateObj = OrganizationsService.createOrgObj(true);\n var organizationsDataPromise = OrganizationsService.getOrganizationHierarchy();\n var all = $q.all([orgCreateObj, organizationsDataPromise]);\n\n all.then(function (success) {\n $scope.viewOrgForm.isLoading = false;\n $scope.organization = success[0];\n $scope.orgList = (_this.formatOrgDataForTypeahead(success[1]));\n \n // Organizations should be enabled by default.\n $scope.organization.enabled = true;\n }, function (error) {\n $scope.viewOrgForm.isLoading = false;\n var errorCode = error.StatusCode;\n var message = error.ErrorMessage;\n $scope.viewOrgForm.error.setError(errorCode, message);\n });\n\n };\n\n /* ************* EDIT ORGANIZATION *******/\n $scope.editorganizationAction = function() {\n $scope.homeTemplate = 'app/templates/management/editorganization/admin.html';\n $scope.createHeader = false;\n\n $scope.viewOrgForm.isLoading = true;\n var params = $route.current.params.param.split('/');\n var orgId = parseInt(params[0]);\n\n var singleOrgPromise = OrganizationsService.getSingleOrg(orgId);\n var organizationsDataPromise = OrganizationsService.getOrganizationHierarchy();\n var all = $q.all([singleOrgPromise, organizationsDataPromise]);\n all.then(function (success) {\n $scope.viewOrgForm.isLoading = false;\n $scope.organization = success[0];\n $scope.orgList = _this.formatOrgDataForTypeahead(success[1]);\n }, function(error) {\n $scope.viewOrgForm.isLoading = false;\n var errorCode = error.StatusCode;\n var message = error.ErrorMessage;\n $scope.viewOrgForm.error.setError(errorCode, message);\n });\n };\n\n $scope.selectParentOrganization = function ($item, $model, $label, $event, organization) {\n $scope.organization.parentId = $item.id;\n };\n\n _this.formatOrgDataForTypeahead = function(orgData) {\n var temporgList = [];\n $scope.orgCutoff = 100; // cutoff point for dropdown vs uib-typeahead\n\n\n var activeOrgs = _.filter(orgData, function (org) {\n return (org.enabled === true);\n });\n\n for (var i = 0; i < activeOrgs.length; i++) {\n var aorg = (activeOrgs[i]);\n temporgList.push({ \"name\": aorg.name, \"id\": aorg.id });\n }\n return temporgList;\n };\n\n $scope.OrgNodeClick = function (orgFilter) {\n $scope.home.page = 1;\n $scope.management.managementSearch = '';\n /* If we're not on the Org list page,\n * redirect to the Orgs list page and filter Orgs by active/inactive or none */\n if (!_this.isOrgsListPage) {\n var searchParams = {};\n\n if (orgFilter.name === 'Active') {\n searchParams.orgFilter = 'Active';\n }\n\n if (orgFilter.name === 'Inactive') {\n searchParams.orgFilter = 'Inactive';\n }\n\n var newLocation = 'management/vieworganizations/';\n searchParams = $httpParamSerializer(searchParams);\n\n $location.path(newLocation).search(searchParams);\n return;\n }\n \n if (orgFilter.name === 'Active') {\n _this.scopedViewListData = _.filter(_this.originalOrgList, { \"enabled\": true });\n }\n else if (orgFilter.name === 'Inactive') {\n _this.scopedViewListData = _.filter(_this.originalOrgList, { \"enabled\": false });\n } \n \n $scope.rows = _this.scopedViewListData.slice(0, $scope.home.limit);\n _this.calculatePages(_this.scopedViewListData);\n $scope.orgTableIsLoading = false;\n return;\n };\n\n\n /* *********** JOBS TREE, JOBS LIST AND EDITING JOBS *******/\n $scope.jobsList = {};\n $scope.jobsList.error = errorDisplayerUtil.create();\n $scope.jobsList.isLoading = false;\n $scope.jobsList.options = {};\n $scope.jobsList.options.showLocks = false;\n $scope.jobsList.title = \"Positions\";\n $scope.jobsList.inputData = [{ 'name': 'Positions', 'nodes': [] }];\n $scope.jobsList.inputData[0].nodes.push({ 'nodes': [], 'name': 'Active' });\n $scope.jobsList.inputData[0].nodes.push({ 'nodes': [], 'name': 'Inactive' });\n $scope.jobsList.jobs = [];\n _this.originalJobs = [];\n /* For any jobs related page, if this\n * variable is false, it means we're not on \n * lms-web/management/viewjobs/\n * \n * Used by the node click on the jobs tree component.\n * That way when someone tries to filter active jobs on the job edit page for example,\n * the user can be redirected to lms-web/manage/view-jobs/?jobs=active\n */\n _this.isJobsListPage = false;\n\n $scope.viewjobsAction = function () {\n $scope.home.page = 1;\n $scope.jobsList.error.reset();\n\n $scope.homeTemplate = 'app/templates/management/viewjobs/admin.html';\n\n $scope.jobSelected = $scope.jobsList.inputData[0];\n //Determine if there is any filter selected, if so, expand Positions and select the node\n if (typeof ($route.current.params.jobFilter) !== 'undefined') {\n var filterSel = $route.current.params.jobFilter.toLowerCase() === 'active' ? 0 : 1;\n $scope.jobSelected = $scope.jobsList.inputData[0].nodes[filterSel];\n $scope.jobExpanded = [$scope.jobsList.inputData[0]];\n }\n\n _this.isJobsListPage = true;\n\n $scope.jobsList.isLoading = true;\n $scope.jobsList.error.reset();\n\n var jobs = JobsService.getAllJobs();\n\n $scope.jobsList.options.initiallyOpened = true;\n\n jobs.then(function(success) {\n $scope.jobsList.isLoading = false;\n _this.originalJobs = (success);\n\n if ($route.current.params.jobFilter) {\n $scope.jobsList.options.initiallyOpened = true;\n var filter = $route.current.params.jobFilter;\n $scope.selectJobFilter({ 'name': filter });\n } else {\n _this.scopedViewListData = (success);\n $scope.rows = success.slice(0, $scope.home.limit);\n }\n\n }, function(failure) {\n $scope.jobsList.isLoading = false;\n $scope.jobsList.error.setError(failure.ErrorCode, failure.ErrorMessage);\n });\n };\n\n /**\n * Namespace for editing call.\n *\n * @type {object}\n */\n $scope.editJob = {};\n $scope.editJob.baiForm = {};\n $scope.editJob.error = errorDisplayerUtil.create();\n $scope.editJob.isLoading = false;\n\n $scope.editJob.closePopover = function() {\n $scope.editJob.popoverOpen = false;\n };\n\n $scope.editjobAction = function() {\n $scope.homeTemplate = 'app/templates/management/editjob/admin.html';\n\n var params = $route.current.params.param.split('/');\n\n var jobId = parseInt(params[0]);\n\n $scope.editJob.error.reset();\n\n var job = JobsService.getAllJobs();\n $scope.editJob.isLoading = true;\n\n job.then(function(success) {\n var job = _.filter(success, function(job) {\n return (job.id === jobId);\n });\n if (job.length > 0) {\n job[0].lastUpdate = moment(job[0].lastUpdate);\n $scope.job = job[0];\n } else {\n $scope.editJob.error.setError(\"404\", \"Position not found\");\n }\n\n $scope.editJob.jobNames = _.map(success, function(job) {\n /* Don't add the name of the job we're editing\n * because we want the user to be able to save a job\n * with that name\n */\n if ($scope.job && job.id === $scope.job.id) {\n return null;\n }\n return job.name;\n });\n\n $scope.editJob.isLoading = false;\n }, function(failure) {\n $scope.editJob.error.setError(failure.ErrorCode, failure.ErrorMessage);\n $scope.editJob.isLoading = false;\n });\n };\n\n // Called on edit job page save button click\n $scope.editJob.updateJob = function(optionalToggleActiveStatus) {\n $scope.editJob.isLoading = true;\n /* Close the popover in case this\n * function was called from the popover */\n $scope.editJob.closePopover();\n\n /* I could pass $scope.job as-is but \n * if I change the isActive field,\n * it'll propagate to the GUI and that hurts the user\n * experience */\n var job = angular.copy($scope.job);\n\n if (job.nodes)\n delete job.nodes;\n if (job.lastUpdate)\n delete job.lastUpdate;\n\n if (optionalToggleActiveStatus) {\n job.isActive = !job.isActive;\n }\n\n JobsService.updateJob(job).then(function(success) {\n window.location = 'management/viewjobs/';\n }, function(failure) {\n $scope.editJob.isLoading = false;\n\n $scope.editJob.error.setError(failure.ErrorCode, failure.ErrorMessage);\n });\n };\n\n /* If this is on the jobs list page do one thing\n * If it's not on the jobs list page do something else */\n\n // Only filters jobs row\n $scope.selectJobFilter = function (jobFilter) {\n $scope.home.page = 1;\n $scope.management.managementSearch = '';\n /* If we're not on the jobs list page,\n * redirect to the jobs list page and filter jobs by active/inactive or none */\n if (!_this.isJobsListPage) {\n var searchParams = {};\n\n if (jobFilter.name === 'Active') {\n searchParams.jobFilter = 'Active';\n }\n\n if (jobFilter.name === 'Inactive') {\n searchParams.jobFilter = 'Inactive';\n }\n\n var newLocation = 'management/viewjobs/';\n searchParams = $httpParamSerializer(searchParams);\n\n $location.path(newLocation).search(searchParams);\n return;\n }\n\n \n if (jobFilter.name === 'Inactive') {\n // Show all inactive jobs\n _this.scopedViewListData = _.filter(_this.originalJobs, { \"isActive\": false });\n } else {\n // Default - Show all active jobs (jobFilter.name === 'Active')\n _this.scopedViewListData = _.filter(_this.originalJobs, { \"isActive\": true });\n }\n \n $scope.rows = _this.scopedViewListData.slice(0, $scope.home.limit);\n _this.calculatePages(_this.scopedViewListData);\n return;\n };\n\n // Jobs Creation Starts From Here\n $scope.createJob = {};\n $scope.createJob.baiform = {};\n $scope.createJob.inputJobName = false;\n $scope.createJob.error = errorDisplayerUtil.create();\n\n $scope.createjobAction = function() {\n //default template for both save and edit people group form peopleTab\n $scope.homeTemplate = 'app/templates/management/createJob/admin.html';\n // input for creating new people group name\n $scope.createJob.inputJobName = true;\n // people group template header changes based on create/update\n $scope.createJob.defaultJobHeader = true;\n //Get the list of jobs to check that we do not duplicate the name\n _this.isJobsListPage = true;\n\n var job = JobsService.getAllJobs();\n\n job.then(function(success) {\n $scope.editJob = {};\n $scope.editJob.jobNames = _.map(success, function(job) {\n return job.name;\n });\n\n }, function(failure) {\n //Do nothing\n });\n\n $scope.job = {};\n };\n\n $scope.containerOptions = {};\n $scope.containerOptions.showLock = false;\n $scope.createJob.success = successDisplayerUtil.create();\n\n $scope.createJob.createJob = function(job) {\n\n //Generate a guid for the job code\n job.code = sqlguid();\n\n JobsService.createJob(job).then(function(success) {\n //Show Success message\n $scope.createJob.success.set('The Position has been saved.');\n //Redirect to job list \n setTimeout(function() {\n $scope.viewjobsAction();\n return $location.url('management/viewjobs/');\n }, 2000);\n }, function(failure) {\n $scope.createJob.isLoading = false;\n\n $scope.createJob.error.setError(failure.ErrorCode, failure.ErrorMessage);\n\n });\n };\n\n /**\n * Namespace to avoid collisions with other loaders.\n *\n * @type {object}\n */\n $scope.manageLocation = {};\n $scope.manageLocation.error = errorDisplayerUtil.create();\n $scope.manageLocation.countriesLoading = false;\n\n $scope.manageLocation.popoverOpen = false;\n\n $scope.manageLocation.closePopover = function() {\n $scope.manageLocation.popoverOpen = false;\n };\n\n /**\n * Namespace for creation call.\n *\n * @type {object}\n */\n $scope.createLocation = {};\n $scope.createLocation.error = errorDisplayerUtil.create();\n $scope.manageLocation.baiform = {};\n\n /**\n * Namespace for editing call.\n *\n * @type {object}\n */\n $scope.editLocation = {};\n $scope.editLocation.error = errorDisplayerUtil.create();\n\n /**\n * Create Location action endpoint.\n *\n * @void\n */\n $scope.createlocationAction = function () {\n $scope.location = {};\n\n $scope.homeTemplate = 'app/templates/management/createlocation/admin.html';\n\n var timezones = TimezoneService.getAllTimezones();\n timezones.then(function(data) {\n $scope.timezones = data;\n }, function(failure) {\n // Do nothing\n });\n\n $scope.manageLocation.error.reset();\n\n $scope.types = LocationsService.types;\n\n var countries = CountriesService.getLatitudeCountryList(UsersService.getPortalId());\n countries.then(function(success) {\n $scope.countries = success;\n $scope.selectedCountry = _.findIndex($scope.countries, { countryName: 'United States' }) === -1 ? null : $scope.countries[_.findIndex($scope.countries, { countryName: 'United States' })].countryId; //to set it to united states when filling countrylist for first time when creating new location\n $scope.getStates($scope.selectedCountry);\n $scope.manageLocation.countriesLoading = false;\n }, function(failure) {\n // @TODO: @sfrohm fail page totally\n });\n\n };\n\n $scope.initNewLocationStartDate = function() {\n if (typeof $scope.location !== \"undefined\" && (typeof $scope.location.startDate === 'undefined' || $scope.location.startDate === null)) {\n var startDateTime = dateUtil.setPortalStartTime(new Date());\n $scope.location.startDate = dateUtil.formatDate(startDateTime);\n }\n };\n\n /**\n * Creates a location after a user completes the form and submits\n */\n $scope.sendCreateLocationCall = function () {\n var locationData = angular.copy($scope.location);\n if (typeof $scope.location.startDate !== \"undefined\" && typeof $scope.location.startDate.moment !== \"undefined\") {\n locationData.startDate = locationData.startDate.moment.toISOString();\n } else {\n locationData.startDate = null;\n }\n\n var create = LocationsService.create(locationData);\n\n create.then(function(success) {\n return $location.url('management/viewlocations/');\n }, function(failure) {\n $scope.createLocation.error.setError(failure.ErrorCode, failure.ErrorMessage);\n });\n };\n\n $scope.editlocationAction = function() {\n $scope.homeTemplate = 'app/templates/management/editlocation/admin.html';\n\n var params = $route.current.params.param.split('/');\n\n var locationId = params[0];\n\n $scope.manageLocation.error.reset();\n\n $scope.types = LocationsService.types;\n\n var timezones = TimezoneService.getAllTimezones();\n timezones.then(function(data) {\n $scope.timezones = data;\n }, function(failure) {\n // Do nothing\n });\n\n var countries = CountriesService.getLatitudeCountryList(UsersService.getPortalId());\n countries.then(function(success) {\n $scope.countries = success;\n\n $scope.manageLocation.countriesLoading = false;\n }, function(failure) {\n // @TODO: @sfrohm what do we do when this fails? API is not going to complete a POST with missing data\n });\n\n var location = LocationsService.getSingle(locationId);\n location.then(function(success) {\n $scope.location = success;\n\n var locationAddress = $scope.location.physicalAddress;\n var defaultCountry = _.findIndex($scope.countries, { countryName: 'United States' }) === -1 ? null : $scope.countries[_.findIndex($scope.countries, { countryName: 'United States' })].countryId;\n $scope.selectedCountry = $scope.location.physicalAddress.countryId === null ? $scope.location.physicalAddress.countryId = defaultCountry : $scope.location.physicalAddress.countryId ; // if countryid is null (no country selected) then set it to UnitedStates else country itself\n // Get a state list for the user, based on country\n if (typeof locationAddress !== 'undefined' && locationAddress !== null && locationAddress.countryId !== null && parseInt(locationAddress.countryId, 10) > 0) {\n $scope.getStates($scope.location.physicalAddress.countryId);\n }\n\n }, function(failure) {\n $scope.manageLocation.error.setError(failure.ErrorCode, failure.ErrorMessage);\n });\n };\n\n $scope.getStates = function (countryId) {\n\n var states = StatesService.getLatitudeStateList(countryId);\n\n states.then(function(stateList) {\n $scope.states = stateList;\n }, function(error) {\n $scope.states = [];\n });\n };\n\n\n /**\n * Edits a location after a user completes the form and submits\n *\n * @void\n */\n $scope.sendEditLocationCall = function(deactivate) {\n $scope.editLocation.error.reset();\n\n var locationData = angular.copy($scope.location);\n if (typeof $scope.location.startDate !== \"undefined\" && typeof $scope.location.startDate.moment !== \"undefined\") {\n var startDateTime = dateUtil.setPortalStartTime(locationData.startDate.moment.toDate());\n locationData.startDate = startDateTime.toISOString();\n } else {\n locationData.startDate = null;\n }\n\n if (typeof deactivate !== 'undefined') {\n if (deactivate === true) {\n locationData.endDate = new Date();\n } else {\n locationData.startDate = new Date();\n locationData.endDate = null;\n }\n } \n\n var edit = LocationsService.edit(locationData);\n edit.then(function(success) {\n return $location.url('management/viewlocations/');\n }, function(failure) {\n $scope.editLocation.error.setError(failure.ErrorCode, failure.ErrorMessage);\n });\n };\n\n $scope.locationsList = {};\n $scope.locationsList.showLocks = false;\n $scope.locationsList.title = \"Locations\";\n /**\n * Hardcoded filter list, specifically for filtering by active/inactive only. Can be reused anywhere,\n * in unison with locationsList.options.searchUpdateCallback.\n */\n $scope.locationsList.treeData = [{ 'name': 'Locations', 'nodes': [] }];\n $scope.locationsList.treeData[0].nodes.push({ 'nodes': [], 'name': 'Active', 'value': true });\n $scope.locationsList.treeData[0].nodes.push({ 'nodes': [], 'name': 'Inactive', 'value': false });\n\n $scope.locationsList.error = errorDisplayerUtil.create();\n $scope.locationsList.isLoading = false;\n $scope.locationsList.options = {};\n $scope.locationsList.options.showLocks = false;\n\n _this.isLocationsListPage = false;\n\n $scope.viewlocationsAction = function() {\n $scope.locationsList.error.reset();\n _this.isLocationsListPage = true;\n $scope.locationsList.options.initiallyOpened = true;\n\n $scope.homeTemplate = 'app/templates/management/viewlocations/admin.html';\n\n $scope.locationSelected = $scope.locationsList.treeData[0];\n //Determine if there is any filter selected, if so, expand Locations and select the node\n if (typeof ($route.current.params.locationFilter) !== 'undefined') {\n var filterSel = $route.current.params.locationFilter.toLowerCase() === 'active' ? 0 : 1;\n $scope.locationSelected = $scope.locationsList.treeData[0].nodes[filterSel];\n $scope.locationExpanded = [$scope.locationsList.treeData[0]];\n }\n\n $scope.locationsList.isLoading = true;\n $scope.locationsList.error.reset();\n\n var facilities = LocationsService.getAll();\n facilities.then(function(success) {\n $scope.locationsList.isLoading = false;\n\n $scope.locationsList.data = success;\n _this.locationsListData = success;\n\n if ($route.current.params.locationFilter) {\n $scope.locationsList.options.initiallyOpened = true;\n\n var filter = $route.current.params.locationFilter;\n\n $scope.locationsList.filterLocations({ 'name': filter });\n }\n }, function(failure) {\n $scope.locationsList.isLoading = false;\n $scope.locationsList.error.setError(failure.ErrorCode, failure.ErrorMessage);\n });\n };\n\n /**\n * Callback to ensure proper filtering is set, as this filtering is not done by ID.\n */\n\n $scope.locationsList.filterLocations = function(locationFilter) {\n /* If we're not on the Org list page,\n * redirect to the Orgs list page and filter Orgs by active/inactive or none */\n if (!_this.isLocationsListPage) {\n var searchParams = {};\n\n if (locationFilter.name === 'Active') {\n searchParams.locationFilter = 'Active';\n }\n\n if (locationFilter.name === 'Inactive') {\n searchParams.locationFilter = 'Inactive';\n }\n\n var newLocation = 'management/viewlocations/';\n searchParams = $httpParamSerializer(searchParams);\n\n $location.path(newLocation).search(searchParams);\n }\n\n if (locationFilter.name === 'Locations') {\n // Show all locations\n $scope.locationsList.data = _this.locationsListData;\n }\n\n if (locationFilter.name === 'Inactive') {\n // Show all inactive locations\n $scope.locationsList.data = _.filter(_this.locationsListData, function(location) {\n return (location.isActive === false);\n });\n }\n\n if (locationFilter.name === 'Active') {\n // Show all inactive locations\n $scope.locationsList.data = _.filter(_this.locationsListData, function(location) {\n return (location.isActive === true);\n });\n }\n };\n\n\n $scope.DocTreeTitle = \"Documents\";\n $scope.docTableError = {};\n $scope.docTableError.error = errorDisplayerUtil.create();\n $scope.DocOptions = {};\n $scope.DocOptions.showLocks = false;\n $scope.DocOptions.canDrillDown = false;\n $scope.DocData = [{ 'name': 'Documents', 'nodes': [] }];\n $scope.docTableIsLoading = false;\n\n $scope.viewdocumentsAction = function() {\n $scope.homeTemplate = 'app/templates/management/viewdocuments/admin.html';\n\n $scope.docTableError.error.reset();\n $scope.docTableIsLoading = true;\n _this.isDocsListPage = true;\n $scope.DocOptions.initiallyOpened = true;\n $scope.docSelected = $scope.DocData[0];\n\n var organizationsDataPromise = DocumentService.getDocumentRepositoryList();\n organizationsDataPromise.then(function(success) {\n $scope.docTableIsLoading = false;\n $scope.rows = success;\n $scope.docsListData1 = success;\n _this.docsListData = success;\n\n }, function(failure) {\n $scope.docTableIsLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.docTableError.error.setError(errorCode, message);\n });\n };\n\n $scope.DocNodeClick = function(docFilter) {\n if (docFilter.name === \"Documents\") {\n $location.path('management/viewdocuments');\n }\n };\n\n $scope.updateDocument = {};\n $scope.updateDocument.documents = [];\n $scope.updateDocument.error = errorDisplayerUtil.create();\n $scope.updateDocument.success = successDisplayerUtil.create();\n $scope.updateDocument.isLoading = false;\n\n $scope.createdocumentAction = function() {\n $scope.homeTemplate = 'app/templates/management/createdocument/admin.html';\n\n $scope.createHeader = true;\n };\n\n $scope.sendDocumentCreateCall = function() {\n var documentList = $scope.updateDocument.documents;\n var filesToUpload = [];\n\n $scope.updateDocument.error.reset();\n $scope.updateDocument.success.reset();\n\n $scope.updateDocument.isLoading = true;\n\n if (typeof documentList !== 'undefined' && documentList.length > 0) {\n for (var j = 0; j < documentList.length; j += 1) {\n // Uploading a document from browser\n if (documentList[j].fileOrUrl === 'file' && !documentList[j].fromRepo) {\n filesToUpload.push(DocumentService.uploadDocumentToRepository(documentList[j].fileObject));\n } else if (documentList[j].fileOrUrl === 'url') {\n filesToUpload.push(DocumentService.uploadUrlToRepository(documentList[j].name));\n }\n }\n\n $q.all(filesToUpload).then(function(success) {\n $scope.updateDocument.isLoading = false;\n\n $scope.updateDocument.documents = [];\n\n $scope.updateDocument.success.set('The document was successfully uploaded!');\n }, function(failure) {\n $scope.updateDocument.isLoading = false;\n\n $scope.updateDocument.error.setError(failure.ErrorCode, failure.ErrorMessage);\n });\n }\n };\n\n $scope.clickDeleteDocument = function () {\n if ($scope.deleteModal.CoursesData.length > 0) {\n var html = '';\n jQuery($scope.deleteModal.CoursesData).each(function (i, course) {\n html += '' + course.courseCode + '' + course.courseType + '' + course.courseName + '';\n });\n jQuery('#viewDeleteDocumentsModal tbody').html(html);\n angular.element(document.querySelector('#viewDeleteDocumentsModal')).modal();\n\n } else {\n var del = DocumentService.deleteDocumentById($scope.document.id);\n del.then(function (success) {\n jQuery('#deleteDocumentSuccessModal').modal();\n angular.element(document.querySelector('#deleteDocumentSuccessModal')).modal();\n\n }, function (failure) {\n console.log(failure);\n });\n }\n };\n\n $scope.modalIncludes.closeSuccesssModal = function () {\n window.location.pathname = \"lms-web/management/viewdocuments/\";\n };\n\n $scope.clickDocumentSave = function () {\n\n //Check if a new document was uploaded\n var documentList = $scope.updateDocument.documents;\n if (typeof documentList !== 'undefined' && documentList.length > 0) {\n //If yes - toggle the confirmation \n $scope.confirmSaveDocument = true;\n } else {\n //If no - save the page\n $scope.sendDocumentEditCall();\n }\n };\n\n $scope.toggleSaveDocumentTooltip = function () {\n $scope.confirmSaveDocument = false;\n\n };\n\n $scope.sendDocumentEditCall = function () {\n\n $scope.confirmSaveDocument = true;\n \n\n var singleDocument = $scope.document;\n $scope.updateDocument.error.reset();\n $scope.updateDocument.success.reset();\n $scope.updateDocument.isLoading = true;\n\n var documentList = $scope.updateDocument.documents;\n var assetId = singleDocument.id;\n var allPromises = [];\n\n if (typeof documentList !== 'undefined' && documentList.length > 0) {\n var documentToUpload = documentList[0];\n if (documentToUpload.fileOrUrl === 'file' && !documentToUpload.fromRepo) {\n allPromises.push(DocumentService.replaceAsset(documentToUpload.fileObject, assetId, 'file'));\n } else if (documentToUpload.fileOrUrl === 'url') {\n allPromises.push(DocumentService.replaceAsset(documentToUpload.name, assetId, 'url'));\n }\n }\n\n //Need to check if the name changed\n if ($scope.document.originalName !== $scope.document.name) {\n var editDocumentPromise = DocumentService.updateSingleAsset(singleDocument);\n allPromises.push(editDocumentPromise);\n }\n\n $q.all(allPromises).then(function(success) {\n $scope.updateDocument.isLoading = false;\n $location.path('management/viewdocuments');\n }, function(failure) {\n $scope.updateDocument.isLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.updateDocument.error.setError(errorCode, message);\n });\n };\n\n $scope.editdocumentAction = function() {\n $scope.homeTemplate = 'app/templates/management/editdocument/admin.html';\n\n $scope.createHeader = false;\n $scope.updateDocument.error.reset();\n $scope.updateDocument.success.reset();\n $scope.documentFormIsLoading = true;\n\n var params = $route.current.params.param.split('/');\n var docId = parseInt(params[0]);\n\n //To get the all courses for this resourse \n var singleDocInfoPromise = DocumentService.getSingleDocumentInfo(docId);\n singleDocInfoPromise.then(function(success) {\n $scope.document = success;\n $scope.document.originalName = $scope.document.name;\n $scope.updateDocument.documents = success;\n $scope.documentFormIsLoading = false;\n\n var AllCoursesByResourceInfoPromise = DocumentService.getAllCoursesByResource(docId);\n AllCoursesByResourceInfoPromise.then(function (successData) {\n $scope.deleteModal.CoursesData = successData;\n }, function (failure) {\n $scope.deleteModal.CoursesData = [];\n console.log(failure);\n });\n }, function(failure) {\n $scope.documentFormIsLoading = false;\n\n });\n\n \n //End\n \n };\n\n $scope.SettingsTreeTitle = \"Settings\";\n $scope.settingsError = {};\n $scope.settingsError.error = errorDisplayerUtil.create();\n $scope.settingsSuccess = {};\n $scope.settingsSuccess.success = successDisplayerUtil.create();\n $scope.SettingsOptions = {};\n $scope.SettingsOptions.showLocks = false;\n $scope.SettingsOptions.canDrillDown = false;\n $scope.SettingsData = [{ 'name': 'Settings', 'nodes': [] }];\n $scope.settingsIsLoading = false;\n\n $scope.editsettingsAction = function () {\n $scope.homeTemplate = 'app/templates/management/editsettings/admin.html';\n\n $scope.settingsError.error.reset();\n $scope.settingsIsLoading = true;\n\n var settingsDataPromise = SettingsService.getSettingsWithAudit();\n settingsDataPromise.then(function (success) {\n $scope.settingsIsLoading = false;\n $scope.rows = success;\n $scope.settings = success;\n\n }, function (failure) {\n $scope.settingsIsLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.settingsError.error.setError(errorCode, message);\n });\n };\n\n $scope.SettingsNodeClick = function (node) {\n if (node.name === \"Settings\") {\n $location.path('management/editsettings');\n }\n };\n\n $scope.sendSettingsEditCall = function () {\n var setting = $scope.settings;\n\n var allPromises = [];\n \n allPromises.push(SettingsService.updateSettings(\"sysPropDefaultMasteryScore\", setting.features.sysPropDefaultMasteryScore.value));\n allPromises.push(SettingsService.updateSettings(\"EnrollmentLimitType\", setting.features.enrollmentLimitType.value));\n if (setting.features.enrollmentLimitCount !== undefined) {\n allPromises.push(SettingsService.updateSettings(\"EnrollmentLimitCount\", setting.features.enrollmentLimitCount.value));\n }\n if (setting.features.enrollmentLimitDays !== undefined) {\n allPromises.push(SettingsService.updateSettings(\"EnrollmentLimitDays\", setting.features.enrollmentLimitDays.value));\n }\n if (setting.features.enrollmentLimitRefreshMonth.value !== undefined && setting.features.enrollmentLimitRefreshDate.value !== undefined) {\n allPromises.push(SettingsService.updateSettings(\"EnrollmentLimitRefreshMonth\", setting.features.enrollmentLimitRefreshMonth.value));\n allPromises.push(SettingsService.updateSettings(\"EnrollmentLimitRefreshDate\", setting.features.enrollmentLimitRefreshDate.value));\n }\n if (setting.features.sysPropCareerPathDashboard !== undefined && setting.features.sysPropCareerPathDashboard !== null) {\n allPromises.push(SettingsService.updateSettings(\"sysPropCareerPathDashboard\", setting.features.sysPropCareerPathDashboard));\n }\n if (setting.features.sysPropProxyMode !== undefined && setting.features.sysPropProxyMode !== null) {\n allPromises.push(SettingsService.updateSettings(\"sysPropProxyMode\", setting.features.sysPropProxyMode));\n }\n\t\t\t\tif (setting.features.sysPropContentRecommendations !== undefined && setting.features.sysPropContentRecommendations !== null) {\n allPromises.push(SettingsService.updateSettings(\"sysPropContentRecommendations\", setting.features.sysPropContentRecommendations));\n }\n\n $q.all(allPromises).then(function (success) {\n $scope.settingsSuccess.success.message = \"Portal settings were successfully saved.\";\n $scope.settingsSuccess.success.thrown = true;\n }, function (failure) {\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.settingsError.error.setError(errorCode, message);\n });\n\n };\n\n /**\n * Method to sort any table on the management tab\n * @param {string} propertyName\n */\n $scope.sortBy = function (propertyName) {\n $scope.reverse = $scope.propertyName === propertyName ? !$scope.reverse : false;\n $scope.propertyName = propertyName;\n\n var searchTerm = $scope.management.managementSearch;\n\n _this.setStartandEndIndex();\n\n var sortedRows = [];\n if (searchTerm) {\n var filtered = [];\n if (_this.isOrgsListPage) {\n filtered = $filter('filter')(_this.scopedViewListData, function (row) {\n return ((row.name.toLowerCase()).indexOf((searchTerm.toLowerCase()) || '') !== -1 ||\n (row.parentOrgName.toLowerCase()).indexOf((searchTerm.toLowerCase()) || '') !== -1\n );\n }\n );\n } else if (_this.isJobsListPage) {\n filtered = $filter('filter')(_this.scopedViewListData, function (row) {\n return ((row.name.toLowerCase()).indexOf((searchTerm.toLowerCase()) || '') !== -1 ||\n (row.code.toLowerCase()).indexOf((searchTerm.toLowerCase()) || '') !== -1\n );\n }\n );\n }\n sortedRows = $filter('orderBy')(filtered, $scope.propertyName, $scope.reverse);\n } else {\n sortedRows = $filter('orderBy')(_this.scopedViewListData, $scope.propertyName, $scope.reverse);\n }\n _this.scopedViewListData = sortedRows;\n $scope.rows = sortedRows.slice($scope.startIndex, $scope.endIndex);\n };\n\n _this.calculatePages = function (items) {\n $scope.home.total = items.length;\n };\n\n $scope.treeOptions = {\n nodeChildren: 'nodes',\n templateUrl: 'tree.html',\n injectClasses: {\n ul: \"a1\",\n li: \"a2\",\n liSelected: \"a7\",\n iExpanded: \"a3\",\n iCollapsed: \"a4\",\n iLeaf: \"a5\",\n label: \"a6\",\n labelSelected: \"a8\"\n }\n };\n\n $scope.ValidatePortalRetakeMonth = function (settings) {\n settings.features.enrollmentLimitRefreshMonth.value = dateUtil.validMonth(settings.features.enrollmentLimitRefreshMonth.value);\n settings.features.enrollmentLimitRefreshDate.value = dateUtil.validDate(settings.features.enrollmentLimitRefreshMonth.value, settings.features.enrollmentLimitRefreshDate.value);\n };\n\n $scope.ValidatePortalRetakeDate = function (settings) {\n settings.features.enrollmentLimitRefreshDate.value = dateUtil.validDate(settings.features.enrollmentLimitRefreshMonth.value, settings.features.enrollmentLimitRefreshDate.value);\n };\n\n _this.formatToSkinnyOrgData = function (allorgs) {\n var temporgList = [];\n for (var i = 0; i < allorgs.length; i++) {\n temporgList.push(_.pick(allorgs[i], \"id\", \"name\", \"enabled\", \"parentOrgName\", \"isTopLevelOrg\"));\n }\n return temporgList;\n };\n\n _this.setStartandEndIndex = function () {\n $scope.startIndex = ($scope.home.page * $scope.home.limit) - $scope.home.limit;\n $scope.endIndex = $scope.startIndex + $scope.home.limit;\n };\n\n $scope.toggleSaveSettingsTooltip = function () {\n jQuery('.confirmSettingsSave').toggle();\n };\n\t\t\t\n\t\t\t $scope.toggleScoreSettingsTooltip = function () {\t\n jQuery('.scorePopover').toggle();\t\n };\n\n //LMS-7861 Need to close the PopUp Window showing the error message while uploading the document in create document page. \n $scope.hidePopUpModal = function () {\n jQuery('#documentUploaderFileNameError').modal('hide');\n };\n\n // SLY-5342 Sub domain management for management admin tab\n $scope.isSubDomainAdmin = UsersService.isSubDomainAdmin();\n $scope.taDomains = UsersService.taDomains();\n $scope.activeDomain = UsersService.activeDomain();\n $scope.switchDomains = {};\n $scope.switchDomains.error = errorDisplayerUtil.create();\n\n $scope.onActiveDomainChanged = function (activeDomain, oldDomain) {\n var switchProfilePromise = UsersService.switchProfile(activeDomain.id);\n switchProfilePromise.then(function (success) {\n location.reload();\n }, function (failure) {\n $scope.switchDomains.error.setError(failure.StatusCode, failure.ErrorMessage);\n jQuery(\"#switchDomainsError\").show();\n setTimeout(function () {\n $scope.switchDomains.error.reset();\n jQuery(\"#switchDomainsError\").hide();\n }, 2000);\n });\n };\n\n $scope.coursesRetakeResetSuccess = false;\n $scope.settingsRetakeReportIsLoading = false;\n\n $scope.GetCoursesNotDefaultRetakeReport = function () {\n $scope.settingsRetakeReportIsLoading = true;\n $scope.coursesRetakeResetSuccess = false;\n $scope.OpenCourseModal();\n var courses = SettingsService.getCoursesNotUsingDefaultRetake();\n courses.then(function (data) {\n $scope.coursesNotDefaultRetakeReport = data;\n });\n $scope.settingsRetakeReportIsLoading = false;\n };\n \n $scope.OpenCourseModal = function () {\n jQuery('#nonDefaultRetakeCourseModal').modal('show');\n };\n\n $scope.ResetCoursesRetake = function () {\n $scope.settingsRetakeReportIsLoading = true;\n\n var setting = $scope.settings;\n var allPromises = [];\n\n allPromises.push(SettingsService.updateSettings(\"EnrollmentLimitType\", setting.features.enrollmentLimitType.value));\n if (setting.features.enrollmentLimitCount !== undefined) {\n allPromises.push(SettingsService.updateSettings(\"EnrollmentLimitCount\", setting.features.enrollmentLimitCount.value));\n }\n if (setting.features.enrollmentLimitDays !== undefined) {\n allPromises.push(SettingsService.updateSettings(\"EnrollmentLimitDays\", setting.features.enrollmentLimitDays.value));\n }\n if (setting.features.enrollmentLimitRefreshMonth.value !== undefined && setting.features.enrollmentLimitRefreshDate.value !== undefined) {\n allPromises.push(SettingsService.updateSettings(\"EnrollmentLimitRefreshMonth\", setting.features.enrollmentLimitRefreshMonth.value));\n allPromises.push(SettingsService.updateSettings(\"EnrollmentLimitRefreshDate\", setting.features.enrollmentLimitRefreshDate.value));\n }\n\n $q.all(allPromises).then(function (success) {\n var resetResponse = SettingsService.resetCoursesToPortalDefault(\"retake\");\n resetResponse.then(function (success) {\n $scope.settingsRetakeReportIsLoading = false;\n $scope.coursesRetakeResetSuccess = true;\n }, function (failure) {\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.settingsRetakeReportIsLoading = false;\n $scope.settingsError.error.setError(errorCode, message);\n });\n }, function (failure) {\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.settingsRetakeReportIsLoading = false;\n $scope.settingsError.error.setError(errorCode, message);\n });\n \n \n };\n\n $scope.ResetCoursesScore = function () {\n\n var score = $scope.settings.features.sysPropDefaultMasteryScore.value;\n\n var saveScoreResponse = SettingsService.updateSettings(\"sysPropDefaultMasteryScore\", score);\n saveScoreResponse.then(function (success) {\n var resetResponse = SettingsService.resetCoursesToPortalDefault(\"score\");\n resetResponse.then(function (success) {\n $scope.settingsSuccess.success.message = \"Passing Score settings were successfully saved and applied to all courses.\";\n $scope.settingsSuccess.success.thrown = true;\n }, function(failure) {\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.settingsError.error.setError(errorCode, message);\n });\n }, function (failure) {\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.settingsError.error.setError(errorCode, message);\n });\n\n };\n\n $scope.setStartTime = function (dateObj) {\n if (typeof dateObj !== \"undefined\" && dateObj !== null && typeof dateObj.moment !== \"undefined\" && _.isObject(dateObj.moment)) {\n var portalStartTime = dateUtil.setPortalStartTime(dateObj.moment.toDate());\n dateObj = dateUtil.formatDate(portalStartTime);\n } else {\n dateObj = null;\n }\n return dateObj;\n };\n\n $scope.setEndTime = function (dateObj) {\n if (typeof dateObj !== \"undefined\" && dateObj !== null && typeof dateObj.moment !== \"undefined\" && _.isObject(dateObj.moment)) {\n var portalEndTime = dateUtil.setPortalEndTime(dateObj.moment.toDate());\n dateObj = dateUtil.formatDate(portalEndTime);\n } else {\n dateObj = null;\n }\n return dateObj;\n };\n\n\n /**\n *\n * Custom Content - START\n *\n **/\n\n $scope.courseTaxonomyList = {};\n $scope.courseTaxonomyList.error = errorDisplayerUtil.create();\n $scope.courseTaxonomyList.title = \"Course Taxonomy\";\n $scope.courseTaxonomyList.treeData = [{ 'name': 'Course Taxonomy', 'nodes': [] }];\n $scope.courseTaxonomyList.treeData[0].nodes.push({ 'nodes': [], 'name': 'Active', 'value': true });\n $scope.courseTaxonomyList.treeData[0].nodes.push({ 'nodes': [], 'name': 'Inactive', 'value': false });\n $scope.courseTaxonomyList.options = {};\n _this.iscourseTaxonomyPage = false;\n\n $scope.documentTaxonomyList = {};\n $scope.documentTaxonomyList.error = errorDisplayerUtil.create();\n $scope.documentTaxonomyList.title = \"Document Taxonomy\";\n $scope.documentTaxonomyList.treeData = [{ 'name': 'Document Taxonomy', 'nodes': [] }];\n $scope.documentTaxonomyList.treeData[0].nodes.push({ 'nodes': [], 'name': 'Active', 'value': true });\n $scope.documentTaxonomyList.treeData[0].nodes.push({ 'nodes': [], 'name': 'Inactive', 'value': false });\n $scope.documentTaxonomyList.options = {};\n _this.isdocumentTaxonomyPage = false;\n \n /* Left hand navigation - node click */\n $scope.filterTaxonomy = function (taxonomyFilter, contentType) {\n\n /* If we're not on the Course Taxonomy list page,\n * redirect to the Course Taxonomy list page and filter by active/inactive or none */\n if ((contentType === 'course' && !_this.iscourseTaxonomyPage) || (contentType === 'document' && !_this.isdocumentTaxonomyPage)) {\n var searchParams = {};\n\n if (taxonomyFilter.name === 'Course Taxonomy' || taxonomyFilter.name === 'Document Taxonomy') {\n searchParams.taxonomyFilter = 'Active';\n } else {\n searchParams.taxonomyFilter = taxonomyFilter.name;\n }\n\n searchParams.contentType = contentType;\n\n var taxonomyLocation = 'management/viewcustomcontent/';\n searchParams = $httpParamSerializer(searchParams);\n\n $location.path(taxonomyLocation).search(searchParams);\n }\n\n if (taxonomyFilter.name === 'Inactive') {\n // Show all inactive course taxonomy\n $scope.courseTaxonomyList.data = _.filter($scope.courseAndDocumentTaxonomy, function (courseTaxonomy) {\n return (courseTaxonomy.isActive === false && courseTaxonomy.categoryType.toLowerCase() === contentType);\n });\n }\n\n if (taxonomyFilter.name === 'Active' || taxonomyFilter.name === \"Course Taxonomy\" || taxonomyFilter.name === \"Document Taxonomy\") {\n // Show all inactive course taxonomy\n $scope.courseTaxonomyList.data = _.filter($scope.courseAndDocumentTaxonomy, function (courseTaxonomy) {\n return (courseTaxonomy.isActive === true && courseTaxonomy.categoryType.toLowerCase() === contentType);\n });\n }\n };\n\n\n $scope.viewcustomcontentAction = function () {\n $scope.courseTaxonomyList.error.reset();\n $scope.propertyName = 'categoryname';\n\n $scope.homeTemplate = 'app/templates/management/viewcustomcontent/admin.html';\n\n $scope.courseTaxonomyListIsLoading = true;\n /* select the node based on the filter and type */\n var filterContentType = $route.current.params.contentType;\n var filterSel = $route.current.params.taxonomyFilter.toLowerCase() === 'active' ? 0 : 1;\n if (filterContentType === 'course') {\n $scope.courseTaxonomySelected = $scope.courseTaxonomyList.treeData[0];\n //Determine if there is any filter selected, if so, expand courses and select the node\n if (typeof ($route.current.params.taxonomyFilter) !== 'undefined') {\n $scope.courseTaxonomySelected = $scope.courseTaxonomyList.treeData[0].nodes[filterSel];\n $scope.courseTaxonomyExpanded = [$scope.courseTaxonomyList.treeData[0]];\n }\n } else {\n $scope.docTaxonomySelected = $scope.documentTaxonomyList.treeData[0];\n //Determine if there is any filter selected, if so, expand documents and select the node\n if (typeof ($route.current.params.taxonomyFilter) !== 'undefined') {\n $scope.docTaxonomySelected = $scope.documentTaxonomyList.treeData[0].nodes[filterSel];\n $scope.docTaxonomyExpanded = [$scope.documentTaxonomyList.treeData[0]];\n }\n }\n\n\n var taxonGet = CategoriesService.fetch(null, false, true);\n taxonGet.then(function (success) {\n var filterContentType = $route.current.params.contentType;\n success = CategoriesService.RemoveDocumentPolicies(success);\n if (filterContentType === 'course') { \n _this.iscourseTaxonomyPage = true; \n } else { _this.isdocumentTaxonomyPage = true;}\n $scope.courseAndDocumentTaxonomy = success;\n var courseTaxonomy = $filter('filter')(success, { categoryType: filterContentType });\n $scope.courseTaxonomyList.data = courseTaxonomy;\n _this.courseTaxonomyData = courseTaxonomy;\n if ($route.current.params.taxonomyFilter) {\n\n var filter = $route.current.params.taxonomyFilter;\n var type = $route.current.params.contentType;\n $scope.filterTaxonomy({ 'name': filter }, type);\n }\n\n $scope.courseTaxonomyListIsLoading = false;\n\n }, function (failure) {\n $scope.courseTaxonomyListIsLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.courseTaxonomyList.error.setError(errorCode, message);\n });\n\n };\n\n\n // create and edit subcategory\n $scope.subcategoryForm = {};\n $scope.subcategory = {};\n $scope.subcategory.imageID = 8;//Default image to 8 for new subcategories\n $scope.categoryList = {};\n $scope.createCategory = false;\n $scope.categoryError = errorDisplayerUtil.create();\n $scope.subcatDeactivate = [];//for the deactivate popover\n $scope.createcategoryAction = function () {\n $scope.homeTemplate = \"app/templates/management/createCategory/admin.html\";\n $scope.createCategory = true;\n $scope.categoryType = ['Course', 'Document'];\n getCategories(false);\n\n };\n\n $scope.CreateCategoryValues = function () {\n $scope.disableCategoryDropDown = false;\n var type = $scope.subcategory.categoryType;\n if (type !== undefined && type.toLowerCase() === 'course') {\n $scope.uniqueCategories = $filter('filter')($scope.allUniqueCategories, { categoryType: \"course\" });\n } else if (type !== undefined && type.toLowerCase() === 'document') {\n $scope.uniqueCategories = $filter('filter')($scope.allUniqueCategories, { categoryType: \"document\" });\n } else {\n $scope.disableCategoryDropDown = true;\n $scope.subcategory.category = undefined;\n }\n };\n\n \n /* Edit a subcategory */\n $scope.editcategoryAction = function () {\n $scope.homeTemplate = \"app/templates/management/editCategory/admin.html\";\n getCategories(true); \n\n };\n\n $scope.showOnlyDocumentTaxonomy = function () {\n $scope.uniqueCategories = $filter('filter')($scope.allUniqueCategories, { categoryType: \"document\" });\n $scope.hideCategoryTypeDropdown = true;\n $scope.disableCategoryDropDown = false;\n $scope.subcategory.categoryType = 'document';\n };\n\n /* handles retrieving catalog data and formatting scoped variables */\n /* used on both the create new subcategory and edit subcategory */\n var getCategories = function (editCategory) {\n \n $scope.createCategoryLoading = true;\n $scope.disableCategoryTypeDropdown = false;\n $scope.hideCategoryTypeDropdown = window.customDocumentsEnabled ? false : true;\n\n var taxonGet = CategoriesService.fetch(null, false, true);\n taxonGet.then(function (success) {\n $scope.createCategoryLoading = false;\n success = CategoriesService.RemoveDocumentPolicies(success);\n $scope.categoryList = angular.copy(success);\n $scope.disableCategoryDropDown = window.customDocumentsEnabled ? true : false; \n \n //unique categories for the category dropdown\n $scope.uniqueCategories = [];\n $scope.allUniqueCategories = []; \n success.forEach(function (item) {\n var catInd = _.filter($scope.allUniqueCategories, { \"categoryID\": item.categoryID }); \n if (catInd.length < 1) {\n var cat = { 'categoryName': item.categoryname, 'categoryID': item.categoryID, 'categoryNodeID': item.categoryNodeID, 'categoryType': item.categoryType };\n $scope.allUniqueCategories.push(cat); \n }\n });\n\n if (!window.customDocumentsEnabled) {\n $scope.uniqueCategories = $filter('filter')($scope.allUniqueCategories, { categoryType: \"course\" });\n $scope.subcategory.categoryType = 'course';\n }\n\n /* putting this down here as well because of race conditions */\n if ($scope.showCustomContent !== undefined && !$scope.showCustomContent) {\n $scope.showOnlyDocumentTaxonomy();\n }\n\n /* some extra steps when editing the subcategory */\n if (editCategory) {\n $scope.disableCategoryDropDown = false;\n $scope.disableCategoryTypeDropdown = true;\n $scope.uniqueCategories = $scope.allUniqueCategories; \n\n /* get the current subcategory from the categoryList that is being edited */\n var params = $route.current.params.param.split('/');\n var categoryID = params[0];\n var idxCat = _.findIndex($scope.categoryList, { 'subcategoryID': parseInt(categoryID) });\n \n $scope.subcategory = $scope.categoryList[idxCat];\n $scope.subcategory.category = { 'categoryName': $scope.subcategory.categoryname, 'categoryID': $scope.subcategory.categoryID, 'categoryNodeID': $scope.subcategory.categoryNodeID };\n //Creating a variable to use in the heading - otherwise changes to the Name will appear in the header - Thats messy\n $scope.nameInHeading = angular.copy($scope.subcategory.subcategoryName);\n //populate the category type drop down\n $scope.categoryType = $scope.subcategory.categoryType.toLowerCase() === 'course' ? ['Course'] : ['Document'];\n\n var subCatType = $filter('filter')($scope.categoryList, { subcategoryID: $scope.subcategory.subcategoryID });\n if (subCatType.length > 0) {\n var type = subCatType[0].categoryType;\n if (type !== undefined && type.toLowerCase() === 'course') {\n $scope.uniqueCategories = $filter('filter')($scope.allUniqueCategories, { categoryType: \"course\" });\n } else {\n $scope.uniqueCategories = $filter('filter')($scope.allUniqueCategories, { categoryType: \"document\" });\n }\n } \n\n //Remove the editing subcategory from the categoryList for the unique name validation\n $scope.categoryList.splice(idxCat, 1);\n\n //Default to 8 if they haven't picked an image\n $scope.selectedImage = $scope.subcategory.imageName !== null ? $scope.subcategory.imageName : 'grab_bag/8';\n $scope.current = $scope.subcategory.imageName !== null ? $scope.subcategory.imageName : \"grab_bag/8\";\n }\n\n }, function (failure) {\n $scope.createCategoryLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.categoryError.setError(errorCode, message);\n });\n\n };\n\n /* create new category or save existing category */\n $scope.saveCategory = function (deactivate) {\n\n //set up end date and isActive properties depening on deactivate flag\n if (typeof deactivate !== 'undefined' && deactivate === true) {\n $scope.subcategory.endDate = new Date();\n $scope.subcategory.isActive = false;\n } else if (typeof deactivate !== 'undefined' && deactivate === false) {\n $scope.subcategory.endDate = null;\n $scope.subcategory.isActive = true;\n }\n \n $scope.categoryError.reset();\n $scope.createCategoryLoading = true;\n var categoryCall = $scope.createCategory ? CategoriesService.createCategory($scope.subcategory) : CategoriesService.editCategory($scope.subcategory);\n //var createCatCall = CategoriesService.createCategory($scope.subcategory);\n\n categoryCall.then(function (success) {\n $scope.createCategoryLoading = false;\n\n //Call BAI Catalog to refresh the service stored Catalog Data\n CatalogService.getBaiCatalogData(true);\n //successful - redirect to Course Taxonomy view page\n $location.url('management/viewcustomcontent/?taxonomyFilter=Active&contentType=' + $scope.subcategory.categoryType.toLowerCase());\n },\n function (failure) {\n $scope.createCategoryLoading = false;\n $scope.subcatDeactivate.Popover = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.categoryError.setError(errorCode, message);\n //if the error message is the active courses message - undo the deactive subcategory settings\n if (failure.ErrorMessage.indexOf(\"Active courses\") >= 0 && deactivate) {\n $scope.subcategory.endDate = null;\n $scope.subcategory.isActive = true;\n }\n\n });\n \n\n };\n\n /* START - Image selection modal */\n\n $scope.tileImageSelectModalTitle = \"Subcategory Tile Images\";\n $scope.selectedImage = \"grab_bag/8\"; //used to add selected class to image in modal\n $scope.current = \"grab_bag/8\";// Change later to get the image of the node - default is 8 for creation\n\n /* Open tile image selection modal */\n $scope.imageSelect = function () {\n angular.element(document.querySelector('#imageSelectionModal')).modal();\n $scope.fetchImageList();\n };\n\n $scope.fetchImageList = function () {\n $scope.shownImages = [];\n $scope.shownImages.push($scope.current);\n\n //Add default image\n if ($scope.current !== \"grab_bag/8\" && $scope.current !== '8') {\n $scope.shownImages.push('grab_bag/8');\n }\n //Add the rest of the grab_bag images\n for (i = 21; i < 71; i++) {\n temp = \"grab_bag/\" + i.toString();\n if ($scope.current !== temp) $scope.shownImages.push(temp);\n }\n };\n\n $scope.select = function ($event, selectedstring) {\n $scope.selectedImage = selectedstring;\n $scope.current = selectedstring;\n };\n\n $scope.finalizeSelection = function () {\n $scope.subcategory.imageName = $scope.selectedImage;\n angular.element(document.querySelector('#imageSelectionModal')).modal('hide');\n };\n\n $scope.closeImageSelectionModal = function () {\n angular.element(document.querySelector('#imageSelectionModal')).modal('hide');\n };\n\n /* END - Image selection modal */\n\n\n /**\n *\n * Course Taxonomy - END\n *\n **/\n\n \n };\n }\n]);\n","app.factory('Messages_AdminOverride', ['$http', '$injector', '$rootScope', '$route', 'AssignmentsService', 'BreadcrumbsService', 'MessagesService', 'TasksService', 'TeamService', 'UsersService', 'errorDisplayerUtil',\n function ($http, $injector, $rootScope, $route, AssignmentsService, BreadcrumbsService, MessagesService, TasksService, TeamService, UsersService, errorDisplayerUtil) {\n return function($scope) {\n var _this = this;\n\n $scope.defaultHeader = false; // This Sets the page to full width of the screen.\n $scope.hideCatalogSearch = false;\n\n $scope.messaging.tasks = {};\n $scope.messaging.tasks.isLoading = false;\n $scope.messaging.tasks.error = errorDisplayerUtil.create();\n\n $scope.messaging.assignments = {};\n $scope.messaging.assignments.isLoading = false;\n $scope.messaging.assignments.error = errorDisplayerUtil.create();\n\n /**\n * Action to display all approval requests a TA has to deal with\n *\n * @void\n */\n $scope.requestsAction = function() {\n $scope.homeTemplate = 'app/templates/messages/requests/admin.html';\n\n $scope.messaging.assignments.isLoading = true;\n $scope.messaging.assignments.error.reset();\n\n $scope.messaging.tasks.isLoading = true;\n $scope.messaging.tasks.error.reset();\n\n _this.getAssignmentsToApprove();\n _this.getTasksToApprove();\n\n BreadcrumbsService.reset();\n BreadcrumbsService.createHomeBreadcrumb(UsersService.homeRole);\n BreadcrumbsService.pushCrumb('messages', 'student/messages/inbox/');\n BreadcrumbsService.pushCrumb('requests', 'student/messages/requests/');\n };\n\n /**\n * Action to get all enrollments, and display them for TA management.\n *\n * @void\n */\n $scope.enrollmentsAction = function() {\n $scope.homeTemplate = 'app/templates/messages/enrollments/admin.html';\n\n $scope.messaging.assignments.error.reset();\n $scope.messaging.assignments.isLoading = true;\n\n _this.getAssignmentsToApprove();\n\n BreadcrumbsService.reset();\n BreadcrumbsService.createHomeBreadcrumb(UsersService.homeRole);\n BreadcrumbsService.pushCrumb('messages', 'student/messages/inbox/');\n BreadcrumbsService.pushCrumb('requests', 'student/messages/requests/');\n BreadcrumbsService.pushCrumb('approvals', 'student/messages/approvals/');\n };\n\n /**\n * Action to get all tasks, and display them for TA management.\n *\n * @void\n */\n $scope.tasksAction = function() {\n $scope.homeTemplate = 'app/templates/messages/tasks/admin.html';\n\n $scope.messaging.error.reset();\n $scope.messaging.isLoading = true;\n\n _this.getTasksToApprove();\n\n BreadcrumbsService.reset();\n BreadcrumbsService.createHomeBreadcrumb(UsersService.homeRole);\n BreadcrumbsService.pushCrumb('messages', 'student/messages/inbox/');\n BreadcrumbsService.pushCrumb('requests', 'student/messages/requests/');\n BreadcrumbsService.pushCrumb('tasks', 'student/messages/tasks/');\n };\n\n /**\n * Trigger the call to the API to either approve or deny the request\n *\n * @param assignment {object} Contains the event target, which contains all assignment info to send to the API\n * @param status {boolean} Whether to approve or deny the approval request\n *\n * @void\n */\n $scope.approveOrDenyRequestCall = function(assignment, status) {\n assignment.error.reset();\n assignment.isLoading = true;\n\n var assignmentCall = AssignmentsService.approveDenyEnrollment(assignment.studentId, assignment.offeringId, assignment.transcriptId, assignment.assignmentType, status);\n assignmentCall.then(function(success) {\n assignment.isLoading = false;\n\n var index = $scope.assignments.indexOf(assignment);\n\n $scope.assignments.splice(index, 1);\n if($scope.assignments.length === 0) {\n $scope.messaging.error.assignments.setError(404, 'There no requests at this time!');\n }\n\n $rootScope.$broadcast('requestApprovals:action:success');\n }, function(failure) {\n assignment.isLoading = false;\n\n assignment.error.setError(failure.ErrorCode, failure.ErrorMessage);\n });\n };\n\n $scope.approveOrDenyTaskCall = function(task, status) {\n var taskResponse = TasksService.taskApproval(task.userId, task.id, status);\n taskResponse.then(function() {\n task.isLoading = false;\n\n var index = $scope.tasks.indexOf(task);\n\n $scope.tasks.splice(index, 1);\n if($scope.tasks.length === 0) {\n $scope.messaging.tasks.error.setError(404, 'There no requests at this time!');\n }\n\n $rootScope.$broadcast('requestApprovals:action:success');\n }, function(failure) {\n task.isLoading = false;\n\n task.error.setError(failure.ErrorCode, failure.ErrorMessage);\n });\n };\n\n /**\n * Generic method to get list of approval requests to be used within the actions\n *\n * @return {obj} returns promise for the list of assignments\n */\n _this.getAssignmentsToApprove = function() {\n $scope.assignments = [];\n\n /**\n * Get all the approval requests\n */\n var assignments = TeamService.getListOfAssignmentsToApprove();\n return assignments.then(function(success) {\n $scope.messaging.assignments.isLoading = false;\n\n $scope.assignments = success;\n }, function(failure) {\n $scope.messaging.assignments.isLoading = false;\n\n $scope.messaging.assignments.error.setError(failure.ErrorCode, failure.ErrorMessage);\n });\n };\n\n /**\n * Generic method to get list of tasks to be used within the actions\n *\n * @return {object} returns promise for the list of tasks\n */\n _this.getTasksToApprove = function() {\n $scope.tasks = [];\n\n $scope.messaging.tasks.isLoading = true;\n \n //Check if user is an Admin and the current role is not admin, \n //give them the admin cookie so that the API call can be made\n if (UsersService.hasRole(\"ta\") && !UsersService.isAdmin()) {\n UsersService.setUserContext(\"ta\");\n }\n\n /**\n * Get all the task approvals\n */\n var tasks = TasksService.getTasksApprovalTA();\n tasks.then(function (success) {\n $scope.messaging.tasks.isLoading = false;\n\n $scope.tasks = success;\n\n }, function (failure) {\n $scope.messaging.tasks.isLoading = false;\n\n $scope.messaging.tasks.error.setError(failure.ErrorCode, failure.ErrorMessage);\n });\n };\n };\n }\n]);\n","app.controller('Offerings_AdminController', ['$scope', '$uibModalInstance', 'offeringId', '$mdDialog', '$uibModal', 'dateUtil', 'errorDisplayerUtil', 'OfferingsService', 'RosterService', 'UsersService',\n function ($scope, $uibModalInstance, offeringId, $mdDialog, $uibModal, dateUtil, errorDisplayerUtil, OfferingsService, RosterService, UsersService) {\n\n var _this = this;\n\n $scope.offeringId = offeringId;\n \n var offeringType = 'ilt';\n\n _this.totalCompleteCalls = 0;\n _this.groupSaveTotal = 0;\n _this.totalSavedFromGroupCall = 0;\n \n $scope.allHours = 0;\n\n $scope.isLoading = false;\n $scope.offeringDate = new Date();\n\n /**\n * Set loading, error, etc. options onto the generic API action.\n *\n * @type {{}}\n */\n $scope.userSearchOptions = {};\n\n $scope.userSearchOptions.error = errorDisplayerUtil.create();\n $scope.userSearchOptions.searched = false;\n $scope.userSearchOptions.selected = 0;\n\n $scope.rosterStatus = 'default';\n $scope.selectedSession = 1;\n $scope.sessions = null;\n $scope.sessionOrder = 'lowestSessionDateForOffering.startDate';\n $scope.statuses = $scope.completionStatuses;\n\n\n $scope.options = {};\n $scope.options.isLoading = false;\n $scope.options.error = errorDisplayerUtil.create();\n\n $scope.rosterViewOptions = {};\n $scope.rosterViewOptions.isLoading = false;\n $scope.rosterViewOptions.error = errorDisplayerUtil.create();\n\n $scope.waitlistViewOptions = {};\n $scope.waitlistViewOptions.isLoading = false;\n $scope.waitlistViewOptions.error = errorDisplayerUtil.create();\n\n $scope.pendingOptions = {};\n $scope.pendingOptions.isLoading = false;\n $scope.pendingOptions.error = errorDisplayerUtil.create();\n\n $scope.dialogOptions = {};\n $scope.dialogOptions.isLoading = false;\n $scope.dialogOptions.error = errorDisplayerUtil.create();\n\n $scope.hasDecimal = false;\n\n $scope.rosterStatus = 'Change Status';\n\n $scope.completionStatuses = [\n 'Change Status',\n 'Successful',\n 'Unsuccessful',\n 'No Show'\n ];\n\n $scope.userCompletionStatuses = [{\n name: 'Change Status',\n value: 'default'\n }, {\n name: 'Successful',\n value: 'successful'\n }, {\n name: 'Unsuccessful',\n value: 'unsuccessful'\n }, {\n name: 'No Show',\n value: 'cancelledNoShow'\n }];\n\n $scope.substitutor = {};\n $scope.substitutor.error = errorDisplayerUtil.create();\n\n /**\n * \"Private\" methods; don't want these ever called directly from scope.\n */\n /**\n *\n * @param user\n */\n _this.updateStudentInBatch = function (user, status, data, successCallback, errorCallback, finalSuccessCallback, finalErrorCallback) {\n user.call = RosterService.updateSinglePersonOnRoster(user.id, offeringId, status, offeringType, data);\n\n user.call.then(function (success) {\n successCallback(success, user);\n\n _this.totalCompleteCalls++;\n _this.totalSavedFromGroupCall++;\n\n _this.groupSaveCounter(finalSuccessCallback, finalErrorCallback, user);\n }, function (error) {\n errorCallback(error, user);\n\n _this.totalCompleteCalls++;\n\n _this.groupSaveCounter(finalSuccessCallback, finalErrorCallback, user);\n });\n };\n\n /**\n * Generic function to keep track of any and all batch edits/creates.\n *\n * Once all have succeeded, the callback will trigger.\n *\n * @param callback\n */\n _this.groupSaveCounter = function (successCallback, errorCallback, user) {\n if (_this.totalSavedFromGroupCall === _this.groupSaveTotal) {\n successCallback(user);\n } else if (_this.totalCompleteCalls === _this.groupSaveTotal && _this.totalSavedFromGroupCall !== _this.groupSaveTotal) {\n errorCallback(user);\n }\n };\n\n /**\n * Scope methods\n */\n /**\n * Action that is called when the URI matches /offerings/view//, and the tab is Info\n *\n * Method will go get single offering information for display.\n */\n $scope.viewAction = function () {\n $scope.options.isLoading = true;\n\n $scope.options.error.reset();\n\n var offering = OfferingsService.fetchSingle(offeringId, offeringType);\n offering.then(function (success) {\n $scope.userEmailList = RosterService.generateMailToFromUsers('attendingStudents').join(';');\n\n $scope.options.isLoading = false;\n\n $scope.offering = success;\n $scope.offeringComplete = true;\n\n var offeringStatus = success.status;\n if (offeringStatus === \"open\") {\n $scope.offeringComplete = false;\n }\n\n $scope.offeringDate = new Date($scope.offering.lowestSessionDateForOffering.original);\n\n $scope.selectedSession = OfferingsService.getLowestSessionIdByDate();\n $scope.sessions = $scope.offering.sessions;\n\n // If no students have been set to any completed status, this will be true.\n $scope.isCancellable = OfferingsService.isOfferingCancellable();\n\n }, function (failure) {\n $scope.options.isLoading = false;\n\n $scope.options.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n\n jQuery('.instructor-extra-nav').hide();\n };\n\n /**\n * Action that is called when the URI matches /offerings/view//, and the tab is Roster\n */\n $scope.rosterAction = function () {\n $scope.rosterViewOptions.error.reset();\n\n $scope.rosterViewOptions.isLoading = true;\n\n var roster = RosterService.fetch(offeringId, offeringType);\n roster.then(function (success) {\n $scope.rosterViewOptions.isLoading = false;\n\n $scope.roster = RosterService.getAttendingStudents();\n\n $scope.selectedSession = OfferingsService.getLowestSessionIdByDate();\n $scope.sessions = $scope.offering.sessions;\n $scope.sessionsForDropdown = [];\n\n /**\n * Extraneous code because handling dropdowns in angular has to be overcomplicated to be cool.\n */\n var curIndex = 0;\n for (var i = 0; i < $scope.sessions; i++) {\n curIndex = parseInt(i, 10) + 1;\n\n $scope.sessionsForDropdown.push({\n name: 'Session ' + curIndex + ' - ' + $scope.sessions[i].startDateTime.fullDateWithTime,\n value: $scope.sessions[i].id\n });\n }\n }, function (failure) {\n $scope.rosterViewOptions.isLoading = false;\n\n $scope.rosterViewOptions.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n\n jQuery('.instructor-extra-nav').show();\n };\n\n /**\n * Action that is called when the URI matches /offerings/view//, and the tab is Waitlist\n */\n $scope.waitlistAction = function () {\n $scope.waitlistroster = null;\n\n $scope.options.error.reset();\n $scope.waitlistViewOptions.error.reset();\n\n $scope.waitlistViewOptions.isLoading = true;\n\n var roster = RosterService.fetch(offeringId, offeringType); //adding offeringType gives success, avoids error 8/9/16 D.Orr\n\n roster.then(function (success) {\n $scope.waitlistroster = RosterService.getWaitlistedStudents();\n\n if ($scope.waitlistroster === null || $scope.waitlistroster.length === 0) {\n $scope.waitlistViewOptions.error.setError(404, 'The wait list for this course is currently empty.', true);\n }\n\n $scope.waitlistViewOptions.isLoading = false;\n }, function (failure) {\n $scope.waitlistViewOptions.isLoading = false;\n\n $scope.waitlistViewOptions.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n\n jQuery('.instructor-extra-nav').show();\n };\n\n /**\n * Action that is called when the URI matches /offerings/view//, and the tab is Waitlist\n */\n $scope.pendingApprovalAction = function () {\n $scope.pendingOptions.error.reset();\n\n $scope.pendingOptions.isLoading = true;\n\n var roster = RosterService.fetch(offeringId, offeringType);\n roster.then(function (success) {\n $scope.pendingOptions.isLoading = false;\n\n $scope.roster = RosterService.getPendingApprovalStudents();\n\n if ($scope.roster.length === 0) {\n $scope.pendingOptions.error.setError(404, 'There are no students pending approval for this course.', true);\n }\n }, function (failure) {\n $scope.pendingOptions.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n\n jQuery('.instructor-extra-nav').show();\n };\n\n /**\n * Show the dialog that allows the user to confirm the offering cancellation\n *\n * @param event Object that triggered the event\n * @param offering The offering that is going to be cancelled\n */\n $scope.showCancelOfferingModal = function (event, offering) {\n $scope.offering = offering;\n $scope.dialogOptions.error.reset();\n $mdDialog.show({\n controller: 'offeringsController',\n focusOnOpen: true,\n targetEvent: event,\n preserveScope: true,\n scope: $scope,\n templateUrl: 'app/templates/offerings/components/dialogs/cancellationDialog.html',\n clickOutsideToClose: true,\n parent: angular.element('.rosterModal')\n }).then(function (answer) {\n\n }, function () {\n\n });\n };\n\n /**\n * Cancels an offering if the user has chosen to do so. This will run logic to make AJAX request to the offering\n * cancellation call. If answer === false, modal will close.\n *\n * @param answer Boolean passed from buttons, based on angular.material pattern\n */\n $scope.cancelOffering = function (answer) {\n if (answer === true) {\n $scope.dialogOptions.error.reset();\n\n $scope.dialogOptions.isLoading = true;\n\n var cancel = OfferingsService.cancelOffering($scope.offering.id, $scope.offering.type);\n cancel.then(function (success) {\n $scope.dialogOptions.isLoading = false;\n\n //$location.url('users/home/');\n _this.closeModal();\n }, function (failure) {\n $scope.dialogOptions.isLoading = false;\n\n $scope.dialogOptions.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n } else {\n $mdDialog.hide();\n }\n };\n\n /**\n * Offering cancellation logic\n */\n /**\n * Opens offering modal. This method runs a method to gather information regarding users in the roster. If there\n * are users which are not completed, or if there are no assigned users, appropriate messaging will be shown.\n *\n * @param $event event containing target that was clicked\n * @param offering current offering data\n */\n $scope.showCompleteOfferingModal = function ($event, offering) {\n $scope.offering = offering;\n $scope.dialogOptions.error.reset();\n /**\n * Get count of incomplete users;\n * if there are -1 users, there are no users signed up yet;\n * if there are 0 users, then we are good to go;\n * if there are > 0 users, there are users who have not completed the offering.\n */\n var total = OfferingsService.getIncompleteUserCount();\n\n total = 0;\n switch (total) {\n case -1:\n $scope.offeringDeliveryErrorMessage = 'Sorry! There are no students who have been signed up for this offering!';\n $scope.showOfferingDeliveryErrorMessage = true;\n\n setTimeout(function () {\n $scope.offeringDeliveryErrorMessage = '';\n $scope.showOfferingDeliveryErrorMessage = false;\n }, 5000);\n\n break;\n case 0:\n $mdDialog.show({\n clickOutsideToClose: true,\n focusOnOpen: true,\n parent: angular.element('.rosterModal'),\n preserveScope: true,\n scope: $scope,\n templateUrl: 'app/templates/offerings/components/dialogs/completionDialog.html'\n }).then(function (answer) {\n\n }, function () {\n\n });\n\n break;\n default:\n $scope.offeringDeliveryErrorMessage = 'Sorry! There are still students who have not completed the offering!';\n $scope.showOfferingDeliveryErrorMessage = true;\n\n setTimeout(function () {\n $scope.offeringDeliveryErrorMessage = '';\n $scope.showOfferingDeliveryErrorMessage = false;\n }, 5000);\n\n break;\n }\n };\n\n /**\n * Show the dialog that allows the user to confirm the offering cancellation\n *dialogOptions\n * @param event Object that triggered the event\n * @param offering The offering that is going to be cancelled\n */\n $scope.showDropUserModal = function (event, person) {\n $scope.droppedPerson = person;\n\n $mdDialog.show({\n clickOutsideToClose: true,\n focusOnOpen: true,\n parent: angular.element('.rosterModal'),\n targetEvent: event,\n preserveScope: true,\n scope: $scope,\n templateUrl: 'app/templates/offerings/components/dialogs/dropPersonDialog.html'\n }).then(function (answer) {\n\n }, function () {\n\n });\n };\n\n $scope.dropStudent = function (answer) {\n $mdDialog.hide();\n\n if (answer === true) {\n $scope.droppedPerson.droppingStudent = true;\n\n $scope.droppedPerson.error.reset();\n\n $scope.droppedPerson.call = RosterService.updateSinglePersonOnRoster($scope.droppedPerson.student.id, offeringId, 'cancelled', offeringType);\n\n $scope.droppedPerson.call.then(function (success) {\n $scope.rosterAction();\n $scope.viewAction();\n $mdDialog.hide();\n }, function (failure) {\n $scope.droppedPerson.droppingStudent = false;\n\n $scope.droppedPerson.error.setError(failure.StatusCode, failure.ErrorMessage);\n setTimeout(function () { droppedPerson.error.reset(); }, 2000);\n });\n }\n };\n\n /**\n * Completes an offering if the user has chosen to do so. This will run logic to make AJAX request to the offering\n * completion call. If answer === false, modal will close.\n *\n * @param answer Boolean passed from buttons, based on angular.material pattern\n */\n $scope.completeOffering = function (answer) {\n if (answer === true) {\n $scope.completingOffering = true;\n $scope.dialogOptions.isLoading = true;\n var completion = OfferingsService.completeOffering($scope.offering.id, $scope.offering.type);\n completion.then(function (success) {\n $scope.dialogOptions.isLoading = false;\n $mdDialog.hide();\n $scope.viewAction();\n }, function (failure) {\n $scope.dialogOptions.isLoading = false;\n\n $scope.dialogOptions.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n } else {\n $mdDialog.hide();\n }\n };\n\n $scope.changeAllStatuses = function(toStatus) {\n var roster = $scope.roster;\n var status = toStatus;\n\n var member = _.findWhere($scope.userCompletionStatuses, { name: status });\n\n /**\n * Skip going forward if there is no value; defaults don't have values.\n */\n if (typeof member === 'undefined' || typeof member.value === 'undefined') {\n return;\n }\n\n _.each(roster, function(r) {\n r.statusForDropdown = member.value;\n });\n \n };\n\n /**\n * Attach the grade to all students.\n */\n $scope.setAllGrades = function () {\n var allGrade = this.allGrades;\n\n if ((allGrade !== null || allGrade !== 'undefined') && (allGrade >= 0 && allGrade <= 100)) {\n for (var i in $scope.roster) {\n $scope.roster[i].student.score = allGrade;\n $scope.gradeRangeError = false;\n }\n } else {\n $scope.gradeRangeError = true;\n }\n };\n\n /**\n * Attach the time spent to all students on a single session.\n */\n $scope.setHoursSpent = function () {\n var allHours = this.allHours;\n\n for (var i in $scope.roster) {\n for (var session in $scope.roster[i].sessions) {\n sessions = $scope.roster[i].sessions;\n\n if (sessions[session].id === $scope.selectedSession) {\n sessions[session].hoursSpent = allHours;\n }\n }\n }\n };\n\n /**\n * Update a single person for the full offering.\n *\n * @param person Person to be updated.\n */\n $scope.savePersonForFullOffering = function (person) {\n person.isLoading = true;\n\n person.error.reset();\n\n /**\n * Uses person.statusForDropdown instead of person.student.registrationStatus due to limitations in\n * angular.\n */\n var personUpdate = RosterService.updateSinglePersonOnRoster(person.student.id, offeringId, person.statusForDropdown, offeringType, {\n completionDate: $scope.offering.highestSessionDateForOffering.moment.utc().format(),\n score: parseInt(person.student.score, 10)\n });\n\n personUpdate.then(function (success) {\n person.isLoading = false;\n\n person.hasCompletedTheOffering = true;\n }, function (failure) {\n person.isLoading = false;\n\n person.error.setError(failure.StatusCode, failure.ErrorMessage);\n setTimeout(function () { person.error.reset(); }, 2000);\n });\n };\n\n /**\n * Update the session to properly track next session to update\n */\n $scope.changeSession = function () {\n $scope.selectedSession = this.selectedSession;\n };\n\n /**\n * Save a single person's session\n *\n * @param person Next user to save session\n */\n $scope.savePersonPerSession = function (person) {\n person.isLoading = true;\n\n person.error.reset();\n\n var correctSession = RosterService.getCorrectSessionFromUser(person.student.id, $scope.selectedSession);\n\n person.call = RosterService.updateSessionByUserOnOffering(person.student.id, offeringId, {\n sessionId: $scope.selectedSession,\n hoursSpent: parseFloat(correctSession.hoursSpent, 10)\n });\n\n person.call.then(function (success) {\n person.isLoading = false;\n }, function (failure) {\n person.isLoading = false;\n\n person.error.setError(failure.StatusCode, failure.ErrorMessage);\n setTimeout(function () { person.error.reset(); }, 2000);\n });\n };\n\n $scope.saveAllUsersForCurrentSession = function () {\n var roster = $scope.roster;\n\n for (var i in roster) {\n $scope.savePersonPerSession(roster[i]);\n }\n };\n\n $scope.saveAllForFullOffering = function () {\n var roster = $scope.roster;\n\n _this.groupSaveTotal = roster.length;\n _this.totalSavedFromGroupCall = 0;\n\n $scope.fullOfferingUpdateIsLoading = true;\n\n for (var i in roster) {\n if (roster[i].statusForDropdown === 'default') {\n continue;\n }\n\n roster[i].isLoading = true;\n\n roster[i].id = roster[i].student.id;\n\n _this.updateStudentInBatch(roster[i], roster[i].statusForDropdown, {\n completionDate: $scope.offering.highestSessionDateForOffering,\n score: parseInt(roster[i].student.score, 10)\n }, function (data, user) {\n //success callback\n user.isLoading = false;\n user.success = true;\n\n user.hasCompletedTheOffering = true;\n }, function (failure, user) {\n user.isLoading = false;\n\n user.error.setError(failure.StatusCode, failure.ErrorMessage);\n\n }, function (user) {\n // final success callback\n }, function () {\n // final error callback\n });\n }\n };\n\n $scope.openAdditionModal = function () {\n $scope.userSearchOptions.isLoading = false;\n $scope.userSearchOptions.searched = false;\n $scope.userSearchOptions.selected = 0;\n\n $scope.users = null;\n\n jQuery('#userAdditionModal').modal();\n };\n\n $scope.openSubstituteModal = function (person) {\n $scope.userSearchOptions.isLoading = false;\n $scope.userSearchOptions.searched = false;\n $scope.userSearchOptions.selected = 0;\n\n $scope.users = null;\n\n $scope.substitutee = person;\n\n $uibModal.open({\n templateUrl: 'app/templates/offerings/components/modals/userSubstitutionModal.html',\n scope: $scope,\n //size:'lg',\n windowClass: 'offeringModal',\n backdrop: 'static',\n controller: 'ModalInstanceCtrl'\n });\n\n };\n\n $scope.searchForUsers = function () {\n var userSearch = this.userSearchOptions.value;\n\n // Reset the error\n $scope.userSearchOptions.error.reset();\n\n $scope.userSearchOptions.addStudentLoader = false;\n $scope.userSearchOptions.isLoading = true;\n $scope.userSearchOptions.searched = true;\n\n var users = UsersService.search(userSearch);\n\n users.then(function (success) {\n $scope.userSearchOptions.isLoading = false;\n\n $scope.users = success;\n }, function (failure) {\n $scope.users = [];\n\n $scope.isLoading = false;\n\n $scope.userSearchOptions.isLoading = false;\n\n $scope.userSearchOptions.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n $scope.setCountOfSelectedUsers = function ($event) {\n var isChecked = jQuery($event.currentTarget).is(':checked');\n\n if (isChecked === true) {\n $scope.userSearchOptions.selected += 1;\n } else {\n $scope.userSearchOptions.selected -= 1;\n }\n };\n\n $scope.addStudents = function () {\n $scope.userSearchOptions.addStudentLoader = true;\n\n _this.groupSaveTotal = jQuery('.checkbox:checked').length;\n _this.totalSavedFromGroupCall = 0;\n\n var errorCallback = function (failure, user) {\n user.showEx = true;\n $scope.userSearchOptions.addStudentLoader = false;\n\n user.error.reset();\n\n user.error.setError(failure.StatusCode, failure.ErrorMessage);\n\n };\n\n var successCallback = function (data, user) {\n user.showCheck = true;\n user.showEx = false;\n };\n\n var finalSuccessCallback = function () {\n $scope.userSearchOptions.addStudentLoader = false;\n\n jQuery('#userAdditionModal').modal('hide');\n\n $scope.rosterAction();\n $scope.waitlistAction();\n };\n\n var finalErrorCallback = function () {\n $scope.userSearchOptions.addStudentLoader = false;\n };\n\n for (var i in $scope.users) {\n if (typeof $scope.users[i].checked !== 'undefined' && $scope.users[i].checked === true) {\n _this.updateStudentInBatch($scope.users[i], 'confirmed', null, successCallback, errorCallback, finalSuccessCallback, finalErrorCallback);\n }\n }\n };\n\n /* Function refreshs the page on close of modal*/\n $scope.closeModal = function () {\n //$scope.rosterAction();\n $uibModalInstance.close();\n };\n\n $scope.substituteStudent = function () {\n var userId = null;\n\n $scope.substitutee.error.reset();\n\n $scope.userSearchOptions.addStudentLoader = true;\n\n for (var i in $scope.users) {\n if (parseInt($scope.users[i].checked, 10) > 0) {\n userId = $scope.users[i].id;\n\n break;\n }\n }\n\n // oldUser, newUser, offeringId, type\n var substitution = RosterService.substituteUser($scope.substitutee.student.id, userId, offeringId, offeringType);\n substitution.then(function (success) {\n $scope.userSearchOptions.addStudentLoader = false;\n\n jQuery('#userSubstitutionModal').modal('hide');\n\n $scope.rosterAction();\n }, function (failure) {\n $scope.userSearchOptions.addStudentLoader = false;\n\n $scope.substitutee.error.setError(failure.StatusCode, failure.ErrorMessage);\n setTimeout(function () { substitutee.error.reset(); }, 2000);\n });\n };\n\n $scope.dump = function (value) { console.warn(value); };\n\n $scope.showWaitlistRemoveConfirmationModal = function (event, person) {\n $scope.person = person;\n var waitlistPersonToDelete = $scope.person.fullName;\n\n $mdDialog.show({\n controller: ['$scope', 'person', 'reallyRemoveFromWaitList', function ($scope, person, reallyRemoveFromWaitList) {\n $scope.person = person;\n $scope.reallyRemoveFromWaitList = reallyRemoveFromWaitList;\n }],\n focusOnOpen: false,\n targetEvent: event,\n\n templateUrl: 'app/templates/offerings/components/dialogs/removeWaitlistDialog.html',\n clickOutsideToClose: true,\n parent: angular.element('.rosterModal'),\n locals: {\n person: $scope.person,\n reallyRemoveFromWaitList: $scope.reallyRemoveFromWaitList\n }\n }).then(function (answer) {\n\n });\n };\n\n $scope.reallyRemoveFromWaitList = function (answer) {\n if (answer === true) {\n $scope.removingWaitListStudent = true;\n\n var somev = OfferingsService.removeStudentFromWaitList($scope.person, $scope.offeringId);\n somev.then(function (success) {\n $scope.waitlistAction(); \n $scope.viewAction();\n $scope.removingWaitListStudent = false;\n $mdDialog.hide();\n });\n\n } else {\n $mdDialog.hide();\n }\n };\n\n $scope.getCorrectLabelForStatusDropdown = function (status) {\n return $scope.userCompletionStatuses.filter(function (member) {\n if (member.value === status) {\n return member;\n }\n })[0].name;\n };\n\n $scope.highlightDates = function (date) {\n var curSession = null;\n\n date = moment(date);\n\n var curDate = date.date();\n var curMonth = date.month();\n var curYear = date.year();\n\n if (typeof $scope.sessions !== 'undefined' && $scope.sessions !== null && $scope.sessions.length > 0) {\n for (var i = 0; i < $scope.sessions.length; i++) {\n curSession = $scope.sessions[i];\n\n if (curDate === curSession.startDateTime.day && curMonth === (curSession.startDateTime.monthNumber - 1) && curYear === curSession.startDateTime.year) {\n return true;\n }\n }\n }\n \n\n return false;\n };\n \n }]);\n\n//Controller for modal\napp.controller('ModalInstanceCtrl', function ($scope, $uibModalInstance) {\n \n $scope.close = function () {\n $uibModalInstance.close();\n };\n\n $scope.cancel = function () {\n $uibModalInstance.dismiss('cancel');\n };\n});","app.factory('Offerings_InstructorOverride', ['$location', '$mdDialog', '$route', '$window', 'dateUtil', 'errorDisplayerUtil', 'BreadcrumbsService', 'OfferingsService', 'RosterService', 'UsersService', function($location, $mdDialog, $route, $window, dateUtil, errorDisplayerUtil, BreadcrumbsService, OfferingsService, RosterService, UsersService) {\n return function($scope) {\n var _this = this;\n\n var offeringId = $scope.offeringId = typeof $route.current.params.param !== 'undefined' ? $route.current.params.param.split('/')[0] : null;\n\n var offeringType = $location.search().type;\n\n _this.totalCompleteCalls = 0;\n _this.groupSaveTotal = 0;\n _this.totalSavedFromGroupCall = 0;\n\n BreadcrumbsService.pushCrumb(\"instructor desk\", 'users/home');\n\n $scope.allHours = 0;\n $scope.isSelectedTab = 0;\n\n $scope.options = {};\n $scope.options.isLoading = false;\n $scope.options.error = errorDisplayerUtil.create();\n\n $scope.rosterViewOptions = {};\n $scope.rosterViewOptions.isLoading = false;\n $scope.rosterViewOptions.error = errorDisplayerUtil.create();\n\n $scope.waitlistViewOptions = {};\n $scope.waitlistViewOptions.isLoading = false;\n $scope.waitlistViewOptions.error = errorDisplayerUtil.create();\n\n $scope.pendingOptions = {};\n $scope.pendingOptions.isLoading = false;\n $scope.pendingOptions.error = errorDisplayerUtil.create();\n\n $scope.dialogOptions = {};\n $scope.dialogOptions.isLoading = false;\n $scope.dialogOptions.error = errorDisplayerUtil.create();\n\n $scope.hasDecimal = false;\n\n $scope.rosterStatus = 'Change Status';\n\n $scope.completionStatuses = [\n 'Change Status',\n 'Successful',\n 'Unsuccessful',\n 'No Show'\n ];\n\n $scope.userCompletionStatuses = [{\n name: 'Change Status',\n value: 'default'\n }, {\n name: 'Successful',\n value: 'successful'\n }, {\n name: 'Unsuccessful',\n value: 'unsuccessful'\n }, {\n name: 'No Show',\n value: 'cancelledNoShow'\n }];\n\n $scope.substitutor = {};\n $scope.substitutor.error = errorDisplayerUtil.create();\n\n $scope.overMaxWaitlister = '';\n \n\n /**\n * \"Private\" methods; don't want these ever called directly from scope.\n */\n /**\n *\n * @param user\n */\n _this.updateStudentInBatch = function(user, status, data, successCallback, errorCallback, finalSuccessCallback, finalErrorCallback) {\n user.call = RosterService.updateSinglePersonOnRoster(user.id, offeringId, status, offeringType, data);\n\n user.call.then(function(success) {\n successCallback(success, user);\n\n _this.totalCompleteCalls++;\n _this.totalSavedFromGroupCall++;\n\n _this.groupSaveCounter(finalSuccessCallback, finalErrorCallback, user);\n }, function(error) {\n errorCallback(error, user);\n\n _this.totalCompleteCalls++;\n\n _this.groupSaveCounter(finalSuccessCallback, finalErrorCallback, user);\n });\n };\n\n /**\n * Generic function to keep track of any and all batch edits/creates.\n *\n * Once all have succeeded, the callback will trigger.\n *\n * @param callback\n */\n _this.groupSaveCounter = function(successCallback, errorCallback, user) {\n if(_this.totalSavedFromGroupCall === _this.groupSaveTotal) {\n successCallback(user);\n } else if(_this.totalCompleteCalls === _this.groupSaveTotal && _this.totalSavedFromGroupCall !== _this.groupSaveTotal) {\n errorCallback(user);\n }\n };\n\n /**\n * Scope methods\n */\n /**\n * Action that is called when the URI matches /offerings/view//, and the tab is Info\n *\n * Method will go get single offering information for display.\n */\n $scope.viewAction = function () {\n $scope.homeTemplate = \"app/templates/offerings/viewOffering.html\";\n $scope.options.isLoading = true;\n\n $scope.options.error.reset();\n\n BreadcrumbsService.reset();\n\n var offering = OfferingsService.fetchSingle(offeringId, offeringType);\n offering.then(function (success) {\n $scope.userEmailList = RosterService.generateMailToFromUsers('attendingStudents').join(';');\n\n $scope.options.isLoading = false;\n\n $scope.offering = success;\n $scope.offeringComplete = true;\n \n var offeringStatus = success.status;\n if (offeringStatus === \"open\") {\n $scope.offeringComplete = false;\n }\n\n $scope.offeringDate = new Date($scope.offering.lowestSessionDateForOffering.original);\n\n $scope.selectedSession = OfferingsService.getLowestSessionIdByDate();\n $scope.sessions = $scope.offering.sessions;\n\n // If no students have been set to any completed status, this will be true.\n $scope.isCancellable = OfferingsService.isOfferingCancellable();\n\n BreadcrumbsService.pushCrumb(\"instructor desk\", 'users/home');\n BreadcrumbsService.pushCrumb($scope.offering.name);\n }, function (failure) {\n $scope.options.isLoading = false;\n\n $scope.options.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n\n jQuery('.instructor-extra-nav').hide();\n };\n\n $scope.launchIRRReport = function () {\n var currentTimezone = moment.tz.guess();\n var reportLinkCall = UsersService.getManagerSabaReportUrlIRR(offeringId, currentTimezone);\n reportLinkCall.then(\n function (success) {\n var link = success;\n var popup = $window.open(\"about:blank\", \"_blank\");\n popup.location = link;\n },\n function (failure) {\n //silent fail\n }\n );\n };\n\n /**\n * Action that is called when the URI matches /offerings/view//, and the tab is Roster\n */\n $scope.rosterAction = function () {\n $scope.isSelectedTab = 1;\n $scope.rosterViewOptions.error.reset();\n\n $scope.rosterViewOptions.isLoading = true;\n\n var offeringType = $location.search().type;\n\n var roster = RosterService.fetch(offeringId, offeringType);\n roster.then(function (success) {\n $scope.rosterViewOptions.isLoading = false;\n\n $scope.roster = RosterService.getAttendingStudents();\n\n $scope.selectedSession = OfferingsService.getLowestSessionIdByDate();\n $scope.sessions = $scope.offering.sessions;\n $scope.sessionsForDropdown = [];\n\n /**\n * Extraneous code because handling dropdowns in angular has to be overcomplicated to be cool.\n */\n var curIndex = 0;\n for(var i = 0; i < $scope.sessions; i++) {\n curIndex = parseInt(i, 10) + 1;\n\n $scope.sessionsForDropdown.push({\n name: 'Session ' + curIndex + ' - ' + $scope.sessions[i].startDateTime.fullDateWithTime,\n value: $scope.sessions[i].id\n });\n }\n }, function (failure) {\n $scope.rosterViewOptions.isLoading = false;\n\n $scope.rosterViewOptions.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n\n jQuery('.instructor-extra-nav').show();\n };\n\n /**\n * Action that is called when the URI matches /offerings/view//, and the tab is Waitlist\n */\n $scope.waitlistAction = function () {\n $scope.isSelectedTab = 1;\n $scope.waitlistroster = null;\n\n $scope.options.error.reset();\n $scope.waitlistViewOptions.error.reset();\n\n $scope.waitlistViewOptions.isLoading = true;\n\n var roster = RosterService.fetch(offeringId, offeringType); //adding offeringType gives success, avoids error 8/9/16 D.Orr\n\n roster.then(function (success) {\n $scope.waitlistroster = RosterService.getWaitlistedStudents();\n\n if ($scope.waitlistroster === null || $scope.waitlistroster.length === 0) {\n $scope.waitlistViewOptions.error.setError(404, 'The wait list for this course is currently empty.', true);\n }\n\n $scope.waitlistViewOptions.isLoading = false;\n }, function (failure) {\n $scope.waitlistViewOptions.isLoading = false;\n\n $scope.waitlistViewOptions.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n\n jQuery('.instructor-extra-nav').show();\n };\n\n /**\n * Action that is called when the URI matches /offerings/view//, and the tab is Waitlist\n */\n $scope.pendingApprovalAction = function () {\n $scope.isSelectedTab = 1;\n $scope.pendingOptions.error.reset();\n\n $scope.pendingOptions.isLoading = true;\n\n var roster = RosterService.fetch(offeringId, offeringType);\n roster.then(function (success) {\n $scope.pendingOptions.isLoading = false;\n\n $scope.roster = RosterService.getPendingApprovalStudents();\n\n if($scope.roster.length === 0) {\n $scope.pendingOptions.error.setError(404, 'There are no students pending approval for this course.', true);\n }\n }, function (failure) {\n $scope.pendingOptions.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n\n jQuery('.instructor-extra-nav').show();\n };\n\n /**\n * Show the dialog that allows the user to confirm the offering cancellation\n *\n * @param event Object that triggered the event\n * @param offering The offering that is going to be cancelled\n */\n $scope.showCancelOfferingModal = function (event, offering) {\n $scope.offering = offering;\n\n $mdDialog.show({\n controller: 'offeringsController',\n focusOnOpen: false,\n targetEvent: event,\n templateUrl: 'app/templates/offerings/components/dialogs/cancellationDialog.html',\n clickOutsideToClose: true,\n parent: angular.element(document.body)\n }).then(function (answer) {\n\n }, function () {\n\n });\n };\n\n /**\n * Cancels an offering if the user has chosen to do so. This will run logic to make AJAX request to the offering\n * cancellation call. If answer === false, modal will close.\n *\n * @param answer Boolean passed from buttons, based on angular.material pattern\n */\n $scope.cancelOffering = function (answer) {\n if (answer === true) {\n $scope.dialogOptions.error.reset();\n\n $scope.dialogOptions.isLoading = true;\n\n var cancel = OfferingsService.cancelOffering($scope.offering.id, $scope.offering.type);\n cancel.then(function (success) {\n $scope.dialogOptions.isLoading = false;\n UsersService.navigateToHome();\n }, function (failure) {\n $scope.dialogOptions.isLoading = false;\n\n $scope.dialogOptions.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n } else {\n $mdDialog.hide();\n }\n };\n\n /**\n * Offering cancellation logic\n */\n /**\n * Opens offering modal. This method runs a method to gather information regarding users in the roster. If there\n * are users which are not completed, or if there are no assigned users, appropriate messaging will be shown.\n *\n * @param $event event containing target that was clicked\n * @param offering current offering data\n */\n $scope.showCompleteOfferingModal = function ($event, offering) {\n $scope.offering = offering;\n $scope.dialogOptions.error.reset();\n /**\n * Get count of incomplete users;\n * if there are -1 users, there are no users signed up yet;\n * if there are 0 users, then we are good to go;\n * if there are > 0 users, there are users who have not completed the offering.\n */\n var total = OfferingsService.getIncompleteUserCount();\n\n total = 0;\n switch(total) {\n case -1:\n $scope.offeringDeliveryErrorMessage = 'Sorry! There are no students who have been signed up for this offering!';\n $scope.showOfferingDeliveryErrorMessage = true;\n\n setTimeout(function() {\n $scope.offeringDeliveryErrorMessage = '';\n $scope.showOfferingDeliveryErrorMessage = false;\n }, 5000);\n\n break;\n case 0:\n $mdDialog.show({\n clickOutsideToClose: true,\n focusOnOpen: true,\n parent: angular.element(document.body),\n preserveScope: true,\n scope: $scope,\n templateUrl: 'app/templates/offerings/components/dialogs/completionDialog.html'\n }).then(function (answer) {\n\n }, function () {\n\n });\n\n break;\n default:\n $scope.offeringDeliveryErrorMessage = 'Sorry! There are still students who have not completed the offering!';\n $scope.showOfferingDeliveryErrorMessage = true;\n\n setTimeout(function() {\n $scope.offeringDeliveryErrorMessage = '';\n $scope.showOfferingDeliveryErrorMessage = false;\n }, 5000);\n\n break;\n }\n };\n\n /**\n * Show the dialog that allows the user to confirm the offering cancellation\n *\n * @param event Object that triggered the event\n * @param offering The offering that is going to be cancelled\n */\n $scope.showDropUserModal = function (event, person) {\n $scope.droppedPerson = person;\n\n $mdDialog.show({\n clickOutsideToClose: true,\n focusOnOpen: true,\n targetEvent: event,\n preserveScope: true,\n scope: $scope,\n templateUrl: 'app/templates/offerings/components/dialogs/dropPersonDialog.html'\n }).then(function (answer) {\n\n }, function () {\n\n });\n };\n\n $scope.dropStudent = function(answer) {\n $mdDialog.hide();\n\n if (answer === true) {\n $scope.droppedPerson.droppingStudent = true;\n\n $scope.droppedPerson.error.reset();\n\n $scope.droppedPerson.call = RosterService.updateSinglePersonOnRoster($scope.droppedPerson.student.id, offeringId, 'cancelled', offeringType);\n\n $scope.droppedPerson.call.then(function(success) {\n $scope.rosterAction();\n\n\n $mdDialog.hide();\n }, function(failure) {\n $scope.droppedPerson.droppingStudent = false;\n\n $scope.droppedPerson.error.setError(failure.StatusCode, failure.ErrorMessage);\n setTimeout(function () { droppedPerson.error.reset(); }, 2000);\n });\n }\n };\n\n /**\n * Completes an offering if the user has chosen to do so. This will run logic to make AJAX request to the offering\n * completion call. If answer === false, modal will close.\n *\n * @param answer Boolean passed from buttons, based on angular.material pattern\n */\n $scope.completeOffering = function (answer) {\n if (answer === true) {\n $scope.completingOffering = true;\n $scope.dialogOptions.isLoading = true;\n var completion = OfferingsService.completeOffering($scope.offering.id, $scope.offering.type);\n completion.then(function(success) {\n $scope.dialogOptions.isLoading = false;\n $mdDialog.hide();\n $scope.viewAction();\n }, function(failure) {\n $scope.dialogOptions.isLoading = false;\n\n $scope.dialogOptions.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n } else {\n $mdDialog.hide();\n }\n };\n\n $scope.changeAllStatuses = function(toStatus) {\n var roster = $scope.roster;\n var status = toStatus;\n\n var member = _.findWhere($scope.userCompletionStatuses, { name: status });\n\n /**\n * Skip going forward if there is no value; defaults don't have values.\n */\n if(typeof member === 'undefined' || typeof member.value === 'undefined') {\n return;\n }\n\n _.each(roster, function(r) {\n r.statusForDropdown = member.value;\n });\n \n };\n\n /**\n * Attach the grade to all students.\n */\n $scope.setAllGrades = function() {\n var allGrade = this.allGrades;\n\n if ((allGrade !== null || allGrade !== 'undefined') && (allGrade >= 0 && allGrade <= 100)) {\n for(var i in $scope.roster) {\n $scope.roster[i].student.score = allGrade;\n $scope.gradeRangeError = false;\n }\n } else {\n $scope.gradeRangeError = true;\n }\n };\n\n /**\n * Attach the time spent to all students on a single session.\n */\n $scope.setHoursSpent = function() {\n var allHours = this.allHours;\n\n for(var i in $scope.roster) {\n for(var session in $scope.roster[i].sessions) {\n sessions = $scope.roster[i].sessions;\n\n if(sessions[session].id === $scope.selectedSession) {\n sessions[session].hoursSpent = allHours;\n }\n }\n }\n };\n\n /**\n * Update a single person for the full offering.\n *\n * @param person Person to be updated.\n */\n $scope.savePersonForFullOffering = function(person) {\n person.isLoading = true;\n\n person.error.reset();\n\n /**\n * Uses person.statusForDropdown instead of person.student.registrationStatus due to limitations in\n * angular.\n */\n var personUpdate = RosterService.updateSinglePersonOnRoster(person.student.id, offeringId, person.statusForDropdown, offeringType, {\n completionDate: $scope.offering.highestSessionDateForOffering.moment.utc().format(),\n score: parseInt(person.student.score, 10)\n });\n\n personUpdate.then(function(success) {\n person.isLoading = false;\n\n person.hasCompletedTheOffering = true;\n }, function(failure) {\n person.isLoading = false;\n\n person.error.setError(failure.StatusCode, failure.ErrorMessage);\n setTimeout(function () { person.error.reset(); }, 2000);\n });\n };\n\n /**\n * Update the session to properly track next session to update\n */\n $scope.changeSession = function() {\n $scope.selectedSession = this.selectedSession;\n };\n\n /**\n * Save a single person's session\n *\n * @param person Next user to save session\n */\n $scope.savePersonPerSession = function(person) {\n person.isLoading = true;\n\n person.error.reset();\n\n var correctSession = RosterService.getCorrectSessionFromUser(person.student.id, $scope.selectedSession);\n\n person.call = RosterService.updateSessionByUserOnOffering(person.student.id, offeringId, {\n sessionId: $scope.selectedSession,\n hoursSpent: parseFloat(correctSession.hoursSpent, 10)\n });\n\n person.call.then(function(success) {\n person.isLoading = false;\n }, function(failure) {\n person.isLoading = false;\n\n person.error.setError(failure.StatusCode, failure.ErrorMessage);\n setTimeout(function () { person.error.reset(); }, 2000);\n });\n };\n\n $scope.saveAllUsersForCurrentSession = function() {\n var roster = $scope.roster;\n\n for(var i in roster) {\n $scope.savePersonPerSession(roster[i]);\n }\n };\n\n $scope.saveAllForFullOffering = function() {\n var roster = $scope.roster;\n\n _this.groupSaveTotal = roster.length;\n _this.totalSavedFromGroupCall = 0;\n\n $scope.fullOfferingUpdateIsLoading = true;\n\n for(var i in roster) {\n if(roster[i].statusForDropdown === 'default') {\n continue;\n }\n\n roster[i].isLoading = true;\n\n roster[i].id = roster[i].student.id;\n\n _this.updateStudentInBatch(roster[i], roster[i].statusForDropdown, {\n completionDate: $scope.offering.highestSessionDateForOffering,\n score: parseInt(roster[i].student.score, 10)\n }, function(data, user) {\n //success callback\n user.isLoading = false;\n user.success = true;\n\n user.hasCompletedTheOffering = true;\n }, function(failure, user) {\n user.isLoading = false;\n\n user.error.setError(failure.StatusCode, failure.ErrorMessage);\n \n }, function(user) {\n // final success callback\n }, function() {\n // final error callback\n });\n }\n };\n\n $scope.openAdditionModal = function() {\n $scope.userSearchOptions.isLoading = false;\n $scope.userSearchOptions.searched = false;\n $scope.userSearchOptions.selected = 0;\n\n $scope.users = null;\n\n jQuery('#userAdditionModal').modal();\n };\n\n $scope.openSubstituteModal = function(person) {\n $scope.userSearchOptions.isLoading = false;\n $scope.userSearchOptions.searched = false;\n $scope.userSearchOptions.selected = 0;\n\n $scope.users = null;\n\n $scope.substitutee = person;\n\n jQuery('#userSubstitutionModal').modal();\n };\n\n $scope.searchForUsers = function() {\n var userSearch = this.userSearchOptions.value;\n\n // Reset the error\n $scope.userSearchOptions.error.reset();\n\n $scope.userSearchOptions.addStudentLoader = false;\n $scope.userSearchOptions.isLoading = true;\n $scope.userSearchOptions.searched = true;\n\n var users = UsersService.search(userSearch);\n\n users.then(function(success) {\n $scope.userSearchOptions.isLoading = false;\n\n $scope.users = success;\n }, function(failure) {\n $scope.users = [];\n\n $scope.isLoading = false;\n\n $scope.userSearchOptions.isLoading = false;\n\n $scope.userSearchOptions.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n $scope.setCountOfSelectedUsers = function($event) {\n var isChecked = jQuery($event.currentTarget).is(':checked');\n\n if(isChecked === true) {\n $scope.userSearchOptions.selected += 1;\n } else {\n $scope.userSearchOptions.selected -= 1;\n }\n };\n\n $scope.reload = function () {\n var tabIndex = $scope.isSelectedTab;\n if (tabIndex === 1) {\n $scope.viewAction();\n $scope.isSelectedTab = 0;\n }\n }; \n\n $scope.addStudents = function() {\n $scope.userSearchOptions.addStudentLoader = true;\n\n _this.groupSaveTotal = jQuery('.checkbox:checked').length;\n _this.totalSavedFromGroupCall = 0; \n \n var errorCallback = function(failure, user) {\n user.showEx = true;\n $scope.userSearchOptions.addStudentLoader = false;\n\n user.error.reset();\n\n user.error.setError(failure.StatusCode, failure.ErrorMessage);\n\n };\n\n var successCallback = function(data, user) {\n user.showCheck = true;\n user.showEx = false;\n };\n\n var finalSuccessCallback = function () {\n // LMS-4334 Instructor / Roster / roster count not being refreshed on Info screen\n \n \n $scope.userSearchOptions.addStudentLoader = false;\n \n jQuery('#userAdditionModal').modal('hide');\n \n var tabIndexValue = $scope.isSelectedTab;\n if (tabIndexValue === 0)\n {\n $scope.rosterAction();\n $scope.waitlistAction();\n $scope.viewAction();\n \n \n }\n else {\n $scope.rosterAction();\n $scope.waitlistAction(); \n }\n $('body').removeClass('modal-open');\n $('.modal-backdrop').remove();\n };\n\n\n var finalErrorCallback = function() {\n $scope.userSearchOptions.addStudentLoader = false;\n };\n var y = 0;\n var z = 0;\n var overTheMaxWaitlistLimit = false;\n $scope.overMaxWaitlister = '';\n\n for (var i in $scope.users) {\n if (typeof $scope.users[i].checked !== 'undefined' && $scope.users[i].checked === true) {\n {\n\n if (($scope.offering.roster.attendingStudents.length + z) < $scope.offering.maxAllowedSize)\n {\n _this.updateStudentInBatch($scope.users[i], 'confirmed', null, successCallback, errorCallback, finalSuccessCallback, finalErrorCallback);\n z++;\n\n }\n else if (($scope.offering.roster.getWaitlistedStudents().length + y ) >= $scope.offering.maxWaitlistSize) {\n \n jQuery('#userAdditionModal').modal('hide');\n\n if ($scope.overMaxWaitlister === '') {\n $scope.overMaxWaitlister = $scope.users[i].fullName;\n }\n else\n {\n $scope.overMaxWaitlister = $scope.overMaxWaitlister + ', ' + $scope.users[i].fullName;\n }\n\n overTheMaxWaitlistLimit = true;\n }\n else\n {\n _this.updateStudentInBatch($scope.users[i], 'confirmed', null, successCallback, errorCallback, finalSuccessCallback, finalErrorCallback);\n y++;\n }\n\n }\n }\n }\n if (overTheMaxWaitlistLimit === true)\n {\n $scope.overMaxWaitlister = $scope.overMaxWaitlister + ' can not be added to the wait list - this offering has reached the maximum waitlist size limit of ' + $scope.offering.maxWaitlistSize;\n jQuery('#maxWaitlistModal').show();\n $scope.rosterAction();\n $scope.waitlistAction();\n }\n };\n\n $scope.hideMaxWaitlist = function () { jQuery('#maxWaitlistModal').hide(); };\n\n /* Function refreshs the page on close of modal*/\n $scope.refresh = function () { \n $scope.rosterAction(); \n }; \n\n $scope.substituteStudent = function() {\n var userId = null;\n\n $scope.substitutee.error.reset();\n\n $scope.userSearchOptions.addStudentLoader = true;\n\n for(var i in $scope.users) {\n if(parseInt($scope.users[i].checked, 10) > 0) {\n userId = $scope.users[i].id;\n\n break;\n }\n }\n\n // oldUser, newUser, offeringId, type\n var substitution = RosterService.substituteUser($scope.substitutee.student.id, userId, offeringId, offeringType);\n substitution.then(function(success) {\n $scope.userSearchOptions.addStudentLoader = false;\n\n jQuery('#userSubstitutionModal').modal('hide');\n\n $scope.rosterAction();\n }, function(failure) {\n $scope.userSearchOptions.addStudentLoader = false;\n\n $scope.substitutee.error.setError(failure.StatusCode, failure.ErrorMessage);\n setTimeout(function () { substitutee.error.reset(); }, 2000);\n });\n };\n\n $scope.dump = function(value) { console.warn(value); };\n\n $scope.showWaitlistRemoveConfirmationModal = function (event, person) {\n $scope.isSelectedTab = 1;\n $scope.person = person;\n var waitlistPersonToDelete = $scope.person.fullName;\n\n $mdDialog.show({\n controller: ['$scope', 'person', 'reallyRemoveFromWaitList', function ($scope, person, reallyRemoveFromWaitList) {\n $scope.person = person;\n $scope.reallyRemoveFromWaitList = reallyRemoveFromWaitList;\n }],\n focusOnOpen: false,\n targetEvent: event,\n templateUrl: 'app/templates/offerings/components/dialogs/removeWaitlistDialog.html',\n clickOutsideToClose: true,\n locals: {\n person: $scope.person,\n reallyRemoveFromWaitList: $scope.reallyRemoveFromWaitList\n }\n });\n };\n\n $scope.reallyRemoveFromWaitList = function (answer) {\n $scope.isSelectedTab = 1;\n if (answer === true) {\n $scope.removingWaitListStudent = true;\n\n var somev = OfferingsService.removeStudentFromWaitList($scope.person, $scope.offeringId);\n somev.then(function (success) {\n $scope.waitlistAction(); \n $scope.removingWaitListStudent = false;\n $mdDialog.hide();\n });\n\n } else {\n $mdDialog.hide();\n }\n };\n\n $scope.getCorrectLabelForStatusDropdown = function(status) {\n return $scope.userCompletionStatuses.filter(function(member) {\n if(member.value === status) {\n return member;\n }\n })[0].name;\n };\n\n $scope.highlightDates = function(date) {\n var curSession = null;\n\n date = moment(date);\n\n var curDate = date.date();\n var curMonth = date.month();\n var curYear = date.year();\n\n for (var i = 0; i < $scope.sessions.length; i++) {\n curSession = $scope.sessions[i];\n\n if(curDate === curSession.startDateTime.day && curMonth === (curSession.startDateTime.monthNumber - 1) && curYear === curSession.startDateTime.year) {\n return true;\n }\n }\n\n return false;\n };\n\n //no longer used. Switched to HTML/angular form validation\n //$scope.validateNumber = function(event, valueHolder) {\n // var charCode = (event.which) ? event.which : event.keyCode;\n\n // valueHolder = typeof valueHolder !== 'object' ? this : valueHolder;\n\n // if(charCode > 31 && (charCode !== 190 && (charCode < 48 || charCode > 57))) {\n // event.preventDefault();\n // } else {\n // if((typeof valueHolder !== 'undefined' && typeof valueHolder.hasDecimal === 'undefined' || valueHolder.hasDecimal === false) && charCode === 190) {\n // var periods = typeof valueHolder.hoursSpent !== 'undefined' ? valueHolder.hoursSpent.split('.') : valueHolder.allHours.split('.');\n\n // if(periods.length > 1) {\n // event.preventDefault();\n // }\n\n // valueHolder.hasDecimal = true;\n // } else if(valueHolder.hasDecimal === true && charCode === 190) {\n // event.preventDefault();\n // } else if(charCode === 8) {\n // valueHolder.hasDecimal = false;\n // }\n // }\n //};\n \n\n \n };\n}]);","(function () {\n app.controller('publicCatalogHomeController', ['$rootScope', 'CatalogSearchParameters', publicCatalogHomeController]);\n\n function publicCatalogHomeController($rootScope, CatalogSearchParameters) {\n CatalogSearchParameters.productBreadcrumbs = [];\n CatalogSearchParameters.clearBreadcrumbs();\n $rootScope.metaTags.title = \"BAI Training Catalog, Compliance, Learning Management, Professional Development, Financial Services\";\n $rootScope.metaTags.description = \"BAI gives financial services leaders confidence in managing compliance and a passion for professional development by providing powerful tools and subject matter expertise you can rely on. Search our courseware catalog!\";\n $rootScope.metaTags.keywords = \"BSA, AML, eLearning, Role-based, Microlearning, Regulation-based, FDIC, CFPB, Banking, Credit Union, Mortgage, Fintech, Regtech, HMDA, OFAC, TILA\";\n\n $rootScope.consentCookieExists = function() {\n var cookies = document.cookie.split(';');\n for (var c in cookies) {\n if (cookies[c].includes(\"tracking_consent\")) {\n return true;\n }\n }\n return false;\n };\n\n $rootScope.addConsentCookie = function (consent) {\n var cookieEndDate = new Date();\n cookieEndDate.setDate(cookieEndDate.getDate() + 30);\n var cookie;\n if (consent) {\n cookie = \"track\";\n } else {\n cookie = \"do_not_track\";\n }\n document.cookie = \"tracking_consent=\" + cookie + \"; expires= \" + cookieEndDate.toUTCString();\n dataLayer.push({ 'event': 'consent_asked' });\n };\n }\n})();","app.controller('publicNavigationController', ['$location', '$q', '$route', '$rootScope', '$scope', '$window', 'BreadcrumbsService',\n function ($location, $q, $route, $rootScope, $scope, $window, BreadcrumbsService) {\n \n $scope.$watch(function () {\n return BreadcrumbsService.getCrumbs();\n }, function (newVal, oldVal) {\n $scope.breadcrumbs = newVal;\n }, true);\n\n $scope.displayChromeWarning = false;\n\n var versionStrCompare = function (v1, v2) {\n /* get an array of integers for each version string component */\n /* don't use Array.prototype.map for number conversion as it is not supported on older browsers */\n a1 = v1.split(\".\");\n a2 = v2.split(\".\");\n /* compare each component of the versions as an integer */\n for (i = 0; i < a1.length; i++) {\n\n if (Number(a1[i]) < Number(a2[i])) {\n return -1;\n }\n if (Number(a1[i]) > Number(a2[i])) {\n return 1;\n }\n }\n /* strings are equal to this point, but if a2 has more version components then it is greater */\n if (a1.length < a2.length) {\n return 1;\n } else {\n return 0;\n }\n };\n\n var badChromeVersion = \"56.0.0.0\";\n var goodChromeVersion = \"57.0.2987.88\"; //fixed version see https://jira.bai.org/jira/browse/LMS-319\n\n // Check the version of chrome for\n var raw = navigator.userAgent.match(/Chrom(e|ium)\\/([0-9].+) /);\n var chromeVersion = raw ? raw[2] : false;\n if (chromeVersion && chromeVersion.trim() && (versionStrCompare(chromeVersion, badChromeVersion) >= 0) && (versionStrCompare(chromeVersion, goodChromeVersion) < 0)) {\n $scope.displayChromeWarning = true;\n }\n }\n]);","/* This page is a demo page for various components related to the premiumAdmin */\napp.factory('Rules_AdminOverride', ['BreadcrumbsService', 'UsersService', 'RulesService', 'GroupsService', 'CoursesService', 'dateUtil', 'PeopleGroupFunctions', '$q', '$http', '$timeout', '$filter', 'filterFilter', '$route', '$location', '$routeParams', 'WizardHandler', 'RoleMapsMixin', '$injector', 'errorDisplayerUtil', 'SettingsService',\n function (BreadcrumbsService, UsersService, RulesService, GroupsService, CoursesService, dateUtil, PeopleGroupFunctions, $q, $http, $timeout, $filter, filterFilter, $route, $location, $routeParams, WizardHandler, RoleMapsMixin, $injector, errorDisplayerUtil, SettingsService) {\n return function($scope) {\n var _this = this;\n $scope.dateUtil = dateUtil;\n $scope.defaultHeader = true; // This Sets the page to full width of the screen.\n $scope.hideCatalogSearch = true;\n /* This will make the navigation tab active on certain page */\n $scope.activeTab = 'tab-active-class';\n\n /*This will route users to the appropiate user manual based on active tab*/\n $scope.userManualHref = 'https://ld-connect.bai.org/learning-manager/training-administrator-user-manual/#Rules';\n\n /* Training Insights access determined by the organization settings */\n var sett = SettingsService.getSettings().then(function (success) {\n $scope.showTrainingInsights = SettingsService.isTrainingInsightsEnabled();\n $scope.showCareerPath = SettingsService.isCareerPathEnabled();\n });\n\n\n /**\n * All controller-level scoped variables should be attached to general for cross-template communication\n */\n $scope.general = {};\n $scope.general.rulesSearch = {};\n\n if (typeof $route.current !== 'undefined' && typeof $route.current !== null)\n _this.params = $route.current.params;\n\n /* ************************ Active Rules Tree View Actions ******************* */\n\n $scope.activeRuleData = [{ 'name': 'Active', 'nodes': [] }];\n $scope.activeRuleOptions = {};\n $scope.activeRuleOptions.initiallyOpened = false;\n $scope.activeRuleOptions.rootNodeIsTopLevel = false;\n $scope.activeRuleOptions.canDrillDown = false;\n\n /* This veriable is initialized here only to make sure it exists.\n * Otherwise, when you type stuff into the treeFilter bar, it won't search the tree\n */\n $scope.ruleFilter = \"\";\n $scope.activeRuleTreeIsLoading = true;\n $scope.activeRuleNowHidden = true;\n $scope.activeRuleTitle = \"Active\";\n\n $scope.activeRuleError = {};\n $scope.activeRuleError.error = errorDisplayerUtil.create();\n\n $scope.homeAction = function() {\n $scope.homeTemplate = 'app/templates/rules/home/admin.html';\n $scope.ruleSelected = $scope.activeRuleData[0];\n _this.listAllRules();\n };\n\n $scope.createAction = function() {\n $scope.isCreate = true;\n $scope.homeTemplate = 'app/templates/rules/create/admin.html';\n $scope.wizardTitle = \"Add New Rule\";\n $scope.goToPrevious = false;\n _this.createRule();\n };\n\n $scope.rulesTableError = {};\n $scope.rulesTableError.error = errorDisplayerUtil.create();\n $scope.rulesRowsAreLoading = true;\n\n _this.listAllRules = function() {\n $scope.rulesTableError.error.reset();\n\n var allRulesPromise = RulesService.getAllRules();\n\n allRulesPromise.then(function(success) {\n $scope.rulesRowsAreLoading = false;\n _this.allRulesData = success;\n $scope.rows = _this.filterRows('active');\n }, function(failure) {\n $scope.rulesRowsAreLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.rulesTableError.error.setError(errorCode, message);\n });\n };\n\n _this.createRule = function() {\n var newRuleObj = RulesService.createRuleObj(true);\n newRuleObj.then(function(success) {\n $scope.rule = success;\n }, function(failure) {\n // We are bringing the dummy object from\n // RulesService and bind it to the form.\n });\n };\n\n // Based on which step you're in rule creation process.\n // The 'Next' click in that step will call the next tab respective function.\n // Eg: If you're in general properties step., the next click in that step\n // will call _this.peopleAction() function., because you see peopleGroup stuff here.\n // Created this pattern so that it works for both create and update rules.\n $scope.ruleCreateError = {};\n $scope.ruleCreateError.error = errorDisplayerUtil.create();\n $scope.ruleCreateIsLoading = false;\n\n _this.createFailure = function(failure) {\n $scope.ruleCreateIsLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.ruleCreateError.error.setError(errorCode, message);\n };\n\n $scope.isDisabled = false;\n _this.create_peopleAction = function() {\n $scope.goToPrevious = true;\n $scope.ruleCreateIsLoading = true;\n $scope.ruleCreateError.error.reset();\n \n var data = angular.copy($scope.rule);\n var generalInfoPromise;\n\n if (typeof data.id !== 'undefined' && data.id !== null) {\n generalInfoPromise = _this.generalInfo_update(data);\n } else {\n generalInfoPromise = _this.generalInfo(data);\n }\n\n generalInfoPromise.then(function(success) {\n $scope.ruleCreateIsLoading = false;\n $scope.isDisabled = true;\n $scope.rule = success;\n //used for validating assignOn dates\n $scope.rule.startDateStartOfDay = angular.copy($scope.rule.startDate).moment.startOf('day');\n $scope.rule.endDateEndOfDay = $scope.rule.endDate === null ? null : angular.copy($scope.rule.endDate).moment.endOf('day');\n\n\n WizardHandler.wizard(\"Rule\").next();\n // GroupId is created upon succesfull rulecreation\n // Pass this GroupId to update criteria.\n var groupId = success.groupId;\n _this.ruleIdForCreate = success.id;\n _this.ruleStartDate = success.startDate;\n _this.ruleCreateInProgress = success;\n _this.createRule_PeopleGroup(groupId);\n }, function(failure) {\n _this.createFailure(failure);\n });\n };\n\n // This is being called upon rule creation\n _this.generalInfo = function(data) {\n var status = 'create';\n var createRule_General = RulesService.ruleGeneralCall(data, status);\n\n return createRule_General;\n };\n\n // This is being called when user steps back to general info in \n // Rule create process and tries to update an General Info\n _this.generalInfo_update = function(data) {\n var status = 'update';\n var updateRule_General = RulesService.ruleGeneralCall(data, status);\n\n return updateRule_General;\n };\n\n $scope.createPeopleGroup = {};\n $scope.createPeopleGroup.isHeaderOpen = false;\n $scope.createPeopleGroup.isDisabled = false;\n $scope.createContainerOptions = {};\n $scope.createContainerOptions.showLock = false;\n\n // $scope.createRulePeopleIsLoading = false;\n\n _this.createRule_PeopleGroup = function(groupId) {\n $scope.ruleCreateIsLoading = true;\n $scope.ruleCreateError.error.reset();\n\n var all = $q.all(PeopleGroupFunctions.peopleGroupActions());\n all.then(function(success) {\n $scope.groupStructure = success[0];\n $scope.selectOptionsData = success[1];\n $scope.containerOperandsData = GroupsService.containerOperandsRequired(success[2]);\n\n $scope.groupStructure.groupId = groupId;\n\n GroupsService.secondaryFormatGroupStructure(success[3], success[4].groups, success[5], success[6], success[7]);\n\n $scope.ruleCreateIsLoading = false;\n $scope.showRulePeopleGroup = true;\n\n }, function(failure) {\n $scope.showRulePeopleGroup = false;\n _this.createFailure(failure);\n\n });\n };\n\n _this.create_assignmentsAction = function() {\n $scope.goToPrevious = true;\n $scope.ruleCreateIsLoading = true;\n $scope.ruleCreateError.error.reset();\n $scope.rows = [];\n\n var peopleGroupPromise = _this.updatePeopleGroup(true);\n\n peopleGroupPromise.then(function(success) {\n $scope.ruleCreateIsLoading = false;\n $scope.peopleGroupStructure = success;\n WizardHandler.wizard(\"Rule\").next();\n $scope.rows = [];\n\n }, function(failure) {\n _this.createFailure(failure);\n });\n };\n\n _this.create_datesAction = function() {\n $scope.goToPrevious = true;\n $scope.ruleCreateIsLoading = true;\n $scope.ruleCreateError.error.reset();\n\n var assignmentsPromise = _this.addAssignments();\n assignmentsPromise.then(function(success) {\n $scope.ruleCreateIsLoading = false;\n WizardHandler.wizard(\"Rule\").next();\n $scope.rows = _this.setDefaults(success);\n }, function(failure) {\n _this.createFailure(failure);\n });\n };\n\n _this.addAssignments = function() {\n var data = angular.copy($scope.rows);\n var id = _this.ruleIdForCreate;\n\n _.each(data, function (course) {\n //if assign on date is undefined, then default the assign on date to the rule start date\n if (course.assignOnDate === undefined) {\n course.assignOnDate = angular.copy(_this.ruleStartDate);\n }\n });\n\n var assignmentsPromise;\n if (data !== undefined && data !== 'null')\n assignmentsPromise = RulesService.updateRuleAssignments(id, data);\n\n return assignmentsPromise;\n };\n\n _this.setDefaults = function (courses) {\n var ruleStartDate = angular.copy($scope.rule.startDate);\n\n _.each(courses, function (course) {\n course.flagDueDateMethod = 0;\n //set the default date to the rule start date, have to use angular.copy, otherwise all the assign on dates for courses will be the same object\n if (course.assignOnDate === undefined) {\n course.assignOnDate = angular.copy(ruleStartDate);\n }\n });\n\n return _this.formatAcceptPriorDates(courses);\n };\n\n _this.create_previewAction = function() {\n $scope.goToPrevious = true;\n $scope.ruleCreateIsLoading = true;\n $scope.ruleCreateError.error.reset();\n\n //Check if assign on dates are valid\n var isAssignOnDateValid = true;\n _.each($scope.rows, function (row) {\n if (typeof row.assignOnDate !== \"undefined\") {\n if (row.assignOnDate === null) {\n isAssignOnDateValid = false;\n }\n else if ($scope.rule.startDate.moment > row.assignOnDate.moment || ($scope.rule.endDate !== null && $scope.rule.endDate.moment < row.assignOnDate.moment)) {\n isAssignOnDateValid = false;\n }\n } else {\n isAssignOnDateValid = false;\n }\n });\n\n if (isAssignOnDateValid === false) {\n $scope.ruleCreateIsLoading = false;\n var errorCode = '';\n var message = \"'Assign On' dates must be between the start and end date of the rule.\";\n $scope.ruleCreateError.error.setError(errorCode, message);\n } else {\n\n var datesPromise = _this.addAssignments();\n datesPromise.then(function (success) {\n $scope.ruleCreateIsLoading = false;\n WizardHandler.wizard(\"Rule\").next();\n _this.ruleCount();\n }, function (failure) {\n _this.createFailure(failure);\n });\n }\n\n };\n\n _this.ruleCount = function() {\n $scope.ruleCreateIsLoading = true;\n $scope.ruleCreateError.error.reset();\n\n var ruleId = _this.ruleIdForCreate;\n\n var ruleCount = RulesService.getRuleCounts(ruleId);\n ruleCount.then(function(success) {\n $scope.ruleCreateIsLoading = false;\n $scope.count = success;\n\n }, function(failure) {\n _this.createFailure(failure);\n });\n };\n\n _this.create_activateAction = function() {\n $scope.goToPrevious = true;\n $scope.ruleCreateIsLoading = true;\n $scope.ruleCreateError.error.reset();\n\n $scope.rule.status = \"active\";\n\n var activateRulePromise = _this.updateGeneralInfo();\n activateRulePromise.then(function(success) {\n $scope.ruleCreateIsLoading = false;\n $scope.rule_Success = true;\n $timeout(function() { $location.path('/rules/home'); }, 3000);\n\n }, function(failure) {\n _this.createFailure(failure);\n });\n\n\n };\n\n $scope.AddAssignmentsOpen = function(){\n $scope.$broadcast('openAddAssignmentsModal', { displaytype: 1, studentId: null });\n };\n\n ////////// All View/Update Rule Methods Below /////////////////\n $scope.ruleEditTabs = {};\n $scope.editAction = function() {\n $scope.isCreate = false;\n $scope.homeTemplate = 'app/templates/rules/edit/admin.html';\n $scope.ruleEditTabs.selectedTab = 0;\n _this.update_getGeneralAction();\n };\n\n /**\n * This is called on landing page of edit rule page.\n * Get Rule General Info\n **/\n $scope.editRuleGeneralErrror = {};\n $scope.editRuleGeneralErrror.error = errorDisplayerUtil.create();\n $scope.editRuleGeneralIsLoading = true;\n\n _this.update_getGeneralAction = function() {\n var ruleId = _this.params.param.split('/')[0];\n\n var singleRuleInfo = RulesService.getSingleRule(ruleId);\n var ruleStatusOptions = RulesService.getRuleStatusOptions(true);\n\n var all = $q.all([singleRuleInfo, ruleStatusOptions]);\n all.then(function(success) {\n $scope.editRuleGeneralIsLoading = false;\n $scope.showEditRuleGeneral = true;\n $scope.rule = success[0];\n $scope.statusOptions = success[1];\n\n $scope.rule.startDateStartOfDay = angular.copy($scope.rule.startDate).moment.startOf('day');\n $scope.rule.endDateEndOfDay = $scope.rule.endDate === null ? null : angular.copy($scope.rule.endDate).moment.endOf('day');\n\n _this.ruleCreateInProgress = success[0];\n\n _this.beforeDaysList = $scope.rule.beforeDueNotificationDays;\n var singleRule = success[0];\n _this.validateStartDate(singleRule);\n\n if ($scope.rows === undefined && $scope.rule.status === 'draft') {\n _this.getAssigmentsForDateValidation();\n }\n\n }, function(failure) {\n $scope.editRuleGeneralIsLoading = false;\n $scope.showEditRuleGeneral = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.editRuleGeneralErrror.error.setError(errorCode, message);\n });\n };\n\n $scope.uniqueNotificationBefore = function(int) {\n $scope.duplicateBefore = false;\n if (typeof int !== 'undefined' && int !== null) {\n\n var output = [];\n var beforeDays = $scope.rule.beforeDueNotificationDays;\n\n _.each(beforeDays, function(dayInt) {\n var diff = dayInt - int;\n if (diff === 0) {\n output.push(diff);\n }\n });\n\n if (output.length > 1) {\n $scope.duplicateBefore = true;\n }\n }\n };\n\n $scope.uniqueNotificationAfter = function(int) {\n $scope.duplicateAfter = false;\n if (typeof int !== 'undefined' && int !== null) {\n\n var output = [];\n var beforeDays = $scope.rule.afterDueNotificationDays;\n\n _.each(beforeDays, function(dayInt) {\n var diff = dayInt - int;\n if (diff === 0) {\n output.push(diff);\n }\n });\n\n if (output.length > 1) {\n $scope.duplicateAfter = true;\n }\n }\n };\n\n _this.validateStartDate = function(rule) {\n if(typeof rule.lastProcessedOn === \"undefined\" || rule.lastProcessedOn === null){\n $scope.isRuleStartDateEditable = true;\n\n if (typeof rule.status !== \"undefined\" && rule.status !== null && rule.status === 'draft' &&\n !rule.startDate && !rule.startDate.moment && !rule.startDate.moment._isValid)\n rule.startDate = dateUtil.formatDate(moment().format());\n }\n else {\n $scope.isRuleStartDateEditable = false;\n }\n\n if (typeof rule.status !== \"undefined\" && rule.status !== null && rule.status === 'closed') {\n $scope.closedRule = true;\n } else {\n $scope.closedRule = false;\n }\n };\n\n $scope.updateStatus = function(rule) {\n _this.validateStartDate(rule);\n };\n\n /**\n * On click on people tab, in edit rule page.\n * Get Rule People Group Structure.\n **/\n $scope.editPeopleGroup = {};\n $scope.editPeopleGroup.isHeaderOpen = true;\n $scope.editPeopleGroup.isDisabled = false;\n $scope.containerOptions = {};\n $scope.containerOptions.showLock = false;\n\n $scope.editRulePeopleError = {};\n $scope.editRulePeopleError.error = errorDisplayerUtil.create();\n $scope.editRulePeopleIsLoading = true;\n\n $scope.update_getPeopleAction = function(groupId) {\n $scope.editRulePeopleError.error.reset();\n $scope.showCourseDateHistory = false;\n $scope.showGeneralHistory = false;\n $scope.showCourseHistory = false;\n $scope.showPeopleGroupHistory = false;\n\n var all = $q.all(PeopleGroupFunctions.peopleGroupActions('ruleTab'));\n all.then(function(success) {\n $scope.selectOptionsData = success[1];\n $scope.containerOperandsData = GroupsService.containerOperandsRequired(success[2]);\n GroupsService.secondaryFormatGroupStructure(success[3], success[4].groups, success[5], success[6], success[7]);\n _this.peopleGroupStructure(groupId);\n\n $scope.editRulePeopleIsLoading = false;\n $scope.showPeopleGroup = true;\n\n }, function(failure) {\n $scope.editRulePeopleIsLoading = false;\n $scope.showPeopleGroup = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.editRulePeopleError.error.setError(errorCode, message);\n });\n };\n\n $scope.peopleGroupError = {};\n $scope.peopleGroupError.error = errorDisplayerUtil.create();\n $scope.peopleGroupIsLoading = false;\n $scope.showPeopleGroup = true;\n\n _this.peopleGroupStructure = function(groupId) {\n $scope.peopleGroupIsLoading = true;\n $scope.peopleGroupError.error.reset();\n\n var rule_groupStructure = GroupsService.peopleGroupStructure(groupId);\n rule_groupStructure.then(function(success) {\n $scope.groupStructure = _this.reFormattingPeopleGroupStructure(GroupsService.secondaryFormatGroupStructure_groupStructure(success));\n\n $scope.peopleGroupIsLoading = false;\n $scope.showPeopleGroup = true;\n }, function(failure) {\n $scope.peopleGroupIsLoading = false;\n $scope.showPeopleGroup = false;\n\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.peopleGroupError.error.setError(errorCode, message);\n });\n };\n\n _this.reFormattingPeopleGroupStructure = function(groupStructure) {\n if (_this.params.name === \"edit\") {\n if (typeof groupStructure.name !== 'undefined' && groupStructure.name === null) {\n groupStructure.name = \"\";\n }\n\n if (typeof groupStructure.containerId !== 'undefined' &&\n groupStructure.containerId !== null &&\n groupStructure.containerId === \"00000000-0000-0000-0000-000000000000\" &&\n groupStructure.operandName === null &&\n groupStructure.operandId === 0) {\n groupStructure.containerId = GroupsService.generateGuid();\n groupStructure.operandId = 1;\n groupStructure.operandName = \"AND (1)\";\n }\n }\n\n return groupStructure;\n };\n\n /**\n * On click on Assignments tab, in edit rule page.\n * Get Rule Assignments Data.\n **/\n $scope.editRuleAssignmentsErrror = {};\n $scope.editRuleAssignmentsErrror.error = errorDisplayerUtil.create();\n $scope.editRuleAssignmentsIsLoading = false;\n\n $scope.update_getAssignmentsAction = function() {\n $scope.editRuleAssignmentsErrror.error.reset();\n $scope.editRuleAssignmentsIsLoading = true;\n $scope.showCourseDateHistory = false;\n $scope.showGeneralHistory = false;\n $scope.showCourseHistory = false;\n $scope.showPeopleGroupHistory = false;\n\n var ruleId = _this.params.param.split('/')[0];\n\n if (typeof $scope.rows !== 'undefined' && typeof $scope.rows !== null) {\n $scope.editRuleAssignmentsIsLoading = false;\n $scope.showRuleAssignments = true;\n return $scope.rows;\n } else {\n _this.getRuleAssignments(ruleId);\n }\n };\n\n _this.getRuleAssignments = function (ruleId) {\n var rule_assignmentsList = RulesService.getRuleAssignments(ruleId);\n rule_assignmentsList.then(function (success) {\n $scope.editRuleAssignmentsIsLoading = false;\n $scope.showRuleAssignments = true;\n $scope.rows = _this.formatAcceptPriorDates(success);\n\n _.each($scope.rows, function (row) {\n\n //If the rule is active,and the assign on date is in the past (meaning the assignment went out), then the assign on date it not editable\n if (typeof row.assignOnDate !== \"undefined\") {\n //Active and processed and assign date is less that current date is not editable\n if (($scope.rule.status === 'active' && $scope.rule.lastProcessedOn !== null) && (row.assignOnDate.moment < moment())) {\n row.isAssignOnDateEditable = false;\n } else {\n row.isAssignOnDateEditable = true;\n }\n } else {\n row.isAssignOnDateEditable = true;\n }\n });\n }, function (failure) {\n $scope.editRuleAssignmentsIsLoading = false;\n $scope.showRuleAssignments = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.editRuleAssignmentsErrror.error.setError(errorCode, message);\n });\n };\n\n _this.formatAcceptPriorDates = function (rows) {\n _.each(rows, function (row) {\n if (row.course.type === 'careerPath') {\n row.acceptPassingScoreDate = null;\n }\n });\n return rows;\n };\n\n $scope.validateCourseDates = function(course) {\n if (course.flagDueDateMethod === 0) {\n course.dueDateDaysFromKey = \"none\";\n course.dueDateDaysFromValue = null;\n } else if (course.flagDueDateMethod === 1) {\n course.dueDateFixed = null;\n }\n };\n\n $scope.modalBodyShow = false;\n $scope.modalBodyToggle = function() {\n $scope.modalBodyShow = !$scope.modalBodyShow;\n };\n\n $scope.selectedCourseCount = 0;\n $scope.checkForLength = function(value) {\n if (value === true) {\n $scope.selectedCourseCount++;\n } else {\n $scope.selectedCourseCount--;\n }\n };\n\n $scope.courseSearchModal = {};\n $scope.courseSearchModal.courseSearch = '';\n $scope.courseSearchModal.selectAll = false;\n $scope.courseSearchModal.coursesAreLoading = true;\n\n $scope.viewCoursesError = {};\n $scope.viewCoursesError.error = errorDisplayerUtil.create();\n\n $scope.getAllCoursesCta = function(keyword) {\n $scope.modalBodyShow = true;\n $scope.selectedCourseCount = 0;\n $scope.viewCoursesError.error.reset();\n $scope.courseSearchModal.coursesAreLoading = true;\n $scope.courseSearchModal.selectAll = false;\n\n var addCoursePromise = CoursesService.getActiveCoursesForOrg(false, false);\n addCoursePromise.then(function(success) {\n var formattedCourseData = _this.formatCoursesData(success);\n\n if (typeof keyword !== 'undefined' && keyword !== null) {\n\n formattedCourseData = $filter('filter')(formattedCourseData, keyword);\n $scope.courseData = $filter('filter')(formattedCourseData, { 'productType': '!Document' });\n\n } else {\n $scope.courseData = $filter('filter')(formattedCourseData, { 'productType': '!Document' });\n }\n\n $scope.courseSearchModal.coursesAreLoading = false;\n\n }, function(failure) {\n $scope.courseSearchModal.coursesAreLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.viewCoursesError.error.setError(errorCode, message);\n });\n };\n\n // select all will select all courses\n $scope.addAllCourses = function(value) {\n _.each($scope.courseData, function(course) {\n course.select = value;\n });\n\n if (value === true) {\n $scope.selectedCourseCount = $scope.courseData.length;\n } else {\n $scope.selectedCourseCount = 0;\n }\n };\n\n $scope.removeCourse = function(course) {\n $scope.rows.splice($scope.rows.indexOf(course), 1);\n };\n\n $scope.$on('submitSelectedCourses', function (evt, params) {\n $scope.applyNewAssignmentsCta(params.data);\n });\n\n $scope.applyNewAssignmentsCta = function(data) {\n var selectedCourses = _this.getSelectedCourses(data);\n\n if ($scope.rows === undefined || $scope.rows === null)\n $scope.rows = [];\n\n if ($scope.rows.constructor !== Array)\n $scope.rows = [];\n\n $scope.showRuleAssignments = true;\n\n _.each(selectedCourses, function(course) {\n if ($scope.rows.indexOf(course) === -1) {\n if (course.course.productType === \"Document\"){\n course.required = false;\n if (course.assignOnDate === undefined) {\n course.assignOnDate = $scope.rule.startDate;\n }\n }\n $scope.rows.push(course);\n }\n });\n\n $scope.rows = _this.uniqueCourses($scope.rows);\n\n _this.formatCoursesData(data);\n $scope.courseSearch = '';\n };\n\n _this.uniqueCourses = function(data) {\n\n var output = [],\n keys = [];\n\n _.each(data, function(datapoint) {\n var key = datapoint.course.id;\n if (keys.indexOf(key) === -1) {\n keys.push(key);\n output.push(datapoint);\n }\n });\n\n return output;\n };\n\n _this.getSelectedCourses = function(data) {\n var selectedCoursesArray = [];\n\n _.each(data, function(datapoint) {\n selectedCoursesArray.push(datapoint);\n });\n\n return RulesService.formatCourseObj(selectedCoursesArray);\n };\n\n _this.formatCoursesData = function(data) {\n _.each(data, function(datapoint) {\n datapoint.select = false;\n });\n\n return data;\n };\n\n /***** Add New Courses Modal *****/\n $scope.addNewAssignmentCta = function() {\n $scope.courseSearchModal.courseSearch = '';\n $scope.selectedCourseCount = 0;\n $scope.courseSearchModal.selectAll = false;\n _this.formatCoursesData($scope.courseData);\n angular.element(document.querySelector('#viewAssignmentsModal')).modal('hide');\n $scope.$broadcast('openAddAssignmentsModal', { displaytype: 1, studentId: null });\n\n };\n\n /**\n * On click on Dates tab, in edit rule page.\n * Get Rule Assignments Dates Info.\n **/\n $scope.update_getDatesAction = function () {\n $scope.showCourseDateHistory = false;\n $scope.showGeneralHistory = false;\n $scope.showCourseHistory = false;\n $scope.showPeopleGroupHistory = false;\n // If user clicks on dates before clicking Assignments., user\n // wont see any data., but behind the scenes both dates and assignments does the \n // same actions.\n if (typeof $scope.rows === 'undefined' || $scope.rows.length === 0) {\n $scope.update_getAssignmentsAction();\n } else {\n _.each($scope.rows, function (row) {\n\n //If the rule is active,and the assign on date is in the past (meaning the assignment went out), then the assign on date it not editable\n if (typeof row.assignOnDate !== \"undefined\") {\n //Active and processed and assign date is less that current date is not editable\n if (($scope.rule.status === 'active' && $scope.rule.lastProcessedOn !== null) && (row.assignOnDate.moment < moment())) {\n row.isAssignOnDateEditable = false;\n } else {\n row.isAssignOnDateEditable = true;\n }\n } else {\n row.isAssignOnDateEditable = true;\n }\n });\n }\n };\n\n $scope.todaysDate = dateUtil.formatDate(moment().format());\n\n $scope.batchEditModal = function() {\n $scope.selectedCoursesForEdit = [];\n $scope.batchEditForm = {};\n $scope.batchEditForm.dueDateDaysStatus = false;\n $scope.batchEditForm.dueDateFixedStatus = false;\n $scope.batchEditForm.assignOnDateStatus = false;\n $scope.batchEditForm.assignOnDate = {\n moment: {}\n };\n $scope.batchEditForm.acceptPassingScoreDateStatus = false;\n $scope.batchEditForm.acceptPassingScoreDate = {};\n $scope.batchEditForm.dueDateFixed = {};\n $scope.isEditableModal_01 = false;\n $scope.isEditableModal_02 = false;\n\n $scope.selectedCoursesForEdit = filterFilter($scope.rows, { select: 'true' });\n\n if ($scope.selectedCoursesForEdit.length > 0) {\n $scope.showEditForm = true;\n } else {\n $scope.showEditForm = false;\n }\n };\n\n $scope.saveBatchEditChanges = function() {\n var batchEditForm = $scope.batchEditForm;\n var selectedCoursesForEdit = $scope.selectedCoursesForEdit;\n\n _.each(selectedCoursesForEdit, function(course) {\n if (typeof batchEditForm.required !== 'undefined' && batchEditForm.required !== null) {\n course.required = batchEditForm.required;\n }\n\n if (batchEditForm.assignOnDateStatus === true &&\n typeof batchEditForm.assignOnDate !== 'undefined' &&\n typeof batchEditForm.assignOnDate.displayTime !== 'undefined' &&\n batchEditForm.assignOnDate.displayTime !== null &&\n (typeof course.isAssignOnDateEditable === 'undefined' || course.isAssignOnDateEditable)) {\n course.assignOnDate = batchEditForm.assignOnDate;\n }\n\n if (batchEditForm.acceptPassingScoreDateStatus === true &&\n typeof batchEditForm.acceptPassingScoreDate !== 'undefined' &&\n batchEditForm.acceptPassingScoreDate !== null &&\n batchEditForm.acceptPassingScoreDate.moment !== null &&\n course.course.type !== 'careerPath') {\n course.acceptPassingScoreDate = dateUtil.formatDate(batchEditForm.acceptPassingScoreDate.moment.format());\n }\n\n if (batchEditForm.dueDateDaysStatus === true &&\n typeof batchEditForm.dueDateDaysFromKey !== 'undefined' &&\n batchEditForm.dueDateDaysFromKey !== null &&\n batchEditForm.dueDateDaysFromKey !== \"none\") {\n course.dueDateFixed = null;\n course.flagDueDateMethod = 1;\n course.dueDateDaysFromValue = batchEditForm.dueDateDaysFromValue;\n course.dueDateDaysFromKey = batchEditForm.dueDateDaysFromKey;\n }\n\n if (batchEditForm.dueDateFixedStatus === true &&\n typeof batchEditForm.dueDateFixed !== 'undefined' &&\n batchEditForm.dueDateFixed !== null && batchEditForm.dueDateFixed.moment !== null) {\n course.flagDueDateMethod = 0;\n course.dueDateFixed = dateUtil.formatDate(batchEditForm.dueDateFixed.moment.format());\n course.dueDateDaysFromValue = null;\n course.dueDateDaysFromKey = \"none\";\n }\n });\n };\n\n $scope.toggleDatesSelectionModal_01 = function() {\n\n if ($scope.batchEditForm.dueDateFixedStatus === true) {\n $scope.isEditableModal_01 = true;\n } else {\n $scope.isEditableModal_01 = false;\n }\n };\n\n $scope.toggleDatesSelectionModal_02 = function() {\n\n if ($scope.batchEditForm.dueDateDaysStatus === true) {\n $scope.isEditableModal_02 = true;\n } else {\n $scope.isEditableModal_02 = false;\n }\n };\n\n $scope.ruleUpdateError = {};\n $scope.ruleUpdateError.error = errorDisplayerUtil.create();\n $scope.ruleUpdateIsLoading = false;\n\n $scope.updateRule = function () {\n $scope.ruleUpdateIsLoading = true;\n $scope.ruleUpdateError.error.reset();\n $scope.resetHistory();\n\n //if groupStructure is not defined, get it\n if (typeof $scope.groupStructure === 'undefined' || $scope.groupStructure === null) {\n\n var groupSCall = GroupsService.peopleGroupStructure($scope.rule.groupId);\n groupSCall.then(function (success) {\n $scope.groupStructure = _this.reFormattingPeopleGroupStructure(GroupsService.secondaryFormatGroupStructure_groupStructure(success));\n //once we have the groupStructure, call the api's to update the People Group and Assignments\n _this.updatePeopleandAssignments();\n }, function (failure) {\n _this.fail(failure);\n });\n\n } else {\n _this.updatePeopleandAssignments();\n }\n\n\n };\n\n _this.updatePeopleandAssignments = function () {\n\n var isAssignOnDateValid = true;\n _.each($scope.rows, function (row) {\n if (typeof row.assignOnDate !== \"undefined\") {\n if (row.course.productType === \"Document\") {\n row.assignOnDate = $scope.rule.startDate;\n }\n else if (row.assignOnDate === null) {\n isAssignOnDateValid = false;\n }\n else if ($scope.rule.startDate.moment > row.assignOnDate.moment || ($scope.rule.endDate !== null && $scope.rule.endDate.moment < row.assignOnDate.moment)) {\n isAssignOnDateValid = false;\n }\n }\n });\n\n if (isAssignOnDateValid === false) {\n $scope.ruleUpdateIsLoading = false;\n var errorCode = '';\n var message = \"'Assign On' dates must be between the start and end date of the rule.\";\n $scope.ruleUpdateError.error.setError(errorCode, message);\n } else {\n var all = [];\n //again, this all depends on if we have the people group object to save and verify\n if (typeof $scope.groupStructure !== 'undefined' && $scope.groupStructure !== null) {\n\n var peoplePromise = _this.updatePeopleGroup(false);\n if (typeof peoplePromise !== 'undefined' && peoplePromise !== null)\n all.push(peoplePromise);\n\n //Can save the rule without any courses in it currently\n if (typeof $scope.rows !== 'undefined' && $scope.rows !== null) {\n var assignmentsPromise = _this.updateAssignments();\n if (typeof assignmentsPromise !== 'undefined' && assignmentsPromise !== null) {\n all.push(assignmentsPromise);\n }\n }\n\n var deferred = $q.defer();\n\n $q.all(all).then(function (success) {\n //in success, we know that people group and assignments were added without error\n //now we can call the rule update\n _this.updateRuleGeneralCall();\n }, function (failure) {\n _this.fail(failure);\n });\n }\n }\n };\n\n _this.updateRuleGeneralCall = function () {\n var generalPromise = _this.updateGeneralInfo();\n generalPromise.then(function (success) {\n $scope.ruleUpdateIsLoading = false;\n $scope.rule = success;\n $scope.ruleEditTabs.selectedTab = 0;\n }, function (failure) {\n _this.fail(failure);\n });\n };\n\n _this.fail = function (failure) {\n $scope.ruleUpdateIsLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.ruleUpdateError.error.setError(errorCode, message);\n };\n\n _this.updateGeneralInfo = function() {\n var status = 'update';\n var data = angular.copy($scope.rule);\n var updateRule_General = RulesService.ruleGeneralCall(data, status);\n\n return updateRule_General;\n };\n\n _this.updatePeopleGroup = function(create) {\n var status = \"update\";\n // Dont want to do 2 way binding with UI during the call\n var data = angular.copy($scope.groupStructure);\n // Flag to say that PG created from rules tab.\n data.IsRuleCaller = true;\n data.IsRulePreview = create;\n data.name=\" \";\n var groupStructurePromise;\n\n if (typeof data !== 'undefined' && typeof data !== null) {\n if (data.groupId === 'undefined' && data.groupId === null)\n data.groupId = $scope.rule.groupId;\n groupStructurePromise = GroupsService.savePeopleGroup(data, status);\n }\n\n\n return groupStructurePromise;\n };\n\n _this.updateAssignments = function() {\n var data = angular.copy($scope.rows);\n var id = _this.params.param.split('/')[0];\n\n var assignmentsPromise;\n if (data !== undefined && data !== 'null')\n assignmentsPromise = RulesService.updateRuleAssignments(id, data);\n\n return assignmentsPromise;\n };\n\n $scope.previewPeopleError = {};\n $scope.previewPeopleError.error = errorDisplayerUtil.create();\n $scope.previewPeopleIsLoading = false;\n\n $scope.previewPeople = function() {\n $scope.previewPeopleError.error.reset();\n $scope.previewPeopleIsLoading = true;\n var data = $scope.groupStructure;\n\n var previewPeoplePromise = GroupsService.getPeoplePreview(data);\n previewPeoplePromise.then(function(success) {\n $scope.previewPeopleIsLoading = false;\n $scope.showPreview = true;\n //$scope.people_rows = GroupsService.mapUsersForPreview(success);\n $scope.people_rows = success;\n\n }, function(failure) {\n $scope.previewPeopleIsLoading = false;\n $scope.showPreview = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.previewPeopleError.error.setError(errorCode, message);\n });\n\n };\n\n $scope.invalidPeopleError = {};\n $scope.invalidPeopleError.error = errorDisplayerUtil.create();\n $scope.invalidPeopleIsLoading = false;\n\n $scope.$on('invalidPeopleModalOpen', function (evt, params) {\n if (params[1] === \"Warning\") {\n if (!$scope.tripleOr) {\n $scope.tripleOr = true;\n $(\"#invalidPeopleModal\").modal();\n }\n }\n\n message = params[0];\n $scope.invalidPeopleError.error.reset();\n $scope.invalidPeopleIsLoading = true;\n $scope.invalidPeopleIsLoading = false;\n var errorCode = 0;\n $scope.invalidTitle = params[1];\n $scope.invalidPeopleError.error.setError(errorCode, message);\n\n });\n\n\n // NEEDS MORE REFACTORING IN SOME PLACES \n // WILL TAKE CARE AS MAKING PROGRESS TODO-@MANI\n\n $scope.activeRuleNodeClick = function() {\n if (typeof _this.params.name !== 'undefined' && _this.params.name !== null && _this.params.name === \"home\") {\n $scope.rows = _this.filterRows('active');\n } else {\n $location.path('rules/home');\n }\n };\n\n $scope.inactiveRuleNodeClick = function() {\n if (typeof _this.params.name !== 'undefined' && _this.params.name !== null && _this.params.name === \"home\") {\n $scope.rows = _this.filterRows('closed');\n } else {\n $location.path('rules/home');\n }\n };\n\n $scope.draftRuleNodeClick = function() {\n if (typeof _this.params.name !== 'undefined' && _this.params.name !== null && _this.params.name === \"home\") {\n $scope.rows = _this.filterRows('draft');\n } else {\n $location.path('rules/home');\n }\n };\n\n $scope.templateRuleNodeClick = function() {\n if (typeof _this.params.name !== 'undefined' && _this.params.name !== null && _this.params.name === \"home\") {\n $scope.rows = _this.filterRows('template');\n } else {\n $location.path('rules/home');\n }\n };\n\n _this.filterRows = function(status) {\n return _.filter(_this.allRulesData, function(row) {\n return row.status === status;\n });\n };\n\n $scope.copyRuleError = {};\n $scope.copyRuleError.error = errorDisplayerUtil.create();\n $scope.copyRuleIsLoading = false;\n\n $scope.copyRuleModal = function() {\n $scope.copyRuleIsLoading = true;\n $scope.copyRuleError.error.reset();\n var selectedRules = RulesService.formatRuleForCopy($filter('filter')($scope.rows, { select: true }));\n if (selectedRules.length > 0) {\n $scope.copyRuleIsLoading = false;\n $scope.showCopyTable = true;\n $scope.rows_In_CopyModal = selectedRules;\n } else {\n $scope.copyRuleIsLoading = false;\n $scope.showCopyTable = false;\n var errorCode = \"0\";\n var message = \"There are no rules selected for copy!\";\n $scope.copyRuleError.error.setError(errorCode, message);\n }\n };\n\n $scope.copyRule = function() {\n $scope.copyRuleError.error.reset();\n $scope.copyRuleIsLoading = true;\n var data = angular.copy($scope.rows_In_CopyModal);\n\n for (var i in data) {\n if (data[i].isAddYear && data[i].newEndDate !== null) {\n //since we do not display newEndDate on UI, this condition will never be hit. (unless we default enddate to some value.)\n //data[i].newEndDate = dateUtil.formatDate(data[i].newEndDate.moment.add(1, 'year'));\n }\n }\n\n console.log($scope.rows_In_CopyModal);\n var copyRulePromise = RulesService.saveCopiedRule(data);\n copyRulePromise.then(function(success) {\n $scope.copyRuleIsLoading = false;\n $scope.showCopyTable = true;\n jQuery('#copyRuleModal').modal('hide').on('hidden.bs.modal', $route.reload);\n }, function(failure) {\n $scope.copyRuleIsLoading = false;\n $scope.showCopyTable = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.copyRuleError.error.setError(errorCode, message);\n\n });\n };\n\n // Used in admin.editRule_People.html template to submit the export preview form.\n // This is because the export preview needs to bypass angular's $http service to return a downloaded file\n // so this posts the form to the server directly from the template instead of going through the group service.\n $scope.exportPeoplePreviewFormSubmit = function () {\n var data = $scope.groupStructure;\n var dataCopy = angular.copy(data);\n $scope.peopleGroupCriteriaToSend = JSON.stringify(GroupsService.formatGroupDataToSend(dataCopy));\n $scope.currentTimezone = moment.tz.guess();\n };\n\n\n // NEEDS MORE REFACTORING IN SOME PLACES \n // WILL TAKE CARE AS MAKING PROGRESS TODO-@MANI\n\n /* ************************ Inactive Rules Tree View Actions ******************* */\n\n // Initialize the data to an empty array until we load the rules tress\n $scope.inactiveRuleData = [{ 'name': 'Closed', 'nodes': [] }];\n $scope.inactiveRuleOptions = {};\n $scope.inactiveRuleOptions.initiallyOpened = false;\n $scope.inactiveRuleOptions.rootNodeIsTopLevel = false;\n $scope.inactiveRuleOptions.canDrillDown = false;\n $scope.inactiveRuleTreeIsLoading = true;\n $scope.inactiveRuleNowHidden = true;\n $scope.inactiveRuleTitle = \"Closed\";\n\n $scope.inactiveRuleError = {};\n $scope.inactiveRuleError.error = errorDisplayerUtil.create();\n\n /* ************************ Active Rules Tree View Actions ******************* */\n\n $scope.draftRuleData = [{ 'name': 'Drafts', 'nodes': [] }];\n $scope.draftRuleOptions = {};\n $scope.draftRuleOptions.initiallyOpened = false;\n $scope.draftRuleOptions.rootNodeIsTopLevel = false;\n $scope.draftRuleOptions.canDrillDown = false;\n $scope.draftRuleTreeIsLoading = true;\n $scope.draftRuleNowHidden = true;\n $scope.draftRuleTitle = \"Drafts\";\n\n $scope.draftRuleRuleError = {};\n $scope.draftRuleRuleError.error = errorDisplayerUtil.create();\n\n /* ************************ Active Rules Tree View Actions ******************* */\n\n // Initialize the data to an empty array until we load the rules tress\n $scope.templateRuleData = [{ 'name': 'Templates', 'nodes': [] }];\n $scope.templateRuleOptions = {};\n $scope.templateRuleOptions.initiallyOpened = false;\n $scope.templateRuleOptions.rootNodeIsTopLevel = false;\n $scope.templateRuleOptions.canDrillDown = false;\n $scope.templateRuleTreeIsLoading = true;\n $scope.templateRuleNowHidden = true;\n $scope.templateRuleTitle = \"Templates\";\n\n $scope.templateRuleError = {};\n $scope.templateRuleError.error = errorDisplayerUtil.create();\n\n /* This makes coloumns of a table sortables */\n $scope.propertyName = 'name';\n $scope.reverse = false;\n\n $scope.requiredOptions = [{\n \"name\": \"Yes\",\n \"value\": true\n }, {\n \"name\": \"No\",\n \"value\": false\n }];\n\n $scope.dueDateOptions = [{\n \"name\": \"Select\",\n \"value\": \"none\"\n }, {\n \"name\": \"Hire Date\",\n \"value\": \"hireDate\"\n }, {\n \"name\": \"Assigned On Date\",\n \"value\": \"assignedOnDate\"\n }];\n\n $scope.dueDateMethods = [{\n \"name\": \"Due Date\",\n \"value\": 0\n }, {\n \"name\": \"Calculated Due Date\",\n \"value\": 1\n }];\n\n /* This will check all the rows in the table in that instance */\n /// TO DO //\n $scope.selectAll = {};\n $scope.checkAll = function() {\n _.each($scope.rows, function(row) {\n row.select = $scope.selectAll.checked;\n });\n };\n\n $scope.pushInArray = function (user) {\n if ($scope.selectAll.checked) {\n $scope.selectAll.checked = false;\n\n var index = _.findIndex($scope.selectUsers, { \"id\": user.id });\n\n if (user.select) {\n if (index === -1) {\n $scope.selectedUsers.push(angular.copy(user));\n }\n } else {\n if (index !== -1)\n $scope.selectedUsers.splice(index, 1);\n }\n }\n };\n\n $scope.sortBy = function(propertyName) {\n $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;\n $scope.propertyName = propertyName;\n };\n\n $scope.ruleCreate_Step = function(nextTabName) {\n var nextTabName1 = nextTabName;\n _this['create_' + nextTabName1 + 'Action']();\n };\n\n $scope.treeOptions = {\n nodeChildren: 'nodes',\n templateUrl: 'tree.html',\n injectClasses: {\n ul: \"a1\",\n li: \"a2\",\n liSelected: \"a7\",\n iExpanded: \"a3\",\n iCollapsed: \"a4\",\n iLeaf: \"a5\",\n label: \"a6\",\n labelSelected: \"a8\"\n }\n };\n\n $scope.setStartTime = function (dateObj) {\n if (typeof dateObj !== \"undefined\" && dateObj !== null &&\n typeof dateObj.moment !== \"undefined\" && _.isObject(dateObj.moment)) {\n if ((typeof dateObj.displayTime === \"undefined\" || dateObj.displayTime === null)) {\n var portalStartTime = dateUtil.setPortalStartTime(dateObj.moment.toDate());\n dateObj = dateUtil.formatDate(portalStartTime);\n } else {\n dateObj = dateUtil.formatDate(dateObj.moment.toDate(), dateObj.displayTime);\n }\n _this.getAssigmentsForDateValidation();\n return dateObj;\n } else {\n return null;\n }\n };\n\n $scope.setEndTime = function (dateObj) {\n if (typeof dateObj !== \"undefined\" && dateObj !== null &&\n typeof dateObj.moment !== \"undefined\" && _.isObject(dateObj.moment)) {\n if ((typeof dateObj.displayTime === \"undefined\" || dateObj.displayTime === null)) {\n var portalEndTime = dateUtil.setPortalEndTime(dateObj.moment.toDate());\n dateObj = dateUtil.formatDate(portalEndTime);\n } else {\n dateObj = dateUtil.formatDate(dateObj.moment.toDate(), dateObj.displayTime);\n }\n _this.getAssigmentsForDateValidation();\n return dateObj;\n } else {\n return null;\n }\n };\n\n _this.getAssigmentsForDateValidation = function () {\n //If changing the start date or end date, need to make sure that the \n //courses with their assign on date is in the scope so that we can do the date validation for assign on\n if ($scope.rows === undefined && _this.params.name === 'edit') {\n var ruleId = _this.params.param.split('/')[0];\n _this.getRuleAssignments(ruleId);\n }\n };\n\n\n // SLY-5342 Sub domain management for rules admin tab\n $scope.isSubDomainAdmin = UsersService.isSubDomainAdmin();\n $scope.taDomains = UsersService.taDomains();\n $scope.activeDomain = UsersService.activeDomain();\n $scope.switchDomains = {};\n $scope.switchDomains.error = errorDisplayerUtil.create();\n\n $scope.onActiveDomainChanged = function (activeDomain, oldDomain) {\n var switchProfilePromise = UsersService.switchProfile(activeDomain.id);\n switchProfilePromise.then(function (success) {\n location.reload();\n }, function (failure) {\n $scope.switchDomains.error.setError(failure.StatusCode, failure.ErrorMessage);\n jQuery(\"#switchDomainsError\").show();\n setTimeout(function () {\n $scope.switchDomains.error.reset();\n jQuery(\"#switchDomainsError\").hide();\n }, 2000);\n });\n };\n\n /******************START - Rule History ***************************************/\n \n $scope.showGeneralHistory = false;\n $scope.generalHistory = [];\n $scope.showCourseHistory = false;\n $scope.courseHistory = [];\n $scope.showCourseDateHistory = false;\n $scope.courseDateHistory = [];\n $scope.showPeopleGroupHistory = false;\n $scope.peopleGroupHistory = [];\n $scope.home = {};\n $scope.home.page = 1;\n $scope.home.limit = 10;\n $scope.home.total = 0;\n $scope.home.maxVisiblePages = 10;\n\n $scope.home.nextPage = function (ruleStep) {\n\n switch (ruleStep) {\n case 'RuleGeneralInformation':\n $scope.toggleHistory(true, \"RuleGeneralInformation\");\n break;\n case 'RuleCourse':\n $scope.toggleHistory(true, \"RuleCourse\");\n break;\n case 'RuleCourseDates':\n $scope.toggleHistory(true, \"RuleCourseDates\");\n break;\n case 'RulePeopleGroup':\n $scope.toggleHistory(true, \"RulePeopleGroup\");\n break;\n }\n\n };\n\n _this.calculatePages = function (totalCount) {\n $scope.home.total = totalCount;\n };\n\n\n $scope.toggleHistory = function (showHistory, ruleStep) {\n var ruleId = _this.params.param.split('/')[0];\n if (ruleStep === 'RulePeopleGroup') {\n //People Group gets auditing by the groupID\n ruleId = $scope.rule.groupId;\n }\n\n switch (ruleStep) {\n case 'RuleGeneralInformation':\n $scope.showGeneralHistory = showHistory;\n break;\n case 'RuleCourse':\n $scope.showCourseHistory = showHistory;\n break;\n case 'RuleCourseDates':\n $scope.showCourseDateHistory = showHistory;\n break;\n case 'RulePeopleGroup':\n $scope.showPeopleGroupHistory = showHistory;\n break;\n }\n \n if (showHistory && ((ruleStep === 'RuleGeneralInformation' ) || (ruleStep === 'RuleCourse' ) || (ruleStep === 'RuleCourseDates' ) || (ruleStep === 'RulePeopleGroup'))) {\n \n $scope.loadingHistory = true;\n\n var hist = RulesService.getRuleHistoryByStep(ruleId, ruleStep, $scope.home.page, $scope.home.limit);\n hist.then(function (success) {\n\n $scope.loadingHistory = false;\n switch (ruleStep) {\n case 'RuleGeneralInformation':\n $scope.generalHistory = success;\n _this.calculatePages(success[0].totalRecords);\n break;\n case 'RuleCourse':\n $scope.courseHistory = success;\n _this.calculatePages(success[0].totalRecords);\n break;\n case 'RuleCourseDates':\n $scope.courseDateHistory = success;\n _this.calculatePages(success[0].totalRecords);\n break;\n case 'RulePeopleGroup':\n $scope.peopleGroupHistory = success;\n _this.calculatePages(success[0].totalRecords);\n break;\n }\n\n\n }, function (failure) {\n $scope.loadingHistory = false;\n $scope.home.total = 0;\n\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.editRulePeopleError.error.setError(errorCode, message);\n });\n\n }\n\n };\n\n $scope.resetHistory = function () {\n $scope.showGeneralHistory = false;\n $scope.generalHistory = [];\n $scope.showCourseHistory = false;\n $scope.courseHistory = [];\n $scope.showCourseDateHistory = false;\n $scope.courseDateHistory = [];\n $scope.showPeopleGroupHistory = false;\n $scope.peopleGroupHistory = [];\n };\n \n /******************END - Rule History ***************************************/\n\n };\n }\n]);\n//","/* This page is for various components related to the premiumAdmin */\napp.factory('Users_AdminOverride', ['$filter', '$http', '$q', '$sce', '$injector', '$route', '$timeout', '$location', '$httpParamSerializer', '$interval', 'dateUtil', 'AssignmentsService', 'BreadcrumbsService', 'CountriesService', 'CoursesService', 'GroupsService', 'JobsService', 'OfferingsService', 'OrganizationsService', 'StatesService', 'TimezoneService', 'TranscriptsService', 'UsersService', 'errorDisplayerUtil', 'OrgFunctions', 'LocationsService', 'PeopleGroupFunctions', 'TreeHelpers', 'sortService', 'queuePollingInterval', 'SettingsService',\n function($filter,\n $http,\n $q,\n $sce,\n $injector,\n $route,\n $timeout,\n $location,\n $httpParamSerializer,\n $interval,\n dateUtil,\n AssignmentsService,\n BreadcrumbsService,\n CountriesService,\n CoursesService,\n GroupsService,\n JobsService,\n OfferingsService,\n OrganizationsService,\n StatesService,\n TimezoneService,\n TranscriptsService,\n UsersService,\n errorDisplayerUtil,\n OrgFunctions,\n LocationsService,\n PeopleGroupFunctions,\n TreeHelpers,\n sortService,\n queuePollingInterval,\n SettingsService) {\n return function($scope) {\n var _this = this;\n\n /* Load the TA Content data */\n $scope.rows = Array();\n $scope.rowsAreLoading = true;\n\n UsersService.setHomeRole();\n\n /* Training Insights access determined by the organization settings */\n var sett = SettingsService.getSettings().then(function (success) {\n $scope.showTrainingInsights = SettingsService.isTrainingInsightsEnabled();\n $scope.showCareerPath = SettingsService.isCareerPathEnabled();\n });\n\n\n /* This will hide the breadcrumbs and search form on the top right of header */\n $scope.defaultHeader = true;\n $scope.hideCatalogSearch = true;\n\n /* This will make the navigation tab active on certain page */\n $scope.activeTab = 'tab-active-class';\n\n /*This will route users to the appropiate user manual based on active tab*/\n $scope.userManualHref = 'https://ld-connect.bai.org/learning-manager/training-administrator-user-manual/#People';\n\n /* This will help you to route back to home */\n _this.homeRoute = function() {\n $location.url(\"users/home\");\n };\n\n /**\n * All controller-level scoped variables should be attached to general for cross-template communication\n */\n $scope.general = {};\n $scope.general.peopleSearch = null;\n\n $scope.general.filterBySearch = function () {\n //reset paging - so as to display first page on clicking simpleSearch irrespective of where the user is currently\n $scope.home.page = 1;\n var searchTerm = $scope.general.search;\n\n if ($scope.currentview !== 'People Groups') {\n var advSearch = {};\n advSearch.keyword = searchTerm;\n _this.sendAdvancedSearchQueryToServerAndDisplayUsers(advSearch);\n } else {\n var pgrps = (_this.originalPeopleGroups);\n if (searchTerm === \"\") {\n $scope.pplgrpRows = pgrps;\n } else {\n var filtered = $filter('filter')(pgrps, function (row) {\n return (row.groupName.toLowerCase().indexOf(searchTerm.toLowerCase() || '') !== -1 ||\n row.id === parseInt(searchTerm));\n });\n $scope.pplgrpRows = filtered;\n }\n }\n\n };\n\n /* ************************ Organization Tree View Actions ******************* */\n /* The below actions related to Organization Tree */\n /* This gets called by the UsersController\n * Consider it the entry point of the TA page.\n */\n\n // Initialize the data to an empty array until we load the organizations\n $scope.orgTree = [];\n $scope.OrgData = [];\n $scope.OrgOptions = {};\n $scope.OrgOptions.initiallyOpened = false;\n $scope.OrgOptions.rootNodeIsTopLevel = false;\n\n /* This veriable is initialized here only to make sure it exists.\n * Otherwise, when you type stuff into the treeFilter bar, it won't search the tree\n */\n $scope.OrgTreeFilter = \"\";\n $scope.OrgTreeIsLoading = true;\n $scope.PeopleTreeIsLoading = true;\n $scope.managerTreeIsLoading = true;\n\n $scope.listFilter = \"\"; // stores value of list filter bar\n\n $scope.home = {};\n $scope.home.limit = 50;\n $scope.home.typeaheadMinLength = 2;\n $scope.home.typeaheadWaitTime = 800; //timeout before Async calls are made after the last key stroke - in 'milliseconds'\n\n $scope.isGroupQueued = false;\n $scope.selectedGroupName = null;\n $scope.currentview = \"\";\n $scope.homeAction = function () {\n $scope.currentview = \"home\";\n $scope.home.page = 1;\n $scope.home.total = 0;\n $scope.home.maxVisiblePages = 10;\n //$scope.home.ItemsPerPage = 100;\n $scope.homeTemplate = 'app/templates/users/home/admin.html';\n $scope.peopleSelected = $scope.orgTree[0];\n /* If we try to run advanced search from the edit page\n * it doesn't work because the code for displaying users\n * is on the homepage. When a user runs advances search\n * they get redirected here. */\n var advancedSearchParams = angular.copy($route.current.params);\n delete advancedSearchParams.controller;\n delete advancedSearchParams.name;\n\n if (_.keys(advancedSearchParams).length === 2 && _.has(advancedSearchParams, \"group_id\") && _.has(advancedSearchParams, \"group_name\")) {\n $scope.selectedGroupName = advancedSearchParams.group_name;\n $scope.nodeSource = \"People Groups\";\n $scope.peopleSelected = GroupsService.getCurrentNode() === \"inactive\" ? $scope.PeopleData[0].nodes[1] : $scope.PeopleData[0].nodes[0];\n $scope.peopleExpanded = [$scope.PeopleData[0]];\n\n // Cancel interval if there is one\n if (queuePollingInterval.peopleGroupPollingInterval !== null) {\n $interval.cancel(queuePollingInterval.peopleGroupPollingInterval);\n }\n _this.groupId = advancedSearchParams.group_id;\n _this.peopleList = null;\n\n _this.peopleGroupUsers(_this.groupId);\n return;\n }\n\n var runAdvancedSearch = false;\n var advancedSearchStruct = {};\n for (var property in advancedSearchParams) {\n if (advancedSearchParams.hasOwnProperty(property)) {\n advancedSearchStruct[property] = advancedSearchParams[property];\n runAdvancedSearch = true;\n }\n }\n /* Certain parameters to the homepage shouldn't trigger\n * an advanced search like welcome=true. When welcome=true\n * we're just displaying a welcome video */\n if (advancedSearchStruct.welcome) {\n runAdvancedSearch = false;\n }\n\n if (runAdvancedSearch) {\n /* only get advanced search results*/\n _this.sendAdvancedSearchQueryToServerAndDisplayUsers(advancedSearchStruct);\n\n } else {\n _this.fetchAllUsersPaged();\n }\n\n };\n\n $scope.checkSearchisEmpty = function() {\n var searchisEmpty = angular.equals({}, $scope.advancedSearchStruct);\n\n if (!searchisEmpty) {\n searchisEmpty = true;\n for (var property in $scope.advancedSearchStruct) {\n if ($scope.advancedSearchStruct.hasOwnProperty(property)) {\n if ($scope.advancedSearchStruct[property] !== null && $scope.advancedSearchStruct[property] !== \"\") {\n searchisEmpty = false;\n break;\n }\n }\n }\n }\n\n return searchisEmpty;\n };\n\n $scope.home.nextPage = function () {\n $scope.selectAll.checked = false;\n var isEmpty = angular.equals({}, _this.advancedSearchStructForPaging);\n\n if ($scope.nodeSource === 'People Groups') {\n _this.peopleList.options.currentPage = $scope.home.page;\n _this.peopleGroupUsers(_this.groupId);\n }\n\n else if (isEmpty || typeof _this.advancedSearchStructForPaging === 'undefined') {\n _this.fetchAllUsersPaged();\n }\n else {\n _this.sendAdvancedSearchQueryToServerAndDisplayUsers(_this.advancedSearchStructForPaging);\n }\n };\n\n $scope.OrgTreeTitle = \"Organizations\";\n $scope.orgTreeError = {};\n $scope.orgTreeError.error = errorDisplayerUtil.create();\n $scope.predicate = { hasActiveUsersAssigned: true };\n _this.organizationCta = function() {\n $scope.orgTreeError.error.reset();\n var orgTreePromiseGroups = OrganizationsService.getOrgTree();\n return orgTreePromiseGroups.then(\n function(orgTreeData) {\n TreeHelpers.setPropertyOnAllNodes(orgTreeData, 'lockIcon', true);\n\n $scope.OrgData = [\n {\n 'name': 'Organizations',\n 'nodes': [orgTreeData[0]]\n }\n ];\n\n $scope.OrgTreeIsLoading = false;\n },\n function(failure) {\n $scope.OrgTreeIsLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n console.log(failure);\n $scope.orgTreeError.error.setError(errorCode, message);\n });\n };\n\n //the below function is used for org type-aheads data. in peopleBatchEdit, AdvancedSearch, Create and Edit User\n // Also used to populate the TA picker multi-select\n _this.getOrganizationHierarchyData = function () {\n var orgDataPromise = OrganizationsService.getOrganizationHierarchy();\n return orgDataPromise.then(function(success) {\n $scope.orgArray = [];\n $scope.domainsArray = [];\n $scope.orgCutoff = 100; // cutoff point for dropdown vs uib-typeahead\n for (var i = 0; i < success.length; i++) {\n var org = success[i];\n var nameAndOrgObjOnly = {};\n nameAndOrgObjOnly.pathToOrg = org.pathToOrg;\n nameAndOrgObjOnly.name = org.name;\n nameAndOrgObjOnly.id = org.id;\n //LMS - 6623 Added a Property to use this has filter in Template\n nameAndOrgObjOnly.enabled = org.enabled;\n if (org.parentId === 0)\n {\n $scope.domainsArray.push(org);\n }\n $scope.orgArray.push(nameAndOrgObjOnly);\n }\n\n if ($scope.isSubDomainAdmin === false && $scope.domainsArray && $scope.domainsArray.length > 1) {\n $scope.domainsArray.unshift({ id: UsersService.topLevelOrganizationId(), name: \"Entire Portal\" });\n }\n });\n };\n\n //the below function is used for positions type-aheads data. in peopleBatchEdit, AdvancedSearch, Create and Edit User\n _this.getPositionsData = function () {\n var positionsTreePromise = JobsService.getAllJobs();\n positionsTreePromise.then(\n function (success) {\n $scope.jobs = [];\n for (var i = 0; i < success.length; i++) {\n if (success[i].isActive === true) {\n $scope.jobs.push(success[i]);\n var index = $scope.jobs.length - 1;\n $scope.jobs[index].text = $scope.jobs[index].name;\n }\n }\n });\n };\n\n $scope.peopleGroupData = [];\n $scope.PeopleOptions = {};\n $scope.PeopleOptions.initiallyOpened = false;\n $scope.PeopleOptions.showLocks = false;\n $scope.PeopleOptions.editPencil = true;\n $scope.PeopleOptions.nodeClick = function(node) {\n var peopleGroupId = node.id;\n $location.path('users/peoplegroup/' + peopleGroupId + '/');\n };\n\n $scope.PeopleTreeTitle = \"People Groups\";\n $scope.peopleGroupsError = {};\n $scope.peopleGroupsError.error = errorDisplayerUtil.create();\n\n $scope.peopleGroupsLoading = true;\n\n _this.getAllPeopleGroups = function(areActive) {\n $scope.peopleGroupsError.error.reset();\n\n var peopleGroupsTreePromise = GroupsService.getPeopleGroups(areActive);\n\n return peopleGroupsTreePromise.then(function (success) {\n $scope.peopleGroupsLoading = false;\n if (success.groups === null || success.groups.length < 1) {\n $scope.peopleGroupsError.error.setError(\"\", \"There are no \" + (areActive === true ? \"Active\" : \"Inactive\") + \" PeopleGroups to display\");\n } else {\n _this.originalPeopleGroups = success.groups;\n\n _.each(_this.originalPeopleGroups, function (pg) {\n if (pg.isGroupQueued === true) {\n $scope.peoplegroups.processQueue.push(pg.id);\n }\n });\n\n $scope.pplgrpRows = _this.originalPeopleGroups;\n }\n if (queuePollingInterval.peopleGroupPollingInterval !== null) {\n $interval.cancel(queuePollingInterval.peopleGroupPollingInterval);\n }\n\n if ($scope.peoplegroups.processQueue.length > 0) {\n queuePollingInterval.peopleGroupPollingInterval = $interval(_this.peopleGroupQueueStatusChecker, 20000);\n }\n\n }, function(failure) {\n $scope.peopleGroupsLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.peopleGroupsError.error.setError(errorCode, message);\n });\n };\n\n /* Manager tree stuff */\n $scope.managerTreeTitle = \"Managers\";\n $scope.managerTreeError = {};\n $scope.managerTreeError.error = errorDisplayerUtil.create();\n\n $scope.managerData = [];\n $scope.managerOptions = {};\n $scope.managerOptions.initiallyOpened = false;\n $scope.managerOptions.rootNodeIsTopLevel = false;\n $scope.managerOptions.showLocks = false;\n\n _this.fetchAllUsersPaged = function() {\n $scope.rowsAreLoading = true;\n var pagingAttributes = {};\n\n var currentPage = $scope.home.page;\n pagingAttributes.pageNumber = currentPage;\n pagingAttributes.pageSize = $scope.home.limit;\n pagingAttributes.sortBy = $scope.propertyName;\n pagingAttributes.sortAscending = !$scope.reverse;\n\n var allUsersPromise = UsersService.advancedSearch(pagingAttributes);\n return allUsersPromise.then(function(success) {\n $scope.rowsAreLoading = false;\n\n var activeUsers = _this.activeUsers(success);\n\n /**\n * Reset page size and info for paginator\n */\n _this.calculatePages(activeUsers[0].totalCount);\n\n \n\n $scope.rows = activeUsers;\n _this.setRowSelection($scope.rows);\n\n }, function(failure) {\n $scope.rowsAreLoading = false;\n $scope.rows = [];\n $scope.home.total = 0;\n\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.userTableError.error.setError(errorCode, message);\n });\n\n };\n\n $scope.managerNodeClick = function(node) {\n\n //Clear previously selected nodes in different trees\n var selectedNodes = document.getElementsByClassName(\"tree-selected\");\n Array.prototype.forEach.call(selectedNodes, function(x) {\n $(x).removeClass(\"tree-selected\");\n });\n\n var managerAttribute = {};\n managerAttribute.managerId = node.id;\n $scope.nodeSource = 'Managers';\n // Cancel interval if there is one\n if (queuePollingInterval.peopleGroupPollingInterval !== null) {\n $interval.cancel(queuePollingInterval.peopleGroupPollingInterval);\n }\n $scope.home.page = 1;\n _this.sendAdvancedSearchQueryToServerAndDisplayUsers(managerAttribute);\n };\n\n // Use this method to return list of active users for portal\n _this.activeUsers = function(users) {\n var output = $filter('filter')(users, function(user) {\n if (typeof user.endDate === \"undefined\" || user.endDate === null || user.endDate.jsDate > new Date()) {\n return user;\n }\n });\n\n return output;\n };\n\n _this.getuserDataForManagerstree = function() {\n $scope.managerTreeError.error.reset();\n $scope.managerTreeIsLoading = true;\n var managerTreePromise = UsersService.getManagerTree();\n return managerTreePromise.then(function(success) {\n //var filteredManagers = _this.primaryManagersOnly(success);\n $scope.managerData = success;\n $scope.managerTree = [{ 'name': 'Managers', 'nodes': $scope.managerData }];\n $scope.managerTreeIsLoading = false;\n }, function(failure) {\n $scope.managerTreeIsLoading = false;\n $scope.managerTreeError.error.setError(failure.statusCode, failure.errorMessage);\n });\n\n };\n \n _this.primaryManagersOnly = function (mgrarray) {\n\n for (var i = mgrarray.length - 1; i >= 0; i--)\n {\n if (mgrarray[i].hasDirectReports === true) {\n if (mgrarray[i].nodes !== null) {\n _this.primaryManagersOnly(mgrarray[i].nodes);\n } \n } else {\n mgrarray.splice(i, 1);\n }\n }\n\n return mgrarray;\n\n };\n\n\n /* ------------ Advanced Search ------------- */\n $scope.advancedSearch = {};\n\n $scope.showAdvancedSearch = false;\n /* Used for storing advanced search query data\n * Gets passed to UsersService.advancedSearch */\n $scope.advancedSearchStruct = {};\n\n $scope.advancedSearchCta = function () {\n if (typeof $scope.orgArray === 'undefined' || $scope.orgArray === null) {\n _this.getOrganizationHierarchyData();\n }\n\n if (typeof $scope.jobs === 'undefined' || $scope.jobs === null) {\n _this.getPositionsData();\n }\n \n\n $scope.showAdvancedSearch = !$scope.showAdvancedSearch;\n\n if ($scope.showAdvancedSearch && typeof $scope.timezones === 'undefined' || $scope.timezones === null) {\n var timezones = TimezoneService.getAllTimezones();\n timezones.then(function (data) {\n $scope.timezones = data;\n });\n }\n\n /**\n * Get a list of countries\n */\n if ($scope.showAdvancedSearch && typeof $scope.countries === 'undefined' || $scope.countries === null) {\n \n var countries = CountriesService.getLatitudeCountryList(UsersService.getPortalId());\n countries.then(function (success) {\n $scope.countries = success;\n\n $scope.editUser.countriesLoading = false;\n }, function (failure) {\n console.log(failure);\n });\n }\n\n };\n\n _this.clearAdvancedSearch = function() {\n $scope.advancedSearchStruct = {};\n //$scope.advancedSearchStruct.homeAddress = {};\n };\n\n // Initialized the advanced search fields in this case.\n _this.clearAdvancedSearch();\n\n //SLY-4142 used by uib-typeahead control for advanced search form\n $scope.advancedSearch.selectJob = function ($item, $model, $label) {\n $scope.advancedSearchStruct.jobId = $item.id;\n };\n\n //SLY-4141 used by uib-typeahead control for advanced search form\n $scope.advancedSearch.selectOrganization = function ($item, $model, $label) {\n $scope.advancedSearchStruct.organizationId = $item.id;\n };\n\n $scope.advancedSearch.selectManager = function($item, $model, $label) {\n var temp1 = ($scope.advancedSearchStruct.selectedManager);\n\n if (typeof $item === 'undefined' || $item === null) {\n if((typeof temp1 === 'undefined' || temp1 === null) || (angular.isString(temp1) && temp1.trim() === \"\"))\n delete $scope.advancedSearchStruct.managerId;\n } else {\n $scope.advancedSearchStruct.managerId = $item.id;\n }\n };\n\n $scope.advancedSearch.selectAlternateManager = function($item, $model, $label) {\n var temp2 = ($scope.advancedSearchStruct.selectedAltManager);\n\n if (typeof $item === 'undefined' || $item === null) {\n if ((typeof temp2 === 'undefined' || temp2 === null) || (angular.isString(temp2) && temp2.trim() === \"\"))\n delete $scope.advancedSearchStruct.alternateManagerId;\n } else {\n $scope.advancedSearchStruct.alternateManagerId = $item.id;\n }\n \n };\n\n $scope.advancedSearch.toggleTrainingAdministrator = function () {\n if (typeof $scope.advancedSearchStruct.isTa !== 'undefined') {\n //SLY-4214\n delete $scope.advancedSearchStruct.isTa;\n } else {\n //SLY-4214\n // allows for selecting both instrutor and TA\n $scope.advancedSearchStruct.isTa = true;\n }\n };\n\n $scope.advancedSearch.toggleInstructor = function () {\n if (typeof $scope.advancedSearchStruct.isInstructor !== 'undefined') {\n delete $scope.advancedSearchStruct.isInstructor;\n } else {\n $scope.advancedSearchStruct.isInstructor = true;\n }\n };\n\n $scope.runAdvancedSearch = function() {\n // delete the temp advnace search manager objects\n delete $scope.advancedSearchStruct.selectedManager;\n delete $scope.advancedSearchStruct.selectedAltManager;\n\n //delete empty search fields \n for (var property in $scope.advancedSearchStruct) {\n if ($scope.advancedSearchStruct.hasOwnProperty(property)) {\n if ($scope.advancedSearchStruct[property] === null || $scope.advancedSearchStruct[property] === '')\n delete $scope.advancedSearchStruct[property];\n }\n }\n\n //reset paging - so as to display first page on clicking simpleSearch irrespective of where the user is currently\n $scope.home.page = 1;\n $scope.advancedSearchStruct.searchAll = \"true\";\n /* If we're on the edit page, put these parameters\n * as a GET string to /users/home/ where they will be interpreted later\n * and turned into an advanced search query */\n if ($route.current.params.name !== 'home') {\n $location.path('/users/home/').search($scope.advancedSearchStruct);\n } else {\n _this.sendAdvancedSearchQueryToServerAndDisplayUsers($scope.advancedSearchStruct);\n }\n };\n\n _this.sendAdvancedSearchQueryToServerAndDisplayUsers = function(advancedSearchStruct) {\n _this.advancedSearchStructForPaging = {};\n _this.advancedSearchStructForPaging = (advancedSearchStruct);\n\n //SLY-4141 don't send this up.\n if (!_.isEmpty(advancedSearchStruct.pathToOrg)) {\n delete advancedSearchStruct.pathToOrg;\n }\n \n advancedSearchStruct.pageNumber = $scope.home.page;\n advancedSearchStruct.pageSize = $scope.home.limit;\n advancedSearchStruct.sortBy = $scope.propertyName;\n advancedSearchStruct.sortAscending = !$scope.reverse;\n\n var search = UsersService.advancedSearch(advancedSearchStruct);\n\n $scope.rowsAreLoading = true;\n\n $scope.userTableError.error.reset();\n\n $scope.closeAdvancedSearch();\n\n return search.then(function (users) {\n _this.calculatePages(users[0].totalCount);\n \n $scope.rows = users;\n $scope.rowsAreLoading = false;\n _this.setRowSelection($scope.rows);\n }, function(failure) {\n // set the list of users on the left to a blank list\n $scope.rowsAreLoading = false;\n\n $scope.rows = [];\n /* If there was an actual error, display it\n * A 404 doesn't count as an error because\n * it just means no users */\n var errorCode = failure.StatusCode;\n if (errorCode !== 404) {\n var message = failure.ErrorMessage;\n $scope.userTableError.error.setError(errorCode, message);\n }\n });\n };\n\n $scope.closeAdvancedSearch = function() {\n _this.clearAdvancedSearch();\n $scope.showAdvancedSearch = false;\n };\n\n /**\n * Namespacing for the edit user page\n *\n * @type {Object}\n */\n $scope.editUser = {};\n $scope.editUser.error = errorDisplayerUtil.create();\n\n /**\n * Action to handle editing of single users\n *\n * @void\n */\n $scope.editAction = function() {\n var timezones = TimezoneService.getAllTimezones();\n timezones.then(function (data) {\n $scope.timezones = data;\n });\n\n $scope.editUser.isLoading = true;\n $scope.editUser.countriesLoading = true;\n $scope.editUser.error.reset();\n\n /* Used to enable buttons specifically for editing\n * users in admin.manageUserForm.html */\n $scope.editUser.isEditing = true;\n\n $scope.homeTemplate = 'app/templates/users/edit/admin.html';\n\n var id = $route.current.params.param.split('/')[0];\n\n /**\n * Get a list of countries\n */\n var countries = CountriesService.getLatitudeCountryList(UsersService.getPortalId());\n countries.then(function(success) {\n $scope.countries = success;\n\n $scope.editUser.countriesLoading = false;\n }, function(failure) {\n /**\n * @TODO: @sfrohm Figure out what to do for failures, as user will not be editable if there is no country\n * by default\n */\n console.log(failure);\n });\n\n if (typeof $scope.orgArray === 'undefined' || $scope.orgArray === null) {\n _this.getOrganizationHierarchyData().then(function () {\n //execute user get after we retrieve organization data\n $scope.getUserToEdit(id);\n });\n } else { $scope.getUserToEdit(id); }\n\n if (typeof $scope.jobs === 'undefined' || $scope.jobs === null) {\n _this.getPositionsData();\n }\n \n };\n\n $scope.initNewUserTimeZone = function () {\n if (typeof $scope.user.timeZone === 'undefined' || $scope.user.timeZone === null) {\n var portalSettingsPromise = SettingsService.getSettings();\n portalSettingsPromise.then(function (portalSettings) {\n $scope.user.timeZone = portalSettings.timezone.value;\n });\n }\n };\n\n $scope.initNewUserStartDate = function () {\n if (typeof $scope.user.hireDate === 'undefined' || $scope.user.hireDate === null) {\n //LMS-7882 Change start time on 'Start Date' field to 3:00 AM in the Portal Time Zone.\n var startDateTime = dateUtil.setPortalStartTime(new Date());\n $scope.user.hireDate = dateUtil.formatDate(startDateTime);\n }\n };\n\n $scope.getUserToEdit = function (id) {\n var user = UsersService.fetch(id);\n user.then(function (response) {\n $scope.user = response;\n // Get a state list for the user, based on country\n if (typeof $scope.user.homeAddress !== 'undefined' && $scope.user.homeAddress !== null && $scope.user.homeAddress.countryId !== null && parseInt($scope.user.homeAddress.countryId, 10) > 0) {\n $scope.getStates($scope.user.homeAddress.countryId);\n }\n\n if ($scope.user.alternateManagers !== null &&\n Object.keys($scope.user.alternateManagers).length > 0) {\n var alternateManagerId = Object.keys($scope.user.alternateManagers)[0];\n var fullName = $scope.user.alternateManagers[alternateManagerId];\n /* Make a facade object so that we don't have to \n * find the entire user object to prefill the alternate\n * manager form */\n $scope.user.selectedAlternateManager = {};\n $scope.user.selectedAlternateManager.id = alternateManagerId;\n $scope.user.selectedAlternateManager.fullName = fullName;\n $scope.selectAlternateManager($scope.user.selectedAlternateManager);\n }\n \n if ($scope.addUser.isUserTA()) {\n // Top level TA logged in, just set TA to true in UI because user we're editing is a TA of something and top level can see everything\n if (UsersService.isSubDomainAdmin() === false) {\n $scope.addUser.trainingAdministrator = true;\n $scope.addUser.toggleTrainingAdministrator(true);\n }\n // Logged in with a sub TA. Check to make sure user we're editing has TA privileges at our level or at the top before checking TA checkbox\n else {\n if ($scope.user.taRoleOrgIds.indexOf(UsersService.activeDomain().id) !== -1 || $scope.user.taRoleOrgIds.indexOf(UsersService.topLevelOrganizationId()) !== -1) {\n $scope.addUser.trainingAdministrator = true;\n $scope.addUser.toggleTrainingAdministrator(true);\n }\n }\n }\n if (_.contains($scope.user.roles, 'instructor')) {\n $scope.addUser.instructor = true;\n $scope.addUser.toggleInstructor(true);\n }\n\n if ($scope.user.ldConnectAccess) {\n $scope.addUser.ldConnectAccess = true;\n $scope.addUser.toggleLDConnectAccess(true);\n } else {\n $scope.addUser.ldConnectAccess = false;\n $scope.addUser.toggleLDConnectAccess(false);\n }\n\n if ($scope.user.addToTranscript) {\n $scope.addUser.addToTranscript = true;\n $scope.addUser.toggleAddTranscript(true);\n } else {\n $scope.addUser.addToTranscript = false;\n $scope.addUser.toggleAddTranscript(false);\n }\n\n $scope.editUser.isLoading = false;\n $scope.editUser.isActive = UsersService.isUserActive($scope.user);\n $scope.editUser.isInFuture = UsersService.isInFuture($scope.user);\n }, function(failure) {\n $scope.editUser.isLoading = false;\n\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n\n $scope.editUser.error.setError(errorCode, message);\n });\n };\n\n /* Deactivate user stuff */\n $scope.confirmDeactivateUserError = errorDisplayerUtil.create();\n $scope.confirmDeactivateUserLoading = false;\n $scope.confirmDeactivateUser = false;\n\n $scope.deactivateUser = function(userId) {\n $scope.confirmDeactivateUserLoading = true;\n var deactivateUser = UsersService.deactivateUser(userId);\n deactivateUser.then(function(Response) {\n $scope.toggleDeactivateUserTooltip();\n _this.homeRoute();\n }, function(failure) {\n $scope.confirmDeactivateUserLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.confirmDeactivateUserError.setError(errorCode, message);\n });\n };\n\n $scope.toggleDeactivateUserTooltip = function() {\n $scope.confirmDeactivateUser = !$scope.confirmDeactivateUser;\n $scope.confirmDeactivateUserError.reset();\n $scope.confirmDeactivateUserLoading = false;\n };\n\n /* Deactivate user stuff */\n $scope.confirmActivate = {};\n $scope.confirmActivateUserError = errorDisplayerUtil.create();\n $scope.confirmActivate.UserLoading = false;\n $scope.confirmActivateUser = false;\n\n $scope.ActivateUser = function(userId) {\n $scope.confirmDeactivateUserLoading = true;\n var activateUser = UsersService.activateUser(userId);\n activateUser.then(function(Response) {\n _this.homeRoute();\n }, function(failure) {\n $scope.confirmActivateUserLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.confirmActivateUserError.setError(errorCode, message);\n });\n };\n\n $scope.userTableError = {};\n $scope.userTableError.error = errorDisplayerUtil.create();\n $scope.peopleGroupRequestUpdateError = errorDisplayerUtil.create();\n\n //Save user warning\n $scope.confirmSaveUser = false;\n\n $scope.toggleSaveUserTooltip = function() {\n $scope.confirmSaveUser = !$scope.confirmSaveUser;\n };\n\n //Cancel user warning\n $scope.confirmCancelUser = false;\n\n $scope.toggleCancelUserTooltip = function() {\n $scope.confirmCancelUser = !$scope.confirmCancelUser;\n };\n\n $scope.clearCancelBool = function() {\n $scope.confirmCancelUser = false;\n };\n\n\n /* This gets called when you click on any node in the Organization tree.\n * Filter the items on the right when you click on the node */\n $scope.OrgNodeClick = function (item) {\n \n //Remove selected class for selected nodes in other trees\n var selectedNodes = document.getElementsByClassName(\"tree-selected\");\n Array.prototype.forEach.call(selectedNodes, function (x) {\n $(x).removeClass(\"tree-selected\");\n });\n \n if (typeof _this.params.name !== 'undefined' && _this.params.name !== null && _this.params.name === \"home\") {\n if (typeof item.id !== 'undefined') {\n\n $scope.selectedNode = item.name;\n $scope.nodeSource = \"Organizations\";\n // Cancel interval if there is one\n if (queuePollingInterval.peopleGroupPollingInterval !== null) {\n $interval.cancel(queuePollingInterval.peopleGroupPollingInterval);\n }\n _this.filterRowsByOrgId(item);\n }\n } else {\n $location.url('users/home');\n }\n };\n\n /* this function clears the rows in the right hand side\n * and filters them by the organization tree */\n _this.filterRowsByOrgId = function(organization) {\n var orgId = typeof organization.id !== 'undefined' ? organization.id : 0;\n \n var searchAttribute = {};\n searchAttribute.organizationId = orgId;\n\t\t\t\t//SLY-4515 limit results based on selections in org tree to that node only.\n searchAttribute.limitToSingleOrg = true;\n $scope.home.page = 1;\n _this.sendAdvancedSearchQueryToServerAndDisplayUsers(searchAttribute);\n };\n\n /* This gets called when you click on any node in the Poeple tree.\n * Filter the items on the right when you click on the node\n */\n $scope.PeopleNodeClick = function (item) {\n\n //Clear previously selected nodes in different trees\n var selectedNodes = document.getElementsByClassName(\"tree-selected\");\n Array.prototype.forEach.call(selectedNodes, function (x) {\n $(x).removeClass(\"tree-selected\");\n });\n\n var urlparam = item.name.toLowerCase() === \"inactive\" ? \"inactive\" : \"active\";\n \n $location.path('/users/peoplegroup/' + urlparam).search({});\n };\n\n _this.peopleGroupUsers = function (groupId) {\n var propertyToSortBy = '';\n $scope.userTableError.error.reset();\n $scope.rows = [];\n $scope.rowsAreLoading = true;\n $scope.initialQueueStatusLoading = true;\n\n if (_this.peopleList !== \"undefined\" && _this.peopleList !== null && _this.peopleList.groupId === groupId && $scope.isGroupQueued === false) {\n $scope.initialQueueStatusLoading = false;\n propertyToSortBy = $scope.propertyName;\n // When sorting, the field passed in is 'positionName' but the javascript property is actually called 'jobType'\n if (propertyToSortBy === \"positionName\") {\n propertyToSortBy = \"jobType\";\n }\n\n _this.peopleList.people = _.sortBy(_this.peopleList.people, function(p) {\n return p[propertyToSortBy].toLowerCase();\n });\n if ($scope.reverse) {\n _this.peopleList.people.reverse();\n }\n $scope.rows = GroupsService.getPageOfUsers(_this.peopleList.people, _this.peopleList.options.currentPage, _this.peopleList.options.pageSize, _this.peopleList.totalCount);\n _this.setRowSelection($scope.rows);\n $scope.rowsAreLoading = false;\n } else {\n GroupsService.getQueueStatus(groupId).then(function(success) {\n $scope.queuedPeopleGroup = success;\n $scope.initialQueueStatusLoading = false;\n // 3 = success, 4 = error, 0 = Not in queue\n if (success.processStatusId === 3 || success.processStatusId === 4 || success.processStatusId === 0) {\n $scope.isGroupQueued = false;\n $scope.rowsAreLoading = true;\n $scope.home.page = 1;\n _this.getUsersByPeopleGroup(groupId);\n } else {\n if (queuePollingInterval.peopleGroupPollingInterval !== null) {\n $interval.cancel(queuePollingInterval.peopleGroupPollingInterval);\n }\n $scope.isGroupQueued = true;\n $scope.rowsAreLoading = true;\n if (_.indexOf($scope.peoplegroups.processQueue, groupId) === -1) {\n $scope.peoplegroups.processQueue.push(groupId);\n }\n\n queuePollingInterval.peopleGroupPollingInterval = $interval(_this.peopleGroupQueueStatusChecker, 20000);\n }\n }, function(failure) {\n $scope.initialQueueStatusLoading = false;\n $scope.isGroupQueued = false;\n $scope.rowsAreLoading = true;\n $scope.home.page = 1;\n _this.getUsersByPeopleGroup(groupId);\n });\n }\n };\n\n _this.addGroupToProcessingQueue = function (groupId) {\n $scope.peopleGroupRequestUpdateError.reset();\n GroupsService.addGroupToProcessingQueue(groupId).then(function(success) {\n $scope.queuedPeopleGroup = success;\n if (queuePollingInterval.peopleGroupPollingInterval !== null) {\n $interval.cancel(queuePollingInterval.peopleGroupPollingInterval);\n }\n $scope.isGroupQueued = true;\n $scope.rowsAreLoading = true;\n queuePollingInterval.peopleGroupPollingInterval = $interval(_this.peopleGroupQueueStatusChecker, 20000);\n }, function(failure) {\n $scope.rowsAreLoading = false;\n var errorCode = failure.StatusCode;\n if (errorCode !== 404) {\n var message = failure.ErrorMessage;\n $scope.peopleGroupRequestUpdateError.setError(errorCode, message);\n }\n });\n };\n\n $scope.addGroupToProcessingQueue = function (pplgroup) {\n if (_.indexOf($scope.peoplegroups.processQueue, pplgroup.id) === -1) {\n pplgroup.isGroupQueued = true;\n $scope.peoplegroups.processQueue.push(pplgroup.id);\n _this.addGroupToProcessingQueue(pplgroup.id);\n }\n };\n\n _this.peopleGroupQueueStatusChecker = function () {\n _.each($scope.peoplegroups.processQueue, function(groupId) {\n GroupsService.getQueueStatus(groupId).then(function(success) {\n \n // If process status is success or error, remove interval and get people group results\n if (success.processStatusId === 3 || success.processStatusId === 4) {\n\n var index = _.indexOf($scope.peoplegroups.processQueue, groupId);\n if (index !== -1) {\n $scope.peoplegroups.processQueue.splice(index, 1);\n }\n\n if (typeof _this.originalPeopleGroups !== 'undefined' && _this.originalPeopleGroups !== null) {\n var grpmatch = _.findWhere(_this.originalPeopleGroups, { \"id\": groupId });\n if (typeof grpmatch !== 'undefined' && grpmatch !== null) {\n grpmatch.isGroupQueued = false;\n grpmatch.recordDateTime = success.lastProcessedDate;\n }\n }\n\n if ($scope.nodeSource === 'People Groups') {\n $scope.queuedPeopleGroup = success;\n $scope.isGroupQueued = false;\n $scope.rowsAreLoading = true;\n $scope.home.page = 1;\n _this.getUsersByPeopleGroup(_this.groupId);\n }\n }\n }, function(failure) {\n console.log(JSON.stringify(failure));\n });\n });\n };\n\n _this.getUsersByPeopleGroup = function(groupId) {\n GroupsService.getUsersByGroupId(groupId).then(function (success) {\n _this.peopleList = {};\n _this.peopleList.groupId = groupId;\n _this.peopleList.people = success;\n _this.peopleList.options = {};\n _this.peopleList.options.pageSize = 50; // TODO: Replace with global variable containing page size if there is one\n _this.peopleList.options.currentPage = 1;\n _this.peopleList.totalCount = _this.peopleList.people.length;\n var propertyToSortBy = $scope.propertyName;\n // When sorting, the field passed in is 'positionName' but the javascript property is actually called 'jobType'\n if (propertyToSortBy === \"positionName\") {\n propertyToSortBy = \"jobType\";\n }\n _this.peopleList.people = _.sortBy(_this.peopleList.people, function (p) {\n return p[propertyToSortBy].toLowerCase();\n });\n if ($scope.reverse) {\n _this.peopleList.people.reverse();\n }\n $scope.rows = GroupsService.getPageOfUsers(_this.peopleList.people, _this.peopleList.options.currentPage, _this.peopleList.options.pageSize, _this.peopleList.totalCount);\n _this.setRowSelection(_this.peopleList.people);\n _this.calculatePages(_this.peopleList.totalCount);\n $scope.rowsAreLoading = false;\n }, function (failure) {\n // set the list of users on the left to a blank list\n $scope.rowsAreLoading = false;\n\n $scope.rows = [];\n /* If there was an actual error, display it\n * A 404 doesn't count as an error because\n * it just means no users */\n var errorCode = failure.StatusCode;\n if (errorCode !== 404) {\n var message = failure.ErrorMessage;\n $scope.userTableError.error.setError(errorCode, message);\n }\n });\n };\n\n $scope.userAuditInfo = {};\n $scope.userAuditInfo.isLoading = false;\n $scope.userAuditInfo.error = errorDisplayerUtil.create();\n\n /**\n *\n */\n $scope.auditAction = function() {\n $scope.homeTemplate = 'app/templates/users/audit/admin.html';\n\n /**\n * @TODO: @sfrohm discuss with the gentlemen how we handle 404's. Do we create a route for all error\n * situations (40x, 50x)?\n */\n if (typeof $route.current.params.param === 'undefined') {\n // how do we handle 404's?\n }\n\n $scope.userAuditInfo.error.reset();\n\n $scope.userAuditInfo.isLoading = true;\n\n var id = $route.current.params.param.split('/')[0];\n\n var audit = UsersService.getUserTrainingAudit(id);\n audit.then(function(success) {\n $scope.userAuditInfo.isLoading = false;\n\n $scope.audits = success;\n }, function(failure) {\n $scope.userAuditInfo.isLoading = false;\n\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n\n $scope.userAuditInfo.error.setError(errorCode, message);\n });\n };\n\n /* This makes coloumns of a table sortables */\n $scope.propertyName = 'lastName';\n $scope.reverse = false;\n\n $scope.sortBy = function (propertyName) {\n //reset paging - so as to display first page on clicking sort irrespective of where the user is currently\n $scope.home.page = 1;\n $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;\n $scope.propertyName = propertyName;\n\n //variable just for the HTML to use to sort\n //needed due to \"positionName\" and \"jobType\" being used for the same column\n $scope.htmlSortName = propertyName;\n if ($scope.htmlSortName === \"positionName\") {\n $scope.htmlSortName = \"jobType\";\n }\n\n if ($scope.currentview === \"People Groups\") {\n return;\n }\n\n var isEmpty = angular.equals({}, _this.advancedSearchStructForPaging);\n\n if ($scope.nodeSource === 'People Groups') {\n _this.peopleList.options.currentPage = $scope.home.page;\n _this.peopleGroupUsers(_this.groupId);\n }\n else if (isEmpty || typeof _this.advancedSearchStructForPaging === \"undefined\") {\n _this.fetchAllUsersPaged();\n } else {\n _this.sendAdvancedSearchQueryToServerAndDisplayUsers(_this.advancedSearchStructForPaging);\n }\n };\n\n /* This will check all the rows in the table in that instance */\n /// TO DO //\n $scope.selectAll = {};\n $scope.checkAll = function() {\n if ($scope.selectAll.checked) {\n _.each(_.filter($scope.rows, { \"isActive\": true }), function (row) {\n row.select = true;\n var index = _.findWhere($scope.batch.selectedUsers, { \"id\": row.id });\n if (typeof index === \"undefined\") {\n $scope.batch.selectedUsers.push(angular.copy(row));\n }\n });\n } else {\n _.each(_.filter($scope.rows, { \"isActive\": true }), function (row) {\n row.select = false;\n var index = _.findIndex($scope.batch.selectedUsers,{\"id\":row.id});\n if (index !== -1) {\n $scope.batch.selectedUsers.splice(index,1);\n }\n });\n }\n };\n\n \n\n /* This gets called when the user filters out the currently selected node in the tree\n * this will just hide all the rows on the right hand side in our case */\n $scope.OrgNodeNowHidden = function() {\n $scope.rows = [];\n };\n\n /**\n * Middle man to receive action and make call to API to edit a user\n *\n * @void\n */\n $scope.editUserForm = {};\n $scope.editUserForm.error = errorDisplayerUtil.create();\n\n $scope.callUserEdit = function() {\n var user = angular.copy($scope.user);\n \n $scope.editUserForm.isLoading = true;\n //SLY-4193 manager was removed\n if (user.managerName === '' && user.managerId !== null)\n {\n user.managerName = null;\n user.managerId = null;\n }\n if (user.selectedAlternateManager === '' && user.alternateManagers !== null)\n {\n user.alternateManagers = { };\n }\n\n //user.hireDate = moment(user.hireDate.moment);\n if (user.endDate !== null){\n if (typeof user.endDate.moment === 'undefined' || user.endDate.moment === null) {\n user.endDate = null;\n }\n }\n\n var editedUser = UsersService.taEditProfile([user]);\n editedUser.then(function(success) {\n $scope.editUserForm.isLoading = false;\n if (success[0].success === true) {\n $location.url(\"users/home\");\n } else if (success[0].success === false) {\n var errorCode = '404';\n var message = success[0].message;\n $scope.editUserForm.error.setError(errorCode, message);\n }\n\n }, function(failure) {\n $scope.editUserForm.isLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.editUserForm.error.setError(errorCode, message);\n\n });\n };\n //SLY-4141 used by uib-typeahead control for add and edit forms\n $scope.selectOrganization = function ($item, $model, $label, $event, user) {\n //if ($item.enabled === true) {\n $scope.user.organizationName = $item.name;\n $scope.user.organizationId = $item.id;\n //}\n\n };\n\n $scope.selectManager = function($item, $model, $label, $event, user) {\n $scope.user.managerId = $item.id;\n };\n\n $scope.selectAlternateManager = function($item, $model, $label, $event, user) {\n $scope.user.alternateManagers = {};\n $scope.user.alternateManagers[$item.id] = $item.fullName;\n };\n\n $scope.languageOptions = [{\n 'id': 9,\n 'name': \"English\"\n }];\n\n /******** BATCH EDIT ********/\n\n \n\n // Initialize batch form\n $scope.batch = {};\n $scope.batch.error = errorDisplayerUtil.create();\n $scope.batch.locationError = errorDisplayerUtil.create();\n\n /******** BatchEdit - Select Users Between Pages and Searches ********/\n $scope.batch.selectedUsers = [];\n $scope.batch.selectAll = {};\n $scope.batch.selectAll.checked = true;\n $scope.pushInArray = function (user) {\n\n if ($scope.selectAll.checked)\n $scope.selectAll.checked = false;\n\n var index = _.findIndex($scope.batch.selectedUsers, { \"id\": user.id });\n if (user.select) {\n if (index === -1) {\n $scope.batch.selectedUsers.push(angular.copy(user));\n }\n } else {\n if (index !== -1)\n $scope.batch.selectedUsers.splice(index, 1);\n }\n };\n\n $scope.batch.clearSelection = function () {\n $scope.batch.selectedUsers = [];\n var rowsToDeselect = $scope.rows;\n if ($scope.nodeSource === 'People Groups') {\n rowsToDeselect = _this.peopleList.people;\n }\n _.each(rowsToDeselect, function (row) {\n row.select = false;\n });\n\n $scope.selectAll.checked = false;\n $scope.batch.selectedUsersForm.$setPristine();\n jQuery('#peopleTabBatchSelectedUsersModal').modal('hide');\n $scope.showSelectUsersTooltip = false;\n\n };\n\n $scope.batch.selectUserRow = function() {\n $scope.batch.selectAll.checked = false;\n };\n\n $scope.batch.applySelectionChanges = function () {\n _.each(_.where($scope.batch.selectedUsers, { \"select\": false }), function (row) {\n\n //uncheck current view items row selection\n var rowsToDeselect = $scope.rows;\n if ($scope.nodeSource === 'People Groups') {\n rowsToDeselect = _this.peopleList.people;\n }\n var deselectrow = _.findWhere(rowsToDeselect, { \"id\": row.id });\n if (typeof deselectrow !== \"undefined\" && deselectrow !== null) {\n deselectrow.select = false;\n $scope.selectAll.checked = false;\n }\n\n //remove from the selectedUsers array\n var index = _.findIndex($scope.batch.selectedUsers, { \"id\": row.id });\n if (index !== -1) {\n $scope.batch.selectedUsers.splice(index, 1);\n }\n \n });\n\n $scope.batch.selectedUsersForm.$setPristine();\n jQuery('#peopleTabBatchSelectedUsersModal').modal('hide');\n $scope.showSelectUsersTooltip = false;\n };\n\n $scope.showSelectUsersTooltip = false;\n $scope.batch.toggleSelectUsersTooltip = function () {\n if (!$scope.batch.selectedUsersForm.$dirty) {\n jQuery('#peopleTabBatchSelectedUsersModal').modal('hide');\n $scope.showSelectUsersTooltip = false;\n } else {\n $scope.showSelectUsersTooltip = !$scope.showSelectUsersTooltip;\n }\n };\n\n $scope.batch.closeSelectUsersModal = function () {\n var isFormDirty = $scope.batch.selectedUsersForm.$dirty;\n if (isFormDirty) {\n _this.undoSelectedUserChanges();\n $scope.batch.selectedUsersForm.$setPristine();\n }\n\n jQuery('#peopleTabBatchSelectedUsersModal').modal('hide');\n $scope.showSelectUsersTooltip = false;\n\n };\n\n _this.undoSelectedUserChanges = function () {\n\n _.each($scope.batch.selectedUsers, function (row) {\n row.select = true;\n });\n\n };\n\n _this.setRowSelection = function (userRows) {\n\n _.each(userRows, function (row) {\n var isrowselected = _.findWhere($scope.batch.selectedUsers, { \"id\": row.id });\n if (typeof isrowselected !== \"undefined\") {\n row.select = true;\n }\n row.isActive = UsersService.isUserActive(row);\n });\n\n $scope.selectAll.checked = _.every(userRows, { \"select\": true });\n };\n\n $scope.batch.checkAll = function() {\n if ($scope.batch.selectAll.checked) {\n _.each($scope.batch.selectedUsers, function (row) {\n row.select = true;\n });\n } else {\n _.each($scope.batch.selectedUsers, function (row) {\n row.select = false;\n });\n }\n };\n\n\n\n $scope.batch.selectedPeopleGroups = [];\n $scope.peoplegroups = {};\n $scope.peoplegroups.areActive = true;\n $scope.peoplegroups.processQueue = [];\n $scope.peoplegroups.selectAll = {};\n $scope.peoplegroups.selectAll.checked = false;\n $scope.peoplegroups.selectAll = function () {\n if ($scope.peoplegroups.selectAll.checked) {\n _.each($scope.pplgrpRows, function (row) {\n row.select = true;\n var index = _.findWhere($scope.batch.selectedPeopleGroups, { \"id\": row.id });\n if (typeof index === \"undefined\") {\n $scope.batch.selectedPeopleGroups.push(angular.copy(row));\n }\n });\n } else {\n _.each($scope.pplgrpRows, function (row) {\n row.select = false;\n var index = _.findIndex($scope.batch.selectedPeopleGroups, { \"id\": row.id });\n if (index !== -1) {\n $scope.batch.selectedPeopleGroups.splice(index, 1);\n }\n });\n }\n };\n\n\n //$scope.batch.selectAll = {};\n //$scope.batch.selectAll.checked = true;\n $scope.pushInPplGrpArray = function (pplgrp) {\n\n if ($scope.peoplegroups.selectAll.checked)\n $scope.peoplegroups.selectAll.checked = false;\n\n var index = _.findIndex($scope.batch.selectedPeopleGroups, { \"id\": pplgrp.id });\n if (pplgrp.select) {\n if (index === -1) {\n $scope.batch.selectedPeopleGroups.push(angular.copy(pplgrp));\n }\n } else {\n if (index !== -1)\n $scope.batch.selectedPeopleGroups.splice(index, 1);\n }\n };\n\n $scope.copyPeopleGroupError = {};\n $scope.copyPeopleGroupError.error = errorDisplayerUtil.create();\n $scope.copyPeopleGroupIsLoading = false;\n\n $scope.copyPeopleGroupsModal = function () {\n $scope.copyPeopleGroupIsLoading = true;\n $scope.copyPeopleGroupError.error.reset();\n var selectedPeopleGroups = GroupsService.formatPeopleGroupsForCopy($scope.batch.selectedPeopleGroups);\n if (selectedPeopleGroups.length > 0) {\n $scope.copyPeopleGroupIsLoading = false;\n $scope.showCopyTable = true;\n $scope.rows_In_CopyModal = selectedPeopleGroups;\n } else {\n $scope.copyPeopleGroupIsLoading = false;\n $scope.showCopyTable = false;\n var errorCode = \"0\";\n var message = \"There are no People Groups selected for copy!\";\n $scope.copyPeopleGroupError.error.setError(errorCode, message);\n }\n };\n\n $scope.copyPeopleGroups = function () {\n $scope.copyPeopleGroupError.error.reset();\n $scope.copyPeopleGroupIsLoading = true;\n var data = angular.copy($scope.rows_In_CopyModal);\n\n console.log($scope.rows_In_CopyModal);\n\n var copyPeopleGroupPromise = GroupsService.saveCopiedGroup(data);\n copyPeopleGroupPromise.then(function (success) {\n $scope.copyPeopleGroupIsLoading = false;\n $scope.showCopyTable = false;\n jQuery('#copyPeopleGroupsModal').modal('hide').on('hidden.bs.modal', $route.reload);\n }, function (failure) {\n $scope.copyPeopleGroupIsLoading = false;\n $scope.showCopyTable = true;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.copyPeopleGroupError.error.setError(errorCode, message);\n\n });\n };\n\n /******** END: BatchEdit - Select Users Between Pages and Searches ********/\n\n $scope.batch.showPopover = function () {\n $scope.batch.popoverIsVisible = true;\n $scope.batch.selectAll.checked = true;\n jQuery('#peopleTabBatchSelectedUsersModal').modal();\n };\n\n $scope.batch.hidePopover = function () {\n $scope.batch.popoverIsVisible = false;\n jQuery('#peopleTabBatchSelectedUsersModal').modal('hide');\n };\n\n _this.clearBatchForm = function() {\n $scope.batch.form = {};\n $scope.batch.form.orgObj = null;\n $scope.batch.form.jobType = null;\n $scope.advancedSearchStruct.jobId = null;\n\n $scope.batch.locationLoading = false;\n\n $scope.batch.locationError.reset();\n $scope.batch.error.reset();\n };\n\n _this.clearBatchForm();\n\n $scope.batch.clearBatchEditModal = function () {\n _this.clearBatchForm();\n };\n\n $scope.batch.editUserModal = function () {\n\n if (typeof $scope.orgArray === 'undefined' || $scope.orgArray === null) {\n _this.getOrganizationHierarchyData();\n }\n if (typeof $scope.jobs === 'undefined' || $scope.jobs === null) {\n _this.getPositionsData();\n }\n\n /* The batch edit window reads this variable\n * to make sure at least 1 active user is selected.\n * If no active users are selected, an error will be displayed\n * and the user will be told to exit the batch window */\n \n $scope.batch.selectedActiveUsers = _.filter($scope.batch.selectedUsers, UsersService.isUserActive);\n\n jQuery('#peopleTabBatchEditResultsModal').modal('hide');\n jQuery('#peopleTabBatchEditModal').modal();\n _this.clearBatchForm();\n };\n\n $scope.refreshView = false;\n $scope.batch.editResultsModal = function(refreshUsers) {\n jQuery('#peopleTabBatchEditModal').modal('hide');\n jQuery('#peopleTabBatchAddTranscriptModal').modal('hide');\n jQuery('#peopleTabBatchEditResultsModal').modal();\n //refresh the user data\n if (refreshUsers) {\n $scope.refreshView = true;\n $scope.batch.successMessage = \"Batch edit successful!\";\n $scope.batch.failureMessage = \"Please edit individual records\";\n }\n else {\n $scope.batch.successMessage = \"Batch add to transcript successful!\";\n $scope.batch.failureMessage = \"Please add transcript entry to individual records\";\n }\n };\n\n $scope.batch.hideModals = function() {\n [\n '#peopleTabBatchEditModal',\n '#peopleTabBatchEditResultsModal',\n '#peopleTabBatchAddTranscriptModal',\n '#peopleTabBatchSelectedUsersModal',\n ].forEach(function(id) {\n jQuery(id).modal('hide').on('hidden.bs.modal', function() {\n _this.clearBatchForm();\n _this.clearBatchAddTranscriptForm();\n \n if ($scope.refreshView) {\n $route.reload();\n }\n });\n });\n };\n\n //SLY-4142 used by uib-typeahead control for batch edit form\n $scope.batch.selectJob = function ($item, $model, $label) {\n //SLY-4967 When job select is DDL, populate $item.id with the job ID selected\n if (typeof $item !== 'undefined' && typeof $item.jobId !== 'undefined') { \n $item.id = $item.jobId;\n }\n $scope.batch.form.jobType = $item;\n };\n\n //SLY-4141 used by uib-typeahead control for batch edit form\n $scope.batch.selectOrganization = function ($item, $model, $label) {\n $scope.batch.form.orgObj = $item;\n };\n\n /* Fields that we update are defined in this function */\n _this.updateFieldsOnUsersToUpload = function (usersToUpload) {\n var updatedPropertiesAndValues = {};\n for (var i = 0; i < usersToUpload.length; i += 1) {\n\n delete usersToUpload[i].nodes;\n\n //LMS-7985 Add Custom Fields\n // Set text fields if they've been changed\n var fields = ['custom0', 'custom1',\n 'custom2', 'custom3',\n 'custom4', 'custom5', 'custom6', 'custom7', 'custom8', 'custom9', 'location'\n ];\n for (var j = 0; j < fields.length; j += 1) {\n var field = fields[j];\n var removeField = field + 'Remove';\n if ($scope.batch.form[removeField] === true) {\n usersToUpload[i][field] = null;\n updatedPropertiesAndValues[field] = usersToUpload[i][field];\n } else if ($scope.batch.form[field] &&\n $scope.batch.form[field].trim &&\n $scope.batch.form[field].trim() !== '') {\n usersToUpload[i][field] = $scope.batch.form[field].trim();\n updatedPropertiesAndValues[field] = usersToUpload[i][field];\n }\n }\n\n if ($scope.batch.form.terminationDateRemove === true) {\n usersToUpload[i].endDate = null;\n updatedPropertiesAndValues.endDate = usersToUpload[i].endDate;\n } else if ($scope.batch.form.endDate) {\n usersToUpload[i].endDate = $scope.batch.form.endDate.moment.toISOString(); \n updatedPropertiesAndValues.endDate = usersToUpload[i].endDate;\n }\n\n if ($scope.batch.form.managerRemove === true) {\n usersToUpload[i].managerId = null;\n usersToUpload[i].managerName = '';\n updatedPropertiesAndValues.managerId = usersToUpload[i].managerId;\n updatedPropertiesAndValues.managerName = usersToUpload[i].managerName;\n } else if ($scope.batch.form.manager && $scope.batch.form.manager !== '') {\n usersToUpload[i].managerId = $scope.batch.form.manager.id;\n usersToUpload[i].managerName = $scope.batch.form.manager.firstName + ' ' + $scope.batch.form.manager.lastName;\n updatedPropertiesAndValues.managerId = usersToUpload[i].managerId;\n updatedPropertiesAndValues.managerName = usersToUpload[i].managerName;\n }\n\n if ($scope.batch.form.alternateManagerRemove === true) {\n usersToUpload[i].alternateManagers = {};\n updatedPropertiesAndValues.alternateManagerId = null;\n updatedPropertiesAndValues.alternateManagerName = '';\n } else if ($scope.batch.form.alternateManager && $scope.batch.form.alternateManager !== '') {\n usersToUpload[i].alternateManagers = {};\n usersToUpload[i].alternateManagers[$scope.batch.form.alternateManager.id] = $scope.batch.form.alternateManager.firstName + ' ' + $scope.batch.form.alternateManager.lastName;\n updatedPropertiesAndValues.alternateManagerId = $scope.batch.form.alternateManager.id;\n updatedPropertiesAndValues.alternateManagerName = $scope.batch.form.alternateManager.firstName + ' ' + $scope.batch.form.alternateManager.lastName;\n }\n\n if ($scope.batch.form.jobType && $scope.batch.form.jobType !== '') {\n usersToUpload[i].jobId = $scope.batch.form.jobType.id;\n updatedPropertiesAndValues.jobId = usersToUpload[i].jobId;\n }\n\n if ($scope.batch.form.orgObj !== null) {\n var orgObj = $scope.batch.form.orgObj;\n // SLY-3952 org object flattened.\n usersToUpload[i].organizationId = orgObj.id;\n usersToUpload[i].organizationName = orgObj.name;\n updatedPropertiesAndValues.organizationId = usersToUpload[i].organizationId;\n updatedPropertiesAndValues.organizationName = usersToUpload[i].organizationName;\n }\n }\n return updatedPropertiesAndValues;\n };\n\n $scope.batch.scrollBarConfig = {\n autoHideScrollbar: false,\n theme: 'bai',\n advanced: {\n updateOnContentResize: true\n },\n setHeight: '50vh',\n scrollInertia: 0,\n scrollButtons: {\n scrollAmount: 'auto', // scroll amount when button pressed\n enable: true // enable scrolling buttons by default\n }\n };\n\n $scope.batch.applyChanges = function() {\n $scope.batch.processing = true;\n\n var propertiesToUpdate = _this.updateFieldsOnUsersToUpload($scope.batch.selectedActiveUsers);\n $scope.batch.selectedUsers = [];\n\n UsersService.batchUpdateUsers($scope.batch.selectedActiveUsers, propertiesToUpdate).then(function (success) {\n // All the failed users will have a status of false\n $scope.batch.failedUsers = _.filter(success, function(x) {\n return !x.success;\n });\n\n // display the results modal\n $scope.batch.processing = false;\n $scope.batch.editResultsModal(true);\n }, function(failure) {\n $scope.batch.processing = false;\n\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.batch.error.setError(errorCode, message);\n\n $scope.batch.editResultsModal(true);\n });\n\n };\n /******** BATCH ADD TO TRANSCRIPT ********/\n\n // Initialize batch form\n $scope.batchAddTranscript = {};\n $scope.batchAddTranscript.error = errorDisplayerUtil.create();\n\n _this.clearBatchAddTranscriptForm = function () {\n $scope.batchAddTranscript.form = {};\n $scope.batchAddTranscript.error.reset();\n };\n\n _this.clearUserBatchCheckboxes = function (rows) {\n _.filter(rows, function (user) {\n if (user.select) {\n user.select = false;\n }\n });\n if($scope.selectAll.checked) {$scope.selectAll.checked = false;}\n };\n\n _this.clearBatchAddTranscriptForm();\n\n $scope.batch.addTranscriptModal = function () {\n /* The batch add to transcript window reads this variable\n * to make sure at least 1 active user is selected.\n * If no active users are selected, an error will be displayed\n * and the user will be told to exit the batch window */\n $scope.batch.selectedActiveUsers = _.filter($scope.batch.selectedUsers, UsersService.isUserActive);\n\n // jQuery('#peopleTabBatchEditResultsModal').modal('hide');\n jQuery('#peopleTabBatchAddTranscriptModal').modal();\n _this.clearBatchAddTranscriptForm();\n };\n\n $scope.batch.showBatchTranscriptConfirmationModal = function () {\n jQuery('#peopleTabBatchAddTranscriptModal').modal('hide');\n jQuery('#peopleTabBatchEditResultsModal').modal(); \n };\n\n $scope.batch.submitBatchAddToTranscript = function () {\n $scope.batch.processing = true;\n var batchAddTranscriptData = angular.copy($scope.batch.batchAddTranscript.course);\n \n batchAddTranscriptData.completedDate = batchAddTranscriptData.completedDate.moment.toISOString();\n \n batchAddTranscriptData.startDate = batchAddTranscriptData.startDate.moment.toISOString();\n \n batchAddTranscriptData.users = _.map($scope.batch.selectedActiveUsers, function(usr) {\n return _.pick(usr, 'id', 'firstName', 'lastName');\n });\n $scope.batch.selectedUsers = [];\n\n TranscriptsService.batchCreate(batchAddTranscriptData).then(function (success) {\n // All the failed users will have a status of false\n $scope.batch.failedUsers = _.filter(success, function (x) {\n return !x.success;\n });\n\n // display the results modal\n $scope.batch.processing = false;\n $scope.batch.editResultsModal(false);\n if (_this.nodeSource === 'People Groups') {\n _this.clearUserBatchCheckboxes(_this.peopleList.people);\n } else {\n _this.clearUserBatchCheckboxes($scope.rows);\n }\n }, function (failure) {\n $scope.batch.processing = false;\n\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.batch.error.setError(errorCode, message);\n\n $scope.batch.editResultsModal(false);\n if (_this.nodeSource === 'People Groups') {\n _this.clearUserBatchCheckboxes(_this.peopleList.people);\n } else {\n _this.clearUserBatchCheckboxes($scope.rows);\n }\n\n });\n };\n\n /******** END BATCH ADD TO TRANSCRIPT ********/\n\n \n\n /* Function closes the modal and refreshes the page */\n $scope.closeViewAssignmentModal = function() {\n $scope.editAction();\n };\n\n $scope.modalBodyShow = false;\n $scope.modalBodyToggle = function() {\n $scope.modalBodyShow = !$scope.modalBodyShow;\n };\n \n /**** JOBS TREE *****/\n $scope.jobsTreeLoading = true;\n $scope.jobsTreeTitle = \"Positions\";\n $scope.jobsTreeError = {};\n $scope.jobsTreeError.error = errorDisplayerUtil.create();\n\n $scope.jobsTreeOptions = {};\n $scope.jobsTreeOptions.initiallyOpened = false;\n $scope.jobsTreeOptions.rootNodeIsTopLevel = false;\n \n //SLY-4142 - TODO: probably need to figure out how to get it from a settings service.\n // this is for switching between dropdown and uib-typeahead\n $scope.jobCutoff = 100;\n \n //SLY-4142 used by uib-typeahead control for add and edit forms\n $scope.selectJob = function ($item, $model, $label, $event, user) {\n $scope.user.jobType = $item.name;\n $scope.user.jobId = $item.id;\n\n };\n\n\n $scope.jobsNodeClick = function (item) {\n\n //Clear previously selected nodes in different trees\n var selectedNodes = document.getElementsByClassName(\"tree-selected\");\n Array.prototype.forEach.call(selectedNodes, function (x) {\n $(x).removeClass(\"tree-selected\");\n });\n\n var rows = [];\n\n if (typeof _this.params.name !== 'undefined' && _this.params.name !== null && _this.params.name === \"home\") {\n if (typeof item.id !== 'undefined') {\n $scope.selectedNode = item.name;\n $scope.nodeSource = \"Positions\";\n // Cancel interval if there is one\n if (queuePollingInterval.peopleGroupPollingInterval !== null) {\n $interval.cancel(queuePollingInterval.peopleGroupPollingInterval);\n }\n var searchAttribute = {};\n searchAttribute.jobId = item.id;\n $scope.home.page = 1;\n _this.sendAdvancedSearchQueryToServerAndDisplayUsers(searchAttribute);\n }\n } else {\n $location.url('users/home');\n }\n\n };\n \n $scope.getStates = function(countryId) {\n //var countryId = $scope.user.homeAddress.countryId;\n\n var states = StatesService.getLatitudeStateList(countryId);\n\n states.then(function(stateList) {\n $scope.states = stateList;\n }, function(error) {\n $scope.states = [];\n });\n };\n\n // People Groups Actions Starts From Here\n\n $scope.createPeopleGroup = {};\n $scope.createPeopleGroup.inputPeopleGroupName = false;\n _this.params = $route.current.params;\n\n $scope.pplGrpEditView = false;\n $scope.peoplegroupAction = function () {\n //default template for both save and edit people group form peopleTab\n $scope.homeTemplate = 'app/templates/users/peoplegroup/admin.html';\n \n $scope.currentview = \"People Groups\";\n // Tree drilldown opened on page load\n $scope.peopleSelected = [$scope.PeopleData[0]];\n $scope.PeopleOptions.initiallyOpened = true;\n var showActiveGroups = GroupsService.getCurrentNode() === \"inactive\" ? false : true;\n $scope.peoplegroups.areActive = showActiveGroups;\n \n // Get peopleGroupId from routeParams - Only for editing people group\n if (typeof _this.params.param !== \"undefined\" && _this.params.param !== null) {\n \n if (_this.params.param === \"create\") {\n $scope.pplGrpEditView = true;\n // input for creating new people group name\n $scope.createPeopleGroup.inputPeopleGroupName = true;\n // people group template header changes based on create/update\n $scope.createPeopleGroup.defaultPeopleGroupHeader = true;\n // create new people group call\n _this.createPeoplegroup();\n } else if (_this.params.param.toLowerCase() === \"active\" || _this.params.param.toLowerCase() === \"inactive\") {\n var tempData = {};\n if (_this.params.param.toLowerCase() === \"inactive\") {\n tempData.currentnode = \"inactive\";\n $scope.peoplegroups.areActive= false;\n } else {\n tempData.currentnode = \"active\";\n $scope.peoplegroups.areActive = true;\n }\n GroupsService.setData(tempData);\n _this.getAllPeopleGroups($scope.peoplegroups.areActive);\n \n } else {\n $scope.pplGrpEditView = true;\n // people group not editable from update page\n $scope.createPeopleGroup.inputPeopleGroupName = false;\n // people group template header changes based on create/update\n $scope.createPeopleGroup.defaultPeopleGroupHeader = false;\n // get existing people group structure call\n _this.getPeopleGroupsStructure();\n }\n } else {\n $scope.pplGrpEditView = false;\n _this.getAllPeopleGroups($scope.peoplegroups.areActive);\n }\n\n $scope.peopleSelected = $scope.peoplegroups.areActive === true ? $scope.PeopleData[0].nodes[0] : $scope.PeopleData[0].nodes[1];\n $scope.peopleExpanded = [$scope.PeopleData[0]];\n };\n\n // Erro display for getting people group structure API\n $scope.peopleGroupError = {};\n $scope.peopleGroupError.error = errorDisplayerUtil.create();\n $scope.peopleGroupsAreLoading = true;\n $scope.viewPeopleGroupStructure = false;\n\n $scope.containerOptions = {};\n $scope.containerOptions.showLock = false;\n\n // _this.defaultStructure is the array, may have multiple root containers going forward.,\n // but for now only one root container for creating or updating people group.\n _this.createPeoplegroup = function() {\n $scope.peopleGroupsAreLoading = true;\n\n var all = $q.all(PeopleGroupFunctions.peopleGroupActions());\n all.then(function(success) {\n $scope.groupStructure = {};\n $scope.groupStructure = success[0];\n $scope.selectOptionsData = success[1];\n $scope.containerOperandsData = GroupsService.containerOperandsRequired(success[2]);\n\n GroupsService.secondaryFormatGroupStructure(success[3], success[4].groups, success[5], success[6], success[7]);\n\n $scope.peopleGroupsAreLoading = false;\n $scope.viewPeopleGroupStructure = true;\n\n }, function(failure) {\n _this.failurePeopleGroup(failure);\n });\n };\n\n _this.getPeopleGroupsStructure = function() {\n var peopleGroupId = _this.params.param.split('/')[0];\n $scope.peopleGroupsAreLoading = true;\n\n var all = $q.all(PeopleGroupFunctions.peopleGroupActions(peopleGroupId));\n all.then(function(success) {\n $scope.groupStructure = {};\n $scope.selectOptionsData = success[1];\n $scope.containerOperandsData = GroupsService.containerOperandsRequired(success[2]);\n \n GroupsService.secondaryFormatGroupStructure(success[3], success[4].groups, success[5], success[6], success[7]);\n // Formatting PG Structure to add label and other stuff based on criteris. %IMPORTANT\n $scope.groupStructure = GroupsService.secondaryFormatGroupStructure_groupStructure(success[0]);\n _this.showGroupStatus(success[0]);\n $scope.peopleGroupsAreLoading = false;\n $scope.viewPeopleGroupStructure = true;\n\n }, function(failure) {\n _this.failurePeopleGroup(failure);\n });\n };\n\n _this.failurePeopleGroup = function(failure) {\n $scope.peopleGroupsAreLoading = false;\n $scope.viewPeopleGroupStructure = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.peopleGroupError.error.setError(errorCode, message);\n };\n\n $scope.editPeopleGroup = {};\n $scope.cancelPeopleGroup = function() {\n $scope.editPeopleGroup.isOpen = !$scope.editPeopleGroup.isOpen;\n };\n // Error disaply if saving people group fails.\n $scope.peopleGroupSaveError = {};\n $scope.peopleGroupSaveError.error = errorDisplayerUtil.create();\n \n // This functions serves to create, update, activate and deactivate a single people group.\n // Activate/Deactivate is based on setting the end date to people group.\n $scope.savePeopleGroupCta = function(status) {\n $scope.peopleGroupSaveError.error.reset();\n $scope.savePeopleGroupAreLoading = true;\n var payLoad = $scope.groupStructure;\n\n\n var peopleGroupSave = GroupsService.savePeopleGroup(payLoad, status);\n\n peopleGroupSave.then(function(success) {\n $scope.savePeopleGroupAreLoading = false;\n _this.showGroupStatus(success);\n $location.path('/users/peoplegroup/'+GroupsService.getCurrentNode());\n }, function(failure) {\n $scope.savePeopleGroupAreLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.peopleGroupSaveError.error.setError(errorCode, message);\n });\n }; \n\n $scope.previewPeopleError = {};\n $scope.previewPeopleError.error = errorDisplayerUtil.create();\n $scope.previewPeopleIsLoading = false;\n \n\n $scope.previewPeople = function() { \n $scope.previewPeopleError.error.reset();\n $scope.previewPeopleIsLoading = true;\n var data = $scope.groupStructure;\n\n var previewPeoplePromise = GroupsService.getPeoplePreview(data);\n previewPeoplePromise.then(function(success) {\n $scope.previewPeopleIsLoading = false;\n $scope.showPreview = true;\n $scope.people_rows = success; //GroupsService.mapUsersForPreview(success);\n }, function(failure) {\n $scope.previewPeopleIsLoading = false;\n $scope.showPreview = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.previewPeopleError.error.setError(errorCode, message);\n });\n\n };\n\n $scope.invalidPeopleError = {};\n $scope.invalidPeopleError.error = errorDisplayerUtil.create();\n $scope.invalidPeopleIsLoading = false;\n\n $scope.$on('invalidPeopleModalOpen', function (evt, params) {\n if (params[1] === \"Warning\") {\n if (!$scope.tripleOr)\n {\n $scope.tripleOr = true;\n $(\"#invalidPeopleModal\").modal();\n }\n }\n \n message = params[0];\n $scope.invalidPeopleError.error.reset();\n $scope.invalidPeopleIsLoading = true;\n $scope.invalidPeopleIsLoading = false;\n var errorCode = 0;\n $scope.invalidTitle = params[1];\n $scope.invalidPeopleError.error.setError(errorCode, message);\n \n });\n\n // Used in admin.peopleGroupTable.html template to submit the export preview form.\n // This is because the export preview needs to bypass angular's $http service to return a downloaded file\n // so this posts the form to the server directly from the template instead of going through the group service.\n $scope.exportPeoplePreviewFormSubmit = function () {\n var data = $scope.groupStructure;\n var dataCopy = angular.copy(data);\n if (dataCopy.groupId === null) {\n dataCopy.groupId = 0;\n }\n $scope.peopleGroupCriteriaToSend = JSON.stringify(GroupsService.formatGroupDataToSend(dataCopy));\n $scope.currentTimezone = moment.tz.guess();\n }; \n\n _this.showGroupStatus = function(group) {\n var groupEndDate = group.endDate;\n var dateTime = moment.utc().format();\n\n if (groupEndDate !== 'undefined' && groupEndDate !== null && groupEndDate.original <= dateTime) {\n $scope.isActive = false;\n } else {\n $scope.isActive = true;\n }\n };\n\n $scope.jsonLabel = \"JSON\";\n $scope.showHideJson = false;\n $scope.disableJson = true;\n $scope.showJson = function() {\n $scope.showHideJson = !$scope.showHideJson;\n if ($scope.showHideJson === false) {\n $scope.jsonLabel = \"Show JSON\";\n } else {\n $scope.jsonLabel = \"Hide JSON\";\n }\n };\n\n /*************** ADD USER SECTION **********/\n //////// GLOBAL VARIABLES\n $scope.addUser = {};\n $scope.addUser.isLoading = false;\n $scope.addUser.error = errorDisplayerUtil.create();\n\n $scope.addUser.countriesIsLoading = false;\n $scope.addUser.locationsIsLoading = false;\n\n $scope.addUser.trainingAdministrator = false;\n $scope.addUser.toggleInstructor = false;\n $scope.addUser.toggleLDConnectAccess = false;\n $scope.addUser.addToTranscript = true;\n\n\n\n $scope.addUser.errorMessage = \"Sorry, we couldn't load this page. Please try again\";\n\n $scope.addAction = function() {\n $scope.user = {};\n $scope.user.homeAddress = {};\n $scope.user.roles = ['unknown'];\n $scope.user.addToTranscript = true;\n\n //Defualt Language option\n var engLanguage = _.findWhere($scope.languageOptions, { 'name': \"English\" });\n if (typeof engLanguage !== \"undefined\" && engLanguage !== null) {\n $scope.user.languageId = engLanguage.id;\n }\n\n $scope.homeTemplate = 'app/templates/users/add/admin.html';\n\n $scope.addUser.countriesIsLoading = true;\n\n /**\n * Get a list of countries\n */\n var countries = CountriesService.getLatitudeCountryList(UsersService.getPortalId());\n countries.then(function(success) {\n $scope.countries = success;\n\n $scope.addUser.countriesIsLoading = false;\n }, function(failure) {\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.addUser.error.setError(errorCode, message);\n });\n\n var sso = UsersService.isSSO();\n sso.then(function (success) { $scope.user.isSSO = success; });\n \n var timezones = TimezoneService.getAllTimezones();\n timezones.then(function (data) {\n $scope.timezones = data;\n });\n\n if (typeof $scope.orgArray === 'undefined' || $scope.orgArray === null) {\n _this.getOrganizationHierarchyData();\n }\n if (typeof $scope.jobs === 'undefined' || $scope.jobs === null) {\n _this.getPositionsData();\n }\n };\n\n $scope.addUser.toggleTrainingAdministrator = function(makeTrainingAdministratorBool) {\n if (typeof $scope.user.roles === 'undefined' || $scope.user.roles === null) {\n $scope.user.roles = ['unknown'];\n }\n if ($scope.user.taRoleOrgIds === undefined) {\n $scope.user.taRoleOrgIds = [];\n }\n var roles = $scope.user.roles;\n if (makeTrainingAdministratorBool) {\n if (!$scope.addUser.isUserTA()) {\n $scope.addUser.ldConnectAccess = true;\n $scope.user.ldConnectAccess = true;\n if (roles.length === 1 && _.contains(roles, 'unknown')) {\n $scope.user.roles = ['TA'];\n } else {\n $scope.user.roles.push('TA');\n }\n\n }\n\n // If there's only 1 domain, no choice to make, go with active domain\n // domainsArray will only be greater than 1 for a top level TA in a multi-domain portal\n if ($scope.domainsArray.length === 1) {\n if ($scope.user.taRoleOrgIds.indexOf(UsersService.activeDomain().id) === -1) {\n $scope.user.taRoleOrgIds.push(UsersService.activeDomain().id);\n }\n }\n\n jQuery(\"#taOrgPicker\").show();\n } else {\n $scope.addUser.ldConnectAccess = false;\n $scope.user.ldConnectAccess = false;\n if (roles.length === 1) {\n $scope.user.roles = ['unknown'];\n } else {\n $scope.user.roles = _.filter(roles, function(role) {\n return role.toUpperCase() !== 'TA';\n });\n }\n\n // If there's only 1 domain, no choice to make, go with active domain\n // domainsArray will only be greater than 1 for a top level TA in a multi-domain portal\n if ($scope.domainsArray.length === 1) {\n $scope.user.taRoleOrgIds.splice($scope.user.taRoleOrgIds.indexOf(UsersService.activeDomain().id), 1);\n }\n\n jQuery(\"#taOrgPicker\").hide();\n }\n };\n /*\n To check if the user has a role of TA.\n */\n $scope.addUser.isUserTA = function () {\n var roles = $scope.user.roles;\n var taRole = _.filter(roles, function (role) {\n return role.toUpperCase() === 'TA';\n });\n return taRole.length > 0;\n };\n\n $scope.addUser.toggleInstructor = function (makeinstructorBool) {\n if (typeof $scope.user.roles === 'undefined' || $scope.user.roles === null) {\n $scope.user.roles = ['unknown'];\n }\n\n var roles = $scope.user.roles;\n if (makeinstructorBool) {\n if (!_.contains(roles, 'instructor')) {\n if (roles.length === 1 && _.contains(roles, 'unknown')) {\n $scope.user.roles = ['instructor'];\n } else {\n $scope.user.roles.push('instructor');\n }\n }\n } else {\n if (roles.length === 1) {\n $scope.user.roles = ['unknown'];\n } else {\n $scope.user.roles = _.filter(roles, function (role) {\n return role !== 'instructor';\n });\n }\n }\n };\n\n $scope.addUser.toggleLDConnectAccess = function (addLDConnectBool) {\n if (addLDConnectBool) {\n $scope.user.ldConnectAccess = true;\n } else {\n $scope.user.ldConnectAccess = false;\n }\n };\n\n $scope.addUser.toggleAddTranscript = function (addTranscriptAccessBool) {\n if (addTranscriptAccessBool) {\n $scope.user.addToTranscript = true;\n } else {\n $scope.user.addToTranscript = false;\n }\n };\n\n\n $scope.addUserSave = {};\n $scope.addUserSave.isLoading = false;\n $scope.addUserSave.error = errorDisplayerUtil.create();\n\n $scope.addUser.save = function() {\n var userObj = angular.copy($scope.user);\n\n if (typeof userObj.homeAddress === 'undefined' || Object.keys(userObj.homeAddress).length === 0) {\n delete userObj.homeAddress;\n }\n \n $scope.addUserSave.isLoading = true;\n\n var user = UsersService.createUser(userObj);\n user.then(function(success) {\n $scope.addUserSave.isLoading = false;\n $location.url(\"users/home\");\n }, function(failure) {\n $scope.addUserSave.isLoading = false;\n\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.addUserSave.error.setError(errorCode, message);\n $scope.addUser.errorMessage = message;\n });\n $scope.confirmSaveUser = false;\n };\n\n /* User lands on to the student transcript page */\n $scope.transcriptsAction = function() {\n $scope.homeTemplate = 'app/templates/users/transcripts/admin.html';\n\n $scope.isAdmin = true;\n\n $scope.maxDate = new Date();\n\n $scope.pageOptions.isLoading = true; // We're no longer loading!\n\n var param = $route.current.params.param;\n if (typeof param !== 'undefined') {\n var params = param.split('/');\n $scope.studentId = params[0];\n } else {\n $scope.studentId = UsersService.getId();\n }\n\n // Gets Full Name to display on transcript\n // Gets StudentId for datepickers on transcript\n var singleUser = UsersService.fetch($scope.studentId);\n\n singleUser.then(function(student) {\n $scope.fullName = student.fullName;\n $scope.studentId = student.id;\n }, function(error) {\n //TODO based on feedback.\n alert('Error displaying Full Name!');\n });\n\n // Gets the list of assignments based on studentId\n var assignments = TranscriptsService.fetch($scope.studentId);\n\n assignments.then(function(success) {\n $scope.assignments = success;\n\n $scope.pageOptions.isLoading = false; // We're no longer loading!\n\n $scope.propertyName = 'status';\n $scope.reverse = true;\n }, function(response) {\n $scope.assignments = null;\n\n $scope.pageOptions.isLoading = false; // We're no longer loading!\n\n $scope.pageOptions.error.setError(response.StatusCode, response.ErrorMessage);\n });\n };\n\n /****************** EDIT TRANSCRIPT *********************/\n $scope.editTranscript = {};\n $scope.editTranscript.isLoading = false;\n $scope.editTranscript.error = errorDisplayerUtil.create();\n\n $scope.edittranscriptAction = function() {\n $scope.homeTemplate = 'app/templates/users/edittranscript/admin.html';\n\n $scope.editTranscript.isLoading = true;\n\n var studentId = parseInt($route.current.params.param.split('/')[0]);\n var transcriptId = parseInt($route.current.params.param.split('/')[1]);\n var searchBeginDate = ($route.current.params.param.split('/')[2]);\n var searchEndDay = encodeURI($route.current.params.param.split('/')[3]);\n\n // Gets Full Name to display on transcript\n // Gets StudentId for datepickers on transcript\n var singleUser = UsersService.fetch(studentId);\n\n singleUser.then(function(student) {\n $scope.fullName = student.fullName;\n $scope.studentId = student.id;\n\n // Gets the list of assignments based on studentId\n var assignments = TranscriptsService.getSingleTranscript(studentId, transcriptId);\n\n assignments.then(function(success) {\n \n if (success.transcriptId === transcriptId) {\n $scope.completionMaxDate = moment().set({ hour: 23, minute: 0, second: 0, millisecond: 0 });\n $scope.assignment = success;\n $scope.timeCapsule = $scope.assignment.completedDate; //moment().set({ hour: $scope.assignment.completedDate.moment._a[3], minute: $scope.assignment.completedDate.moment._a[4], second: $scope.assignment.completedDate.moment._a[5], millisecond: $scope.assignment.completedDate.moment._a[6] });\n $scope.assignment.completedDate.moment.set({ hour: $scope.assignment.completedDate.moment._a[3], minute: $scope.assignment.completedDate.moment._a[4], second: $scope.assignment.completedDate.moment._a[5], millisecond: $scope.assignment.completedDate.moment._a[6] });\n $scope.assignment.startDate.moment.set({ hour: 0, minute: 0, second: 0, millisecond: 9 });\n var currentTime = new Date();\n $scope.assignment.completedDate.moment.set({ hour: currentTime.getHours(), minute: currentTime.getMinutes(), second: currentTime.getSeconds(), millisecond: currentTime.getMilliseconds() });\n $scope.assignment.startDate.moment.set({ hour: 0, minute: 0, second: 0, millisecond: 9 });\n }\n\n // throw an error\n if (typeof $scope.assignment === \"undefined\" || $scope.assignment === null) {\n $scope.orgTreeError.error.setError(404, \"Couldn't find transcript\");\n return;\n }\n \n // I keep a copy for display purposes in the title\n $scope.assignmentCopy = angular.copy($scope.assignment);\n\n $scope.editTranscript.isLoading = false;\n }, function(failure) {\n $scope.editTranscript.isLoading = false;\n\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.editTranscript.error.setError(errorCode, message);\n });\n }, function(failure) {\n $scope.editTranscript.isLoading = false;\n\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.editTranscript.error.setError(errorCode, message);\n });\n };\n\n $scope.editTranscript.saveTranscript = function (assignment) {\n\n $scope.editTranscript.isLoading = true;\n $scope.assignment.completedDate.moment.set({ hour: $scope.timeCapsule.moment._a[3] + ($scope.timeCapsule.moment.utcOffset() / 60), minute: $scope.timeCapsule.moment._a[4], second: $scope.timeCapsule.moment._a[5], millisecond: $scope.timeCapsule.moment._a[6] });\n var _assignment = TranscriptsService.updateTranscript(assignment);\n _assignment.then(function(success) {\n $scope.editTranscript.isLoading = false;\n\n $location.path('/users/transcripts/' + $scope.studentId + '/');\n }, function(failure) {\n $scope.editTranscript.isLoading = false;\n\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.editTranscript.error.setError(errorCode, message);\n });\n };\n\n /*\n * Search for users\n */\n\n $scope.userTypeahaed = {};\n $scope.userTypeahaed.error = errorDisplayerUtil.create();\n $scope.userTypeahaed.search = function (fieldName, value) {\n $scope.userTypeahaed.error.reset();\n $scope.userTypeahaed.isLoading = true;\n\n var searchAttributes = {};\n searchAttributes.pageNumber = 1;\n searchAttributes.pageSize = 25;\n //searchAttributes.sortBy = \"firstName\";\n\n if (fieldName === 'manager') {\n searchAttributes.fullNameContains = value;\n searchAttributes.roleid = 11;\n } else if (fieldName === 'person') {\n searchAttributes.fullNameContains = value;\n }\n else {\n searchAttributes[fieldName] = value;\n }\n \n var userSearchPromise = UsersService.advancedSearch(searchAttributes);\n return userSearchPromise.then(function(success) {\n $scope.userTypeahaed.isLoading = false;\n if (success.length === 0) {\n $scope.userTypeahaed.error.setError(404, 'There are no items to display.');\n return false;\n }\n var sortProperty = 'fullName';\n if (fieldName === 'usernamecontains') {\n sortProperty = \"userName\";\n }\n var finalSorted = sortService.sortByPropertyContains(success, value, sortProperty);\n return finalSorted;\n }, function (failure) {\n $scope.userTypeahaed.isLoading = false;\n $scope.userTypeahaed.error.setError(failure.StatusCode, failure.ErrorMessage);\n return [];\n });\n };\n\n $scope.PeopleData = [{ 'name': 'People Groups', 'nodes': [] }];\n $scope.PeopleData[0].nodes.push({ 'nodes': [], 'name': 'Active', 'lockIcon': true });\n $scope.PeopleData[0].nodes.push({ 'nodes': [], 'name': 'Inactive', 'lockIcon': true });\n $scope.PeopleTreeIsLoading = false;\n\n _this.getTreeData = function () {\n //Do not get the Tree data on load. Get the data on node toggle event\n $scope.managerTree = [{ 'name': 'Managers', 'nodes': [{'name':'','id':'-1'}] }];\n $scope.orgTree = [{ 'name': 'Organizations', 'nodes': [{ 'name': '', 'id': '-1' }] }];\n $scope.jobsTree = [{ 'name': 'Positions', 'nodes': [{ 'name': '', 'id': '-1' }] }];\n $scope.OrgTreeIsLoading = false;\n $scope.managerTreeIsLoading = false;\n $scope.jobsTreeLoading = false;\n };\n\n // loads the left-pane tree.\n _this.getTreeData();\n\n var locations = LocationsService.getAll();\n locations.then(function(success) {\n $scope.locations = success;\n }, function(failure) {\n // Locations is optional everywhere so we don't need to handle failure here\n });\n\n $scope.iconClick = function(node) {\n console.log(node);\n };\n\n // app/images/premiumAdmin/lock.svg\n $scope.treeOptions = {\n nodeChildren: 'nodes',\n templateUrl: 'tree.html',\n //limtiTo : 5,\n //multiSelection: true,\n //iconClick: $scope.iconClick,\n //pencilIcon: true,\n lockIcon: true,\n injectClasses: {\n ul: \"a1\",\n li: \"a2\",\n liSelected: \"a7\",\n iExpanded: \"a3\",\n iCollapsed: \"a4\",\n iLeaf: \"a5\",\n label: \"a6\",\n labelSelected: \"a8\"\n },\n enableRenderOnScroll: true,\n childrenLimitToRenderOnScroll: 50\n };\n \n $scope.onNodeToggle = function (node, isExpanded) {\n\n if (node.name === 'Organizations') {\n if (isExpanded === false) {\n $scope.orgTree =[{ 'name' : 'Organizations', 'nodes': [{ 'name': '', 'id': '-1' }]}];\n return;\n }\n if ($scope.orgTree[0].nodes[0].id !== \"-1\") {\n $scope.OrgTreeIsLoading = false;\n return;\n }\n\n if (typeof $scope.OrgData !== \"undefined\" && $scope.OrgData !== null && $scope.OrgData.length > 0) {\n $scope.OrgTreeIsLoading = true;\n $scope.orgTree = [{ 'name': 'Organizations', 'nodes': $scope.OrgData }];\n $scope.OrgTreeIsLoading = false;\n } else {\n $scope.OrgTreeIsLoading = true;\n var orgTreePromiseGroups = OrganizationsService.getOrgTree();\n orgTreePromiseGroups.then(\n function(success) {\n TreeHelpers.setPropertyOnAllNodes(success, 'lockIcon', true);\n var nodes = [];\n var i = 0;\n for (i = 0; i < success.length; i++) {\n nodes.push(success[i]);\n }\n\n $scope.OrgData = nodes;\n $scope.orgTree = [{ 'name': 'Organizations', 'nodes': nodes }];\n $scope.OrgTreeIsLoading = false;\n },\n function(failure) {\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.OrgTreeIsLoading = false;\n $scope.orgTreeError.error.setError(errorCode, message);\n });\n }\n return;\n }\n\n if (node.name === 'Managers') {\n if (isExpanded === false) {\n $scope.managerTree = [{ 'name': 'Managers', 'nodes': [{ 'name': '', 'id': '-1' }] }];\n return;\n }\n\n if ($scope.managerTree[0].nodes[0].id !== \"-1\") {\n $scope.managerTreeIsLoading = false;\n return;\n }\n\n if (typeof $scope.managerData !== \"undefined\" && $scope.managerData !== null && $scope.managerData.length > 0) {\n $scope.managerTreeIsLoading = true;\n $scope.managerTree = [{ 'name': 'Managers', 'nodes': $scope.managerData }];\n $scope.managerTreeIsLoading = false;\n } else {\n $scope.managerTreeIsLoading = true;\n var managerTreePromise = UsersService.getManagerTree();\n managerTreePromise.then(function (success) {\n $scope.managerData = success;\n $scope.managerTree = [{ 'name': 'Managers', 'nodes': $scope.managerData }];\n $scope.managerTreeIsLoading = false;\n },\n function (failure) {\n console.log(failure);\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.managerTreeIsLoading = false;\n $scope.managerTreeError.error.setError(errorCode, message);\n });\n }\n return;\n }\n\n if (node.name === 'Positions') {\n if (isExpanded === false) {\n $scope.jobsTree = [{ 'name': 'Positions', 'nodes': [{ 'name': '', 'id': '-1' }] }];\n return;\n }\n if ($scope.jobsTree[0].nodes[0].id !== \"-1\") {\n $scope.jobsTreeLoading = false;\n return;\n }\n\n if (typeof $scope.jobs !== \"undefined\" && $scope.jobs !== null) {\n $scope.jobsTreeLoading = true;\n var tempjobs = _.map(_.filter($scope.jobs, { \"hasActiveUsersAssigned\" :true }), function (j) { return _.pick(j, \"id\", \"name\"); });\n TreeHelpers.setPropertyOnAllNodes(tempjobs, 'lockIcon', true);\n $scope.jobsTree = [{ 'name': 'Positions', 'nodes': tempjobs }];\n $scope.jobsTreeLoading = false;\n\n\n } else {\n $scope.jobsTreeLoading = true;\n var positionsTreePromise = JobsService.getAllJobs();\n positionsTreePromise.then(function(success) {\n\n $scope.jobs = [];\n for (var i = 0; i < success.length; i++) {\n if (success[i].isActive === true) {\n $scope.jobs.push(success[i]);\n var index = $scope.jobs.length - 1;\n $scope.jobs[index].text = $scope.jobs[index].name;\n }\n }\n\n var activeJobs = _.map(_.filter($scope.jobs, { \"hasActiveUsersAssigned\": true }), function (j) { return _.pick(j, \"id\", \"name\"); });\n TreeHelpers.setPropertyOnAllNodes(activeJobs, 'lockIcon', true);\n\n $scope.jobsTree = [{ 'name': 'Positions', 'nodes': activeJobs }];\n $scope.jobsTreeLoading = false;\n\n }, function(failure) {\n console.log(failure);\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.jobsTreeLoading = false;\n $scope.jobsTreeError.error.setError(errorCode, message);\n });\n }\n return;\n }\n\n if (node.name === 'People Groups') {\n return;\n }\n };\n\n _this.calculatePages = function(totalCount) {\n $scope.home.total = totalCount;\n };\n\n //$timeout(function() {\n // var paginationEl = $('#pagination');\n // paginationEl.find('a').addClass(\"portalBackground\");\n //}, 3000, true);\n\n // SLY-5342 Sub domain management for user admin tab\n $scope.topLevelOrganizationId = UsersService.topLevelOrganizationId();\n $scope.isSubDomainAdmin = UsersService.isSubDomainAdmin();\n $scope.taDomains = UsersService.taDomains();\n $scope.activeDomain = UsersService.activeDomain();\n $scope.switchDomains = {};\n $scope.switchDomains.error = errorDisplayerUtil.create();\n\n $scope.onActiveDomainChanged = function (activeDomain, oldDomain) {\n var switchProfilePromise = UsersService.switchProfile(activeDomain.id);\n switchProfilePromise.then(function (success) {\n location.reload();\n }, function (failure) {\n $scope.switchDomains.error.setError(failure.StatusCode, failure.ErrorMessage);\n jQuery(\"#switchDomainsError\").show();\n setTimeout(function () {\n $scope.switchDomains.error.reset();\n jQuery(\"#switchDomainsError\").hide();\n }, 2000);\n });\n };\n \n $scope.onDomainSelectedChanged = function(domainsSelected) {\n if ($scope.user.taRoleOrgIds.length > 0)\n {\n $scope.user.taRoleOrgIds.splice(0,$scope.user.taRoleOrgIds.length);\n }\n if (domainsSelected !== undefined) {\n var i = 0;\n for (i = 0; i < domainsSelected.length; i++) {\n $scope.user.taRoleOrgIds.push(domainsSelected[i].id);\n }\n }\n };\n\n $scope.initSelectedDomains = function()\n {\n if ($scope.domainsSelected === undefined){\n $scope.domainsSelected = [];\n }\n if ($scope.user.taRoleOrgIds === undefined) {\n $scope.user.taRoleOrgIds = [];\n }\n $scope.domainsSelected.splice(0,$scope.domainsSelected.length);\n var i = 0;\n var j = 0;\n for (i = 0; i < $scope.user.taRoleOrgIds.length; i++) {\n for (j = 0; j < $scope.domainsArray.length;j++) {\n if ($scope.user.taRoleOrgIds[i] === $scope.domainsArray[j].id) {\n $scope.domainsSelected.push($scope.domainsArray[j]);\n break;\n }\n }\n }\n };\n\n $scope.setDefaultStartTime = function (dateObj) {\n if (typeof dateObj !== \"undefined\" && dateObj !== null &&\n typeof dateObj.moment !== \"undefined\" && _.isObject(dateObj.moment)) {\n if ((typeof dateObj.displayTime === \"undefined\" || dateObj.displayTime === null)) {\n var portalStartTime = dateUtil.setPortalStartTime(dateObj.moment.toDate());\n dateObj = dateUtil.formatDate(portalStartTime);\n } else {\n dateObj = dateUtil.formatDate(dateObj.moment.toDate(), dateObj.displayTime);\n }\n } else {\n dateObj= null;\n }\n\n return dateObj;\n };\n\n $scope.setDefaultEndTime = function (dateObj) {\n if (typeof dateObj !== \"undefined\" && dateObj !== null &&\n typeof dateObj.moment !== \"undefined\" && _.isObject(dateObj.moment)) {\n if ((typeof dateObj.displayTime === \"undefined\" || dateObj.displayTime === null)) {\n var portalEndTime = dateUtil.setPortalEndTime(dateObj.moment.toDate());\n dateObj = dateUtil.formatDate(portalEndTime);\n } else {\n dateObj = dateUtil.formatDate(dateObj.moment.toDate(), dateObj.displayTime);\n }\n } else {\n dateObj = null;\n }\n return dateObj;\n };\n\n $scope.setCurrentTime = function (dateObj) {\n if (typeof dateObj !== \"undefined\" && dateObj !== null && typeof dateObj.moment !== \"undefined\" && _.isObject(dateObj.moment)) {\n var currentTime = new Date();\n dateObj.moment.set({ hour: currentTime.getHours(), minute: currentTime.getMinutes(), second: currentTime.getSeconds(), millisecond: currentTime.getMilliseconds() });\n dateObj = dateUtil.formatDate(dateObj.moment.toDate(), dateObj.displayTime);\n } else {\n dateObj = null;\n }\n return dateObj;\n };\n };\n }\n]);\n\n","app.factory('Users_InstructorOverride', ['OfferingsService', 'errorDisplayerUtil', 'UsersService', function (OfferingsService, errorDisplayerUtil, UsersService) {\n return function($scope) {\n var _this = this;\n\n UsersService.setHomeRole();\n\n $scope.isFutureSelected = true;\n $scope.isPastSelected = false;\n\n $scope.options = {};\n $scope.options.isLoading = false;\n $scope.options.error = errorDisplayerUtil.create();\n\n _this.fetchInstructorOfferingsList = function (tense) {\n $scope.assignments = null;\n $scope.options.isLoading = true;\n\n $scope.role = 'instructor';\n $scope.filterView = 'app/templates/users/partials/filters/' + $scope.role + '.html';\n\n $scope.options.error.reset();\n\n var assignments = OfferingsService.fetchInstructorAssignments(tense);\n\n assignments.then(\n function (success) {\n var data = success;\n\n $scope.assignments = data;\n $scope.options.isLoading = false; // We're no longer loading!\n\n // Set for the slide down\n $scope.responseComplete = true;\n },\n function (failure) {\n $scope.options.isLoading = false; // We're no longer loading!\n\n $scope.options.error.setError(failure.StatusCode, failure.ErrorMessage);\n }\n );\n };\n\n $scope.homeAction = function (tense) {\n $scope.homeTemplate = 'app/templates/users/home/instructor.html';\n\n $scope.isLoading = true;\n\n $scope.orderProperty = tense === 'past' ? '-lowestSessionDateForOffering.original' : 'lowestSessionDateForOffering.original';\n $scope.role = 'instructor';\n\n tense = typeof tense !== 'undefined' && tense !== null ? tense : 'future';\n\n $scope.isFutureSelected = tense === 'future';\n $scope.isPastSelected = tense === 'past';\n\n _this.fetchInstructorOfferingsList(tense);\n };\n };\n}]);\n","app.factory('Users_ManagerOverride', ['$rootScope', '$http', '$location', '$timeout', '$q', '$route', '$filter', 'AssignmentsService', 'BreadcrumbsService', 'TeamService', 'TranscriptsService', 'UsersService', 'TasksService', 'dateUtil', 'errorDisplayerUtil', '$anchorScroll', 'SettingsService', function ($rootScope, $http, $location, $timeout, $q, $route, $filter, AssignmentsService, BreadcrumbsService, TeamService, TranscriptsService, UsersService, TasksService, dateUtil, errorDisplayerUtil, $anchorScroll, SettingsService) {\n return function($scope) {\n /***************************************************** MAIN MANAGER HOMEPAGE (modals near bottom of file) ******************************************/\n var _this = this;\n\n $scope.role = 'manager';\n $scope.showCareerPaths = 'false';\n UsersService.setHomeRole();\n\n /**\n * General page options to errors and loading for the person look on the home page\n */\n $scope.pageOptions.dashboardSummary = {};\n $scope.pageOptions.dashboardSummary.error = errorDisplayerUtil.create();\n $scope.pageOptions.dashboardSummary.isLoading = true;\n\n $scope.pageOptions.teamSummary = {};\n $scope.pageOptions.teamSummary.error = errorDisplayerUtil.create();\n $scope.pageOptions.teamSummary.isLoading = false;\n\n $scope.pageOptions.enrollmentRequests = {};\n $scope.pageOptions.enrollmentRequests.error = errorDisplayerUtil.create();\n $scope.pageOptions.enrollmentRequests.isLoading = false;\n\n $scope.pageOptions.managerApprovalRequests = {};\n $scope.pageOptions.managerApprovalRequests.error = errorDisplayerUtil.create();\n $scope.pageOptions.managerApprovalRequests.isLoading = false;\n\n $scope.homeTemplate = 'app/templates/users/home/manager.html';\n $scope.role = 'manager';\n\n $scope.cssDoneLoading = false;\n\n $scope.requiredOptions = [{\n \"name\": \"Yes\",\n \"value\": true\n }, {\n \"name\": \"No\",\n \"value\": false\n }];\n\n $rootScope.$watch('cssDoneLoading', function(cssDoneLoading) {\n if(cssDoneLoading !== true) {\n return;\n }\n\n /**\n * The pie charts cannot be sent the finalized colors until we finish getting this request. The issue being\n * that on page load (clean page refresh), there is nothing rendered, and we never display the correct pie chart\n * color. If the defaults are inserted after the call comes back, the pie charts get rendered correctly.\n *\n * To get around this, we wait until the custom css call is done, loop over all stylesheets, and find the\n * correct CSS rule to get the value. #workaround #hackmeamadeus\n *\n * @type {string}\n */\n var defaultColor = '#009ce6';\n\n var stylesheet = null;\n\n for(var i in document.styleSheets) {\n stylesheet = document.styleSheets[i];\n\n if(stylesheet.ownerNode.id === 'portalStyles') {\n var rules = stylesheet.rules || stylesheet.cssRules;\n\n for(var j in rules) {\n if(rules[j].selectorText === '.portalSvgFill') {\n defaultColor = rgb2hex(rules[j].style.fill);\n\n break;\n }\n }\n\n break;\n }\n }\n\n $scope.cssDoneLoading = true;\n }, true);\n\n var firstDayOfYear = new Date();\n firstDayOfYear.setDate(1);\n firstDayOfYear.setMonth(0);\n firstDayOfYear.setFullYear(firstDayOfYear.getFullYear());\n firstDayOfYear = dateUtil.setPortalStartTime(firstDayOfYear);\n\n // set default start date as 1/1/1950 to get all the data\n var defaultStartDate = new Date();\n defaultStartDate.setDate(1);\n defaultStartDate.setMonth(0);\n defaultStartDate.setFullYear(1950);\n defaultStartDate = dateUtil.setPortalStartTime(defaultStartDate);\n\n $scope.currentDateRange = dateUtil.formatDate(defaultStartDate);\n\n $scope.scrollBarConfig = {\n autoHideScrollbar: false,\n theme: 'bai',\n advanced: {\n updateOnContentResize: true\n },\n setHeight: '50vh',\n scrollInertia: 0,\n scrollButtons: {\n scrollAmount: 'auto', // scroll amount when button pressed\n enable: true // enable scrolling buttons by default\n }\n };\n\n /* Global scope variables */\n $scope.summaryExpanded = true;\n $scope.toggleSummary = function() {\n $scope.summaryExpanded = !$scope.summaryExpanded;\n };\n $scope.fullyRecursive = false;\n $scope.fullyRecursiveBottom = false;\n $scope.dueDate = null;\n $scope.apiDueDate = null;\n\n $scope.teamContextMenuExpanded = false;\n $scope.toggleTeamContextMenu = function() {\n /* wrapped in timeout so when the code for clicking outside\n * the team context menu runs, it doesn't immediately close the menu */\n $timeout(function() {\n $scope.teamContextMenuExpanded = !$scope.teamContextMenuExpanded;\n }, 1);\n };\n\n _this.closeAllContextMenus = function() {\n $scope.lookupContextMenuExpanded = false;\n $scope.teamContextMenuExpanded = false;\n };\n\n /* I don't know how to do this in angular yet but this works\n * Lets you close out a flyout menu when you click outside of it\n * without breaking event propagation.\n */\n $(document).on('click', function(event) {\n if ($scope.teamContextMenuExpanded && !$(event.target).closest('#directTeamFlyout').length) {\n $scope.$apply(function () {\n $scope.teamContextMenuExpanded = false;\n });\n }\n\n if ($scope.lookupContextMenuExpanded && !$(event.target).closest('#searchBarFlyout').length) {\n $scope.$apply(function () {\n $scope.lookupContextMenuExpanded = false;\n });\n }\n });\n\n // Storing whether direct or alternate team is selected\n $scope.selectedTeamEnum = {\n DEFAULT: '',\n DIRECT_TEAM: \"directTeam\",\n ALTERNATE_TEAM: \"alternateTeam\"\n };\n // We're selecting the direct team by default\n $scope.selectedTeam = $scope.selectedTeamEnum.DIRECT_TEAM;\n\n // Stores a list of managers directly under this user\n // Initialized in $scope.homeAction after displayDirectTeam is called.\n // Used in the direct manager flyout\n // Only users which are managers, not other users\n $scope.directTeamManagerList = null;\n\n // Stores the ID of the currently selected direct team manager\n // This gets set when you select a manager from the direct\n // team list dropdown. It gets cleared when you request the full direct/alternate\n // teams or search for something.\n // Also used when you drill down by managers via breadcrumbs and the team selectors\n // next to each manager name in the team list\n $scope.selectedDirectTeamManagerId = null;\n\n // Search filter stuff\n $scope.SEARCH_FILTER_ENUM = {\n // these values correspond to what goes into the\n // api/searchuser/?q= api\n ALL: 'all',\n PEOPLE: 'people',\n ROLES: 'role',\n GROUPS: 'group'\n };\n $scope.searchFilter = $scope.SEARCH_FILTER_ENUM.ALL;\n // filter is assumed to be a value from the search filter enum\n $scope.changeSearchFilter = function(filter) {\n $scope.searchFilter = filter;\n _this.closeAllContextMenus();\n };\n\n /* Set up pie chart defaults */\n // See old docs for help with canvas charts\n // https://github.com/chartjs/Chart.js/tree/v1.1.1/docs\n // NOT Chart.js 2.0 docs!!\n // Angular charts uses the old version of chart.js\n /*\n This code corresponds to a chart like this in\n the HTML\n \n \n */\n\n $scope.defaultDoughnutData = [\n {\n value: 0,\n color: \"#009CE6\",\n label: \"Complete\"\n },\n {\n value: 100,\n color: \"#808080\",\n label: \"Incomplete\"\n },\n {\n value: 0,\n color: \"#F63F3F\",\n label: \"Overdue\"\n }\n ];\n\n $scope.defaultDoughnutOptions = {\n showTooltips: false,\n animation: true,\n percentageInnerCutout: 60\n };\n\n $scope.setDoughnutData = function (defaults, complete, total, overdue) {\n var data = angular.copy(defaults);\n data[0].value = complete;\n data[1].value = (total - complete) - overdue;\n data[2].value = overdue;\n return data;\n };\n\n $scope.setupDoughnut = function (defaults, complete, total, options, overdue) {\n var setup = {};\n setup.data = $scope.setDoughnutData(defaults, complete, total, overdue);\n setup.options = options;\n return setup;\n };\n\n function rgb2hex(rgb) {\n if (/^#[0-9A-F]{6}$/i.test(rgb)) return rgb;\n\n rgb = rgb.match(/^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$/);\n\n return \"#\" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);\n }\n\n function hex(x) {\n return (\"0\" + parseInt(x).toString(16)).slice(-2);\n }\n\n // Getters and setters for managing the team list\n // This veriable stores exactly the team members displayed on the page\n // currently.\n // I'm using this otherwise I'd have several functions for\n // different features with access to the same variable\n $scope.teamList = null;\n _this.getTeamList = function() {\n return $scope.teamList;\n };\n\n _this.setTeamList = function (teamList) {\n\n $scope.teamList = teamList;\n $scope.teamList.forEach(function (x) {\n var totalCourse = x.complete + x.incomplete;\n x.teamdoughnut = $scope.setupDoughnut($scope.defaultDoughnutData, x.complete, (totalCourse > 0 ? totalCourse : 1), $scope.defaultDoughnutOptions, 0);\n var percentage = totalCourse > 0 ? Math.round(100 * (x.complete / totalCourse)) : 0;\n x.teamdoughnutMessage = '' + percentage + \"%
Complete
\";\n });\n };\n\n\n // Getters and setters for managing breadcrumbs\n // allows you to clear all breadcrumb and add a breadcrumb\n // Drilldown of breadcrumbs is handled in the drillDirectTeamByBreadCrumb function\n $scope.breadCrumbs = Array();\n $scope.breadCrumbsVisible = false;\n $scope.currentUserName = UsersService.getName(); // used as the title of the first breadcrumb\n\n _this.pushBreadCrumb = function(managerName, managerId) {\n $scope.breadCrumbs.push({managerName: managerName, managerId: managerId});\n\n $scope.breadCrumbsVisible = true;\n };\n\n _this.clearBreadCrumbs = function() {\n $scope.breadCrumbs = Array();\n $scope.breadCrumbsVisible = false;\n };\n\n // Holds the data stored in the teamSummary\n // Loaded only once in $scope.homeAction\n $scope.teamSummary = Array();\n\n $scope.toggleProfile = function (member) {\n member.error = errorDisplayerUtil.create();\n member.error.reset();\n\n if (member.profileExpanded) {\n member.profileExpanded = !member.profileExpanded;\n\n return;\n }\n\n member.isLoading = false;\n member.profileExpanded = true;\n\n };\n\n // Loads and displays the direct team list\n // Side effects:\n // 1) Removes all breadcrumbs\n // 2) Switches between direct/alternate team selectors\n // 3) Clears the direct team flyout\n // 4) Hides team summary\n // 5) toggles loading / errors\n $scope.displayDirectTeam = function () {\n $scope.teamList = null;\n var teamList = null;\n if ($scope.apiDueDate !== null)\n {\n teamList = TeamService.getDirectTeamList($scope.startDate.apiDate, $scope.endDate.apiDate, $scope.fullyRecursiveBottom, $scope.apiDueDate);\n } \n else\n {\n teamList = TeamService.getDirectTeamList($scope.startDate.apiDate, $scope.endDate.apiDate, $scope.fullyRecursiveBottom, null);\n } \n\n $scope.breadCrumbsVisible = false;\n\n _this.closeAllContextMenus();\n\n $scope.selectedTeam = $scope.selectedTeamEnum.DIRECT_TEAM;\n\n $scope.pageOptions.teamSummary.error.reset();\n $scope.pageOptions.teamSummary.isLoading = true;\n\n return teamList.then(function(teamList) {\n // **** See TeamService._getTeamList for format of teamList ****\n _this.setTeamList(teamList);\n\n $scope.selectedDirectTeamManagerId = null;\n\n _this.clearBreadCrumbs();\n\n if(teamList.length === 0) {\n $scope.pageOptions.teamSummary.isLoading = false;\n _this.setTeamList([]);\n\n $scope.pageOptions.teamSummary.error.setError(404, 'There are no items to display.');\n\n return;\n }\n\n /**\n * getTeamList() returns undefined if there is no data... Therefore, there is no object, but an\n * undefined value. Therefore, JS errors are thrown.\n */\n var dtl = _this.getTeamList();\n if(typeof dtl !== 'undefined' && dtl.lenght > 0) {\n $scope.directTeamManagerList = dtl.filter(function(e) { return e.isManager === true && e.teamCount > 0; });\n }\n\n $scope.pageOptions.teamSummary.isLoading = false;\n }, function(failure) {\n $scope.pageOptions.teamSummary.isLoading = false;\n\n $scope.pageOptions.teamSummary.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n // Loads and displays the alternate team list\n // Side effects:\n // 1) Removes all breadcrumbs\n // 2) Switches between direct/alternate team selectors\n // 3) Clears the direct team flyout\n // 4) Hides team summary\n // 5) toggles loading / errors\n $scope.displayAlternateTeam = function () {\n $scope.teamList = null;\n var teamList = null;\n if ($scope.apiDueDate !== null)\n {\n teamList = TeamService.getAlternateTeamList($scope.startDate.apiDate, $scope.endDate.apiDate, $scope.fullyRecursiveBottom, $scope.apiDueDate);\n } \n else\n {\n teamList = TeamService.getAlternateTeamList($scope.startDate.apiDate, $scope.endDate.apiDate, $scope.fullyRecursiveBottom, null);\n } \n\n $scope.breadCrumbsVisible = false;\n\n _this.closeAllContextMenus();\n\n $scope.selectedTeam = $scope.selectedTeamEnum.ALTERNATE_TEAM;\n\n $scope.pageOptions.teamSummary.error.reset();\n $scope.pageOptions.teamSummary.isLoading = true;\n\n teamList.then(function(teamList) {\n teamList = teamList;\n\n // **** See TeamService._getTeamList for format of teamList ****\n // Setting the value of isManager to false\n // Such that alternate team won't show the subordinates of the student\n\n $scope.selectedDirectTeamManagerId = null;\n\n _this.clearBreadCrumbs();\n\n $scope.pageOptions.teamSummary.isLoading = false;\n\n if(teamList.length === 0) {\n _this.setTeamList([]);\n\n $scope.pageOptions.teamSummary.error.setError(404, 'There were no alternate team members found');\n\n return;\n }\n\n _.each(teamList, function (student) {\n student.isManager = false;\n });\n\n _this.setTeamList(teamList);\n }, function(failure) {\n _this.setTeamList([]);\n\n $scope.pageOptions.teamSummary.isLoading = false;\n\n $scope.pageOptions.teamSummary.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n\n // PROMISE QUEUE executes 2 calls in order\n $scope.getTeamMgrDirectSummary = function (managerId) {\n //console.log(managerId);\n var teamMgrAssignmentSummary = null;\n if ($scope.apiDueDate !== null)\n {\n teamMgrAssignmentSummary = TeamService.getTeamMgrAssignmentSummary(managerId, $scope.apiDueDate);\n } \n else\n {\n teamMgrAssignmentSummary = TeamService.getTeamMgrAssignmentSummary(managerId, null);\n } \n\n var displayDirectTeamByManager = $scope.displayDirectTeamByManagerId(managerId);\n\n var promises = [];\n promises.push(teamMgrAssignmentSummary);\n\n promises.push(displayDirectTeamByManager);\n\n $q.all(promises).then(function (success) {\n $scope.rowsAreLoading = false;\n $scope.testTeamList = success[0];\n $scope.getTeamMgrAssignmentSummary($scope.testTeamList);\n \n $scope.displayDirectTeamByManager = success[1];\n\n }, function (failure) {\n $scope.pageOptions.teamSummary.error.setError(null, \"There was an issue rendering the page.\");\n });\n };\n\n // Loads and displays the direct team when you click on a minion under the current user\n // in the direct team flyout\n // Side effects:\n // 1) adds a breadcrumb so we can go back up the hierarchy\n // 2) Switches between direct/alternate team selectors\n // 3) Puts a check mark on the direct team flyout\n // 4) Loads/shows the team summary\n // 5) toggles loading / errors\n $scope.displayDirectTeamByManagerId = function(managerId) {\n try {\n\n var managerObj = _this.getTeamList().filter(function(e) { return e.studentId === managerId; })[0];\n\n // If we didn't find the managerObj in the current team list\n // That means we drilled down and clicked the flyout\n // So get the managerObj from the flyout data\n if (typeof managerObj === 'undefined') {\n managerObj = $scope.directTeamManagerList.filter(function(e) { return e.studentId === managerId; })[0];\n // We're going to recreate the breadcrumbs if they selected a manager\n // from the directTeam flyout. Otherwise the breadcrumb will just get added to the end.\n // Perhaps this function is getting too complicated??\n var recreateBreadCrumbs = true;\n }\n\n // We're gonna push the current manager to the end\n // of the breadcrumb trail\n var breadCrumbName = managerObj.firstName + ' ' + managerObj.lastName;\n var teamList = null;\n if (typeof $scope.fullyRecursiveBottom === 'undefined' || $scope.fullyRecursiveBottom === null) { $scope.fullyRecursiveBottom = false; }\n if ($scope.apiDueDate !== null)\n {\n teamList = TeamService.getDirectTeamListByManagerId(managerId, $scope.startDate.apiDate, $scope.endDate.apiDate, $scope.fullyRecursiveBottom, $scope.apiDueDate);\n } \n else\n {\n teamList = TeamService.getDirectTeamListByManagerId(managerId, $scope.startDate.apiDate, $scope.endDate.apiDate, $scope.fullyRecursiveBottom, null);\n } \n\n $scope.breadCrumbsVisible = false;\n\n _this.closeAllContextMenus();\n\n $scope.pageOptions.teamSummary.isLoading = true;\n $scope.pageOptions.teamSummary.error.reset();\n\n teamList.then(function(teamList) {\n teamList = teamList;\n\n // **** See TeamService._getTeamList for format of teamList ****\n _this.setTeamList(teamList);\n\n $scope.selectedTeam = $scope.selectedTeamEnum.DIRECT_TEAM;\n $scope.selectedDirectTeamManagerId = managerId;\n\n // Always recreate the breadcrumbs if they select a manager from the direct team flyout\n if (recreateBreadCrumbs) {\n _this.clearBreadCrumbs();\n }\n // push the bread crumb as normal.\n _this.pushBreadCrumb(breadCrumbName, managerId);\n // After we've loaded the team list, get the team summary\n\n var teamSummary = {\n onlineCourseIncomplete: 0,\n onlineCourseDueSoon: 0,\n onlineCourseCompleted: 0,\n onlineCourseOverdue: 0,\n onlineCourseCount: 0,\n instructorLedIncomplete: 0,\n instructorLedDueSoon: 0,\n instructorLedCompleted: 0,\n instructorLedOverdue: 0,\n instructorLedCount: 0,\n courseGroupsIncomplete: 0,\n courseGroupsDueSoon: 0,\n courseGroupsCompleted: 0,\n courseGroupsOverdue: 0,\n courseGroupsCount: 0,\n tasksIncomplete: 0,\n tasksDueSoon: 0,\n tasksCompleted: 0,\n tasksOverdue: 0,\n tasksCount: 0,\n totalsIncomplete: 0,\n totalsDueSoon: 0,\n totalsCompleted: 0,\n totalsOverdue: 0,\n totalsCount: 0,\n pieChartData: [0, 0]\n };\n\n for (i = 0; i < teamList.length; i++) {\n teamSummary.onlineCourseIncomplete += teamList[i].onlineCourse.incomplete;\n teamSummary.onlineCourseDueSoon += teamList[i].onlineCourse.dueSoon;\n teamSummary.onlineCourseCompleted += teamList[i].onlineCourse.completed;\n teamSummary.onlineCourseOverdue += teamList[i].onlineCourse.overdue;\n teamSummary.onlineCourseCount += teamList[i].onlineCourseCount;\n\n teamSummary.instructorLedIncomplete += teamList[i].instructorLed.incomplete;\n teamSummary.instructorLedDueSoon += teamList[i].instructorLed.dueSoon;\n teamSummary.instructorLedCompleted += teamList[i].instructorLed.completed;\n teamSummary.instructorLedOverdue += teamList[i].instructorLed.overdue;\n teamSummary.instructorLedCount += teamList[i].instructorLedCount;\n\n teamSummary.courseGroupsIncomplete += teamList[i].courseGroups.incomplete;\n teamSummary.courseGroupsDueSoon += teamList[i].courseGroups.dueSoon;\n teamSummary.courseGroupsCompleted += teamList[i].courseGroups.completed;\n teamSummary.courseGroupsOverdue += teamList[i].courseGroups.overdue;\n teamSummary.courseGroupsCount += teamList[i].courseGroupsCount;\n\n teamSummary.tasksIncomplete += teamList[i].tasks.incomplete;\n teamSummary.tasksDueSoon += teamList[i].tasks.dueSoon;\n teamSummary.tasksCompleted += teamList[i].tasks.completed;\n teamSummary.tasksOverdue += teamList[i].tasks.overdue;\n teamSummary.tasksCount += teamList[i].tasksCount;\n\n teamSummary.totalsIncomplete += teamList[i].totals.incomplete;\n teamSummary.totalsDueSoon += teamList[i].totals.dueSoon;\n teamSummary.totalsCompleted += teamList[i].totals.completed;\n teamSummary.totalsOverdue += teamList[i].totals.overdue;\n teamSummary.totalsCount += teamList[i].totalsCount;\n }\n\n teamSummary.pieChartData[0] = teamSummary.totalsCompleted;\n teamSummary.pieChartData[1] = teamSummary.totalsIncomplete;\n teamSummary.pieChartData[2] = 0;\n\n if (typeof $scope.teamSummary2 !== 'undefined' && $scope.teamSummary2 !== null)\n {\n teamSummary.onlineCourseIncomplete += $scope.teamSummary2.onlineCourseIncomplete;\n teamSummary.onlineCourseDueSoon += $scope.teamSummary2.onlineCourseDueSoon;\n teamSummary.onlineCourseCompleted += $scope.teamSummary2.onlineCourseCompleted;\n teamSummary.onlineCourseOverdue += $scope.teamSummary2.onlineCourseOverdue;\n teamSummary.onlineCourseCount += $scope.teamSummary2.onlineCourseCount;\n\n teamSummary.instructorLedIncomplete += $scope.teamSummary2.instructorLedIncomplete;\n teamSummary.instructorLedDueSoon += $scope.teamSummary2.instructorLedDueSoon;\n teamSummary.instructorLedCompleted += $scope.teamSummary2.instructorLedCompleted;\n teamSummary.instructorLedOverdue += $scope.teamSummary2.instructorLedOverdue;\n teamSummary.instructorLedCount += $scope.teamSummary2.instructorLedCount;\n\n teamSummary.courseGroupsIncomplete += $scope.teamSummary2.courseGroupsIncomplete;\n teamSummary.courseGroupsDueSoon += $scope.teamSummary2.courseGroupsDueSoon;\n teamSummary.courseGroupsCompleted += $scope.teamSummary2.courseGroupsCompleted;\n teamSummary.courseGroupsOverdue += $scope.teamSummary2.courseGroupsOverdue;\n teamSummary.courseGroupsCount += $scope.teamSummary2.courseGroupsCount;\n\n teamSummary.tasksIncomplete += $scope.teamSummary2.tasksIncomplete;\n teamSummary.tasksDueSoon += $scope.teamSummary2.tasksDueSoon;\n teamSummary.tasksCompleted += $scope.teamSummary2.tasksCompleted;\n teamSummary.tasksOverdue += $scope.teamSummary2.tasksOverdue;\n teamSummary.tasksCount += $scope.teamSummary2.tasksCount;\n\n teamSummary.totalsIncomplete += $scope.teamSummary2.totalsIncomplete;\n teamSummary.totalsDueSoon += $scope.teamSummary2.totalsDueSoon;\n teamSummary.totalsCompleted += $scope.teamSummary2.totalsCompleted;\n teamSummary.totalsOverdue += $scope.teamSummary2.totalsOverdue;\n teamSummary.totalsCount += $scope.teamSummary2.totalsCount;\n\n teamSummary.pieChartData[0] = teamSummary.totalsCompleted + $scope.teamSummary2.totalsCompleted;\n teamSummary.pieChartData[1] = teamSummary.totalsIncomplete + $scope.teamSummary2.totalsIncomplete;\n }\n //subManagerRollUp Donut\n var totalCourse = teamSummary.totalsCompleted + teamSummary.totalsIncomplete;\n teamSummary.subMdoughnut = $scope.setupDoughnut($scope.defaultDoughnutData, teamSummary.totalsCompleted, (totalCourse > 0 ? totalCourse : 1), $scope.defaultDoughnutOptions, 0);\n var percentage = totalCourse > 0 ? Math.round(100 * (teamSummary.totalsCompleted / totalCourse)) : 0;\n teamSummary.subdoughnutMessage = '' + percentage + '%
Complete
';\n\n $scope.teamSummary = teamSummary;\n $scope.teamSummary.managerName = breadCrumbName;\n $scope.breadCrumbsVisible = true;\n\n $scope.pageOptions.teamSummary.isLoading = false;\n\n $scope.pageOptions.teamSummary.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n } catch(err) {\n console.log(err);\n var stackTrace = new Error();\n console.log(stackTrace.stack);\n\n $scope.pageOptions.teamSummary.error.setError(null, \"There was an issue rendering the page.\");\n }\n \n };\n\n $scope.getTeamMgrAssignmentSummary = function (teamList) {\n\n var teamSummary2 = {\n onlineCourseIncomplete: 0,\n onlineCourseDueSoon: 0,\n onlineCourseCompleted: 0,\n onlineCourseOverdue: 0,\n onlineCourseCount: 0,\n instructorLedIncomplete: 0,\n instructorLedDueSoon: 0,\n instructorLedCompleted: 0,\n instructorLedOverdue: 0,\n instructorLedCount: 0,\n courseGroupsIncomplete: 0,\n courseGroupsDueSoon: 0,\n courseGroupsCompleted: 0,\n courseGroupsOverdue: 0,\n courseGroupsCount: 0,\n tasksIncomplete: 0,\n tasksDueSoon: 0,\n tasksCompleted: 0,\n tasksOverdue: 0,\n tasksCount: 0,\n totalsIncomplete: 0,\n totalsDueSoon: 0,\n totalsCompleted: 0,\n totalsOverdue: 0,\n totalsCount: 0,\n pieChartData: [0, 0]\n };\n\n\n teamSummary2.onlineCourseIncomplete += teamList.onlineCourse.incomplete;\n teamSummary2.onlineCourseDueSoon += teamList.onlineCourse.dueSoon;\n teamSummary2.onlineCourseCompleted += teamList.onlineCourse.completed;\n teamSummary2.onlineCourseOverdue += teamList.onlineCourse.overdue;\n teamSummary2.onlineCourseCount += teamList.onlineCourseCount;\n\n teamSummary2.instructorLedIncomplete += teamList.instructorLed.incomplete;\n teamSummary2.instructorLedDueSoon += teamList.instructorLed.dueSoon;\n teamSummary2.instructorLedCompleted += teamList.instructorLed.completed;\n teamSummary2.instructorLedOverdue += teamList.instructorLed.overdue;\n teamSummary2.instructorLedCount += teamList.instructorLedCount;\n\n teamSummary2.courseGroupsIncomplete += teamList.courseGroups.incomplete;\n teamSummary2.courseGroupsDueSoon += teamList.courseGroups.dueSoon;\n teamSummary2.courseGroupsCompleted += teamList.courseGroups.completed;\n teamSummary2.courseGroupsOverdue += teamList.courseGroups.overdue;\n teamSummary2.courseGroupsCount += teamList.courseGroupsCount;\n\n teamSummary2.tasksIncomplete += teamList.tasks.incomplete;\n teamSummary2.tasksDueSoon += teamList.tasks.dueSoon;\n teamSummary2.tasksCompleted += teamList.tasks.completed;\n teamSummary2.tasksOverdue += teamList.tasks.overdue;\n teamSummary2.tasksCount += teamList.tasksCount;\n\n teamSummary2.totalsIncomplete += teamList.totals.incomplete;\n teamSummary2.totalsDueSoon += teamList.totals.dueSoon;\n teamSummary2.totalsCompleted += teamList.totals.completed;\n teamSummary2.totalsOverdue += teamList.totals.overdue;\n teamSummary2.totalsCount += teamList.totalsCount;\n\n $scope.teamSummary2 = teamSummary2;\n\n };\n\n // PROMISE QUEUE executes 2 calls in order\n $scope.getTeamMgrDirectBreadcrumb = function (breadCrumbIndex) {\n\n var managerIdx = $scope.breadCrumbs[breadCrumbIndex].managerId;\n\n //console.log(managerId);\n var teamMgrAssignmentSummary = null;\n if ($scope.apiDueDate !== null)\n {\n teamMgrAssignmentSummary = TeamService.getTeamMgrAssignmentSummary(managerIdx, $scope.apiDueDate); } \n else\n {\n teamMgrAssignmentSummary = TeamService.getTeamMgrAssignmentSummary(managerIdx, null);\n } \n\n var displayDirectTeamByManager = $scope.drillDirectTeamByBreadCrumb(breadCrumbIndex);\n\n var promises = [];\n promises.push(teamMgrAssignmentSummary);\n\n promises.push(displayDirectTeamByManager);\n\n $q.all(promises).then(function (success) {\n $scope.rowsAreLoading = false;\n $scope.testTeamList = success[0];\n $scope.getTeamMgrAssignmentSummary($scope.testTeamList);\n\n $scope.displayDirectTeamByManager = success[1];\n\n }, function (failure) {\n $scope.pageOptions.teamSummary.error.setError(null, \"There was an issue rendering the page.\");\n });\n };\n\n // Drills into a direct team by breadcrumb\n // Side effects:\n // 1) Removes breadcrumbs up until the one we're drilling into\n // 2) Switches between direct/alternate team selectors to the direct team\n // 3) Removes check mark on the direct team flyout\n // 4) Loads/shows the team summary\n // 5) toggles loading / errors\n $scope.drillDirectTeamByBreadCrumb = function(breadCrumbIndex) {\n var managerId = $scope.breadCrumbs[breadCrumbIndex].managerId;\n\n // We're gonna make whatever manager they clicked on\n // Be the tail end of the bread crumb\n var breadCrumbName = $scope.breadCrumbs[breadCrumbIndex].managerName;\n var teamList = null;\n if ($scope.apiDueDate !== null)\n {\n teamList = TeamService.getDirectTeamListByManagerId(managerId, $scope.startDate.apiDate, $scope.endDate.apiDate, $scope.apiDueDate);\n } \n else\n {\n teamList = TeamService.getDirectTeamListByManagerId(managerId, $scope.startDate.apiDate, $scope.endDate.apiDate, null);\n } \n $scope.breadCrumbsVisible = false;\n _this.closeAllContextMenus();\n\n $scope.pageOptions.teamSummary.isLoading = true;\n\n teamList.then(function(teamList) {\n teamList = teamList;\n\n // **** See TeamService._getTeamList for format of teamList ****\n _this.setTeamList(teamList);\n\n $scope.selectedTeam = $scope.selectedTeamEnum.DIRECT_TEAM;\n $scope.selectedDirectTeamManagerId = null;\n\n // Remove all extra breadcrumbs after the one we're drilling into\n var originalBreadCrumbLength = $scope.breadCrumbs.length;\n for (var i = breadCrumbIndex; i < originalBreadCrumbLength; i += 1) {\n $scope.breadCrumbs.pop();\n }\n\n // Need to get the manager name here\n _this.pushBreadCrumb(breadCrumbName, managerId);\n\n // After we've loaded the team list, get the team summary\n \n var teamSummary = {\n onlineCourseIncomplete: 0,\n onlineCourseDueSoon: 0,\n onlineCourseCompleted: 0,\n onlineCourseOverdue: 0,\n onlineCourseCount: 0,\n instructorLedIncomplete: 0,\n instructorLedDueSoon: 0,\n instructorLedCompleted: 0,\n instructorLedOverdue: 0,\n instructorLedCount: 0,\n courseGroupsIncomplete: 0,\n courseGroupsDueSoon: 0,\n courseGroupsCompleted: 0,\n courseGroupsOverdue: 0,\n courseGroupsCount: 0,\n tasksIncomplete: 0,\n tasksDueSoon: 0,\n tasksCompleted: 0,\n tasksOverdue: 0,\n tasksCount: 0,\n totalsIncomplete: 0,\n totalsDueSoon: 0,\n totalsCompleted: 0,\n totalsOverdue: 0,\n totalsCount: 0,\n pieChartData: [0, 0]\n };\n\n for (i = 0; i < teamList.length; i++) {\n teamSummary.onlineCourseIncomplete += teamList[i].onlineCourse.incomplete;\n teamSummary.onlineCourseDueSoon += teamList[i].onlineCourse.dueSoon;\n teamSummary.onlineCourseCompleted += teamList[i].onlineCourse.completed;\n teamSummary.onlineCourseOverdue += teamList[i].onlineCourse.overdue;\n teamSummary.onlineCourseCount += teamList[i].onlineCourseCount;\n\n teamSummary.instructorLedIncomplete += teamList[i].instructorLed.incomplete;\n teamSummary.instructorLedDueSoon += teamList[i].instructorLed.dueSoon;\n teamSummary.instructorLedCompleted += teamList[i].instructorLed.completed;\n teamSummary.instructorLedOverdue += teamList[i].instructorLed.overdue;\n teamSummary.instructorLedCount += teamList[i].instructorLedCount;\n\n teamSummary.courseGroupsIncomplete += teamList[i].courseGroups.incomplete;\n teamSummary.courseGroupsDueSoon += teamList[i].courseGroups.dueSoon;\n teamSummary.courseGroupsCompleted += teamList[i].courseGroups.completed;\n teamSummary.courseGroupsOverdue += teamList[i].courseGroups.overdue;\n teamSummary.courseGroupsCount += teamList[i].courseGroupsCount;\n\n teamSummary.tasksIncomplete += teamList[i].tasks.incomplete;\n teamSummary.tasksDueSoon += teamList[i].tasks.dueSoon;\n teamSummary.tasksCompleted += teamList[i].tasks.completed;\n teamSummary.tasksOverdue += teamList[i].tasks.overdue;\n teamSummary.tasksCount += teamList[i].tasksCount;\n\n teamSummary.totalsIncomplete += teamList[i].totals.incomplete;\n teamSummary.totalsDueSoon += teamList[i].totals.dueSoon;\n teamSummary.totalsCompleted += teamList[i].totals.completed;\n teamSummary.totalsOverdue += teamList[i].totals.overdue;\n teamSummary.totalsCount += teamList[i].totalsCount;\n }\n\n teamSummary.pieChartData[0] = teamSummary.totalsCompleted;\n teamSummary.pieChartData[1] = teamSummary.totalsIncomplete;\n teamSummary.pieChartData[2] = 0;\n\n if (typeof $scope.teamSummary2 !== 'undefined' && $scope.teamSummary2 !== null) {\n teamSummary.onlineCourseIncomplete += $scope.teamSummary2.onlineCourseIncomplete;\n teamSummary.onlineCourseDueSoon += $scope.teamSummary2.onlineCourseDueSoon;\n teamSummary.onlineCourseCompleted += $scope.teamSummary2.onlineCourseCompleted;\n teamSummary.onlineCourseOverdue += $scope.teamSummary2.onlineCourseOverdue;\n teamSummary.onlineCourseCount += $scope.teamSummary2.onlineCourseCount;\n\n teamSummary.instructorLedIncomplete += $scope.teamSummary2.instructorLedIncomplete;\n teamSummary.instructorLedDueSoon += $scope.teamSummary2.instructorLedDueSoon;\n teamSummary.instructorLedCompleted += $scope.teamSummary2.instructorLedCompleted;\n teamSummary.instructorLedOverdue += $scope.teamSummary2.instructorLedOverdue;\n teamSummary.instructorLedCount += $scope.teamSummary2.instructorLedCount;\n\n teamSummary.courseGroupsIncomplete += $scope.teamSummary2.courseGroupsIncomplete;\n teamSummary.courseGroupsDueSoon += $scope.teamSummary2.courseGroupsDueSoon;\n teamSummary.courseGroupsCompleted += $scope.teamSummary2.courseGroupsCompleted;\n teamSummary.courseGroupsOverdue += $scope.teamSummary2.courseGroupsOverdue;\n teamSummary.courseGroupsCount += $scope.teamSummary2.courseGroupsCount;\n\n teamSummary.tasksIncomplete += $scope.teamSummary2.tasksIncomplete;\n teamSummary.tasksDueSoon += $scope.teamSummary2.tasksDueSoon;\n teamSummary.tasksCompleted += $scope.teamSummary2.tasksCompleted;\n teamSummary.tasksOverdue += $scope.teamSummary2.tasksOverdue;\n teamSummary.tasksCount += $scope.teamSummary2.tasksCount;\n\n teamSummary.totalsIncomplete += $scope.teamSummary2.totalsIncomplete;\n teamSummary.totalsDueSoon += $scope.teamSummary2.totalsDueSoon;\n teamSummary.totalsCompleted += $scope.teamSummary2.totalsCompleted;\n teamSummary.totalsOverdue += $scope.teamSummary2.totalsOverdue;\n teamSummary.totalsCount += $scope.teamSummary2.totalsCount;\n\n teamSummary.pieChartData[0] = teamSummary.totalsCompleted + $scope.teamSummary2.totalsCompleted;\n teamSummary.pieChartData[1] = teamSummary.totalsIncomplete + $scope.teamSummary2.totalsIncomplete;\n }\n\n\n $scope.teamSummary = teamSummary;\n $scope.teamSummary.managerName = breadCrumbName;\n $scope.breadCrumbsVisible = true;\n\n $scope.pageOptions.teamSummary.isLoading = false;\n }, function(failure) {\n _this.setTeamList([]);\n\n failure = failure;\n\n $scope.breadCrumbsVisible = false;\n\n $scope.pageOptions.teamSummary.isLoading = false;\n\n $scope.pageOptions.teamSummary.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n /* Executes a search query and */\n // $scope.search = function(terms) {}\n\n var getManagerCareerPathSummary = function () {\n var summaryPromise = TeamService.getCareerPathSummary($scope.fullyRecursive);\n $scope.pageOptions.dashboardSummary.error.reset();\n $scope.pageOptions.dashboardSummary.isLoading = true;\n summaryPromise.then(function (success) {\n $scope.summary = success;\n $scope.pageOptions.dashboardSummary.isLoading = false;\n $scope.finalDoughnut = $scope.setupDoughnut($scope.defaultDoughnutData, $scope.summary.assignedUsersCount, $scope.summary.totalReports, $scope.defaultDoughnutOptions,0);\n var percentage = Math.round($scope.summary.assignedUsersCount / $scope.summary.totalReports * 100);\n $scope.doughnutMessage = percentage + '%
usage';\n }, function (failure) {\n $scope.pageOptions.dashboardSummary.isLoading = false;\n $scope.pageOptions.dashboardSummary.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n $scope.showViewByUser = true;\n var getManagerCareerPathStudentSummary = function (teamType, fullyRecursive) {\n $scope.cpStudentError = false;\n \n var stuSummaryPromise = TeamService.getCareerPathStudentSummary(fullyRecursive, teamType);\n $scope.cpStudentSummaryIsLoading = true;\n stuSummaryPromise.then(function (success) {\n if (success.length === 0) {\n $scope.cpStudentError = true;\n $scope.cpStudentErrorMessage = \"There are no items to display\";\n $scope.careerPathDetailsForOtherFilter = [];\n if (!$scope.showViewByUser) { $scope.showByCareerPath(); }\n } else {\n $scope.careerPathDetailsForOtherFilter = success;\n success.forEach(function (x) {\n //SET the career path completed amount and total assigned amount \n if (x.careerPathDetails !== null) {\n x.assigned = x.careerPathDetails.length;\n x.completed = x.careerPathDetails.length > 0 ? $filter('filter')(x.careerPathDetails, { \"careerPathComplete\": true }, true).length : 0;\n x.inProgress = x.careerPathDetails.length > 0 ? $filter('filter')(x.careerPathDetails, { \"careerPathInProgress\": true }, true).length : 0;\n x.careerPathDetails.forEach(function (cpI) {\n if (cpI.careerPathInProgress === true) {\n //format each in progress career path for the doughnut\n cpI.doughnutDetails = $scope.setupDoughnut($scope.defaultDoughnutData, cpI.completedCourses, (cpI.courses > 0 ? cpI.courses : 1), $scope.defaultDoughnutOptions, 0);\n var percentage = cpI.courses > 0 ? Math.round(cpI.completedCourses / cpI.courses * 100) : 0;\n cpI.doughnutMessage = percentage + \"%\";\n }\n });\n }\n });\n if (!$scope.showViewByUser) { $scope.showByCareerPath(); }\n }\n \n $scope.studentSummary = success;\n $scope.cpStudentSummaryIsLoading = false;\n }, function (failure) {\n $scope.cpStudentSummaryIsLoading = false;\n\n $scope.cpStudentError = true;\n $scope.cpStudentErrorMessage = failure.ErrorMessage;\n\n $scope.careerPathDetailsForOtherFilter = [];\n if (!$scope.showViewByUser) { $scope.showByCareerPath(); }\n });\n };\n\n $scope.showByCareerPath = function () {\n $scope.byCareerPathView = [];\n $scope.showViewByUser = false;\n\n $scope.careerPathDetailsForOtherFilter.forEach(function (person) {\n if (person.careerPathDetails !== null) {\n person.careerPathDetails.forEach(function (cpath) {\n var cpIndex = _.findIndex($scope.byCareerPathView, { 'careerPathId': cpath.careerPathId });\n if (cpIndex >= 0) {\n addUserToCareerPath(cpath, person, $scope.byCareerPathView[cpIndex]);\n } else {\n var c = {\n 'careerPathName': cpath.name,\n 'careerPathId': cpath.careerPathId,\n 'careerPathImage': 'grab_bag\\/' + cpath.careerPathImage + '.png',\n 'studentsCompleted': [],\n 'studentsInProgress': [],\n 'studentsEnrolled': []\n };\n addUserToCareerPath(cpath, person, c);\n $scope.byCareerPathView.push(c);\n }\n }); }\n });\n\n if ($scope.byCareerPathView.length === 0) {\n $scope.cpStudentError = true;\n $scope.cpStudentErrorMessage = \"There are no items to display\";\n }\n };\n\n $scope.showByEmployee = function () {\n /* Display by the Employee View - remove the error message if it was added because there were no assigned CPs*/\n if ($scope.studentSummary.length > 0) {\n $scope.cpStudentError = false;\n }\n $scope.showViewByUser = true;\n };\n\n var addUserToCareerPath = function (careerPathData, person, arrayToAddTo) {\n if (careerPathData.careerPathComplete) {\n arrayToAddTo.studentsCompleted.push({ 'name': person.firstName + ' ' + person.lastName, 'lastName': person.lastName, 'firstName': person.firstName, 'jobType': person.jobType, 'userId': person.userId });\n } else if (careerPathData.careerPathInProgress) {\n arrayToAddTo.studentsInProgress.push({ 'name': person.firstName + ' ' + person.lastName, 'lastName': person.lastName });\n } else {\n arrayToAddTo.studentsEnrolled.push({ 'name': person.firstName + ' ' + person.lastName, 'lastName': person.lastName });\n }\n };\n\n /**\n * List of actions for \"routing\" purposes.\n */\n $scope.homeAction = function (skipAction) {\n\n var currentRoute = \"\";\n if ($route.current.params.param !== undefined && $route.current.params.param !== null) {\n var params = $route.current.params.param.split('/');\n if (params.length > 0) {\n currentRoute = params[0].toLowerCase();\n }\n }\n\n if (typeof skipAction === 'undefined' || skipAction === false) {\n if (typeof skipAction === 'undefined') {\n $scope.endDate = dateUtil.formatDate(new Date());\n $scope.startDate = dateUtil.formatDate(defaultStartDate);\n }\n }\n \n var careerPathAccess = UsersService.hasCareerPathAccess();\n careerPathAccess.then(function (success) {\n $scope.showCareerPaths = success;\n }, function (failure) {\n });\n\n if (currentRoute === \"careerpaths\") {\n $scope.currentRoute = currentRoute;\n $scope.homeTemplate = 'app/templates/users/home/managerCareerPath.html';\n $scope.myAssignmentsActive = \"\";\n $scope.myCareerPathsActive = \"active portalBackground portalBorder\";\n getManagerCareerPathSummary();\n getManagerCareerPathStudentSummary('direct', false);\n\n } else {\n $scope.homeTemplate = 'app/templates/users/home/manager.html';\n $scope.myAssignmentsActive = \"active portalBackground portalBorder\";\n $scope.myCareerPathsActive = \"\";\n /* Get the summary data.\n * Prepopulate the list of managers for the direct team dropdown.\n */\n $scope.showme = false;\n $scope.pageOptions.dashboardSummary.error.reset();\n $scope.pageOptions.dashboardSummary.isLoading = true;\n\n $scope.pageOptions.teamSummary.error.reset();\n $scope.pageOptions.teamSummary.isLoading = true;\n\n $scope.getManagerSummary();\n\n /* Get the users's name */\n $scope.teamListTitle = UsersService.getName();\n\n /* The breadcrumb is used for going up the hierarchy of managers */\n // Anything added to the breadcrumb\n // will be displayed\n $scope.breadcrumb = Array();\n\n /* Load the direct team list by default.\n * Also populates the direct team flyout\n */\n $scope.displayDirectTeam();\n }\n };\n\n $scope.updateDueDate = function (dateObj){\n if (typeof dateObj !== \"undefined\" && dateObj !== null &&\n typeof dateObj.moment !== \"undefined\" && _.isObject(dateObj.moment)) {\n if ((typeof dateObj.displayTime === \"undefined\" || dateObj.displayTime === null)) {\n $scope.dueDate = dateUtil.formatDate(dateObj.moment.toDate());\n $scope.dueDate = $scope.setDueDateEndTime($scope.dueDate);\n $scope.apiDueDate = moment.utc($scope.dueDate.moment).format('YYYYMMDDHHmmss');\n } else {\n $scope.dueDate = dateUtil.formatDate(dateObj.moment.toDate(), dateObj.displayTime);\n $scope.dueDate = $scope.setDueDateEndTime($scope.dueDate);\n $scope.apiDueDate = moment.utc($scope.dueDate.moment).format('YYYYMMDDHHmmss');\n }\n } else {\n $scope.dueDate= $scope.endDate;\n }\n $scope.getManagerSummary();\n $scope.displayDirectTeam();\n };\n\n $scope.toggleFullyRecursive = function () {\n $scope.fullyRecursive = !$scope.fullyRecursive;\n $scope.getManagerSummary();\n };\n\n $scope.toggleFullyRecursiveBottom = function () {\n $scope.fullyRecursiveBottom = !$scope.fullyRecursiveBottom;\n\n $scope.displayDirectTeam();\n\n };\n\n $scope.toggleFullyRecursiveCareerPath = function() {\n $scope.fullyRecursive = !$scope.fullyRecursive;\n getManagerCareerPathSummary();\n };\n\n //\n $scope.getManagerSummary = function () {\n $scope.pageOptions.dashboardSummary.isLoading = true;\n var summary = null;\n if ($scope.apiDueDate !== null)\n {\n summary = TeamService.getSummary($scope.startDate.apiDate, $scope.endDate.apiDate, $scope.fullyRecursive, $scope.apiDueDate);\n } \n else\n {\n summary = TeamService.getSummary($scope.startDate.apiDate, $scope.endDate.apiDate, $scope.fullyRecursive, null);\n\n } \n summary.then(function (summaryData) {\n // $scope.summary contains\n // directReports, subordinates, altTeamMembers, enrollmentReqeusts, taskApprovalRequired, webBased, instructorLed, courseGroups, tasks, overdue, complete, incomplete, pieChartData: [complete, incomplete]\n // The pie chart data field is inserted manually by the service\n\n $scope.summary = summaryData;\n $scope.pageOptions.dashboardSummary.isLoading = false;\n var totalCourse = $scope.summary.complete + $scope.summary.incomplete;\n $scope.finalDoughnut = $scope.setupDoughnut($scope.defaultDoughnutData, $scope.summary.complete, (totalCourse > 0 ? totalCourse : 1) , $scope.defaultDoughnutOptions, $scope.summary.overdue);\n var percentage = totalCourse > 0 ? Math.round(100 * ($scope.summary.complete / totalCourse)) : 0;\n $scope.doughnutMessage = percentage + '%
Complete';\n\n }, function (failure) {\n $scope.pageOptions.dashboardSummary.isLoading = false;\n $scope.pageOptions.dashboardSummary.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n\n };\n\n /**\n * This method allows us to see the current assignments of a single user\n */\n $scope.listAction = function () {\n $scope.homeTemplate = 'app/templates/users/list/manager.html';\n\n _this.fetchStudentAssignments();\n\n BreadcrumbsService.pushCrumb(\"Dashboard\", 'student/home/');\n BreadcrumbsService.pushCrumb(\"List\");\n };\n\n /**\n * Perform a search to find all users that exist below a manager in an organization\n */\n $scope.searchForUnderlings = function() {\n var underlings = this.underlings;\n\n $scope.pageOptions.teamSummary.error.reset();\n\n $scope.pageOptions.teamSummary.isLoading = true;\n\n var users = UsersService.search(underlings, $scope.searchFilter);\n users.then(function(success) {\n var allIds = [];\n var users = success;\n\n for(var i = 0; i < users.length; i++) {\n allIds.push(users[i].id);\n }\n\n users = TeamService.getSummariesByUserId(allIds, $scope.startDate.apiDate, $scope.endDate.apiDate);\n users.then(function(success) {\n $scope.pageOptions.teamSummary.isLoading = false;\n\n $scope.selectedTeam = $scope.selectedTeamEnum.DEFAULT;\n\n _this.setTeamList(success);\n }, function(failure) {\n $scope.pageOptions.teamSummary.isLoading = false;\n\n _this.setTeamList([]);\n\n $scope.pageOptions.teamSummary.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n }, function(failure) {\n $scope.pageOptions.teamSummary.isLoading = false;\n\n _this.setTeamList([]);\n\n $scope.pageOptions.teamSummary.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n /***************************************************** ENROLLMENT REQUESTS MODAL ******************************************/\n $scope.enrollmentRequestsAction = function () {\n jQuery('#enrollmentRequestsModal').modal();\n var approvalAssignments = TeamService.getListOfAssignmentsToApprove();\n approvalAssignments.then(function (assignmentData) {\n $scope.approvalAssignments = assignmentData;\n\n if (assignmentData.length === 0) {\n $scope.pageOptions.enrollmentRequests.error.setError(404, 'There were no requests found');\n }\n }, function (failure) {\n // Hide the summary and display the error if it didn't load.\n $scope.apiError = true;\n $scope.responseComplete = true;\n\n $scope.pageOptions.enrollmentRequests.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n //.studentId, assignment.offeringId, assignment.transcriptId, assignment.assignmentType\n $scope.ApproveRequest = function (assignment) {\n var offeringId = assignment.offeringId;\n var studentId = assignment.studentId;\n var transcriptId = assignment.transcriptId;\n var type = assignment.assignmentType;\n\n assignment.error.reset();\n assignment.isLoading = true;\n\n var approveAction = AssignmentsService.approveDenyEnrollment(studentId, offeringId, transcriptId, type, true);\n approveAction.then(function() {\n $scope.enrollmentRequestsAction();\n }, function (failure) {\n assignment.isLoading = false;\n\n assignment.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n //assignment.studentId, assignment.offeringId, assignment.transcriptId, assignment.assignmentType\n $scope.DenyRequest = function (assignment) {\n var offeringId = assignment.offeringId;\n var studentId = assignment.studentId;\n var transcriptId = assignment.transcriptId;\n var type = assignment.assignmentType;\n\n assignment.error.reset();\n assignment.isLoading = true;\n\n var denyAction = AssignmentsService.approveDenyEnrollment(studentId, offeringId, transcriptId, type, false);\n denyAction.then(function (sucess) {\n $scope.enrollmentRequestsAction();\n }, function (failure) {\n assignment.isLoading = false;\n\n assignment.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n\n /***************************************************** APPROVALS MODAL ******************************************/\n $scope.approvalsAction = function() {\n jQuery('#approvalsModal').modal();\n\n $scope.pageOptions.managerApprovalRequests.error.reset();\n\n var managerApprovalTasks = TeamService.getTasksForApproval();\n managerApprovalTasks.then(function(taskData) {\n $scope.approvalTasks = taskData;\n }, function(failure) {\n $scope.pageOptions.managerApprovalRequests.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n $scope.CompletedTask = function(userId, id, task) {\n task.isLoading = true;\n\n //Reset the error\n task.error.reset();\n\n var completeAction = TasksService.taskApproval(userId, id, true);\n completeAction.then(function () {\n $scope.approvalsAction();\n }, function (failure) {\n task.isLoading = false;\n\n task.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n $scope.NotCompletedTask = function(userId, id, task) {\n task.isLoading = true;\n\n //Reset the error\n task.error.reset();\n\n var completeAction = TasksService.taskApproval(userId, id, false);\n\n completeAction.then(function () {\n $scope.approvalsAction();\n }, function (failure) {\n task.isLoading = false;\n\n task.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n /* Function refreshs the page on close of modal*/\n $scope.refresh = function() {\n $scope.homeAction();\n };\n\n /***************************************************** ADD ASSIGNMENTS MODAL ******************************************/\n /* Create functions to handle business logic of error checking and switching tabs */\n $scope.addAssignments = {};\n\n $scope.addAssignments.error = errorDisplayerUtil.create();\n\n /**\n * Fix for 2403. Since JS is loose, not defining an attribute on an object returns undefined, which resolves to false,\n * which is bad for us, since we need it to resolve to true later.\n */\n $scope.addAssignments.noUsersSelectedError = false;\n\n /* Stores which step of the add assignments modal to track */\n $scope.addAssignments.STEP_ENUM = {\n ASSIGNMENTS: 1,\n DUE_DATE: 2,\n AUDIENCE: 3\n };\n\n /* Stores what's currently displayed on the search tab */\n $scope.addAssignments.SEARCH_TAB_ENUM = {\n PLEASE_BEGIN: 0, /* Haven't typed anything yet or deleted search term */\n LOADING: 1,\n ERROR: 2,\n NO_RESULTS: 3,\n RESULTS_FOUND: 4\n };\n $scope.addAssignments.searchTabState = $scope.addAssignments.SEARCH_TAB_ENUM.PLEASE_BEGIN;\n\n /* Stores what's currently displayed on the audience tab */\n $scope.addAssignments.AUDIENCE_TAB_ENUM = {\n SELECT_USERS: 0,\n LOADING: 1,\n ERROR: 2,\n SUCCESS: 3\n };\n $scope.addAssignments.audienceTabState = $scope.addAssignments.AUDIENCE_TAB_ENUM.SELECT_USERS;\n\n /* Stores assignments */\n // This one stores the list of assignments in the\n // search page\n $scope.addAssignments.searchResults = Array();\n // This one stores assignments indexed by ID\n // we can add assignments with\n // $scope.addAssignments.queuedAssignments[assignment.id] = assignment;\n // and delete them with\n // delete $scope.addAssignments.queuedAssignments[assignment.id];\n // and check if an assignment exists with\n // if (assignment.id in $scope.addAssignments.queuedAssignments)\n $scope.addAssignments.queuedAssignments = {};\n\n // Used on due date tab. keeps list of assignments that have been unchecked\n // If the user goes to the first or last tabs, this variable will be used to remove assignments\n // from the list of queued assignments\n // Used in same manner as $scope.addAssignments.queuedAssignments except it's the opposite\n $scope.addAssignments.assignmentsToggledForRemoval = {};\n\n $scope.addAssignments.clearAddAssignmentsModal = function() {\n $scope.addAssignments.queuedAssignments = {};\n $scope.addAssignments.assignmentsToggledForRemoval = {};\n $scope.addAssignments.selectedUsers = {};\n $scope.addAssignments.keyword = '';\n $scope.addAssignments.noUsersSelectedError = false;\n $scope.addAssignments.step = $scope.addAssignments.STEP_ENUM.ASSIGNMENTS;\n $scope.addAssignments.searchResults = Array();\n $scope.addAssignments.searchTabState = $scope.addAssignments.SEARCH_TAB_ENUM.PLEASE_BEGIN;\n $scope.addAssignments.audienceTabState = $scope.addAssignments.AUDIENCE_TAB_ENUM.SELECT_USERS;\n $scope.addAssignments.autoOpenedList = false;\n\n $scope.addAssignments.error.reset();\n\n activateAssignmentsPill();\n };\n\n // Stores the list of selected users\n // Used same way as $scope.addAssignments.queuedAssignments\n // See that $scope.addAssignments.queuedAssignments for details\n $scope.addAssignments.selectedUsers = {};\n\n // On audience tab, stores whether the Everyone, Alternate or Direct Team boxes are checked\n // When these are checked, when the user is submitting in tab 3, these will be checked\n // and will change the content / override $scope.addAssignments.selectedUsers\n\n /* Used for storing search data for filtering assignments at top of modal */\n $scope.addAssignments.keyword = '';\n\n $scope.addAssignments.step = $scope.addAssignments.STEP_ENUM.ASSIGNMENTS;\n\n // Keeps track of whether we should disable the next/submit button\n $scope.addAssignments.buttonDisabled = false;\n\n // Flag to automatically open the team list in the add assignment modals.\n $scope.addAssignments.autoOpenedList = false;\n\n // In addition to revealing the select assignments tab\n // this function checks the list of assignments toggled for removal\n // and removes those assignments from the queue\n $scope.addAssignments.selectAssignments = function() {\n // reset the last tab in case the user wants to assign more assignments\n $scope.addAssignments.audienceTabState = $scope.addAssignments.AUDIENCE_TAB_ENUM.SELECT_USERS;\n\n /* Check if any assignments are in the list of assignments toggled for removal\n * Remove those assignments */\n deleteAssignmentsToggledForRemoval($scope.addAssignments.queuedAssignments, $scope.addAssignments.assignmentsToggledForRemoval);\n $scope.addAssignments.assignmentsToggledForRemoval = {}; // need to figure out how to clear this inside the function\n\n $scope.addAssignments.step = $scope.addAssignments.STEP_ENUM.ASSIGNMENTS;\n };\n\n /* These three functions are necessary\n * because there isn't a clear way to override how bootstrap pills work\n * If there's a way to do it, override these functions\n */\n var activateAssignmentsPill = function() {\n setTimeout(function() {\n angular.element('#assignmentsTabSelector').addClass('active');\n angular.element('#dueDateTabSelector').removeClass('active');\n angular.element('#audienceTabSelector').removeClass('active');\n\n angular.element('#assignmentsTabSelector > a').addClass('portalBackground');\n angular.element('#assignmentsTabSelector > .nav-arrow').addClass('portalBorderLeft');\n\n angular.element('#dueDateTabSelector > a').removeClass('portalBackground');\n angular.element('#dueDateTabSelector > .nav-arrow').removeClass('portalBorderLeft');\n angular.element('#dueDateTabSelector > .nav-wedge').removeClass('portalBorderTop portalBorderRight portalBorderBottom');\n\n angular.element('#audienceTabSelector > a').removeClass('portalBackground');\n angular.element('#audienceTabSelector > .nav-arrow').removeClass('portalBorderLeft');\n angular.element('#audienceTabSelector > .nav-wedge').removeClass('portalBorderTop portalBorderRight portalBorderBottom');\n }, 1);\n };\n\n var activateDueDatePill = function() {\n setTimeout(function() {\n angular.element('#assignmentsTabSelector').removeClass('active');\n angular.element('#dueDateTabSelector').addClass('active');\n angular.element('#audienceTabSelector').removeClass('active');\n\n // Clear extra colors coming from custom CSS call for first tab\n angular.element('#assignmentsTabSelector > a').removeClass('portalBackground');\n angular.element('#assignmentsTabSelector > .nav-arrow').removeClass('portalBorderLeft');\n\n // Add extra colors coming from custom CSS call for second tab\n angular.element('#dueDateTabSelector > a').addClass('portalBackground');\n angular.element('#dueDateTabSelector > .nav-arrow').addClass('portalBorderLeft');\n angular.element('#dueDateTabSelector > .nav-wedge').addClass('portalBorderTop portalBorderRight portalBorderBottom');\n }, 1);\n };\n\n var activateAudiencePill = function() {\n setTimeout(function() {\n angular.element('#assignmentsTabSelector').removeClass('active');\n angular.element('#dueDateTabSelector').removeClass('active');\n angular.element('#audienceTabSelector').addClass('active');\n\n // Clear colors coming from custom CSS call for second tab\n angular.element('#dueDateTabSelector > a').removeClass('portalBackground');\n angular.element('#dueDateTabSelector > .nav-arrow').removeClass('portalBorderLeft');\n angular.element('#dueDateTabSelector > .nav-wedge').removeClass('portalBorderTop portalBorderRight portalBorderBottom');\n\n // Add extra colors coming from custom CSS call for third tab\n angular.element('#audienceTabSelector > a').addClass('portalBackground');\n angular.element('#audienceTabSelector > .nav-wedge').addClass('portalBorderTop portalBorderRight portalBorderBottom');\n }, 1);\n };\n\n // This function goes through every assignment toggled for removal\n // in the assignmentsToggledForRemoval variable\n // and removes it from the list of queuedAssignments\n\n var deleteAssignmentsToggledForRemoval = function(queuedAssignments, assignmentsToggledForRemoval) {\n var assignmentsToRemoveIds = Object.keys(assignmentsToggledForRemoval);\n\n for (var i = 0; i < assignmentsToRemoveIds.length; i += 1) {\n if (assignmentsToRemoveIds[i] in queuedAssignments) {\n delete queuedAssignments[assignmentsToRemoveIds[i]];\n }\n }\n };\n\n // This function also checks if we've selected some assignments,\n // if not, it puts the user back on the select assignments tab.\n $scope.addAssignments.selectDueDate = function() {\n // reset the last tab in case the user wants to assign more assignments\n $scope.addAssignments.audienceTabState = $scope.addAssignments.AUDIENCE_TAB_ENUM.SELECT_USERS;\n\n // If the user hasn't selected any assignments, don't let them go to the due date tab\n if (Object.keys($scope.addAssignments.queuedAssignments).length === 0) {\n $scope.addAssignments.step = $scope.addAssignments.STEP_ENUM.ASSIGNMENTS;\n activateAssignmentsPill();\n $scope.addAssignments.noAssignmentsSelectedError = true;\n return;\n }\n\n // otherwise let the user eat cake!\n $scope.addAssignments.step = $scope.addAssignments.STEP_ENUM.DUE_DATE;\n $scope.addAssignments.noAssignmentsSelectedError = false;\n\n // Mark career paths recommended and all other course types recommended\n _.each($scope.addAssignments.queuedAssignments, function (assignment) {\n if (assignment.type === \"careerPath\") {\n assignment.isRequired = false;\n } else {\n assignment.isRequired = true;\n }\n });\n\n activateDueDatePill();\n };\n\n $scope.addAssignments.nextButton = function() {\n switch($scope.addAssignments.step) {\n case $scope.addAssignments.STEP_ENUM.ASSIGNMENTS:\n $scope.addAssignments.selectDueDate();\n\n break;\n case $scope.addAssignments.STEP_ENUM.DUE_DATE:\n $scope.addAssignments.selectAudience();\n\n break;\n // Assign the selected assignments to all selected users\n case $scope.addAssignments.STEP_ENUM.AUDIENCE:\n $scope.addAssignments.submitAssignmentsForSelectedUsers();\n\n break;\n }\n };\n\n /*** search assignments tab logic */\n /* On the select assignments tab, this function allows the user to\n * search for assignments by assignment type. It handles calling the service\n * and displaying the data.\n * Also checks if assignments were already queued. if so, premarks them as checked\n */\n $scope.addAssignments.searchAssignments = function (keyword, assignmentType) {\n if (assignmentType === \"unknown\" && keyword.length < 2) return;\n // If you do another action, clear the error\n $scope.addAssignments.noAssignmentsSelectedError = false;\n $scope.addAssignments.searchTabState = $scope.addAssignments.SEARCH_TAB_ENUM.LOADING;\n\n $scope.addAssignments.error.reset();\n\n var assignments = TeamService.searchAssignments(keyword, assignmentType);\n assignments.then(function(assignmentsData) {\n assignmentsData = assignmentsData;\n\n for (var i = 0; i < assignmentsData.length; i += 1) {\n if (assignmentsData[i].id in $scope.addAssignments.queuedAssignments) {\n assignmentsData[i].checked = true;\n }\n }\n\n $scope.addAssignments.searchResults = assignmentsData;\n if (assignmentsData.length === 0) {\n $scope.addAssignments.searchTabState = $scope.addAssignments.SEARCH_TAB_ENUM.NO_RESULTS;\n } else {\n $scope.addAssignments.searchTabState = $scope.addAssignments.SEARCH_TAB_ENUM.RESULTS_FOUND;\n }\n }, function(failure) {\n $scope.addAssignments.error.setError(failure.StatusCode, failure.ErrorMessage);\n\n /* I should be checking this in the service end somehow */\n if (failure.StatusCode === 404) {\n if ($scope.addAssignments.keyword === '') {\n $scope.addAssignments.searchTabState = $scope.addAssignments.SEARCH_TAB_ENUM.PLEASE_BEGIN;\n } else {\n $scope.addAssignments.searchResults = [];\n $scope.addAssignments.searchTabState = $scope.addAssignments.SEARCH_TAB_ENUM.NO_RESULTS;\n }\n } else {\n $scope.addAssignments.searchTabState = $scope.addAssignments.SEARCH_TAB_ENUM.ERROR;\n }\n });\n };\n\n // When you select an assignment in the search tab, it gets\n // added to the list of queued assignments here\n $scope.addAssignments.queueAssignment = function(assignment) {\n if (assignment.id in $scope.addAssignments.queuedAssignments) {\n delete $scope.addAssignments.queuedAssignments[assignment.id];\n\n if (Object.keys($scope.addAssignments.queuedAssignments).length === 0) {\n $scope.addAssignments.noAssignmentsSelectedError = true;\n }\n } else {\n $scope.addAssignments.queuedAssignments[assignment.id] = assignment;\n\n // if you've selected something then you shouldn't see this error\n $scope.addAssignments.noAssignmentsSelectedError = false;\n }\n };\n\n /*** due date tab stuff */\n // When you click on a check box in the due date tab,\n // this function toggles whether or not an assignment should be removed\n $scope.addAssignments.toggleAssignmentForRemoval = function(assignment) {\n if (assignment.id in $scope.addAssignments.assignmentsToggledForRemoval) {\n delete $scope.addAssignments.assignmentsToggledForRemoval[assignment.id];\n } else {\n $scope.addAssignments.assignmentsToggledForRemoval[assignment.id] = assignment;\n }\n };\n\n /*** audience tab stuff */\n // Stores the list of trees in the audience tab\n $scope.addAssignments.audienceData = [];\n\n /* Handles group checking in the audience tab */\n var selectUsersRecursively = function(item, checked) {\n item.checked = checked;\n\n // if the item is checked, add it to list of selected users\n if (item.checked) {\n $scope.addAssignments.selectedUsers[item.studentId] = item;\n } else {\n // @TODO @sneilan check if any other trees of users are checked\n // don't delete the user if it's checked somewhere else\n delete $scope.addAssignments.selectedUsers[item.studentId];\n }\n\n if (item.teamList && item.teamList.length > 0) {\n for (var i = 0; i < item.teamList.length; i+=1) {\n selectUsersRecursively(item.teamList[i], checked);\n }\n }\n\n if (item.alternateTeamList && item.alternateTeamList.length > 0) {\n for (var j = 0; j < item.alternateTeamList.length; j+=1) {\n selectUsersRecursively(item.alternateTeamList[j], checked);\n }\n }\n };\n\n $scope.addAssignments.toggleUser = function(item, recursive) {\n // By default remove the error\n // We'll renable the no users selected error near the bottom\n // If the user hasn't selected any users\n $scope.addAssignments.noUsersSelectedError = false;\n\n // toggle the checkbox\n item.checked = !item.checked;\n\n // if the item is checked, add it to list of selected users\n if (item.checked) {\n $scope.addAssignments.selectedUsers[item.studentId] = item;\n } else {\n // @TODO @sneilan check if any other trees of users are checked\n // don't delete the user if it's checked somewhere else\n delete $scope.addAssignments.selectedUsers[item.studentId];\n }\n\n if (recursive === true && item.teamList && item.teamList.length > 0) {\n for (var i = 0; i < item.teamList.length; i += 1) {\n selectUsersRecursively(item.teamList[i], item.checked);\n }\n }\n\n // if no users are selected, display an error\n /**\n * This code is never run unless this method is called\n */\n if (Object.keys($scope.addAssignments.selectedUsers).length === 0) {\n $scope.addAssignments.noUsersSelectedError = true;\n }\n };\n\n /* Handles visibility of team member lists in the audience tab */\n $scope.addAssignments.toggle = function(item) {\n item.hidden = !item.hidden;\n };\n\n /* list, object, property.. */\n _this.setPropertyOnAllNodes = function(data, name, value) {\n for (var i = 0; i < data.length; i += 1) {\n data[i][name] = value;\n\n // if there are subnodes,\n // set them to hidden also\n /**\n * This never recurses.\n */\n if (typeof data[i].teamList !== 'undefined' && data[i].teamList.length > 0) {\n _this.setPropertyOnAllNodes(data[i].teamList, name, value);\n }\n }\n };\n\n // This function gets the assignments from\n // $scope.addAssignments.queuedAssignments = {}\n // and users from\n // $scope.addAssignments.selectedUsers = {};\n // and submits the assignments\n // it's called by the next button but only on the audience tab\n $scope.addAssignments.submitAssignmentsForSelectedUsers = function() {\n // don't continue if the user hasn't selected any users\n /**\n * This check must be performed instead of the noUsersSelectedError check because\n * toggleUsers (the only place that is changed to true) is not inherently run, as it relies\n * on an user's action. We have to check how many\n */\n if(Object.keys($scope.addAssignments.selectedUsers).length === 0) {\n $scope.addAssignments.noUsersSelectedError = true;\n\n return;\n }\n\n $scope.addAssignments.audienceTabState = $scope.addAssignments.AUDIENCE_TAB_ENUM.LOADING;\n\n var assignmentIds = Object.keys($scope.addAssignments.queuedAssignments);\n\n var userIds = Object.keys($scope.addAssignments.selectedUsers);\n\n var promises = [];\n\n var createPromiseToSubmitAssignment = function(userId, assignmentId) {\n return AssignmentsService.submitAssignment(userId, assignmentId);\n };\n\n for (var i = 0; i < assignmentIds.length; i += 1) {\n for (var j = 0; j < userIds.length; j += 1) {\n var assignmentKey = Object.keys($scope.addAssignments.queuedAssignments)[i];\n\n var assignment = angular.copy($scope.addAssignments.queuedAssignments[assignmentKey]);\n\n if (typeof assignment.dueDate !== 'undefined' && assignment.dueDate !== null && typeof assignment.dueDate.moment !== \"undefined\" && _.isObject(assignment.dueDate.moment) )\n assignment.dueDate = assignment.dueDate.moment.utc().format();\n else assignment.dueDate = null;\n\n var userKey = Object.keys($scope.addAssignments.selectedUsers)[j];\n\n var user = $scope.addAssignments.selectedUsers[userKey];\n promises.push(createPromiseToSubmitAssignment(user.studentId, assignment));\n }\n }\n\n $q.all(promises).then(function(values) {\n $scope.addAssignments.audienceTabState = $scope.addAssignments.AUDIENCE_TAB_ENUM.SUCCESS;\n\n jQuery('#addAssignmentsModal').modal('hide');\n\n jQuery('#addAssignmentsModal').on('hidden.bs.modal', function () {\n $scope.homeAction();\n\n $scope.addAssignments.clearAddAssignmentsModal();\n });\n\n $scope.cpFilter.direct = true;\n $scope.cpFilter.alterate = false;\n $scope.cpFilter.sub = false;\n\n }, function(failure) {\n $scope.addAssignments.audienceTabState = $scope.addAssignments.AUDIENCE_TAB_ENUM.ERROR;\n\n $scope.addAssignments.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n // In addition to revealing the select audience tab\n // this function checks the list of assignments toggled for removal\n // and removes those assignments from the queue\n $scope.addAssignments.selectAudience = function() {\n // If the user hasn't selected any assignments, don't let them go to the audience tab\n if (Object.keys($scope.addAssignments.queuedAssignments).length === 0) {\n $scope.addAssignments.step = $scope.addAssignments.STEP_ENUM.ASSIGNMENTS;\n\n activateAssignmentsPill();\n\n $scope.addAssignments.noAssignmentsSelectedError = true;\n\n return;\n }\n\n /* Check if any assignments are in the list of assignments toggled for removal\n * Remove those assignments.\n * If there are no assignments in the queue, send us back to the select assignments tab\n * trigger a tooltip on the select audience tab stating an error.\n */\n\n var numQueuedAssignments = Object.keys($scope.addAssignments.queuedAssignments).length;\n var numAssignmentsMarkedForDeletion = Object.keys($scope.addAssignments.assignmentsToggledForRemoval).length;\n\n // if the user has marked all assignments for deletion, don't let them continue\n if (numQueuedAssignments === numAssignmentsMarkedForDeletion) {\n $scope.addAssignments.step = $scope.addAssignments.STEP_ENUM.DUE_DATE;\n\n activateDueDatePill();\n\n $scope.addAssignments.noAssignmentsSelectedError = true;\n\n return;\n }\n\n deleteAssignmentsToggledForRemoval($scope.addAssignments.queuedAssignments, $scope.addAssignments.assignmentsToggledForRemoval);\n\n $scope.addAssignments.assignmentsToggledForRemoval = {};\n\n $scope.addAssignments.step = $scope.addAssignments.STEP_ENUM.AUDIENCE;\n\n activateAudiencePill();\n };\n\n /*** Create the modal here */\n // Creates the add assignments modal\n // called by the Add Assignment button\n // next to each team member\n /**\n * Opens the add assignments modal for a specific user within a manager's team. They can be at any level of\n * the team tree.\n *\n * @param teamMember Object\n */\n $scope.addAssignmentsAction = function(teamMember) {\n _this.getTeamRecursiveList(teamMember);\n\n $scope.stepThreeView = 'app/templates/users/home/modals/addAssignmentViews/step3.audience.subTeam.html';\n\n jQuery('#addAssignmentsModal').modal();\n };\n\n /*** Create the modal here */\n // Creates the add assignments modal\n // called by the Add Assignment button\n // next to each team member\n /**\n * Opens the add assignments modal for the entire team of the logged in manager.\n *\n * @param teamMember Object\n */\n $scope.addAssignmentsActionForAllTeams = function() {\n var teamMember = UsersService.user;\n\n teamMember.studentId = UsersService.getId();\n\n _this.getTeamRecursiveList(teamMember);\n\n var alternateTeam = null;\n if ($scope.apiDueDate !== null)\n {\n alternateTeam = TeamService.getAlternateTeamList($scope.startDate.apiDate, $scope.endDate.apiDate, $scope.fullyRecursiveBottom, $scope.apiDueDate);\n } \n else\n {\n alternateTeam = TeamService.getAlternateTeamList($scope.startDate.apiDate, $scope.endDate.apiDate, $scope.fullyRecursiveBottom, null);\n } \n alternateTeam.then(function(teamTree) {\n teamTree = teamTree;\n\n var audienceRoot = {};\n\n audienceRoot.firstName = teamMember.firstName;\n audienceRoot.lastName = teamMember.lastName;\n audienceRoot.studentId = teamMember.studentId;\n audienceRoot.teamList = teamTree;\n\n $scope.addAssignments.alternateDataList = audienceRoot; // needs to be in array because\n // end result is list of lists\n\n // add my team (direct) list to audienceData\n\n // Make all team members hidden by default\n _this.setPropertyOnAllNodes($scope.addAssignments.alternateDataList, 'hidden', true);\n\n // uncheck all team members by default\n _this.setPropertyOnAllNodes($scope.addAssignments.alternateDataList, 'checked', false);\n }, function(failure) {\n // @TODO do something if we can't load the modal\n console.log(failure);\n });\n\n $scope.stepThreeView = 'app/templates/users/home/modals/addAssignmentViews/step3.audience.fullTeam.html';\n\n jQuery('#addAssignmentsModal').modal();\n\n $scope.setDefaultAssignmentType();\n };\n\n $scope.addAssignmentsWithLibraryActionForAllTeams = function () {\n $scope.assignmentTeamModalhide = false;\n $scope.$broadcast('openAddAssignmentsModal', { displaytype: 3, studentId: null });\n };\n\n $scope.setDueDateEndTime = function (dateObj) {\n if (typeof dateObj !== 'undefined' && dateObj !== null && typeof dateObj.moment !== 'undefined' && _.isObject(dateObj.moment)) {\n var newdt = dateUtil.setPortalEndTime(dateObj.moment.toDate());\n dateObj = dateUtil.formatDate(newdt);\n } else {\n dateObj = null;\n }\n return dateObj;\n };\n\n \n $scope.mgrUpdateDueDate = function (dateObj, assignment) {\n assignment.dueDate = $scope.getEndDateTimeFromPicker(dateObj);\n $scope.editAssignment(assignment);\n };\n\n\n /**\n * Method for a manager to change the due date for a single individual\n *\n * @param assignment Object selected assigned which will have its due date changed.\n */\n $scope.editAssignment = function (assignment) {\n var params = $route.current.params.param.split('/');\n var studentId = params[0];\n var courseId = assignment.assignmentCourseId;\n\n var finalDate = null;\n if (assignment.dueDate !== null && assignment.dueDate.moment !== null && assignment.dueDate.moment.isValid()) {\n finalDate = assignment.dueDate.moment.toISOString();\n }\n\n assignment.error.reset();\n assignment.openCalendar = false;\n assignment.changingDueDate = true;\n \n var change = AssignmentsService.updateDueDate(UsersService.getId(), studentId, courseId, finalDate);\n change.then(function (success) {\n assignment.changingDueDate = false;\n }, function(error) {\n assignment.error.setError(error.status, error.message);\n assignment.changingDueDate = false;\n });\n };\n\n\n\n /**\n * Generic method to set start and end dates to pass to the appropriate APIs\n *\n * @param skipAction Boolean determines if we should skip calling this method; only set to true on page load\n */\n $scope.updateDatesForSummaries = function (skipAction, dateObj) {\n\n if (typeof dateObj === 'undefined' || typeof dateObj.moment === 'undefined' || !_.isObject(dateObj.moment)) {\n $scope.startDate = dateUtil.formatDate(defaultStartDate);\n } else {\n var newdt = dateUtil.setPortalStartTime(dateObj.moment.toDate());\n dateObj.moment.set({ hour: newdt.getHours(), minute: newdt.getMinutes(), second: newdt.getSeconds(), millisecond: newdt.getMilliseconds() });\n $scope.startDate = dateUtil.formatDate(newdt);\n }\n\n $scope.homeAction(skipAction);\n };\n\n\n /* User lands on to the student transcript page */\n $scope.transcriptsAction = function () {\n $scope.homeTemplate = 'app/templates/users/transcripts/manager.html';\n\n $scope.maxDate = new Date();\n\n $scope.pageOptions.isLoading = true; // We're no longer loading!\n\n var param = $route.current.params.param;\n\n if (param) {\n var params = param.split('/');\n var studentId = params[0];\n _this.getTranscriptAction(studentId);\n }\n };\n\n $scope.studentId = UsersService.getId();\n _this.getTranscriptAction = function (studentId) {\n\n // Gets Full Name to display on transcript\n // Gets StudentId for datepickers on transcript\n var singleUser = UsersService.fetch(studentId);\n\n singleUser.then(function (student) {\n $scope.fullName = student.fullName;\n $scope.studentId = student.id;\n }, function(error) {\n //TODO based on feedback.\n alert('Error displaying Full Name!');\n });\n\n // Gets the list of assignments based on studentId\n var assignments = TranscriptsService.fetch(studentId);\n\n assignments.then(function (success) {\n $scope.assignments = success;\n\n $scope.pageOptions.isLoading = false; // We're no longer loading!\n\n $scope.sortBy = 'status';\n }, function (response) {\n $scope.assignments = null;\n\n $scope.pageOptions.isLoading = false; // We're no longer loading!\n\n $scope.pageOptions.error.setError(response.StatusCode, response.ErrorMessage);\n });\n\n BreadcrumbsService.pushCrumb(\"my team\", 'users/home');\n BreadcrumbsService.pushCrumb(\"transcripts\");\n\n };\n\n /**\n * Delete a user's assignment\n *\n * @param assignment Object the assignment that will be dropped\n */\n $scope.removeAssignment = function (assignment) {\n var confirmRemove;\n\n if (assignment.type.toLowerCase() === 'coursegroupcurricula' || assignment.type.toLowerCase() === 'coursegroupcertification' || assignment.type.toLowerCase() === 'coursegroup') {\n confirmRemove = confirm(\"This course was assigned by a course group. If you click OK, you will remove the entire course group. Are you sure you want to remove this course group?\");\n } else {\n confirmRemove = confirm(\"Are you sure you want to remove this content?\");\n }\n\n if (confirmRemove) {\n var assignmentRemove = AssignmentsService.removeAssignment(assignment);\n\n assignmentRemove.then(function (success) {\n $scope.apiMessage = 'The course ' + assignment.name + ' has been successfully dropped.';\n jQuery('#apiMessage-' + assignment.id).toggle();\n setTimeout(function () {\n _this.fetchStudentAssignments();\n }, 2000);\n\n\n }, function (response) {\n $scope.apiMessage = 'Sorry! There was an issue removing the course. Please try again!';\n jQuery('#apiMessage-' + assignment.id).toggle();\n setTimeout(function () {\n jQuery('#apiMessage-' + assignment.id).toggle();\n }, 2000);\n\n });\n } else {\n $scope.apiActionLoader = false;\n }\n };\n\n $scope.Math = window.Math;\n $scope.dump = function(value) { console.warn(value); };\n\n /* Defined here temporarily for list view. Will need to be factored out into an override */\n _this.fetchStudentAssignments = function () {\n $scope.isLoading = true;\n\n //Get input paramters from the url\n var params = $route.current.params.param.split('/');\n\n var currentDateRange = $location.search().type;\n\n var endDate = dateUtil.formatDate(new Date());\n var startDate = dateUtil.formatDate(new Date(currentDateRange));\n\n var courseState = params[2];\n var courseType = params[1];\n var studentId = params[0];\n var certCurrId = params[3];\n\n $scope.pageOptions.error.reset();\n\n var assignments = null;\n\n //If the page coming in is CourseGroupCert or CourseGroupCurr then call the service to get assignments based on the given course group\n if (courseType.toLowerCase() === 'coursegroupcurricula' || courseType.toLowerCase() === 'coursegroupcertification') {\n assignments = AssignmentsService.getCourseGroupCourses(studentId, courseType, certCurrId);\n } else {\n assignments = AssignmentsService.getAssignmentsBystateAndType(studentId, courseType, courseState, startDate.apiDate, endDate.apiDate);\n }\n\n var studentCall = UsersService.fetch(studentId);\n\n assignments.then(\n function (success) {\n $scope.isLoading = false;\n $scope.courseGroup = false;\n\n var data = success;\n\n // Assign english name to assignment\n if (courseType.toLowerCase() === 'wbt') {\n $scope.managerListViewHeader = 'Web Based Course Assignments';\n } else if (courseType.toLowerCase() === 'ilt') {\n $scope.managerListViewHeader = 'Instructor Led Course Assignments';\n } else if (courseType.toLowerCase() === 'coursegroup') {\n $scope.managerListViewHeader = 'Course Group Assignments';\n $scope.courseGroup = true;\n } else if (courseType.toLowerCase() === 'coursegroupcurricula' || courseType.toLowerCase() === 'coursegroupcertification') {\n $scope.managerListViewHeader = data[0].certificationName + data[0].curriculumName + ' Courses';\n } else {\n $scope.managerListViewHeader = data.type;\n }\n \n // Kick out the Elective/NotRequired Courses Start\n var x = data.length-1;\n\n for (x3 = data.length-1; x3 >= 0; x3--) {\n if (data[x3].assignedById === data[x3].studentId || data[x3].isRequired === false || data[x3].parentCourseGroupId > 0)\n {\n data.splice(x, 1);\n }\n x--;\n }\n // Kick out the Elective/NotRequired Courses End\n\n\n\n\n // Kick out the Duplicate Courses Start\n var dataSortedById = data.sort(\n function (a, b) {\n if (a.id === b.id) {\n return b.assignmentId - a.assignmentId;\n }\n return a.id > b.id ? 1 : -1;\n });\n\n var x2 = 0;\n\n for (x2 = 0; x2 < dataSortedById.length; x2++)\n {\n for (y = x2+1; y < dataSortedById.length; y++) {\n if (dataSortedById[x2].id === dataSortedById[y].id)\n {\n dataSortedById.splice(y, 1);\n }\n }\n }\n // Kick out the Duplicate Courses End\n\n $scope.apiError = false;\n $scope.assignments = data;\n $scope.isLoading = false; // We're no longer loading!\n $scope.responseComplete = true;\n },\n function (failure) {\n $scope.apiError = true;\n $scope.isLoading = false;\n $scope.responseComplete = true;\n\n $scope.pageOptions.error.setError(failure.StatusCode, failure.ErrorMessage);\n }\n );\n\n studentCall.then(function (student) {\n var apostrophe = student.fullName.slice(-1) === 's' ? '\\'' : '\\'s';\n\n $scope.studentFullName = student.fullName + apostrophe;\n }, function() {\n /**\n * @TODO: What happens on a failure?\n */\n });\n };\n\n /**\n * Get a full user tree structure\n *\n * @param managerId Integer ID, on which, to retrieve appropriate direct and subordinate team members\n */\n _this.getTeamRecursiveList = function(teamMember) {\n var audienceRoot = {};\n\n audienceRoot.firstName = teamMember.firstName;\n audienceRoot.lastName = teamMember.lastName;\n audienceRoot.studentId = teamMember.studentId;\n audienceRoot.hidden = false;\n\n // Preload the audience tab data\n if ($scope.apiDueDate !== null){\n TeamService.recursiveTeamList(teamMember.studentId, $scope.startDate.apiDate, $scope.endDate.apiDate, $scope.apiDueDate).then(function(teamTree) {\n audienceRoot.teamList = teamTree;\n\n $scope.addAssignments.audienceData = [audienceRoot]; // needs to be in array because\n }, function() {\n /**\n * If there's a failure, let's at least show one person.\n */\n $scope.addAssignments.audienceData = [audienceRoot]; // needs to be in array because\n });\n }\n else\n {\n TeamService.recursiveTeamList(teamMember.studentId, $scope.startDate.apiDate, $scope.endDate.apiDate, null).then(function(teamTree) {\n audienceRoot.teamList = teamTree;\n \n $scope.addAssignments.audienceData = [audienceRoot]; // needs to be in array because\n }, function() {\n /**\n * If there's a failure, let's at least show one person.\n */\n $scope.addAssignments.audienceData = [audienceRoot]; // needs to be in array because\n });\n }\n };\n\n $scope.toggleThisAssignmentsCalender = function($event, assignment) {\n assignment.openCalendar = !assignment.openCalendar;\n };\n\n /******************* OVERDUE MODAL *************************************************/\n\n $scope.overdueAssignments = [];\n $scope.overdueAssignments.assignments = [];\n $scope.overdueAssignments.error = errorDisplayerUtil.create();\n $scope.overdueAssignments.isLoading = false;\n $scope.callExport = false;\n $scope.openOverdueModal = function () {\n \n jQuery('#overdueModal').modal();\n $scope.overdueAssignments.isLoading = true;\n $scope.overdueAssignments.error.reset();\n var overdueCall = null;\n if ($scope.apiDueDate !== null)\n {\n \n overdueCall = TeamService.getOverdueAssignments($scope.startDate.apiDate, $scope.endDate.apiDate, $scope.fullyRecursive, $scope.apiDueDate);\n }\n else\n {\n overdueCall = TeamService.getOverdueAssignments($scope.startDate.apiDate, $scope.endDate.apiDate, $scope.fullyRecursive, null);\n }\n overdueCall.then(function (success) {\n $scope.overdueAssignments.assignments = success;\n $scope.overdueAssignments.isLoading = false;\n }, function (failure) {\n $scope.overdueAssignments.error.setError(failure.StatusCode, failure.ErrorMessage);\n $scope.overdueAssignments.isLoading = false;\n });\n \n };\n\n $scope.closeOverdueModal = function () {\n jQuery('#overdueModal').modal('hide');\n };\n\n // Used to submit the export overdue form.\n // This is because the export needs to bypass angular's $http service to return a downloaded file\n // so this posts the form to the server directly from the template instead of going through the service.\n $scope.exportOverdueAssignments = function () {\n \n $scope.callExport = true;\n $scope.currentTimezone = moment.tz.guess();\n $timeout(function () {\n $scope.callExport = false;\n }, 2000);\n\n };\n\n /******************* OVERDUE MODAL - END*********************************************/\n\n $scope.setDefaultAssignmentType = function () {\n //$scope.addAssignments.assignmentType = $scope.currentRoute === 'careerpaths' ? 'careerPath' : 'unknown';\n\n if ($scope.currentRoute === 'careerpaths') {\n $scope.addAssignments.assignmentType = 'careerPath';\n $scope.addAssignments.searchAssignments($scope.addAssignments.keyword, $scope.addAssignments.assignmentType);\n }\n else {\n $scope.addAssignments.assignmentType = 'unknown';\n }\n };\n\n $scope.isLoadImmediate = false;\n $scope.openSubordinateProfileModal = function (user) {\n $scope.user = { name: user.firstName + ' ' + user.lastName, job: user.jobType };\n $scope.userId = user.userId;\n $scope.$broadcast(\"openUserProfileModal\");\n };\n \n $scope.cpFilter = {};\n $scope.cpFilter.direct = true;\n $scope.cpFilter.alterate = false;\n $scope.cpFilter.sub = false;\n $scope.changeCPStudentSummaryFilter = function (teamType, includeSubordinates) {\n $scope.cpFilter.direct = (teamType === 'direct' && !includeSubordinates) ? true : false;\n $scope.cpFilter.alterate = (teamType === 'alternate') ? true : false;\n $scope.cpFilter.sub = (teamType === 'direct' && includeSubordinates) ? true : false;\n\n getManagerCareerPathStudentSummary(teamType, includeSubordinates);\n };\n };\n}]);\n\n","app.factory('Users_StudentOverride', ['$rootScope', '$route', 'AssignmentsService', 'BreadcrumbsService', 'OfferingsService', 'TranscriptsService', 'UsersService', 'errorDisplayerUtil', 'SettingsService', 'dateUtil', 'TeamService', 'CoursesService', 'CareerPathService', '$q', '$location', 'MessagesService', '$filter', 'SkillService', 'MyDocumentsService','SearchServices',\n function ($rootScope, $route, AssignmentsService, BreadcrumbsService, OfferingsService, TranscriptsService, UsersService, errorDisplayerUtil, SettingsService, dateUtil, TeamService, CoursesService, CareerPathService, $q, $location, MessagesService, $filter, SkillService, MyDocumentsService, SearchServices) {\n return function($scope) {\n var _this = this;\n\n $scope.role = 'student';\n $scope.isNMLSGroup = false;\n $scope.isNMLSProvisioned = false;\n $scope.showCareerPaths = false;\n $scope.currentRoute = \"\";\n $scope.careerPathsLoading = false;\n $scope.messagesCount = 0;\n $scope.userSkills = [];\n $scope.careerPathsCompleted = [];\n $scope.requiredAssignments = [];\n $scope.recommendedAssignments = [];\n $scope.electives = [];\n $scope.myDocuments = [];\n $scope.skillsLoading = false;\n $scope.displayTime = false;\n $scope.showLDConnect = false;\n\n // student dashboard\n // get single student summary for dashboard\n $scope.summaryExpanded = true;\n $scope.toggleSummary = function () {\n $scope.summaryExpanded = !$scope.summaryExpanded;\n };\n \n UsersService.setHomeRole();\n\n /* Set up pie chart defaults */\n // See old docs for help with canvas charts\n // https://github.com/chartjs/Chart.js/tree/v1.1.1/docs\n // NOT Chart.js 2.0 docs!!\n // Angular charts uses the old version of chart.js\n /*\n This code corresponds to a chart like this in\n the HTML\n \n \n */\n \n $scope.defaultDoughnutData = [\n {\n value: 0,\n color: \"#009CE6\",\n label: \"Complete\",\n },\n {\n value: 100,\n color: \"#d3d3d3\",\n label: \"Incomplete\",\n },\n {\n value: 0,\n color: \"#F63F3F\",\n label: \"Overdue\",\n }\n ];\n\n $scope.oldDoughnutData = [\n {\n value: 0,\n color: \"#009CE6\",\n label: \"Complete\"\n },\n {\n value: 100,\n color: \"#808080\",\n label: \"Incomplete\"\n },\n {\n value: 0,\n color: \"#F63F3F\",\n label: \"Overdue\"\n }\n ];\n\n $scope.defaultDoughnutOptions = {\n showTooltips: false,\n animation: true,\n percentageInnerCutout: 60,\n segmentStrokeColor: \"#00375d\"\n };\n\n $scope.oldDoughnutOptions = {\n showTooltips: false,\n animation: true,\n percentageInnerCutout: 60\n };\n\n $scope.setDoughnutData = function (defaults, complete, total, overdue) {\n var data = angular.copy(defaults);\n data[0].value = complete;\n data[1].value = (total - complete) - overdue;\n data[2].value = overdue;\n return data;\n };\n\n $scope.setupDoughnut = function (defaults, complete, total, options, overdue) {\n var setup = {};\n setup.data = $scope.setDoughnutData(defaults, complete, total, overdue);\n setup.options = options;\n return setup;\n };\n\n // Initialize tabbed nav variables\n // Represents css class so 'active' will add active class to element, '' will make it not active\n // Default to myAssignmentsActive\n $scope.myAssignmentsActive = \"active portalBackground portalBorder\";\n $scope.myCareerPathsActive = \"\";\n $scope.assignmentPaddingClass = \"assignmentPadding\";\n \n /**\n * Secondary routing;\n *\n * This will help us create more of an MVC approach\n */\n $scope.transcriptsAction = function () {\n $scope.homeTemplate = 'app/templates/users/transcripts/student.html';\n\n $scope.maxDate = new Date();\n\n $scope.user = UsersService.user;\n\n $scope.pageOptions.isLoading = true;\n\n $scope.studentId = UsersService.getId();\n\n $scope.isStudent = true;\n \n var assignments = TranscriptsService.fetch($scope.studentId);\n\n assignments.then(function (success) {\n $scope.assignments = success;\n\n $scope.pageOptions.isLoading = false; // We're no longer loading!\n\n $scope.sortBy = 'status';\n }, function (response) {\n $scope.assignments = null;\n\n $scope.pageOptions.isLoading = false; // We're no longer loading!\n\n $scope.pageOptions.error.setError(response.StatusCode, response.ErrorMessage);\n });\n\n BreadcrumbsService.createHomeBreadcrumb(UsersService.homeRole);\n BreadcrumbsService.pushCrumb(\"transcripts\");\n };\n\n $scope.homeAction = function () {\n if ($route.current.params.param !== undefined && $route.current.params.param !== null) {\n var params = $route.current.params.param.split('/');\n if (params.length > 0) {\n $scope.currentRoute = params[0].toLowerCase();\n }\n }\n\n $scope.displayTime = UsersService.displayTime();\n \n if ($scope.currentRoute === \"careerpaths\") {\n $scope.homeTemplate = 'app/templates/users/home/studentCareerPath.html';\n $scope.filterView = 'app/templates/users/partials/filters/studentCareerPaths.html';\n $scope.assignmentFilter = null;\n $scope.role = 'student';\n $scope.myAssignmentsActive = \"\";\n $scope.myCareerPathsActive = \"active portalBackground portalBorder\";\n $scope.assignmentPaddingClass = \"careerpath-assignmentPadding\";\n $scope.orderProperty = 'name';\n BreadcrumbsService.createHomeBreadcrumb(UsersService.homeRole);\n BreadcrumbsService.pushCrumb(\"career paths\");\n var careerPaths = CoursesService.getCoursesByType(\"careerPath\");\n careerPaths.then(function(success) {\n $scope.assignments = success;\n var isAssigned = false;\n _.each($scope.assignments, function(assignment) {\n assignment.isLoading = false;\n assignment.addCareerPathError = errorDisplayerUtil.create();\n if ((assignment.status === 'inProgress' || assignment.status === 'new' || assignment.status === 'pendingApproval') && isAssigned === false) {\n isAssigned = true;\n }\n });\n\n if (isAssigned === true) {\n $scope.assignmentFilter = $scope.getNewestAssignmentsCareerPath;\n jQuery('#assignedFilter').siblings('.filterItem').removeClass('selected');\n jQuery('#assignedFilter').addClass('selected');\n } else {\n $scope.assignmentFilter = null;\n jQuery('#allFilter').siblings('.filterItem').removeClass('selected');\n jQuery('#allFilter').addClass('selected');\n }\n\n $scope.inProgress = _this.filterInProgress($scope.assignments);\n\n if ($scope.inProgress.length > 0) {\n var childPromises = [];\n $scope.inProgress.forEach(function (careerPath) {\n var id = careerPath.courseGroupId || careerPath.id;\n var childPromise = AssignmentsService.getCourseGroupCourses(careerPath.studentId, careerPath.type, id);\n childPromises.push(childPromise);\n });\n $q.all(childPromises).then(function (success) {\n $scope.inProgress = _this.summarizeCareerPaths($scope.inProgress, success);\n $scope.apiError = false;\n $scope.isLoading = false;\n $scope.responseComplete = true;\n\n }, function (failure) {\n $scope.apiError = true;\n $scope.errorMessage = failure.ErrorMessage;\n $scope.isLoading = false;\n $scope.responseComplete = true;\n });\n }\n else {\n $scope.apiError = false;\n $scope.isLoading = false;\n $scope.responseComplete = true;\n }\n }, function(failure) {\n $scope.apiError = true;\n $scope.isLoading = false;\n $scope.responseComplete = true;\n $scope.errorMessage = failure.ErrorMessage;\n });\n }\n };\n\n $scope.assignmentDueStatusToggle = function(assignment) {\n assignment.dueDate.within24Hours = false;\n assignment.dueDate.overDue = true;\n };\n\n _this.filterInProgress = function (careerPaths) {\n var inProgress = [];\n inProgress = _.where(careerPaths, {status: \"inProgress\"});\n return inProgress;\n };\n\n _this.summarizeCareerPaths = function (careerPaths, children) {\n \n var i;\n for (i = 0; i < careerPaths.length; i++) {\n careerPaths[i].summary = CareerPathService.createSummary(careerPaths[i], children[i]);\n careerPaths[i].newDoughnut = $scope.setupDoughnut($scope.defaultDoughnutData, careerPaths[i].summary.courses.completed, careerPaths[i].summary.courses.total, $scope.defaultDoughnutOptions, 0);\n careerPaths[i].doughnut = $scope.setupDoughnut($scope.oldDoughnutData, careerPaths[i].summary.courses.completed, careerPaths[i].summary.courses.total, $scope.oldDoughnutOptions, 0);\n careerPaths[i].doughnutMessage = careerPaths[i].summary.courses.percentComplete + '%';\n }\n return careerPaths;\n };\n\n $scope.changePassword = function () {\n UsersService.setChangingPwFlag(true);\n $location.url('student/profile/change-password/');\n };\n\n $scope.logout = function () {\n var portalCode = UsersService.getPortalCode();\n var logout = UsersService.clearSession();\n logout.then(function (success) {\n\n // If a user's portal code existed while being logged in, persist it on the logged out state.\n if (portalCode !== '' && portalCode !== null) {\n portalCode = '?portal=' + portalCode;\n }\n\n $location.url('/' + portalCode);\n }, function (failure) {\n\n });\n\n };\n\n $scope.editProfile = function () {\n UsersService.setEditProfileFlag(true);\n $location.url('student/profile/edit-profile/');\n };\n\n $scope.viewCertificate = function (id) {\n $location.url('courses/certificate/assignments/' + id);\n };\n\n $scope.openCatalog = function () {\n $location.url('catalog');\n };\n\n $scope.openDocumentsCatalog = function () {\n $location.url('documents-catalog');\n };\n\n return _this;\n };\n}]);\n","(function () {\n app.controller('studentTilesController', ['$scope', '$filter', '$q', '$window', 'AssignmentsService', 'CoursesService', 'UsersService', studentTilesController]);\n\n function studentTilesController($scope, $filter, $q, $window, AssignmentsService, CoursesService, UsersService) {\n\n $scope.rowLength = 4;\n $scope.showingMore = false;\n\n $scope.isLoading = false;\n $scope.seeMoreText = \"See More\";\n $scope.seeMoreGlyphClass = \"glyphicon-chevron-down\";\n $scope.popoverFlags = [];\n\n if ($scope.list) {\n for (cp = 0; cp < $scope.list.length; cp++) {\n\n $scope.list[cp].launchButtonPromises = [];\n\n var deferredCareerPathPromise = $q.defer();\n deferredCareerPathPromise.resolve($scope.list[cp]);\n $scope.list[cp].launchButtonPromises.push(deferredCareerPathPromise.promise);\n\n var deferredCareerPathOfferingsPromise = $q.defer();\n var emptyCareerPathOfferings = []; // offerings will always be empty because schedule course button is not shown on tile\n deferredCareerPathOfferingsPromise.resolve(emptyCareerPathOfferings);\n $scope.list[cp].launchButtonPromises.push(deferredCareerPathOfferingsPromise.promise);\n\n if ($scope.list[cp].isManagerApprovalRequired === true && $scope.list[cp].careerPathStatus === \"pendingApproval\") {\n $scope.list[cp].hideActionButton = true;\n } else {\n $scope.list[cp].hideActionButton = false;\n }\n }\n\n $scope.list.sort(compare);\n }\n\n $scope.LaunchResource = function (assignmentId, type) {\n var spinner = jQuery(event.target).parent().find(\".spinner\");\n spinner.removeClass('ng-hide').css('display', 'content');\n var row = jQuery(event.target);\n row.attr('disabled', 'disabled');\n\n var enrollCoursePromise = CoursesService.getCourseUrl(assignmentId, type, UsersService.getId()); // Getting the URL will also enroll (create transcript) for the course.\n enrollCoursePromise.then(function (success) {\n var uri = null;\n\n if (typeof success !== 'undefined' && typeof success.uri !== 'undefined') {\n uri = success.uri;\n } else if (typeof success !== 'undefined' && typeof success.contentLaunchUrl !== 'undefined') {\n uri = success.contentLaunchUrl;\n } else {\n uri = success;\n }\n\n spinner.addClass('ng-hide');\n row.removeAttr('disabled');\n\n var uriAfterOriginCheck = uri.startsWith(\"http\") ? uri : addOriginInfo(uri);\n launchedCourse = window.open(uriAfterOriginCheck);\n var refreshTimer = setInterval(function () {\n if (launchedCourse.closed) {\n clearInterval(refreshTimer);\n $window.location.reload();\n }\n }, 500);\n });\n };\n\n function compare(a, b) {\n var comparison = 0;\n if (a.name.toLowerCase() > b.name.toLowerCase()) {\n comparison = 1;\n } else if (a.name.toLowerCase() < b.name.toLowerCase()) {\n comparison = -1;\n }\n return comparison;\n }\n\n function compareDate(a, b) { \n var comparison = 0; \n if (a.assignedOn.original < b.assignedOn.original) { \n comparison = -1; \n } \n else if (a.assignedOn.original > b.assignedOn.original) { \n comparison = 1; \n } \n return comparison; \n }\n $scope.isDuplicated = function (index) {\n for (j = 0; j < $scope.assignments.length; j++) \n { \n if ($scope.assignments[j].assignmentCourseId !== $scope.assignments[index].assignmentCourseId && $scope.assignments[j].id === $scope.assignments[index].id) {\n if ($scope.assignments[j].assignmentCourseId === -1) {\n return true;\n }\n else {\n $scope.assignments[j].hasDuplicate = true;\n $scope.assignments[index].hasDuplicate = false;\n $scope.assignmentsToRemove.push(j);\n }\n } \n }\n };\n \n if ($scope.assignments) {\n $scope.assignmentsToRemove = [];\n $scope.orderAssignmentsBy = $scope.courseSectionName === \"myDocuments\" ? '-assignedOn.original' : 'dueDate.original';\n if ($scope.courseSectionName === \"myDocuments\") {\n $scope.assignments.sort(compareDate);\n }\n\n var i = 0;\n\n for (i = 0; i < $scope.assignments.length; i++) {\n $scope.assignments[i].launchButtonPromises = [];\n\n var deferredCoursePromise = $q.defer();\n deferredCoursePromise.resolve($scope.assignments[i]);\n $scope.assignments[i].launchButtonPromises.push(deferredCoursePromise.promise);\n\n var deferredOfferingsPromise = $q.defer();\n var emptyOfferings = []; // offerings will always be empty because schedule course button is not shown on tile\n deferredOfferingsPromise.resolve(emptyOfferings);\n $scope.assignments[i].launchButtonPromises.push(deferredOfferingsPromise.promise);\n\n $scope.assignments[i].hideActionButton = $scope.assignments[i].type === \"ilt\" || $scope.assignments[i].type === \"task\";\n\n if ($scope.assignments[i].name.length > 43 && !$scope.assignments[i].name.substring(0, 43).includes(\" \")) {\n $scope.assignments[i].displayName = $scope.assignments[i].name.substring(0, 43) + \"...\";\n }\n else if ($scope.assignments[i].name.length > 70) {\n $scope.assignments[i].displayName = $scope.assignments[i].name.substring(0, 70) + \"...\";\n } else {\n $scope.assignments[i].displayName = $scope.assignments[i].name;\n }\n\n $scope.assignments[i].dueDateStyle = \"duedate\";\n $scope.assignments[i].showHeart = $scope.courseSectionName === \"electives\";\n $scope.assignments[i].catalogID = $scope.assignments[i].id;\n \n if ($scope.assignments[i].type === \"courseGroup\" || $scope.assignments[i].type === \"courseGroupCurricula\" || $scope.assignments[i].type === \"courseGroupCertification\") {\n $scope.assignments[i].showHeart = false;\n $scope.assignments[i].showDocumentHeart = false;\n }\n if ($scope.assignments[i].dueDate !== undefined && $scope.assignments[i].dueDate !== null) {\n if ($scope.assignments[i].dueDate.overDue === true) {\n $scope.assignments[i].dueDateStyle = \"duedate-overdue\";\n } else if ($scope.assignments[i].dueDate.within24Hours === true) {\n $scope.assignments[i].dueDateStyle = \"duedate-duesoon\";\n }\n }\n\n if ($scope.courseSectionName === \"myDocuments\") {\n $scope.assignments[i].showDocumentHeart = true;\n $scope.assignments[i].productType = 'Document';\n $scope.assignments[i].catalogID = $scope.assignments[i].parentBAICourseId;\n $scope.assignments[i].myDocumentCourse = {\n CourseId: $scope.assignments[i].parentBAICourseId,\n CourseType: 'Document',\n isInMyDocuments: $scope.assignments[i].isInMyDocuments\n };\n if (typeof $scope.assignments[i].hasDuplicate === 'undefined') {\n $scope.isDuplicated(i);\n }\n } else {\n $scope.assignments[i].playlistCourse = {\n CourseId: $scope.assignments[i].id,\n CourseType: 'Course',\n isInPlaylist: $scope.assignments[i].isInPlaylist\n };\n }\n $scope.popoverFlags.push(false);\n\n }\n if ($scope.assignmentsToRemove.length > 0) {\n $scope.assignmentsToRemove.sort(function (a, b) { return b - a; });\n for (var j = 0; j < $scope.assignmentsToRemove.length; j++) {\n $scope.assignments.splice($scope.assignmentsToRemove[j], 1);\n }\n }\n if ($scope.assignments.containsNMLSCourse) {\n var user = UsersService.fetch(UsersService.getId());\n user.then(function (success) {\n //Set the scoped NMLS values\n $scope.isNMLSGroup = (success.isNMLSSafeHarbor || success.isNMLSReporting);\n $scope.isNMLSProvisioned = success.isNMLSProvisioned;\n\n $scope.isLoading = false; // We're no longer loading!\n $scope.responseComplete = true;\n\n }, function (failure) {\n //If user get fails, let the page load. The course will have a normal launch link\n //but the content will still prompt the user to BioSig\n $scope.isLoading = false; // We're no longer loading!\n $scope.responseComplete = true;\n });\n }\n }\n\n $scope.closeAllPopovers = function () {\n var i = 0;\n for (i = 0; i < $scope.popoverFlags.length; i++) {\n $scope.popoverFlags[i] = false;\n }\n };\n\n $scope.openPopover = function (index) {\n $scope.closeAllPopovers();\n if ($scope.assignments[index].dueDate !== undefined && $scope.assignments[index].dueDate !== null) {\n if ($scope.assignments[index].dueDate.overDue === true || $scope.assignments[index].dueDate.within24Hours === true) {\n $scope.popoverFlags[index] = true;\n }\n }\n };\n\n\n $scope.seeMoreClick = function () {\n if (!$scope.showingMore) {\n $scope.seeMoreText = \"See Less\";\n $scope.seeMoreGlyphClass = \"glyphicon-chevron-up\";\n }\n else {\n $scope.seeMoreText = \"See More\";\n $scope.seeMoreGlyphClass = \"glyphicon-chevron-down\";\n }\n $scope.showingMore = !$scope.showingMore;\n };\n\n\n $scope.viewMoreClick = function (input, param) {\n $scope.isResources = false;\n $scope.inGroup = false;\n var relevantAssignment = null;\n if (param.includes(\"courseGroup\")) {\n $scope.inGroup = true;\n }\n if (param.includes(\"resources\")) {\n $scope.isResources = true;\n }\n var origin = $scope.courseSectionName;\n $scope.assignment = null;\n if ($scope.inGroup) {\n $scope.singleGroupIsLoading = true;\n relevantAssignment = $scope.courseGroupCourses[input];\n origin = ($scope.courseSectionName || \"\") + \"courseGroup\";\n }\n else {\n $scope.singleIsLoading = true;\n $scope.courseGroup = undefined;\n relevantAssignment = $scope.assignments[input];\n }\n $scope.showSlideButton = false;\n matchedClose = false;\n if (input === -1) {\n matchedClose = true;\n if ($scope.inGroup) {\n $scope.singleGroupIsLoading = false;\n }\n else {\n $scope.singleIsLoading = false;\n }\n }\n //Close any existing singlecourses and change the corresponding text to view more\n detaildiv = jQuery(\"#\" + origin + \"singlecourse\")[0];\n var regexid = RegExp('[0-9]+', 'g');\n var current = 0;\n var currentDetails = jQuery(\".\" + origin + \"openDetails\")[0];\n var currentResources = jQuery(\".\" + origin + \"resourcesopenDetails\")[0];\n //line will need changing once merged\n if (currentDetails) {\n current = regexid.exec(currentDetails.id);\n if (current[0] === \"\" + input && !$scope.isResources) {\n matchedClose = true;\n $scope.singleGroupIsLoading = false;\n $scope.singleIsLoading = false;\n }\n jQuery(\".\" + origin + \"View\" + current)[0].innerHTML = \"Details\";\n jQuery(\".\" + origin + \"openDetails\")[0].classList.remove(origin + \"openDetails\");\n jQuery(\"#\" + origin + \"singlecourse\").slideUp(\"fast\");\n }\n else if (currentResources) {\n current = regexid.exec(currentResources.id);\n if (current[0] === \"\" + input && $scope.isResources) {\n matchedClose = true;\n $scope.singleGroupIsLoading = false;\n $scope.singleIsLoading = false;\n }\n jQuery(\".\" + origin + \"resources\" + current)[0].innerHTML = \"Resources\";\n jQuery(\".\" + origin + \"resourcesopenDetails\")[0].classList.remove(origin + \"resourcesopenDetails\");\n jQuery(\"#\" + origin + \"resourcessinglecourse\").slideUp(\"fast\");\n }\n\n var courseDiv = document.getElementById(origin + \"tile\" + input);\n if (matchedClose === false) {\n if ($scope.inGroup) {\n position = input;\n }\n else {\n if (($scope.assignments.length) % 4 !== 0 && (input + 1 - 4 * Math.floor($scope.assignments.length / 4) > 0)) {\n position = $scope.assignments.length - 1;\n }\n else {\n position = (Math.ceil((input + 1) / 4) * 4) - 1;\n }\n }\n var topdiv = document.getElementById(origin + \"detailsTopContainer\");\n jQuery(\"#\" + origin + \"tile\" + position).after(topdiv);\n\n if ($scope.isResources) {\n courseDiv.classList.add(origin + \"resourcesopenDetails\");\n jQuery(\".\" + origin + \"resources\" + input)[0].innerHTML = \"Hide Resources\";\n $scope.resourcesSlideDown((origin + \"resources\"), relevantAssignment);\n }\n else {\n courseDiv.classList.add(origin + \"openDetails\");\n jQuery(\".\" + origin + \"View\" + input)[0].innerHTML = \"View Less\";\n\n if (!$scope.inGroup) {\n $scope.courseGroupCourses = undefined;\n }\n\n switch (relevantAssignment.type) {\n case \"wbt\":\n case \"survey\":\n case \"assessment\":\n case \"evaluation\":\n case \"mp3\":\n case \"mP3\":\n case \"mp4\":\n case \"mP4\":\n case \"pdf\":\n case \"word\":\n case \"excel\":\n case \"url\":\n case \"other\":\n $scope.fillBasicSlideDown(origin, input, relevantAssignment);\n break;\n case \"ilt\":\n $scope.fillILTSlideDown(origin, input);\n break;\n case \"task\":\n $scope.fillTaskSlideDown(origin, input, relevantAssignment);\n break;\n case \"courseGroup\":\n $scope.fillCourseGroupSlideDown(origin, input);\n break;\n case \"courseGroupCertification\":\n $scope.fillCourseGroupSlideDown(origin, input);\n break;\n case \"courseGroupCurricula\":\n $scope.fillCourseGroupSlideDown(origin, input);\n break;\n default:\n jQuery(\"#\" + origin + \"InfoSection\")[0].innerHTML = \"This Section:\";\n jQuery(\"#\" + origin + \"DetailsSection\")[0].innerHTML = \"Under Construction\";\n window.setTimeout(function () {\n $scope.openSlideDown(origin);\n }, 500);\n $scope.singleGroupIsLoading = false;\n $scope.singleIsLoading = false;\n break;\n }\n }\n }\n else {\n var outerdiv = document.getElementById(origin + \"detailsTopContainer\");\n jQuery(\"#\" + origin + \"container\").after(outerdiv);\n }\n };\n\n $scope.openSlideDown = function (origin) {\n jQuery(\"#\" + origin + \"singlecourse\").slideDown();\n };\n\n $scope.fillBasicSlideDown = function (origin, index, assignment) {\n $scope.assignment = assignment;\n jQuery(\"#\" + origin + \"InfoSection\")[0].innerHTML = \"Content Code: \" + assignment.code + \" | Content Type: \" + $filter(\"assignmentAssetTypeName\")(assignment.type) + \" | Source: \" + assignment.source + \" | Expected Duration: \" + $filter(\"duration\")(assignment.duration, assignment.source);\n jQuery(\"#\" + origin + \"DetailsSection\")[0].innerHTML = \"\" + assignment.name + \"
\" + (assignment.description || \"\");\n window.setTimeout(function () {\n $scope.openSlideDown(origin);\n }, 500);\n $scope.singleGroupIsLoading = false;\n $scope.singleIsLoading = false;\n };\n $scope.fillILTSlideDown = function (origin, index) {\n //get assignment\n var assignment = null;\n var courseId = 0;\n var courseType = 'ilt';\n if ($scope.inGroup) {\n assignment = $scope.courseGroupCourses[index];\n courseId = $scope.courseGroupCourses[index].courseId || $scope.courseGroupCourses[index].id;\n courseType = $scope.courseGroupCourses[index].type;\n }\n else {\n assignment = $scope.assignments[index];\n courseId = $scope.assignments[index].courseId || $scope.assignments[index].id;\n courseType = $scope.assignments[index].type;\n }\n $scope.iltNoOfferingsMessage = false;\n\n /**\n * This was changed to get single course, not get single assignment. This is not correct.\n * This method must get a single assignment, to ensure proper retrieval of assignment based\n * information for the student.\n */\n // var singleCourse = CoursesService.getSingleCourse(courseId);\n var singleAssignment = AssignmentsService.fetchSingle(courseId, courseType);\n\n singleAssignment.then(\n function (success) {\n var propToCheck = \"assignedOffering\";\n if (success[propToCheck] !== null && (assignment.status === \"inProgress\" || assignment.status === \"successful\" || assignment.status === \"waitlisted\")) {\n success.isScheduled = false;\n $scope.assignment = success;\n if (origin === \"courseGroup\") {\n $scope.assignment.source = $scope.careerPath.name;\n }\n jQuery(\"#\" + origin + \"InfoSection\")[0].innerHTML = \"Content Code: \" + $scope.assignment.code + \" | Content Type: \" + $filter(\"assignmentAssetTypeName\")($scope.assignment.type) + \" | Source: \" + $scope.assignment.source + \" | Expected Duration: \" + $filter(\"duration\")($scope.assignment.duration, $scope.assignment.source);\n jQuery(\"#\" + origin + \"DetailsSection\")[0].innerHTML = \"\" + $scope.assignment.name + \"
\";\n //LMS-5878 when type is ilt and assignedOffering is not null: overwrite offerings for this course\n if (success.type === 'ilt' && success.assignedOffering !== null) {\n var offeringsPromise = CoursesService.getSingleCourseOfferings(courseId);\n offeringsPromise.then(function (success) {\n $scope.assignment.offerings = success;\n if ($scope.inGroup) {\n $scope.assignment.groupOfferingsDisplay = true;\n } else {\n $scope.assignment.offeringsDisplay = true;\n }\n //ITERATE THROUGH EXISTING OFFERINGS\n $scope.singleGroupIsLoading = false;\n $scope.singleIsLoading = false;\n window.setTimeout(function () {\n $scope.openSlideDown(origin);\n }, 500);\n }, function (failure) {\n $scope.apiError = true;\n $scope.singleGroupIsLoading = false;\n $scope.singleIsLoading = false;\n });\n }\n } else {\n $scope.getOfferings(origin, index, assignment);\n }\n },\n function (failure) { // Failed to find assignment\n $scope.apiError = true;\n $scope.singleGroupIsLoading = false;\n $scope.singleIsLoading = false;\n });\n };\n\n $scope.getOfferings = function (origin, index, assignment) {\n $scope.apiError = false;\n if ($scope.inGroup) {\n $scope.singleGroupIsLoading = true;\n }\n else {\n $scope.singleIsLoading = true;\n }\n var launchPromises = assignment.launchButtonPromises;\n var courseId = typeof assignment.courseId !== 'undefined' && assignment.courseId !== null ? assignment.courseId : assignment.id;\n var isInCourseGroup = assignment.isInCourseGroup;\n $scope.assignment = assignment;\n $scope.slideType = \"ilt\";\n $scope.showSlideButton = true;\n if (origin === \"courseGroup\") {\n $scope.assignment.source = $scope.careerPath.name;\n }\n var offeringsPromise = CoursesService.getSingleCourseOfferings(courseId);\n return offeringsPromise.then(function (success) {\n $scope.assignment.offerings = success;\n launchPromises[1].$$state.value = success;\n $scope.assignment.launchButtonPromises = launchPromises;\n if ($scope.inGroup) {\n $scope.assignment.groupSecondaryButton = true;\n } else {\n $scope.assignment.secondaryButton = true;\n }\n $scope.assignment.offeringId = null;\n $scope.assignment.assignedOffering = null;\n $scope.iltNoOfferingsMessage = false;\n $scope.focusedID = $scope.assignment.id;\n var novalidofferings = true;\n var currentDate = new Date();\n for (i = 0; i < success.length; i++) {\n for (j = 0; j < success[i].sessions.length; j++) {\n if (success[i].sessions[j].endDateTime.jsDate >= currentDate) {\n novalidofferings = false;\n }\n }\n }\n \n jQuery(\"#\" + origin + \"InfoSection\")[0].innerHTML = \"Content Code: \" + $scope.assignment.code + \" | Content Type: \" + $filter(\"assignmentAssetTypeName\")($scope.assignment.type) + \" | Source: \" + $scope.assignment.source + \" | Expected Duration: \" + $filter(\"duration\")($scope.assignment.duration, $scope.assignment.source);\n jQuery(\"#\" + origin + \"DetailsSection\")[0].innerHTML = \"\" + $scope.assignment.name + \"
\" + ($scope.assignment.description || \"\");\n if (novalidofferings) {\n jQuery(\"#\" + origin + \"DetailsSection\")[0].innerHTML = jQuery(\"#\" + origin + \"DetailsSection\")[0].innerHTML + \"There are no available offerings.\";\n if ($scope.inGroup) {\n $scope.assignment.groupSecondaryButton = false;\n } else { $scope.assignment.secondaryButton = false; }\n }\n $scope.singleGroupIsLoading = false;\n $scope.singleIsLoading = false;\n window.setTimeout(function () {\n $scope.openSlideDown(origin);\n }, 500);\n }, function (failure) {\n $scope.singleGroupIsLoading = false;\n $scope.singleIsLoading = false;\n\n if (failure.StatusCode === 404) {\n //If the offerings get returns a 404, there is no error, there are just no offerings available\n $scope.iltNoOfferingsMessage = true;\n } else {\n $scope.apiError = true;\n }\n\n // scope.options.error.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n\n $scope.fillTaskSlideDown = function (origin, index, assignment) {\n jQuery(\"#\" + origin + \"InfoSection\")[0].innerHTML = \"Content Code: \" + assignment.code + \" | Content Type: \" + $filter(\"assignmentAssetTypeName\")(assignment.type) + \" | Source: \" + assignment.source + \" | Expected Duration: \" + $filter(\"duration\")(assignment.duration, assignment.source);\n jQuery(\"#\" + origin + \"DetailsSection\")[0].innerHTML = \"\" + assignment.name + \"
\" + (assignment.description || \"\");\n $scope.assignment = assignment;\n if ($scope.inGroup) {\n if (assignment.status !== \"successful\") {\n $scope.assignment.groupSecondaryButton = true;\n $scope.assignment.hideActionButton = true;\n }\n $scope.singleGroupIsLoading = false;\n } else { $scope.assignment.secondaryButton = true; }\n $scope.singleIsLoading = false;\n window.setTimeout(function () {\n $scope.openSlideDown(origin);\n }, 500);\n };\n\n $scope.fillCourseGroupSlideDown = function (origin, index) {\n $scope.singleIsLoading = true;\n $scope.assignment = $scope.assignments[index];\n $scope.courseGroup = $scope.assignment;\n $scope.courseGroup.skillsCount = 0;\n $scope.courseGroup.achievedSkillsCount = 0;\n $scope.getCourseGroupData($scope.assignment, origin);\n };\n\n $scope.getCourseGroupData = function (assignment, origin) {\n $scope.apiError = false;\n $scope.singleIsLoading = true;\n\n var courseGroupID = assignment.courseGroupId || assignment.id;\n var courseType = assignment.type;\n var student = assignment.studentId;\n var courseGroupType = courseType;\n var courseGroupStatus = assignment.status;\n var courseGroupIsManagerApprovalRequired = assignment.isManagerApprovalRequired;\n var courseGroupIsRequired = assignment.isRequired;\n\n if (courseType === 'courseGroupCurricula') { courseGroupType = 'Curricula'; }\n else if (courseType === 'courseGroupCertification') { courseGroupType = 'Certification'; }\n\n var courseGroups = {};\n if (courseType === 'careerPath') {\n courseGroups = AssignmentsService.getCareerPathCourses(student, courseGroupID);\n } else {\n courseGroups = AssignmentsService.getCourseGroupCourses(student, courseType, courseGroupID);\n }\n\n courseGroups.then(\n function (success) {\n success.isScheduled = false;\n var courseGroupdata = success;\n for (i = 0; i < courseGroupdata.length; i++) {\n courseGroupdata[i].launchButtonPromises = [];\n var deferredCoursePromise = $q.defer();\n deferredCoursePromise.resolve(courseGroupdata[i]);\n courseGroupdata[i].launchButtonPromises.push(deferredCoursePromise.promise);\n var deferredOfferingsPromise = $q.defer();\n var emptyOfferings = []; // offerings will always be empty because schedule course button is not shown on tile\n deferredOfferingsPromise.resolve(emptyOfferings);\n courseGroupdata[i].launchButtonPromises.push(deferredOfferingsPromise.promise);\n if (courseGroupdata[i].type === \"task\" || courseGroupdata[i].type === \"ilt\") { courseGroupdata[i].hideActionButton = true; }\n\n //If isInCourseGroup is not null, then it SHOULD be part of a course group / group curricula / group certification\n if (courseGroupdata[i].isInCourseGroup !== null) {\n //Remove the action button for each course if the elective is pending approval\n if (((courseGroupStatus === \"new\" && courseGroupIsManagerApprovalRequired === true) || courseGroupStatus === \"pendingApproval\")) {\n //Hide the action button, assign the individual courses in the course group the same status as the course group parent\n courseGroupdata[i].hideActionButton = true;\n courseGroupdata[i].status = courseGroupStatus;\n\n }\n }\n }\n\n if (courseType === 'careerPath') {\n for (i = courseGroupdata.length - 1; i >= 0; --i) {\n current = courseGroupdata[i];\n current.skillsList = \"\";\n if (current.skills !== null) {\n for (s = 0; s < current.skills.length; s++) {\n if (s === 0) {\n current.skillsList = current.skills[s].name;\n } else {\n current.skillsList += '; ' + current.skills[s].name;\n }\n }\n }\n }\n\n var summary = CareerPathService.createSummary(assignment, courseGroupdata);\n $scope.courseGroup.skillsCount = summary.skills.total;\n $scope.courseGroup.achievedSkillsCount = summary.skills.completed;\n $scope.courseGroup.totalCourses = summary.courses.total;\n $scope.courseGroup.totalCompletedCourses = summary.courses.completed;\n } else {\n var completedCourses = 0;\n //Get the amount of courseGroup courses before we take out successful records\n $scope.courseGroup.totalCourses = courseGroupdata.length;\n for (i = courseGroupdata.length - 1; i >= 0; --i) {\n if (courseGroupdata[i].productType === \"Document\"){\n courseGroupdata[i].catalogID = courseGroupdata[i].parentBAICourseId;\n } else {\n courseGroupdata[i].catalogID = courseGroupdata[i].id; \n }\n if (courseGroupdata[i].name.length > 70) {\n courseGroupdata[i].displayName = courseGroupdata[i].name.substring(0, 70) + \"...\";\n } else {\n courseGroupdata[i].displayName = courseGroupdata[i].name;\n }\n current = courseGroupdata[i];\n //Remove any successful results, student does not see successful courses\n if (current.status === 'successful') {\n courseGroupdata.splice(i, 1);\n completedCourses++;\n }\n }\n $scope.courseGroup.totalCompletedCourses = completedCourses;\n }\n $scope.courseGroupCourses = courseGroupdata;\n setCourseGroupDetailsHtml(origin);\n $scope.singleGroupIsLoading = false;\n $scope.singleIsLoading = false;\n window.setTimeout(function () {\n $scope.openSlideDown(origin);\n }, 500);\n }, function (failure) {\n $scope.totals = false;\n $scope.courseGroupCourses = [];\n $scope.singleGroupIsLoading = false;\n $scope.singleIsLoading = false;\n if (failure.StatusCode !== 404) {\n $scope.apiError = true;\n } else {\n $scope.courseGroup.totalCourses = 0;\n $scope.courseGroup.totalCompletedCourses = 0;\n setCourseGroupDetailsHtml(origin);\n $scope.assignment.displayTypeName = $filter(\"assignmentAssetTypeName\")($scope.assignment.type).toLowerCase();\n window.setTimeout(function () {\n $scope.openSlideDown(origin);\n }, 500);\n }\n }\n );\n };\n\n function setCourseGroupDetailsHtml (origin) {\n jQuery(\"#\" + origin + \"InfoSection\")[0].innerHTML = \"Content Code: \" + $scope.assignment.code + \" | Content Group Type: \" + $filter(\"assignmentAssetTypeName\")($scope.assignment.type) + \" | Source: \" + $scope.assignment.source + \"| Completions: \" + $scope.courseGroup.totalCompletedCourses + \"/\" + $scope.courseGroup.totalCourses + \" | Expected Duration: \" + $filter(\"duration\")($scope.assignment.duration, $scope.assignment.source);\n jQuery(\"#\" + origin + \"DetailsSection\")[0].innerHTML = \"\" + $scope.assignment.name + \"
\" + ($scope.assignment.description || \"\");\n }\n\n $scope.resourcesSlideDown = function (origin, assignment) {\n var resources = assignment.courseAssets;\n for (var r in resources) {\n current = resources[r];\n if (current.fileFormat === 'pdf') { resources[r].fileFormatName = '.PDF'; }\n else if (current.fileFormat === 'excel') { resources[r].fileFormatName = '.XLS'; }\n else if (current.fileFormat === 'url') { resources[r].fileFormatName = 'URL'; }\n else if (current.fileFormat === 'word') { resources[r].fileFormatName = '.DOCX'; }\n else if (current.fileFormat === 'powerpoint') { resources[r].fileFormatName = '.PPT'; }\n else if (current.fileFormat === 'text') { resources[r].fileFormatName = '.TXT'; }\n else if (current.fileFormat === 'audio') { resources[r].fileFormatName = '.MP3'; }\n else if (current.fileFormat === 'video') { resources[r].fileFormatName = '.MP4'; }\n else if (current.fileFormat === 'picture') { resources[r].fileFormatName = '.PNG'; }\n else if (current.fileFormat === 'zip') { resources[r].fileFormatName = '.ZIP'; }\n }\n\n $scope.resources = resources;\n\n\n\n window.setTimeout(function () {\n $scope.openSlideDown(origin);\n }, 500);\n $scope.singleGroupIsLoading = false;\n $scope.singleIsLoading = false;\n };\n\n\n\n\n $scope.dropElectiveCourse = function (assignment, origin, $event) {\n $scope.apiActionError = false;\n $scope.apiActionLoader = true;\n $scope.beingDropped = true;\n\n var confirmDrop = confirm(\"Are you sure you want to drop?\");\n\n if (confirmDrop) {\n var assignmentDrop = AssignmentsService.removeAssignment(assignment);\n\n assignmentDrop.then(function (success) {\n $scope.apiActionLoader = false;\n\n jQuery('#' + origin + 'singlecourse').slideUp(500, function () {\n // Force a re-render of the page; can't see another way except to fetch data for now;\n // couldn't get a refresh to work for whatever reason...\n $scope.beingDropped = false;\n\n\n window.location.reload();\n });\n }, function (response) {\n $scope.apiActionError = true;\n $scope.apiErrorMessage = 'Sorry! There was an issue dropping your course. Please try again!';\n $scope.apiActionLoader = false;\n $scope.beingDropped = false;\n\n\n jQuery('#transcriptAddError').slideDown(500, function () {\n var _this = jQuery(this);\n\n setTimeout(function () {\n _this.slideUp(500);\n }, 1500);\n });\n });\n } else {\n $scope.apiActionLoader = false;\n }\n };\n $scope.deleteCourseGroup = function (courseGroup, $event) {\n\n var confirmDrop = confirm(\"Are you sure you want to drop?\");\n \n if (confirmDrop) {\n \n var deleteCourseGroup = AssignmentsService.removeAssignment(courseGroup);\n \n deleteCourseGroup.then(function (success) {\n $scope.apiActionLoader = false;\n \n $scope.isLoading = true;\n window.location.reload();\n \n },\n function (failure) {\n alert(\"There was a problem deleting the Course Group\");\n });\n }\n };\n\n $scope.viewMorePathClick = function (index, param) {\n\n $scope.apiError = false;\n $scope.courseGroupCourses = null;\n $scope.careerPath = [];\n \n var childPromises = [];\n var careerPathSummary = $scope.list[index];\n\n var currentOpen = jQuery(\".openCareerPath\")[0];\n var regexid = RegExp('[0-9]+', 'g');\n var matched = false;\n var topdiv = document.getElementById(\"detailsTopContainer\");\n if (currentOpen) {\n var temp = regexid.exec(currentOpen.id);\n matched = (temp[0] === index.toString());\n currentOpen.innerText = \"Show Course List\";\n currentOpen.classList.remove(\"openCareerPath\");\n jQuery(\"#singlecourse\").slideUp(\"fast\");\n topdiv.classList.remove(\"topLevel\");\n }\n jQuery(\"#careerPath\" + index).after(topdiv);\n if (matched) {\n $scope.IsLoading = false;\n return;\n }\n $scope.IsLoading = true;\n $scope.singleIsLoading = true;\n\n var careerPathAssignment = AssignmentsService.fetchSingle(careerPathSummary.careerPathCourseID, \"careerPath\");\n careerPathAssignment.then(function (success) { \n $scope.careerPath = success;\n $scope.careerPath.childrenTotal = careerPathSummary.childrenTotal;\n var id = careerPathSummary.careerPathCourseID;\n \n if (!matched) {\n if (careerPathSummary.childrenTotal > 0) {\n var childPromise = AssignmentsService.getCareerPathCourses($scope.careerPath.studentId, id);\n childPromises.push(childPromise);\n\n $q.all(childPromises).then(function (success) {\n topdiv.classList.add(\"topLevel\");\n $scope.courseGroupCourses = success[0];\n for (i = 0; i < $scope.courseGroupCourses.length; i++) {\n current = $scope.courseGroupCourses[i];\n current.skillsList = \"\";\n if (current.skills !== null) {\n for (s = 0; s < current.skills.length; s++) {\n if (s === 0) {\n current.skillsList = current.skills[s].name;\n } else {\n current.skillsList += '; ' + current.skills[s].name;\n }\n }\n $scope.courseGroupCourses[i] = current;\n $scope.courseGroupCourses[i].source = $scope.careerPath.name;\n }\n\n $scope.courseGroupCourses[i].launchButtonPromises = [];\n\n var deferredCoursePromise = $q.defer();\n deferredCoursePromise.resolve($scope.courseGroupCourses[i]);\n $scope.courseGroupCourses[i].launchButtonPromises.push(deferredCoursePromise.promise);\n\n var deferredOfferingsPromise = $q.defer();\n var emptyOfferings = []; // offerings will always be empty because schedule course button is not shown on tile\n deferredOfferingsPromise.resolve(emptyOfferings);\n $scope.courseGroupCourses[i].launchButtonPromises.push(deferredOfferingsPromise.promise);\n\n $scope.courseGroupCourses[i].hideActionButton = $scope.courseGroupCourses[i].type === \"ilt\" || $scope.courseGroupCourses[i].type === \"courseGroupCertification\" || $scope.courseGroupCourses[i].type === \"courseGroup\" || $scope.courseGroupCourses[i].type === \"courseGroupCertification\" || $scope.courseGroupCourses[i].type === \"task\";\n\n //Individual Launch buttons for career path courses\n if (careerPathSummary.careerPathStatus === \"pendingApproval\" || (careerPathSummary.careerPathStatus === \"new\" && careerPathSummary.isManagerApprovalRequired === true)) {\n $scope.courseGroupCourses[i].hideActionButton = true;\n }\n\n if ($scope.courseGroupCourses[i].name.length > 70) {\n $scope.courseGroupCourses[i].displayName = $scope.courseGroupCourses[i].name.substring(0, 70) + \"...\";\n } else {\n $scope.courseGroupCourses[i].displayName = $scope.courseGroupCourses[i].name;\n }\n\n $scope.courseGroupCourses[i].dueDateStyle = \"duedate\";\n\n if ($scope.courseGroupCourses[i].dueDate !== undefined && $scope.courseGroupCourses[i].dueDate !== null) {\n if ($scope.courseGroupCourses[i].dueDate.overDue === true) {\n $scope.courseGroupCourses[i].dueDateStyle = \"duedate-overdue\";\n } else if ($scope.courseGroupCourses[i].dueDate.within24Hours === true) {\n $scope.courseGroupCourses[i].dueDateStyle = \"duedate-duesoon\";\n }\n }\n $scope.popoverFlags.push(false);\n\n }\n\n //set link values\n HandleCareerPathDropdown(careerPathSummary, index);\n\n }, function (failure) {\n $scope.apiError = true;\n $scope.errorMessage = failure.ErrorMessage;\n $scope.singleGroupIsLoading = false;\n $scope.IsLoading = false;\n });\n }\n else {\n HandleCareerPathDropdown(careerPathSummary, index);\n }\n }\n }, function (failure) {\n //failure getting assignment details\n $scope.errorMessage = failure.ErrorMessage;\n $scope.apiError = true;\n $scope.IsLoading = false;\n $scope.singleIsLoading = false;\n $scope.singleGroupIsLoading = false;\n });\n };\n\n function HandleCareerPathDropdown(careerPathSummary, index) {\n jQuery('#showList' + index)[0].classList.add(\"openCareerPath\");\n jQuery('#showList' + index)[0].innerText = \"Hide Course List\";\n var order = \"No\";\n if (careerPathSummary.enforceOrder) { order = \"Yes\"; }\n jQuery(\"#InfoSection\")[0].innerHTML = \"Course Completions: \" + careerPathSummary.childrenPassed + \"/\" + careerPathSummary.childrenTotal + \" | Skills Achieved: \" + careerPathSummary.skillCountPassed + \"/\" + careerPathSummary.skillCountTotal + \" | Source: \" + careerPathSummary.source + \" | Enforce Order: \" + order;\n jQuery(\"#DetailsSection\")[0].innerHTML = \"\" + careerPathSummary.name + \"
\" + (careerPathSummary.description || \"\");\n window.setTimeout(function () {\n $scope.openSlideDown(\"\");\n }, 500);\n\n $scope.singleGroupIsLoading = false;\n $scope.singleIsLoading = false;\n $scope.IsLoading = false;\n }\n\n $scope.mapStatusLabel = function (status) {\n /* For mapping assignment status to a css class\n * The word new should be colored green for instance on the assignments page.\n * See https://projects.invisionapp.com/share/QS765VMF3#/screens/157758405/comments\n */\n var statuses = {\n 'completed': 'Completed',\n 'inProgress': 'In Progress',\n 'new': 'New',\n 'pendingApproval': 'Pending Approval',\n 'successful': 'Successful',\n 'unsuccessful': 'Unsuccessful',\n 'unknown': ''\n };\n\n if (status in statuses) {\n return statuses[status];\n }\n\n return status;\n };\n\n $scope.removeFromPlaylistTiles = function (id, isInPlaylist) {\n $scope.viewMoreClick(-1, '');\n if (isInPlaylist === false) {\n var index = _.findIndex($scope.assignments, { id: id });\n if ($scope.assignments[index].assignmentCourseId === -1) {\n $scope.assignments.splice(index, 1);\n }\n }\n \n };\n\n $scope.removeFromMyDocumentsTiles = function (id, isInMyDocuments) {\n $scope.viewMoreClick(-1, '');\n var index = _.findIndex($scope.assignments, { parentBAICourseId: id });\n if (isInMyDocuments === true) {\n //right now this only works for BAI docs using the parent course ID\n $scope.assignments[index].isDroppable = true;\n if ($scope.assignments[index].assignmentCourseId === -1 && !$scope.assignments[index].hasDuplicate) {\n $scope.assignments.splice(index, 1);\n }\n }\n else {\n $scope.assignments[index].isDroppable = false;\n }\n };\n\n $scope.isRowEnd = function (index) {\n return (index + 1) % $scope.rowLength === 0;\n };\n\n $scope.isVisible = function (index) {\n return index < $scope.rowLength || (index >= $scope.rowLength && $scope.showingMore);\n };\n }\n})();","(function () {\n catalog.directive(\"applicationLibraryMenu\", [\n function () {\n return {\n restrict: \"E\",\n templateUrl: \"App/templates/components/applicationLibraryMenu.html\",\n controller: \"applicationLibraryMenuController\",\n };\n },\n ]);\n})();\n","(function () {\n catalog.directive('baiCatalogHeader', [\n function () {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/components/baiCatalogHeader.html',\n controller: 'baiCatalogHeaderController'\n };\n }\n ]);\n})();","(function () {\n catalog.directive('baiCatalogHeaderLms', [\n function () {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/components/baiCatalogHeaderLms.html',\n controller: 'baiCatalogHeaderController'\n };\n }\n ]);\n})();","(function() {\n app.directive('baiCatalogSearchResults', [\n function() {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/catalog/baiCatalogSearchResults.html',\n scope: {},\n controller: ['$scope', '$route', '$attrs', '$location', '$rootScope', '$q', 'SearchServices', 'CatalogSearchParameters', 'errorDisplayerUtil', 'courseFormatterUtil', 'BreadcrumbsService', 'PathFormatter', 'CategoriesService', 'PlaylistServices', 'MyDocumentsService', CatalogSearchController]\n };\n }\n ]);\n\n function CatalogSearchController($scope, $route, $attrs, $location, $rootScope, $q, SearchServices, CatalogSearchParameters, errorDisplayerUtil, courseFormatterUtil, BreadcrumbsService, PathFormatter, CategoriesService, PlaylistServices, MyDocumentsService) {\n $scope.searchResults = { results: [], count: 0, facets: [] };\n $scope.searchResultError = errorDisplayerUtil.create();\n $scope.viewAll = viewAll;\n $scope.clearAll = clearAll;\n $scope.selectFacetFilter = selectFacetFilter;\n $scope.selectFacetFilterAnd = selectFacetFilterAnd;\n $scope.expandCollapseFacet = expandCollapseFacet;\n $scope.selectProduct = selectProduct;\n $scope.selectedFacetValues = [];\n $scope.pagination = { page: 0, itemsPerPage: CatalogSearchParameters.getSearchParameters().top, maxPagesDisplayed: 10, nextPage: nextPage };\n $scope.fromWeb = $rootScope.fromWeb;\n if ($scope.fromWeb === true) {\n $rootScope.metaTags.title = \"BAI Training Catalog Search, Compliance, Learning Management, Professional Development Financial Services\";\n $rootScope.metaTags.description = \"BAI gives financial services leaders confidence in managing compliance and a passion for professional development by providing powerful tools and subject matter expertise you can rely on. Search our courseware catalog!\";\n $rootScope.metaTags.keywords = \"BSA, AML, eLearning, Role-based, Microlearning, Regulation-based, FDIC, CFPB, Banking, Credit Union, Mortgage, Fintech, Regtech, HMDA, OFAC, TILA\";\n }\n $scope.showCatalogDownloadLinks = false;\n\n $scope.catalogType = typeof $attrs.catalogtype !== 'undefined' ? $attrs.catalogtype : 'Libraries';\n\n var maxFacetValuesDisplayed = 5;\n var constantViewAllText = \"View All\";\n var constantViewLessText = \"View Less\";\n var routeParams = $route.current.params.param;\n var resultsToken = $location.$$search.token;\n $scope.catalog = {};\n $scope.catalog.name = $scope.catalogType;\n $scope.catalog.path = { pipeDelimited: \"\", params: \"\" };\n $scope.catalog.error = errorDisplayerUtil.create();\n $scope.catalog.baseRoute = fromWeb ? \"browse\" : \"catalog\";\n if ($scope.catalogType === \"Documents\") { $scope.catalog.baseRoute = \"documents-catalog\";}\n $scope.shareLink = \"\";\n var currentPlaylistCourseIds = [];\n var currentMyDocumentsCourseIds = [];\n var needPlaylistRefresh = true;\n var needMyDocumentsRefresh = true;\n\n $scope.enablePlaylistRefresh = function () {\n needPlaylistRefresh = true;\n };\n\n $scope.enableMyDocumentsRefresh = function () {\n needMyDocumentsRefresh = true;\n };\n\n function getShareLink() {\n var result = \"\";\n var shareResults = {};\n shareResults.searchTerm = CatalogSearchParameters.getSearchParameters().searchTerm;\n shareResults.filterText = CatalogSearchParameters.getSearchParameters().filter;\n shareResults.filters = \"\";\n shareResults.filters = JSON.stringify(getFilterList());\n var token = btoa(JSON.stringify(shareResults));\n result = $location.$$absUrl.split(\"?\")[0] + \"?token=\" + token;\n function getFilterList() {\n var filterList = [];\n var i = 0;\n for (i = 0; i < $scope.selectedFacetValues.length; i++) {\n var currentIndex = _.findIndex(filterList, { name: $scope.selectedFacetValues[i].name });\n if (currentIndex === -1) {\n filterList.push({ name: $scope.selectedFacetValues[i].name, values: [] });\n filterList[filterList.length - 1].values.push($scope.selectedFacetValues[i].filterValue);\n } else {\n filterList[currentIndex].values.push($scope.selectedFacetValues[i].filterValue);\n }\n }\n return filterList;\n }\n\n return result;\n }\n\n var setBreadcrumbsAndFilter = function (path) {\n CatalogSearchParameters.browseFilter = createFilter(path.pipeDelimited);\n CatalogSearchParameters.addQueryText(\"\");\n if ($scope.fromWeb === true) {\n CatalogSearchParameters.clearBreadcrumbs();\n CatalogSearchParameters.breadcrumbs.push({ name: \"Home\", link: \"/\" });\n CatalogSearchParameters.breadcrumbs.push({ name: \"Libraries\", link: $scope.catalog.baseRoute });\n CatalogSearchParameters.breadcrumbs = CatalogSearchParameters.breadcrumbs.concat(BreadcrumbsService.createBreadcrumbs(path.pipeDelimited, $scope.fromWeb, $scope.catalog.baseRoute));\n } else {\n CatalogSearchParameters.breadcrumbs = BreadcrumbsService.createBreadcrumbs(path.pipeDelimited, $scope.fromWeb, $scope.catalog.baseRoute, $scope.catalogType);\n }\n CatalogSearchParameters.setPage(1);\n CatalogSearchParameters.fromBrowse = true;\n CatalogSearchParameters.catalogPDFName = path.params;\n };\n\n function createFilter(path) {\n var filters = [];\n var filter = {};\n filter.name = \"Paths\";\n filter.showFacet = false;\n filter.values = [];\n var value = {};\n value.value = path;\n value.selected = true;\n filter.values.push(value);\n filters.push(filter);\n if (CatalogSearchParameters.fromBrowse) {\n var typeFilter = {};\n typeFilter.name = \"ProductType\";\n typeFilter.showFacet = false;\n typeFilter.values = [];\n typeFilter.isString = true;\n var typeValue = {};\n typeValue.value = \"Document\";\n typeValue.selected = true;\n typeFilter.negate = false;\n if ($scope.catalogType !== \"Documents\")\n {\n typeFilter.negate = true;\n }\n typeFilter.values.push(typeValue);\n filters.push(typeFilter);\n }\n return filters;\n }\n\n \n\n var path = {};\n \n if (noResultsTokenOrCatalogParams()) {\n activate();\n } else if (resultsTokenNoCatalogParams()) {\n parseToken();\n activate();\n } else if (noResultsTokenCatalogParams()) {\n parseCatalogPath().then(function(success) {\n activate();\n });\n } else if (resultsTokenAndCatalogParams()) {\n parseCatalogPath().then(function (success) {\n parseToken();\n activate();\n });\n }\n\n function noResultsTokenOrCatalogParams() {\n return resultsToken === undefined && routeParams === undefined;\n }\n\n function resultsTokenNoCatalogParams() {\n return resultsToken !== undefined && routeParams === undefined;\n }\n\n function noResultsTokenCatalogParams() {\n return resultsToken === undefined && routeParams !== undefined;\n }\n\n function resultsTokenAndCatalogParams() {\n return resultsToken !== undefined && routeParams !== undefined;\n }\n\n function parseToken() {\n try {\n var parsed = JSON.parse(atob(resultsToken));\n\n parsed.filters = JSON.parse(parsed.filters);\n var i = 0;\n var j = 0;\n for (i = 0; i < parsed.filters.length; i++) {\n for (j = 0; j < parsed.filters[i].values.length; j++) {\n if (parsed.filters[i].name === \"Paths\" && CatalogSearchParameters.fromBrowse) {\n continue;\n }\n //if (parsed.filters[i].name !== \"Paths\") {\n $scope.selectedFacetValues.push({ name: parsed.filters[i].name, filterValue: parsed.filters[i].values[j] });\n // }\n }\n }\n CatalogSearchParameters.addQueryText(parsed.searchTerm);\n CatalogSearchParameters.setFilters(parsed.filterText);\n CatalogSearchParameters.setPage(1);\n $location.$$search = {};\n }\n catch(e) {\n $scope.isLoading = false;\n console.log(e);\n }\n }\n\n function parseCatalogPath() {\n $scope.isLoading = true;\n $scope.searchResultError.reset();\n var catalog = null;\n if ($scope.catalogType === \"Documents\") {\n catalog = SearchServices.getDocumentCatalog();\n }\n else { catalog = SearchServices.getCatalog(); }\n return catalog.then(function (success) {\n _.forEach(success, function (c) {\n var formattedParams = PathFormatter.formatPathParams(\"\", c.value);\n formattedParams = formattedParams.replace(/\\|/g, '/');\n if (formattedParams === routeParams) {\n path.params = routeParams;\n path.pipeDelimited = c.value;\n setBreadcrumbsAndFilter(path);\n }\n });\n }, function (failure) {\n $scope.isLoading = false;\n console.log(\"Failed\", failure);\n $scope.searchResultError.setError(failure.StatusCode, failure.ErrorMessage);\n });\n }\n\n function viewAll(index) {\n var i = 0;\n\n if ($scope.searchResults.facets[index].viewAllText === constantViewAllText) {\n for (i = 0; i < $scope.searchResults.facets[index].values.length; i++) {\n $scope.searchResults.facets[index].values[i].hidden = false;\n }\n $scope.searchResults.facets[index].viewAllText = constantViewLessText;\n } else {\n for (i = 0; i < $scope.searchResults.facets[index].values.length; i++) {\n if (i < maxFacetValuesDisplayed) {\n $scope.searchResults.facets[index].values[i].hidden = false;\n } else {\n $scope.searchResults.facets[index].values[i].hidden = true;\n }\n }\n $scope.searchResults.facets[index].viewAllText = constantViewAllText;\n }\n }\n\n function clearAll() {\n $scope.selectedFacetValues = [];\n CatalogSearchParameters.clearFilters();\n if (CatalogSearchParameters.fromBrowse) {\n addBrowseFilter();\n }\n $scope.pagination.page = 0;\n CatalogSearchParameters.setPage(1);\n activate();\n }\n\n function expandCollapseFacet(index) {\n var i = 0;\n $scope.searchResults.facets[index].isCollapsed = !$scope.searchResults.facets[index].isCollapsed;\n $(\"#facetSection-\" + index).slideToggle(\"fast\");\n }\n\n\n function activate() {\n if (shouldSearch()) {\n $scope.isLoading = true;\n $scope.searchResultError.reset();\n $scope.searchParameters = CatalogSearchParameters.getSearchParameters();\n if (CatalogSearchParameters.fromBrowse && $scope.selectedFacetValues.length === 0) {\n addBrowseFilter();\n if (CatalogSearchParameters.browseFilter.length > 0 && CatalogSearchParameters.browseFilter[0].name === 'Paths' && CatalogSearchParameters.browseFilter[0].values[0].value.indexOf('|') < 0 && CatalogSearchParameters.browseFilter[0].values[0].value.indexOf('Custom') < 0 && CatalogSearchParameters.browseFilter[0].values[0].value.indexOf('NMLS') < 0 && routeParams !== undefined && $scope.catalogType !== \"Documents\") {\n $scope.showCatalogDownloadLinks = true;\n GetPDFLinkValues();\n }\n } else {\n $scope.showCatalogDownloadLinks = false;\n }\n \n var promises = [];\n promises.push(SearchServices.executeProductSearch(CatalogSearchParameters.getSearchParameters()));\n\n var playlistPromisePosition = null;\n if (needPlaylistRefresh === true && !$scope.fromWeb) {\n promises.push(PlaylistServices.getPlaylist());\n playlistPromisePosition = promises.length - 1;\n }\n\n var myDocumentsPromisePosition = null;\n if (needMyDocumentsRefresh === true && !$scope.fromWeb) {\n promises.push(MyDocumentsService.getAll());\n myDocumentsPromisePosition = promises.length - 1;\n }\n \n $q.all(promises).then(function (allResult) {\n var success = allResult[0];\n $scope.searchResults.results = success.results;\n $scope.searchResults.count = success.count;\n\n if (needPlaylistRefresh === true && !$scope.fromWeb) {\n currentPlaylistCourseIds = allResult[playlistPromisePosition];\n needPlaylistRefresh = false;\n }\n\n setPlaylistCourses();\n\n if (needMyDocumentsRefresh === true && !$scope.fromWeb) {\n currentMyDocumentsCourseIds = allResult[myDocumentsPromisePosition];\n needMyDocumentsRefresh = false;\n }\n\n setMyDocumentsCourses();\n\n var libraries = [];\n success.facets.Paths.forEach(function (item) {\n /* libraries should be the top node with no pipe */\n if (item.value.indexOf('|') < 0) {\n libraries.push(item);\n }\n });\n var hideLibraries = (CatalogSearchParameters.fromBrowse || !$scope.fromWeb);\n\n addFacet(\"Libraries\", \"Paths\", libraries, hideLibraries);\n addFacet(\"Roles\", \"Roles\", success.facets.Roles);\n addFacet(\"Skills\", \"Skills\", success.facets.Skills);\n addFacet(\"Topics\", \"Topics\", success.facets.Topics);\n addFacet(\"Expected Duration\", \"DurationRange\", success.facets.DurationRange);\n addFacet(\"Interactivity\", \"InteractivityTypes\", success.facets.InteractivityTypes);\n addFacet(\"Content Type\", \"CourseType\", success.facets.CourseType, $scope.fromWeb);\n addFacet(\"Product Type\", \"ProductType\", success.facets.ProductType);\n addFacet(\"CE\", \"CEAccreditationOrg\", success.facets.CEAccreditationOrg);\n BreadcrumbsService.crumbs = CatalogSearchParameters.breadcrumbs;\n $scope.shareLink = getShareLink();\n $scope.isLoading = false;\n }, function (failure) {\n console.log(\"failed\");\n $scope.isLoading = false;\n $scope.searchResultError.setError(failure.StatusCode, failure.ErrorMessage);\n });\n } else {\n $scope.isLoading = false;\n }\n }\n\n function setPlaylistCourses() {\n var i = 0;\n _.each($scope.searchResults.results, function (r) {\n r.showPlaylistHeart = !$scope.fromWeb && r.ProductType !== \"Document\";\n if (r.CourseType === \"Course Group\" || r.CourseType === \"Course Group Curricula\" || r.CourseType === \"Course Group Certification\" || r.CourseType === \"Career Path\") {\n r.showPlaylistHeart = false;\n }\n\n r.isInPlaylist = false;\n for (i = 0; i < currentPlaylistCourseIds.length; i++) {\n if (currentPlaylistCourseIds[i].toString() === r.CourseId) {\n r.isInPlaylist = true;\n break;\n }\n }\n });\n }\n\n function setMyDocumentsCourses() {\n var i = 0;\n _.each($scope.searchResults.results, function (r) {\n r.showMyDocumentsHeart = !$scope.fromWeb && r.ProductType === \"Document\";\n r.isInMyDocuments = false;\n for (i = 0; i < currentMyDocumentsCourseIds.length; i++) {\n if (currentMyDocumentsCourseIds[i].courseID.toString() === r.CourseId || (currentMyDocumentsCourseIds[i].parentBAICourseID !== null && currentMyDocumentsCourseIds[i].parentBAICourseID.toString() === r.CourseId)) {\n r.isInMyDocuments = true;\n break;\n }\n }\n });\n }\n\n function shouldSearch() {\n var minimumSearchCharactersWithoutQuotes = 3;\n return CatalogSearchParameters.getSearchParameters().searchTerm.length >= minimumSearchCharactersWithoutQuotes ||\n CatalogSearchParameters.fromBrowse;\n }\n\n function addFacet(label, name, values, hidden) {\n appendPreviouslySelectedValues(values, name);\n values = sortValues(values, name);\n var existingFacetIndex = _.findIndex($scope.searchResults.facets, { \"name\": name });\n var facetValues = getFacetValuesFor(values, name, existingFacetIndex);\n\n if (existingFacetIndex === -1) {\n var newFacet = createDefaultFacet(name, label, facetValues);\n if (hidden) {\n newFacet.showFacet = false;\n }\n else {\n newFacet.showFacet = showFacet(newFacet);\n }\n newFacet.selectedCount = _.where($scope.selectedFacetValues, { \"name\": name }).length;\n if (newFacet.values.length > maxFacetValuesDisplayed) {\n newFacet.showViewAll = true;\n newFacet.viewAllText = constantViewAllText;\n }\n $scope.searchResults.facets.push(newFacet);\n var newFacetIndex = $scope.searchResults.facets.length - 1;\n if ($scope.searchResults.facets[newFacetIndex].selectedCount > 0 && name === 'Paths') {\n console.log(\"in paths if\");\n $scope.searchResults.facets[newFacetIndex].values.forEach(function (val) {\n if (!val.selected) {\n val.hidden = true;\n }\n });\n }\n } else {\n $scope.searchResults.facets[existingFacetIndex].values = facetValues;\n\n if ($scope.searchResults.facets[existingFacetIndex].values.length <= maxFacetValuesDisplayed) {\n $scope.searchResults.facets[existingFacetIndex].showViewAll = false;\n } else {\n $scope.searchResults.facets[existingFacetIndex].showViewAll = true;\n }\n if (hidden) {\n $scope.searchResults.facets[existingFacetIndex].showFacet = false;\n }\n else {\n $scope.searchResults.facets[existingFacetIndex].showFacet = showFacet($scope.searchResults.facets[existingFacetIndex]);\n }\n $scope.searchResults.facets[existingFacetIndex].selectedCount = _.where($scope.selectedFacetValues, { \"name\": name }).length;\n\n /* For libraries only, if a library is selected then hide the other libraries */\n if ($scope.searchResults.facets[existingFacetIndex].selectedCount > 0 && name === 'Paths') {\n $scope.searchResults.facets[existingFacetIndex].values.forEach(function (val) {\n if (!val.selected) {\n val.hidden = true;\n }\n });\n }\n }\n }\n\n function appendPreviouslySelectedValues(values, name) {\n var i = 0;\n var subSelectedFacetFilters = _.where($scope.selectedFacetValues, { \"name\": name });\n for (i = 0; i < subSelectedFacetFilters.length; i++) {\n var selectedIndex = _.findIndex(values, { \"value\": subSelectedFacetFilters[i].filterValue });\n if (selectedIndex === -1) {\n values.push({\n count: 0,\n value: subSelectedFacetFilters[i].filterValue,\n selected: true,\n hidden: false,\n disabled: false\n });\n }\n }\n }\n\n function sortValues(values, name) {\n if (name === 'DurationRange') {\n var durationRangeOrdered = [];\n var shortIndex = _.findIndex(values, { value: '< 15 mins' });\n var mediumIndex = _.findIndex(values, { value: '15 mins - 30 mins' });\n var longIndex = _.findIndex(values, { value: '> 30 mins' });\n if (shortIndex > -1) {\n durationRangeOrdered.push(values[shortIndex]);\n }\n if (mediumIndex > -1) {\n durationRangeOrdered.push(values[mediumIndex]);\n }\n if (longIndex > -1) {\n durationRangeOrdered.push(values[longIndex]);\n }\n return durationRangeOrdered;\n } else {\n return _.sortBy(values, 'value');\n }\n }\n\n function getFacetValuesFor(values, name, existingFacetIndex) {\n var facetValues = [];\n var i = 0;\n for (i = 0; i < values.length; i++) {\n if (isValidFacetValue(values[i].value) === true) {\n values[i].selected = selectFacetValue(values, i, name);\n values[i].hidden = hideFacetValue(existingFacetIndex, i);\n facetValues.push(values[i]);\n }\n }\n return facetValues;\n }\n\n function createDefaultFacet(name, label, facetValues) {\n return {\n name: name,\n label: label,\n values: facetValues,\n showViewAll: false,\n isString: name === 'ProductType' || name === 'DurationRange' || name === 'CourseType' ? true : false,\n showFacet: false,\n isCollapsed: false,\n selectedCount: 0\n };\n }\n\n function showFacet(facet) {\n if (facet.values.length > 0) {\n return true;\n } else {\n return false;\n }\n }\n\n function isValidFacetValue(value) {\n return value !== null && value !== \"\";\n }\n\n function selectFacetValue(values, i, name) {\n if (_.findIndex($scope.selectedFacetValues, { \"name\": name, \"filterValue\": values[i].value }) !== -1) {\n return true;\n } else {\n return false;\n }\n }\n\n function hideFacetValue(existingFacetIndex, i) {\n if ((i >= maxFacetValuesDisplayed && existingFacetIndex === -1) ||\n (i >= maxFacetValuesDisplayed && $scope.searchResults.facets[existingFacetIndex].viewAllText === constantViewAllText)) {\n return true;\n } else {\n return false;\n }\n }\n\n function selectFacetFilter(facetName, filterValue, facetIndex, filterIndex) {\n var chosenFilter = $scope.searchResults.facets[facetIndex].values[filterIndex];\n var existingIndex = _.findIndex($scope.selectedFacetValues, { \"name\": facetName, \"filterValue\": chosenFilter.value });\n if (chosenFilter.selected === true) {\n if (existingIndex === -1) {\n $scope.selectedFacetValues.push({ \"name\": facetName, \"filterValue\": chosenFilter.value });\n }\n } else {\n if (existingIndex !== -1) {\n $scope.selectedFacetValues.splice(existingIndex, 1);\n }\n }\n CatalogSearchParameters.addFacetFilters($scope.searchResults.facets);\n\n $scope.pagination.page = 0;\n CatalogSearchParameters.setPage(1);\n activate();\n }\n\n function selectFacetFilterAnd(facetName, filterValue, facetIndex, filterIndex) {\n var chosenFilter = $scope.searchResults.facets[facetIndex].values[filterIndex];\n var existingIndex = _.findIndex($scope.selectedFacetValues, { \"name\": facetName, \"filterValue\": chosenFilter.value });\n if (chosenFilter.selected === true) {\n if (existingIndex === -1) {\n $scope.selectedFacetValues.push({ \"name\": facetName, \"filterValue\": chosenFilter.value });\n }\n } else {\n if (existingIndex !== -1) {\n $scope.selectedFacetValues.splice(existingIndex, 1);\n }\n }\n CatalogSearchParameters.addFacetFiltersAnd($scope.searchResults.facets);\n\n $scope.pagination.page = 0;\n CatalogSearchParameters.setPage(1);\n activate();\n }\n\n function nextPage() {\n CatalogSearchParameters.setPage($scope.pagination.page);\n activate();\n }\n\n function addBrowseFilter() {\n var browseFilter = CatalogSearchParameters.browseFilter[0];\n $scope.selectedFacetValues.push({ \"name\": browseFilter.name, \"filterValue\": browseFilter.values[0].value });\n CatalogSearchParameters.addFacetFilters(CatalogSearchParameters.browseFilter);\n }\n\n function selectProduct(product) {\n CatalogSearchParameters.productBreadcrumbs = [];\n var backCrumbLink = $scope.fromWeb === false ? \"catalog/search\" : \"search\";\n if (path.params !== undefined) {\n backCrumbLink = backCrumbLink + \"/\" + path.params;\n }\n if ($scope.fromWeb === true) {\n var homeCrumb = { name: \"Home\", link: \"/\" };\n CatalogSearchParameters.productBreadcrumbs.push(homeCrumb);\n }\n var backCrumb = { name: \"Return to Results\", link: backCrumbLink };\n var productNameCrumb = { name: product.Name, link: \"\" };\n\n CatalogSearchParameters.productBreadcrumbs.push(backCrumb);\n CatalogSearchParameters.productBreadcrumbs.push(productNameCrumb);\n }\n\n $scope.downloadCatalogId = \"\";\n function GetPDFLinkValues() {\n var categories = CategoriesService.fetch(null, false, false);\n categories.then(function (success) {\n\n var results = _.filter(success, function (catalog) {return catalog.name === path.pipeDelimited;});\n if (results.length > 0) {\n $scope.downloadCatalogId = results[0].id;\n\n } else {\n $scope.showCatalogDownloadLinks = false;\n }\n\n }, function (failure) {\n $scope.showCatalogDownloadLinks = false;\n });\n\n }\n }\n\n})();","(function () {\n app.directive('baiCopyLink', [\n function () {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/catalog/baiCopyLink.html',\n scope: { copyUrl: '@' },\n controller: ['$scope', '$timeout', copyLinkController]\n };\n }\n ]);\n\n function copyLinkController($scope, $timeout) {\n $scope.openPopover = function() {\n var el = document.createElement(\"input\");\n el.setAttribute(\"type\", \"text\");\n el.setAttribute(\"id\", \"copyLink\");\n el.setAttribute(\"value\", $scope.copyUrl);\n document.body.appendChild(el);\n document.getElementById(\"copyLink\").select();\n el.select();\n document.execCommand(\"copy\");\n // Create Element.remove() function if not exist\n if (!('remove' in Element.prototype)) {\n Element.prototype.remove = function () {\n if (this.parentNode) {\n this.parentNode.removeChild(this);\n }\n };\n }\n document.getElementById(\"copyLink\").remove();\n\n jQuery(\"#copyPopover\").popover('show');\n $timeout(function() {\n jQuery(\"#copyPopover\").popover('hide');\n }, 2000);\n };\n }\n\n})();","(function () {\n app.directive('baiProductDetails', [\n function () {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/catalog/baiProductDetails.html',\n \n controller: ['$scope', '$location', '$route', '$q', '$rootScope', 'SearchServices', 'CoursesService', 'errorDisplayerUtil', 'BreadcrumbsService', 'CatalogSearchParameters', 'DocumentService', 'PlaylistServices', 'MyDocumentsService', ProductDetailsController]\n };\n }\n ]);\n\n function ProductDetailsController($scope, $location, $route, $q, $rootScope, SearchServices, CoursesService, errorDisplayerUtil, BreadcrumbsService, CatalogSearchParameters, DocumentService, PlaylistServices, MyDocumentsService) {\n $scope.productLink = $location.$$absUrl;\n\n var params = $route.current.params.param.split('/');\n var productId = params[0];\n if ($rootScope.fromWeb === true) {\n productId = params[0].split('-')[0];\n }\n var productType = \"course\";\n if ($rootScope.fromWeb === false) {\n productType = productId < 0 ? \"document\" : \"course\";\n }\n\n $scope.productId = productId;\n $scope.outputPromises = [];\n $scope.document = {};\n $scope.course = {};\n $scope.isLoading = true;\n $scope.productError = errorDisplayerUtil.create();\n $scope.productType = productType;\n $scope.fromWeb = $rootScope.fromWeb;\n $scope.showPlaylistHeart = !$scope.fromWeb;\n $scope.showDocumentHeart = !$scope.fromWeb;\n var needMyDocumentsRefresh = true;\n\n $scope.enableMyDocumentsRefresh = function () {\n needMyDocumentsRefresh = true;\n };\n\n var promises = [];\n\n if ($rootScope.fromWeb === true) {\n SearchServices.getProductById(productId).then(function (success) {\n $scope.document = success.document;\n setMetadataAndBreadcrumbs();\n $scope.isLoading = false;\n }, function (failure) {\n $scope.productError.setError(failure.ErrorNumber, failure.ErrorMessage);\n $scope.isLoading = false;\n });\n }\n else {\n if (productType === \"course\") {\n SearchServices.getProductById(productId).then(function (success) {\n $scope.document = success.document;\n if ($scope.document.ProductType === \"Document\") {\n initDocumentCourse();\n }\n else { // assume course\n initCourse();\n }\n }, function (failure) {\n $scope.productError.setError(failure.ErrorNumber, failure.ErrorMessage);\n $scope.isLoading = false;\n });\n } else {\n initCustomDocument();\n }\n }\n\n function initDocumentCourse() {\n promises.push(CoursesService.getCourseWithAssignment(productId));\n var emptyOfferingsPromise = $q.defer();\n emptyOfferingsPromise.resolve({ response: [], status: null, links: null });\n promises.push(emptyOfferingsPromise.promise);\n promises.push(MyDocumentsService.getAll());\n\n var deferredDocumentPromise = $q.defer();\n deferredDocumentPromise.resolve(promises[0]);\n $scope.outputPromises.push(deferredDocumentPromise.promise);\n\n var deferredEmptyOfferingsPromise = $q.defer();\n deferredEmptyOfferingsPromise.resolve(promises[1]);\n $scope.outputPromises.push(deferredEmptyOfferingsPromise.promise);\n\n $q.all(promises).then(function (success) {\n $scope.course = success[0];\n if (promises.length === 3) {\n var myDocuments = success[2];\n var i = 0;\n for (i = 0; i < myDocuments.length; i++) {\n var myDocumentsId = myDocuments[i].parentBAICourseID !== null ? myDocuments[i].parentBAICourseID : myDocuments[i].courseID;\n if (myDocumentsId.toString() === $scope.document.CourseId) {\n $scope.document.isInMyDocuments = true;\n break;\n }\n }\n }\n setMetadataAndBreadcrumbs();\n $scope.isLoading = false;\n }, function (failure) {\n $scope.productError.setError(failure.ErrorNumber, failure.ErrorMessage);\n $scope.isLoading = false;\n });\n }\n\n function initCourse() {\n promises.push(CoursesService.getCourseWithAssignment(productId));\n promises.push(CoursesService.getSingleCourseOfferings(productId));\n promises.push(PlaylistServices.getPlaylist());\n var deferredCoursePromise = $q.defer();\n deferredCoursePromise.resolve(promises[0]);\n $scope.outputPromises.push(deferredCoursePromise.promise);\n var deferredOfferingsPromise = $q.defer();\n deferredOfferingsPromise.resolve(promises[1]);\n $scope.outputPromises.push(deferredOfferingsPromise.promise);\n\n $q.all(promises).then(function (success) {\n $scope.course = success[0];\n if ($scope.course !== undefined && typeof $scope.course !== \"undefined\") {\n if ($scope.course.type === \"courseGroup\" || $scope.course.type === \"courseGroupCurricula\" || $scope.course.type === \"courseGroupCertification\" || $scope.course.type === \"careerPath\") {\n $scope.showPlaylistHeart = false;\n }\n }\n if (promises.length === 3) {\n var playlist = success[2];\n var i = 0;\n for (i = 0; i < playlist.length; i++) {\n if (playlist[i].toString() === $scope.document.CourseId) {\n $scope.document.isInPlaylist = true;\n break;\n }\n }\n }\n\n setMetadataAndBreadcrumbs();\n\n $scope.isLoading = false;\n }, function (failure) {\n $scope.productError.setError(failure.ErrorNumber, failure.ErrorMessage);\n $scope.isLoading = false;\n });\n }\n\n function initCustomDocument() {\n promises.push(SearchServices.getProductById(productId));\n // Need to flip productId to positive number to get document from lms api\n promises.push(DocumentService.getSingleDocumentInfo(productId * -1));\n var deferredDocumentPromise = $q.defer();\n deferredDocumentPromise.resolve(promises[1]);\n $scope.outputPromises.push(deferredDocumentPromise.promise);\n $q.all(promises).then(function (success) {\n $scope.document = success[0].document;\n $scope.course = success[1];\n setMetadataAndBreadcrumbs();\n $scope.isLoading = false;\n }, function (failure) {\n $scope.productError.setError(failure.ErrorNumber, failure.ErrorMessage);\n $scope.isLoading = false;\n });\n }\n\n function setMetadataAndBreadcrumbs() {\n if ($rootScope.fromWeb === true) {\n $rootScope.metaTags.title = $scope.document.Name + \" - \" + $scope.document.ProductType;\n $rootScope.metaTags.description = $scope.document.Description;\n $rootScope.metaTags.keywords = $scope.document.displayTopics;\n if (CatalogSearchParameters.productBreadcrumbs.length === 0) {\n BreadcrumbsService.crumbs.push({ name: \"Home\", link: \"/\" });\n BreadcrumbsService.crumbs.push({ name: $scope.document.Name, link: \"\" });\n } else {\n BreadcrumbsService.crumbs = CatalogSearchParameters.productBreadcrumbs;\n }\n } else {\n BreadcrumbsService.crumbs = CatalogSearchParameters.productBreadcrumbs;\n }\n }\n }\n})();","catalog.directive('catalogLibraryTiles', ['$route', '$q', 'errorDisplayerUtil', 'CategoriesService', 'SearchServices', 'BreadcrumbsService', 'CatalogSearchParameters',\n function ($route, $q, errorDisplayerUtil, CategoriesService, SearchServices, BreadcrumbsService, CatalogSearchParameters) {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/catalog/catalogLibraryTiles.html',\n scope: {\n },\n controller: ['$scope', '$route', '$attrs', '$location', '$q', '$rootScope', 'errorDisplayerUtil', 'CategoriesService', 'SearchServices', 'BreadcrumbsService', 'PathFormatter', 'CatalogSearchParameters',\n function ($scope, $route, $attrs, $location, $q, $rootScope, errorDisplayerUtil, CategoriesService, SearchServices, BreadcrumbsService, PathFormatter, CatalogSearchParameters) {\n $scope.fromWeb = $rootScope.fromWeb;\n var catalogBreadcrumbs = [];\n\n $scope.catalogType = typeof $attrs.catalogtype !== 'undefined' ? $attrs.catalogtype : 'Libraries';\n\n\n $scope.isLoading = false;\n $scope.selected = {};\n $scope.catalog = {};\n $scope.catalog.name = $scope.catalogType;\n $scope.catalog.description = \"BAI offers several content libraries to meet your training needs.\";\n $scope.catalog.path = { pipeDelimited: \"\", params: \"\" };\n $scope.catalog.error = errorDisplayerUtil.create();\n $scope.catalog.baseRoute = $scope.fromWeb ? \"browse\" : \"catalog\";\n if ($scope.catalogType === \"Documents\") { $scope.catalog.baseRoute = \"documents-catalog\";}\n\n $scope.level = \"\";\n \n function loadCatalog() {\n \n $scope.isLoading = true;\n var allPromises = [];\n var categories = CategoriesService.fetch(null, false, false);\n allPromises.push(categories);\n var catalog = null;\n if ($scope.catalogType === \"Documents\")\n {\n catalog = SearchServices.getDocumentCatalog();\n }\n else\n {\n catalog = SearchServices.getCatalog();\n }\n allPromises.push(catalog);\n $q.all(allPromises).then(function (success) {\n $scope.catalog.children = formatCategories(success[0], { pipeDelimited: \"\", params: \"\" }, success[1]);\n $scope.selected = $scope.catalog;\n if ($scope.fromWeb === true) {\n handleRouteParamsWeb($route.current);\n if ($scope.selected.name.toLowerCase() === \"libraries\") {\n $scope.catalog.description = \"BAI offers several content libraries to meet your training needs.\";\n $rootScope.metaTags.title = \"BAI Training Catalog Libraries, Compliance, Learning Management, Professional Development Financial Services\";\n $rootScope.metaTags.description = \"BAI gives financial services leaders confidence in managing compliance and a passion for professional development by providing powerful tools and subject matter expertise you can rely on. Search our courseware catalog!\";\n $rootScope.metaTags.keywords = \"BSA, AML, eLearning, Role-based, Microlearning, Regulation-based, FDIC, CFPB, Banking, Credit Union, Mortgage, Fintech, Regtech, HMDA, OFAC, TILA\";\n } else {\n $rootScope.metaTags.title = \"BAI Training Catalog: \" + $scope.selected.name;\n $rootScope.metaTags.description = $scope.selected.description;\n }\n } else {\n handleRouteParams($route.current);\n }\n $scope.isLoading = false;\n }, function (failure) {\n var errorCode;\n var errorMsg = \"Could not retrieve the catalog.\";\n $scope.catalog.error.setError(errorCode, errorMsg);\n\t\t\t\t\t$scope.isLoading = false;\n });\n }\n \n loadCatalog();\n\n function formatCategories(categories, path, catalog) {\n var results = [];\n _.each(categories, function (category) {\n if(category.endDate === null){\n category.productCount = 0;\n category.name = category.name.replace(\" (Policies)\", \"\");\n category.path = formatPath(path, category.name);\n //always put at the end\n if (category.name.toLowerCase() === \"custom content\") {\n category.ordinal = 999;\n }\n \n //Also putting custom documents at the end\n if ($scope.catalogType === \"Documents\" && category.name.toLowerCase() === \"custom documents\") {\n category.ordinal = 999;\n }\n var azureFacet = _.findWhere(catalog, { value: category.path.pipeDelimited });\n if (typeof azureFacet !== 'undefined') {\n category.productCount = azureFacet.count;\n if (category.productCount > 0) {\n category.childCount = category.children === null ? 0 : category.children.length;\n if (category.childCount > 0) {\n category.children = formatCategories(category.children, category.path, catalog);\n category.childCount = category.children.length;\n }\n results.push(category);\n }\n }\n }\n });\n\n if (path.pipeDelimited.toLowerCase().startsWith(\"custom content\")) {\n return results.sort(compareByName);\n }\n else {\n return results.sort(compareByOrdinal);\n }\n }\n\n function compareByOrdinal(a, b) {\n return a.ordinal > b.ordinal ? 1 : -1;\n }\n\n function compareByName(a, b) {\n return a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1;\n }\n\n\n function formatPath(parentPath, name) {\n var path = {};\n path.pipeDelimited = formatPathPipeDelimited(parentPath.pipeDelimited, name);\n path.params = PathFormatter.formatPathParamsWithEncode(parentPath.params, name);\n \n return path;\n }\n\n function formatPathPipeDelimited(parentPath, name) {\n return parentPath === \"\" ? name : parentPath + '|' + name;\n }\n \n function handleRouteParamsWeb(route) {\n var selected = $scope.catalog;\n catalogBreadcrumbs = [];\n catalogBreadcrumbs.push({ name: \"Home\", link: \"/\" });\n catalogBreadcrumbs.push({ name: $scope.catalogType, link: $scope.catalog.baseRoute });\n BreadcrumbsService.crumbs =catalogBreadcrumbs;\n if (typeof route.params.param === 'undefined') {\n $scope.level = getLevel(selected);\n return;\n }\n\n var params = route.params.param.split(\"/\");\n\n var path = \"\";\n _.each(params, function (param) {\n path = PathFormatter.formatPathParamsWithEncode(path, param);\n selected = _.filter(selected.children, function (category) { return category.path.params === path; })[0];\n if (typeof selected === 'undefined') {\n $scope.catalog.error.setError(404, \"Catalog selection not found: \" + path);\n selected = $scope.catalog;\n return;\n }\n });\n $scope.selected = selected;\n $scope.level = getLevel(selected);\n\n catalogBreadcrumbs = catalogBreadcrumbs.concat(BreadcrumbsService.createBreadcrumbs(selected.path.pipeDelimited, $scope.fromWeb, $scope.catalog.baseRoute, $scope.catalogType));\n BreadcrumbsService.crumbs =catalogBreadcrumbs;\n }\n\n function handleRouteParams(route) {\n var selected = $scope.catalog;\n catalogBreadcrumbs = [];\n if (typeof route.params.name === 'undefined') {\n $scope.level = getLevel(selected);\n return;\n }\n\n var params = [route.params.name];\n if (typeof route.params.param !== 'undefined') {\n params = params.concat(route.params.param.split(\"/\"));\n }\n \n var path = \"\";\n _.each(params, function (param) {\n path = PathFormatter.formatPathParamsWithEncode(path, param);\n selected = _.filter(selected.children, function (category) { return category.path.params === path; })[0];\n if (typeof selected === 'undefined') {\n $scope.catalog.error.setError(404, \"Catalog selection not found: \" + path);\n selected = $scope.catalog;\n return;\n }\n });\n $scope.selected = selected;\n $scope.level = getLevel(selected);\n catalogBreadcrumbs = BreadcrumbsService.createBreadcrumbs(selected.path.pipeDelimited, $scope.fromWeb, $scope.catalog.baseRoute, $scope.catalogType);\n BreadcrumbsService.crumbs =catalogBreadcrumbs;\n }\n\n function getLevel(category) {\n if (category.path.pipeDelimited === \"\") {\n $scope.showExportLinks = false;\n return { singular: \"Category\", plural: \"Categories\" };\n }\n else {\n /* only show export links on the parent taxon view */\n $scope.showExportLinks = ($scope.catalogType === \"Documents\" || category.path.pipeDelimited.indexOf('|') >= 0 || category.path.pipeDelimited.indexOf('Custom') >= 0 || category.path.pipeDelimited.indexOf('NMLS') >= 0) ? false : true;\n return { singular: \"Subcategory\", plural: \"Subcategories\" };\n }\n }\n }]\n };\n}\n]);","catalog.directive('downloadCatalogLinks', ['$route', '$q', '$timeout',\n function ($route, $q, $timeout) {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/catalog/downloadCatalogLinks.html',\n scope: {\n catalogId: '@'\n },\n controller: ['$scope', '$route', '$rootScope', '$q',\n function ($scope, $route, $rootScope, $q) {\n \n /* for the API URL based on if the user is coming from the web or not */\n if ($rootScope.fromWeb) {\n $scope.catalogAction = '/api/public/catalog/download/';\n $scope.catalogListAction = '/api/public/catalog/download/list/';\n } else {\n $scope.catalogAction = '/lms-web/api/catalog/download/';\n $scope.catalogListAction = '/lms-web/api/catalog/download/list/';\n } \n\n /* hide button functionality for catalog export */\n $scope.exportCatalogLoading = false;\n $scope.exportCatalog = function () {\n $scope.exportCatalogLoading = true;\n\n $timeout(function () {\n $scope.exportCatalogLoading = false;\n }, 3000);\n };\n \n /* hide button functionality for List export */\n $scope.exportListLoading = false;\n $scope.exportCatalogList = function () {\n $scope.exportListLoading = true;\n\n $timeout(function () {\n $scope.exportListLoading = false;\n }, 9000);\n };\n\n }]\n };\n }\n]);","app.directive('baiDecisionMapSummary', [function () {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/insights/home/baiDecisionMapSummary.html',\n controller: ['$scope', '$location', '$timeout', '$filter', 'InsightsService', 'InsightsDecisionMapService', 'errorDisplayerUtil', 'UsersService',\n function ($scope, $location, $timeout, $filter, InsightsService, InsightsDecisionMapService, errorDisplayerUtil, UsersService) {\n $scope.isLoading = true;\n $scope.isEditLoading = false;\n $scope.hideSummaryTable = false;\n $scope.reverseSort = true; // default to true to sort by created date descending\n $scope.sortPropertyName = 'fullDateWithTime';\n $scope.archiveLinkText = 'View Archived';\n $scope.pages = {};\n $scope.pages.pageLimit = 50;\n $scope.pages.currentPage = 1;\n $scope.pages.maxVisiblePages = 10;\n $scope.actionsPopoverFlags = [];\n $scope.getDecisionMapSummaryError = errorDisplayerUtil.create();\n $scope.deleteSuccess = errorDisplayerUtil.create();\n $scope.editClickError = errorDisplayerUtil.create();\n $scope.currentAction = '';\n\n $scope.currentRoleTA = false;\n var currentUserRole = UsersService.getCurrentRoleType();\n if (currentUserRole === 'ta') {\n $scope.currentRoleTA = true;\n }\n\n $scope.getDecisionMapSummaries = function (includeArchived) {\n $scope.isLoading = true;\n $scope.hideSummaryTable = false;\n var decisionMapSummaryPromise = InsightsService.getDecisionMapSummaries(includeArchived);\n return decisionMapSummaryPromise.then(function (success) {\n $scope.isLoading = false;\n $scope.decisionMaps = success;\n $scope.loadSummaryTable();\n }, function (failure) {\n $scope.isLoading = false;\n if (failure.StatusCode === 404) {\n $scope.hideSummaryTable = true;\n } else {\n $scope.getDecisionMapSummaryError.setError(failure.StatusCode, failure.ErrorMessage);\n }\n });\n };\n\n $scope.loadSummaryTable = function () {\n $scope.decisionMaps = $filter('orderBy')($scope.decisionMaps, $scope.sortPropertyName, $scope.reverseSort);\n $scope.nextPage(1);\n _.each($scope.decisionMaps, function (dm) {\n dm.isEditLoading = false;\n dm.fullDateWithTime = dm.created.jsDate;\n dm.pgORorg = dm.businessOrganizationName !== '' ? dm.businessOrganizationName + '
' + (dm.includeOrganizationHierarchy ? 'Include Hierarchy: Yes' : 'Include Hierarchy: No') : dm.peopleGroupName;\n //for the decision makers in each map, order by the username\n var dms = $filter('orderBy')(dm.decisionMakers, 'userName', false);\n if (dms.length > 0) {\n //then use the sorted list to get the username to sort by\n dm.decisionMakerSort = dms[0].userName;\n }\n $scope.actionsPopoverFlags.push(false);\n });\n $scope.isLoading = false;\n };\n\n\n $scope.getDecisionMapSummaries(false);\n\n $scope.sortBy = function(propertyName) {\n $scope.closeAllActionMenus();\n $scope.reverseSort = ($scope.sortPropertyName === propertyName) ? !$scope.reverseSort : false;\n $scope.sortPropertyName = propertyName;\n $scope.decisionMaps = $filter('orderBy')($scope.decisionMaps, propertyName, $scope.reverseSort);\n $scope.pages.currentPage = 1;\n $scope.nextPage();\n };\n\n $scope.nextPage = function () {\n $scope.pagedDecisionMaps = $scope.decisionMaps.slice(($scope.pages.currentPage - 1) * $scope.pages.pageLimit, $scope.pages.currentPage * $scope.pages.pageLimit);\n };\n\n $scope.editClick = function (id) {\n var index = _.findIndex($scope.decisionMaps, { \"id\": id });\n if (index > -1) {\n if ($scope.decisionMaps[index].status === \"Created\" || $scope.decisionMaps[index].status === \"Started\") {\n $scope.decisionMaps[index].isEditLoading = true;\n $scope.isEditLoading = true;\n InsightsService.getDecisionMapById(id).then(function (success) {\n InsightsDecisionMapService.setDecisionMap(success);\n if ($scope.decisionMaps[index].status === \"Created\") {\n $location.path('insights/createdecisionmap');\n } else if ($scope.decisionMaps[index].status === 'Started') {\n $location.path('insights/wizard/function');\n }\n $scope.isEditLoading = false;\n $scope.decisionMaps[index].isEditLoading = false;\n }, function (failure) {\n $scope.editClickError.setError(failure.StatusCode, failure.ErrorMessage);\n $timeout(function () {\n $scope.editClickError.reset();\n }, 3000);\n $scope.isEditLoading = false;\n $scope.decisionMaps[index].isEditLoading = false;\n });\n } else if ($scope.decisionMaps[index].status === 'Confirmed' || $scope.decisionMaps[index].status === 'Rule Created' || $scope.decisionMaps[index].status === 'Archived') {\n $location.path('insights/decisionmapreport/' + $scope.decisionMaps[index].id);\n } else {\n $location.path('insights/home');\n }\n }\n };\n\n $scope.copyDecisonMap = function (decisionMapId) {\n var index = _.findIndex($scope.decisionMaps, { \"id\": decisionMapId });\n $scope.decisionMaps[index].isEditLoading = true;\n $scope.isEditLoading = true;\n InsightsService.getDecisionMapById(decisionMapId).then(function (success) {\n success.sourceDecisionMapId = success.id;\n success.id = 0;\n success.status = null;\n success.statusChanged = null;\n success.created = null;\n success.createdBy = null;\n success.modifiedBy = null;\n success.modified = null;\n success.endDate = null;\n success.confirmedDateTime = null;\n success.rule = { key: 0, value: \"\" };\n success.name = success.name + '_copy';\n _.each(success.decisionMakers, function (dm) {\n dm.confirmed = 'false';\n });\n InsightsDecisionMapService.setDecisionMap(success);\n $scope.decisionMaps[index].isEditLoading = false;\n $location.path('/insights/createdecisionmap');\n }, function (failure) {\n $scope.editClickError.setError(failure.StatusCode, failure.ErrorMessage);\n $timeout(function () {\n $scope.editClickError.reset();\n }, 3000);\n $scope.decisionMaps[index].isEditLoading = false;\n $scope.isEditLoading = false;\n });\n };\n\n $scope.archiveUnarchiveDecisionMap = function (decisionMapId, status) {\n var index = _.findIndex($scope.decisionMaps, { \"id\": decisionMapId });\n $scope.decisionMaps[index].isEditLoading = true;\n $scope.isEditLoading = true;\n var decisionMapCall = InsightsService.getDecisionMapById(decisionMapId);\n decisionMapCall.then(function (success) {\n var decisionMap = success;\n decisionMap.status = status;\n var updateCall = InsightsService.updateDecisionMap(decisionMap);\n updateCall.then(function (success) {\n $scope.decisionMaps[index].isEditLoading = false;\n $scope.isEditLoading = false;\n\n if (status === 'Archived') {\n var archivedMapIdx = _.findIndex($scope.decisionMaps, { \"id\": decisionMap.id });\n if (archivedMapIdx > -1) {\n if ($scope.archiveLinkText === 'View Archived') {\n $scope.decisionMaps.splice(archivedMapIdx, 1);\n }\n $scope.loadSummaryTable();\n }\n }\n\n if (status === 'Unarchive') {\n //the report was unarchived, to get here, the archived should be on the page, now only show reports that are not archived\n $scope.archiveLinkText = 'View Archived';\n $scope.getDecisionMapSummaries(false);\n }\n\n }, function (failure) {\n $scope.decisionMaps[index].isEditLoading = false;\n $scope.isEditLoading = false;\n $scope.editClickError.setError(failure.StatusCode, failure.ErrorMessage);\n });\n }, function (failure) {\n $scope.decisionMaps[index].isEditLoading = false;\n $scope.isEditLoading = false;\n $scope.editClickError.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n $scope.setPopoverAction = function (action) {\n $scope.currentAction = action;\n };\n\n $scope.deleteDecisionMap = function (decisionMapId) {\n var index = _.findIndex($scope.decisionMaps, { \"id\": decisionMapId });\n $scope.decisionMaps[index].isEditLoading = true;\n $scope.isEditLoading = true;\n var deleteCall = InsightsService.deleteDecisionMap(decisionMapId);\n deleteCall.then(function (success) {\n $scope.decisionMaps[index].isEditLoading = false;\n $scope.isEditLoading = false;\n $scope.getDecisionMapSummaries(true).then(function(success) {\n $scope.deleteSuccess.setError(202, \"Decision Report successfully deleted\");\n $timeout(function () {\n $scope.deleteSuccess.reset();\n }, 3000);\n });\n }, function(failure) {\n $scope.decisionMaps[index].isEditLoading = false;\n $scope.isEditLoading = false;\n $scope.editClickError.setError(failure.StatusCode, failure.ErrorMessage);\n $timeout(function() {\n $scope.editClickError.reset();\n }, 3000);\n });\n };\n\n $scope.archiveDecisonMap = function (decisionMapId) {\n var index = _.findIndex($scope.decisionMaps, { \"id\": decisionMapId });\n $scope.decisionMaps[index].isEditLoading = true;\n $scope.isEditLoading = true;\n\n var decisionMapCall = InsightsService.getDecisionMapById(decisionMapId);\n decisionMapCall.then(function (success) {\n var decisionMap = success;\n decisionMap.status = 'Archived';\n\n var updateCall = InsightsService.updateDecisionMap(decisionMap);\n updateCall.then(function (success) {\n var archivedMapIdx = _.findIndex($scope.decisionMaps, { \"id\": decisionMap.id });\n if (archivedMapIdx > -1) {\n $scope.decisionMaps.splice(archivedMapIdx, 1);\n $scope.loadSummaryTable();\n }\n\n $scope.decisionMaps[index].isEditLoading = false;\n $scope.isEditLoading = false;\n }, function (failure) {\n $scope.decisionMaps[index].isEditLoading = false;\n $scope.isEditLoading = false;\n $scope.editClickError.setError(failure.StatusCode, failure.ErrorMessage);\n });\n }, function (failure) {\n $scope.decisionMaps[index].isEditLoading = false;\n $scope.isEditLoading = false;\n $scope.editClickError.setError(failure.StatusCode, failure.ErrorMessage);\n });\n };\n\n $scope.openPopover = function (index) {\n var i = 0;\n var curIndex = index;\n for (i = 0; i < $scope.actionsPopoverFlags.length; i++) {\n $scope.actionsPopoverFlags[i] = false;\n }\n $scope.actionsPopoverFlags[index] = true;\n $(\"div[uib-popover-template-popup]\").on(\"mouseleave\", function () {\n $scope.$apply(function () {\n $scope.currentAction = '';\n $scope.actionsPopoverFlags[curIndex] = false;\n });\n });\n };\n\n $scope.executeAction = function (action, confirmAction, popoverIndex, dmId) {\n $scope.currentAction = '';\n $scope.actionsPopoverFlags[popoverIndex] = false;\n if (action === 'delete') {\n if (confirmAction === 'yes') {\n $scope.deleteDecisionMap(dmId);\n }\n }\n };\n\n $scope.closeAllActionMenus = function() {\n var i = 0;\n for (i = 0; i < $scope.actionsPopoverFlags.length; i++) {\n $scope.actionsPopoverFlags[i] = false;\n }\n };\n\n $scope.viewArchivedReports = function () {\n\n if ($scope.archiveLinkText === 'View Archived') {\n $scope.getDecisionMapSummaries(true);\n $scope.archiveLinkText = 'Hide Archived';\n } else {\n $scope.archiveLinkText = 'View Archived';\n $scope.getDecisionMapSummaries(false);\n $scope.loadSummaryTable(); \n } \n };\n\n $scope.openReportRenameModal = function (decisionReport) {\n $scope.reportToRename = angular.copy(decisionReport);\n angular.element(document.querySelector('#renameModal')).modal();\n };\n\n $scope.renameResult = [];\n $scope.renameResult.error = errorDisplayerUtil.create();\n $scope.renameResult.success = errorDisplayerUtil.create();\n\n $scope.renameDecisionReport = function (newReportName, reportId) {\n\n var renameCall = InsightsService.renameDecisionReport(reportId, newReportName);\n renameCall.then(function (success) {\n \n var reportIdx = _.findIndex($scope.decisionMaps, { \"id\": reportId });\n if (reportIdx > -1) {\n $scope.decisionMaps[reportIdx].name = newReportName;\n }\n $scope.renameResult.success.setError(200, \"The Decision Report was successfully renamed\");\n $timeout(function () {\n angular.element(document.querySelector('#renameModal')).modal('hide');\n $scope.renameResult.success.reset();\n }, 3000);\n\n }, function (failure) {\n $scope.renameResult.error.setError(failure.StatusCode, failure.ErrorMessage);\n $timeout(function () {\n $scope.renameResult.error.reset();\n }, 3000);\n });\n };\n }\n ]\n };\n}\n]);","app.directive('baiInsightsCourseSearchModal', [function () {\n return {\n restrict: 'E',\n templateUrl: 'app/templates/insights/mappingdecisions/partials/baiInsightsCourseSearchModal.html',\n scope: true,\n controller: [\n '$scope', '$filter', '$q', '$timeout', 'errorDisplayerUtil', 'CoursesService', 'CatalogService',\n function ($scope, $filter, $q, $timeout, errorDisplayerUtil, CoursesService, CatalogService) {\n $scope.viewCoursesError = {};\n $scope.viewCoursesError.error = errorDisplayerUtil.create();\n $scope.modalBodyShow = false;\n $scope.coursesAreLoading = false;\n $scope.coursesApiAreLoading = false;\n $scope.fromFilter = false;\n $scope.courseData = [];\n var formattedCourseData = null;\n $scope.courseModal = {};\n $scope.catalogDropdownValues = [];\n $scope.courseTypeDropdownValues = [];\n $scope.selectedCatalog = null;\n $scope.selectedCourseType = null;\n\n var formatCoursesData = function (data) {\n _.each(data, function (datapoint) {\n datapoint.select = false;\n });\n\n return data;\n };\n\n var getSelectedCourses = function (data) {\n var selectedCoursesArray = [];\n \n _.each(data, function (datapoint) {\n if (datapoint.select === true) {\n selectedCoursesArray.push(datapoint);\n }\n });\n\n return selectedCoursesArray;\n };\n\n var filterCourses = function (keyword) {\n return $q(function (resolve, reject) {\n $scope.deselectAllCourses();\n $scope.courseModal.selectAll = false;\n var checkKeyword = false;\n var checkCatalog = false;\n var checkType = false;\n\n // If no search criteria, return nothing\n if ((typeof keyword === 'undefined' || keyword === null) ||\n ($scope.selectedCatalog === null || typeof $scope.selectedCatalog === 'undefined') ||\n ($scope.selectedCourseType === null || typeof $scope.selectedCourseType === 'undefined')) {\n $scope.courseData.length = 0;\n resolve(null); // Don't return anything\n }\n\n if (typeof keyword !== 'undefined' && keyword !== null) {\n var result = formattedCourseData;\n result = $filter('filter')(result, keyword);\n $scope.courseData = $filter('filter')(result, { 'productType': '!Document' });\n checkKeyword = true;\n }\n \n if ($scope.selectedCatalog !== null && typeof $scope.selectedCatalog !== 'undefined') {\n checkCatalog = true;\n if (checkKeyword) {\n $scope.courseData = $filter('filter')($scope.courseData, function(course) {\n if (course.rootNodeId === $scope.selectedCatalog.nodeId) {\n return course;\n }\n });\n } else {\n var filterDocCatalog = formattedCourseData;\n filterDocCatalog = $filter('filter')(filterDocCatalog, { 'productType': '!Document' });\n $scope.courseData = $filter('filter')(filterDocCatalog, function (course) {\n if (course.rootNodeId === $scope.selectedCatalog.nodeId) {\n return course;\n }\n });\n }\n }\n if ($scope.selectedCourseType !== null && typeof $scope.selectedCourseType !== 'undefined') {\n checkType = true;\n if (checkKeyword || checkCatalog) {\n $scope.courseData = $filter('filter')($scope.courseData, function(course) {\n if (course.type === $scope.selectedCourseType.type) {\n return course;\n }\n });\n } else {\n var filterDocCourse = formattedCourseData;\n filterDocCourse = $filter('filter')(filterDocCourse, { 'productType': '!Document' });\n $scope.courseData = $filter('filter')(filterDocCourse, function (course) {\n if (course.type === $scope.selectedCourseType.type) {\n return course;\n }\n });\n }\n }\n resolve(null); // Don't return anything\n });\n };\n\n // \"Listen\" for 'openCourseSearch' sent by the parent\n $scope.$on('openCourseSearch', function (e) {\n $scope.modalBodyShow = false;\n $scope.fromFilter = false;\n $scope.selectedCatalog = null;\n $scope.selectedCourseType = null;\n // Cache the course list client side so we don't make the expensive api call every time. Filtering is done client side anyway\n // If client already has course list, show the modal ready to search\n if (formattedCourseData !== null) {\n angular.element(document.querySelector('#addNewAssignmentModal')).modal();\n } else { \n angular.element(document.querySelector('#addNewAssignmentModal')).modal();\n $scope.getCoursesCta(null);\n }\n });\n\n var assignCatalog = function (node, rootId, rootDescription) {\n var nodeId = node.nodeId;\n _.each(formattedCourseData, function (course) {\n if (course.catalogId === nodeId) {\n course.rootNodeId = rootId;\n course.rootNodeDescription = rootDescription;\n } else if (course.catalogId === null) {\n course.rootNodeId = 0;\n course.rootNodeDescription = \"Custom Catalog\";\n }\n });\n\n if (node.nodes) {\n _.each(node.nodes, function (childNode) {\n assignCatalog(childNode, rootId, rootDescription);\n });\n }\n };\n\n $scope.getCoursesCta = function (keyword) {\n if (keyword === \"\") {\n keyword = null;\n }\n if (formattedCourseData === null) {\n $scope.catalogDropdownValues.length = 0;\n $scope.courseTypeDropdownValues.length = 0;\n $scope.coursesApiAreLoading = true;\n $scope.viewCoursesError.error.reset();\n\n // API Call to get courses\n // var addCoursePromise = CoursesService.getActiveCoursesForOrg();\n var coursePromises = [];\n coursePromises.push(CatalogService.getBaiCatalogData()); // Used for catalog info\n coursePromises.push(CatalogService.getCustomCatalog()); // Used for course types and custom courses\n coursePromises.push(CoursesService.getActiveCoursesForOrg(false)); // Used as course list, filtered using 2 above\n\n $q.all(coursePromises).then(function (success) {\n var catalogTree = success[0];\n var customCourses = success[1];\n \n formattedCourseData = formatCoursesData(success[2]);\n _.each(catalogTree.formattedCatalogTreeData, function(catalog) {\n assignCatalog(catalog, catalog.nodeId, catalog.name);\n });\n\n // All the custom courses that were classified as catalog custom courses, flip to regular custom courses so there is only 1 option for custom courses\n _.each(formattedCourseData, function (c) {\n _.each(customCourses, function (ct) {\n var index = -1;\n index = _.findIndex(ct.courses, { \"id\": c.id });\n if (index > -1) {\n if (c.rootNodeId > 0) {\n c.rootNodeId = 0;\n c.rootNodeDescription = \"Custom Catalog\";\n }\n }\n });\n // Assign friendly course type\n c.friendlyTypeName = CoursesService.getFullAssignmentAssetTypeName(c.type);\n });\n\n // Create unique lists of catalogs and course types for dropdowns\n _.each(formattedCourseData, function (c) {\n if (_.findIndex($scope.catalogDropdownValues, { \"nodeId\": c.rootNodeId }) === -1) {\n if (c.productType !== \"Document\") {\n $scope.catalogDropdownValues.push({ \"nodeId\": c.rootNodeId, \"name\": c.rootNodeDescription });\n }\n }\n if (_.findIndex($scope.courseTypeDropdownValues, { \"friendlyName\": c.friendlyTypeName }) === -1) {\n if (c.productType !== \"Document\") {\n $scope.courseTypeDropdownValues.push({ \"type\": c.type, \"friendlyName\": c.friendlyTypeName });\n }\n }\n });\n $scope.catalogDropdownValues = _.sortBy($scope.catalogDropdownValues, \"name\");\n $scope.courseTypeDropdownValues = _.sortBy($scope.courseTypeDropdownValues, \"type\");\n $scope.courseTypeDropdownValues = $scope.courseTypeDropdownValues.reverse();\n\n $scope.sortBy('name');\n $scope.coursesApiAreLoading = false;\n }, function (failure) {\n $scope.coursesApiAreLoading = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.viewCoursesError.error.setError(errorCode, message);\n });\n } else {\n $scope.coursesAreLoading = true;\n $scope.modalBodyShow = true;\n $scope.fromFilter = true;\n // Run this in a $timeout to give the UI a chance to show the loading bars before filtering.\n // Filtering can take a few ticks client side and this makes it look like it's thinking, not frozen\n $timeout(function () {\n filterCourses(keyword).then(function(success) {\n $scope.coursesAreLoading = false;\n });\n }, 500);\n }\n };\n\n\n $scope.addAllCourses = function (value) {\n _.each($scope.courseData, function (course) {\n course.select = value;\n });\n };\n\n $scope.deselectAllCourses = function() {\n _.each(formattedCourseData, function(c) {\n c.select = false;\n });\n };\n\n $scope.addAdditionalCourses = function (courseData) {\n $scope.coursesAreLoading = true;\n // Another UI trick using $timeout to show loading bars while the client does work\n $timeout(function() {\n var selectedCourses = getSelectedCourses(courseData);\n $scope.selectCourseInList(selectedCourses);\n // Reset search modal\n $scope.courseModal.courseSearch = '';\n $scope.courseModal.selectAll = false;\n $scope.fromFilter = false;\n $scope.courseData.length = 0;\n $scope.deselectAllCourses();\n angular.element(document.querySelector('#addNewAssignmentModal')).modal('hide');\n $scope.coursesAreLoading = false;\n }, 500);\n };\n\n $scope.closeAdditionalCourseSearchModal = function () {\n $scope.coursesAreLoading = true;\n $timeout(function () {\n // Reset search modal\n $scope.courseModal.courseSearch = '';\n $scope.courseModal.selectAll = false;\n $scope.fromFilter = false;\n $scope.deselectAllCourses();\n $scope.courseData.length = 0;\n angular.element(document.querySelector('#addNewAssignmentModal')).modal('hide');\n $scope.coursesAreLoading = false;\n }, 500);\n };\n\n $scope.sortBy = function (propertyName) {\n $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;\n $scope.propertyName = propertyName;\n };\n }\n ]};\n}]);","app.directive('baiInsightsDecisionMapCourses', [function () {\n return {\n restrict: 'E',\n templateUrl: 'app/templates/insights/mappingdecisions/partials/decisionMapCourses.html',\n scope: { decisionMapId: '@' },\n controller: ['$scope', '$q', '$location', '$timeout','InsightsService', 'InsightsDecisionMapService','errorDisplayerUtil', 'CoursesService','UsersService',\n function ($scope, $q, $location, $timeout, InsightsService, InsightsDecisionMapService, errorDisplayerUtil, CoursesService, UsersService) {\n \n var _this = this;\n $scope.rowsAreLoading = true;\n $scope.isNextLoading = true;\n _this.selectedMinutes = 0;\n $scope.selectedDuration = 0 + ' Hours ' + 0 + ' Minutes';\n $scope.errorThrown = false;\n $scope.commentType = 'decisionMapComment';\n $scope.commentLayout = 'col-md-12';\n $scope.newCommentText = '';\n $scope.commentsClass = 'insightsComments';\n $scope.stepTips = 'Clicking course titles reveals course descriptions. Course descriptions include regulations covered and estimated duration. Including comments to explain selections is recommended. If you are looking for courses not displayed in the listings, you can click See More for a complete course list. There may be other risks or training requirements of your specific regulator, state, or financial institution that BAI Training Insights does not address. It is recommended you also reference those and what steps you are taking to address them in the comments.';\n $scope.unrelatedModal = [];\n $scope.removedSelections = [];\n $scope.currentWizardStep = 'courses';\n $scope.peerPopoverFlags = [];\n $scope.relatedPopoverFlags = [];\n $scope.previewCourseLoading = false;\n $scope.previewCourseError = false;\n\n var currentUserRole = UsersService.getCurrentRoleType();\n if (currentUserRole === 'ta') {\n $scope.currentRoleTA = true;\n }\n\n $scope.notApplyText = \"The following Courses that you previously selected are not typically associated with the Decision Report's current Function, Role, Responsibilities, Experiences and Risks selections.\";\n $scope.currentWizardStepPretty = 'Courses';\n /*\n Calls to get the Decision Map object, the DM Course List and Peer Assignments Course List\n */\n var decMapGetCourses = InsightsService.getDecisionMapComputedCourses($scope.decisionMapId);\n var peerCourses = InsightsService.getDecisionMapPeerCourses($scope.decisionMapId);\n var promises = [];\n promises.push(decMapGetCourses);\n promises.push(peerCourses);\n\n $scope.decisionMap = InsightsDecisionMapService.getDecisionMap();\n // If we don't have a decision map yet, make API call to get it\n if (_.isEmpty($scope.decisionMap)) {\n var decMap = InsightsService.getDecisionMapById($scope.decisionMapId);\n promises.push(decMap);\n } else {\n // If the decision map is not empty and the status is rule created, redirect to report because course selection cannot be changed\n if ($scope.decisionMap.status === 'Rule Created' || $scope.decisionMap.status === 'Archived') {\n $location.path('insights/decisionmapreport/' + $scope.decisionMap.id);\n }\n }\n\n $q.all(promises).then(function (success) {\n $scope.rowsAreLoading = false;\n $scope.isNextLoading = false;\n $scope.relatedCourses = success[0];\n _.each($scope.relatedCourses, function (dm) {\n $scope.relatedPopoverFlags.push(false);\n });\n $scope.peerCourses = success[1];\n _.each($scope.peerCourses, function (dm) {\n $scope.peerPopoverFlags.push(false);\n });\n if (success.length === 3) {\n $scope.decisionMap = success[2];\n InsightsDecisionMapService.setDecisionMap($scope.decisionMap);\n // If the decision map status is rule created, redirect to report because course selection cannot be changed\n if ($scope.decisionMap.status === 'Rule Created' || $scope.decisionMap.status === 'Archived') {\n $location.path('insights/decisionmapreport/' + $scope.decisionMap.id);\n }\n }\n $scope.preSelectCourses();\n\n $scope.showModal = $scope.decisionMap.confirmCourseSelection;\n $scope.decisionMapName = $scope.decisionMap.name;\n if ($scope.showModal && $scope.unrelatedModal.length > 0) {\n $scope.unrelatedModal = _.sortBy($scope.unrelatedModal, 'value');\n angular.element(document.querySelector('#confirmModal')).modal();\n } else {\n InsightsDecisionMapService.resetModalFlag('courses');\n }\n\n }, function (failure) {\n $scope.rowsAreLoading = false;\n if (failure.StatusCode === 404) {\n $scope.errorMessage = \"No Courses Found\";\n } else {\n $scope.errorMessage = \"Error - \"+failure.ErrorMessage;\n }\n $scope.errorThrown = true;\n });\n\n\n /*\n Pre-select any courses that were selected for a draft rule \n */\n $scope.preSelectCourses = function () { \n var preSelectedCourses = $scope.decisionMap.courses;\n _.each(preSelectedCourses, function (c) {\n //Pre select the courses in the decision map course list\n var relatedIndex = _.findIndex($scope.relatedCourses, { \"id\": c.id });\n var relatedIndexP = _.findIndex($scope.peerCourses, { \"id\": c.id });\n if (relatedIndex > -1) {\n $scope.relatedCourses[relatedIndex].select = true;\n $scope.pushInArray($scope.relatedCourses[relatedIndex]);\n } else {\n c.select = true; \n if (relatedIndexP === -1) {\n $scope.relatedCourses.push(c);\n $scope.pushInArray(c);\n $scope.unrelatedModal.push({ 'key': c.id, 'value': c.name });\n }\n }\n //Pre select the courses in the peer assignment course list\n if (relatedIndexP > -1) {\n $scope.peerCourses[relatedIndexP].select = true;\n $scope.pushInArray($scope.peerCourses[relatedIndexP]);\n }\n });\n };\n\n\n /*\n Course list table sorting \n */\n $scope.propertyName = 'rank';\n $scope.peerPropertyName = 'rank';\n $scope.reverse = false;\n $scope.peerReverse = false;\n\n $scope.sortBy = function (propertyName) {\n $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;\n $scope.propertyName = propertyName;\n };\n\n $scope.sortByPeers = function (peerPropertyName) {\n $scope.peerReverse = ($scope.peerPropertyName === peerPropertyName) ? !$scope.peerReverse : false;\n $scope.peerPropertyName = peerPropertyName;\n };\n\n /* \n Course search\n */\n $scope.openCourseSearch = function () {\n closeAllPopovers();\n // Send 'openCourseSearch' \"event\" to the child directives\n $scope.$broadcast('openAddAssignmentsModal', { displaytype: 1, studentId: null });\n };\n\n $scope.selectCourseInList = function(selectedCourses) {\n _.each(selectedCourses, function (course) {\n\n //For selected courses from the modal, set the canPreview flag to true for wbt courses\n if (course.type === 'wbt') {\n course.canPreview = true;\n } else {\n course.canPreview = false;\n }\n // Find if course is already in related list\n var relatedIndex = _.findIndex($scope.relatedCourses, { \"id\": course.id });\n // If not in related list, check peer course list\n if (relatedIndex === -1) {\n var peerIndex = _.findIndex($scope.peerCourses, { \"id\": course.id });\n if (peerIndex > -1) {\n // If in peer course list, select it\n $scope.peerCourses[peerIndex].select = true;\n $scope.pushInArray($scope.peerCourses[peerIndex]);\n } else {\n // If not in related or peer lists, add it to related list\n var relatedCourse = angular.copy(course);\n relatedCourse.select = true;\n $scope.relatedCourses.push(relatedCourse);\n $scope.pushInArray(relatedCourse);\n }\n } // end not in related list\n else { // In related list, check it there\n $scope.relatedCourses[relatedIndex].select = true;\n $scope.pushInArray($scope.relatedCourses[relatedIndex]);\n }\n });\n };\n\n /*\n Select Courses for Draft Rule\n */\n $scope.selectedCourses = [];\n $scope.selectAll = {};\n $scope.selectAll.checked = false;\n $scope.pushInArray = function (course) {\n\n if ($scope.selectAll.checked)\n $scope.selectAll.checked = false;\n\n var index = _.findIndex($scope.selectedCourses, { \"id\": course.id });\n //Get the indexes from the relatedCourses and peerCourses\n var relIndex = _.findIndex($scope.relatedCourses, { \"id\": course.id });\n var pIndex = _.findIndex($scope.peerCourses, { \"id\": course.id });\n\n if (course.select) {\n if (index === -1) {\n //If the course is being selected and does not already exist in the selected courses array\n // add it and add the hours\n $scope.selectedCourses.push({ \"id\": course.id, \"name\": course.name, \"description\": course.description, \"duration\": course.duration });\n _this.selectedMinutes += course.duration;\n }\n\n //If the course selected exists in both lists then check the course in the 'other' list\n if (relIndex !== -1 && $scope.relatedCourses[relIndex].select !== true) {\n $scope.relatedCourses[relIndex].select = true;\n }\n if (pIndex !== -1 && $scope.peerCourses[pIndex].select !== true) {\n $scope.peerCourses[pIndex].select = true;\n }\n } else {\n //if the course is being removed and is in the selected courses array\n if (index !== -1) {\n //if the course is being removed and is in the selected courses array\n // remove it and get rid of the hours\n $scope.selectedCourses.splice(index, 1);\n _this.selectedMinutes = _this.selectedMinutes - course.duration;\n }\n\n\n //If the course selected exists in both lists then uncheck the course in the 'other' list\n if (relIndex !== -1 && $scope.relatedCourses[relIndex].select === true) {\n $scope.relatedCourses[relIndex].select = false;\n }\n if (pIndex !== -1 && $scope.peerCourses[pIndex].select === true) {\n $scope.peerCourses[pIndex].select = false;\n }\n }\n var hours = Math.floor(_this.selectedMinutes / 60);\n var minutes = _this.selectedMinutes % 60;\n $scope.selectedDuration = hours + ' Hours ' + minutes + ' Minutes';\n };\n\n\n /* Remove all unassociated results in the confirm selections modal */\n $scope.removeAllSelections = function () {\n\n //Add all modal results to removedSelections to be used to update the main page\n _.each($scope.unrelatedModal, function (u) {\n $scope.removedSelections.push({ \"key\": u.key });\n });\n //wipe out the unrelatedModal array\n $scope.unrelatedModal = [];\n };\n\n /* Remove one unassociated result in the confirm selections modal */\n $scope.removeSelection = function (key) {\n\n var relatedIndex = _.findIndex($scope.unrelatedModal, { \"key\": key });\n if (relatedIndex > -1) {\n //Find the selection in the unrelatedModal - delete \n //add the selection to removedSelections to be used to update the main page\n $scope.unrelatedModal.splice(relatedIndex, 1);\n $scope.removedSelections.push({ \"key\": key });\n }\n };\n\n /* Confirm Selections modal Save */\n $scope.saveModalSelectionsOnPage = function () {\n //Hide the modal and reset the flag for the step\n angular.element(document.querySelector('#confirmModal')).modal('hide');\n InsightsDecisionMapService.resetModalFlag('courses');\n\n //remove selections on main page\n _.each($scope.removedSelections, function (s) {\n var relatedCoursesIndex = _.findIndex($scope.relatedCourses, { \"id\": s.key });\n if (relatedCoursesIndex > -1) {\n //Set select to false for the course being removed and reset the total duration by calling pushInArray\n $scope.relatedCourses[relatedCoursesIndex].select = false;\n $scope.pushInArray($scope.relatedCourses[relatedCoursesIndex]);\n $scope.relatedCourses.splice(relatedCoursesIndex, 1);\n }\n });\n\n };\n\n $scope.openPopover = function (index, courseList) {\n closeAllPopovers();\n if (courseList === 'peerCourses') {\n $scope.peerPopoverFlags[index] = true;\n } else if (courseList === 'relatedCourses') {\n $scope.relatedPopoverFlags[index] = true;\n }\n \n $scope.previewCourseError = false;\n };\n\n var closeAllPopovers = function () {\n var i = 0;\n for (i = 0; i < $scope.peerPopoverFlags.length; i++) {\n $scope.peerPopoverFlags[i] = false;\n }\n for (i = 0; i < $scope.relatedPopoverFlags.length; i++) {\n $scope.relatedPopoverFlags[i] = false;\n }\n };\n\n $scope.previewCourse = function (courseId) {\n $scope.previewCourseLoading = true;\n\n var coursePreviewCall = CoursesService.getCoursePreviewUrl(courseId);\n coursePreviewCall.then(function (success) {\n window.open(success, '_blank');\n $scope.previewCourseLoading = false;\n }, function (failure) {\n $scope.previewCourseLoading = false;\n $scope.previewCourseError = true;\n $scope.previewCourseErrorMessage = \"Error - \" + failure.ErrorMessage;\n });\n };\n\n /* \n Next button\n */\n //Save the decision map and then load the report\n $scope.gotToNextStep = function () {\n $scope.isNextLoading = true;\n //set the selected courses at the service level\n InsightsDecisionMapService.setSelectedCourses($scope.selectedCourses);\n var decMap = InsightsDecisionMapService.getDecisionMap();\n var decisionMapUpdate = InsightsService.updateDecisionMap(decMap);\n\n var savePromises = [];\n savePromises.push(decisionMapUpdate);\n\n if ($scope.newCommentText !== undefined && $scope.newCommentText !== '') {\n var saveComment = InsightsService.saveComment($scope.decisionMapId, $scope.newCommentText, $scope.commentType);\n savePromises.push(saveComment);\n }\n\n $q.all(savePromises).then(function (success) {\n $scope.isNextLoading = false;\n // Go to the decision map report page\n $location.path(\"insights/decisionmapreport/\" + decMap.id);\n }, function (failure) {\n\n $scope.rowsAreLoading = false;\n $scope.errorMessage = failure.ErrorMessage;\n $scope.errorThrown = true;\n });\n\n };\n\n\n /* \n Back button\n */\n $scope.goBackInWizard = function () {\n InsightsDecisionMapService.setSelectedCourses($scope.selectedCourses);\n $location.path(\"insights/wizard/risks\");\n };\n\n }]\n };\n}]);","app.directive('baiInsightsDecisionMapCreate', [function () {\n return {\n restrict: 'E',\n templateUrl: 'app/templates/insights/mappingdecisions/newDecisionMap.html',\n scope: { decisionMapId: '@' },\n controller: ['$scope', '$q', '$location', 'InsightsService', 'InsightsDecisionMapService', 'errorDisplayerUtil', 'OrganizationsService', 'UsersService', 'BreadcrumbsService','GroupsService',\n function ($scope, $q, $location, InsightsService, InsightsDecisionMapService, errorDisplayerUtil, OrganizationsService, UsersService, BreadcrumbsService, GroupsService) {\n\n var _this = this;\n $scope.canSelectOrg = true;\n $scope.canSelectPG = true;\n $scope.showPreview = false;\n $scope.showCommentChk = false;\n $scope.copyWithComments = true;\n $scope.previewPeopleError = {};\n $scope.previewPeopleError.error = errorDisplayerUtil.create();\n $scope.previewPeopleIsLoading = false;\n // These 2 are used for sorting the preview\n $scope.reverse = false;\n $scope.propertyName = \"lastName\";\n // Create vs. copy mode\n $scope.modeTitle = \"Create Decision Report\";\n $scope.modeButtonTxt = \"Create\";\n $scope.orgCutoff = 100; // cutoff point for dropdown vs uib-typeahead\n $scope.loggedInUserId = UsersService.getId();\n\n var loadCreateDecisionMap = function () {\n $scope.savingDecisionMap = false;\n $scope.userNotSelected = true;\n var currentUserRole = UsersService.getCurrentRoleType();\n\n if (currentUserRole === 'decisionMaker') {\n $scope.decisionMakerRole = true;\n }\n var dm = InsightsDecisionMapService.getDecisionMap();\n $scope.contentTemplate = 'app/templates/insights/mappingdecisions/create.html';\n $scope.stepTips = \"Decision report names must be unique. It is recommended you standardize the naming convention. Consider naming them the same as the corresponding draft rule name, should you choose to create a draft rule. Many people include the department, role, and year in the name. Each report can only have one function and one role.

Peer group is determined based on your organization's type and estimated asset size. (See Help for specific peer group definitions). Peer group selection helps determine what comparative data is displayed in this decision report's course selection list.

Optionally, an organization or people group can be specified but not both. If one is selected, it will be used as criteria in the draft rule.\";\n // If we already have a decision map, like coming from edit or copy\n if (!_.isEmpty(dm)) {\n // Coming from edit, go to start\n if (dm.id && dm.id > 0 && dm.status === 'Created') {\n $scope.decisionMap = dm;\n $scope.selectedPeerGroup = $scope.decisionMap.peerGroup;\n\n //Set the Decision Maker names\n _.each($scope.decisionMap.decisionMakers, function (m) {\n m.name = m.fullName + \" (\" + m.userName + \")\";\n });\n\n $scope.loadStartTemplate();\n return;\n } else {\n if (dm.sourceDecisionMapId !== null) { // copy\n // Setup copy mode\n $scope.modeTitle = \"Copy Decision Report\";\n $scope.modeButtonTxt = \"Copy\";\n $scope.showCommentChk = true;\n $scope.decisionMap = dm;\n $scope.selectedPeerGroup = $scope.decisionMap.peerGroup;\n $scope.decisionMakerName = dm.userName;\n InsightsService.getPeerGroups().then(function (success) {\n $scope.peerGroups = success;\n }, function (failure) {\n $scope.peerGroups = [];\n $scope.peerGroups.push($scope.selectedPeerGroup);\n });\n\n //Set the Decision Makers\n _.each($scope.decisionMap.decisionMakers, function (m) {\n m.name = m.fullName + \" (\" + m.userName + \")\";\n //if we are in here, that means there is at least one decision maker\n $scope.userNotSelected = false;\n });\n\n /* make a call to get the organization hierarchy and people groups */\n /* right now, only get it for TA's */\n if (!$scope.decisionMakerRole) {\n \n // Get org data and pre-pop selected org\n _this.getOrganizationHierarchyData().then(function (success) {\n var copiedOrg = _.where($scope.orgArray, { id: $scope.decisionMap.businessOrganizationId });\n if (copiedOrg.length > 0) {\n $scope.selectedOrganization = copiedOrg[0];\n $scope.selectOrganization(copiedOrg[0]);\n }\n }, function(failure) {\n // Leave blank. If it fails once, they can continue without it. If it fails more than once, probably a bigger system problem going on\n });\n // Get people group data and pre-pop selected people group\n _this.getPeopleGroupData().then(function(success) {\n if ($scope.decisionMap.peopleGroupId !== null && $scope.decisionMap.peopleGroupId !== undefined) {\n $scope.selectedPeopleGroup = { id: $scope.decisionMap.peopleGroupId, name: $scope.decisionMap.peopleGroupName };\n $scope.selectPeopleGroup($scope.selectedPeopleGroup);\n }\n }, function (failure) {\n // If call fails and decision map has a people group, still pre-pop it\n if ($scope.decisionMap.peopleGroupId !== null && $scope.decisionMap.peopleGroupId !== undefined) {\n var pgGroup = { id: $scope.decisionMap.peopleGroupId, name: $scope.decisionMap.peopleGroupName };\n $scope.pgArray.push(pgGroup);\n $scope.selectedPeopleGroup = pgGroup;\n $scope.selectPeopleGroup(pgGroup);\n }\n });\n } else {\n\n /* For Decision Maker - People Group should only contain the copied People Group with the option to deselect it */\n if ($scope.decisionMap.peopleGroupId !== null) {\n $scope.showPeopleGroupSelector = true;\n $scope.pgArray = [];\n var pgGroup = { id: $scope.decisionMap.peopleGroupId, name: $scope.decisionMap.peopleGroupName };\n $scope.pgArray.push(pgGroup);\n $scope.selectedPeopleGroup = pgGroup;\n $scope.selectPeopleGroup(pgGroup);\n }\n\n /* For Decision Maker - Organization should only contain the copied Organization with the option to deselect it */\n if ($scope.decisionMap.businessOrganizationName !== null && $scope.decisionMap.businessOrganizationName !== '') {\n $scope.showOrganizationSelector = true;\n $scope.orgArray = [];\n $scope.selectedOrg = { id: $scope.decisionMap.businessOrganizationId, name: $scope.decisionMap.businessOrganizationName, pathToOrg: $scope.decisionMap.businessOrganizationName, enabled: true };\n $scope.orgArray.push($scope.selectedOrg);\n $scope.selectedOrganization = $scope.selectedOrg;\n }\n }\n return;\n }\n } // end setup copy\n } // end decision map is not empty\n\n // If we get here it means the client decision map is empty, which means we need a new one\n // or it somehow got an id > 0 and status != Created or no id and no source id. Either way these aren't valid states so throw it out and create a new one\n\n //Get the values to pre-populate the decisionMap with org properties\n var shellGet = InsightsService.getDecisionMapShell();\n shellGet.then(function (success) {\n $scope.decisionMap = success;\n $scope.rowsAreLoading = false;\n $scope.selectedPeerGroup = $scope.decisionMap.peerGroup;\n InsightsService.getPeerGroups().then(function (success) {\n $scope.peerGroups = success;\n }, function (failure) {\n $scope.peerGroups = [];\n $scope.peerGroups.push($scope.selectedPeerGroup);\n });\n /* make a call to get the organization hierarchy */\n /* right now, only get it for TA's */\n if (!$scope.decisionMakerRole) {\n _this.getOrganizationHierarchyData();\n _this.getPeopleGroupData();\n } else {\n /* Assign the decision maker to the map */\n var user = {};\n user.id = UsersService.getId();\n user.name = UsersService.getName();\n $scope.setDecisionMapUser(user);\n }\n }, function (failure) {\n $scope.rowsAreLoading = false;\n $scope.errorMessage = failure.ErrorMessage;\n $scope.errorThrown = true;\n });\n };\n\n _this.getOrganizationHierarchyData = function () {\n $scope.disableHierarchyCheckbox = true;\n var orgDataPromise = OrganizationsService.getOrganizationHierarchy();\n return orgDataPromise.then(function (success) {\n $scope.orgArray = [];\n for (var i = 0; i < success.length; i++) {\n var org = success[i];\n var nameAndOrgObjOnly = {};\n nameAndOrgObjOnly.pathToOrg = org.pathToOrg;\n nameAndOrgObjOnly.name = org.name;\n nameAndOrgObjOnly.id = org.id;\n nameAndOrgObjOnly.enabled = org.enabled;\n $scope.orgArray.push(nameAndOrgObjOnly);\n }\n });\n };\n\n\n /* Org selector */\n $scope.selectOrganization = function (selectedOrg) {\n $scope.decisionMap.businessOrganizationId = selectedOrg === null ? null : selectedOrg.id;\n $scope.decisionMap.businessOrganizationName = selectedOrg === null ? null : selectedOrg.name;\n $scope.disableHierarchyCheckbox = selectedOrg === null ? true : false;\n if (selectedOrg === null) {\n $scope.decisionMap.includeOrganizationHierarchy = false;\n $scope.canSelectPG = true;\n $scope.canSelectOrg = true;\n }else\n {\n $scope.canSelectPG = false;\n }\n };\n\n /*\n * Decision Maker user search typeahead\n */\n $scope.noResults = '';\n $scope.userTypeahead = {};\n $scope.userTypeahead.search = function (value) {\n\n if ($scope.decisionMap.decisionMakers === null || $scope.decisionMap.decisionMakers.length === 0) {\n $scope.userNotSelected = true;\n }\n\n if (value === null) {\n /* validation - if the value is null, then just return after setting validation variable */\n return;\n }\n\n var fieldName = 'fullNameContains';\n searchAttribute = {};\n searchAttribute[fieldName] = value;\n searchAttribute.pageNumber = 1;\n searchAttribute.pageSize = 25;\n searchUserPromise = UsersService.advancedSearch(searchAttribute);\n\n return searchUserPromise.then(function (success) {\n $scope.resultsLoading = false;\n var output = [];\n var filteredFromUsers = _.uniq(_.compact(success));\n _.each(filteredFromUsers, function (item) {\n var skinnedItem = {};\n skinnedItem.id = item.id;\n skinnedItem.name = item.fullName + ' (' + item.userName + ')';\n output.push(skinnedItem);\n });\n return output;\n });\n };\n\n $scope.setDecisionMapUser = function (selectedUser) {\n\n //create the dmaker array if it does not exist\n if ($scope.decisionMap.decisionMakers === null) {\n $scope.decisionMap.decisionMakers = [];\n }\n\n //Add the decision maker to the array if it is not already there\n var dmIndex = _.findIndex($scope.decisionMap.decisionMakers, { \"id\": selectedUser.id });\n if (dmIndex === -1) {\n $scope.decisionMap.decisionMakers.push(selectedUser);\n }\n\n $scope.userNotSelected = false;\n $scope.resultsLoading = false;\n };\n\n $scope.removeDecisionMaker = function (userID) {\n\n // A Decision Maker cannot remove themselves from the Decision Report\n if(!$scope.decisionMakerRole || userID !== $scope.loggedInUserId){\n var dmIndex = _.findIndex($scope.decisionMap.decisionMakers, { \"id\": userID });\n if (dmIndex > -1) {\n $scope.decisionMap.decisionMakers.splice(dmIndex, 1);\n }\n }\n\n if ($scope.decisionMap.decisionMakers.length === 0) {\n $scope.userNotSelected = true;\n }\n };\n\n /*\n * END Decision Maker user search typeahead\n */\n\n /*\n * START People Group typeahead search\n */\n\n _this.getPeopleGroupData = function () {\n $scope.pgArray = [];\n var pgDataPromise = GroupsService.getPeopleGroups(true);\n return pgDataPromise.then(function (success) { \n for (var i = 0; i < success.groups.length; i++) {\n var pg = success.groups[i];\n var pgNameandID = {};\n pgNameandID.name = pg.groupName;\n pgNameandID.id = pg.id;\n $scope.pgArray.push(pgNameandID);\n }\n });\n };\n \n /* People Group Selector */\n $scope.selectPeopleGroup = function (selectedPG) {\n $scope.decisionMap.peopleGroupId = selectedPG === null ? null : selectedPG.id;\n $scope.decisionMap.peopleGroupName = selectedPG === null ? null : selectedPG.name;\n if (selectedPG === null) {\n $scope.canSelectPG = true;\n $scope.canSelectOrg = true;\n } else {\n $scope.canSelectOrg = false;\n }\n };\n\n /*\n * END People Group typeahead search\n */\n\n\n /* set the decisionMap peer group to what was selected in the peer group ddl */\n $scope.ChangeSelectedPeerGroup = function (selectedVal) {\n $scope.decisionMap.peerGroup = selectedVal;\n };\n\n /* set the copy with comments value for copying decision reports */\n $scope.toggleCopyWithComments = function () {\n $scope.copyWithComments = !$scope.copyWithComments;\n };\n\n /* Call to the API to create a new decision map */\n $scope.createDecisionMap = function () {\n $scope.decisionMap.status = \"Created\";\n $scope.savingDecisionMap = true;\n var createDecisionMap = InsightsService.createDecisionMap($scope.decisionMap, $scope.copyWithComments);\n createDecisionMap.then(function (success) {\n $scope.decisionMapConfirmScreen = true;\n $scope.savingDecisionMap = false;\n //Save the returned decision map ID to the decisionMap\n $scope.decisionMap.id = success;\n $scope.errorThrown = false;\n $scope.loadStartTemplate();\n }, function (failure) {\n $scope.savingDecisionMap = false;\n $scope.errorMessage = failure.ErrorMessage;\n $scope.errorThrown = true;\n });\n\n };\n\n /* Set the decision map status to 'started' and redirect to the first page in the wizard */\n $scope.setDecisionMapStartStatus = function () {\n $scope.savingDecisionMap = true;\n $scope.decisionMap.status = \"Started\";\n InsightsService.updateDecisionMap($scope.decisionMap).then(function (success) {\n InsightsDecisionMapService.setDecisionMap($scope.decisionMap);\n $location.path('insights/wizard/function');\n }, function (failure) {\n $scope.savingDecisionMap = false;\n $scope.errorMessage = failure.ErrorMessage;\n $scope.errorThrown = true;\n });\n };\n\n $scope.loadStartTemplate = function () {\n $scope.stepTips = 'Both the Decision Maker and Training Administrator now have access to this decision report. It is recommended you coordinate how best to fill out the information prior to starting.';\n if ($scope.decisionMakerRole === true) {\n BreadcrumbsService.reset();\n BreadcrumbsService.pushCrumb(\"Training Insights\", \"insights/home\");\n BreadcrumbsService.pushCrumb(\"Start Decision Report\", \"\");\n }\n $scope.contentTemplate = 'app/templates/insights/mappingdecisions/start.html';\n };\n\n $scope.previewMembers = function() {\n $scope.previewPeopleIsLoading = true;\n $scope.previewPeopleError.error.reset();\n GroupsService.getUsersByGroupId($scope.decisionMap.peopleGroupId).then(function (success) {\n $scope.people_rows = success;\n $scope.showPreview = true;\n $scope.previewPeopleIsLoading = false;\n }, function(failure) {\n $scope.previewPeopleIsLoading = false;\n $scope.showPreview = false;\n var errorCode = failure.StatusCode;\n var message = failure.ErrorMessage;\n $scope.previewPeopleError.error.setError(errorCode, message);\n });\n };\n\n $scope.sortBy = function (propertyName) {\n $scope.reverse = ($scope.propertyName === propertyName) ? !$scope.reverse : false;\n $scope.propertyName = propertyName;\n };\n\n loadCreateDecisionMap();\n }]\n };\n}\n]);","app.directive('baiInsightsDecisionMapReport', [function () {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/insights/mappingdecisions/report/baiInsightsDecisionMapReport.html',\n scope: { decisionMapId: '@' },\n controller: ['$scope', '$q', '$location', '$filter', 'InsightsService', 'InsightsDecisionMapService','errorDisplayerUtil','dateUtil', 'messagingDisplayerUtil','RulesService', 'GroupsService', 'UsersService', 'CssService',\n function ($scope, $q, $location, $filter, InsightsService, InsightsDecisionMapService, errorDisplayerUtil, dateUtil, messagingDisplayerUtil, RulesService, GroupsService, UsersService, CssService) {\n \n $scope.getDecisionMapReportError = errorDisplayerUtil.create();\n $scope.isLoading = true;\n $scope.commentType = 'decisionFinalReportComment';\n $scope.commentLayout = 'col-md-6';\n\n var currentUserRole = UsersService.getCurrentRoleType();\n if (currentUserRole === 'ta') {\n $scope.currentRoleTA = true;\n }\n\n var decisionMapPromise = InsightsService.getDecisionMapById($scope.decisionMapId);\n var commentsPromise = InsightsService.getAllComments($scope.decisionMapId);\n var promises = [];\n promises.push(decisionMapPromise);\n promises.push(commentsPromise);\n\n $q.all(promises).then(function(success) {\n var decisionMapResult = success[0];\n var commentsResults = success[1];\n $scope.decisionMap = decisionMapResult;\n InsightsDecisionMapService.setDecisionMap(decisionMapResult);\n $scope.decisionMapComments = commentsResults;\n $scope.isLoading = false; \n\n //see if the logged in user is a decision maker\n var dmIndex = _.findIndex($scope.decisionMap.decisionMakers, { \"id\": UsersService.getId() }); \n if (dmIndex > -1 && $scope.decisionMap.decisionMakers[dmIndex].confirmed) {\n //if they have already confirmed the report, don't let them do it again\n $scope.decisionMapStatusConfirmed = true;\n } else if ($scope.currentRoleTA && $scope.decisionMap.confirmedDateTime !== null && dmIndex === -1) {\n //if the user is a TA and is not a DM on the report\n //This enables a TA who is not a dm to confirm the report if a different TA confirmed the report\n $scope.decisionMapStatusConfirmed = true;\n }\n\n if ($scope.decisionMap.rule.key > 0) { $scope.ruleBtnText = 'Edit Rule'; } else { $scope.ruleBtnText = 'Create Draft Rule'; $scope.ruleName = $scope.decisionMap.name; }\n }, function(failure) {\n $scope.getDecisionMapReportError.setError(failure.StatusCode, failure.ErrorMessage);\n $scope.isLoading = false;\n });\n\n $scope.goBackInWizard = function () {\n $location.path(\"insights/decisionmapcourses/\" + $scope.decisionMapId);\n };\n\n $scope.decisionMapChanged = {};\n $scope.decisionMapChanged.success = messagingDisplayerUtil.create();\n $scope.decisionMapChanged.error = messagingDisplayerUtil.create();\n\n // Assumption: Status parameter is only 'Confirmed' or undefined. If undefined, decision map status is being set to 'Rule Created'\n // after a successful API call.\n $scope.updateDecisionMap = function (status) {\n /* if the status is confirmed, then update the Decision Report based on confirmation rules */\n /* else - we are updating rule information and the api will update the decision map status */\n var oldStatus = $scope.decisionMap.status;\n $scope.decisionMap.status = status;\n if (status === 'Confirmed') {\n \n //see if I am in the list of decision makers\n var userInd = _.findIndex($scope.decisionMap.decisionMakers, { \"id\": UsersService.getId() });\n if (userInd > -1) {\n //if I am, then set my confirmed flag\n $scope.decisionMap.decisionMakers[userInd].confirmed = true;\n }\n\n //If the person logged in is the ta, set the confirmed date time\n if ($scope.currentRoleTA) {\n $scope.decisionMap.confirmedDateTime = dateUtil.formatDate(Date());\n } else if(oldStatus !== 'Confirmed'){\n //I am not a ta\n var numDecisionMakersConfirmed = $filter('filter')($scope.decisionMap.decisionMakers, { \"confirmed\": \"true\" }).length;\n //Check if all DM's confirmed the report, if so, set the confirmed datetime\n if ($scope.decisionMap.decisionMakers.length === numDecisionMakersConfirmed && $scope.decisionMap.confirmedDateTime === null) {\n $scope.decisionMap.confirmedDateTime = dateUtil.formatDate(Date());\n } else {\n //if the DM is setting confimed but not all the DM's confirmed the report, the status should remain as 'Started'\n $scope.decisionMap.status = 'Started';\n }\n } \n }\n var insightUpd = InsightsService.updateDecisionMap($scope.decisionMap);\n insightUpd.then(function (success) {\n if ($scope.decisionMap.rule !== undefined && $scope.decisionMap.rule.key > 0) {\n $scope.decisionMap.status = 'Rule Created'; // Set this on response because requests can't update a decision map with status = 'Rule Created'\n } else {\n //always set to true so that the confirmed button is inactive\n $scope.decisionMapStatusConfirmed = true;\n //The report is only officially confirmed if the confirmedDateTime is set\n if ($scope.decisionMap.confirmedDateTime !== null && $scope.decisionMap.confirmedDateTime !== '') {\n \n $scope.decisionMapChanged.success.setError(200, 'Decision Report is Confirmed', true);\n } else {\n $scope.decisionMapChanged.success.setError(200, 'You have successfully confirmed the Decision Report', true);\n }\n }\n $scope.decisionMap.statusChanged = dateUtil.formatDate(Date());\n\n //reset the decision map with the new status and status changed date\n InsightsDecisionMapService.setDecisionMap($scope.decisionMap);\n \n }, function (failure) {\n if (status === 'Confirmed') {\n $scope.decisionMap.status = 'Started';\n $scope.decisionMap.confirmedDateTime = null;\n } else {\n $scope.decisionMap.status = 'Confirmed';\n }\n $scope.decisionMapChanged.error.setError(failure.StatusCode, failure.ErrorMessage, true);\n });\n };\n\n $scope.editRule = function () {\n $location.path(\"rules/edit/\" + $scope.decisionMap.rule.key);\n };\n\n /* Call to create the draft rule for the decision map */\n $scope.createDraftRule = function () {\n /* Get the base rule object */\n $scope.newRule = {};\n var newRuleObj = RulesService.createRuleObj(true);\n $scope.ruleCreateIsLoading = true;\n newRuleObj.then(function (success) {\n\n /* add the decision map info to the rule object */\n $scope.newRule = success;\n $scope.newRule.name = $scope.ruleName;\n $scope.newRule.startDate = dateUtil.formatDate(Date());\n\n /* call the API to create the rule*/\n var createRule = RulesService.ruleGeneralCall($scope.newRule, 'create');\n createRule.then(function (success) {\n $scope.draftRule = success;\n /* create the people group */\n addPeopleGroupToRule();\n /* add the courses */\n addCoursesToRule();\n /* update the decision map status */\n $scope.decisionMap.rule = { key: $scope.draftRule.id, value: $scope.ruleName };\n $scope.decisionMap.ruleCreatedDateTime = dateUtil.formatDate(Date());\n $scope.updateDecisionMap();\n $scope.ruleCreateIsLoading = false;\n /* update the button */\n $scope.ruleBtnText = 'Edit Rule';\n $scope.decisionMapChanged.success.setError(200, 'The Draft Rule ' + $scope.ruleName + ' was successfully created', true);\n }, function (failure) {\n $scope.ruleCreateIsLoading = false;\n if (failure.ErrorMessage.indexOf(\"already exists\") > -1)\n {\n $scope.ruleName = $scope.ruleName + '_map_' + $scope.newRule.startDate;\n $scope.createDraftRule();\n }else{\n /* rule creation failed */\n $scope.decisionMapChanged.error.setError(failure.StatusCode, failure.ErrorMessage, true);\n }\n });\n\n });\n \n };\n\n /* function to add the selected Organization to the draft rule */\n addPeopleGroupToRule = function () {\n\n if ($scope.decisionMap.businessOrganizationId !== null || $scope.decisionMap.peopleGroupId !== null) {\n\n var pgCriteriaContainer = {};\n var criteriaContainerCall = GroupsService.generateRootContainer(true);\n\n criteriaContainerCall.then(function (success) {\n /* Create the People Group Container */\n pgCriteriaContainer = success;\n pgCriteriaContainer.groupId = $scope.draftRule.groupId;\n pgCriteriaContainer.status = 'update';\n pgCriteriaContainer.IsRuleCaller = true;\n pgCriteriaContainer.name = \" \";\n\n /* Create the Organization Criteria */\n var pgCriteria = GroupsService.generateCriteria();\n if ($scope.decisionMap.businessOrganizationId !== null) {\n pgCriteria.criteriaName = 'Organization';\n } else if ($scope.decisionMap.peopleGroupId !== null) {\n pgCriteria.criteriaName = 'People Group';\n }\n \n\n /* Get the ID of the operand to use for organization */\n var operandCall = GroupsService.getPeopleGroupFilters();\n\n operandCall.then(function (success) {\n\n var orgIndex = -1;\n if ($scope.decisionMap.businessOrganizationId !== null) {\n orgIndex = _.findIndex(success, { \"name\": \"Organization\" });\n } else if ($scope.decisionMap.peopleGroupId !== null) {\n orgIndex = _.findIndex(success, { \"name\": \"People Group\" });\n }\n\n if (orgIndex > -1) {\n var operaIndex = _.findIndex(success[orgIndex].operands, { \"displayName\": \"equals\" });\n if (operaIndex > -1) {\n /* get the people group filter Id's */\n pgCriteria.criteriaId = success[orgIndex].id;\n pgCriteria.operandId = success[orgIndex].operands[operaIndex].id;\n pgCriteria.operandName = success[orgIndex].operands[operaIndex].name;\n\n if ($scope.decisionMap.businessOrganizationId !== null) {\n pgCriteria.value = $scope.decisionMap.businessOrganizationId;\n pgCriteria.followHierarchy = $scope.decisionMap.includeOrganizationHierarchy;\n\n } else if ($scope.decisionMap.peopleGroupId !== null) {\n pgCriteria.value = $scope.decisionMap.peopleGroupId;\n } \n\n if (pgCriteria.value !== undefined) {\n pgCriteriaContainer.Criteria = [];\n pgCriteriaContainer.Criteria.push(pgCriteria);\n\n var addOrganizationPG = GroupsService.savePeopleGroup(pgCriteriaContainer, 'update');\n addOrganizationPG.then(function (success) {\n //silent success\n }, function (failure) {\n /* people group creation failed */\n setRuleCreateFailure('people group criteria');\n });\n }\n }\n } else { setRuleCreateFailure('people group criteria');}\n }, function (failure) {\n /* people group creation failed */\n setRuleCreateFailure('people group criteria');\n });\n\n \n });\n }\n };\n\n setRuleCreateFailure = function (error) {\n $scope.decisionMapChanged.success.reset();\n $scope.decisionMapChanged.error.setError(failure.StatusCode, \"The draft rule was created but an error occured while adding the \" + error + \" to the rule.\", true);\n };\n\n /* function to add the selected courses to the draft rule */\n addCoursesToRule = function () {\n\n /* make sure there are courses in the map */\n if ($scope.decisionMap.courses !== null) {\n /* format the courses */\n var formattedCourses = RulesService.formatCourseObj($scope.decisionMap.courses);\n\n /* Assign the current date to the assign on date for validation since creating a rule with insights does not require a user to do so */\n _.each(formattedCourses, function (row) {\n row.assignOnDate = moment().format();\n });\n\n /* call the api to add the courses to the rule */\n var addCourses = RulesService.updateRuleAssignments($scope.draftRule.id, formattedCourses);\n addCourses.then(function (success) {\n //silent success\n }, function (failure) {\n /* adding courses failed */\n setRuleCreateFailure('course(s)');\n });\n }\n };\n\n $scope.draftRuleConfirmationAction = function () {\n if ($scope.decisionMap.rule.key > 0) {\n $scope.editRule();\n } else {\n $scope.createDraftRule();\n }\n };\n\n // Used to submit the export report form.\n // This is because the export needs to bypass angular's $http service to return a downloaded file\n // so this posts the form to the server directly from the template instead of going through the insights service.\n $scope.exportDecisionMap = function () {\n $scope.currentTimezone = moment.tz.guess();\n $scope.portalBackgroundColor = CssService.extractColorFromCSS(CssService.currentcss);\n if ($scope.portalBackgroundColor === null) {\n $scope.headerTextColor = \"#FFFFFF\";\n }\n else {\n if (CssService.isColorTooLight($scope.portalBackgroundColor)) {\n $scope.headerTextColor = \"#000000\";\n } else {\n $scope.headerTextColor = \"#FFFFFF\";\n }\n }\n };\n\n }]\n };\n }\n]);","app.directive('baiInsightsDecisionMapWizard', [function () {\n return {\n restrict: 'E',\n transclude: true,\n templateUrl: 'App/templates/insights/mappingdecisions/wizard/baiInsightsDecisionMapWizard.html',\n scope: true,\n controller: ['$scope', '$q', '$location', '$timeout', 'InsightsService', 'InsightsDecisionMapService', 'errorDisplayerUtil',\n function ($scope, $q, $location, $timeout, InsightsService, InsightsDecisionMapService, errorDisplayerUtil) {\n $scope.decisionMapId = InsightsDecisionMapService.getDecisionMap().id;\n $scope.decisionMapName = InsightsDecisionMapService.getDecisionMap().name;\n $scope.isNextEnabled = false;\n $scope.updateDecisionMapError = {};\n $scope.updateDecisionMapError.error = errorDisplayerUtil.create();\n $scope.isNextLoading = false;\n $scope.functionStep = false;\n $scope.roleStep = false;\n $scope.responsibilitiesStep = false;\n $scope.experiencesStep = false;\n $scope.risksStep = false;\n $scope.commentLayout = 'col-md-12';\n if ($scope.currentWizardStep === \"function\") {\n $scope.backStepUrl = \"\";\n $scope.nextStepUrl = \"insights/wizard/role\";\n $scope.functionStep = true;\n $scope.commentType = 'functionComment';\n $scope.stepTips = 'In many organizations the function name will be the same as the department name; however, if you are organized geographically, for example, one department might have multiple functions. These will need separate decision reports because each report can only have one function and one role.';\n } else if ($scope.currentWizardStep === \"role\") {\n $scope.backStepUrl = \"insights/wizard/function\";\n $scope.nextStepUrl = \"insights/wizard/responsibilities\";\n $scope.functionStep = true;\n $scope.roleStep = true;\n $scope.commentType = 'roleComment';\n $scope.stepTips = 'Role is like title and position but standardized so data from other organizations can be leveraged in your decisions. Only one role can be selected per decision report. If you are excluding some people who have similar titles or including people with very different titles, an explanatory comment might be necessary.';\n } else if ($scope.currentWizardStep === \"responsibilities\") {\n $scope.backStepUrl = \"insights/wizard/role\";\n $scope.nextStepUrl = \"insights/wizard/experiences\";\n $scope.functionStep = true;\n $scope.roleStep = true;\n $scope.responsibilitiesStep = true;\n $scope.commentType = 'responsibilityComment';\n $scope.stepTips = 'Be thorough. Selecting all the applicable responsibilities is necessary to see an appropriate course listing. If you do not see a responsibility you can select See More for a complete listing. If you are excluding some of the responsibilities typically associated with a particular role, or including some responsibilities not typically associated with a role, an explanatory comment might be necessary.';\n } else if ($scope.currentWizardStep === \"experiences\") {\n $scope.backStepUrl = \"insights/wizard/responsibilities\";\n $scope.nextStepUrl = \"insights/wizard/risks\";\n $scope.functionStep = true;\n $scope.roleStep = true;\n $scope.responsibilitiesStep = true;\n $scope.experiencesStep = true;\n $scope.commentType = 'experienceComment';\n $scope.stepTips = 'Most groups of people include multiple experience levels. Your selections will influence whether Introduction, Essentials, or Comprehensive courses are displayed.';\n } else if ($scope.currentWizardStep === \"risks\") {\n $scope.backStepUrl = \"insights/wizard/experiences\";\n $scope.nextStepUrl = \"insights/decisionmapcourses/\" + $scope.decisionMapId;\n $scope.functionStep = true;\n $scope.roleStep = true;\n $scope.responsibilitiesStep = true;\n $scope.experiencesStep = true;\n $scope.risksStep = true;\n $scope.commentType = 'riskComment';\n $scope.stepTips = 'Including comments to explain risk rankings is recommended. If a risk is not appropriate, it does not need to be ranked, and will not appear in the final report. If you do not see a relevant risk, you can select See More for a complete listing. There may be other risks or training requirements of your specific regulator, state, or financial institution that BAI Training Insights does not address. We recommend you reference those and what steps you are taking to address them in the comments.';\n } \n\n\n $scope.newCommentText = '';\n $scope.commentsClass = ($scope.commentType === 'functionComment' || $scope.commentType === 'roleComment' || $scope.commentType === 'experienceComment') ? 'insightsComments' : '';\n\n $scope.gotToNextStep = function() {\n $scope.isNextLoading = true;\n\n var saveDecisionmap = InsightsService.updateDecisionMap(InsightsDecisionMapService.getDecisionMap());\n var savePromises = [];\n savePromises.push(saveDecisionmap);\n\n if ($scope.newCommentText !== undefined && $scope.newCommentText !== '') {\n var saveComment = InsightsService.saveComment($scope.decisionMapId, $scope.newCommentText, $scope.commentType);\n savePromises.push(saveComment);\n } \n\n $q.all(savePromises).then(function(success) {\n $location.path($scope.nextStepUrl);\n if ($scope.currentWizardStep !== \"risks\"){\n $scope.isNextLoading = false;\n }\n }, function(failure) {\n if ($scope.currentWizardStep !== \"risks\") {\n $scope.isNextLoading = false;\n }\n $scope.updateDecisionMapError.error.setError(failure.StatusCode, failure.ErrorMessage);\n $timeout(function() {\n $scope.updateDecisionMapError.error.reset();\n }, 3000);\n });\n\n };\n\n $scope.goToPreviousStep = function() {\n $location.path($scope.backStepUrl);\n };\n\n this.enableNextButton = function () {\n $scope.isNextEnabled = true;\n };\n this.disableNextButton = function() {\n $scope.isNextEnabled = false;\n };\n }]\n };\n}]);","app.directive('baiInsightsDecisionMapWizardStep', [function () {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/insights/mappingdecisions/wizard/baiInsightsDecisionMapWizardStep.html',\n scope: true,\n require: '^baiInsightsDecisionMapWizard',\n controller: ['$scope', '$q', '$location', '$timeout', 'InsightsService', 'InsightsDecisionMapService', 'errorDisplayerUtil',\n function ($scope, $q, $location, $timeout, InsightsService, InsightsDecisionMapService, errorDisplayerUtil) {\n var decisionMap = InsightsDecisionMapService.getDecisionMap();\n // If we don't have a decision map yet, redirect to insights home\n if (_.isEmpty(decisionMap)) {\n $location.path(\"insights/home\");\n return;\n }\n $scope.isLoading = true;\n $scope.question = \"\";\n var relatedChoices = [];\n var unrelatedChoices = [];\n $scope.low = 0;\n $scope.medium = 1;\n $scope.high = 2;\n $scope.choices = [];\n $scope.shouldSeeMore = false;\n $scope.selectSingle = true;\n $scope.selectWithCategories = false;\n $scope.getStepError = {};\n $scope.getStepError.error = errorDisplayerUtil.create();\n $scope.seeMoreError = {};\n $scope.seeMoreError.error = errorDisplayerUtil.create();\n $scope.seeMoreLinkText = \"See More\";\n $scope.seeMoreLoading = false;\n $scope.decisionMapId = decisionMap.id;\n $scope.decisionMapName = decisionMap.name;\n $scope.unrelatedModal = [];\n $scope.showModal = InsightsDecisionMapService.shouldShowModal($scope.currentWizardStep);\n $scope.removedSelections = [];\n\n var preSelectChoice = function(choice) {\n if (choice && choice.key > 0) {\n var relatedIndex = _.findIndex(relatedChoices, { \"key\": choice.key });\n if (relatedIndex === -1) {\n relatedChoices.push({ key: choice.key, value: choice.value });\n $scope.unrelatedModal.push({ key: choice.key, value: choice.value });\n }\n $scope.selectedValue = choice.key;\n $scope.enableNextButton();\n }\n };\n\n var preSelectMultiChoice = function (choices) {\n _.each(choices, function (c) {\n if (c.key > 0) {\n var relatedIndex = _.findIndex(relatedChoices, { \"key\": c.key });\n if (relatedIndex > -1) {\n relatedChoices[relatedIndex].selected = true;\n $scope.enableNextButton();\n } else {\n relatedChoices.push({ key: c.key, value: c.value, selected: true }); \n $scope.unrelatedModal.push({ key: c.key, value: c.value });\n $scope.enableNextButton();\n }\n }\n });\n };\n\n var preSelectRiskRating = function (choices) {\n //go through each selected risk rating and set the riskRating to that value for the risk in the relatedChoices \n _.each(choices, function (c) {\n if (c.key > 0) {\n var relatedIndex = _.findIndex(relatedChoices, { \"key\": c.key });\n if (relatedIndex > -1) {\n if (relatedChoices[relatedIndex].activeRatings === undefined || relatedChoices[relatedIndex].activeRatings === null) {\n relatedChoices[relatedIndex].activeRatings = [];\n relatedChoices[relatedIndex].activeRatings.push('');\n relatedChoices[relatedIndex].activeRatings.push('');\n relatedChoices[relatedIndex].activeRatings.push('');\n }\n if (c.riskRating === 'Low') {\n relatedChoices[relatedIndex].activeRatings[$scope.low] = 'active';\n } else if (c.riskRating === 'Medium') {\n relatedChoices[relatedIndex].activeRatings[$scope.medium] = 'active';\n } else if (c.riskRating === 'High') {\n relatedChoices[relatedIndex].activeRatings[$scope.high] = 'active';\n }\n relatedChoices[relatedIndex].riskRating = c.riskRating;\n $scope.enableNextButton();\n } else {\n var ar = [];\n ar.push('');\n ar.push('');\n ar.push('');\n if (c.riskRating === 'Low') {\n ar[$scope.low] = 'active';\n } else if (c.riskRating === 'Medium') {\n ar[$scope.medium] = 'active';\n } else if (c.riskRating === 'High') {\n ar[$scope.high] = 'active';\n }\n relatedChoices.push({ key: c.key, value: c.value, riskRating: c.riskRating, activeRatings: ar });\n\n $scope.unrelatedModal.push({ key: c.key, value: c.value });\n $scope.enableNextButton();\n }\n }\n });\n };\n\n var setupStep = function(questionText, shouldSeeMore, selectSingle, preSelectFunction, preSelectFunctionParams) {\n \n $scope.newCommentText = null;\n $scope.selectRiskRating = false;\n\n var promises = [];\n promises.push(InsightsService.getDecisionMapWizardOptions($scope.currentWizardStep, decisionMap.id));\n if($scope.currentWizardStep === 'responsibilities')\n {\n $scope.selectWithCategories = true;\n promises.push(InsightsService.getResponsibilityCategories());\n } else if ($scope.currentWizardStep === 'risks') {\n promises.push(InsightsService.getRiskDetails());\n }\n\n $q.all(promises).then(function (success) {\n $scope.question = questionText;\n relatedChoices = success[0];\n\n //Check the related choices for the unrelatedCount to see if there are any unrelated options\n var unrelatedCountIdx = _.findIndex(relatedChoices, { \"value\": 'UnrelatedCount' });\n var unrelatedCount = 1;/* default to 1 aka shouldSeeMore */\n if (unrelatedCountIdx > -1) {\n unrelatedCount = relatedChoices[unrelatedCountIdx].key;\n relatedChoices.splice(unrelatedCountIdx, 1);\n }\n\n \n $scope.selectSingle = selectSingle;\n preSelectFunction(preSelectFunctionParams);\n $scope.shouldSeeMore = (shouldSeeMore && unrelatedCount > 0 && ($scope.unrelatedModal.length < unrelatedCount));\n $scope.choices = relatedChoices;\n $scope.isLoading = false;\n if ($scope.currentWizardStep === 'responsibilities') {\n $scope.responsibilityCategories = success[1];\n $scope.populateResponsibilityCategories();\n } else if ($scope.currentWizardStep === 'risks') {\n $scope.riskDetails = success[1];\n $scope.populateRiskDetails();\n }\n if ($scope.showModal && $scope.unrelatedModal.length > 0) {\n $scope.unrelatedModal = _.sortBy($scope.unrelatedModal, 'value');\n angular.element(document.querySelector('#confirmModal')).modal();\n } else {\n InsightsDecisionMapService.resetModalFlag($scope.currentWizardStep);\n }\n\n }, function(failure) {\n $scope.getStepError.error.setError(failure.StatusCode, failure.ErrorMessage);\n $scope.isLoading = false;\n });\n };\n\n if ($scope.currentWizardStep === \"function\") {\n setupStep(\"\", true, true, preSelectChoice, decisionMap.function);\n } else if ($scope.currentWizardStep === \"role\") {\n setupStep(\"\", true, true, preSelectChoice, decisionMap.role);\n $scope.notApplyText = \"The following Role that you previously selected is not typically associated with the Decision Report's current Function selection.\";\n $scope.currentWizardStepPretty = 'Role';\n } else if ($scope.currentWizardStep === 'responsibilities') {\n setupStep(\"\", true, false, preSelectMultiChoice, decisionMap.responsibilities);\n $scope.notApplyText = \"The following Responsibilities that you previously selected are not typically associated with the Decision Report's current Role selection.\";\n $scope.currentWizardStepPretty = 'Responsibilities';\n } else if ($scope.currentWizardStep === 'experiences') {\n setupStep(\"\", false, false, preSelectMultiChoice, decisionMap.experiences);\n } else if ($scope.currentWizardStep === 'risks') {\n setupStep(\"\", true, false, preSelectRiskRating, decisionMap.risks);\n $scope.selectRiskRating = true;\n $scope.notApplyText = \"The following Risks that you previously selected are not typically associated with the Decision Report's current Role selection. \";\n $scope.currentWizardStepPretty = 'Risks';\n }\n \n $scope.seeMore = function() {\n \n /* SEE MORE */\n if ($scope.seeMoreLinkText === \"See More\") {\n var seeMoreChoicesPromise = InsightsService.getDecisionMapWizardOptions($scope.currentWizardStep, decisionMap.id, true);\n\n $scope.seeMoreLoading = true;\n seeMoreChoicesPromise.then(function(success) {\n _.each(success, function(uc) {\n var tempChoice = null;\n // Find if choice is already in related list\n _.each(relatedChoices, function(rc) {\n if (rc.key === uc.key) {\n tempChoice = rc;\n return;\n }\n });\n // If it's not in related list, add it to unrelated list\n if (tempChoice === null) {\n unrelatedChoices.push(uc);\n }\n });\n\n unrelatedChoices = _.sortBy(unrelatedChoices, 'value');\n $scope.choices = relatedChoices.concat(unrelatedChoices);\n\n if ($scope.currentWizardStep === \"responsibilities\") {\n //If the current step is Responsibilities, then after we have the full choices list\n //create the responsibility category array\n $scope.populateResponsibilityCategories();\n } else if ($scope.currentWizardStep === 'risks') {\n $scope.populateRiskDetails();\n }\n\n $scope.seeMoreLinkText = \"See Less\";\n $scope.seeMoreLoading = false;\n }, function(failure) {\n $scope.seeMoreError.error.setError(failure.StatusCode, failure.ErrorMessage);\n $timeout(function() {\n $scope.seeMoreError.error.reset();\n }, 3000);\n $scope.seeMoreLoading = false;\n });\n }\n /* SEE LESS */\n else {\n\n /* see less on function or role (single select) */\n if ($scope.selectSingle) {\n var selectedChoiceKey = 0;\n if ($scope.currentWizardStep === \"function\") {\n selectedChoiceKey = decisionMap.function.key;\n } else if ($scope.currentWizardStep === \"role\") {\n selectedChoiceKey = decisionMap.role.key;\n }\n _.each(unrelatedChoices, function(choice) {\n if (selectedChoiceKey === choice.key) {\n var relatedIndex = _.findIndex(relatedChoices, { \"key\": choice.key });\n if (relatedIndex === -1) {\n relatedChoices.push(choice);\n }\n }\n });\n }\n /* see less on Responsibilities, experiences and risks (multi select) */\n else {\n\n if ($scope.currentWizardStep === 'experiences' || $scope.currentWizardStep === 'risks') {\n /* for experiences and risks, loop through choices to see what is selected */\n _.each($scope.choices, function (choice) {\n if (choice.selected === true || choice.riskRating) {\n // Sanity check against the \"saved\" choices in the decision map to make sure selected choice is a decisionMap choice. Don't know if this is 100% necessary\n var arrayToCheck = [];\n if ($scope.currentWizardStep === \"experiences\") {\n arrayToCheck = decisionMap.experiences;\n } else if ($scope.currentWizardStep === \"risks\") {\n arrayToCheck = decisionMap.risks;\n }\n var selectedIndex = _.findIndex(arrayToCheck, { \"key\": choice.key });\n if (selectedIndex > -1) {\n var relatedIndex = _.findIndex(relatedChoices, { \"key\": choice.key });\n if (relatedIndex === -1) {\n relatedChoices.push(choice);\n }\n }\n }\n });\n } else if ($scope.currentWizardStep === \"responsibilities\") {\n /* for Responsibilities, loop through the choicesGrouped - responsibilities */\n var selectedResponsibilities = decisionMap.responsibilities; \n _.each($scope.choicesGrouped, function (categoryRow) {\n\n _.each(categoryRow, function (category) {\n\n _.each(category.responsibilities, function (c) {\n if (c.selected === true) {\n var selectedIndex = _.findIndex(selectedResponsibilities, { \"key\": c.key });\n if (selectedIndex > -1) {\n var relatedIndex = _.findIndex(relatedChoices, { \"key\": c.key });\n if (relatedIndex === -1) {\n relatedChoices.push(c);\n }\n }\n }\n });\n\n });\n });\n }\n\n \n } /* end multi select*/\n\n\n $scope.choices = relatedChoices;\n if ($scope.currentWizardStep === \"responsibilities\") {\n $scope.populateResponsibilityCategories();\n }\n unrelatedChoices.length = 0;\n $scope.seeMoreLinkText = \"See More\";\n\n } /*end see less*/\n };\n\n $scope.choiceSelectionChanged = function (selectedValue) {\n var selectedChoice = null;\n _.each($scope.choices, function (c) {\n if (c.key === selectedValue) {\n selectedChoice = { key: c.key, value: c.value };\n return;\n }\n });\n \n $scope.selectedValue = selectedChoice.key;\n if ($scope.currentWizardStep === \"function\") {\n InsightsDecisionMapService.setFunction(selectedChoice);\n } else if ($scope.currentWizardStep === \"role\") {\n InsightsDecisionMapService.setRole(selectedChoice);\n }\n $scope.enableNextButton();\n };\n\n $scope.multiChoiceSelectionChanged = function () {\n var selectedChoices = []; \n\n if ($scope.currentWizardStep === \"responsibilities\") {\n //For Responsibilities, loop through the choicesGrouped - responsibilities\n _.each($scope.choicesGrouped, function (categoryRow) {\n _.each(categoryRow, function (category) {\n _.each(category.responsibilities, function (c) {\n if (c.selected === true) {\n selectedChoices.push({ key: c.key, value: c.value });\n var relInd = _.findIndex(relatedChoices, { \"key\": c.key });\n if (relInd > -1) { relatedChoices[relInd].selected = true; }\n } else {\n var relIndUnchecked = _.findIndex(relatedChoices, { \"key\": c.key });\n if (relIndUnchecked > -1) { relatedChoices[relIndUnchecked].selected = false; }\n }\n });\n });\n });\n\n InsightsDecisionMapService.setResponsibilites(selectedChoices);\n } else if ($scope.currentWizardStep === \"experiences\") {\n //For experiences, loop through choices to see the selections\n _.each($scope.choices, function (c) {\n if (c.selected === true) {\n selectedChoices.push({ key: c.key, value: c.value });\n }\n });\n //Set the experiences on the map\n InsightsDecisionMapService.setExperiences(selectedChoices);\n }\n \n //Enable or disable the next button\n if (selectedChoices.length > 0) {\n $scope.enableNextButton();\n } else {\n $scope.disableNextButton();\n }\n };\n\n $scope.changeRiskRating = function(riskRating, riskId) {\n var ratedChoices = [];\n _.each($scope.choices, function(c) {\n if (c.key === riskId) {\n if (c.activeRatings === null || c.activeRatings === undefined) {\n c.activeRatings = [];\n c.activeRatings.push('');\n c.activeRatings.push('');\n c.activeRatings.push('');\n }\n if (riskRating === 'Low') {\n if (c.activeRatings[$scope.low] === 'active') {\n c.activeRatings[$scope.low] = '';\n c.riskRating = '';\n } else {\n c.activeRatings[$scope.low] = 'active';\n c.riskRating = riskRating;\n c.activeRatings[$scope.medium] = '';\n c.activeRatings[$scope.high] = '';\n }\n } else if (riskRating === 'Medium') {\n if (c.activeRatings[$scope.medium] === 'active') {\n c.activeRatings[$scope.medium] = '';\n c.riskRating = '';\n } else {\n c.activeRatings[$scope.low] = '';\n c.activeRatings[$scope.medium] = 'active';\n c.riskRating = riskRating;\n c.activeRatings[$scope.high] = '';\n }\n } else if (riskRating === 'High') {\n if (c.activeRatings[$scope.high] === 'active') {\n c.activeRatings[$scope.high] = '';\n c.riskRating = '';\n } else {\n c.activeRatings[$scope.low] = '';\n c.activeRatings[$scope.medium] = '';\n c.activeRatings[$scope.high] = 'active';\n c.riskRating = riskRating;\n }\n }\n\n return;\n }\n });\n\n _.each($scope.choices, function(c) {\n if (typeof c.riskRating !== 'undefined' && c.riskRating !== '') {\n ratedChoices.push({ 'key': c.key, 'value': c.value, 'riskRating': c.riskRating });\n }\n });\n InsightsDecisionMapService.setRisks(ratedChoices);\n\n if (ratedChoices.length > 0) {\n $scope.enableNextButton();\n } else {\n $scope.disableNextButton();\n }\n };\n\n $scope.populateResponsibilityCategories = function () {\n \n var cats = [];\n //Loop through the array of Responsibilities\n _.each($scope.choices, function (c) {\n //Find the responsibilityCategory for the responsibility\n var catIndex = _.findIndex($scope.responsibilityCategories, { \"key\": c.key });\n if (catIndex > -1) {\n //If that responsibility category already exists in the cats array\n var i = _.findIndex(cats, { \"category\": $scope.responsibilityCategories[catIndex].value });\n if (i > -1) {\n //Then add the responsibility to that category\n cats[i].responsibilities.push({ 'key': c.key, 'value': c.value, 'selected': c.selected });\n } else {\n //OR create the category and add the responsibility to the new category\n cats.push({ \"category\": $scope.responsibilityCategories[catIndex].value });\n cats[cats.length - 1].responsibilities = [];\n cats[cats.length - 1].responsibilities.push({ 'key': c.key, 'value': c.value, 'selected': c.selected });\n }\n }\n });\n \n cats.sort(function (a, b) { return (a.category > b.category) ? 1 : ((b.category > a.category) ? -1 : 0); });\n //Set the scope variable to use on the page\n $scope.choicesGrouped = createCategoryRows(cats, 2);\n };\n\n var createCategoryRows = function (arr, size) {\n var newArr = [];\n for (var i = 0; i < arr.length; i += size) {\n newArr.push(arr.slice(i, i + size));\n }\n return newArr;\n };\n\n $scope.populateRiskDetails = function () {\n //foreach risk in choices, add the corresponding detail\n _.each($scope.choices, function (c) {\n var detailIdx = _.findIndex($scope.riskDetails, { \"key\": c.key });\n if (detailIdx > -1) {\n c.detail = $scope.riskDetails[detailIdx].value;\n } else {\n c.detail = 'hideDetail';\n }\n });\n\n };\n\n\n /* Remove all unassociated results in the confirm selections modal */\n $scope.removeAllSelections = function () {\n\n //Add all modal results to removedSelections to be used to update the main page\n _.each($scope.unrelatedModal, function (u) {\n $scope.removedSelections.push({ \"key\": u.key });\n });\n //wipe out the unrelatedModal array\n $scope.unrelatedModal = [];\n };\n\n /* Remove one unassociated result in the confirm selections modal */\n $scope.removeSelection = function (key) {\n\n var relatedIndex = _.findIndex($scope.unrelatedModal, { \"key\": key });\n if (relatedIndex > -1) {\n //Find the selection in the unrelatedModal - delete \n //add the selection to removedSelections to be used to update the main page\n $scope.unrelatedModal.splice(relatedIndex, 1);\n $scope.removedSelections.push({ \"key\": key });\n }\n };\n\n /* Confirm Selections modal Save */\n $scope.saveModalSelectionsOnPage = function () {\n //Hide the modal and reset the flag for the step\n angular.element(document.querySelector('#confirmModal')).modal('hide');\n InsightsDecisionMapService.resetModalFlag($scope.currentWizardStep);\n\n //remove selections on main page\n _.each($scope.removedSelections, function (s) {\n var choicesIndex = _.findIndex($scope.choices, { \"key\": s.key });\n if (choicesIndex > -1) {\n $scope.choices.splice(choicesIndex, 1);\n }\n });\n\n //if selections were removed\n if ($scope.removedSelections.length > 0) {\n\n //The user removed at least one, so there is at least one in the see more\n $scope.shouldSeeMore = true;\n\n if ($scope.currentWizardStep === 'role') {\n //for role, that means that there are no longer any roles selected\n //the next button should be disabled\n $scope.disableNextButton();\n } else if ($scope.currentWizardStep === 'responsibilities') {\n //For responsibilities, need to recalculate the categorization\n $scope.populateResponsibilityCategories();\n //recalculate the responsibilities selected and save to decision map in the service\n $scope.multiChoiceSelectionChanged();\n } else if ($scope.currentWizardStep === 'risks') {\n //recalculate the risk ratings and save to decision map in the service\n $scope.changeRiskRating(null, null);\n }\n }\n };\n\n }],\n link: function($scope, el, attrs, parentCtrl) {\n $scope.enableNextButton = function() {\n parentCtrl.enableNextButton();\n };\n $scope.disableNextButton = function() {\n parentCtrl.disableNextButton();\n };\n }\n };\n}]);","\napp.directive(\"insightsSeeComments\", ['$rootScope', '$sce', '$route', 'InsightsService', 'UsersService', function ($rootScope, $sce, $route, InsightsService, UsersService) {\n // returns the Directive Definition Object\n return {\n restrict: 'E',\n templateUrl: 'app/templates/insights/mappingdecisions/partials/comments.html',\n link: function (scope, element, attrs, ctrl) {\n scope.savingComment = false;\n scope.comments = [];\n /* Comments will start as the active tab */\n scope.commentsActive = true;\n scope.loadingHistory = false;\n\n var currentUserRole = UsersService.getCurrentRoleType();\n if (currentUserRole === 'ta') {\n scope.currentRoleTA = true;\n }\n\n /* Get all comments for the decision map/comment type */\n scope.getComments = function () {\n scope.noComment = false;\n /* Get the comments for the decision Map */\n var commentResult = InsightsService.getComments(scope.decisionMapId, scope.commentType);\n commentResult.then(function (success) {\n scope.comments = success;\n scope.commentRowsAreLoading = false;\n scope.showComments = true;\n }, function (failure) {\n scope.commentRowsAreLoading = false;\n scope.commentErrorMessage = 'Error - ' + failure.ErrorMessage;\n scope.commentErrorThrown = true;\n scope.noComment = true;\n });\n };\n\n /* DELETE a comment */\n scope.deleteComment = function (commentID) {\n\n scope.savingComment = true;\n scope.showComments = false;\n var deleteComm = InsightsService.deleteComment(commentID);\n deleteComm.then(function (success) {\n scope.savingComment = false;\n /* if the comment save was successful, fade out the comment for a fun effect */ \n $(\"#comment\"+commentID).fadeOut(\"slow\");\n\n var comIdx = _.findIndex(scope.comments, { \"commentID\": commentID });\n if (comIdx > -1) {//remove the comment from the comments array\n scope.comments.splice(comIdx, 1);\n }\n\n }, function (failure) {\n scope.savingComment = false;\n scope.commentErrorMessage = 'Error - ' + failure.ErrorMessage;\n scope.commentErrorThrown = true;\n\n });\n \n };\n\n scope.toggleDeletePrompts = function (commentID) { \n _.each(scope.comments, function (c) {\n if (c.commentID === commentID) {\n c.open = !c.open;\n } else {\n c.open = false;\n }\n\n });\n };\n\n\n /* Function to save the comment and reload the comments on the page */\n /* currently, only used on the decision report page */\n scope.saveComment = function (newCommentText) { \n if (newCommentText !== undefined && newCommentText !== '') {\n scope.savingComment = true;\n var commentSave = InsightsService.saveComment(scope.decisionMapId, scope.newCommentText, scope.commentType);\n commentSave.then(function (success) {\n //Comment was saved, show the comment on the page by calling getComments\n scope.getComments();\n scope.savingComment = false;\n scope.newCommentText = '';\n }, function (error) {\n scope.savingComment = false;\n });\n }\n };\n\n /* show / hide the comments or history tabs */\n scope.toggleComments = function (showComments) {\n scope.commentsActive = showComments;\n\n if (!showComments && scope.history === undefined) {\n scope.history = [];\n scope.loadingHistory = true;\n var hist = InsightsService.getHistory(scope.decisionMapId, scope.currentWizardStep);\n hist.then(function (success) {\n scope.history = success;\n scope.loadingHistory = false;\n }, function (failure) {\n scope.loadingHistory = false;\n });\n\n }\n };\n\n /* load the comments on the directive load */\n scope.getComments();\n\n }\n };\n}]);","(function () {\n app.directive('assignmentActionButton', [\n function () {\n return {\n restrict: 'E',\n scope: {\n assignmentPromises: '=',\n productId: '='\n },\n templateUrl: 'App/templates/studentui/assignmentActionButton.html',\n controller: 'actionButtonController'\n };\n }\n ]);\n})();","(function () {\n app.directive('studentCareerPathList', [\n function () {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/studentui/studentCareerPathList.html',\n transclude: true,\n scope: {\n list: \"=\"\n } ,\n controller: 'studentTilesController',\n };\n }\n ]);\n})();","(function () {\n app.directive('studentSectionHeader', [\n function () {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/studentui/studentSectionHeader.html',\n scope: {\n title: '@'\n },\n controller: ['$scope', studentSectionHeaderController]\n };\n }\n ]);\n\n function studentSectionHeaderController($scope) {\n }\n})();","(function () {\n app.directive('studentSectionSubHeader', [\n function () {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/studentui/studentSectionSubHeader.html',\n scope: true,\n link: studentSectionSubHeaderLink\n };\n }\n ]);\n\n function studentSectionSubHeaderLink(scope, element, attrs) {\n if (attrs !== undefined) {\n scope.title = attrs.title;\n console.log(scope.title);\n }\n }\n})();","(function () {\n app.directive('studentTileContainer', [\n function () {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/studentui/studentTileContainer.html',\n transclude: true,\n scope: {\n filled: \"=\",\n noGutters: \"=\",\n noTopBorder: \"=\"\n },\n controller: ['$scope', studentSectionOutlineController]\n };\n }\n ]);\n\n function studentSectionOutlineController($scope) {\n $scope.fillCss = \"\";\n if ($scope.filled) {\n $scope.fillCss = \"required-section\";\n }\n if (typeof $scope.noTopBorder !== 'undefined' && $scope.noTopBorder) {\n $scope.fillCss = $scope.fillCss + \" no-top-border\";\n }\n\n $scope.outerCss = \"\";\n if (typeof $scope.noGutters !== 'undefined' && $scope.noGutters) {\n $scope.outerCss = \"no-gutters\";\n }\n }\n})();","(function () {\n app.directive('studentTiles', [\n function () {\n return {\n restrict: 'E',\n templateUrl: 'App/templates/studentui/studentTiles.html',\n scope: {\n assignments: \"=\",\n seeMoreColor: \"=\",\n courseSectionName: \"=\",\n displayTime: \"=\"\n },\n controller: 'studentTilesController',\n };\n }\n ]);\n})();"]}