diff --git a/src/app/app.component.html b/src/app/app.component.html
index fbad36d..85e04cc 100644
--- a/src/app/app.component.html
+++ b/src/app/app.component.html
@@ -35,9 +35,9 @@
-
+
-
+
diff --git a/src/app/component/menu/export-csv.component.ts b/src/app/component/menu/export-csv.component.ts
index 70bbd82..297dbd0 100644
--- a/src/app/component/menu/export-csv.component.ts
+++ b/src/app/component/menu/export-csv.component.ts
@@ -1,15 +1,51 @@
-import { Component, } from '@angular/core';
+import { Component, OnInit, AfterContentInit, OnDestroy, } from '@angular/core';
+import { Store, select } from '@ngrx/store';
+import { take } from 'rxjs/operators';
+
+import * as AppStore from '../../store';
+import { TargetDisplayType } from '../../core/type';
+
+const { saveSvgAsPng, svgAsDataUri } = require('save-svg-as-png');
@Component({
selector: 'app-menu-export-csv',
templateUrl: './export-csv.component.html',
styleUrls: ['./export-csv.component.scss'],
})
-export class ExportCSVComponent {
+export class ExportCSVComponent implements OnInit, AfterContentInit, OnDestroy {
constructor(
+ private store: Store,
) {
}
+ ngOnInit(): void {
+ }
+ ngAfterContentInit(): void {
+
+ }
+
+ ngOnDestroy(): void {
+
+ }
+
+ export() {
+ this.store.pipe(
+ take(1),
+ select((state) => {
+ const targetDisplayType = AppStore.TargetSelector.TargetSelector.selectTargetDisplayType(state);
+ const targetDisplayElementRef = AppStore.TargetSelector.TargetSelector.selectTargetDisplayElementRef(state);
+
+ if (TargetDisplayType.MAP !== targetDisplayType) {
+ return;
+ }
+
+ // svgAsDataUri(targetDisplayElementRef.nativeElement, {}, function (uri) {
+ // console.log(`uri: ${uri}`);
+ // });
+ saveSvgAsPng(targetDisplayElementRef.nativeElement, 'diagram.png', { backgroundColor: '#ffffff' });
+ }),
+ ).subscribe();
+ }
}
diff --git a/src/app/component/target/display/map.component.ts b/src/app/component/target/display/map.component.ts
index 087da7f..510a475 100644
--- a/src/app/component/target/display/map.component.ts
+++ b/src/app/component/target/display/map.component.ts
@@ -106,6 +106,7 @@ export class MapComponent implements OnInit, AfterContentInit, OnDestroy {
@ViewChild('displayTarget') set displayTarget(content: ElementRef) {
this.displayTargetRef = content;
+ this.store.dispatch(new TargetStore.ChangeTargetDisplayElementRef({ targetDisplayElementRef: content }));
}
private displayTargetRef: ElementRef;
@@ -260,6 +261,8 @@ export class MapComponent implements OnInit, AfterContentInit, OnDestroy {
}
ngOnDestroy(): void {
+ this.store.dispatch(new TargetStore.ChangeTargetDisplayElementRef({ targetDisplayElementRef: null }));
+
if (null !== this.targetSubscription) {
this.targetSubscription.unsubscribe();
}
diff --git a/src/app/store/target/target/target.action.ts b/src/app/store/target/target/target.action.ts
index 7b24edf..f4cd6a0 100644
--- a/src/app/store/target/target/target.action.ts
+++ b/src/app/store/target/target/target.action.ts
@@ -1,3 +1,4 @@
+import { ElementRef } from '@angular/core';
import { Action } from '@ngrx/store';
import { Host, Port, Service } from '@overflow/model/discovery';
import { TargetDisplayType } from '../../../core/type';
@@ -10,6 +11,7 @@ export enum ActionType {
ChangeTargetDisplayType = '[app.target] ChangeTargetDisplayType',
RefreshTargetDisplay = '[app.target] RefreshTargetDisplay',
ChangeSelectedTarget = '[app.target] ChangeSelectedTarget',
+ ChangeTargetDisplayElementRef = '[app.target] ChangeTargetDisplayElementRef',
}
export class SetHosts implements Action {
@@ -48,6 +50,12 @@ export class ChangeSelectedTarget implements Action {
constructor(public payload: { group: string, target: Host | Port | Service }) { }
}
+export class ChangeTargetDisplayElementRef implements Action {
+ readonly type = ActionType.ChangeTargetDisplayElementRef;
+
+ constructor(public payload: { targetDisplayElementRef: ElementRef }) { }
+}
+
export type Actions =
| SetHosts
| SetPorts
@@ -55,5 +63,6 @@ export type Actions =
| ChangeTargetDisplayType
| RefreshTargetDisplay
| ChangeSelectedTarget
+ | ChangeTargetDisplayElementRef
;
diff --git a/src/app/store/target/target/target.reducer.ts b/src/app/store/target/target/target.reducer.ts
index fde0bea..52b7d59 100644
--- a/src/app/store/target/target/target.reducer.ts
+++ b/src/app/store/target/target/target.reducer.ts
@@ -52,6 +52,13 @@ export function reducer(state: State = initialState, action: Actions): State {
};
}
+ case ActionType.ChangeTargetDisplayElementRef: {
+ return {
+ ...state,
+ targetDisplayElementRef: action.payload.targetDisplayElementRef,
+ };
+ }
+
default: {
return state;
}
diff --git a/src/app/store/target/target/target.state.ts b/src/app/store/target/target/target.state.ts
index 05b48a9..8a3ff7d 100644
--- a/src/app/store/target/target/target.state.ts
+++ b/src/app/store/target/target/target.state.ts
@@ -1,3 +1,4 @@
+import { ElementRef } from '@angular/core';
import { Selector, createSelector } from '@ngrx/store';
import { Host, Port, Service } from '@overflow/model/discovery';
import { TargetDisplayType } from '../../../core/type';
@@ -13,6 +14,7 @@ export interface State {
group: string;
target: Host | Port | Service;
} | null;
+ targetDisplayElementRef: ElementRef;
}
export const initialState: State = {
@@ -23,6 +25,7 @@ export const initialState: State = {
targetDisplayType: TargetDisplayType.NONE,
refreshTargetDisplay: false,
selectedTarget: null,
+ targetDisplayElementRef: null,
};
export function getSelectors(selector: Selector) {
@@ -33,5 +36,6 @@ export function getSelectors(selector: Selector) {
selectTargetDisplayType: createSelector(selector, (state: State) => state.targetDisplayType),
selectRefreshTargetDisplay: createSelector(selector, (state: State) => state.refreshTargetDisplay),
selectSelectedTarget: createSelector(selector, (state: State) => state.selectedTarget),
+ selectTargetDisplayElementRef: createSelector(selector, (state: State) => state.targetDisplayElementRef),
};
}