feat: add a group tab
This commit is contained in:
parent
807dbfc81e
commit
94ca6c66ea
@ -0,0 +1,52 @@
|
||||
<mat-accordion>
|
||||
<mat-expansion-panel expanded>
|
||||
<mat-expansion-panel-header>
|
||||
<mat-panel-title>
|
||||
Факультет
|
||||
</mat-panel-title>
|
||||
</mat-expansion-panel-header>
|
||||
<mat-chip-listbox hideSingleSelectionIndicator (change)="selectedFaculty($event)">
|
||||
@for (faculty of faculties | async; track $index) {
|
||||
<mat-chip-option [value]="faculty.id" color="accent">
|
||||
{{ faculty.name }}
|
||||
</mat-chip-option>
|
||||
} @empty {
|
||||
<app-data-spinner/>
|
||||
}
|
||||
</mat-chip-listbox>
|
||||
</mat-expansion-panel>
|
||||
|
||||
<mat-expansion-panel [disabled]="facultiesId === null" #courseNumberPanel>
|
||||
<mat-expansion-panel-header>
|
||||
<mat-panel-title>
|
||||
Курс
|
||||
</mat-panel-title>
|
||||
</mat-expansion-panel-header>
|
||||
<mat-chip-listbox hideSingleSelectionIndicator (change)="selectCourseNumber($event)" [formControl]="chipCourse">
|
||||
@for (course of courseNumbers | async; track $index) {
|
||||
<mat-chip-option [value]="course" color="accent">
|
||||
{{ course }}
|
||||
</mat-chip-option>
|
||||
} @empty {
|
||||
<app-data-spinner/>
|
||||
}
|
||||
</mat-chip-listbox>
|
||||
</mat-expansion-panel>
|
||||
|
||||
<mat-expansion-panel [disabled]="courseNumber === null" #groupPanel>
|
||||
<mat-expansion-panel-header>
|
||||
<mat-panel-title>
|
||||
Группа
|
||||
</mat-panel-title>
|
||||
</mat-expansion-panel-header>
|
||||
<mat-chip-listbox hideSingleSelectionIndicator (change)="selectGroup($event)" [formControl]="chipGroup">
|
||||
@for (group of filteredGroups | async; track $index) {
|
||||
<mat-chip-option [value]="group.id" color="accent">
|
||||
{{ group.name }}
|
||||
</mat-chip-option>
|
||||
} @empty {
|
||||
<app-data-spinner/>
|
||||
}
|
||||
</mat-chip-listbox>
|
||||
</mat-expansion-panel>
|
||||
</mat-accordion>
|
@ -0,0 +1,88 @@
|
||||
import {Component, EventEmitter, Output, ViewChild} from '@angular/core';
|
||||
import {MatExpansionModule, MatExpansionPanel} from "@angular/material/expansion";
|
||||
import {ApiService} from "@service/api.service";
|
||||
import {DataSpinnerComponent} from "@component/data-spinner/data-spinner.component";
|
||||
import {MatChipListboxChange, MatChipsModule} from '@angular/material/chips';
|
||||
import {FormControl, ReactiveFormsModule} from "@angular/forms";
|
||||
import {AsyncPipe} from "@angular/common";
|
||||
import {map, Observable, of} from "rxjs";
|
||||
import {FacultyResponse} from "@model/facultyResponse";
|
||||
import {GroupResponse} from "@model/groupResponse";
|
||||
|
||||
@Component({
|
||||
selector: 'app-schedule-tabs-group',
|
||||
standalone: true,
|
||||
imports: [
|
||||
MatExpansionModule,
|
||||
DataSpinnerComponent,
|
||||
MatChipsModule,
|
||||
ReactiveFormsModule,
|
||||
AsyncPipe
|
||||
],
|
||||
templateUrl: './schedule-tabs-group.component.html',
|
||||
styleUrl: './schedule-tabs-group.component.css'
|
||||
})
|
||||
export class ScheduleTabsGroupComponent {
|
||||
protected faculties: Observable<FacultyResponse[]>;
|
||||
protected facultiesId: number | null = null;
|
||||
protected courseNumber: number | null = null;
|
||||
protected groups: Observable<GroupResponse[]> = of([]);
|
||||
protected filteredGroups: Observable<GroupResponse[]> = of([]);
|
||||
protected courseNumbers: Observable<number[]> = of([]);
|
||||
|
||||
protected chipCourse: FormControl = new FormControl();
|
||||
protected chipGroup: FormControl = new FormControl();
|
||||
|
||||
@ViewChild('courseNumberPanel') courseNumberPanel!: MatExpansionPanel;
|
||||
@ViewChild('groupPanel') groupPanel!: MatExpansionPanel;
|
||||
|
||||
@Output() groupSelected = new EventEmitter<number>();
|
||||
|
||||
constructor(private api: ApiService) {
|
||||
this.faculties = api.get<FacultyResponse[]>("Faculty/Get");
|
||||
}
|
||||
|
||||
protected selectedFaculty(event: MatChipListboxChange) {
|
||||
this.courseNumber = null;
|
||||
this.groups = of([]);
|
||||
this.chipGroup.reset();
|
||||
this.chipCourse.reset();
|
||||
|
||||
if (event.value === undefined || event.value === null) {
|
||||
this.facultiesId = null;
|
||||
return;
|
||||
}
|
||||
this.facultiesId = event.value;
|
||||
this.courseNumberPanel.open();
|
||||
|
||||
this.groups = this.api.get<GroupResponse[]>("Group/GetByFacultyId/" + this.facultiesId);
|
||||
this.courseNumbers = this.groups.pipe(
|
||||
map(data => data.map(g => g.courseNumber)),
|
||||
map(courseNumbersArray => courseNumbersArray.filter((value, index, self) => self.indexOf(value) === index)),
|
||||
map(uniqueCourseNumbers => uniqueCourseNumbers.sort((a, b) => a - b))
|
||||
);
|
||||
}
|
||||
|
||||
protected selectCourseNumber(event: MatChipListboxChange) {
|
||||
this.filteredGroups = of([]);
|
||||
this.chipGroup.reset();
|
||||
|
||||
if (event.value === undefined || event.value === null) {
|
||||
this.courseNumber = null;
|
||||
return;
|
||||
}
|
||||
|
||||
this.courseNumber = event.value;
|
||||
this.groupPanel.open();
|
||||
this.groups.subscribe(data =>
|
||||
this.filteredGroups = of(data.filter(g => g.courseNumber === this.courseNumber)));
|
||||
}
|
||||
|
||||
protected selectGroup(event: MatChipListboxChange) {
|
||||
if (event.value === undefined || event.value === null)
|
||||
return;
|
||||
|
||||
this.groupPanel.close();
|
||||
this.groupSelected.emit(event.value);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user