/* * Copyright (C) 2022 StApps * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ import {Component, OnInit, OnDestroy} from '@angular/core'; import {Router, ActivatedRoute} from '@angular/router'; import {SCCatalog, SCSemester} from '@openstapps/core'; import moment from 'moment'; import {Subscription} from 'rxjs'; import {CatalogProvider} from './catalog.provider'; import {NGXLogger} from 'ngx-logger'; import {Location} from '@angular/common'; import {DataRoutingService} from '../data/data-routing.service'; @Component({ selector: 'app-catalog', templateUrl: './catalog.component.html', styleUrls: ['./catalog.component.scss'], }) export class CatalogComponent implements OnInit, OnDestroy { /** * SCSemester to show */ activeSemester?: SCSemester; /** * UID of the selected SCSemester */ selectedSemesterUID = ''; /** * Available SCSemesters */ availableSemesters: SCSemester[] = []; /** * Catalogs (SCCatalog) to show */ catalogs: SCCatalog[] | undefined; /** * Array of all subscriptions to Observables */ subscriptions: Subscription[] = []; /** * Supercatalog (SCCatalog) to refer to */ superCatalog: SCCatalog; constructor( private readonly route: ActivatedRoute, private readonly catalogProvider: CatalogProvider, private readonly dataRoutingService: DataRoutingService, private readonly logger: NGXLogger, protected router: Router, public location: Location, ) { this.subscriptions.push( this.dataRoutingService.itemSelectListener().subscribe(item => { void this.router.navigate(['data-detail', item.uid]); }), ); } ngOnInit() { this.selectedSemesterUID = this.route.snapshot.paramMap.get('uid') ?? ''; void this.fetchCatalog(); } /** * Remove subscriptions when the component is removed */ ngOnDestroy() { for (const sub of this.subscriptions) { sub.unsubscribe(); } } async fetchCatalog() { try { if (this.availableSemesters.length === 0) { await this.fetchSemesters(); } const response = await this.catalogProvider.getCatalogsWith( 0, this.superCatalog, this.activeSemester?.uid, ); this.catalogs = (response.data as SCCatalog[]).sort((a, b) => { return new Intl.Collator('en', { numeric: true, sensitivity: 'accent', }).compare(a.name, b.name); }); } catch (error) { this.logger.error((error as Error).message); return; } } async fetchSemesters(): Promise { const today = moment().startOf('day').toISOString(); const semesters = await this.catalogProvider.getRelevantSemesters(); const currentSemester = semesters.find( semester => semester.startDate <= today && semester.endDate > today, ); const currentSemesterIndex = semesters.findIndex(semester => semester.uid === currentSemester?.uid); this.availableSemesters = semesters .slice(Math.max(0, currentSemesterIndex - 1), Math.min(currentSemesterIndex + 2, semesters.length)) .reverse(); if (typeof this.activeSemester !== 'undefined') { return; } this.activeSemester = this.availableSemesters[0]; this.activeSemester = this.selectedSemesterUID === '' ? currentSemester : this.availableSemesters.find(semester => semester.uid === this.selectedSemesterUID); if (this.activeSemester && this.selectedSemesterUID === '') { this.selectedSemesterUID = this.activeSemester.uid; } } // eslint-disable-next-line @typescript-eslint/no-explicit-any segmentChanged(event: any) { if (this.activeSemester && this.activeSemester.uid !== (event.detail.value as string)) { this.updateLocation(event.detail.value as string); } this.activeSemester = this.availableSemesters.find( semester => semester.uid === (event.detail.value as string), ); delete this.catalogs; void this.fetchCatalog(); } updateLocation(semesterUID: string) { const url = this.router.createUrlTree(['/catalog/', semesterUID]).toString(); this.location.go(url); } /** * Emit event that a catalog item was selected */ notifySelect(catalog: SCCatalog) { this.dataRoutingService.emitChildEvent(catalog); } }