diff --git a/.appveyor.yml b/.appveyor.yml
index 792bc9b6..3e291170 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -20,6 +20,7 @@ install:
build_script:
- cmd: set NODE_OPTIONS=--max-old-space-size=8092
- yarn buildforelectron
+ - "%PYTHON%\\python.exe -m pip install -U pip"
- "%PYTHON%\\python.exe -m pip install -r scripts\\requirements.txt"
- "%PYTHON%\\python.exe scripts\\build.py download -a"
- "%PYTHON%\\python.exe scripts\\build.py build_exe -b dist/exe.gns3server -s"
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 6417b6eb..c33460ba 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1,5 +1,9 @@
# iOS CircleCI 2.1 configuration file
version: 2.1
+
+orbs:
+ node: circleci/node@4.2.0
+
jobs:
build:
macos:
@@ -7,13 +11,16 @@ jobs:
steps:
- checkout
+ - node/install:
+ install-yarn: true
- run:
- name: Install nodejs
+ name: Update BREW and print configs
command: |
brew update
- brew upgrade yarn
- brew upgrade node
+ brew analytics off
+ brew --env
+ brew --config
- run:
name: Set timezone and check current datetime
@@ -34,6 +41,8 @@ jobs:
curl -o /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/readline.rb https://raw.githubusercontent.com/Homebrew/homebrew-core/b1bd1c4a62e1336422de3614d1fc49ffbce589a8/Formula/readline.rb
# remove check for old compilers which creates the error described in https://github.com/sashkab/homebrew-python/issues/36
sed -i.bak -e '58,61d' /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/python.rb
+ # remove 'do devel' block to avoid error: Calling 'devel' blocks in formulae is disabled!
+ sed -i.bak -e '14,17d' /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/python.rb
brew unlink python
brew uninstall --ignore-dependencies readline
brew install readline
@@ -41,7 +50,7 @@ jobs:
brew pin readline
# --ignore-dependencies is used to prevent this issue: https://github.com/tensorflow/tensorflow/issues/25093
brew install --ignore-dependencies python
- brew switch python 3.6.5_1
+ #brew link python 3.6.5_1
brew info python
brew pin python
@@ -77,8 +86,11 @@ jobs:
name: Building gns3server
command: |
python3 -V
- pip3 install -r scripts/requirements.txt
+ python3 -m pip install -U pip
+ python3 -m pip install -r scripts/requirements.txt
python3 scripts/build.py download -a
+ # necessary because of https://github.com/GNS3/gns3-gui/issues/2849
+ python3 -m pip install jsonschema==2.6.0
python3 scripts/build.py build_exe -b dist/exe.gns3server -s
python3 scripts/build.py validate -b dist
@@ -105,4 +117,3 @@ workflows:
filters:
tags:
only: /v.*/
-
diff --git a/.travis.yml b/.travis.yml
index 4c657dfa..c5cfcfca 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -37,12 +37,12 @@ before_install:
before_script:
# greenkeeper-lockfile support
- greenkeeper-lockfile-update
- - npm install -g codecov
+ # - npm install -g codecov
script: yarn coverage
after_success:
- - codecov
+ # - codecov
after_script:
# greenkeeper-lockfile support
diff --git a/README.md b/README.md
index 97f8f893..25529e3e 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,6 @@
[](https://travis-ci.org)
[](https://www.appveyor.com/)
[](https://circleci.com/gh/GNS3/gns3-web-ui/tree/master.png)
-[](https://codecov.io/gh/GNS3/gns3-web-ui)
[](https://libraries.io/github/GNS3/gns3-web-ui)
[](https://repology.org/metapackage/gns3/versions)
@@ -28,6 +27,14 @@ We're using [yarn](https://yarnpkg.com/lang/en/) for packages installation:
yarn install
```
+## JavaScript heap out of memory
+
+Increase the memory allocated to Node if you get JavaScript heap out of memory errors.
+
+```
+export NODE_OPTIONS=--max-old-space-size=8192
+```
+
#### Run GNS3 server
Visit [gns3-server](https://github.com/GNS3/gns3-server) for guide how to run GNS3 server.
diff --git a/angular.json b/angular.json
index caba6592..6b7e8338 100644
--- a/angular.json
+++ b/angular.json
@@ -25,7 +25,12 @@
"@mattlewis92/dom-autoscroller",
"rxjs/Rx",
"rxjs/add/operator/map",
- "rxjs-compat/add/operator/map"
+ "rxjs-compat/add/operator/map",
+ "angular-react-core.js",
+ "react",
+ "react-dom",
+ "classnames",
+ "stylenames"
],
"aot": true,
"outputPath": "dist",
@@ -42,16 +47,7 @@
"node_modules/bootstrap/dist/css/bootstrap.min.css",
"node_modules/notosans-fontface/css/notosans-fontface.min.css",
"src/styles.scss",
- {
- "inject": true,
- "input": "src/theme.scss",
- "bundleName": "theme-default-dark"
- },
- {
- "inject": true,
- "input": "src/theme-light.scss",
- "bundleName": "theme-default"
- }
+ "src/theme.scss"
],
"scripts": []
},
@@ -185,9 +181,6 @@
"assets": [
"src/assets",
"src/favicon.ico"
- ],
- "codeCoverageExclude": [
- "src/app/cartography/components/experimental-map/**/*"
]
}
},
diff --git a/e2e/app.e2e-spec.ts b/e2e/app.e2e-spec.ts
index 7e2a1898..217ef4e7 100644
--- a/e2e/app.e2e-spec.ts
+++ b/e2e/app.e2e-spec.ts
@@ -10,7 +10,7 @@ describe('GNS3 Web UI Application', () => {
it('should have correct page title', async () => {
// arrange
await page.navigateTo();
-
+
// act
let text = await page.getTitleText();
diff --git a/e2e/helpers/common.po.ts b/e2e/helpers/common.po.ts
index 3dae8252..e40e30be 100644
--- a/e2e/helpers/common.po.ts
+++ b/e2e/helpers/common.po.ts
@@ -1,22 +1,21 @@
-import { browser, by, element } from 'protractor';
-import { ServersPage } from './server.po';
+import { browser } from 'protractor';
export class TestHelper {
- sleep(value: number) {
- browser.sleep(value);
- }
+ sleep(value: number) {
+ browser.sleep(value);
+ }
- waitForLoading() {
- browser.waitForAngular();
- }
+ waitForLoading() {
+ browser.waitForAngular();
+ }
- async asyncForEach(array, callback) {
- for (let index = 0; index < array.length; index++) {
- await callback(array[index], index, array);
- }
+ async asyncForEach(array, callback) {
+ for (let index = 0; index < array.length; index++) {
+ await callback(array[index], index, array);
}
+ }
- getCurrentUrl() {
- return browser.getCurrentUrl();
- }
+ getCurrentUrl() {
+ return browser.getCurrentUrl();
+ }
}
diff --git a/e2e/helpers/project-map.po.ts b/e2e/helpers/project-map.po.ts
index 7ce8c823..3e5c9e06 100644
--- a/e2e/helpers/project-map.po.ts
+++ b/e2e/helpers/project-map.po.ts
@@ -1,50 +1,50 @@
-import { TestHelper } from "./common.po"
-import { browser, by } from "protractor";
+import { browser, by } from 'protractor';
+import { TestHelper } from './common.po';
export class ProjectMapPage {
- helper = new TestHelper();
+ helper = new TestHelper();
- async openAddProjectDialog() {
- let addButton = await browser.driver.findElement(by.css('button.addNode'));
- await addButton.click();
+ async openAddProjectDialog() {
+ let addButton = await browser.driver.findElement(by.css('button.addNode'));
+ await addButton.click();
+ }
+
+ async addNode() {
+ let inputs = await browser.driver.findElements(by.css('input.mat-input-element'));
+ await inputs[0].sendKeys('VPCS');
+ this.helper.sleep(1000);
+
+ let selects = await browser.driver.findElements(by.css('mat-select.mat-select'));
+ await selects[1].click();
+ this.helper.sleep(1000);
+
+ let options = await browser.driver.findElements(by.css('mat-option.mat-option'));
+ await options[1].click(); //first option should be chosen
+ this.helper.sleep(1000);
+
+ // new select appears after refreshing data
+ selects = await browser.driver.findElements(by.css('mat-select.mat-select'));
+ if (selects[2]) {
+ await selects[2].click();
+ this.helper.sleep(1000);
+
+ options = await browser.driver.findElements(by.css('mat-option.mat-option'));
+ await options[0].click();
+ this.helper.sleep(1000);
}
- async addNode() {
- let inputs = await browser.driver.findElements(by.css('input.mat-input-element'));
- await inputs[0].sendKeys('VPCS');
- this.helper.sleep(1000);
+ let addButton = await browser.driver.findElement(by.css('button.addButton'));
+ await addButton.click();
+ this.helper.sleep(1000);
+ }
- let selects = await browser.driver.findElements(by.css('mat-select.mat-select'));
- await selects[1].click();
- this.helper.sleep(1000);
+ async verifyIfNodeWithLabelExists(labelToFind: string) {
+ this.helper.sleep(5000);
+ let nodeLabel = await browser.driver.findElement(by.css('#map > g > g.layer > g.nodes > g > g > g > g > text'));
+ let selectedNode;
+ let textFromNodeLabel = await nodeLabel.getText();
+ if (textFromNodeLabel == labelToFind) selectedNode = nodeLabel;
- let options = await browser.driver.findElements(by.css('mat-option.mat-option'));
- await options[1].click(); //first option should be chosen
- this.helper.sleep(1000);
-
- // new select appears after refreshing data
- selects = await browser.driver.findElements(by.css('mat-select.mat-select'));
- if (selects[2]) {
- await selects[2].click();
- this.helper.sleep(1000);
-
- options = await browser.driver.findElements(by.css('mat-option.mat-option'));
- await options[0].click();
- this.helper.sleep(1000);
- }
-
- let addButton = await browser.driver.findElement(by.css('button.addButton'));
- await addButton.click();
- this.helper.sleep(1000);
- }
-
- async verifyIfNodeWithLabelExists(labelToFind: string) {
- this.helper.sleep(5000);
- let nodeLabel = await browser.driver.findElement(by.css('#map > g > g.layer > g.nodes > g > g > g > g > text'));
- let selectedNode;
- let textFromNodeLabel = await nodeLabel.getText();
- if (textFromNodeLabel == labelToFind) selectedNode = nodeLabel;
-
- return selectedNode ? true : false;
- }
+ return selectedNode ? true : false;
+ }
}
diff --git a/e2e/helpers/project.po.ts b/e2e/helpers/project.po.ts
index 76b60ec2..5288d917 100644
--- a/e2e/helpers/project.po.ts
+++ b/e2e/helpers/project.po.ts
@@ -1,20 +1,20 @@
-import { TestHelper } from "./common.po"
-import { browser, by } from "protractor";
+import { browser, by } from 'protractor';
+import { TestHelper } from './common.po';
export class ProjectsPage {
- helper = new TestHelper();
+ helper = new TestHelper();
- async openAddProjectDialog() {
- let addButton = await browser.driver.findElement(by.css('button.add-button'));
- await addButton.click();
- }
+ async openAddProjectDialog() {
+ let addButton = await browser.driver.findElement(by.css('button.add-button'));
+ await addButton.click();
+ }
- async createProject() {
- let today = new Date();
- let inputs = await browser.driver.findElements(by.css('input.mat-input-element'));
- await inputs[1].sendKeys('test project ' + today.getUTCMilliseconds());
- this.helper.sleep(2000);
- let dialogButton = await browser.driver.findElement(by.css('button.add-project-button'));
- await dialogButton.click();
- }
+ async createProject() {
+ let today = new Date();
+ let inputs = await browser.driver.findElements(by.css('input.mat-input-element'));
+ await inputs[1].sendKeys('test project ' + today.getUTCMilliseconds());
+ this.helper.sleep(2000);
+ let dialogButton = await browser.driver.findElement(by.css('button.add-project-button'));
+ await dialogButton.click();
+ }
}
diff --git a/e2e/helpers/server.po.ts b/e2e/helpers/server.po.ts
index ece2422b..90250c7e 100644
--- a/e2e/helpers/server.po.ts
+++ b/e2e/helpers/server.po.ts
@@ -1,41 +1,41 @@
-import { browser, by, element } from 'protractor';
+import { browser, by } from 'protractor';
import { TestHelper } from './common.po';
export class ServersPage {
- helper = new TestHelper;
+ helper = new TestHelper();
- maximizeWindow() {
- browser.driver.manage().window().maximize();
- }
+ maximizeWindow() {
+ browser.driver.manage().window().maximize();
+ }
- navigateToServersPage() {
- return browser.get('/servers');
- }
+ navigateToServersPage() {
+ return browser.get('/servers');
+ }
- getAddServerNotificationText() {
- return browser.driver.findElement(by.className('mat-card-content')).getText();
- }
+ getAddServerNotificationText() {
+ return browser.driver.findElement(by.className('mat-card-content')).getText();
+ }
- async clickAddServer() {
- let serversTable = await this.checkServersTable();
- if (serversTable.length === 0) {
- let buttons = await browser.driver.findElements(by.className('mat-button mat-button-base'));
- await buttons[3].click();
- }
+ async clickAddServer() {
+ let serversTable = await this.checkServersTable();
+ if (serversTable.length === 0) {
+ let buttons = await browser.driver.findElements(by.className('mat-button mat-button-base'));
+ await buttons[3].click();
}
+ }
- checkServersTable() {
- return browser.driver.findElements(by.css('mat-cell'));
- }
+ checkServersTable() {
+ return browser.driver.findElements(by.css('mat-cell'));
+ }
- async navigateToServerProjects() {
- this.helper.sleep(2000);
- let hyperlinks = await browser.driver.findElements(by.css('a.table-link'));
- let serverLink;
- await this.helper.asyncForEach(hyperlinks, async element => {
- let text = await element.getText();
- if (text === '127.0.0.1') serverLink = element;
- });
- await serverLink.click();
- }
+ async navigateToServerProjects() {
+ this.helper.sleep(2000);
+ let hyperlinks = await browser.driver.findElements(by.css('a.table-link'));
+ let serverLink;
+ await this.helper.asyncForEach(hyperlinks, async (element) => {
+ let text = await element.getText();
+ if (text === '127.0.0.1') serverLink = element;
+ });
+ await serverLink.click();
+ }
}
diff --git a/e2e/project-map.e2e-spec.ts b/e2e/project-map.e2e-spec.ts
index f5379d9d..8986d97a 100644
--- a/e2e/project-map.e2e-spec.ts
+++ b/e2e/project-map.e2e-spec.ts
@@ -1,41 +1,40 @@
-import { ServersPage } from './helpers/server.po';
import { TestHelper } from './helpers/common.po';
-import { element } from 'protractor';
-import { ProjectsPage } from './helpers/project.po';
import { ProjectMapPage } from './helpers/project-map.po';
+import { ProjectsPage } from './helpers/project.po';
+import { ServersPage } from './helpers/server.po';
describe('Project map page', () => {
- let serversPage: ServersPage;
- let projectsPage: ProjectsPage;
- let projectMapPage: ProjectMapPage;
- let helper: TestHelper;
+ let serversPage: ServersPage;
+ let projectsPage: ProjectsPage;
+ let projectMapPage: ProjectMapPage;
+ let helper: TestHelper;
- beforeEach(async () => {
- serversPage = new ServersPage();
- projectsPage = new ProjectsPage();
- projectMapPage = new ProjectMapPage();
- helper = new TestHelper();
+ beforeEach(async () => {
+ serversPage = new ServersPage();
+ projectsPage = new ProjectsPage();
+ projectMapPage = new ProjectMapPage();
+ helper = new TestHelper();
- serversPage.maximizeWindow();
- await serversPage.navigateToServersPage();
- await serversPage.clickAddServer();
- await serversPage.navigateToServerProjects();
- await projectsPage.openAddProjectDialog();
- helper.sleep(2000);
- await projectsPage.createProject();
- helper.sleep(2000);
- });
+ serversPage.maximizeWindow();
+ await serversPage.navigateToServersPage();
+ await serversPage.clickAddServer();
+ await serversPage.navigateToServerProjects();
+ await projectsPage.openAddProjectDialog();
+ helper.sleep(2000);
+ await projectsPage.createProject();
+ helper.sleep(2000);
+ });
- it('user should have possibility to add nodes to map', async () => {
- // arrange
- projectMapPage.openAddProjectDialog();
- helper.sleep(2000);
+ it('user should have possibility to add nodes to map', async () => {
+ // arrange
+ projectMapPage.openAddProjectDialog();
+ helper.sleep(2000);
- //act
- projectMapPage.addNode();
- helper.sleep(2000);
+ //act
+ projectMapPage.addNode();
+ helper.sleep(2000);
- //assert
- expect(await projectMapPage.verifyIfNodeWithLabelExists('PC1')).toBe(true);
- });
+ //assert
+ expect(await projectMapPage.verifyIfNodeWithLabelExists('PC1')).toBe(true);
+ });
});
diff --git a/e2e/projects.e2e-spec.ts b/e2e/projects.e2e-spec.ts
index 977c3656..01df6aee 100644
--- a/e2e/projects.e2e-spec.ts
+++ b/e2e/projects.e2e-spec.ts
@@ -1,34 +1,33 @@
-import { ServersPage } from './helpers/server.po';
import { TestHelper } from './helpers/common.po';
-import { element } from 'protractor';
import { ProjectsPage } from './helpers/project.po';
+import { ServersPage } from './helpers/server.po';
describe('Projects page', () => {
- let serversPage: ServersPage;
- let projectsPage: ProjectsPage;
- let helper: TestHelper;
+ let serversPage: ServersPage;
+ let projectsPage: ProjectsPage;
+ let helper: TestHelper;
- beforeEach(() => {
- serversPage = new ServersPage();
- projectsPage = new ProjectsPage();
- helper = new TestHelper();
- });
+ beforeEach(() => {
+ serversPage = new ServersPage();
+ projectsPage = new ProjectsPage();
+ helper = new TestHelper();
+ });
- it('user should have possibility to create new project', async () => {
- // arrange
- serversPage.maximizeWindow();
- await serversPage.navigateToServersPage();
- await serversPage.clickAddServer();
- await serversPage.navigateToServerProjects();
- helper.sleep(2000);
+ it('user should have possibility to create new project', async () => {
+ // arrange
+ serversPage.maximizeWindow();
+ await serversPage.navigateToServersPage();
+ await serversPage.clickAddServer();
+ await serversPage.navigateToServerProjects();
+ helper.sleep(2000);
- //act
- await projectsPage.openAddProjectDialog();
- helper.sleep(2000);
- await projectsPage.createProject();
- helper.sleep(2000);
+ //act
+ await projectsPage.openAddProjectDialog();
+ helper.sleep(2000);
+ await projectsPage.createProject();
+ helper.sleep(2000);
- //assert
- expect(helper.getCurrentUrl()).toMatch('server/1/project/');
- });
+ //assert
+ expect(helper.getCurrentUrl()).toMatch('server/1/project/');
+ });
});
diff --git a/e2e/servers.e2e-spec.ts b/e2e/servers.e2e-spec.ts
index 1d177f4b..45da0436 100644
--- a/e2e/servers.e2e-spec.ts
+++ b/e2e/servers.e2e-spec.ts
@@ -1,44 +1,43 @@
-import { ServersPage } from './helpers/server.po';
import { TestHelper } from './helpers/common.po';
-import { element } from 'protractor';
+import { ServersPage } from './helpers/server.po';
describe('Servers page', () => {
- let page: ServersPage;
- let helper: TestHelper;
+ let page: ServersPage;
+ let helper: TestHelper;
- beforeEach(() => {
- page = new ServersPage();
- helper = new TestHelper();
+ beforeEach(() => {
+ page = new ServersPage();
+ helper = new TestHelper();
+ });
+
+ xit('user should have possibility to add server', async () => {
+ // arrange
+ page.maximizeWindow();
+ await page.navigateToServersPage();
+
+ // act
+ let text = await page.getAddServerNotificationText();
+
+ // assert
+ expect(text).toBe("We've discovered GNS3 server on 127.0.0.1:3080, would you like to add to the list?");
+ });
+
+ it('user should see added server in the list', async () => {
+ // arrange
+ page.maximizeWindow();
+ await page.navigateToServersPage();
+ await page.clickAddServer();
+ helper.sleep(1000);
+
+ // act
+ let firstRowOfServersTable = await page.checkServersTable();
+ let serverData = [];
+ await helper.asyncForEach(firstRowOfServersTable, async (element) => {
+ serverData.push(await element.getText());
});
- xit('user should have possibility to add server', async () => {
- // arrange
- page.maximizeWindow();
- await page.navigateToServersPage();
-
- // act
- let text = await page.getAddServerNotificationText();
-
- // assert
- expect(text).toBe("We've discovered GNS3 server on 127.0.0.1:3080, would you like to add to the list?");
- });
-
- it('user should see added server in the list', async () => {
- // arrange
- page.maximizeWindow();
- await page.navigateToServersPage();
- await page.clickAddServer();
- helper.sleep(1000);
-
- // act
- let firstRowOfServersTable = await page.checkServersTable();
- let serverData = [];
- await helper.asyncForEach(firstRowOfServersTable, async element => {
- serverData.push(await element.getText());
- });
-
- // assert
- expect(serverData).toContain('127.0.0.1');
- expect(serverData).toContain('3080');
- });
+ // assert
+ expect(serverData).toContain('127.0.0.1');
+ expect(serverData).toContain('3080');
+ });
});
diff --git a/package.json b/package.json
index 80c1529d..c2a79c42 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gns3-web-ui",
- "version": "2.2.18dev",
+ "version": "2.2.21dev",
"author": {
"name": "GNS3 Technology Inc.",
"email": "developers@gns3.com"
@@ -17,6 +17,7 @@
"start": "ng serve",
"startforelectron": "ng serve --configuration=electronDev",
"build": "ng build",
+ "buildforproduction": "ng build --source-map=false --build-optimizer --configuration=production --base-href /static/web-ui/",
"buildforelectron": "ng build --configuration=electronProd",
"buildforgithub": "ng build --configuration=githubProd",
"test": "ng test",
@@ -40,93 +41,103 @@
},
"private": true,
"dependencies": {
- "@angular/animations": "^11.0.8",
- "@angular/cdk": "^11.0.3",
- "@angular/common": "^11.0.8",
- "@angular/compiler": "^11.0.8",
- "@angular/core": "^11.0.8",
- "@angular/forms": "^11.0.8",
+ "@angular-react/core": "^3.0.0",
+ "@angular-react/fabric": "^3.0.0",
+ "@angular/animations": "^11.2.8",
+ "@angular/cdk": "^11.2.7",
+ "@angular/common": "^11.2.8",
+ "@angular/compiler": "^11.2.8",
+ "@angular/core": "^11.2.8",
+ "@angular/forms": "^11.2.8",
"@angular/http": "^7.2.16",
- "@angular/material": "^11.0.3",
- "@angular/platform-browser": "^11.0.8",
- "@angular/platform-browser-dynamic": "^11.0.8",
- "@angular/router": "^11.0.8",
- "@sentry/browser": "^5.29.2",
- "@types/jest": "^26.0.20",
- "@types/mocha": "^8.2.0",
+ "@angular/material": "^11.2.7",
+ "@angular/platform-browser": "^11.2.8",
+ "@angular/platform-browser-dynamic": "^11.2.8",
+ "@angular/router": "^11.2.8",
+ "@sentry/browser": "^6.2.5",
+ "@types/jest": "^26.0.22",
+ "@types/mocha": "^8.2.2",
+ "@types/react": "^17.0.3",
+ "@types/react-dom": "^17.0.3",
"angular-draggable-droppable": "^4.6.0",
"angular-persistence": "^1.0.1",
- "angular-resizable-element": "^3.3.4",
+ "angular-resizable-element": "^3.3.5",
"angular2-draggable": "^2.3.2",
"angular2-hotkeys": "^2.2.0",
"angular2-indexeddb": "^1.2.3",
- "bootstrap": "^4.5.3",
+ "bootstrap": "^4.6.0",
"command-exists": "^1.2.9",
- "core-js": "^3.8.2",
- "d3-ng2-service": "^2.1.0",
"marked": "^1.1.1",
+ "core-js": "^3.10.0",
+ "d3-ng2-service": "^2.2.0",
+ "eev": "^0.1.5",
"file-saver": "^2.0.5",
- "ini": "^1.3.8",
+ "ini": "^2.0.0",
"material-design-icons": "^3.0.1",
"ng-circle-progress": "^1.6.0",
- "ng2-file-upload": "^1.3.0",
+ "ng2-file-upload": "^1.4.0",
"ngx-childprocess": "^0.0.6",
- "ngx-device-detector": "^2.0.5",
- "ngx-electron": "^2.1.1",
+ "ngx-device-detector": "^2.0.6",
+ "ngx-electron": "^2.2.0",
"node-fetch": "^2.6.1",
"notosans-fontface": "1.2.2",
- "rxjs": "^6.6.3",
- "rxjs-compat": "^6.6.3",
- "save-html-as-image": "^1.3.4",
- "save-svg-as-png": "^1.4.14",
- "schematics-scss-migrate": "^1.2.10",
- "snyk": "^1.437.3",
+ "office-ui-fabric-react": "^7.166.0",
+ "prettier-plugin-organize-imports": "^1.1.1",
+ "react": "^17.0.2",
+ "react-bootstrap": "^1.5.2",
+ "react-dom": "^17.0.2",
+ "rxjs": "^6.6.7",
+ "rxjs-compat": "^6.6.7",
+ "save-html-as-image": "^1.5.2",
+ "save-svg-as-png": "^1.4.17",
+ "schematics-scss-migrate": "^1.3.13",
+ "snyk": "^1.528.0",
"spark-md5": "^3.0.1",
"svg-crowbar": "^0.6.5",
- "tree-kill": "^1.2.1",
- "tslib": "^2.1.0",
+ "tree-kill": "^1.2.2",
+ "tslib": "^2.2.0",
"typeface-roboto": "^1.1.13",
- "xterm": "^4.9.0",
+ "xterm": "^4.11.0",
"xterm-addon-attach": "^0.6.0",
- "xterm-addon-fit": "^0.4.0",
+ "xterm-addon-fit": "^0.5.0",
"yargs": "^16.2.0",
- "zone.js": "^0.11.3"
+ "zone.js": "^0.11.4"
},
"devDependencies": {
- "@angular-devkit/build-angular": "^0.1100.6",
- "@angular/cli": "^11.0.6",
- "@angular/compiler-cli": "^11.0.8",
- "@angular/language-service": "^11.0.8",
- "@sentry/cli": "^1.61.0",
- "@sentry/electron": "^2.1.0",
- "@types/jasmine": "~3.6.0",
+ "@angular-devkit/build-angular": "^0.1102.7",
+ "@angular/cli": "^11.2.7",
+ "@angular/compiler-cli": "^11.2.8",
+ "@angular/language-service": "^11.2.8",
+ "@sentry/cli": "^1.63.2",
+ "@sentry/electron": "^2.4.0",
+ "@types/jasmine": "~3.6.9",
"@types/jasminewd2": "^2.0.8",
- "@types/node": "14.14.10",
- "codelyzer": "^6.0.0",
- "electron": "^11.2.0",
- "electron-builder": "22.9.1",
+ "@types/node": "14.14.37",
+ "codelyzer": "^6.0.1",
+ "electron": "^12.0.2",
+ "electron-builder": "22.10.5",
"file-loader": "^6.2.0",
- "jasmine-core": "~3.6.0",
- "jasmine-spec-reporter": "~5.0.0",
- "jquery": "^3.5.1",
- "karma": "^5.2.3",
+ "jasmine-core": "~3.7.1",
+ "jasmine-spec-reporter": "~6.0.0",
+ "jquery": "^3.6.0",
+ "karma": "^6.3.2",
"karma-chrome-launcher": "~3.1.0",
"karma-cli": "^2.0.0",
- "karma-coverage-istanbul-reporter": "~3.0.2",
- "karma-jasmine": "~4.0.0",
- "karma-jasmine-html-reporter": "^1.5.0",
+ "karma-coverage-istanbul-reporter": "~3.0.3",
+ "karma-jasmine": "~4.0.1",
+ "karma-jasmine-html-reporter": "^1.5.4",
"license-checker": "^25.0.1",
"popper.js": "^1.16.1",
"prettier": "^2.2.1",
"protractor": "^7.0.0",
- "replace": "^1.2.0",
+ "replace": "^1.2.1",
"rxjs-tslint": "^0.1.8",
"ts-mockito": "^2.6.1",
- "ts-node": "~9.0.0",
+ "ts-node": "~9.1.1",
"tslint": "^6.1.3",
"tslint-config-prettier": "^1.18.0",
"typescript": "4.0.2",
- "webpack": "4.44.2",
+ "webpack": "5.31.0",
"yarn-upgrade-all": "^0.5.4"
},
"greenkeeper": {
diff --git a/scripts/build.py b/scripts/build.py
index d92591bc..4a539e4e 100644
--- a/scripts/build.py
+++ b/scripts/build.py
@@ -144,7 +144,7 @@ def download_from_github(name, definition, output_directory):
files = []
if platform.system() == "Windows":
files = definition['files']['windows']
-
+
for filename in files:
dependency_file = os.path.join(dependency_dir, filename)
dependency_url = list(filter(lambda x: x['name'] == filename, release['assets']))[0]['browser_download_url']
@@ -161,7 +161,7 @@ def download_from_http(name, definition, output_directory):
files = []
if platform.system() == "Windows":
files = definition['files']['windows']
-
+
for filename in files:
dependency_file = os.path.join(dependency_dir, filename)
download(url, dependency_file)
@@ -193,7 +193,7 @@ def is_tagged():
return True
if os.environ.get('APPVEYOR_REPO_TAG', False) in (1, "True", "true"):
return True
-
+
def is_web_ui_non_dev():
package_file = os.path.join(FILE_DIR, '..', 'package.json')
@@ -237,6 +237,8 @@ def download_command(arguments):
if platform.system() == "Windows":
requirements = 'win-requirements.txt'
+ elif platform.system() == "Darwin":
+ requirements = 'mac-requirements.txt'
else:
requirements = 'requirements.txt'
diff --git a/scripts/requirements.txt b/scripts/requirements.txt
index 00ed69b4..49339bb5 100644
--- a/scripts/requirements.txt
+++ b/scripts/requirements.txt
@@ -1,9 +1,6 @@
-setuptools==40.8.0
+setuptools==54.2.0
cx_Freeze==5.1.1
-requests==2.21.0
-packaging==19.0
-appdirs==1.4.3
-psutil==5.6.7
-jsonschema==2.6.0 # lock down jsonschema, 3.0 makes problems
-
-urllib3>=1.25.9 # not directly required, pinned by Snyk to avoid a vulnerability
\ No newline at end of file
+requests==2.25.1
+packaging==20.9
+appdirs==1.4.4
+psutil==5.8.0
diff --git a/src/ReleaseNotes.txt b/src/ReleaseNotes.txt
index 61d31051..fc9bd32b 100644
--- a/src/ReleaseNotes.txt
+++ b/src/ReleaseNotes.txt
@@ -1,5 +1,7 @@
GNS3 WebUI is web implementation of user interface for GNS3 software.
+Current version: 2.2.19
+
Current version: 2020.4.0-beta.1
Bug Fixes & enhancements
diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts
index 9bd6dd11..2e95bbec 100644
--- a/src/app/app-routing.module.ts
+++ b/src/app/app-routing.module.ts
@@ -1,69 +1,59 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
-
-import { ProjectMapComponent } from './components/project-map/project-map.component';
-import { ServersComponent } from './components/servers/servers.component';
-import { ProjectsComponent } from './components/projects/projects.component';
-import { DefaultLayoutComponent } from './layouts/default-layout/default-layout.component';
-import { SettingsComponent } from './components/settings/settings.component';
import { BundledServerFinderComponent } from './components/bundled-server-finder/bundled-server-finder.component';
-import { PreferencesComponent } from './components/preferences/preferences.component';
-import { QemuPreferencesComponent } from './components/preferences/qemu/qemu-preferences/qemu-preferences.component';
-import { QemuVmTemplatesComponent } from './components/preferences/qemu/qemu-vm-templates/qemu-vm-templates.component';
-import { QemuVmTemplateDetailsComponent } from './components/preferences/qemu/qemu-vm-template-details/qemu-vm-template-details.component';
-import { AddQemuVmTemplateComponent } from './components/preferences/qemu/add-qemu-vm-template/add-qemu-vm-template.component';
-import { GeneralPreferencesComponent } from './components/preferences/general/general-preferences.component';
-import { VpcsPreferencesComponent } from './components/preferences/vpcs/vpcs-preferences/vpcs-preferences.component';
-import { VpcsTemplatesComponent } from './components/preferences/vpcs/vpcs-templates/vpcs-templates.component';
-import { AddVpcsTemplateComponent } from './components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component';
-import { VpcsTemplateDetailsComponent } from './components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component';
-import { VirtualBoxPreferencesComponent } from './components/preferences/virtual-box/virtual-box-preferences/virtual-box-preferences.component';
-import { VirtualBoxTemplatesComponent } from './components/preferences/virtual-box/virtual-box-templates/virtual-box-templates.component';
-import { VirtualBoxTemplateDetailsComponent } from './components/preferences/virtual-box/virtual-box-template-details/virtual-box-template-details.component';
-import { AddVirtualBoxTemplateComponent } from './components/preferences/virtual-box/add-virtual-box-template/add-virtual-box-template.component';
+import { DirectLinkComponent } from './components/direct-link/direct-link.component';
+import { HelpComponent } from './components/help/help.component';
+import { ReportIssueComponent } from './components/help/report-issue/report-issue.component';
+import { InstalledSoftwareComponent } from './components/installed-software/installed-software.component';
+import { PageNotFoundComponent } from './components/page-not-found/page-not-found.component';
import { BuiltInPreferencesComponent } from './components/preferences/built-in/built-in-preferences.component';
-import { EthernetHubsTemplatesComponent } from './components/preferences/built-in/ethernet-hubs/ethernet-hubs-templates/ethernet-hubs-templates.component';
-import { EthernetHubsAddTemplateComponent } from './components/preferences/built-in/ethernet-hubs/ethernet-hubs-add-template/ethernet-hubs-add-template.component';
-import { EthernetHubsTemplateDetailsComponent } from './components/preferences/built-in/ethernet-hubs/ethernet-hubs-template-details/ethernet-hubs-template-details.component';
-import { CloudNodesTemplatesComponent } from './components/preferences/built-in/cloud-nodes/cloud-nodes-templates/cloud-nodes-templates.component';
import { CloudNodesAddTemplateComponent } from './components/preferences/built-in/cloud-nodes/cloud-nodes-add-template/cloud-nodes-add-template.component';
import { CloudNodesTemplateDetailsComponent } from './components/preferences/built-in/cloud-nodes/cloud-nodes-template-details/cloud-nodes-template-details.component';
-import { EthernetSwitchesTemplatesComponent } from './components/preferences/built-in/ethernet-switches/ethernet-switches-templates/ethernet-switches-templates.component';
+import { CloudNodesTemplatesComponent } from './components/preferences/built-in/cloud-nodes/cloud-nodes-templates/cloud-nodes-templates.component';
+import { EthernetHubsAddTemplateComponent } from './components/preferences/built-in/ethernet-hubs/ethernet-hubs-add-template/ethernet-hubs-add-template.component';
+import { EthernetHubsTemplateDetailsComponent } from './components/preferences/built-in/ethernet-hubs/ethernet-hubs-template-details/ethernet-hubs-template-details.component';
+import { EthernetHubsTemplatesComponent } from './components/preferences/built-in/ethernet-hubs/ethernet-hubs-templates/ethernet-hubs-templates.component';
import { EthernetSwitchesAddTemplateComponent } from './components/preferences/built-in/ethernet-switches/ethernet-switches-add-template/ethernet-switches-add-template.component';
import { EthernetSwitchesTemplateDetailsComponent } from './components/preferences/built-in/ethernet-switches/ethernet-switches-template-details/ethernet-switches-template-details.component';
-import { DynamipsPreferencesComponent } from './components/preferences/dynamips/dynamips-preferences/dynamips-preferences.component';
-import { IosTemplatesComponent } from './components/preferences/dynamips/ios-templates/ios-templates.component';
-import { InstalledSoftwareComponent } from './components/installed-software/installed-software.component';
-import { IosTemplateDetailsComponent } from './components/preferences/dynamips/ios-template-details/ios-template-details.component';
-import { AddIosTemplateComponent } from './components/preferences/dynamips/add-ios-template/add-ios-template.component';
-import { VmwarePreferencesComponent } from './components/preferences/vmware/vmware-preferences/vmware-preferences.component';
-import { VmwareTemplatesComponent } from './components/preferences/vmware/vmware-templates/vmware-templates.component';
-import { VmwareTemplateDetailsComponent } from './components/preferences/vmware/vmware-template-details/vmware-template-details.component';
-import { AddVmwareTemplateComponent } from './components/preferences/vmware/add-vmware-template/add-vmware-template.component';
-import { DockerTemplatesComponent } from './components/preferences/docker/docker-templates/docker-templates.component';
+import { EthernetSwitchesTemplatesComponent } from './components/preferences/built-in/ethernet-switches/ethernet-switches-templates/ethernet-switches-templates.component';
import { AddDockerTemplateComponent } from './components/preferences/docker/add-docker-template/add-docker-template.component';
-import { DockerTemplateDetailsComponent } from './components/preferences/docker/docker-template-details/docker-template-details.component';
-import { IouTemplatesComponent } from './components/preferences/ios-on-unix/iou-templates/iou-templates.component';
-import { AddIouTemplateComponent } from './components/preferences/ios-on-unix/add-iou-template/add-iou-template.component';
-import { IouTemplateDetailsComponent } from './components/preferences/ios-on-unix/iou-template-details/iou-template-details.component';
-import { CopyQemuVmTemplateComponent } from './components/preferences/qemu/copy-qemu-vm-template/copy-qemu-vm-template.component';
-import { CopyIosTemplateComponent } from './components/preferences/dynamips/copy-ios-template/copy-ios-template.component';
import { CopyDockerTemplateComponent } from './components/preferences/docker/copy-docker-template/copy-docker-template.component';
-import { CopyIouTemplateComponent } from './components/preferences/ios-on-unix/copy-iou-template/copy-iou-template.component';
-import { ListOfSnapshotsComponent } from './components/snapshots/list-of-snapshots/list-of-snapshots.component';
-import { ConsoleComponent } from './components/settings/console/console.component';
-import { HelpComponent } from './components/help/help.component';
-import { TracengPreferencesComponent } from './components/preferences/traceng/traceng-preferences/traceng-preferences.component';
-import { TracengTemplatesComponent } from './components/preferences/traceng/traceng-templates/traceng-templates.component';
-import { AddTracengTemplateComponent } from './components/preferences/traceng/add-traceng/add-traceng-template.component';
-import { TracengTemplateDetailsComponent } from './components/preferences/traceng/traceng-template-details/traceng-template-details.component';
-import { PageNotFoundComponent } from './components/page-not-found/page-not-found.component';
+import { DockerTemplateDetailsComponent } from './components/preferences/docker/docker-template-details/docker-template-details.component';
+import { DockerTemplatesComponent } from './components/preferences/docker/docker-templates/docker-templates.component';
+import { AddIosTemplateComponent } from './components/preferences/dynamips/add-ios-template/add-ios-template.component';
+import { CopyIosTemplateComponent } from './components/preferences/dynamips/copy-ios-template/copy-ios-template.component';
+import { IosTemplateDetailsComponent } from './components/preferences/dynamips/ios-template-details/ios-template-details.component';
+import { IosTemplatesComponent } from './components/preferences/dynamips/ios-templates/ios-templates.component';
import { Gns3vmComponent } from './components/preferences/gns3vm/gns3vm.component';
-import { DirectLinkComponent } from './components/direct-link/direct-link.component';
+import { AddIouTemplateComponent } from './components/preferences/ios-on-unix/add-iou-template/add-iou-template.component';
+import { CopyIouTemplateComponent } from './components/preferences/ios-on-unix/copy-iou-template/copy-iou-template.component';
+import { IouTemplateDetailsComponent } from './components/preferences/ios-on-unix/iou-template-details/iou-template-details.component';
+import { IouTemplatesComponent } from './components/preferences/ios-on-unix/iou-templates/iou-templates.component';
+import { PreferencesComponent } from './components/preferences/preferences.component';
+import { AddQemuVmTemplateComponent } from './components/preferences/qemu/add-qemu-vm-template/add-qemu-vm-template.component';
+import { CopyQemuVmTemplateComponent } from './components/preferences/qemu/copy-qemu-vm-template/copy-qemu-vm-template.component';
+import { QemuVmTemplateDetailsComponent } from './components/preferences/qemu/qemu-vm-template-details/qemu-vm-template-details.component';
+import { QemuVmTemplatesComponent } from './components/preferences/qemu/qemu-vm-templates/qemu-vm-templates.component';
+import { AddVirtualBoxTemplateComponent } from './components/preferences/virtual-box/add-virtual-box-template/add-virtual-box-template.component';
+import { VirtualBoxTemplateDetailsComponent } from './components/preferences/virtual-box/virtual-box-template-details/virtual-box-template-details.component';
+import { VirtualBoxTemplatesComponent } from './components/preferences/virtual-box/virtual-box-templates/virtual-box-templates.component';
+import { AddVmwareTemplateComponent } from './components/preferences/vmware/add-vmware-template/add-vmware-template.component';
+import { VmwareTemplateDetailsComponent } from './components/preferences/vmware/vmware-template-details/vmware-template-details.component';
+import { VmwareTemplatesComponent } from './components/preferences/vmware/vmware-templates/vmware-templates.component';
+import { AddVpcsTemplateComponent } from './components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component';
+import { VpcsTemplateDetailsComponent } from './components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component';
+import { VpcsTemplatesComponent } from './components/preferences/vpcs/vpcs-templates/vpcs-templates.component';
+import { ProjectMapComponent } from './components/project-map/project-map.component';
+import { ProjectsComponent } from './components/projects/projects.component';
+import { ServersComponent } from './components/servers/servers.component';
+import { ConsoleComponent } from './components/settings/console/console.component';
+import { SettingsComponent } from './components/settings/settings.component';
+import { ListOfSnapshotsComponent } from './components/snapshots/list-of-snapshots/list-of-snapshots.component';
import { SystemStatusComponent } from './components/system-status/system-status.component';
-import { ServerResolve } from './resolvers/server-resolve';
import { WebConsoleFullWindowComponent } from './components/web-console-full-window/web-console-full-window.component';
import { ConsoleGuard } from './guards/console-guard';
+import { DefaultLayoutComponent } from './layouts/default-layout/default-layout.component';
+import { ServerResolve } from './resolvers/server-resolve';
const routes: Routes = [
{
@@ -73,65 +63,99 @@ const routes: Routes = [
{ path: '', redirectTo: 'servers', pathMatch: 'full' },
{ path: 'servers', component: ServersComponent },
{ path: 'bundled', component: BundledServerFinderComponent },
- {
- path: 'server/:server_id/projects',
+ {
+ path: 'server/:server_id/projects',
component: ProjectsComponent,
- resolve: { server : ServerResolve }
+ resolve: { server: ServerResolve },
},
{ path: 'help', component: HelpComponent },
+ { path: 'help/reportissue', component: ReportIssueComponent },
{ path: 'settings', component: SettingsComponent },
{ path: 'settings/console', component: ConsoleComponent },
{ path: 'installed-software', component: InstalledSoftwareComponent },
{ path: 'server/:server_id/systemstatus', component: SystemStatusComponent },
- { path: 'server/:server_ip/:server_port/project/:project_id', component: DirectLinkComponent},
- {
- path: 'server/:server_id/project/:project_id/snapshots',
+ { path: 'server/:server_ip/:server_port/project/:project_id', component: DirectLinkComponent },
+ {
+ path: 'server/:server_id/project/:project_id/snapshots',
component: ListOfSnapshotsComponent,
- resolve: { server : ServerResolve }
+ resolve: { server: ServerResolve },
},
{ path: 'server/:server_id/preferences', component: PreferencesComponent },
{ path: 'server/:server_id/preferences/gns3vm', component: Gns3vmComponent },
// { path: 'server/:server_id/preferences/general', component: GeneralPreferencesComponent },
- { path: 'server/:server_id/preferences/builtin', component: BuiltInPreferencesComponent},
+ { path: 'server/:server_id/preferences/builtin', component: BuiltInPreferencesComponent },
{ path: 'server/:server_id/preferences/builtin/ethernet-hubs', component: EthernetHubsTemplatesComponent },
- { path: 'server/:server_id/preferences/builtin/ethernet-hubs/addtemplate', component: EthernetHubsAddTemplateComponent },
- { path: 'server/:server_id/preferences/builtin/ethernet-hubs/:template_id', component: EthernetHubsTemplateDetailsComponent },
+ {
+ path: 'server/:server_id/preferences/builtin/ethernet-hubs/addtemplate',
+ component: EthernetHubsAddTemplateComponent,
+ },
+ {
+ path: 'server/:server_id/preferences/builtin/ethernet-hubs/:template_id',
+ component: EthernetHubsTemplateDetailsComponent,
+ },
- { path: 'server/:server_id/preferences/builtin/ethernet-switches', component: EthernetSwitchesTemplatesComponent },
- { path: 'server/:server_id/preferences/builtin/ethernet-switches/addtemplate', component: EthernetSwitchesAddTemplateComponent },
- { path: 'server/:server_id/preferences/builtin/ethernet-switches/:template_id', component: EthernetSwitchesTemplateDetailsComponent },
+ {
+ path: 'server/:server_id/preferences/builtin/ethernet-switches',
+ component: EthernetSwitchesTemplatesComponent,
+ },
+ {
+ path: 'server/:server_id/preferences/builtin/ethernet-switches/addtemplate',
+ component: EthernetSwitchesAddTemplateComponent,
+ },
+ {
+ path: 'server/:server_id/preferences/builtin/ethernet-switches/:template_id',
+ component: EthernetSwitchesTemplateDetailsComponent,
+ },
{ path: 'server/:server_id/preferences/builtin/cloud-nodes', component: CloudNodesTemplatesComponent },
- { path: 'server/:server_id/preferences/builtin/cloud-nodes/addtemplate', component: CloudNodesAddTemplateComponent },
- { path: 'server/:server_id/preferences/builtin/cloud-nodes/:template_id', component: CloudNodesTemplateDetailsComponent },
+ {
+ path: 'server/:server_id/preferences/builtin/cloud-nodes/addtemplate',
+ component: CloudNodesAddTemplateComponent,
+ },
+ {
+ path: 'server/:server_id/preferences/builtin/cloud-nodes/:template_id',
+ component: CloudNodesTemplateDetailsComponent,
+ },
//{ path: 'server/:server_id/preferences/dynamips', component: DynamipsPreferencesComponent },
{ path: 'server/:server_id/preferences/dynamips/templates', component: IosTemplatesComponent },
{ path: 'server/:server_id/preferences/dynamips/templates/addtemplate', component: AddIosTemplateComponent },
{ path: 'server/:server_id/preferences/dynamips/templates/:template_id', component: IosTemplateDetailsComponent },
- { path: 'server/:server_id/preferences/dynamips/templates/:template_id/copy', component: CopyIosTemplateComponent },
+ {
+ path: 'server/:server_id/preferences/dynamips/templates/:template_id/copy',
+ component: CopyIosTemplateComponent,
+ },
// { path: 'server/:server_id/preferences/qemu', component: QemuPreferencesComponent },
{ path: 'server/:server_id/preferences/qemu/templates', component: QemuVmTemplatesComponent },
- { path: 'server/:server_id/preferences/qemu/templates/:template_id/copy', component: CopyQemuVmTemplateComponent },
+ {
+ path: 'server/:server_id/preferences/qemu/templates/:template_id/copy',
+ component: CopyQemuVmTemplateComponent,
+ },
{ path: 'server/:server_id/preferences/qemu/templates/:template_id', component: QemuVmTemplateDetailsComponent },
{ path: 'server/:server_id/preferences/qemu/addtemplate', component: AddQemuVmTemplateComponent },
// { path: 'server/:server_id/preferences/vpcs', component: VpcsPreferencesComponent },
{ path: 'server/:server_id/preferences/vpcs/templates', component: VpcsTemplatesComponent },
- { path: 'server/:server_id/preferences/vpcs/templates/:template_id', component: VpcsTemplateDetailsComponent},
+ { path: 'server/:server_id/preferences/vpcs/templates/:template_id', component: VpcsTemplateDetailsComponent },
{ path: 'server/:server_id/preferences/vpcs/addtemplate', component: AddVpcsTemplateComponent },
// { path: 'server/:server_id/preferences/virtualbox', component: VirtualBoxPreferencesComponent },
{ path: 'server/:server_id/preferences/virtualbox/templates', component: VirtualBoxTemplatesComponent },
- { path: 'server/:server_id/preferences/virtualbox/templates/:template_id', component: VirtualBoxTemplateDetailsComponent },
+ {
+ path: 'server/:server_id/preferences/virtualbox/templates/:template_id',
+ component: VirtualBoxTemplateDetailsComponent,
+ },
{ path: 'server/:server_id/preferences/virtualbox/addtemplate', component: AddVirtualBoxTemplateComponent },
// { path: 'server/:server_id/preferences/vmware', component: VmwarePreferencesComponent },
{ path: 'server/:server_id/preferences/vmware/templates', component: VmwareTemplatesComponent },
- { path: 'server/:server_id/preferences/vmware/templates/:template_id', component: VmwareTemplateDetailsComponent },
+ {
+ path: 'server/:server_id/preferences/vmware/templates/:template_id',
+ component: VmwareTemplateDetailsComponent,
+ },
{ path: 'server/:server_id/preferences/vmware/addtemplate', component: AddVmwareTemplateComponent },
// { path: 'server/:server_id/preferences/traceng', component: TracengPreferencesComponent },
@@ -140,37 +164,49 @@ const routes: Routes = [
// { path: 'server/:server_id/preferences/traceng/addtemplate', component: AddTracengTemplateComponent },
{ path: 'server/:server_id/preferences/docker/templates', component: DockerTemplatesComponent },
- { path: 'server/:server_id/preferences/docker/templates/:template_id', component: DockerTemplateDetailsComponent },
- { path: 'server/:server_id/preferences/docker/templates/:template_id/copy', component: CopyDockerTemplateComponent },
+ {
+ path: 'server/:server_id/preferences/docker/templates/:template_id',
+ component: DockerTemplateDetailsComponent,
+ },
+ {
+ path: 'server/:server_id/preferences/docker/templates/:template_id/copy',
+ component: CopyDockerTemplateComponent,
+ },
{ path: 'server/:server_id/preferences/docker/addtemplate', component: AddDockerTemplateComponent },
{ path: 'server/:server_id/preferences/iou/templates', component: IouTemplatesComponent },
{ path: 'server/:server_id/preferences/iou/templates/:template_id', component: IouTemplateDetailsComponent },
{ path: 'server/:server_id/preferences/iou/templates/:template_id/copy', component: CopyIouTemplateComponent },
- { path: 'server/:server_id/preferences/iou/addtemplate', component: AddIouTemplateComponent }
- ]
+ { path: 'server/:server_id/preferences/iou/addtemplate', component: AddIouTemplateComponent },
+ ],
},
- {
- path: 'server/:server_id/project/:project_id',
+ {
+ path: 'server/:server_id/project/:project_id',
component: ProjectMapComponent,
- canDeactivate: [ConsoleGuard]
+ canDeactivate: [ConsoleGuard],
},
- {
- path: 'server/:server_id/project/:project_id/nodes/:node_id',
- component: WebConsoleFullWindowComponent
+ {
+ path: 'server/:server_id/project/:project_id/nodes/:node_id',
+ component: WebConsoleFullWindowComponent,
},
- {
- path: 'static/web-ui/server/:server_id/project/:project_id/nodes/:node_id',
- component: WebConsoleFullWindowComponent
+ {
+ path: 'static/web-ui/server/:server_id/project/:project_id/nodes/:node_id',
+ component: WebConsoleFullWindowComponent,
},
{
path: '**',
- component: PageNotFoundComponent
- }
+ component: PageNotFoundComponent,
+ },
];
@NgModule({
- imports: [RouterModule.forRoot(routes, { anchorScrolling: 'enabled', enableTracing: false, scrollPositionRestoration: 'enabled'})],
- exports: [RouterModule]
+ imports: [
+ RouterModule.forRoot(routes, {
+ anchorScrolling: 'enabled',
+ enableTracing: false,
+ scrollPositionRestoration: 'enabled',
+ }),
+ ],
+ exports: [RouterModule],
})
export class AppRoutingModule {}
diff --git a/src/app/app.component.html b/src/app/app.component.html
index cc3b2bf2..db17fd83 100644
--- a/src/app/app.component.html
+++ b/src/app/app.component.html
@@ -1,2 +1,4 @@
-
-
+
diff --git a/src/app/app.component.scss b/src/app/app.component.scss
index 1bc4310f..193c4c31 100644
--- a/src/app/app.component.scss
+++ b/src/app/app.component.scss
@@ -1,3 +1,11 @@
mat-menu-panel {
- min-height: 0px;
+ min-height: 0px;
+}
+
+.dark {
+ background: #263238 !important;
+}
+
+.light {
+ background: white !important;
}
diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts
index 1eb4a588..388f4ac6 100644
--- a/src/app/app.component.spec.ts
+++ b/src/app/app.component.spec.ts
@@ -1,14 +1,14 @@
-import { TestBed, async, ComponentFixture } from '@angular/core/testing';
-import { RouterTestingModule } from '@angular/router/testing';
-
-import { AppComponent } from './app.component';
+import { NO_ERRORS_SCHEMA } from '@angular/core';
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MatIconModule } from '@angular/material/icon';
-import { SettingsService } from './services/settings.service';
+import { RouterTestingModule } from '@angular/router/testing';
import { PersistenceService } from 'angular-persistence';
import { ElectronService, NgxElectronModule } from 'ngx-electron';
-import createSpyObj = jasmine.createSpyObj;
-import { NO_ERRORS_SCHEMA } from '@angular/core';
+import { AppComponent } from './app.component';
import { ProgressService } from './common/progress/progress.service';
+import { SettingsService } from './services/settings.service';
+
+import createSpyObj = jasmine.createSpyObj;
// import 'jasmine';
describe('AppComponent', () => {
@@ -22,7 +22,7 @@ describe('AppComponent', () => {
declarations: [AppComponent],
imports: [RouterTestingModule, MatIconModule, NgxElectronModule],
providers: [SettingsService, PersistenceService, ProgressService],
- schemas: [NO_ERRORS_SCHEMA]
+ schemas: [NO_ERRORS_SCHEMA],
}).compileComponents();
electronService = TestBed.get(ElectronService);
diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 401e4efa..e9e5233a 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -1,19 +1,23 @@
-import { Component, OnInit } from '@angular/core';
+import { OverlayContainer } from '@angular/cdk/overlay';
+import { Component, HostBinding, OnInit } from '@angular/core';
import { MatIconRegistry } from '@angular/material/icon';
import { DomSanitizer } from '@angular/platform-browser';
+import { NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Router } from '@angular/router';
import { ElectronService } from 'ngx-electron';
+import { ProgressService } from './common/progress/progress.service';
import { SettingsService } from './services/settings.service';
import { ThemeService } from './services/theme.service';
-import { Router, NavigationStart, NavigationEnd, NavigationCancel, NavigationError } from '@angular/router';
-import { ProgressService } from './common/progress/progress.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
- styleUrls: ['./app.component.scss']
+ styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit {
+ public darkThemeEnabled: boolean = false;
+
constructor(
+ private overlayContainer: OverlayContainer,
iconReg: MatIconRegistry,
sanitizer: DomSanitizer,
private settingsService: SettingsService,
@@ -30,28 +34,39 @@ export class AppComponent implements OnInit {
});
}
+ @HostBinding('class') componentCssClass;
+
ngOnInit(): void {
if (this.electronService.isElectronApp) {
- this.settingsService.subscribe(settings => {
+ this.settingsService.subscribe((settings) => {
this.electronService.ipcRenderer.send('settings.changed', settings);
});
}
- let theme = localStorage.getItem('theme');
- if (theme === 'light') {
- this.themeService.setDarkMode(false);
- } else {
- this.themeService.setDarkMode(true);
- }
+
+ this.applyTheme(this.themeService.savedTheme + '-theme');
+ this.themeService.themeChanged.subscribe((event: string) => {
+ this.applyTheme(event);
+ });
}
- checkEvent(routerEvent) : void {
+ applyTheme(theme: string) {
+ if (theme === 'dark-theme') {
+ this.darkThemeEnabled = true;
+ } else {
+ this.darkThemeEnabled = false;
+ }
+ this.overlayContainer.getContainerElement().classList.add(theme);
+ this.componentCssClass = theme;
+ }
+
+ checkEvent(routerEvent): void {
if (routerEvent instanceof NavigationStart) {
this.progressService.activate();
- }
-
- else if (routerEvent instanceof NavigationEnd ||
- routerEvent instanceof NavigationCancel ||
- routerEvent instanceof NavigationError) {
+ } else if (
+ routerEvent instanceof NavigationEnd ||
+ routerEvent instanceof NavigationCancel ||
+ routerEvent instanceof NavigationError
+ ) {
this.progressService.deactivate();
}
}
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 5379db9c..774358cc 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -1,291 +1,280 @@
-import { BrowserModule, Title } from '@angular/platform-browser';
-import { NgModule, ErrorHandler } from '@angular/core';
-import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { AngularReactBrowserModule } from '@angular-react/core';
+import { DragDropModule } from '@angular/cdk/drag-drop';
+import { OverlayModule } from '@angular/cdk/overlay';
import { CdkTableModule } from '@angular/cdk/table';
import { HttpClientModule } from '@angular/common/http';
-
+import { ErrorHandler, NgModule } from '@angular/core';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { MatSidenavModule } from '@angular/material/sidenav';
+import { BrowserModule, Title } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
-
-import { D3Service } from 'd3-ng2-service';
+import { DragAndDropModule } from 'angular-draggable-droppable';
import { PersistenceModule } from 'angular-persistence';
-import { NgxElectronModule } from 'ngx-electron';
+import { ResizableModule } from 'angular-resizable-element';
+import { D3Service } from 'd3-ng2-service';
+import { NgCircleProgressModule } from 'ng-circle-progress';
import { FileUploadModule } from 'ng2-file-upload';
+import { NgxChildProcessModule } from 'ngx-childprocess';
+import { NgxElectronModule } from 'ngx-electron';
import { AppRoutingModule } from './app-routing.module';
-
-import { VersionService } from './services/version.service';
-import { ProjectService } from './services/project.service';
-import { SymbolService } from './services/symbol.service';
-import { ServerService } from './services/server.service';
-import { IndexedDbService } from './services/indexed-db.service';
-import { HttpServer, ServerErrorHandler } from './services/http-server.service';
-import { SnapshotService } from './services/snapshot.service';
-import { ProgressDialogService } from './common/progress-dialog/progress-dialog.service';
-import { NodeService } from './services/node.service';
-import { TemplateService } from './services/template.service';
-import { LinkService } from './services/link.service';
-
-import { ProjectsComponent } from './components/projects/projects.component';
-import { AddBlankProjectDialogComponent } from './components/projects/add-blank-project-dialog/add-blank-project-dialog.component';
-import { ImportProjectDialogComponent } from './components/projects/import-project-dialog/import-project-dialog.component';
-import { ConfirmationDialogComponent } from './components/projects/confirmation-dialog/confirmation-dialog.component';
-import { DefaultLayoutComponent } from './layouts/default-layout/default-layout.component';
-import { ProgressDialogComponent } from './common/progress-dialog/progress-dialog.component';
import { AppComponent } from './app.component';
-
-import { ProjectMapComponent } from './components/project-map/project-map.component';
-import { ServersComponent } from './components/servers/servers.component';
-import { AddServerDialogComponent } from './components/servers/add-server-dialog/add-server-dialog.component';
-import { ContextMenuComponent } from './components/project-map/context-menu/context-menu.component';
-import { ContextConsoleMenuComponent } from './components/project-map/context-console-menu/context-console-menu.component';
-import { StartNodeActionComponent } from './components/project-map/context-menu/actions/start-node-action/start-node-action.component';
-import { StopNodeActionComponent } from './components/project-map/context-menu/actions/stop-node-action/stop-node-action.component';
-import { TemplateComponent } from './components/template/template.component';
-import { TemplateListDialogComponent } from './components/template/template-list-dialog/template-list-dialog.component';
import { CartographyModule } from './cartography/cartography.module';
-import { ToasterService } from './services/toaster.service';
-import { ProjectWebServiceHandler } from './handlers/project-web-service-handler';
+import { DrawingsDataSource } from './cartography/datasources/drawings-datasource';
import { LinksDataSource } from './cartography/datasources/links-datasource';
import { NodesDataSource } from './cartography/datasources/nodes-datasource';
import { SymbolsDataSource } from './cartography/datasources/symbols-datasource';
-import { SelectionManager } from './cartography/managers/selection-manager';
import { InRectangleHelper } from './cartography/helpers/in-rectangle-helper';
-import { DrawingsDataSource } from './cartography/datasources/drawings-datasource';
-import { EditStyleActionComponent } from './components/project-map/context-menu/actions/edit-style-action/edit-style-action.component';
-import { MoveLayerDownActionComponent } from './components/project-map/context-menu/actions/move-layer-down-action/move-layer-down-action.component';
-import { MoveLayerUpActionComponent } from './components/project-map/context-menu/actions/move-layer-up-action/move-layer-up-action.component';
-import { SettingsComponent } from './components/settings/settings.component';
-import { SettingsService } from './services/settings.service';
-
-import { BundledServerFinderComponent } from './components/bundled-server-finder/bundled-server-finder.component';
+import { SelectionManager } from './cartography/managers/selection-manager';
+import { ToasterErrorHandler } from './common/error-handlers/toaster-error-handler';
+import { ProgressDialogComponent } from './common/progress-dialog/progress-dialog.component';
+import { ProgressDialogService } from './common/progress-dialog/progress-dialog.service';
import { ProgressComponent } from './common/progress/progress.component';
import { ProgressService } from './common/progress/progress.service';
-import { version } from './version';
-import { ToasterErrorHandler } from './common/error-handlers/toaster-error-handler';
-import { environment } from '../environments/environment';
-import { ServerDiscoveryComponent } from './components/servers/server-discovery/server-discovery.component';
-import { ServerDatabase } from './services/server.database';
-import { CreateSnapshotDialogComponent } from './components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component';
-import { SnapshotMenuItemComponent } from './components/snapshots/snapshot-menu-item/snapshot-menu-item.component';
-import { MATERIAL_IMPORTS } from './material.imports';
-import { DrawingService } from './services/drawing.service';
-import { ProjectNameValidator } from './components/projects/models/projectNameValidator';
-import { MatSidenavModule } from '@angular/material/sidenav';
-import { NodeSelectInterfaceComponent } from './components/project-map/node-select-interface/node-select-interface.component';
-import { DrawLinkToolComponent } from './components/project-map/draw-link-tool/draw-link-tool.component';
-
-import { InstalledSoftwareComponent } from './components/installed-software/installed-software.component';
+import { AdbutlerComponent } from './components/adbutler/adbutler.component';
+import { BundledServerFinderComponent } from './components/bundled-server-finder/bundled-server-finder.component';
+import { InformationDialogComponent } from './components/dialogs/information-dialog.component';
+import { DirectLinkComponent } from './components/direct-link/direct-link.component';
+import { DrawingAddedComponent } from './components/drawings-listeners/drawing-added/drawing-added.component';
+import { DrawingDraggedComponent } from './components/drawings-listeners/drawing-dragged/drawing-dragged.component';
import { DrawingResizedComponent } from './components/drawings-listeners/drawing-resized/drawing-resized.component';
-import { TextEditedComponent } from './components/drawings-listeners/text-edited/text-edited.component';
+import { InterfaceLabelDraggedComponent } from './components/drawings-listeners/interface-label-dragged/interface-label-dragged.component';
+import { LinkCreatedComponent } from './components/drawings-listeners/link-created/link-created.component';
import { NodeDraggedComponent } from './components/drawings-listeners/node-dragged/node-dragged.component';
import { NodeLabelDraggedComponent } from './components/drawings-listeners/node-label-dragged/node-label-dragged.component';
-import { DrawingDraggedComponent } from './components/drawings-listeners/drawing-dragged/drawing-dragged.component';
-import { LinkCreatedComponent } from './components/drawings-listeners/link-created/link-created.component';
-import { InterfaceLabelDraggedComponent } from './components/drawings-listeners/interface-label-dragged/interface-label-dragged.component';
-import { ToolsService } from './services/tools.service';
import { TextAddedComponent } from './components/drawings-listeners/text-added/text-added.component';
-import { DrawingAddedComponent } from './components/drawings-listeners/drawing-added/drawing-added.component';
+import { TextEditedComponent } from './components/drawings-listeners/text-edited/text-edited.component';
+import { HelpComponent } from './components/help/help.component';
+import { ReportIssueComponent } from './components/help/report-issue/report-issue.component';
import { InstallSoftwareComponent } from './components/installed-software/install-software/install-software.component';
-
-import { StyleEditorDialogComponent } from './components/project-map/drawings-editors/style-editor/style-editor.component';
-import { EditTextActionComponent } from './components/project-map/context-menu/actions/edit-text-action/edit-text-action.component';
-import { TextEditorDialogComponent } from './components/project-map/drawings-editors/text-editor/text-editor.component';
-import { PreferencesComponent } from './components/preferences/preferences.component';
-import { QemuPreferencesComponent } from './components/preferences/qemu/qemu-preferences/qemu-preferences.component';
-import { ServerSettingsService } from './services/server-settings.service';
-import { QemuVmTemplatesComponent } from './components/preferences/qemu/qemu-vm-templates/qemu-vm-templates.component';
-import { AddQemuVmTemplateComponent } from './components/preferences/qemu/add-qemu-vm-template/add-qemu-vm-template.component';
-import { QemuVmTemplateDetailsComponent } from './components/preferences/qemu/qemu-vm-template-details/qemu-vm-template-details.component';
-import { QemuService } from './services/qemu.service';
-import { GeneralPreferencesComponent } from './components/preferences/general/general-preferences.component';
-import { VpcsPreferencesComponent } from './components/preferences/vpcs/vpcs-preferences/vpcs-preferences.component';
-import { VpcsTemplatesComponent } from './components/preferences/vpcs/vpcs-templates/vpcs-templates.component';
-import { VpcsService } from './services/vpcs.service';
-import { AddVpcsTemplateComponent } from './components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component';
-import { VpcsTemplateDetailsComponent } from './components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component';
-import { TemplateMocksService } from './services/template-mocks.service';
-import { VirtualBoxPreferencesComponent } from './components/preferences/virtual-box/virtual-box-preferences/virtual-box-preferences.component';
-import { VirtualBoxTemplatesComponent } from './components/preferences/virtual-box/virtual-box-templates/virtual-box-templates.component';
-import { VirtualBoxService } from './services/virtual-box.service';
-import { VirtualBoxTemplateDetailsComponent } from './components/preferences/virtual-box/virtual-box-template-details/virtual-box-template-details.component';
-import { AddVirtualBoxTemplateComponent } from './components/preferences/virtual-box/add-virtual-box-template/add-virtual-box-template.component';
+import { InstalledSoftwareComponent } from './components/installed-software/installed-software.component';
+import { PageNotFoundComponent } from './components/page-not-found/page-not-found.component';
import { BuiltInPreferencesComponent } from './components/preferences/built-in/built-in-preferences.component';
-import { EthernetHubsTemplatesComponent } from './components/preferences/built-in/ethernet-hubs/ethernet-hubs-templates/ethernet-hubs-templates.component';
-import { BuiltInTemplatesService } from './services/built-in-templates.service';
-import { EthernetHubsAddTemplateComponent } from './components/preferences/built-in/ethernet-hubs/ethernet-hubs-add-template/ethernet-hubs-add-template.component';
-import { EthernetHubsTemplateDetailsComponent } from './components/preferences/built-in/ethernet-hubs/ethernet-hubs-template-details/ethernet-hubs-template-details.component';
-import { CloudNodesTemplatesComponent } from './components/preferences/built-in/cloud-nodes/cloud-nodes-templates/cloud-nodes-templates.component';
import { CloudNodesAddTemplateComponent } from './components/preferences/built-in/cloud-nodes/cloud-nodes-add-template/cloud-nodes-add-template.component';
import { CloudNodesTemplateDetailsComponent } from './components/preferences/built-in/cloud-nodes/cloud-nodes-template-details/cloud-nodes-template-details.component';
-import { EthernetSwitchesTemplatesComponent } from './components/preferences/built-in/ethernet-switches/ethernet-switches-templates/ethernet-switches-templates.component';
+import { CloudNodesTemplatesComponent } from './components/preferences/built-in/cloud-nodes/cloud-nodes-templates/cloud-nodes-templates.component';
+import { EthernetHubsAddTemplateComponent } from './components/preferences/built-in/ethernet-hubs/ethernet-hubs-add-template/ethernet-hubs-add-template.component';
+import { EthernetHubsTemplateDetailsComponent } from './components/preferences/built-in/ethernet-hubs/ethernet-hubs-template-details/ethernet-hubs-template-details.component';
+import { EthernetHubsTemplatesComponent } from './components/preferences/built-in/ethernet-hubs/ethernet-hubs-templates/ethernet-hubs-templates.component';
import { EthernetSwitchesAddTemplateComponent } from './components/preferences/built-in/ethernet-switches/ethernet-switches-add-template/ethernet-switches-add-template.component';
import { EthernetSwitchesTemplateDetailsComponent } from './components/preferences/built-in/ethernet-switches/ethernet-switches-template-details/ethernet-switches-template-details.component';
-import { DynamipsPreferencesComponent } from './components/preferences/dynamips/dynamips-preferences/dynamips-preferences.component';
-import { IosTemplatesComponent } from './components/preferences/dynamips/ios-templates/ios-templates.component';
-import { IosService } from './services/ios.service';
-import { SymbolsComponent } from './components/preferences/common/symbols/symbols.component';
-import { InstalledSoftwareService } from './services/installed-software.service';
-import { ExternalSoftwareDefinitionService } from './services/external-software-definition.service';
-import { PlatformService } from './services/platform.service';
-import { IosTemplateDetailsComponent } from './components/preferences/dynamips/ios-template-details/ios-template-details.component';
-import { AddIosTemplateComponent } from './components/preferences/dynamips/add-ios-template/add-ios-template.component';
-import { IosConfigurationService } from './services/ios-configuration.service';
-import { QemuConfigurationService } from './services/qemu-configuration.service';
-import { VirtualBoxConfigurationService } from './services/virtual-box-configuration.service';
-import { VpcsConfigurationService } from './services/vpcs-configuration.service';
-import { BuiltInTemplatesConfigurationService } from './services/built-in-templates-configuration.service';
-import { VmwarePreferencesComponent } from './components/preferences/vmware/vmware-preferences/vmware-preferences.component';
-import { VmwareTemplatesComponent } from './components/preferences/vmware/vmware-templates/vmware-templates.component';
-import { VmwareService } from './services/vmware.service';
-import { VmwareConfigurationService } from './services/vmware-configuration.service';
-import { VmwareTemplateDetailsComponent } from './components/preferences/vmware/vmware-template-details/vmware-template-details.component';
-import { AddVmwareTemplateComponent } from './components/preferences/vmware/add-vmware-template/add-vmware-template.component';
+import { EthernetSwitchesTemplatesComponent } from './components/preferences/built-in/ethernet-switches/ethernet-switches-templates/ethernet-switches-templates.component';
+import { CustomAdaptersTableComponent } from './components/preferences/common/custom-adapters-table/custom-adapters-table.component';
+import { CustomAdaptersComponent } from './components/preferences/common/custom-adapters/custom-adapters.component';
import { DeleteConfirmationDialogComponent } from './components/preferences/common/delete-confirmation-dialog/delete-confirmation-dialog.component';
import { DeleteTemplateComponent } from './components/preferences/common/delete-template-component/delete-template.component';
-import { DockerService } from './services/docker.service';
-import { DockerTemplatesComponent } from './components/preferences/docker/docker-templates/docker-templates.component';
-import { DockerConfigurationService } from './services/docker-configuration.service';
-import { AddDockerTemplateComponent } from './components/preferences/docker/add-docker-template/add-docker-template.component';
-import { DockerTemplateDetailsComponent } from './components/preferences/docker/docker-template-details/docker-template-details.component';
-import { IouTemplatesComponent } from './components/preferences/ios-on-unix/iou-templates/iou-templates.component';
-import { IouService } from './services/iou.service';
-import { AddIouTemplateComponent } from './components/preferences/ios-on-unix/add-iou-template/add-iou-template.component';
-import { IouConfigurationService } from './services/iou-configuration.service';
-import { IouTemplateDetailsComponent } from './components/preferences/ios-on-unix/iou-template-details/iou-template-details.component';
-import { CopyQemuVmTemplateComponent } from './components/preferences/qemu/copy-qemu-vm-template/copy-qemu-vm-template.component';
-import { CopyIosTemplateComponent } from './components/preferences/dynamips/copy-ios-template/copy-ios-template.component';
-import { CopyIouTemplateComponent } from './components/preferences/ios-on-unix/copy-iou-template/copy-iou-template.component';
-import { CopyDockerTemplateComponent } from './components/preferences/docker/copy-docker-template/copy-docker-template.component';
import { EmptyTemplatesListComponent } from './components/preferences/common/empty-templates-list/empty-templates-list.component';
-import { SymbolsMenuComponent } from './components/preferences/common/symbols-menu/symbols-menu.component';
-import { SearchFilter } from './filters/searchFilter.pipe';
-import { RecentlyOpenedProjectService } from './services/recentlyOpenedProject.service';
-import { ServerManagementService } from './services/server-management.service';
-import { DeleteActionComponent } from './components/project-map/context-menu/actions/delete-action/delete-action.component';
-import { ListOfSnapshotsComponent } from './components/snapshots/list-of-snapshots/list-of-snapshots.component';
-import { DateFilter } from './filters/dateFilter.pipe';
-import { NameFilter } from './filters/nameFilter.pipe';
-import { CustomAdaptersComponent } from './components/preferences/common/custom-adapters/custom-adapters.component';
-
-import { ConsoleDeviceActionComponent } from './components/project-map/context-menu/actions/console-device-action/console-device-action.component';
-import { ConsoleComponent } from './components/settings/console/console.component';
-import { NodesMenuComponent } from './components/project-map/nodes-menu/nodes-menu.component';
-import { PacketFiltersActionComponent } from './components/project-map/context-menu/actions/packet-filters-action/packet-filters-action.component';
-import { PacketFiltersDialogComponent } from './components/project-map/packet-capturing/packet-filters/packet-filters.component';
-import { HelpDialogComponent } from './components/project-map/help-dialog/help-dialog.component';
-import { StartCaptureActionComponent } from './components/project-map/context-menu/actions/start-capture/start-capture-action.component';
-import { StartCaptureDialogComponent } from './components/project-map/packet-capturing/start-capture/start-capture.component';
-import { SuspendLinkActionComponent } from './components/project-map/context-menu/actions/suspend-link/suspend-link-action.component';
-import { ResumeLinkActionComponent } from './components/project-map/context-menu/actions/resume-link-action/resume-link-action.component';
-import { StopCaptureActionComponent } from './components/project-map/context-menu/actions/stop-capture/stop-capture-action.component';
-import { MapScaleService } from './services/mapScale.service';
-import { AdbutlerComponent } from './components/adbutler/adbutler.component';
-import { ConsoleService } from './services/settings/console.service';
-import { DefaultConsoleService } from './services/settings/default-console.service';
-import { NodeCreatedLabelStylesFixer } from './components/project-map/helpers/node-created-label-styles-fixer';
-import { NotificationBoxComponent } from './components/notification-box/notification-box.component';
-import { NonNegativeValidator } from './validators/non-negative-validator';
-import { RotationValidator } from './validators/rotation-validator';
-import { DuplicateActionComponent } from './components/project-map/context-menu/actions/duplicate-action/duplicate-action.component';
-import { MapSettingsService } from './services/mapsettings.service';
-import { ProjectMapMenuComponent } from './components/project-map/project-map-menu/project-map-menu.component';
-import { HelpComponent } from './components/help/help.component';
-import { ConfigEditorDialogComponent } from './components/project-map/node-editors/config-editor/config-editor.component';
-import { EditConfigActionComponent } from './components/project-map/context-menu/actions/edit-config/edit-config-action.component';
-import { LogConsoleComponent } from './components/project-map/log-console/log-console.component';
-import { LogEventsDataSource } from './components/project-map/log-console/log-events-datasource';
-import { SaveProjectDialogComponent } from './components/projects/save-project-dialog/save-project-dialog.component';
-import { TopologySummaryComponent } from './components/topology-summary/topology-summary.component';
-import { ShowNodeActionComponent } from './components/project-map/context-menu/actions/show-node-action/show-node-action.component';
-import { InfoDialogComponent } from './components/project-map/info-dialog/info-dialog.component';
-import { InfoService } from './services/info.service';
-import { BringToFrontActionComponent } from './components/project-map/context-menu/actions/bring-to-front-action/bring-to-front-action.component';
-import { ExportConfigActionComponent } from './components/project-map/context-menu/actions/export-config/export-config-action.component';
-import { ImportConfigActionComponent } from './components/project-map/context-menu/actions/import-config/import-config-action.component';
-import { ConsoleDeviceActionBrowserComponent } from './components/project-map/context-menu/actions/console-device-action-browser/console-device-action-browser.component';
-import { ChangeSymbolDialogComponent } from './components/project-map/change-symbol-dialog/change-symbol-dialog.component';
-import { ChangeSymbolActionComponent } from './components/project-map/context-menu/actions/change-symbol/change-symbol-action.component';
-import { EditProjectDialogComponent } from './components/projects/edit-project-dialog/edit-project-dialog.component';
-import { ProjectsFilter } from './filters/projectsFilter.pipe';
-import { ComputeService } from './services/compute.service';
-import { ReloadNodeActionComponent } from './components/project-map/context-menu/actions/reload-node-action/reload-node-action.component';
-import { SuspendNodeActionComponent } from './components/project-map/context-menu/actions/suspend-node-action/suspend-node-action.component';
-import { ConfigActionComponent } from './components/project-map/context-menu/actions/config-action/config-action.component';
-import { ConfiguratorDialogVpcsComponent } from './components/project-map/node-editors/configurator/vpcs/configurator-vpcs.component';
-import { ConfiguratorDialogEthernetHubComponent } from './components/project-map/node-editors/configurator/ethernet_hub/configurator-ethernet-hub.component';
-import { ConfiguratorDialogEthernetSwitchComponent } from './components/project-map/node-editors/configurator/ethernet-switch/configurator-ethernet-switch.component';
import { PortsComponent } from './components/preferences/common/ports/ports.component';
-import { ConfiguratorDialogSwitchComponent } from './components/project-map/node-editors/configurator/switch/configurator-switch.component';
-import { ConfiguratorDialogVirtualBoxComponent } from './components/project-map/node-editors/configurator/virtualbox/configurator-virtualbox.component';
-import { CustomAdaptersTableComponent } from './components/preferences/common/custom-adapters-table/custom-adapters-table.component';
-import { ConfiguratorDialogQemuComponent } from './components/project-map/node-editors/configurator/qemu/configurator-qemu.component';
-import { ConfiguratorDialogCloudComponent } from './components/project-map/node-editors/configurator/cloud/configurator-cloud.component';
+import { SymbolsMenuComponent } from './components/preferences/common/symbols-menu/symbols-menu.component';
+import { SymbolsComponent } from './components/preferences/common/symbols/symbols.component';
import { UdpTunnelsComponent } from './components/preferences/common/udp-tunnels/udp-tunnels.component';
-import { ConfiguratorDialogAtmSwitchComponent } from './components/project-map/node-editors/configurator/atm_switch/configurator-atm-switch.component';
-import { ConfiguratorDialogVmwareComponent } from './components/project-map/node-editors/configurator/vmware/configurator-vmware.component';
-import { ConfiguratorDialogIouComponent } from './components/project-map/node-editors/configurator/iou/configurator-iou.component';
-import { ConfiguratorDialogIosComponent } from './components/project-map/node-editors/configurator/ios/configurator-ios.component';
-import { ConfiguratorDialogDockerComponent } from './components/project-map/node-editors/configurator/docker/configurator-docker.component';
-import { EditNetworkConfigurationDialogComponent } from './components/project-map/node-editors/configurator/docker/edit-network-configuration/edit-network-configuration.component';
-import { ConfigureCustomAdaptersDialogComponent } from './components/project-map/node-editors/configurator/docker/configure-custom-adapters/configure-custom-adapters.component';
-import { ConfiguratorDialogNatComponent } from './components/project-map/node-editors/configurator/nat/configurator-nat.component';
-import { ConfiguratorDialogTracengComponent } from './components/project-map/node-editors/configurator/traceng/configurator-traceng.component';
+import { AddDockerTemplateComponent } from './components/preferences/docker/add-docker-template/add-docker-template.component';
+import { CopyDockerTemplateComponent } from './components/preferences/docker/copy-docker-template/copy-docker-template.component';
+import { DockerTemplateDetailsComponent } from './components/preferences/docker/docker-template-details/docker-template-details.component';
+import { DockerTemplatesComponent } from './components/preferences/docker/docker-templates/docker-templates.component';
+import { AddIosTemplateComponent } from './components/preferences/dynamips/add-ios-template/add-ios-template.component';
+import { CopyIosTemplateComponent } from './components/preferences/dynamips/copy-ios-template/copy-ios-template.component';
+import { DynamipsPreferencesComponent } from './components/preferences/dynamips/dynamips-preferences/dynamips-preferences.component';
+import { IosTemplateDetailsComponent } from './components/preferences/dynamips/ios-template-details/ios-template-details.component';
+import { IosTemplatesComponent } from './components/preferences/dynamips/ios-templates/ios-templates.component';
+import { GeneralPreferencesComponent } from './components/preferences/general/general-preferences.component';
+import { Gns3vmComponent } from './components/preferences/gns3vm/gns3vm.component';
+import { AddIouTemplateComponent } from './components/preferences/ios-on-unix/add-iou-template/add-iou-template.component';
+import { CopyIouTemplateComponent } from './components/preferences/ios-on-unix/copy-iou-template/copy-iou-template.component';
+import { IouTemplateDetailsComponent } from './components/preferences/ios-on-unix/iou-template-details/iou-template-details.component';
+import { IouTemplatesComponent } from './components/preferences/ios-on-unix/iou-templates/iou-templates.component';
+import { PreferencesComponent } from './components/preferences/preferences.component';
+import { AddQemuVmTemplateComponent } from './components/preferences/qemu/add-qemu-vm-template/add-qemu-vm-template.component';
+import { CopyQemuVmTemplateComponent } from './components/preferences/qemu/copy-qemu-vm-template/copy-qemu-vm-template.component';
+import { QemuPreferencesComponent } from './components/preferences/qemu/qemu-preferences/qemu-preferences.component';
+import { QemuVmTemplateDetailsComponent } from './components/preferences/qemu/qemu-vm-template-details/qemu-vm-template-details.component';
+import { QemuVmTemplatesComponent } from './components/preferences/qemu/qemu-vm-templates/qemu-vm-templates.component';
import { AddTracengTemplateComponent } from './components/preferences/traceng/add-traceng/add-traceng-template.component';
import { TracengPreferencesComponent } from './components/preferences/traceng/traceng-preferences/traceng-preferences.component';
-import { TracengTemplatesComponent } from './components/preferences/traceng/traceng-templates/traceng-templates.component';
-import { TracengService } from './services/traceng.service';
import { TracengTemplateDetailsComponent } from './components/preferences/traceng/traceng-template-details/traceng-template-details.component';
-import { QemuImageCreatorComponent } from './components/project-map/node-editors/configurator/qemu/qemu-image-creator/qemu-image-creator.component';
-import { ChooseNameDialogComponent } from './components/projects/choose-name-dialog/choose-name-dialog.component';
-import { PacketCaptureService } from './services/packet-capture.service';
-import { StartCaptureOnStartedLinkActionComponent } from './components/project-map/context-menu/actions/start-capture-on-started-link/start-capture-on-started-link.component';
-import { LockActionComponent } from './components/project-map/context-menu/actions/lock-action/lock-action.component';
-import { NavigationDialogComponent } from './components/projects/navigation-dialog/navigation-dialog.component';
-import { ScreenshotDialogComponent } from './components/project-map/screenshot-dialog/screenshot-dialog.component';
-import { ResizableModule } from 'angular-resizable-element';
-import { DragAndDropModule } from 'angular-draggable-droppable';
-import { DragDropModule } from '@angular/cdk/drag-drop';
-import { PageNotFoundComponent } from './components/page-not-found/page-not-found.component';
+import { TracengTemplatesComponent } from './components/preferences/traceng/traceng-templates/traceng-templates.component';
+import { AddVirtualBoxTemplateComponent } from './components/preferences/virtual-box/add-virtual-box-template/add-virtual-box-template.component';
+import { VirtualBoxPreferencesComponent } from './components/preferences/virtual-box/virtual-box-preferences/virtual-box-preferences.component';
+import { VirtualBoxTemplateDetailsComponent } from './components/preferences/virtual-box/virtual-box-template-details/virtual-box-template-details.component';
+import { VirtualBoxTemplatesComponent } from './components/preferences/virtual-box/virtual-box-templates/virtual-box-templates.component';
+import { AddVmwareTemplateComponent } from './components/preferences/vmware/add-vmware-template/add-vmware-template.component';
+import { VmwarePreferencesComponent } from './components/preferences/vmware/vmware-preferences/vmware-preferences.component';
+import { VmwareTemplateDetailsComponent } from './components/preferences/vmware/vmware-template-details/vmware-template-details.component';
+import { VmwareTemplatesComponent } from './components/preferences/vmware/vmware-templates/vmware-templates.component';
+import { AddVpcsTemplateComponent } from './components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component';
+import { VpcsPreferencesComponent } from './components/preferences/vpcs/vpcs-preferences/vpcs-preferences.component';
+import { VpcsTemplateDetailsComponent } from './components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component';
+import { VpcsTemplatesComponent } from './components/preferences/vpcs/vpcs-templates/vpcs-templates.component';
+import { ChangeHostnameDialogComponent } from './components/project-map/change-hostname-dialog/change-hostname-dialog.component';
+import { ChangeSymbolDialogComponent } from './components/project-map/change-symbol-dialog/change-symbol-dialog.component';
+import { ConsoleWrapperComponent } from './components/project-map/console-wrapper/console-wrapper.component';
+import { ContextConsoleMenuComponent } from './components/project-map/context-console-menu/context-console-menu.component';
import { AlignHorizontallyActionComponent } from './components/project-map/context-menu/actions/align-horizontally/align-horizontally.component';
import { AlignVerticallyActionComponent } from './components/project-map/context-menu/actions/align_vertically/align-vertically.component';
-import { ConfirmationBottomSheetComponent } from './components/projects/confirmation-bottomsheet/confirmation-bottomsheet.component';
-import { TemplateFilter } from './filters/templateFilter.pipe';
-import { NotificationService } from './services/notification.service';
-import { ConfigDialogComponent } from './components/project-map/context-menu/dialogs/config-dialog/config-dialog.component';
-import { Gns3vmComponent } from './components/preferences/gns3vm/gns3vm.component';
-import { Gns3vmService } from './services/gns3vm.service';
-import { ThemeService } from './services/theme.service';
-import { ConfigureGns3VMDialogComponent } from './components/servers/configure-gns3vm-dialog/configure-gns3vm-dialog.component';
-import { ImportApplianceComponent } from './components/project-map/import-appliance/import-appliance.component';
-import { GoogleAnalyticsService } from './services/google-analytics.service';
-import { DirectLinkComponent } from './components/direct-link/direct-link.component';
-import { SystemStatusComponent } from './components/system-status/system-status.component';
-import { StatusInfoComponent } from './components/system-status/status-info/status-info.component';
-import { StatusChartComponent } from './components/system-status/status-chart/status-chart.component';
-import { NgCircleProgressModule } from 'ng-circle-progress';
-import { OpenFileExplorerActionComponent } from './components/project-map/context-menu/actions/open-file-explorer/open-file-explorer-action.component';
-import { NgxChildProcessModule } from 'ngx-childprocess';
-import { ServerResolve } from './resolvers/server-resolve';
-import { HttpConsoleActionComponent } from './components/project-map/context-menu/actions/http-console/http-console-action.component';
-import { WebConsoleComponent } from './components/project-map/web-console/web-console.component';
-import { ConsoleWrapperComponent } from './components/project-map/console-wrapper/console-wrapper.component';
-import { NodeConsoleService } from './services/nodeConsole.service';
-import { HttpConsoleNewTabActionComponent } from './components/project-map/context-menu/actions/http-console-new-tab/http-console-new-tab-action.component';
-import { WebConsoleFullWindowComponent } from './components/web-console-full-window/web-console-full-window.component';
-import { ConsoleGuard } from './guards/console-guard';
-import { NewTemplateDialogComponent } from './components/project-map/new-template-dialog/new-template-dialog.component';
-import { ApplianceService } from './services/appliances.service';
-import { DataSourceFilter } from './filters/dataSourceFilter';
+import { BringToFrontActionComponent } from './components/project-map/context-menu/actions/bring-to-front-action/bring-to-front-action.component';
import { ChangeHostnameActionComponent } from './components/project-map/context-menu/actions/change-hostname/change-hostname-action.component';
-import { ChangeHostnameDialogComponent } from './components/project-map/change-hostname-dialog/change-hostname-dialog.component';
+import { ChangeSymbolActionComponent } from './components/project-map/context-menu/actions/change-symbol/change-symbol-action.component';
+import { ConfigActionComponent } from './components/project-map/context-menu/actions/config-action/config-action.component';
+import { ConsoleDeviceActionBrowserComponent } from './components/project-map/context-menu/actions/console-device-action-browser/console-device-action-browser.component';
+import { ConsoleDeviceActionComponent } from './components/project-map/context-menu/actions/console-device-action/console-device-action.component';
+import { DeleteActionComponent } from './components/project-map/context-menu/actions/delete-action/delete-action.component';
+import { DuplicateActionComponent } from './components/project-map/context-menu/actions/duplicate-action/duplicate-action.component';
+import { EditConfigActionComponent } from './components/project-map/context-menu/actions/edit-config/edit-config-action.component';
+import { EditStyleActionComponent } from './components/project-map/context-menu/actions/edit-style-action/edit-style-action.component';
+import { EditTextActionComponent } from './components/project-map/context-menu/actions/edit-text-action/edit-text-action.component';
+import { ExportConfigActionComponent } from './components/project-map/context-menu/actions/export-config/export-config-action.component';
+import { HttpConsoleNewTabActionComponent } from './components/project-map/context-menu/actions/http-console-new-tab/http-console-new-tab-action.component';
+import { HttpConsoleActionComponent } from './components/project-map/context-menu/actions/http-console/http-console-action.component';
+import { ImportConfigActionComponent } from './components/project-map/context-menu/actions/import-config/import-config-action.component';
+import { LockActionComponent } from './components/project-map/context-menu/actions/lock-action/lock-action.component';
+import { MoveLayerDownActionComponent } from './components/project-map/context-menu/actions/move-layer-down-action/move-layer-down-action.component';
+import { MoveLayerUpActionComponent } from './components/project-map/context-menu/actions/move-layer-up-action/move-layer-up-action.component';
+import { OpenFileExplorerActionComponent } from './components/project-map/context-menu/actions/open-file-explorer/open-file-explorer-action.component';
+import { PacketFiltersActionComponent } from './components/project-map/context-menu/actions/packet-filters-action/packet-filters-action.component';
+import { ReloadNodeActionComponent } from './components/project-map/context-menu/actions/reload-node-action/reload-node-action.component';
+import { ResumeLinkActionComponent } from './components/project-map/context-menu/actions/resume-link-action/resume-link-action.component';
+import { ShowNodeActionComponent } from './components/project-map/context-menu/actions/show-node-action/show-node-action.component';
+import { StartCaptureOnStartedLinkActionComponent } from './components/project-map/context-menu/actions/start-capture-on-started-link/start-capture-on-started-link.component';
+import { StartCaptureActionComponent } from './components/project-map/context-menu/actions/start-capture/start-capture-action.component';
+import { StartNodeActionComponent } from './components/project-map/context-menu/actions/start-node-action/start-node-action.component';
+import { StopCaptureActionComponent } from './components/project-map/context-menu/actions/stop-capture/stop-capture-action.component';
+import { StopNodeActionComponent } from './components/project-map/context-menu/actions/stop-node-action/stop-node-action.component';
+import { SuspendLinkActionComponent } from './components/project-map/context-menu/actions/suspend-link/suspend-link-action.component';
+import { SuspendNodeActionComponent } from './components/project-map/context-menu/actions/suspend-node-action/suspend-node-action.component';
+import { ContextMenuComponent } from './components/project-map/context-menu/context-menu.component';
+import { ConfigDialogComponent } from './components/project-map/context-menu/dialogs/config-dialog/config-dialog.component';
+import { DrawLinkToolComponent } from './components/project-map/draw-link-tool/draw-link-tool.component';
+import { StyleEditorDialogComponent } from './components/project-map/drawings-editors/style-editor/style-editor.component';
+import { TextEditorDialogComponent } from './components/project-map/drawings-editors/text-editor/text-editor.component';
+import { HelpDialogComponent } from './components/project-map/help-dialog/help-dialog.component';
+import { NodeCreatedLabelStylesFixer } from './components/project-map/helpers/node-created-label-styles-fixer';
+import { ImportApplianceComponent } from './components/project-map/import-appliance/import-appliance.component';
+import { InfoDialogComponent } from './components/project-map/info-dialog/info-dialog.component';
+import { LogConsoleComponent } from './components/project-map/log-console/log-console.component';
+import { LogEventsDataSource } from './components/project-map/log-console/log-events-datasource';
import { ApplianceInfoDialogComponent } from './components/project-map/new-template-dialog/appliance-info-dialog/appliance-info-dialog.component';
-import { ResetLinkActionComponent } from './components/project-map/context-menu/actions/reset-link/reset-link-action.component';
-import { ReadmeEditorComponent } from './components/projects/edit-project-dialog/readme-editor/readme-editor.component';
-import { MarkedDirective } from './directives/marked.directive';
-import { InformationDialogComponent } from './components/dialogs/information-dialog.component';
+import { NewTemplateDialogComponent } from './components/project-map/new-template-dialog/new-template-dialog.component';
import { TemplateNameDialogComponent } from './components/project-map/new-template-dialog/template-name-dialog/template-name-dialog.component';
-import { UpdatesService } from './services/updates.service';
+import { ConfigEditorDialogComponent } from './components/project-map/node-editors/config-editor/config-editor.component';
+import { ConfiguratorDialogAtmSwitchComponent } from './components/project-map/node-editors/configurator/atm_switch/configurator-atm-switch.component';
+import { ConfiguratorDialogCloudComponent } from './components/project-map/node-editors/configurator/cloud/configurator-cloud.component';
+import { ConfiguratorDialogDockerComponent } from './components/project-map/node-editors/configurator/docker/configurator-docker.component';
+import { ConfigureCustomAdaptersDialogComponent } from './components/project-map/node-editors/configurator/docker/configure-custom-adapters/configure-custom-adapters.component';
+import { EditNetworkConfigurationDialogComponent } from './components/project-map/node-editors/configurator/docker/edit-network-configuration/edit-network-configuration.component';
+import { ConfiguratorDialogEthernetSwitchComponent } from './components/project-map/node-editors/configurator/ethernet-switch/configurator-ethernet-switch.component';
+import { ConfiguratorDialogEthernetHubComponent } from './components/project-map/node-editors/configurator/ethernet_hub/configurator-ethernet-hub.component';
+import { ConfiguratorDialogIosComponent } from './components/project-map/node-editors/configurator/ios/configurator-ios.component';
+import { ConfiguratorDialogIouComponent } from './components/project-map/node-editors/configurator/iou/configurator-iou.component';
+import { ConfiguratorDialogNatComponent } from './components/project-map/node-editors/configurator/nat/configurator-nat.component';
+import { ConfiguratorDialogQemuComponent } from './components/project-map/node-editors/configurator/qemu/configurator-qemu.component';
+import { QemuImageCreatorComponent } from './components/project-map/node-editors/configurator/qemu/qemu-image-creator/qemu-image-creator.component';
+import { ConfiguratorDialogSwitchComponent } from './components/project-map/node-editors/configurator/switch/configurator-switch.component';
+import { ConfiguratorDialogTracengComponent } from './components/project-map/node-editors/configurator/traceng/configurator-traceng.component';
+import { ConfiguratorDialogVirtualBoxComponent } from './components/project-map/node-editors/configurator/virtualbox/configurator-virtualbox.component';
+import { ConfiguratorDialogVmwareComponent } from './components/project-map/node-editors/configurator/vmware/configurator-vmware.component';
+import { ConfiguratorDialogVpcsComponent } from './components/project-map/node-editors/configurator/vpcs/configurator-vpcs.component';
+import { NodeSelectInterfaceComponent } from './components/project-map/node-select-interface/node-select-interface.component';
+import { NodesMenuComponent } from './components/project-map/nodes-menu/nodes-menu.component';
+import { PacketFiltersDialogComponent } from './components/project-map/packet-capturing/packet-filters/packet-filters.component';
+import { StartCaptureDialogComponent } from './components/project-map/packet-capturing/start-capture/start-capture.component';
+import { ProjectMapMenuComponent } from './components/project-map/project-map-menu/project-map-menu.component';
+import { ProjectMapComponent } from './components/project-map/project-map.component';
import { ProjectReadmeComponent } from './components/project-map/project-readme/project-readme.component';
-
+import { ScreenshotDialogComponent } from './components/project-map/screenshot-dialog/screenshot-dialog.component';
+import { WebConsoleComponent } from './components/project-map/web-console/web-console.component';
+import { AddBlankProjectDialogComponent } from './components/projects/add-blank-project-dialog/add-blank-project-dialog.component';
+import { ChooseNameDialogComponent } from './components/projects/choose-name-dialog/choose-name-dialog.component';
+import { ConfirmationBottomSheetComponent } from './components/projects/confirmation-bottomsheet/confirmation-bottomsheet.component';
+import { ConfirmationDialogComponent } from './components/projects/confirmation-dialog/confirmation-dialog.component';
+import { EditProjectDialogComponent } from './components/projects/edit-project-dialog/edit-project-dialog.component';
+import { ReadmeEditorComponent } from './components/projects/edit-project-dialog/readme-editor/readme-editor.component';
+import { ImportProjectDialogComponent } from './components/projects/import-project-dialog/import-project-dialog.component';
+import { ProjectNameValidator } from './components/projects/models/projectNameValidator';
+import { NavigationDialogComponent } from './components/projects/navigation-dialog/navigation-dialog.component';
+import { ProjectsComponent } from './components/projects/projects.component';
+import { SaveProjectDialogComponent } from './components/projects/save-project-dialog/save-project-dialog.component';
+import { AddServerDialogComponent } from './components/servers/add-server-dialog/add-server-dialog.component';
+import { ConfigureGns3VMDialogComponent } from './components/servers/configure-gns3vm-dialog/configure-gns3vm-dialog.component';
+import { ServerDiscoveryComponent } from './components/servers/server-discovery/server-discovery.component';
+import { ServersComponent } from './components/servers/servers.component';
+import { ConsoleComponent } from './components/settings/console/console.component';
+import { SettingsComponent } from './components/settings/settings.component';
+import { CreateSnapshotDialogComponent } from './components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component';
+import { ListOfSnapshotsComponent } from './components/snapshots/list-of-snapshots/list-of-snapshots.component';
+import { SnapshotMenuItemComponent } from './components/snapshots/snapshot-menu-item/snapshot-menu-item.component';
+import { StatusChartComponent } from './components/system-status/status-chart/status-chart.component';
+import { StatusInfoComponent } from './components/system-status/status-info/status-info.component';
+import { SystemStatusComponent } from './components/system-status/system-status.component';
+import { TemplateListDialogComponent } from './components/template/template-list-dialog/template-list-dialog.component';
+import { TemplateComponent } from './components/template/template.component';
+import { TopologySummaryComponent } from './components/topology-summary/topology-summary.component';
+import { WebConsoleFullWindowComponent } from './components/web-console-full-window/web-console-full-window.component';
+import { DataSourceFilter } from './filters/dataSourceFilter';
+import { DateFilter } from './filters/dateFilter.pipe';
+import { NameFilter } from './filters/nameFilter.pipe';
+import { ProjectsFilter } from './filters/projectsFilter.pipe';
+import { SearchFilter } from './filters/searchFilter.pipe';
+import { TemplateFilter } from './filters/templateFilter.pipe';
+import { ConsoleGuard } from './guards/console-guard';
+import { ProjectWebServiceHandler } from './handlers/project-web-service-handler';
+import { DefaultLayoutComponent } from './layouts/default-layout/default-layout.component';
+import { MATERIAL_IMPORTS } from './material.imports';
+import { ServerResolve } from './resolvers/server-resolve';
+import { ApplianceService } from './services/appliances.service';
+import { BuiltInTemplatesConfigurationService } from './services/built-in-templates-configuration.service';
+import { BuiltInTemplatesService } from './services/built-in-templates.service';
+import { ComputeService } from './services/compute.service';
+import { DockerConfigurationService } from './services/docker-configuration.service';
+import { DockerService } from './services/docker.service';
+import { DrawingService } from './services/drawing.service';
+import { ExternalSoftwareDefinitionService } from './services/external-software-definition.service';
+import { Gns3vmService } from './services/gns3vm.service';
+import { GoogleAnalyticsService } from './services/google-analytics.service';
+import { HttpServer, ServerErrorHandler } from './services/http-server.service';
+import { IndexedDbService } from './services/indexed-db.service';
+import { InfoService } from './services/info.service';
+import { InstalledSoftwareService } from './services/installed-software.service';
+import { IosConfigurationService } from './services/ios-configuration.service';
+import { IosService } from './services/ios.service';
+import { IouConfigurationService } from './services/iou-configuration.service';
+import { IouService } from './services/iou.service';
+import { LinkService } from './services/link.service';
+import { MapScaleService } from './services/mapScale.service';
+import { MapSettingsService } from './services/mapsettings.service';
+import { NodeService } from './services/node.service';
+import { NodeConsoleService } from './services/nodeConsole.service';
+import { NotificationService } from './services/notification.service';
+import { PacketCaptureService } from './services/packet-capture.service';
+import { PlatformService } from './services/platform.service';
+import { ProjectService } from './services/project.service';
+import { QemuConfigurationService } from './services/qemu-configuration.service';
+import { QemuService } from './services/qemu.service';
+import { RecentlyOpenedProjectService } from './services/recentlyOpenedProject.service';
+import { ServerManagementService } from './services/server-management.service';
+import { ServerSettingsService } from './services/server-settings.service';
+import { ServerDatabase } from './services/server.database';
+import { ServerService } from './services/server.service';
+import { SettingsService } from './services/settings.service';
+import { ConsoleService } from './services/settings/console.service';
+import { DefaultConsoleService } from './services/settings/default-console.service';
+import { SnapshotService } from './services/snapshot.service';
+import { SymbolService } from './services/symbol.service';
+import { TemplateMocksService } from './services/template-mocks.service';
+import { TemplateService } from './services/template.service';
+import { ThemeService } from './services/theme.service';
+import { ToasterService } from './services/toaster.service';
+import { ToolsService } from './services/tools.service';
+import { TracengService } from './services/traceng.service';
+import { UpdatesService } from './services/updates.service';
+import { VersionService } from './services/version.service';
+import { VirtualBoxConfigurationService } from './services/virtual-box-configuration.service';
+import { VirtualBoxService } from './services/virtual-box.service';
+import { VmwareConfigurationService } from './services/vmware-configuration.service';
+import { VmwareService } from './services/vmware.service';
+import { VpcsConfigurationService } from './services/vpcs-configuration.service';
+import { VpcsService } from './services/vpcs.service';
+import { NonNegativeValidator } from './validators/non-negative-validator';
+import { RotationValidator } from './validators/rotation-validator';
+import { MarkedDirective } from './directives/marked.directive';
@NgModule({
declarations: [
@@ -318,7 +307,6 @@ import { ProjectReadmeComponent } from './components/project-map/project-readme/
StopCaptureActionComponent,
ResumeLinkActionComponent,
SuspendLinkActionComponent,
- ResetLinkActionComponent,
SettingsComponent,
PreferencesComponent,
BundledServerFinderComponent,
@@ -402,7 +390,6 @@ import { ProjectReadmeComponent } from './components/project-map/project-readme/
ShowNodeActionComponent,
ConsoleComponent,
NodesMenuComponent,
- NotificationBoxComponent,
ProjectMapMenuComponent,
HelpComponent,
ConfigEditorDialogComponent,
@@ -475,9 +462,11 @@ import { ProjectReadmeComponent } from './components/project-map/project-readme/
InformationDialogComponent,
TemplateNameDialogComponent,
ConfigureCustomAdaptersDialogComponent,
- EditNetworkConfigurationDialogComponent
+ EditNetworkConfigurationDialogComponent,
+ ReportIssueComponent,
],
imports: [
+ AngularReactBrowserModule,
BrowserModule,
HttpClientModule,
AppRoutingModule,
@@ -495,7 +484,8 @@ import { ProjectReadmeComponent } from './components/project-map/project-readme/
DragDropModule,
NgxChildProcessModule,
MATERIAL_IMPORTS,
- NgCircleProgressModule.forRoot()
+ NgCircleProgressModule.forRoot(),
+ OverlayModule,
],
providers: [
SettingsService,
@@ -570,7 +560,7 @@ import { ProjectReadmeComponent } from './components/project-map/project-readme/
ConsoleGuard,
Title,
ApplianceService,
- UpdatesService
+ UpdatesService,
],
entryComponents: [
AddServerDialogComponent,
@@ -621,8 +611,8 @@ import { ProjectReadmeComponent } from './components/project-map/project-readme/
EditNetworkConfigurationDialogComponent,
ProjectReadmeComponent
],
- bootstrap: [AppComponent]
+ bootstrap: [AppComponent],
})
export class AppModule {
- constructor(protected _googleAnalyticsService: GoogleAnalyticsService) { }
+ constructor(protected _googleAnalyticsService: GoogleAnalyticsService) {}
}
diff --git a/src/app/cartography/angular-map.imports.ts b/src/app/cartography/angular-map.imports.ts
index e2a53e9f..711585e8 100644
--- a/src/app/cartography/angular-map.imports.ts
+++ b/src/app/cartography/angular-map.imports.ts
@@ -1,6 +1,4 @@
-import { NodeComponent } from './components/experimental-map/node/node.component';
-import { LinkComponent } from './components/experimental-map/link/link.component';
-import { StatusComponent } from './components/experimental-map/status/status.component';
+import { DraggableComponent } from './components/experimental-map/draggable/draggable.component';
import { DrawingComponent } from './components/experimental-map/drawing/drawing.component';
import { EllipseComponent } from './components/experimental-map/drawing/drawings/ellipse/ellipse.component';
import { ImageComponent } from './components/experimental-map/drawing/drawings/image/image.component';
@@ -8,8 +6,10 @@ import { LineComponent } from './components/experimental-map/drawing/drawings/li
import { RectComponent } from './components/experimental-map/drawing/drawings/rect/rect.component';
import { TextComponent } from './components/experimental-map/drawing/drawings/text/text.component';
import { InterfaceLabelComponent } from './components/experimental-map/interface-label/interface-label.component';
-import { DraggableComponent } from './components/experimental-map/draggable/draggable.component';
+import { LinkComponent } from './components/experimental-map/link/link.component';
+import { NodeComponent } from './components/experimental-map/node/node.component';
import { SelectionComponent } from './components/experimental-map/selection/selection.component';
+import { StatusComponent } from './components/experimental-map/status/status.component';
export const ANGULAR_MAP_DECLARATIONS = [
NodeComponent,
@@ -23,5 +23,5 @@ export const ANGULAR_MAP_DECLARATIONS = [
TextComponent,
DraggableComponent,
SelectionComponent,
- InterfaceLabelComponent
+ InterfaceLabelComponent,
];
diff --git a/src/app/cartography/cartography.module.ts b/src/app/cartography/cartography.module.ts
index 3ebad213..7d7c813d 100644
--- a/src/app/cartography/cartography.module.ts
+++ b/src/app/cartography/cartography.module.ts
@@ -1,27 +1,22 @@
-import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
+import { NgModule } from '@angular/core';
import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu';
-
-import { CssFixer } from './helpers/css-fixer';
-import { FontFixer } from './helpers/font-fixer';
-import { DefaultDrawingsFactory } from './helpers/default-drawings-factory';
-import { MultiLinkCalculatorHelper } from './helpers/multi-link-calculator-helper';
-import { SvgToDrawingConverter } from './helpers/svg-to-drawing-converter';
-import { QtDasharrayFixer } from './helpers/qt-dasharray-fixer';
-import { LayersManager } from './managers/layers-manager';
-import { MapChangeDetectorRef } from './services/map-change-detector-ref';
-import { Context } from './models/context';
import { ANGULAR_MAP_DECLARATIONS } from './angular-map.imports';
-import { D3_MAP_IMPORTS } from './d3-map.imports';
-import { CanvasSizeDetector } from './helpers/canvas-size-detector';
-import { DrawingsEventSource } from './events/drawings-event-source';
-import { NodesEventSource } from './events/nodes-event-source';
-import { MapDrawingToSvgConverter } from './converters/map/map-drawing-to-svg-converter';
+import { D3MapComponent } from './components/d3-map/d3-map.component';
+import { DraggableSelectionComponent } from './components/draggable-selection/draggable-selection.component';
+import { DrawingAddingComponent } from './components/drawing-adding/drawing-adding.component';
+import { DrawingResizingComponent } from './components/drawing-resizing/drawing-resizing.component';
+import { ExperimentalMapComponent } from './components/experimental-map/experimental-map.component';
+import { SelectionControlComponent } from './components/selection-control/selection-control.component';
+import { SelectionSelectComponent } from './components/selection-select/selection-select.component';
+import { TextEditorComponent } from './components/text-editor/text-editor.component';
import { DrawingToMapDrawingConverter } from './converters/map/drawing-to-map-drawing-converter';
import { LabelToMapLabelConverter } from './converters/map/label-to-map-label-converter';
+import { LinkNodeToMapLinkNodeConverter } from './converters/map/link-node-to-map-link-node-converter';
import { LinkToMapLinkConverter } from './converters/map/link-to-map-link-converter';
import { MapDrawingToDrawingConverter } from './converters/map/map-drawing-to-drawing-converter';
+import { MapDrawingToSvgConverter } from './converters/map/map-drawing-to-svg-converter';
import { MapLabelToLabelConverter } from './converters/map/map-label-to-label-converter';
import { MapLinkNodeToLinkNodeConverter } from './converters/map/map-link-node-to-link-node-converter';
import { MapLinkToLinkConverter } from './converters/map/map-link-to-link-converter';
@@ -31,34 +26,38 @@ import { MapSymbolToSymbolConverter } from './converters/map/map-symbol-to-symbo
import { NodeToMapNodeConverter } from './converters/map/node-to-map-node-converter';
import { PortToMapPortConverter } from './converters/map/port-to-map-port-converter';
import { SymbolToMapSymbolConverter } from './converters/map/symbol-to-map-symbol-converter';
-import { LinkNodeToMapLinkNodeConverter } from './converters/map/link-node-to-map-link-node-converter';
-import { GraphDataManager } from './managers/graph-data-manager';
-import {
- MapNodesDataSource,
- MapLinksDataSource,
- MapDrawingsDataSource,
- MapSymbolsDataSource
-} from './datasources/map-datasource';
-import { LinksEventSource } from './events/links-event-source';
-import { D3MapComponent } from './components/d3-map/d3-map.component';
-import { ExperimentalMapComponent } from './components/experimental-map/experimental-map.component';
-import { SelectionEventSource } from './events/selection-event-source';
-import { SelectionControlComponent } from './components/selection-control/selection-control.component';
-import { SelectionSelectComponent } from './components/selection-select/selection-select.component';
-import { DraggableSelectionComponent } from './components/draggable-selection/draggable-selection.component';
-import { MapSettingsManager } from './managers/map-settings-manager';
-import { DrawingResizingComponent } from './components/drawing-resizing/drawing-resizing.component';
-import { FontBBoxCalculator } from './helpers/font-bbox-calculator';
import { StylesToFontConverter } from './converters/styles-to-font-converter';
-import { TextElementFactory } from './helpers/drawings-factory/text-element-factory';
-import { EllipseElementFactory } from './helpers/drawings-factory/ellipse-element-factory';
-import { RectangleElementFactory } from './helpers/drawings-factory/rectangle-element-factory';
-import { LineElementFactory } from './helpers/drawings-factory/line-element-factory';
-import { TextEditorComponent } from './components/text-editor/text-editor.component';
-import { DrawingAddingComponent } from './components/drawing-adding/drawing-adding.component';
-import { MovingEventSource } from './events/moving-event-source';
+import { D3_MAP_IMPORTS } from './d3-map.imports';
+import {
+ MapDrawingsDataSource,
+ MapLinksDataSource,
+ MapNodesDataSource,
+ MapSymbolsDataSource,
+} from './datasources/map-datasource';
import { MovingCanvasDirective } from './directives/moving-canvas.directive';
import { ZoomingCanvasDirective } from './directives/zooming-canvas.directive';
+import { DrawingsEventSource } from './events/drawings-event-source';
+import { LinksEventSource } from './events/links-event-source';
+import { MovingEventSource } from './events/moving-event-source';
+import { NodesEventSource } from './events/nodes-event-source';
+import { SelectionEventSource } from './events/selection-event-source';
+import { CanvasSizeDetector } from './helpers/canvas-size-detector';
+import { CssFixer } from './helpers/css-fixer';
+import { DefaultDrawingsFactory } from './helpers/default-drawings-factory';
+import { EllipseElementFactory } from './helpers/drawings-factory/ellipse-element-factory';
+import { LineElementFactory } from './helpers/drawings-factory/line-element-factory';
+import { RectangleElementFactory } from './helpers/drawings-factory/rectangle-element-factory';
+import { TextElementFactory } from './helpers/drawings-factory/text-element-factory';
+import { FontBBoxCalculator } from './helpers/font-bbox-calculator';
+import { FontFixer } from './helpers/font-fixer';
+import { MultiLinkCalculatorHelper } from './helpers/multi-link-calculator-helper';
+import { QtDasharrayFixer } from './helpers/qt-dasharray-fixer';
+import { SvgToDrawingConverter } from './helpers/svg-to-drawing-converter';
+import { GraphDataManager } from './managers/graph-data-manager';
+import { LayersManager } from './managers/layers-manager';
+import { MapSettingsManager } from './managers/map-settings-manager';
+import { Context } from './models/context';
+import { MapChangeDetectorRef } from './services/map-change-detector-ref';
import { EthernetLinkWidget } from './widgets/links/ethernet-link';
import { SerialLinkWidget } from './widgets/links/serial-link';
@@ -75,7 +74,7 @@ import { SerialLinkWidget } from './widgets/links/serial-link';
SelectionSelectComponent,
DraggableSelectionComponent,
MovingCanvasDirective,
- ZoomingCanvasDirective
+ ZoomingCanvasDirective,
],
providers: [
CssFixer,
@@ -122,8 +121,8 @@ import { SerialLinkWidget } from './widgets/links/serial-link';
StylesToFontConverter,
EthernetLinkWidget,
SerialLinkWidget,
- ...D3_MAP_IMPORTS
+ ...D3_MAP_IMPORTS,
],
- exports: [D3MapComponent, ExperimentalMapComponent]
+ exports: [D3MapComponent, ExperimentalMapComponent],
})
export class CartographyModule {}
diff --git a/src/app/cartography/components/d3-map/d3-map.component.html b/src/app/cartography/components/d3-map/d3-map.component.html
index b409cd50..e166c697 100644
--- a/src/app/cartography/components/d3-map/d3-map.component.html
+++ b/src/app/cartography/components/d3-map/d3-map.component.html
@@ -1,14 +1,38 @@