{"version":3,"file":"main.00243ddf0844ed1e.js","mappings":"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","names":["environment","AppPermission","i0","AiringSummaryComponent","apiService","uiService","authService","ref","config","constructor","this","model","ui","buttons","blackoutAll","deleteAll","hasChanges","canEdit","timer","ngOnInit","data","airingId","openAiring","toast","error","close","ngOnDestroy","unsubscribe","get","method","params","onSuccess","r","result","isPermittedForStation","airing","stationId","airingStart","DateTime","startTimeLocal","airingEnd","endTimeLocal","startDate","toLocaleString","startTime","endTime","title","seriesTitle","filter","x","join","duration","header","callSign","events","forEach","ev","updatedBy","createdBySignalEventRuleId","configureBlackouts","delay","second","subscribe","now","airingEnded","partners","map","p","blackouts","partnerId","b","blackoutEnded","eventEnd","allowDelete","allowCreate","some","every","createBlackout","row","executeCreate","deleteBlackout","blackout","executeDelete","signalEventGroupId","partnerIds","groupIds","flat","refresh","post","endDate","startEventDescription","endEventDescription","blockUi","delete","core","selectors","ZIXI_LOCATIONS","StationSummaryComponent","station","platforms","autoRefresh","locations","role_r20","UserDetailComponent","table","user","options","stationFilter","isPermitted","save","systemRoles","length","stationRoles","roleId","stationIds","stations","s","id","success","appUserId","onError","e","message","active","getRoleInfo","rt","roleTypes","find","name","getMultiple","roleTypeId","mr","stationIdsWithRole","usr","includes","selectionChanged","filterStations","selectAllNone","role","all","UiService","messageService","dialogService","showSpinner","startSpinner","setTimeout","stopSpinner","add","severity","summary","detail","key","info","handleUnexpectedError","isSysAdmin","open","dialog","componentType","width","closable","factory","ApiService","http","request","getUrl","executeRequest","put","urls","path","forkJoin","url","apiVersion","errors","code","description","handleError","response","text","toastGenericResponse","status","errorText","AuthService","isAuthorizedSubject","BehaviorSubject","isAuthorized$","asObservable","init","authUrl","next","permission","permissions","stationPermissions","OverrideType","QueueJobComponent","job","batchSize","actions","size","completeCount","progress","started","completed","cancelled","initJob","execJob","a","from","pipe","mergeMap","action","execAction","of","apiUrl","apiMethod","postData","handleReponse","catchError","Math","ceil","stopJob","closeDialog","Array","Set","ctx","QueueJobService","launchForOverride","overrideType","type","QueueJobType","Override","getTitle","overrideTarget","launch","launchForADN","ADN","adnId","adnSwitchTarget","targetId","switchToAdnId","launchForSourceSwitch","platformId","sourceId","showHeader","HttpsGuard","window","location","hostname","protocol","replace","href","PermissionsGuard","inject","router","Router","authorized","navigate","AuthInterceptor","_oktaAuth","intercept","handle","addAuthHeaderToAllowedOrigins","origin","authToken","getIdToken","clone","withCredentials","setHeaders","Authorization","OKTA_AUTH","ActivityLogComponent","op","entries","selected","totalRecords","loading","getOptions","loadResult","event","pageSize","rows","pageNumber","first","sortBy","sortField","sortDirection","sortOrder","activityTypeId","filters","activityType","value","appUserOktaId","undefined","platform","audienceId","audience","performedOnUtc","performedOnUTC","toISODate","Object","keys","items","totalCount","showDetails","$event","entry","show","activityTypes","audiences","statuses","OverlayPanel","AdnImportComponent","adns","textarea","getStations","inputText","step","processInput","groups","invalidStations","duplicateStations","back","apply","group","adn","push","touchedStations","split","stationName","groupLabel","existingGroup","g","onTab","preventDefault","stopPropagation","nativeElement","start","selectionStart","end","selectionEnd","substring","insertExampleText","focus","AdnMapperComponent","unassigned","draggedStation","selectedAdn","menu","import","menuItems","profileId","dirty","profiles","mappingProfileId","mapped","unmapped","sort","setDirty","openMenu","label","icon","command","showImport","clearStations","visible","closeImport","applyImport","allStations","match","toLowerCase","move","concat","clearAll","dragStart","drop","dragEnd","localeCompare","cancel","val","profileClicked","openImport","onClose","parseInt","AiringScheduleFilterPipe","transform","airings","search","pure","AiringScheduleComponent","queueJobService","confirmationService","results","settings","contextMenuItems","scrollable","contextMenu","overrideModes","styleClass","pixelsPerMinute","gap","block","canOverride","initTimeline","initSchedule","defaultZone","toFormat","timelines","Timeline","UserLocal","Eastern","StationLocal","timeline","blocks","dt","startOf","day","hour","min","minute","plus","minutes","minDate","scheduleStart","toJSDate","maxDate","scheduleEnd","class","override","setDate","scroll","isToday","scrollToCurrentTime","getAirings","luxonDate","ianaTz","zone","obj","style","partnerClass","pos","getEventPosition","left","getSignalEvents","showLive","refreshLive","startOfDay","setZone","keepLocalTime","minuteOfDay","diff","liveBarPos","live","black","partner","minsIntoDay","toObject","toggleExpand","canEditBlackout","expand","date","jsDate","dateChanged","equals","prevDay","days","nextDay","zoneName","skipDays","scrollLeft","searchChanged","searchEnabled","highlight","disabled","openContextMenu","openStation","queryParams","m","forceAll","applyForce","mode","toISO","groupId","confirm","acceptLabel","rejectLabel","acceptButtonStyleClass","accept","ov1","ov2","UserMenuComponent","env","version","signOut","_this","AppComponent","_oktaStateService","navMenuItems","userMenuItems","authFailedMessage","authState$","isAuthenticated","getNavItems","oktaUserName","idToken","claims","preferred_username","routerLink","y","BlackoutListComponent","route","ruleId","snapshot","rule","partnersCsv","dt1","airingsAfterDate","dt2","airingsBeforeDate","dates","isValid","stopPropogation","BlackoutRulesComponent","rules","getRules","addRule","_isNew","stationChanged","editRule","signalEventRuleId","titleToMatch","saveRule","deleteRule","target","signalEventsDeleted","titles","runNow","ruleExecutionResults","count","signalEventsCreated","msg","CacheManagerComponent","allSections","openedSection","getZixiConfig","openSection","section","onLoad","applyFilterGlobal","stringVal","filterGlobal","columns","field","onTriggerRefresh","LoggedOutComponent","StationPickerComponent","scrollHeight","onSelect","EventEmitter","matches","singleMatch","searchText","findMatches","selectStation","emit","selectFirst","clearText","OverrideGroupsComponent","setOverrideMode","canEditGroups","partnerOptions","selectGroup","groupStation","inactive","removeStation","addGroup","modify","setOverride","saveGroup","deleteGroup","togglePartner","toggleAll","selectAll","force","countMessage","t","StationDetailComponent","zixi","Number","isNaN","handleNotFound","fromUi","getStation","navigateToStations","getExtraStationInfo","dmas","users","owners","operators","scheduleSources","includeInactive","broadcasters","stationDefaultDataId","_timeZone","ianaTimeZone","_city","city","state","validateBroadcaster","configName","broadcaster","modalTitle","zixiBroadcasterId","zixiBroadcasterEast","zixiBroadcasterWest","test","StationListComponent","showHidden","StationOverviewComponent","flatSources","groupedSources","selection","any","filteredEntries","stationIdToOpen","extractOptions","idField","nameField","sources","timeZones","timeZone","isProfile","adnMappingId","newJob","removeFromJob","selectSource","source","adnMappings","nextSource","messageEnd","sendToQueue","queue","onFilter","filteredValue","UnauthorizedComponent","UserListComponent","selectedUser","selectUser","openDialog","addNew","firstName","lastName","ZixiSnapshotComponent","imageSrc","failed","errorMessage","refreshTimer","refreshCount","refreshInterval","maxRefreshes","startTimer","getImage","stopTimer","ngOnChanges","changes","change","firstChange","currentValue","responseType","reader","FileReader","onloadend","readAsDataURL","JSON","parse","readAsText","getStyleClass","oktaAuth","OktaAuth","issuer","clientId","redirectUri","postLogoutRedirectUri","scopes","pkce","AppModule","bootstrap","ConfirmationService","DialogService","MessageService","provide","OKTA_CONFIG","useValue","HTTP_INTERCEPTORS","useClass","multi","imports","BrowserModule","BrowserAnimationsModule","CommonModule","HttpClientModule","FormsModule","OktaAuthModule","RouterModule","canActivateChild","OktaAuthGuard","children","component","canActivate","redirectTo","pathMatch","OktaCallbackComponent","BlockUIModule","BreadcrumbModule","ButtonModule","CalendarModule","CardModule","CheckboxModule","ChipModule","ConfirmDialogModule","ConfirmPopupModule","ContextMenuModule","DialogModule","DividerModule","DragDropModule","DropdownModule","InputNumberModule","InputTextModule","InputTextareaModule","MenubarModule","MenuModule","MessageModule","MultiSelectModule","OverlayPanelModule","ProgressBarModule","SidebarModule","TableModule","TabViewModule","ToastModule","TooltipModule","enableProdMode","__NgCli_bootstrap_1","bootstrapModule","catch","err","console"],"sourceRoot":"webpack:///","sources":["./src/environments/environment.release.ts","./src/app/_shared/models/user.ts","./src/app/airing/airing-summary/airing-summary.component.html","./src/app/airing/airing-summary/airing-summary.component.ts","./src/app/_shared/models/constants.ts","./src/app/station/station-summary/station-summary.component.html","./src/app/station/station-summary/station-summary.component.ts","./src/app/system/user/user-detail/user-detail.component.html","./src/app/system/user/user-detail/user-detail.component.ts","./src/app/_shared/services/ui.service.ts","./src/app/_shared/services/api.service.ts","./src/app/_shared/services/auth.service.ts","./src/app/_shared/models/enums.ts","./src/app/_shared/components/queue-job/queue-job.component.html","./src/app/_shared/components/queue-job/queue-job.component.ts","./src/app/_shared/components/queue-job/queue-job.service.ts","./src/app/_shared/functions/routing.ts","./src/app/_shared/interceptors/auth.interceptor.ts","./src/app/system/activity-log/activity-log.component.html","./src/app/system/activity-log/activity-log.component.ts","./src/app/adn/adn-import/adn-import.component.html","./src/app/adn/adn-import/adn-import.component.ts","./src/app/adn/adn-mapper/adn-mapper.component.html","./src/app/adn/adn-mapper/adn-mapper.component.ts","./src/app/airing/airing-schedule/airing-schedule.pipe.ts","./src/app/airing/airing-schedule/airing-schedule.component.html","./src/app/airing/airing-schedule/airing-schedule.component.ts","./src/app/system/user/user-menu/user-menu.component.ts","./src/app/system/user/user-menu/user-menu.component.html","./src/app/app.component.html","./src/app/app.component.ts","./src/app/blackout/blackout-list/blackout-list.component.html","./src/app/blackout/blackout-list/blackout-list.component.ts","./src/app/blackout/blackout-rules/blackout-rules.component.html","./src/app/blackout/blackout-rules/blackout-rules.component.ts","./src/app/system/cache-manager/cache-manager.component.html","./src/app/system/cache-manager/cache-manager.component.ts","./src/app/_shared/components/logged-out/logged-out.component.ts","./src/app/_shared/components/logged-out/logged-out.component.html","./src/app/_shared/components/station-picker/station-picker.component.html","./src/app/_shared/components/station-picker/station-picker.component.ts","./src/app/override/override-groups/override-groups.component.html","./src/app/override/override-groups/override-groups.component.ts","./src/app/station/station-detail/station-detail.component.html","./src/app/station/station-detail/station-detail.component.ts","./src/app/station/station-list/station-list.component.html","./src/app/station/station-list/station-list.component.ts","./src/app/station/station-overview/station-overview.component.html","./src/app/station/station-overview/station-overview.component.ts","./src/app/_shared/components/unauthorized/unauthorized.component.ts","./src/app/_shared/components/unauthorized/unauthorized.component.html","./src/app/system/user/user-list/user-list.component.html","./src/app/system/user/user-list/user-list.component.ts","./src/app/_shared/components/zixi-snapshot/zixi-snapshot.component.html","./src/app/_shared/components/zixi-snapshot/zixi-snapshot.component.ts","./src/app/app.module.ts","./src/main.ts"],"sourcesContent":["// This file can be replaced during build by using the `fileReplacements` array.\r\n// `ng build` replaces `environment.ts` with `environment.prod.ts`.\r\n// The list of file replacements can be found in `angular.json`.\r\n\r\nexport const environment = {\r\n env: '#{ENVIRONMENT}#',\r\n version: '#{Build.BuildNumber}#',\r\n production: '#{IS_PRODUCTION}#',\r\n apiUrl: '#{API_URL}#',\r\n oktaIssuer: '#{OKTA_ISSUER}#',\r\n oktaClientId: '#{OKTA_CLIENT_ID}#',\r\n oktaRedirectUri: '#{OKTA_REDIRECT_URI}#',\r\n oktaPostLogoutRedirectUri: '#{OKTA_POST_LOGOUT_REDIRECT_URI}#',\r\n};\r\n\r\n/*\r\n * For easier debugging in development mode, you can import the following file\r\n * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.\r\n *\r\n * This import should be commented out in production mode because it will have a negative impact\r\n * on performance if an error is thrown.\r\n */\r\n// import 'zone.js/plugins/zone-error'; // Included with Angular CLI.\r\n","export interface AppUser {\r\n authorized: boolean;\r\n appUserId: number;\r\n firstName: string;\r\n lastName: string;\r\n oktaLogin: string;\r\n permissions: AppPermission[];\r\n stationPermissions: any;\r\n}\r\n\r\nexport enum AppPermission {\r\n // ADN\r\n vwSourceCon = 10,\r\n vwADNMap = 11,\r\n mngADNMap = 12,\r\n mngSourceCon = 13,\r\n\r\n // DMA\r\n vwDMA = 20,\r\n mngDMA = 21,\r\n\r\n // System\r\n vwSysHealth = 30,\r\n vwSysSettings = 31,\r\n mngSysSettings = 32,\r\n vwActivityLog = 33,\r\n // Users\r\n vwUser = 40,\r\n mngUser = 41,\r\n\r\n // Overrides\r\n vwOverrideGrp = 50,\r\n mngOverrideGrp = 51,\r\n mngOverride = 52,\r\n\r\n // Station Admin\r\n vwStations = 60,\r\n mngStations = 61,\r\n\r\n // Station Permissions\r\n vwStnSubRules = 100,\r\n mngStnSubRules = 101,\r\n vwStn = 110,\r\n vwStnSchedule = 111,\r\n mngStnSub = 112,\r\n}\r\n","\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n Partners\r\n Blackouts\r\n \r\n \r\n \r\n \r\n {{row.name}}\r\n \r\n \r\n \r\n \r\n {{blackout.eventStart|date:'shortTime'}} - {{blackout.eventEnd|date:'shortTime'}}\r\n \r\n \r\n \r\n \r\n \r\n Updated {{blackout.lastUpdated|date:'short'}} by\r\n \r\n Rule #{{blackout.createdBySignalEventRuleId}}\r\n \r\n \r\n {{blackout.updatedBy}}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n  \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n\r\n\r\n
\r\n \r\n
\r\n
\r\n","import { Component, OnInit, Input } from '@angular/core';\r\nimport { ApiService } from '../../_shared/services/api.service';\r\nimport { DynamicDialogRef, DynamicDialogConfig } from 'primeng/dynamicdialog';\r\nimport { UiService } from '../../_shared/services/ui.service';\r\nimport { DateTime } from 'luxon';\r\nimport { Subscription, timer } from 'rxjs';\r\nimport { AuthService } from '../../_shared/services/auth.service';\r\nimport { AppPermission } from '../../_shared/models/user';\r\n\r\n@Component({\r\n selector: 'app-airing-summary',\r\n templateUrl: './airing-summary.component.html',\r\n styleUrls: ['./airing-summary.component.scss']\r\n})\r\nexport class AiringSummaryComponent implements OnInit {\r\n\r\n constructor(\r\n private apiService: ApiService,\r\n private uiService: UiService,\r\n private authService: AuthService,\r\n public ref: DynamicDialogRef,\r\n public config: DynamicDialogConfig) { }\r\n\r\n model: any;\r\n ui = {\r\n buttons: { blackoutAll: false, deleteAll: false },\r\n hasChanges: false,\r\n canEdit: false\r\n };\r\n timer: Subscription;\r\n\r\n ngOnInit(): void {\r\n if (this.config.data.airingId) {\r\n this.openAiring();\r\n } else {\r\n this.uiService.toast.error(\"Airing not found\");\r\n this.close();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.close();\r\n\r\n if (this.timer)\r\n this.timer.unsubscribe();\r\n }\r\n\r\n openAiring() {\r\n this.apiService.get({\r\n method: `schedule/airing`,\r\n params: { airingId: this.config.data.airingId },\r\n onSuccess: (r) => {\r\n this.model = r.result;\r\n\r\n this.ui.canEdit = this.authService.isPermittedForStation(AppPermission.mngStnSub, this.model.airing.stationId);\r\n\r\n // Get formatted dates\r\n var airingStart = DateTime.fromISO(this.model.airing.startTimeLocal);\r\n var airingEnd = DateTime.fromISO(this.model.airing.endTimeLocal);\r\n this.model.startDate = airingStart.toLocaleString(DateTime.DATE_SHORT);\r\n this.model.startTime = airingStart.toLocaleString(DateTime.TIME_SIMPLE);\r\n this.model.endTime = airingEnd.toLocaleString(DateTime.TIME_SIMPLE);\r\n\r\n this.model.title = [this.model.airing.seriesTitle, this.model.airing.title].filter(x => x).join(\" - \");\r\n this.model.duration = `${this.model.airing.duration} mins`;\r\n\r\n this.config.header = `${this.model.airing.callSign} - ${this.model.airing.seriesTitle || this.model.airing.title} - ${airingStart.toLocaleString(DateTime.DATE_MED_WITH_WEEKDAY)} ${this.model.startTime}`;\r\n\r\n this.model.events.forEach(ev => {\r\n ev.updatedBy = ev.createdBySignalEventRuleId ? `Rule #${ev.createdBySignalEventRuleId}` : ev.updatedBy;\r\n });\r\n\r\n this.configureBlackouts();\r\n var delay = (60 - DateTime.now().second) * 1000; // initial delay so refresh occurs at 1 second of each minute\r\n this.timer = timer(delay, 60000).subscribe(() => { this.configureBlackouts(); });\r\n }\r\n });\r\n }\r\n\r\n configureBlackouts() {\r\n var now = DateTime.now();\r\n var airingEnded = DateTime.fromISO(this.model.airing.endTimeLocal) <= now;\r\n\r\n this.model.partners = this.model.airing.partners.map(p => {\r\n var blackouts = this.model.events.filter(ev => ev.partnerId === p.partnerId);\r\n\r\n blackouts.forEach(b => {\r\n var blackoutEnded = DateTime.fromISO(b.eventEnd) <= now;\r\n\r\n b.allowDelete = this.ui.canEdit && !blackoutEnded;\r\n });\r\n\r\n return {\r\n ...p,\r\n blackouts,\r\n allowCreate: this.ui.canEdit && !airingEnded && !blackouts.some(b => b.allowDelete),\r\n allowDelete: this.ui.canEdit && blackouts.some(b => b.allowDelete)\r\n };\r\n });\r\n\r\n this.ui.buttons.blackoutAll = this.model.partners.every(p => p.allowCreate);\r\n this.ui.buttons.deleteAll = this.model.partners.some(p => p.allowDelete);\r\n }\r\n\r\n createBlackout(row) {\r\n this.executeCreate([row.partnerId]);\r\n }\r\n\r\n deleteBlackout(blackout) {\r\n this.executeDelete([blackout.signalEventGroupId]);\r\n }\r\n\r\n blackoutAll() {\r\n var partnerIds = this.model.partners\r\n .filter(p => p.allowCreate)\r\n .map(p => p.partnerId);\r\n\r\n this.executeCreate(partnerIds);\r\n }\r\n\r\n deleteAll() {\r\n var groupIds = this.model.partners\r\n .map(p => p.blackouts)\r\n .flat()\r\n .filter(b => b.allowDelete)\r\n .map(b => b.signalEventGroupId);\r\n\r\n this.executeDelete(groupIds);\r\n }\r\n\r\n close() {\r\n this.ref.close({ refresh: this.ui.hasChanges });\r\n }\r\n\r\n private executeCreate(partnerIds) {\r\n this.apiService.post({\r\n method: \"signalEvent/create\",\r\n data: {\r\n stationId: this.model.airing.stationId,\r\n startDate: this.model.airing.startTimeLocal,\r\n endDate: this.model.airing.endTimeLocal,\r\n startEventDescription: `Start Blackout [${this.model.title}]`,\r\n endEventDescription: `End Blackout [${this.model.title}]`,\r\n partnerIds\r\n },\r\n blockUi: true,\r\n onSuccess: (r) => {\r\n this.ui.hasChanges = true;\r\n this.openAiring();\r\n }\r\n });\r\n }\r\n\r\n private executeDelete(groupIds) {\r\n this.apiService.delete({\r\n method: `signalEvent`,\r\n params: { groupIds },\r\n blockUi: true,\r\n onSuccess: (r) => {\r\n this.ui.hasChanges = true;\r\n this.openAiring();\r\n }\r\n });\r\n }\r\n}\r\n","export const ZIXI_LOCATION = {\r\n EAST: 'east',\r\n WEST: 'west'\r\n};\r\n\r\nexport const ZIXI_LOCATIONS = [ZIXI_LOCATION.EAST, ZIXI_LOCATION.WEST];\r\n","\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
Live Snapshots
\r\n \r\n
\r\n \r\n \r\n \r\n {{platform.name}}\r\n {{platform.source}}\r\n \r\n \r\n {{location}}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n\r\n\r\n
\r\n \r\n
\r\n
\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog';\r\nimport { ZIXI_LOCATIONS } from '../../_shared/models/constants';\r\nimport { ApiService } from '../../_shared/services/api.service';\r\n\r\n@Component({\r\n selector: 'app-station-summary',\r\n templateUrl: './station-summary.component.html',\r\n styleUrls: ['./station-summary.component.scss']\r\n})\r\nexport class StationSummaryComponent implements OnInit {\r\n\r\n constructor(\r\n private apiService: ApiService,\r\n public ref: DynamicDialogRef,\r\n public config: DynamicDialogConfig) { }\r\n\r\n station: any;\r\n platforms: any[];\r\n autoRefresh = true;\r\n locations = ZIXI_LOCATIONS;\r\n\r\n ngOnInit() {\r\n this.refresh();\r\n }\r\n\r\n refresh() {\r\n this.apiService.get({\r\n method: \"station/summary\",\r\n params: { stationId: this.config.data.stationId },\r\n onSuccess: (r) => {\r\n this.station = r.result.station;\r\n this.platforms = r.result.platforms\r\n\r\n this.config.header = this.station.callSign;\r\n }\r\n });\r\n }\r\n}\r\n","\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
System Roles
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
Station Roles
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n Station \r\n \r\n {{role.name}} \r\n \r\n \r\n \r\n  \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{station.name}}\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n\r\n\r\n
\r\n \r\n
\r\n
\r\n","import { Component, EventEmitter, ViewChild, OnInit, Output } from '@angular/core';\r\nimport { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog';\r\nimport { AppPermission } from '../../../_shared/models/user';\r\nimport { ApiService } from '../../../_shared/services/api.service';\r\nimport { AuthService } from '../../../_shared/services/auth.service';\r\nimport { UiService } from '../../../_shared/services/ui.service';\r\nimport { Table } from 'primeng/table';\r\n\r\n\r\n@Component({\r\n selector: 'app-user-detail',\r\n templateUrl: './user-detail.component.html',\r\n styleUrls: ['./user-detail.component.scss']\r\n})\r\nexport class UserDetailComponent implements OnInit {\r\n\r\n constructor(\r\n private uiService: UiService,\r\n private apiService: ApiService,\r\n private authService: AuthService,\r\n public ref: DynamicDialogRef,\r\n public config: DynamicDialogConfig) { }\r\n\r\n @ViewChild('table') table: Table;\r\n user: User;\r\n options: any;\r\n canEdit: boolean;\r\n stationFilter: string;\r\n\r\n ngOnInit(): void {\r\n this.canEdit = this.authService.isPermitted(AppPermission.mngUser);\r\n\r\n this.refresh();\r\n }\r\n\r\n save() {\r\n if (!this.user.systemRoles?.length && !this.user.stationRoles?.length) {\r\n this.uiService.toast.error(\"User must be assigned to at least one role.\");\r\n return;\r\n }\r\n\r\n // Update station roles attribute for post\r\n this.user.stationRoles = this.options.stationRoles.map(r => ({\r\n roleId: r.roleId,\r\n stationIds: this.options.stations.filter(s => (s[\"role\" + r.roleId] === true)).map(s => s.id)\r\n }));\r\n\r\n this.apiService.post({\r\n method: \"user/save\",\r\n data: this.user,\r\n onSuccess: (r) => {\r\n this.uiService.toast.success(`User ${this.user.appUserId === 0 ? 'created' : 'updated'}`);\r\n this.close(true);\r\n },\r\n onError: (e) => {\r\n this.uiService.toast.error(e.message);\r\n }\r\n });\r\n }\r\n\r\n close(refresh = false) {\r\n this.ref.close({ refresh });\r\n }\r\n\r\n refresh() {\r\n if (this.config.data.appUserId === 0) {\r\n this.user = { appUserId: 0, active: true };\r\n this.getRoleInfo();\r\n }\r\n else {\r\n this.apiService.get({\r\n method: `user/${this.config.data.appUserId}`,\r\n onSuccess: (r) => {\r\n this.user = r.result;\r\n this.getRoleInfo();\r\n }\r\n });\r\n }\r\n }\r\n\r\n getRoleInfo() {\r\n this.apiService.get({\r\n method: `lookup/roleType`,\r\n\r\n onSuccess: (rt) => {\r\n var roleTypes = {\r\n systemRolesType: rt.result.find((rt: any) => (rt.name === \"System\")),\r\n stationRolesType: rt.result.find((rt: any) => (rt.name === \"Station\"))\r\n };\r\n\r\n this.apiService.getMultiple([\r\n `lookup/stations/admin`,\r\n `lookup/roleType/${roleTypes.systemRolesType.roleTypeId}/roles?includeInactive=false`,\r\n `lookup/roleType/${roleTypes.stationRolesType.roleTypeId}/roles?includeInactive=false`,\r\n ]).subscribe(mr => {\r\n\r\n this.options = {\r\n stations: mr[0].result,\r\n systemRoles: mr[1].result,\r\n stationRoles: mr[2].result\r\n }\r\n\r\n // Set station role checkboxes\r\n this.options.stationRoles.forEach(r => {\r\n var stationIdsWithRole = this.user.stationRoles.find(usr => usr.roleId === r.roleId)?.stationIds || [];\r\n this.options.stations.forEach(s => {\r\n s[`role${r.roleId}`] = stationIdsWithRole.includes(s.id);\r\n });\r\n this.selectionChanged(r);\r\n });\r\n });\r\n }\r\n })\r\n };\r\n\r\n filterStations() {\r\n if (!this.table) return;\r\n\r\n this.table.filter(this.stationFilter, 'name', 'contains');\r\n }\r\n\r\n selectAllNone(role) {\r\n this.options.stations.forEach(s => {\r\n s['role' + role.roleId] = role.all;\r\n });\r\n }\r\n\r\n selectionChanged(role) {\r\n role.all = this.options.stations.every(x => x['role' + role.roleId]);\r\n }\r\n}\r\n\r\ninterface User {\r\n appUserId: number,\r\n oktaLogin: string,\r\n firstName: string,\r\n lastName: string,\r\n active: boolean,\r\n systemRoles: number[],\r\n stationRoles: StationRole[]\r\n}\r\n\r\ninterface StationRole {\r\n roleId: number,\r\n stationIds: number[]\r\n}\r\n","import { Injectable, Type } from '@angular/core';\r\nimport { MessageService } from 'primeng/api';\r\nimport { DialogService, DynamicDialogConfig } from 'primeng/dynamicdialog';\r\nimport { AiringSummaryComponent } from '../../airing/airing-summary/airing-summary.component';\r\nimport { StationSummaryComponent } from '../../station/station-summary/station-summary.component';\r\nimport { UserDetailComponent } from '../../system/user/user-detail/user-detail.component';\r\n\r\n@Injectable()\r\nexport class UiService {\r\n constructor(\r\n private messageService: MessageService,\r\n private dialogService: DialogService) { }\r\n\r\n config = {\r\n showSpinner: false\r\n };\r\n\r\n startSpinner() {\r\n setTimeout(() => {\r\n this.config.showSpinner = true;\r\n });\r\n }\r\n\r\n stopSpinner() {\r\n setTimeout(() => {\r\n this.config.showSpinner = false;\r\n });\r\n }\r\n\r\n toast = {\r\n add: (severity: string, summary: string, detail?: string) => {\r\n this.messageService.add({ key: 'appToast', severity, summary, detail });\r\n },\r\n success: (summary: string, detail?: string) => {\r\n this.toast.add(\"success\", summary, detail);\r\n },\r\n error: (summary: string, detail?: string) => {\r\n this.toast.add(\"error\", summary, detail);\r\n },\r\n info: (summary: string, detail?: string) => {\r\n this.toast.add(\"info\", summary, detail);\r\n }\r\n }\r\n\r\n handleUnexpectedError = (message?: string) => {\r\n this.toast.error(\"An unexpected error has occurred\");\r\n }\r\n\r\n isSysAdmin() {\r\n // TODO: Implement - for driving various UI logic\r\n return true;\r\n }\r\n\r\n open = {\r\n dialog: (componentType: Type, config: DynamicDialogConfig) => {\r\n return this.dialogService.open(componentType, config);\r\n },\r\n airing: (id: number) => {\r\n return this.dialogService.open(AiringSummaryComponent, {\r\n header: 'Airing',\r\n width: '1200px',\r\n data: { airingId: id },\r\n });\r\n },\r\n station: (id: number) => {\r\n this.dialogService.open(StationSummaryComponent, {\r\n header: 'Station',\r\n width: '770px',\r\n data: { stationId: id },\r\n });\r\n },\r\n user: (id: number, header: string) => {\r\n return this.dialogService.open(UserDetailComponent, {\r\n header,\r\n width: '900px',\r\n data: { appUserId: id },\r\n closable: false\r\n });\r\n }\r\n }\r\n}\r\n","import { HttpClient, HttpErrorResponse } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { forkJoin, Observable } from 'rxjs';\r\nimport { environment } from '../../../environments/environment';\r\nimport { ApiRequestConfig, ApiResponse } from '../models/models';\r\nimport { UiService } from './ui.service';\r\n\r\n@Injectable()\r\nexport class ApiService {\r\n constructor(\r\n private http: HttpClient,\r\n private uiService: UiService) { }\r\n\r\n get(config: ApiRequestConfig) {\r\n var request = this.http.get(this.getUrl(config), { params: config.params });\r\n\r\n this.executeRequest(request, config);\r\n }\r\n\r\n post(config: ApiRequestConfig) {\r\n var request = this.http.post(this.getUrl(config), config.data);\r\n\r\n this.executeRequest(request, config);\r\n }\r\n\r\n put(config: ApiRequestConfig) {\r\n var request = this.http.put(this.getUrl(config), config.data);\r\n\r\n this.executeRequest(request, config);\r\n }\r\n\r\n delete(config: ApiRequestConfig) {\r\n var request = this.http.delete(this.getUrl(config), { params: config.params });\r\n\r\n this.executeRequest(request, config);\r\n }\r\n\r\n getMultiple(urls: string[]) {\r\n var get = (path: string) => (this.http.get(`${environment.apiUrl}/v1/${path}`));\r\n\r\n return forkJoin(urls.map(url => { return get(url) }));\r\n }\r\n\r\n getUrl(config: ApiRequestConfig) {\r\n config.apiVersion = config.apiVersion || \"v1\";\r\n\r\n return `${environment.apiUrl}/${config.apiVersion}/${config.method}`;\r\n }\r\n\r\n private executeRequest(request: Observable, config: ApiRequestConfig) {\r\n if (config.blockUi)\r\n this.uiService.startSpinner();\r\n\r\n request.subscribe(r => {\r\n if (config.blockUi)\r\n this.uiService.stopSpinner();\r\n\r\n if (r.success) {\r\n if (config.onSuccess) {\r\n config.onSuccess(r);\r\n }\r\n } else if (r.errors?.length) {\r\n if (config.onError) {\r\n config.onError(r);\r\n } else {\r\n r.errors.forEach((error: any) => {\r\n this.uiService.toast.error(`Error ${error.code}`, error.description)\r\n });\r\n }\r\n }\r\n }, this.handleError);\r\n }\r\n\r\n private handleError = (response: HttpErrorResponse) => {\r\n let text = \"An unexpected error has occurred.\";\r\n var toastGenericResponse = true;\r\n\r\n switch (response.status) {\r\n case 400:\r\n if (response?.error?.title === \"One or more validation errors occurred.\" && response.error.errors) {\r\n for (const key in response.error.errors) {\r\n var errorText = response.error.errors[key];\r\n if (typeof errorText[0] === 'string') {\r\n this.uiService.toast.error(errorText);\r\n toastGenericResponse = false;\r\n }\r\n }\r\n } else if (response.error.message) {\r\n this.uiService.toast.error(response.error.message);\r\n toastGenericResponse = false;\r\n }\r\n break;\r\n case 401:\r\n case 403:\r\n text = \"You are not authorized to perform this action.\";\r\n break;\r\n case 404:\r\n text = \"Invalid request.\"\r\n break;\r\n default:\r\n if (response?.error?.message) {\r\n this.uiService.toast.error(response.error.message);\r\n toastGenericResponse = false;\r\n }\r\n break;\r\n }\r\n\r\n if (toastGenericResponse)\r\n this.uiService.toast.error(`Error - ${response.status}`, text);\r\n }\r\n}\r\n","import { HttpClient, HttpErrorResponse } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { AppPermission, AppUser } from '../models/user';\r\nimport { ApiResponse } from '../models/models';\r\nimport { ApiService } from './api.service';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n@Injectable()\r\nexport class AuthService {\r\n constructor(\r\n private http: HttpClient,\r\n private apiService: ApiService) { }\r\n\r\n private isAuthorizedSubject = new BehaviorSubject(null);\r\n isAuthorized$ = this.isAuthorizedSubject.asObservable();\r\n user: AppUser;\r\n\r\n init() {\r\n var authUrl = this.apiService.getUrl({ method: \"user/authorize\" });\r\n this.http.get(authUrl).subscribe((r) => {\r\n this.user = r.result;\r\n this.isAuthorizedSubject.next(true);\r\n }, (r: HttpErrorResponse) => {\r\n this.user = null;\r\n this.isAuthorizedSubject.next(false);\r\n });\r\n }\r\n\r\n isPermitted(permission: AppPermission) {\r\n return this.user?.permissions.includes(permission) === true;\r\n }\r\n\r\n isPermittedForStation(permission: AppPermission, stationId: number) {\r\n return this.user?.stationPermissions[permission]?.includes(stationId) === true;\r\n }\r\n}\r\n","export enum OverrideType {\r\n ForceBlackout = 1,\r\n ForceStream\r\n}\r\n","
\r\n

{{job.title}}

\r\n
\r\n
{{job.completeCount}} of {{job.size}} completed
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
{{action.description}}
\r\n
\r\n {{action.message}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Component, OnInit } from '@angular/core';\r\nimport { DynamicDialogConfig, DynamicDialogRef } from 'primeng/dynamicdialog';\r\nimport { catchError, from, map, mergeMap, of } from 'rxjs';\r\nimport { ApiService } from '../../services/api.service';\r\nimport { QueueJobRequest } from './queue-job.service';\r\n\r\n@Component({\r\n selector: 'app-queue-job',\r\n templateUrl: './queue-job.component.html',\r\n styleUrls: ['./queue-job.component.scss']\r\n})\r\nexport class QueueJobComponent implements OnInit {\r\n\r\n constructor(\r\n private apiService: ApiService,\r\n private http: HttpClient,\r\n public ref: DynamicDialogRef,\r\n public config: DynamicDialogConfig) { }\r\n\r\n request: QueueJobRequest;\r\n job = {\r\n title: null,\r\n batchSize: 5,\r\n actions: [],\r\n size: 0,\r\n completeCount: 0,\r\n progress: 0,\r\n started: false,\r\n completed: false,\r\n cancelled: false\r\n };\r\n\r\n ngOnInit() {\r\n this.request = this.config.data.request;\r\n\r\n this.initJob();\r\n this.execJob();\r\n }\r\n\r\n initJob() {\r\n this.job = {\r\n ...this.job,\r\n title: this.request.title,\r\n size: this.request.actions.length\r\n }\r\n\r\n this.job.actions = this.request.actions\r\n .map(a => ({\r\n ...a,\r\n response: null,\r\n error: null\r\n }));\r\n }\r\n\r\n execJob() {\r\n this.job.started = true;\r\n\r\n from(this.job.actions)\r\n .pipe(mergeMap((action) => this.execAction(action), this.job.batchSize))\r\n .subscribe();\r\n }\r\n\r\n execAction(action) {\r\n if (this.job.cancelled) {\r\n action.completed = true;\r\n action.message = \"Cancelled\";\r\n return of(action);\r\n }\r\n\r\n action.started = true;\r\n\r\n var apiUrl = this.apiService.getUrl({ method: action.apiMethod });\r\n\r\n return this.http.post(apiUrl, action.postData)\r\n .pipe(\r\n map((response: any) => this.handleReponse(response, action)),\r\n catchError(response => this.handleReponse(response, action))\r\n );\r\n }\r\n\r\n handleReponse(response, action) {\r\n action.response = response;\r\n action.completed = true;\r\n action.success = response.success === true ? true : false;\r\n action.message = action.success ? \"Success\" : (response.error?.message || \"An error has occurred\");\r\n\r\n this.job.completeCount++;\r\n this.job.progress = Math.ceil((this.job.completeCount * 100) / this.job.size);\r\n\r\n if (this.job.completeCount === this.job.size)\r\n this.job.completed = true;\r\n\r\n return of(response);\r\n }\r\n\r\n stopJob() {\r\n this.job.cancelled = true;\r\n }\r\n\r\n closeDialog() {\r\n var stationIds = this.job.actions.filter(a => a.completed).map(a => a.stationId);\r\n stationIds = Array.from(new Set(stationIds));\r\n\r\n this.ref.close({ refresh: true, stationIds });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { DialogService } from 'primeng/dynamicdialog';\r\nimport { OverrideType } from '../../models/enums';\r\nimport { QueueJobComponent } from './queue-job.component';\r\n\r\n@Injectable()\r\nexport class QueueJobService {\r\n constructor(\r\n private dialogService: DialogService) { }\r\n\r\n launchForOverride(actions: QueueJobActionData[], overrideType?: OverrideType) {\r\n let request: QueueJobRequest = {\r\n type: QueueJobType.Override,\r\n title: this.getTitle(overrideType),\r\n actions\r\n };\r\n\r\n actions.forEach(a => {\r\n a.apiMethod = `override/apply`;\r\n a.postData = {\r\n overrideTarget: { stationId: a.stationId, partnerId: a.partnerId },\r\n overrideType\r\n }\r\n });\r\n\r\n return this.launch(request);\r\n }\r\n\r\n launchForADN(actions: QueueJobActionData[]) {\r\n let request: QueueJobRequest = {\r\n type: QueueJobType.ADN,\r\n title: \"ADN Request\",\r\n actions\r\n };\r\n\r\n actions.forEach(a => {\r\n a.apiMethod = `adn/${a.adnId ? \"connect\" : \"disconnect\"}`;\r\n a.postData = {\r\n adnSwitchTarget: { stationId: a.stationId, targetId: a.targetId },\r\n switchToAdnId: a.adnId\r\n }\r\n });\r\n\r\n return this.launch(request);\r\n }\r\n\r\n launchForSourceSwitch(actions: QueueJobActionData[]) {\r\n let request: QueueJobRequest = {\r\n type: QueueJobType.ADN,\r\n title: \"Source Switch Request\",\r\n actions\r\n };\r\n\r\n actions.forEach(a => {\r\n a.apiMethod = `station/platform/source`;\r\n a.postData = {\r\n stationId: a.stationId,\r\n platformId: a.platformId,\r\n sourceId: a.sourceId\r\n }\r\n });\r\n\r\n return this.launch(request);\r\n }\r\n\r\n launch(request: QueueJobRequest) {\r\n return this.dialogService.open(QueueJobComponent, {\r\n width: '600px',\r\n showHeader: false,\r\n data: { request }\r\n });\r\n }\r\n\r\n private getTitle(overrideType?: OverrideType) {\r\n switch (overrideType) {\r\n case OverrideType.ForceBlackout: return \"Force Blackout\";\r\n case OverrideType.ForceStream: return \"Force Stream\";\r\n default: return \"Run Schedule\";\r\n };\r\n }\r\n}\r\n\r\nexport interface QueueJobRequest {\r\n type: QueueJobType;\r\n actions: QueueJobActionData[];\r\n title: string\r\n}\r\n\r\nexport interface QueueJobActionData {\r\n stationId: number;\r\n partnerId?: number;\r\n targetId?: number;\r\n platformId?: number;\r\n sourceId?: number;\r\n adnId?: number;\r\n description: string;\r\n apiMethod?: string;\r\n postData?: any;\r\n}\r\n\r\nexport enum QueueJobType {\r\n Override = 1,\r\n ADN\r\n}\r\n","import { inject } from \"@angular/core\";\r\nimport { Router } from \"@angular/router\";\r\nimport { filter, map } from \"rxjs\";\r\nimport { AppPermission } from \"../models/user\";\r\nimport { AuthService } from \"../services/auth.service\";\r\n\r\nexport const HttpsGuard = () => {\r\n if (window.location.hostname === \"localhost\") return true;\r\n\r\n const currentProtocol = window.location.protocol.replace(':', '');\r\n if (currentProtocol !== 'https') {\r\n const url = window.location.href.replace('http', 'https');\r\n window.location.href = url;\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nexport const PermissionsGuard = (permission: AppPermission) => {\r\n const authService = inject(AuthService);\r\n const router = inject(Router);\r\n\r\n return authService.isAuthorized$.pipe(\r\n filter(x => !!x),\r\n map(authorized => {\r\n if (authorized && authService.isPermitted(permission))\r\n return true;\r\n\r\n return router.navigate(['unauthorized']);\r\n })\r\n );\r\n}\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport {\r\n HttpRequest,\r\n HttpHandler,\r\n HttpEvent,\r\n HttpInterceptor\r\n} from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { OKTA_AUTH } from '@okta/okta-angular';\r\nimport { OktaAuth } from '@okta/okta-auth-js';\r\nimport { environment } from '../../../environments/environment';\r\n\r\n@Injectable()\r\nexport class AuthInterceptor implements HttpInterceptor {\r\n\r\n constructor(@Inject(OKTA_AUTH) private _oktaAuth: OktaAuth) { }\r\n\r\n intercept(request: HttpRequest, next: HttpHandler): Observable> {\r\n return next.handle(this.addAuthHeaderToAllowedOrigins(request));\r\n }\r\n\r\n private addAuthHeaderToAllowedOrigins(request: HttpRequest): HttpRequest {\r\n \r\n const allowedOrigins = [`${environment.apiUrl}`];\r\n if (!!allowedOrigins.find(origin => request.url.includes(origin))) {\r\n //const authToken = this._oktaAuth.getAccessToken();\r\n const authToken = this._oktaAuth.getIdToken();\r\n request = request.clone({\r\n withCredentials: true,\r\n setHeaders: {\r\n Authorization: authToken ? ('Bearer ' + authToken) : ''\r\n }\r\n });\r\n }\r\n\r\n return request;\r\n }\r\n}\r\n\r\n\r\n\r\n","
\r\n

Activity Log

\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n Activity Type \r\n Performed On \r\n User \r\n Station \r\n Platform \r\n Audience \r\n Status\r\n Details\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n  \r\n \r\n \r\n \r\n \r\n {{ entry.activityType }}\r\n {{ entry.performedOnUTC | date:\"short\" }}\r\n {{ entry.user }}\r\n {{ entry.station }}\r\n {{ entry.platform }}\r\n {{ entry.audience }}\r\n {{ entry.status }}\r\n \r\n \r\n \r\n {{x.name}} | {{x.value}}\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n\r\n
\r\n
\r\n
{{x.name}}
\r\n {{x.value}}\r\n
\r\n
\r\n
\r\n","import { Component, OnInit, ViewChild } from '@angular/core';\r\nimport { DateTime } from 'luxon';\r\nimport { LazyLoadEvent } from 'primeng/api';\r\nimport { OverlayPanel } from 'primeng/overlaypanel';\r\nimport { ApiService } from '../../_shared/services/api.service';\r\n\r\n@Component({\r\n selector: 'app-activity-log',\r\n templateUrl: './activity-log.component.html',\r\n styleUrls: ['./activity-log.component.scss']\r\n})\r\nexport class ActivityLogComponent implements OnInit {\r\n\r\n constructor(\r\n private apiService: ApiService) { }\r\n\r\n @ViewChild(OverlayPanel) private op: OverlayPanel;\r\n result: ActivitySearchResult;\r\n entries: ActivityEntry[];\r\n selected: ActivityEntry;\r\n totalRecords: number;\r\n loading: boolean = true;\r\n options: any = {};\r\n \r\n ngOnInit() {\r\n this.getOptions();\r\n }\r\n\r\n loadResult(event: LazyLoadEvent) {\r\n this.loading = true;\r\n\r\n var params = {\r\n pageSize: event.rows,\r\n pageNumber: (event.first / event.rows) + 1,\r\n sortBy: event.sortField,\r\n sortDirection: event.sortOrder === 1 ? \"desc\" : \"asc\",\r\n activityTypeId: event.filters.activityType?.value?.activityTypeId,\r\n appUserOktaId: event.filters.user?.value || undefined,\r\n stationId: event.filters.station?.value?.id,\r\n platformId: event.filters.platform?.value?.id,\r\n audienceId: event.filters.audience?.value?.id,\r\n performedOnUtc: event.filters.performedOnUTC?.value\r\n ? DateTime.fromJSDate(event.filters.performedOnUTC.value).toISODate()\r\n : undefined,\r\n status: event.filters.status?.value?.id\r\n };\r\n\r\n // Remove undefined filters\r\n Object.keys(params).forEach(key => params[key] === undefined ? delete params[key] : {});\r\n\r\n this.apiService.get({\r\n method: \"activity\",\r\n params,\r\n onSuccess: (r) => {\r\n this.result = r.result;\r\n this.entries = this.result.items;\r\n this.totalRecords = this.result.totalCount;\r\n this.loading = false;\r\n }\r\n });\r\n }\r\n\r\n showDetails($event, entry: ActivityEntry) {\r\n this.selected = entry;\r\n this.op.show($event);\r\n\r\n return false;\r\n }\r\n\r\n getOptions() {\r\n this.apiService.get({\r\n method: \"lookup/activityTypes\",\r\n onSuccess: (r) => {\r\n this.options.activityTypes = r.result;\r\n }\r\n });\r\n\r\n this.apiService.get({\r\n method: \"lookup/stations\",\r\n onSuccess: (r) => {\r\n this.options.stations = r.result;\r\n }\r\n });\r\n\r\n this.apiService.get({\r\n method: \"lookup/platforms\",\r\n onSuccess: (r) => {\r\n this.options.platforms = r.result;\r\n }\r\n });\r\n\r\n this.apiService.get({\r\n method: \"lookup/audiences\",\r\n onSuccess: (r) => {\r\n this.options.audiences = r.result;\r\n }\r\n });\r\n\r\n this.options.statuses = [{ id: -1, name: \"Failed\" }, { id: 0, name: \"Unknown\" }, { id: 1, name: \"Success\" }];\r\n }\r\n}\r\n\r\ninterface ActivitySearchResult {\r\n currentPage: number;\r\n totalPages: number;\r\n pageSize: number;\r\n totalCount: number;\r\n items: ActivityEntry[];\r\n}\r\n\r\ninterface ActivityEntry {\r\n activityType?: string;\r\n user?: string;\r\n performedOnUTC?: DateTime;\r\n stationId?: number;\r\n platformId?: number;\r\n activityLogDetail?: ActivityEntryDetail[];\r\n}\r\n\r\ninterface ActivityEntryDetail {\r\n name: string;\r\n value: string;\r\n}\r\n","\r\n

\r\n Enter one line for every station. Each line must contain the station's call sign, followed by a TAB and then a label that will be used for grouping the stations. Click here to see an example.\r\n

\r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n Please specify ADN assignments for the following:\r\n
\r\n
\r\n
{{ group.title }}
\r\n \r\n
\r\n
\r\n
{{ station.name }}
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n","import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';\r\nimport { DynamicDialogRef, DynamicDialogConfig } from 'primeng/dynamicdialog';\r\nimport { ApiService } from '../../_shared/services/api.service';\r\nimport { UiService } from '../../_shared/services/ui.service';\r\n\r\n@Component({\r\n selector: 'app-adn-import',\r\n templateUrl: './adn-import.component.html',\r\n styleUrls: ['./adn-import.component.scss']\r\n})\r\n\r\nexport class AdnImportComponent implements OnInit {\r\n\r\n constructor(\r\n private apiService: ApiService,\r\n public ref: DynamicDialogRef,\r\n public config: DynamicDialogConfig,\r\n public uiService: UiService) { }\r\n\r\n job: ImportJob;\r\n stations: Lookup[];\r\n adns: Lookup[];\r\n @ViewChild('textarea') textarea: ElementRef;\r\n\r\n ngOnInit() {\r\n this.adns = this.config.data.adns;\r\n this.getStations();\r\n\r\n this.job = { inputText: \"\", step: 1 };\r\n }\r\n\r\n next() {\r\n if (this.job.step === 1) {\r\n this.processInput();\r\n\r\n if (this.job.groups.length === 0)\r\n this.uiService.toast.error(\"Unable to process the input provided\");\r\n else if (this.job.invalidStations.length > 0)\r\n this.uiService.toast.error(`The following station(s) are not active in Signal Manager: ${this.job.invalidStations.join(', ')}`);\r\n else if (this.job.duplicateStations.length > 0)\r\n this.uiService.toast.error(`The following station(s) appear more than once: ${this.job.duplicateStations.map(s => s.name).join(', ')}`);\r\n else\r\n this.job.step++;\r\n }\r\n }\r\n\r\n back() {\r\n if (this.job.step === 2) {\r\n this.job.step--;\r\n }\r\n }\r\n\r\n apply() {\r\n var adns = {};\r\n\r\n this.job.groups.forEach(group => {\r\n var adnId = group.adn.id || 0;\r\n adns[adnId] = adns[adnId] || [];\r\n group.stations.forEach(station => adns[adnId].push(station.id));\r\n });\r\n\r\n this.ref.close({ result: adns });\r\n }\r\n\r\n processInput() {\r\n this.job.groups = [];\r\n this.job.invalidStations = [];\r\n this.job.duplicateStations = [];\r\n\r\n var touchedStations = [];\r\n\r\n this.job.inputText.split('\\n').forEach(row => {\r\n const [stationName, groupLabel] = row.split('\\t');\r\n if (!stationName || !groupLabel) return;\r\n\r\n var station = this.stations.find(s => s.name === stationName);\r\n if (!station) {\r\n this.job.invalidStations.push(stationName);\r\n return;\r\n }\r\n\r\n if (touchedStations.some(s => s.id === station.id)) {\r\n this.job.duplicateStations.push(station);\r\n }\r\n\r\n touchedStations.push(station);\r\n\r\n const existingGroup = this.job.groups.find(g => g.title === groupLabel);\r\n\r\n if (existingGroup) {\r\n existingGroup.stations.push(station);\r\n } else {\r\n this.job.groups.push({\r\n title: groupLabel,\r\n stations: [station],\r\n adn: this.adns.find(x => x.name === groupLabel) || this.adns.find(x => !x.id)\r\n });\r\n }\r\n });\r\n }\r\n\r\n getStations() {\r\n this.apiService.get({\r\n method: \"lookup/stations\",\r\n onSuccess: (r) => {\r\n this.stations = r.result;\r\n }\r\n });\r\n }\r\n\r\n onTab(event: Event): void {\r\n event.preventDefault(); // prevent the default behavior of the tab key\r\n event.stopPropagation();\r\n\r\n const textarea = this.textarea.nativeElement as HTMLTextAreaElement;\r\n const start = textarea.selectionStart;\r\n const end = textarea.selectionEnd;\r\n const value = textarea.value;\r\n textarea.value = value.substring(0, start) + '\\t' + value.substring(end);\r\n textarea.selectionStart = textarea.selectionEnd = start + 1;\r\n }\r\n\r\n insertExampleText(event: Event) {\r\n event.preventDefault();\r\n\r\n this.job.inputText = \"WCBS\\tJacksonville @ Kansas City\\nKCBS\\tJacksonville @ Kansas City\\nKCNC\\tDenver @ Tennessee\";\r\n this.textarea.nativeElement.focus();\r\n }\r\n}\r\n\r\ninterface ImportJob {\r\n groups: Group[];\r\n inputText: string;\r\n invalidStations: string[];\r\n duplicateStations: Lookup[];\r\n step: number;\r\n}\r\n\r\ninterface Group {\r\n title: string;\r\n stations: Lookup[];\r\n adn?: Lookup;\r\n}\r\n\r\ninterface Lookup {\r\n id: number,\r\n name: string\r\n}\r\n","
\r\n

Default ADN Mappings

\r\n \r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {{adn.name}}\r\n \r\n
\r\n
\r\n
\r\n {{station.callSign}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n\r\n\r\n\r\n
\r\n
Import - {{selectedAdn.name}}
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n","import { Component, OnInit, ViewChild } from '@angular/core';\r\nimport { MenuItem } from 'primeng/api';\r\nimport { Menu } from 'primeng/menu';\r\nimport { AppPermission } from '../../_shared/models/user';\r\nimport { ApiService } from '../../_shared/services/api.service';\r\nimport { AuthService } from '../../_shared/services/auth.service';\r\nimport { UiService } from '../../_shared/services/ui.service';\r\nimport { AdnImportComponent } from '../adn-import/adn-import.component';\r\n\r\n@Component({\r\n selector: 'app-adn-mapper',\r\n templateUrl: './adn-mapper.component.html',\r\n styleUrls: ['./adn-mapper.component.scss']\r\n})\r\nexport class AdnMapperComponent implements OnInit {\r\n\r\n constructor(\r\n private apiService: ApiService,\r\n private uiService: UiService,\r\n private authService: AuthService) { }\r\n\r\n adns: DroppableAdn[];\r\n unassigned: DroppableAdn;\r\n draggedStation: DraggableStation;\r\n selectedAdn: DroppableAdn;\r\n @ViewChild('menu', { static: false }) menu: Menu;\r\n import;\r\n menuItems: MenuItem[];\r\n canEdit: boolean;\r\n options: any = {};\r\n profileId: number;\r\n dirty = false;\r\n\r\n ngOnInit() {\r\n this.canEdit = this.authService.isPermitted(AppPermission.mngADNMap);\r\n\r\n this.apiService.get({\r\n method: \"lookup/adn/mappingProfiles\",\r\n onSuccess: (r) => {\r\n this.options.profiles = r.result;\r\n this.profileId = this.options.profiles[0].id;\r\n this.refresh();\r\n }\r\n });\r\n }\r\n\r\n refresh() {\r\n this.apiService.get({\r\n method: \"adn/mappings\",\r\n blockUi: true,\r\n params: { mappingProfileId: this.profileId },\r\n onSuccess: (r) => {\r\n this.adns = r.result.mapped;\r\n this.unassigned = { adnId: null, name: \"Unassigned\", stations: r.result.unmapped };\r\n this.adns.push(this.unassigned);\r\n\r\n this.adns.forEach(adn => {\r\n this.sort(adn);\r\n });\r\n\r\n this.setDirty(false);\r\n }\r\n });\r\n }\r\n\r\n openMenu($event, adn: DroppableAdn) {\r\n this.selectedAdn = adn;\r\n\r\n this.menuItems = [\r\n { label: 'Edit', icon: 'pi pi-pencil', command: () => { this.showImport(); } },\r\n { label: 'Clear', icon: 'pi pi-trash', command: () => { this.clearStations(adn); }, visible: adn !== this.unassigned }\r\n ];\r\n\r\n this.menu.show($event);\r\n }\r\n\r\n showImport() {\r\n var text = this.selectedAdn.stations.map(s => s.callSign).join(\"\\n\");\r\n this.import = { text };\r\n }\r\n\r\n closeImport() {\r\n this.import = undefined;\r\n }\r\n\r\n applyImport() {\r\n this.clearStations(this.selectedAdn);\r\n var allStations = this.adns.map(x => x.stations).flat();\r\n\r\n var callSigns: string[] = this.import.text.split(\"\\n\");\r\n callSigns.forEach(callSign => {\r\n var match = allStations.find(s => s.callSign.toLowerCase() === callSign.toLowerCase());\r\n if (match) {\r\n this.move(match, this.selectedAdn);\r\n }\r\n });\r\n\r\n this.import = undefined;\r\n }\r\n\r\n clearStations(adn: DroppableAdn) {\r\n if (adn === this.unassigned)\r\n return;\r\n\r\n this.unassigned.stations = this.unassigned.stations.concat(adn.stations);\r\n this.sort(this.unassigned);\r\n\r\n adn.stations = [];\r\n\r\n this.setDirty(true);\r\n }\r\n\r\n clearAll() {\r\n this.adns.forEach((adn) => { this.clearStations(adn) });\r\n }\r\n\r\n dragStart(station: DraggableStation) {\r\n this.draggedStation = station;\r\n }\r\n\r\n drop(adn: DroppableAdn) {\r\n if (this.draggedStation) {\r\n this.move(this.draggedStation, adn);\r\n this.dragEnd();\r\n }\r\n }\r\n\r\n dragEnd() {\r\n this.draggedStation = null;\r\n }\r\n\r\n move(station: DraggableStation, adn: DroppableAdn) {\r\n this.adns.forEach(a => {\r\n a.stations = a.stations.filter(s => s.stationId !== station.stationId);\r\n });\r\n\r\n adn.stations.push(station);\r\n this.sort(adn);\r\n\r\n this.setDirty(true);\r\n }\r\n\r\n sort(adn: DroppableAdn) {\r\n adn.stations.sort((a, b) => a.callSign.localeCompare(b.callSign));\r\n }\r\n\r\n save() {\r\n var items = [];\r\n this.adns.forEach(adn => {\r\n adn.stations.forEach(s => {\r\n items.push({ stationId: s.stationId, adnId: adn.adnId });\r\n });\r\n adn.stations = [];\r\n });\r\n\r\n this.apiService.post({\r\n method: \"adn/mappings/save\",\r\n data: { items, mappingProfileId: this.profileId },\r\n blockUi: true,\r\n onSuccess: (r) => {\r\n this.refresh();\r\n this.uiService.toast.success(\"Default ADN Mappings updated\");\r\n }\r\n });\r\n }\r\n\r\n cancel() {\r\n this.refresh();\r\n }\r\n\r\n setDirty(val: boolean) {\r\n this.dirty = val;\r\n }\r\n\r\n profileClicked() {\r\n if (this.dirty)\r\n this.uiService.toast.info(\"There are unsaved changes. Please save or cancel first.\");\r\n }\r\n\r\n openImport() {\r\n var adns = this.adns.map(x => ({ id: x.adnId, name: x.name }));\r\n\r\n var dialog = this.uiService.open.dialog(AdnImportComponent, { header: \"ADN Import\", width: '700px', data: { adns } });\r\n\r\n dialog.onClose.subscribe(r => {\r\n if (r?.result) {\r\n var allStations = this.adns.map(x => x.stations).flat();\r\n\r\n for (const adnId of Object.keys(r.result)) {\r\n var stationIds = r.result[adnId];\r\n stationIds.forEach(stationId => {\r\n var station = allStations.find(s => s.stationId === stationId);\r\n var adn = this.adns.find(a => a.adnId === parseInt(adnId)) || this.unassigned;\r\n if (station && adn) {\r\n this.move(station, adn);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n }\r\n}\r\n\r\ninterface DroppableAdn {\r\n adnId: number;\r\n name: string;\r\n stations: DraggableStation[];\r\n import?: string;\r\n}\r\n\r\ninterface DraggableStation {\r\n stationId: number;\r\n callSign: string;\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { Station } from '../../_shared/models/models';\r\n\r\n@Pipe({\r\n name: 'airingScheduleFilter',\r\n pure: false\r\n})\r\n\r\nexport class AiringScheduleFilterPipe implements PipeTransform {\r\n transform(stations: Station[], filter: any): any {\r\n if (!stations || !filter) {\r\n return stations;\r\n }\r\n var items = stations;\r\n\r\n if (filter.stations?.length > 0) {\r\n var stationIds = filter.stations.map((s:Station) => s.id);\r\n\r\n items = items.filter(s => stationIds.includes(s.id));\r\n }\r\n\r\n if (filter.airings?.length > 0) {\r\n items = items.filter(s => s.airings.some(a => filter.airings.includes(a.title)));\r\n }\r\n\r\n if (filter.search) {\r\n var search = filter.search.toLowerCase();\r\n\r\n items = items.filter(s => {\r\n if (s.airings.some(a => a.title?.toLowerCase().includes(search)))\r\n return true;\r\n\r\n return false;\r\n });\r\n }\r\n\r\n return items;\r\n }\r\n}\r\n","\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n\r\n
\r\n
\r\n \r\n \r\n \r\n {{settings.jsDate|date:'EEE M/d'}}\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n {{block.text}}\r\n
\r\n
\r\n \r\n {{settings.nextDay|date:'EEE M/d'}} \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n {{station.callSign}}\r\n {{station.city}}\r\n \r\n
\r\n
\r\n
\r\n {{airing.title}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
{{partner.name}}
\r\n
\r\n
\r\n {{airing.title}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n\r\n\r\n\r\n \r\n\r\n\r\n\r\n","import { Component, ElementRef, ViewChild } from '@angular/core';\r\nimport { DateTime } from 'luxon';\r\nimport { ConfirmationService, MenuItem } from 'primeng/api';\r\nimport { ContextMenu } from 'primeng/contextmenu';\r\nimport { ApiService } from '../../_shared/services/api.service';\r\nimport { UiService } from '../../_shared/services/ui.service';\r\nimport { Airing, Station } from '../../_shared/models/models';\r\nimport { Subscription, timer } from 'rxjs';\r\nimport { OverrideType } from 'src/app/_shared/models/enums';\r\nimport { QueueJobService, QueueJobActionData } from '../../_shared/components/queue-job/queue-job.service';\r\nimport { AuthService } from '../../_shared/services/auth.service';\r\nimport { AppPermission } from '../../_shared/models/user';\r\nimport { Router } from '@angular/router';\r\n\r\n\r\n@Component({\r\n selector: 'app-airing-schedule',\r\n templateUrl: './airing-schedule.component.html',\r\n styleUrls: ['./airing-schedule.component.scss']\r\n})\r\nexport class AiringScheduleComponent {\r\n results: ScheduleResults;\r\n settings: ScheduleSettings;\r\n filters: any = {};\r\n options: any = {};\r\n contextMenuItems: MenuItem[] = [];\r\n @ViewChild('scrollable') public scrollable: ElementRef;\r\n @ViewChild('contextMenu', { static: false }) contextMenu: ContextMenu;\r\n timer: Subscription;\r\n overrideModes: OverrideMode[] = [\r\n { type: null, label: \"Run Schedule\", styleClass: \"p-button-primary\" },\r\n { type: OverrideType.ForceBlackout, label: \"Force Blackout\", styleClass: \"p-button-danger\" },\r\n { type: OverrideType.ForceStream, label: \"Force Streaming\", styleClass: \"p-button-success\" },\r\n ];\r\n\r\n constructor(\r\n private apiService: ApiService,\r\n private uiService: UiService,\r\n private authService: AuthService,\r\n private queueJobService: QueueJobService,\r\n private confirmationService: ConfirmationService,\r\n private router: Router) { }\r\n\r\n ngOnInit() {\r\n this.settings = {\r\n pixelsPerMinute: 5,\r\n gap: 4,\r\n block: false,\r\n canOverride: this.authService.isPermitted(AppPermission.mngOverride)\r\n };\r\n\r\n this.initTimeline();\r\n this.initSchedule();\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.timer)\r\n this.timer.unsubscribe();\r\n }\r\n\r\n initTimeline() {\r\n var defaultZone = DateTime.now().toFormat('z');\r\n\r\n this.options.timelines = [{ id: Timeline.UserLocal, name: defaultZone }];\r\n\r\n if (defaultZone !== \"America/New_York\")\r\n this.options.timelines.push({ id: Timeline.Eastern, name: \"America/New_York\" });\r\n\r\n this.options.timelines.push({ id: Timeline.StationLocal, name: \"Stations' Local Time\" });\r\n\r\n this.settings.timeline = Timeline.UserLocal;\r\n\r\n this.results = { blocks: [], stations: [] };\r\n var dt = DateTime.now().startOf('day');\r\n\r\n // Set up time blocks (15 min intervals)\r\n var day = dt.day;\r\n while (dt.day === day) {\r\n this.results.blocks.push({\r\n hour: dt.hour,\r\n min: dt.minute,\r\n text: dt.toLocaleString(DateTime.TIME_SIMPLE)\r\n });\r\n\r\n dt = dt.plus({ minutes: 15 });\r\n }\r\n }\r\n\r\n initSchedule() {\r\n this.results.stations = [];\r\n\r\n this.apiService.get({\r\n method: \"schedule/init\",\r\n blockUi: true,\r\n onSuccess: (r) => {\r\n this.settings.minDate = DateTime.fromISO(r.result.scheduleStart).toJSDate();\r\n this.settings.maxDate = DateTime.fromISO(r.result.scheduleEnd).toJSDate();\r\n\r\n this.results.stations = r.result.stations;\r\n\r\n this.results.stations.forEach(s => {\r\n s.partners.forEach(p => {\r\n p.class ??= {};\r\n\r\n if (p.override)\r\n p.class[`ov${p.override}`] = true;\r\n });\r\n });\r\n\r\n this.options.stations = this.results.stations.map(s => ({ id: s.id, name: s.callSign }));\r\n\r\n var dt = DateTime.now().startOf('day');\r\n\r\n this.setDate(dt);\r\n\r\n if (scroll && this.settings.isToday)\r\n this.scrollToCurrentTime();\r\n }\r\n });\r\n }\r\n\r\n getAirings() {\r\n this.settings.block = true;\r\n\r\n var params = {\r\n day: this.settings.luxonDate.toISODate(),\r\n ianaTz: this.settings.zone\r\n };\r\n\r\n this.results.stations.forEach(station => { station.airings = [] });\r\n\r\n this.apiService.get({\r\n method: \"schedule/airings\", params, onSuccess: (r) => {\r\n this.settings.block = false;\r\n\r\n this.results.stations.forEach(station => {\r\n (r.result[station.id] || []).forEach(obj => {\r\n var airing: Airing = {\r\n id: obj[0],\r\n title: obj[1],\r\n start: DateTime.fromISO(obj[2]),\r\n end: DateTime.fromISO(obj[3]),\r\n style: {},\r\n class: {},\r\n partnerClass: {}\r\n };\r\n\r\n var pos = this.getEventPosition(airing.start, airing.end, station);\r\n\r\n // If airing does not fit on schedule then no reason to render (1440 mins/day)\r\n if (pos.left + pos.width <= 0 || pos.left >= (1440 * this.settings.pixelsPerMinute)) return;\r\n\r\n // Airings that start before midnight are trimmed so the title can be read\r\n if (pos.left < 0) {\r\n pos.width = pos.width + pos.left;\r\n pos.left = 0;\r\n }\r\n\r\n airing.style.left = `${pos.left}px`;\r\n airing.style.width = `${pos.width - this.settings.gap}px`;\r\n\r\n // Add css class object to store black / live\r\n station.partners.forEach(p => { airing.partnerClass[p.id] = {}; });\r\n\r\n station.airings.push(airing);\r\n });\r\n });\r\n\r\n // Filters\r\n var airings = this.results.stations\r\n .map(s => s.airings.map(a => a.title))\r\n .flat();\r\n\r\n this.options.airings = [...new Set(airings)]\r\n .sort((a, b) => a.localeCompare(b))\r\n .map(x => ({ title: x }));\r\n\r\n this.getSignalEvents();\r\n\r\n this.settings.showLive = this.settings.isToday && this.settings.timeline !== Timeline.StationLocal;\r\n\r\n if (this.settings.showLive) {\r\n this.refreshLive();\r\n var delay = (60 - DateTime.now().second) * 1000; // initial delay so refresh occurs at 1 second of each minute\r\n this.timer = timer(delay, 60000).subscribe(() => { this.refreshLive(); });\r\n }\r\n }\r\n });\r\n }\r\n\r\n refreshLive() {\r\n var now = DateTime.now();\r\n var startOfDay = this.settings.luxonDate;\r\n\r\n if (this.settings.timeline === Timeline.Eastern)\r\n startOfDay = startOfDay.setZone(\"America/New_York\", { keepLocalTime: true });\r\n\r\n // Advance time indicator bar\r\n var minuteOfDay = now.diff(startOfDay, 'minutes').minutes;\r\n this.settings.liveBarPos = minuteOfDay * this.settings.pixelsPerMinute;\r\n\r\n // Add live (green) styling to airings/blackouts\r\n this.results.stations.forEach(s => {\r\n s.airings.forEach(a => {\r\n a.class.live = a.start <= now && a.end >= now;\r\n for (let key in a.partnerClass) {\r\n a.partnerClass[key].live = a.class.live;\r\n }\r\n });\r\n\r\n s.partners.forEach(p => {\r\n p.blackouts?.forEach(b => {\r\n b.class.live = b.start <= now && b.end >= now;\r\n });\r\n });\r\n });\r\n }\r\n\r\n getSignalEvents() {\r\n var params = { day: this.settings.luxonDate.toISODate() }\r\n\r\n this.apiService.get({\r\n method: \"signalEvent/day\",\r\n params,\r\n onSuccess: (r) => {\r\n // Clear events\r\n this.results.stations.forEach(s => {\r\n s.airings.forEach(a => {\r\n a.class.black = false;\r\n\r\n for (let key in a.partnerClass) {\r\n a.partnerClass[key].black = false;\r\n }\r\n });\r\n\r\n s.partners.forEach(p => { p.blackouts = []; });\r\n });\r\n\r\n // Iterate through blackouts\r\n r.result.forEach((event: any) => {\r\n var station = this.results.stations.find(s => s.id === event.stationId);\r\n if (station) {\r\n var partner = station.partners.find(p => p.id === event.partnerId);\r\n if (partner) {\r\n var blackout: any = {\r\n id: event.id,\r\n start: DateTime.fromISO(event.start),\r\n end: DateTime.fromISO(event.end),\r\n class: {}\r\n };\r\n\r\n var pos = this.getEventPosition(blackout.start, blackout.end, station);\r\n blackout.style = { left: `${pos.left}px`, width: `${pos.width - this.settings.gap}px` }\r\n\r\n partner.blackouts.push(blackout);\r\n\r\n station.airings\r\n .filter((a: Airing) => { return a.start < blackout.end && blackout.start < a.end; })\r\n .forEach((a: Airing) => {\r\n a.class.black = true;\r\n a.partnerClass[event.partnerId].black = true;\r\n });\r\n }\r\n }\r\n });\r\n\r\n this.refreshLive();\r\n }\r\n });\r\n }\r\n\r\n getEventPosition(start: DateTime, end: DateTime, station: Station) {\r\n var startOfDay = this.settings.luxonDate;\r\n\r\n if (this.settings.timeline !== Timeline.UserLocal) {\r\n var zone = this.settings.timeline === Timeline.Eastern ? \"America/New_York\" : station.zone;\r\n\r\n startOfDay = startOfDay.setZone(zone, { keepLocalTime: true });\r\n }\r\n\r\n var minsIntoDay = start.diff(startOfDay, 'minutes').minutes;\r\n var duration = end.diff(start, \"minutes\").toObject().minutes || 0;\r\n\r\n return {\r\n left: minsIntoDay * this.settings.pixelsPerMinute,\r\n width: (duration < 1 ? 1 : duration) * this.settings.pixelsPerMinute\r\n };\r\n }\r\n\r\n toggleExpand(station: Station) {\r\n if (!this.canEditBlackout(station.id))\r\n return;\r\n\r\n if (station.partners.length === 0) {\r\n this.uiService.toast.error(`No partners are configured for ${station.callSign}`);\r\n return;\r\n }\r\n\r\n station.expand = !station.expand;\r\n }\r\n\r\n setDate(date: DateTime) {\r\n this.settings.jsDate = date.toJSDate();\r\n this.dateChanged();\r\n }\r\n\r\n dateChanged() {\r\n this.settings.luxonDate = DateTime.fromJSDate(this.settings.jsDate).startOf('day');\r\n this.settings.isToday = DateTime.now().startOf(\"day\").equals(this.settings.luxonDate.startOf(\"day\"));\r\n this.settings.prevDay = this.settings.luxonDate.plus({ days: -1 }).toJSDate();\r\n this.settings.nextDay = this.settings.luxonDate.plus({ days: 1 }).toJSDate();\r\n\r\n switch (this.settings.timeline) {\r\n case Timeline.Eastern:\r\n this.settings.zone = \"America/New_York\";\r\n break;\r\n case Timeline.UserLocal:\r\n this.settings.zone = this.settings.luxonDate.zoneName;\r\n break;\r\n default:\r\n this.settings.zone = \"\";\r\n }\r\n\r\n this.getAirings();\r\n }\r\n\r\n skipDays(days: number) {\r\n this.setDate(this.settings.luxonDate.plus({ days }));\r\n }\r\n\r\n scrollToCurrentTime() {\r\n var now = DateTime.now();\r\n this.scrollable.nativeElement.scrollLeft = 60 * now.hour * this.settings.pixelsPerMinute;\r\n }\r\n\r\n searchChanged() {\r\n var text = (this.filters.search || \"\").toLowerCase();\r\n\r\n this.settings.searchEnabled = text.length > 0;\r\n\r\n this.results.stations.forEach(s => {\r\n s.airings.forEach(a => {\r\n a.class.highlight = this.settings.searchEnabled && a.title?.toLowerCase().includes(text);\r\n });\r\n });\r\n }\r\n\r\n menu = {\r\n airing: ($event: MouseEvent, station: Station, airing: Airing, partner?) => {\r\n var now = DateTime.now();\r\n\r\n var items: MenuItem[] = [\r\n {\r\n label: \"View Airing\",\r\n command: () => this.openAiring(airing)\r\n }\r\n ];\r\n\r\n var now = DateTime.now();\r\n\r\n if (now <= airing.end) {\r\n items.push({\r\n label: \"Insert Blackout\",\r\n command: () => this.createBlackout(station, airing, partner),\r\n visible: this.canEditBlackout(station.id),\r\n disabled: partner\r\n ? (airing.start <= now && partner.blackouts.some(b => b.start <= now && b.end >= now))\r\n : (airing.class.black === true)\r\n });\r\n }\r\n\r\n this.openContextMenu($event, items);\r\n },\r\n blackout: ($event: MouseEvent, station: Station, blackout) => {\r\n var items = [\r\n {\r\n label: \"Remove Blackout\",\r\n visible: this.canEditBlackout(station.id) && DateTime.now() < blackout.end,\r\n command: () => this.deleteBlackout(blackout.id)\r\n },\r\n ];\r\n\r\n this.openContextMenu($event, items);\r\n },\r\n station: ($event: MouseEvent, station: Station) => {\r\n var items = [\r\n {\r\n label: \"View Station\",\r\n command: () => this.openStation(station)\r\n },\r\n {\r\n label: \"Switch Source\",\r\n command: () => {\r\n this.router.navigate(['station-overview'], { queryParams: { station: station.id } });\r\n }\r\n },\r\n {\r\n label: \"Override All\",\r\n visible: this.settings.canOverride,\r\n items: this.overrideModes.map(m => ({\r\n label: m.label,\r\n command: () => this.forceAll(station, m)\r\n }))\r\n },\r\n ];\r\n\r\n this.openContextMenu($event, items);\r\n },\r\n partner: ($event: MouseEvent, station: Station, partner) => {\r\n var items = this.overrideModes.map(m => ({\r\n label: m.label,\r\n visible: this.settings.canOverride,\r\n command: () => this.applyForce(m, station, [partner]),\r\n disabled: partner.override === m.type\r\n }));\r\n\r\n this.openContextMenu($event, items);\r\n }\r\n };\r\n\r\n canEditBlackout(stationId: number) {\r\n return this.authService.isPermittedForStation(AppPermission.mngStnSub, stationId);\r\n }\r\n\r\n forceAll(station: Station, mode: OverrideMode) {\r\n this.applyForce(mode, station, station.partners);\r\n }\r\n\r\n openAiring(airing) {\r\n var dialog = this.uiService.open.airing(airing.id);\r\n\r\n dialog.onClose.subscribe(r => {\r\n if (r?.refresh === true) {\r\n this.getSignalEvents();\r\n }\r\n });\r\n }\r\n\r\n openStation(station) {\r\n this.uiService.open.station(station.id);\r\n }\r\n\r\n openContextMenu(event: MouseEvent, menuItems: MenuItem[]): void {\r\n if (!menuItems.some(x => x.visible !== false)) {\r\n menuItems = [{ label: \"No actions available\", disabled: true }];\r\n }\r\n\r\n this.contextMenuItems = menuItems;\r\n this.contextMenu.show(event);\r\n\r\n event.stopPropagation();\r\n }\r\n\r\n createBlackout(station: Station, airing: Airing, partner?) {\r\n var data = {\r\n stationId: station.id,\r\n partnerIds: partner ? [partner.id] : station.partners.map(x => x.id),\r\n startDate: airing.start.toISO(),\r\n endDate: airing.end.toISO(),\r\n startEventDescription: `Start Blackout [${airing.title}]`,\r\n endEventDescription: `End Blackout [${airing.title}]`\r\n };\r\n\r\n this.settings.block = true;\r\n\r\n this.apiService.post({\r\n method: \"signalEvent/create\",\r\n data,\r\n onSuccess: (r) => {\r\n this.uiService.toast.success(\"Blackout scheduled successfully\");\r\n this.getSignalEvents();\r\n this.settings.block = false;\r\n }\r\n });\r\n }\r\n\r\n deleteBlackout(groupId: number) {\r\n this.confirmationService.confirm({\r\n header: `Delete Blackout`,\r\n message: `Are you sure that you want to remove this blackout?`,\r\n acceptLabel: \"Delete\",\r\n rejectLabel: \"Cancel\",\r\n acceptButtonStyleClass: \"p-button-danger\",\r\n accept: () => {\r\n this.apiService.delete({\r\n method: `signalEvent`,\r\n params: { groupIds: [groupId] },\r\n onSuccess: (r) => {\r\n this.uiService.toast.success(\"Blackout removed successfully\");\r\n this.getSignalEvents();\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n applyForce(mode: OverrideMode, station: Station, partners: any[]) {\r\n this.confirmationService.confirm({\r\n header: `Set Override on ${station.callSign}`,\r\n message: `Are you sure that you want to ${mode.label} on ${station.callSign}?`,\r\n acceptLabel: `Yes, ${mode.label}`,\r\n rejectLabel: \"Cancel\",\r\n acceptButtonStyleClass: mode.styleClass,\r\n accept: () => {\r\n var actions: QueueJobActionData[] = partners.map(p => ({\r\n stationId: station.id,\r\n partnerId: p.id,\r\n description: `${station.callSign} - ${p.name}`\r\n }));\r\n\r\n var dialog = this.queueJobService.launchForOverride(actions, mode.type);\r\n\r\n dialog.onClose.subscribe(r => {\r\n if (r?.refresh === true && r.stationIds?.length === 1) {\r\n partners.forEach(p => {\r\n p.class = {\r\n ...p.class,\r\n ov1: mode.type === OverrideType.ForceBlackout,\r\n ov2: mode.type === OverrideType.ForceStream\r\n };\r\n });\r\n }\r\n });\r\n }\r\n });\r\n }\r\n}\r\n\r\nenum Timeline { UserLocal, StationLocal, Eastern }\r\n\r\nexport interface ScheduleSettings {\r\n pixelsPerMinute: number;\r\n gap: number;\r\n liveBarPos?: number;\r\n block: boolean;\r\n jsDate?: Date;\r\n luxonDate?: DateTime;\r\n prevDay?: Date;\r\n nextDay?: Date;\r\n minDate?: Date;\r\n maxDate?: Date;\r\n timeline?: Timeline;\r\n searchEnabled?: boolean;\r\n showLive?: boolean;\r\n isToday?: boolean;\r\n zone?: string;\r\n canOverride: boolean;\r\n}\r\n\r\nexport interface ScheduleResults {\r\n blocks: any[];\r\n stations: Station[];\r\n}\r\n\r\ninterface OverrideMode {\r\n type: OverrideType,\r\n label: string,\r\n styleClass: string\r\n}\r\n","import { Component, Inject, OnInit, Input } from '@angular/core';\r\nimport { OKTA_AUTH } from '@okta/okta-angular';\r\nimport OktaAuth from '@okta/okta-auth-js';\r\nimport { environment } from '../../../../environments/environment';\r\n\r\n@Component({\r\n selector: 'app-user-menu',\r\n templateUrl: './user-menu.component.html',\r\n styleUrls: ['./user-menu.component.scss']\r\n})\r\nexport class UserMenuComponent implements OnInit {\r\n\r\n constructor(\r\n @Inject(OKTA_AUTH) private _oktaAuth: OktaAuth) { }\r\n\r\n @Input() user: any;\r\n env: string = environment.env;\r\n version: string = environment.version;\r\n\r\n ngOnInit() {\r\n }\r\n\r\n public async signOut(): Promise {\r\n await this._oktaAuth.signOut();\r\n }\r\n}\r\n","\r\n {{user.firstName}} {{user.lastName}}\r\n\r\n\r\n
\r\n
Signal Manager
\r\n {{env}}\r\n {{version}}\r\n \r\n Logged in as {{user.oktaLogin}}\r\n \r\n \r\n
\r\n
\r\n","\r\n \r\n \r\n \"Paramount\"\r\n Signal Manager{{env}}\r\n \r\n \r\n \r\n
    \r\n
  • \r\n \r\n
  • \r\n
\r\n
\r\n
\r\n
\r\n {{authFailedMessage}}\r\n
\r\n
\r\n \r\n
\r\n\r\n\r\n\r\n\r\n \r\n\r\n\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { OktaAuthStateService } from '@okta/okta-angular';\r\nimport { AuthState } from '@okta/okta-auth-js';\r\nimport { MenuItem } from 'primeng/api';\r\nimport { filter } from 'rxjs';\r\nimport { environment } from '../environments/environment';\r\nimport { AppPermission, AppUser } from './_shared/models/user';\r\nimport { AuthService } from './_shared/services/auth.service';\r\nimport { UiService } from './_shared/services/ui.service';\r\n\r\n@Component({\r\n selector: 'app-root',\r\n templateUrl: './app.component.html',\r\n styleUrls: ['./app.component.scss']\r\n})\r\nexport class AppComponent implements OnInit {\r\n constructor(\r\n public uiService: UiService,\r\n public authService: AuthService,\r\n private _oktaStateService: OktaAuthStateService) { }\r\n\r\n navMenuItems: MenuItem[];\r\n userMenuItems: MenuItem[];\r\n env: string = environment.env;\r\n authorized = false;\r\n authFailedMessage: string;\r\n user: AppUser;\r\n\r\n ngOnInit() {\r\n this._oktaStateService.authState$.pipe(\r\n filter((s: AuthState) => !!s),\r\n ).subscribe((s: AuthState) => {\r\n if (s.isAuthenticated) {\r\n this.authService.isAuthorized$.subscribe(authorized => {\r\n if (authorized !== null) {\r\n this.authorized = authorized;\r\n\r\n if (this.authorized) {\r\n this.user = this.authService.user;\r\n\r\n this.getNavItems();\r\n this.authFailedMessage = undefined;\r\n }\r\n else {\r\n var oktaUserName = s.idToken?.claims.preferred_username;\r\n this.authFailedMessage = oktaUserName ? `Authorization failed for Okta user ${oktaUserName}` : \"Authorization failed\";\r\n }\r\n }\r\n });\r\n\r\n this.authService.init();\r\n }\r\n });\r\n }\r\n\r\n getNavItems() {\r\n this.navMenuItems = [\r\n {\r\n label: 'Airing Schedule',\r\n routerLink: ['schedule'],\r\n visible: this.authService.isPermitted(AppPermission.vwStnSchedule)\r\n },\r\n {\r\n label: 'Blackouts',\r\n items: [\r\n {\r\n label: 'Overrides',\r\n routerLink: ['schedule-overrides'],\r\n visible: this.authService.isPermitted(AppPermission.vwOverrideGrp)\r\n },\r\n {\r\n label: 'Rules',\r\n routerLink: ['blackout-rules'],\r\n visible: this.authService.isPermitted(AppPermission.vwStnSubRules),\r\n },\r\n {\r\n label: 'Schedule',\r\n routerLink: ['blackout-schedule'],\r\n visible: this.authService.isPermitted(AppPermission.vwStnSubRules),\r\n }\r\n ]\r\n },\r\n {\r\n label: 'Station Overview',\r\n routerLink: ['station-overview']\r\n },\r\n {\r\n label: 'Administration',\r\n items: [\r\n {\r\n label: 'Stations',\r\n routerLink: ['stations'],\r\n visible: this.authService.isPermitted(AppPermission.vwStations)\r\n },\r\n {\r\n label: 'Users',\r\n routerLink: ['users'],\r\n visible: this.authService.isPermitted(AppPermission.vwUser)\r\n },\r\n {\r\n label: 'ADN Mappings',\r\n routerLink: ['adn-mapper'],\r\n visible: this.authService.isPermitted(AppPermission.vwADNMap)\r\n },\r\n {\r\n label: 'Activity Log',\r\n routerLink: ['activity-log'],\r\n visible: this.authService.isPermitted(AppPermission.vwSysSettings)\r\n },\r\n {\r\n label: 'Cache Manager',\r\n routerLink: ['cache-manager'],\r\n visible: this.authService.isPermitted(AppPermission.vwSysSettings)\r\n },\r\n ]\r\n }\r\n ];\r\n\r\n // Remove any top level menuItems that contain no [visible] children\r\n this.navMenuItems = this.navMenuItems.filter(x => x.routerLink || x.items.some(y => y.visible !== false));\r\n }\r\n}\r\n","
\r\n

Blackout Schedule

\r\n
\r\n
\r\n
\r\n
Rule #{{config.rule.signalEventRuleId}}
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n\r\n \r\n \r\n \r\n Station\r\n Blackout Start\r\n Blackout End\r\n Airing\r\n {{p.name}}\r\n \r\n \r\n \r\n \r\n {{row.blackout.callSign}}\r\n {{row.blackout.start|date:\"short\"}}\r\n {{row.blackout.end|date:\"short\"}}\r\n \r\n {{row.blackout.title}}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n","import { Component, OnInit, Input } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { ApiService } from '../../_shared/services/api.service';\r\nimport { UiService } from '../../_shared/services/ui.service';\r\nimport { DateTime } from 'luxon';\r\n\r\n@Component({\r\n selector: 'app-blackout-list',\r\n templateUrl: './blackout-list.component.html',\r\n styleUrls: ['./blackout-list.component.scss']\r\n})\r\nexport class BlackoutListComponent implements OnInit {\r\n\r\n constructor(\r\n private apiService: ApiService,\r\n private uiService: UiService,\r\n private route: ActivatedRoute) { }\r\n\r\n results: any = [];\r\n config: any = {};\r\n\r\n ngOnInit() {\r\n this.apiService.get({\r\n method: \"partner\",\r\n onSuccess: (r) => {\r\n this.config.partners = r.result;\r\n }\r\n });\r\n\r\n this.refresh();\r\n }\r\n\r\n refresh() {\r\n var params: any = {};\r\n\r\n var ruleId = parseInt(this.route.snapshot.queryParams['rule']);\r\n\r\n if (ruleId > 0) {\r\n params.ruleId = ruleId;\r\n\r\n this.apiService.get({\r\n method: \"signalEventRulesEngine\",\r\n params,\r\n blockUi: true,\r\n onSuccess: (r) => {\r\n if (r.result.length === 1) {\r\n this.config.rule = r.result[0];\r\n this.config.rule.partnersCsv = this.config.rule.partners.map(p => p.name).join(\", \");\r\n\r\n var dt1 = DateTime.fromISO(this.config.rule.airingsAfterDate); \r\n var dt2 = DateTime.fromISO(this.config.rule.airingsBeforeDate); \r\n this.config.rule.dates = dt1.toFormat(\"D\") + (dt2.isValid ? ` - ${dt2.toFormat(\"D\")}` : \"+\");; \r\n }\r\n }\r\n });\r\n }\r\n\r\n this.apiService.get({\r\n method: \"signalEvent/schedule\",\r\n blockUi: true,\r\n params,\r\n onSuccess: (r) => {\r\n this.results = r.result;\r\n }\r\n });\r\n }\r\n\r\n openAiring($event, airingId) {\r\n var dialog = this.uiService.open.airing(airingId);\r\n\r\n dialog.onClose.subscribe(r => {\r\n if (r?.refresh === true) {\r\n this.refresh();\r\n }\r\n });\r\n\r\n $event.stopPropogation();\r\n }\r\n}\r\n","
\r\n

Blackout Rules

\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n Rule\r\n Station\r\n Partners\r\n Title\r\n Start Date\r\n End Date\r\n Active\r\n \r\n \r\n \r\n \r\n \r\n {{row.signalEventRuleId}}\r\n {{row.callSign}}\r\n
{{x.name}}
\r\n {{row.titleToMatch}}\r\n {{(row.airingsAfterDate|date:'shortDate')||'-'}}\r\n {{(row.airingsBeforeDate|date:'shortDate')||'-'}}\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n\r\n Results\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n\r\n\r\n
\r\n
{{selected._isNew ? \"New Rule\" : \"Rule #\" + selected.signalEventRuleId}}
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n","import { Component, OnInit, Input } from '@angular/core';\r\nimport { ApiService } from '../../_shared/services/api.service';\r\nimport { DateTime } from 'luxon';\r\nimport { UiService } from '../../_shared/services/ui.service';\r\nimport { ConfirmationService } from 'primeng/api';\r\nimport { AuthService } from '../../_shared/services/auth.service';\r\nimport { AppPermission } from '../../_shared/models/user';\r\n\r\n@Component({\r\n selector: 'app-blackout-rules',\r\n templateUrl: './blackout-rules.component.html',\r\n styleUrls: ['./blackout-rules.component.scss']\r\n})\r\nexport class BlackoutRulesComponent implements OnInit {\r\n\r\n constructor(\r\n private apiService: ApiService,\r\n private uiService: UiService,\r\n private authService: AuthService,\r\n private confirmationService: ConfirmationService) { }\r\n\r\n options: any = {};\r\n selected;\r\n rules;\r\n ui: any = { block: false, canEdit: false };\r\n\r\n ngOnInit() {\r\n this.ui.canEdit = this.authService.isPermitted(AppPermission.mngStnSubRules);\r\n\r\n this.getRules();\r\n this.getOptions();\r\n }\r\n\r\n addRule() {\r\n this.selected = { _isNew: true, active: true, startDate: DateTime.now().toJSDate() };\r\n\r\n // clear dependent dropdowns\r\n this.stationChanged();\r\n }\r\n\r\n editRule(r) {\r\n var dt1 = DateTime.fromISO(r.airingsAfterDate);\r\n var dt2 = DateTime.fromISO(r.airingsBeforeDate);\r\n\r\n this.selected = {\r\n signalEventRuleId: r.signalEventRuleId,\r\n stationId: r.stationId,\r\n partnerIds: r.partners.map(x => x.partnerId),\r\n titleToMatch: r.titleToMatch,\r\n startDate: dt1.isValid ? dt1.toJSDate() : null,\r\n endDate: dt2.isValid ? dt2.toJSDate() : null,\r\n active: r.active\r\n };\r\n\r\n this.stationChanged();\r\n }\r\n\r\n closeDialog() {\r\n this.selected = undefined;\r\n }\r\n\r\n getRules() {\r\n var params:any = {};\r\n if (this.ui.stationId)\r\n params.stationId = this.ui.stationId;\r\n\r\n this.apiService.get({\r\n method: \"signalEventRulesEngine\",\r\n params,\r\n blockUi: true,\r\n onSuccess: (r) => {\r\n this.rules = r.result;\r\n }\r\n });\r\n }\r\n\r\n saveRule() {\r\n var dt1 = DateTime.fromJSDate(this.selected.startDate);\r\n var dt2 = DateTime.fromJSDate(this.selected.endDate);\r\n\r\n if (!dt1.isValid) {\r\n this.uiService.toast.error(\"Invalid start date\");\r\n return;\r\n }\r\n\r\n var data: any = {\r\n name: \"###\",\r\n active: this.selected.active,\r\n titleToMatch: this.selected.titleToMatch,\r\n partners: this.selected.partnerIds,\r\n airingsAfterDate: dt1.toISODate(),\r\n airingsBeforeDate: dt2.isValid ? dt2.toISODate() : null\r\n };\r\n\r\n var method = `signalEventRulesEngine`;\r\n\r\n if (this.selected.signalEventRuleId) {\r\n method = `${method}/update`;\r\n data.signalEventRuleId = this.selected.signalEventRuleId;\r\n data.stationId = this.selected.stationId;\r\n } else {\r\n method = `${method}/create`;\r\n data.stations = this.selected.stationIds;\r\n }\r\n\r\n this.apiService.post({\r\n method, data,\r\n blockUi: true,\r\n onSuccess: (r) => {\r\n this.getRules();\r\n this.closeDialog();\r\n }\r\n });\r\n }\r\n\r\n deleteRule(event: Event) {\r\n this.confirmationService.confirm({\r\n target: event.target,\r\n message: 'Are you sure? Any future blackouts created by this rule will be removed.',\r\n icon: 'pi pi-exclamation-triangle',\r\n accept: () => {\r\n this.ui.block = true;\r\n this.apiService.delete({\r\n method: \"signalEventRulesEngine\",\r\n params: { ruleId: this.selected.signalEventRuleId },\r\n blockUi: true,\r\n onSuccess: (r) => {\r\n this.ui.block = false;\r\n this.getRules();\r\n this.closeDialog();\r\n\r\n if (r.result.signalEventsDeleted > 0)\r\n this.uiService.toast.info(`${r.result.signalEventsDeleted} blackouts have been removed`);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n getOptions() {\r\n this.apiService.get({\r\n method: \"lookup/stations\",\r\n onSuccess: (r) => {\r\n this.options.stations = r.result;\r\n }\r\n });\r\n\r\n this.options.minDate = DateTime.now().toJSDate();\r\n this.options.maxDate = DateTime.local(2100, 12, 31).toJSDate();\r\n }\r\n\r\n stationChanged() {\r\n this.options.partners = [];\r\n this.options.titles = [];\r\n\r\n var stationIds = this.selected._isNew ? this.selected.stationIds : [this.selected.stationId];\r\n if (!stationIds?.length) return;\r\n\r\n this.apiService.post({\r\n method: \"signalEventRulesEngine/options\",\r\n data: { stationIds },\r\n onSuccess: (r) => {\r\n this.options.titles = r.result.titles.map(x => ({ title: x }));\r\n this.options.partners = r.result.partners;\r\n\r\n //this.selected.partnerIds = []; // TODO: REMOVE ANY PARTNERS THAT ARE NOT IN THE NEW LIST\r\n }\r\n });\r\n }\r\n\r\n runNow(rule) {\r\n this.ui.block = true;\r\n this.apiService.put({\r\n method: `signalEventRulesEngine/run`,\r\n data: { stationId: rule.stationId, signalEventRuleId: rule.signalEventRuleId },\r\n onSuccess: (r) => {\r\n this.ui.block = false;\r\n\r\n var results = r.result.ruleExecutionResults;\r\n if (results.length === 1) {\r\n var count = results[0].signalEventsCreated;\r\n\r\n var msg = count === 0\r\n ? `ran successfully but no new blackouts were created`\r\n : `resulted in the creation of ${count} new blackouts`;\r\n\r\n this.uiService.toast.success(`Rule ${rule.signalEventRuleId} ${msg}`);\r\n }\r\n }\r\n });\r\n }\r\n}\r\n","
\r\n

Cache Manager

\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n {{ col.header }} \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ entry[col.field] }}\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n","import { Component, OnInit, ViewChild } from '@angular/core';\r\nimport { Table } from 'primeng/table';\r\nimport { AppPermission } from '../../_shared/models/user';\r\nimport { ApiService } from '../../_shared/services/api.service';\r\nimport { AuthService } from '../../_shared/services/auth.service';\r\nimport { UiService } from '../../_shared/services/ui.service';\r\n\r\n@Component({\r\n selector: 'app-cache-manager',\r\n templateUrl: './cache-manager.component.html',\r\n styleUrls: ['./cache-manager.component.scss']\r\n})\r\nexport class CacheManagerComponent implements OnInit {\r\n\r\n constructor(\r\n private apiService: ApiService,\r\n private uiService: UiService,\r\n private authService: AuthService) { }\r\n\r\n allSections: CacheSection[];\r\n openedSection: CacheSection;\r\n canEdit = true;\r\n @ViewChild('table') table: Table;\r\n\r\n ngOnInit() {\r\n this.canEdit = this.authService.isPermitted(AppPermission.mngSysSettings);\r\n\r\n this.allSections = [\r\n this.getZixiConfig()\r\n ];\r\n\r\n this.openSection(this.allSections[0]);\r\n }\r\n\r\n openSection(section) {\r\n this.openedSection = section;\r\n section.onLoad();\r\n }\r\n\r\n applyFilterGlobal($event, stringVal) {\r\n this.table.filterGlobal(($event.target as HTMLInputElement).value, stringVal);\r\n }\r\n\r\n getZixiConfig(): CacheSection {\r\n var section = {\r\n header: \"Zixi Objects\",\r\n entries: [],\r\n loading: false,\r\n columns: [\r\n { header: \"Object Id\", field: \"zixiObjectId\" },\r\n { header: \"Object Type\", field: \"objectType\" },\r\n { header: \"Name\", field: \"name\" }\r\n ]\r\n }\r\n\r\n section.onLoad = () => {\r\n section.loading = true;\r\n\r\n this.apiService.get({\r\n method: \"zixi/cache\",\r\n onSuccess: (r) => {\r\n section.entries = r.result;\r\n section.loading = false;\r\n }\r\n });\r\n }\r\n\r\n section.onTriggerRefresh = () => {\r\n section.entries = [];\r\n section.loading = true; \r\n\r\n this.apiService.post({\r\n method: \"zixi/cache/refresh\",\r\n onSuccess: (r) => {\r\n this.uiService.toast.success(\"Zixi Object Cache Refreshed\");\r\n section.onLoad();\r\n }\r\n });\r\n }\r\n\r\n return section;\r\n }\r\n}\r\n\r\ninterface CacheSection {\r\n header: string;\r\n entries: any[];\r\n loading: boolean;\r\n columns: any[];\r\n onLoad: () => void;\r\n onTriggerRefresh: () => void;\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-logged-out',\r\n templateUrl: './logged-out.component.html',\r\n styleUrls: ['./logged-out.component.scss']\r\n})\r\nexport class LoggedOutComponent {}\r\n","
\r\n You have been logged out.\r\n\r\n
\r\n \r\n
\r\n
\r\n","
\r\n
Select stations
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n Press ENTER to add {{singleMatch.name}}\r\n \r\n
\r\n
\r\n
\r\n {{station.name}}\r\n
\r\n
\r\n
\r\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-station-picker',\r\n templateUrl: './station-picker.component.html',\r\n styleUrls: ['./station-picker.component.scss']\r\n})\r\nexport class StationPickerComponent implements OnInit {\r\n\r\n constructor() { }\r\n\r\n @Input() stations: StationPickerItem[];\r\n @Input() scrollHeight: string;\r\n @Output() onSelect: EventEmitter = new EventEmitter();\r\n matches: StationPickerItem[];\r\n singleMatch: StationPickerItem;\r\n searchText: string;\r\n\r\n ngOnInit() {\r\n this.scrollHeight = this.scrollHeight || \"400px\";\r\n\r\n this.findMatches();\r\n }\r\n\r\n findMatches() {\r\n var text = (this.searchText || \"\").toLowerCase();\r\n\r\n this.matches = this.stations.filter(s => {\r\n return !s.selected && s.name?.toLowerCase().includes(text);\r\n });\r\n\r\n this.singleMatch = this.matches.length === 1 ? this.matches[0] : null;\r\n }\r\n\r\n selectStation(station) {\r\n station.selected = true;\r\n this.onSelect.emit({ station });\r\n this.findMatches();\r\n }\r\n\r\n selectFirst() {\r\n if (this.singleMatch) {\r\n this.selectStation(this.singleMatch);\r\n this.searchText = \"\";\r\n this.findMatches();\r\n }\r\n }\r\n\r\n clearText() {\r\n this.searchText = null;\r\n this.findMatches();\r\n }\r\n}\r\n\r\ninterface StationPickerItem {\r\n id: number;\r\n name: string;\r\n selected: boolean;\r\n}\r\n","
\r\n

Schedule Overrides

\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {{group.name}}\r\n
\r\n
{{group.stations.length}} stations
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n {{station.name}}\r\n
\r\n
\r\n
\r\n
\r\n\r\n\r\n
\r\n
\r\n \r\n

Set Override for {{group.name}}

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

Override Group

\r\n \r\n
\r\n
\r\n
\r\n
Stations
\r\n \r\n
\r\n
\r\n
\r\n
All / None
\r\n
\r\n {{partner.abbreviation}}\r\n
\r\n
\r\n
\r\n
\r\n \r\n {{station.name}}\r\n
\r\n
\r\n {{partner.abbreviation}}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n\r\n\r\n\r\n\r\n\r\n \r\n \r\n \r\n\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { ApiService } from 'src/app/_shared/services/api.service';\r\nimport { ConfirmationService } from 'primeng/api';\r\nimport { OverrideType } from 'src/app/_shared/models/enums';\r\nimport { AppPermission } from 'src/app/_shared/models/user';\r\nimport { QueueJobService, QueueJobActionData } from '../../_shared/components/queue-job/queue-job.service';\r\nimport { AuthService } from '../../_shared/services/auth.service';\r\n\r\n@Component({\r\n selector: 'app-override-groups',\r\n templateUrl: './override-groups.component.html',\r\n styleUrls: ['./override-groups.component.scss']\r\n})\r\nexport class OverrideGroupsComponent implements OnInit {\r\n\r\n constructor(\r\n private apiService: ApiService,\r\n private authService: AuthService,\r\n private queueJobService: QueueJobService,\r\n private confirmationService: ConfirmationService) { }\r\n\r\n groups: any[];\r\n group: any;\r\n stations: any;\r\n partners: any;\r\n ui = { setOverrideMode: false, canEditGroups: false, canOverride: false };\r\n overrideModes: OverrideMode[] = [\r\n { type: null, label: \"Run Schedule\", styleClass: \"p-button-primary\" },\r\n { type: OverrideType.ForceBlackout, label: \"Force Blackout\", styleClass: \"p-button-danger\" },\r\n { type: OverrideType.ForceStream, label: \"Force Streaming\", styleClass: \"p-button-success\" },\r\n ];\r\n canEdit: boolean;\r\n\r\n ngOnInit() {\r\n this.ui.canOverride = this.authService.isPermitted(AppPermission.mngOverride);\r\n this.ui.canEditGroups = this.authService.isPermitted(AppPermission.mngOverrideGrp);\r\n this.authService.user\r\n\r\n this.refresh();\r\n }\r\n\r\n refresh() {\r\n this.apiService.get({\r\n method: \"override/groups\",\r\n blockUi: true,\r\n onSuccess: (r) => {\r\n this.groups = r.result.groups;\r\n this.stations = r.result.stations;\r\n this.partners = r.result.partners;\r\n\r\n this.groups.forEach(g => {\r\n g.stations.forEach(s => {\r\n var match = this.stations.find(x => x.id === s.id);\r\n if (match) {\r\n s.name = match.name;\r\n s.partnerOptions = match.partners;\r\n }\r\n });\r\n });\r\n }\r\n });\r\n }\r\n\r\n expand(group) {\r\n group.expand = !group.expand;\r\n }\r\n\r\n selectGroup(group) {\r\n this.group = {\r\n id: group.id,\r\n name: group.name,\r\n stations: {\r\n all: [],\r\n selected: []\r\n }\r\n };\r\n\r\n this.stations.forEach(station => {\r\n var groupStation = group.stations.find(s => s.id === station.id);\r\n\r\n var result = {\r\n ...station,\r\n selected: groupStation !== undefined,\r\n partners: this.partners.map(p => {\r\n return {\r\n ...p,\r\n selected: groupStation?.partnerIds.includes(p.id) === true,\r\n inactive: station.partners.includes(p.id) === false\r\n }\r\n })\r\n };\r\n\r\n this.group.stations.all.push(result);\r\n\r\n if (result.selected)\r\n this.group.stations.selected.push(result);\r\n });\r\n }\r\n\r\n selectStation($event) {\r\n this.group.stations.selected.push($event.station);\r\n }\r\n\r\n removeStation(station) {\r\n station.selected = false;\r\n this.group.stations.selected = this.group.stations.all.filter(s => s.selected);\r\n }\r\n\r\n addGroup() {\r\n this.selectGroup({ stations: [] });\r\n this.ui.setOverrideMode = false;\r\n }\r\n\r\n modify(group) {\r\n this.selectGroup(group);\r\n this.ui.setOverrideMode = false;\r\n }\r\n\r\n setOverride(group) {\r\n this.selectGroup(group);\r\n this.ui.setOverrideMode = true;\r\n }\r\n\r\n closeDialog() {\r\n this.group = undefined;\r\n }\r\n\r\n saveGroup() {\r\n var data = {\r\n id: this.group.id,\r\n name: this.group.name,\r\n items: []\r\n };\r\n\r\n this.group.stations.selected.forEach(s => {\r\n s.partners.forEach(p => {\r\n if (p.selected)\r\n data.items.push({ stationId: s.id, partnerId: p.id });\r\n });\r\n });\r\n\r\n this.apiService.post({\r\n method: \"override/group/save\",\r\n data,\r\n blockUi: true,\r\n onSuccess: (r) => {\r\n this.closeDialog();\r\n this.refresh();\r\n }\r\n });\r\n }\r\n\r\n deleteGroup() {\r\n this.confirmationService.confirm({\r\n header: `Delete ${this.group.name}`,\r\n message: `Are you sure that you want to permanently delete this group?`,\r\n acceptLabel: `Yes, Delete Group`,\r\n rejectLabel: \"Cancel\",\r\n acceptButtonStyleClass: \"p-button-danger\",\r\n accept: () => {\r\n this.apiService.delete({\r\n method: \"override/group\",\r\n params: { groupId: this.group.id },\r\n blockUi: true,\r\n onSuccess: (r) => {\r\n this.closeDialog();\r\n this.refresh();\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n togglePartner(partner) {\r\n partner.selected = !partner.selected;\r\n }\r\n\r\n toggleAll(partnerId?) {\r\n var partners = this.group.stations.selected.map(s => s.partners.filter(p => !partnerId || (p.id === partnerId))).flat();\r\n var selectAll = partners.some(p => !p.selected);\r\n\r\n partners.forEach(p => { p.selected = selectAll; });\r\n }\r\n\r\n force(mode: OverrideMode) {\r\n var actions: QueueJobActionData[] = [];\r\n\r\n this.group.stations.selected.forEach(s => {\r\n s.partners.forEach(p => {\r\n if (p.selected)\r\n actions.push({\r\n stationId: s.id,\r\n partnerId: p.id,\r\n description: `${s.name} - ${p.name}`\r\n });\r\n });\r\n });\r\n var stationCount = new Set(actions.map(t => t.stationId)).size;\r\n var countMessage = `${stationCount} stations (${actions.length} total station partners)`;\r\n\r\n this.confirmationService.confirm({\r\n header: `Set Override on ${this.group.name}`,\r\n message: `Are you sure that you want to ${mode.label} on ${countMessage}?`,\r\n acceptLabel: `Yes, ${mode.label}`,\r\n rejectLabel: \"Cancel\",\r\n acceptButtonStyleClass: mode.styleClass,\r\n accept: () => {\r\n this.queueJobService.launchForOverride(actions, mode.type);\r\n }\r\n });\r\n }\r\n}\r\n\r\ninterface OverrideMode {\r\n type: OverrideType,\r\n label: string,\r\n styleClass: string\r\n}\r\n","
\r\n

{{station.name || station.stationDefaultData?.callSign || \"New Station\"}}

{{station.save}}\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n

Schedule Source

\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
{{o.callSign}}
\r\n {{o.city}}, {{o.state}}\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n

Zixi Broadcasters

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

Station Roles

\r\n
\r\n
\r\n
{{role.role.name}}
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n\r\n \r\n \r\n \r\n \r\n Object Type\r\n Name\r\n Platform\r\n Exists\r\n \r\n \r\n \r\n \r\n {{b.zixiObjectType}}\r\n {{b.name}}\r\n {{b.platform}}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n","import { Component } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { UiService } from '../../_shared/services/ui.service';\r\nimport { ApiService } from '../../_shared/services/api.service';\r\nimport { AuthService } from '../../_shared/services/auth.service';\r\nimport { AppPermission } from '../../_shared/models/user';\r\nimport { ZIXI_LOCATIONS } from '../../_shared/models/constants';\r\n\r\n@Component({\r\n selector: 'app-station-detail',\r\n templateUrl: './station-detail.component.html',\r\n styleUrls: ['./station-detail.component.scss']\r\n})\r\nexport class StationDetailComponent {\r\n constructor(\r\n private router: Router,\r\n private route: ActivatedRoute,\r\n private uiService: UiService,\r\n private apiService: ApiService,\r\n private authService: AuthService) { }\r\n\r\n stationId: number;\r\n station: any;\r\n options: any;\r\n canEdit: boolean;\r\n zixi: any;\r\n\r\n ngOnInit() {\r\n this.route.params.subscribe(params => {\r\n this.stationId = parseInt(params['id']);\r\n\r\n if (Number.isNaN(this.stationId)) {\r\n this.handleNotFound();\r\n return;\r\n }\r\n\r\n this.canEdit = this.authService.isPermitted(AppPermission.mngStations);\r\n\r\n this.getOptions();\r\n });\r\n }\r\n\r\n refresh(fromUi = false) {\r\n if (fromUi) {\r\n this.station = null; // clear out to visually show a refresh\r\n }\r\n\r\n this.getStation();\r\n }\r\n\r\n save() {\r\n this.apiService.post({\r\n method: this.uiService.isSysAdmin() ? \"station/sysadmin\" : \"station/stationAdmin\",\r\n data: this.station,\r\n onSuccess: (r) => {\r\n if (this.stationId === 0) {\r\n this.uiService.toast.success(\"Station created\");\r\n this.router.navigate([\"/stations\", r.result.stationId]);\r\n } else {\r\n this.uiService.toast.success(\"Station updated\");\r\n this.refresh();\r\n }\r\n }\r\n });\r\n }\r\n\r\n navigateToStations() {\r\n this.router.navigate([\"/stations\"]);\r\n }\r\n\r\n getStation() {\r\n if (this.stationId === 0) {\r\n this.station = {};\r\n } else {\r\n this.apiService.get({\r\n method: `station/${this.stationId}`,\r\n onSuccess: (r) => {\r\n this.station = r.result;\r\n this.getExtraStationInfo();\r\n }\r\n });\r\n }\r\n }\r\n\r\n getOptions() {\r\n this.options = {};\r\n\r\n this.apiService.get({\r\n method: \"lookup/platforms\",\r\n onSuccess: (r) => { this.options.platforms = r.result; }\r\n });\r\n\r\n this.apiService.get({\r\n method: \"lookup/dma\",\r\n onSuccess: (r) => { this.options.dmas = r.result; }\r\n });\r\n\r\n this.apiService.get({\r\n method: \"lookup/users\",\r\n onSuccess: (r) => { this.options.users = r.result; }\r\n });\r\n\r\n this.apiService.get({\r\n method: \"lookup/owners\",\r\n onSuccess: (r) => { this.options.owners = r.result; }\r\n });\r\n\r\n this.apiService.get({\r\n method: \"lookup/operators\",\r\n onSuccess: (r) => { this.options.operators = r.result; }\r\n });\r\n\r\n this.apiService.get({\r\n method: \"lookup/scheduleSource\",\r\n onSuccess: (r) => { this.options.scheduleSources = r.result; }\r\n });\r\n\r\n this.apiService.get({\r\n method: \"lookup/harvesterStation\",\r\n params: { includeInactive: true },\r\n onSuccess: (r) => {\r\n this.options.stations = r.result;\r\n\r\n // TODO: fix RXJS issue so this can be done properly\r\n this.refresh();\r\n }\r\n });\r\n\r\n this.options.broadcasters = {};\r\n\r\n ZIXI_LOCATIONS.forEach(location => {\r\n this.apiService.get({\r\n method: `zixi/broadcasters/${location}`,\r\n onSuccess: (r) => {\r\n this.options.broadcasters[location] = r.result;\r\n }\r\n });\r\n });\r\n }\r\n\r\n getExtraStationInfo() {\r\n var s = this.options.stations.find((x: any) => x.stationDefaultDataId === this.station.stationDefaultDataId);\r\n this.station._timeZone = s?.ianaTimeZone;\r\n this.station._city = s ? `${s.city}, ${s.state}` : null;\r\n }\r\n\r\n handleNotFound() {\r\n this.uiService.toast.error(\"Station not found\");\r\n this.navigateToStations();\r\n }\r\n\r\n validateBroadcaster(configName: string) {\r\n if (!this.stationId) {\r\n this.uiService.toast.error(\"Please save this station to validate the broadcaster\");\r\n return;\r\n }\r\n\r\n this.zixi = {\r\n broadcaster: { loading: true },\r\n modalTitle: `Zixi Broadcaster Setup - ${configName}`\r\n };\r\n \r\n this.apiService.get({\r\n method: \"zixi/validateSetup\",\r\n params: {\r\n stationId: this.stationId,\r\n zixiBroadcasterId: configName === \"East\" ? this.station.zixiBroadcasterEast : this.station.zixiBroadcasterWest\r\n },\r\n onSuccess: (r) => {\r\n this.zixi.broadcaster = r.result;\r\n }\r\n });\r\n }\r\n\r\n test() {\r\n this.zixi = undefined;\r\n }\r\n}\r\n","
\r\n

Stations

\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n Call Sign \r\n Active \r\n Mapping \r\n City \r\n Owner \r\n Operator \r\n \r\n \r\n \r\n \r\n {{station.callSign}}\r\n \r\n \r\n \r\n \r\n {{station.mapping?.callSign}}\r\n {{station.mapping?.city}}\r\n {{station.owner}}\r\n {{station.operator}}\r\n \r\n \r\n \r\n
\r\n","import { Component } from '@angular/core';\r\nimport { AppPermission } from '../../_shared/models/user';\r\nimport { ApiService } from '../../_shared/services/api.service';\r\nimport { AuthService } from '../../_shared/services/auth.service';\r\n\r\n@Component({\r\n selector: 'app-station-list',\r\n templateUrl: './station-list.component.html',\r\n styleUrls: ['./station-list.component.scss']\r\n})\r\nexport class StationListComponent {\r\n constructor(\r\n private apiService: ApiService,\r\n private authService: AuthService) { }\r\n\r\n stations: any[];\r\n settings = { showHidden: false, canEdit: false }\r\n\r\n ngOnInit() {\r\n this.settings.canEdit = this.authService.isPermitted(AppPermission.mngStations);\r\n\r\n this.getStations();\r\n }\r\n\r\n getStations() {\r\n this.apiService.get({\r\n method: \"station/admin\",\r\n onSuccess: (r) => { this.stations = r.result; }\r\n });\r\n }\r\n}\r\n","
\r\n

Station Overview

\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n Station \r\n Platform \r\n Source \r\n Time Zone \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{entry.station}}\r\n \r\n {{ entry.platform }}\r\n {{ entry.source }}\r\n {{ entry.timeZone }}\r\n \r\n \r\n \r\n
\r\n\r\n\r\n
\r\n
Request to Switch Source
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n\r\n \r\n \r\n \r\n Station\r\n Platform\r\n Current Source\r\n New Source\r\n \r\n \r\n \r\n \r\n \r\n {{ entry.station }}\r\n {{ entry.platform }}\r\n {{ entry.source }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n\r\n\r\n\r\n","import { Component, OnInit, ViewChild } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { ConfirmationService } from 'primeng/api';\r\nimport { QueueJobActionData, QueueJobService } from '../../_shared/components/queue-job/queue-job.service';\r\nimport { AppPermission } from '../../_shared/models/user';\r\nimport { ApiService } from '../../_shared/services/api.service';\r\nimport { AuthService } from '../../_shared/services/auth.service';\r\nimport { UiService } from '../../_shared/services/ui.service';\r\nimport { Table } from 'primeng/table';\r\n\r\n@Component({\r\n selector: 'app-station-overview',\r\n templateUrl: './station-overview.component.html',\r\n styleUrls: ['./station-overview.component.scss']\r\n})\r\nexport class StationOverviewComponent implements OnInit {\r\n\r\n constructor(\r\n private uiService: UiService,\r\n private apiService: ApiService,\r\n private authService: AuthService,\r\n private confirmationService: ConfirmationService,\r\n private queueJobService: QueueJobService,\r\n private route: ActivatedRoute) { }\r\n\r\n @ViewChild('table') table: Table;\r\n entries: any[];\r\n filters: any = { stations: [], platforms: [] };\r\n options: any = { flatSources: [], groupedSources: [] };\r\n canEdit = false;\r\n selection = { any: false, all: false, count: 0 };\r\n job;\r\n filteredEntries: any;\r\n\r\n ngOnInit() {\r\n this.canEdit = this.authService.isPermitted(AppPermission.mngSourceCon);\r\n\r\n // Automatically select station\r\n var stationId = parseInt(this.route.snapshot.queryParams['station']) || undefined;\r\n this.refresh(stationId);\r\n }\r\n\r\n refresh(stationIdToOpen?: number) {\r\n this.apiService.get({\r\n method: \"station/overview\",\r\n blockUi: true,\r\n onSuccess: (r) => {\r\n this.entries = r.result.platforms;\r\n\r\n var extractOptions = (idField, nameField) => {\r\n return Array.from(new Set(this.entries.map(x => x[idField])))\r\n .map(id => ({ id, name: this.entries.find(x => x[idField] === id)[nameField] }))\r\n .sort((a, b) => a.name.localeCompare(b.name));\r\n }\r\n\r\n this.filters.stations = extractOptions(\"stationId\", \"station\");\r\n this.filters.platforms = extractOptions(\"platformId\", \"platform\");\r\n this.filters.sources = extractOptions(\"sourceId\", \"source\");\r\n\r\n this.filters.timeZones = [];\r\n this.entries.forEach(x => {\r\n x.timeZone = x.timeZone.replace(\" Observing\", \"\");\r\n if (!this.filters.timeZones.includes(x.timeZone))\r\n this.filters.timeZones.push(x.timeZone);\r\n });\r\n\r\n this.options.flatSources = r.result.sources.map(x => x.items).flat();\r\n this.options.groupedSources = r.result.sources;\r\n\r\n this.apiService.get({\r\n method: \"lookup/adn/mappingProfiles\",\r\n onSuccess: (r) => {\r\n var items = r.result.map(x => ({\r\n sourceId: null,\r\n isProfile: true,\r\n adnMappingId: x.id,\r\n name: `${x.name} mapping`,\r\n }));\r\n\r\n this.options.groupedSources.push({ type: \"ADN Mapping Profile\", items });\r\n }\r\n });\r\n\r\n // Automatically select station\r\n if (stationIdToOpen > 0) {\r\n this.table.filter([stationIdToOpen], 'stationId', 'in');\r\n setTimeout(() => {\r\n this.selection.all = true;\r\n this.selectAllNone();\r\n this.newJob();\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n newJob() {\r\n this.job = {\r\n entries: this.entries.filter(x => x.selected)\r\n }; \r\n }\r\n\r\n removeFromJob(entry) {\r\n entry.selected = false;\r\n this.job.entries = this.entries.filter(x => x.selected);\r\n }\r\n\r\n selectSource() {\r\n this.job.entries.forEach(x => {\r\n if (this.job.source.isProfile) {\r\n var sourceId = x.adnMappings.find(m => m.adnMappingId === this.job.source.adnMappingId)?.adnId;\r\n x.nextSource = this.options.flatSources.find(s => s.sourceId === sourceId);\r\n } else {\r\n x.nextSource = this.job.source;\r\n }\r\n });\r\n }\r\n\r\n selectionChanged() {\r\n this.selection.count = (this.entries.filter(x => x.selected) || []).length;\r\n this.selection.any = this.selection.count > 0;\r\n this.selection.all = this.selection.count === this.entries.length;\r\n }\r\n\r\n selectAllNone() { \r\n var entries = this.filteredEntries?.length ? this.filteredEntries : this.entries;\r\n\r\n entries.forEach(x => { x.selected = this.selection.all; });\r\n this.selectionChanged();\r\n }\r\n\r\n openStation($event: Event, entry) {\r\n this.uiService.open.station(entry.stationId);\r\n\r\n $event.preventDefault();\r\n }\r\n\r\n apply() {\r\n if (this.job.entries.some(x => !x.nextSource)) {\r\n this.uiService.toast.error(\"A new source must be selected for all rows\");\r\n return;\r\n }\r\n\r\n var messageEnd = this.job.entries.length === 1\r\n ? `${this.job.entries[0].station} - ${this.job.entries[0].platform}`\r\n : `${this.job.entries.length} station platforms`\r\n\r\n this.confirmationService.confirm({\r\n header: `Source Change`,\r\n message: `Are you sure that you want to switch the source for ${messageEnd}`,\r\n acceptLabel: `Yes`,\r\n rejectLabel: \"Cancel\",\r\n acceptButtonStyleClass: \"p-button-danger\",\r\n accept: () => {\r\n var actions: QueueJobActionData[] = this.job.entries.map(x => ({\r\n stationId: x.stationId,\r\n platformId: x.platformId,\r\n sourceId: x.nextSource.sourceId,\r\n description: `${x.station} - ${x.platform} switching to ${x.nextSource.name}`\r\n }));\r\n\r\n this.sendToQueue(actions);\r\n }\r\n });\r\n }\r\n\r\n sendToQueue(actions: QueueJobActionData[]) {\r\n var queue = this.queueJobService.launchForSourceSwitch(actions);\r\n this.closeDialog();\r\n\r\n queue.onClose.subscribe(r => {\r\n if (r?.refresh === true)\r\n this.refresh();\r\n });\r\n }\r\n\r\n onFilter(event) {\r\n this.filteredEntries = event.filteredValue;\r\n }\r\n\r\n closeDialog() {\r\n this.job = undefined;\r\n this.entries.forEach(x => { x.nextSource = undefined; });\r\n }\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-unauthorized',\r\n templateUrl: './unauthorized.component.html',\r\n styleUrls: ['./unauthorized.component.scss']\r\n})\r\nexport class UnauthorizedComponent {}\r\n","
\r\n You are not authorized to access the requested feature.\r\n\r\n
\r\n \r\n
\r\n
\r\n","
\r\n

Users

\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n First Name\r\n Last Name\r\n Login\r\n \r\n \r\n \r\n \r\n {{user.firstName}}\r\n {{user.lastName}}\r\n {{user.oktaLogin}}\r\n \r\n \r\n \r\n
\r\n","import { Component, OnInit, } from '@angular/core';\r\nimport { AppPermission } from '../../../_shared/models/user';\r\nimport { ApiService } from '../../../_shared/services/api.service';\r\nimport { AuthService } from '../../../_shared/services/auth.service';\r\nimport { UiService } from '../../../_shared/services/ui.service';\r\n\r\n@Component({\r\n selector: 'app-user-list',\r\n templateUrl: './user-list.component.html',\r\n styleUrls: ['./user-list.component.scss']\r\n})\r\nexport class UserListComponent implements OnInit {\r\n\r\n constructor(\r\n private apiService: ApiService,\r\n private authService: AuthService,\r\n private uiService: UiService) { }\r\n\r\n users: User[];\r\n selectedUser: User;\r\n canEdit = false;\r\n header: string;\r\n\r\n ngOnInit(): void {\r\n this.canEdit = this.authService.isPermitted(AppPermission.mngUser);\r\n\r\n this.refresh();\r\n }\r\n\r\n refresh() {\r\n this.apiService.get({\r\n method: \"user\",\r\n onSuccess: (r) => {\r\n this.users = r.result;\r\n }\r\n });\r\n }\r\n\r\n selectUser(event: any) {\r\n this.selectedUser = event.data as User;\r\n this.openDialog();\r\n }\r\n\r\n addNew() {\r\n this.selectedUser = { appUserId: 0 };\r\n this.openDialog();\r\n }\r\n\r\n openDialog() {\r\n var header = this.selectedUser.appUserId > 0\r\n ? `Edit User - ${this.selectedUser.firstName} ${this.selectedUser.lastName}`\r\n : \"New User\";\r\n\r\n var dialog = this.uiService.open.user(this.selectedUser.appUserId, header);\r\n\r\n dialog.onClose.subscribe(r => {\r\n if (r?.refresh === true) {\r\n this.refresh();\r\n }\r\n\r\n this.selectedUser = undefined;\r\n });\r\n }\r\n}\r\n\r\ninterface User {\r\n appUserId: number,\r\n oktaLogin: string,\r\n firstName: string,\r\n lastName: string\r\n}\r\n","
\r\n \r\n \r\n \r\n Click to refresh\r\n
\r\n","import { Component, OnInit, OnDestroy, Input, OnChanges, SimpleChanges, SimpleChange } from '@angular/core';\r\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\r\nimport { Subscription, timer } from 'rxjs';\r\nimport { ApiService } from '../../services/api.service';\r\n\r\n@Component({\r\n selector: 'app-zixi-snapshot',\r\n templateUrl: './zixi-snapshot.component.html',\r\n styleUrls: ['./zixi-snapshot.component.scss']\r\n})\r\nexport class ZixiSnapshotComponent implements OnInit, OnDestroy, OnChanges {\r\n\r\n constructor(\r\n private apiService: ApiService,\r\n private http: HttpClient) { }\r\n\r\n @Input() stationId: number;\r\n @Input() platformId: number;\r\n @Input() location: string;\r\n @Input() size: string;\r\n @Input() autoRefresh: boolean;\r\n imageSrc: string;\r\n loading: boolean;\r\n success: boolean;\r\n failed: boolean;\r\n errorMessage: string;\r\n apiUrl: string;\r\n refreshTimer: Subscription;\r\n refreshCount = 0;\r\n settings = { refreshInterval: 10000, maxRefreshes: 100 };\r\n\r\n ngOnInit() {\r\n this.apiUrl = this.apiService.getUrl({ method: `Zixi/getZixiTargetPreview/${this.location}` });\r\n\r\n if (this.autoRefresh)\r\n this.startTimer();\r\n else\r\n this.getImage();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.stopTimer();\r\n }\r\n\r\n startTimer() {\r\n this.stopTimer();\r\n this.refreshTimer = timer(0, this.settings.refreshInterval).subscribe(() => {\r\n this.getImage();\r\n this.refreshCount++;\r\n\r\n if (this.refreshCount === this.settings.maxRefreshes)\r\n this.stopTimer();\r\n });\r\n }\r\n\r\n stopTimer() {\r\n this.refreshCount = 0;\r\n\r\n if (this.refreshTimer)\r\n this.refreshTimer.unsubscribe();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n var change: SimpleChange = changes.autoRefresh;\r\n if (change && !change.firstChange) {\r\n if (change.currentValue === true)\r\n this.startTimer();\r\n else\r\n this.stopTimer();\r\n }\r\n }\r\n\r\n getImage() {\r\n if (this.loading) return;\r\n\r\n this.failed = false;\r\n this.loading = true;\r\n this.errorMessage = undefined;\r\n var params = { stationId: this.stationId, platformId: this.platformId };\r\n\r\n this.http.get(this.apiUrl, { params, responseType: 'blob' })\r\n .subscribe((response: Blob) => {\r\n const reader = new FileReader();\r\n\r\n reader.onloadend = () => {\r\n this.imageSrc = reader.result as string;\r\n this.loading = false;\r\n this.success = true;\r\n };\r\n\r\n reader.readAsDataURL(response);\r\n }, this.handleError);\r\n }\r\n\r\n handleError = (error: HttpErrorResponse) => {\r\n this.failed = true;\r\n this.success = false;\r\n this.loading = false;\r\n\r\n const reader = new FileReader();\r\n\r\n reader.onloadend = (e) => {\r\n var response = JSON.parse(reader.result as string);\r\n this.errorMessage = response?.message || \"An error has occurred\";\r\n }\r\n\r\n reader.readAsText(error.error);\r\n }\r\n\r\n getStyleClass() {\r\n var style = {\r\n loading: this.loading,\r\n failed: this.failed,\r\n success: this.success\r\n };\r\n\r\n if (this.size)\r\n style[this.size] = true;\r\n\r\n return style;\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { BrowserModule } from '@angular/platform-browser';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport { RouterModule } from '@angular/router';\r\n\r\n// PrimeNG\r\nimport { BlockUIModule } from 'primeng/blockui';\r\nimport { BreadcrumbModule } from 'primeng/breadcrumb';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { CalendarModule } from 'primeng/calendar';\r\nimport { CardModule } from 'primeng/card';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { ChipModule } from 'primeng/chip';\r\nimport { ConfirmDialogModule } from 'primeng/confirmdialog';\r\nimport { ConfirmationService } from 'primeng/api';\r\nimport { ConfirmPopupModule } from 'primeng/confirmpopup';\r\nimport { ContextMenuModule } from 'primeng/contextmenu';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { DividerModule } from 'primeng/divider';\r\nimport { DragDropModule } from 'primeng/dragdrop';\r\nimport { DropdownModule } from 'primeng/dropdown';\r\nimport { DialogService } from 'primeng/dynamicdialog';\r\nimport { InputNumberModule } from 'primeng/inputnumber';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { InputTextareaModule } from 'primeng/inputtextarea';\r\nimport { MenubarModule } from 'primeng/menubar';\r\nimport { MenuModule } from 'primeng/menu';\r\nimport { MessageModule } from 'primeng/message';\r\nimport { MessageService } from 'primeng/api';\r\nimport { MultiSelectModule } from 'primeng/multiselect';\r\nimport { OverlayPanelModule } from 'primeng/overlaypanel';\r\nimport { ProgressBarModule } from 'primeng/progressbar';\r\nimport { SidebarModule } from 'primeng/sidebar';\r\nimport { TableModule } from 'primeng/table';\r\nimport { TabViewModule } from 'primeng/tabview';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { TooltipModule } from 'primeng/tooltip'\r\n\r\n// Other\r\nimport { AuthService } from './_shared/services/auth.service';\r\nimport { UiService } from './_shared/services/ui.service';\r\nimport { ApiService } from './_shared/services/api.service';\r\nimport { QueueJobService } from './_shared/components/queue-job/queue-job.service';\r\nimport { HttpsGuard, PermissionsGuard } from './_shared/functions/routing';\r\nimport { AppPermission } from './_shared/models/user';\r\nimport { environment } from '../environments/environment';\r\n\r\n// Okta\r\nimport { OktaAuthModule, OKTA_CONFIG } from '@okta/okta-angular';\r\nimport { OktaAuth } from '@okta/okta-auth-js';\r\nimport { OktaAuthGuard, OktaCallbackComponent } from '@okta/okta-angular';\r\nimport { AuthInterceptor } from './_shared/interceptors/auth.interceptor';\r\n\r\n// App Components\r\nimport { ActivityLogComponent } from './system/activity-log/activity-log.component';\r\nimport { AdnImportComponent } from './adn/adn-import/adn-import.component';\r\nimport { AdnMapperComponent } from './adn/adn-mapper/adn-mapper.component';\r\nimport { AiringScheduleComponent } from './airing/airing-schedule/airing-schedule.component';\r\nimport { AiringScheduleFilterPipe } from './airing/airing-schedule/airing-schedule.pipe';\r\nimport { AiringSummaryComponent } from './airing/airing-summary/airing-summary.component';\r\nimport { AppComponent } from './app.component';\r\nimport { BlackoutListComponent } from './blackout/blackout-list/blackout-list.component';\r\nimport { BlackoutRulesComponent } from './blackout/blackout-rules/blackout-rules.component';\r\nimport { CacheManagerComponent } from './system/cache-manager/cache-manager.component';\r\nimport { LoggedOutComponent } from './_shared/components/logged-out/logged-out.component';\r\nimport { OverrideGroupsComponent } from './override/override-groups/override-groups.component';\r\nimport { QueueJobComponent } from './_shared/components/queue-job/queue-job.component';\r\nimport { StationDetailComponent } from './station/station-detail/station-detail.component';\r\nimport { StationListComponent } from './station/station-list/station-list.component';\r\nimport { StationOverviewComponent } from './station/station-overview/station-overview.component';\r\nimport { StationPickerComponent } from './_shared/components/station-picker/station-picker.component';\r\nimport { StationSummaryComponent } from './station/station-summary/station-summary.component';\r\nimport { UnauthorizedComponent } from './_shared/components/unauthorized/unauthorized.component';\r\nimport { UserDetailComponent } from './system/user/user-detail/user-detail.component';\r\nimport { UserListComponent } from './system/user/user-list/user-list.component';\r\nimport { UserMenuComponent } from './system/user/user-menu/user-menu.component';\r\nimport { ZixiSnapshotComponent } from './_shared/components/zixi-snapshot/zixi-snapshot.component';\r\n\r\n\r\nconst oktaAuth = new OktaAuth({\r\n issuer: `${environment.oktaIssuer}`,\r\n clientId: `${environment.oktaClientId}`,\r\n redirectUri: `${environment.oktaRedirectUri}`,\r\n postLogoutRedirectUri: `${environment.oktaPostLogoutRedirectUri}`,\r\n scopes: ['openid', 'profile', 'email'],\r\n pkce: true,\r\n});\r\n\r\n\r\n@NgModule({\r\n declarations: [\r\n ActivityLogComponent,\r\n AdnImportComponent,\r\n AdnMapperComponent,\r\n AiringScheduleComponent,\r\n AiringScheduleFilterPipe,\r\n AiringSummaryComponent,\r\n AppComponent,\r\n BlackoutListComponent,\r\n BlackoutRulesComponent,\r\n CacheManagerComponent,\r\n LoggedOutComponent,\r\n OverrideGroupsComponent,\r\n QueueJobComponent,\r\n StationDetailComponent,\r\n StationListComponent,\r\n StationOverviewComponent,\r\n StationPickerComponent,\r\n StationSummaryComponent,\r\n UnauthorizedComponent,\r\n UserDetailComponent,\r\n UserListComponent,\r\n UserMenuComponent,\r\n ZixiSnapshotComponent\r\n ],\r\n imports: [\r\n BrowserModule,\r\n BrowserAnimationsModule,\r\n CommonModule,\r\n HttpClientModule,\r\n FormsModule,\r\n OktaAuthModule,\r\n RouterModule.forRoot([\r\n {\r\n path: '',\r\n canActivateChild: [HttpsGuard, OktaAuthGuard],\r\n children: [\r\n { path: 'schedule', component: AiringScheduleComponent, canActivate: [() => PermissionsGuard(AppPermission.vwStnSchedule)] },\r\n { path: 'schedule-overrides', component: OverrideGroupsComponent, canActivate: [() => PermissionsGuard(AppPermission.vwOverrideGrp)] },\r\n { path: 'blackout-schedule', component: BlackoutListComponent, canActivate: [() => PermissionsGuard(AppPermission.vwStnSchedule)] },\r\n { path: 'blackout-rules', component: BlackoutRulesComponent, canActivate: [() => PermissionsGuard(AppPermission.vwStnSubRules)] },\r\n { path: 'adn-mapper', component: AdnMapperComponent, canActivate: [() => PermissionsGuard(AppPermission.vwADNMap)] },\r\n { path: 'activity-log', component: ActivityLogComponent, canActivate: [() => PermissionsGuard(AppPermission.vwSysSettings)] },\r\n { path: 'cache-manager', component: CacheManagerComponent, canActivate: [() => PermissionsGuard(AppPermission.vwSysSettings)] },\r\n { path: 'users', component: UserListComponent, canActivate: [() => PermissionsGuard(AppPermission.vwUser)] },\r\n { path: 'station-overview', component: StationOverviewComponent, canActivate: [() => PermissionsGuard(AppPermission.vwSourceCon)] },\r\n {\r\n path: 'stations',\r\n canActivate: [() => PermissionsGuard(AppPermission.vwStations)],\r\n children: [\r\n { path: '', component: StationListComponent },\r\n { path: ':id', component: StationDetailComponent }\r\n ]\r\n },\r\n { path: '', redirectTo: '/schedule', pathMatch: 'full' }\r\n ]\r\n },\r\n // Components without AuthGuard\r\n { path: 'implicit/callback', component: OktaCallbackComponent },\r\n { path: 'logged-out', component: LoggedOutComponent },\r\n { path: 'unauthorized', component: UnauthorizedComponent }\r\n ]),\r\n\r\n // PrimeNG modules\r\n BlockUIModule,\r\n BreadcrumbModule,\r\n ButtonModule,\r\n CalendarModule,\r\n CardModule,\r\n CheckboxModule,\r\n ChipModule,\r\n ConfirmDialogModule,\r\n ConfirmPopupModule,\r\n ContextMenuModule,\r\n DialogModule,\r\n DividerModule,\r\n DragDropModule,\r\n DropdownModule,\r\n InputNumberModule,\r\n InputTextModule,\r\n InputTextareaModule,\r\n MenubarModule,\r\n MenuModule,\r\n MessageModule,\r\n MultiSelectModule,\r\n OverlayPanelModule,\r\n ProgressBarModule,\r\n SidebarModule,\r\n TableModule,\r\n TabViewModule,\r\n ToastModule,\r\n TooltipModule,\r\n ],\r\n providers: [\r\n ConfirmationService,\r\n DialogService,\r\n MessageService,\r\n ApiService,\r\n AuthService,\r\n UiService,\r\n QueueJobService,\r\n { provide: OKTA_CONFIG, useValue: { oktaAuth } },\r\n { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true },\r\n ],\r\n bootstrap: [AppComponent]\r\n})\r\nexport class AppModule { }\r\n","import { enableProdMode } from '@angular/core';\r\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\r\n\r\nimport { AppModule } from './app/app.module';\r\nimport { environment } from './environments/environment';\r\n\r\nif (environment.production) {\r\n enableProdMode();\r\n}\r\n\r\nplatformBrowserDynamic().bootstrapModule(AppModule)\r\n .catch(err => console.error(err));\r\n"],"x_google_ignoreList":[]}