diff --git a/README.md b/README.md index 1f01a3f88..46aeb8340 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ SWT2 - Bogenliga Application - Angular Oberfläche Ein Beispiel ist unter [GitHub Demo Seite](https://exxcellent.github.io/swt2-bsa-frontend/) verfügbar. -## Einstiegg +## Einstieg Zum Starten der Anwendung führe folgede Befehle aus: diff --git a/bogenliga/src/app/modules/sportjahresplan/components/schusszettel/schusszettel.component.ts b/bogenliga/src/app/modules/sportjahresplan/components/schusszettel/schusszettel.component.ts index f92a5106d..ba82702b6 100644 --- a/bogenliga/src/app/modules/sportjahresplan/components/schusszettel/schusszettel.component.ts +++ b/bogenliga/src/app/modules/sportjahresplan/components/schusszettel/schusszettel.component.ts @@ -211,45 +211,42 @@ export class SchusszettelComponent implements OnInit { this.dirtyFlag = true; // Daten geändert } - onSchuetzeChange(value: string, matchNr: number, rueckennummer: number){ - var mannschaftId = matchNr == 1 ? this.match1.mannschaftId : this.match2.mannschaftId; + async onSchuetzeChange(value: string, matchNr: number, rueckennummer: number){ + const mannschaftId = matchNr == 1 ? this.match1.mannschaftId : this.match2.mannschaftId; - this.mannschaftsMitgliedDataProvider.findByTeamIdAndRueckennummer(mannschaftId, value).then(result => { - if(result.result == RequestResult.SUCCESS){ - console.log(result.payload.dsbMitgliedId); + let valid = true; + let allowed = []; + let mitglied = null; - let dsbNummer = result.payload.dsbMitgliedId; - let allowed = []; + try { + mitglied = await this.mannschaftsMitgliedDataProvider.findByTeamIdAndRueckennummer(mannschaftId, value); + }catch (e){ + valid = false; + } - if(matchNr == 1){ - allowed = this.allowedMitglieder1; - } - else{ - allowed = this.allowedMitglieder2; - } + if(mitglied != null && mitglied.result == RequestResult.SUCCESS) { + let dsbNummer = mitglied.payload.dsbMitgliedId; + console.log('DsbNummer for Mannschaftsmitglied in Mannschaft ' + + mannschaftId + " and Rueckennummer " + value + " is " + dsbNummer); - if(!allowed.includes(dsbNummer)){ - this.match1.schuetzen.forEach(val => { - console.log('Checking ',val); - if(allowed.includes(val[0].dsbMitgliedId)){ - console.log(val[0].rueckennummer + " is valid"); - } - }); + allowed = matchNr == 1 ? this.allowedMitglieder1 : this.allowedMitglieder2; - this.notificationService.showNotification({ - id: 'NOTIFICATION_SCHUSSZETTEL_SCHUETZENNUMMER', - title: 'SPORTJAHRESPLAN.SCHUSSZETTEL.NOTIFICATION.SCHUETZENNUMMER.TITLE', - description: 'SPORTJAHRESPLAN.SCHUSSZETTEL.NOTIFICATION.SCHUETZENNUMMER.DESCRIPTION', - severity: NotificationSeverity.ERROR, - origin: NotificationOrigin.SYSTEM, - type: NotificationType.OK, - userAction: NotificationUserAction.ACCEPTED - }); - } - }else{ - console.log('Error'); + if (!allowed.includes(dsbNummer)) { + valid = false; } - }); + } + + if(!valid){ + this.notificationService.showNotification({ + id: 'NOTIFICATION_SCHUSSZETTEL_SCHUETZENNUMMER', + title: 'SPORTJAHRESPLAN.SCHUSSZETTEL.NOTIFICATION.SCHUETZENNUMMER.TITLE', + description: 'SPORTJAHRESPLAN.SCHUSSZETTEL.NOTIFICATION.SCHUETZENNUMMER.DESCRIPTION', + severity: NotificationSeverity.ERROR, + origin: NotificationOrigin.SYSTEM, + type: NotificationType.OK, + userAction: NotificationUserAction.ACCEPTED + }); + } } onFehlerpunkteChange(value: string, matchNr: number, satzNr: number) { @@ -401,6 +398,7 @@ export class SchusszettelComponent implements OnInit { this.getBereitsgeschossenToCheckSchuetze(); // Kontrolle, ob die die Regeln eingehalten wurden + /* for (let i = 0; i < this.matchAllPasse.length; i++) { // Hat der Schütze 2x in einer Liga geschossen -> darf er nicht mehr in einer Liga darunter schießen @@ -421,7 +419,7 @@ export class SchusszettelComponent implements OnInit { console.log('Popup: ', this.passeSelberTag, 'hat bereits diesen Wettkampftag in der', this.selberTagVeranstaltung, 'geschossen'); this.savepopSelberTag(); } - } + }*/ } savepopSelberTag() { diff --git a/bogenliga/src/app/modules/user/components/user-pwd/user-pwd.component.html b/bogenliga/src/app/modules/user/components/user-pwd/user-pwd.component.html index 8d2e70c21..193fb7626 100644 --- a/bogenliga/src/app/modules/user/components/user-pwd/user-pwd.component.html +++ b/bogenliga/src/app/modules/user/components/user-pwd/user-pwd.component.html @@ -58,8 +58,7 @@ *
- - -
{{ 'MANAGEMENT.DSBMITGLIEDER_DETAIL.FORM.VEREIN.ERROR' | translate }}
+
diff --git a/bogenliga/src/app/modules/verwaltung/components/veranstaltung/veranstaltung-detail/veranstaltung-detail.component.ts b/bogenliga/src/app/modules/verwaltung/components/veranstaltung/veranstaltung-detail/veranstaltung-detail.component.ts index 87dcea1f7..25b527723 100644 --- a/bogenliga/src/app/modules/verwaltung/components/veranstaltung/veranstaltung-detail/veranstaltung-detail.component.ts +++ b/bogenliga/src/app/modules/verwaltung/components/veranstaltung/veranstaltung-detail/veranstaltung-detail.component.ts @@ -1,6 +1,12 @@ import {Component, OnInit} from '@angular/core'; import {ActivatedRoute, Router} from '@angular/router'; -import {AlertType, ButtonType, CommonComponentDirective, toTableRows} from '@shared/components'; +import { + AlertType, + ButtonType, + CommonComponentDirective, hideLoadingIndicator, + showDeleteLoadingIndicatorIcon, + toTableRows +} from '@shared/components'; import {BogenligaResponse} from '@shared/data-provider'; import {isNullOrUndefined, isUndefined} from '@shared/functions'; import { @@ -12,6 +18,7 @@ import { NotificationUserAction } from '../../../../shared/services/notification'; import {UserProfileDataProviderService} from '../../../../user/services/user-profile-data-provider.service'; +import {UserDataProviderService} from '../../../services/user-data-provider.service'; import {UserProfileDTO} from '../../../../user/types/model/user-profile-dto.class'; import {UserProfileDO} from '../../../../user/types/user-profile-do.class'; import {VeranstaltungDataProviderService} from '../../../services/veranstaltung-data-provider.service'; @@ -37,17 +44,22 @@ import {MannschaftSortierungDO} from '@verwaltung/types/mannschaftSortierung-do. import {MatchDataProviderService} from '@verwaltung/services/match-data-provider.service'; import {WettkampfKlasseDO} from '@verwaltung/types/wettkampfklasse-do.class'; import {TableActionType} from '@shared/components/tables/types/table-action-type.enum'; +import {UserRolleDO} from '@verwaltung/types/user-rolle-do.class'; +import {UserRolleDTO} from '@verwaltung/types/datatransfer/user-rolle-dto.class'; + const ID_PATH_PARAM = 'id'; const NOTIFICATION_DELETE_VERANSTALTUNG = 'veranstaltung_detail_delete'; const NOTIFICATION_DELETE_VERANSTALTUNG_SUCCESS = 'veranstaltung_detail_delete_success'; const NOTIFICATION_DELETE_VERANSTALTUNG_FAILURE = 'veranstaltung_detail_delete_failure'; const NOTIFICATION_SAVE_VERANSTALTUNG = 'veranstaltung_detail_save'; +const NOTIFICATION_SAVE_VERANSTALTUNG_FAILURE = 'veranstaltung_detail_save_failure'; const NOTIFICATION_UPDATE_VERANSTALTUNG = 'veranstaltung_detail_update'; const NOTIFICATION_SAVE_SORTIERUNG = 'veranstaltung_detail_save_sortierung'; const NOTIFICATION_INIT_LIGATABELLE_SUC = 'init_Ligatabelle_suc'; const NOTIFICATION_INIT_LIGATABELLE_FAIL = 'init_Ligatabelle_fail'; const NOTIFICATION_COPY_MANNSCHAFTEN_FAILURE = 'veranstaltung_detail_copy_failure'; +const NOTIFICATION_DELETE_MANNSCHAFT = 'mannschaft_detail_delete'; @Component({ @@ -55,7 +67,11 @@ const NOTIFICATION_COPY_MANNSCHAFTEN_FAILURE = 'veranstaltung_detail_copy_failur templateUrl: './veranstaltung-detail.component.html', styleUrls: ['./veranstaltung-detail.component.scss'] }) + + + export class VeranstaltungDetailComponent extends CommonComponentDirective implements OnInit { + public config = VERANSTALTUNG_DETAIL_CONFIG; public tableConfig = VERANSTALTUNG_DETAIL_TABLE_Config; public ButtonType = ButtonType; @@ -64,7 +80,6 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple public allVeranstaltung: Array = [new VeranstaltungDO()]; public lastVeranstaltung: VeranstaltungDO = new VeranstaltungDO(); - public currentLiga: LigaDO = new LigaDO(); public allLiga: Array = [new LigaDO()]; @@ -75,11 +90,9 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple public allDsbMannschaft: Array = [new DsbMannschaftDO()]; public testMannschaft: DsbMannschaftDO = new DsbMannschaftDO(); - - public currentUser: UserProfileDO = new UserProfileDO(); public allUsers: Array = [new UserProfileDO()]; - + public allLigaleiter: Array = [new UserRolleDO()]; public deleteLoading = false; public saveLoading = false; @@ -97,11 +110,13 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple public currentLigatabelle: Array; + constructor( private veranstaltungDataProvider: VeranstaltungDataProviderService, private wettkampftypDataProvider: WettkampftypDataProviderService, private regionProvider: RegionDataProviderService, private userProvider: UserProfileDataProviderService, + private userDataProvider: UserDataProviderService, private ligaProvider: LigaDataProviderService, private mannschaftDataProvider: DsbMannschaftDataProviderService, private router: Router, @@ -113,8 +128,8 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple super(); } - ngOnInit() { + ngOnInit() { this.loading = true; this.notificationService.discardNotification(); this.route.params.subscribe((params) => { @@ -128,6 +143,7 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple this.loadUsers(); + this.loadLigaleiter(); this.loadWettkampftyp(); this.loadLiga(); @@ -144,18 +160,20 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple }); } + public onWettkampftag(ignore: any): void { this.navigateToWettkampftage(this.currentVeranstaltung); } + private navigateToWettkampftage(ignore: any) { this.router.navigateByUrl('/verwaltung/veranstaltung/' + this.currentVeranstaltung.id + '/' + this.currentVeranstaltung.id); } + public onSave(ignore: any): void { this.saveLoading = true; - if (typeof this.currentLiga === 'undefined') { this.currentVeranstaltung.ligaId = null; } else { @@ -173,7 +191,6 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple } else { this.currentVeranstaltung.wettkampfTypId = this.currentWettkampftyp.id; this.currentVeranstaltung.wettkampftypName = this.currentWettkampftyp.name; - } // persist @@ -204,18 +221,34 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple this.notificationService.showNotification(notification); } - }, (response: BogenligaResponse) => { - console.log('Failed'); - this.saveLoading = false; + } + ) + .catch((response)=> { + console.log('Veranstaltung existiert bereits in diesem Sportjahr'); + const notification: Notification = { + id: NOTIFICATION_SAVE_VERANSTALTUNG_FAILURE, + title: 'MANAGEMENT.VERANSTALTUNG_DETAIL.NOTIFICATION.SAVE_FAILURE.TITLE', + description: 'MANAGEMENT.VERANSTALTUNG_DETAIL.NOTIFICATION.SAVE_FAILURE.DESCRIPTION', + severity: NotificationSeverity.ERROR, + origin: NotificationOrigin.USER, + type: NotificationType.OK, + userAction: NotificationUserAction.PENDING + }; + this.notificationService.observeNotification(NOTIFICATION_SAVE_VERANSTALTUNG_FAILURE) + .subscribe((myNotification) => { + if (myNotification.userAction === NotificationUserAction.ACCEPTED) { + this.saveLoading = false; + } + }); + this.notificationService.showNotification(notification); }); - - // show response message } - //Gets executed when button "Mannschaft kopieren" is pressed + + // Gets executed when button "Mannschaft kopieren" is pressed public onCopyMannschaft(ignore: any): void { this.saveLoading = true; this.veranstaltungDataProvider.findLastVeranstaltungById(this.currentVeranstaltung.id) @@ -253,7 +286,6 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple } - public onUpdate(ignore: any): void { this.saveLoading = true; this.currentVeranstaltung.ligaId = this.currentLiga.id; @@ -296,11 +328,10 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple }); } + /** * Deletes all Wettkampftag entries of the provided VeranstaltungID */ - - public onDelete(ignore: any): void { this.deleteLoading = true; this.notificationService.discardNotification(); @@ -329,14 +360,15 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple this.deleteLoading = false; } }); - this.notificationService.showNotification(notification); } + public entityExists(): boolean { return this.currentVeranstaltung.id >= 0; } + public mannschaftExists(): boolean { return this.allDsbMannschaft.filter((veranstaltung) => veranstaltung.id === this.currentVeranstaltung.id).length > 0; } @@ -348,45 +380,61 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple .catch((response: BogenligaResponse) => this.handleFailure(response)); } + private loadUsers() { this.userProvider.findAll() .then((response: BogenligaResponse) => this.handleUserResponseArraySuccess(response)) .catch((response: BogenligaResponse) => this.handleUserResponseArrayFailure(response)); + } + + /** + * receives a promise including a list of all Ligaleiter + * @private + */ + private loadLigaleiter() { + let ligaleiterRolleId = 2; + this.userDataProvider.findAllUsersByRoleId(ligaleiterRolleId) + .then((response: BogenligaResponse) => this.handleLigaleiterResponseArraySuccess(response)) + .catch((response: BogenligaResponse) => this.handleLigaleiterResponseArrayFailure(response)); } + private loadLiga() { this.ligaProvider.findAll() .then((response: BogenligaResponse) => this.handlLigaResponseArraySuccess(response)) .catch((response: BogenligaResponse) => this.handleLigaResponseArrayFailure(response)); - } + private loadWettkampftyp() { this.wettkampftypDataProvider.findAll() .then((response: BogenligaResponse) => this.handleWettkampftypResponseArraySuccess(response)) .catch((response: BogenligaResponse) => this.handleWettkampftypResponseArrayFailure(response)); - } + private handleSuccess(response: BogenligaResponse) { this.currentVeranstaltung = response.payload; this.loading = false; this.loadWettkampftyp(); this.loadUsers(); + this.loadLigaleiter() this.loadLiga(); } + private handleFailure(response: BogenligaResponse) { this.loading = false; } + private handleCopyFromVeranstaltungSuccess(response: BogenligaResponse) { this.loadMannschaftsTable(); } - private handleDeleteSuccess(response: BogenligaResponse): void { + private handleDeleteSuccess(response: BogenligaResponse): void { const notification: Notification = { id: NOTIFICATION_DELETE_VERANSTALTUNG_SUCCESS, title: 'MANAGEMENT.VERANSTALTUNG_DETAIL.NOTIFICATION.DELETE_SUCCESS.TITLE', @@ -408,8 +456,8 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple this.notificationService.showNotification(notification); } - private handleDeleteFailure(response: BogenligaResponse): void { + private handleDeleteFailure(response: BogenligaResponse): void { const notification: Notification = { id: NOTIFICATION_DELETE_VERANSTALTUNG_FAILURE, title: 'MANAGEMENT.VERANSTALTUNG_DETAIL.NOTIFICATION.DELETE_FAILURE.TITLE', @@ -430,6 +478,7 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple this.notificationService.showNotification(notification); } + private handlLigaResponseArraySuccess(response: BogenligaResponse): void { this.allLiga = []; this.allLiga = response.payload; @@ -441,11 +490,13 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple this.loading = false; } + private handleLigaResponseArrayFailure(response: BogenligaResponse): void { this.allLiga = []; this.loading = false; } + private handleWettkampftypResponseArraySuccess(response: BogenligaResponse): void { this.allWettkampftyp = []; this.allWettkampftyp = response.payload; @@ -457,11 +508,13 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple this.loading = false; } + private handleWettkampftypResponseArrayFailure(response: BogenligaResponse): void { this.allWettkampftyp = []; this.loading = false; } + private handleUserResponseArraySuccess(response: BogenligaResponse): void { this.allUsers = []; this.allUsers = response.payload; @@ -473,11 +526,27 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple this.loading = false; } + private handleUserResponseArrayFailure(response: BogenligaResponse): void { this.allUsers = []; this.loading = false; } + + private handleLigaleiterResponseArraySuccess(response: BogenligaResponse): void { + this.allLigaleiter = []; + this.allLigaleiter = response.payload; + + this.loading = false; + } + + + private handleLigaleiterResponseArrayFailure(response: BogenligaResponse): void { + this.allLigaleiter = []; + this.loading = false; + } + + /** * Checks if current Table is empty * If not button which uses copyMannschaftFromVeranstaltung will be greyed out @@ -490,17 +559,55 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple return empty; } + private loadMannschaftsTable() { this.mannschaftDataProvider.findAllByVeranstaltungsId(this.id) .then((response: BogenligaResponse) => this.handleLoadMannschaftsTableSuccess(response.payload)) .catch((response: BogenligaResponse) => this.rows = []); } + private handleLoadMannschaftsTableSuccess(payload: DsbMannschaftDO[]) { this.rows = toTableRows(payload); this.loadLigaTabelleExists(); } + public onDeleteMannschaft(versionedDataObject: VersionedDataObject): void { + + this.notificationService.discardNotification(); + + const id = versionedDataObject.id; + this.rows = showDeleteLoadingIndicatorIcon(this.rows, id); + + const notification: Notification = { + id: NOTIFICATION_DELETE_MANNSCHAFT + id, + title: 'MANAGEMENT.MANNSCHAFT_DETAIL.NOTIFICATION.DELETE.TITLE', + description: 'MANAGEMENT.MANNSCHAFT_DETAIL.NOTIFICATION.DELETE.DESCRIPTION', + descriptionParam: '' + id, + severity: NotificationSeverity.QUESTION, + origin: NotificationOrigin.USER, + type: NotificationType.YES_NO, + userAction: NotificationUserAction.PENDING + }; + + let notificationEvent = this.notificationService.observeNotification(NOTIFICATION_DELETE_MANNSCHAFT + id) + .subscribe((myNotification) => { + + if (myNotification.userAction === NotificationUserAction.ACCEPTED) { + this.mannschaftDataProvider.deleteById(id) + .then((response) => this.loadMannschaftsTable()) + .catch((response) => this.rows = hideLoadingIndicator(this.rows, id)); + } else if (myNotification.userAction === NotificationUserAction.DECLINED) { + this.rows = hideLoadingIndicator(this.rows, id); + notificationEvent.unsubscribe(); + } + + }); + + this.notificationService.showNotification(notification); + } + + public onEdit(versionedDataObject: VersionedDataObject) { this.selectedMannschaft = versionedDataObject as DsbMannschaftDO; @@ -508,11 +615,13 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple this.showPopup = true; } + public onTableEditCancel( event: any) { this.selectedMannschaft.sortierung = this.oldSortierung; this.showPopup = false; } + public onTableEditSave(event: any) { const maSortierung = new MannschaftSortierungDO( this.selectedMannschaft.id, this.selectedMannschaft.sortierung); @@ -523,8 +632,8 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple this.loading = false; } - private handleTableSaveSuccess() { + private handleTableSaveSuccess() { const notification: Notification = { id: NOTIFICATION_SAVE_SORTIERUNG, title: 'MANAGEMENT.VERANSTALTUNG_DETAIL.TABLE.NOTIFICATION.SAVE.TITLE', @@ -552,22 +661,26 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple this.loadMannschaftsTable(); } + public checkForExistingLigatabelle(): boolean { return this.currentLigatabelle !== undefined; } + private loadLigaTabelleExists() { this.ligatabellenService.getLigatabelleVeranstaltung(this.id) .then((response: BogenligaResponse) => response.payload.length >= 4 ? this.handleLigatabelleExistsSuccess(response) : this.handleLigatabelleExistsFailure()) .catch(() => this.handleLigatabelleExistsFailure()) } + private handleLigatabelleExistsFailure() { console.log("Initiale Ligatabelle does not yet exist"); this.currentLigatabelle = undefined; this.saveLoading = false; } + private handleLigatabelleExistsSuccess(response: BogenligaResponse) { try { this.currentLigatabelle = response.payload; @@ -582,12 +695,14 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple } } + public createMatchesWT0(event: any) { this.matchDataProvider.createInitialMatchesWT0(this.currentVeranstaltung) .then(() => this.handleCreateMatchesWT0Success()) .catch(() => this.handleCreateMatchesWT0Failure()); } + private handleCreateMatchesWT0Success() { const notification: Notification = { id: NOTIFICATION_INIT_LIGATABELLE_SUC, @@ -610,6 +725,7 @@ export class VeranstaltungDetailComponent extends CommonComponentDirective imple this.loadLigaTabelleExists(); } + private handleCreateMatchesWT0Failure() { const notification: Notification = { id: NOTIFICATION_INIT_LIGATABELLE_FAIL, diff --git a/bogenliga/src/app/modules/verwaltung/components/veranstaltung/veranstaltung-detail/wettkampftage/wettkampftage.component.html b/bogenliga/src/app/modules/verwaltung/components/veranstaltung/veranstaltung-detail/wettkampftage/wettkampftage.component.html index a3f35249c..2cda8ff54 100644 --- a/bogenliga/src/app/modules/verwaltung/components/veranstaltung/veranstaltung-detail/wettkampftage/wettkampftage.component.html +++ b/bogenliga/src/app/modules/verwaltung/components/veranstaltung/veranstaltung-detail/wettkampftage/wettkampftage.component.html @@ -37,10 +37,20 @@ [optionFieldSelector]="'wettkampfTag'"> - +
+ + + + {{ 'MANAGEMENT.VERANSTALTUNG_DETAIL.FORM.WETTKAMPFTAG.NOTIFICATION.COPY.TITLE' | translate }} + + +
- +

{{ 'MANAGEMENT.VERANSTALTUNG_DETAIL.FORM.WETTKAMPFTAG.FORM.REMINDSAVE' | translate }}

@@ -101,6 +111,7 @@ -
+ +
+
- @@ -235,7 +250,21 @@
- + +
+
+
+ + + + {{ 'MANAGEMENT.VERANSTALTUNG_DETAIL.FORM.WETTKAMPFTAG.NOTIFICATION.DELETE.TITLE' | translate }} + +
+
+
diff --git a/bogenliga/src/app/modules/verwaltung/components/veranstaltung/veranstaltung-detail/wettkampftage/wettkampftage.component.ts b/bogenliga/src/app/modules/verwaltung/components/veranstaltung/veranstaltung-detail/wettkampftage/wettkampftage.component.ts index 21727a5aa..c8c188e34 100644 --- a/bogenliga/src/app/modules/verwaltung/components/veranstaltung/veranstaltung-detail/wettkampftage/wettkampftage.component.ts +++ b/bogenliga/src/app/modules/verwaltung/components/veranstaltung/veranstaltung-detail/wettkampftage/wettkampftage.component.ts @@ -44,12 +44,15 @@ import {SportjahrVeranstaltungDTO} from '@verwaltung/types/datatransfer/sportjah import {VeranstaltungDTO} from '@verwaltung/types/datatransfer/veranstaltung-dto.class'; import {EinstellungenProviderService} from '@verwaltung/services/einstellungen-data-provider.service'; import {EinstellungenDO} from '@verwaltung/types/einstellungen-do.class'; +import {RoleDTO} from '@verwaltung/types/datatransfer/role-dto.class'; +import {KampfrichterExtendedDO} from '@verwaltung/types/kampfrichter-extended-do.class'; +import {kampfrichterExtendedDTO} from '@verwaltung/types/datatransfer/kampfrichter-extended-dto.class'; const ID_PATH_PARAM = 'id'; -const NOTIFICATION_DELETE_VERANSTALTUNG = 'veranstaltung_detail_delete'; -const NOTIFICATION_DELETE_VERANSTALTUNG_SUCCESS = 'veranstaltung_detail_delete_success'; -const NOTIFICATION_DELETE_VERANSTALTUNG_FAILURE = 'veranstaltung_detail_delete_failure'; +const NOTIFICATION_DELETE_WETTKAMPFTAG = 'wettkampftag_delete'; +const NOTIFICATION_DELETE_WETTKAMPFTAG_SUCCESS = 'wettkampftag_delete_success'; +const NOTIFICATION_DELETE_WETTKAMPFTAG_FAILURE = 'wettkampftag_delete_failure'; const NOTIFICATION_SAVE_VERANSTALTUNG = 'veranstaltung_detail_save'; const NOTIFICATION_UPDATE_VERANSTALTUNG = 'veranstaltung_detail_update'; const NOTIFICATION_WETTKAMPFTAG_TOO_MANY = 'veranstaltung_detail_wettkampftage_failure'; @@ -64,7 +67,6 @@ const wettkampfTagNotification: Notification = { userAction: NotificationUserAction.PENDING }; - // TODO: die Variable valid zur Steuerung disabled (SaveButton) ist global, ohne Funktion und unterscheidet nicht den // Status der Eingabefelder @@ -81,8 +83,6 @@ export class WettkampftageComponent extends CommonComponentDirective implements public currentVeranstaltung: VeranstaltungDO = new VeranstaltungDO(); public currentUser: UserProfileDO; public rows: TableRow[]; - private selectedVeranstaltungsId: number; - public currentWettkampftagDO: WettkampfDO; public currentWettkampftag: WettkampfDO = new WettkampfDO(); public currentWettkampftagArray: Array = []; @@ -98,10 +98,11 @@ export class WettkampftageComponent extends CommonComponentDirective implements public allDsbMitgliederWithKampfrichterLizenz: Array = []; public allUserWithKampfrichterLizenz: Array = []; - public kampfrichterTag: Array> = []; - public initiallySelectedKampfrichterTag: Array> = []; - public selectedKampfrichterTag: Array> = []; - public notSelectedKampfrichterWettkampfTag: Array> = []; + public notSelectedKampfrichter: Array> = []; + public selectedKampfrichter: Array> = []; + + public selectedKampfrichterBeforeSave: Array> = []; + public notSelectedKampfrichterBeforeSave: Array> = []; text = '. Wettkampftag'; @@ -111,6 +112,7 @@ export class WettkampftageComponent extends CommonComponentDirective implements public anzahl: number = 0; public maxWettkampftageEinstellungenDO: EinstellungenDO = new EinstellungenDO(); public maxWettkampftageID: number = 8; + public selectedWettkampf: WettkampfDO; constructor( private veranstaltungDataProvider: VeranstaltungDataProviderService, @@ -165,12 +167,12 @@ export class WettkampftageComponent extends CommonComponentDirective implements .catch((response: BogenligaResponse) => this.handleUserResponseArrayFailure(response)); } - private handleUserResponseArraySuccess(response: BogenligaResponse): void{ + private handleUserResponseArraySuccess(response: BogenligaResponse): void { console.log('==> HandleUserResponseArraySuccess'); this.allUsers = []; this.allUsers = response.payload; - for(let i=1;i<=this.allUsers.length; i++){ + for (let i = 1; i <= this.allUsers.length; i++) { this.currentAusrichter[i] = this.allUsers.filter((user) => user.id === this.currentWettkampftagArray[this.selectedWettkampfTag].wettkampfAusrichter)[0] ?? this.allUsers[0]; } this.loading = false; @@ -189,14 +191,15 @@ export class WettkampftageComponent extends CommonComponentDirective implements this.saveWettkaempfe(wettkampfTagNumber).then((wettkampfID) => this.updateKampfrichter(wettkampfTagNumber, wettkampfID)); } - public async saveWettkaempfe(wettkampfTagNumber: number): Promise{ + public async saveWettkaempfe(wettkampfTagNumber: number): Promise { this.anzahl++; - this.currentWettkampftagArray.push(new WettkampfDO()); - this.currentAusrichter.push(new UserProfileDO()); let currentWettkampfTag: WettkampfDO; let currentAusrichter: UserProfileDO; + this.loadWettkampf(); + this.currentWettkampftagArray.forEach(element => {if(element.wettkampfTag == wettkampfTagNumber){currentWettkampfTag = element;}}); + currentWettkampfTag = this.currentWettkampftagArray[wettkampfTagNumber]; currentAusrichter = this.currentAusrichter[wettkampfTagNumber]; currentWettkampfTag.wettkampfTag = wettkampfTagNumber; @@ -216,41 +219,50 @@ export class WettkampftageComponent extends CommonComponentDirective implements return currentWettkampfTag.id; } - //Method adds new Wettkampftag ->called by "hinzufügen"-Button - public onAddWettkampfTag(ignore: any): void { + //Method adds new Wettkampftag -> called by "+Neu"-Button + public async onAddWettkampfTag(ignore: any): Promise { this.currentWettkampftagArray.push(new WettkampfDO()); - this.createInitWettkampfTag((this.anzahl) +1); this.loadDistinctWettkampf(); - this.loadWettkampf(); + await this.createInitWettkampfTag((this.anzahl) + 1); + this.loadDistinctWettkampf(); + } + //Method copys current Wettkampftag -> called by "Kopieren"-Button + public async onCopyWettkampfTag(ignore: any): Promise { + this.currentWettkampftagArray.push(new WettkampfDO()); + this.loadDistinctWettkampf(); + await this.copyCurrentWettkampfTag((this.anzahl) + 1); + this.loadDistinctWettkampf(); } - public updateKampfrichter(wettkampfTagNumber: number, wettkampfID: number): void{ + public updateKampfrichter(wettkampfTagNumber: number, wettkampfID: number): void { - let currentWettkampftag: WettkampfDO; - let kampfrichterUserToSave: Array = []; - let kampfrichterUserToDelete: Array = []; + let kampfrichterExtendedToSave: Array = []; + let kampfrichterExtendedToDelete: Array = []; - currentWettkampftag = this.currentWettkampftagArray[wettkampfTagNumber]; - kampfrichterUserToSave = this.selectedKampfrichterTag[wettkampfTagNumber].filter(comparer(this.initiallySelectedKampfrichterTag[wettkampfTagNumber])); - kampfrichterUserToDelete = this.initiallySelectedKampfrichterTag[wettkampfTagNumber].filter(comparer(this.selectedKampfrichterTag[wettkampfTagNumber])); + kampfrichterExtendedToSave = this.selectedKampfrichter[wettkampfTagNumber].filter(comparer(this.selectedKampfrichterBeforeSave[wettkampfTagNumber])); + kampfrichterExtendedToDelete = this.notSelectedKampfrichter[wettkampfTagNumber].filter(comparer(this.notSelectedKampfrichterBeforeSave[wettkampfTagNumber])); + + + //EXTENDED -> REGULAR DO const kampfrichterToSave: Array = []; - for (const i of Object.keys(kampfrichterUserToSave)) { + for (const i of Object.keys(kampfrichterExtendedToSave)) { kampfrichterToSave.push(new KampfrichterDO()); - kampfrichterToSave[i].id = kampfrichterUserToSave[i].id; + kampfrichterToSave[i].id = kampfrichterExtendedToSave[i].id; kampfrichterToSave[i].wettkampfID = wettkampfID; kampfrichterToSave[i].leitend = false; } const kampfrichterToDelete: Array = []; - for (const i of Object.keys(kampfrichterUserToDelete)) { + for (const i of Object.keys(kampfrichterExtendedToDelete)) { kampfrichterToDelete.push(new KampfrichterDO()); - kampfrichterToDelete[i].id = kampfrichterUserToDelete[i].id; - kampfrichterToDelete[i].wettkampfID = currentWettkampftag.id; + kampfrichterToDelete[i].id = kampfrichterExtendedToDelete[i].id; + kampfrichterToDelete[i].wettkampfID = wettkampfID; kampfrichterToDelete[i].leitend = false; } + if (kampfrichterToSave.length > 0) { console.log(kampfrichterToSave.length); this.saveKampfrichterArray(kampfrichterToSave); @@ -384,33 +396,59 @@ export class WettkampftageComponent extends CommonComponentDirective implements } } - public onDelete(ignore: any): void { + //method that deletes a wettkampftag if the deadline of the veranstaltung has not expired + public onDelete(wettkampfTagNumber: number, ignore: any): void { this.deleteLoading = true; this.notificationService.discardNotification(); - const id = this.currentVeranstaltung.id; + + const id = this.currentWettkampftagArray[wettkampfTagNumber].id; + this.updateNumbersDelete(); + + let currentDate = new Date(); + let deadlineDate = new Date(this.currentVeranstaltung.meldeDeadline); + //set the time of the dates to zero for comparing + deadlineDate.setHours(0,0,0,0); + currentDate.setHours(0,0,0,0); const notification: Notification = { - id: NOTIFICATION_DELETE_VERANSTALTUNG + id, - title: 'MANAGEMENT.VERANSTALTUNG_DETAIL.NOTIFICATION.DELETE.TITLE', - description: 'MANAGEMENT.VERANSTALTUNG_DETAIL.NOTIFICATION.DELETE.DESCRIPTION', + id: NOTIFICATION_DELETE_WETTKAMPFTAG+ id, + title: 'MANAGEMENT.VERANSTALTUNG_DETAIL.FORM.WETTKAMPFTAG.NOTIFICATION.DELETE.TITLE', + description: 'MANAGEMENT.VERANSTALTUNG_DETAIL.FORM.WETTKAMPFTAG.NOTIFICATION.DELETE.DESCRIPTION', descriptionParam: '' + id, - severity: NotificationSeverity.QUESTION, - origin: NotificationOrigin.USER, - type: NotificationType.YES_NO, - userAction: NotificationUserAction.PENDING + severity: NotificationSeverity.QUESTION, + origin: NotificationOrigin.USER, + type: NotificationType.YES_NO, + userAction: NotificationUserAction.ACCEPTED }; - this.notificationService.observeNotification(NOTIFICATION_DELETE_VERANSTALTUNG + id) - .subscribe((myNotification) => { + if(deadlineDate < currentDate){ - if (myNotification.userAction === NotificationUserAction.ACCEPTED) { - this.veranstaltungDataProvider.deleteById(id) - .then((response) => this.handleDeleteSuccess(response)) - .catch((response) => this.handleDeleteFailure(response)); - } - }); + const notification_expired: Notification = { + id: NOTIFICATION_DELETE_WETTKAMPFTAG_SUCCESS, + title: 'MANAGEMENT.VERANSTALTUNG_DETAIL.FORM.WETTKAMPFTAG.NOTIFICATION.DEADLINE_EXPIRED.TITLE', + description: 'MANAGEMENT.VERANSTALTUNG_DETAIL.FORM.WETTKAMPFTAG.NOTIFICATION.DEADLINE_EXPIRED.DESCRIPTION', + severity: NotificationSeverity.ERROR, + origin: NotificationOrigin.USER, + type: NotificationType.OK, + userAction: NotificationUserAction.PENDING + }; - this.notificationService.showNotification(notification); + this.notificationService.showNotification(notification_expired); + + } else { + this.notificationService.observeNotification(NOTIFICATION_DELETE_WETTKAMPFTAG + id) + .subscribe((myNotification) => { + + if (myNotification.userAction === NotificationUserAction.ACCEPTED) { + this.wettkampfDataProvider.deleteById(id) + .then((response) => this.handleDeleteSuccess(response)) + .catch((response) => this.handleDeleteFailure(response)); + } else if (myNotification.userAction === NotificationUserAction.DECLINED) { + this.deleteLoading = false; + } + }); + this.notificationService.showNotification(notification); + } } public entityExists(): boolean { @@ -445,15 +483,13 @@ export class WettkampftageComponent extends CommonComponentDirective implements private loadUser() { this.userRolleProvider.findAll() .then((response: BogenligaResponse) => this.handleUserRolleResponseArraySuccess(response)) - .catch((response: BogenligaResponse) => this.handleUserRolleResponseArrayFailure(response)).then(() => this.loadKampfrichter()); + .catch((response: BogenligaResponse) => this.handleUserRolleResponseArrayFailure(response)).then(); } private loadKampfrichter() { - this.kampfrichterProvider.findAll() - .then((response: BogenligaResponse) => this.handleKampfrichterResponseArraySuccess( - response - )) - .catch((response: BogenligaResponse) => this.handleKampfrichterResponseArrayFailure(response)); + this.kampfrichterProvider.findExtendedByIdNotAssignedToId(this.selectedWettkampf.id) + .then((response: BogenligaResponse) => this.handleKampfrichterResponseArraySuccess(response)) + .catch(() => this.handleKampfrichterResponseArrayFailure()); } private loadWettkampf() { @@ -488,16 +524,16 @@ export class WettkampftageComponent extends CommonComponentDirective implements private handleDeleteSuccess(response: BogenligaResponse): void { const notification: Notification = { - id: NOTIFICATION_DELETE_VERANSTALTUNG_SUCCESS, - title: 'MANAGEMENT.VERANSTALTUNG_DETAIL.NOTIFICATION.DELETE_SUCCESS.TITLE', - description: 'MANAGEMENT.VERANSTALTUNG_DETAIL.NOTIFICATION.DELETE_SUCCESS.DESCRIPTION', + id: NOTIFICATION_DELETE_WETTKAMPFTAG_SUCCESS, + title: 'MANAGEMENT.VERANSTALTUNG_DETAIL.FORM.WETTKAMPFTAG.NOTIFICATION.DELETE_SUCCESS.TITLE', + description: 'MANAGEMENT.VERANSTALTUNG_DETAIL.FORM.WETTKAMPFTAG.NOTIFICATION.DELETE_SUCCESS.DESCRIPTION', severity: NotificationSeverity.INFO, origin: NotificationOrigin.USER, type: NotificationType.OK, userAction: NotificationUserAction.PENDING }; - this.notificationService.observeNotification(NOTIFICATION_DELETE_VERANSTALTUNG_SUCCESS) + this.notificationService.observeNotification(NOTIFICATION_DELETE_WETTKAMPFTAG_SUCCESS) .subscribe((myNotification) => { if (myNotification.userAction === NotificationUserAction.ACCEPTED) { this.router.navigateByUrl('/verwaltung/veranstaltung'); @@ -511,16 +547,16 @@ export class WettkampftageComponent extends CommonComponentDirective implements private handleDeleteFailure(response: BogenligaResponse): void { const notification: Notification = { - id: NOTIFICATION_DELETE_VERANSTALTUNG_FAILURE, - title: 'MANAGEMENT.VERANSTALTUNG_DETAIL.NOTIFICATION.DELETE_FAILURE.TITLE', - description: 'MANAGEMENT.VERANSTALTUNG_DETAIL.NOTIFICATION.DELETE_FAILURE.DESCRIPTION', + id: NOTIFICATION_DELETE_WETTKAMPFTAG_FAILURE, + title: 'MANAGEMENT.VERANSTALTUNG_DETAIL.FORM.WETTKAMPFTAG.NOTIFICATION.DELETE_FAILURE.TITLE', + description: 'MANAGEMENT.VERANSTALTUNG_DETAIL.FORM.WETTKAMPFTAG.NOTIFICATION.DELETE_FAILURE.DESCRIPTION', severity: NotificationSeverity.ERROR, origin: NotificationOrigin.USER, type: NotificationType.OK, userAction: NotificationUserAction.PENDING }; - this.notificationService.observeNotification(NOTIFICATION_DELETE_VERANSTALTUNG_FAILURE) + this.notificationService.observeNotification(NOTIFICATION_DELETE_WETTKAMPFTAG_FAILURE) .subscribe((myNotification) => { if (myNotification.userAction === NotificationUserAction.ACCEPTED) { this.deleteLoading = false; @@ -530,12 +566,12 @@ export class WettkampftageComponent extends CommonComponentDirective implements this.notificationService.showNotification(notification); } - private handleWettkampfResponseArraySucces(response: BogenligaResponse) : void { + private handleWettkampfResponseArraySucces(response: BogenligaResponse): void { this.allWettkampf = []; this.allWettkampf = response.payload; this.allWettkampf = this.allWettkampf.filter((wettkampf) => wettkampf.wettkampfVeranstaltungsId === this.currentVeranstaltung.id); - for(let i=1; i<=this.allWettkampf.length;i++){ + for (let i = 1; i <= this.allWettkampf.length; i++) { if (this.allWettkampf.filter((wettkampf) => wettkampf.wettkampfTag === (i)).length === 0) { this.currentWettkampftagArray[i] = new WettkampfDO(); } else { @@ -592,34 +628,34 @@ export class WettkampftageComponent extends CommonComponentDirective implements this.loading = false; } + private async handleKampfrichterResponseArraySuccess(response: BogenligaResponse): Promise { - private handleKampfrichterResponseArraySuccess(response: BogenligaResponse): void{ - let allKampfrichter: Array = []; - allKampfrichter = response.payload; - let tempKampfrichter: Array = []; - let tempNotSelectedKampfrichterTag: Array = []; + this.selectedKampfrichterBeforeSave[this.selectedWettkampfTag] = []; + this.notSelectedKampfrichterBeforeSave[this.selectedWettkampfTag] = []; - for(let i = 1; i<=allKampfrichter.length; i++){ - this.kampfrichterTag[i]= []; - tempKampfrichter = this.kampfrichterTag[i]; - tempNotSelectedKampfrichterTag = this.notSelectedKampfrichterWettkampfTag[i]; + this.selectedKampfrichter[this.selectedWettkampfTag]= []; + this.notSelectedKampfrichter[this.selectedWettkampfTag] = [] - allKampfrichter.filter((kampfrichter) => kampfrichter.wettkampfID === this.currentWettkampftagArray[i].id).forEach((kampfrichter) => this.kampfrichterTag[i].push(Object.assign({}, kampfrichter))); + this.notSelectedKampfrichter[this.selectedWettkampfTag] = response.payload; //links - if (tempKampfrichter[0] !== undefined) { - for (const iter of Object.keys(this.kampfrichterTag[i])) { - this.initiallySelectedKampfrichterTag[i].push(this.allUserWithKampfrichterLizenz.filter((user) => user.id === this.kampfrichterTag[iter].id)[0]); - } - } + await this.kampfrichterProvider.findExtendedByIdAssignedToId(this.selectedWettkampf.id).then(reply=>{ + this.selectedKampfrichter[this.selectedWettkampfTag] = reply.payload; //rechts + }).catch(() => this.handleKampfrichterResponseArrayFailure()); + + + this.selectedKampfrichter[this.selectedWettkampfTag].forEach(x=>{ + this.selectedKampfrichterBeforeSave[this.selectedWettkampfTag].push(x); + }) + + this.notSelectedKampfrichter[this.selectedWettkampfTag].forEach(x=>{ + this.notSelectedKampfrichterBeforeSave[this.selectedWettkampfTag].push(x); + }) - this.initiallySelectedKampfrichterTag[i].forEach((val) => this.selectedKampfrichterTag[i].push(Object.assign({}, val))); - tempNotSelectedKampfrichterTag = this.allUserWithKampfrichterLizenz.filter((user) => this.initiallySelectedKampfrichterTag[i].indexOf(user) < 0); - this.notSelectedKampfrichterWettkampfTag[i] = tempNotSelectedKampfrichterTag; - } this.loading = false; } - private handleKampfrichterResponseArrayFailure(response: BogenligaResponse): void { + private handleKampfrichterResponseArrayFailure(): void { + console.log("KampfrichterResponseArrayFailure"); this.loading = false; } @@ -632,21 +668,21 @@ export class WettkampftageComponent extends CommonComponentDirective implements } //when loading was succesfull, filter Wettkampftage depending on Veranstaltung - private handleLoadDistinctWettkampfSuccess(response: BogenligaResponse): void { + private async handleLoadDistinctWettkampfSuccess(response: BogenligaResponse): Promise { this.selectedDTOs = []; this.selectedDTOs = response.payload.filter(element => element.wettkampfVeranstaltungsId === this.currentVeranstaltung.id); this.anzahl = this.selectedDTOs.length; //when there are no Wettkampftage for this Veranstaltung yet - if(this.selectedDTOs.length===0){ - this.createInitWettkampfTag(1); + if (this.selectedDTOs.length === 0) { this.selectedDTOs.push(new WettkampfDO()); - this.loadWettkampf(); + await this.createInitWettkampfTag(1); this.loadDistinctWettkampf(); } this.loadingWettkampf = false; } + //when loading failed private handleLoadDistinctWettkampfFailure(response: BogenligaResponse): void { this.selectedDTOs = []; @@ -655,25 +691,29 @@ export class WettkampftageComponent extends CommonComponentDirective implements //onSelect for SelectionList in html-file, loads currently selected Wettkampftag public onSelect($event: WettkampfDO[]): void { + console.log("selected:",$event); this.selectedWettkampfTag = $event[0].wettkampfTag; + this.selectedWettkampf = $event[0]; console.log('onSelect Dialog: ' + this.selectedWettkampfTag); this.loadWettkampf(); + this.loadDistinctWettkampf(); + this.loadKampfrichter(); } //create an empty Wettkampftag - public createInitWettkampfTag(num: number): void { + public async createInitWettkampfTag(num: number): Promise { console.log(Number(this.maxWettkampftageEinstellungenDO.value)); if (this.anzahl < Number(this.maxWettkampftageEinstellungenDO.value)) { this.anzahl++; const temp: WettkampfDO = new WettkampfDO( num, this.currentVeranstaltung.id, - "0000-00-00", - "", - "", - "", - "", - "", + '2021-01-01', + '', + '', + '', + '', + '', this.anzahl, 1, 1, @@ -681,7 +721,7 @@ export class WettkampftageComponent extends CommonComponentDirective implements 1 ); this.currentWettkampftagArray[num] = temp; - this.saveWettkampftag(this.currentWettkampftagArray[num]); + await this.saveWettkampftag(this.currentWettkampftagArray[num]); } else { const notification: Notification = { id: NOTIFICATION_WETTKAMPFTAG_TOO_MANY, @@ -696,6 +736,103 @@ export class WettkampftageComponent extends CommonComponentDirective implements this.wettkampftagService(); this.notificationService.showNotification(notification); } + return true; } -} + //Wenn nicht alle Felder von allen Wettkampftagen befüllt sind, gibt es einen Error + public async updateNumbersDelete(): Promise{ + //TODO Alle existierende Wettkampftage müssen komplett ausgefüllt und abgespeichert sein, Wenn ein Attribut fehlt, funktioniert die Updatefunktion nicht + + this.loadWettkampf(); + this.loadDistinctWettkampf(); + + if(this.selectedWettkampfTag!=this.currentWettkampftagArray.length){ //Wenn letzter Wettkampftag gelöscht werden soll, muss Nummerierung nicht angepasst werden + for (let i = this.selectedWettkampfTag +1; i < this.currentWettkampftagArray.length; i++) { //Man beginnt im Array, ein Tag weiter als der aktuelle (Welcher gelöscht werden soll) + console.log("Wettkampftag vorher: " + this.currentWettkampftagArray[i].wettkampfTag); + console.log("i = "+ i); + this.currentWettkampftagArray[i].wettkampfTag --; //Wettkampftagnummer wird dekrementiert + + console.log("Wettkampftag danach: " + this.currentWettkampftagArray[i].wettkampfTag); + + if(this.currentWettkampftagArray[i].wettkampfTag==null) { + console.log("wettkampf doesnt exist"); + } + else{ + await this.wettkampfDataProvider.update(this.currentWettkampftagArray[i]); //Wettkampftag mit aktualisierter Wettkampftagnummer speichern + this.currentWettkampftagArray[i - 1] = this.currentWettkampftagArray[i]; //Position im Array verschieben + } + } + } + this.loadDistinctWettkampf(); + return true; + } + + //Creates Copy of current Wettkampftag + public async copyCurrentWettkampfTag(num: number): Promise { + if (this.anzahl < Number(this.maxWettkampftageEinstellungenDO.value)) { + this.anzahl++; + + //parsing current date + let currentYear = Number(this.currentWettkampftagArray[this.selectedWettkampfTag].wettkampfDatum.substring(0, 4)); + let currentMonth = Number(this.currentWettkampftagArray[this.selectedWettkampfTag].wettkampfDatum.substring(5, 7)); + let currentDate = Number(this.currentWettkampftagArray[this.selectedWettkampfTag].wettkampfDatum.substring(8, 10)); + + //creating new Date object with parsed year, month and day and incrementing it by + 1 + let nextWettkampfDatum = new Date(); + nextWettkampfDatum.setFullYear(currentYear, currentMonth, currentDate) + nextWettkampfDatum.setDate(nextWettkampfDatum.getDate() + 1); + + //parsing incremented Date + let incrementedYear = nextWettkampfDatum.getFullYear(); + let incrementedMonth = nextWettkampfDatum.getMonth(); + let incrementedDate = nextWettkampfDatum.getDate(); + + //constructing date string + let incrementedWettkampfDatum = incrementedYear.toString() + '-'; + + //adding leading 0 to months < 10 + if (incrementedMonth < 10) { + incrementedWettkampfDatum += '0'; + } + incrementedWettkampfDatum += incrementedMonth.toString() + '-'; + + //adding leading 0 to dates < 10 + if (incrementedDate < 10) { + incrementedWettkampfDatum += '0'; + } + incrementedWettkampfDatum += incrementedDate.toString(); + + const temp: WettkampfDO = new WettkampfDO( + num, + this.currentVeranstaltung.id, + incrementedWettkampfDatum, + this.currentWettkampftagArray[this.selectedWettkampfTag].wettkampfStrasse.toString(), + this.currentWettkampftagArray[this.selectedWettkampfTag].wettkampfPlz.toString(), + this.currentWettkampftagArray[this.selectedWettkampfTag].wettkampfOrtsname.toString(), + this.currentWettkampftagArray[this.selectedWettkampfTag].wettkampfOrtsinfo.toString(), + this.currentWettkampftagArray[this.selectedWettkampfTag].wettkampfBeginn.toString(), + this.anzahl, + 1, + 1, + 1, + 1 + ); + this.currentWettkampftagArray[num] = temp; + await this.saveWettkampftag(this.currentWettkampftagArray[num]); + } else { + const notification: Notification = { + id: NOTIFICATION_WETTKAMPFTAG_TOO_MANY, + title: 'MANAGEMENT.VERANSTALTUNG_DETAIL.FORM.WETTKAMPFTAG.NOTIFICATION.TOO_MANY.TITLE', + description: 'MANAGEMENT.VERANSTALTUNG_DETAIL.FORM.WETTKAMPFTAG.NOTIFICATION.TOO_MANY.DESCRIPTION', + severity: NotificationSeverity.ERROR, + origin: NotificationOrigin.USER, + type: NotificationType.OK, + userAction: NotificationUserAction.PENDING + }; + + this.wettkampftagService(); + this.notificationService.showNotification(notification); + } + return true; + } +} diff --git a/bogenliga/src/app/modules/verwaltung/components/verein/verein-detail/mannschafts-detail/mannschaft-detail.component.ts b/bogenliga/src/app/modules/verwaltung/components/verein/verein-detail/mannschafts-detail/mannschaft-detail.component.ts index 37d198826..7e2ff6bf9 100644 --- a/bogenliga/src/app/modules/verwaltung/components/verein/verein-detail/mannschafts-detail/mannschaft-detail.component.ts +++ b/bogenliga/src/app/modules/verwaltung/components/verein/verein-detail/mannschafts-detail/mannschaft-detail.component.ts @@ -79,6 +79,8 @@ export class MannschaftDetailComponent extends CommonComponentDirective implemen private deleteNotification: Notification; private duplicateSubscription; private deleteSubscription; + private dsbmitglied: DsbMitgliedDO = new DsbMitgliedDO(); + @ViewChild('downloadLink') private aElementRef: ElementRef; @@ -414,19 +416,24 @@ export class MannschaftDetailComponent extends CommonComponentDirective implemen // @param memberId: MannschaftsId of Mannschaft of Member to delete // @param dsbMitgliedId: dsbMitgliedId of Member of Mannschaft - private deleteMitglied(memberId: number, dsbMitgliedId: number) { + private async deleteMitglied(memberId: number, dsbMitgliedId: number) { + + const response = await this.dsbMitgliedProvider.findById(dsbMitgliedId); + this.dsbmitglied = response.payload; + + this.rows = showDeleteLoadingIndicatorIcon(this.rows, dsbMitgliedId); const notification: Notification = { id: NOTIFICATION_DELETE_MITGLIED + memberId, title: 'MANAGEMENT.MANNSCHAFT_DETAIL.NOTIFICATION.DELETE_MITGLIED.TITLE', description: 'MANAGEMENT.MANNSCHAFT_DETAIL.NOTIFICATION.DELETE_MITGLIED.DESCRIPTION', - descriptionParam: '' + dsbMitgliedId, + descriptionParam: '' + this.dsbmitglied.vorname + ' ' + this.dsbmitglied.nachname, severity: NotificationSeverity.QUESTION, origin: NotificationOrigin.USER, type: NotificationType.YES_NO, userAction: NotificationUserAction.PENDING }; - this.notificationService.observeNotification(NOTIFICATION_DELETE_MITGLIED + memberId) + let noti = this.notificationService.observeNotification(NOTIFICATION_DELETE_MITGLIED + memberId) .subscribe((myNotification) => { if (myNotification.userAction === NotificationUserAction.ACCEPTED) { @@ -461,6 +468,7 @@ export class MannschaftDetailComponent extends CommonComponentDirective implemen } else if (myNotification.userAction === NotificationUserAction.DECLINED) { this.rows = hideLoadingIndicator(this.rows, dsbMitgliedId); + noti.unsubscribe(); } }); this.notificationService.showNotification(notification); diff --git a/bogenliga/src/app/modules/verwaltung/components/verein/verein-detail/mannschafts-detail/schuetzen/schuetzen.component.spec.ts b/bogenliga/src/app/modules/verwaltung/components/verein/verein-detail/mannschafts-detail/schuetzen/schuetzen.component.spec.ts index 722633d8a..60c5c52f3 100644 --- a/bogenliga/src/app/modules/verwaltung/components/verein/verein-detail/mannschafts-detail/schuetzen/schuetzen.component.spec.ts +++ b/bogenliga/src/app/modules/verwaltung/components/verein/verein-detail/mannschafts-detail/schuetzen/schuetzen.component.spec.ts @@ -1,6 +1,6 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { SchuetzenComponent } from './mannschaft-detail.component'; +import { SchuetzenComponent } from './schuetzen.component'; describe('VereinDetailComponent', () => { let component: SchuetzenComponent; diff --git a/bogenliga/src/app/modules/verwaltung/components/verein/verein-detail/verein-detail.component.html b/bogenliga/src/app/modules/verwaltung/components/verein/verein-detail/verein-detail.component.html index 015bc15f5..fcbb8bd92 100644 --- a/bogenliga/src/app/modules/verwaltung/components/verein/verein-detail/verein-detail.component.html +++ b/bogenliga/src/app/modules/verwaltung/components/verein/verein-detail/verein-detail.component.html @@ -16,6 +16,7 @@ ) => { + const notification: Notification = { + id: NOTIFICATION_UPDATE_VEREIN, + title: 'MANAGEMENT.VEREIN_DETAIL.NOTIFICATION.SAVE_FAILURE.TITLE', + description: 'MANAGEMENT.VEREIN_DETAIL.NOTIFICATION.SAVE_FAILURE.DESCRIPTION', + severity: NotificationSeverity.INFO, + origin: NotificationOrigin.USER, + type: NotificationType.OK, + userAction: NotificationUserAction.PENDING + }; + this.notificationService.showNotification(notification); + + console.log('Failed'); this.saveLoading = false; }); diff --git a/bogenliga/src/app/modules/verwaltung/components/wettkampfklasse/wettkampfklasse-detail/wettkampfklasse-detail.component.html b/bogenliga/src/app/modules/verwaltung/components/wettkampfklasse/wettkampfklasse-detail/wettkampfklasse-detail.component.html index 8e8e15423..3b96739a0 100644 --- a/bogenliga/src/app/modules/verwaltung/components/wettkampfklasse/wettkampfklasse-detail/wettkampfklasse-detail.component.html +++ b/bogenliga/src/app/modules/verwaltung/components/wettkampfklasse/wettkampfklasse-detail/wettkampfklasse-detail.component.html @@ -5,32 +5,7 @@ class="horizontal-form half-page" #dsbMitgliedForm="ngForm"> - - - - +
- +
- +
diff --git a/bogenliga/src/app/modules/verwaltung/mapper/kampfrichter-extended-mapper.ts b/bogenliga/src/app/modules/verwaltung/mapper/kampfrichter-extended-mapper.ts new file mode 100644 index 000000000..de2b15fd0 --- /dev/null +++ b/bogenliga/src/app/modules/verwaltung/mapper/kampfrichter-extended-mapper.ts @@ -0,0 +1,13 @@ +import {VersionedDataTransferObject} from '@shared/data-provider'; +import {kampfrichterExtendedDTO} from '../types/datatransfer/kampfrichter-extended-dto.class'; + + +export function fromPayloadExtended(payload: VersionedDataTransferObject): kampfrichterExtendedDTO { + return kampfrichterExtendedDTO.copyFrom(payload); +} + +export function fromPayloadArrayExtended(payload: VersionedDataTransferObject[]): kampfrichterExtendedDTO[] { + const list: kampfrichterExtendedDTO[] = []; + payload.forEach((single) => list.push(fromPayloadExtended(single))); + return list; +} diff --git a/bogenliga/src/app/modules/verwaltung/services/kampfrichter-data-provider.service.ts b/bogenliga/src/app/modules/verwaltung/services/kampfrichter-data-provider.service.ts index 96a553656..00dd21b41 100644 --- a/bogenliga/src/app/modules/verwaltung/services/kampfrichter-data-provider.service.ts +++ b/bogenliga/src/app/modules/verwaltung/services/kampfrichter-data-provider.service.ts @@ -10,8 +10,9 @@ import { } from '../../shared/data-provider'; import {CurrentUserService} from '@shared/services'; import {fromPayload, fromPayloadArray} from '../mapper/kampfrichter-mapper'; +import {fromPayloadExtended, fromPayloadArrayExtended} from '../mapper/kampfrichter-extended-mapper'; import {KampfrichterDO} from '../types/kampfrichter-do.class'; -import {KampfrichterDTO} from '@verwaltung/types/datatransfer/kampfrichter-dto.class'; +import {KampfrichterExtendedDO} from '../types/kampfrichter-extended-do.class'; @Injectable({ providedIn: 'root' @@ -105,6 +106,47 @@ export class KampfrichterProviderService extends DataProviderService { }); } + public findExtendedByIdNotAssignedToId(id: string | number): Promise> { + // return promise + // sign in success -> resolve promise + // sign in failure -> reject promise with result + return new Promise((resolve, reject) => { + this.restClient.GET>(new UriBuilder().fromPath(this.getUrl()).path("NotAssignedKampfrichter/"+id).build()) + .then((data: VersionedDataTransferObject[]) => { + resolve({result: RequestResult.SUCCESS, payload: fromPayloadArrayExtended(data)}); + }, (error: HttpErrorResponse) => { + + if (error.status === 0) { + reject({result: RequestResult.CONNECTION_PROBLEM}); + } else { + reject({result: RequestResult.FAILURE}); + } + }); + }); + + } + + public findExtendedByIdAssignedToId(id: string | number): Promise> { + // return promise + // sign in success -> resolve promise + // sign in failure -> reject promise with result + return new Promise((resolve, reject) => { + this.restClient.GET>(new UriBuilder().fromPath(this.getUrl()).path("AssignedKampfrichter/"+id).build()) + .then((data: VersionedDataTransferObject[]) => { + resolve({result: RequestResult.SUCCESS, payload: fromPayloadArrayExtended(data)}); + }, (error: HttpErrorResponse) => { + + if (error.status === 0) { + reject({result: RequestResult.CONNECTION_PROBLEM}); + } else { + reject({result: RequestResult.FAILURE}); + } + }); + }); + + } + + // public update(payload: VersionedDataTransferObject): Promise> { // DO or DTO? Probably DO. // console.log('KampfrichterProviderService:'); // console.log(payload); @@ -148,3 +190,4 @@ export class KampfrichterProviderService extends DataProviderService { }); } } + diff --git a/bogenliga/src/app/modules/verwaltung/services/user-data-provider.service.ts b/bogenliga/src/app/modules/verwaltung/services/user-data-provider.service.ts index ed80daea2..a65a7b06d 100644 --- a/bogenliga/src/app/modules/verwaltung/services/user-data-provider.service.ts +++ b/bogenliga/src/app/modules/verwaltung/services/user-data-provider.service.ts @@ -156,6 +156,31 @@ export class UserDataProviderService extends DataProviderService { } + /** + * returns promise that includes List of all users with the role "roleId" + * sign in success -> resolve promise + * sign in failure -> reject promise with result + * @param roleId + */ + public findAllUsersByRoleId(roleId: string | number): Promise> { + return new Promise((resolve, reject) => { + + this.restClient.GET(new UriBuilder().fromPath(this.getUrl()) + .path('allusersbyrole').path(roleId).build()).then((data: VersionedDataTransferObject[]) => { + + resolve({result: RequestResult.SUCCESS, payload: fromPayloadArrayUserRolle(data)}); + + }, (error: HttpErrorResponse) => { + + if (error.status === 0) { + reject({result: RequestResult.CONNECTION_PROBLEM}); + } else { + reject({result: RequestResult.FAILURE}); + } + }); + }); + } + public findById(id: string | number): Promise> { // return promise diff --git a/bogenliga/src/app/modules/verwaltung/types/datatransfer/einstellungen-dto.class.ts b/bogenliga/src/app/modules/verwaltung/types/datatransfer/einstellungen-dto.class.ts index 15938d0ff..0be0c65ca 100644 --- a/bogenliga/src/app/modules/verwaltung/types/datatransfer/einstellungen-dto.class.ts +++ b/bogenliga/src/app/modules/verwaltung/types/datatransfer/einstellungen-dto.class.ts @@ -9,6 +9,7 @@ export class EinstellungenDTO implements DataTransferObject { version: number; key: string; value: string; + regex: string; @@ -17,6 +18,7 @@ export class EinstellungenDTO implements DataTransferObject { version?: number; key?: string; value?: string; + regex?: string; } = {}): EinstellungenDTO { @@ -25,6 +27,7 @@ export class EinstellungenDTO implements DataTransferObject { copy.version = optional.version || null; copy.key = optional.key || ''; copy.value = optional.value || ''; + copy.regex = optional.regex || null; return copy; } diff --git a/bogenliga/src/app/modules/verwaltung/types/datatransfer/kampfrichter-extended-dto.class.ts b/bogenliga/src/app/modules/verwaltung/types/datatransfer/kampfrichter-extended-dto.class.ts new file mode 100644 index 000000000..c9617e7d4 --- /dev/null +++ b/bogenliga/src/app/modules/verwaltung/types/datatransfer/kampfrichter-extended-dto.class.ts @@ -0,0 +1,47 @@ +import {DataTransferObject} from '@shared/data-provider'; + +export class kampfrichterExtendedDTO implements DataTransferObject { + id: number; + vorname: string; + nachname: string; + email:string; + wettkampfID: number; + leitend: boolean; + version: number; + vorNachName: string; + + // The attribute names of the optional have to be exactly the same as the getters in KampfrichterDTO.java + static copyFrom(optional: { + userID?: number; + kampfrichterVorname?: string; + kampfrichterNachname?: string; + email?: string; + wettkampfID?: number; + leitend?: boolean; + version?: number; + vorNachName?: string; + + } = {}): kampfrichterExtendedDTO { + const copy = new kampfrichterExtendedDTO(); + + // show '0' value + if (optional.userID >= 0) { + copy.id = optional.userID; + } else { + copy.id = null; + } + + if (optional.wettkampfID >= 0) { + copy.wettkampfID = optional.wettkampfID; + } else { + copy.wettkampfID = null; + } + + copy.email = optional.email; + copy.vorname = optional.kampfrichterVorname; + copy.nachname = optional.kampfrichterNachname; + copy.leitend = optional.leitend; + copy.vorNachName = optional.kampfrichterVorname + ' ' + optional.kampfrichterNachname; + return copy; + } +} diff --git a/bogenliga/src/app/modules/verwaltung/types/einstellungen-do.class.ts b/bogenliga/src/app/modules/verwaltung/types/einstellungen-do.class.ts index f5e677ca5..72bfd78aa 100644 --- a/bogenliga/src/app/modules/verwaltung/types/einstellungen-do.class.ts +++ b/bogenliga/src/app/modules/verwaltung/types/einstellungen-do.class.ts @@ -4,12 +4,12 @@ import {VersionedDataObject} from '../../shared/data-provider/models/versioned-d - export class EinstellungenDO implements VersionedDataObject { id: number; version: number; value: string; key: string; + regex: string; } diff --git a/bogenliga/src/app/modules/verwaltung/types/kampfrichter-extended-do.class.ts b/bogenliga/src/app/modules/verwaltung/types/kampfrichter-extended-do.class.ts new file mode 100644 index 000000000..f5dfd2fa2 --- /dev/null +++ b/bogenliga/src/app/modules/verwaltung/types/kampfrichter-extended-do.class.ts @@ -0,0 +1,13 @@ +import {VersionedDataObject} from '@shared/data-provider/models/versioned-data-object.interface'; + + +export class KampfrichterExtendedDO implements VersionedDataObject { + id: number; + wettkampfID: number; + leitend: boolean; + version: number; + vorname: string; + nachname: string; + email:string; + vorNachName : string; +} diff --git a/bogenliga/src/assets/i18n/de.json b/bogenliga/src/assets/i18n/de.json index 1db066b27..d78c026cf 100644 --- a/bogenliga/src/assets/i18n/de.json +++ b/bogenliga/src/assets/i18n/de.json @@ -346,7 +346,7 @@ "NEWPASSWORD": { "LABEL": "Neues Passwort", "PLACEHOLDER": "Bitte Passwort eingeben", - "ERROR": "Mindestlänge 8 Zeichen, Groß- und Kleinbuchstaben und min. eine Zahl" + "ERROR": "Mindestlänge 8 Zeichen, Groß- und Kleinbuchstaben und min. eine Zahl. Erlaubte Sonderzeichen: #$^+=!*()@%&?" }, "VERIFYPASSWORD": { "LABEL": "Verifikation neues Passwort", @@ -522,7 +522,8 @@ "DESCRIPTION": { "EMAIL": "Bitte korrekte E-Mail eingeben", "HOST": "Bitte vollständige Hostadresse eingeben", - "PORT": "Bitte nur Zahlen eingeben" + "PORT": "Bitte nur Zahlen eingeben", + "DEFAULT": "Bitte korrekten Wert eingeben" } } } @@ -780,6 +781,10 @@ "DUPLICATE": { "TITLE": "Mannschaftsnummer in dem Verein bereits vergeben!", "DESCRIPTION": "Möchten sie die Mannschaft trotzdem hinzufügen?" + }, + "SAVE_FAILURE": { + "TITLE": "Fehler beim aktualisieren", + "DESCRIPTION": "Sportleiter hat keine Berechtigung über den ausgewählten Verein oder die Zielregion." } } }, @@ -795,6 +800,7 @@ "REGION_SUPERORDINATE": "Übergeordnete Region" } }, + "NOTIFICATION": { "DELETE": { "TITLE": "Region löschen", @@ -897,7 +903,7 @@ }, "DELETE_MITGLIED": { "TITLE": "Schütze aus Mannschaft löschen", - "DESCRIPTION": "Wollen Sie den Schützen mit der ID=%s wirklich aus der Mannschaft entfernen?" + "DESCRIPTION": "Wollen Sie den Schützen %s wirklich aus der Mannschaft entfernen?" }, "DELETE_MITGLIED_SUCCESS": { "TITLE": "Erfolg", @@ -1149,17 +1155,17 @@ "STRASSE": { "LABEL": "Strasse", "PLACEHOLDER": "Straße und Hausnummer *", - "ERROR": "Ungültige Eingabe." + "ERROR": "Bitte geben Sie eine gültige Straße und Hausnummer ein." }, "PLZ": { "LABEL": "Postleitzahl", "PLACEHOLDER": "Postleitzahl *", - "ERROR": "Ungültige Postleitzahl." + "ERROR": "Bitte geben Sie eine gültige Postleitzahl ein." }, "ORTSNAME": { "LABEL": "Ort/Stadt", "PLACEHOLDER": "Ort/Stadt *", - "ERROR": "Ungültiger Ort." + "ERROR": "Bitte geben Sie einen gültigen Ort oder eine gültige Stadt ein." }, "ORTSINFO": { "LABEL": "Zusatzinformation", @@ -1182,13 +1188,17 @@ "DESCRIPTION": "Daten vom Wettkampftag aktualisiert" }, "DELETE": { - "TITLE": "Wettkampftag löschen", - "DESCRIPTION": "Wollen Sie den Wettkampftag mit der ID=%s wirklich löschen? ACHTUNG! Wenn Sie diesen Wettkampftag löschen werden alle Datensätze, die darauf referenzieren ebenfalls gelöscht!\"" + "TITLE": "Löschen", + "DESCRIPTION": "Wollen Sie den Wettkampftag mit der ID=%s wirklich löschen? ACHTUNG! Wenn Sie diesen Wettkampftag löschen werden alle Datensätze, die darauf referenzieren ebenfalls gelöscht!" }, "ADD": { "TITLE": "Neu", "DESCRIPTION": "Wollen Sie einen weiteren Wettkampftag hinzufügen?" }, + "COPY": { + "TITLE": "Kopieren", + "DESCRIPTION": "Wollen Sie den ausgewählten Wettkampftag kopieren?" + }, "DELETE_SUCCESS": { "TITLE": "Erfolgreich", "DESCRIPTION": "Der Wettkampftag wurde erfolgreich gelöscht." @@ -1197,6 +1207,10 @@ "TITLE": "Fehler beim Löschen", "DESCRIPTION": "Der Wettkampftag konnte nicht gelöscht werden." }, + "DEADLINE_EXPIRED": { + "TITLE": "Meldedeadline abgelaufen", + "DESCRIPTION": "Die Meldedeadline für diese Veranstaltung ist abgelaufen. Sie können die dazugehörigen Wettkampftage nicht mehr löschen." + }, "TOO_MANY": { "TITLE": "Zu viele Wettkampftage", "DESCRIPTION" : "Sie haben bereits die maximale Anzahl an Wettkampftagen hinzugefügt." @@ -1231,6 +1245,10 @@ "TITLE": "Veranstaltung angelegt", "DESCRIPTION": "Veranstaltung wurde erfolgreich angelegt" }, + "SAVE_FAILURE": { + "TITLE": "Fehlermeldung: Duplikation", + "DESCRIPTION": "Es existiert in diesem Sportjahr bereits eine Veranstaltung für die von Ihnen angegebenen Liga. Bitte überprüfen Sie Ihre Eingabe." + }, "COPYMANNSCHAFT_FAILURE": { "TITLE": "Kopieren fehlgeschlagen", "DESCRIPTION": "Keine Veranstaltung im Vorjahr vorhanden" @@ -1318,7 +1336,7 @@ "PASSWORD_NEW": { "LABEL": "Neues Passwort", "PLACEHOLDER": "Bitte neues Passwort eingeben", - "ERROR": "Mindestlänge 8 Zeichen, mindestens 1 Zahl und jeweils 1 Groß- und ein Kleinbuchstabe. Erlaubte Sonderzeichen: #$^+=!*()@%&?" + "ERROR": "Mindestlänge 8 Zeichen, Groß- und Kleinbuchstaben und min. eine Zahl. Erlaubte Sonderzeichen: #$^+=!*()@%&?" }, "ROLE_UPDATE": "Rolle ändern", "PW_UPDATE": "Passwort ändern" @@ -1340,12 +1358,12 @@ "EMAIL": { "LABEL": "E-Mail", "PLACEHOLDER": "Bitte eine E-Mail Adresse als Benutzerkennung eingeben", - "ERROR": "Bitte eine gültige Email eingeben." + "ERROR": "Bitte eine gültige E-mail eingeben." }, "PASSWORD": { "LABEL": "Neues Passwort", "PLACEHOLDER": "Bitte Passwort eingeben", - "ERROR": "Mindestlänge 8 Zeichen, mindestens 1 Zahl und jeweils 1 Groß- und ein Kleinbuchstabe. Erlaubte Sonderzeichen: #$^+=!*()@%&?" + "ERROR": "Mindestlänge 8 Zeichen, Groß- und Kleinbuchstaben und min. eine Zahl. Erlaubte Sonderzeichen: #$^+=!*()@%&?" }, "VERIFYPASSWORD": { "LABEL": "Verifikation neues Passwort", @@ -1425,12 +1443,12 @@ "WETTKAMPF_JAHRGANG_MIN": { "LABEL": "Wettkampf Jahrgang von", "PLACEHOLDER": "Bitte ein Jahrgang eingeben", - "ERROR": "Bitte einen gültigen Jahrgang eingeben." + "ERROR": "Bitte einen gültigen Jahrgang eingeben (genau 4 Zahlen)." }, "WETTKAMPF_JAHRGANG_MAX": { "LABEL": "Wettkampf Jahrgang bis", "PLACEHOLDER": "Bitte einen Jahrgang eingeben", - "ERROR": "Bitte einen gültigen Jahrgang eingeben." + "ERROR": "Bitte einen gültigen Jahrgang eingeben (genau 4 Zahlen)." }, "WETTKAMPF_NR": { "LABEL": "Nummer der Wettkampfklasse", diff --git a/bogenliga/src/assets/i18n/en.json b/bogenliga/src/assets/i18n/en.json index 8491ab75a..530d78e1a 100644 --- a/bogenliga/src/assets/i18n/en.json +++ b/bogenliga/src/assets/i18n/en.json @@ -451,7 +451,8 @@ "DESCRIPTION": { "EMAIL": "Please enter a correct E-Mail address", "HOST": "Please enter a full Host address", - "PORT": "Only numbers are allowed" + "PORT": "Only numbers are allowed", + "DEFAULT": "Please enter a valid value" } } } @@ -769,6 +770,10 @@ "DUPLICATE": { "TITLE": "Team-number already in use!", "DESCRIPTION": "Add team anyway?" + }, + "SAVE_FAILURE": { + "TITLE": "Error while saving", + "DESCRIPTION": "Sports director has no authority over this club or this target region." } } }, @@ -886,7 +891,7 @@ }, "DELETE_MITGLIED": { "TITLE": "Delete marksman from team", - "DESCRIPTION": "Are you sure, you want to delete the marksman with ID=%s from the team?" + "DESCRIPTION": "Are you sure, you want to delete the marksman %s from the team?" }, "DELETE_MITGLIED_SUCCESS": { "TITLE": "Success", @@ -1206,6 +1211,10 @@ "TITLE": "Event created", "DESCRIPTION": "Successfully created event." }, + "SAVE_FAILURE": { + "TITLE": "Error message: Duplication.", + "DESCRIPTION": "An event already exists in this sport year for the league you entered. Please check your entry." + }, "SAVEMANNSCHAFT": { "TITLE": "Success", "DESCRIPTION": "Successfully copied teams from last season."