@if (professors.length === 0) {
-
+
} @else {
diff --git a/src/components/schedule/tabs/professor/professor.component.ts b/src/components/schedule/tabs/professor/professor.component.ts
index 8b1e2ab..fffe10c 100644
--- a/src/components/schedule/tabs/professor/professor.component.ts
+++ b/src/components/schedule/tabs/professor/professor.component.ts
@@ -3,9 +3,10 @@ import {MatFormField, MatInput} from "@angular/material/input";
import {FormControl, ReactiveFormsModule} from "@angular/forms";
import {MatAutocompleteModule, MatAutocompleteSelectedEvent} from "@angular/material/autocomplete";
import {AsyncPipe} from "@angular/common";
-import {map, Observable, startWith} from "rxjs";
+import {catchError, map, Observable, startWith} from "rxjs";
import {LoadingIndicatorComponent} from "@component/common/loading-indicator/loading-indicator.component";
import {ProfessorResponse} from "@api/v1/professorResponse";
+import {ProfessorService} from "@api/v1/professor.service";
@Component({
selector: 'app-professor',
@@ -19,17 +20,37 @@ import {ProfessorResponse} from "@api/v1/professorResponse";
LoadingIndicatorComponent
],
templateUrl: './professor.component.html',
- styleUrl: './professor.component.css'
+ styleUrl: './professor.component.css',
+ providers: [ProfessorService]
})
export class ProfessorComponent implements OnInit {
protected professorControl = new FormControl();
protected filteredProfessors!: Observable;
- @Input() professors: ProfessorResponse[] = [];
- @Output() professorSelected = new EventEmitter();
+ protected professors: ProfessorResponse[] = [];
+ protected professorsLoaded: boolean | null = false;
- @Input() professorsLoaded: boolean | null = false;
- @Output() professorsLoadRetry: EventEmitter = new EventEmitter();
+ @Output() eventResult = new EventEmitter();
+
+ constructor(private api: ProfessorService) {
+ this.loadProfessors();
+ }
+
+ protected loadProfessors() {
+ if (this.professors.length === 0) {
+ this.professorsLoaded = false;
+
+ this.api.getProfessors()
+ .pipe(catchError(error => {
+ this.professorsLoaded = null;
+ throw error;
+ }))
+ .subscribe(data => {
+ this.professors = data;
+ this.professorsLoaded = true;
+ });
+ }
+ }
ngOnInit(): void {
this.filteredProfessors = this.professorControl.valueChanges.pipe(
@@ -53,7 +74,7 @@ export class ProfessorComponent implements OnInit {
const selectedOption = this.professors.find(teacher => teacher.id === event.option.value);
if (selectedOption) {
this.professorControl.setValue(selectedOption.name);
- this.professorSelected.emit(selectedOption.id);
+ this.eventResult.emit(selectedOption.id);
}
}
}
diff --git a/src/components/schedule/tabs/tabs.component.html b/src/components/schedule/tabs/tabs.component.html
index 06ee020..194d111 100644
--- a/src/components/schedule/tabs/tabs.component.html
+++ b/src/components/schedule/tabs/tabs.component.html
@@ -2,24 +2,17 @@
(selectedTabChange)="chooseTabs($event)">
diff --git a/src/components/schedule/tabs/tabs.component.ts b/src/components/schedule/tabs/tabs.component.ts
index 9b200b7..ce3eeba 100644
--- a/src/components/schedule/tabs/tabs.component.ts
+++ b/src/components/schedule/tabs/tabs.component.ts
@@ -1,38 +1,31 @@
-import {Component, EventEmitter, Output, ViewChild} from '@angular/core';
-import {HttpClientModule} from "@angular/common/http";
+import {Component, EventEmitter, Output} from '@angular/core';
import {OtherComponent} from "@component/schedule/tabs/other/other.component";
import {MatTab, MatTabChangeEvent, MatTabGroup} from "@angular/material/tabs";
-import {catchError, map, Observable, of, switchMap, tap} from "rxjs";
+import {map, Observable} from "rxjs";
import {ReactiveFormsModule} from "@angular/forms";
-import {AsyncPipe, NgIf} from "@angular/common";
import {MatButton} from "@angular/material/button";
import {DataSpinnerComponent} from "@component/common/data-spinner/data-spinner.component";
-import {ProfessorResponse} from "@api/v1/professorResponse";
-import {FacultyResponse} from "@api/v1/facultyResponse";
-import {GroupResponse} from "@api/v1/groupResponse";
-import {CampusBasicInfoResponse} from "@api/v1/campusBasicInfoResponse";
-import {LectureHallResponse} from "@api/v1/lectureHallResponse";
-import {DisciplineService} from "@api/v1/discipline.service";
import {GroupComponent} from "@component/schedule/tabs/group/group.component";
import {ProfessorComponent} from "@component/schedule/tabs/professor/professor.component";
import {LectureHallComponent} from "@component/schedule/tabs/lecture-hall/lecture-hall.component";
-import {FacultyService} from "@api/v1/faculty.service";
-import {GroupService} from "@api/v1/group.service";
-import {ProfessorService} from "@api/v1/professor.service";
-import {CampusService} from "@api/v1/campus.service";
-import {LectureHallService} from "@api/v1/lectureHall.service";
+import {ScheduleService} from "@api/v1/schedule.service";
+import {ScheduleResponse} from "@api/v1/scheduleResponse";
+
+export enum TabsSelect {
+ Group,
+ Professor,
+ LectureHall,
+ Other
+}
@Component({
selector: 'app-tabs',
standalone: true,
imports: [
- HttpClientModule,
OtherComponent,
MatTabGroup,
MatTab,
ReactiveFormsModule,
- AsyncPipe,
- NgIf,
MatButton,
DataSpinnerComponent,
GroupComponent,
@@ -41,171 +34,122 @@ import {LectureHallService} from "@api/v1/lectureHall.service";
],
templateUrl: './tabs.component.html',
styleUrl: './tabs.component.css',
- providers: [FacultyService, GroupService, ProfessorService, CampusService, LectureHallService, DisciplineService ]
+ providers: [ScheduleService]
})
export class TabsComponent {
- protected professorsData: ProfessorResponse[] = [];
+ @Output() eventResult = new EventEmitter<[TabsSelect, number, Observable]>();
- protected faculties: Observable = of([]);
- protected groups: Observable = of([]);
- private groupsData: Observable = of([]);
+ constructor(private scheduleApi: ScheduleService) {
+ }
protected campuses: Observable = of([]);
protected lectureHalls: Observable = of([]);
private lectureHallsData: Observable = of([]);
+ protected groupSelected(id: number) {
+ this.eventResult.emit(
+ [
+ TabsSelect.Group,
+ id,
+ this.scheduleApi.getByGroup(id)
+ .pipe(
+ map(g =>
+ g.map(data =>
+ ({
+ dayOfWeek: data.dayOfWeek,
+ pairNumber: data.pairNumber,
+ isEven: data.isEven,
+ discipline: data.discipline,
+ disciplineId: data.disciplineId,
+ isExcludedWeeks: data.isExcludedWeeks,
+ weeks: data.weeks,
+ typeOfOccupations: data.typeOfOccupations,
+ group: data.group,
+ groupId: data.groupId,
+ lectureHalls: data.lectureHalls,
+ lectureHallsId: data.lectureHallsId,
+ professors: data.professors,
+ professorsId: data.professorsId,
+ campus: data.campus,
+ campusId: data.campusId,
+ linkToMeet: data.linkToMeet
+ }))
+ )
+ )
+ ]
+ );
+ }
- // States
- protected facultiesLoaded: boolean | null = false;
- protected groupLoaded: boolean | null = false;
- protected campusesLoaded: boolean | null = false;
- protected lectureHallsLoaded: boolean | null = false;
- protected disciplinesLoaded: boolean | null = false;
- protected professorsLoaded: boolean | null = false;
+ protected professorSelected(id: number) {
+ this.eventResult.emit(
+ [
+ TabsSelect.Professor,
+ id,
+ this.scheduleApi.getByProfessor(id)
+ .pipe(
+ map(p =>
+ p.map(data =>
+ ({
+ dayOfWeek: data.dayOfWeek,
+ pairNumber: data.pairNumber,
+ isEven: data.isEven,
+ discipline: data.discipline,
+ disciplineId: data.disciplineId,
+ isExcludedWeeks: data.isExcludedWeeks,
+ weeks: data.weeks,
+ typeOfOccupations: data.typeOfOccupations,
+ group: data.group,
+ groupId: data.groupId,
+ lectureHalls: data.lectureHalls,
+ lectureHallsId: data.lectureHallsId,
+ professors: data.professors,
+ professorsId: data.professorsId,
+ campus: data.campus,
+ campusId: data.campusId,
+ linkToMeet: data.linkToMeet
+ }))
+ )
+ )
+ ]
+ );
+ }
- @Output() groupSelected: EventEmitter = new EventEmitter();
- @Output() lectureHallSelected: EventEmitter = new EventEmitter();
- @Output() professorSelected: EventEmitter = new EventEmitter();
-
- constructor(
- private facultyApi: FacultyService,
- private groupApi: GroupService,
- private professorApi: ProfessorService,
- private campusApi: CampusService,
- private lectureHallApi: LectureHallService,
- private disciplineApi: DisciplineService) {
- this.facultyLoad().then();
+ protected lectureHallSelected(id: number) {
+ this.eventResult.emit(
+ [
+ TabsSelect.LectureHall,
+ id,
+ this.scheduleApi.getByLectureHall(id)
+ .pipe(
+ map(lh =>
+ lh.map(data =>
+ ({
+ dayOfWeek: data.dayOfWeek,
+ pairNumber: data.pairNumber,
+ isEven: data.isEven,
+ discipline: data.discipline,
+ disciplineId: data.disciplineId,
+ isExcludedWeeks: data.isExcludedWeeks,
+ weeks: data.weeks,
+ typeOfOccupations: data.typeOfOccupations,
+ group: data.group,
+ groupId: data.groupId,
+ lectureHalls: data.lectureHalls,
+ lectureHallsId: data.lectureHallsId,
+ professors: data.professors,
+ professorsId: data.professorsId,
+ campus: data.campus,
+ campusId: data.campusId,
+ linkToMeet: data.linkToMeet
+ }))
+ )
+ )
+ ]
+ );
}
protected async chooseTabs(event: MatTabChangeEvent) {
switch (event.index) {
- case 0:
- await this.facultyLoad();
- break;
- case 1:
- this.professorsLoad();
- break;
- case 2:
- await this.campusLoad();
- break;
- case 3:
- await this.extensionLoad();
- break;
- }
- }
-
- protected async facultyLoad() {
- if (this.facultiesLoaded === null) this.facultiesLoaded = false;
- if (this.facultiesLoaded) return;
-
- this.faculties = this.facultyApi.getFaculties().pipe(
- tap(() => {
- this.facultiesLoaded = true;
- }),
- catchError((error) => {
- this.facultiesLoaded = null;
- throw error;
- })
- );
- }
-
- protected groupLoad(id: number) {
- if (this.groupLoaded === null) this.groupLoaded = false;
-
- if (this.groupLoaded)
- this.groups = this.groupsData.pipe(map(data => data.filter(x => x.facultyId === id)));
- else
- this.groups = this.groupApi.getByFaculty(id).pipe(
- tap(() => {
- this.groupLoaded = false;
- }),
- catchError((error) => {
- this.groupLoaded = null;
- throw error;
- })
- );
- }
-
- protected professorsLoad() {
- if (this.professorsLoaded === null) this.professorsLoaded = false;
-
- if (this.professorsLoaded) return;
-
- this.professorApi.getProfessors().pipe(
- catchError((error) => {
- this.professorsLoaded = null;
- throw error;
- })
- ).subscribe(data => {
- this.professorsData = data;
- this.professorEx.Data = data.map(x =>
- ({
- id: x.id,
- name: x.altName ? x.altName : x.name,
- selected: false
- }));
- });
-
- }
-
- protected async campusLoad() {
- if (this.campusesLoaded === null) this.campusesLoaded = false;
-
- if (this.campusesLoaded) return;
-
- this.campuses = this.campusApi.getCampus().pipe(
- tap(() => {
- this.campusesLoaded = true;
- }),
- catchError((error) => {
- this.campusesLoaded = null;
- throw error;
- })
- );
- }
-
- protected lectureHallLoad(id: number) {
- if (this.lectureHallsLoaded === null) this.lectureHallsLoaded = false;
-
- if (this.lectureHallsLoaded)
- this.lectureHalls = this.lectureHallsData.pipe(map(data => data.filter(x => x.campusId === id)));
- else
- this.lectureHalls = this.lectureHallApi.getByCampus(id).pipe(
- tap(() => {
- this.lectureHallsLoaded = false;
- }),
- catchError((error) => {
- this.lectureHallsLoaded = null;
- throw error;
- })
- );
- }
-
- protected async loadLectureHalls() {
- if (!this.campusesLoaded)
- await this.campusLoad();
-
- if (!this.lectureHallsLoaded) {
- this.lectureHallsData = this.lectureHallApi.getLectureHalls();
- this.lectureHallsData.pipe(
- switchMap(lectureHalls => this.campuses.pipe(
- map(campuses => {
- return lectureHalls.map(x => {
- const campus = campuses.find(c => c.id === x.campusId);
- const codeName = campus ? campus.codeName : '';
- return {
- id: x.id,
- name: `${x.name} (${codeName})`,
- selected: false
- };
- });
- })
- )),
- ).subscribe(data => {
- this.lectureHallEx.Data = data;
- this.lectureHallsLoaded = true;
- this.campusesLoaded = true;
- });
}
}