diff --git a/src/main/webapp/src/app/app.module.ts b/src/main/webapp/src/app/app.module.ts
index 6a2b6a9..ca10b74 100644
--- a/src/main/webapp/src/app/app.module.ts
+++ b/src/main/webapp/src/app/app.module.ts
@@ -17,6 +17,9 @@ import {ReactiveFormsModule} from "@angular/forms";
import {MatInputModule} from "@angular/material/input";
import {MatDialog, MatDialogModule} from "@angular/material/dialog";
import { GroupFormComponent } from './component/form/group-form/group-form.component';
+import { PersonSelectorComponent } from './component/selector/person-selector/person-selector.component';
+import { PersonListControlValueAccessorComponent } from './component/controlValueAccessor/person-list-control-value-accessor/person-list-control-value-accessor.component';
+import { ImportExportComponent } from './component/import-export/import-export.component';
@NgModule({
declarations: [
@@ -24,7 +27,10 @@ import { GroupFormComponent } from './component/form/group-form/group-form.compo
PersonListComponent,
GroupListComponent,
PersonFromComponent,
- GroupFormComponent
+ GroupFormComponent,
+ PersonSelectorComponent,
+ PersonListControlValueAccessorComponent,
+ ImportExportComponent
],
imports: [
BrowserModule,
diff --git a/src/main/webapp/src/app/component/controlValueAccessor/person-list-control-value-accessor/person-list-control-value-accessor.component.html b/src/main/webapp/src/app/component/controlValueAccessor/person-list-control-value-accessor/person-list-control-value-accessor.component.html
new file mode 100644
index 0000000..1ffa13d
--- /dev/null
+++ b/src/main/webapp/src/app/component/controlValueAccessor/person-list-control-value-accessor/person-list-control-value-accessor.component.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+ L.p. |
+ {{getElementNumber(element)}} |
+
+
+
+ Id |
+ {{element.id}} |
+
+
+
+ Imię |
+ {{element.name}} |
+
+
+
+ Nazwisko |
+ {{element.surname}} |
+
+
+
+ Indeks |
+ {{element?.student?.index}} |
+
+
+
+ Usuń |
+
+
+ |
+
+
+
+
+
+
diff --git a/src/main/webapp/src/app/component/controlValueAccessor/person-list-control-value-accessor/person-list-control-value-accessor.component.sass b/src/main/webapp/src/app/component/controlValueAccessor/person-list-control-value-accessor/person-list-control-value-accessor.component.sass
new file mode 100644
index 0000000..e69de29
diff --git a/src/main/webapp/src/app/component/controlValueAccessor/person-list-control-value-accessor/person-list-control-value-accessor.component.spec.ts b/src/main/webapp/src/app/component/controlValueAccessor/person-list-control-value-accessor/person-list-control-value-accessor.component.spec.ts
new file mode 100644
index 0000000..ee2e313
--- /dev/null
+++ b/src/main/webapp/src/app/component/controlValueAccessor/person-list-control-value-accessor/person-list-control-value-accessor.component.spec.ts
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { PersonListControlValueAccessorComponent } from './person-list-control-value-accessor.component';
+
+describe('PersonListControlValueAccessorComponent', () => {
+ let component: PersonListControlValueAccessorComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ declarations: [ PersonListControlValueAccessorComponent ]
+ })
+ .compileComponents();
+
+ fixture = TestBed.createComponent(PersonListControlValueAccessorComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/main/webapp/src/app/component/controlValueAccessor/person-list-control-value-accessor/person-list-control-value-accessor.component.ts b/src/main/webapp/src/app/component/controlValueAccessor/person-list-control-value-accessor/person-list-control-value-accessor.component.ts
new file mode 100644
index 0000000..c4b829e
--- /dev/null
+++ b/src/main/webapp/src/app/component/controlValueAccessor/person-list-control-value-accessor/person-list-control-value-accessor.component.ts
@@ -0,0 +1,85 @@
+import { Component } from '@angular/core';
+import {Person} from "../../../model/person";
+import {MatDialog} from "@angular/material/dialog";
+import {tap} from "rxjs";
+import {MatTableDataSource} from "@angular/material/table";
+import {PersonSelectorComponent} from "../../selector/person-selector/person-selector.component";
+import {ControlValueAccessor, NG_VALUE_ACCESSOR} from "@angular/forms";
+
+@Component({
+ selector: 'app-person-list-control-value-accessor',
+ templateUrl: './person-list-control-value-accessor.component.html',
+ styleUrls: ['./person-list-control-value-accessor.component.sass'],
+ providers: [
+ {
+ provide: NG_VALUE_ACCESSOR,
+ multi: true,
+ useExisting: PersonListControlValueAccessorComponent
+ }
+ ]
+})
+export class PersonListControlValueAccessorComponent implements ControlValueAccessor{
+
+ disabled = false;
+ dataSource: MatTableDataSource;
+ displayedColumns: Map = new Map([
+ ['lp', true],
+ ['id', true],
+ ['name', true],
+ ['surname', true],
+ ['index', true],
+ ['delete', true],
+ ]);
+
+ constructor(
+ private dialog: MatDialog
+ ) {
+ this.dataSource = new MatTableDataSource()
+ }
+
+ writeValue(people: Person[]): void {
+ this.dataSource.data = people;
+ }
+ registerOnChange(fn: (people: Person[] | null) => void): void {
+ this.onChange = fn;
+ }
+ registerOnTouched(fn: any): void {
+ this.onTouched = fn;
+ }
+ setDisabledState?(isDisabled: boolean): void {
+ this.disabled = isDisabled;
+ }
+
+ onChange = (people: Person[] | null) => {
+ }
+
+ onTouched = () => {
+ }
+
+ openSelectorDialog() {
+ const dialogRef = this.dialog.open(PersonSelectorComponent);
+ dialogRef.afterClosed().pipe(
+ tap(person => {
+ if (person != null) {
+ this.dataSource.data = [...this.dataSource.data, person];
+ this.onChange(this.dataSource.data);
+ }
+ })
+ ).subscribe()
+ }
+
+ deletePerson(id: number) {
+ this.dataSource.data = this.dataSource.data.filter(person => person.id !== id);
+ this.onChange(this.dataSource.data);
+ }
+
+ getDisplayedColumns(): string[] {
+ return [...this.displayedColumns.entries()]
+ .filter(column => column[1])
+ .map(column => column[0]);
+ }
+
+ getElementNumber(t: Person): number {
+ return (this.dataSource.data?.indexOf(t) ?? 0)+1;
+ }
+}