diff --git a/src/lib/listing/listing.module.ts b/src/lib/listing/listing.module.ts index bd16572..9192053 100644 --- a/src/lib/listing/listing.module.ts +++ b/src/lib/listing/listing.module.ts @@ -21,6 +21,7 @@ import { CircleButtonComponent, IconButtonComponent } from '../buttons'; import { MatIconModule } from '@angular/material/icon'; import { EmptyStateComponent } from '../empty-state'; import { InputWithActionComponent, RoundCheckboxComponent } from '../inputs'; +import { SnakeCasePipe } from '../pipes/snake-case.pipe'; const matModules = [MatTooltipModule, MatIconModule]; const components = [ @@ -50,6 +51,7 @@ const modules = [DragDropModule, TranslateModule, IqserFiltersModule, ScrollingM RoundCheckboxComponent, InputWithActionComponent, SyncWidthDirective, + SnakeCasePipe, ], }) export class IqserListingModule {} diff --git a/src/lib/listing/table-content/table-content.component.html b/src/lib/listing/table-content/table-content.component.html index b086b4d..114ded8 100644 --- a/src/lib/listing/table-content/table-content.component.html +++ b/src/lib/listing/table-content/table-content.component.html @@ -15,7 +15,7 @@ (mouseleave)="itemMouseLeaveFn && itemMouseLeaveFn(entity)" *ngIf="itemMouseEnterFn || itemMouseLeaveFn; else withoutMouseEvents" [class.help-mode-active]="helpModeService?.isHelpModeActive$ | async" - [id]="'item-' + entity.id" + [id]="rowIdPrefix + '-' + ((entity[namePropertyKey] | snakeCase) ?? entity.id)" [ngClass]="getTableItemClasses(entity)" [routerLink]="entity.routerLink" > @@ -29,7 +29,7 @@
diff --git a/src/lib/listing/table-content/table-content.component.ts b/src/lib/listing/table-content/table-content.component.ts index bd400bf..4056f50 100644 --- a/src/lib/listing/table-content/table-content.component.ts +++ b/src/lib/listing/table-content/table-content.component.ts @@ -23,6 +23,8 @@ export class TableContentComponent, PrimaryK @Input() itemMouseLeaveFn?: (entity: Class) => void; @Input() tableItemClasses?: Record boolean>; @Input() selectionEnabled!: boolean; + @Input() rowIdPrefix: string = 'item'; + @Input() namePropertyKey?: string; readonly trackBy = trackByFactory(); @ViewChild(CdkVirtualScrollViewport, { static: true }) readonly scrollViewport!: CdkVirtualScrollViewport; diff --git a/src/lib/listing/table/table.component.html b/src/lib/listing/table/table.component.html index 4d430a1..8c77d8b 100644 --- a/src/lib/listing/table/table.component.html +++ b/src/lib/listing/table/table.component.html @@ -30,6 +30,8 @@ [itemSize]="itemSize" [selectionEnabled]="selectionEnabled" [tableItemClasses]="tableItemClasses" + [rowIdPrefix]="rowIdPrefix" + [namePropertyKey]="namePropertyKey" > , PrimaryKey exte @Input() helpModeKey?: string; @Input() headerHelpModeKey?: string; @Input() tableItemClasses?: Record boolean>; + @Input() rowIdPrefix: string = 'item'; + @Input() namePropertyKey?: string; @Input() itemMouseEnterFn?: (entity: Class) => void; @Input() itemMouseLeaveFn?: (entity: Class) => void; @Output() readonly noDataAction = new EventEmitter(); diff --git a/src/lib/pipes/snake-case.pipe.ts b/src/lib/pipes/snake-case.pipe.ts new file mode 100644 index 0000000..b2c247d --- /dev/null +++ b/src/lib/pipes/snake-case.pipe.ts @@ -0,0 +1,14 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'snakeCase', + standalone: true, +}) +export class SnakeCasePipe implements PipeTransform { + transform(value: string): string | undefined { + if (!value) { + return undefined; + } + return value.toLowerCase().replaceAll(' ', '_'); + } +}