diff --git a/src/Turnierplan.App/Client/src/app/i18n/de.ts b/src/Turnierplan.App/Client/src/app/i18n/de.ts index 4a322f07..e6c9b92a 100644 --- a/src/Turnierplan.App/Client/src/app/i18n/de.ts +++ b/src/Turnierplan.App/Client/src/app/i18n/de.ts @@ -230,9 +230,13 @@ export const de = { Title: 'Bild umbenennen', EnterNewName: 'Geben Sie den neuen Namen für das Bild ein:' }, - DeleteToast: { - Title: 'Bild wurde gelöscht', - Message: 'Das Bild wurde gelöscht.' + Delete: { + Title: 'Bild löschen', + AdditionalModalText: 'Nach dem Löschen wird das Bild bei allen bisher verknüpften Turnieren nicht mehr sichtbar sein!', + SuccessToast: { + Title: 'Bild wurde gelöscht', + Message: 'Das Bild wurde gelöscht.' + } } }, ApiKeys: { @@ -423,7 +427,11 @@ export const de = { DeleteOverwrite: { Header: 'Zurücksetzen', Tooltip: - 'Wenn zuvorige Änderungen gelöscht werden, wird an der jeweiligen Stelle wieder die Standard-Platzierung anzeigt, welche im Turnier berechnet werden.' + 'Wenn zuvorige Änderungen gelöscht werden, wird an der jeweiligen Stelle wieder die Standard-Platzierung anzeigt, welche im Turnier berechnet werden.', + Title: 'Platzierung zurücksetzen', + ObjectDisplayName: 'Zuweisung für {{value}}. Platz', + AdditionalModalText: + 'Nach dem Löschen wird an der jeweiligen Stelle wieder die Standard-Platzierung anzeigt, welche im Turnier berechnet werden.' } }, Documents: { @@ -432,7 +440,6 @@ export const de = { Generations: 'Abrufe', Configure: 'Einstellungen', Download: 'Herunterladen', - Delete: 'Löschen', Create: 'Neues Dokument', Copy: 'Dokument kopieren', NoDocuments: 'Es sind aktuell keine Dokumente vorhanden.', @@ -446,9 +453,13 @@ export const de = { Title: 'Dokument umbenennen', EnterNewName: 'Geben Sie den neuen Namen für das Dokument ein:' }, - DeleteToast: { - Title: 'Dokument wurde gelöscht', - Message: 'Das Dokument wurde gelöscht.' + Delete: { + Header: 'Löschen', + Title: 'Dokument löschen', + SuccessToast: { + Title: 'Dokument wurde gelöscht', + Message: 'Das Dokument wurde gelöscht.' + } }, ConfigureModal: { Title: 'Dokument bearbeiten', @@ -1166,6 +1177,10 @@ export const de = { NoLabels: 'keine Labels', NoLinkedTournament: 'kein Turnier verknüpft', CannotDeleteTeamWhileLinked: 'Die Mannschaft kann nicht gelöscht werden, solange sie an einem Turnier teilnimmt.', + DeleteTeam: { + Title: 'Mannschaft aus Anmeldung löschen', + AdditionalModalText: 'Die anderen Mannschaften in dieser Anmeldung sind hiervon nicht betroffen.' + }, RenameTeam: { Title: 'Mannschaft umbenennen', EnterNewName: diff --git a/src/Turnierplan.App/Client/src/app/portal/components/delete-button/delete-button.component.html b/src/Turnierplan.App/Client/src/app/portal/components/delete-button/delete-button.component.html index d7b03374..cf081c1d 100644 --- a/src/Turnierplan.App/Client/src/app/portal/components/delete-button/delete-button.component.html +++ b/src/Turnierplan.App/Client/src/app/portal/components/delete-button/delete-button.component.html @@ -1,11 +1,12 @@
} (); + + private readonly modalService = inject(NgbModal); + + protected deleteClicked(): void { + if (this.modalConfirmation) { + return; + } + + this.confirmed.emit(); + } + + protected showDeleteModalIfEnabled(): void { + if (!this.modalConfirmation) { + return; + } + + if (!this.translationKey || !this.targetObjectName) { + throw new Error('The translation key and target object name must be specified if modal confirmation is enabled.'); + } + + showDeleteModal(this.modalService, this.translationKey, this.targetObjectName).subscribe({ + next: (result): void => { + if (result) { + this.confirmed.emit(); + } + } + }); + } } diff --git a/src/Turnierplan.App/Client/src/app/portal/components/delete-modal/delete-modal.component.html b/src/Turnierplan.App/Client/src/app/portal/components/delete-modal/delete-modal.component.html new file mode 100644 index 00000000..56fa78b5 --- /dev/null +++ b/src/Turnierplan.App/Client/src/app/portal/components/delete-modal/delete-modal.component.html @@ -0,0 +1,26 @@ + + + diff --git a/src/Turnierplan.App/Client/src/app/portal/components/delete-modal/delete-modal.component.ts b/src/Turnierplan.App/Client/src/app/portal/components/delete-modal/delete-modal.component.ts new file mode 100644 index 00000000..354d48a0 --- /dev/null +++ b/src/Turnierplan.App/Client/src/app/portal/components/delete-modal/delete-modal.component.ts @@ -0,0 +1,34 @@ +import { Component, inject } from '@angular/core'; +import { ActionButtonComponent } from '../action-button/action-button.component'; +import { TranslateDirective, TranslatePipe } from '@ngx-translate/core'; +import { E2eDirective } from '../../../core/directives/e2e.directive'; +import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { map, Observable } from 'rxjs'; +import { filter } from 'rxjs/operators'; + +export const showDeleteModal = (ngbModal: NgbModal, translationKey: string, targetObjectName: string): Observable => { + const ref = ngbModal.open(DeleteModalComponent, { + size: 'md', + fullscreen: 'md', + centered: true + }); + + ref.componentInstance.translationKey = translationKey; + ref.componentInstance.targetObjectName = targetObjectName; + + return ref.closed.pipe( + map((x) => x as boolean), + filter((x) => x) + ); +}; + +@Component({ + imports: [ActionButtonComponent, TranslatePipe, TranslateDirective, E2eDirective], + templateUrl: './delete-modal.component.html' +}) +export class DeleteModalComponent { + public translationKey: string = ''; + public targetObjectName: string = ''; + + protected readonly modal = inject(NgbActiveModal); +} diff --git a/src/Turnierplan.App/Client/src/app/portal/components/delete-widget/delete-widget.component.html b/src/Turnierplan.App/Client/src/app/portal/components/delete-widget/delete-widget.component.html index 81fada33..f5b18a1a 100644 --- a/src/Turnierplan.App/Client/src/app/portal/components/delete-widget/delete-widget.component.html +++ b/src/Turnierplan.App/Client/src/app/portal/components/delete-widget/delete-widget.component.html @@ -25,29 +25,7 @@ [icon]="'trash'" [disabled]="!allowDeletion" [title]="'Portal.DeleteWidget.Delete'" - (buttonClick)="deleteClicked(confirmModal)" /> + (buttonClick)="deleteClicked()" />
} - - - - - - diff --git a/src/Turnierplan.App/Client/src/app/portal/components/delete-widget/delete-widget.component.ts b/src/Turnierplan.App/Client/src/app/portal/components/delete-widget/delete-widget.component.ts index 4effd227..ca814369 100644 --- a/src/Turnierplan.App/Client/src/app/portal/components/delete-widget/delete-widget.component.ts +++ b/src/Turnierplan.App/Client/src/app/portal/components/delete-widget/delete-widget.component.ts @@ -4,7 +4,8 @@ import { NgClass } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { ActionButtonComponent } from '../action-button/action-button.component'; import { E2eDirective } from '../../../core/directives/e2e.directive'; -import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { showDeleteModal } from '../delete-modal/delete-modal.component'; @Component({ selector: 'tp-delete-widget', @@ -20,6 +21,7 @@ export class DeleteWidgetComponent { @Input() public set targetObjectName(value: string) { + this._targetObjectName = value; this.confirmationText = value.replaceAll(/[^A-Za-z0-9.\-_|ÄÖÜäöüß ]+/g, '').trim(); } @@ -29,7 +31,8 @@ export class DeleteWidgetComponent { protected confirmationText?: string; protected confirmationTextInput: string = ''; protected allowDeletion = false; - protected openModal?: NgbModalRef; + + private _targetObjectName: string = ''; constructor(private readonly modalService: NgbModal) {} @@ -37,18 +40,15 @@ export class DeleteWidgetComponent { this.allowDeletion = this.confirmationText !== undefined && this.confirmationText === this.confirmationTextInput.trim(); } - protected deleteClicked(template: TemplateRef): void { + protected deleteClicked(): void { if (this.allowDeletion) { - this.openModal = this.modalService.open(template, { - size: 'md', - fullscreen: 'md', - centered: true + showDeleteModal(this.modalService, this.translationKey, this._targetObjectName).subscribe({ + next: (result): void => { + if (result) { + this.deleteClick.emit(); + } + } }); } } - - protected confirmDeleteClicked(): void { - this.openModal?.dismiss(); - this.deleteClick.emit(); - } } diff --git a/src/Turnierplan.App/Client/src/app/portal/components/document-manager/document-manager.component.html b/src/Turnierplan.App/Client/src/app/portal/components/document-manager/document-manager.component.html index 2e7a97ff..ad549ed0 100644 --- a/src/Turnierplan.App/Client/src/app/portal/components/document-manager/document-manager.component.html +++ b/src/Turnierplan.App/Client/src/app/portal/components/document-manager/document-manager.component.html @@ -20,7 +20,7 @@ @if (writeAllowed) { - + } @@ -93,7 +93,11 @@ @if (writeAllowed) { - + } diff --git a/src/Turnierplan.App/Client/src/app/portal/components/image-manager/image-manager.component.html b/src/Turnierplan.App/Client/src/app/portal/components/image-manager/image-manager.component.html index 8069ec88..daee5980 100644 --- a/src/Turnierplan.App/Client/src/app/portal/components/image-manager/image-manager.component.html +++ b/src/Turnierplan.App/Client/src/app/portal/components/image-manager/image-manager.component.html @@ -58,7 +58,11 @@ @if (writeAllowed) { - + } diff --git a/src/Turnierplan.App/Client/src/app/portal/components/image-manager/image-manager.component.ts b/src/Turnierplan.App/Client/src/app/portal/components/image-manager/image-manager.component.ts index aca5694a..2cd31bad 100644 --- a/src/Turnierplan.App/Client/src/app/portal/components/image-manager/image-manager.component.ts +++ b/src/Turnierplan.App/Client/src/app/portal/components/image-manager/image-manager.component.ts @@ -87,8 +87,8 @@ export class ImageManagerComponent { this.notificationService.showNotification( 'info', - 'Portal.ViewOrganization.Images.DeleteToast.Title', - 'Portal.ViewOrganization.Images.DeleteToast.Message' + 'Portal.ViewOrganization.Images.Delete.SuccessToast.Title', + 'Portal.ViewOrganization.Images.Delete.SuccessToast.Message' ); }, error: (error) => { diff --git a/src/Turnierplan.App/Client/src/app/portal/components/manage-applications/manage-applications.component.html b/src/Turnierplan.App/Client/src/app/portal/components/manage-applications/manage-applications.component.html index 8542fb31..29a5ba0e 100644 --- a/src/Turnierplan.App/Client/src/app/portal/components/manage-applications/manage-applications.component.html +++ b/src/Turnierplan.App/Client/src/app/portal/components/manage-applications/manage-applications.component.html @@ -245,7 +245,12 @@ [margin]="false" [tooltipText]="'Portal.ViewPlanningRealm.Applications.CannotDeleteTeamWhileLinked'" /> } @else { - + } diff --git a/src/Turnierplan.App/Client/src/app/portal/components/ranking/ranking.component.html b/src/Turnierplan.App/Client/src/app/portal/components/ranking/ranking.component.html index 38391802..af19df83 100644 --- a/src/Turnierplan.App/Client/src/app/portal/components/ranking/ranking.component.html +++ b/src/Turnierplan.App/Client/src/app/portal/components/ranking/ranking.component.html @@ -48,7 +48,14 @@ @if (ranking.rankingOverwriteId !== undefined) {
- +
} diff --git a/src/Turnierplan.App/Client/src/app/portal/pages/view-tournament/view-tournament.component.ts b/src/Turnierplan.App/Client/src/app/portal/pages/view-tournament/view-tournament.component.ts index 0ed0cfa9..2b57a301 100644 --- a/src/Turnierplan.App/Client/src/app/portal/pages/view-tournament/view-tournament.component.ts +++ b/src/Turnierplan.App/Client/src/app/portal/pages/view-tournament/view-tournament.component.ts @@ -450,8 +450,8 @@ export class ViewTournamentComponent implements OnInit, OnDestroy { next: () => { this.notificationService.showNotification( 'info', - 'Portal.ViewTournament.Documents.DeleteToast.Title', - 'Portal.ViewTournament.Documents.DeleteToast.Message' + 'Portal.ViewTournament.Documents.Delete.SuccessToast.Title', + 'Portal.ViewTournament.Documents.Delete.SuccessToast.Message' ); }, error: (error) => {