();\r\n\r\n\tprivate _subscriptions = new Subscription();\r\n\r\n\tconstructor(private _profileService: UserProfileService, private _authService: AuthService, private _permissionService: PermissionService, private _articleService: ArticleService, private _messageService: MessageService) {\r\n\t}\r\n\r\n\tngOnInit(): void {\r\n\t\tthis._subscriptions.add(\r\n\t\t\tthis._authService.isAuthenticated()\r\n\t\t\t\t.subscribe((result) => {\r\n\t\t\t\t\tif (result) {\r\n\t\t\t\t\t\tthis._profileService\r\n\t\t\t\t\t\t\t.getMyProfile()\r\n\t\t\t\t\t\t\t.subscribe(\r\n\t\t\t\t\t\t\t\tprofile => {\r\n\t\t\t\t\t\t\t\t\tthis.profile = profile;\r\n\t\t\t\t\t\t\t\t\tthis.checkPermissions();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\tthis._messageService.getMessages().subscribe(response => {\r\n\t\t\t\t\t\t\tfor (var i = 0; i < response.length; i++) {\r\n\t\t\t\t\t\t\t\tthis.announcementMessages.push(response[i]);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n\tpublic logOut(): void {\r\n\t\tthis._authService.logout();\r\n\t}\r\n\r\n\tprivate checkPermissions(): void {\r\n\t\tthis._subscriptions.add(\r\n\t\t\tthis._permissionService.hasPermission([\"compose-internal-articles\", \"compose-public-articles\", \"compose-private-articles\"])\r\n\t\t\t\t.subscribe(response => {\r\n\t\t\t\t\tthis.manageArticles = response;\r\n\t\t\t\t})\r\n\t\t);\r\n\r\n\t\tthis._subscriptions.add(\r\n\t\t\tthis._permissionService.hasPermission([\"view-reports\"])\r\n\t\t\t\t.subscribe(response => {\r\n\t\t\t\t\tthis.viewReports = response;\r\n\t\t\t\t})\r\n\t\t);\r\n\r\n\t\tthis._subscriptions.add(\r\n\t\t\tthis._permissionService.hasPermission([\"view-solution-admin-reports\"])\r\n\t\t\t\t.subscribe(response => {\r\n\t\t\t\t\tthis.viewAdminReports = response;\r\n\t\t\t\t})\r\n\t\t);\r\n\r\n\t\tthis._subscriptions.add(\r\n\t\t\tthis._permissionService.hasPermission([\"manage-classification\"])\r\n\t\t\t\t.subscribe(response => {\r\n\t\t\t\t\tthis.manageClassification = response;\r\n\t\t\t\t})\r\n\t\t);\r\n\r\n\t\tthis._subscriptions.add(\r\n\t\t\tthis._permissionService.hasPermission([\"manage-application-admin-tools\"])\r\n\t\t\t\t.subscribe(response => {\r\n\t\t\t\t\tthis.adminTools = response;\r\n\t\t\t\t})\r\n\t\t);\r\n\r\n\t\tthis._subscriptions.add(\r\n\t\t\tthis._articleService.getViews()\r\n\t\t\t\t.subscribe(response => {\r\n\t\t\t\t\tthis.showTeamPendingApproval = !!response.filter(x => x.key == \"teampendingapproval\").length;\r\n\t\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n\tngOnDestroy(): void {\r\n\t\tthis._subscriptions.unsubscribe();\r\n\t}\r\n\r\n}\r\n","module.exports = \"Oops!
\\r\\nWe can't seem to find the page you're looking for.
\\r\\nHere are some helpful links instead:
\\r\\n\\r\\n\\t- Home
\\r\\n\\t- Search
\\r\\n
\\r\\n\"","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL2NvcmUvY29tcG9uZW50cy9ub3QtZm91bmQvbm90LWZvdW5kLmNvbXBvbmVudC5zY3NzIn0= */\"","import { Component, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n\tselector: 'app-not-found',\r\n\ttemplateUrl: './not-found.component.html',\r\n\tstyleUrls: ['./not-found.component.scss']\r\n})\r\nexport class NotFoundComponent {\r\n}\r\n","var req = require(\"!!C:\\\\Users\\\\mjoshi\\\\source\\\\repos\\\\Alexandria\\\\Alexandria\\\\Alexandria.Website\\\\ClientApp\\\\node_modules\\\\pug-loader\\\\index.js!C:\\\\Users\\\\mjoshi\\\\source\\\\repos\\\\Alexandria\\\\Alexandria\\\\Alexandria.Website\\\\ClientApp\\\\src\\\\app\\\\core\\\\components\\\\sales-home\\\\sales-home.component.pug\");\nmodule.exports = (req['default'] || req).apply(req, [])","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL2NvcmUvY29tcG9uZW50cy9zYWxlcy1ob21lL3NhbGVzLWhvbWUuY29tcG9uZW50LnNjc3MifQ== */\"","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n\tselector: 'app-sales-home',\r\n\ttemplateUrl: './sales-home.component.pug',\r\n\tstyleUrls: ['./sales-home.component.scss']\r\n})\r\nexport class SalesHomeComponent {\r\n\r\n\tconstructor() { }\r\n\r\n}\r\n","var req = require(\"!!C:\\\\Users\\\\mjoshi\\\\source\\\\repos\\\\Alexandria\\\\Alexandria\\\\Alexandria.Website\\\\ClientApp\\\\node_modules\\\\pug-loader\\\\index.js!C:\\\\Users\\\\mjoshi\\\\source\\\\repos\\\\Alexandria\\\\Alexandria\\\\Alexandria.Website\\\\ClientApp\\\\src\\\\app\\\\core\\\\components\\\\user-profile\\\\user-profile.component.pug\");\nmodule.exports = (req['default'] || req).apply(req, [])","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL2NvcmUvY29tcG9uZW50cy91c2VyLXByb2ZpbGUvdXNlci1wcm9maWxlLmNvbXBvbmVudC5zY3NzIn0= */\"","import { Component, OnInit, PACKAGE_ROOT_URL } from '@angular/core';\r\nimport { FormArray, FormControl, FormGroup, FormBuilder, Validators } from '@angular/forms';\r\n\r\nimport { UserProfileService } from '../../services/user-profiles/user-profile.service';\r\nimport { RolesService } from '../../services/roles/roles.service';\r\nimport { PermissionService } from '../../services/permissions/permission.service';\r\n\r\nimport { UserProfile } from '../../models/user-profiles/user-profile.model';\r\nimport { Role } from '../../models/roles/role.model';\r\nimport { Permission } from '../../models/permissions/permission.model';\r\n\r\nimport { UserProfileUpdate } from '../../models/user-profiles/user-profile-update.model';\r\nimport { forkJoin } from 'rxjs';\r\n\r\n@Component({\r\n\tselector: 'app-user-profile',\r\n\ttemplateUrl: './user-profile.component.pug',\r\n\tstyleUrls: ['./user-profile.component.scss']\r\n})\r\nexport class UserProfileComponent implements OnInit {\r\n\r\n\tpublic profileForm: FormGroup;\r\n\r\n\tpublic profile: UserProfile;\r\n\r\n\tpublic roles: Array;\r\n\r\n\tpublic roleSubscriptions: Array = [];\r\n\r\n\tpublic managedRoles: Array = [];\r\n\r\n\tpublic permissions: Array;\r\n\r\n\tpublic profileUpdated: boolean = false;\r\n\r\n\tconstructor(private _fb: FormBuilder, private _profileService: UserProfileService, private _rolesService: RolesService, private _permsService: PermissionService) {\r\n\t\tthis.createForm();\r\n\t}\r\n\r\n\tprivate createForm(): void {\r\n\t\tthis.profileForm = this._fb.group({\r\n\t\t\tsearchDetailsRendering: '',\r\n\t\t\tenableArticleUpVoteNotifications: false,\r\n\t\t\tenableArticleReviewNotifications: false,\r\n\t\t\tdefaultAnonymousVotingComments: false,\r\n\t\t\tdefaultEditorMode: '',\r\n\t\t\thomePage: '',\r\n\t\t\troleSubscriptions: new FormArray([])\r\n\t\t});\r\n\t}\r\n\r\n\tngOnInit() {\r\n\t\tforkJoin(this._profileService.getMyProfile(), this._rolesService.getTeams()).subscribe(response => {\r\n\t\t\tconsole.debug('UserProfileComponent | getMyRoles() | Processing response');\r\n\r\n\t\t\tlet profileResponse = response[0];\r\n\t\t\tthis.profile = profileResponse;\r\n\r\n\t\t\tthis.profileForm.patchValue({\r\n\t\t\t\tsearchDetailsRendering: profileResponse.searchDetailsAction,\r\n\t\t\t\tenableArticleUpVoteNotifications: profileResponse.enableArticleUpVoteNotifications,\r\n\t\t\t\tenableArticleReviewNotifications: profileResponse.enableArticleReviewNotifications,\r\n\t\t\t\tdefaultAnonymousVotingComments: profileResponse.defaultToAnonymousComments,\r\n\t\t\t\tdefaultEditorMode: profileResponse.defaultEditorMode,\r\n\t\t\t\thomePage: profileResponse.homePage\r\n\t\t\t});\r\n\r\n\t\t\tthis.roleSubscriptions = response[1].sort((left, right): number => { return (left.name > right.name) ? 1 : ((right.name > left.name) ? -1 : 0); });\r\n\r\n\t\t\tthis.roleSubscriptions.map((a, i) => {\r\n\t\t\t\t(this.profileForm.controls.roleSubscriptions as FormArray).push(new FormControl(false));\r\n\t\t\t});\r\n\r\n\t\t\t// mark selected controls based on user profile\r\n\t\t\tif (this.profile.userRoleSubscriptions) {\r\n\t\t\t\tthis.profile.userRoleSubscriptions.forEach(mySubscription => {\r\n\t\t\t\t\tlet index = this.roleSubscriptions.findIndex(roleSubscription => roleSubscription.id === mySubscription.roleId);\r\n\t\t\t\t\tif (index >= 0) {\r\n\t\t\t\t\t\t(this.profileForm.controls.roleSubscriptions as FormArray).controls[index].patchValue(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// mark controls that have membershipmanaged to disabled\r\n\t\t\t\tvar managedRoles = this.profile.userRoleSubscriptions.filter(r => r.isMembershipManaged === true);\r\n\t\t\t\tmanagedRoles.forEach(managedSubscription => {\r\n\t\t\t\t\tlet index = this.roleSubscriptions.findIndex(roleSubscription => roleSubscription.id === managedSubscription.roleId);\r\n\t\t\t\t\tif (index >= 0) {\r\n\t\t\t\t\t\t(this.profileForm.controls.roleSubscriptions as FormArray).controls[index].disable();\r\n\t\t\t\t\t\tthis.managedRoles.push(this.roleSubscriptions[index]);\r\n\t\t\t\t\t\t//console.log((this.profileForm.controls.userRoles as FormArray).controls[index].value);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t})\r\n\r\n\t\tthis._rolesService.getMyRoles()\r\n\t\t\t.subscribe(result => {\r\n\t\t\t\tconsole.debug('UserProfileComponent | getMyProfile() | Processing response');\r\n\r\n\t\t\t\tthis.roles = result.sort((left, right): number => { return (left.name > right.name) ? 1 : ((right.name > left.name) ? -1 : 0); });\r\n\r\n\t\t\t\tthis.roles.forEach(role => {\r\n\t\t\t\t\trole.permissions = role.permissions.sort((left, right): number => { return (left.name > right.name) ? 1 : ((right.name > left.name) ? -1 : 0); });\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\tthis._permsService.getMyPermissions()\r\n\t\t\t.subscribe(result => {\r\n\t\t\t\tconsole.debug('UserProfileComponent | getMyPermissions() | Processing response');\r\n\r\n\t\t\t\tthis.permissions = result.sort((left, right): number => { return (left.name > right.name) ? 1 : ((right.name > left.name) ? -1 : 0); });\r\n\t\t\t});\r\n\t}\r\n\r\n\tpublic onSubmit() {\r\n\t\tthis.profileUpdated = false;\r\n\r\n\t\tconst data = this.profileForm.value;\r\n\r\n\t\tlet rolesSubscriptionVm = new Array();\r\n\t\tfor (var i = 0; i < (this.profileForm.controls.roleSubscriptions as FormArray).controls.length; i++) {\r\n\t\t\tif ((this.profileForm.controls.roleSubscriptions as FormArray).controls[i].value) {\r\n\t\t\t\trolesSubscriptionVm.push(this.roleSubscriptions[i].id);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet vm: UserProfileUpdate = {\r\n\t\t\tid: this.profile.id,\r\n\t\t\tsearchDetailsAction: data.searchDetailsRendering,\r\n\t\t\tenableArticleUpVoteNotifications: data.enableArticleUpVoteNotifications,\r\n\t\t\tenableArticleReviewNotifications: data.enableArticleReviewNotifications,\r\n\t\t\tdefaultToAnonymousComments: data.defaultAnonymousVotingComments,\r\n\t\t\tdefaultEditorMode: data.defaultEditorMode,\r\n\t\t\thomePage: data.homePage,\r\n\t\t\tsubscriptions: rolesSubscriptionVm\r\n\t\t};\r\n\r\n\t\tthis.profileForm.disable();\r\n\r\n\t\tthis._profileService.updateMyProfile(vm)\r\n\t\t\t.subscribe(profile => {\r\n\t\t\t\t// successful update returns full (and updated) profile\r\n\t\t\t\tthis.profile = profile;\r\n\r\n\t\t\t\tthis.profileForm.enable();\r\n\r\n\t\t\t\tthis.profileForm.patchValue({\r\n\t\t\t\t\tsearchDetailsRendering: profile.searchDetailsAction,\r\n\t\t\t\t\tenableArticleUpVoteNotifications: profile.enableArticleUpVoteNotifications,\r\n\t\t\t\t\tenableArticleReviewNotifications: profile.enableArticleReviewNotifications,\r\n\t\t\t\t\tdefaultAnonymousVotingComments: profile.defaultToAnonymousComments,\r\n\t\t\t\t\tdefaultEditorMode: profile.defaultEditorMode,\r\n\t\t\t\t\thomePage: profile.homePage\r\n\t\t\t\t});\r\n\r\n\t\t\t\tthis.profileForm.reset(this.profileForm.value);\r\n\r\n\t\t\t\t// mark controls that have membershipmanaged to disabled\r\n\t\t\t\tthis.managedRoles.forEach(managedRole => {\r\n\t\t\t\t\tlet index = this.roleSubscriptions.findIndex(roleSubscription => roleSubscription.id === managedRole.id);\r\n\t\t\t\t\tif (index >= 0) {\r\n\t\t\t\t\t\t(this.profileForm.controls.roleSubscriptions as FormArray).controls[index].disable();\r\n\t\t\t\t\t\tlet roleSubscriptionIndex = this.profile.userRoleSubscriptions.findIndex(mr => mr.roleId === this.roleSubscriptions[index].id);\r\n\t\t\t\t\t\tthis.profile.userRoleSubscriptions[roleSubscriptionIndex].isMembershipManaged = true;\r\n\t\t\t\t\t\t//console.log((this.profileForm.controls.userRoles as FormArray).controls[index].value);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\tthis.profileUpdated = true;\r\n\t\t\t});\r\n\t}\r\n\r\n}\r\n","// Angular\r\nimport { NgModule, Optional, SkipSelf, ErrorHandler } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport { RouterModule } from '@angular/router';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { ModuleWithProviders } from '@angular/compiler/src/core';\r\n\r\n// 3rd party imports\r\nimport { Ng4LoadingSpinnerModule } from 'ng4-loading-spinner';\r\n\r\nimport { CollapseModule, BsDropdownModule, TabsModule, ModalModule } from 'ngx-bootstrap';\r\n\r\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome';\r\nimport { library } from \"@fortawesome/fontawesome-svg-core\";\r\nimport { faShare, faThumbsDown, faThumbsUp, faSync, faBooks, faQuestion, faEdit, faCog, faCogs, faBell, faPhone, faUser, faComment, faGlobe, faEnvelope, faBriefcase, faExchange, faCode, faSmile, faFrown, faRoad, faCompressAlt, faExpandAlt, faEye, faTrashAlt, faSlidersH } from \"@fortawesome/pro-solid-svg-icons\";\r\n\r\nimport { MomentModule } from 'ngx-moment';\r\n\r\n// *** App\r\n\r\n// Modules\r\nimport { SharedModule } from '../shared/shared.module';\r\nimport { ContentViewerModule } from '../modules/content-viewer/content-viewer.module';\r\nimport { ContentManagerModule } from '../modules/content-manager/content-manager.module';\r\nimport { SearchModule } from '../modules/search/search.module';\r\nimport { ReportsModule } from '../modules/reports/reports.module';\r\nimport { ClassificationModule } from '../modules/classification/classification.module';\r\nimport { AdminModule } from '../modules/admin/admin.module';\r\n\r\n// Components\r\nimport { NotFoundComponent } from './components/not-found/not-found.component';\r\nimport { AlertComponent } from \"./components/alert/alert.component\";\r\nimport { AuthCallbackComponent } from './components/auth-callback/auth-callback.component';\r\nimport { NavMenuComponent } from './components/nav-menu/nav-menu.component';\r\nimport { HomeComponent } from './components/home/home.component';\r\nimport { EngineeringHomeComponent } from './components/engineering-home/engineering-home.component';\r\nimport { SalesHomeComponent } from './components/sales-home/sales-home.component';\r\nimport { UserProfileComponent } from './components/user-profile/user-profile.component';\r\n\r\n// Services\r\nimport { AuthPermissionsGuard } from './services/permissions/auth-permissions.guard';\r\nimport { LoggingService } from './services/logging/logging.service';\r\nimport { PermissionService } from './services/permissions/permission.service';\r\nimport { UserProfileService } from './services/user-profiles/user-profile.service';\r\nimport { ErrorHandlerService } from './services/logging/error.handler.service';\r\nimport { PeriodService } from './services/periods/period.service';\r\nimport { ArticleService } from './services/articles/article.service';\r\nimport { SearchService } from './services/searches/search.service';\r\nimport { AlertService } from './services/alert/alert.service';\r\nimport { CommentService } from './services/comments/comment.service';\r\nimport { RolesService } from './services/roles/roles.service';\r\nimport { ApplicationService } from './services/applications/application.service';\r\nimport { ApplicationVersionsService } from './services/application-versions/application-versions.service';\r\nimport { CategoryService } from './services/categories/category.service';\r\nimport { MessageService } from './services/messages/message.service';\r\n\r\n// Interceptors\r\nimport { SpinnerInterceptor } from './interceptors/spinner.interceptor';\r\nimport { HeadersInterceptor } from './interceptors/headers.interceptor';\r\nimport { ErrorInterceptor } from './interceptors/error.interceptor';\r\nimport { CanDeactivateGuard } from './services/can-deactivate/can-deactivate.guard';\nimport { EscalationComponent } from './components/escalation/escalation.component';\r\n\r\nlibrary.add(faShare, faThumbsDown, faThumbsUp, faSync, faBooks, faQuestion, faEdit, faCog, faCogs, faBell, faPhone, faUser, faComment, faGlobe, faEnvelope, faBriefcase, faExchange, faCode, faSmile, faFrown, faRoad, faCompressAlt, faExpandAlt, faEye, faTrashAlt, faSlidersH);\r\n\r\n@NgModule({\r\n\timports: [\r\n\t\tCommonModule,\r\n\t\tRouterModule,\r\n\t\tReactiveFormsModule,\r\n\t\tBrowserAnimationsModule,\r\n\r\n\t\t// ** 3rd Party\r\n\t\tNg4LoadingSpinnerModule.forRoot(),\r\n\r\n\t\tCollapseModule.forRoot(),\r\n\t\tBsDropdownModule.forRoot(),\r\n\t\tTabsModule.forRoot(),\r\n\t\tModalModule.forRoot(),\r\n\t\tFontAwesomeModule,\r\n\t\tMomentModule,\r\n\r\n\t\tTabsModule.forRoot(),\r\n\r\n\t\t// ** App\r\n\r\n\t\t// Modules\r\n\t\tSharedModule,\r\n\t\tContentViewerModule,\r\n\t\tContentManagerModule,\r\n\t\tSearchModule,\r\n\t\tClassificationModule,\r\n\t\tReportsModule,\r\n\t\tAdminModule\r\n\t],\r\n\texports: [\r\n\t\t// ** 3rd Party\r\n\t\tNg4LoadingSpinnerModule,\r\n\r\n\t\t// ** App\r\n\t\tHomeComponent,\r\n\t\tNavMenuComponent,\r\n\t\tNotFoundComponent,\r\n\t\tAlertComponent\r\n\t],\r\n\tdeclarations: [\r\n\t\tNotFoundComponent,\r\n\t\tAlertComponent,\r\n\t\tNavMenuComponent,\r\n\t\tHomeComponent,\r\n\t\tEngineeringHomeComponent,\r\n\t\tSalesHomeComponent,\r\n\t\tUserProfileComponent,\r\n\t\tAuthCallbackComponent,\r\n\t\tEscalationComponent,\r\n\t]\r\n})\r\nexport class CoreModule {\r\n\r\n\tconstructor(@Optional() @SkipSelf() parentModule: CoreModule) {\r\n\t\tif (parentModule) {\r\n\t\t\tthrow new Error('CoreModule is already loaded. Import it into the AppModule only');\r\n\t\t}\r\n\t}\r\n\r\n\tstatic forRoot(): ModuleWithProviders {\r\n\t\treturn {\r\n\t\t\tngModule: CoreModule,\r\n\t\t\tproviders: [\r\n\t\t\t\t{\r\n\t\t\t\t\tprovide: HTTP_INTERCEPTORS,\r\n\t\t\t\t\tuseClass: SpinnerInterceptor,\r\n\t\t\t\t\tmulti: true\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tprovide: HTTP_INTERCEPTORS,\r\n\t\t\t\t\tuseClass: ErrorInterceptor,\r\n\t\t\t\t\tmulti: true\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tprovide: HTTP_INTERCEPTORS,\r\n\t\t\t\t\tuseClass: HeadersInterceptor,\r\n\t\t\t\t\tmulti: true\r\n\t\t\t\t},\r\n\t\t\t\t// App Singleton Services\r\n\t\t\t\tLoggingService,\r\n\t\t\t\tAlertService,\r\n\t\t\t\tAuthPermissionsGuard,\r\n\t\t\t\tCanDeactivateGuard,\r\n\t\t\t\tPermissionService,\r\n\t\t\t\tUserProfileService,\r\n\t\t\t\tApplicationService,\r\n\t\t\t\tApplicationVersionsService,\r\n\t\t\t\tArticleService,\r\n\t\t\t\tSearchService,\r\n\t\t\t\tPeriodService,\r\n\t\t\t\tCommentService,\r\n\t\t\t\tRolesService,\r\n\t\t\t\t{\r\n\t\t\t\t\tprovide: ErrorHandler,\r\n\t\t\t\t\tuseClass: ErrorHandlerService\r\n\t\t\t\t},\r\n\t\t\t\tCategoryService,\r\n\t\t\t\tMessageService\r\n\t\t\t]\r\n\t\t};\r\n\t}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';\r\n\r\nimport { Observable, of, throwError } from 'rxjs';\r\nimport { retryWhen, concatMap, delay } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class ErrorInterceptor implements HttpInterceptor {\r\n\r\n\tconstructor() {\r\n\t}\r\n\r\n\tintercept(request: HttpRequest, next: HttpHandler): Observable> {\r\n\t\treturn next.handle(request)\r\n\t\t\t.pipe(\r\n\t\t\t\tretryWhen(errors => errors\r\n\t\t\t\t\t.pipe(\r\n\t\t\t\t\t\tconcatMap((error, count) => {\r\n\t\t\t\t\t\t\t// `count` starts at 0\r\n\t\t\t\t\t\t\t// `status` values were chosen based on what `HandleTransientHttpError()` does in **Polly**\r\n\t\t\t\t\t\t\tif (count < 1 && (error.status >= 500 || error.status === 408)) {\r\n\t\t\t\t\t\t\t\treturn of(error.status);\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\treturn throwError(error);\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t\tdelay(500)\r\n\t\t\t\t\t)\r\n\t\t\t\t)\r\n\t\t\t);\r\n\t}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';\r\nimport { Router } from '@angular/router';\r\n\r\nimport { Observable } from 'rxjs';\r\n\r\nimport { AuthService } from '../services/auth/auth.service';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class HeadersInterceptor implements HttpInterceptor {\r\n\r\n\tconstructor(private _authService: AuthService, private _router: Router) {\r\n\t}\r\n\r\n\tintercept(request: HttpRequest, next: HttpHandler): Observable> {\r\n\t\t// for Web API model binding\r\n\t\trequest = request.clone({\r\n\t\t\theaders: request.headers.set('Content-Type', 'application/json')\r\n\t\t});\r\n\r\n\t\t// for authentication\r\n\t\tlet token = this._authService.getAuthorizationHeaderValue();\r\n\r\n\t\tif (token) {\r\n\t\t\trequest = request.clone({\r\n\t\t\t\theaders: request.headers.set('Authorization', token)\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tthis._authService.login(this._router.url);\r\n\t\t\treturn next.handle(request);\r\n\t\t}\r\n\r\n\t\treturn next.handle(request);\r\n\t}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';\r\n\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/internal/operators/map';\r\nimport { finalize } from 'rxjs/operators';\r\n\r\nimport { SpinnerService } from '../services/spinner/spinner.service';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class SpinnerInterceptor implements HttpInterceptor {\r\n\r\n\tconstructor(private _spinnerService: SpinnerService) {\r\n\t}\r\n\r\n\tintercept(request: HttpRequest, next: HttpHandler): Observable> {\r\n\t\tif (!(request.headers.keys().indexOf('X-Hide-Progress') >= 0 && request.headers.get('X-Hide-Progress') == 'true')) {\r\n\t\t\tthis._spinnerService.show(\"Please wait...\");\r\n\t\t}\r\n\r\n\t\treturn next.handle(request)\r\n\t\t\t.pipe(\r\n\t\t\t\tmap(event => {\r\n\t\t\t\t\treturn event;\r\n\t\t\t\t}),\r\n\t\t\t\tfinalize(() => {\r\n\t\t\t\t\tif (!(request.headers.keys().indexOf('X-Hide-Progress') >= 0 && request.headers.get('X-Hide-Progress') == 'true')) {\r\n\t\t\t\t\t\tthis._spinnerService.hide();\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t)\r\n\t}\r\n\r\n}\r\n","import { Version } from \"./version\";\r\n\r\nexport class ParentVersion\r\n\textends Version {\r\n\r\n\tpublic minorVersions = new Array();\r\n\r\n}\r\n","import { ArticleFixedVersion } from \"../articles/article-fixed-version.model\";\r\nimport { ApplicationVersionViewModel } from \"./application-version-view-model.model\";\r\n\r\nexport class Version\r\n\textends ArticleFixedVersion {\r\n\r\n\tpublic id: string;\r\n\r\n\tpublic versionLabel: string;\r\n\r\n\tpublic static mapFromApplicationVersionViewModelArray(response: Array): Array {\r\n\t\tlet versionArr = new Array();\r\n\r\n\t\tif (response && response.map) {\r\n\t\t\tversionArr = response.map(x => {\r\n\t\t\t\tlet newVersion = new Version();\r\n\t\t\t\tnewVersion.id = `${x.applicationId}-${x.major}-${x.minor}-${x.build}-${x.revision}-${x.servicePack}`;\r\n\t\t\t\tnewVersion.versionApplicationId = x.applicationId;\r\n\t\t\t\tnewVersion.versionMajor = x.major;\r\n\t\t\t\tnewVersion.versionMinor = x.minor;\r\n\t\t\t\tnewVersion.versionRevision = x.revision;\r\n\t\t\t\tnewVersion.versionServicePack = x.servicePack;\r\n\t\t\t\tnewVersion.versionBuild = x.build;\r\n\t\t\t\tnewVersion.versionIsReleased = x.isReleased;\r\n\r\n\t\t\t\treturn newVersion;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn versionArr;\r\n\t} \r\n\r\n}\r\n","export class ArticleAuthor {\r\n\r\n\tpublic id: string;\r\n\r\n\tpublic userName: string;\r\n\r\n\tpublic getLink() {\r\n\t\treturn `/search;facets=owningUser%3A${this.userName}`;\r\n\t}\r\n\r\n\tpublic getSearchFacet() {\r\n\t\treturn `owningUser:${this.userName}`;\r\n\t}\r\n\r\n}\r\n","import { Article } from \"./article.model\";\r\nimport { Category } from \"../categories/category.model\";\r\n\r\nexport class BestPracticesArticle\r\n\textends Article {\r\n\r\n\tpublic type: string = \"bestpractices\";\r\n\r\n\tpublic content: string = null;\r\n\r\n\tpublic categoryId: number = null;\r\n\r\n\tpublic category: Category = null;\r\n\r\n}\r\n","import { ArticleAuthor } from \"./article-author.model\";\r\n\r\nexport class ArticleContributor {\r\n\r\n\tpublic articleId: number;\r\n\r\n\tpublic version: number;\r\n\r\n\tpublic userId: string;\r\n\r\n\tpublic timestamp: Date;\r\n\r\n\t// WebAPI sends Enum label while WebApi sends Enum int value\r\n\tpublic contributorType: string;\r\n\r\n\tpublic user: ArticleAuthor;\r\n\r\n}\r\n","import { ArticleType } from \"../../../shared/enums/article-type.enum\";\r\n\r\nexport class ArticleDefinition {\r\n\r\n\tid: string;\r\n\r\n\tname: string;\r\n\r\n\tdescription: string;\r\n\r\n\tarticleType: ArticleType;\r\n\r\n\taudiences: Array;\r\n\r\n\tarticleModelType: string;\r\n\r\n}\r\n","import { Article } from \"./article.model\";\r\nimport { Category } from \"../categories/category.model\";\r\n\r\nexport class FrequentlyAskedQuestionArticle\r\n\textends Article {\r\n\r\n\tpublic type: string = \"frequentlyaskedquestion\";\r\n\r\n\tpublic content: string = null;\r\n\r\n\tpublic categoryId: number = null;\r\n\r\n\tpublic category: Category = null;\r\n\r\n}\r\n","// this file is improperly being used as a base class on version.ts and needs to be cleaned up in the future\r\n\r\nexport class ArticleFixedVersion {\r\n\r\n\tpublic articleId: number;\r\n\r\n\tpublic version: string;\r\n\r\n\tpublic versionApplicationId: string;\r\n\r\n\tpublic versionMajor: number;\r\n\r\n\tpublic versionMinor: number;\r\n\t\t\r\n\tpublic versionBuild: number;\r\n\r\n\tpublic versionRevision: number;\r\n\r\n\tpublic versionServicePack: string;\r\n\r\n\tpublic versionIsReleased: boolean;\r\n\r\n}\r\n","import { ArticleTargetRole } from \"./article-target-role.model\";\r\nimport { ArticleAuthor } from \"./article-author.model\";\r\n\r\nexport class ArticleMetaData {\r\n\r\n\tpublic targetedRoles: Array;\r\n\r\n\tpublic technicalReviewer: ArticleAuthor; // should this change to be a more generic model? possibly update User?\r\n\r\n}\r\n","import { Article } from \"./article.model\";\r\n\r\nexport class SolutionArticle\r\n\textends Article {\r\n\r\n\tpublic type: string = \"solution\";\r\n\r\n\tpublic content: string = null;\r\n\r\n\tpublic proposedCommonIssueTitle: string = null;\r\n\r\n}\r\n","import { Role } from \"../roles/role.model\";\r\n\r\nexport class ArticleTargetRole {\r\n\r\n\tpublic articleId: number;\r\n\r\n\tpublic version: number;\r\n\r\n\tpublic roleId: string;\r\n\r\n\tpublic role: Role;\r\n\r\n}\r\n","export class ArticleTargetedVersion {\r\n\r\n\tpublic articleId: number;\r\n\r\n\tpublic version: number;\r\n\r\n\tpublic versionApplicationId: string;\r\n\r\n\tpublic versionMajor: number;\r\n\r\n\tpublic versionMinor: number;\r\n\r\n\tpublic versionBuild: number;\r\n\r\n\tpublic versionRevision: number;\r\n\r\n\tpublic versionServicePack: string;\r\n\r\n\tpublic static versionLabel(articleTargetedVersion: ArticleTargetedVersion): string {\r\n\t\tvar queue = [];\r\n\r\n\t\tqueue.push(articleTargetedVersion.versionMajor);\r\n\t\tqueue.push(articleTargetedVersion.versionMinor);\r\n\t\tqueue.push(articleTargetedVersion.versionBuild);\r\n\t\tqueue.push(articleTargetedVersion.versionRevision);\r\n\r\n\t\twhile (queue[queue.length - 1] == 0) {\r\n\t\t\tqueue.pop();\r\n\t\t}\r\n\r\n\t\tvar label = queue.join(\".\");\r\n\r\n\t\tif (articleTargetedVersion.versionServicePack !== '' && articleTargetedVersion.versionServicePack !== '*') {\r\n\t\t\tlabel = `${label} ${articleTargetedVersion.versionServicePack}`;\r\n\t\t}\r\n\r\n\t\treturn label;\r\n\t}\r\n}\r\n","import { Article } from \"./article.model\";\r\nimport { ArticleTargetRole } from \"./article-target-role.model\";\r\n\r\nexport class TechnicalNoteArticle\r\n\textends Article {\r\n\r\n\tpublic type: string = \"technicalnote\";\r\n\r\n\tpublic symptoms: string = null;\r\n\r\n\tpublic resolution: string = null;\r\n\r\n\tpublic moreInformation: string = null;\r\n\r\n\tpublic additionalResources: string = null;\r\n\r\n\tpublic targetedRoles: Array = null;\r\n\r\n}\r\n","import { Article } from \"./article.model\";\r\nimport { Category } from \"../categories/category.model\";\r\n\r\nexport class TechnicalReferenceArticle\r\n\textends Article {\r\n\r\n\tpublic type: string = \"technicalreference\";\r\n\r\n\tpublic content: string = null;\r\n\r\n\tpublic categoryId: number = null;\r\n\r\n\tpublic category: Category = null;\r\n\r\n}\r\n","import { Article } from \"./article.model\";\r\nimport { Category } from \"../categories/category.model\";\r\n\r\nexport class TroubleshootingArticle\r\n\textends Article {\r\n\r\n\tpublic type: string = \"troubleshooting\";\r\n\r\n\tpublic cause: string = null;\r\n\r\n\tpublic resolution: string = null;\r\n\r\n\tpublic description: string = null;\r\n\r\n\tpublic symptoms: string = null;\r\n\r\n\tpublic categoryId: number = null;\r\n\r\n\tpublic category: Category = null;\r\n\r\n}\r\n","import { ArticleContributor } from \"./article-contributor.model\";\r\nimport { ArticleDeflectedIncident } from \"./article-deflected-incident.model\";\r\nimport { ArticleTargetedVersion } from \"./article-targeted-version.model\";\r\nimport { ArticleLogPhrase } from \"./article-log-phrase.model\";\r\nimport { ArticleStateChange } from \"./article-state-change.model\";\r\nimport { ArticleAuthor } from \"./article-author.model\";\r\n\r\nexport class Article {\r\n\r\n\tpublic articleId: number;\r\n\r\n\tpublic author: ArticleAuthor;\r\n\r\n\tpublic version: number;\r\n\r\n\tpublic title: string;\r\n\r\n\tpublic classificationCode: string;\r\n\r\n\tpublic classificationText: string;\r\n\r\n\tpublic incidentReference: string = null;\r\n\r\n\tpublic created: Date;\r\n\r\n\tpublic authorId: string;\r\n\r\n\tpublic modified: Date;\r\n\r\n\tpublic editorId: string;\r\n\r\n\tpublic editor: ArticleAuthor;\r\n\r\n\tpublic technicalReviewerId: string = null;\r\n\r\n\tpublic technicalReviewer: ArticleAuthor;\r\n\r\n\tpublic deletionId: string;\r\n\r\n\tpublic deletedOn: Date;\r\n\r\n\tpublic deletedById: string;\r\n\r\n\tpublic unpublished: Date;\r\n\r\n\tpublic unpublisherId: string;\r\n\r\n\tpublic isMinorRevision: boolean;\r\n\r\n\tpublic externalReferenceId: string;\r\n\r\n\tpublic workflowState: string;\r\n\r\n\tpublic proposedCommonIssueTitle: string;\r\n\r\n\tpublic articleTypeLabel: string;\r\n\r\n\tpublic isMajorVersion: string;\r\n\r\n\tpublic articleContributors: Array = null;\r\n\r\n\tpublic articleDeflectedIncidents: Array;\r\n\r\n\tpublic articleTargetedVersions: Array = null;\r\n\r\n\tpublic articleLogPhrases: Array;\r\n\r\n\tpublic articleStateChanges: Array;\r\n\r\n\tpublic sourceArticleId: number;\r\n\r\n\tpublic sourceArticleVersion: number;\r\n\r\n\tpublic audience: string;\r\n\r\n\tpublic expiration: Date;\r\n\r\n\tpublic isManualPublish: boolean;\r\n\r\n\tpublic articleType: string;\r\n\r\n\tpublic discriminator: string;\r\n\r\n\tpublic affectedApplications: string;\r\n\r\n}\r\n","import { ArticleAuthor } from \"./article-author.model\";\r\nimport { ArticleType } from \"../../../shared/enums/article-type.enum\";\r\n\r\nexport class LatestArticles {\r\n\t\t\r\n\tpublic author: ArticleAuthor;\r\n\r\n\tpublic articleId: number;\r\n\r\n\tpublic version: number;\r\n\r\n\tpublic title: string;\r\n\r\n\tpublic articleType: number;\r\n\r\n\tpublic modified: Date;\r\n\r\n\tpublic userName: string;\r\n\r\n\tpublic articleTypeLabel(): string {\r\n\t\treturn ArticleType[this.articleType] ? ArticleType[this.articleType] : \"\";\r\n\t}\r\n\r\n\tpublic getLink() {\r\n\t\treturn `/article/details/${this.articleId}/${this.version}`;\r\n\t}\r\n\r\n}\r\n","import { ArticleAuthor } from \"./article-author.model\";\r\n\r\nexport class UserContribution {\r\n\r\n\tpublic author: ArticleAuthor;\r\n\r\n\tpublic articlesCount: number;\r\n\r\n}\r\n","import { CommentThread } from \"./comment-thread.model\";\r\n\r\nexport class Comment {\r\n\r\n\tpublic id: number;\r\n\r\n\tpublic userId: string;\r\n\r\n\tpublic content: string;\r\n\r\n\tpublic thread: CommentThread;\r\n\r\n\tpublic created: Date;\r\n\r\n\tpublic lastUpdated: Date;\r\n\r\n\tpublic parent: Comment;\r\n\r\n\tpublic replies: Array;\r\n\r\n\tpublic userName: string;\r\n\r\n\tpublic userEmail: string;\r\n\r\n\tpublic isAnonymous: boolean;\r\n\r\n}\r\n","import { Incident } from \"./incident.model\";\r\n\r\nexport class IncidentActivity {\r\n\r\n\tpublic id: string;\r\n\r\n\tpublic incidentId: string;\r\n\r\n\tpublic type: string;\r\n\r\n\tpublic subject: string;\r\n\r\n\tpublic description: string;\r\n\r\n\tpublic duration: number;\r\n\r\n\tpublic createdOn: Date;\r\n\r\n\tpublic createdBy: string;\r\n\r\n\tpublic createdByUsername: string;\r\n\r\n\tpublic modifiedOn: Date;\r\n\r\n\tpublic modifiedBy: string;\r\n\r\n\tpublic modifiedByUsername: string;\r\n\r\n\tpublic incident: Incident;\r\n\r\n\tpublic isDisplayOpen: boolean;\r\n\r\n\tpublic stateCode: number;\r\n\t\r\n\tpublic isWorkaroundIncluded: boolean;\r\n\r\n\tpublic workaroundDetails: string;\r\n\r\n\tpublic workaroundNextSteps: string;\r\n\t\r\n\tpublic agreedSeverityAfterWorkaround: string;\r\n}\r\n","export class Contact {\r\n\r\n public id: string;\r\n\r\n public firstName: string;\r\n \r\n public lastName: string;\r\n\r\n public emailAddress: string;\r\n\r\n public phone: string;\r\n\r\n public fullName: string;\r\n\r\n public customerId: string;\r\n}\r\n\r\nexport class ContactRes {\r\n\r\n public id: string;\r\n \r\n}","export class FieldEscalationSubmission {\r\n\r\n\tpublic escalationDescription: string;\r\n\r\n\tpublic emailAddress: string;\r\n\r\n\tpublic userFullName: string;\r\n\r\n\tpublic emailCC: string[];\r\n\r\n}\r\n","export class InternalNote{\r\n\r\n public description: string;\r\n\r\n public taskTypeId: string;\r\n\r\n public incidentId: string;\r\n\r\n public emailAddress: string;\r\n\r\n\tpublic userFullName: string;\r\n \r\n}","export class CaseSubscription {\r\n\r\n\tpublic id: string;\r\n\r\n}","import { Team } from \"../teams/team.model\";\r\nimport { IncidentActivity } from \"./incident-activity.model\";\r\nimport { IncidentResolutionActivity } from \"./incident-resolution-activity.model\";\r\nimport { IncidentDevelopmentEscalationActivity } from \"./incident-development-escalation-activity.model\";\r\nimport { ApplicationVersion } from \"../applications/application-version.model\";\r\nimport { Account } from \"../accounts/account.model\";\r\nimport { CommCell } from \"../comm-cells/comm-cell.model\";\r\n\r\nexport class Incident {\r\n\r\n\tpublic owningTeamId: string;\r\n\r\n\tpublic owningTeam: Team;\r\n\r\n\tpublic initialResponseTimestamp: Date;\r\n\r\n\tpublic timeToRespondTimestamp: Date;\r\n\r\n\tpublic supportType: string;\r\n\r\n\tpublic classificationId: string;\r\n\r\n\tpublic classificationText: string;\r\n\r\n\tpublic patchReference: string;\r\n\r\n\tpublic owningUserName: string;\r\n\r\n\tpublic patchName: string;\r\n\r\n\tpublic modifiedOn: Date;\r\n\r\n\tpublic deflectionResult: string;\r\n\r\n\tpublic deflectionComments: string;\r\n\r\n\tpublic isEscalated: boolean;\r\n\r\n\tpublic resolution: IncidentResolutionActivity;\r\n\r\n\tpublic developmentEscalation: IncidentDevelopmentEscalationActivity;\r\n\r\n\tpublic voteTally: number;\r\n\r\n\tpublic activities: Array;\r\n\r\n\tpublic createdOn: Date;\r\n\r\n\tpublic isFieldEscalationAllowed: boolean;\r\n\r\n\tpublic owningUserId: string;\r\n\r\n\tpublic desiredOutcome: string;\r\n\r\n\tpublic id: string;\r\n\r\n\tpublic source: string;\r\n\r\n\tpublic ticketNumber: string;\r\n\r\n\tpublic title: string;\r\n\r\n\tpublic description: string;\r\n\r\n\tpublic commCellId: string;\r\n\r\n\tpublic commCell: CommCell;\r\n\r\n\tpublic originatorId: string;\r\n\r\n\tpublic incidentSummary: string;\r\n\r\n\tpublic originator: Account;\r\n\r\n\tpublic contactDetails: string;\r\n\r\n\tpublic version: ApplicationVersion;\r\n\r\n\tpublic severity: string;\r\n\r\n\tpublic errorCode: string;\r\n\r\n\tpublic pendingFailure: string;\r\n\r\n\tpublic status: string;\r\n\r\n\tpublic state: string;\r\n\r\n\tpublic businessImpact: string;\r\n\r\n\tpublic contactName: string;\r\n\r\n\tpublic lastActivity: IncidentActivity;\r\n\r\n\tpublic accountName: string;\r\n\r\n\tpublic supportTeamName: string;\r\n\r\n\tpublic supportPartnerName: string;\r\n\r\n\tpublic applicationMajorVersion: string;\r\n\r\n\tpublic applicationServicePack: string;\r\n\r\n\tpublic commCellAlias: string;\r\n\r\n\tpublic tenantID: string;\r\n\r\n\tpublic contactId: string;\r\n\r\n\tpublic subscriptionType: string;\r\n\r\n\tpublic productType: string;\r\n\r\n\tpublic caseOriginCode: string;\r\n\r\n\tpublic secondaryContactId: string;\r\n\r\n\tpublic preferredContactMethodId: string;\r\n\r\n\tpublic preferredLanguage: string;\r\n\r\n\tpublic accountId: string;\r\n\r\n\tpublic supportTeamId: string;\r\n\r\n\tpublic caseSubmittedBy: string;\r\n\r\n\tpublic taxonomyPath: string;\r\n\r\n}\r\n","import { Permission } from \"../permissions/permission.model\";\r\n\r\nexport class Role {\r\n\r\n public id: string;\r\n\r\n public name: string;\r\n\r\n public isMembershipManaged: boolean;\r\n\r\n public permissions: Array;\r\n\r\n}\r\n","export class KeyValue {\r\n\r\n\tpublic key: string;\r\n\r\n\tpublic value: string;\r\n\r\n}\r\n","export class SearchRequestFacet {\r\n\r\n\tpublic field: string;\r\n\r\n\tpublic value: any;\r\n\r\n\tpublic clusivity: number;\r\n\r\n}\r\n","import { SearchRequestFacet } from \"./search-request-facet.model\";\r\nimport { SearchSortCriteria } from \"./search-sort-criteria.model\";\r\nimport { KeyValue } from \"./key-value.model\";\r\n\r\nexport class SearchRequest {\r\n\r\n\tpublic searchTerms: string = null;\r\n\r\n\tpublic explicitSearchTerms: Array = new Array();\r\n\r\n\tpublic escapeSearchTerms: boolean = true;\r\n\r\n\tpublic facets: Array = new Array();\r\n\r\n\tpublic pageIndex: number = 1;\r\n\r\n\tpublic maxPaginationSize: number = 10;\r\n\r\n\tpublic pageSize: number = 0;\r\n\r\n\tpublic sortOrder: Array = new Array();\r\n\r\n\tpublic normalizeScores: boolean = false;\r\n\r\n\tpublic includeFilteredFacets: boolean = false;\r\n\r\n}\r\n","export class User {\r\n\r\n\tpublic id: string;\r\n\r\n\tpublic name: string;\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\n\r\nimport { Observable } from 'rxjs';\r\n\r\nimport { ResetUserPublishDate } from '../../models/admin/reset-user-publish-date.model';\r\n\r\nconst httpOptions = {\r\n\theaders: new HttpHeaders({\r\n\t\t'Content-Type': 'application/json',\r\n\t})\r\n};\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class AdminService {\r\n\r\n\tprivate _urlBase: string = \"api/admin\";\r\n\r\n\tconstructor(private _http: HttpClient) {\r\n\t}\r\n\r\n\tpublic resetUsersPublishDate(request: ResetUserPublishDate): Observable {\r\n\t\treturn this._http\r\n\t\t\t.patch(`${this._urlBase}/resetpublisheddate`, request, httpOptions);\r\n\t}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class AlertService {\r\n\r\n\t// should this be basic Subject\r\n\tprivate _messageStream = new Subject();\r\n\r\n\tconstructor() {\r\n\t}\r\n\r\n\tpublic show(message: string) {\r\n\t\tthis._messageStream.next(message);\r\n\t}\r\n\r\n\tpublic messages(): Observable {\r\n\t\treturn this._messageStream.asObservable();\r\n\t}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport { ApplicationVersionViewModel } from '../../models/applications/application-version-view-model.model';\r\n\r\nimport { ConfigurationService } from '../../../modules/runtime-configuration/services/configuration.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ApplicationVersionsService {\r\n\r\n private _urlOdataBase: string = \"odata/applicationversions\";\r\n\r\n constructor(private _httpClient: HttpClient, private _configSvc: ConfigurationService) { }\r\n\r\n public getCommvaultApplicationVersions(isEnabled: boolean, isReleased: boolean, majorOnly: boolean): Observable> {\r\n return this.getApplicationVersions(this._configSvc.configuration.commvaultApplicationId, isEnabled, isReleased, majorOnly);\r\n }\r\n\r\n public getApplicationVersions(applicationId: string, isEnabled: boolean, isReleased: boolean, majorOnly: boolean): Observable> {\r\n let filter = `$filter=isEnabled eq ${isEnabled} and applicationId eq ${applicationId}`;\r\n\r\n if (isReleased !== null) {\r\n filter = `${filter} and isReleased eq ${isReleased}`;\r\n }\r\n\r\n if (majorOnly) {\r\n filter += ` and servicePack eq '*'`;\r\n } else {\r\n filter += ` and servicePack ne '*'`;\r\n }\r\n\r\n let order = `$orderBy=major desc, releaseDate desc`;\r\n\r\n return this._httpClient.get>(this._urlOdataBase + `/get?${filter}&${order}`);\r\n }\r\n\r\n}","import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { Application } from '../../models/applications/application.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ApplicationService {\r\n\r\n\tprivate _urlOdataBase: string = \"odata/applications\";\r\n\r\n\tconstructor(private _httpClient: HttpClient) { }\r\n\r\n\tpublic getEnabledApplications(): Observable> {\r\n\t\treturn this._httpClient.get>(this._urlOdataBase + `?$filter=isEnabled eq true & $orderBy=name asc`);\r\n\t}\r\n\r\n\tpublic getApplicationById(id: string): Observable {\r\n\t\treturn this._httpClient.get(this._urlOdataBase + `?$filter=id eq ${id}`);\r\n\t}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\n\r\nimport { Observable } from 'rxjs';\r\n\r\nimport { WorkflowState } from '../../models/workflow/workflow-state.model';\r\nimport { Article } from '../../models/articles/article.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ArticleWorkflowService {\r\n\r\n private _urlBase: string = \"odata/article\";\r\n\r\n constructor(private _httpClient: HttpClient) { }\r\n\r\n public getValidTransitions(articleId: number, version: number): Observable> {\r\n\t return this._httpClient.get>(`${this._urlBase}(${articleId},${version})/workflow`);\r\n }\r\n\r\n public setWorkflowTransition(articleId: number, version: number, action: string, feedback: string): Observable {\r\n\t return this._httpClient.post(`${this._urlBase}(${articleId},${version})/workflow`, { action: action, feedback: feedback });\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\n\r\nimport { Observable, of } from \"rxjs\";\r\nimport { map, catchError } from 'rxjs/operators';\r\n\r\nimport { UserContribution } from '../../models/articles/user-contribution.model';\r\nimport { ArticleAuthor } from '../../models/articles/article-author.model';\r\nimport { LatestArticles } from '../../models/articles/latest-articles.model';\r\nimport { ArticleDefinition } from '../../models/articles/article-definition.model';\r\nimport { PeriodOption } from '../../models/periods/period-option.model';\r\nimport { Article } from '../../models/articles/article.model';\r\nimport { Views } from '../../models/views/views.model';\r\nimport { TechnicalNoteArticle } from '../../models/articles/article-technical-note.model';\r\nimport { SolutionArticle } from '../../models/articles/article-solution.model';\r\nimport { TroubleshootingArticle } from '../../models/articles/article-troubleshooting.model';\r\nimport { FrequentlyAskedQuestionArticle } from '../../models/articles/article-faq.model';\r\nimport { BestPracticesArticle } from '../../models/articles/article-best-practices.model';\r\nimport { TechnicalReferenceArticle } from '../../models/articles/article-technical-reference.model';\r\nimport { ArticleMetaData } from '../../models/articles/article-metadata.model';\r\nimport { ArticleQualityVote } from '../../models/articles/article-quality-vote.model';\r\nimport { ArticleHistory } from '../../models/articles/article-history.model';\r\nimport { ArticleQualityVoteResult } from '../../models/articles/article-quality-vote-result.model';\r\n\r\nconst httpOptions = {\r\n\theaders: new HttpHeaders({\r\n\t\t'Content-Type': 'application/json',\r\n\t})\r\n};\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class ArticleService {\r\n\r\n\tprivate _urlBase: string = \"api/articles\";\r\n\r\n\tprivate _urlOdataBase: string = \"odata/article\";\r\n\r\n\tconstructor(private _httpClient: HttpClient) { }\r\n\r\n\tpublic getTopContributors(periodFilter: PeriodOption, roleId: string): Observable> {\r\n\t\tlet params = new Array();\r\n\r\n\t\tif (periodFilter && periodFilter.periodStart) {\r\n\t\t\tparams.push(`startPeriod=${periodFilter.periodStart}`);\r\n\t\t}\r\n\r\n\t\tif (periodFilter && periodFilter.periodEnd) {\r\n\t\t\tparams.push(`endPeriod=${periodFilter.periodEnd}`);\r\n\t\t}\r\n\r\n\t\tif (roleId) {\r\n\t\t\tparams.push(`roleId=${roleId}`);\r\n\t\t}\r\n\r\n\t\tlet queryString = params.join(\"&\");\r\n\r\n\t\treturn this._httpClient.get>(this._urlBase + `/views/topContributors?${queryString}`).pipe(\r\n\t\t\tmap(contributionData => {\r\n\t\t\t\treturn contributionData.map(x => {\r\n\t\t\t\t\tlet uc = new UserContribution();\r\n\t\t\t\t\tuc.author = new ArticleAuthor();\r\n\r\n\t\t\t\t\tuc.author.userName = x.authorName;\r\n\t\t\t\t\tuc.articlesCount = x.contributionCount;\r\n\r\n\t\t\t\t\treturn uc;\r\n\t\t\t\t});\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n\tpublic getLatestArticles(): Observable> {\r\n\t\treturn this._httpClient.get>(this._urlBase + `/views/latest`).pipe(\r\n\t\t\tmap(contributionData => {\r\n\t\t\t\treturn contributionData.map(x => {\r\n\t\t\t\t\tlet uc = new LatestArticles();\r\n\t\t\t\t\tObject.assign(uc, x);\r\n\r\n\t\t\t\t\tlet author = new ArticleAuthor();\r\n\t\t\t\t\tObject.assign(author, x.author);\r\n\r\n\t\t\t\t\tuc.author = author;\r\n\r\n\t\t\t\t\treturn uc;\r\n\t\t\t\t});\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n\tpublic getArticleTypes(): Observable> {\r\n\t\treturn this._httpClient.get>(this._urlBase + `/types`).pipe(\r\n\t\t\tmap(definitionData => {\r\n\t\t\t\treturn definitionData.map(x => {\r\n\t\t\t\t\tlet ad = new ArticleDefinition();\r\n\t\t\t\t\tObject.assign(ad, x);\r\n\t\t\t\t\treturn ad;\r\n\t\t\t\t});\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n\tpublic getArticleType(type: string): Observable {\r\n\t\treturn this._httpClient.get(this._urlBase + `/types/${type}`).pipe(\r\n\t\t\tmap(definition => {\r\n\t\t\t\tlet ad = new ArticleDefinition();\r\n\r\n\t\t\t\tObject.assign(ad, definition);\r\n\r\n\t\t\t\treturn ad;\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n\tpublic getArticles(id: number, version: number, expand: string): Observable {\r\n\t\tlet keyFilter = `${id}`;\r\n\r\n\t\tif (version) {\r\n\t\t\tkeyFilter = `${keyFilter}, ${version}`;\r\n\t\t}\r\n\r\n\t\tlet params = new Array();\r\n\r\n\t\tif (expand) {\r\n\t\t\tparams.push(`$expand=${expand}`);\r\n\t\t}\r\n\r\n\t\tconst queryString = params.join(\"&\");\r\n\r\n\t\tconst url = `${this._urlOdataBase}(${keyFilter})?${queryString}`;\r\n\r\n\t\treturn this._httpClient.get(url);\r\n\t}\r\n\r\n\tpublic getLatestArticleById(id: number, version?: number): Observable {\r\n\t\tlet expand = 'articleDeflectedIncidents, articleTargetedVersions($orderby=versionMajor desc), articleLogPhrases, articleContributors($orderby=timestamp desc;$expand = user), author, editor, *';\r\n\r\n\t\tlet url = this._urlOdataBase;\r\n\r\n\t\tif (!version) {\r\n\t\t\turl += `/latest(id='${id}')`;\r\n\t\t} else {\r\n\t\t\turl += `(${id}, ${version})`\r\n\t\t}\r\n\r\n\t\turl += `?$expand=${expand}`;\r\n\r\n\t\treturn this._httpClient.get(url);\r\n\t}\r\n\r\n\tpublic getViews(): Observable> {\r\n\t\treturn this._httpClient.get>(`${this._urlBase}/views`);\r\n\t}\r\n\r\n\tpublic getArticleMetadata(articleId: number, version: number = null): Observable {\r\n\t\tlet url = `${this._urlBase}/meta/${articleId}`;\r\n\r\n\t\tif (version) {\r\n\t\t\turl = `${url}/${version}`;\r\n\t\t}\r\n\r\n\t\treturn this._httpClient.get(url).pipe(\r\n\t\t\tcatchError(() => {\r\n\t\t\t\treturn of(null);\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n\tpublic getLatestArticleVersion(articleId: number): Observable {\r\n\t\tlet hideProgressOptions = {\r\n\t\t\theaders: httpOptions.headers.set('X-Hide-Progress', 'true')\r\n\t\t};\r\n\t\treturn this._httpClient.get(`${this._urlBase}/${articleId}/latestVersion`, hideProgressOptions);\r\n\t}\r\n\r\n\tpublic getPublishedArticleVersion(articleId: number): Observable {\r\n\t\treturn this._httpClient.get(`${this._urlBase}/${articleId}/publishedVersion`);\r\n\t}\r\n\r\n\tpublic getDefaultedArticle(type: string): Observable {\r\n\t\treturn this._httpClient.get(`${this._urlBase}/default/${type}`)\r\n\t\t\t.pipe(\r\n\t\t\t\tmap(\r\n\t\t\t\t\tresponse => {\r\n\t\t\t\t\t\tlet article = response;\r\n\r\n\t\t\t\t\t\t// ** A better solution would be server side but that would involve new ViewModels\r\n\r\n\t\t\t\t\t\t// Need to clean up some default data type values that better match client environment\r\n\t\t\t\t\t\tarticle.versionImplied = null;\r\n\t\t\t\t\t\tarticle.versionLabel = null;\r\n\r\n\t\t\t\t\t\tarticle.created = null;\r\n\t\t\t\t\t\tarticle.modified = null;\r\n\t\t\t\t\t\tarticle.isMajorVersion = false;\t\t// this is because of the default 0 for version\r\n\r\n\t\t\t\t\t\tif (article.hasOwnProperty('categoryId') && article.categoryId === 0) {\r\n\t\t\t\t\t\t\tarticle.categoryId = null;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn response;\r\n\t\t\t\t\t}\r\n\t\t\t\t)\r\n\t\t\t);\r\n\t}\r\n\r\n\tpublic createArticle(type: string): Article {\r\n\t\t// Not really happy about this approach. Think I would want a more\r\n\t\t// abstract approach...maybe specify type as property of definition\r\n\r\n\t\t// think https://stackoverflow.com/a/21159196/240372 would help\r\n\r\n\t\tif (!type) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tswitch (type.toLowerCase()) {\r\n\t\t\tcase \"technicalnote\": {\r\n\t\t\t\treturn new TechnicalNoteArticle();\r\n\t\t\t}\r\n\t\t\tcase \"solution\": {\r\n\t\t\t\treturn new SolutionArticle();\r\n\t\t\t}\r\n\t\t\tcase \"troubleshooting\": {\r\n\t\t\t\treturn new TroubleshootingArticle();\r\n\t\t\t}\r\n\t\t\tcase \"frequentlyaskedquestion\": {\r\n\t\t\t\treturn new FrequentlyAskedQuestionArticle();\r\n\t\t\t}\r\n\t\t\tcase \"bestpractices\": {\r\n\t\t\t\treturn new BestPracticesArticle();\r\n\t\t\t}\r\n\t\t\tcase \"technicalreference\": {\r\n\t\t\t\treturn new TechnicalReferenceArticle();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n\r\n\tpublic getArticleQualityVote(articleId: number): Observable {\r\n\t\treturn this._httpClient.get(this._urlBase + `/${articleId}/votes`);\r\n\t}\r\n\r\n\tpublic voteAsync(articleId: number, version: number, request: ArticleQualityVote): Observable {\r\n\t\tlet hideProgressOptions = {\r\n\t\t\theaders: new HttpHeaders({\r\n\t\t\t\t'Content-Type': 'application/json',\r\n\t\t\t\t'X-Hide-Progress': 'true'\r\n\t\t\t})\r\n\t\t};\r\n\t\treturn this._httpClient\r\n\t\t\t.post(this._urlBase + `/${articleId}/${version}/votes`, request, hideProgressOptions);\r\n\t}\r\n\r\n\tpublic saveArticle(article: Article, isMajorVersion: boolean = false): Observable {\r\n\t\treturn this._httpClient.post(`${this._urlBase}?isMajorVersion=${isMajorVersion}`, article);\r\n\t}\r\n\r\n\tpublic approvePublish(articleId: number, version: number): Observable {\r\n\t\treturn this._httpClient.post(`${this._urlBase}/${articleId}/${version}/workflow/approve`, null);\r\n\t}\r\n\r\n\tpublic denyPublish(articleId: number, version: number, denialReason: string): Observable {\r\n\t\treturn this._httpClient.post(`${this._urlBase}/${articleId}/${version}/workflow/deny`, JSON.stringify(denialReason), httpOptions);\r\n\t}\r\n\r\n\tpublic approveReview(articleId: number, version: number): Observable {\r\n\t\treturn this._httpClient.post(`${this._urlBase}/${articleId}/${version}/workflow/reviewed`, null);\r\n\t}\r\n\r\n\tpublic denyReview(articleId: number, version: number, denialReason: string): Observable {\r\n\t\treturn this._httpClient.post(`${this._urlBase}/${articleId}/${version}/workflow/denyreview`, JSON.stringify(denialReason), httpOptions);\r\n\t}\r\n\r\n\tpublic approvePartner(articleId: number, version: number): Observable {\r\n\t\treturn this._httpClient.post(`${this._urlBase}/${articleId}/${version}/workflow/approvepartner`, null);\r\n\t}\r\n\r\n\tpublic denyPartner(articleId: number, version: number, denialReason: string): Observable {\r\n\t\treturn this._httpClient.post(`${this._urlBase}/${articleId}/${version}/workflow/denypartner`, JSON.stringify(denialReason), httpOptions);\r\n\t}\r\n\r\n\tpublic unpublish(articleId: number): Observable {\r\n\t\treturn this._httpClient.post(`${this._urlBase}/${articleId}/unpublish`, null);\r\n\t}\r\n\r\n\tpublic deleteArticles(articleIds: Array): Observable {\r\n\t\treturn this._httpClient.delete(`${this._urlBase}?ids=${articleIds.join(',')}`, httpOptions);\r\n\t}\r\n\r\n\tpublic deleteArticle(articleId: number, version: number, includePrevious: boolean = false): Observable {\r\n\t\tlet url = `${this._urlOdataBase}(${articleId},${version})`;\r\n\r\n\t\tif (includePrevious) {\r\n\t\t\turl += '?includePrevious=true';\r\n\t\t}\r\n\r\n\t\treturn this._httpClient.delete(url);\r\n\t}\r\n\r\n\tpublic nominateAsSolution(articleId: number, version: number): Observable {\r\n\t\treturn this._httpClient.post(`${this._urlBase}/${articleId}/${version}/workflow/nominate`, null);\r\n\t}\r\n\r\n\tpublic denyPromotion(articleId: number, version: number, denialReason: string): Observable {\r\n\t\treturn this._httpClient.post(`${this._urlBase}/${articleId}/${version}/workflow/denypromotion`, JSON.stringify(denialReason), httpOptions);\r\n\t}\r\n\r\n\tpublic getArticleHistory(articleId: number): Observable> {\r\n\t\treturn this._httpClient.get>(`${this._urlBase}/${articleId}/history`);\r\n\t}\r\n\r\n\tpublic setWorkflowTransition(articleId: number, version: number, action: string, feedback: string): Observable {\r\n\t\treturn this._httpClient.post(`${this._urlOdataBase}(${articleId},${version})/workflow`, { action: action, feedback: feedback });\r\n\t}\r\n\r\n\tpublic recordArticleInspection(articleId: number, userId: string): Observable {\r\n\t\tlet hideProgressOptions = {\r\n\t\t\theaders: new HttpHeaders({\r\n\t\t\t\t'Content-Type': 'application/json',\r\n\t\t\t\t'X-Hide-Progress': 'true'\r\n\t\t\t})\r\n\t\t};\r\n\t\treturn this._httpClient.post(`${this._urlBase}/${articleId}/inspection/user/${userId}`, null, hideProgressOptions);\r\n\t}\r\n\r\n\tpublic updateArticleClassification(articleId: number, version: number, classificationCode: number) {\r\n\t\tconst url = `${this._urlBase}/${articleId}/${version}`;\r\n\r\n\t\tconst patch = [\r\n\t\t\t{ op: 'replace', path: '/proposedCommonIssueTitle', value: null },\r\n\t\t\t{ op: 'replace', path: '/classificationText', value: null },\r\n\t\t\t{ op: 'replace', path: '/classificationCode', value: classificationCode }\r\n\t\t];\r\n\r\n\t\treturn this._httpClient.patch(url, patch);\r\n\t}\r\n\r\n\tpublic getWorkflowTriggers(articleId: number, version: number): Observable> {\r\n\t\treturn this._httpClient.get>(`${this._urlBase}/${articleId}/${version}/workflowtriggers`);\r\n\t}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\nimport { Observable, from, ReplaySubject } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\nimport { UserManager, UserManagerSettings, User } from 'oidc-client';\r\nimport { ConfigurationService } from '../../../modules/runtime-configuration/services/configuration.service';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class AuthService {\r\n\r\n\t// Original oidc code based on -- https://www.scottbrady91.com/Angular/SPA-Authentiction-using-OpenID-Connect-Angular-CLI-and-oidc-client\r\n\r\n\tprivate _manager = new UserManager(this.getClientSettings());\r\n\r\n\tpublic user: User = null;\r\n\r\n\tprivate _isAuthenticatedStream = new ReplaySubject(1);\r\n\r\n\tconstructor(private _configSvc: ConfigurationService) {\r\n\t\tthis.getUser().subscribe(user => {\r\n\t\t\tif (user && !user.expired) {\r\n\t\t\t\tthis.user = user;\r\n\t\t\t\tthis._isAuthenticatedStream.next(true);\r\n\t\t\t} else {\r\n\t\t\t\tthis._isAuthenticatedStream.next(false);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate getClientSettings(): UserManagerSettings {\r\n\t\tconst settings = this._configSvc.configuration;\r\n\r\n\t\treturn {\r\n\t\t\tauthority: settings.sso.baseUrl,\r\n\t\t\tclient_id: settings.sso.clientId,\r\n\t\t\tredirect_uri: `${settings.baseUrl}/auth-callback`,\r\n\t\t\tpost_logout_redirect_uri: settings.baseUrl,\r\n\t\t\tresponse_type: 'id_token token',\r\n\t\t\tscope: settings.sso.scope,\r\n\t\t\tfilterProtocolClaims: true,\r\n\t\t\tloadUserInfo: true\r\n\t\t};\r\n\t}\r\n\r\n\tpublic getUser(): Observable {\r\n\t\treturn from(this._manager.getUser());\r\n\t}\r\n\r\n\tpublic login(returnUrl: string = null): Observable {\r\n\t\tlet data: any = {\r\n\t\t\tdata: returnUrl,\r\n\t\t\tacr_values: 'idp:aad'\r\n\t\t};\r\n\r\n\t\treturn from(\r\n\t\t\tthis._manager.clearStaleState().then(() => {\r\n\t\t\t\tthis._manager.signinRedirect(data);\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n\tpublic loggedIn(): Observable {\r\n\t\treturn from(this._manager.signinRedirectCallback())\r\n\t\t\t.pipe(\r\n\t\t\t\tmap((user) => {\r\n\t\t\t\t\tthis.user = user;\r\n\r\n\t\t\t\t\tthis._isAuthenticatedStream.next(!!this.user && !this.user.expired);\r\n\t\t\t\t\treturn user.state;\r\n\t\t\t\t})\r\n\t\t\t);\r\n\t}\r\n\r\n\tpublic renewToken(): Observable {\r\n\t\treturn from(this._manager.signinSilent());\r\n\t}\r\n\r\n\tpublic logout(): Observable {\r\n\t\treturn from(this._manager.signoutRedirect());\r\n\t}\r\n\r\n\t// reverted this since tihs was \"working\"... albeit inefficiently. will fix later\r\n\tpublic isAuthenticated(): Observable {\r\n\t\treturn this._isAuthenticatedStream.asObservable();\r\n\t}\r\n\r\n\tpublic getAuthorizationHeaderValue(): string {\r\n\t\treturn (this.user && !this.user.expired ? `${this.user.token_type} ${this.user.access_token}` : null);\r\n\t}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { CanDeactivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';\r\nimport { Observable } from 'rxjs';\r\n\r\nexport interface CanComponentDeactivate {\r\n\tcanDeactivate: (route: ActivatedRouteSnapshot, state: RouterStateSnapshot, nextState: RouterStateSnapshot) => Observable | Promise | boolean;\r\n}\r\n\r\n@Injectable()\r\nexport class CanDeactivateGuard implements CanDeactivate {\r\n\r\n\tcanDeactivate(component: CanComponentDeactivate, route: ActivatedRouteSnapshot, state: RouterStateSnapshot, nextState: RouterStateSnapshot) {\r\n\t\treturn component.canDeactivate ? component.canDeactivate(route, state, nextState) : true;\r\n\t}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\n\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\nimport { ODataResult } from '../../models/oData/odata-result.model';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class CategoryService {\r\n\r\n\tprivate _urlBase: string = \"odata/category\";\r\n\r\n\tconstructor(private _httpClient: HttpClient) { }\r\n\r\n\tpublic getCategories(): Observable> {\r\n\t\treturn this._httpClient.get>(`${this._urlBase}?$orderby=name asc`).pipe(\r\n\t\t\tmap(response => response.value)\r\n\t\t);\r\n\t}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';\r\n\r\nimport { Observable } from 'rxjs';\r\nimport { map, filter } from 'rxjs/operators';\r\nimport { Comment } from '../../models/comments/comment.model';\r\nimport { CommentViewModel } from '../../models/comments/comment-view.model';\r\n\r\nconst httpOptions = {\r\n\theaders: new HttpHeaders({\r\n\t\t'Content-Type': 'application/json',\r\n\t})\r\n};\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class CommentService {\r\n\r\n\tprivate _urlBase: string = \"api/comments\";\r\n\r\n\tprivate _subscription: string;\r\n\r\n\tconstructor(private _httpClient: HttpClient) { }\r\n\t\r\n\tpublic getComments(threadId: string): Observable> {\r\n\t\treturn this._httpClient.get>(this._urlBase + `/${threadId}`);\t\t\t\r\n\t}\r\n\r\n\tpublic addComment(newCommentModel: CommentViewModel): Observable {\r\n\t\tif (!newCommentModel.parentId) newCommentModel.parentId = null;\r\n\t\t\r\n\t\treturn this._httpClient\r\n\t\t\t.post(this._urlBase, newCommentModel, httpOptions);\r\n\t\t\t\r\n\t}\r\n\t\r\n\tpublic updateComment(newCommentModel: CommentViewModel): Observable {\r\n\t\tif (!newCommentModel.parentId) newCommentModel.parentId = null;\r\n\r\n\t\treturn this._httpClient\r\n\t\t\t.put(this._urlBase, newCommentModel, httpOptions);\r\n\r\n\t}\r\n\r\n}\r\n","import { IncidentDevelopmentEscalationActivity } from '../../models/incidents/incident-development-escalation-activity.model';\r\nimport { IncidentUpdateActivity } from '../../models/incidents/incident-update-activity.model';\r\nimport { IncidentResolutionActivity } from '../../models/incidents/incident-resolution-activity.model';\r\nimport { IncidentTaskActivity } from '../../models/incidents/incident-task-activity.model';\r\nimport { IncidentActivity } from '../../models/incidents/incident-activity.model';\r\n\r\nexport class IncidentActivitiesService {\r\n\r\n\tprivate _isOpen: boolean = false;\r\n\r\n\tconstructor() { }\r\n\r\n\tprivate highlightKeywords(value: string, keyword: string): string {\r\n\t\tif (!value || !keyword) {\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\t\tlet escapedKeyword = this.escapeRegex(keyword);\r\n\r\n\t\tlet imageProtector = new Map();\r\n\r\n\t\t// this is to prevent issues where words like \"Activities\" or \"Download\" would break image links because it would put the highlighting string in the image source\r\n\t\t// replaces all images with guids\r\n\t\tlet imgMatches = value.match(new RegExp(\"\", 'gi'));\r\n\t\tif (imgMatches) {\r\n\t\t\timgMatches.forEach(match => {\r\n\t\t\t\tlet guid = this.newGuid();\r\n\t\t\t\timageProtector.set(guid, match);\r\n\r\n\t\t\t\tvalue = value.replace(match, guid);\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\tlet valueMatches = value.match(new RegExp(`(${escapedKeyword})`, 'gi'));\r\n\t\tif (valueMatches) {\r\n\t\t\tthis._isOpen = true;\r\n\t\t}\r\n\r\n\t\tvalue = value.replace(new RegExp(`(${escapedKeyword})`, 'gi'), `${keyword}`);\r\n\r\n\t\t// replace the temporary guids with the original img values now that we've done our highlights\r\n\t\timageProtector.forEach((protectorValue: string, key: string) => {\r\n\t\t\tvalue = value.replace(key, protectorValue);\r\n\t\t});\r\n\r\n\t\treturn value;\r\n\t}\r\n\r\n\t// took sample here and seems to be working nicely https://stackoverflow.com/a/26502275\r\n\tprivate newGuid() {\r\n\t\treturn 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n\t\t\tlet r = Math.random() * 16 | 0,\r\n\t\t\t\tv = c == 'x' ? r : (r & 0x3 | 0x8);\r\n\t\t\treturn v.toString(16);\r\n\t\t});\r\n\t}\r\n\r\n\t// need equivalent of Regex.Escape - found sample here https://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\r\n\tprivate escapeRegex(stringToEscape: string) {\r\n\t\treturn stringToEscape.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/gi, '\\\\$&');\r\n\t}\r\n\r\n\tpublic formatActivity(activity: IncidentActivity, keyword: string): IncidentActivity {\r\n\t\tactivity.description = this.highlightKeywords(activity.description, keyword);\r\n\t\tactivity.subject = this.highlightKeywords(activity.subject, keyword);\r\n\r\n\t\tswitch (activity.type) {\r\n\t\t\tcase 'DevelopmentEscalationActivity':\r\n\t\t\t\t(activity as IncidentDevelopmentEscalationActivity).developmentTeam = this.highlightKeywords((activity as IncidentDevelopmentEscalationActivity).developmentTeam, keyword);\r\n\t\t\t\t(activity as IncidentDevelopmentEscalationActivity).otherTeam = this.highlightKeywords((activity as IncidentDevelopmentEscalationActivity).otherTeam, keyword);\r\n\t\t\t\t(activity as IncidentDevelopmentEscalationActivity).tierTwoTeam = this.highlightKeywords((activity as IncidentDevelopmentEscalationActivity).tierTwoTeam, keyword);\r\n\t\t\t\t(activity as IncidentDevelopmentEscalationActivity).businessImpact = this.highlightKeywords((activity as IncidentDevelopmentEscalationActivity).businessImpact, keyword);\r\n\t\t\t\t(activity as IncidentDevelopmentEscalationActivity).criticalAfterHoursReason = this.highlightKeywords((activity as IncidentDevelopmentEscalationActivity).criticalAfterHoursReason, keyword);\r\n\t\t\t\t(activity as IncidentDevelopmentEscalationActivity).subject = this.highlightKeywords((activity as IncidentDevelopmentEscalationActivity).subject, keyword);\r\n\t\t\t\t(activity as IncidentDevelopmentEscalationActivity).escalationPurpose = this.highlightKeywords((activity as IncidentDevelopmentEscalationActivity).escalationPurpose, keyword);\r\n\t\t\t\t(activity as IncidentDevelopmentEscalationActivity).issueSummary = this.highlightKeywords((activity as IncidentDevelopmentEscalationActivity).issueSummary, keyword);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'UpdateActivity':\r\n\t\t\t\t(activity as IncidentUpdateActivity).systemLogCuts = this.highlightKeywords((activity as IncidentUpdateActivity).systemLogCuts, keyword);\r\n\t\t\t\t(activity as IncidentUpdateActivity).systemLogAnalysis = this.highlightKeywords((activity as IncidentUpdateActivity).systemLogAnalysis, keyword);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'ResolutionActivity':\r\n\t\t\t\t(activity as IncidentResolutionActivity).findings = this.highlightKeywords((activity as IncidentResolutionActivity).findings, keyword);\r\n\t\t\t\t(activity as IncidentResolutionActivity).underlyingCause = this.highlightKeywords((activity as IncidentResolutionActivity).underlyingCause, keyword);\r\n\t\t\t\t(activity as IncidentResolutionActivity).secondaryCause = this.highlightKeywords((activity as IncidentResolutionActivity).secondaryCause, keyword);\r\n\t\t\t\t(activity as IncidentResolutionActivity).tertiaryCause = this.highlightKeywords((activity as IncidentResolutionActivity).tertiaryCause, keyword);\r\n\t\t\t\t(activity as IncidentResolutionActivity).patchIdScriptServicePackOrMR = this.highlightKeywords((activity as IncidentResolutionActivity).patchIdScriptServicePackOrMR, keyword);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'TaskActivity':\r\n\t\t\t\t(activity as IncidentTaskActivity).systemLogCuts = this.highlightKeywords((activity as IncidentTaskActivity).systemLogCuts, keyword);\r\n\t\t\t\t(activity as IncidentTaskActivity).systemLogAnalysis = this.highlightKeywords((activity as IncidentTaskActivity).systemLogAnalysis, keyword);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tactivity.isDisplayOpen = this._isOpen;\r\n\r\n\t\tthis._isOpen = false;\r\n\r\n\t\treturn activity;\r\n\t}\r\n\r\n\tpublic filterActivityType(activities: Array, activityTypes: string[]) {\r\n\t\tlet filteredActivities = new Array();\r\n\t\tactivities.forEach(activity => {\r\n\t\t\tactivityTypes.forEach(type => {\r\n\t\t\t\tif (activity.type == type) {\r\n\t\t\t\t\tfilteredActivities.push(activity);\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t});\r\n\r\n\t\treturn filteredActivities;\r\n\t}\r\n\r\n\tpublic filterEscalationEmailActivities(activities: Array, aliases: Array): Array {\r\n\t\tlet filteredActivities = new Array();\r\n\t\tactivities.forEach(activity => {\r\n\t\t\taliases.forEach(alias => {\r\n\t\t\t\tif (activity.type == 'UpdateActivity' &&\r\n\t\t\t\t\t(((activity as IncidentUpdateActivity).to && (activity as IncidentUpdateActivity).to.match(alias)) ||\r\n\t\t\t\t\t\t((activity as IncidentUpdateActivity).cc && (activity as IncidentUpdateActivity).cc.match(alias)))) {\r\n\t\t\t\t\tfilteredActivities.push(activity);\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t});\r\n\r\n\t\treturn filteredActivities;\r\n\t}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { forEach } from '@angular/router/src/utils/collection';\r\n\r\nimport { forkJoin, Observable, Subscription } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\nimport { Article } from '../../models/articles/article.model';\r\nimport { ArticleTargetedVersion } from '../../models/articles/article-targeted-version.model';\r\nimport { Incident } from '../../models/incidents/incident.model';\r\nimport { IncidentActivity } from '../../models/incidents/incident-activity.model';\r\nimport { IncidentDevelopmentEscalationActivity } from '../../models/incidents/incident-development-escalation-activity.model';\r\nimport { IncidentQualityVote } from '../../models/incidents/incident-quality-vote.model';\r\nimport { IncidentResolutionActivity } from '../../models/incidents/incident-resolution-activity.model';\r\nimport { FieldEscalationSubmission } from '../../models/incidents/incident-field-escalation-submission.model';\r\nimport { TechnicalNoteArticle } from '../../models/articles/article-technical-note.model';\r\n\r\nimport { ApplicationVersionsService } from '../application-versions/application-versions.service';\r\nimport { IncidentActivitiesService } from '../incident-activities/incident-activities.service';\r\n\r\nimport { AuthService } from '../auth/auth.service';\r\nimport { ConfigurationService } from '../../../modules/runtime-configuration/services/configuration.service';\r\nimport { Contact, ContactRes } from '../../models/incidents/incident-contact.model';\r\nimport { CaseSubscription } from '../../models/incidents/incident-subscription.model';\r\nimport { InternalNote } from '../../models/incidents/incident-internal-note.model';\r\nimport { IncidentApiResponse, IncidentApiResponseCategories, IncidentApiResponseCommcell } from '../../../shared/models/api-response.model';\r\n\r\nconst httpOptions = {\r\n\theaders: new HttpHeaders({\r\n\t\t'Content-Type': 'application/json',\r\n\t})\r\n};\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class IncidentService {\r\n\r\n\tprivate _urlBase: string = \"api/incidents\";\r\n\r\n\tprivate _activitiesService: IncidentActivitiesService = new IncidentActivitiesService();\r\n\r\n\tconstructor(private _httpClient: HttpClient, private _configSvc: ConfigurationService, private _authService: AuthService, private _applicationVersionService: ApplicationVersionsService) { }\r\n\r\n\tpublic getIncident(id: string): Observable {\r\n\t\treturn this._httpClient.get(this._configSvc.configuration.incidentBaseUrl + `/Incidents/${id}`);\r\n\t}\r\n\r\n\tpublic getResolution(id: string): Observable {\r\n\t\treturn this._httpClient.get(this._configSvc.configuration.incidentBaseUrl + `/Incidents/${id}/resolution`);\r\n\t}\r\n\r\n\tpublic getActivities(incidentId: string, filter: string, pageSize?: number, searchTerms?: string): Observable> {\r\n\t\tlet queryParams: Array = new Array();\r\n\r\n\t\tqueryParams.push(`$filter=${[filter, 'statecode eq 1'].filter(n => n).join(' and ')}`);\r\n\t\tif (filter) {\r\n\r\n\t\t\t// if we are adding a filter on the API, it's possible we may miss the target expected pageSize when we apply a client-side filter\r\n\t\t\t// to achieve the proper pageSize, triple the pageSize to be requested externally\r\n\t\t\tif (pageSize) {\r\n\t\t\t\tpageSize = pageSize * 3;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet query = '';\r\n\t\tif (queryParams.length != 0) {\r\n\t\t\tquery = `${queryParams[0]}`;\r\n\r\n\t\t\tfor (var i = 1; i < queryParams.length; i++) {\r\n\t\t\t\tquery = `${query}&${queryParams[i]}`;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet incidentApiQuery = `${this._configSvc.configuration.incidentBaseUrl}/Incidents/${incidentId}/Activities?${query}&$orderby=modifiedon desc`;\r\n\t\tif (pageSize) {\r\n\t\t\tincidentApiQuery = `${incidentApiQuery}&$top=${pageSize}`;\r\n\t\t}\r\n\r\n\t\treturn this._httpClient.get(incidentApiQuery).pipe(\r\n\t\t\tmap(activities => {\r\n\t\t\t\tlet incidentActivities = new Array();\r\n\t\t\t\tactivities['value'].map(activity => {\r\n\t\t\t\t\tactivity.type = activity['@odata.type'].replace('#CV.Common.Entities.Incidents.', '');\r\n\t\t\t\t\tif (searchTerms) {\r\n\t\t\t\t\t\tactivity = this._activitiesService.formatActivity((activity as IncidentActivity), searchTerms);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tincidentActivities.push(activity);\r\n\t\t\t\t})\r\n\r\n\t\t\t\tif (filter) {\r\n\t\t\t\t\tlet filteredActivities = new Array();\r\n\r\n\t\t\t\t\tif (filter.match('\\'Email\\'')) {\r\n\t\t\t\t\t\tthis._activitiesService.filterEscalationEmailActivities(incidentActivities, this._configSvc.configuration.incidentEscalationFilterEmailAliases)\r\n\t\t\t\t\t\t\t.forEach(activity => {\r\n\t\t\t\t\t\t\t\tfilteredActivities.push(activity);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (filter.match('\\'TaskActivity\\'')) {\r\n\t\t\t\t\t\tlet types = new Array();\r\n\t\t\t\t\t\ttypes.push('TaskActivity');\r\n\r\n\t\t\t\t\t\tthis._activitiesService.filterActivityType(incidentActivities, types)\r\n\t\t\t\t\t\t\t.forEach(activity => {\r\n\t\t\t\t\t\t\t\tfilteredActivities.push(activity);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (filter.match('\\'DevelopmentEscalationActivity\\'')) {\r\n\t\t\t\t\t\tlet types = new Array();\r\n\t\t\t\t\t\ttypes.push('DevelopmentEscalationActivity');\r\n\r\n\t\t\t\t\t\tthis._activitiesService.filterActivityType(incidentActivities, types)\r\n\t\t\t\t\t\t\t.forEach(activity => {\r\n\t\t\t\t\t\t\t\tfilteredActivities.push(activity);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// make sure the activities are in the right order\r\n\t\t\t\t\tfilteredActivities.sort((a, b) => (a.modifiedOn < b.modifiedOn) ? 1 : ((b.modifiedOn < a.modifiedOn) ? -1 : 0));\r\n\r\n\t\t\t\t\tif (pageSize) {\r\n\t\t\t\t\t\t// we need to reduce the result size to a maximum of the original pageSize value\r\n\t\t\t\t\t\treturn filteredActivities.slice(0, pageSize / 3);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\treturn filteredActivities;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn incidentActivities;\r\n\t\t\t}\r\n\t\t\t)\r\n\t\t);\r\n\r\n\t}\r\n\r\n\tpublic getIncidentQualityVote(incidentId: string): Observable {\r\n\t\treturn this._httpClient.get(this._urlBase + `/${incidentId}/votes`);\r\n\t}\r\n\r\n\tpublic getIncidentQualityVoteScore(incidentId: string): Observable {\r\n\t\treturn this._httpClient.get(this._urlBase + `/${incidentId}/votes/count`);\r\n\t}\r\n\r\n\tpublic voteAsync(incidentId: string, vote: number): Observable {\r\n\t\treturn this._httpClient\r\n\t\t\t.post(this._urlBase + `/${incidentId}/votes`, vote, httpOptions);\r\n\t}\r\n\r\n\tpublic isLastActivityFieldEscalation(incidentId: string): Observable {\r\n\t\treturn this.getActivities(incidentId, null, 1, null).pipe(\r\n\t\t\tmap(activities => {\r\n\t\t\t\tif (activities[0] && activities[0].type == 'FieldEscalationActivity') {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n\tpublic escalateIncident(incidentId: string, emailCC: string[], escalationDescription: string): Observable {\r\n\t\tlet fieldEscalationSubmission = new FieldEscalationSubmission();\r\n\t\tfieldEscalationSubmission.emailAddress = this._authService.user.profile.email;\r\n\t\tfieldEscalationSubmission.userFullName = this._authService.user.profile.name;\r\n\t\tfieldEscalationSubmission.emailCC = emailCC;\r\n\t\tfieldEscalationSubmission.escalationDescription = escalationDescription;\r\n\r\n\t\treturn this._httpClient\r\n\t\t\t.post(this._configSvc.configuration.incidentBaseUrl + `/Incidents/${incidentId}/escalate`, JSON.stringify(fieldEscalationSubmission), httpOptions);\r\n\t}\r\n\r\n\tpublic reindexIncident(incidentId: string): Observable {\r\n\t\treturn this._httpClient.post(this._configSvc.configuration.incidentBaseUrl + `/Incidents/${incidentId}/Reindex`, null, httpOptions);\r\n\t}\r\n\r\n\tpublic async getCommcell(searchParam: string): Promise {\r\n\t\treturn await this._httpClient.get(this._configSvc.configuration.incidentBaseUrl + `/Commcell/${searchParam}`).toPromise();\r\n\t}\r\n\r\n\tpublic async getCategories(searchParam: string): Promise {\r\n\t\treturn await this._httpClient.get(this._configSvc.configuration.incidentBaseUrl + `/Category/${searchParam}/ChildCategories`).toPromise();\r\n\t}\r\n\r\n\tpublic getMatchingContacts(accountId: string, searchString: string): Observable {\r\n\t\tlet paramaters = {\r\n\t\t\t\"searchString\": searchString + \"\"\r\n\t\t};\r\n\t\treturn this._httpClient.get(this._configSvc.configuration.incidentBaseUrl + `/Account/${accountId}/GetContacts`, { params: paramaters });\r\n\t}\r\n\r\n\tpublic async getSecondaryContacts(email: string): Promise {\r\n\t\treturn await this._httpClient.get(this._configSvc.configuration.incidentBaseUrl + `/Contact/${email}`).toPromise();\r\n\t}\r\n\r\n\tpublic async createContact(contact: Contact): Promise {\r\n\t\treturn await this._httpClient.post(this._configSvc.configuration.incidentBaseUrl + `/Contact/Create`, contact, httpOptions).toPromise();\r\n\t}\r\n\r\n\tpublic async createTicket(incident: Incident): Promise {\r\n\t\treturn await this._httpClient.post(this._configSvc.configuration.incidentBaseUrl + `/Incidents/Create`, incident, httpOptions).toPromise();\r\n\t}\r\n\r\n\tpublic createInternalNote(incidentId: string, request: InternalNote): Observable {\r\n\t\treturn this._httpClient.post(this._configSvc.configuration.incidentBaseUrl + `/Incidents/${incidentId}/Note`, request, httpOptions);\r\n\t}\r\n\r\n\tpublic getCaseSubscriptions(incidentId: string): Observable {\r\n\t\treturn this._httpClient.get(this._configSvc.configuration.incidentBaseUrl + `/Incidents/${incidentId}/Subscriptions`);\r\n\t}\r\n\r\n\tpublic subscribeToCase(incidentId: string, caseSubscription: CaseSubscription): Observable {\r\n\t\treturn this._httpClient.post(this._configSvc.configuration.incidentBaseUrl + `/Incidents/${incidentId}/Subscribe`, caseSubscription, httpOptions);\r\n\t}\r\n\r\n\tpublic unsubscribeToCase(incidentId: string, caseSubscription: CaseSubscription): Observable {\r\n\t\treturn this._httpClient.post(this._configSvc.configuration.incidentBaseUrl + `/Incidents/${incidentId}/Unsubscribe`, caseSubscription, httpOptions);\r\n\t}\r\n\r\n\tpublic getAccountSubscriptions(incidentId: string): Observable {\r\n\t\treturn this._httpClient.get(this._configSvc.configuration.incidentBaseUrl + `/Account/${incidentId}/Subscriptions`);\r\n\t}\r\n\r\n\tpublic subscribeToAccount(accountId: string, caseSubscription: CaseSubscription): Observable {\r\n\t\treturn this._httpClient.post(this._configSvc.configuration.incidentBaseUrl + `/Account/${accountId}/Subscribe`, caseSubscription, httpOptions);\r\n\t}\r\n\r\n\tpublic unsubscribeToAccount(accountId: string, caseSubscription: CaseSubscription): Observable {\r\n\t\treturn this._httpClient.post(this._configSvc.configuration.incidentBaseUrl + `/Account/${accountId}/Unsubscribe`, caseSubscription, httpOptions);\r\n\t}\r\n\r\n\tpublic getCCUsers(searchString: string): Observable> {\r\n\t\treturn this._httpClient.get>(this._configSvc.configuration.incidentBaseUrl + `/Contact/${searchString}/SystemUsers`);\r\n\t}\r\n}\r\n","import { ErrorHandler, Injectable, Injector } from '@angular/core';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\n\r\nimport { LoggingService } from './logging.service';\r\nimport { AlertService } from '../alert/alert.service';\r\n\r\n@Injectable()\r\nexport class ErrorHandlerService implements ErrorHandler {\r\n\r\n\tconstructor(private _injector: Injector) { }\r\n\r\n\thandleError(error: Error | HttpErrorResponse) {\r\n\t\tlet alertService = this._injector.get(AlertService);\r\n\r\n\t\tif (error instanceof HttpErrorResponse) {\r\n\t\t\tif (!navigator.onLine) {\r\n\t\t\t\talertService.show('Network connectivity seems to be down. Please resolve and then try action again.');\r\n\t\t\t} else if (error.status == 401 || error.status == 404) {\r\n\t\t\t\t// swallow the error since this in not an error we want to output\r\n\t\t\t\treturn;\r\n\t\t\t} else {\r\n\t\t\t\t// all other errors, show an error message\r\n\t\t\t\t// logs to the alert service so a component listening on the subscription can show the error\r\n\t\t\t\talertService.show('An unexpected error seems to have occurred. Please try the action again or refresh your page. If the problem continues, you can contact the BATS-Alexandria team for assistance.');\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet loggingService = this._injector.get(LoggingService);\r\n\t\t\tloggingService.logError(error, 'ErrorHandlerService');\r\n\t\t}\r\n\r\n\t\t// log on the server\r\n\t\tthrow error;\r\n\t}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\nimport { AppInsights } from 'applicationinsights-js';\r\n\r\nimport { ConfigurationService } from '../../../modules/runtime-configuration/services/configuration.service';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class LoggingService{\r\n\r\n\tprivate props: any;\r\n\r\n\tprivate config: Microsoft.ApplicationInsights.IConfig;\r\n\r\n\tconstructor(private _configSvc: ConfigurationService) {\r\n\t\tconst settings = this._configSvc.configuration;\r\n\r\n\t\tthis.props = {\r\n\t\t\t'CvApp': settings.logging.appName,\r\n\t\t\t'CvEnvironment': settings.logging.environment,\r\n\t\t\t'CvMachineName': 'Browser',\r\n\t\t};\r\n\r\n\t\tthis.config = {\r\n\t\t\tinstrumentationKey: settings.logging.instrumentationKey\r\n\t\t}\r\n\r\n\t\tif (!AppInsights.config) {\r\n\t\t\tAppInsights.downloadAndSetup(this.config);\r\n\t\t};\r\n\r\n\t\t//The following code is recommended for initialization:\r\n\t\t//https://github.com/Microsoft/ApplicationInsights-JS/blob/master/API-reference.md#addtelemetryinitializer\r\n\t\t(window).appInsights = AppInsights;\r\n\r\n\t\t// Add telemetry initializer\r\n\t\tAppInsights.queue.push(function () {\r\n\t\t\tAppInsights.context.addTelemetryInitializer(function (envelope) {\r\n\t\t\t\tvar telemetryItem = envelope.data.baseData;\r\n\r\n\t\t\t\ttelemetryItem.properties = telemetryItem.properties || {};\r\n\t\t\t\ttelemetryItem.properties[\"CvApp\"] = settings.logging.appName;\r\n\t\t\t\ttelemetryItem.properties[\"CvEnvironment\"] = settings.logging.environment;\r\n\t\t\t\ttelemetryItem.properties[\"CvMachineName\"] = 'Browser';\t\t\t\t\t\t\t\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\tlogPageView(name?: string, url?: string, properties?: any, measurements?: any, duration?: number) {\r\n\t\tif (properties !== undefined && properties !== null) {\r\n\t\t\tthis.props = properties;\r\n\t\t}\r\n\t\tAppInsights.trackPageView(name, url, this.props, measurements, duration);\r\n\t}\r\n\r\n\tlogEvent(name: string, properties?: any, measurements?: any) {\r\n\t\tif (properties !== undefined && properties !== null) {\r\n\t\t\tthis.props = properties;\r\n\t\t}\r\n\t\tAppInsights.trackEvent(name, this.props, measurements);\r\n\t}\r\n\r\n\tlogError(exception: Error, handledAt?: string) {\r\n\t\tAppInsights.trackException(exception, handledAt, this.props);\r\n\t}\r\n\r\n}\r\n","import { Injectable, Inject } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\n\r\nimport { Observable } from 'rxjs';\r\n\r\nconst httpOptions = {\r\n\theaders: new HttpHeaders({\r\n\t\t'Content-Type': 'application/json',\r\n\t})\r\n};\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class MessageService {\r\n\r\n\tprivate _urlBase: string = \"api/messages\";\r\n\r\n\tconstructor(private _httpClient: HttpClient) { }\r\n\r\n\tpublic getMessages(): Observable> {\r\n\t\treturn this._httpClient.get>(`${this._urlBase}/messages`);\r\n\t}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\n\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\nimport { PeriodOption } from '../../models/periods/period-option.model';\r\nimport { AllPeriodsResult } from '../../models/periods/all-periods-result.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PeriodService {\r\n\r\n\tprivate _urlBase: string = \"api/period\";\r\n\r\n\tconstructor(private _httpClient: HttpClient) { }\r\n\r\n\tpublic getPeriods(): Observable {\r\n\t\treturn this._httpClient.get(this._urlBase + \"/all\").pipe(\r\n\t\t\tmap(data => {\r\n\t\t\t\treturn data;\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';\r\nimport { Observable, of, Subject } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\nimport { PermissionService } from './permission.service';\r\nimport { AuthService } from '../auth/auth.service';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class AuthPermissionsGuard implements CanActivate {\r\n\r\n\tconstructor(private _permissionService: PermissionService, private _router: Router, private _authService: AuthService) {\r\n\t}\r\n\r\n\tpublic canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable {\r\n\t\tlet roles = route.data['roles'] as Array;\r\n\r\n\t\treturn new Observable(observer => {\r\n\t\t\tthis._authService.isAuthenticated().subscribe(authenticated => {\r\n\t\t\t\tif (authenticated) {\r\n\t\t\t\t\t// if no roles are passed in to this route, then we assume eveyone can access\r\n\t\t\t\t\tif (!roles || !roles.length) {\r\n\t\t\t\t\t\tobserver.next(true);\r\n\t\t\t\t\t\tobserver.complete();\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis._permissionService.getMyPermissions().subscribe(result => {\r\n\t\t\t\t\t\tlet filter = result.filter(res => {\r\n\t\t\t\t\t\t\treturn roles.indexOf(res.name.toLowerCase()) > -1;\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\tobserver.next(!!filter.length);\r\n\t\t\t\t\t\tobserver.complete();\r\n\t\t\t\t\t});\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis._authService.login(state.url);\r\n\t\t\t\t\tobserver.next(false);\r\n\t\t\t\t\tobserver.complete();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { HttpClient } from '@angular/common/http';\r\n\r\nimport { Observable, of, ReplaySubject } from \"rxjs\";\r\n\r\nimport { Permission } from \"../../models/permissions/permission.model\";\r\nimport { map } from \"rxjs/operators\";\r\n\r\n@Injectable({\r\n\tprovidedIn: \"root\"\r\n})\r\nexport class PermissionService {\r\n\r\n\tprivate _urlBase: string = \"api/permissions\";\r\n\r\n\tprivate _doPermissionsFetch: boolean = true;\r\n\r\n\tprivate _doMyPermissionsFetch: boolean = true;\r\n\r\n\tprivate _permissionsStream = new ReplaySubject>(1);\r\n\r\n\tprivate _myPermissionsStream = new ReplaySubject>(1);\r\n\r\n\tconstructor(private _http: HttpClient) {\r\n\t}\r\n\r\n\tprivate fetchPermissions(): void {\r\n\t\tconst url = `${this._urlBase}`;\r\n\r\n\t\tconsole.debug(`PermissionService | fetchPermissions() | Fetching '${url}'...`);\r\n\t\tthis._http\r\n\t\t\t.get>(url)\r\n\t\t\t.subscribe(perms => {\r\n\t\t\t\tthis._permissionsStream.next(perms);\r\n\t\t\t});\r\n\t}\r\n\r\n\tprivate fetchMyPermissions(): void {\r\n\t\tconst url = `${this._urlBase}/my`;\r\n\r\n\t\tconsole.debug(`PermissionService | fetchMyPermissions() | Fetching '${url}'...`);\r\n\t\tthis._http\r\n\t\t\t.get>(url)\r\n\t\t\t.subscribe(perms => {\r\n\t\t\t\tthis._myPermissionsStream.next(perms);\r\n\t\t\t});\r\n\t}\r\n\r\n\tpublic getPermissions(): Observable> {\r\n\t\tconsole.debug('PermissionService | getPermissions()');\r\n\r\n\t\t// this is stupid...I cannot seem to find a way to *check* if the stream has a value\r\n\t\t// therefore I am stuck with using this flag\r\n\t\tif (this._doPermissionsFetch) {\r\n\t\t\tthis._doPermissionsFetch = false;\r\n\t\t\tthis.fetchPermissions();\r\n\t\t}\r\n\r\n\t\treturn this._permissionsStream.asObservable();\r\n\t}\r\n\r\n\tpublic getMyPermissions(): Observable> {\r\n\t\t//console.debug('PermissionService | getMyPermissions()');\r\n\r\n\t\tif (this._doMyPermissionsFetch) {\r\n\t\t\tthis.fetchMyPermissions();\r\n\t\t\tthis._doMyPermissionsFetch = false;\r\n\t\t}\r\n\r\n\t\treturn this._myPermissionsStream.asObservable();\r\n\t}\r\n\r\n\tpublic hasPermission(permissionName: Array): Observable {\r\n\t\treturn new Observable((observer) => {\r\n\t\t\tif (!permissionName) {\r\n\t\t\t\tobserver.next(false);\r\n\t\t\t\tobserver.complete();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis.getMyPermissions()\r\n\t\t\t\t.subscribe(perms => {\r\n\t\t\t\t\tlet permissions = perms.filter(x => {\r\n\t\t\t\t\t\treturn permissionName.indexOf(x.name.toLowerCase()) > -1;\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tconsole.debug(`PermissionService | hasPermission() | permission : '${permissionName}' -- granted : '${!!permissions.length}'`);\r\n\r\n\t\t\t\t\tobserver.next(!!permissions.length);\r\n\t\t\t\t\tobserver.complete();\r\n\t\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\tpublic canReadPrivateArticles(): Observable {\r\n\t\treturn new Observable((observer) => {\r\n\t\t\tthis.getMyPermissions().subscribe(permission => {\r\n\t\t\t\tlet perm = !!permission\r\n\t\t\t\t\t.filter(x => x.name == \"view-internal-articles\" || x.name == \"view-private-articles\" || x.name == \"compose-internal-articles\" || x.name == \"compose-private-articles\")\r\n\t\t\t\t\t.length;\r\n\t\t\t\tobserver.next(perm);\r\n\t\t\t\tobserver.complete();\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\tpublic canApproveArticles(): Observable {\r\n\t\treturn new Observable((observer) => {\r\n\t\t\tthis.getMyPermissions().subscribe(permission => {\r\n\t\t\t\tlet perm = !!permission\r\n\t\t\t\t\t.filter(x => x.name == \"approve-public-articles\")\r\n\t\t\t\t\t.length;\r\n\t\t\t\tobserver.next(perm);\r\n\t\t\t\tobserver.complete();\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\tpublic canReviewArticles(): Observable {\r\n\t\treturn new Observable((observer) => {\r\n\t\t\tthis.getMyPermissions().subscribe(permission => {\r\n\t\t\t\tlet perm = !!permission\r\n\t\t\t\t\t.filter(x => x.name == \"review-public-articles\")\r\n\t\t\t\t\t.length;\r\n\t\t\t\tobserver.next(perm);\r\n\t\t\t\tobserver.complete();\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\tpublic canEditorialReviewArticles(): Observable {\r\n\t\treturn new Observable((observer) => {\r\n\t\t\tthis.getMyPermissions().subscribe(permission => {\r\n\t\t\t\tlet perm = !!permission\r\n\t\t\t\t\t.filter(x => x.name == \"editorial-review-public-articles\")\r\n\t\t\t\t\t.length;\r\n\t\t\t\tobserver.next(perm);\r\n\t\t\t\tobserver.complete();\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\tpublic canManageClassification(): Observable {\r\n\t\treturn new Observable((observer) => {\r\n\t\t\tthis.getMyPermissions().subscribe(permission => {\r\n\t\t\t\tlet perm = !!permission\r\n\t\t\t\t\t.filter(x => x.name == \"manage-classification\")\r\n\t\t\t\t\t.length;\r\n\t\t\t\tobserver.next(perm);\r\n\t\t\t\tobserver.complete();\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { PartnerServiceRequest } from '../../models/psrs/psrs.model';\r\nimport { PartnerServiceRequestActivity } from '../../models/psrs/psrs-activity.model';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class PartnerService {\r\n\tprivate _urlBase: string = \"api/PartnerServiceRequest\";\r\n\r\n\tconstructor(private _httpClient: HttpClient) { }\r\n\r\n\tpublic getPartnerServiceRequest(id: string): Observable {\r\n\t\treturn this._httpClient.get(`${this._urlBase}/${id}`);\r\n\t}\r\n\r\n\tpublic getPartnerServiceRequestActivities(id: string): Observable> {\t\t\r\n\t\treturn this._httpClient.get>(`${this._urlBase}/${id}/Activities`);\r\n\t}\r\n}\r\n","import { Injectable, PACKAGE_ROOT_URL } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\n\r\nimport { Observable, ReplaySubject, of } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\nimport { Role } from '../../models/roles/role.model';\r\nimport { ODataResult } from '../../models/oData/odata-result.model';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class RolesService {\r\n\r\n\tprivate _urlBase: string = \"api/roles\";\r\n\r\n\tprivate _odataUrlBase: string = '/odata/role';\r\n\r\n\tprivate _doRolesFetch: boolean = true;\r\n\r\n\tprivate _rolesStream = new ReplaySubject>(1);\r\n\r\n\tprivate _myRolesStream = new ReplaySubject>(1);\r\n\r\n\tconstructor(private _http: HttpClient) {\r\n\t\tthis.fetchMyRoles();\r\n\t}\r\n\r\n\tprivate fetchRoles(): void {\r\n\t\tconst url = `${this._urlBase}`;\r\n\r\n\t\tconsole.debug(`RolesService | fetchRoles() | Fetching '${url}'...`);\r\n\t\tthis._http\r\n\t\t\t.get>(url)\r\n\t\t\t.subscribe(perms => {\r\n\t\t\t\tthis._rolesStream.next(perms);\r\n\t\t\t});\r\n\t}\r\n\r\n\tprivate fetchMyRoles(): void {\r\n\t\tconst url = `${this._urlBase}/my`;\r\n\r\n\t\tconsole.debug(`RolesService | fetchMyRoles() | Fetching '${url}'...`);\r\n\t\tthis._http\r\n\t\t\t.get>(url)\r\n\t\t\t.subscribe(perms => {\r\n\t\t\t\tthis._myRolesStream.next(perms);\r\n\t\t\t});\r\n\t}\r\n\r\n\tpublic getRoles(): Observable> {\r\n\t\tconsole.debug('RolesService | getRoles()');\r\n\r\n\t\t// this is stupid...I cannot seem to find a way to *check* if the stream has a value\r\n\t\t// therefore I am stuck with using this flag\r\n\t\tif (this._doRolesFetch) {\r\n\t\t\tthis._doRolesFetch = false;\r\n\t\t\tthis.fetchRoles();\r\n\t\t}\r\n\r\n\t\treturn this._rolesStream.asObservable();\r\n\t}\r\n\r\n\tpublic getTeams(): Observable> {\r\n\t\tconsole.debug('RolesService | getTeams()');\r\n\r\n\t\tconst url = `${this._odataUrlBase}?$select=id,name&$filter=isApplicationRole eq false`;\r\n\r\n\t\treturn this._http\r\n\t\t\t.get >>(url)\r\n\t\t\t.pipe(\r\n\t\t\t\tmap(result => result.value)\r\n\t\t\t);\r\n\t}\r\n\r\n\tpublic getMyRoles(): Observable> {\r\n\t\tconsole.debug('RolesService | getMyRoles()');\r\n\r\n\t\treturn this._myRolesStream.asObservable();\r\n\t}\r\n\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { HttpClient, HttpParams } from '@angular/common/http';\r\n\r\nimport { Observable, of } from \"rxjs\";\r\nimport { catchError, map, tap, share, shareReplay } from \"rxjs/operators\";\r\n\r\nimport { SearchResult } from \"../../models/searches/search.result.model\";\r\nimport { UnifiedSearchResponse } from \"../../models/searches/unified-search-response.model\";\r\nimport { SearchRequest } from \"../../models/searches/search.request.model\";\r\nimport { KeyValue } from \"../../models/searches/key-value.model\";\r\n\r\n@Injectable({\r\n\tprovidedIn: \"root\"\r\n})\r\nexport class SearchService {\r\n\r\n\tprivate _urlBase: string = \"api/search\";\r\n\r\n\t// as long as we are using this in search.component this needs to be public\r\n\tpublic params: HttpParams;\r\n\r\n\tconstructor(private http: HttpClient) { }\r\n\r\n\tpublic getSearchResults(searchRequest: SearchRequest): Observable {\r\n\t\t// This explicit filter is to prevent any incidents or escalations with more than 2 downvotes from showing\r\n\t\tif (searchRequest.explicitSearchTerms) {\r\n\t\t\tconst explicitIncidentVotesIndex = (explicitSearchTerms) => explicitSearchTerms.key == 'incidents' && explicitSearchTerms.value == 'votes:[-2 TO *]';\r\n\t\t\tif (searchRequest.explicitSearchTerms.findIndex(explicitIncidentVotesIndex) < 0) {\r\n\t\t\t\tsearchRequest.explicitSearchTerms.push({ key: 'incidents', value: 'votes:[-2 TO *]' });\r\n\t\t\t}\r\n\r\n\t\t\tconst explicitEscalationVotesIndex = (explicitSearchTerms) => explicitSearchTerms.key == 'escalations' && explicitSearchTerms.value == 'votes:[-2 TO *]';\r\n\t\t\tif (searchRequest.explicitSearchTerms.findIndex(explicitEscalationVotesIndex) < 0) {\r\n\t\t\t\tsearchRequest.explicitSearchTerms.push({ key: 'escalations', value: 'votes:[-2 TO *]' });\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tsearchRequest.explicitSearchTerms = new Array();\r\n\t\t\tsearchRequest.explicitSearchTerms.push({ key: 'incidents', value: 'votes:[-2 TO *]' });\r\n\t\t\tsearchRequest.explicitSearchTerms.push({ key: 'escalations', value: 'votes:[-2 TO *]' });\r\n\t\t}\r\n\r\n\t\tlet newRequest = searchRequest;\r\n\r\n\t\tthis.params = this.searchRequestToAliasedParams(searchRequest);\r\n\r\n\t\tconst url = searchRequest && typeof (searchRequest.searchTerms) != \"undefined\" ? `${this._urlBase}` : `${this._urlBase}`;\r\n\r\n\t\treturn this.http\r\n\t\t\t.get(url, { params: this.params })\r\n\t\t\t.pipe(\r\n\t\t\t\tmap(resp => {\r\n\t\t\t\t\t// i don't like hardcoding the collection name here, but result.resultSets[0] will not work here - need to revisit\r\n\r\n\t\t\t\t\t// can't seem to find a cleaner way to do this right now, (possibly revisit later)\r\n\t\t\t\t\t// but we need to transform the object '$values' into an array to be used in the ngFor statements\r\n\t\t\t\t\t// on the search results view\r\n\r\n\t\t\t\t\t// values for article results\r\n\t\t\t\t\tif (resp.resultSets.articles) {\r\n\t\t\t\t\t\tresp.resultSets.articles = resp.resultSets.articles['$values'];\r\n\t\t\t\t\t\tfor (var i = 0; i < resp.resultSets.articles.length; i++) {\r\n\t\t\t\t\t\t\tresp.resultSets.articles[i].articleTypeId = resp.resultSets.articles[i].articleType == \"TechnicalNote\" ? 1 : 3;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// values for incident results\r\n\t\t\t\t\tif (resp.resultSets.incidents) {\r\n\t\t\t\t\t\tresp.resultSets.incidents = resp.resultSets.incidents['$values'];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// values for escalation results\r\n\t\t\t\t\tif (resp.resultSets.escalations) {\r\n\t\t\t\t\t\tresp.resultSets.escalations = resp.resultSets.escalations['$values'];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// values for partner service requests results\r\n\t\t\t\t\tif (resp.resultSets.psrs) {\r\n\t\t\t\t\t\tresp.resultSets.psrs = resp.resultSets.psrs['$values'];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfor (var i = 0; i < resp.facets.length; i++) {\r\n\t\t\t\t\t\tresp.facets[i].items = resp.facets[i].items['$values'];\r\n\t\t\t\t\t\tresp.facets[i].maxItemLength = 0;\r\n\r\n\t\t\t\t\t\tfor (let item of resp.facets[i].items) {\r\n\t\t\t\t\t\t\tresp.facets[i].maxItemLength = Math.max(resp.facets[i].maxItemLength, item.key.length + item.value.toString().length + 3);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn resp;\r\n\t\t\t\t})\r\n\t\t\t);\r\n\t}\r\n\r\n\tprivate isJsObject(o): boolean {\r\n\t\treturn o !== null && (typeof o === 'function' || typeof o === 'object');\r\n\t}\r\n\r\n\tprivate searchRequestToAliasedParams(searchRequest: SearchRequest): HttpParams {\r\n\t\tlet params = new HttpParams();\r\n\r\n\t\tlet add = function (key: string, value: any) {\r\n\t\t\tif (typeof (value) == \"undefined\") {\r\n\t\t\t\tvalue = \"\";\r\n\t\t\t}\r\n\r\n\t\t\tvalue = typeof value === 'function' ? value() : (value === null ? \"\" : value);\r\n\t\t\tparams = params.append(key, value);\r\n\t\t};\r\n\r\n\t\tif (!!searchRequest.searchTerms) {\r\n\t\t\tadd('q', searchRequest.searchTerms);\r\n\t\t}\r\n\r\n\t\tif (!!searchRequest.explicitSearchTerms) {\r\n\t\t\tfor (var i = 0; i < searchRequest.explicitSearchTerms.length; i++) {\r\n\t\t\t\tadd(`explicitSearchTerms[${i}].key`, searchRequest.explicitSearchTerms[i].key);\r\n\t\t\t\tadd(`explicitSearchTerms[${i}].value`, searchRequest.explicitSearchTerms[i].value);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!!searchRequest.facets) {\r\n\t\t\tlet combinedFacetValue = '';\r\n\t\t\tfor (var i = 0; i < searchRequest.facets.length; i++) {\r\n\t\t\t\tif (searchRequest.facets[i] != undefined && searchRequest.facets[i] != null && searchRequest.facets[i].field != '') {\r\n\t\t\t\t\tcombinedFacetValue = combinedFacetValue == '' ? combinedFacetValue.concat(`${searchRequest.facets[i].field}:${searchRequest.facets[i].value}`) : combinedFacetValue.concat(`,`, `${searchRequest.facets[i].field}:${searchRequest.facets[i].value}`);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!!combinedFacetValue) {\r\n\t\t\t\tadd('fq', combinedFacetValue);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!!searchRequest.sortOrder) {\r\n\t\t\tlet combinedSortValue = '';\r\n\t\t\tfor (var i = 0; i < searchRequest.sortOrder.length; i++) {\r\n\t\t\t\tif (searchRequest.sortOrder[i] != undefined && searchRequest.sortOrder[i] != null && searchRequest.sortOrder[i].field != '') {\r\n\t\t\t\t\tcombinedSortValue = combinedSortValue == '' ? combinedSortValue.concat(`${searchRequest.sortOrder[i].field}:${searchRequest.sortOrder[i].direction}`) : combinedSortValue.concat(`,`, `${searchRequest.sortOrder[i].field}:${searchRequest.sortOrder[i].direction}`);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (combinedSortValue != '') {\r\n\t\t\t\tadd('s', combinedSortValue);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!searchRequest.escapeSearchTerms) {\r\n\t\t\tsearchRequest.escapeSearchTerms = true;\r\n\t\t}\r\n\t\tadd('escapeSearchTerms', searchRequest.escapeSearchTerms);\r\n\r\n\t\tif (!!searchRequest.pageIndex) {\r\n\t\t\tadd('pi', searchRequest.pageIndex);\r\n\t\t}\r\n\r\n\t\tif (!!searchRequest.includeFilteredFacets) {\r\n\t\t\tadd('includeFilteredFacets', searchRequest.includeFilteredFacets);\r\n\t\t}\r\n\r\n\t\tif (!!searchRequest.maxPaginationSize) {\r\n\t\t\tadd('maxPaginationSize', searchRequest.maxPaginationSize);\r\n\t\t}\r\n\r\n\t\tif (!!searchRequest.normalizeScores) {\r\n\t\t\tadd('normalizeScores', searchRequest.normalizeScores);\r\n\t\t}\r\n\r\n\t\tif (!!searchRequest.pageSize) {\r\n\t\t\tadd('ps', searchRequest.pageSize);\r\n\t\t}\r\n\r\n\t\treturn params;\r\n\t}\r\n\r\n\t// at some point we should move these to a more generic location where they can be used\r\n\t// for purposes of alias routing we needed to use the specific implementation above\r\n\tprivate objectToSearchParams(object: any): HttpParams {\r\n\t\tlet params = new HttpParams();\r\n\r\n\t\tlet add = function (key: string, value: any) {\r\n\t\t\tif (typeof (value) == \"undefined\") {\r\n\t\t\t\tvalue = \"\";\r\n\t\t\t}\r\n\r\n\t\t\tvalue = typeof value === 'function' ? value() : (value === null ? \"\" : value);\r\n\t\t\tparams = params.append(key, value);\r\n\t\t};\r\n\r\n\t\tif (Array.isArray(object) || !this.isJsObject(object)) {\r\n\t\t\tObject.keys(object)\r\n\t\t\t\t.map((key) => add(key, object[key]));\r\n\t\t}\r\n\t\telse {\r\n\t\t\tObject.keys(object)\r\n\t\t\t\t.map((key) => this.toSearchParam(key, object[key], add));\r\n\t\t}\r\n\r\n\t\treturn params;\r\n\t}\r\n\r\n\tprivate toSearchParam(prefix: string, obj: any, add: Function): void {\r\n\t\tif (Array.isArray(obj)) {\r\n\t\t\tObject.keys(obj)\r\n\t\t\t\t.map((key) => this.toSearchParam(prefix + \"[\" + key + \"]\", obj[key], add));\r\n\t\t}\r\n\t\telse if (this.isJsObject(obj)) {\r\n\t\t\tObject.keys(obj)\r\n\t\t\t\t.map((key) => this.toSearchParam(prefix + \".\" + key, obj[key], add));\r\n\t\t}\r\n\t\telse {\r\n\t\t\t// add scalar\r\n\t\t\tadd(prefix, obj);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\n\r\nimport { Observable } from 'rxjs';\r\n\r\nimport { ShareViewModel } from '../../models/share/share.model';\r\n\r\nconst httpOptions = {\r\n\theaders: new HttpHeaders({\r\n\t\t'Content-Type': 'application/json',\r\n\t})\r\n};\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class ShareService {\r\n\r\n\tprivate _urlBase: string = \"api/share\";\r\n\t\r\n\tconstructor(private _httpClient: HttpClient) { }\r\n\r\n\tpublic share(request: ShareViewModel): Observable {\t\t\r\n\t\treturn this._httpClient\r\n\t\t\t.post(this._urlBase, request, httpOptions);\r\n\t}\r\n\t\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\nimport { Ng4LoadingSpinnerService } from 'ng4-loading-spinner';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class SpinnerService {\r\n\r\n\tprivate _activeCounter: number = 0;\r\n\r\n\tpublic loadingText: string = \"Please wait...\";\r\n\r\n\tconstructor(private _realSpinnerService: Ng4LoadingSpinnerService) {\r\n\t}\r\n\r\n\tpublic show(loadingText: string = null): void {\r\n\t\t// stops ExpressionChangedAfterItHasBeenCheckedError being thrown\r\n\t\tsetTimeout(() => {\r\n\t\t\tthis.loadingText = loadingText;\r\n\t\t});\r\n\r\n\t\tthis._activeCounter++;\r\n\t\tthis._realSpinnerService.show();\r\n\t}\r\n\r\n\tpublic hide(): void {\r\n\t\tthis._activeCounter--;\r\n\r\n\t\tif (this._activeCounter == 0) {\r\n\t\t\tthis._realSpinnerService.hide();\r\n\t\t}\r\n\t}\r\n\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { forkJoin, Observable, of } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\n\r\nimport { Article } from '../../models/articles/article.model';\r\nimport { ArticleTargetedVersion } from '../../models/articles/article-targeted-version.model';\r\nimport { IncidentActivity } from '../../models/incidents/incident-activity.model';\r\nimport { IncidentDevelopmentEscalationActivity } from '../../models/incidents/incident-development-escalation-activity.model';\r\nimport { IncidentResolutionActivity } from '../../models/incidents/incident-resolution-activity.model';\r\nimport { TechnicalNoteArticle } from '../../models/articles/article-technical-note.model';\r\n\r\nimport { ApplicationVersionsService } from '../application-versions/application-versions.service';\r\nimport { ConfigurationService } from '../../../modules/runtime-configuration/services/configuration.service';\r\nimport { IncidentService } from '../incidents/incident.service';\r\nimport { TroubleshootingArticle } from '../../models/articles/article-troubleshooting.model';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class TransformService {\r\n\r\n\tprivate _urlBase: string = \"api/articles\";\r\n\r\n\tconstructor(private _httpClient: HttpClient, private _configSvc: ConfigurationService, private _incidentSvc: IncidentService, private _applicationVersionService: ApplicationVersionsService) {\r\n\t}\r\n\r\n\tprivate getTransformedArticleFromArticle(articleId: number, transformType: string): Observable {\r\n\t\treturn this._httpClient.get(`${this._urlBase}/${articleId}/transform/${transformType}`)\r\n\t\t\t.pipe(\r\n\t\t\t\tmap(\r\n\t\t\t\t\tresponse => {\r\n\t\t\t\t\t\tlet article = response;\r\n\r\n\t\t\t\t\t\t// ** A better solution would be server side but that would involve new ViewModels\r\n\r\n\t\t\t\t\t\tarticle.created = null;\r\n\t\t\t\t\t\tarticle.modified = null;\r\n\r\n\t\t\t\t\t\tif (article.hasOwnProperty('categoryId') && article.categoryId === 0) {\r\n\t\t\t\t\t\t\tarticle.categoryId = null;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn response;\r\n\t\t\t\t\t}\r\n\t\t\t\t)\r\n\t\t\t);\r\n\t}\r\n\r\n\tprivate getTransformedArticleFromIncident(incidentId: string, transformType: string): Observable {\r\n\t\treturn forkJoin(this._incidentSvc.getIncident(incidentId).pipe(incident => { return incident }),\r\n\t\t\tthis._incidentSvc.getResolution(incidentId)\r\n\t\t\t\t.pipe(\r\n\t\t\t\t\tcatchError(err => {\r\n\t\t\t\t\t\tconsole.error(`Could not determine Resolution for '${incidentId}'`, err)\r\n\t\t\t\t\t\tlet resolution: IncidentResolutionActivity;\r\n\t\t\t\t\t\treturn of(resolution)\r\n\t\t\t\t\t})\r\n\t\t\t\t),\r\n\t\t\tthis._incidentSvc.getActivities(incidentId, \"(Type eq 'DevelopmentEscalationActivity')\", 1, null)\r\n\t\t\t\t.pipe(\r\n\t\t\t\t\tcatchError(err => {\r\n\t\t\t\t\t\tconsole.error(`Could not get DevelopmentEscalationActivity for '${incidentId}'`, err)\r\n\t\t\t\t\t\tlet activities: IncidentActivity[]\r\n\t\t\t\t\t\treturn of(activities)\r\n\t\t\t\t\t})\r\n\t\t\t\t),\r\n\t\t\tthis._applicationVersionService.getApplicationVersions(this._configSvc.configuration.commvaultApplicationId, true, null, false).pipe(commvaultVersions => { return commvaultVersions }),\r\n\t\t\tthis._applicationVersionService.getApplicationVersions(this._configSvc.configuration.hedvigApplicationId, true, null, false).pipe(hedvigVersions => { return hedvigVersions }),\r\n\t\t\tthis._applicationVersionService.getApplicationVersions(this._configSvc.configuration.metallicApplicationId, true, null, false).pipe(metallicVersions => { return metallicVersions })\r\n\t\t).pipe(\r\n\t\t\tmap(response => {\r\n\t\t\t\tlet incident = response[0];\r\n\t\t\t\tlet resolution = response[1];\r\n\t\t\t\tlet devEscalation = response[2][0];\r\n\t\t\t\tlet commvaultVersions = response[3];\r\n\t\t\t\tlet hedvigVersions = response[4];\r\n\t\t\t\tlet metallicVersions = response[5];\r\n\r\n\t\t\t\tincident.resolution = resolution;\r\n\t\t\t\tincident.developmentEscalation = devEscalation as IncidentDevelopmentEscalationActivity;\r\n\r\n\t\t\t\tswitch (transformType.toLowerCase()) {\r\n\t\t\t\t\tcase \"technicalnote\":\r\n\t\t\t\t\t\t// if we don't set the transformedArticle to the specific type at the start the type will NOT be determined correctly\r\n\t\t\t\t\t\t// in create-edit-article.component resulting in missing required fields\r\n\t\t\t\t\t\tlet transformedArticle = new TechnicalNoteArticle();\r\n\t\t\t\t\t\ttransformedArticle.articleTargetedVersions\r\n\r\n\t\t\t\t\t\tlet targetedVersions = new Array();\r\n\r\n\t\t\t\t\t\tif (commvaultVersions.find(x => x.major == parseInt(incident.applicationMajorVersion) && x.servicePack == incident.applicationServicePack)) {\r\n\t\t\t\t\t\t\tlet targetedVersionViewModel = commvaultVersions.find(x => x.major == parseInt(incident.applicationMajorVersion) && x.servicePack == incident.applicationServicePack);\r\n\t\t\t\t\t\t\tlet targetedVersion = new ArticleTargetedVersion();\r\n\t\t\t\t\t\t\ttargetedVersion.versionApplicationId = targetedVersionViewModel.applicationId;\r\n\t\t\t\t\t\t\ttargetedVersion.versionMajor = targetedVersionViewModel.major;\r\n\t\t\t\t\t\t\ttargetedVersion.versionMinor = targetedVersionViewModel.minor;\r\n\t\t\t\t\t\t\ttargetedVersion.versionBuild = targetedVersionViewModel.build;\r\n\t\t\t\t\t\t\ttargetedVersion.versionRevision = targetedVersionViewModel.revision;\r\n\t\t\t\t\t\t\ttargetedVersion.versionServicePack = targetedVersionViewModel.servicePack;\r\n\t\t\t\t\t\t\ttargetedVersions.push(targetedVersion);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (hedvigVersions.find(x => x.major == parseInt(incident.applicationMajorVersion) && x.servicePack == incident.applicationServicePack)) {\r\n\t\t\t\t\t\t\tlet targetedVersionViewModel = hedvigVersions.find(x => x.major == parseInt(incident.applicationMajorVersion) && x.servicePack == incident.applicationServicePack);\r\n\t\t\t\t\t\t\tlet targetedVersion = new ArticleTargetedVersion();\r\n\t\t\t\t\t\t\ttargetedVersion.versionApplicationId = targetedVersionViewModel.applicationId;\r\n\t\t\t\t\t\t\ttargetedVersion.versionMajor = targetedVersionViewModel.major;\r\n\t\t\t\t\t\t\ttargetedVersion.versionMinor = targetedVersionViewModel.minor;\r\n\t\t\t\t\t\t\ttargetedVersion.versionBuild = targetedVersionViewModel.build;\r\n\t\t\t\t\t\t\ttargetedVersion.versionRevision = targetedVersionViewModel.revision;\r\n\t\t\t\t\t\t\ttargetedVersion.versionServicePack = targetedVersionViewModel.servicePack;\r\n\t\t\t\t\t\t\ttargetedVersions.push(targetedVersion);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// can't imagine this will work as intended..technically Metallic has no version..\r\n\t\t\t\t\t\tif (metallicVersions.find(x => x.major == parseInt(incident.applicationMajorVersion) && x.servicePack == incident.applicationServicePack)) {\r\n\t\t\t\t\t\t\tlet targetedVersionViewModel = metallicVersions.find(x => x.major == parseInt(incident.applicationMajorVersion) && x.servicePack == incident.applicationServicePack);\r\n\t\t\t\t\t\t\tlet targetedVersion = new ArticleTargetedVersion();\r\n\t\t\t\t\t\t\ttargetedVersion.versionApplicationId = targetedVersionViewModel.applicationId;\r\n\t\t\t\t\t\t\ttargetedVersion.versionMajor = targetedVersionViewModel.major;\r\n\t\t\t\t\t\t\ttargetedVersion.versionMinor = targetedVersionViewModel.minor;\r\n\t\t\t\t\t\t\ttargetedVersion.versionBuild = targetedVersionViewModel.build;\r\n\t\t\t\t\t\t\ttargetedVersion.versionRevision = targetedVersionViewModel.revision;\r\n\t\t\t\t\t\t\ttargetedVersion.versionServicePack = targetedVersionViewModel.servicePack;\r\n\t\t\t\t\t\t\ttargetedVersions.push(targetedVersion);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\ttransformedArticle.articleTargetedVersions = targetedVersions;\r\n\r\n\t\t\t\t\t\ttransformedArticle.title = incident.developmentEscalation ? incident.developmentEscalation.escalationPurpose : incident.title;\r\n\t\t\t\t\t\ttransformedArticle.symptoms = incident.developmentEscalation ? incident.developmentEscalation.issueSummary : incident.incidentSummary;\r\n\t\t\t\t\t\ttransformedArticle.resolution = incident.resolution ? incident.resolution.findings : '';\r\n\t\t\t\t\t\ttransformedArticle.incidentReference = incident.ticketNumber;\r\n\t\t\t\t\t\ttransformedArticle.articleTypeLabel = \"Technical Note\";\r\n\t\t\t\t\t\ttransformedArticle.classificationCode = incident.classificationId;\r\n\t\t\t\t\t\ttransformedArticle.classificationText = incident.classificationText;\r\n\t\t\t\t\t\ttransformedArticle.audience = 'Internal';\r\n\r\n\t\t\t\t\t\tlet expirationDate = new Date();\r\n\t\t\t\t\t\texpirationDate.setHours(0, 0, 0, 0);\r\n\t\t\t\t\t\texpirationDate.setDate(expirationDate.getDate() + 365);\r\n\t\t\t\t\t\ttransformedArticle.expiration = expirationDate;\r\n\r\n\t\t\t\t\t\treturn transformedArticle;\r\n\r\n\t\t\t\t\tcase \"troubleshooting\":\r\n\t\t\t\t\t\tlet troubleshootingArticle = new TroubleshootingArticle()\r\n\t\t\t\t\t\tlet technicalReviewerId = this._configSvc.configuration.defaultTechnicalReviewerId;\r\n\t\t\t\t\t\tlet troubleshootingTargetedVersions = new Array();\r\n\t\t\t\t\t\tlet applicationId = this._configSvc.configuration.versionApplicationId;\r\n\t\t\t\t\t\tlet major = this._configSvc.configuration.versionMajor;\r\n\r\n\t\t\t\t\t\tif (metallicVersions.find(x => x.applicationId == applicationId && x.major == parseInt(major))) {\r\n\t\t\t\t\t\t\tlet targetedVersionViewModel = metallicVersions.find(x => x.applicationId == applicationId && x.major == parseInt(major));\r\n\t\t\t\t\t\t\tlet targetedVersion = new ArticleTargetedVersion();\r\n\t\t\t\t\t\t\ttargetedVersion.versionApplicationId = targetedVersionViewModel.applicationId;\r\n\t\t\t\t\t\t\ttargetedVersion.versionMajor = targetedVersionViewModel.major;\r\n\t\t\t\t\t\t\ttargetedVersion.versionMinor = targetedVersionViewModel.minor;\r\n\t\t\t\t\t\t\ttargetedVersion.versionBuild = targetedVersionViewModel.build;\r\n\t\t\t\t\t\t\ttargetedVersion.versionRevision = targetedVersionViewModel.revision;\r\n\t\t\t\t\t\t\ttargetedVersion.versionServicePack = targetedVersionViewModel.servicePack;\r\n\t\t\t\t\t\t\ttroubleshootingTargetedVersions.push(targetedVersion);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ttroubleshootingArticle.technicalReviewerId = technicalReviewerId;\r\n\t\t\t\t\t\ttroubleshootingArticle.articleTargetedVersions = troubleshootingTargetedVersions;\r\n\t\t\t\t\t\ttroubleshootingArticle.title = incident.resolution ? incident.resolution.caseSubject : \"\";\r\n\t\t\t\t\t\ttroubleshootingArticle.description = incident.resolution ? incident.resolution.summarizeCustomerExperience : \"\";\r\n\t\t\t\t\t\ttroubleshootingArticle.symptoms = incident.resolution ? incident.resolution.rootCauseOfIssue : \"\";\r\n\t\t\t\t\t\ttroubleshootingArticle.resolution = incident.resolution ? incident.resolution.howToResolve : \"\"\r\n\t\t\t\t\t\ttroubleshootingArticle.incidentReference = incident ? incident.ticketNumber : \"\";\r\n\t\t\t\t\t\ttroubleshootingArticle.articleTypeLabel = \"Troubleshooting\";\r\n\t\t\t\t\t\ttroubleshootingArticle.audience = \"Customers\";\r\n\r\n\t\t\t\t\t\tlet troubleshootingExpirationDate = new Date();\r\n\t\t\t\t\t\ttroubleshootingExpirationDate.setHours(0, 0, 0, 0);\r\n\t\t\t\t\t\ttroubleshootingExpirationDate.setDate(troubleshootingExpirationDate.getDate() + 365);\r\n\t\t\t\t\t\ttroubleshootingArticle.expiration = troubleshootingExpirationDate;\r\n\r\n\t\t\t\t\t\treturn troubleshootingArticle;\t\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t})\r\n\t\t)\r\n\t}\r\n\r\n\tpublic getArticleTransform(sourceId: string, sourceType: string, destinationType: string): Observable {\r\n\t\tswitch (sourceType.toLowerCase()) {\r\n\t\t\tcase 'incident':\r\n\t\t\t\treturn this.getTransformedArticleFromIncident(sourceId, destinationType);\r\n\t\t\tcase 'article':\r\n\t\t\t\treturn this.getTransformedArticleFromArticle(parseInt(sourceId), destinationType);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { HttpClient } from '@angular/common/http';\r\n\r\nimport { Observable, of } from \"rxjs\";\r\nimport { catchError, map, tap, share, shareReplay } from \"rxjs/operators\";\r\n\r\nimport { AlertService } from \"../alert/alert.service\";\r\n\r\nimport { UserProfile } from \"../../models/user-profiles/user-profile.model\";\r\nimport { UserProfileUpdate } from \"../../models/user-profiles/user-profile-update.model\";\r\n\r\n@Injectable({\r\n\tprovidedIn: \"root\"\r\n})\r\nexport class UserProfileService {\r\n\r\n\tprivate _urlBase: string = \"api/profiles\";\r\n\r\n\tprivate _myProfile: UserProfile;\r\n\r\n\tprivate _myObservable: Observable;\r\n\r\n\tconstructor(private _http: HttpClient, private _alertService: AlertService) { }\r\n\r\n\tprivate handleError(message: string, result?: T) {\r\n\t\treturn (error: any): Observable => {\r\n\t\t\tthis._alertService.show(message);\r\n\r\n\t\t\treturn of(result as T);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic getMyProfile(): Observable {\r\n\t\tconsole.debug('ProfileService | getMyProfile()');\r\n\r\n\t\tif (this._myProfile) {\r\n\t\t\treturn of(this._myProfile);\r\n\t\t}\r\n\t\telse if (this._myObservable) {\r\n\t\t\treturn this._myObservable;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tconst url = `${this._urlBase}/my`;\r\n\r\n\t\t\tthis._myObservable = this._http\r\n\t\t\t\t.get(url)\r\n\t\t\t\t.pipe(\r\n\t\t\t\t\ttap(profile => {\r\n\t\t\t\t\t\tthis._myProfile = profile\r\n\t\t\t\t\t}),\r\n\t\t\t\t\tshare(),\r\n\t\t\t\t\tcatchError(this.handleError('We are sorry. We are unable to find your Profile. Please refresh your browser or contact Support.', null))\r\n\t\t\t\t);\r\n\r\n\t\t\treturn this._myObservable;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic updateMyProfile(profile: UserProfileUpdate): Observable {\r\n\t\tconsole.debug('ProfileService | updateProfile()');\r\n\r\n\t\tif (profile == null) {\r\n\t\t\t// throw error\r\n\t\t}\r\n\r\n\t\tconst url = `${this._urlBase}/my`;\r\n\r\n\t\treturn this._http\r\n\t\t\t.post(url, profile)\r\n\t\t\t.pipe(\r\n\t\t\t\ttap(profile => this._myProfile = profile),\r\n\t\t\t\tshare(),\r\n\t\t\t\tcatchError(this.handleError('updateProfile', null))\r\n\t\t\t);\r\n\t}\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\n\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\nimport { ODataResult } from '../../models/oData/odata-result.model';\r\nimport { User } from '../../models/users/user.model';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class UsersService {\r\n\r\n\tprivate _urlBase: string = \"/odata/User\";\r\n\r\n\tconstructor(private _http: HttpClient) {\r\n\t}\r\n\r\n\tpublic searchUsers(filter: string): Observable> {\r\n\t\tconst url = `${this._urlBase}?$select=id,userName&$orderby=userName&$filter=StartsWith(userName,'${filter}')`;\r\n\r\n\t\treturn this._http\r\n\t\t\t.get>>(url)\r\n\t\t\t.pipe(\r\n\t\t\t\tmap(result => {\r\n\t\t\t\t\treturn result.value.map(user => {\r\n\t\t\t\t\t\tlet ui = new User();\r\n\t\t\t\t\t\tObject.assign(ui, user);\r\n\r\n\t\t\t\t\t\treturn ui;\r\n\t\t\t\t\t});\r\n\t\t\t\t})\r\n\t\t\t);\r\n\t}\r\n\r\n\tpublic getUserById(filter: string): Observable {\r\n\t\t// TODO: Fix this to be using eq instead of filter based on id, can't seem to get this to work\r\n\t\tconst url = `${this._urlBase}?$select=id,userName&$filter=StartsWith(id,'${filter}')`;\r\n\r\n\t\treturn this._http\r\n\t\t\t.get>(url)\r\n\t\t\t.pipe(\r\n\t\t\t\tmap(result => {\r\n\t\t\t\t\treturn result.value;\r\n\t\t\t\t})\r\n\t\t\t);\r\n\t}\r\n\r\n}\r\n","import { NgModule } from \"@angular/core\";\r\nimport { RouterModule, Routes } from \"@angular/router\";\r\n\r\nimport { RolesPermissionsComponent } from \"./components/roles-permissions/roles-permissions.component\";\r\nimport { AdminToolComponent } from \"./components/admin-tools/admin-tool/admin-tool.component\";\r\nimport { AuthPermissionsGuard } from \"../../core/services/permissions/auth-permissions.guard\";\r\n\r\nconst routes: Routes = [\r\n\t{\r\n\t\tpath: 'admin', canActivate: [AuthPermissionsGuard], data: { roles: ['manage-application-admin-tools'] }, children: [\r\n\t\t\t{ path: '', component: RolesPermissionsComponent },\r\n\t\t\t{ path: 'roles-permissions', component: RolesPermissionsComponent },\r\n\t\t\t{ path: 'admin-tools', component: AdminToolComponent }\r\n\t\t]\r\n\t}\r\n]\r\n\r\n@NgModule({\r\n\timports: [RouterModule.forRoot(routes)],\r\n\texports: [RouterModule]\r\n})\r\nexport class AdminRoutingModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { TabsModule } from 'ngx-bootstrap';\r\n\r\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome';\r\n\r\nimport { MultiSelectModule } from '@syncfusion/ej2-angular-dropdowns';\r\nimport { DatePickerModule } from '@syncfusion/ej2-angular-calendars';\r\nimport { GridModule } from '@syncfusion/ej2-angular-grids';\r\n\r\nimport { AdminRoutingModule } from './admin-routing.module';\r\n\r\nimport { NavComponent } from './components/nav/nav.component';\r\n\r\nimport { RolesPermissionsComponent } from './components/roles-permissions/roles-permissions.component';\r\nimport { AdminToolComponent } from './components/admin-tools/admin-tool/admin-tool.component';\r\nimport { ResetUserPublishDateComponent } from './components/admin-tools/reset-user-publish-date/reset-user-publish-date.component';\r\nimport { DeleteUnusedCommonIssuesComponent } from './components/admin-tools/delete-unused-common-issues/delete-unused-common-issues.component';\r\nimport { DeleteUnusedSolutionsComponent } from './components/admin-tools/delete-unused-solutions/delete-unused-solutions.component';\r\n\r\n@NgModule({\r\n\timports: [\r\n\t\tCommonModule,\r\n\t\tReactiveFormsModule,\r\n\t\tTabsModule,\r\n\t\tFontAwesomeModule,\r\n\t\tMultiSelectModule,\r\n\t\tDatePickerModule,\r\n\t\tGridModule,\r\n\t\tAdminRoutingModule\r\n\t],\r\n\tdeclarations: [\r\n\t\tNavComponent,\r\n\t\tRolesPermissionsComponent,\r\n\t\tAdminToolComponent,\r\n\t\tResetUserPublishDateComponent,\r\n\t\tDeleteUnusedCommonIssuesComponent,\r\n\t\tDeleteUnusedSolutionsComponent\r\n\t],\r\n\texports: [\r\n\t\tAdminRoutingModule\r\n\t]\r\n})\r\nexport class AdminModule { }\r\n","var req = require(\"!!C:\\\\Users\\\\mjoshi\\\\source\\\\repos\\\\Alexandria\\\\Alexandria\\\\Alexandria.Website\\\\ClientApp\\\\node_modules\\\\pug-loader\\\\index.js!C:\\\\Users\\\\mjoshi\\\\source\\\\repos\\\\Alexandria\\\\Alexandria\\\\Alexandria.Website\\\\ClientApp\\\\src\\\\app\\\\modules\\\\admin\\\\components\\\\admin-tools\\\\admin-tool\\\\admin-tool.component.pug\");\nmodule.exports = (req['default'] || req).apply(req, [])","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL21vZHVsZXMvYWRtaW4vY29tcG9uZW50cy9hZG1pbi10b29scy9hZG1pbi10b29sL2FkbWluLXRvb2wuY29tcG9uZW50LnNjc3MifQ== */\"","import { Component, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n\tselector: 'app-admin-tool',\r\n\ttemplateUrl: './admin-tool.component.pug',\r\n\tstyleUrls: ['./admin-tool.component.scss']\r\n})\r\nexport class AdminToolComponent implements OnInit {\r\n\r\n\tconstructor() {\r\n\t}\r\n\r\n\tngOnInit() {\r\n\t}\r\n\r\n}\r\n","var req = require(\"!!C:\\\\Users\\\\mjoshi\\\\source\\\\repos\\\\Alexandria\\\\Alexandria\\\\Alexandria.Website\\\\ClientApp\\\\node_modules\\\\pug-loader\\\\index.js!C:\\\\Users\\\\mjoshi\\\\source\\\\repos\\\\Alexandria\\\\Alexandria\\\\Alexandria.Website\\\\ClientApp\\\\src\\\\app\\\\modules\\\\admin\\\\components\\\\admin-tools\\\\delete-unused-common-issues\\\\delete-unused-common-issues.component.pug\");\nmodule.exports = (req['default'] || req).apply(req, [])","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL21vZHVsZXMvYWRtaW4vY29tcG9uZW50cy9hZG1pbi10b29scy9kZWxldGUtdW51c2VkLWNvbW1vbi1pc3N1ZXMvZGVsZXRlLXVudXNlZC1jb21tb24taXNzdWVzLmNvbXBvbmVudC5zY3NzIn0= */\"","import { Component, OnInit, ViewEncapsulation, ViewChild } from '@angular/core';\r\nimport { FormGroup, FormBuilder, Validators } from '@angular/forms';\r\n\r\nimport { FilterSettingsModel, PageSettingsModel, SortSettingsModel, ExcelExportService, ToolbarService, SelectionService, ToolbarItems, EditService, GridComponent, ExcelExportProperties } from '@syncfusion/ej2-angular-grids';\r\nimport { DataManager, UrlAdaptor } from '@syncfusion/ej2-data';\r\n\r\nimport { AuthService } from '../../../../../core/services/auth/auth.service';\r\nimport { ClickEventArgs } from '@syncfusion/ej2-angular-navigations';\r\nimport { ReportDefinition } from '../../../../reports/models/report-definition.model';\r\n\r\n@Component({\r\n\tselector: 'app-delete-unused-common-issues',\r\n\ttemplateUrl: './delete-unused-common-issues.component.pug',\r\n\tstyleUrls: ['./delete-unused-common-issues.component.scss'],\r\n\tproviders: [SelectionService, ToolbarService, EditService]\r\n})\r\n\r\nexport class DeleteUnusedCommonIssuesComponent implements OnInit {\r\n\r\n\tprivate _pageSizes: number[] = [10, 15];\r\n\r\n\tpublic unusedCommonIssue: DataManager;\r\n\r\n\tpublic definition: ReportDefinition;\r\n\r\n\tpublic filterOptions: FilterSettingsModel;\r\n\r\n\tpublic pageOptions: PageSettingsModel;\r\n\r\n\tpublic sortOptions: SortSettingsModel;\r\n\r\n\tpublic queryForm: FormGroup;\r\n\r\n\tpublic errorMessage: boolean = false;\r\n\r\n\tpublic selectOptions: Object;\r\n\r\n\tpublic editSettings: Object;\r\n\r\n\tpublic toolbarOptions: ToolbarItems[];\r\n\r\n\t@ViewChild('grid')\r\n\tpublic grid: GridComponent;\r\n\r\n\tconstructor(private _fb: FormBuilder, private _authService: AuthService) {\r\n\t}\r\n\r\n\tngOnInit() {\r\n\t\tthis.createForm();\r\n\t\tthis.initializeGrid();\r\n\t}\r\n\r\n\tprivate createForm(): void {\r\n\t\tthis.queryForm = this._fb.group({\r\n\t\t\tstartDate: ['', Validators.required],\r\n\t\t\tendDate: ['', Validators.required],\r\n\t\t\tminClassificationDays: ['', Validators.required],\r\n\t\t\tincludeInternal: ['']\r\n\t\t});\r\n\t}\r\n\r\n\tprivate initializeGrid(): void {\r\n\t\tthis.pageOptions = { pageCount: 10, pageSize: this._pageSizes[0], pageSizes: this._pageSizes };\r\n\r\n\t\tthis.filterOptions = {\r\n\t\t\ttype: 'Menu'\r\n\t\t};\r\n\r\n\t\tthis.toolbarOptions = ['Delete', 'ExcelExport'];\r\n\r\n\t\tthis.sortOptions = { columns: [{ field: 'createdOn', direction: 'Descending' }] };\r\n\t}\r\n\r\n\tprivate getDataManager(startDate: Date, endDate: Date, numberDays: number, includeInternal: boolean): DataManager {\r\n\t\tlet query = `startDate=${startDate.toISOString()}&endDate=${endDate.toISOString()}&minimumAge=${numberDays}&includeInternal=${includeInternal}`;\r\n\r\n\t\treturn new DataManager({\r\n\t\t\tbatchUrl: `api/classification/batchunusedcommonIssue`,\r\n\t\t\turl: `api/classification/getunusedcommonissue?${query}`,\r\n\t\t\tremoveUrl: `api/classification/batchunusedcommonIssue`,\r\n\t\t\tadaptor: new UrlAdaptor,\r\n\t\t\tcrossDomain: true,\r\n\t\t\theaders: [{ 'Authorization': this._authService.getAuthorizationHeaderValue() }],\r\n\t\t});\r\n\t}\r\n\r\n\tpublic onSubmit(): void {\r\n\t\tthis.errorMessage = false;\r\n\r\n\t\tlet values = this.queryForm.value;\r\n\t\tthis.queryForm.disable();\r\n\r\n\t\tthis.unusedCommonIssue = this.getDataManager(values.startDate, values.endDate, values.minClassificationDays, !!values.includeInternal);\r\n\t}\r\n\r\n\tpublic actionFailure(e): void {\r\n\t\tthis.queryForm.enable();\r\n\t\tthis.errorMessage = true;\r\n\t}\r\n\r\n\tpublic actionComplete(e): void {\r\n\t\tthis.queryForm.enable();\r\n\r\n\t\tthis.editSettings = { allowDeleting: true };\r\n\t}\r\n\r\n\tpublic onToolbarClick(args: ClickEventArgs): void {\r\n\t\tif (args.item.id.endsWith('_excelexport')) {\r\n\t\t\tlet exportProperties: ExcelExportProperties = {\r\n\t\t\t\tfileName: 'DeleteUnusedCommonIssues.xlsx'\r\n\t\t\t};\r\n\r\n\t\t\tthis.grid.excelExport(exportProperties);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n","var req = require(\"!!C:\\\\Users\\\\mjoshi\\\\source\\\\repos\\\\Alexandria\\\\Alexandria\\\\Alexandria.Website\\\\ClientApp\\\\node_modules\\\\pug-loader\\\\index.js!C:\\\\Users\\\\mjoshi\\\\source\\\\repos\\\\Alexandria\\\\Alexandria\\\\Alexandria.Website\\\\ClientApp\\\\src\\\\app\\\\modules\\\\admin\\\\components\\\\admin-tools\\\\delete-unused-solutions\\\\delete-unused-solutions.component.pug\");\nmodule.exports = (req['default'] || req).apply(req, [])","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL21vZHVsZXMvYWRtaW4vY29tcG9uZW50cy9hZG1pbi10b29scy9kZWxldGUtdW51c2VkLXNvbHV0aW9ucy9kZWxldGUtdW51c2VkLXNvbHV0aW9ucy5jb21wb25lbnQuc2NzcyJ9 */\"","import { Component, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';\r\nimport { FormGroup, Validators, FormBuilder } from '@angular/forms';\r\n\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { FilterSettingsModel, PageSettingsModel, SortSettingsModel, SelectionService, GridComponent, ToolbarItems, ExcelExportProperties, ToolbarService, ExcelExportService } from '@syncfusion/ej2-angular-grids';\r\nimport { DataManager, WebApiAdaptor } from '@syncfusion/ej2-data';\r\n\r\nimport { AuthService } from '../../../../../core/services/auth/auth.service';\r\nimport { ArticleService } from '../../../../../core/services/articles/article.service';\r\nimport { ClickEventArgs } from '@syncfusion/ej2-angular-navigations';\r\n\r\n@Component({\r\n\tselector: 'app-delete-unused-solutions',\r\n\ttemplateUrl: './delete-unused-solutions.component.pug',\r\n\tstyleUrls: ['./delete-unused-solutions.component.scss'],\r\n\tproviders: [SelectionService, ToolbarService, ExcelExportService]\r\n})\r\nexport class DeleteUnusedSolutionsComponent implements OnInit {\r\n\r\n\tprivate _pageSizes: number[] = [15, 30];\r\n\r\n\tprivate _subscriptions = new Subscription();\r\n\r\n\tpublic unusedSolution: DataManager;\r\n\r\n\tpublic filterOptions: FilterSettingsModel;\r\n\r\n\tpublic pageOptions: PageSettingsModel;\r\n\r\n\tpublic sortOptions: SortSettingsModel;\r\n\r\n\tpublic dusFormGroup: FormGroup;\r\n\r\n\tpublic startDate: Date;\r\n\r\n\tpublic endDate: Date;\r\n\r\n\tpublic maximumEffectiveness: number;\r\n\r\n\tpublic minimumAge: number;\r\n\r\n\tpublic minimumViewed: number;\r\n\r\n\tpublic errorMessage: boolean = false;\r\n\r\n\tpublic selectOptions: Object;\r\n\r\n\tpublic isDisabled: boolean = true;\r\n\r\n\t@ViewChild('grid')\r\n\tpublic grid: GridComponent;\r\n\r\n\tpublic toolbarOptions: ToolbarItems[];\r\n\r\n\tconstructor(private _fb: FormBuilder, private _authService: AuthService, private _articleService: ArticleService) {\r\n\t}\r\n\r\n\tngOnInit() {\r\n\t\tthis.createForm();\r\n\r\n\t\tthis.pageOptions = { pageCount: 10, pageSize: this._pageSizes[0], pageSizes: this._pageSizes };\r\n\r\n\t\tthis.filterOptions = {\r\n\t\t\ttype: 'Menu'\r\n\t\t};\r\n\r\n\t\tthis.toolbarOptions = ['ExcelExport'];\r\n\t}\r\n\r\n\tngOnDestroy(): void {\r\n\t\tthis._subscriptions.unsubscribe();\r\n\t}\r\n\r\n\tprivate createForm(): void {\r\n\t\tthis.dusFormGroup = this._fb.group({\r\n\t\t\tstartDate: ['', Validators.required],\r\n\t\t\tendDate: ['', Validators.required],\r\n\t\t\tmaximumEffectiveness: ['', Validators.required],\r\n\t\t\tminimumAge: ['', Validators.required],\r\n\t\t\tminimumViewed: ['', Validators.required],\r\n\t\t});\r\n\r\n\t\tthis.dusFormGroup.addControl('startDate', this._fb.control(''));\r\n\t\tthis.dusFormGroup.addControl('endDate', this._fb.control(''));\r\n\t\tthis.dusFormGroup.addControl('maximumEffectiveness', this._fb.control(''));\r\n\t\tthis.dusFormGroup.addControl('minimumAge', this._fb.control(''));\r\n\t\tthis.dusFormGroup.addControl('minimumViewed', this._fb.control(''));\r\n\r\n\t\tthis._subscriptions.add(\r\n\t\t\tthis.dusFormGroup.get(\"startDate\").valueChanges\r\n\t\t\t\t.subscribe(value => {\r\n\t\t\t\t\tthis.startDate = value;\r\n\t\t\t\t})\r\n\t\t);\r\n\r\n\t\tthis._subscriptions.add(\r\n\t\t\tthis.dusFormGroup.get(\"endDate\").valueChanges\r\n\t\t\t\t.subscribe(value => {\r\n\t\t\t\t\tthis.endDate = value;\r\n\t\t\t\t})\r\n\t\t);\r\n\r\n\t\tthis._subscriptions.add(\r\n\t\t\tthis.dusFormGroup.get(\"maximumEffectiveness\").valueChanges\r\n\t\t\t\t.subscribe(value => {\r\n\t\t\t\t\tthis.maximumEffectiveness = value;\r\n\t\t\t\t})\r\n\t\t);\r\n\r\n\t\tthis._subscriptions.add(\r\n\t\t\tthis.dusFormGroup.get(\"minimumAge\").valueChanges\r\n\t\t\t\t.subscribe(value => {\r\n\t\t\t\t\tthis.minimumAge = value;\r\n\t\t\t\t})\r\n\t\t);\r\n\r\n\t\tthis._subscriptions.add(\r\n\t\t\tthis.dusFormGroup.get(\"minimumViewed\").valueChanges\r\n\t\t\t\t.subscribe(value => {\r\n\t\t\t\t\tthis.minimumViewed = value;\r\n\t\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n\tprivate getDataManager() {\r\n\t\tlet query = `startDate=${this.startDate.toISOString()}&endDate=${this.endDate.toISOString()}&maximumEffectiveness=${this.maximumEffectiveness}&minimumAge=${this.minimumAge}&minimumViewed=${this.minimumViewed}`;\r\n\t\treturn new DataManager({\r\n\t\t\turl: `api/admin/deflectionAnalysis?${query}`,\r\n\t\t\tadaptor: new WebApiAdaptor,\r\n\t\t\toffline: true,\r\n\t\t\tcrossDomain: true,\r\n\t\t\theaders: [{ 'Authorization': this._authService.getAuthorizationHeaderValue() }],\r\n\t\t});\r\n\t}\r\n\r\n\tpublic onSubmit(): void {\r\n\t\tthis.errorMessage = false;\r\n\t\tthis.unusedSolution = this.getDataManager();\r\n\t\tthis.selectOptions = { persistSelection: true };\r\n\t\tthis.dusFormGroup.disable();\r\n\t}\r\n\r\n\tpublic delete(): void {\r\n\t\tif (this.grid.getSelectedRowIndexes().length) {\r\n\t\t\tvar articleIds = this.grid.getSelectedRecords().map(x => x['articleId']);\r\n\t\t\tthis._subscriptions.add(\r\n\t\t\t\tthis._articleService.deleteArticles(articleIds)\r\n\t\t\t\t\t.subscribe(\r\n\t\t\t\t\t\tresponse => {\r\n\t\t\t\t\t\t\tthis.grid.getSelectedRecords().map((val) => {\r\n\t\t\t\t\t\t\t\tval['isAvailable'] = false;\r\n\t\t\t\t\t\t\t\tthis.grid.setRowData(val['articleId'], val);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\tthis.grid.clearSelection();\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\terror => {\r\n\t\t\t\t\t\t\tthis.errorMessage = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t)\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic onToolbarClick(args: ClickEventArgs): void {\r\n\t\tif (args.item.id.endsWith('_excelexport')) {\r\n\t\t\tlet exportProperties: ExcelExportProperties = {\r\n\t\t\t\tfileName: 'DeleteUnusedSolutions.xlsx'\r\n\t\t\t};\r\n\r\n\t\t\tthis.grid.excelExport(exportProperties);\r\n\t\t}\r\n\t}\r\n\r\n\tactionFailure(e) {\r\n\t\tthis.errorMessage = true;\r\n\t\tthis.dusFormGroup.enable();\r\n\t}\r\n\r\n\tactionComplete(e) {\r\n\t\tthis.dusFormGroup.enable();\r\n\t}\r\n\r\n\tonRowSelected(e) {\r\n\t\tif (this.grid.getSelectedRowIndexes().length) {\r\n\t\t\tthis.isDisabled = false;\r\n\t\t}\r\n\t}\r\n\r\n\tonRowDeselected(e) {\r\n\t\tif (!this.grid.getSelectedRowIndexes().length) {\r\n\t\t\tthis.isDisabled = true;\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","var req = require(\"!!C:\\\\Users\\\\mjoshi\\\\source\\\\repos\\\\Alexandria\\\\Alexandria\\\\Alexandria.Website\\\\ClientApp\\\\node_modules\\\\pug-loader\\\\index.js!C:\\\\Users\\\\mjoshi\\\\source\\\\repos\\\\Alexandria\\\\Alexandria\\\\Alexandria.Website\\\\ClientApp\\\\src\\\\app\\\\modules\\\\admin\\\\components\\\\admin-tools\\\\reset-user-publish-date\\\\reset-user-publish-date.component.pug\");\nmodule.exports = (req['default'] || req).apply(req, [])","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL21vZHVsZXMvYWRtaW4vY29tcG9uZW50cy9hZG1pbi10b29scy9yZXNldC11c2VyLXB1Ymxpc2gtZGF0ZS9yZXNldC11c2VyLXB1Ymxpc2gtZGF0ZS5jb21wb25lbnQuc2NzcyJ9 */\"","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { FormGroup, Validators, FormControl } from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\n\r\nimport { Subscription } from 'rxjs';\r\nimport { DataManager, ODataV4Adaptor, Query } from '@syncfusion/ej2-data';\r\n\r\nimport { AuthService } from '../../../../../core/services/auth/auth.service';\r\nimport { UsersService } from '../../../../../core/services/users/users.service';\r\nimport { AdminService } from '../../../../../core/services/admin/admin.service';\r\n\r\nimport { ResetUserPublishDate } from '../../../../../core/models/admin/reset-user-publish-date.model';\r\n\r\n@Component({\r\n\tselector: 'app-reset-user-publish-date',\r\n\ttemplateUrl: './reset-user-publish-date.component.pug',\r\n\tstyleUrls: ['./reset-user-publish-date.component.scss']\r\n})\r\nexport class ResetUserPublishDateComponent implements OnInit, OnDestroy {\r\n\r\n\tprivate _subscriptions = new Subscription();\r\n\r\n\tpublic rupdFormGroup = new FormGroup({\r\n\t\tusers: new FormControl('', Validators.required),\r\n\t\tresetDate: new FormControl('', Validators.required)\r\n\t});\r\n\r\n\tpublic errorMessage: boolean = false;\r\n\r\n\tpublic remoteFields = { text: 'userName', value: 'id' };\r\n\r\n\tpublic data: DataManager;\r\n\r\n\tpublic query: Query;\r\n\r\n\tpublic userIds: Array;\r\n\r\n\tconstructor(private _authService: AuthService,\r\n\t\tprivate _adminService: AdminService,\r\n\t\tprivate _route: Router) {\r\n\t}\r\n\r\n\tngOnInit() {\r\n\t\tthis.bindData();\r\n\r\n\t\tthis._subscriptions.add(\r\n\t\t\tthis.rupdFormGroup.get(\"users\").valueChanges\r\n\t\t\t\t.subscribe(value => {\r\n\t\t\t\t\tif (value && value.map) {\r\n\t\t\t\t\t\tthis.userIds = value;\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n\tngOnDestroy(): void {\r\n\t\tthis._subscriptions.unsubscribe();\r\n\t}\r\n\r\n\tprivate bindData(): void {\r\n\t\tthis.data = new DataManager({\r\n\t\t\turl: '/odata/User',\r\n\t\t\tadaptor: new ODataV4Adaptor,\r\n\t\t\tcrossDomain: false,\r\n\t\t\theaders: [{ 'Authorization': this._authService.getAuthorizationHeaderValue() }]\r\n\t\t});\r\n\r\n\t\tthis.query = new Query().select(['id', 'userName']);\r\n\t}\r\n\r\n\tpublic onSubmit(): void {\r\n\t\tvar request: ResetUserPublishDate = {\r\n\t\t\tresetDate: this.rupdFormGroup.value.resetDate,\r\n\t\t\tuserIds: this.userIds\r\n\t\t};\r\n\r\n\t\tthis._subscriptions.add(\r\n\t\t\tthis._adminService.resetUsersPublishDate(request)\r\n\t\t\t\t.subscribe(\r\n\t\t\t\t\tresponse => {\r\n\t\t\t\t\t\tthis._route.navigate([\"/reports/render/6DD38373-B8E5-4E47-B6F4-5D9BE28320B6\"]);\r\n\t\t\t\t\t},\r\n\t\t\t\t\terror => {\r\n\t\t\t\t\t\tthis.errorMessage = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t)\r\n\t\t);\r\n\t}\r\n\r\n}\r\n","var req = require(\"!!C:\\\\Users\\\\mjoshi\\\\source\\\\repos\\\\Alexandria\\\\Alexandria\\\\Alexandria.Website\\\\ClientApp\\\\node_modules\\\\pug-loader\\\\index.js!C:\\\\Users\\\\mjoshi\\\\source\\\\repos\\\\Alexandria\\\\Alexandria\\\\Alexandria.Website\\\\ClientApp\\\\src\\\\app\\\\modules\\\\admin\\\\components\\\\nav\\\\nav.component.pug\");\nmodule.exports = (req['default'] || req).apply(req, [])","module.exports = \":host {\\n display: block; }\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvbW9kdWxlcy9hZG1pbi9jb21wb25lbnRzL25hdi9DOlxcVXNlcnNcXG1qb3NoaVxcc291cmNlXFxyZXBvc1xcQWxleGFuZHJpYVxcQWxleGFuZHJpYVxcQWxleGFuZHJpYS5XZWJzaXRlXFxDbGllbnRBcHAvc3JjXFxhcHBcXG1vZHVsZXNcXGFkbWluXFxjb21wb25lbnRzXFxuYXZcXG5hdi5jb21wb25lbnQuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNDLGNBQWMsRUFBQSIsImZpbGUiOiJzcmMvYXBwL21vZHVsZXMvYWRtaW4vY29tcG9uZW50cy9uYXYvbmF2LmNvbXBvbmVudC5zY3NzIiwic291cmNlc0NvbnRlbnQiOlsiOmhvc3Qge1xyXG5cdGRpc3BsYXk6IGJsb2NrO1xyXG59XHJcbiJdfQ== */\"","import { Component, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n\tselector: 'app-nav',\r\n\ttemplateUrl: './nav.component.pug',\r\n\tstyleUrls: ['./nav.component.scss']\r\n})\r\nexport class NavComponent implements OnInit {\r\n\r\n\tconstructor() { }\r\n\r\n\tngOnInit() {\r\n\t}\r\n\r\n}\r\n","var req = require(\"!!C:\\\\Users\\\\mjoshi\\\\source\\\\repos\\\\Alexandria\\\\Alexandria\\\\Alexandria.Website\\\\ClientApp\\\\node_modules\\\\pug-loader\\\\index.js!C:\\\\Users\\\\mjoshi\\\\source\\\\repos\\\\Alexandria\\\\Alexandria\\\\Alexandria.Website\\\\ClientApp\\\\src\\\\app\\\\modules\\\\admin\\\\components\\\\roles-permissions\\\\roles-permissions.component.pug\");\nmodule.exports = (req['default'] || req).apply(req, [])","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL21vZHVsZXMvYWRtaW4vY29tcG9uZW50cy9yb2xlcy1wZXJtaXNzaW9ucy9yb2xlcy1wZXJtaXNzaW9ucy5jb21wb25lbnQuc2NzcyJ9 */\"","import { Component, OnInit } from '@angular/core';\r\n\r\nimport { RolesService } from '../../../../core/services/roles/roles.service';\r\nimport { PermissionService } from '../../../../core/services/permissions/permission.service';\r\nimport { Role } from '../../../../core/models/roles/role.model';\r\nimport { Permission } from '../../../../core/models/permissions/permission.model';\r\n\r\n@Component({\r\n\tselector: 'app-roles-permissions',\r\n\ttemplateUrl: './roles-permissions.component.pug',\r\n\tstyleUrls: ['./roles-permissions.component.scss']\r\n})\r\nexport class RolesPermissionsComponent implements OnInit {\r\n\r\n\tpublic roles: Array;\r\n\r\n\tpublic permissions: Array