diff --git a/src/app/features/dashboard/catalogs/add-edit-catalog-dialog/add-edit-catalog-dialog.component.html b/src/app/features/dashboard/catalogs/add-edit-catalog-dialog/add-edit-catalog-dialog.component.html index cdd49c43003dcc6239d621e4455004fb0afec6f6..eeb2c4817ecc5c8d25494a619fcd7101a0e41bb3 100644 --- a/src/app/features/dashboard/catalogs/add-edit-catalog-dialog/add-edit-catalog-dialog.component.html +++ b/src/app/features/dashboard/catalogs/add-edit-catalog-dialog/add-edit-catalog-dialog.component.html @@ -81,7 +81,7 @@ } </mat-form-field> - <mat-checkbox formControlName="selfPublish"> + <mat-checkbox formControlName="selfPublish" color="primary"> Self publish? </mat-checkbox> </div> diff --git a/src/app/features/dashboard/catalogs/catalogs.component.html b/src/app/features/dashboard/catalogs/catalogs.component.html index 58420566c904a1c0a3fb1228c286a7b9559b2875..1a3cfdcdda9c58a518156a97f97f7e1a6f11c081 100644 --- a/src/app/features/dashboard/catalogs/catalogs.component.html +++ b/src/app/features/dashboard/catalogs/catalogs.component.html @@ -11,19 +11,32 @@ ></gp-breadcrumb-navigation> </div> </section> - <div class="add-catalog"> + <div class="controls-container"> + <mat-form-field> + <mat-label>Filter</mat-label> + <input + matInput + (keyup)="applyFilter($event)" + placeholder="Ex. Mia" + #input + /> + </mat-form-field> <button mat-raised-button color="primary" (click)="onClickAddNewCatalog()"> Add new catalog </button> </div> - <div class="filter"> - <span>Filter</span> - </div> <div class="table-container"> - <table mat-table [dataSource]="catalogs"> + <table + mat-table + [dataSource]="dataSource" + matSort + matSortActive="name" + matSortDisableClear + matSortDirection="asc" + > <!-- Name Column --> <ng-container matColumnDef="name"> - <th mat-header-cell *matHeaderCellDef>Catalog name</th> + <th mat-header-cell *matHeaderCellDef mat-sort-header>Catalog name</th> <td mat-cell *matCellDef="let element"> {{ element.name }} </td> @@ -31,7 +44,7 @@ <!-- Type Column --> <ng-container matColumnDef="type"> - <th mat-header-cell *matHeaderCellDef>Catalog type</th> + <th mat-header-cell *matHeaderCellDef mat-sort-header>Catalog type</th> <td mat-cell *matCellDef="let element" class="font-weight500"> {{ element.type }} </td> @@ -39,7 +52,9 @@ <!-- Published Column --> <ng-container matColumnDef="publisher"> - <th mat-header-cell *matHeaderCellDef>Publisher name</th> + <th mat-header-cell *matHeaderCellDef mat-sort-header> + Publisher name + </th> <td mat-cell *matCellDef="let element" class="font-weight500"> {{ element.publisher }} </td> @@ -47,7 +62,7 @@ <!-- Self Pub Column --> <ng-container matColumnDef="selfPublish"> - <th mat-header-cell *matHeaderCellDef>Self-PUB</th> + <th mat-header-cell *matHeaderCellDef mat-sort-header>Self-PUB</th> <td mat-cell *matCellDef="let element" class="font-weight500"> {{ element.selfPublish ? "Yes" : "No" }} </td> @@ -55,7 +70,7 @@ <!-- Access type Column --> <ng-container matColumnDef="accessTypeCode"> - <th mat-header-cell *matHeaderCellDef>Access type</th> + <th mat-header-cell *matHeaderCellDef mat-sort-header>Access type</th> <td mat-cell *matCellDef="let element"> {{ element.accessTypeCode === "PB" ? "Public" : "Restricted" }} </td> @@ -63,7 +78,7 @@ <!-- Total models Column --> <ng-container matColumnDef="solutionCount"> - <th mat-header-cell *matHeaderCellDef>Total models</th> + <th mat-header-cell *matHeaderCellDef mat-sort-header>Total models</th> <td mat-cell *matCellDef="let element"> {{ element.solutionCount }} </td> @@ -71,7 +86,7 @@ <!-- Created date Column --> <ng-container matColumnDef="created"> - <th mat-header-cell *matHeaderCellDef>Created date</th> + <th mat-header-cell *matHeaderCellDef mat-sort-header>Created date</th> <td mat-cell *matCellDef="let element"> {{ element.created | date: "dd/MM/yyyy" }} </td> @@ -98,15 +113,18 @@ <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr> <tr mat-row *matRowDef="let row; columns: displayedColumns"></tr> + <tr class="mat-row" *matNoDataRow> + <td class="mat-cell" colspan="4"> + No data matching the filter "{{ input.value }}" + </td> + </tr> </table> </div> <div class="pagination-container"> <div class="pagination-text"> <mat-paginator - [length]="totalItems" - [pageSize]="pageSize" [pageSizeOptions]="pageSizeOptions" - (page)="onPageChange($event)" + paginator aria-label="Select page" aria-label="Select page" > diff --git a/src/app/features/dashboard/catalogs/catalogs.component.scss b/src/app/features/dashboard/catalogs/catalogs.component.scss index 21ce949cc000e595ecf102846eb6d75a9a201fff..f893baa384012ea3cd196828eb899f99a1123c51 100644 --- a/src/app/features/dashboard/catalogs/catalogs.component.scss +++ b/src/app/features/dashboard/catalogs/catalogs.component.scss @@ -127,11 +127,6 @@ mat-sidenav-content { flex-grow: 2 !important; } -.add-catalog { - display: flex; - justify-content: flex-end; -} - .filter { display: flex; justify-content: flex-end; @@ -158,3 +153,10 @@ mat-sidenav-content { cursor: not-allowed; background: #efefef; } + +.controls-container { + display: flex; + gap: 20px; + justify-content: space-between; + align-items: center; +} diff --git a/src/app/features/dashboard/catalogs/catalogs.component.ts b/src/app/features/dashboard/catalogs/catalogs.component.ts index 6a3e6ccae38d6146c1cdb94a48b15815a43d0ac1..ac3d27d1cb8f8f45b67b76d89632cce6f363e99d 100644 --- a/src/app/features/dashboard/catalogs/catalogs.component.ts +++ b/src/app/features/dashboard/catalogs/catalogs.component.ts @@ -6,21 +6,21 @@ import { PrivateCatalogsService } from 'src/app/core/services/private-catalogs.s import { BrowserStorageService } from 'src/app/core/services/storage/browser-storage.service'; import { Router } from '@angular/router'; import { HeadlineComponent } from 'src/app/shared/components/headline/headline.component'; -import { MatSidenavModule } from '@angular/material/sidenav'; -import { MatTableModule } from '@angular/material/table'; +import { MatTableDataSource, MatTableModule } from '@angular/material/table'; import { MatPaginator, MatPaginatorIntl, MatPaginatorModule, - PageEvent, } from '@angular/material/paginator'; import { Catalog } from 'src/app/shared/models'; import { MatButtonModule } from '@angular/material/button'; import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { AddEditCatalogDialogComponent } from './add-edit-catalog-dialog/add-edit-catalog-dialog.component'; import { MatIconModule } from '@angular/material/icon'; -import { ConfirmActionComponent } from 'src/app/shared/components/confirm-action/confirm-action.component'; import { DeleteUserDialogConfirmationActionComponent } from 'src/app/shared/components/delete-user-dialog-confirmation-action/delete-user-dialog-confirmation-action.component'; +import { MatInputModule } from '@angular/material/input'; +import { MatSort, MatSortModule } from '@angular/material/sort'; +import { MatFormFieldModule } from '@angular/material/form-field'; @Component({ selector: 'gp-catalogs', @@ -33,11 +33,17 @@ import { DeleteUserDialogConfirmationActionComponent } from 'src/app/shared/comp MatPaginatorModule, MatButtonModule, MatIconModule, + MatInputModule, + MatSortModule, + MatFormFieldModule, ], templateUrl: './catalogs.component.html', styleUrl: './catalogs.component.scss', }) export class CatalogsComponent implements OnInit { + @ViewChild(MatSort) sort!: MatSort; + @ViewChild(MatPaginator) paginator!: MatPaginator; + userId$: Observable<string | undefined>; displayedColumns: string[] = [ 'name', @@ -51,29 +57,32 @@ export class CatalogsComponent implements OnInit { ]; catalogs!: Catalog[]; pageSizeOptions = [10, 25, 50, 100]; - pageSize = 10; - pageIndex = 0; - totalItems = 0; siteInstanceName!: string; selectedCatalog!: Catalog; + dataSource = new MatTableDataSource<Catalog>([]); constructor( private privateCatalogsService: PrivateCatalogsService, private router: Router, private browserStorageService: BrowserStorageService, - private paginator: MatPaginatorIntl, + private paginatorInt: MatPaginatorIntl, public dialog: MatDialog, ) { this.userId$ = this.browserStorageService .getUserDetails() .pipe(map((details) => details?.userId)); - paginator.itemsPerPageLabel = 'Showing'; + paginatorInt.itemsPerPageLabel = 'Showing'; } ngOnInit(): void { this.loadData(); this.getInstanceName(); } + ngAfterViewInit() { + this.dataSource.sort = this.sort; + this.dataSource.paginator = this.paginator; + } + onHomeClick() { this.userId$.subscribe((userId) => { if (userId) { @@ -87,11 +96,10 @@ export class CatalogsComponent implements OnInit { loadData() { this.privateCatalogsService.loadTotalCatalog().subscribe({ next: (res) => { - this.totalItems = res; - this.privateCatalogsService.loadCatalogs(0, this.totalItems).subscribe({ + this.privateCatalogsService.loadCatalogs(0, res).subscribe({ next: (res) => { this.catalogs = res.response_body.content; - this.totalItems = res.response_body.totalElements; + this.dataSource.data = res.response_body.content; }, error: (error) => {}, }); @@ -114,12 +122,6 @@ export class CatalogsComponent implements OnInit { }); } - onPageChange(event: PageEvent): void { - this.pageSize = event.pageSize; - this.pageIndex = event.pageIndex; - this.loadData(); - } - addNewCatalog(newCatalog: Catalog) { const catalog: Catalog = { ...newCatalog, @@ -196,4 +198,12 @@ export class CatalogsComponent implements OnInit { this.loadData(); }); } + + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value; + this.dataSource.filter = filterValue.trim().toLowerCase(); + if (this.dataSource.paginator) { + this.dataSource.paginator.firstPage(); + } + } }