diff --git a/angular.json b/angular.json
index b1dda10..d4b3ecd 100644
--- a/angular.json
+++ b/angular.json
@@ -25,11 +25,15 @@
],
"styles": [
"src/styles.css",
+ "node_modules/bootstrap/dist/css/bootstrap.min.css",
"node_modules/primeicons/primeicons.css",
"node_modules/primeng/resources/themes/nova-light/theme.css",
"node_modules/primeng/resources/primeng.min.css"
],
- "scripts": []
+ "scripts": [
+ "node_modules/jquery/dist/jquery.min.js",
+ "node_modules/bootstrap/dist/js/bootstrap.min.js"
+ ]
},
"configurations": {
"production": {
@@ -148,6 +152,7 @@
}
}
}
- }},
+ }
+ },
"defaultProject": "SystemNavigationFrontend"
}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 7154f6c..cfc96af 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2841,6 +2841,11 @@
"multicast-dns-service-types": "^1.1.0"
}
},
+ "bootstrap": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz",
+ "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA=="
+ },
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -6262,6 +6267,11 @@
}
}
},
+ "jquery": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz",
+ "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw=="
+ },
"js-levenshtein": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
diff --git a/package.json b/package.json
index 5537319..16b1ce2 100644
--- a/package.json
+++ b/package.json
@@ -26,7 +26,9 @@
"@angular/platform-browser": "~8.2.14",
"@angular/platform-browser-dynamic": "~8.2.14",
"@angular/router": "~8.2.14",
+ "bootstrap": "^4.4.1",
"chart.js": "^2.9.3",
+ "jquery": "^3.4.1",
"primeicons": "^2.0.0",
"primeng": "^8.1.1",
"quill": "^1.3.7",
diff --git a/src/app/app.component.html b/src/app/app.component.html
index 472cc95..8e0a821 100644
--- a/src/app/app.component.html
+++ b/src/app/app.component.html
@@ -1,5 +1 @@
-
+
\ No newline at end of file
diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 311d503..bb570c8 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -1,5 +1,6 @@
import { Component, OnInit } from '@angular/core';
import { ResourceService } from './services/api/resource.service';
+import { HttpErrorResponse } from '@angular/common/http';
@Component({
selector: 'app-root',
@@ -12,7 +13,7 @@ export class AppComponent implements OnInit {
constructor(
private resourceService: ResourceService
- ) {}
+ ) { }
ngOnInit() {
// Example usage of resource service.
@@ -26,7 +27,10 @@ export class AppComponent implements OnInit {
console.log('Adblock prevents it from opening');
// window.open(url);
})
- .catch(err => console.log(err));
+ .catch((err: HttpErrorResponse) => {
+ console.log('Error occurred with status value', err.status);
+ console.log(err);
+ });
}
}
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index f5b733a..23930f3 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -1,23 +1,16 @@
-import { BrowserModule } from "@angular/platform-browser";
-import { NgModule } from "@angular/core";
+import { BrowserModule } from '@angular/platform-browser';
+import { NgModule } from '@angular/core';
-import { AppRoutingModule } from "./app-routing.module";
-import { AppComponent } from "./app.component";
-import { TreeComponent } from "./tree/tree.component";
-import { ButtonModule, MessageService, TreeModule } from "primeng/primeng";
-import { MainComponent } from "./main/main.component";
-import { CenterComponent } from "./center/center.component";
-import { LeftComponent } from "./left/left.component";
-import { HttpClientModule } from "@angular/common/http";
+import { AppRoutingModule } from './app-routing.module';
+import { AppComponent } from './app.component';
+import { ButtonModule, MessageService, TreeModule } from 'primeng/primeng';
+import { HttpClientModule } from '@angular/common/http';
+import { MainComponent } from './main/main.component';
+import { MainCenterComponent } from './main/main-center/main-center.component';
+import { TreeComponent } from './main/tree/tree.component';
@NgModule({
- declarations: [
- AppComponent,
- TreeComponent,
- MainComponent,
- CenterComponent,
- LeftComponent
- ],
+ declarations: [AppComponent, TreeComponent, MainComponent, MainCenterComponent],
imports: [
BrowserModule,
AppRoutingModule,
@@ -25,7 +18,7 @@ import { HttpClientModule } from "@angular/common/http";
HttpClientModule,
ButtonModule
],
- providers: [MessageService],
+ providers: [],
bootstrap: [AppComponent]
})
-export class AppModule {}
+export class AppModule { }
diff --git a/src/app/center/center.component.html b/src/app/center/center.component.html
deleted file mode 100644
index 03eae30..0000000
--- a/src/app/center/center.component.html
+++ /dev/null
@@ -1 +0,0 @@
-center works!
diff --git a/src/app/center/center.component.ts b/src/app/center/center.component.ts
deleted file mode 100644
index 7ab645a..0000000
--- a/src/app/center/center.component.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Component, OnInit } from '@angular/core';
-
-@Component({
- selector: 'app-center',
- templateUrl: './center.component.html',
- styleUrls: ['./center.component.css']
-})
-export class CenterComponent implements OnInit {
-
- constructor() { }
-
- ngOnInit() {
- }
-
-}
diff --git a/src/app/left/left.component.css b/src/app/left/left.component.css
deleted file mode 100644
index e69de29..0000000
diff --git a/src/app/left/left.component.html b/src/app/left/left.component.html
deleted file mode 100644
index a244bb7..0000000
--- a/src/app/left/left.component.html
+++ /dev/null
@@ -1 +0,0 @@
-left works!
diff --git a/src/app/left/left.component.ts b/src/app/left/left.component.ts
deleted file mode 100644
index 48e6e77..0000000
--- a/src/app/left/left.component.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Component, OnInit } from '@angular/core';
-
-@Component({
- selector: 'app-left',
- templateUrl: './left.component.html',
- styleUrls: ['./left.component.css']
-})
-export class LeftComponent implements OnInit {
-
- constructor() { }
-
- ngOnInit() {
- }
-
-}
diff --git a/src/app/center/center.component.css b/src/app/main/main-center/main-center.component.css
similarity index 100%
rename from src/app/center/center.component.css
rename to src/app/main/main-center/main-center.component.css
diff --git a/src/app/main/main-center/main-center.component.html b/src/app/main/main-center/main-center.component.html
new file mode 100644
index 0000000..35923f7
--- /dev/null
+++ b/src/app/main/main-center/main-center.component.html
@@ -0,0 +1,8 @@
+
+ Current node is {{this.currentNode.label}}
+
+
+
+
+ No node selected
+
\ No newline at end of file
diff --git a/src/app/center/center.component.spec.ts b/src/app/main/main-center/main-center.component.spec.ts
similarity index 54%
rename from src/app/center/center.component.spec.ts
rename to src/app/main/main-center/main-center.component.spec.ts
index da7698d..99d8a7b 100644
--- a/src/app/center/center.component.spec.ts
+++ b/src/app/main/main-center/main-center.component.spec.ts
@@ -1,20 +1,20 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
-import { CenterComponent } from './center.component';
+import { MainCenterComponent } from './main-center.component';
-describe('CenterComponent', () => {
- let component: CenterComponent;
- let fixture: ComponentFixture;
+describe('MainCenterComponent', () => {
+ let component: MainCenterComponent;
+ let fixture: ComponentFixture;
beforeEach(async(() => {
TestBed.configureTestingModule({
- declarations: [ CenterComponent ]
+ declarations: [ MainCenterComponent ]
})
.compileComponents();
}));
beforeEach(() => {
- fixture = TestBed.createComponent(CenterComponent);
+ fixture = TestBed.createComponent(MainCenterComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
diff --git a/src/app/main/main-center/main-center.component.ts b/src/app/main/main-center/main-center.component.ts
new file mode 100644
index 0000000..337a70b
--- /dev/null
+++ b/src/app/main/main-center/main-center.component.ts
@@ -0,0 +1,49 @@
+import { Component, OnInit, OnDestroy } from '@angular/core';
+import { TreeService } from 'src/app/services/tree.service';
+import { Subscription } from 'rxjs';
+import { TreeNode } from 'primeng/api';
+import { ResourceService } from 'src/app/services/api/resource.service';
+import { HttpErrorResponse } from '@angular/common/http';
+
+@Component({
+ selector: 'app-main-center',
+ templateUrl: './main-center.component.html',
+ styleUrls: ['./main-center.component.css']
+})
+export class MainCenterComponent implements OnInit, OnDestroy {
+
+ private treeSubscription: Subscription;
+ currentNode: TreeNode;
+
+ constructor(
+ private treeService: TreeService,
+ private resourceService: ResourceService
+ ) { }
+
+ ngOnInit() {
+ this.treeSubscription = this.treeService.node$.subscribe(async (node) => {
+ if (node == null) {
+ return;
+ }
+ console.log('Selected node is', node);
+ this.currentNode = node;
+ const data = node.data as { pdfName: string };
+ try {
+ console.log('I will load', data.pdfName);
+ const pdfData = await this.resourceService.getResourcePDF(data.pdfName);
+ // render pdf to screen
+
+ } catch (err) {
+ console.log(err);
+ if ((err as HttpErrorResponse).status === 404) {
+ // handle not found
+ }
+ }
+
+ });
+ }
+
+ ngOnDestroy() {
+ this.treeSubscription.unsubscribe();
+ }
+}
diff --git a/src/app/main/main.component.html b/src/app/main/main.component.html
index 17c1228..89b5a69 100644
--- a/src/app/main/main.component.html
+++ b/src/app/main/main.component.html
@@ -1 +1,2 @@
-main works!
+
+
\ No newline at end of file
diff --git a/src/app/tree/tree.component.css b/src/app/main/tree/tree.component.css
similarity index 100%
rename from src/app/tree/tree.component.css
rename to src/app/main/tree/tree.component.css
diff --git a/src/app/main/tree/tree.component.html b/src/app/main/tree/tree.component.html
new file mode 100644
index 0000000..19c0f99
--- /dev/null
+++ b/src/app/main/tree/tree.component.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/app/left/left.component.spec.ts b/src/app/main/tree/tree.component.spec.ts
similarity index 58%
rename from src/app/left/left.component.spec.ts
rename to src/app/main/tree/tree.component.spec.ts
index b127005..e3df2c3 100644
--- a/src/app/left/left.component.spec.ts
+++ b/src/app/main/tree/tree.component.spec.ts
@@ -1,20 +1,20 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
-import { LeftComponent } from './left.component';
+import { TreeComponent } from './tree.component';
-describe('LeftComponent', () => {
- let component: LeftComponent;
- let fixture: ComponentFixture;
+describe('TreeComponent', () => {
+ let component: TreeComponent;
+ let fixture: ComponentFixture;
beforeEach(async(() => {
TestBed.configureTestingModule({
- declarations: [ LeftComponent ]
+ declarations: [ TreeComponent ]
})
.compileComponents();
}));
beforeEach(() => {
- fixture = TestBed.createComponent(LeftComponent);
+ fixture = TestBed.createComponent(TreeComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
diff --git a/src/app/main/tree/tree.component.ts b/src/app/main/tree/tree.component.ts
new file mode 100644
index 0000000..fd3342c
--- /dev/null
+++ b/src/app/main/tree/tree.component.ts
@@ -0,0 +1,28 @@
+import { Component, OnInit } from '@angular/core';
+import { TreeNode } from 'primeng/api';
+import { NodeService } from 'src/app/node.service';
+import { TreeService } from 'src/app/services/tree.service';
+
+@Component({
+ selector: 'app-tree',
+ templateUrl: './tree.component.html',
+ styleUrls: ['./tree.component.css']
+})
+export class TreeComponent implements OnInit {
+
+ filesTree: TreeNode[];
+
+ constructor(
+ private treeService: TreeService,
+ private nodeService: NodeService
+ ) { }
+
+ ngOnInit() {
+ this.nodeService.getFiles().then(files => (this.filesTree = files));
+ }
+
+ nodeSelect(event: { node: TreeNode }) {
+ this.treeService.changeNode(event.node);
+ }
+
+}
diff --git a/src/app/node.service.ts b/src/app/node.service.ts
index 4b9eb36..499c0c5 100644
--- a/src/app/node.service.ts
+++ b/src/app/node.service.ts
@@ -1,16 +1,14 @@
-import {HttpClient, HttpClientModule} from '@angular/common/http';
+import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { TreeNode } from 'primeng/api';
-@Injectable({providedIn: 'root'})
+@Injectable({ providedIn: 'root' })
export class NodeService {
constructor(private http: HttpClient) { }
- getFiles() {
- return this.http.get('http://localhost:4200/assets/files.json')
- .toPromise()
- .then(res => res.data as TreeNode[]);
+ async getFiles() {
+ return (await this.http.get('http://localhost:4200/assets/files.json').toPromise()).data as TreeNode[];
}
}
diff --git a/src/app/services/api/resource.service.ts b/src/app/services/api/resource.service.ts
index 1bbfcf0..e6cef09 100644
--- a/src/app/services/api/resource.service.ts
+++ b/src/app/services/api/resource.service.ts
@@ -32,6 +32,9 @@ export class ResourceService extends APIService {
}
getResourcePDF(key: string) {
+ if (key == null) {
+ throw new TypeError('Key must not be null!');
+ }
return this.get(`pdf/${key}`, {
responseType: 'arraybuffer'
});
diff --git a/src/app/services/tree.service.ts b/src/app/services/tree.service.ts
new file mode 100644
index 0000000..6b01162
--- /dev/null
+++ b/src/app/services/tree.service.ts
@@ -0,0 +1,16 @@
+import { BehaviorSubject } from 'rxjs';
+import { TreeNode } from 'primeng/api';
+import { Injectable } from '@angular/core';
+
+@Injectable({
+ providedIn: 'root'
+})
+export class TreeService {
+
+ private nodeChange = new BehaviorSubject(null);
+ node$ = this.nodeChange.asObservable();
+
+ changeNode(newNode: TreeNode) {
+ this.nodeChange.next(newNode);
+ }
+}
diff --git a/src/app/tree/tree.component.html b/src/app/tree/tree.component.html
deleted file mode 100644
index 0dfec7c..0000000
--- a/src/app/tree/tree.component.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
diff --git a/src/app/tree/tree.component.spec.ts b/src/app/tree/tree.component.spec.ts
deleted file mode 100644
index e758395..0000000
--- a/src/app/tree/tree.component.spec.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { async, ComponentFixture, TestBed } from "@angular/core/testing";
-
-import { TreeComponent } from "./tree.component";
-
-describe("TreeComponent", () => {
- let component: TreeComponent;
- let fixture: ComponentFixture;
-
- beforeEach(async(() => {
- TestBed.configureTestingModule({
- declarations: [TreeComponent]
- }).compileComponents();
- }));
-
- beforeEach(() => {
- fixture = TestBed.createComponent(TreeComponent);
- component = fixture.componentInstance;
- fixture.detectChanges();
- });
-
- it("should create", () => {
- expect(component).toBeTruthy();
- });
-});
diff --git a/src/app/tree/tree.component.ts b/src/app/tree/tree.component.ts
deleted file mode 100644
index bf7a665..0000000
--- a/src/app/tree/tree.component.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import {Component, OnInit, ViewChild} from '@angular/core';
-import {Tree} from 'primeng/tree';
-import {MessageService, TreeNode} from 'primeng/api';
-import {NodeService} from '../node.service';
-
-@Component({
- selector: 'app-tree',
- templateUrl: './tree.component.html',
- styleUrls: ['./tree.component.css']
-})
-export class TreeComponent implements OnInit {
- @ViewChild('expandingTree', {static: false})
- expandingTree: Tree;
- filesTree: TreeNode[];
-
- constructor(private nodeService: NodeService, private messageService: MessageService) { }
-
- ngOnInit() {
- this.nodeService.getFiles().then(files => this.filesTree = files);
- }
-
- expandAll(){
- this.filesTree.forEach( node => {
- this.expandRecursive(node, true);
- } );
- }
-
- collapseAll(){
- this.filesTree.forEach( node => {
- this.expandRecursive(node, false);
- } );
- }
-
- private expandRecursive(node: TreeNode, isExpand: boolean){
- node.expanded = isExpand;
- if(node.children){
- node.children.forEach( childNode => {
- this.expandRecursive(childNode, isExpand);
- } );
- }
- }
-
-}
diff --git a/src/assets/files.json b/src/assets/files.json
index 6dc3a5e..dfaed6c 100644
--- a/src/assets/files.json
+++ b/src/assets/files.json
@@ -1,109 +1,133 @@
{
- "data":
- [
+ "data": [
{
"label": "32 Landing Gear",
- "data": "32 Landing Gear",
+ "data": {
+ "pdfName": "radar.pdf"
+ },
"expandedIcon": "fa fa-folder-open",
"collapsedIcon": "fa fa-folder",
- "children":[]
+ "children": []
},
{
"label": "32-11 Main Landing Gear",
- "data": "32-11 Main Landing Gear",
+ "data": {
+ "pdfName": "radar.pdf"
+ },
"expandedIcon": "fa fa-folder-open",
"collapsedIcon": "fa fa-folder",
- "children":
- [
+ "children": [
{
"label": "32-11-01 Pivot",
- "data": "32-11-01 Pivot",
+ "data": {
+ "pdfName": "radar.pdf"
+ },
"expandedIcon": "fa fa-folder-open",
"collapsedIcon": "fa fa-folder",
- "children":[]
+ "children": []
},
{
"label": "32-11-02 Main Landing Gear Shock Strut",
- "data": "32-11-02 Main Landing Gear Shock Strut",
+ "data": {
+ "pdfName": "radar.pdf"
+ },
"expandedIcon": "fa fa-folder-open",
"collapsedIcon": "fa fa-folder",
- "children":[]
+ "children": []
},
{
"label": "32-11-03 TORQUE ARM upper",
- "data": "32-11-03 TORQUE ARM upper",
+ "data": {
+ "pdfName": "radar.pdf"
+ },
"expandedIcon": "fa fa-folder-open",
"collapsedIcon": "fa fa-folder",
- "children":[]
+ "children": []
},
{
"label": "32-11-04 TORQUE ARM lower",
- "data": "32-11-04 TORQUE ARM lower",
+ "data": {
+ "pdfName": "radar.pdf"
+ },
"expandedIcon": "fa fa-folder-open",
"collapsedIcon": "fa fa-folder",
- "children":[]
+ "children": []
}
]
},
{
"label": "32-30 Extension and Retraction System",
- "data": "32-30 Extension and Retraction System",
+ "data": {
+ "pdfName": "radar.pdf"
+ },
"expandedIcon": "fa fa-folder-open",
"collapsedIcon": "fa fa-folder",
- "children":
- [
+ "children": [
{
"label": "30-30-01 MLG Retract Actuator Support",
- "data": "30-30-01 MLG Retract Actuator Support",
- "children":[]
+ "data": {
+ "pdfName": "radar.pdf"
+ },
+ "children": []
},
{
"label": "30-30-02 Retaining Pin",
- "data": "30-30-02 Retaining Pin",
+ "data": {
+ "pdfName": "radar.pdf"
+ },
"children": []
}
]
},
{
"label": "32-31 Landing Gear Control",
- "data": "32-31 Landing Gear Control",
+ "data": {
+ "pdfName": "radar.pdf"
+ },
"expandedIcon": "fa fa-folder-open",
"collapsedIcon": "fa fa-folder",
- "children":[]
+ "children": []
},
{
"label": "32-41 Wheels",
- "data": "32-41 Wheels",
+ "data": {
+ "pdfName": "radar.pdf"
+ },
"expandedIcon": "fa fa-folder-open",
"collapsedIcon": "fa fa-folder",
- "children":
- [
+ "children": [
{
"label": "32-41-01 Landing Gear Wheels Tire Assembly",
- "data": "32-41-01 Landing Gear Wheels Tire Assembly",
- "children":[]
+ "data": {
+ "pdfName": "radar.pdf"
+ },
+ "children": []
},
{
"label": "32-41-02 Main Landing Gear Shock Strut",
- "data": "32-41-02 Main Landing Gear Shock Strut",
+ "data": {
+ "pdfName": "radar.pdf"
+ },
"children": []
}
]
},
{
"label": "32-42 Brakes",
- "data": "32-42 Brakes",
+ "data": {
+ "pdfName": "radar.pdf"
+ },
"expandedIcon": "fa fa-folder-open",
"collapsedIcon": "fa fa-folder",
- "children":
- [
+ "children": [
{
"label": "32-42-04 Parking Brake Valve",
- "data": "32-42-04 Parking Brake Valve",
- "children":[]
+ "data": {
+ "pdfName": "radar.pdf"
+ },
+ "children": []
}
]
}
-
]
-}
+}
\ No newline at end of file