Skip to content

Commit 3a5ace7

Browse files
committed
Add a search field for filtering clubs when editing or creating a DSB member.
Filter clubs by name, identifier, and region while keeping the selected club visible in the dropdown.
1 parent a8bd22a commit 3a5ace7

2 files changed

Lines changed: 46 additions & 5 deletions

File tree

bogenliga/src/app/modules/verwaltung/components/dsb-mitglied/dsb-mitglied-detail/dsb-mitglied-detail.component.html

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,14 +135,24 @@
135135
<span> *</span>
136136
</label>
137137
<div class="col-sm-9">
138+
<input type="text"
139+
class="form-control mb-2"
140+
id="dsbMitgliedVereinSuche"
141+
name="dsbMitgliedVereinSuche"
142+
[(ngModel)]="vereinSearchTerm"
143+
(ngModelChange)="onVereinSearch($event)"
144+
placeholder="{{ 'SELECTIONLIST.SEARCH_PLACEHOLDER' | translate }}"
145+
autocomplete="off"
146+
data-cy="detail-vereine-dsb-search"
147+
[readonly]="isReadOnly">
138148
<select class="form-control"
139149
id="dsbMitgliedVerein"
140150
name="dsbMitgliedVerein"
141151
#dsbMitgliedVerein="ngModel"
142152
[(ngModel)]="currentVerein"
143153
data-cy="detail-vereine-dsb"
144154
[disabled]="isReadOnly">
145-
<option [ngValue]="verein" *ngFor="let verein of vereine"> {{verein.name}}</option>
155+
<option [ngValue]="verein" *ngFor="let verein of filteredVereine"> {{verein.name}}</option>
146156
</select>
147157
<div class="invalid-feedback">
148158
{{ 'MANAGEMENT.DSBMITGLIEDER_DETAIL.FORM.VEREIN.ERROR' | translate }}

bogenliga/src/app/modules/verwaltung/components/dsb-mitglied/dsb-mitglied-detail/dsb-mitglied-detail.component.ts

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ export class DsbMitgliedDetailComponent extends CommonComponentDirective impleme
4848
public ButtonType = ButtonType;
4949
public currentMitglied: DsbMitgliedDO = new DsbMitgliedDO();
5050
public currentVerein: VereinDO = new VereinDO();
51-
// public vereine: Array<VereinDO> = [new VereinDO()];
52-
public vereine: VereinDO[];
53-
// public currentVerein: VereinDO;
51+
public vereine: VereinDO[] = [];
52+
public filteredVereine: VereinDO[] = [];
53+
public vereinSearchTerm = '';
5454

5555
public dsbMitgliedNationalitaet: string[];
5656
public loadingVereine = true;
@@ -373,6 +373,7 @@ export class DsbMitgliedDetailComponent extends CommonComponentDirective impleme
373373

374374
}
375375
});
376+
this.applyVereinFilter();
376377
}
377378

378379
private handleFailure(response: BogenligaResponse<DsbMitgliedDO>) {
@@ -432,13 +433,43 @@ export class DsbMitgliedDetailComponent extends CommonComponentDirective impleme
432433
if (this.currentUserService.hasPermission(UserPermission.CAN_CREATE_VEREIN_DSBMITGLIEDER)) {
433434
response.payload = response.payload.filter((entry) => this.currentUserService.getVerein() === entry.id);
434435
}
435-
// this.currentVerein = response.payload[0];
436436
this.vereine = response.payload;
437+
this.applyVereinFilter();
437438
this.loadingVereine = false;
438439
this.vereineLoaded = true;
439440
})
440441
.catch((response: BogenligaResponse<VereinDTO[]>) => {
441442
this.vereine = response.payload;
443+
this.applyVereinFilter();
442444
});
443445
}
446+
447+
public onVereinSearch(searchTerm: string): void {
448+
this.vereinSearchTerm = searchTerm;
449+
this.applyVereinFilter();
450+
}
451+
452+
private applyVereinFilter(): void {
453+
const normalizedSearchTerm = (this.vereinSearchTerm || '').trim().toLocaleLowerCase();
454+
455+
if (!normalizedSearchTerm) {
456+
this.filteredVereine = [...this.vereine];
457+
return;
458+
}
459+
460+
this.filteredVereine = this.vereine.filter((verein: VereinDO) => this.matchesVereinSearch(verein, normalizedSearchTerm));
461+
462+
if (this.currentVerein?.id && !this.filteredVereine.some((verein: VereinDO) => verein.id === this.currentVerein.id)) {
463+
const selectedVerein = this.vereine.find((verein: VereinDO) => verein.id === this.currentVerein.id);
464+
if (selectedVerein) {
465+
this.filteredVereine = [selectedVerein, ...this.filteredVereine];
466+
}
467+
}
468+
}
469+
470+
private matchesVereinSearch(verein: VereinDO, normalizedSearchTerm: string): boolean {
471+
return [verein.name, verein.identifier, verein.regionName]
472+
.filter((value: string) => !!value)
473+
.some((value: string) => value.toLocaleLowerCase().includes(normalizedSearchTerm));
474+
}
444475
}

0 commit comments

Comments
 (0)