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 @@
+
+
+
+
+
+ @let additionalModalTextKey = translationKey + '.AdditionalModalText';
+ @let additionalModalText = additionalModalTextKey | translate;
+ @if (additionalModalText !== additionalModalTextKey) {
+
{{ additionalModalText }}
+ }
+
+
+ {{ targetObjectName }}
+
+
+
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()" />
}
-
-
-
-
-
-
-
- {{ confirmationText }}
-
-
-
-
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) => {