{"version":3,"sources":["webpack:///./src/$_lazy_route_resource lazy namespace object","webpack:///./src/app/app.component.css","webpack:///./src/app/app.component.html","webpack:///./src/app/app.component.ts","webpack:///./src/app/app.module.ts","webpack:///./src/app/authguard.service.ts","webpack:///./src/app/classes.ts","webpack:///./src/app/course-tabs/course-selection/course-selection.component.css","webpack:///./src/app/course-tabs/course-selection/course-selection.component.html","webpack:///./src/app/course-tabs/course-selection/course-selection.component.ts","webpack:///./src/app/course-tabs/course-tabs.module.ts","webpack:///./src/app/course-tabs/course-tabs/course-tabs.component.css","webpack:///./src/app/course-tabs/course-tabs/course-tabs.component.html","webpack:///./src/app/course-tabs/course-tabs/course-tabs.component.ts","webpack:///./src/app/course.service.ts","webpack:///./src/app/firebase.auth.ts","webpack:///./src/app/home-page/breadcrumbs/breadcrumbs.component.css","webpack:///./src/app/home-page/breadcrumbs/breadcrumbs.component.html","webpack:///./src/app/home-page/breadcrumbs/breadcrumbs.component.ts","webpack:///./src/app/home-page/categories/categories.component.css","webpack:///./src/app/home-page/categories/categories.component.html","webpack:///./src/app/home-page/categories/categories.component.ts","webpack:///./src/app/home-page/error-page/error-page.component.css","webpack:///./src/app/home-page/error-page/error-page.component.html","webpack:///./src/app/home-page/error-page/error-page.component.ts","webpack:///./src/app/home-page/home-page.module.ts","webpack:///./src/app/home-page/options-view/options-view.component.css","webpack:///./src/app/home-page/options-view/options-view.component.html","webpack:///./src/app/home-page/options-view/options-view.component.ts","webpack:///./src/app/server.service.ts","webpack:///./src/app/settings.service.ts","webpack:///./src/app/toast.service.ts","webpack:///./src/app/tool-page/code-editor/code-editor.component.css","webpack:///./src/app/tool-page/code-editor/code-editor.component.html","webpack:///./src/app/tool-page/code-editor/code-editor.component.ts","webpack:///./src/app/tool-page/issue-nav/issue-nav.component.css","webpack:///./src/app/tool-page/issue-nav/issue-nav.component.html","webpack:///./src/app/tool-page/issue-nav/issue-nav.component.ts","webpack:///./src/app/tool-page/item-card/item-card.component.css","webpack:///./src/app/tool-page/item-card/item-card.component.html","webpack:///./src/app/tool-page/item-card/item-card.component.ts","webpack:///./src/app/tool-page/item-list/item-list.component.css","webpack:///./src/app/tool-page/item-list/item-list.component.html","webpack:///./src/app/tool-page/item-list/item-list.component.ts","webpack:///./src/app/tool-page/result-card/result-card.component.css","webpack:///./src/app/tool-page/result-card/result-card.component.html","webpack:///./src/app/tool-page/result-card/result-card.component.ts","webpack:///./src/app/tool-page/result-list/result-list.component.css","webpack:///./src/app/tool-page/result-list/result-list.component.html","webpack:///./src/app/tool-page/result-list/result-list.component.ts","webpack:///./src/app/tool-page/stat-badge/stat-badge.component.css","webpack:///./src/app/tool-page/stat-badge/stat-badge.component.html","webpack:///./src/app/tool-page/stat-badge/stat-badge.component.ts","webpack:///./src/app/tool-page/tool-page.module.ts","webpack:///./src/app/tool-page/tool-view/tool-view.component.css","webpack:///./src/app/tool-page/tool-view/tool-view.component.html","webpack:///./src/app/tool-page/tool-view/tool-view.component.ts","webpack:///./src/app/tool.service.ts","webpack:///./src/environments/environment.ts","webpack:///./src/main.ts"],"names":[],"mappings":"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","file":"main.js","sourcesContent":["function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncaught exception popping up in devtools\n\treturn Promise.resolve().then(function() {\n\t\tvar e = new Error('Cannot find module \"' + req + '\".');\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t});\n}\nwebpackEmptyAsyncContext.keys = function() { return []; };\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nmodule.exports = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = \"./src/$$_lazy_route_resource lazy recursive\";","module.exports = \"input:valid {\\r\\n border: solid 1px green;\\r\\n}\\r\\n\\r\\ninput:invalid {\\r\\n border: solid 1px red;\\r\\n}\\r\\n\\r\\n.large-text {\\r\\n margin: 100px 100px 20px;\\r\\n font-size: 30px;\\r\\n}\\r\\n\\r\\n.small-text {\\r\\n margin: 20px 100px;\\r\\n font-size: 18px;\\r\\n}\\r\\n\\r\\n\"","module.exports = \"\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n
Logging you in...
\\r\\n
You must log in with a BYUI Google account.
\\r\\n
If this is your first time, speak with an Admin to get your account enabled.
\\r\\n\"","import { Component } from '@angular/core';\r\nimport { Router, Event, NavigationEnd } from '@angular/router';\r\nimport { CourseService } from './course.service';\r\nimport { ServerService } from './server.service';\r\nimport { ToastService } from './toast.service';\r\nimport { ToolService } from './tool.service';\r\nimport { AuthGuardService } from './authguard.service'; // Being used in app.component.html (i.e. DO NOT DELETE)\r\nimport { SettingsService } from './settings.service';\r\n\r\n/**\r\n * This is the main component for the entire application.\r\n * It holds the primary pieces that allow the user to\r\n * navigate from the top down.\r\n */\r\n@Component({\r\n selector: 'app-root',\r\n templateUrl: './app.component.html',\r\n styleUrls: ['./app.component.css']\r\n})\r\nexport class AppComponent {\r\n\r\n /**\r\n * Constructor. This creates subscriptions to route changes to adjust values\r\n * as needed. For example, if the user navigates to the tool view (i.e. they ran\r\n * a tool), then many values in various services are removed or reset to prevent\r\n * conflicting values between services.\r\n *\r\n * This will also retrieve the list of tools from the Katana service when it is\r\n * created.\r\n *\r\n * @param router Used to navigate the user as needed.\r\n * @param courseService Provides information and management for selected courses.\r\n * @param serverService Provides functionality for making API calls to the Katana server.\r\n * @param toolService Provides information and management for available tools.\r\n * @param toastService Provides toast notification functionality.\r\n * @param authGuardService Provides Firebase authentication functionality.\r\n * Used in app.component.html (i.e. DO NOT DELETE).\r\n */\r\n constructor(private router: Router,\r\n private courseService: CourseService,\r\n private serverService: ServerService,\r\n public toolService: ToolService,\r\n private toastService: ToastService,\r\n private settingsService: SettingsService,\r\n public authGuardService: AuthGuardService) {\r\n\r\n // Set the theme\r\n if (localStorage['katanaTheme']) {\r\n settingsService.setTheme(localStorage['katanaTheme']);\r\n }\r\n\r\n router.events.subscribe((event: Event) => {\r\n if (event instanceof NavigationEnd &&\r\n !event.urlAfterRedirects.includes('/issues')) {\r\n\r\n // RESET all properties not used outside of tool view\r\n\r\n courseService.selectedItemCard = null;\r\n courseService.selectedCourse = null;\r\n toolService.toolViewOpen = false;\r\n toolService.selectedDiscoverOptions = false;\r\n courseService.courses.forEach(course => {\r\n course.itemCards = [];\r\n course.processing = false;\r\n });\r\n\r\n // Clear out the web sockets in case any are still running\r\n serverService.sockets.forEach(socket => socket.close());\r\n serverService.sockets = [];\r\n\r\n } else if (event instanceof NavigationEnd &&\r\n event.urlAfterRedirects.includes('/issues')) {\r\n\r\n if (!toolService.selectedTool) {\r\n router.navigate(['/']);\r\n return;\r\n }\r\n\r\n if (toolService.selectedDiscoverOptions === false) {\r\n router.navigate([`home/tools/${this.toolService.selectedTool.id}/options`]);\r\n toastService.toast('You\\'ll need to run the tool again to go back to the Issues page.');\r\n }\r\n\r\n // Select the first course and adjust the bar width\r\n if (courseService.courses.length > 0) {\r\n courseService.selectedCourse = courseService.courses[0];\r\n }\r\n\r\n // Set the toolView tracking prop to true, all others off\r\n toolService.toolViewOpen = true;\r\n courseService.courseSelectionOpen = false;\r\n\r\n }\r\n });\r\n\r\n // Set the saved courses they had last selected as the currently selected courses\r\n Object.keys(sessionStorage).forEach(key => {\r\n if (key.includes('katana_course')) {\r\n const course = JSON.parse(sessionStorage[key]);\r\n this.courseService.addCourse(course);\r\n }\r\n });\r\n }\r\n}\r\n","import { BrowserModule } from '@angular/platform-browser';\r\nimport { NgModule } from '@angular/core';\r\nimport { RouterModule, Routes } from '@angular/router';\r\nimport { HttpModule } from '@angular/http';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport 'materialize-css';\r\nimport 'rxjs';\r\n\r\n/* Firebase */\r\nimport { AngularFireModule } from 'angularfire2';\r\nimport { AngularFirestoreModule } from 'angularfire2/firestore';\r\nimport { AngularFireAuthModule } from 'angularfire2/auth';\r\nimport { environment } from './firebase.auth';\r\nimport { AuthGuardService } from './authguard.service';\r\n\r\n/* Modules */\r\nimport { CourseTabsModule } from './course-tabs/course-tabs.module';\r\nimport { HomePageModule } from './home-page/home-page.module';\r\nimport { ToolPageModule } from './tool-page/tool-page.module';\r\n\r\n/* Katana Components */\r\nimport { AppComponent } from './app.component';\r\nimport { CategoriesComponent } from './home-page/categories/categories.component';\r\nimport { ToolViewComponent } from './tool-page/tool-view/tool-view.component';\r\nimport { OptionsViewComponent } from './home-page/options-view/options-view.component';\r\nimport { ErrorPageComponent } from './home-page/error-page/error-page.component';\r\n\r\nexport const appRoutes: Routes = [\r\n {\r\n path: 'categories',\r\n redirectTo: 'home',\r\n pathMatch: 'full',\r\n },\r\n {\r\n path: '',\r\n redirectTo: 'home',\r\n pathMatch: 'full',\r\n },\r\n {\r\n path: 'home',\r\n component: CategoriesComponent,\r\n canActivate: [AuthGuardService]\r\n },\r\n {\r\n path: 'home/error',\r\n component: ErrorPageComponent\r\n },\r\n {\r\n path: 'home/tools/:tool_id/options',\r\n component: OptionsViewComponent,\r\n canActivate: [AuthGuardService]\r\n },\r\n {\r\n path: 'home/tools/:tool_id/issues',\r\n component: ToolViewComponent,\r\n canActivate: [AuthGuardService]\r\n }\r\n];\r\n\r\n@NgModule({\r\n declarations: [\r\n AppComponent\r\n ],\r\n imports: [\r\n RouterModule.forRoot(\r\n appRoutes\r\n ),\r\n BrowserModule,\r\n CourseTabsModule,\r\n HomePageModule,\r\n ToolPageModule,\r\n HttpModule,\r\n HttpClientModule,\r\n AngularFireModule.initializeApp(environment.firebase),\r\n AngularFirestoreModule,\r\n AngularFireAuthModule\r\n ],\r\n providers: [\r\n AuthGuardService\r\n ],\r\n bootstrap: [AppComponent]\r\n})\r\nexport class AppModule { }\r\n","import { Injectable, Output, EventEmitter } from '@angular/core';\r\nimport { Router, CanActivate } from '@angular/router';\r\nimport { AngularFireAuth } from 'angularfire2/auth';\r\nimport { User } from 'firebase';\r\nimport { auth } from 'firebase';\r\nimport { Observable } from 'rxjs';\r\n\r\n/**\r\n* Verifies that the user is correctly logged in with a valid\r\n* Google BYUI account. Redirects the user to the Google\r\n* login page as needed. Provides validation for the user\r\n* to access various routes.\r\n*/\r\n@Injectable()\r\nexport class AuthGuardService implements CanActivate {\r\n\r\n /** *****************************\r\n * The currently logged in user\r\n *******************************/\r\n private user: Observable;\r\n\r\n /** *****************************\r\n * The currently logged in user\r\n *******************************/\r\n public userDetails: User = null;\r\n\r\n /**\r\n * Event emitted when auth status changes\r\n */\r\n @Output() authState = new EventEmitter();\r\n\r\n /** ***********************************************************************************\r\n * @param afAuth angularfire2 - https://github.com/angular/angularfire2\r\n * @param router Used to verify location and navigate the user to new pages as needed.\r\n */\r\n constructor(public afAuth: AngularFireAuth,\r\n public router: Router) {\r\n this.user = afAuth.authState;\r\n this.authState.emit(false);\r\n\r\n auth().getRedirectResult()\r\n .catch(console.error);\r\n\r\n this.user.subscribe(user => {\r\n if (user) {\r\n auth().updateCurrentUser(user);\r\n this.userDetails = user;\r\n } else if (!user) {\r\n if (this.userDetails) {\r\n this.userDetails = null;\r\n }\r\n this.doGoogleLogin();\r\n }\r\n this.authState.emit(this.canActivate());\r\n this.router.navigate(['/']);\r\n });\r\n }\r\n\r\n /** *********************************************************************************\r\n * Used to prevent the user from navigating through Katana if they\r\n * are not logged in with a valid google (byui) account.\r\n ***********************************************************************************/\r\n canActivate(): boolean {\r\n return (this.userDetails !== null && this.userDetails.email.includes('@byui.edu'));\r\n }\r\n\r\n /** *********************************************************************************\r\n * Redirects the user to the google login page, where they sign in,\r\n * and then are returned to Katana to have their credentials processed.\r\n ***********************************************************************************/\r\n doGoogleLogin() {\r\n return new Promise((resolve, reject) => {\r\n const provider = new auth.GoogleAuthProvider();\r\n provider.addScope('profile');\r\n provider.addScope('email');\r\n auth().setPersistence(auth.Auth.Persistence.SESSION)\r\n .then(() => {\r\n this.afAuth.auth\r\n .signInWithRedirect(provider)\r\n .catch(function (error) {\r\n console.error(error);\r\n });\r\n });\r\n });\r\n }\r\n\r\n /** *********************************************************************************\r\n * Signs the user out of Katana and redirects them to the Google login\r\n * page.\r\n ***********************************************************************************/\r\n signOut() {\r\n return auth().signOut()\r\n .then(this.doGoogleLogin)\r\n .catch(console.error);\r\n }\r\n\r\n /** *********************************************************************************\r\n * Retrieves the user's idToken for Firebase, so requests can be validated on the\r\n * server.\r\n ***********************************************************************************/\r\n retrieveToken() {\r\n return auth().currentUser.getIdToken(true)\r\n .catch(console.error);\r\n }\r\n}\r\n","import { FormControl, Validators, FormGroup } from '@angular/forms';\r\n\r\n/**\r\n * Helper for building a reactive form. Used to create the\r\n * {@link FormGroup} and {@link FormControl}s needed for\r\n * both the {@link OptionsViewComponent} and the options on\r\n * each {@link IssueContainerComponent}.\r\n */\r\nexport class OptionModel {\r\n\r\n /**\r\n * Options to build the form from.\r\n */\r\n options = [];\r\n\r\n /**\r\n * Constructor\r\n * @param options Options to build the form from.\r\n */\r\n constructor(options) {\r\n this.options = options;\r\n }\r\n\r\n /**\r\n * Takes the provided options and puts them into a new {@link FormGroup}.\r\n */\r\n toGroup() {\r\n const group: any = {};\r\n this.options.forEach((option) => {\r\n if (option.required) {\r\n group[option.key] = new FormControl('', Validators.required);\r\n } else {\r\n group[option.key] = new FormControl('');\r\n }\r\n });\r\n return new FormGroup(group);\r\n }\r\n}\r\n","module.exports = \".courseSearch {\\r\\n position: absolute;\\r\\n height: calc(100vh - var(--header-height));\\r\\n width: 100vw;\\r\\n z-index: 4;\\r\\n background-color: rgba(0, 0, 0, 0.65);\\r\\n top: calc(var(--breadcrumbs-height));\\r\\n min-width: 700px;\\r\\n left: 100vw;\\r\\n opacity: 0;\\r\\n}\\r\\n\\r\\n.visible {\\r\\n left: 0;\\r\\n opacity: 1;\\r\\n}\\r\\n\\r\\n.courseSearch__header {\\r\\n font-size: 60px;\\r\\n /* padding-top: 5px; */\\r\\n width: var(--courseSelect-width);\\r\\n min-width: 700px;\\r\\n color: white;\\r\\n margin: auto;\\r\\n font-weight: 400;\\r\\n text-transform: none;\\r\\n}\\r\\n\\r\\n.courseSearch__courseSelection {\\r\\n justify-content: space-between;\\r\\n display: flex;\\r\\n flex-wrap: wrap;\\r\\n padding: 0 50px;\\r\\n width: var(--courseSelect-width);\\r\\n min-width: 700px;\\r\\n margin: auto;\\r\\n box-sizing: content-box;\\r\\n}\\r\\n\\r\\n/**************************************\\r\\n* Course Search Option Dropdowns\\r\\n***************************************/\\r\\n\\r\\nselect {\\r\\n background-color: white;\\r\\n border: 1px solid var(--primary-3);\\r\\n color: black;\\r\\n cursor: pointer;\\r\\n display: block;\\r\\n /* This height matches the height of the input */\\r\\n height: 47px;\\r\\n /* The selected option will be size 20px */\\r\\n font-size: 20px;\\r\\n}\\r\\n\\r\\nlabel {\\r\\n font-size: 20px;\\r\\n color: white !important;\\r\\n width: calc((100% / 4) - 20px);\\r\\n margin-top: 15px;\\r\\n}\\r\\n\\r\\nselect>option[disabled] {\\r\\n display: none;\\r\\n}\\r\\n\\r\\noption {\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.label-row {\\r\\n width: 100%;\\r\\n justify-content: space-between;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.addAll {\\r\\n margin: 0 15px 0 auto;\\r\\n}\\r\\n\\r\\n/***************************************\\r\\n* Course Search Search Bar and Headers\\r\\n****************************************/\\r\\n\\r\\n/* .courseSearch__options input { */\\r\\n\\r\\n.courseSearch__courseSelection input {\\r\\n background-color: white;\\r\\n border: 1px solid var(--primary-3);\\r\\n font-size: 20px;\\r\\n margin: 0;\\r\\n padding-left: 10px;\\r\\n /* Subtract the padding + border from the width */\\r\\n width: calc(100% - 11px);\\r\\n}\\r\\n\\r\\n/***************************************\\r\\n* Course Search Results\\r\\n****************************************/\\r\\n\\r\\n.courseSearch__courseSelection>table {\\r\\n background-color: white;\\r\\n border: 1px solid var(--primary-3);\\r\\n display: flex;\\r\\n flex-flow: column nowrap;\\r\\n min-width: 600px;\\r\\n max-width: 1340px;\\r\\n}\\r\\n\\r\\n.courseSearch__courseSelection>table>thead {\\r\\n background-color: white;\\r\\n border-bottom: 1px solid var(--primary-3);\\r\\n}\\r\\n\\r\\n.courseSearch__courseSelection>table>thead .column-selected {\\r\\n background-color: #eeeeee;\\r\\n}\\r\\n\\r\\n.courseSearch__courseSelection>table>tbody {\\r\\n overflow-y: scroll;\\r\\n position: relative;\\r\\n /* row height * number of results to display */\\r\\n max-height: calc(60px * 7);\\r\\n}\\r\\n\\r\\ntbody>tr,\\r\\ntr>th {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\ntr>th:hover {\\r\\n background-color: #ebebeb;\\r\\n}\\r\\n\\r\\ntr>th,\\r\\ntr>td {\\r\\n padding-left: 10px;\\r\\n box-sizing: content-box;\\r\\n}\\r\\n\\r\\nthead th:nth-of-type(1),\\r\\ntbody td:nth-of-type(1) {\\r\\n width: 50px;\\r\\n}\\r\\n\\r\\nthead th:nth-of-type(2),\\r\\ntbody td:nth-of-type(2) {\\r\\n width: 400px;\\r\\n}\\r\\n\\r\\nthead th:nth-of-type(3),\\r\\ntbody td:nth-of-type(3) {\\r\\n width: 200px;\\r\\n}\\r\\n\\r\\nthead th:nth-of-type(4),\\r\\ntbody td:nth-of-type(4) {\\r\\n width: 275px;\\r\\n}\\r\\n\\r\\nthead th:nth-of-type(5),\\r\\ntbody td:nth-of-type(5) {\\r\\n width: 175px;\\r\\n}\\r\\n\\r\\nthead th:nth-of-type(6),\\r\\ntbody td:nth-of-type(6) {\\r\\n width: 175px;\\r\\n}\\r\\n\\r\\nthead th:nth-of-type(7),\\r\\ntbody td:nth-of-type(7) {\\r\\n width: 175px;\\r\\n}\\r\\n\\r\\nthead th:nth-of-type(8),\\r\\ntbody td:nth-of-type(8) {\\r\\n width: 175px;\\r\\n}\\r\\n\\r\\nthead th:nth-of-type(9),\\r\\ntbody td:nth-of-type(9) {\\r\\n width: 150px;\\r\\n text-align: center;\\r\\n min-width: 91px;\\r\\n}\\r\\n\\r\\n/***************************************\\r\\n* The Loader\\r\\n****************************************/\\r\\n\\r\\n.loader {\\r\\n max-width: 100%;\\r\\n max-height: 100%;\\r\\n margin: auto;\\r\\n}\\r\\n\\r\\n\\r\\n\"","module.exports = \"
\\r\\n
\\r\\n

\\r\\n Course Selection\\r\\n

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n Searching ...\\r\\n
\\r\\n
\\r\\n \\r\\n
+/-NameCodeInstructorAccountTermBlueprintIDOpen in Canvas
\\r\\n {{isAdded(course) ? 'remove_circle' : 'add_circle'}}\\r\\n {{course.course_name}}{{course.course_code}}{{course.instructor}}{{course.account}}{{course.term}}{{course.blueprint}}{{course.id}}\\r\\n \\r\\n open_in_new\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\"","import { Component, ViewChild, ElementRef } from '@angular/core';\r\nimport { ServerService } from '../../server.service';\r\nimport { CourseService } from '../../course.service';\r\nimport { Course } from '../../interfaces';\r\n\r\n/**\r\n * Provides the user management for the selected courses, including a course search.\r\n * overlay to add/remove courses.\r\n */\r\n@Component({\r\n selector: 'app-course-selection',\r\n templateUrl: './course-selection.component.html',\r\n styleUrls: ['./course-selection.component.css']\r\n})\r\nexport class CourseSelectionComponent {\r\n /** Element reference to the sub-account filter input. */\r\n @ViewChild('subAccount') private subAccount: ElementRef;\r\n /** Element reference to the term filter input. */\r\n @ViewChild('term') private term: ElementRef;\r\n /** Element reference to the blueprint filter input. */\r\n @ViewChild('blueprint') private blueprint: ElementRef;\r\n /** Element reference to the search-by filter input. */\r\n @ViewChild('searchBy') private searchBy: ElementRef;\r\n /** Element reference to the search text input. */\r\n @ViewChild('searchText') private searchText: ElementRef;\r\n\r\n /** Whether or not a search is currently processing */\r\n searching = false;\r\n\r\n /** Holds what the last search was sorted by. */\r\n lastSortedBy: string;\r\n\r\n /** Results of a search. */\r\n courseResults: Course[] = [];\r\n\r\n /**\r\n * Constructor\r\n * @param {ServerService} serverService Provides functionality for making API calls to the Katana server.\r\n * @param {CourseService} courseService Provides information and management for selected courses.\r\n */\r\n constructor(private serverService: ServerService,\r\n public courseService: CourseService) { }\r\n\r\n /**\r\n * This retrieves all courses that match the given parameters from Canvas\r\n * and returns them as an array of course objects that have been modified\r\n * by us. The returned results will populate the 'courseResults' array and\r\n * will display in the results table in the course-selection html file.\r\n */\r\n async getCourses() {\r\n // Canvas makes you have an input of at least three characters to use the search_term in the API\r\n if (this.searchText.nativeElement.value.length > 2) {\r\n\r\n // Replace any whitespaces with '%20' for the query parameter and make everything lowercase\r\n const searchPhrase = this.searchText.nativeElement.value.replace(/\\s/g, '%20');\r\n // Set the loading circle to display before retrieving the courses\r\n this.searching = true;\r\n\r\n // Send the search parameters to the katana service to build the correct URI\r\n this.serverService.getCourses({\r\n subAccount: this.subAccount.nativeElement.value,\r\n term: this.term.nativeElement.value,\r\n blueprint: this.blueprint.nativeElement.value,\r\n searchPhrase: searchPhrase,\r\n searchBy: this.searchBy.nativeElement.value\r\n })\r\n /* After getting the courses from Canvas, check to make sure what you\r\n got back matches what is currently in the search text input box */\r\n .then((courses: Course[]) => {\r\n if (searchPhrase === this.searchText.nativeElement.value.replace(/\\s/g, '%20')) {\r\n this.searching = false;\r\n this.courseResults = courses;\r\n }\r\n })\r\n .catch(console.error);\r\n } else {\r\n /* If the string in the search box is less than three characters\r\n then stop searching and set the returned course results to an empty array\r\n instead of leaving the last results in the table */\r\n this.searching = false;\r\n this.courseResults = [];\r\n }\r\n }\r\n\r\n /**\r\n * Sorts the courseResults array according to the course attribute defined by 'param'.\r\n * @param {string} param The object key to be sorted.\r\n * @returns {void}\r\n */\r\n sortBy(param: any) {\r\n // If they click on the same category more than once, it will reverse the order of the results\r\n if (this.lastSortedBy === param) {\r\n this.courseResults = this.courseResults.reverse();\r\n this.lastSortedBy = param;\r\n return;\r\n }\r\n\r\n this.lastSortedBy = param;\r\n // Sort numerically\r\n if (param === 'id' || param === 'account' || param === 'blueprint') {\r\n this.courseResults.sort((a, b) => {\r\n return a[param] - b[param];\r\n });\r\n } else {\r\n // Sort alphabetically\r\n this.courseResults.sort((a, b) => {\r\n const name1 = a[param].toLowerCase();\r\n const name2 = b[param].toLowerCase();\r\n if (name1 < name2) {\r\n return -1;\r\n }\r\n if (name1 > name2) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Checks to see if the selected course from courseResults\r\n * is already in the courses array in courseService.\r\n * @param {object} course The course that is being checked.\r\n * @returns {boolean} Whether the course is already added.\r\n */\r\n isAdded(course: any) {\r\n return this.courseService.courses.find(c => c.id === course.id) !== undefined;\r\n }\r\n\r\n /** Deselects all selected courses. */\r\n removeAll() {\r\n this.courseService.courses.forEach(c => this.courseService.removeCourse(c));\r\n }\r\n\r\n /** Selects all courses found in the search */\r\n addAll() {\r\n this.courseResults.forEach(c => {\r\n if (!this.isAdded(c)) {\r\n this.courseService.addCourse(c);\r\n }\r\n });\r\n }\r\n\r\n /** Closes the courseSelect page when the user clicks on the margins of the page */\r\n closeCourseSelect() {\r\n this.courseService.courseSelectionOpen = false;\r\n }\r\n\r\n /** Stops the courseSelect page from closing when the user interacts with the page (area that is not in the margins)\r\n * @param {object} event The JS onClick event\r\n */\r\n stopEvent(event) {\r\n event.stopPropagation();\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MaterializeModule } from 'angular2-materialize';\r\nimport { RouterModule } from '@angular/router';\r\n\r\nimport { CourseSelectionComponent } from './course-selection/course-selection.component';\r\nimport { CourseTabsComponent } from './course-tabs/course-tabs.component';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n MaterializeModule\r\n ],\r\n exports: [\r\n CourseTabsComponent\r\n ],\r\n declarations: [\r\n CourseSelectionComponent,\r\n CourseTabsComponent\r\n ]\r\n})\r\nexport class CourseTabsModule { }\r\n","module.exports = \"/* Overrides Materialize tab CSS */\\r\\n\\r\\n.tabs-container ::-webkit-scrollbar {\\r\\n height: 5px;\\r\\n}\\r\\n\\r\\n.tabs-container ::-webkit-scrollbar-thumb {\\r\\n background: var(--primary-3);\\r\\n border-top: 1px solid var(--primary-4);\\r\\n border-left: none;\\r\\n }\\r\\n\\r\\n.tabs-container {\\r\\n position: fixed;\\r\\n top: var(--breadcrumbs-height);\\r\\n width: 100vw;\\r\\n z-index: 2;\\r\\n}\\r\\n\\r\\n.tabs {\\r\\n height: var(--breadcrumbs-height) !important;\\r\\n}\\r\\n\\r\\n.tabs .tab {\\r\\n display: inline-flex;\\r\\n height: var(--breadcrumbs-height);\\r\\n line-height: var(--breadcrumbs-height);\\r\\n transition: all .1s ease-in-out;\\r\\n}\\r\\n\\r\\n.tabs .tab div {\\r\\n padding: 0 24px;\\r\\n}\\r\\n\\r\\n.tabs .tab:not(.selectable):hover {\\r\\n cursor: default;\\r\\n}\\r\\n\\r\\n.tabs .tab.selectable:hover {\\r\\n background-color: var(--navy-light) !important;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.tabs .indicator {\\r\\n display: none !important;\\r\\n}\\r\\n\\r\\n.tabs .selected {\\r\\n background-color: var(--navy-light) !important;\\r\\n}\\r\\n\\r\\n.issue-badge {\\r\\n padding: 2px 4px;\\r\\n border-radius: 2px;\\r\\n margin-left: 5px;\\r\\n text-align: center;\\r\\n font-size: 12px;\\r\\n color: white;\\r\\n background-color: var(--navy-dark);\\r\\n}\\r\\n\\r\\n/* Close/open in Canvas buttons on the tabs in edit mode */\\r\\n\\r\\n.course-action-container {\\r\\n margin-left: -40px;\\r\\n}\\r\\n\\r\\n.course-action {\\r\\n color: var(--cobalt);\\r\\n cursor: pointer;\\r\\n line-height: var(--breadcrumbs-height) !important;\\r\\n padding: 0 2px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.addButton {\\r\\n background-color: var(--navy);\\r\\n cursor: pointer;\\r\\n height: calc(var(--breadcrumbs-height) + 1px);\\r\\n}\\r\\n\\r\\n/* Action buttons on the course tabs bar */\\r\\n\\r\\n.action-button-container {\\r\\n display: flex;\\r\\n position: -webkit-sticky;\\r\\n position: sticky;\\r\\n right: 0;\\r\\n z-index: 5;\\r\\n margin-left: auto;\\r\\n}\\r\\n\\r\\n.addButton>i {\\r\\n cursor: pointer;\\r\\n line-height: var(--breadcrumbs-height);\\r\\n padding: 0 20px;\\r\\n transition: all .1s ease-in-out;\\r\\n}\\r\\n\\r\\n.addButton>i:hover {\\r\\n background-color: var(--navy-light);\\r\\n}\\r\\n\\r\\n/* Adjusts the size for the feedback modal */\\r\\n\\r\\n.modal-content iframe {\\r\\n width: 100%;\\r\\n height: 70vh;\\r\\n}\\r\\n\\r\\n/* Fixes some CSS issues with the settings menu */\\r\\n\\r\\nul.dropdown-content {\\r\\n background-color: white !important;\\r\\n width: auto !important;\\r\\n position: fixed !important;\\r\\n top: auto !important;\\r\\n margin-top: 20px;\\r\\n left: auto !important;\\r\\n right: 20px !important;\\r\\n}\\r\\n\\r\\nul.dropdown-content:hover {\\r\\n background-color: white !important;\\r\\n}\\r\\n\\r\\n.dropdown-content a {\\r\\n color: var(--cobalt);\\r\\n padding: 14px 16px;\\r\\n}\\r\\n\\r\\n.dropdown-content a:hover {\\r\\n background-color: var(--ashen);\\r\\n}\\r\\n\\r\\n/* Animation used by the tabs when processing courses */\\r\\n\\r\\n.pulseypulse {\\r\\n -webkit-animation: pulseypulse 2s infinite ease-in-out;\\r\\n animation: pulseypulse 2s infinite ease-in-out;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes pulseypulse {\\r\\n\\t0% {\\r\\n color: var(--ashen);\\r\\n }\\r\\n 75% {\\r\\n color: var(--cobalt);\\r\\n }\\r\\n 100% {\\r\\n color: var(--ashen);\\r\\n\\t}\\r\\n}\\r\\n\\r\\n@keyframes pulseypulse {\\r\\n\\t0% {\\r\\n color: var(--ashen);\\r\\n }\\r\\n 75% {\\r\\n color: var(--cobalt);\\r\\n }\\r\\n 100% {\\r\\n color: var(--ashen);\\r\\n\\t}\\r\\n}\"","module.exports = \"
\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\"","import { Component, EventEmitter } from '@angular/core';\r\nimport { CourseService } from '../../course.service';\r\nimport { ToolService } from '../../tool.service';\r\nimport { MaterializeAction } from 'angular2-materialize';\r\nimport { SettingsService } from '../../settings.service';\r\nimport { ServerService } from '../../server.service';\r\n\r\n/** The Course Tabs bar, along with the action buttons (settings, feedback, etc.). */\r\n@Component({\r\n selector: 'app-course-tabs',\r\n templateUrl: './course-tabs.component.html',\r\n styleUrls: ['./course-tabs.component.css']\r\n})\r\nexport class CourseTabsComponent {\r\n\r\n /**\r\n * Used to open and close the modal for feedback.\r\n */\r\n modalActions = new EventEmitter();\r\n\r\n /**\r\n * Constructor\r\n * @param courseService Provides information and functionality for courses selected by the user.\r\n * @param toolService Provides information and functionality for tools available on the server.\r\n */\r\n constructor(public courseService: CourseService,\r\n public toolService: ToolService,\r\n public settingsService: SettingsService) { }\r\n\r\n /**\r\n * Toggles the course overlay open and closed.\r\n */\r\n courseOverlay() {\r\n this.courseService.courseSelectionOpen = !this.courseService.courseSelectionOpen;\r\n }\r\n\r\n /**\r\n * Opens the feedback modal.\r\n */\r\n openModal() {\r\n this.modalActions.emit({ action: 'modal', params: ['open'] });\r\n }\r\n\r\n /**\r\n * Closes the feedback modal.\r\n */\r\n closeModal() {\r\n this.modalActions.emit({ action: 'modal', params: ['close'] });\r\n }\r\n\r\n /**\r\n * Opens the course in Canvas in a new tab.\r\n * @param {number} courseId The Canvas ID of the course\r\n */\r\n openCourse(courseId: number): void {\r\n window.open('https://byui.instructure.com/courses/' + courseId, '_blank');\r\n }\r\n\r\n /**\r\n * Opens the course in Canvas in a new tab.\r\n * @param {Course} course - The course to count issues in\r\n * @param {string} status - Issue status to match\r\n * @returns {number} The total number of issues matching the provided status.\r\n */\r\n getIssueCount(course, status): number | string {\r\n if (!course.itemCards) { return 0; }\r\n if (course.error) { return 'E'; }\r\n return course.itemCards.reduce((acc, itemCard) => {\r\n const issues = itemCard.issues.filter(issue => {\r\n if (!status) { return true; }\r\n return issue.status === status;\r\n });\r\n return acc + issues.length;\r\n }, 0);\r\n }\r\n\r\n}\r\n","import { Injectable, EventEmitter } from '@angular/core';\r\nimport { Course, ItemCard } from './interfaces';\r\n\r\n/**\r\n * Provides information and management for a variety of things, but mainly the\r\n * courses the user selects via the {@link CourseSelectionComponent}. Also provides\r\n * functionality for styling and counts based on {@link Course}s' {@link ItemCard}s.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CourseService {\r\n\r\n /**\r\n * Holds all of the currently selected {@link Course}s.\r\n */\r\n coursesObj: object = {};\r\n\r\n /**\r\n * The currently selected {@link Course}.\r\n */\r\n private _selectedCourse: Course;\r\n\r\n /**\r\n * The currently selected {@link ItemCard}.\r\n */\r\n selectedItemCard: ItemCard;\r\n\r\n /**\r\n * Whether or not the {@link CourseSelectionComponent} is open.\r\n */\r\n courseSelectionOpen = false;\r\n\r\n /**\r\n * Emits when a the selected course has changed. Used by lazy-loading components.\r\n */\r\n courseChange = new EventEmitter();\r\n\r\n get selectedCourse() {\r\n return this._selectedCourse;\r\n }\r\n\r\n set selectedCourse(course: Course) {\r\n if (course === this._selectedCourse || !course) { return; }\r\n // Set the selected course to a reference, so we don't have issues when updating the course objects\r\n this._selectedCourse = course;\r\n this.courseChange.emit(this._selectedCourse);\r\n this.selectedItemCard = this._selectedCourse.itemCards ? this._selectedCourse.itemCards.find(itemCard => itemCard.course_id === course.id) : null;\r\n }\r\n\r\n get courses() {\r\n return Object.keys(this.coursesObj).reduce((acc, key) => [...acc, this.coursesObj[key]], []);\r\n }\r\n\r\n /**\r\n * Constructor\r\n */\r\n constructor() { }\r\n\r\n /**\r\n * Adds a course to the list of currently selected courses. This\r\n * will also add and remove them from the user's local storage.\r\n * @param {number} courseId - The ID of the course\r\n * @param {string} courseName - The full name of the course\r\n * @param {string} courseCode - The course code\r\n */\r\n addCourse(course: Course): void {\r\n if (!this.coursesObj[`c${course.id}`]) {\r\n if (!sessionStorage['katana_course' + course.id]) {\r\n sessionStorage['katana_course' + course.id] = JSON.stringify(course);\r\n }\r\n if (!course.itemCards) {\r\n course.itemCards = [];\r\n }\r\n this.coursesObj[`c${course.id}`] = course;\r\n } else {\r\n this.removeCourse(course);\r\n }\r\n }\r\n\r\n /**\r\n * Removes a course from the list of currently selected courses.\r\n * @param {number} courseId - The ID of the course\r\n */\r\n removeCourse(course: Course): void {\r\n if (sessionStorage['katana_course' + course.id]) {\r\n delete sessionStorage['katana_course' + course.id];\r\n }\r\n delete this.coursesObj[`c${course.id}`];\r\n }\r\n\r\n /**\r\n * Gets the count of issues under a given status for a single course.\r\n * Status is optional; returns total count if left blank.\r\n * @param {string} status - The status desired\r\n * @returns {number} - The number of issues with the specified status\r\n */\r\n getCourseIssueCount(status): number {\r\n if (this.selectedCourse) {\r\n return this.selectedCourse.itemCards.reduce((acc, itemCard) => {\r\n if (!status) {\r\n return acc + itemCard.issues.length;\r\n }\r\n const issues = itemCard.issues.filter(issue => issue.status === status);\r\n return acc + issues.length;\r\n }, 0);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the count of issues under a given status for all courses.\r\n * Status is optional; returns total count if left blank.\r\n * @param {string} status - The status desired\r\n * @returns {number} - The number of issues with the specified status\r\n */\r\n getTotalIssueCount(status): number {\r\n return this.courses.reduce(acc => {\r\n return acc + this.getCourseIssueCount(status);\r\n }, 0);\r\n }\r\n\r\n /**\r\n * This is used to determine the icon shown at the left of an issue on\r\n * a card. It is determined by the status of the icon. (i.e. \"fixed\")\r\n * @param {string} [status] The status of the issue.\r\n * @returns {string} The text used to display the icon.\r\n */\r\n getStatusIcon(status): string {\r\n const statusIcons = {\r\n 'fixed': 'check_circle',\r\n 'approved': 'check_circle_outline',\r\n 'skipped': 'call_missed_outgoing',\r\n 'untouched': 'panorama_fish_eye',\r\n 'failed': 'warning'\r\n };\r\n return statusIcons[status];\r\n }\r\n\r\n /**\r\n * This is used to determine the icon color for the status icon of an\r\n * individual issue, as shown on an ItemCard card.\r\n * @param {string} [status] The status of the issue.\r\n * @returns {string} The classes to apply to the element.\r\n */\r\n getTextColorClasses(status): string {\r\n const statusColors = {\r\n 'fixed': 'blue-text text-accent-3',\r\n 'approved': 'green-text text-accent-4',\r\n 'skipped': 'blue-grey-text text-darken-2',\r\n 'untouched': 'blue-grey-text text-lighten-4',\r\n 'failed': 'red-text'\r\n };\r\n return statusColors[status];\r\n }\r\n\r\n /**\r\n * This is used to determine the background color for an issue card.\r\n * @param {string} [status] The status of the issue.\r\n * @returns {string} The classes to apply to the element.\r\n */\r\n getBackgroundColorClasses(status): string {\r\n const statusColors = {\r\n 'fixed': 'blue lighten-4',\r\n 'approved': 'mint',\r\n 'skipped': 'blue-grey lighten-4',\r\n 'untouched': 'white',\r\n 'failed': 'red lighten-5'\r\n };\r\n return statusColors[status];\r\n }\r\n}\r\n","/**\r\n * Used to connect the client to firebase for authentication.\r\n */\r\nexport const environment = {\r\n firebase: {\r\n apiKey: 'AIzaSyBN6dkjkGHs5W2YXTkLUu8mCurFXkip3Dc',\r\n authDomain: 'katana-24a36.firebaseapp.com',\r\n databaseURL: 'https://katana-24a36.firebaseio.com',\r\n projectId: 'katana-24a36',\r\n storageBucket: 'katana-24a36.appspot.com'\r\n }\r\n};\r\n","module.exports = \".breadcrumbs {\\r\\n height: var(--breadcrumbs-height);\\r\\n left: 0;\\r\\n line-height: var(--breadcrumbs-height);\\r\\n padding: 0 20px;\\r\\n position: fixed;\\r\\n top: 0;\\r\\n width: 100vw;\\r\\n background-color: var(--ashen);\\r\\n z-index: 5;\\r\\n}\\r\\n\\r\\n.breadcrumb-links {\\r\\n height: var(--breadcrumbs-height);\\r\\n}\\r\\n\\r\\n.breadcrumb {\\r\\n color: var(--charcoal);\\r\\n}\\r\\n\\r\\n.breadcrumb:hover {\\r\\n text-decoration: underline;\\r\\n}\\r\\n\\r\\n.breadcrumb::before {\\r\\n color: var(--primary-3);\\r\\n}\\r\\n\\r\\n/* frosted blur effect for course selection overlay */\\r\\n\\r\\n/* .frosted {\\r\\n filter: blur(5px);\\r\\n} */\\r\\n\\r\\n.no-padding {\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.feedback-button {\\r\\n cursor: pointer;\\r\\n margin-right: 15px;\\r\\n display: flex;\\r\\n align-content: center;\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.feedback-button::before {\\r\\n content: \\\"Feedback\\\";\\r\\n font-size: 14px;\\r\\n margin-right: 5px;\\r\\n}\\r\\n\\r\\n.user-info {\\r\\n border-radius: 50px;\\r\\n margin: 10px;\\r\\n height: 32px;\\r\\n line-height: 32px;\\r\\n display: flex;\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.user-info div {\\r\\n margin: 0 10px;\\r\\n}\\r\\n\\r\\n.user-info img {\\r\\n height: 36px;\\r\\n width: 36px;\\r\\n border-radius: 20px;\\r\\n margin: -4px -15px 0 0;\\r\\n cursor: pointer;\\r\\n}\"","module.exports = \"
\\r\\n
\\r\\n
\\r\\n\\r\\n Home\\r\\n {{toolService.selectedTool.title}}\\r\\n\\r\\n
\\r\\n
\\r\\n {{authGuardService.userDetails.displayName}}\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n\"","import { Component, EventEmitter } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { ToolService } from '../../tool.service';\r\nimport { AuthGuardService } from '../../authguard.service'; // Being used in breadcrumbs.component.html (i.e. DO NOT DELETE)\r\n\r\n/**\r\n * Builds the breadcrumbs for navigation, as well as the feedback and\r\n * user details in the navigation bar.\r\n */\r\n@Component({\r\n selector: 'app-breadcrumbs',\r\n templateUrl: './breadcrumbs.component.html',\r\n styleUrls: ['./breadcrumbs.component.css']\r\n})\r\nexport class BreadcrumbsComponent {\r\n\r\n /**\r\n * Constructor\r\n * @param router Used to verify current location and navigate user to new page.\r\n * @param toolService Used to verify currently selected tool.\r\n * @param authGuardService Enables Sign Out button. Being used in\r\n * breadcrumbs.component.html (i.e. DO NOT DELETE)\r\n */\r\n constructor(public router: Router,\r\n public toolService: ToolService,\r\n public authGuardService: AuthGuardService) { }\r\n\r\n /**\r\n * Builds a URL, then navigates the router to it.\r\n * @param pathPieces - Array of each piece of the path to navigate to.\r\n * @returns boolean - Returns false to prevent full page reload.\r\n */\r\n buildRouterLink(pathPieces) {\r\n this.router.navigate(pathPieces);\r\n return false;\r\n }\r\n}\r\n","module.exports = \".categories {\\r\\n margin: auto;\\r\\n padding: 25px 50px;\\r\\n max-height: calc(100vh - var(--header-height));\\r\\n margin-top: var(--header-height);\\r\\n overflow-y: auto;\\r\\n}\\r\\n\\r\\n.categories.frosted {\\r\\n overflow: hidden;\\r\\n z-index: -1;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.tools {\\r\\n display: flex;\\r\\n flex-flow: row wrap;\\r\\n margin: auto;\\r\\n height: calc(100vh - var(--course-sidebar-height));\\r\\n}\\r\\n\\r\\n.toolIcon {\\r\\n display: flex;\\r\\n padding: 20px;\\r\\n font-size: 25px;\\r\\n box-sizing: border-box;\\r\\n width: 300px;\\r\\n justify-content: center;\\r\\n text-align: center;\\r\\n margin: 20px;\\r\\n transition: all .1s ease-in-out;\\r\\n cursor: pointer;\\r\\n -webkit-animation: .5s fadeIn;\\r\\n animation: .5s fadeIn;\\r\\n}\\r\\n\\r\\n.toolIcon i {\\r\\n font-size: 90px;\\r\\n padding: 30px;\\r\\n border-radius: calc(((100vw - var(--course-sidebar-width)) / 4) - 30px);\\r\\n transition: all .1s ease-in-out;\\r\\n}\\r\\n\\r\\n.toolIcon:hover {\\r\\n background-color: var(--primary-4);\\r\\n}\\r\\n\\r\\n.toolIcon p {\\r\\n color: var(--primary-3);\\r\\n margin: 0;\\r\\n}\"","module.exports = \"
\\r\\n
\\r\\n

{{category.title}}

\\r\\n
\\r\\n
\\r\\n
\\r\\n {{tool.icon}}\\r\\n

{{tool.title}}

\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\"","import { Component } from '@angular/core';\r\nimport { ToolService } from '../../tool.service';\r\nimport { CourseService } from '../../course.service'; // Being used in categories.component.html (i.e. DO NOT DELETE)\r\nimport { Category } from '../../interfaces';\r\n\r\n/** **********************************************************\r\n * Container for all available tool categories. Each {@link Category} is generated\r\n * based on the available tools.\r\n ************************************************************/\r\n@Component({\r\n selector: 'app-categories',\r\n templateUrl: './categories.component.html',\r\n styleUrls: ['./categories.component.css']\r\n})\r\nexport class CategoriesComponent {\r\n\r\n /** **********************************************************\r\n * Constructor\r\n * @param toolService Used to generate each available category\r\n * @param courseService Verifies if course selection is open, \r\n * so styling can be applied. Used in \r\n * categories.component.html (i.e. DO NOT DELETE)\r\n ************************************************************/\r\n constructor(public toolService: ToolService,\r\n public courseService: CourseService) { }\r\n\r\n /** **********************************************************\r\n * This sets the selected {@link Category} on the Tool service.\r\n * @param {object} category The category to be set as the selected category\r\n * @returns {false} Returns false to prevent the entire page (just the router) from reloading\r\n ************************************************************/\r\n setSelectedCategory(category: Category) {\r\n this.toolService.selectedCategory = category;\r\n return false;\r\n }\r\n}\r\n","module.exports = \"#errorPage {\\r\\n background-color: white;\\r\\n margin: calc(50px + var(--header-height)) auto 0 auto;\\r\\n padding: 20px;\\r\\n overflow: auto;\\r\\n width: var(--courseSelect-width);\\r\\n}\\r\\n\\r\\nh1 {\\r\\n color: red;\\r\\n}\\r\\n\"","module.exports = \"
\\r\\n\\r\\n

{{serverService.error ? serverService.error.message : 'There isn\\\\'t any error information available to display'}}

\\r\\n\\r\\n

Status: {{serverService.error ? serverService.error.status : '---'}}

\\r\\n\\r\\n

If this error persists, please contact a Katana admin.

\\r\\n\\r\\n
\\r\\n\"","import { Component } from '@angular/core';\r\nimport { ServerService } from '../../server.service'; // Being used in error-page.component.html (i.e. DO NOT DELETE)\r\n\r\n/** An error page to display various client-side errors, and errors received from the server. */\r\n@Component({\r\n selector: 'app-error-page',\r\n templateUrl: './error-page.component.html',\r\n styleUrls: ['./error-page.component.css']\r\n})\r\nexport class ErrorPageComponent {\r\n\r\n /** **********************************************************\r\n * Constructor\r\n * @param serverService Collects errors in Katana and allows\r\n * them to be read and displayed to the user. Used in \r\n * error-page.component.html (i.e. DO NOT DELETE)\r\n ************************************************************/\r\n constructor(public serverService: ServerService) { }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MaterializeModule } from 'angular2-materialize';\r\n\r\nimport { CategoriesComponent } from './categories/categories.component';\r\nimport { BreadcrumbsComponent } from './breadcrumbs/breadcrumbs.component';\r\nimport { OptionsViewComponent } from './options-view/options-view.component';\r\nimport { RouterModule } from '@angular/router';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { ErrorPageComponent } from './error-page/error-page.component';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n MaterializeModule,\r\n FormsModule,\r\n ReactiveFormsModule\r\n ],\r\n exports: [\r\n BreadcrumbsComponent,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n ErrorPageComponent\r\n ],\r\n declarations: [\r\n BreadcrumbsComponent,\r\n CategoriesComponent,\r\n OptionsViewComponent,\r\n ErrorPageComponent\r\n ]\r\n})\r\nexport class HomePageModule { }\r\n","module.exports = \".optionsView {\\r\\n width: 100%;\\r\\n display: flex;\\r\\n justify-content: center;\\r\\n padding: 55px;\\r\\n margin-top: var(--header-height);\\r\\n}\\r\\n\\r\\n.optionsView__container {\\r\\n color: black;\\r\\n width: 100%;\\r\\n -webkit-animation: .5s fadeIn;\\r\\n animation: .5s fadeIn;\\r\\n}\\r\\n\\r\\n.optionsView__title {\\r\\n padding: 10px 20px;\\r\\n}\\r\\n\\r\\n.optionsView.frosted {\\r\\n position: relative;\\r\\n z-index: -1;\\r\\n}\\r\\n\\r\\n.categories-container>label {\\r\\n margin-right: 20px;\\r\\n font-size: 16px;\\r\\n padding-left: 30px;\\r\\n}\\r\\n\\r\\n.arrowIndicator {\\r\\n display: flex;\\r\\n position: absolute;\\r\\n top: calc(var(--breadcrumbs-height) + 5px);\\r\\n right: 160px;\\r\\n color: white;\\r\\n z-index: 2000;\\r\\n font-size: 20px;\\r\\n}\\r\\n\\r\\n.arrowIndicator>div {\\r\\n line-height: 40px;\\r\\n}\\r\\n\\r\\n.card-content>div{\\r\\n margin: 20px 0;\\r\\n}\\r\\n\\r\\n.card-content>div:first-of-type {\\r\\n margin-top: 0 !important;\\r\\n}\\r\\n\\r\\n.card-content:last-child {\\r\\n margin-bottom: 0 !important;\\r\\n}\\r\\n\\r\\n[type=\\\"checkbox\\\"].filled-in:checked + label::after {\\r\\n border-color: #2979FF !important;\\r\\n background-color: #2979FF !important;\\r\\n}\\r\\n\\r\\ndiv.option__text {\\r\\n padding-right: 10px;\\r\\n}\\r\\n\\r\\ndiv.option__text>input{\\r\\n padding-left: 10px;\\r\\n}\\r\\n\\r\\nbutton[type=\\\"submit\\\"] {\\r\\n margin-left: 10px;\\r\\n}\"","module.exports = \"
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n

Options

\\r\\n

\\r\\n {{toolService.selectedTool.title}}\\r\\n

\\r\\n\\r\\n
\\r\\n

Description

\\r\\n
{{toolService.selectedTool.description}}
\\r\\n
\\r\\n\\r\\n
\\r\\n

Categories

\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n

{{option.title}}

\\r\\n
{{option.description}}
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n

No Courses Selected

\\r\\n

You must select at least one course before continuing.

\\r\\n
\\r\\n
\\r\\n Got it!\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n Click here to Add Courses\\r\\n
\\r\\n arrow_forward\\r\\n
\\r\\n\"","import { Component, EventEmitter } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { ToolService } from '../../tool.service';\r\nimport { CourseService } from '../../course.service';\r\nimport { ServerService } from '../../server.service';\r\nimport { MaterializeAction } from 'angular2-materialize';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { DiscoverOption } from '../../interfaces';\r\nimport { OptionModel } from '../../classes';\r\n\r\n/**\r\n * Container for the options page. Holds all related\r\n * options components.\r\n */\r\n@Component({\r\n selector: 'app-options-view',\r\n templateUrl: './options-view.component.html',\r\n styleUrls: ['./options-view.component.css']\r\n})\r\nexport class OptionsViewComponent {\r\n\r\n /**\r\n * The options to display on the page.\r\n */\r\n options: DiscoverOption[];\r\n /**\r\n * The {@link OptionModel} to use for the form.\r\n */\r\n optionModel: OptionModel;\r\n /**\r\n * The FormGroup to use for the form.\r\n */\r\n formGroup: FormGroup;\r\n\r\n /**\r\n * From [angular2-materialize]{@link https://www.npmjs.com/package/angular2-materialize},\r\n * which allows the modal to open and close.\r\n */\r\n modalActions: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Constructor\r\n * @param {ToolService} toolService Provides information and management for available courses.\r\n * @param {ServerService} serverService Provides functionality to make API calls to the Katana server.\r\n * @param {CourseService} courseService Provides information and management for selected courses.\r\n * @param {Router} router Used to navigate the user as needed.\r\n */\r\n constructor(public toolService: ToolService,\r\n public serverService: ServerService,\r\n public courseService: CourseService,\r\n private router: Router) {\r\n\r\n this.optionModel = new OptionModel(this.toolService.selectedTool.discoverOptions);\r\n this.formGroup = this.optionModel.toGroup();\r\n }\r\n\r\n /**\r\n * Opens the modal using [angular2-materialize]{@link https://www.npmjs.com/package/angular2-materialize}.\r\n */\r\n openModal(): void {\r\n this.modalActions.emit({ action: 'modal', params: ['open'] });\r\n }\r\n\r\n /**\r\n * Closes the modal using [angular2-materialize]{@link https://www.npmjs.com/package/angular2-materialize}.\r\n */\r\n closeModal(): void {\r\n this.modalActions.emit({ action: 'modal', params: ['close'] });\r\n }\r\n\r\n /**\r\n * Determines the open/close status of the \"no courses selected\" modal.\r\n * @returns {boolean} Whether or not the modal is currently open.\r\n */\r\n noCourseModalOpen(): boolean {\r\n return !!document.querySelector('#fixModal.open');\r\n }\r\n\r\n /**\r\n * Actions taken when the user clicks the \"Run Tool\" button.\r\n * Gathers up the answers on the options form, then submits\r\n * them to the Katana Service to run the tool in discovery mode.\r\n */\r\n onSubmit(): void {\r\n if (this.courseService.courses.length === 0) {\r\n this.openModal();\r\n return;\r\n }\r\n\r\n const options = { categories: [] };\r\n Object.keys(this.formGroup.controls).forEach(key => {\r\n options[key] = this.formGroup.controls[key].value;\r\n });\r\n\r\n const categoryInputs = Array.from(document.querySelectorAll('.canvas-category')) as HTMLInputElement[];\r\n categoryInputs.forEach(category => {\r\n if (category.checked) {\r\n options.categories.push(category.id);\r\n }\r\n });\r\n\r\n // Send request\r\n this.toolService.selectedDiscoverOptions = options;\r\n this.serverService.discoverIssues(this.courseService.courses)\r\n .catch(console.error);\r\n this.router.navigate([`home/tools/${this.toolService.selectedTool.id}/issues`]);\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { CourseService } from './course.service';\r\nimport { ToolService } from './tool.service';\r\nimport { ToastService } from './toast.service';\r\nimport { Router } from '@angular/router';\r\nimport { auth, database } from 'firebase';\r\nimport { AuthGuardService } from './authguard.service';\r\nimport { resolve } from 'url';\r\nimport { Error } from './interfaces';\r\n\r\n/**\r\n * Provides access to make calls to the Katana server.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ServerService {\r\n\r\n /**\r\n * Handles formatting the correct URL for the web sockets.\r\n */\r\n serverDomain = window.location.hostname.replace(/www./, '') + (window.location.port ? ':' + window.location.port : '');\r\n\r\n /**\r\n * If an error is returned by the server, it is stored here for public access.\r\n */\r\n error: Error;\r\n\r\n /**\r\n * Constructor\r\n * @param http - Currently used to retrieve basic data from the server.\r\n * @param toolService - Provides information about available tools on the server.\r\n * @param courseService - Provides information and management for the currently selected courses.\r\n * @param router - Used to navigate the user as needed.\r\n * @param toastService - Provides toast functionality.\r\n */\r\n constructor(private http: HttpClient,\r\n private toolService: ToolService,\r\n private courseService: CourseService,\r\n private router: Router,\r\n private authGuardService: AuthGuardService,\r\n private toastService: ToastService) {\r\n\r\n // Listens to changes in the auth state, and if the user is valid,\r\n // it retrieves the list of tools from the server\r\n authGuardService.authState.subscribe(state => {\r\n if (state) {\r\n this.getToolList()\r\n .catch(console.error);\r\n } else {\r\n toolService.toolList = [];\r\n }\r\n });\r\n\r\n }\r\n\r\n /**\r\n * Currently open web sockets.\r\n */\r\n sockets: WebSocket[] = [];\r\n\r\n /** ***************************************************************\r\n * Retrieves the list of tools from the server.\r\n *****************************************************************/\r\n getToolList() {\r\n return new Promise(async (resolve, reject) => {\r\n if (!this.authGuardService.canActivate()) {\r\n return reject(new Error('ToolList: User is not authenticated.'));\r\n }\r\n this.authGuardService.retrieveToken()\r\n .then(userIdToken => {\r\n this.http.get(`/api/tool-list?userIdToken=${userIdToken}`).subscribe(\r\n (toolList: any): any => {\r\n this.toolService.toolList = toolList;\r\n resolve();\r\n },\r\n (err) => {\r\n this.errorHandler(err);\r\n reject();\r\n });\r\n })\r\n .catch(this.errorHandler);\r\n\r\n });\r\n }\r\n\r\n downloadCourseBackup(body) {\r\n return new Promise((resolve, reject) => {\r\n if (!this.authGuardService.canActivate()) {\r\n return reject(new Error('Download Course Backup: User is not authenticated.'));\r\n }\r\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\r\n headers.append('Content-Type', 'application/json');\r\n\r\n this.authGuardService.retrieveToken()\r\n .then(userIdToken => {\r\n this.http.post(`/api/course-make-backup?userIdToken=${userIdToken}`, body, { headers: headers }).subscribe(\r\n (data) => {\r\n resolve(data);\r\n },\r\n (err) => {\r\n this.errorHandler(err);\r\n reject();\r\n });\r\n })\r\n .catch(this.errorHandler);\r\n });\r\n }\r\n\r\n /**\r\n * Retrieves a list of courses from Canvas.\r\n */\r\n getCourses(body) {\r\n return new Promise((resolve, reject) => {\r\n if (!this.authGuardService.canActivate()) {\r\n return reject(new Error('Course Selection: User is not authenticated.'));\r\n }\r\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\r\n headers.append('Content-Type', 'application/json');\r\n\r\n this.authGuardService.retrieveToken()\r\n .then(userIdToken => {\r\n this.http.post(`/api/course-retrieval?userIdToken=${userIdToken}`, body, { headers: headers }).subscribe(\r\n (data) => {\r\n resolve(data);\r\n },\r\n (err) => {\r\n this.errorHandler(err);\r\n reject();\r\n });\r\n })\r\n .catch(this.errorHandler);\r\n });\r\n }\r\n\r\n /**\r\n * Runs a tool on the server in discovery mode, then returns the issue items discovered.\r\n * @param {string} toolId - The ID of the tool to be run\r\n * @param {object} options - An object containing the option values specific to the tool\r\n * @returns {object[]} - Array of issue items discovered by the tool on the server\r\n */\r\n discoverIssues(courses) {\r\n return new Promise(async (resolve, reject) => {\r\n if (!this.authGuardService.canActivate()) {\r\n return reject(new Error('Discover: User is not authenticated.'));\r\n }\r\n\r\n this.toolService.processingMessage = 'Searching for Issues...';\r\n this.toolService.processing = true;\r\n let completed = 0;\r\n\r\n let userIdToken;\r\n try {\r\n userIdToken = await this.authGuardService.retrieveToken();\r\n } catch (err) {\r\n this.errorHandler(err);\r\n }\r\n\r\n const socket = new WebSocket(`ws://${this.serverDomain}/api/tool/discover?userIdToken=${userIdToken}`);\r\n this.sockets.push(socket);\r\n\r\n /* Normally, you would just listen for the 'open' event and start sending messages\r\n to the server. However, the auth middleware on the server causes a delay that\r\n prevents the event listeners for each particular web socket from being set up. The\r\n messages sent immediately when the web socket are opened are received, but never\r\n handled. Instead, it is set up here to wait for the server to tell the client that\r\n it is good to go before it starts sending messages. */\r\n socket.addEventListener('message', (event) => {\r\n const data = JSON.parse(event.data);\r\n if (data.state === 'READY') {\r\n // TODO: Make this asynchronous, making the sockets and all\r\n courses.forEach(course => {\r\n // Set the course processing\r\n course.processing = true;\r\n // Remove any pre-existing error\r\n delete course.error;\r\n\r\n const data = JSON.stringify({\r\n tool_id: this.toolService.selectedTool.id,\r\n course: course,\r\n options: this.toolService.selectedDiscoverOptions,\r\n userEmail: auth().currentUser.email\r\n });\r\n socket.send(data);\r\n });\r\n } else {\r\n const course = data;\r\n\r\n if (course.error) {\r\n console.error(`${course.course_code} (${course.id}): ${course.error}`);\r\n }\r\n\r\n this.courseService.coursesObj[`c${course.id}`] = course;\r\n course.processing = false;\r\n completed++;\r\n\r\n // Update the currently selected course, if this is the currently selected course\r\n if (course.id === this.courseService.selectedCourse.id) {\r\n this.courseService.selectedCourse = this.courseService.coursesObj[`c${course.id}`];\r\n }\r\n\r\n // If this was the last course, then close the socket\r\n if (completed === courses.length) {\r\n this.toolService.processing = false;\r\n socket.close();\r\n }\r\n }\r\n });\r\n\r\n socket.onerror = (err) => {\r\n courses.forEach(course => {\r\n course.processing = false;\r\n course.error = new Error('Socket unexpectedly closed.');\r\n });\r\n this.toolService.processing = false;\r\n this.errorHandler(err);\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Fixes the provided issue items in Canvas by sending them to the specified tool on the server.\r\n * @param {string} toolId - The ID of the tool to be run\r\n * @param {object} options - An object containing the option values specific to the tool\r\n * @returns {object[]} - Array of issue items fixed by the tool on the server\r\n */\r\n fixIssues(courses) {\r\n return new Promise(async (resolve, reject) => {\r\n if (!this.authGuardService.canActivate()) {\r\n return reject(new Error('Fix: User is not authenticated.'));\r\n }\r\n\r\n this.toolService.processingMessage = 'Fixing Issues...';\r\n this.toolService.processing = true;\r\n\r\n const fixables = courses.filter(course => {\r\n return course.itemCards && course.itemCards.some(itemCards => {\r\n if (itemCards.issues.some(issue => issue.status === 'approved')) {\r\n course.processing = true;\r\n return true;\r\n } else {\r\n course.processing = false;\r\n return false;\r\n }\r\n });\r\n });\r\n\r\n let userIdToken;\r\n try {\r\n userIdToken = await this.authGuardService.retrieveToken();\r\n } catch (err) {\r\n this.errorHandler(err);\r\n }\r\n\r\n let completed = 0;\r\n\r\n const socket = new WebSocket(`ws://${this.serverDomain}/api/tool/fix?userIdToken=${userIdToken}`);\r\n this.sockets.push(socket);\r\n\r\n socket.addEventListener('message', (event) => {\r\n const data = JSON.parse(event.data);\r\n if (data.state === 'READY') {\r\n fixables.forEach(course => {\r\n course.processing = true;\r\n // Save the option values for each issue, but remove the formGroup and questionModel\r\n course.itemCards.forEach(itemCard => {\r\n itemCard.issues.forEach(issue => {\r\n if (issue.formGroup) {\r\n issue.optionValues = issue.formGroup.value;\r\n delete issue.formGroup;\r\n delete issue.questionModel;\r\n }\r\n });\r\n });\r\n\r\n let data = JSON.stringify({\r\n tool_id: this.toolService.selectedTool.id,\r\n course: course,\r\n options: this.toolService.selectedDiscoverOptions,\r\n userEmail: auth().currentUser.email\r\n });\r\n socket.send(data);\r\n });\r\n } else {\r\n const course = data;\r\n if (course.error) {\r\n console.error(`${course.course_code} (${course.id}): ${course.error}`);\r\n }\r\n\r\n this.courseService.coursesObj[`c${course.id}`] = course;\r\n course.processing = false;\r\n completed++;\r\n\r\n // Update the currently selected course, if this is the currently selected course\r\n if (course.id === this.courseService.selectedCourse.id) {\r\n this.courseService.selectedCourse = this.courseService.coursesObj[`c${course.id}`];\r\n }\r\n\r\n // If this was the last course, then close the socket\r\n if (completed === fixables.length) {\r\n this.toolService.processing = false;\r\n socket.close();\r\n }\r\n }\r\n\r\n });\r\n\r\n socket.onerror = (err) => {\r\n courses.forEach(course => {\r\n course.processing = false;\r\n course.error = new Error('Socket unexpectedly closed.');\r\n });\r\n this.toastService.toastError(err);\r\n this.toolService.processing = false;\r\n this.errorHandler(err);\r\n };\r\n });\r\n }\r\n\r\n /** Handles errors for this service. */\r\n errorHandler(e) {\r\n console.error(e);\r\n this.error = e;\r\n this.router.navigate(['home', 'error']);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Handles user settings, such as the theme.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SettingsService {\r\n\r\n /** @ignore */\r\n processingVerbs = [\r\n 'Diagnosing',\r\n 'Encapsulating',\r\n 'Sketching',\r\n 'Airating',\r\n 'Flipping',\r\n 'Calculating',\r\n 'Producing',\r\n 'Kicking',\r\n 'Slapping',\r\n 'Prodding',\r\n 'Aging',\r\n 'Trimming',\r\n 'Typing',\r\n 'Thinking',\r\n 'Contemplating',\r\n 'Ordering',\r\n 'Internetting',\r\n 'Googling',\r\n 'Yahooing',\r\n 'Firefoxing',\r\n 'Chroming',\r\n 'Operating',\r\n 'Candidating',\r\n 'Evicting',\r\n 'De-Horcruxing',\r\n 'Charming',\r\n 'Levitating',\r\n 'Meditating with',\r\n 'Lasering',\r\n 'Purifying',\r\n 'Burninating',\r\n 'Pro-rating',\r\n 'Rubber ducking',\r\n 'Pranking'\r\n ];\r\n\r\n /** @ignore */\r\n processingNouns = [\r\n 'ninjas',\r\n 'processors',\r\n 'tombs',\r\n 'desks',\r\n 'files',\r\n 'dancers',\r\n 'people',\r\n 'wyverns',\r\n 'frogs',\r\n 'developers',\r\n 'pages',\r\n 'discussions',\r\n 'choreography',\r\n 'swordfish',\r\n 'sketchers',\r\n 'whatchamacallits',\r\n 'jedi',\r\n 'sith',\r\n 'wizards',\r\n 'maiar',\r\n 'hobbits',\r\n 'rangers',\r\n 'elves',\r\n 'urukai',\r\n 'rubber ducks',\r\n 'sushi',\r\n 'fishies',\r\n 'unicorns',\r\n 'xylophones',\r\n 'saxophones',\r\n 'lightsabers',\r\n 'blasters',\r\n 'jetpacks',\r\n 'whiteboards',\r\n 'doctors',\r\n 'chemists',\r\n 'programmers',\r\n 'hackers',\r\n 'bananas',\r\n 'rabbits',\r\n 'ligers',\r\n 'hippos',\r\n 'shazams',\r\n 'flex tape',\r\n 'mix tapes',\r\n 'sea pancakes',\r\n 'snowmen',\r\n 'katanas'\r\n ];\r\n\r\n /** @ignore */\r\n processingAdjectives = [\r\n 'palpatating',\r\n 'undulating',\r\n 'moist',\r\n 'electrical',\r\n 'shadowy',\r\n 'sketchy',\r\n 'spinning',\r\n 'freestyling',\r\n 'gradiating',\r\n 'radiating',\r\n 'freaky',\r\n 'superstitious',\r\n 'italian',\r\n 'saucy',\r\n 'sassy',\r\n 'productive',\r\n 'general',\r\n 'vermillion',\r\n 'tickle-me-pink',\r\n 'fluffy',\r\n 'spunky',\r\n 'toothpaste-fresh',\r\n 'spudtastic',\r\n 'dank',\r\n 'janky',\r\n 'radical',\r\n 'wizard',\r\n 'that\\'s-so-raven',\r\n 'sharp',\r\n 'inumerable',\r\n 'fresh',\r\n 'forward',\r\n 'backward',\r\n 'mirrored',\r\n 'entifiable',\r\n 'Daniel\\'d',\r\n 'shocked',\r\n 'unbelievable',\r\n 'inconceivable',\r\n 'conceivable',\r\n 'incomprehensible',\r\n 'comprehensible',\r\n 'normie',\r\n 'randy',\r\n 'scrub',\r\n 'salty',\r\n 'OP',\r\n 'practical',\r\n ];\r\n\r\n /**\r\n * The themes that can be set. Set by using the `setTheme()` method on this service.\r\n */\r\n themes = {\r\n classic: {\r\n 'cobalt': '#2879B5',\r\n 'navy': '#183A54',\r\n 'navy-light': '#2D4B63',\r\n 'mint': '#c3ffe3',\r\n 'charcoal': '#65727D',\r\n 'ashen': '#eceff1',\r\n },\r\n charcoal: {\r\n 'cobalt': '#65727D',\r\n 'navy': '#1C2023',\r\n 'navy-light': '#252A2E',\r\n 'mint': '#c3ffe3',\r\n 'charcoal': '#65727D',\r\n 'ashen': '#eceff1',\r\n },\r\n navy: {\r\n 'cobalt': '#183A54',\r\n 'navy': '#2D4B63',\r\n 'navy-light': '#2D4B9f',\r\n 'mint': '#c3ffe3',\r\n 'charcoal': '#65727D',\r\n 'ashen': '#eceff1',\r\n },\r\n hate: {\r\n 'cobalt': 'limegreen',\r\n 'navy': 'yellow',\r\n 'navy-light': 'magenta',\r\n 'mint': '#c3ffe3',\r\n 'charcoal': '#65727D',\r\n 'ashen': 'red',\r\n }\r\n };\r\n\r\n /** Constructor */\r\n constructor() { }\r\n\r\n /**\r\n * Toggles the theme between dark and light.\r\n */\r\n setTheme(newTheme) {\r\n localStorage.katanaTheme = newTheme;\r\n Object.keys(this.themes[newTheme]).forEach(key => {\r\n document.documentElement.style.setProperty(`--${key}`, this.themes[newTheme][key]);\r\n });\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n getRandom(arr) {\r\n const randy = Math.floor(Math.random() * arr.length);\r\n return arr[randy];\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n buildProcessingMessage() {\r\n const verb = this.getRandom(this.processingVerbs);\r\n const adjective = this.getRandom(this.processingAdjectives);\r\n const noun = this.getRandom(this.processingNouns);\r\n return `${verb} ${adjective} ${noun}...`;\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n checkLocalStorage(key) {\r\n return localStorage[key] === 'true';\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n setLocalStorage(key) {\r\n localStorage[key] = localStorage[key] === 'true' ? 'false' : 'true';\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { toast } from 'angular2-materialize';\r\n\r\n/**\r\n * Provides methods to notify the user of errors and various message\r\n * via toast notification.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ToastService {\r\n\r\n /**\r\n * Constructor\r\n */\r\n constructor() { }\r\n\r\n /**\r\n * Displays an error to the user via toast notification.\r\n * @param {Error} e Error to display\r\n */\r\n toastError(e) {\r\n function buildHTML(message) {\r\n console.log(typeof message, message);\r\n if (typeof message === 'object') {\r\n message = JSON.stringify(message);\r\n }\r\n return `\r\n ${JSON.stringify(message)}\r\n \r\n `;\r\n }\r\n // If just text is sent in\r\n let text = e;\r\n\r\n // Classic Error\r\n if (e instanceof Error) {\r\n text = e.message;\r\n\r\n // If a web socket goes down unexpectedly\r\n } else if (e instanceof Event && e.target instanceof WebSocket && (e.target.readyState === 3 || e.target.readyState === 2)) {\r\n text = 'Websocket unexpectedly closed. Server may be down.';\r\n }\r\n toast(buildHTML(text));\r\n setTimeout(() => {\r\n document.querySelector('.toast').remove();\r\n }, 15000);\r\n }\r\n\r\n /**\r\n * Displays a message to the user via toast notification.\r\n * @param {string} text Message to display\r\n */\r\n toast(text) {\r\n function buildHTML(message) {\r\n return `\r\n ${JSON.stringify(message)}\r\n \r\n `;\r\n }\r\n toast(buildHTML(text));\r\n setTimeout(() => {\r\n document.querySelector('.toast').remove();\r\n }, 5000);\r\n }\r\n}\r\n","module.exports = \".editor-container {\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.editor {\\r\\n font-size: 16px;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.html-bar {\\r\\n border-top: solid 1px var(--ashen);\\r\\n display: flex;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.html-bar>h3 {\\r\\n padding-right: 15px;\\r\\n}\\r\\n\\r\\n.html-bar>button {\\r\\n height: 46px;\\r\\n line-height: 46px;\\r\\n}\\r\\n\\r\\n.edit-button {\\r\\n margin-left: auto;\\r\\n}\\r\\n\\r\\n.activeTab {\\r\\n color: var(--cobalt);\\r\\n background-color: var(--ashen);\\r\\n}\\r\\n\"","module.exports = \"
\\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\"","import { Component, OnInit, Input, Output, ViewChild, ElementRef, EventEmitter } from '@angular/core';\r\nimport { Issue } from '../../interfaces';\r\n\r\n/**\r\n * Integrates the Ace code editor to allow viewing and editing HTML from an issue's canvas item.\r\n */\r\n@Component({\r\n selector: 'app-code-editor',\r\n templateUrl: './code-editor.component.html',\r\n styleUrls: ['./code-editor.component.css']\r\n})\r\nexport class CodeEditorComponent implements OnInit {\r\n\r\n /**\r\n * The tabs to add to the code editor. This may include tabs\r\n * like \"Current HTML\" and \"Updated HTML\" to show the user how\r\n * the HTML will be changed by the tool.\r\n */\r\n @Input('tabs') tabs: any[];\r\n\r\n /**\r\n * If certain key words should be highlighted by the editor's\r\n * search functionality, this should be passed as\r\n * a string. It will be converted into a regex, so\r\n * a regex string (to be passed into the RegExp constructor)\r\n * can also be passed in.\r\n */\r\n @Input('highlight') highlight: string;\r\n\r\n /**\r\n * The issue the code editor is displaying code for.\r\n */\r\n @Input('issue') issue: Issue;\r\n\r\n /**\r\n * Element reference to the editor div itself so we can\r\n * initiate the Ace editor instance.\r\n */\r\n @ViewChild('editor') editorEl: ElementRef;\r\n\r\n /**\r\n * The editor instance. This is set after it has been initialized.\r\n */\r\n editor: any;\r\n\r\n /**\r\n * The currently active tab on the tabs bar of the editor.\r\n */\r\n activeTab: any;\r\n\r\n /**\r\n * Whether or not the editor is in \"edit\" mode. This just means that\r\n * it is expanded, currently. Whether or not it can be edited is\r\n * determined by the tab's \"readOnly\" property.\r\n */\r\n viewExpanded = true;\r\n\r\n /**\r\n * Stores the tab objects passed in to the \"tabs\" input. For whatever reason,\r\n * the passed in tabs don't store as references correctly, so adding\r\n * the session to them doesn't carry over to the rest of the methods.\r\n * This helps with those reference issues. This is set during the \"ngOnInit\"\r\n * method.\r\n */\r\n private _tabs: any[] = [];\r\n\r\n /**\r\n * Constructor\r\n */\r\n constructor() { }\r\n\r\n /**\r\n * Fired on component load, this sets up the editor, creates the tabs provided\r\n * by the selected tool, creates the sessions for each tab, beautifies their code,\r\n * inserts their code, and then sets the settings and options for the editor.\r\n */\r\n ngOnInit() {\r\n // The EditSession class is used to spawn new sessions in the editor\r\n const EditSession = window['ace'].require('ace/edit_session').EditSession;\r\n // Allows Ctrl+F Search functionality (keep, even though it says the var is unused)\r\n const searchBox = window['ace'].require('ace/searchbox');\r\n // Save a correct reference to the tab objects that is safe to use\r\n this._tabs = this.tabs;\r\n\r\n // Create and add an editor session to each tab, beautify its code, and insert it\r\n this._tabs.forEach(tab => {\r\n const code = window['html_beautify'](tab['htmlString'] || ' '); // Beautifies the code\r\n tab.session = new EditSession(code);\r\n tab.session.setMode('ace/mode/html');\r\n tab.session.setUseWrapMode(true);\r\n tab.session.setUseWorker(false); // Disables the linter/syntax checker\r\n tab.session.setTabSize(4); // Sets the tab size to 4 spaces\r\n });\r\n\r\n // Create the editor, set the options, and set the first session\r\n this.editor = window['ace'].edit(this.editorEl.nativeElement);\r\n this.editor.setOption('minLines', 10);\r\n this.editor.setOption('maxLines', 30);\r\n this.editor.setTheme('ace/theme/terminal');\r\n this.editor.setReadOnly(true);\r\n this.editor.setHighlightActiveLine(true);\r\n this.setEditorSession(this._tabs[0]);\r\n }\r\n\r\n /**\r\n * Sets the editor's session to the selected tab's session\r\n * @param tab The tab (and it's related info) to set as the\r\n * editor's current session.\r\n */\r\n setEditorSession(tab) {\r\n if (!tab.session) { return; }\r\n this.editor.setReadOnly(tab.readOnly);\r\n this.editor.setSession(tab.session);\r\n this.activeTab = tab;\r\n\r\n // If the user changes the code in the editor, it will change this issue status to untouched\r\n this.editor.on('change', () => {\r\n if (this.issue.status === 'approved') {\r\n this.issue.status = 'untouched';\r\n }\r\n this.issue.html['updatedHtml'] = this.editor.getSession().getValue();\r\n });\r\n\r\n // This \"if\" prevents it from searching with an empty search phrase,\r\n // which finds pretty much every empty character...\r\n if (this.highlight) {\r\n // Converts the provided search phrase to a RegExp\r\n const reg = new RegExp(this.highlight, 'gi');\r\n // Finds and highlights all matches to the RegExp\r\n this.editor.findAll(reg, {\r\n needle: reg,\r\n wrap: true,\r\n regExp: true\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Toggles the height of the editor window using Ace's \"maxLines\" editor setting.\r\n */\r\n expandView() {\r\n this.viewExpanded = !this.viewExpanded;\r\n this.editor.setOption('maxLines', this.viewExpanded ? 30 : 10);\r\n }\r\n\r\n}\r\n","module.exports = \"/** Container for this component\\r\\n * Note: z-index must be higher than 1 so buttons in the Issues\\r\\n * column do not overlap. */\\r\\n\\r\\ntd {\\r\\n padding: 5px 0;\\r\\n}\\r\\n\\r\\n.issueApproval {\\r\\n bottom: 20px;\\r\\n display: flex;\\r\\n height: 50px;\\r\\n justify-content: space-between;\\r\\n border-radius: 4px;\\r\\n position: fixed;\\r\\n right: 35px;\\r\\n z-index: 2;\\r\\n}\\r\\n\\r\\n/* Container to hold the \\\"fix approved\\\" and kebob menu */\\r\\n\\r\\n.issueApproval__buttonContainer {\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n}\\r\\n\\r\\n/* Buttons within this component */\\r\\n\\r\\n.issueApproval__button {\\r\\n border-radius: 3px;\\r\\n margin: auto;\\r\\n}\\r\\n\\r\\n.issueApproval__button a {\\r\\n padding: 0 15px;\\r\\n margin: 0 15px;\\r\\n}\\r\\n\\r\\n/* The kebob menu */\\r\\n\\r\\n.issueApproval_moreButton>i {\\r\\n color: var(--primary-5);\\r\\n cursor: pointer;\\r\\n font-size: 30px;\\r\\n line-height: 50px;\\r\\n margin: 0 10px 0 0;\\r\\n\\r\\n}\\r\\n\\r\\n/* The kebob menu's dropdown content */\\r\\n\\r\\n.dropdown-content {\\r\\n /* important has to be here b/c we're overwriting materialize */\\r\\n top: 37px !important;\\r\\n width: 200px !important;\\r\\n -webkit-transform: translate(0, -87px);\\r\\n transform: translate(0, -87px);\\r\\n}\\r\\n\\r\\n.dropdown-content>li>a {\\r\\n transition: none;\\r\\n color: var(--cobalt);\\r\\n}\\r\\n\\r\\n.dropdown-content>li>a:hover {\\r\\n transition: none;\\r\\n background-color: #eee;\\r\\n}\\r\\n\\r\\n.modal-footer {\\r\\n border-top: solid 1px var(--primary-2);\\r\\n}\\r\\n\\r\\n.issueIcon {\\r\\n -webkit-transform: translateY(3px);\\r\\n transform: translateY(3px);\\r\\n font-size: 18px;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.disabled, .disabled:hover {\\r\\n opacity: 0.5;\\r\\n pointer-events: none;\\r\\n cursor: default;\\r\\n background-color: #DFDFDF;\\r\\n color: #9F9F9F;\\r\\n box-shadow: none;\\r\\n}\\r\\n\"","module.exports = \"
\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n

Issues

\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n {{courseService.getStatusIcon(issue.status)}}\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n Cancel\\r\\n Fix All Approved Issues\\r\\n
\\r\\n\\r\\n
\"","import { Component } from '@angular/core';\r\nimport { CourseService } from '../../course.service';\r\nimport { ServerService } from '../../server.service';\r\nimport { MaterializeAction } from 'angular2-materialize';\r\nimport { EventEmitter } from '@angular/core';\r\nimport { ToolService } from '../../tool.service';\r\nimport { csvFormatRows } from 'd3-dsv';\r\n\r\n/**\r\n * Container for managing various actions on the tool view page,\r\n * such as the \"Fix All Approved\" button.\r\n */\r\n@Component({\r\n selector: 'app-issue-nav',\r\n templateUrl: './issue-nav.component.html',\r\n styleUrls: ['./issue-nav.component.css']\r\n})\r\nexport class IssueNavComponent {\r\n\r\n /**\r\n * From [angular2-materialize]{@link https://www.npmjs.com/package/angular2-materialize},\r\n * which allows the modal to open and close.\r\n */\r\n modalActions: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Constructor\r\n * @param courseService Provides information and management for selected courses.\r\n * @param toolService Provides information and management for available tools.\r\n * @param serverService Provides functionality to make API calls to the Katana server.\r\n */\r\n constructor(public courseService: CourseService,\r\n public toolService: ToolService,\r\n public serverService: ServerService) { }\r\n\r\n /**\r\n * Opens the modal using [angular2-materialize]{@link https://www.npmjs.com/package/angular2-materialize}.\r\n */\r\n openModal() {\r\n this.modalActions.emit({ action: 'modal', params: ['open'] });\r\n }\r\n\r\n /**\r\n * Closes the modal using [angular2-materialize]{@link https://www.npmjs.com/package/angular2-materialize}.\r\n */\r\n closeModal() {\r\n this.modalActions.emit({ action: 'modal', params: ['close'] });\r\n }\r\n\r\n /**\r\n * Returns the user the {@link ItemCard}s belonging to the provided course.\r\n * @param course The course to retrieve the ItemCards from.\r\n * @returns {ItemCard[]} The ItemCards belonging to the provided course.\r\n */\r\n getItemCards(course) {\r\n if (!course.itemCards) { return []; }\r\n return course.itemCards.reduce((acc, itemCard) => {\r\n if (!itemCard.issues) { return acc; }\r\n return [...acc, ...itemCard.issues];\r\n }, []);\r\n }\r\n\r\n /**\r\n * Sets the currently selected course and currently selected {@link ItemCard}.\r\n * @param course The course to set as the currently selected course.\r\n * @param issue The issue to use to set the currently selected ItemCard.\r\n */\r\n selectItemCard(course, issue) {\r\n this.courseService.selectedCourse = course;\r\n this.courseService.selectedItemCard = course.itemCards.find(itemCard => itemCard.issues.includes(issue));\r\n this.closeModal();\r\n }\r\n\r\n /**\r\n * A method to set the status of each issue in the selected course to 'approved'\r\n */\r\n approveAll() {\r\n // only approve the issues if the tool's 'enableApproveAll' attribute is set to true\r\n if (this.toolService.selectedTool.enableApproveAll === true) {\r\n this.courseService.selectedCourse.itemCards.forEach(itemCard => {\r\n itemCard.issues.forEach(issue => {\r\n issue.status = 'approved';\r\n });\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Downloads a CSV to the user's computer containing all of the\r\n * currently displayed issues.\r\n */\r\n downloadIssues() {\r\n let csvReport = '';\r\n this.courseService.courses.forEach((course, i) => {\r\n course.itemCards.forEach((itemCard, j) => {\r\n if (i < 1 && j < 1) {\r\n csvReport = csvFormatRows([[\r\n 'Issue Title',\r\n 'Status',\r\n 'Option Values',\r\n 'Item Title',\r\n 'Item ID',\r\n 'Course ID',\r\n 'Category',\r\n 'Link',\r\n 'Details',\r\n ]].concat(itemCard.issues.map(issue => {\r\n const flatIssueDetails = Object.entries(issue.details).reduce((acc, pair) => {\r\n const detail = `${pair[0]}: ${pair[1]}`;\r\n return acc.concat(detail);\r\n }, []);\r\n\r\n return [\r\n issue.title,\r\n issue.status,\r\n issue.optionValues ? issue.optionValues : '',\r\n itemCard.title,\r\n itemCard.item_id,\r\n itemCard.course_id,\r\n itemCard.category,\r\n itemCard.link,\r\n ...flatIssueDetails\r\n ];\r\n }))) + '\\n';\r\n } else {\r\n // Make the log without the header\r\n csvReport += csvFormatRows(itemCard.issues.map(issue => {\r\n const flatIssueDetails = Object.entries(issue.details).reduce((acc, pair) => {\r\n const detail = `${pair[0]}: ${pair[1]}`;\r\n return acc.concat(detail);\r\n }, []);\r\n return [\r\n issue.title,\r\n issue.status,\r\n issue.optionValues ? issue.optionValues : '',\r\n itemCard.title,\r\n itemCard.item_id,\r\n itemCard.course_id,\r\n itemCard.category,\r\n itemCard.link,\r\n ...flatIssueDetails\r\n ];\r\n })) + '\\n';\r\n }\r\n });\r\n });\r\n\r\n // Setup the link to download the csv report\r\n const fileName = 'csvReport.csv';\r\n const a = document.getElementById('download');\r\n const blob = new Blob([csvReport], { type: 'octet/stream' });\r\n const url = window.URL.createObjectURL(blob);\r\n\r\n a.href = url;\r\n a.download = fileName;\r\n }\r\n}\r\n","module.exports = \"/* The full card for an issue item */\\r\\n\\r\\n.issueCard {\\r\\n cursor: pointer;\\r\\n padding: 15px;\\r\\n position: relative;\\r\\n width: calc(100%);\\r\\n}\\r\\n\\r\\n.issueCard:hover {\\r\\n background-color: var(--ashen);\\r\\n}\\r\\n\\r\\n/* The line containing the item title and link to Canvas */\\r\\n\\r\\n.issueCard_titleLine {\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.issueCard_titleLine>div {\\r\\n display: flex;\\r\\n}\\r\\n\\r\\n.issueCard_titleLine>div>i {\\r\\n color: var(--primary-5);\\r\\n}\\r\\n\\r\\n/* The item title */\\r\\n\\r\\n.issueCard_title {\\r\\n font-size: 16px;\\r\\n font-weight: 500;\\r\\n}\\r\\n\\r\\n/* Link to Canvs */\\r\\n\\r\\n.issueCard_link {\\r\\n height: 16px;\\r\\n width: 16px;\\r\\n line-height: 16px;\\r\\n margin-right: 5px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n/* The link to canvas */\\r\\n\\r\\n.issueCard_link:hover {\\r\\n opacity: .7;\\r\\n}\\r\\n\\r\\n/* Icon within the link to Canvas */\\r\\n\\r\\n.issueCard_link>i {\\r\\n font-size: 22px;\\r\\n}\\r\\n\\r\\n/* The item type (i.e. Page) */\\r\\n\\r\\n.issueCard_type {\\r\\n font-size: 12px;\\r\\n color: var(--primary-3);\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n/* The issue title */\\r\\n\\r\\n.issueCard_issue {\\r\\n font-size: 12px;\\r\\n margin-top: 2px;\\r\\n display: flex;\\r\\n line-height: 22px;\\r\\n}\\r\\n\\r\\n/* The issue title's underline */\\r\\n\\r\\n.issueCard_issue>a:hover {\\r\\n -webkit-text-decoration: underline #039be5;\\r\\n text-decoration: underline #039be5;\\r\\n}\\r\\n\\r\\n/* The issue tag (the icon) */\\r\\n\\r\\n.issueCard_tag {\\r\\n font-size: 22px;\\r\\n margin: 0 5px 0 0;\\r\\n -webkit-user-select: none;\\r\\n -moz-user-select: none;\\r\\n -ms-user-select: none;\\r\\n user-select: none;\\r\\n vertical-align: center;\\r\\n width: 26px;\\r\\n}\\r\\n\\r\\n.selectedCard {\\r\\n background-color: var(--ashen);\\r\\n}\\r\\n\\r\\n.selectedCard .issueCard_title {\\r\\n color: var(--cobalt);\\r\\n}\"","module.exports = \"
\\r\\n
\\r\\n
\\r\\n \\r\\n {{getTypeIcon()}}\\r\\n \\r\\n
\\r\\n {{itemCard.title}}\\r\\n
\\r\\n
\\r\\n \\r\\n open_in_new\\r\\n \\r\\n
\\r\\n
    \\r\\n
  • \\r\\n \\r\\n {{courseService.getStatusIcon(issue.status)}}\\r\\n \\r\\n \\r\\n {{issue.title}}\\r\\n
  • \\r\\n
\\r\\n
\\r\\n\"","import { Component, Input, ViewChild, ElementRef, AfterViewInit } from '@angular/core';\r\nimport { CourseService } from '../../course.service';\r\nimport { ItemCard } from '../../interfaces';\r\n\r\n/**\r\n * Manages the display for a single {@link ItemCard}.\r\n */\r\n@Component({\r\n selector: 'app-item-card',\r\n templateUrl: './item-card.component.html',\r\n styleUrls: ['./item-card.component.css']\r\n})\r\nexport class ItemCardComponent implements AfterViewInit {\r\n /**\r\n * The {@link ItemCard} used by this component.\r\n */\r\n @Input('itemCard') itemCard: ItemCard;\r\n /**\r\n * The position of the component in the {@link IssueListComponent}.\r\n */\r\n @Input('position') position: number;\r\n /**\r\n * Reference to the element in the view for this component that\r\n * contains it's item type icon (ex. Page, Discussion, Quiz).\r\n */\r\n @ViewChild('typeIcon') typeIcon: ElementRef;\r\n\r\n /**\r\n * Constructor\r\n * @param courseService Provides information and management for selected courses.\r\n */\r\n constructor(public courseService: CourseService) { }\r\n\r\n /**\r\n * This class implements AfterViewInit, which runs after the element\r\n * is rendered completely on the page. This is so we can add the tooltip\r\n * data correctly to the type icon.\r\n */\r\n ngAfterViewInit() {\r\n if (!this.typeIcon) { return; }\r\n const types = {\r\n 'pages': 'Page',\r\n 'assignments': 'Assignment',\r\n 'discussions': 'Discussion',\r\n 'files': 'File',\r\n 'folders': 'Folder',\r\n 'quizzes': 'Quiz',\r\n 'quizQuestions': 'Quiz Question',\r\n 'modules': 'Module',\r\n 'moduleItems': 'Module Item',\r\n };\r\n this.typeIcon.nativeElement.setAttribute('data-tooltip', types[this.itemCard.category]);\r\n }\r\n\r\n /**\r\n * This is used to determine the icon shown at the top left of a card.\r\n * It is based on the ItemCard's item_type property, or the type of\r\n * the item in Canvas. (i.e. Page)\r\n * @returns {string} The icon title to use to display the icon.\r\n */\r\n getTypeIcon() {\r\n const typeIcons = {\r\n 'pages': 'insert_drive_file',\r\n 'assignments': 'assignment',\r\n 'discussions': 'question_answer',\r\n 'files': 'attach_file',\r\n 'folders': 'folder',\r\n 'quizzes': 'gavel',\r\n 'quizQuestions': 'help_outline',\r\n 'modules': 'view_agenda',\r\n 'moduleItems': 'view_list',\r\n };\r\n return typeIcons[this.itemCard.category];\r\n }\r\n\r\n /**\r\n * This is used in place of typical anchors. It will look scroll to the issue card selected from the itemCard card\r\n * @param itemCardId Provides the itemCard's id that helps form the issue card's id for the anchor tag to work\r\n * @param i Provides the index of the issue in ItemCard.issues[] to help form the unique id for the issue card\r\n */\r\n viewIssueCard(itemCardId, i) {\r\n const el = document.getElementById(`${itemCardId}-${i}`);\r\n el.scrollIntoView();\r\n }\r\n}\r\n","module.exports = \"/* Container for the issue-list element */\\r\\n\\r\\n.issueList {\\r\\n width: var(--issueList-width);\\r\\n box-sizing: border-box;\\r\\n padding: 0 15px;\\r\\n}\\r\\n\\r\\n/* The container for all of the issue items */\\r\\n\\r\\n.issueList__list {\\r\\n max-height: calc(100vh - var(--header-height) - var(--toolView-titleBar-height));\\r\\n overflow-y: auto;\\r\\n padding-right: var(--scrollbar-offset);\\r\\n}\\r\\n\\r\\n/* The message that appears if no issue items are avaiable */\\r\\n\\r\\n.noIssuesMessage {\\r\\n color: var(--ashen);\\r\\n position: absolute;\\r\\n width: 100vw;\\r\\n padding-top: 200px;\\r\\n z-index: 100;\\r\\n font-size: 30px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.noIssuesMessage i { \\r\\n font-size: 40px;\\r\\n}\"","module.exports = \"
\\r\\n

\\r\\n Items\\r\\n ({{courseService.selectedCourse && courseService.selectedCourse.itemCards ? courseService.selectedCourse.itemCards.length\\r\\n : 0}})\\r\\n

\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n No issues were discovered in this course.\\r\\n
\\r\\n tag_faces\\r\\n
\\r\\n
\\r\\n
\\r\\n

This course failed to process.

\\r\\n Please contact a Katana developer with the tool name and course ID.\\r\\n
\\r\\n sentiment_very_dissatisfied\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\"","import { Component, ViewChild, ElementRef } from '@angular/core';\r\nimport { CourseService } from '../../course.service';\r\nimport { ItemCard } from '../../interfaces';\r\n\r\n/**\r\n * Display for the list of {@link ItemCard}s in the currently selected course.\r\n */\r\n@Component({\r\n selector: 'app-item-list',\r\n templateUrl: './item-list.component.html',\r\n styleUrls: ['./item-list.component.css']\r\n})\r\nexport class ItemListComponent {\r\n\r\n /** Element reference to the issue list. */\r\n @ViewChild('issueList') issueListEl: ElementRef;\r\n\r\n /** The number of {@link ItemCard}s currently loaded in the list. Used for lazy loading. */\r\n itemCardCount = 15;\r\n\r\n /**\r\n * Constructor\r\n * @param courseService Provides information and management for selected courses.\r\n */\r\n constructor(public courseService: CourseService) {\r\n this.courseService.courseChange.subscribe(() => {\r\n this.itemCardCount = 15;\r\n this.issueListEl.nativeElement.scrollTop = 0;\r\n });\r\n }\r\n\r\n /**\r\n * Runs as the user scrolls down the list. If the user reaches near the bottom of the list, it will\r\n * load more {@link ItemCard}s into the list. This is, essentially, lazy loading. It helps prevent\r\n * poor load times with massive amounts of ItemCards, but does cause a little bit of stuttering.\r\n */\r\n onScroll() {\r\n const maxScrollTop = this.issueListEl.nativeElement.scrollHeight - this.issueListEl.nativeElement.clientHeight;\r\n if (maxScrollTop - this.issueListEl.nativeElement.scrollTop < 500) {\r\n if (this.courseService.selectedCourse.itemCards.length > this.itemCardCount) {\r\n this.itemCardCount += 15;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Provides {@link ItemCard}s to load into the list as {@link IssueCard}s, based on the\r\n * number allowed (itemCardCount).\r\n */\r\n getItemCards(): ItemCard[] {\r\n if (this.courseService.selectedCourse.itemCards.length < this.itemCardCount) {\r\n return this.courseService.selectedCourse.itemCards;\r\n } else {\r\n return this.courseService.selectedCourse.itemCards.slice(0, this.itemCardCount);\r\n }\r\n }\r\n}\r\n","module.exports = \"/* A container for a single issue */\\r\\n\\r\\n.issueContainer {\\r\\n box-sizing: border-box;\\r\\n border: solid 1px var(--background-light);\\r\\n border-bottom: none;\\r\\n -webkit-animation: 0.5s fadeIn;\\r\\n animation: 0.5s fadeIn;\\r\\n margin-right: var(--scrollbar-offset);\\r\\n}\\r\\n\\r\\n/* Overwrites the card class from materialize */\\r\\n\\r\\n.issueContainer.card {\\r\\n border-radius: 2px;\\r\\n}\\r\\n\\r\\n/* Overwrites the card content class from materialize */\\r\\n\\r\\n.issueContainer.card .card-content {\\r\\n padding: 20px;\\r\\n}\\r\\n\\r\\n.issueContainer.card .card-action a {\\r\\n width: 141px;\\r\\n text-align: center;\\r\\n margin: 0;\\r\\n padding: 0 15px;\\r\\n border-radius: 0;\\r\\n}\\r\\n\\r\\n/* Overwrites materialize button focus so it doesn't show up on the issue cards */\\r\\n\\r\\n.btn-flat:focus {\\r\\n background-color: none !important;\\r\\n}\\r\\n\\r\\n.card .card-action {\\r\\n background-color: transparent !important;\\r\\n border-top: none;\\r\\n}\\r\\n\\r\\n.issueContainer.card .card-content>h2:first-of-type {\\r\\n padding-top: 0;\\r\\n}\\r\\n\\r\\n.card .card-action>button {\\r\\n width: 175px;\\r\\n margin-right: 15px;\\r\\n}\\r\\n\\r\\n.option__text {\\r\\n padding: 0 10px;\\r\\n}\"","module.exports = \"
\\r\\n\\r\\n
\\r\\n

{{issue.title}}

\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n

{{option.title}}

\\r\\n
{{option.description}}
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n
\\r\\n FIXED {{toolService.selectedTool.fixedMessage ? ' - ' + toolService.selectedTool.fixedMessage : ''}}\\r\\n
\\r\\n
\\r\\n FAILED - Please contact a Katana developer with the course ID, item name, and issue title.\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\"","import { Component, OnInit, Input, ViewChild, ElementRef } from '@angular/core';\r\nimport { CourseService } from '../../course.service'; // Being used in issue-container.component.html (i.e. DO NOT DELETE)\r\nimport { ToolService } from '../../tool.service';\r\nimport { Issue } from '../../interfaces';\r\nimport { OptionModel } from '../../classes';\r\n\r\n/**\r\n * Container for the display of a single {@link Issue}.\r\n */\r\n@Component({\r\n selector: 'app-result-card',\r\n templateUrl: './result-card.component.html',\r\n styleUrls: ['./result-card.component.css']\r\n})\r\nexport class ResultCardComponent implements OnInit {\r\n /** The issue attached to the display. */\r\n @Input('issue') issue: Issue;\r\n\r\n /** The index of the item's issues array the issue is at. */\r\n @Input('index') index: number;\r\n\r\n /** Element reference to the card containing details about the issue. */\r\n @ViewChild('issueDetails') issueDetails: ElementRef;\r\n\r\n /** A reference to the code editor element for the respective issue. */\r\n @ViewChild('codeEditor') codeEditor: ElementRef;\r\n\r\n /**\r\n * Constructor\r\n * @param toolService Provides information and management for available tools.\r\n * @param courseService Provides information and management for selected courses.\r\n * Being used in issue-container.component.html (i.e. DO NOT DELETE)\r\n */\r\n constructor(public toolService: ToolService,\r\n public courseService: CourseService) { }\r\n\r\n /**\r\n * Fired when the component is initialized, this manages the item's display.\r\n * It inserts the form for the {@link Issue}'s {@link FixOption}s if available.\r\n */\r\n ngOnInit() {\r\n this.issueDetails.nativeElement.innerHTML = this.issue.display;\r\n this.issue.optionModel = new OptionModel(this.toolService.selectedTool.fixOptions);\r\n this.issue.formGroup = this.issue.optionModel.toGroup();\r\n\r\n // Update option values if there are values saved for any options\r\n if (this.issue.tempValues) {\r\n Object.keys(this.issue.tempValues).forEach(optionKey => {\r\n const control = this.issue.formGroup.get(optionKey);\r\n control.setValue(this.issue.tempValues[optionKey], { onlySelf: true });\r\n control.updateValueAndValidity();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Using the {@link Tab}s provided by the Node Tool, builds\r\n * useable tab objects for each issue.\r\n * @returns {Object[]} The tabs to use to build the editor instance.\r\n */\r\n buildEditorTabs() {\r\n if (!this.toolService.selectedTool.editorTabs) { return; }\r\n return this.toolService.selectedTool.editorTabs.map(editorTab => {\r\n return {\r\n title: editorTab.title,\r\n htmlString: this.issue.html[editorTab.htmlKey],\r\n readOnly: editorTab.readOnly\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Sets the status of the issue.\r\n * @param newStatus The new status to set the issue to.\r\n */\r\n setIssueStatus(newStatus) {\r\n // if the status is already 'fixed', don't change it or do anything\r\n if (this.issue.status === 'fixed') {\r\n return;\r\n } else if (newStatus === this.issue.status) {\r\n this.issue.status = 'untouched';\r\n } else {\r\n this.issue.status = newStatus;\r\n }\r\n // check if you need to move to the next itemCard or not\r\n this.getNextItem();\r\n }\r\n\r\n /**\r\n * Checks if all of the issue status's have been set\r\n * then it sets the selectedItemCard to the next one in the list automatically\r\n */\r\n getNextItem() {\r\n // check if there are any issues that are still untouched on the canvas item\r\n const untouched = this.courseService.selectedItemCard.issues.find(issue => issue.status === 'untouched');\r\n // if there are no more untouched issues, move to the next canvas item automatically\r\n if (!untouched) {\r\n // get the index of the selectedItemCard in the selected course's itemCards array\r\n const index = this.courseService.selectedCourse.itemCards.indexOf(this.courseService.selectedItemCard);\r\n // if you are not on the last itemCard, then move to the next one\r\n if (index <= this.courseService.selectedCourse.itemCards.length) {\r\n this.courseService.selectedItemCard = this.courseService.selectedCourse.itemCards[index + 1];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Determines the classes used to style buttons based on the\r\n * current status of the issue they belong to.\r\n * @param {string} desiredStatus What status the issue current is.\r\n * @param {string} elType Either \"button\" or \"icon\".\r\n * @returns {string} The classes to apply to the element.\r\n */\r\n getButtonClasses(desiredStatus: string, elType: string) {\r\n let classes = '';\r\n if (elType === 'button') {\r\n classes += 'waves-effect waves btn white';\r\n }\r\n if (this.issue.status !== 'untouched' && this.issue.status !== desiredStatus) {\r\n classes += ' text-lighten-4';\r\n } else if (desiredStatus === 'approved') {\r\n classes += ' text-accent-4';\r\n } else if (desiredStatus === 'skipped') {\r\n classes += ' text-darken-2';\r\n }\r\n return classes;\r\n }\r\n\r\n /**\r\n * Manages the validity of the form on each keystroke.\r\n * @param optionKey The key of the option this came from.\r\n */\r\n onChange(optionKey) {\r\n if (['untouched', 'fixed', 'failed'].includes(this.issue.status)) {\r\n this.issue.status = 'untouched';\r\n }\r\n if (!this.issue.tempValues) {\r\n this.issue.tempValues = {};\r\n }\r\n this.issue.tempValues[optionKey] = this.issue.formGroup.value[optionKey];\r\n }\r\n\r\n /**\r\n * Returns whether or not the item's status is fixed or failed.\r\n * @returns {boolean} Whether or not this issue's status is fixed or failed.\r\n */\r\n isFixed() {\r\n return ['fixed', 'failed'].includes(this.issue.status);\r\n }\r\n\r\n /**\r\n * Since Object.keys does not work in angular templating, this is\r\n * a workaround. It checks if the issue has any HTML to display in\r\n * the editor. Used by the app-code-editor tag to determine if it\r\n * should display.\r\n */\r\n showEditor() {\r\n return Object.keys(this.issue.html).length > 0;\r\n }\r\n}\r\n","module.exports = \"/* The container for all issue-container elements */\\r\\n\\r\\n.issueDetails {\\r\\n width: calc(100vw - var(--issueList-width));\\r\\n max-height: calc(100vh - var(--header-height));\\r\\n padding: 0 15px 0 0;\\r\\n}\\r\\n\\r\\n/* The header for issue-details */\\r\\n\\r\\n.issueDetails__header {\\r\\n box-sizing: border-box;\\r\\n font-size: 20px;\\r\\n height: var(--toolView-titleBar-height);\\r\\n line-height: var(--toolView-titleBar-height);\\r\\n padding: 0 10px;\\r\\n}\\r\\n\\r\\n/* The currently selected item's title */\\r\\n\\r\\n.issueDetails__itemTitle {\\r\\n background-color: var(--cobalt);\\r\\n margin-left: 15px;\\r\\n font-size: 20px;\\r\\n}\\r\\n\\r\\n/* The box that holds all of the issue-container elements */\\r\\n\\r\\n.issueDetails__issueBox {\\r\\n box-sizing: border-box;\\r\\n overflow-x: hidden;\\r\\n overflow: auto;\\r\\n max-height: calc(100vh - (var(--header-height) + 52px));\\r\\n}\"","module.exports = \"
\\r\\n

\\r\\n Results\\r\\n

\\r\\n {{this.courseService.selectedItemCard ? this.courseService.selectedItemCard.title : ''}}\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\"","import { Component } from '@angular/core';\r\nimport { CourseService } from '../../course.service'; // Being used in issue-details.component.html (i.e. DO NOT DELETE)\r\n\r\n/**\r\n * Container for all {@link IssueContainerComponent}s used to display\r\n * issues within the currently selected {@link ItemCard}.\r\n */\r\n@Component({\r\n selector: 'app-result-list',\r\n templateUrl: './result-list.component.html',\r\n styleUrls: ['./result-list.component.css']\r\n})\r\nexport class ResultListComponent {\r\n /**\r\n * Constructor\r\n * @param courseService Provides information and management for selected courses.\r\n * Being used in issue-details.component.html (i.e. DO NOT DELETE)\r\n */\r\n constructor(public courseService: CourseService) { }\r\n}\r\n","module.exports = \".statBadge {\\r\\n height: 36px;\\r\\n line-height: 36px;\\r\\n border-radius: 36px;\\r\\n display: inline-flex;\\r\\n margin: 5px 0;\\r\\n}\\r\\n\\r\\n.statBadge>div {\\r\\n display: inline-flex;\\r\\n}\\r\\n\\r\\n.statBadge__title {\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.left-side {\\r\\n padding: 0 15px 0 10px;\\r\\n}\\r\\n\\r\\n.right-side {\\r\\n padding: 0 10px 0 15px;\\r\\n}\\r\\n\\r\\n.statBadge__count {\\r\\n height: 38px;\\r\\n min-width: 38px;\\r\\n margin: -1px -1px 0 0;\\r\\n line-height: 38px;\\r\\n font-size: 18px;\\r\\n font-weight: bold;\\r\\n border-radius: 38px;\\r\\n background-color: white;\\r\\n text-align: center;\\r\\n padding: 0 5px;\\r\\n}\"","module.exports = \"
\\r\\n\\r\\n
\\r\\n
\\r\\n {{statTitle}}\\r\\n
\\r\\n
\\r\\n {{statCount || '--'}}\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n {{statCount || '--'}}\\r\\n
\\r\\n
\\r\\n {{statTitle}}\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\"","import { Component, Input } from '@angular/core';\r\n\r\n/**\r\n * Displays a single number and title in a pill container.\r\n */\r\n@Component({\r\n selector: 'app-stat-badge',\r\n templateUrl: './stat-badge.component.html',\r\n styleUrls: ['./stat-badge.component.css']\r\n})\r\nexport class StatBadgeComponent {\r\n /**\r\n * The title to display on the pill.\r\n */\r\n @Input('statTitle') statTitle: string;\r\n /**\r\n * The number to display.\r\n */\r\n @Input('statCount') statCount: number;\r\n /**\r\n * The color of the title.\r\n */\r\n @Input('titleColor') titleColor: string = 'white';\r\n /**\r\n * The side of the pill the number should be display on.\r\n */\r\n @Input('side') side: string = 'right';\r\n\r\n /**\r\n * Constructor\r\n */\r\n constructor() { }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MaterializeModule } from 'angular2-materialize';\r\nimport { RouterModule } from '@angular/router';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { ItemListComponent } from './item-list/item-list.component';\r\nimport { ItemCardComponent } from './item-card/item-card.component';\r\nimport { ResultListComponent } from './result-list/result-list.component';\r\nimport { IssueNavComponent } from './issue-nav/issue-nav.component';\r\nimport { ResultCardComponent } from './result-card/result-card.component';\r\nimport { ToolViewComponent } from './tool-view/tool-view.component';\r\nimport { StatBadgeComponent } from './stat-badge/stat-badge.component';\r\nimport { CodeEditorComponent } from './code-editor/code-editor.component';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n RouterModule,\r\n MaterializeModule,\r\n FormsModule,\r\n ReactiveFormsModule\r\n ],\r\n exports: [\r\n FormsModule,\r\n ReactiveFormsModule\r\n ],\r\n declarations: [\r\n ItemListComponent,\r\n ItemCardComponent,\r\n ResultListComponent,\r\n IssueNavComponent,\r\n ResultCardComponent,\r\n ToolViewComponent,\r\n StatBadgeComponent,\r\n CodeEditorComponent,\r\n ]\r\n})\r\nexport class ToolPageModule { }\r\n","module.exports = \".statContainer {\\r\\n position: absolute;\\r\\n bottom: 0;\\r\\n left: 0;\\r\\n z-index: 10;\\r\\n padding: 20px;\\r\\n}\\r\\n\\r\\n.statContainer>div {\\r\\n width: 50%;\\r\\n}\\r\\n\\r\\napp-stat-badge>div {\\r\\n margin: 5px 0;\\r\\n}\\r\\n\\r\\n.issueContainer {\\r\\n margin-top: var(--header-height);\\r\\n display: flex;\\r\\n}\\r\\n\\r\\n.progress {\\r\\n background-color: var(--cobalt);\\r\\n position: absolute;\\r\\n bottom: 0;\\r\\n left: 0;\\r\\n width: 100vw;\\r\\n height: 5px;\\r\\n margin: 0;\\r\\n z-index: 9999;\\r\\n}\\r\\n\\r\\n.progress + div {\\r\\n font-size: 28px;\\r\\n padding: 50px;\\r\\n text-align: center;\\r\\n margin-top: 250px;\\r\\n}\\r\\n\\r\\n.indeterminate {\\r\\n background-color: var(--ashen);\\r\\n}\"","module.exports = \"
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n {{settingsService.checkLocalStorage('goofMessages') ? settingsService.buildProcessingMessage() : toolService.processingMessage}}\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\"","import { Component } from '@angular/core';\r\nimport { CourseService } from '../../course.service';\r\nimport { ToolService } from '../../tool.service';\r\nimport { SettingsService } from '../../settings.service';\r\n\r\n/**\r\n * Container for the tool view.\r\n */\r\n@Component({\r\n selector: 'app-tool-view',\r\n templateUrl: './tool-view.component.html',\r\n styleUrls: ['./tool-view.component.css']\r\n})\r\nexport class ToolViewComponent {\r\n\r\n /**\r\n * Constructor\r\n * @param courseService Provides information and management for the currently selected courses.\r\n * @param toolService Provides information and management for available tools.\r\n * @param settingsService Provides this component with access to user settings.\r\n */\r\n constructor(public courseService: CourseService,\r\n public toolService: ToolService,\r\n public settingsService: SettingsService) { }\r\n\r\n /**\r\n * Determines the current total count of issues from all selected courses\r\n * discovered by the currently selected tool.\r\n */\r\n getIssueCount() {\r\n return this.courseService.courses.reduce((acc, course) => {\r\n if (!course.itemCards) { return acc; }\r\n return acc += course.itemCards.reduce((acc2, itemCard) => {\r\n if (!itemCard.issues) { return acc2; }\r\n return acc2 += itemCard.issues.length;\r\n }, 0);\r\n }, 0);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { Tool, Category } from './interfaces';\r\n\r\n/**\r\n * The Tool Service contains information and management for\r\n * all tools available from the service. It handles information\r\n * like which tool is currently selected, whether or not the user\r\n * is currently using a tool, and what categories are available to\r\n * the user.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ToolService {\r\n\r\n /**\r\n * The categories available to the user. This will be replaced with\r\n * dynamic generation at a later point.\r\n */\r\n categories = [{\r\n icon: 'code',\r\n title: 'HTML',\r\n toolCategory: 'html'\r\n }, {\r\n icon: 'settings',\r\n title: 'Item Settings',\r\n toolCategory: 'itemSettings'\r\n }];\r\n\r\n /**\r\n * Whether or not a tool is currently doing it's magic.\r\n */\r\n processing = false;\r\n /**\r\n * The message to display on the screen while a tool is processing.\r\n */\r\n processingMessage = '';\r\n /**\r\n * Whether or not the user is currently looking at the tool view.\r\n */\r\n toolViewOpen = false;\r\n\r\n /**\r\n * The list of available tools, as retrieved from the server.\r\n */\r\n toolList: Tool[] = [];\r\n\r\n /**\r\n * The category selected by the user.\r\n */\r\n private _selectedCategory: Category;\r\n /**\r\n * The tool selected by the user.\r\n */\r\n private _selectedTool: Tool;\r\n /**\r\n * The discovery options chosen by the user on the options page for the selected tool.\r\n */\r\n selectedDiscoverOptions;\r\n\r\n get selectedCategory() {\r\n return this._selectedCategory;\r\n }\r\n set selectedCategory(category) {\r\n sessionStorage.selectedCategory = category.title;\r\n this._selectedCategory = category;\r\n }\r\n\r\n get selectedTool() {\r\n return this._selectedTool;\r\n }\r\n set selectedTool(tool) {\r\n sessionStorage.selectedTool = tool.id;\r\n this._selectedTool = tool;\r\n }\r\n\r\n /**\r\n * Constructor\r\n * @param router Used to navigate the user as needed.\r\n */\r\n constructor(private router: Router) {\r\n\r\n const loc = window.location.href;\r\n\r\n if (loc.includes('options') && !this._selectedTool && sessionStorage.selectedTool) {\r\n this._selectedTool = this.toolList.find(tool => tool.id === sessionStorage.selectedTool);\r\n }\r\n\r\n if (loc.includes('tools') && !this._selectedCategory && sessionStorage.selectedCategory) {\r\n this._selectedCategory = this.categories.find(category => category.title === sessionStorage.selectedCategory);\r\n }\r\n\r\n // I don't feel like this is the right place for this...\r\n if (loc.includes('options') && !this._selectedTool) {\r\n router.navigate(['/']);\r\n }\r\n\r\n // I don't feel like this is the right place for this...\r\n if (loc.includes('tools') && !this._selectedCategory) {\r\n router.navigate(['/']);\r\n }\r\n }\r\n}\r\n","// This file can be replaced during build by using the `fileReplacements` array.\r\n// `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`.\r\n// The list of file replacements can be found in `angular.json`.\r\n\r\n/**\r\n * @ignore\r\n */\r\nexport const environment = {\r\n production: false\r\n};\r\n\r\n/*\r\n * In development mode, to ignore zone related error stack frames such as\r\n * `zone.run`, `zoneDelegate.invokeTask` for easier debugging, you can\r\n * import the following file, but please comment it out in production mode\r\n * because it will have performance impact when throw error\r\n */\r\n// import 'zone.js/dist/zone-error'; // Included with Angular CLI.\r\n","import { enableProdMode } from '@angular/core';\r\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\r\n\r\nimport { AppModule } from './app/app.module';\r\nimport { environment } from './environments/environment';\r\n\r\nif (environment.production) {\r\n enableProdMode();\r\n}\r\n\r\nplatformBrowserDynamic().bootstrapModule(AppModule)\r\n .catch(err => console.log(err));\r\n"],"sourceRoot":""}