-
-
-
+
+
+
+
Project not found or unable to load project data.
+
+
@@ -94,5 +112,5 @@
Edit Asset
Show Raw Data
diff --git a/modelcabinet.client/src/app/projects/project-page/project-page.component.ts b/modelcabinet.client/src/app/projects/project-page/project-page.component.ts
index 16077ca..15b024c 100644
--- a/modelcabinet.client/src/app/projects/project-page/project-page.component.ts
+++ b/modelcabinet.client/src/app/projects/project-page/project-page.component.ts
@@ -1,5 +1,5 @@
-import { Component, OnInit, ViewChild } from '@angular/core';
-import { BehaviorSubject } from 'rxjs';
+import { Component, OnInit, ViewChild, OnDestroy } from '@angular/core';
+import { BehaviorSubject, Subscription } from 'rxjs';
import { Project } from '../../Models/project';
import { Asset } from '../../Models/asset';
import { DataService } from '../../data.service';
@@ -11,9 +11,45 @@ import { ViewportComponent } from '../../viewport/viewport.component';
templateUrl: './project-page.component.html',
styleUrl: './project-page.component.css'
})
-export class ProjectPageComponent implements OnInit {
+export class ProjectPageComponent implements OnInit, OnDestroy {
projid = 0;
project$: BehaviorSubject
;
+ projectSubscription: Subscription | null = null;
+ isLoading = true;
+
+ // Add selected tag property
+ selectedTagName: string = '';
+
+ // Computed property for filtered assets
+ get filteredAssets(): Asset[] {
+ if (!this.project$.value || !this.project$.value.assets) {
+ return [];
+ }
+
+ if (!this.selectedTagName) {
+ return this.project$.value.assets;
+ }
+
+ return this.project$.value.assets.filter(asset =>
+ asset.assetTagNames && asset.assetTagNames.includes(this.selectedTagName)
+ );
+ }
+
+ // Computed property for all unique tags in the project
+ get uniqueTagNames(): string[] {
+ if (!this.project$.value || !this.project$.value.assets) {
+ return [];
+ }
+
+ const tags = new Set();
+ this.project$.value.assets.forEach(asset => {
+ if (asset.assetTagNames) {
+ asset.assetTagNames.forEach(tag => tags.add(tag));
+ }
+ });
+
+ return Array.from(tags).sort();
+ }
@ViewChild('viewport') viewport!: ViewportComponent;
@@ -47,19 +83,36 @@ export class ProjectPageComponent implements OnInit {
this.viewport.load(asset);
}
+ // Reset tag filter
+ clearTagFilter() {
+ this.selectedTagName = '';
+ }
+
constructor(private route: ActivatedRoute, private data: DataService, private router: Router) {
this.project$ = this.data.project$;
}
getProjectData(): void {
+ this.isLoading = true;
this.route.paramMap.subscribe(data => {
this.projid = +data.get('id')!;
+
+ // Add explicit subscription to detect data loading
this.data.getProjectById(this.projid);
- console.log(this.project$, this.projid);
+ this.projectSubscription = this.project$.subscribe(project => {
+ console.log("Project data loaded:", project);
+ this.isLoading = false;
+ });
});
}
ngOnInit(): void {
this.getProjectData();
}
+
+ ngOnDestroy(): void {
+ if (this.projectSubscription) {
+ this.projectSubscription.unsubscribe();
+ }
+ }
}