mirror of
https://github.com/GNS3/gns3-web-ui.git
synced 2025-06-23 00:49:01 +00:00
Merge pull request #495 from GNS3/screenshot-of-map
Ability to take screenshot of map
This commit is contained in:
@ -67,6 +67,7 @@
|
|||||||
"raven-js": "^3.27.2",
|
"raven-js": "^3.27.2",
|
||||||
"rxjs": "^6.5.2",
|
"rxjs": "^6.5.2",
|
||||||
"rxjs-compat": "^6.5.2",
|
"rxjs-compat": "^6.5.2",
|
||||||
|
"save-svg-as-png": "^1.4.14",
|
||||||
"tree-kill": "^1.2.1",
|
"tree-kill": "^1.2.1",
|
||||||
"typeface-roboto": "^0.0.75",
|
"typeface-roboto": "^0.0.75",
|
||||||
"xterm": "^3.14.5",
|
"xterm": "^3.14.5",
|
||||||
|
@ -14,6 +14,10 @@ export class MockedSymbolService {
|
|||||||
public list() {
|
public list() {
|
||||||
return of([]);
|
return of([]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public raw() {
|
||||||
|
return of('<svg></svg>')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
describe('Symbols component', () => {
|
describe('Symbols component', () => {
|
||||||
|
@ -57,6 +57,14 @@
|
|||||||
(click)="changeLockValue()">
|
(click)="changeLockValue()">
|
||||||
<mat-icon>lock</mat-icon>
|
<mat-icon>lock</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
matTooltip="Take a screenshot"
|
||||||
|
mat-icon-button
|
||||||
|
class="menu-button"
|
||||||
|
(click)="takeScreenshot()"
|
||||||
|
>
|
||||||
|
<mat-icon>photo_camera</mat-icon>
|
||||||
|
</button>
|
||||||
<app-drawing-added
|
<app-drawing-added
|
||||||
[server]="server"
|
[server]="server"
|
||||||
[project]="project"
|
[project]="project"
|
||||||
|
@ -10,12 +10,15 @@ import { ToolsService } from '../../../services/tools.service';
|
|||||||
import { D3MapComponent } from '../../../cartography/components/d3-map/d3-map.component';
|
import { D3MapComponent } from '../../../cartography/components/d3-map/d3-map.component';
|
||||||
import { ANGULAR_MAP_DECLARATIONS } from '../../../cartography/angular-map.imports';
|
import { ANGULAR_MAP_DECLARATIONS } from '../../../cartography/angular-map.imports';
|
||||||
import { NO_ERRORS_SCHEMA } from '@angular/core';
|
import { NO_ERRORS_SCHEMA } from '@angular/core';
|
||||||
|
import { SymbolService } from '../../../services/symbol.service';
|
||||||
|
import { MockedSymbolService } from '../../preferences/common/symbols/symbols.component.spec';
|
||||||
|
|
||||||
describe('ProjectMapMenuComponent', () => {
|
describe('ProjectMapMenuComponent', () => {
|
||||||
let component: ProjectMapMenuComponent;
|
let component: ProjectMapMenuComponent;
|
||||||
let fixture: ComponentFixture<ProjectMapMenuComponent>;
|
let fixture: ComponentFixture<ProjectMapMenuComponent>;
|
||||||
let drawingService = new MockedDrawingService();
|
let drawingService = new MockedDrawingService();
|
||||||
let mapSettingService = new MapSettingsService();
|
let mapSettingService = new MapSettingsService();
|
||||||
|
let mockedSymbolService = new MockedSymbolService;
|
||||||
|
|
||||||
beforeEach(async(() => {
|
beforeEach(async(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
@ -23,7 +26,8 @@ describe('ProjectMapMenuComponent', () => {
|
|||||||
providers: [
|
providers: [
|
||||||
{ provide: DrawingService, useValue: drawingService },
|
{ provide: DrawingService, useValue: drawingService },
|
||||||
{ provide: ToolsService },
|
{ provide: ToolsService },
|
||||||
{ provide: MapSettingsService, useValue: mapSettingService }
|
{ provide: MapSettingsService, useValue: mapSettingService },
|
||||||
|
{ provide: SymbolService, useValue: mockedSymbolService}
|
||||||
],
|
],
|
||||||
declarations: [ProjectMapMenuComponent, D3MapComponent, ...ANGULAR_MAP_DECLARATIONS],
|
declarations: [ProjectMapMenuComponent, D3MapComponent, ...ANGULAR_MAP_DECLARATIONS],
|
||||||
schemas: [NO_ERRORS_SCHEMA]
|
schemas: [NO_ERRORS_SCHEMA]
|
||||||
|
@ -4,6 +4,8 @@ import { Server } from '../../../models/server';
|
|||||||
import { ToolsService } from '../../../services/tools.service';
|
import { ToolsService } from '../../../services/tools.service';
|
||||||
import { MapSettingsService } from '../../../services/mapsettings.service';
|
import { MapSettingsService } from '../../../services/mapsettings.service';
|
||||||
import { DrawingService } from '../../../services/drawing.service';
|
import { DrawingService } from '../../../services/drawing.service';
|
||||||
|
import * as svg from 'save-svg-as-png';
|
||||||
|
import { SymbolService } from '../../../services/symbol.service';
|
||||||
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@ -27,11 +29,34 @@ export class ProjectMapMenuComponent implements OnInit, OnDestroy {
|
|||||||
constructor(
|
constructor(
|
||||||
private toolsService: ToolsService,
|
private toolsService: ToolsService,
|
||||||
private mapSettingsService: MapSettingsService,
|
private mapSettingsService: MapSettingsService,
|
||||||
private drawingService: DrawingService
|
private drawingService: DrawingService,
|
||||||
|
private symbolService: SymbolService
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
ngOnInit() {}
|
ngOnInit() {}
|
||||||
|
|
||||||
|
public async takeScreenshot() {
|
||||||
|
let splittedSvg = document.getElementsByTagName("svg")[0].outerHTML.split('image');
|
||||||
|
let i = 1;
|
||||||
|
|
||||||
|
while (i < splittedSvg.length) {
|
||||||
|
let splittedImage = splittedSvg[i].split("\"");
|
||||||
|
let splittedUrl = splittedImage[1].split("/");
|
||||||
|
|
||||||
|
let elem = await this.symbolService.raw(this.server, splittedUrl[7]).toPromise();
|
||||||
|
let splittedElement = elem.split('-->');
|
||||||
|
splittedSvg[i] = splittedElement[1].substring(2);
|
||||||
|
i += 2;
|
||||||
|
}
|
||||||
|
let svgString = splittedSvg.join();
|
||||||
|
|
||||||
|
let placeholder = document.createElement('div');
|
||||||
|
placeholder.innerHTML = svgString;
|
||||||
|
let element = placeholder.firstChild;
|
||||||
|
|
||||||
|
svg.saveSvgAsPng(element, "screenshot.png");
|
||||||
|
}
|
||||||
|
|
||||||
public addDrawing(selectedObject: string) {
|
public addDrawing(selectedObject: string) {
|
||||||
switch (selectedObject) {
|
switch (selectedObject) {
|
||||||
case 'rectangle':
|
case 'rectangle':
|
||||||
|
@ -80,7 +80,7 @@ g.node:hover {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.extended {
|
.extended {
|
||||||
width: 700px !important;
|
width: 770px !important;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
@ -43,6 +43,7 @@ import { RecentlyOpenedProjectService } from '../../services/recentlyOpenedProje
|
|||||||
import { MapLink } from '../../cartography/models/map/map-link';
|
import { MapLink } from '../../cartography/models/map/map-link';
|
||||||
import { MapLinkToLinkConverter } from '../../cartography/converters/map/map-link-to-link-converter';
|
import { MapLinkToLinkConverter } from '../../cartography/converters/map/map-link-to-link-converter';
|
||||||
import { MovingEventSource } from '../../cartography/events/moving-event-source';
|
import { MovingEventSource } from '../../cartography/events/moving-event-source';
|
||||||
|
import { log } from 'util';
|
||||||
import { LinkWidget } from '../../cartography/widgets/link';
|
import { LinkWidget } from '../../cartography/widgets/link';
|
||||||
import { MapScaleService } from '../../services/mapScale.service';
|
import { MapScaleService } from '../../services/mapScale.service';
|
||||||
import { NodeCreatedLabelStylesFixer } from './helpers/node-created-label-styles-fixer';
|
import { NodeCreatedLabelStylesFixer } from './helpers/node-created-label-styles-fixer';
|
||||||
|
@ -7351,6 +7351,11 @@ saucelabs@^1.5.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
https-proxy-agent "^2.2.1"
|
https-proxy-agent "^2.2.1"
|
||||||
|
|
||||||
|
save-svg-as-png@^1.4.14:
|
||||||
|
version "1.4.14"
|
||||||
|
resolved "https://registry.npmjs.org/save-svg-as-png/-/save-svg-as-png-1.4.14.tgz#d5017bb9746adf00c146a17e63ed4badd1e10b40"
|
||||||
|
integrity sha512-hJqOFSdRvhBVD2pQSM+mJStvQGfnvQCCF6ULtAxdjF4lDwXYfWZ9Eug0fcRl05YyPL2yknCDBEOpbO4Fkw5qmg==
|
||||||
|
|
||||||
sax@0.5.x:
|
sax@0.5.x:
|
||||||
version "0.5.8"
|
version "0.5.8"
|
||||||
resolved "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1"
|
resolved "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1"
|
||||||
|
Reference in New Issue
Block a user