From 12561ec45b90b7c25f3ae3a3e804b6d2026ed2bd Mon Sep 17 00:00:00 2001 From: kaw67872 <kawtar.laariche@iais.fraunhofer.de> Date: Thu, 6 Jun 2024 11:39:40 +0200 Subject: [PATCH] #22: :recycle: refactor my models component --- .../my-models/my-models.component.html | 382 ++++++------------ .../my-models/my-models.component.ts | 195 ++++----- .../on-boarding-model.component.html | 239 +++++------ .../on-boarding-model.component.ts | 4 +- 4 files changed, 326 insertions(+), 494 deletions(-) diff --git a/src/app/features/dashboard/my-models/my-models.component.html b/src/app/features/dashboard/my-models/my-models.component.html index 513f824..e1fddb8 100644 --- a/src/app/features/dashboard/my-models/my-models.component.html +++ b/src/app/features/dashboard/my-models/my-models.component.html @@ -24,229 +24,119 @@ <mat-sidenav-content> <div style="display: flex; flex-direction: column; padding: 20px"> <div style="display: flex; flex-direction: row; align-self: end"> - <div - class="gp-sort-by" - *ngIf="!isPublishedSolutionsLoading && !isUnpublishedSolutionsLoading" - > + <div class="gp-sort-by"> <gp-sort-by [sortByOptions]="sortByOptions" [selectedSortBy]="sortByFilter" (sortBySelected)="updateFieldToDirectionMap($event)" ></gp-sort-by> </div> - <div - class="gp-card-list-view" - *ngIf="!isPublishedSolutionsLoading && !isUnpublishedSolutionsLoading" - > + <div class="gp-card-list-view"> <gp-solutions-toggle-view [viewTile]="viewTile" (viewTileChange)="onViewTileChange($event)" ></gp-solutions-toggle-view> </div> </div> - <mat-chip-set #chipGrid *ngIf="pageSelection.length >= 1"> - @for (selectedPage of pageSelection; track selectedPage) { - <mat-chip-row> - {{ selectedPage }} + <!--Unpublished models section--> + @if (modelType === "both") { + <div style="display: flex; flex-direction: column"> + <gp-model-list + [solutions]="selectedUnpublishedSolutions" + [totalItems]="unpublishedTotalItems" + [isLoading]="isUnpublishedSolutionsLoading" + [headlineTitle]="'MY UNPUBLISHED MODELS'" + [showEntirePage]="false" + [viewTile]="viewTile" + [pageSize]="pageSize" + [pageIndex]="pageIndex" + [pageSizeOptions]="pageSizeOptions" + [modelType]="'unpublished'" + [favoriteSolutionsMap]="favoriteSolutionsMap" + [calculateStartIndex]="calculateStartIndex(pageIndex, pageSize)" + [calculateEndIndex]=" + calculateEndIndex(unpublishedTotalItems, pageIndex, pageSize) + " + (pageChange)="onPageChange($event)" + (updateFavorite)="updateFavorite($event)" + (backEvent)="onClickBack('both')" + ></gp-model-list> + + <div style="display: flex; margin-left: auto"> <button - matChipRemove - [attr.aria-label]="'remove ' + selectedPage" - (click)="onRemoveSelectedPage(selectedPage)" + style="cursor: pointer" + aria-label="Example icon button with a menu icon" + (click)="onClickSeeAll('unpublished')" > - <mat-icon>cancel</mat-icon> + <div + style=" + display: flex; + justify-content: center; + align-items: center; + " + > + <span>See all</span> <mat-icon>arrow_forward_ios</mat-icon> + </div> </button> - </mat-chip-row> - } - </mat-chip-set> - <!--Unpublished models section--> - <div - *ngIf="isUnpublishedSolutionsSelected" - style="display: flex; flex-direction: column" - > - <div - style=" - display: flex; - flex-direction: row; - gap: 10px; - align-items: center; - " - > - <div> - <gp-headline - *ngIf=" - isUnpublishedSolutionsSelected && isPublishedSolutionsSelected - " - [headlineTitle]="'MY UNPUBLISHED MODELS '" - ></gp-headline> </div> - <div - style="flex: 1" - *ngIf=" - !isUnpublishedSolutionsLoading && isUnpublishedSolutionsSelected + </div> + } + + @if (modelType === "unpublished") { + <div style="display: flex; flex-direction: column"> + <gp-model-list + [solutions]="selectedUnpublishedSolutions" + [totalItems]="unpublishedTotalItems" + [isLoading]="isUnpublishedSolutionsLoading" + [headlineTitle]="'MY UNPUBLISHED MODELS'" + [showEntirePage]="true" + [viewTile]="viewTile" + [pageSize]="pageSize" + [pageIndex]="pageIndex" + [pageSizeOptions]="pageSizeOptions" + [modelType]="'unpublished'" + [favoriteSolutionsMap]="favoriteSolutionsMap" + [calculateStartIndex]="calculateStartIndex(pageIndex, pageSize)" + [calculateEndIndex]=" + calculateEndIndex(unpublishedTotalItems, pageIndex, pageSize) " - > - @if (unpublishedTotalItems > 0 && isUnpublishedSolutionsSelected) { - <div style="margin: 24px; font-size: 14px; font-weight: normal"> - <span style="color: #2e2f2f" - >Showing - - <span style="color: #8f8f8f"> - {{ calculateStartIndex(pageIndex, pageSize) }} to - {{ - calculateEndIndex( - unpublishedTotalItems, - pageIndex, - pageSize - ) - }} - of {{ unpublishedTotalItems }} Models</span - ></span - > - </div> - } - </div> - @if ( - unpublishedTotalItems > 4 && - isUnpublishedSolutionsSelected && - isPublishedSolutionsSelected - ) { - <div style="align-self: flex-end; margin-left: auto"> - <button - style="cursor: pointer" - aria-label="Example icon button with a menu icon" - (click)="onClickSeeAllUnpublishedModels()" - > - <div - style=" - display: flex; - justify-content: center; - align-items: center; - " - > - <span>See all</span> <mat-icon>arrow_forward_ios</mat-icon> - </div> - </button> - </div> - } + (pageChange)="onPageChange($event)" + (updateFavorite)="updateFavorite($event)" + (backEvent)="onClickBack('both')" + ></gp-model-list> </div> - <ng-container - *ngIf=" - selectedUnpublishedSolutions && - isUnpublishedSolutionsSelected && - !isUnpublishedSolutionsLoading; - else loadingUnpublishedModelsState - " - > - <ng-container - *ngIf="selectedUnpublishedSolutions.length > 0; else noCatalogs" - > - <div *ngIf="!viewTile; else gridView"> - <!-- Horizontal list view content --> - <div class="grid-list"> - <gp-list-item - [isPublishedSolution]="false" - [item]="item" - [items]="selectedUnpublishedSolutions" - [isMarketPlacePage]="true" - *ngFor="let item of selectedUnpublishedSolutions" - ></gp-list-item> - </div> - </div> - <ng-template #gridView> - <div class="grid-list"> - <mat-grid-list cols="5" rowHeight="3:4" gutterSize="20px"> - <mat-grid-tile - *ngFor="let item of selectedUnpublishedSolutions" - > - <div class="cards-container"> - <gp-card-item - [isPublishedSolution]="false" - [item]="item" - [items]="selectedUnpublishedSolutions" - [isMarketPlacePage]="true" - [isFavoriteSolution]=" - favoriteSolutionsMap[item.solutionId] - " - (favoriteClicked)="updateFavorite(item.solutionId)" - ></gp-card-item> - </div> - </mat-grid-tile> - </mat-grid-list> - </div> - </ng-template> - </ng-container> - <ng-template #noCatalogs> - <div class="loading-data"> - <p>No result found...</p> - </div> - </ng-template> - </ng-container> - <ng-template #loadingUnpublishedModelsState> - <div class="loading-data"> - <p>Loading unpublished models ...</p> - </div> - </ng-template> - @if ( - unpublishedTotalItems > 0 && - isUnpublishedSolutionsSelected && - !isPublishedSolutionsSelected - ) { - <mat-paginator - [length]="unpublishedTotalItems" + } + + <!--published solutions --> + + @if (modelType === "both") { + <div style="display: flex; flex-direction: column"> + <gp-model-list + [solutions]="selectedPublishedSolutions" + [totalItems]="publishedTotalItems" + [isLoading]="isPublishedSolutionsLoading" + [headlineTitle]="'MY PUBLISHED MODELS'" + [showEntirePage]="false" + [viewTile]="viewTile" [pageSize]="pageSize" + [pageIndex]="pageIndex" [pageSizeOptions]="pageSizeOptions" - (page)="onPageChange($event)" - aria-label="Select page" - aria-label="Select page" - > - </mat-paginator> - } - </div> - </div> + [modelType]="'published'" + [favoriteSolutionsMap]="favoriteSolutionsMap" + [calculateStartIndex]="calculateStartIndex(pageIndex, pageSize)" + [calculateEndIndex]=" + calculateEndIndex(publishedTotalItems, pageIndex, pageSize) + " + (pageChange)="onPageChange($event)" + (updateFavorite)="updateFavorite($event)" + (backEvent)="onClickBack('both')" + ></gp-model-list> - <!--published solutions --> - <div - *ngIf="isPublishedSolutionsSelected" - style="display: flex; flex-direction: column" - > - <div - style=" - display: flex; - flex-direction: row; - align-items: center; - padding: 20px; - " - > - <div - *ngIf="isUnpublishedSolutionsSelected && isPublishedSolutionsSelected" - > - <gp-headline [headlineTitle]="'MY PUBLISHED MODELS '"></gp-headline> - </div> - <div style="flex: 1" *ngIf="!isPublishedSolutionsLoading"> - @if (publishedTotalItems > 0 && isPublishedSolutionsSelected) { - <div style="margin: 24px; font-size: 14px; font-weight: normal"> - <span style="color: #2e2f2f" - >Showing - - <span style="color: #8f8f8f"> - {{ calculateStartIndex(pageIndex, pageSize) }} to - {{ - calculateEndIndex(publishedTotalItems, pageIndex, pageSize) - }} - of {{ publishedTotalItems }} Models</span - ></span - > - </div> - } - </div> - @if ( - publishedTotalItems > 4 && - isPublishedSolutionsSelected && - isUnpublishedSolutionsSelected - ) { - <div style="align-self: flex-end; margin-left: auto"> + <div style="display: flex; margin-left: auto"> <button style="cursor: pointer" aria-label="Example icon button with a menu icon" - (click)="onClickSeeAllPublishedModels()" + (click)="onClickSeeAll('published')" > <div style=" @@ -259,77 +149,31 @@ </div> </button> </div> - } - </div> - <ng-container - *ngIf=" - selectedPublishedSolutions && - isPublishedSolutionsSelected && - !isPublishedSolutionsLoading; - else loadingPublishedModelsState - " - > - <ng-container - *ngIf="selectedPublishedSolutions.length > 0; else noCatalogs" - > - <div *ngIf="!viewTile; else gridView"> - <!-- Horizontal list view content --> - <div class="grid-list"> - <gp-list-item - [isPublishedSolution]="true" - [item]="item" - [items]="selectedPublishedSolutions" - [isMarketPlacePage]="true" - *ngFor="let item of selectedPublishedSolutions" - ></gp-list-item> - </div> - </div> - <ng-template #gridView> - <div class="grid-list"> - <mat-grid-list cols="5" rowHeight="3:4" gutterSize="20px"> - <mat-grid-tile *ngFor="let item of selectedPublishedSolutions"> - <div class="cards-container"> - <gp-card-item - [isPublishedSolution]="true" - [item]="item" - [items]="selectedPublishedSolutions" - [isMarketPlacePage]="true" - [isFavoriteSolution]=" - favoriteSolutionsMap[item.solutionId] - " - (favoriteClicked)="updateFavorite(item.solutionId)" - ></gp-card-item> - </div> - </mat-grid-tile> - </mat-grid-list> - </div> - </ng-template> - </ng-container> - <ng-template #noCatalogs> - <div class="loading-data"> - <p>No result found...</p> - </div> - </ng-template> - </ng-container> - <ng-template #loadingPublishedModelsState> - <div class="loading-data"> - <p>Loading Published models</p> </div> - </ng-template> - @if ( - publishedTotalItems > 0 && - isPublishedSolutionsSelected && - !isUnpublishedSolutionsSelected - ) { - <mat-paginator - [length]="publishedTotalItems" - [pageSize]="pageSize" - [pageSizeOptions]="pageSizeOptions" - (page)="onPageChange($event)" - aria-label="Select page" - aria-label="Select page" - > - </mat-paginator> + } + @if (modelType === "published") { + <div style="display: flex; flex-direction: column"> + <gp-model-list + [solutions]="selectedPublishedSolutions" + [totalItems]="publishedTotalItems" + [isLoading]="isPublishedSolutionsLoading" + [headlineTitle]="'MY PUBLISHED MODELS'" + [showEntirePage]="true" + [viewTile]="viewTile" + [pageSize]="pageSize" + [pageIndex]="pageIndex" + [pageSizeOptions]="pageSizeOptions" + [modelType]="'published'" + [favoriteSolutionsMap]="favoriteSolutionsMap" + [calculateStartIndex]="calculateStartIndex(pageIndex, pageSize)" + [calculateEndIndex]=" + calculateEndIndex(publishedTotalItems, pageIndex, pageSize) + " + (pageChange)="onPageChange($event)" + (updateFavorite)="updateFavorite($event)" + (backEvent)="onClickBack('both')" + ></gp-model-list> + </div> } </div> </mat-sidenav-content ></mat-sidenav-container> diff --git a/src/app/features/dashboard/my-models/my-models.component.ts b/src/app/features/dashboard/my-models/my-models.component.ts index a04b0c0..e4e8c0c 100644 --- a/src/app/features/dashboard/my-models/my-models.component.ts +++ b/src/app/features/dashboard/my-models/my-models.component.ts @@ -13,7 +13,6 @@ import { SolutionsToggleViewComponent } from 'src/app/shared/components/card-lis import { SortByComponent } from 'src/app/shared/components/sort-by/sort-by.component'; import { map, Observable, Subscription } from 'rxjs'; import { - Catalog, CatalogFilter, CategoryCode, categoryCodeMap, @@ -24,13 +23,15 @@ import { SortOption, Tag, } from 'src/app/shared/models'; -import { PublicSolutionsService } from 'src/app/core/services/public-solutions.service'; import { PrivateCatalogsService } from 'src/app/core/services/private-catalogs.service'; import { FiltersService } from 'src/app/core/services/filters.service'; import { BrowserStorageService } from 'src/app/core/services/storage/browser-storage.service'; import { environment } from 'src/environments/environment'; import { MatChipsModule } from '@angular/material/chips'; import { MatIconModule } from '@angular/material/icon'; +import { ModelListComponent } from 'src/app/shared/components/model-list/model-list.component'; + +export type ModelType = 'published' | 'unpublished' | 'both'; @Component({ selector: 'gp-my-models', @@ -50,6 +51,7 @@ import { MatIconModule } from '@angular/material/icon'; HeadlineComponent, MatChipsModule, MatIconModule, + ModelListComponent, ], templateUrl: './my-models.component.html', styleUrl: './my-models.component.scss', @@ -87,6 +89,7 @@ export class MyModelsComponent implements OnInit { sortByFilter: string = ''; fieldToDirectionMap: FieldToDirectionMap = { viewCount: 'DESC' }; viewTile: boolean = true; + modelType: ModelType = 'both'; private isFirstLoad = true; favoriteSolutionsMap: { [key: string]: boolean } = {}; @@ -98,11 +101,9 @@ export class MyModelsComponent implements OnInit { selectedUnpublishedSolutions!: PublicSolution[]; allUnpublishedSolutions!: PublicSolution[]; pageSelection: string[] = []; - isUnpublishedSolutionsSelected = true; - isPublishedSolutionsSelected = true; + showEntirePage = false; constructor( - private publicSolutionsService: PublicSolutionsService, private privateCatalogsService: PrivateCatalogsService, private filtersService: FiltersService, private router: Router, @@ -114,44 +115,38 @@ export class MyModelsComponent implements OnInit { } loadPublicSolutions() { - if (this.isUnpublishedSolutionsSelected) { + let requestPayload: PublicSolutionsRequestPayload = { + userId: this.loginUserId, + + modelTypeCodes: this.selectedCategories, + tags: this.selectedTags, + nameKeyword: this.searchKeyWord, + sortBy: this.sortByFilter, + pageRequest: { + fieldToDirectionMap: this.fieldToDirectionMap, + page: this.pageIndex, + size: this.pageSize, + }, + }; + if (this.modelType === 'both') { this.isUnpublishedSolutionsLoading = true; - const unpublishedRequestPayload: PublicSolutionsRequestPayload = { - userId: this.loginUserId, - published: false, - modelTypeCodes: this.selectedCategories, - tags: this.selectedTags, - nameKeyword: this.searchKeyWord, - sortBy: this.sortByFilter, - pageRequest: { - fieldToDirectionMap: this.fieldToDirectionMap, - page: this.pageIndex, - size: this.pageSize, - }, - }; + this.isPublishedSolutionsLoading = true; + + requestPayload.published = false; this.privateCatalogsService - .fetchPublishedAndUnpublishedSolutions(unpublishedRequestPayload) + .fetchPublishedAndUnpublishedSolutions(requestPayload) .subscribe((publicSolutions) => { this.allUnpublishedSolutions = publicSolutions.publicSolutions ?? []; this.unpublishedTotalItems = publicSolutions?.totalElements ?? 0; - if ( - this.isUnpublishedSolutionsSelected && - this.isPublishedSolutionsSelected - ) { - this.unpublishedTotalItems > 4 - ? (this.selectedUnpublishedSolutions = - this.allUnpublishedSolutions.slice(0, 4)) - : (this.selectedUnpublishedSolutions = - this.allUnpublishedSolutions); - } - if ( - this.isUnpublishedSolutionsSelected && - !this.isPublishedSolutionsSelected - ) { - this.selectedUnpublishedSolutions = this.allUnpublishedSolutions; - } + this.unpublishedTotalItems > 4 + ? (this.selectedUnpublishedSolutions = this.slicedModels( + 4, + this.allUnpublishedSolutions, + )) + : (this.selectedUnpublishedSolutions = + this.allUnpublishedSolutions); if (this.isFirstLoad) this.tags = this.extractTagsFromPublicSolutions( @@ -159,44 +154,19 @@ export class MyModelsComponent implements OnInit { ); this.isUnpublishedSolutionsLoading = false; }); - } - - if (this.isPublishedSolutionsSelected) { - this.isPublishedSolutionsLoading = true; - - const publishedRequestPayload: PublicSolutionsRequestPayload = { - userId: this.loginUserId, - published: true, - modelTypeCodes: this.selectedCategories, - tags: this.selectedTags, - nameKeyword: this.searchKeyWord, - sortBy: this.sortByFilter, - pageRequest: { - fieldToDirectionMap: this.fieldToDirectionMap, - page: this.pageIndex, - size: this.pageSize, - }, - }; + requestPayload.published = true; this.privateCatalogsService - .fetchPublishedAndUnpublishedSolutions(publishedRequestPayload) + .fetchPublishedAndUnpublishedSolutions(requestPayload) .subscribe((publicSolutions) => { this.allPublishedSolutions = publicSolutions.publicSolutions ?? []; this.publishedTotalItems = publicSolutions?.totalElements ?? 0; - if ( - this.isUnpublishedSolutionsSelected && - this.isPublishedSolutionsSelected - ) { - this.publishedTotalItems > 4 - ? (this.selectedPublishedSolutions = - this.allPublishedSolutions.slice(0, 3)) - : (this.selectedPublishedSolutions = this.allPublishedSolutions); - } - if ( - !this.isUnpublishedSolutionsSelected && - this.isPublishedSolutionsSelected - ) { - this.selectedPublishedSolutions = this.allPublishedSolutions; - } + + this.publishedTotalItems > 4 + ? (this.selectedPublishedSolutions = this.slicedModels( + 4, + this.allPublishedSolutions, + )) + : (this.selectedPublishedSolutions = this.allPublishedSolutions); if (this.isFirstLoad) this.tags = [ @@ -207,6 +177,41 @@ export class MyModelsComponent implements OnInit { ]; this.isPublishedSolutionsLoading = false; }); + } else if (this.modelType === 'unpublished') { + this.isUnpublishedSolutionsLoading = true; + requestPayload.published = false; + + this.privateCatalogsService + .fetchPublishedAndUnpublishedSolutions(requestPayload) + .subscribe((publicSolutions) => { + this.allUnpublishedSolutions = publicSolutions.publicSolutions ?? []; + this.unpublishedTotalItems = publicSolutions?.totalElements ?? 0; + + this.selectedUnpublishedSolutions = this.allUnpublishedSolutions; + + if (this.isFirstLoad) + this.tags = this.extractTagsFromPublicSolutions( + this.selectedUnpublishedSolutions, + ); + this.isUnpublishedSolutionsLoading = false; + }); + } else if (this.modelType === 'published') { + this.isPublishedSolutionsLoading = true; + requestPayload.published = true; + this.privateCatalogsService + .fetchPublishedAndUnpublishedSolutions(requestPayload) + .subscribe((publicSolutions) => { + this.allPublishedSolutions = publicSolutions.publicSolutions ?? []; + this.publishedTotalItems = publicSolutions?.totalElements ?? 0; + + this.selectedPublishedSolutions = this.allPublishedSolutions; + + if (this.isFirstLoad) + this.tags = this.extractTagsFromPublicSolutions( + this.selectedPublishedSolutions, + ); + this.isPublishedSolutionsLoading = false; + }); } } @@ -445,46 +450,18 @@ export class MyModelsComponent implements OnInit { ); } - onRemoveSelectedPage(selectedPage: string) { - this.pageSelection = []; - this.isUnpublishedSolutionsSelected = true; - this.isPublishedSolutionsSelected = true; - this.unpublishedTotalItems > 4 - ? (this.selectedUnpublishedSolutions = this.allUnpublishedSolutions.slice( - 0, - 4, - )) - : (this.selectedUnpublishedSolutions = this.allUnpublishedSolutions); - this.publishedTotalItems > 4 - ? (this.selectedPublishedSolutions = this.allPublishedSolutions.slice( - 0, - 3, - )) - : (this.selectedPublishedSolutions = this.allPublishedSolutions); - - this.tags = [ - ...this.extractTagsFromPublicSolutions(this.selectedPublishedSolutions), - ]; - - this.tags = [ - ...this.tags, - ...this.extractTagsFromPublicSolutions(this.selectedUnpublishedSolutions), - ]; + slicedModels(val: number, models: PublicSolution[]): PublicSolution[] { + return models.slice(0, val); } - onClickSeeAllUnpublishedModels() { - this.pageSelection = ['My unpublished models']; - this.isPublishedSolutionsSelected = false; - this.selectedUnpublishedSolutions = this.allUnpublishedSolutions; - this.tags = [ - ...this.extractTagsFromPublicSolutions(this.selectedUnpublishedSolutions), - ]; + + onClickSeeAll(type: ModelType) { + this.modelType = type; + this.showEntirePage = true; + this.loadPublicSolutions(); } - onClickSeeAllPublishedModels() { - this.pageSelection = ['My published models']; - this.isUnpublishedSolutionsSelected = false; - this.selectedPublishedSolutions = this.allPublishedSolutions; - this.tags = [ - ...this.extractTagsFromPublicSolutions(this.selectedPublishedSolutions), - ]; + onClickBack(type: ModelType) { + this.modelType = type; + this.showEntirePage = false; + this.loadPublicSolutions(); } } diff --git a/src/app/features/dashboard/on-boarding-model/on-boarding-model.component.html b/src/app/features/dashboard/on-boarding-model/on-boarding-model.component.html index 0536243..a9e1403 100644 --- a/src/app/features/dashboard/on-boarding-model/on-boarding-model.component.html +++ b/src/app/features/dashboard/on-boarding-model/on-boarding-model.component.html @@ -17,129 +17,140 @@ </div> <div style="display: flex; width: 100%"> - <div style="display: flex; flex-direction: column; width: 100%"> + <div style="display: flex; flex-direction: column; width: 50%"> <!-- onboarding model form--> - <form style="width: 100" [formGroup]="onboardingModelForm"> - <!--model name--> - <div style="display: flex; flex-direction: column"> - <mat-label>Model name</mat-label> - <mat-form-field> - <input matInput formControlName="name" /> - @if ( - onboardingModelForm.controls["name"].errors?.["pattern"] && - onboardingModelForm.controls["name"].touched - ) { - <mat-error class="modal-error" - >Name must consist of lower case alphanumeric characters, '-' - or '.', and must start and end with an alphanumeric - character</mat-error - > - } - @if ( - onboardingModelForm.controls["name"].errors?.["required"] && - onboardingModelForm.controls["name"].touched - ) { - <mat-error class="modal-error">Name is required</mat-error> - } - @if ( - onboardingModelForm.get("name")?.errors?.["nameTaken"] && - onboardingModelForm.controls["name"].touched - ) { - <mat-hint class="modal-note green" - ><strong>Name already exists:</strong> - an incremented version will be created within the existing - model. - </mat-hint> - } - </mat-form-field> - </div> - <!--docker URI--> - <div style="display: flex; flex-direction: column"> - <mat-label>Docker URI </mat-label> - <mat-hint class="modal-note green" - ><strong>Dockerhub image example:</strong> - docker.io/myimage:latest - </mat-hint> - <mat-hint class="modal-note green" - ><strong>General public registry image example:</strong> - cicd.ai4eu-dev.eu:7444/myimage:v1 - </mat-hint> - <mat-form-field> - <input matInput formControlName="dockerURI" /> - @if ( - onboardingModelForm.controls["dockerURI"].errors?.[ - "required" - ] && onboardingModelForm.controls["dockerURI"].touched - ) { - <mat-error class="modal-error" - >Docker URI is required</mat-error - > - } - </mat-form-field> - </div> - <!--protobuf file--> - <div style="display: flex; flex-direction: column; width: 100%"> - <mat-label>Upload Protobuf File </mat-label> - <div style="display: flex; width: 100%; gap: 10px"> - <mat-form-field style="height: 70px"> - <input matInput [value]="fileName" /> - <mat-hint class="modal-note full-width no-padding"> - Supported files type: .proto</mat-hint - > - - <input - #fileDropRef - type="file" - id="fileInput" - name="fileInput" - (change)="selectFile($event)" - hidden - formControlName="protobufFile" - /> + <form [formGroup]="onboardingModelForm"> + <div style="display: flex; flex-direction: column; gap: 30px"> + <!--model name--> + <div style="display: flex; flex-direction: column"> + <mat-label>Model name</mat-label> + <mat-form-field> + <input matInput formControlName="name" /> + @if ( + onboardingModelForm.controls["name"].errors?.["pattern"] && + onboardingModelForm.controls["name"].touched + ) { + <mat-error class="modal-error" + >Name must consist of lower case alphanumeric characters, + '-' or '.', and must start and end with an alphanumeric + character</mat-error + > + } + @if ( + onboardingModelForm.controls["name"].errors?.["required"] && + onboardingModelForm.controls["name"].touched + ) { + <mat-error class="modal-error">Name is required</mat-error> + } + @if ( + onboardingModelForm.get("name")?.errors?.["nameTaken"] && + onboardingModelForm.controls["name"].touched + ) { + <mat-hint class="modal-note green" + ><strong>Name already exists:</strong> + an incremented version will be created within the existing + model. + </mat-hint> + } + </mat-form-field> + </div> + <!--docker URI--> + <div style="display: flex; flex-direction: column"> + <mat-label>Docker URI </mat-label> + <mat-hint class="modal-note green" + ><strong>Dockerhub image example:</strong> + docker.io/myimage:latest + </mat-hint> + <mat-hint class="modal-note green" + ><strong>General public registry image example:</strong> + cicd.ai4eu-dev.eu:7444/myimage:v1 + </mat-hint> + <mat-form-field> + <input matInput formControlName="dockerURI" /> + @if ( + onboardingModelForm.controls["dockerURI"].errors?.[ + "required" + ] && onboardingModelForm.controls["dockerURI"].touched + ) { + <mat-error class="modal-error" + >Docker URI is required</mat-error + > + } </mat-form-field> + </div> + <!--protobuf file--> + <div style="display: flex; flex-direction: column; width: 100%"> + <mat-label>Upload Protobuf File </mat-label> + <div style="display: flex; width: 100%; gap: 10px"> + <mat-form-field style="height: 70px"> + <input matInput [value]="fileName" /> + <mat-hint class="modal-note full-width no-padding"> + Supported files type: .proto</mat-hint + > - <button - style="height: 48px" + <input + #fileDropRef + type="file" + id="fileInput" + name="fileInput" + (change)="selectFile($event)" + hidden + formControlName="protobufFile" + /> + </mat-form-field> + + <button + style="height: 48px" + color="primary" + mat-raised-button + (click)="onClickUploadProtoBufFile()" + > + Upload file + </button> + </div> + @if (message !== "") { + <span class="modal-error">.proto file is required.</span> + } + </div> + <!--license profile--> + <div style="display: flex; flex-direction: column"> + <mat-checkbox color="primary" - mat-raised-button - (click)="onClickUploadProtoBufFile()" + formControlName="addLicenseProfile" + (change)="onClickUpload($event)" + >Add License Profile</mat-checkbox > - Upload file - </button> </div> - @if (message !== "") { - <span class="modal-error">.proto file is required.</span> + @if ( + onboardingModelForm.controls["addLicenseProfile"].value === true + ) { + <div style="display: flex; width: 100%"> + <gp-model-details-license-profile + [isExistingLicenseProfile]="false" + ></gp-model-details-license-profile> + </div> } - </div> - <!--license profile--> - <div style="display: flex; flex-direction: column"> - <mat-checkbox - color="primary" - formControlName="addLicenseProfile" - (change)="onClickUpload($event)" - >Add License Profile</mat-checkbox - > - </div> - @if ( - onboardingModelForm.controls["addLicenseProfile"].value === true - ) { - <div style="display: flex; width: 100%"> - <gp-model-details-license-profile - [isExistingLicenseProfile]="false" - ></gp-model-details-license-profile> - </div> - } - <div style="display: flex; align-items: center; gap: 10px"> - <button mat-raised-button (click)="resetData()">Reset form</button> - <button - mat-raised-button - color="primary" - (click)="onClickBoardModel()" - [disabled]="!enableSubmit" + <div + style=" + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + " > - On-board model - </button> + <button mat-raised-button (click)="resetData()"> + Reset form + </button> + <button + mat-raised-button + color="primary" + (click)="onClickBoardModel()" + [disabled]="!enableSubmit" + > + On-board model + </button> + </div> </div> </form> </div> diff --git a/src/app/features/dashboard/on-boarding-model/on-boarding-model.component.ts b/src/app/features/dashboard/on-boarding-model/on-boarding-model.component.ts index 3b7df50..7aba16c 100644 --- a/src/app/features/dashboard/on-boarding-model/on-boarding-model.component.ts +++ b/src/app/features/dashboard/on-boarding-model/on-boarding-model.component.ts @@ -188,9 +188,9 @@ export class OnBoardingModelComponent implements OnInit { complete: () => {}, }); } - } else { + } /* else { this.fileName = 'No chosen file'; - } + } */ } uploadFile() { -- GitLab