Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
model-management.component.ts 5.47 KiB
import { Component, OnInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MatSidenavModule } from '@angular/material/sidenav';
import { MatTabsModule } from '@angular/material/tabs';
import { MatIconModule } from '@angular/material/icon';
import { ActivatedRoute, Router, RouterModule } from '@angular/router';
import {
  PublicSolutionDetailsModel,
  PublicSolutionDetailsRevisionModel,
  Revision,
  UserDetails,
} from '../../models';
import {
  BehaviorSubject,
  Observable,
  Subscription,
  map,
  of,
  switchMap,
  tap,
} from 'rxjs';
import { SharedDataService } from 'src/app/core/services/shared-data/shared-data.service';
import { PublicSolutionsService } from 'src/app/core/services/public-solutions.service';
import { PrivateCatalogsService } from 'src/app/core/services/private-catalogs.service';
import { BreadcrumbNavigationComponent } from '../breadcrumb-navigation/breadcrumb-navigation.component';
import { VersionDropdownComponent } from '../version-dropdown/version-dropdown.component';
import { MatButtonModule } from '@angular/material/button';
import { MatMenuModule } from '@angular/material/menu';
import { MatListModule } from '@angular/material/list';
import { TruncatePipe } from '../../pipes/truncate.pipe';

@Component({
  selector: 'gp-model-management',
  standalone: true,
  imports: [
    CommonModule,
    MatSidenavModule,
    MatTabsModule,
    MatIconModule,
    RouterModule,
    BreadcrumbNavigationComponent,
    VersionDropdownComponent,
    MatButtonModule,
    MatMenuModule,
    MatIconModule,
    MatListModule,
    TruncatePipe,
  ],
  templateUrl: './model-management.component.html',
  styleUrl: './model-management.component.scss',
})
export class ModelManagementComponent implements OnInit {
  solutionId!: string;
  revisionId!: string;
  selectedRevision!: Revision;
  selectedRevisionSubscription!: Subscription;
  sharedWith: UserDetails[] = [];
  solution!: PublicSolutionDetailsModel;
  revisionsList!: Revision[];
  solution$!: Observable<PublicSolutionDetailsModel>;
  revisions$!: Observable<Revision[]>;
  sharedWith$!: Observable<UserDetails[]>;
  selectedRevision$: BehaviorSubject<Revision | null> =
    new BehaviorSubject<Revision | null>(null);

  constructor(
    private router: Router,
    private activatedRoute: ActivatedRoute,
    private sharedDataService: SharedDataService,
    private publicSolutionsService: PublicSolutionsService,
    private privateCatalogsService: PrivateCatalogsService,
  ) {}
  ngOnInit(): void {
    this.solution$ = this.activatedRoute.params.pipe(
      switchMap((params) => {
        this.solutionId = params['solutionId'];
        this.revisionId = params['revisionId'];
        this.sharedWith$ = this.privateCatalogsService.getShareWithTeam(
          this.solutionId,
        );
        return this.publicSolutionsService.getSolutionDetails(
          this.solutionId,
          this.revisionId,
        );
      }),
      tap((solution) => {
        this.revisions$ = this.getRevisionsAsObservable(solution);
        this.revisions$ = this.getRevisionsAsObservable(solution);
        this.updateSelectedRevision(this.revisionId, solution);
        this.setRevisionInService(solution.revisions[0]);
      }),
    );
  }

  private updateSelectedRevision(
    revisionId: string,
    solution: PublicSolutionDetailsModel,
  ): void {
    const revision = solution.revisions.find(
      (rev) => rev.revisionId === revisionId,
    );
    if (revision) {
      this.selectedRevision$.next({
        revisionId: revision.revisionId,
        version: revision.version,
        onBoarded: revision.onboarded,
      });
    }
  }

  isActive(modelRoute: string): boolean {
    return this.router.routerState.snapshot.url === modelRoute;
  }

  loadData(solutionId: string, revisionId: string) {
    this.publicSolutionsService
      .getSolutionDetails(solutionId, revisionId)
      .subscribe((res) => {
        console.log({ res });
        const revisionsList = this.getRevisionsList(res);
        this.selectedRevision = revisionsList[0];
        this.setRevisionInService(this.selectedRevision);
      });
  }

  getRevisionsList(solution: PublicSolutionDetailsModel): Revision[] {
    return solution.revisions.map(
      (revision: PublicSolutionDetailsRevisionModel) => ({
        version: revision.version,
        revisionId: revision.revisionId,
        onBoarded: revision.onboarded,
      }),
    );
  }

  getShareWithTeam(solutionId: string): void {
    this.privateCatalogsService.getShareWithTeam(solutionId).subscribe({
      next: (users) => {
        this.sharedWith = users;
      },
      error: (error) => {
        console.error('Error fetching users:', error);
      },
    });
  }
  onHomeClick() {}

  onManageMyModelClick() {}

  private getRevisionsAsObservable(
    solution: PublicSolutionDetailsModel,
  ): Observable<Revision[]> {
    return new Observable<Revision[]>((subscriber) => {
      const revisions = solution.revisions.map((rev) => ({
        version: rev.version,
        revisionId: rev.revisionId,
        onBoarded: rev.onboarded,
      }));
      subscriber.next(revisions);
      subscriber.complete();
    });
  }

  onChangeVersion(revision: Revision): void {
    this.selectedRevision$.next(revision);
    this.setRevisionInService(revision);
    this.setVersionIdInService(revision.version);
  }

  setRevisionInService(revision: Revision): void {
    this.sharedDataService.selectedRevision = revision;
  }

  setVersionIdInService(version: string): void {
    this.sharedDataService.versionId = version;
  }
}