Compare commits

..

1061 Commits

Author SHA1 Message Date
8731f78808 Merge branch 'master-3.0' into bugfix-1398 2023-08-18 16:48:19 +10:00
6322fea306 Merge pull request #1451 from GNS3/upgrade-angular
Upgrade to Angular 14
2023-08-18 16:47:44 +10:00
318d783370 Merge branch 'master-3.0' into upgrade-angular 2023-08-18 16:24:08 +10:00
93a98f1335 Merge branch '2.2' into master-3.0
# Conflicts:
#	package.json
#	src/app/cartography/components/experimental-map/drawing/drawings/rect/rect.component.html
#	src/app/cartography/converters/map/map-drawing-to-svg-converter.ts
#	src/app/components/preferences/qemu/qemu-vm-template-details/qemu-vm-template-details.component.html
#	src/app/components/project-map/drawings-editors/style-editor/style-editor.component.ts
#	src/app/components/project-map/new-template-dialog/new-template-dialog.component.ts
#	yarn.lock
2023-08-02 18:39:15 +10:00
bfc72c219c Add missing settings to Qemu VM templates. Fixes #1456 2023-08-01 20:13:11 +10:00
997b8df598 Merge pull request #1457 from GNS3/rounded-rect
Support for rounded rectangles
2023-08-01 20:03:55 +10:00
89bff8ac30 Set ry for rectangle 2023-08-01 19:48:08 +10:00
df6248d641 Add corner radius setting to style editor 2023-08-01 19:44:04 +10:00
cefbc3c9be Support for rounded rectangles 2023-08-01 15:54:47 +10:00
b59c528ece Development on v2.2.42.dev1 2023-07-12 16:28:33 +10:00
61334d197d Release v2.2.41 2023-07-12 16:23:12 +10:00
d855e5cb33 Merge branch 'master' into 2.2 2023-07-12 16:09:45 +10:00
8dbaa11808 Fix issues with default IOU values for memories always checked. Fixes #1453 2023-07-06 21:53:01 +10:00
0d7020af97 Fix issues with Qemu adapters in template preferences. Fixes #1449 2023-07-06 20:39:04 +10:00
21ef30ceed Revert "Remove comments from .yarnclean"
This reverts commit 8243238ae3.
2023-06-30 19:03:32 +10:00
8243238ae3 Remove comments from .yarnclean 2023-06-30 18:51:39 +10:00
58b9083c49 Merge pull request #1442 from GNS3/dependabot/npm_and_yarn/webpack-5.76.0
Bump webpack from 5.62.1 to 5.76.0
2023-06-30 18:30:43 +10:00
43213d0669 Merge pull request #1432 from GNS3/dependabot/npm_and_yarn/http-cache-semantics-4.1.1
Bump http-cache-semantics from 4.1.0 to 4.1.1
2023-06-30 18:21:22 +10:00
924cbe2542 Merge pull request #1431 from GNS3/dependabot/npm_and_yarn/jszip-3.10.1
Bump jszip from 3.7.1 to 3.10.1
2023-06-30 18:21:07 +10:00
d06a3efd2c Merge branch 'master' into dependabot/npm_and_yarn/jszip-3.10.1 2023-06-30 18:08:08 +10:00
e2466ca4ab Merge branch 'master' into dependabot/npm_and_yarn/http-cache-semantics-4.1.1 2023-06-30 18:07:02 +10:00
1da94efe63 Merge branch 'master' into dependabot/npm_and_yarn/webpack-5.76.0 2023-06-30 18:06:16 +10:00
f9baba7ad9 Merge branch 'master-3.0' into upgrade-angular 2023-06-30 17:57:20 +10:00
45d5663562 Development on 3.0.0.dev7 2023-06-30 17:56:15 +10:00
cb3cf5399d Fix tests 2023-06-30 17:37:12 +10:00
69aa4ac613 Upgrade ng2-file-upload to v3.0.0 2023-06-30 17:29:56 +10:00
0eef66eabf Add CommonJS modules to allowedCommonJsDependencies in angular.json 2023-06-30 17:23:16 +10:00
37813d4ad6 Upgrade material to v14 2023-06-30 12:43:30 +10:00
d67440ae6a Upgrade to Angular 14 2023-06-30 12:11:20 +10:00
838480509e Support for UEFI boot mode option for Qemu VMs 2023-06-23 11:29:38 +09:30
b25337f65b Upgrade requests module. Fixes #1448 2023-06-21 18:38:42 +09:30
ac02dede76 Support for UEFI boot mode option for Qemu VMs 2023-06-21 18:10:00 +09:30
04c28bd40a Developement on v2.2.41.dev1 2023-06-06 12:23:59 +09:30
328dd37ffe Release v2.2.40 2023-06-06 10:10:29 +09:30
c5a692babf Merge pull request #1445 from GNS3/dependabot/pip/scripts/requests-2.31.0
Bump requests from 2.25.1 to 2.31.0 in /scripts
2023-05-23 08:52:15 +08:00
119afd14d2 Bump requests from 2.25.1 to 2.31.0 in /scripts
Bumps [requests](https://github.com/psf/requests) from 2.25.1 to 2.31.0.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.25.1...v2.31.0)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-23 00:51:18 +00:00
37e6921ffb Support HTTP/HTTPS node console. Ref https://github.com/GNS3/gns3-gui/issues/3448 2023-05-22 19:48:23 +08:00
5d48ea046d Development on v2.2.40.dev1 2023-05-08 19:05:57 +08:00
4342d27d07 Release v2.2.39 2023-05-08 18:59:31 +08:00
3394035e2e Bump webpack from 5.62.1 to 5.76.0
Bumps [webpack](https://github.com/webpack/webpack) from 5.62.1 to 5.76.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.62.1...v5.76.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-14 17:07:32 +00:00
49403a5568 Development on v2.2.39.dev1 2023-02-28 15:27:36 +10:00
70e4745657 Merge pull request #1441
Release v2.2.38
2023-02-28 13:21:39 +08:00
543b81c81b Release v2.2.38 2023-02-28 15:17:27 +10:00
02562cd046 Merge pull request #1440 from GNS3/fix/1439
Support extra disk images when importing appliance
2023-02-26 18:42:11 +08:00
252452051a Support extra disk images (hdc/hdd) and cdrom image when importing appliance 2023-02-26 20:15:11 +10:00
a64ff3503e Merge pull request #1433 from GNS3/fix/1336
Fix new template action not using "port_segment_size" and "default_name_format"
2023-02-09 12:20:14 +05:45
17a9e3d089 Merge pull request #1434 from GNS3/vmware-virtualbox-deprecated
Mark VMware and VirtualBox support as deprecated
2023-02-06 06:26:14 +05:45
eff72dc5f8 Fix tests 2023-02-05 10:20:54 +08:00
8e338da896 Warn that VMware and VirtualBox support is deprecated 2023-02-05 10:07:26 +08:00
d982ae0a00 Merge branch 'master' into master-3.0 2023-02-04 16:10:30 +08:00
318143f5a8 Fix new template action not using "port_segment_size" and "default_name_format" 2023-02-04 13:25:10 +08:00
e029bccf18 Bump http-cache-semantics from 4.1.0 to 4.1.1
Bumps [http-cache-semantics](https://github.com/kornelski/http-cache-semantics) from 4.1.0 to 4.1.1.
- [Release notes](https://github.com/kornelski/http-cache-semantics/releases)
- [Commits](https://github.com/kornelski/http-cache-semantics/compare/v4.1.0...v4.1.1)

---
updated-dependencies:
- dependency-name: http-cache-semantics
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-03 04:50:10 +00:00
721adacde4 Bump jszip from 3.7.1 to 3.10.1
Bumps [jszip](https://github.com/Stuk/jszip) from 3.7.1 to 3.10.1.
- [Release notes](https://github.com/Stuk/jszip/releases)
- [Changelog](https://github.com/Stuk/jszip/blob/main/CHANGES.md)
- [Commits](https://github.com/Stuk/jszip/compare/v3.7.1...v3.10.1)

---
updated-dependencies:
- dependency-name: jszip
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-02 17:12:02 +00:00
c6ce67f867 Revert "Handle additional directories for Docker"
This reverts commit fac07ceeb4.
2023-02-01 16:00:59 +08:00
fac07ceeb4 Handle additional directories for Docker 2023-02-01 13:06:03 +08:00
4374573c60 Remove cache and scan master branch in codeql.yml 2023-02-01 11:55:08 +08:00
a8aef0729d Fixes after merge 2023-02-01 11:46:12 +08:00
386c98d677 Update build for production in package.json 2023-02-01 11:08:00 +08:00
c12167379d Use 'ChromeHeadless' in karma.conf.js 2023-02-01 10:57:59 +08:00
6aa6647f53 Remove goToSystemStatus() after merge 2023-02-01 10:42:14 +08:00
7ac3a628a4 Merge remote-tracking branch 'origin/master' into master-3.0
# Conflicts:
#	angular.json
#	package.json
#	src/ReleaseNotes.txt
#	src/app/cartography/helpers/font-fixer.spec.ts
#	src/app/cartography/models/node.ts
#	src/app/components/preferences/qemu/add-qemu-vm-template/add-qemu-vm-template.component.html
#	src/app/components/preferences/qemu/add-qemu-vm-template/add-qemu-vm-template.component.ts
#	src/app/components/project-map/node-editors/configurator/docker/configurator-docker.component.ts
#	src/app/components/project-map/project-map-menu/project-map-menu.component.ts
#	src/app/components/project-map/project-map.component.html
#	src/app/components/project-map/project-map.component.ts
#	src/app/components/projects/projects.component.html
#	src/app/components/settings/settings.component.html
#	src/app/components/settings/settings.component.spec.ts
#	src/app/components/template/template-list-dialog/template-list-dialog.component.html
#	src/app/components/template/template.component.html
#	src/app/components/template/template.component.ts
#	src/app/services/link.service.ts
#	yarn.lock
2023-02-01 10:32:12 +08:00
1e7c04f93c Merge pull request #1423 from GNS3/dependabot/pip/scripts/setuptools-65.5.1
Bump setuptools from 54.2.0 to 65.5.1 in /scripts
2023-02-01 08:04:28 +05:45
a08f8c5963 Fix error when suspending and configuring a packet filter on a link
(cherry picked from commit aeef3e74ed)
2023-02-01 10:12:38 +08:00
642082e9fb Use a hidden iframe to open console on Firefox
(cherry picked from commit 83d72787f4)
2023-02-01 10:11:27 +08:00
7e172e30ba Merge pull request #1427 from GNS3/bugfix/1269
Fix console launch on Firefox
2023-01-31 17:27:37 +05:45
4d243f895c Merge pull request #1428 from GNS3/bugfix/1279
Fix error when suspending and configuring a packet filter on a link
2023-01-31 17:26:51 +05:45
aeef3e74ed Fix error when suspending and configuring a packet filter on a link 2023-01-31 19:18:27 +08:00
83d72787f4 Use a hidden iframe to open console on Firefox 2023-01-31 18:56:07 +08:00
829bfe12d7 Merge remote-tracking branch 'origin/master' 2023-01-31 09:45:45 +08:00
f5b5c717b4 Automatically add new issues to GNS3 project 2023-01-31 09:45:37 +08:00
5b7da298d6 Merge pull request #1426 from GNS3/dependabot/npm_and_yarn/ua-parser-js-0.7.33
Bump ua-parser-js from 0.7.31 to 0.7.33
2023-01-27 14:59:33 +05:45
d7742a7c59 Bump ua-parser-js from 0.7.31 to 0.7.33
Bumps [ua-parser-js](https://github.com/faisalman/ua-parser-js) from 0.7.31 to 0.7.33.
- [Release notes](https://github.com/faisalman/ua-parser-js/releases)
- [Changelog](https://github.com/faisalman/ua-parser-js/blob/master/changelog.md)
- [Commits](https://github.com/faisalman/ua-parser-js/compare/0.7.31...0.7.33)

---
updated-dependencies:
- dependency-name: ua-parser-js
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-27 08:44:32 +00:00
e0ce8c0770 Development on v2.2.38.dev1 2023-01-24 15:06:43 +08:00
061dec9d75 Release v2.2.37 2023-01-24 15:00:34 +08:00
684a160d99 Merge remote-tracking branch 'origin/master' 2023-01-04 19:03:48 +08:00
21a12c151b Development on v2.2.37dev 2023-01-04 19:03:17 +08:00
17be201862 Merge pull request #1424 from GNS3/dependabot/npm_and_yarn/json5-1.0.2
Bump json5 from 1.0.1 to 1.0.2
2023-01-04 16:43:01 +05:45
57385b84f7 Bump json5 from 1.0.1 to 1.0.2
Bumps [json5](https://github.com/json5/json5) from 1.0.1 to 1.0.2.
- [Release notes](https://github.com/json5/json5/releases)
- [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md)
- [Commits](https://github.com/json5/json5/compare/v1.0.1...v1.0.2)

---
updated-dependencies:
- dependency-name: json5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-04 10:57:08 +00:00
8e4f860b43 Release v2.2.36 2023-01-04 18:56:35 +08:00
fa8fd3c4a2 Add TPM support for Qemu VMs 2023-01-04 18:54:25 +08:00
2c015e695d Add TPM support for Qemu VMs 2023-01-04 18:52:46 +08:00
9fe2b3646b Bump setuptools from 54.2.0 to 65.5.1 in /scripts
Bumps [setuptools](https://github.com/pypa/setuptools) from 54.2.0 to 65.5.1.
- [Release notes](https://github.com/pypa/setuptools/releases)
- [Changelog](https://github.com/pypa/setuptools/blob/main/CHANGES.rst)
- [Commits](https://github.com/pypa/setuptools/compare/v54.2.0...v65.5.1)

---
updated-dependencies:
- dependency-name: setuptools
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-27 15:56:29 +00:00
313966548f Scan master-3.0 branch with Mend 2022-12-27 13:21:53 +08:00
e9e3730618 Release 3.0.0a3 2022-12-27 12:51:03 +08:00
69a7cf44c5 Merge pull request #1420 from GNS3/dependabot/npm_and_yarn/snyk-1.1064.0
Bump snyk from 1.996.0 to 1.1064.0
2022-12-20 20:01:32 +05:45
faec4b07be Bump snyk from 1.996.0 to 1.1064.0
Bumps [snyk](https://github.com/snyk/snyk) from 1.996.0 to 1.1064.0.
- [Release notes](https://github.com/snyk/snyk/releases)
- [Commits](https://github.com/snyk/snyk/compare/v1.996.0...v1.1064.0)

---
updated-dependencies:
- dependency-name: snyk
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-20 13:40:30 +00:00
908c721094 Create SECURITY.md 2022-12-20 21:34:44 +08:00
e3c4188171 Create codeql.yml 2022-12-20 21:32:46 +08:00
f48471cdd4 Merge pull request #1418 from GNS3/dependabot/npm_and_yarn/express-4.18.2
Bump express from 4.17.1 to 4.18.2
2022-12-07 13:17:33 +05:45
50fb05aa8e Bump express from 4.17.1 to 4.18.2
Bumps [express](https://github.com/expressjs/express) from 4.17.1 to 4.18.2.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.17.1...4.18.2)

---
updated-dependencies:
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-07 07:18:48 +00:00
63728091c1 Merge pull request #1417 from GNS3/dependabot/npm_and_yarn/qs-6.5.3
Bump qs from 6.5.2 to 6.5.3
2022-12-07 13:03:17 +05:45
03a417d78c Bump qs from 6.5.2 to 6.5.3
Bumps [qs](https://github.com/ljharb/qs) from 6.5.2 to 6.5.3.
- [Release notes](https://github.com/ljharb/qs/releases)
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.5.2...v6.5.3)

---
updated-dependencies:
- dependency-name: qs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-07 03:40:35 +00:00
c7a7a357c6 Merge pull request #1409 from GNS3/dependabot/npm_and_yarn/socket.io-parser-4.0.5
Bump socket.io-parser from 4.0.4 to 4.0.5
2022-12-03 21:16:35 +08:00
7d95267283 Merge pull request #1416 from GNS3/dependabot/npm_and_yarn/decode-uri-component-0.2.2
Bump decode-uri-component from 0.2.0 to 0.2.2
2022-12-03 21:16:13 +08:00
8a7309bde1 Bump decode-uri-component from 0.2.0 to 0.2.2
Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2.
- [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases)
- [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2)

---
updated-dependencies:
- dependency-name: decode-uri-component
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-03 00:10:34 +00:00
afccf4955b Merge pull request #1412 from GNS3/dependabot/npm_and_yarn/loader-utils-1.4.2
Bump loader-utils from 1.4.1 to 1.4.2
2022-11-16 18:36:13 +08:00
ad57a5f3f7 Bump loader-utils from 1.4.1 to 1.4.2
Bumps [loader-utils](https://github.com/webpack/loader-utils) from 1.4.1 to 1.4.2.
- [Release notes](https://github.com/webpack/loader-utils/releases)
- [Changelog](https://github.com/webpack/loader-utils/blob/v1.4.2/CHANGELOG.md)
- [Commits](https://github.com/webpack/loader-utils/compare/v1.4.1...v1.4.2)

---
updated-dependencies:
- dependency-name: loader-utils
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-16 07:53:15 +00:00
ce252461bd Resolve usage setting in template does not show in project bug 2022-11-16 12:48:15 +05:30
7407ddafd3 Bump socket.io-parser from 4.0.4 to 4.0.5
Bumps [socket.io-parser](https://github.com/socketio/socket.io-parser) from 4.0.4 to 4.0.5.
- [Release notes](https://github.com/socketio/socket.io-parser/releases)
- [Changelog](https://github.com/socketio/socket.io-parser/blob/main/CHANGELOG.md)
- [Commits](https://github.com/socketio/socket.io-parser/compare/4.0.4...4.0.5)

---
updated-dependencies:
- dependency-name: socket.io-parser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-09 22:03:22 +00:00
168de3aecb Development on v2.2.36dev 2022-11-08 19:15:15 +08:00
13f80cdaad Merge remote-tracking branch 'origin/master' 2022-11-08 19:13:48 +08:00
28f32de0b2 Release v2.2.35 2022-11-08 19:13:39 +08:00
a6a4fb401d Merge pull request #1406 from GNS3/dependabot/npm_and_yarn/loader-utils-1.4.1
Bump loader-utils from 1.4.0 to 1.4.1
2022-11-08 18:24:57 +08:00
f62366440c Bump loader-utils from 1.4.0 to 1.4.1
Bumps [loader-utils](https://github.com/webpack/loader-utils) from 1.4.0 to 1.4.1.
- [Release notes](https://github.com/webpack/loader-utils/releases)
- [Changelog](https://github.com/webpack/loader-utils/blob/v1.4.1/CHANGELOG.md)
- [Commits](https://github.com/webpack/loader-utils/compare/v1.4.0...v1.4.1)

---
updated-dependencies:
- dependency-name: loader-utils
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-08 08:31:46 +00:00
fb639c8acd Merge pull request #1405 from GNS3/bugfix-1371
Removed the top banner and logo on the controllers page
2022-10-20 16:16:59 +08:00
6577bfc926 Removed the top banner and logo on the controllers page 2022-10-19 18:29:05 +05:30
135ecbdc33 Merge pull request #1403 from GNS3/dependabot/npm_and_yarn/node-fetch-3.2.10
Bump node-fetch from 3.1.1 to 3.2.10
2022-10-18 22:02:17 +08:00
9ebbbb197b Bump node-fetch from 3.1.1 to 3.2.10
Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 3.1.1 to 3.2.10.
- [Release notes](https://github.com/node-fetch/node-fetch/releases)
- [Commits](https://github.com/node-fetch/node-fetch/compare/v3.1.1...v3.2.10)

---
updated-dependencies:
- dependency-name: node-fetch
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-07 08:23:13 +00:00
f90c074191 Merge pull request #1402 from GNS3/dependabot/npm_and_yarn/snyk-1.996.0
Bump snyk from 1.780.0 to 1.996.0
2022-10-07 10:22:46 +02:00
2d49ca30fa Bump snyk from 1.780.0 to 1.996.0
Bumps [snyk](https://github.com/snyk/snyk) from 1.780.0 to 1.996.0.
- [Release notes](https://github.com/snyk/snyk/releases)
- [Commits](https://github.com/snyk/snyk/compare/v1.780.0...v1.996.0)

---
updated-dependencies:
- dependency-name: snyk
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-06 18:40:49 +00:00
88f44554de Merge pull request #1396 from GNS3/bugfix/1379
Bugfix/1379
2022-09-07 23:58:41 +02:00
872ebdae09 unit test cases for lock/unlock 2022-09-07 14:56:34 +05:30
2bc5fc101b Development on v3.0.0dev5 2022-09-07 00:51:36 +02:00
a5030baf62 Release v3.0.0a2 2022-09-07 00:49:27 +02:00
0c0d27fd6e Resolve issue Lock or unlock all items button does not reflect the nodes status on the web-ui workspace GNS3 3.0.0 alpha 1 2022-09-06 17:03:00 +05:30
e6e7122e33 Merge pull request #1389 from GNS3/bugfix/1383
Resolve missing border style options dash dot dot and invisible for l…
2022-08-29 19:28:24 +02:00
20bd0733f2 Change 'Dash Dot' and 'Dash Dot Dot' border styles 2022-08-29 19:23:48 +02:00
3fa923a9d1 Resolve no border style issue 2022-08-27 00:30:34 +05:30
02bd105b86 Merge branch 'bugfix/1383' of https://github.com/GNS3/gns3-web-ui into bugfix/1383 2022-08-26 11:07:18 +05:30
573d36057b add a condition for getting no border and solid border style 2022-08-26 11:06:57 +05:30
0eaa5c714c Add 'Dash Dot Dot' border type in link style editor 2022-08-25 22:17:52 +02:00
1c8e56274a Resolve stroke dasharray value get undefined issue on web ui 2022-08-25 10:44:36 +05:30
43c689b30a remove qt fixer condition 2022-08-24 18:04:20 +05:30
5bee5deb22 convert the qt value into the stroke dasharray 2022-08-24 16:03:50 +05:30
22ef305e81 Add comments 2022-08-23 23:58:21 +02:00
b66af49137 Modified the stroke dasharray value for creating Dash Dot, Dash Dot Dot border style 2022-08-23 16:53:48 +05:30
fcfcb7566d Merge pull request #1388 from GNS3/bugfix/1381
Highlight the current menu item in dropdown menu on mouse over
2022-08-22 12:57:22 +02:00
6fe15bac9c Resolve lighlight the current menu item in dropdown menu on mouse over only light theme 2022-08-22 16:21:10 +05:30
2f9e735928 Merge branch 'bugfix/1383' of https://github.com/GNS3/gns3-web-ui into bugfix/1383 2022-08-22 16:08:52 +05:30
c5837b237a Resolve inconsistent border styles for device links between GNS3 desktop UI and web-ui 2022-08-22 16:06:33 +05:30
1d13862880 Add hover class for highlight the current menu item in dropdown menu on mouse over 2022-08-19 17:11:26 +05:30
651d4c9d32 Change Invisible to No border 2022-08-18 22:21:48 +02:00
d03bd2a667 Merge pull request #1387 from GNS3/bugfix/1361
Resize pop-up windows and remove pagination arrow buttons
2022-08-18 22:14:31 +02:00
f338a2e33d Resolve missing border style options dash dot dot and invisible for links between devices 2022-08-18 18:25:38 +05:30
15f8fff179 Highlight the current menu item in dropdown menu on mouse over 2022-08-18 17:22:42 +05:30
b3aeb148e7 Resize pop-up windows and remove pagination arrow buttons 2022-08-18 12:09:01 +05:30
85f60fbc1c Merge pull request #1386 from GNS3/bugfix/1362
Remove Inner scroll bar for node configuration
2022-08-18 00:07:37 +02:00
228ea78c41 Remove Inner scroll bar for node configuration 2022-08-17 16:51:08 +05:30
c0f5b022e8 Merge pull request #1385 from GNS3/fix-cve-issues
Fix node-fetch CVE issue
2022-08-12 17:41:57 +02:00
1888174ebf Back to electron 13.6.6 2022-08-12 17:31:11 +02:00
3cf1984b39 Update yarn.lock 2022-08-12 12:51:26 +02:00
eda1099b41 Fix node-fetch and electron CVE issues 2022-08-12 11:51:30 +02:00
b309cf92e6 Merge pull request #1382 from GNS3/bugfix/1377
Resolve Cannot set border style for any shapes in Web-UI GNS3 3.0.0 A…
2022-08-12 11:38:43 +02:00
5da993e2f5 Add Border style placeholder in border style selections 2022-08-12 14:51:01 +05:30
8e197a8831 Resolve Cannot set border style for any shapes in Web-UI GNS3 3.0.0 Alpha 1 issue 2022-08-10 17:09:12 +05:30
c80ff95757 Merge pull request #1380 from GNS3/bugfix/1373
Resolve this issue:
2022-08-10 00:35:08 +02:00
6f3b0d2004 Merge branch 'master-3.0' into bugfix/1373 2022-08-10 00:30:11 +02:00
75cb4f0280 update network adapters list 2022-08-09 15:48:48 +05:30
d4ea702a6a Resolve this issue:
Cannot change network card type on Qemu VM templates from Web-UI
2022-08-09 10:09:34 +05:30
a143f0d037 Merge pull request #1376 from GNS3/bugfix/1372
resolve Uploaded images with long names get truncated in image manage…
2022-08-08 23:51:44 +02:00
7b1bd4a170 resolve Uploaded images with long names get truncated in image manager issue 2022-08-08 09:58:15 +05:30
4ad56ed856 Add more video resolutions to Docker containers using VNC in WebUI. Fixes #1375
(cherry picked from commit 83f7d36e2d)
2022-08-08 00:00:55 +02:00
83f7d36e2d Add more video resolutions to Docker containers using VNC in WebUI. Fixes #1375 2022-08-07 23:59:44 +02:00
c264268ab8 Update accepted image extensions to upload a new image 2022-08-06 13:10:37 +02:00
835f35d996 Development on v3.0.0dev4 2022-08-04 11:01:45 +02:00
9e61e2cb0b Release v3.0.0a1 2022-08-04 10:58:41 +02:00
cb48ea2715 Merge pull request #1370 from GNS3/bugfixRemovedQemuCode/1363
Bugfix removed qemu code/1363
2022-08-03 11:13:45 +02:00
206d25d032 Set platform with first element in the list 2022-08-03 11:08:30 +02:00
0bb4db78a4 Merge branch 'bugfixRemovedQemuCode/1363' of https://github.com/GNS3/gns3-web-ui into bugfixRemovedQemuCode/1363 2022-08-02 09:48:11 +05:30
e8e5ce8bb9 Remove unused code and Add edit platform in node Configurator pop 2022-08-02 09:47:50 +05:30
8424df0e2b Update configurator-qemu.component.ts 2022-08-02 00:16:01 +02:00
24deb65a0b remove Qemu code 2022-08-01 17:23:04 +05:30
4d5a5b8934 . 2022-08-01 17:18:46 +05:30
408130596a Removed QEMU binaries code 2022-08-01 16:57:44 +05:30
8846415959 . 2022-08-01 16:51:38 +05:30
939e4dfd5b Remove QEMU binaries code from add and edit qemu template. 2022-08-01 16:48:15 +05:30
a1163f0274 Modify platform selection on add new Qemu Component 2022-08-01 10:34:41 +05:30
1e0afa2460 Qemu binaries endpoint, Now we are not using in Frontend side 2022-08-01 10:02:42 +05:30
a2338d905b Merge pull request #1368 from GNS3/enhancement/1360
Enhancement/1360
2022-07-30 15:50:09 +02:00
5bb61bd1bc Resolve Unit test case issues 2022-07-30 16:31:05 +05:30
2a44abadd5 Comment Suggestions have been resolved 2022-07-30 08:58:41 +05:30
37684efe79 Fix typo 2022-07-29 09:35:16 +02:00
c8188ebf9c Comment Suggestions have been resolved 2022-07-29 09:57:56 +05:30
060a1f32cc Merge branch 'bugfix/1366' of https://github.com/GNS3/gns3-web-ui into enhancement/1360 2022-07-29 09:29:04 +05:30
387e5366be add a condition for logo menu 2022-07-27 16:04:43 +05:30
83a6da8cdb update script for deploy 2022-07-27 14:29:10 +05:30
fc5b7b6e34 Enable top left corner menu on other page like setting 2022-07-27 11:48:24 +05:30
f75e7e0e10 Merge pull request #1365 from GNS3/enhancement/1355
Enhancement/1355
2022-07-26 23:50:17 +02:00
73bc8cd4b7 Merge pull request #1359 from GNS3/enhancement/1354
Enhancement/1354
2022-07-26 23:40:10 +02:00
7601a75831 Remove '.' 2022-07-26 23:36:01 +02:00
44c0f75628 Complete improvements on preferences page. 2022-07-26 18:05:12 +05:30
3c23e983ec Fix adding Ethernet switch template 2022-07-26 10:38:47 +02:00
9b6e927c7b Remove unused code and change string into
Your selected files => Your selected projects
2022-07-26 09:18:03 +05:30
17901e9ed2 Preferences page improvement 2022-07-26 08:56:31 +05:30
3024f62d4b Merge pull request #1364 from GNS3/use-themed-symbols
Let the controller allocate symbols
2022-07-25 20:46:05 +02:00
bd118fc4bd Use generic symbol names 2022-07-25 10:53:09 +02:00
97a04a2fba Resolve the top-right menu url issue 2022-07-25 11:49:21 +05:30
cffd8d79a9 Caching yarn dependencies 2022-07-23 11:09:49 +02:00
dc94d22822 Finish merging code from master-3.0 2022-07-23 10:58:17 +02:00
c3bfad647f Merge branch 'master-3.0' into enhancement/1354 2022-07-23 00:52:38 +02:00
e2f4d67a30 Merge pull request #1356 from GNS3/enhancement/1353
Enhancement/1353
2022-07-23 00:41:15 +02:00
698ecfa255 Bring back location column 2022-07-23 00:32:45 +02:00
ff1b991d2a Add missing code 2022-07-23 00:01:17 +02:00
714db5e399 Test with Node matrix 2022-07-22 22:36:37 +02:00
c59dd035eb Rename user management server ref to controller 2022-07-22 21:44:41 +02:00
a79d6c916f Merge branch 'master-3.0' into enhancement/1353 2022-07-22 19:28:39 +02:00
e72c6f6609 Merge branch 'Orange-OpenSource-master-3.0' into master-3.0 2022-07-22 19:16:37 +02:00
f6961777f0 Merge branch 'master-3.0' of https://github.com/Orange-OpenSource/gns3-web-ui into Orange-OpenSource-master-3.0 2022-07-22 19:16:10 +02:00
f340586956 Merge branch 'master-3.0' into enhancement/1353 2022-07-22 18:50:51 +02:00
8929d1d659 Finish to rename server to controller 2022-07-22 18:49:36 +02:00
cb7c445a0b Allow raw image in appliance manager 2022-07-22 12:44:18 +02:00
7c343c51be I change commented files 2022-07-22 13:56:16 +05:30
20fe475791 Removed debugger 2022-07-21 17:56:08 +05:30
974e17395b renamed [server] = "server" => [controller]="controller" 2022-07-21 17:35:05 +05:30
4b0499e373 Renamed e2e testing file function or variable 2022-07-21 16:32:09 +05:30
a6661a24c6 Resolve all commented issue 2022-07-21 14:16:55 +05:30
7a79835a8d I renamed servers service file into controller.service 2022-07-21 13:57:09 +05:30
c682db4595 Rename Server file name into controller 2022-07-21 12:41:12 +05:30
ca601e410b Renamed server.id and serverId into controller.id and controllerId and modified the all unit test cases 2022-07-20 14:28:13 +05:30
845f1f1ad8 I complete unit test case to confirmations for delete all project 2022-07-19 18:18:46 +05:30
3bbd755d0a add route 2022-07-19 17:56:31 +05:30
56a22ec5c8 renamed the delete controller tool tip 2022-07-19 17:43:24 +05:30
8c444059ad I have improved on the projects page like this
1.Allow to delete multiple projects at once (similar to what is done in the image manager).
2. Add an export project action in the actions column. The export icon could be improved.
3.Replace "Duplicate" action by "Save project as" (with same icon as on project settings menu).
4.Delete 'Go to system status' button and add 'System status' entry to top right menu.
5.Delete 'Go to preferences' button and add 'Template preferences' entry to top right menu.
6.Add "Image manager" entry to the top right menu
2022-07-19 17:36:19 +05:30
2755f7226b I reanmed server_id into controller_id everywhere in the code as well. 2022-07-19 10:15:09 +05:30
37cc3f3731 rename component name servers and server Into a controllers or controller 2022-07-18 14:56:02 +05:30
99e022bed8 I change all url everywhere like /servers => /controllers and /server/ => /controller/ 2022-07-18 14:01:09 +05:30
f106ca51da Add cosmetic change 2022-07-18 12:29:52 +05:30
9f80df4360 I changed servers string into controllers string on the server page 2022-07-18 12:01:22 +05:30
46c7c66362 Merge pull request #1352 from GNS3/bugfix/remove-warnings
Bugfix/remove warnings
2022-07-15 18:58:27 +02:00
1cd479751f Set --tsconfig "./src/tsconfig.app.json" in package.json 2022-07-15 00:11:28 +02:00
fe7f65c723 add a path of tsconfig.base.json file in tsconfig 2022-07-14 16:10:33 +05:30
eff4ed11d6 I upadate package @synk/protect instead of "snyk": "^1.915.0" 2022-07-14 11:08:26 +05:30
caa444121e Merge pull request #1331 from GNS3/enhancement/1323
Enhancement/1323
2022-07-13 00:17:48 +02:00
6dcacbaa85 Merge branch 'master-3.0' into enhancement/1323 2022-07-13 00:06:13 +02:00
5cc45a39ca Add window.location.assign() for file downloading. 2022-07-12 11:02:15 +05:30
a61c0bfe07 Merge pull request #1346 from GNS3/enhancement/1344
I have  resolved Support for project importation #1344 issue
2022-07-11 12:21:38 +02:00
e24aa1387b Modified the file upload cancel message 2022-07-07 11:09:33 +05:30
9381578657 1. Improve progress bar and I used common progress bar.
2.  Added cancel button
3. And modified the unit test cases
2022-07-06 20:27:44 +05:30
379a39a98f I have resolved Support for project importation #1344 issue 2022-07-06 16:48:29 +05:30
cb11e8b1a2 Merge pull request #1345 from GNS3/enhancement/1342
I have  added node menu  controls confirmation action dialog in
2022-07-05 14:33:42 +02:00
5bddf9c5fc I added reset all console connection control on nodes menu and removed red circle from nodes action confirmation dialog 2022-07-05 08:59:48 +05:30
9c3667277c Resolve/write an unit test case. 2022-07-04 15:03:49 +05:30
576c108da8 I have added node menu controls confirmation action dialog in
Webui missing prompt for mass state changes of project #1342 issue.
2022-07-04 14:40:27 +05:30
7398c07c6b getpath of export project 2022-07-04 11:51:40 +05:30
5fbb4108dd Change File name like .gns3project 2022-06-23 10:09:32 +05:30
b032c88467 Closed export prject window without waiting 2022-06-22 14:08:26 +05:30
50de71dc5a Merge pull request #1334 from GNS3/bugfix/1317
Bugfix/1317
2022-06-21 12:17:13 +02:00
335ea23b6b Resolve issue of waiting for the download to be finished and removed unused code 2022-06-21 12:05:31 +05:30
40ffe84b77 Removed vm_compute_id 2022-06-21 08:59:18 +05:30
174053f297 Development on v2.2.34dev 2022-06-20 20:40:33 +02:00
0e4e124c14 Release v2.2.33 2022-06-20 20:24:06 +02:00
c928ab0342 Merge pull request #1332 from GNS3/bugfix/1329
Fix spice+agent and none console types not supported
2022-06-20 18:38:17 +02:00
a6b65fc8fe Modify the unit test cases 2022-06-20 18:11:55 +05:30
1d75fefb68 Resolve Allow Virtualbox, VMware and Docker templates to be created issue but not fully tested 2022-06-20 18:05:34 +05:30
9efd99dccb Fix spice+agent and none console types not supported. 2022-06-18 18:53:36 +02:00
59667e3a90 Resolve both issues like:
1.Selecting "none" or "lzma" compression type shouldn't pass a compression level of "None".
2.The export window waits for the project to be downloaded when exporting a large project with images
2022-06-17 19:55:24 +05:30
06852d94d7 Resolve cosmetic issues 2022-06-17 14:54:54 +05:30
be831aaf15 Complete export portable project settings and modified the unit test case 2022-06-17 13:06:42 +05:30
3d0e94257f . 2022-06-13 16:40:17 +05:30
50f6cd2191 Write a unit test case for export project dialog box. 2022-06-13 16:28:44 +05:30
06ed79ec78 Add compression methods short form according to API endpoint and resolve build error 2022-06-13 12:11:49 +05:30
5c1ce1a5ab I complete export project UI and bind export portable project API 2022-06-10 19:20:02 +05:30
ea76493ab8 Merge branch 'master-3.0' into enhancement/1323 2022-06-10 11:00:38 +05:30
7d706a39f1 Merge pull request #1326 from GNS3/bugfix/imageProgressBar
Bugfix/image progress bar
2022-06-10 12:08:53 +08:00
7e43dc77cb Merge pull request #1322 from GNS3/dependabot/npm_and_yarn/async-2.6.4
Bump async from 2.6.3 to 2.6.4
2022-06-10 00:33:25 +08:00
f7696e5453 Create dynamic progress bar 2022-06-09 20:42:08 +05:30
726562d615 Modified progrss bar handler 2022-06-08 18:51:08 +05:30
78f77dc881 Update dependencies like autoprefixer 2022-06-08 09:25:43 +05:30
1787db7c6d Resolve vulnerabilities issue 2022-06-07 23:45:33 +05:30
088b128b57 Resolve progress bar and add dependencies in spec file 2022-06-07 11:19:01 +05:30
b7e314deeb Resolve build issue 2022-06-07 09:03:13 +05:30
fd95c2d43c I added export portable project dialog box 2022-06-07 08:58:51 +05:30
52f10b0c53 . 2022-06-06 14:20:30 +05:30
ecf729fc56 I have resolved image progress bar and undefined event issue 2022-06-06 13:43:39 +05:30
d7752a4d7b Bump async from 2.6.3 to 2.6.4
Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4.
- [Release notes](https://github.com/caolan/async/releases)
- [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md)
- [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4)

---
updated-dependencies:
- dependency-name: async
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-01 07:52:58 +00:00
40df0fe1ee Merge pull request #1321 from GNS3/dependabot/npm_and_yarn/ejs-3.1.8
Bump ejs from 3.1.6 to 3.1.8
2022-06-01 14:52:11 +07:00
d5bd84234d Bump ejs from 3.1.6 to 3.1.8
Bumps [ejs](https://github.com/mde/ejs) from 3.1.6 to 3.1.8.
- [Release notes](https://github.com/mde/ejs/releases)
- [Changelog](https://github.com/mde/ejs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mde/ejs/compare/v3.1.6...v3.1.8)

---
updated-dependencies:
- dependency-name: ejs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-01 07:13:32 +00:00
a9a7ecf3e7 Merge pull request #1320 from GNS3/dependabot/npm_and_yarn/eventsource-1.1.1
Bump eventsource from 1.1.0 to 1.1.1
2022-06-01 14:12:30 +07:00
5dc5a953e6 Bump eventsource from 1.1.0 to 1.1.1
Bumps [eventsource](https://github.com/EventSource/eventsource) from 1.1.0 to 1.1.1.
- [Release notes](https://github.com/EventSource/eventsource/releases)
- [Changelog](https://github.com/EventSource/eventsource/blob/master/HISTORY.md)
- [Commits](https://github.com/EventSource/eventsource/compare/v1.1.0...v1.1.1)

---
updated-dependencies:
- dependency-name: eventsource
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-01 01:20:11 +00:00
b430ab9a1c Merge pull request #1318 from GNS3/enhancement-JWT/1228
I have modified the JWT Interceptor and added refresh token functiona…
2022-05-31 15:58:18 +07:00
18a014d739 update 2022-05-31 14:12:18 +05:30
07c505187d update user case 2 2022-05-31 13:40:00 +05:30
eb07abe786 Resolve/modified remember me check box user cases 2022-05-31 13:18:52 +05:30
78da4f0efa I have added Remember me tickbox on login component and I resolve an error just before auto re-login 2022-05-31 10:47:32 +05:30
0185dbd8af I have modified the JWT Interceptor and added refresh token functionality 2022-05-27 12:57:56 +05:30
83fa40907e Merge pull request #1316 from GNS3/enhancement/1307
Add common process bar when uploading IOS and IOU images
2022-05-24 22:57:02 +07:00
0ae25095a8 Resolve loader error 2022-05-24 19:54:26 +05:30
ea1e280e66 I resoleved loader error and message 2022-05-24 15:25:06 +05:30
667c8fc7f0 I added a common process bar when IOS and IOU image file uplading 2022-05-24 09:40:46 +05:30
36482c7a96 Merge pull request #1315 from GNS3/bugfix/1314
Bugfix/1314
2022-05-23 15:43:58 +07:00
7aae84b2be . 2022-05-23 12:44:23 +05:30
7049e05c91 I have removed static version (v3) and Now, we are using environment file for current version 2022-05-23 12:40:09 +05:30
e7e55e7eaf Merge pull request #1313 from GNS3/enhancement/1308
I have improved progress bar when uploading files
2022-05-23 13:09:06 +07:00
65c48769b7 Merge pull request #1312 from GNS3/bugfix/1307
I added  authentication token for allow IOU or IOS templates to be cr…
2022-05-23 12:53:31 +07:00
2816202ee5 Changed uppercase to lowercase 2022-05-23 11:15:53 +05:30
434bf57cd1 I removed static version and define in evviroment file 2022-05-23 11:06:00 +05:30
0120a1281c I have modified the file uploading url 2022-05-21 12:30:00 +05:30
824833e621 added Unit test case dependencies 2022-05-20 17:23:14 +05:30
23fe8ae9b8 I have improved progress bar when uploading files 2022-05-20 17:08:43 +05:30
4f90a6d1fd I added authentication token for allow IOU or IOS templates to be created 2022-05-16 18:39:19 +05:30
f055836f44 Merge pull request #1310 from GNS3/bugfix/all-CVE
Bugfix/all CVE
2022-05-14 22:01:25 +07:00
88e1cb66eb I have removed deprecated async() in @angular/core/testing Angular API and Modified some unit test case 2022-05-13 23:38:43 +05:30
2f0cdfc33c I resolved all unit test case 2022-05-13 13:08:13 +05:30
6152f68acf I have changed the unit test case according to Angular API 2022-05-06 19:09:43 +05:30
8ec2b806a9 Merge pull request #1306 from GNS3/bugfix/1223
I removed electron specific Ui / code
2022-05-06 11:56:02 +07:00
dc382348b8 Merge branch 'master-3.0' into bugfix/all-CVE 2022-05-02 16:27:20 +05:30
05d980e6e3 I changed API for dynamic unit cases 2022-05-02 16:24:47 +05:30
fbfb6b7152 Merge pull request #1305 from GNS3/bugFix-1300
Bug fix 1300
2022-05-02 17:30:46 +07:00
834173201b I resolved CVE issues and update yarn lock file 2022-05-02 13:25:18 +05:30
49693efc04 update angular cdk 2022-04-29 17:37:42 +05:30
29f1eb92d8 update angular version 2022-04-29 17:26:12 +05:30
d5287bfb8e I have resolved suggested comments. 2022-04-29 10:20:49 +05:30
a7e637a466 I added checksum key instead of md5sum key 2022-04-28 17:55:15 +05:30
32c78450a2 Development on 2.2.33dev 2022-04-27 17:53:00 +07:00
82feb9aa92 Release web UI 2.2.32 2022-04-27 17:48:47 +07:00
a08a7e1476 Fix for issue in docker configurator 2022-04-27 10:35:54 +02:00
f71a8edc3c I removed electron specific Ui / code 2022-04-26 18:44:14 +05:30
0df6294cc7 I removed unwanted code 2022-04-26 16:51:02 +05:30
b5e4972bdb Fix for #1303 2022-04-26 11:24:00 +02:00
7ff43eb582 yarn.lock file added 2022-04-26 14:15:30 +05:30
236a9d11b3 I resolved / Fixed add new template uploading image issue 2022-04-26 13:37:43 +05:30
dc5c0d3d94 Merge pull request #1302 from GNS3/bugfix/1298
Fix capture file name
2022-04-26 14:52:49 +07:00
dc2c4cbbbe fix import for routing and modules 2022-04-25 15:55:25 +02:00
a074bbc617 Merge remote-tracking branch 'upstream/master-3.0' into master-3.0
# Conflicts:
#	src/app/app-routing.module.ts
#	src/app/app.module.ts
2022-04-25 15:50:29 +02:00
4c11b6c012 . 2022-04-22 10:16:38 +05:30
04936cfc8d Fix generated capture file is not valid 2022-04-21 13:53:27 +07:00
a26a08cb20 Added yarn.lock 2022-04-20 18:12:22 +05:30
7ac6b1ef76 I removed commented code 2022-04-20 17:36:30 +05:30
c929f49aa2 Merge pull request #1299 from GNS3/bugfix/1161
Resolved "Remove GNS3 VM specific code #1161"
2022-04-19 18:15:24 +07:00
d00e56627f Removed commented code 2022-04-19 16:28:59 +05:30
a172b7d41f update deprecated angular API's 2022-04-19 13:30:15 +05:30
f7ba01211e Resolved "Remove GNS3 VM specific code #1161" 2022-04-18 18:01:41 +05:30
002569ed75 update angular material 2022-04-18 16:50:54 +05:30
f23315fd75 update angular cli 2022-04-18 16:29:42 +05:30
2121d29a9e Merge pull request #1171 from GNS3/Change-link-style
Change link style
2022-04-18 14:42:43 +07:00
834cdecd80 Added a comment for location.reload() function 2022-04-18 12:27:43 +05:30
78f2b76a14 I added location.reload() for reload hole page 2022-04-18 12:06:23 +05:30
978b473e8e Merge pull request #1297 from GNS3/bugfix/1201
I resolved " Remove Qemu legacy networking code
2022-04-14 15:00:53 +07:00
d652ae0bbb I resolved " Remove Qemu legacy networking code
#1201".
2022-04-13 19:16:18 +05:30
50a5307d03 Merge remote-tracking branch 'origin/Change-link-style' into Change-link-style
# Conflicts:
#	package.json
#	src/ReleaseNotes.txt
#	src/app/components/project-map/context-menu/context-menu.component.html
#	yarn.lock
2022-04-13 20:03:10 +07:00
408184874c Changing link style 2022-04-13 19:40:48 +07:00
a8043f9423 Update ethernet-link.ts 2022-04-13 19:40:48 +07:00
66cd41018e Updating links data source added 2022-04-13 19:40:48 +07:00
d43e6649c7 Update serial-link.ts 2022-04-13 19:40:48 +07:00
5cb3c43e88 Link styling for ethernet links 2022-04-13 19:40:48 +07:00
97974339b9 Changing style for links added 2022-04-13 19:40:48 +07:00
a1228d009b Edit link style dialog created 2022-04-13 19:40:47 +07:00
67c564caa7 Merge pull request #1291 from GNS3/enhancement/1284
Enhancement/1284
2022-04-13 17:45:34 +07:00
258e9f02c2 Delete multiple images in one go if I select 2 or more images 2022-04-13 15:58:10 +05:30
fcc03f5ad0 Merge pull request #1288 from GNS3/bugfix/1287
I resolved "#1287 Cannot add Qemu template manually"
2022-04-13 16:15:49 +07:00
8728056b8d Merge pull request #1296 from GNS3/dependabot/npm_and_yarn/plist-3.0.5
Bump plist from 3.0.4 to 3.0.5
2022-04-13 16:15:02 +07:00
138d1f8552 Merge pull request #1283 from GNS3/dependabot/npm_and_yarn/electron-13.6.6
Bump electron from 13.6.1 to 13.6.6
2022-04-13 16:14:26 +07:00
5e65aff228 I resolved "Cannot add Qemu template manually bug
#1287"
2022-04-13 13:47:03 +05:30
dc31d51844 Bump plist from 3.0.4 to 3.0.5
Bumps [plist](https://github.com/TooTallNate/node-plist) from 3.0.4 to 3.0.5.
- [Release notes](https://github.com/TooTallNate/node-plist/releases)
- [Changelog](https://github.com/TooTallNate/plist.js/blob/master/History.md)
- [Commits](https://github.com/TooTallNate/node-plist/commits)

---
updated-dependencies:
- dependency-name: plist
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-12 10:07:20 +00:00
def33a353d Bump minimist from 1.2.5 to 1.2.6 (#1294)
Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6)

---
updated-dependencies:
- dependency-name: minimist
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-12 12:06:10 +02:00
c86769dd4f I added install appliances confirmation dialog, Unit test cases for upload and delete file and suggested changes. 2022-04-12 15:03:40 +05:30
147cae1313 I completed enhancement work #1284 Image manager 2022-04-05 17:10:21 +05:30
97d1bc7596 I resolved "#1287 Cannot add Qemu template manually" 2022-04-04 12:15:56 +05:30
fa0531644d Merge pull request #1290 from GNS3/bugfix/1286
Bugfix/1286
2022-04-01 23:26:15 +08:00
ab89aa8ec8 Resolved "New template dialog is not populated
#1286 "
2022-04-01 16:46:04 +05:30
8adad9c13f I resolved "#1287 cannot open Qemu template manually including adding a Qemu template during step3. 2022-04-01 12:55:14 +05:30
316fe735fc I resolved "#1287 Cannot add Qemu template manually" 2022-03-31 17:32:29 +05:30
f91a5f657f Merge pull request #1285 from GNS3/bugfix/1282
I resolved "Cannot open new template dialog #1282"
2022-03-31 12:47:43 +08:00
6a09772459 I resolved "Cannot open new template dialog #1282" 2022-03-29 18:33:14 +05:30
48bb035b34 Suspend a link or node show status change (#1281)
* Suspend a link or node show status change

* Show the suspended status when we start a packet capture on the link.
2022-03-28 10:02:00 +02:00
ed3db2ea4d Bump electron from 13.6.1 to 13.6.6
Bumps [electron](https://github.com/electron/electron) from 13.6.1 to 13.6.6.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/main/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v13.6.1...v13.6.6)

---
updated-dependencies:
- dependency-name: electron
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-25 18:37:29 +00:00
9558b2137f Show the suspended status when we start a packet capture on the link. 2022-03-25 11:34:55 +05:30
c2410f0933 Suspend a link or node show status change 2022-03-24 17:28:42 +05:30
2f9999b41c Merge pull request #1276 from GNS3/bugfix/1274
Link added
2022-03-23 17:45:48 +10:00
96a11384a0 removed !important 2022-03-23 12:33:35 +05:30
c938c3a8ca Link added 2022-03-22 12:07:13 +05:30
93188f2aec Add methods documentation 2022-03-21 09:42:40 +01:00
f9cc7f3883 add tests on filter-complete.pipe.ts 2022-03-21 07:56:04 +01:00
160b0eccc0 add tests on display-path.pipe.ts 2022-03-21 07:56:03 +01:00
0b2128f00b add tests on filter-complete.pipe.ts 2022-03-21 07:55:35 +01:00
02c323463c add tests on PermissionPath.ts 2022-03-21 07:55:35 +01:00
067c8a00ec add tests on add-permission-line.component.ts 2022-03-21 07:55:35 +01:00
7d1ed62f30 add tests on method-button.component.ts 2022-03-21 07:55:35 +01:00
349666dcc1 tests on ApiInformationService 2022-03-18 15:13:26 +01:00
3ad28e6d09 tests on display path pipe 2022-03-18 15:11:56 +01:00
5aa7afe15c tests on permission filter pipe 2022-03-18 14:56:37 +01:00
7ad6de2256 Merge pull request #1261 from GNS3/dependabot/npm_and_yarn/url-parse-1.5.10
Bump url-parse from 1.5.3 to 1.5.10
2022-03-13 20:20:17 +10:00
c5434a4e99 disable all unused tests 2022-03-07 09:40:41 +01:00
87a0b951a7 add paths to resolve modules declaration for tests 2022-03-07 09:40:11 +01:00
6dcc5cdc2e Bump url-parse from 1.5.3 to 1.5.10
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.3 to 1.5.10.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.3...1.5.10)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-07 01:08:02 +00:00
089e66a02b Bump karma from 6.3.15 to 6.3.16 (#1263)
Bumps [karma](https://github.com/karma-runner/karma) from 6.3.15 to 6.3.16.
- [Release notes](https://github.com/karma-runner/karma/releases)
- [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md)
- [Commits](https://github.com/karma-runner/karma/compare/v6.3.15...v6.3.16)

---
updated-dependencies:
- dependency-name: karma
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-03-07 01:16:14 +01:00
0154d123a9 add missing import 2022-02-28 13:51:57 +01:00
fc0fdd2e51 bugfix, Permission Link display correctly 2022-02-28 13:51:57 +01:00
b6b9d735f5 update user password + confirm password validator 2022-02-28 13:51:57 +01:00
8df255ebc3 Bug fix, paginators and sort for user group and role lists 2022-02-28 13:51:57 +01:00
02285265e3 add user to groups when creating user + refactor add users when creating group 2022-02-28 13:51:57 +01:00
c400ad551e bug fix, display correctly http error message inside Toaster service 2022-02-28 13:51:57 +01:00
5102039dbd User and group details, add paginator and filter on permissions list 2022-02-28 13:51:57 +01:00
7bff9b40de New group, add user to group functionality 2022-02-28 13:51:57 +01:00
707f5b6c7f Permission object, display object name instead of uuid 2022-02-28 13:51:56 +01:00
6a573110e8 Permissions management, add paginator and filters 2022-02-28 13:51:10 +01:00
0d5f11dfc1 user details, Add/remove permissions 2022-02-28 13:51:10 +01:00
65f1d45dc5 Permission management, create add permission component and apiInformation service, which parse swagger api information schema 2022-02-28 13:51:10 +01:00
2664911455 Add permission management 2022-02-28 13:50:15 +01:00
65172c18b5 Group details, can add role to group 2022-02-28 13:50:11 +01:00
920154e7b9 Add role management 2022-02-28 13:50:11 +01:00
36e39f908b menu, disable management entry if no server was selected 2022-02-28 13:50:11 +01:00
39627c28c8 Management refactoring, creating unique entry in menu for management 2022-02-28 13:50:11 +01:00
b8b7e4d151 group detail, members none case-sensitive sorted a to z 2022-02-28 13:50:11 +01:00
fb7845bbce group details, add filter on members list 2022-02-28 13:50:10 +01:00
a7f6743860 group details, add members pagination 2022-02-28 13:50:10 +01:00
a4e8dee2e1 group detail, page refactoring 2022-02-28 13:50:10 +01:00
4911b0da66 create permission service 2022-02-28 13:50:10 +01:00
6122801f90 group management, add group details 2022-02-28 13:50:10 +01:00
c3f3fafbef user management detail refactor 2022-02-28 13:50:10 +01:00
cbeca9d0ca user management, create edit user detail dialog 2022-02-28 13:50:10 +01:00
eb5437d005 group management, add multiple delete 2022-02-28 13:50:10 +01:00
2e2a59f6f2 group management, add sort on all columns 2022-02-28 13:50:10 +01:00
596a11210f user management, add paginator 2022-02-28 13:50:10 +01:00
11029db956 remove is_admin field in user management list and add field validation on create a new user 2022-02-28 13:50:10 +01:00
0c0d77e220 user management, add multiple user selection 2022-02-28 13:50:10 +01:00
4e207d270e user management, add delete button on each row 2022-02-28 13:50:10 +01:00
9546ed94fe group management, add trash icon on each group to delete it 2022-02-28 13:50:10 +01:00
7219f02783 group management, add create new group functionality 2022-02-28 13:50:10 +01:00
2ea79aaa27 group management, add search filter with group name 2022-02-28 13:50:10 +01:00
e37f1e97fa Add group management list 2022-02-28 13:50:10 +01:00
4e2d043561 Add search filter to user management 2022-02-28 13:50:10 +01:00
d46502b804 Add User management and group management template 2022-02-28 13:50:10 +01:00
da848d42af Release web UI 2.2.30 2022-02-16 01:02:04 +01:00
6b08fb8d9a Bump follow-redirects from 1.14.7 to 1.14.8 (#1254)
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.7 to 1.14.8.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.7...v1.14.8)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-16 00:49:50 +01:00
8874e7efbc Refreshing UI (#1253)
* Update font-fixer.ts

* Update interface-status.ts

* Updating project map UI

* Updating templates menu

* Fixing tests

* Update karma.conf.js
2022-02-08 23:48:45 +01:00
2b834768c6 Update karma.conf.js 2022-02-08 23:47:22 +01:00
108f95de59 Refreshing token implemented in LoginGuard (#1246) 2022-02-08 14:06:20 +01:00
eabdda0e74 Update dependency karma to v6.3.14 (#1251)
Co-authored-by: whitesource-for-github-com[bot] <whitesource-for-github-com[bot]@users.noreply.github.com>
2022-02-08 14:05:07 +01:00
9e3f667767 Update dependency karma to v6.3.9 (#1247)
Co-authored-by: whitesource-for-github-com[bot] <whitesource-for-github-com[bot]@users.noreply.github.com>
2022-01-31 14:07:59 +01:00
8898141bc1 Bump nanoid from 3.1.30 to 3.2.0 (#1236)
Bumps [nanoid](https://github.com/ai/nanoid) from 3.1.30 to 3.2.0.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.1.30...3.2.0)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-31 10:42:53 +01:00
c8753ed45c Bump node-fetch from 3.0.0 to 3.1.1 (#1237)
Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 3.0.0 to 3.1.1.
- [Release notes](https://github.com/node-fetch/node-fetch/releases)
- [Changelog](https://github.com/node-fetch/node-fetch/blob/main/docs/CHANGELOG.md)
- [Commits](https://github.com/node-fetch/node-fetch/compare/v3.0.0...v3.1.1)

---
updated-dependencies:
- dependency-name: node-fetch
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-31 10:22:43 +01:00
d496d8dc64 Bump log4js from 6.3.0 to 6.4.0 (#1235)
Bumps [log4js](https://github.com/log4js-node/log4js-node) from 6.3.0 to 6.4.0.
- [Release notes](https://github.com/log4js-node/log4js-node/releases)
- [Changelog](https://github.com/log4js-node/log4js-node/blob/master/CHANGELOG.md)
- [Commits](https://github.com/log4js-node/log4js-node/compare/v6.3.0...v6.4.0)

---
updated-dependencies:
- dependency-name: log4js
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-31 00:21:55 +01:00
a8f9b6948d Bump follow-redirects from 1.14.5 to 1.14.7 (#1233)
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.5 to 1.14.7.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.5...v1.14.7)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-31 00:01:23 +01:00
ccd3ff61f1 Release web UI 2.2.29 2022-01-07 20:04:51 +01:00
60a9e45e4a Update notification.service.ts 2021-12-29 13:42:08 +01:00
fa22ce5d0f Unisolate action added 2021-12-28 16:52:52 +01:00
8b177013d1 Updates from main branch (#1227)
* Update ReleaseNotes.txt

* Release 2.2.22

* Updating dependencies

* Update package.json

* Update project-map.component.ts

* Updating dependencies

* Update main.yml

* Bump postcss from 7.0.35 to 7.0.36

Bumps [postcss](https://github.com/postcss/postcss) from 7.0.35 to 7.0.36.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/7.0.35...7.0.36)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump ws from 6.2.1 to 6.2.2

Bumps [ws](https://github.com/websockets/ws) from 6.2.1 to 6.2.2.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/6.2.1...6.2.2)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* fix: package.json & yarn.lock to reduce vulnerabilities

The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-JSZIP-1251497

* Updating packages to latest versions

* Release 2.2.23

* Updating dependencies

* Bump tar from 6.1.0 to 6.1.6

Bumps [tar](https://github.com/npm/node-tar) from 6.1.0 to 6.1.6.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v6.1.0...v6.1.6)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump url-parse from 1.5.1 to 1.5.3

Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.1 to 1.5.3.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.1...1.5.3)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Updating dependencies

* Removing vulnerabilities

* Updating angular-devkit/build-angular

* Update yarn.lock

* Fix for https://github.com/GNS3/gns3-web-ui/issues/1184

* Release 2.2.24

* Option to access system status from servers page

* Updating dependencies

* Release 2.2.25

* Update package.json

* Bump nth-check from 2.0.0 to 2.0.1

Bumps [nth-check](https://github.com/fb55/nth-check) from 2.0.0 to 2.0.1.
- [Release notes](https://github.com/fb55/nth-check/releases)
- [Commits](https://github.com/fb55/nth-check/compare/v2.0.0...v2.0.1)

---
updated-dependencies:
- dependency-name: nth-check
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Fix for theming

* Update template.component.ts

* Updating dependencies

* Update yarn.lock

* Update yarn.lock

* Update yarn.lock

* Release 2.2.26

* Update package.json

* show upload file progress when uploading qemu template.

* fix progress bar incorrect when upload file twice

* Updating packages

* Updating packages

* Update package.json

* Update yarn.lock

* updating packages

* Updating angular material

* Fix for error with component factory after migration to angular v13

* Update yarn.lock

* Update .gitignore

* Fix for builds on github

* Removing electron builder

* Removing sentry/cli

* Updating dependencies

* Release web UI 2.2.27

* Reverting updates

* Angular version set to 12.2.12

* Updating snyk version

* Update configurator-docker.component.ts

* Update new-template-dialog.component.html

* Mouse pointer #1219

* Update topology-summary.component.ts

* Update project-map.component.ts

* Update project-map.component.ts

* Release web UI 2.2.28

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: snyk-bot <snyk-bot@snyk.io>
Co-authored-by: potats0 <potatso>
2021-12-28 14:39:15 +01:00
6353207d40 Isolate action added 2021-12-28 00:18:28 +01:00
abf9d8b387 Release web UI 2.2.28 2021-12-13 23:40:20 +01:00
f8cc654539 Update project-map.component.ts 2021-12-13 23:34:03 +01:00
56554f6d0c Update project-map.component.ts 2021-12-13 23:22:15 +01:00
7be137dc1c Merge pull request #1225 from GNS3/Remember-topology/servers-window-position
Update topology-summary.component.ts
2021-12-12 12:46:39 -08:00
1b45a2284d Merge pull request #1224 from GNS3/Mouse-pointer-#1219
Mouse pointer #1219
2021-12-12 12:46:11 -08:00
6b4f5186d0 Update topology-summary.component.ts 2021-12-09 02:27:19 +01:00
c3f2ebad0c Mouse pointer #1219 2021-12-08 19:18:38 +01:00
249f63a97a Update new-template-dialog.component.html 2021-12-07 20:03:36 +01:00
cc6b8cd28c Update configurator-docker.component.ts 2021-12-07 15:51:26 +01:00
96928d86f8 Updating snyk version 2021-12-02 00:51:24 +01:00
f721bd0d26 Link to the API doc in the menu 2021-11-10 16:00:52 +01:00
44c530d1b5 Update .gitignore 2021-11-10 12:32:33 +01:00
a213a7aca1 Angular version set to 12.2.12 2021-11-10 00:12:32 +01:00
fc1d17b921 Reverting updates 2021-11-09 23:28:52 +01:00
0ddf4f6e95 Release web UI 2.2.27 2021-11-08 18:09:29 +01:00
8d466d655e Updating dependencies 2021-11-08 18:03:17 +01:00
2c7dd5f179 Removing sentry/cli 2021-11-08 17:48:58 +01:00
64999f2b72 Removing electron builder 2021-11-08 17:36:51 +01:00
253c65b8c1 Fix for builds on github 2021-11-08 16:49:45 +01:00
74c1a82524 Update .gitignore 2021-11-08 13:41:11 +01:00
4e42bd7a54 Merge pull request #1199 from potats0/master
add progress bar when uploading qemu disks
2021-11-07 13:54:30 -08:00
891e65b094 Update yarn.lock 2021-11-07 18:46:57 +01:00
c808477914 Fix for error with component factory after migration to angular v13 2021-11-07 18:32:34 +01:00
8503a17187 Updating angular material 2021-11-07 18:24:48 +01:00
8afea664ff updating packages 2021-11-07 17:28:04 +01:00
538ae8b7fb Update yarn.lock 2021-11-07 16:58:08 +01:00
370694f3b0 Update package.json 2021-11-07 16:55:02 +01:00
5175b3beac Updating packages 2021-11-07 16:48:17 +01:00
2df1956dbc Updating packages 2021-11-02 22:39:08 +01:00
56384fbcc0 fix progress bar incorrect when upload file twice 2021-10-14 12:22:15 +08:00
15faca6d89 show upload file progress when uploading qemu template. 2021-10-14 10:56:17 +08:00
4142144d4d Update package.json 2021-10-06 18:08:56 +02:00
e2e87db039 Release 2.2.26 2021-10-06 17:09:46 +02:00
c868f08a25 Update yarn.lock 2021-10-06 17:03:49 +02:00
9aedd410bb Update yarn.lock 2021-10-06 14:02:26 +02:00
5fb76d7d11 Update yarn.lock 2021-10-06 13:52:57 +02:00
a7c343aa7c Merge pull request #1194 from GNS3/dependabot/npm_and_yarn/nth-check-2.0.1
Bump nth-check from 2.0.0 to 2.0.1
2021-10-06 04:47:47 -07:00
cfe8c4760b Updating dependencies 2021-10-06 13:34:19 +02:00
7cbcc84cc1 Update template.component.ts 2021-10-06 12:57:40 +02:00
357e478fb8 Fix for theming 2021-10-06 12:44:23 +02:00
063d8c9dc7 Bump nth-check from 2.0.0 to 2.0.1
Bumps [nth-check](https://github.com/fb55/nth-check) from 2.0.0 to 2.0.1.
- [Release notes](https://github.com/fb55/nth-check/releases)
- [Commits](https://github.com/fb55/nth-check/compare/v2.0.0...v2.0.1)

---
updated-dependencies:
- dependency-name: nth-check
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-22 12:57:14 +00:00
63ecacb6b6 Update package.json 2021-09-14 12:01:56 +02:00
6cecacf611 Release 2.2.25 2021-09-14 10:22:36 +02:00
c389404e58 Updating dependencies 2021-09-14 10:06:47 +02:00
b1aba60410 Option to access system status from servers page 2021-09-14 01:01:46 +02:00
4cd9f77732 Release 2.2.24 2021-08-25 11:52:56 +02:00
1619c3ec05 Fix for https://github.com/GNS3/gns3-web-ui/issues/1184 2021-08-24 17:07:47 +02:00
b33a01e225 Update yarn.lock 2021-08-24 15:12:51 +02:00
353740376e Updating angular-devkit/build-angular 2021-08-24 14:53:51 +02:00
9fe899e4df Removing vulnerabilities 2021-08-24 14:39:02 +02:00
dd1f16c53d Merge pull request #1187 from GNS3/dependabot/npm_and_yarn/url-parse-1.5.3
Bump url-parse from 1.5.1 to 1.5.3
2021-08-24 05:00:53 -07:00
3fa52d3c9c Updating dependencies 2021-08-24 13:55:15 +02:00
bc5dd0271f Bump url-parse from 1.5.1 to 1.5.3
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.1 to 1.5.3.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.1...1.5.3)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-24 11:04:39 +00:00
81ca3e2af2 Merge pull request #1183 from GNS3/dependabot/npm_and_yarn/tar-6.1.6
Bump tar from 6.1.0 to 6.1.6
2021-08-24 04:03:51 -07:00
d7a0d2f69a Bump tar from 6.1.0 to 6.1.6
Bumps [tar](https://github.com/npm/node-tar) from 6.1.0 to 6.1.6.
- [Release notes](https://github.com/npm/node-tar/releases)
- [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/npm/node-tar/compare/v6.1.0...v6.1.6)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-04 09:11:45 +00:00
8f0bbafa72 Updating dependencies 2021-08-04 11:10:41 +02:00
08f7456bb1 Release 2.2.23 2021-08-04 10:51:04 +02:00
752246c629 Merge branch 'master' of https://github.com/GNS3/gns3-web-ui 2021-07-30 10:58:16 +02:00
2709d8d102 Updating packages to latest versions 2021-07-30 10:57:19 +02:00
d949f536ab Merge pull request #1178 from GNS3/snyk-fix-350c45c5ff2d382873ad7318d0553fa0
[Snyk] Security upgrade snyk from 1.630.0 to 1.667.0
2021-07-30 01:25:15 -07:00
42d8bcebbb fix: package.json & yarn.lock to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-JSZIP-1251497
2021-07-28 08:00:09 +00:00
f2b70d562d Changing link style 2021-07-21 12:30:51 +02:00
6dd81b2406 Merge branch 'master' into Change-link-style 2021-06-22 10:20:10 +02:00
a153e97f55 Merge pull request #1169 from GNS3/dependabot/npm_and_yarn/ws-6.2.2
Bump ws from 6.2.1 to 6.2.2
2021-06-22 10:15:11 +02:00
7953a86fd9 Bump ws from 6.2.1 to 6.2.2
Bumps [ws](https://github.com/websockets/ws) from 6.2.1 to 6.2.2.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/6.2.1...6.2.2)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-22 07:57:45 +00:00
5c426ad822 Merge pull request #1170 from GNS3/dependabot/npm_and_yarn/postcss-7.0.36
Bump postcss from 7.0.35 to 7.0.36
2021-06-22 09:56:50 +02:00
a9b7e09da4 Merge pull request #1173 from GNS3/Contextual-menu-position
Contextual menu position
2021-06-22 09:43:02 +02:00
a2085e846a Merge pull request #1168 from GNS3/Remove-GNS3-VM-specific-code
Remove gns3 vm specific code
2021-06-22 09:34:03 +02:00
aa5a328f44 Merge pull request #1172 from GNS3/Loading-symbols-after-migrating-to-v3
Loading symbols after migrating to v3
2021-06-22 09:31:55 +02:00
02c5c85148 Update symbol.service.spec.ts 2021-06-21 15:45:02 +02:00
a7528fe990 Loading symbols after migrating to v3 2021-06-21 15:37:43 +02:00
758f680a28 Update settings.component.html 2021-06-21 13:32:43 +02:00
ac265a90bf Update ethernet-link.ts 2021-06-17 14:45:05 +02:00
44e1b3d656 Updating links data source added 2021-06-17 13:21:42 +02:00
a93125cdd7 Update serial-link.ts 2021-06-17 13:01:36 +02:00
34b974461b Link styling for ethernet links 2021-06-17 12:43:51 +02:00
a2a3f542e6 Changing style for links added 2021-06-16 19:19:39 +02:00
f7e07851f7 Edit link style dialog created 2021-06-16 18:44:12 +02:00
60bae5db3c Bump postcss from 7.0.35 to 7.0.36
Bumps [postcss](https://github.com/postcss/postcss) from 7.0.35 to 7.0.36.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/7.0.35...7.0.36)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-15 19:16:01 +00:00
d6e5dee1aa Update main.yml 2021-06-15 15:32:59 +02:00
cb101e8202 Updating dependencies 2021-06-15 15:25:19 +02:00
0124018b02 Update project-map.component.ts 2021-06-15 14:56:00 +02:00
04fdcc6893 Update package.json 2021-06-14 16:12:32 +02:00
62c94275a9 Removing data from appliance dialog 2021-06-10 16:21:49 +02:00
5270134626 Merge branch 'master-3.0' into Remove-GNS3-VM-specific-code 2021-06-10 15:55:59 +02:00
21dfa56b17 Removing fields related to gns3 vm from templates 2021-06-10 15:50:13 +02:00
8eda2ddcea Merge pull request #1165 from GNS3/Add-navigation-to-user-management-page
Add navigation to user management page
2021-06-10 14:50:28 +02:00
4c7d0b317e Fix for unit tests 2021-06-10 14:09:02 +02:00
8e93fa9d36 Update projects.component.spec.ts 2021-06-10 13:56:26 +02:00
2b81d72232 Removing components related to gns3vm 2021-06-10 13:17:01 +02:00
e54638a248 Updating dependencies 2021-06-08 18:03:18 +02:00
239d1305fa Merge pull request #1142 from BenoitVuagnat/Add-navigation-to-user-management-page
Add navigation to user management page
2021-06-08 11:36:31 +02:00
aac7b57d22 Release 2.2.22 2021-06-05 10:24:00 +02:00
9421b4bf57 Update ReleaseNotes.txt 2021-06-05 10:23:37 +02:00
717336fbd1 Merge branch 'master-3.0' into Add-navigation-to-user-management-page 2021-06-02 18:28:08 +02:00
48f093360d Update app.module.ts 2021-06-02 13:32:14 +02:00
bac6047247 Update login.component.html 2021-06-02 12:08:20 +02:00
e36d56ff5d Merge branch 'master' into master-3.0 2021-05-28 13:20:47 +02:00
354b313eaa Merge pull request #1157 from GNS3/master-2.2.22
Version 2.2.22
2021-05-28 13:20:14 +02:00
b91a113cf5 Update default-layout.component.html
Added the user management link in the navigation menu
2021-05-28 04:33:32 +02:00
7d95200eb3 Merge branch 'master' into master-3.0 2021-05-28 00:20:16 +02:00
b048a846e0 Merge branch 'master' into master-2.2.22 2021-05-27 23:32:27 +02:00
092fe5991b Update bundled-server-finder.component.ts 2021-05-27 23:32:15 +02:00
1a03bb0456 Updating help component 2021-05-27 23:28:46 +02:00
a04804eaa0 Create server.service.spec.ts 2021-05-27 23:16:47 +02:00
8a56032291 Updating dependencies 2021-05-27 22:58:34 +02:00
c80dbe6baf Updating angular to 12, removing indexed db 2021-05-27 22:17:22 +02:00
2b17b3d627 Removing unused packages 2021-05-27 20:12:06 +02:00
6e9ebfb69d Removing react-related components 2021-05-27 18:58:28 +02:00
6faba7c4ec Update bundled-server-finder.component.ts 2021-05-27 18:01:58 +02:00
3f7fe0a7f3 Merge pull request #1152 from GNS3/dependabot/npm_and_yarn/dns-packet-1.3.4
Bump dns-packet from 1.3.1 to 1.3.4
2021-05-27 17:14:01 +02:00
666e39ede3 Removing angular-persistence package, updating unit tests 2021-05-27 17:12:44 +02:00
60f8685c68 Bump dns-packet from 1.3.1 to 1.3.4
Bumps [dns-packet](https://github.com/mafintosh/dns-packet) from 1.3.1 to 1.3.4.
- [Release notes](https://github.com/mafintosh/dns-packet/releases)
- [Changelog](https://github.com/mafintosh/dns-packet/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mafintosh/dns-packet/compare/v1.3.1...v1.3.4)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-27 07:45:54 +00:00
ca5a8ea891 Path shortcuts added 2021-05-26 12:53:07 +02:00
3b07b4a2db Lazy loading topology summary component 2021-05-25 17:06:01 +02:00
d01fcbcfe1 Merge branch 'master' into master-3.0 2021-05-25 13:00:19 +02:00
9bf2980b6b Merge pull request #1148 from GNS3/In-web-UI,-import-appliance-ignores-secondary/cdrom-images
Update new-template-dialog.component.html
2021-05-24 12:18:43 +02:00
57e6200972 Update new-template-dialog.component.html 2021-05-21 15:30:30 +02:00
b692bd0f43 Update projects.component.scss 2021-05-20 12:15:49 +02:00
e37bdc6162 Changing buttons title in server & snapshot dialogs 2021-05-20 11:48:11 +02:00
e3db70a7d9 Update logged-user.component.html 2021-05-18 16:46:57 +02:00
bb2a963237 Fix for https://github.com/GNS3/gns3-web-ui/issues/1139 2021-05-18 16:03:53 +02:00
c0cff3a6db fix for https://github.com/GNS3/gns3-web-ui/issues/1140 2021-05-18 14:04:35 +02:00
2a96a6b601 Fix for https://github.com/GNS3/gns3-web-ui/issues/1138 2021-05-18 03:21:45 +02:00
1d5bbb58f9 Fix for https://github.com/GNS3/gns3-web-ui/issues/1140 2021-05-17 20:20:20 +02:00
0e3dd69767 Update default-layout.component.ts 2021-05-17 19:45:57 +02:00
823e9a4b59 https://github.com/GNS3/gns3-web-ui/issues/1143 2021-05-17 15:12:57 +02:00
6b2760c06a fixed page access so it would not go to the default page 2021-05-14 22:43:49 +02:00
eb7da2f565 Merge pull request #1135 from GNS3/Cannot-load-symbols-after-migrating-to-v3
Cannot load symbols after migrating to v3
2021-05-14 15:54:14 +02:00
521b593212 Fix for unit tests 2021-05-14 15:53:42 +02:00
ca7b43a5c2 Fix for symbol dialog 2021-05-14 13:01:41 +02:00
c8f1a4d428 Fix for template component 2021-05-14 12:26:33 +02:00
350ed9a4aa Fix for icons on map 2021-05-14 11:28:07 +02:00
96919f8c05 Merge branch 'master' into master-3.0 2021-05-13 16:01:23 +02:00
d290daed11 Fix for https://github.com/GNS3/gns3-web-ui/issues/1134 2021-05-13 12:03:25 +02:00
faf2dbf276 First step of implementation of user management routing 2021-05-12 19:20:35 +02:00
5ba7799d8a Updating console wrapper & console menu tests 2021-05-11 19:09:07 +02:00
17da822a47 Update log-console.component.spec.ts 2021-05-11 18:28:03 +02:00
748997c635 Update settings.component.spec.ts 2021-05-11 18:16:20 +02:00
cf2f0e3110 Fix for https://github.com/GNS3/gns3-web-ui/issues/1132 2021-05-11 14:57:42 +02:00
8bfb375e02 Merge pull request #1131 from GNS3/The-ability-to-open-consoles-for-many-nodes-at-once
Console in new tab for many nodes at one click
2021-05-11 12:00:42 +02:00
9fd34e8253 Opening more than 1 console with one click in console widget 2021-05-11 02:09:40 +02:00
abdd739f06 Console in new tab for many nodes at one click 2021-05-11 01:35:07 +02:00
84d0f803dc Merge branch 'master' into master-3.0 2021-05-10 16:47:48 +02:00
1f972d3261 Updating dependencies 2021-05-10 16:45:36 +02:00
42ae0b671a Updating dependencies 2021-05-10 14:18:38 +02:00
a5b4a12849 Fix for redirection to login page 2021-05-07 20:30:31 +02:00
06ad9c2f07 Fix for login page issues 2021-05-07 19:46:46 +02:00
b51159513f Update web-console-full-window.component.ts 2021-05-07 16:12:03 +02:00
12ba174dfa Update edit-project-dialog.component.ts 2021-05-07 16:10:12 +02:00
62c1f8b003 Removing blocking context menu, copy-paste in console changed from ctrl-c, ctrl-v, to ctrl-shift-c, ctrl-shift-v 2021-05-07 15:46:06 +02:00
f7a3df27b8 Logout action added 2021-05-06 02:50:13 +02:00
4261086495 Update main.yml 2021-04-30 14:28:37 +02:00
1e21f672fb Update package.json 2021-04-30 14:18:58 +02:00
c8caf20234 Release 2.2.21 2021-04-30 13:51:13 +02:00
17acd161d8 Http interceptor added 2021-04-30 13:10:33 +02:00
a27f854bde Update project.service.ts 2021-04-30 01:14:02 +02:00
4a8be81534 Update mapsettings.service.ts 2021-04-30 01:08:48 +02:00
e863c1f6e7 Redirection to login page updated 2021-04-30 00:45:54 +02:00
9835c106d8 Login guard added 2021-04-29 18:15:22 +02:00
71077413b7 Login component added 2021-04-29 17:32:53 +02:00
5cfda3500a Removing old authorization 2021-04-28 17:40:58 +02:00
ab6c43c167 Updating version to 3.0 2021-04-28 15:11:18 +02:00
84f7fabdc8 Removing traceng related code 2021-04-28 12:43:35 +02:00
4eefe89eb1 endpoints updated to v3 2021-04-28 12:32:11 +02:00
a9aa64c7f5 Update link.service.ts 2021-04-28 12:06:46 +02:00
64b814acd7 Exchanging endpoints from v2 to v3 2021-04-28 01:18:52 +02:00
d73f65dc70 Merge branch 'master' into master-3.0 2021-04-28 00:16:30 +02:00
e669e4cc47 Updating dependencies 2021-04-27 23:59:10 +02:00
469fa6cd23 Update add-server-dialog.component.ts 2021-04-27 15:21:37 +02:00
f664165190 Extending direct link with adding server option 2021-04-27 15:21:21 +02:00
16d86a2322 Update README.md 2021-04-19 12:17:50 +02:00
b92c6384de Update README.md 2021-04-19 12:16:33 +02:00
ccc328f279 Update karma.conf.js 2021-04-19 11:19:39 +02:00
5f5cd8aa9e Update main.yml 2021-04-19 00:39:50 +02:00
668093ffb3 Update font-bbox-calculator.spec.ts 2021-04-18 23:00:36 +02:00
644dc588b2 Update main.yml 2021-04-18 22:42:24 +02:00
7c48791ae5 Update main.yml 2021-04-18 22:35:52 +02:00
aac9476e26 Update main.yml 2021-04-16 23:01:47 +02:00
e57350e0e5 Update main.yml 2021-04-16 22:33:02 +02:00
1a853f5c36 Create main.yml 2021-04-16 21:59:16 +02:00
89db5d2602 Updating all packages 2021-04-16 14:38:55 +02:00
641a542714 Update settings.component.spec.ts 2021-04-16 13:32:03 +02:00
909986af96 Update project-map.component.ts 2021-04-16 13:18:19 +02:00
c6ccaf3c4d Update cloud-nodes-template-details.component.html 2021-04-16 13:15:40 +02:00
56a00bc877 Updating marked package 2021-04-16 12:59:21 +02:00
0015c09ba5 Merge branch 'master' into master-2.3 2021-04-16 12:51:51 +02:00
25829b89e6 Codecov disabled 2021-04-16 12:10:33 +02:00
611ba2b410 Update project.service.spec.ts 2021-04-16 12:08:23 +02:00
700eff76eb Get url for console sockets moved to NodeConsoleService 2021-04-16 12:05:58 +02:00
f5296dd1fb Update add-server-dialog.component.html 2021-04-15 12:04:07 +02:00
085659bbcc Merge pull request #1061 from mother/zoom-controls
Updated zoom controls
2021-04-14 19:25:10 +02:00
20afbbcb5b Updated zoom controls 2021-04-14 12:43:57 -04:00
2350f88c59 position of console changed to the right 2021-04-13 11:47:44 +02:00
bec15d4d37 Update adbutler.component.ts 2021-04-12 17:31:46 +02:00
5697274dd4 Merge pull request #1059 from GNS3/Improve-overall-performance
Improve overall performance
2021-04-12 17:17:47 +02:00
2e750a0465 Update package.json 2021-04-12 17:00:20 +02:00
708009d374 Removing unnecessary imports 2021-04-12 13:46:28 +02:00
bba7d8b221 Code optimization 2021-04-12 13:15:45 +02:00
1dc4887071 Update console-wrapper.component.scss 2021-04-10 23:43:57 +02:00
7362f2625b Fix unit tests after updating fonts package 2021-04-09 14:30:14 +02:00
9b79cb9873 Merge pull request #1055 from GNS3/Fill-node-width-and-height-with-correct-values
Fill node width and height with correct values
2021-04-09 14:10:44 +02:00
ee943eacad Update project-map.component.ts 2021-04-09 14:10:14 +02:00
02e614de42 Fix for symbol service 2021-04-09 13:53:27 +02:00
b8812a9e41 Update package.json 2021-04-08 21:32:09 +02:00
98ac55c96e Release 2.2.20 2021-04-08 13:23:36 +02:00
7d9928609d Fix for styling zoom buttons & color of left menu 2021-04-08 13:17:21 +02:00
c4df0e49f9 Update topology-summary.component.scss 2021-04-08 12:00:20 +02:00
0a67137cc6 Fix for icon styling 2021-04-08 11:56:14 +02:00
d86eca7061 Fix for styling 2021-04-08 11:28:02 +02:00
0e71897317 Fix styling for new title bar 2021-04-08 10:41:03 +02:00
330d004e3b Merge pull request #1048 from mother/ui
GNS3 web-ui - UI Updates
2021-04-08 10:15:57 +02:00
12d1f7fd41 Update adbutler.component.scss 2021-04-08 10:10:32 +02:00
ca251bd984 Merge pull request #1052 from mother/ad-banner-updates
Ad Banner Updates
2021-04-08 09:27:24 +02:00
c90f37b030 Updating dependencies 2021-04-07 22:43:19 +02:00
0d7e76eb6c Fix typo in .appveyor.yml 2021-04-08 00:38:37 +09:30
4f34076440 Trying to fix Electron build 2021-04-08 00:35:06 +09:30
249a98b340 style updates 2021-04-07 10:29:58 -04:00
9da4079d2f Update to primary UI components 2021-04-07 10:10:17 -04:00
e2c4b2a372 Merge branch 'master' of https://github.com/GNS3/gns3-web-ui 2021-04-06 17:44:14 +02:00
da5eb7a4b6 Fix for grid issues (with 4k resolution) 2021-04-06 17:44:10 +02:00
ae9efcf7b4 Update README.md 2021-04-06 19:54:52 +09:30
b8c45688f6 more cleanup 2021-04-05 14:14:28 -04:00
3026a70e61 cleanup 2021-04-05 14:09:40 -04:00
5832f9f724 rm notification-box component 2021-04-05 13:55:33 -04:00
6b676fa91e simplify ad banner, make it a footer (non-timer based) 2021-04-05 13:54:36 -04:00
785855d3bd Update package.json 2021-03-05 16:45:01 +01:00
e609965e91 Release 2.2.19 2021-03-01 21:44:00 +01:00
d042ad8ce4 Update ReleaseNotes.txt 2021-03-01 21:41:37 +01:00
ddb2e3f34a Updating package.json 2021-03-01 21:39:23 +01:00
7cd1d5ed87 Update theme.scss 2021-03-01 21:21:52 +01:00
bc45a1bea9 Use cx_Freeze v5.1.1 2021-02-28 22:43:24 +10:30
b0e197dbbd Add hidden import 2021-02-27 18:13:35 +10:30
e213279cdc Add missing psutil dependency in requirements.txt 2021-02-27 17:37:01 +10:30
d072324ef7 New attempt to fix CircleCI build 2021-02-27 16:24:47 +10:30
a101620954 Update requirements.txt 2021-02-27 15:52:39 +10:30
e5813a255e Attempt to fix CircleCI build 2021-02-27 13:49:22 +10:30
a6eb1cc09f Updating project service tests 2021-02-26 23:45:45 +01:00
1b0c62c0d1 Storing server id for recently opened project list 2021-02-26 23:02:49 +01:00
d45947999d Update project.service.ts 2021-02-26 17:51:46 +01:00
06926c53af Action button added 2021-02-26 16:41:01 +01:00
96f4600706 Update yarn.lock 2021-02-22 22:27:05 +01:00
fe8550678d Update yarn.lock 2021-02-22 20:16:44 +01:00
a0d88a937e Merge pull request #1040 from GNS3/fix_for_theming
GNS3 Web-UI - Dark Theme Not Working
2021-02-22 11:00:02 -08:00
e1b0e73916 Link to docs added 2021-02-22 19:37:18 +01:00
767dc0c963 fix for styling dafult layout 2021-02-17 19:09:22 +01:00
6c4cdb06b2 Fix for icon colors 2021-02-17 18:46:16 +01:00
91844ee770 Rewriting theme-service 2021-02-17 16:28:00 +01:00
46c4bc1d78 Fix for theming 2021-02-17 04:03:02 +01:00
baa344fbe5 Update package.json 2021-02-16 15:59:43 +01:00
73d3ab2534 Release 2.2.18 2021-02-15 23:47:09 +01:00
7294e926a8 Update ReleaseNotes.txt 2021-02-15 23:45:25 +01:00
c4eecd3e8b Working version 2021-02-15 23:43:39 +01:00
015a1a9350 Revert "Revert "Update package.json""
This reverts commit 0bbaca6439.
2021-02-15 22:29:42 +01:00
0bbaca6439 Revert "Update package.json"
This reverts commit e4ad03e1c6.
2021-02-15 22:21:32 +01:00
e4ad03e1c6 Update package.json 2021-02-15 21:54:11 +01:00
0bc000f096 Update log-console.component.ts 2021-02-15 17:10:37 +01:00
703ceb177b Update yarn.lock 2021-02-15 16:47:53 +01:00
ab533a9be4 Merge pull request #1031 from GNS3/github_issues
User should have option to list issues from github in gns3 web UI app
2021-02-15 07:07:53 -08:00
d72cf3595f Merge branch 'master' into github_issues 2021-02-15 15:30:38 +01:00
9e7d11bf8a Fix for imports 2021-02-15 15:23:49 +01:00
8b7fb1f0d2 Update package.json 2021-02-15 13:43:26 +01:00
7bc95954ec Merge branch 'master' into master-2.3 2021-02-02 01:15:32 +01:00
6af1b97174 Merge pull request #1034 from GNS3/Custom-symbols-are-centered-in-GUI-but-skewed-on-Web-UI
Update node.ts
2021-02-01 13:05:14 -08:00
37f94d5002 Merge pull request #1033 from Desposyni/Template_Category_Issue
Template category issue
2021-02-01 12:49:51 -08:00
317304c08a Change end device and security device categories to guest and firewall 2021-01-31 01:35:23 +01:00
80bf232f06 Make categories singular instead of plural 2021-01-31 00:47:03 +01:00
5c1ed5de06 Eev for communication between components 2021-01-28 01:07:51 +01:00
3cc84364ff Merge branch 'master' into github_issues 2021-01-27 18:15:54 +01:00
b6fdc260c6 Update report-issue.component.tsx 2021-01-27 18:14:41 +01:00
c8ec9c1213 Update angular.json 2021-01-27 12:23:20 +01:00
33e0fbb0b4 Cleaning up code 2021-01-26 23:55:13 +01:00
d4d9093505 Update log-console.component.spec.ts 2021-01-26 17:56:40 +01:00
32945dbd55 Fixing css 2021-01-26 17:48:10 +01:00
daf7da2189 Searching by keyword added 2021-01-26 17:19:19 +01:00
ad553a6aa2 Update issue-list.tsx 2021-01-25 17:58:13 +01:00
df6d760444 Update issue-list.tsx 2021-01-25 15:11:00 +01:00
e319aa4c4e Fetching data from github api 2021-01-25 01:47:46 +01:00
4983af48d1 Initial implementation 2021-01-23 01:23:32 +01:00
b114c7db81 Update topology-summary.component.html 2021-01-21 18:02:22 +01:00
140e56643d Merge pull request #1018 from GNS3/snyk-fix-53a04c199558f2ee494429c51ddc7720
[Snyk] Security upgrade ini from 1.3.5 to 1.3.6
2021-01-20 04:53:07 -08:00
ec704d63dd Merge branch 'master' into snyk-fix-53a04c199558f2ee494429c51ddc7720 2021-01-20 04:52:37 -08:00
1fc111a6e2 Update README.md 2021-01-13 21:42:58 +01:00
7f44ad4e7c Update packages 2021-01-13 11:59:45 +01:00
ad593d8408 Update packages 2021-01-13 01:15:35 +01:00
2c5683917b Removing node-sass 2021-01-13 00:48:24 +01:00
85ab218bc2 Update node.ts 2021-01-08 11:58:57 +01:00
735a618e0c fix: package.json to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-INI-1048974
2020-12-11 02:21:56 +00:00
f508242858 Update package.json 2020-12-04 13:17:54 +01:00
991f014ba3 Release 2.2.17 2020-12-04 02:52:57 +01:00
60aa98e721 Update new-template-dialog.component.ts 2020-12-02 14:59:28 +01:00
c956bc84c8 Update new-template-dialog.component.ts 2020-12-02 12:47:25 +01:00
5668016ef5 Fix for https://github.com/GNS3/gns3-web-ui/issues/983 2020-12-02 03:53:06 +01:00
a66b66f270 Bump version to 2.2.17dev1 2020-12-01 16:35:10 +10:30
ced2cba28b Fix for uploader 2020-12-01 02:17:49 +01:00
73ef1f0f80 Update server-discovery.component.ts 2020-12-01 00:06:05 +01:00
383c628f2f Update new-template-dialog.component.ts 2020-11-28 03:22:25 +01:00
80e19f5538 migration to Angular 11 2020-11-28 01:31:20 +01:00
d7012416ec Updating packages 2020-11-28 01:03:39 +01:00
0df3420cd5 Update yarn.lock 2020-11-28 00:01:01 +01:00
75dd47afac Fix for services 2020-11-09 13:50:24 +01:00
1b96d94384 Remove bad practices #1011 2020-11-09 13:49:57 +01:00
99b90db6ed Stabilize unit tests #1010 2020-11-09 01:27:37 +01:00
165ab06fde Map widgets should be hidden when browser window has small size #1009 2020-11-08 00:00:57 +01:00
72371cb8d6 Migrating from css to scss 2020-11-07 00:38:14 +01:00
c431d163c2 Lazy loading images 2020-11-06 12:46:58 +01:00
98df9cd2b7 Release 2.2.16 2020-11-04 12:40:07 +01:00
40a580dcb0 Update symbols.component.ts 2020-11-04 12:09:30 +01:00
149b68e037 Clean code from outdated http based methods 2020-11-04 00:12:29 +01:00
288879ccb2 Option to choose protocol from AddServerDialog 2020-11-03 20:15:10 +01:00
5cb3aa051b Update http-server.service.ts 2020-11-03 13:46:22 +01:00
c420dd8512 Migration to mousetrap 2020-10-22 15:51:13 +02:00
05e1519ceb Update project-map.component.ts 2020-10-22 14:42:58 +02:00
daff351b22 Update yarn.lock 2020-10-22 14:30:23 +02:00
82aa9c1d2c Update yarn.lock 2020-10-22 14:26:00 +02:00
b68b871dd6 Merge pull request #964 from GNS3/Project-readme-support
Project readme support
2020-10-22 00:19:35 +02:00
de6529ddd7 Support for Readme 2020-10-22 00:18:56 +02:00
1fc48b28b3 Merge branch 'master-2.3' into Project-readme-support 2020-10-19 16:57:25 +02:00
0386d97a56 Merge branch 'master' into master-2.3 2020-10-19 16:06:04 +02:00
a28b22eafb Update package.json 2020-10-19 15:40:19 +02:00
fc34cbf524 Merge pull request #1000 from GNS3/API-requests-doesn't-use-HTTPS-when-SSL-is-configured
Api requests doesn't use https when ssl is configured
2020-10-17 00:29:58 +02:00
9861f4a2f5 Merge branch 'master' into API-requests-doesn't-use-HTTPS-when-SSL-is-configured 2020-10-17 00:27:56 +02:00
57294f49a7 Option to check for updates added 2020-10-17 00:25:01 +02:00
15b9748120 Update project-map.component.html 2020-10-16 03:23:35 +02:00
6c92941794 Fix styles for light theme 2020-10-15 17:30:20 +02:00
b6137b8ef1 Update http-server.service.ts 2020-10-13 18:41:00 +02:00
692db7b605 Merge pull request #995 from GNS3/snyk-fix-920ef333e7d961151afc78cd65f0f4cf
[Snyk] Security upgrade urllib3 from 1.24.3 to 1.25.9
2020-10-13 18:28:39 +02:00
43042fcde0 Merge branch 'master' into API-requests-doesn't-use-HTTPS-when-SSL-is-configured 2020-10-13 18:24:49 +02:00
0ca1c02d10 Update console-device-action-browser.component.ts 2020-10-13 18:10:46 +02:00
b2cb7804de Update packages 2020-10-13 16:12:14 +02:00
05971ef1ae Merge pull request #999 from scodeman/issue-998
Issue #998 PR
2020-10-12 18:36:29 +02:00
3db88acff4 Update Dockerfile 2020-10-11 15:30:47 +08:00
ccfd4d468e Release 2020.4.0-beta.1 2020-10-05 15:36:16 +02:00
d2d37135a6 Update ReleaseNotes.txt 2020-10-05 15:24:48 +02:00
0abc9756b7 fix: scripts/requirements.txt to reduce vulnerabilities
The following vulnerabilities are fixed by pinning transitive dependencies:
- https://snyk.io/vuln/SNYK-PYTHON-URLLIB3-1014645
2020-10-02 00:19:28 +00:00
22c72f411b Workaround for scroll issue 2020-09-30 12:11:49 +02:00
e16152edaf Update server-discovery.component.ts 2020-09-29 15:07:36 +02:00
c11d32e253 Update symbols.component.scss 2020-09-29 14:07:36 +02:00
d80b0142fd Update context-console-menu.component.ts 2020-09-29 14:07:27 +02:00
dce29bb45d Change Sentry DSN key 2020-09-25 10:47:03 +09:30
e4d1ef7cf7 Update context-console-menu.component.spec.ts 2020-09-23 14:24:58 +02:00
3130eda5d5 Upgrading packages 2020-09-23 11:09:42 +02:00
4bab23fa60 Update log-console.component.spec.ts 2020-09-23 10:45:43 +02:00
8ffbf1be30 Double click to open new console 2020-09-22 18:01:31 +02:00
3667a4d755 Do not log HTTP 400 error to Sentry 2020-09-19 22:12:30 +09:30
55fe1e561a Merge pull request #990 from zero77/patch-1
Update README.md
2020-09-16 13:02:56 +02:00
74803d193e Update README.md
This quickly shows all package versions across different distros at a glance.
Also, Libraries.io dependency status for GitHub repo.
2020-09-16 10:26:17 +00:00
7c27ceaab7 https://github.com/GNS3/gns3-web-ui/issues/982 2020-09-15 12:48:10 +02:00
b661ba7ddf Merge branch 'master' of https://github.com/GNS3/gns3-web-ui 2020-09-14 18:29:57 +02:00
fe2ab05f57 Release 2020.3.0-beta.4 2020-09-14 18:29:47 +02:00
a522b12842 Merge pull request #969 from GNS3/dependabot/npm_and_yarn/bl-4.0.3
Bump bl from 4.0.2 to 4.0.3
2020-09-14 18:28:17 +02:00
9455c9970c Merge pull request #988 from GNS3/snyk-fix-5392bdd7c97126b322c70ca738d5f146
[Snyk] Security upgrade node-fetch from 2.6.0 to 2.6.1
2020-09-14 18:28:05 +02:00
ac10eae134 Custom adapters for docker 2020-09-14 18:26:38 +02:00
19b1e4b230 Edit network configuration for docker nodes 2020-09-14 15:00:41 +02:00
5d6bda7e31 Change Sentry DSN key. 2020-09-13 00:21:16 +09:30
d782bcafbe fix: package.json & yarn.lock to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-NODEFETCH-674311
2020-09-12 02:26:12 +00:00
e335a552c5 Update new-template-dialog.component.ts 2020-09-10 18:34:26 +02:00
753e08a6ba Update node.ts 2020-09-10 00:41:23 +02:00
305182b01f Update node.ts 2020-09-10 00:36:32 +02:00
dd7dcf4dab Improvements for template name dialog 2020-09-09 23:43:54 +02:00
8205c65799 Update configurator-docker.component.ts 2020-09-09 17:37:15 +02:00
169a06fd3a Validators fo docker configurator 2020-09-09 17:32:48 +02:00
820fa9f690 Merge branch 'master' into master-2.3 2020-09-09 16:46:19 +02:00
cf725931f9 Update template.component.ts 2020-09-09 16:38:51 +02:00
c7db04ce3b Missing features in docker configurator 2020-09-09 13:01:23 +02:00
93532d3274 Update new-template-dialog.component.ts 2020-09-08 12:53:02 +02:00
81bc3cb3bd Update new-template-dialog.component.ts 2020-09-08 12:17:28 +02:00
87aa6c4b59 Dialog for Qemu template name 2020-09-08 12:07:38 +02:00
b32fdf4fc2 Update for appliances 2020-09-07 15:01:32 +02:00
6f991e4885 Update new-template-dialog.component.ts 2020-09-07 13:33:20 +02:00
fe02a4cb79 Update toaster-error-handler.ts 2020-09-07 00:42:21 +02:00
61d4e2461f Release 2020.3.0-beta.3 2020-09-04 12:45:33 +02:00
c80284d7d2 Update ReleaseNotes.txt 2020-09-04 12:37:45 +02:00
00d4a5ff92 Update new-template-dialog.component.ts 2020-09-04 02:06:08 +02:00
61bb6e45bf suspend issues 2020-09-04 00:55:49 +02:00
bbb344557b Update new-template-dialog.component.html 2020-09-03 15:21:57 +02:00
94ce514cfe Merge pull request #968 from GNS3/web-console-future-enhacements
Option to resize console
2020-09-03 13:51:51 +02:00
0ccae1dde7 Fix for adding appliances 2020-09-03 12:50:07 +02:00
4c08a11452 Bump bl from 4.0.2 to 4.0.3
Bumps [bl](https://github.com/rvagg/bl) from 4.0.2 to 4.0.3.
- [Release notes](https://github.com/rvagg/bl/releases)
- [Commits](https://github.com/rvagg/bl/compare/v4.0.2...v4.0.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-02 18:09:17 +00:00
8687c0b1f0 Update adbutler.component.ts 2020-09-02 18:58:55 +02:00
36b610eafa Update new-template-dialog.component.ts 2020-09-02 16:31:12 +02:00
58497c1f5a Update log-console.component.ts 2020-09-02 15:30:01 +02:00
bd6693cb11 Update console-wrapper.component.scss 2020-09-01 15:15:15 +02:00
c732ed5a72 Fix for console start 2020-08-31 17:21:37 +02:00
696a708930 Update console-wrapper.component.scss 2020-08-31 15:27:32 +02:00
ad783722d0 Option to resize console 2020-08-28 14:14:40 +02:00
d266d5ece2 Merge pull request #966 from GNS3/fix-for-tests
Fix for tests
2020-08-27 13:55:06 +02:00
8948bd7205 Update app.component.spec.ts 2020-08-27 13:25:00 +02:00
9c1c15df8a Update tsconfig.app.json 2020-08-27 13:13:48 +02:00
97a6d5298e Merge pull request #965 from GNS3/Upgrade-Sentry-SDK
Update sentry-error-handler.ts
2020-08-26 18:04:45 +02:00
8978c0cc33 Update app.component.spec.ts 2020-08-26 18:03:57 +02:00
9e37f47ef1 Fix for log-console-component tests 2020-08-26 17:48:05 +02:00
0682595f6f Update nodes-menu.component.spec.ts 2020-08-26 17:39:47 +02:00
f79e320d55 Update project-map.component.spec.ts 2020-08-26 17:34:54 +02:00
e33fe70a38 Update cloud-nodes-add-template.component.spec.ts 2020-08-26 16:07:23 +02:00
535a48211a Update ethernet-switches-add-template.component.spec.ts 2020-08-26 16:05:02 +02:00
659db6a73e Fix for compute service 2020-08-26 16:02:18 +02:00
340004d9d5 Update server-discovery.component.spec.ts 2020-08-26 15:53:13 +02:00
cb133d9525 Fix for dialogs 2020-08-26 13:13:01 +02:00
910ddb9955 Fix for unit tests 2020-08-26 12:39:55 +02:00
c3c25efb71 Merge pull request #941 from GNS3/fix-for-tests
Fix for tests
2020-08-25 15:58:53 +02:00
29a8b9f527 Update tsconfig.base.json 2020-08-25 15:58:28 +02:00
9dfd58b14b Merge branch 'master' into fix-for-tests 2020-08-25 15:46:57 +02:00
dd4ab0013b Update project-map.component.ts 2020-08-20 18:37:53 +02:00
a7e05cff7c Update project-map.component.ts 2020-08-20 18:32:28 +02:00
128d02b85d Fix for https://github.com/GNS3/gns3-web-ui/issues/961 2020-08-20 16:45:21 +02:00
a0073e1d23 Fix for delete error 2020-08-20 00:32:54 +02:00
0742574221 Update sentry-error-handler.ts 2020-08-19 23:57:53 +02:00
20f0b06a77 Project readme support 2020-08-19 13:16:09 +02:00
8d795ebf10 CPUs and memory limitation for Docker containers 2020-08-12 11:55:16 +02:00
cb6cacc557 "Usage" support for cloud templates and nodes 2020-08-10 16:00:57 +02:00
bf4f2dcdb7 Reset link support 2020-08-10 14:30:11 +02:00
72418a1a9f Release 2020.3.0-beta.2 2020-08-07 09:50:50 +02:00
4d6678fa4d fix for sentry errors 2020-08-07 09:45:36 +02:00
5aeecb08a1 Update toaster-error-handler.ts 2020-08-06 23:52:01 +02:00
8bd289c3d2 Update sentry-error-handler.ts 2020-08-06 23:51:56 +02:00
9b77b40bd0 Update notification-box.component.ts 2020-08-06 23:27:22 +02:00
69177e86fc Update notification-box.component.ts 2020-08-06 23:18:41 +02:00
75de6d2c38 Settings for link labels 2020-08-06 19:40:51 +02:00
76dbcc0782 Update for map settings service 2020-08-06 15:20:28 +02:00
a1f6be337a Update link.service.ts 2020-08-06 11:40:18 +02:00
d1fb7e6624 Update adbutler.component.ts 2020-08-06 10:08:40 +02:00
29e8949872 Update appliance.ts 2020-08-06 00:49:59 +02:00
1e36a721b6 Update new-template-dialog.component.ts 2020-08-06 00:49:56 +02:00
b2e96172e6 Update adbutler.component.scss 2020-08-06 00:48:19 +02:00
05cda2b3a6 Update for qemu appliances 2020-08-05 12:32:22 +02:00
d0e6318198 Fix for https://github.com/GNS3/gns3-web-ui/issues/955 2020-08-05 12:24:51 +02:00
b78f3824fc Update app-routing.module.ts 2020-08-04 15:37:11 +02:00
ffb3646d08 Fix for appliances 2020-08-04 14:30:56 +02:00
af564d6cd7 Fix for tooltips 2020-08-03 16:52:37 +02:00
01ea42e930 InterfaceStatus updated 2020-07-31 14:55:28 +02:00
7ee47d2e86 Update yarn.lock 2020-07-23 14:42:53 +02:00
841f5c6283 Update package.json 2020-07-23 14:42:41 +02:00
dea33c9992 Update toaster-error-handler.ts 2020-07-22 17:58:00 +02:00
2c9ea028d7 Update new-template-dialog.component.html 2020-07-22 14:14:37 +02:00
1f6f81a02e Fix for 943 2020-07-22 12:47:51 +02:00
e228ac2654 Update interface-status.ts 2020-07-21 20:02:55 +02:00
dede19d686 Merge pull request #944 from GNS3/dependabot/npm_and_yarn/lodash-4.17.19
Bump lodash from 4.17.15 to 4.17.19
2020-07-20 16:28:05 +02:00
26153aa0e7 Update app.module.ts 2020-07-20 16:27:26 +02:00
6d023828ec Update google-analytics.service.ts 2020-07-20 16:27:23 +02:00
acf5a9fadb Bump lodash from 4.17.15 to 4.17.19
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19)

Signed-off-by: dependabot[bot] <support@github.com>
2020-07-16 18:27:30 +00:00
e9aeb169c5 Update interface-status.ts 2020-07-16 17:51:57 +02:00
141fc9cae5 Update interface-status.ts 2020-07-16 17:28:38 +02:00
4125c98e82 Update interface-status.ts 2020-07-16 17:24:19 +02:00
801c10feff Update interface-status.ts 2020-07-16 17:21:18 +02:00
0d4cc53ebb Update tsconfig.base.json 2020-07-15 15:00:56 +02:00
da16f39355 Update confirmation-dialog.component.spec.ts 2020-07-15 15:00:48 +02:00
565051c259 Update yarn.lock 2020-07-14 13:11:47 +02:00
da43d843c0 Unit tests migrated to angular 10 2020-07-14 13:01:06 +02:00
1356aa1962 Update package.json 2020-07-14 12:48:57 +02:00
8362e3463b Update tsconfig.base.json 2020-07-14 12:43:24 +02:00
695ca81cc0 Merge pull request #938 from GNS3/snyk-fix-470ae95600eebd24979fe9af6bdb138d
[Snyk] Fix for 1 vulnerabilities
2020-07-14 11:19:50 +02:00
97d259c7f4 Merge pull request #940 from GNS3/Integrate-link-labels-to-links
Integrate link labels to links
2020-07-14 10:54:38 +02:00
62587fbdcd Option enabled 2020-07-13 18:40:32 +02:00
a3142c6fb1 Option in menu 2020-07-13 17:28:35 +02:00
46c6cd1d7e Update link.service.ts 2020-07-13 16:52:46 +02:00
4c528bea07 Update interface-status.ts 2020-07-13 16:52:33 +02:00
9adcd6090d fix: package.json, yarn.lock & .snyk to reduce vulnerabilities
The following vulnerabilities are fixed with a Snyk patch:
- https://snyk.io/vuln/SNYK-JS-LODASH-567746
2020-07-10 04:13:48 +00:00
9a974ae72d Update link-status.ts 2020-07-09 15:22:15 +02:00
b5c2c3b4f2 Update interface-status.ts 2020-07-09 14:03:47 +02:00
f185f97ad5 Update interface-status.ts 2020-07-09 13:19:03 +02:00
1b05924070 Update project-web-service-handler.ts 2020-07-08 11:55:46 +02:00
2ebe412cc8 Merge pull request #937 from GNS3/dependabot/npm_and_yarn/npm-registry-fetch-4.0.5
Bump npm-registry-fetch from 4.0.4 to 4.0.5
2020-07-07 22:03:29 +02:00
a3e4483478 Bump npm-registry-fetch from 4.0.4 to 4.0.5
Bumps [npm-registry-fetch](https://github.com/npm/registry-fetch) from 4.0.4 to 4.0.5.
- [Release notes](https://github.com/npm/registry-fetch/releases)
- [Changelog](https://github.com/npm/npm-registry-fetch/blob/latest/CHANGELOG.md)
- [Commits](https://github.com/npm/registry-fetch/commits)

Signed-off-by: dependabot[bot] <support@github.com>
2020-07-07 19:36:20 +00:00
76f71b7c8b Reelease 2020.3.0-beta.1 2020-07-07 13:32:32 +02:00
1924fcbce0 Update ReleaseNotes.txt 2020-07-07 13:30:38 +02:00
20441a3e38 Update yarn.lock 2020-07-07 13:26:16 +02:00
aa78dc682f Merge pull request #934 from GNS3/Updating-dependencies
Upgrade to Angular 10 [high importance]
2020-07-07 11:19:35 +02:00
ed2ec8f004 Update tsconfig.base.json 2020-07-06 17:56:01 +02:00
290ed5ee89 Update angular.json 2020-07-06 17:02:12 +02:00
491eb86451 Update from master 2020-07-06 15:06:43 +02:00
b8ed394937 Merge pull request #895 from GNS3/Upgrade-Sentry-SDK
Upgrade sentry SDK
2020-07-06 14:33:08 +02:00
0195b3dfc9 All packages updated to newest version 2020-07-01 10:25:59 +02:00
33786ccd14 Upgrade bootstrap 2020-06-30 17:05:10 +02:00
c7d7a97279 Upgrading angular material 2020-06-30 16:35:17 +02:00
4ddc8a198d Update package.json 2020-06-30 16:27:38 +02:00
fc7c52efb7 Update yarn.lock 2020-06-30 15:55:00 +02:00
9b626b6805 Update package.json 2020-06-30 15:44:33 +02:00
5365e228a6 Update yarn.lock 2020-06-30 15:16:59 +02:00
9215ab8e87 downgrade types/node 2020-06-30 13:41:43 +02:00
38941c209b tsconfig updated 2020-06-30 13:30:48 +02:00
c8104a577f Update to Angular 10 2020-06-30 10:42:31 +02:00
7c4e745075 Update package.json 2020-06-30 09:59:13 +02:00
b91ca628a0 Update package.json 2020-06-29 13:02:59 +02:00
f0ec495ff4 Merge pull request #904 from GNS3/whitesource/configure
Configure WhiteSource for GitHub.com
2020-06-26 09:04:49 +08:00
b35c4ace6a Add .whitesource configuration file 2020-06-26 01:02:01 +00:00
31fa79472a Replace Greenkeeper's badge by Snyk's badge 2020-06-25 13:42:51 +09:30
9938055638 Merge pull request #898 from GNS3/snyk-fix-456c9ae5252b41ddd3db2dcc687a93bd
[Snyk] Security upgrade psutil from 5.6.6 to 5.6.7
2020-06-24 20:56:36 +08:00
f4dde0ecae fix: scripts/requirements.txt to reduce vulnerabilities
The following vulnerabilities are fixed by pinning transitive dependencies:
- https://snyk.io/vuln/SNYK-PYTHON-PSUTIL-483082
2020-06-24 12:34:46 +00:00
62e866273b Removing raven dependencies 2020-06-24 12:57:02 +02:00
3e2c537a6d message for system status page 2020-06-24 11:49:29 +02:00
1658845022 Update status-chart.component.scss 2020-06-24 10:32:56 +02:00
e76527840b Upgrade sentry SDK 2020-06-23 16:56:53 +02:00
09fe6dbcbb Update new-template-dialog.component.html 2020-06-23 15:08:26 +02:00
92cfb2d94a Fix for importing appliances 2020-06-23 14:36:48 +02:00
206242dba9 Update link.service.ts 2020-06-23 12:16:28 +02:00
c78517c22e Update status page 2020-06-23 12:11:28 +02:00
91cfd1d257 Link to preferences 2020-06-22 20:19:23 +02:00
7b1c5deff5 Refreshing list of templates 2020-06-22 18:15:50 +02:00
fc6a5671fb Update new-template-dialog.component.ts 2020-06-22 15:27:09 +02:00
b0c331d054 Support for IOU appliances 2020-06-22 15:25:02 +02:00
d07fad3c79 Update new-template-dialog.component.html 2020-06-22 14:35:35 +02:00
c0b9311b38 Fix for IOS appliances 2020-06-22 14:13:25 +02:00
41e7f1c53e Fix for docker templates 2020-06-22 11:36:21 +02:00
e7dfa6242b Update new-template-dialog.component.ts 2020-06-19 11:47:35 +02:00
3c47cbcb1b Update new-template-dialog.component.html 2020-06-18 19:20:26 +02:00
671b2d9d37 Merge pull request #884 from GNS3/Create-templates-from-appliances
Create templates from appliances
2020-06-18 17:43:21 +02:00
df8f39e951 Fix for importing images 2020-06-18 17:27:52 +02:00
7a62a7589a Settings for appliances added 2020-06-18 17:12:39 +02:00
b8e2bb00ac Option to upload image for appliance added 2020-06-18 16:50:31 +02:00
300e710341 Settings for appliances added 2020-06-18 15:01:35 +02:00
67754192ea Info dialog updated 2020-06-18 10:08:21 +02:00
c415011f34 Update d3-map.component.ts 2020-06-18 09:45:31 +02:00
561226f31b Merge branch 'master' into Create-templates-from-appliances 2020-06-17 17:40:01 +02:00
c7dc56babd Fix for drawing grid 2020-06-17 17:30:11 +02:00
1a8701d845 Fix for node grid 2020-06-17 17:17:51 +02:00
2fd1bb2358 Release 2020.2.0-beta.5 2020-06-17 15:45:26 +02:00
976d92a866 Update ReleaseNotes.txt 2020-06-17 15:44:37 +02:00
220bda22f5 Update node.service.ts 2020-06-17 13:49:05 +02:00
57490b7272 Update node.service.ts 2020-06-17 11:56:52 +02:00
6d0f41714a Update web-console-full-window.component.ts 2020-06-17 11:17:27 +02:00
e853849cc9 code cleaned up 2020-06-17 10:55:39 +02:00
0f4890fd10 Update project-map.component.ts 2020-06-17 10:12:59 +02:00
edb7aefba2 Fix for Chrome browser in private mode 2020-06-16 19:16:18 +02:00
71415dac8f info dialog for appiances 2020-06-16 14:09:09 +02:00
15505b9b8c update for template dialog 2020-06-15 14:29:07 +02:00
66bbe2cd11 Update appliances.service.ts 2020-06-15 12:33:37 +02:00
b3109a8cc5 Merge branch 'master' into Create-templates-from-appliances 2020-06-15 12:21:30 +02:00
41f5af2b90 Merge pull request #889 from GNS3/Strange-behavior-with-Firefox
Strange behavior with firefox
2020-06-15 12:18:42 +02:00
a7f5a5fa09 Fix for auto_close 2020-06-15 10:39:22 +02:00
7248a0f183 Code cleaned up 2020-06-12 16:08:12 +02:00
53b4e064ee Updating server service 2020-06-12 15:44:04 +02:00
5f52f25da4 Update server.service.ts 2020-06-12 14:28:53 +02:00
84212c0c33 Update server.service.ts 2020-06-12 12:05:27 +02:00
d6808ba1d7 Updating mat-stepper for docker templates 2020-06-10 13:53:34 +02:00
d190765a99 Updating stepper for qemu nodes 2020-06-10 12:39:59 +02:00
68a13e293b Updating stepper for IOU devices 2020-06-10 11:41:40 +02:00
0463b8c3b8 Update add-ios-template.component.html 2020-06-10 11:18:20 +02:00
da5dcd5fe9 Update add-docker-template.component.ts 2020-06-10 10:33:14 +02:00
f06ba2bf77 Update template-mocks.service.ts 2020-06-10 10:14:33 +02:00
06e3befe0e Update project-map.component.ts 2020-06-09 17:55:35 +02:00
932c482855 Dialog for changing hostname added 2020-06-09 17:21:13 +02:00
bf292b4286 Update toaster-error-handler.ts 2020-06-09 13:17:37 +02:00
7fa49824c6 Update node.ts 2020-06-09 12:34:14 +02:00
2b380a2699 replicate_network_connection_state added to qemu configurator 2020-06-08 16:05:59 +02:00
eb9102769c Fix for chid.value is undefined 2020-06-08 11:58:11 +02:00
672d25132f Update node.ts 2020-06-05 02:32:53 +02:00
b8ded15ef7 Update project-map.component.ts 2020-06-04 03:02:17 +02:00
3a57e73192 Update symbols.component.html 2020-06-04 02:39:27 +02:00
38dc9ccced Release 2020.2.0-beta.4 2020-06-03 18:56:21 +02:00
f3b6b8393a Update ReleaseNotes.txt 2020-06-03 18:55:32 +02:00
de0454f420 Fix for platforms and adapters 2020-06-03 14:22:37 +02:00
6bf268b47f Fix for network addapters c7200, c3725, c3745, c2691 2020-06-03 12:49:05 +02:00
7625ff5cfa Update add-docker-template.component.ts 2020-06-02 18:08:25 +02:00
455a13b96f Default values in templates 2020-06-02 17:29:14 +02:00
25b1edd178 Option to upload appliance added 2020-06-02 03:15:45 +02:00
d15b4db9fe Filter option added 2020-05-29 01:37:30 +02:00
d5e0c8271b Update new-template-dialog.component.ts 2020-05-28 13:22:57 +02:00
b37b5c7134 Appliance table added 2020-05-28 03:19:59 +02:00
4992eae284 Creating appliance service 2020-05-22 17:49:21 +02:00
0cee6188fb Change sentence "on your local computer" to "locally" 2020-05-20 15:42:14 +09:30
1ed8123082 Change title to "IOU device templates" 2020-05-20 15:27:03 +09:30
424799a54d Change title to "IOS router templates" 2020-05-20 15:26:26 +09:30
5a314f2631 Merge pull request #864 from GNS3/greenkeeper/@sentry/cli-1.53.0
Update @sentry/cli to version 1.53.0
2020-05-18 21:46:40 +02:00
3adc53eda9 chore(package): update @sentry/cli to version 1.53.0 2020-05-18 18:43:26 +00:00
6fc059bd10 fix for docker templates 2020-05-15 23:46:36 +02:00
0e8f9326a3 Update adbutler.component.ts 2020-05-15 00:11:50 +02:00
9a2744bc64 Update add-docker-template.component.ts 2020-05-14 23:04:47 +02:00
d127986b03 Support for Qemu 2020-05-14 16:35:26 +02:00
9e5985c8c8 Update add-iou-template.component.html 2020-05-14 16:34:56 +02:00
5e2d3c6a87 Update add-iou-template.component.ts 2020-05-14 16:14:22 +02:00
482834594f Update add-iou-template.component.ts 2020-05-14 16:13:38 +02:00
3eda507229 Update toaster-error-handler.ts 2020-05-14 16:13:17 +02:00
2f3014fcf6 Support for IOU images 2020-05-12 15:21:18 +02:00
494055a5b5 Merge branch 'master' of https://github.com/GNS3/gns3-web-ui 2020-05-12 13:17:36 +02:00
9f58be90ea Update add-ios-template.component.ts 2020-05-12 13:17:32 +02:00
6f118413af Change "New IOS router" to "New IOS router template" 2020-05-12 11:53:51 +09:30
7a5437c29e Server type in template preferences 2020-05-08 17:02:13 +02:00
c684577c57 Server type in template preferences 2020-05-08 17:01:51 +02:00
afa9facb3a Update gns3vm.component.html 2020-05-08 14:52:46 +02:00
82891b248f Option to auto-hide menu toolbar on the left side 2020-05-07 18:09:43 +02:00
81b388a7fe New port setting for GNS3 VM preferences 2020-05-07 17:18:53 +02:00
cace01ce9a Release 2020.2.0-beta.3 2020-05-06 23:50:53 +02:00
02095ca359 Fix for node select interface 2020-05-06 23:40:33 +02:00
5e95cfdea1 Update add-ios-template.component.ts 2020-05-06 19:44:46 +02:00
449c8a97db roll back changes 2020-05-06 12:18:00 +02:00
f185762969 Update http-console-new-tab-action.component.ts 2020-05-06 11:16:31 +02:00
3f0772c352 Update bundled-server-finder.component.ts 2020-05-06 10:58:52 +02:00
79dee73590 Update template.component.ts 2020-05-06 10:03:45 +02:00
11e116f508 Release 2020.2.0-beta.2 2020-05-05 23:30:25 +02:00
5600364583 Update template.component.ts 2020-05-05 21:40:56 +02:00
e01c06a54e Update template.component.html 2020-05-05 18:19:06 +02:00
81b6eb32cf Update template.component.scss 2020-05-05 18:02:00 +02:00
53c57b069e Update project-map.component.html 2020-05-05 17:38:40 +02:00
626769aa61 Update web-console-full-window.component.ts 2020-05-05 17:05:12 +02:00
467cf2b1d8 Update ReleaseNotes.txt 2020-05-04 18:51:44 +02:00
1fd926593a Update ReleaseNotes.txt 2020-05-04 18:50:18 +02:00
9595787e59 Merge pull request #832 from GNS3/Drag-&-drop-to-add-new-nodes
Initial implementation of drag & drop to add new node
2020-05-04 18:19:20 +02:00
9b482837d8 Menu height extended 2020-05-04 18:05:39 +02:00
fe51a1797d List restyled 2020-05-04 16:36:14 +02:00
6b6ac2f312 Calculating node position updated 2020-05-04 12:35:44 +02:00
8da4407109 CanDeactivate project map component when console is open 2020-05-02 20:26:42 +02:00
c3ebdd6498 Fix for console icons 2020-05-02 11:06:25 +02:00
c23892f836 Option to minimize added 2020-05-01 23:30:30 +02:00
9e2bc25c01 Fix for console widget 2020-04-30 16:33:20 +02:00
9594e397e5 Updating drop mechanism 2020-04-30 15:16:01 +02:00
a75de3b179 Update add-ios-template.component.ts 2020-04-29 17:34:26 +02:00
e78ca38f30 Possibility to manage network adapters added 2020-04-29 17:27:47 +02:00
57c9caa40f Update add-ios-template.component.html 2020-04-28 10:31:14 +02:00
b6d02ca5d4 Default settings for templates 2020-04-27 22:38:37 +02:00
18f7f350f7 Use node names in HTTP console tabs 2020-04-27 18:02:33 +02:00
72b6be6862 IOS service updated 2020-04-22 16:36:11 +02:00
1d0baa8857 Support for adding IOS images 2020-04-21 22:35:52 +02:00
d3d897c936 Update add-docker-template.component.html 2020-04-20 19:38:06 +02:00
01d49a7321 Initial implementation of drag & drop to add new node 2020-04-20 15:21:34 +02:00
6860efa2a6 Fix for symbols component 2020-04-19 00:24:55 +02:00
505c6152fb Update project-map.component.html 2020-04-17 13:12:31 +02:00
9a33b28576 Adding node dialog updated 2020-04-16 17:40:45 +02:00
b3aee79f40 Update toaster-error-handler.ts 2020-04-16 14:58:09 +02:00
ee784783a9 fix for creating ethernet switches and hubs 2020-04-16 13:49:20 +02:00
09a03ea013 Update configurator-cloud.component.ts 2020-04-16 13:10:42 +02:00
0bcc662d91 Update project-map.component.ts 2020-04-15 22:42:58 +02:00
0e4ea77d3f Update web-console-full-window.component.ts 2020-04-15 17:18:34 +02:00
71c1798152 Update web-console.component.ts 2020-04-15 17:12:05 +02:00
1199dedc23 Update mapsettings.service.ts 2020-04-15 11:57:04 +02:00
e85fb93923 Update project-map.component.html 2020-04-14 10:26:10 +02:00
ffefd65625 Upgrade psutil to version 5.6.6 2020-04-12 21:54:20 +09:30
10f7376030 Update configurator-qemu.component.ts 2020-04-10 14:35:44 +02:00
3f4bb0b172 Update notification-box.component.ts 2020-04-10 13:07:31 +02:00
33c35308f9 Update notification-box.component.ts 2020-04-10 11:06:00 +02:00
e7766ec708 Update project-map-guard.ts 2020-04-09 13:32:41 +02:00
1afbb39d85 Update project-map.component.ts 2020-04-09 12:14:46 +02:00
1151 changed files with 47701 additions and 32449 deletions

View File

@ -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"

View File

@ -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.*/

View File

@ -0,0 +1,16 @@
name: Add new issues to GNS3 project
on:
issues:
types:
- opened
jobs:
add-to-project:
name: Add issue to project
runs-on: ubuntu-latest
steps:
- uses: actions/add-to-project@v0.4.0
with:
project-url: https://github.com/orgs/GNS3/projects/3
github-token: ${{ secrets.ADD_NEW_ISSUES_TO_PROJECT }}

76
.github/workflows/codeql.yml vendored Normal file
View File

@ -0,0 +1,76 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ "master", "master-3.0" ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ "master", "master-3.0" ]
schedule:
- cron: '38 18 * * 6'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'javascript', 'python' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Use only 'java' to analyze code written in Java, Kotlin or both
# Use only 'javascript' to analyze code written in JavaScript, TypeScript or both
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:
- name: Checkout repository
uses: actions/checkout@v3
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2
# Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
# If the Autobuild fails above, remove it and uncomment the following three lines.
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
# - run: |
# echo "Run, Build Application using script"
# ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:${{matrix.language}}"

28
.github/workflows/main.yml vendored Normal file
View File

@ -0,0 +1,28 @@
name: Build
on:
push:
branches:
- '**'
pull_request:
branches:
- master
- master-3.0
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node: [ 14, 16, 18 ]
name: Node ${{ matrix.node }}
steps:
- uses: actions/checkout@v3
- name: Setup Node ${{ matrix.node }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node }}
cache: 'yarn'
- name: Install JS dependencies
run: yarn install --frozen-lockfile --immutable
- name: Test
run: yarn test

2
.gitignore vendored
View File

@ -1,6 +1,7 @@
# See http://help.github.com/ignore-files/ for more about ignoring files.
# compiled output
/.angular
/dist
/tmp
/out-tsc
@ -11,6 +12,7 @@
/scripts/build
/scripts/dist
/env
/.angular
# dependencies
/node_modules

8
.snyk Normal file
View File

@ -0,0 +1,8 @@
# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities.
version: v1.16.0
ignore: {}
# patches apply the minimum changes required to fix a vulnerability
patch:
SNYK-JS-LODASH-567746:
- ngx-childprocess > @types/electron > electron > @electron/get > global-tunnel-ng > lodash:
patched: '2020-07-10T04:10:11.863Z'

View File

@ -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

3
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"angular.enable-strict-mode-prompt": false
}

14
.whitesource Normal file
View File

@ -0,0 +1,14 @@
{
"scanSettings": {
"configMode": "AUTO",
"configExternalURL": "",
"projectToken" : "",
"baseBranches": ["master", "master-3.0"]
},
"checkRunSettings": {
"vulnerableCheckRunConclusionLevel": "failure"
},
"issueSettings": {
"minSeverityLevel": "LOW"
}
}

View File

@ -3,11 +3,11 @@ __tests__
node_modules/*/test
node_modules/*/tests
powered-test
e2e
#e2e
# asset directories
docs
doc
#doc
website
images

View File

@ -1,5 +1,5 @@
# Dockerfile for GNS3 Web-ui development
FROM node:carbon
FROM node:stretch
# Create user
RUN useradd --user-group --create-home --shell /bin/false gns3-web-ui

View File

@ -1,16 +1,9 @@
# gns3-web-ui
[![Greenkeeper badge](https://badges.greenkeeper.io/GNS3/gns3-web-ui.svg)](https://greenkeeper.io/)
[![Travis CI](https://api.travis-ci.org/GNS3/gns3-web-ui.svg?branch=master)](https://travis-ci.org)
[![AppVeyor](https://ci.appveyor.com/api/projects/status/github/GNS3/gns3-web-ui?branch=master&svg=true)](https://www.appveyor.com/)
[![CircleCI](https://circleci.com/gh/GNS3/gns3-web-ui/tree/master.png)](https://circleci.com/gh/GNS3/gns3-web-ui/tree/master.png)
[![codecov](https://codecov.io/gh/GNS3/gns3-web-ui/branch/master/graph/badge.svg)](https://codecov.io/gh/GNS3/gns3-web-ui)
Test WebUI implementation for GNS3.
This is not production ready version. It has been made to evaluate possibility of creation Web User Interface for GNS3 application.
[![Build](https://github.com/GNS3/gns3-web-ui/actions/workflows/main.yml/badge.svg)](https://github.com/GNS3/gns3-web-ui/actions/workflows/main.yml)
[![Dependency](https://img.shields.io/librariesio/github/GNS3/gns3-web-ui)](https://libraries.io/github/GNS3/gns3-web-ui)
[![Packages versions](https://repology.org/badge/latest-versions/gns3.svg)](https://repology.org/metapackage/gns3/versions)
[![Packages](https://repology.org/badge/tiny-repos/gns3.svg)](https://repology.org/metapackage/gns3/versions)
## Demo
@ -30,6 +23,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.

5
SECURITY.md Normal file
View File

@ -0,0 +1,5 @@
# Security Policy
## Reporting a Vulnerability
Please use GitHub's report a vulnerability feature. More information can be found in https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability

View File

@ -1,207 +1,234 @@
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"gns3-web-ui": {
"root": "",
"sourceRoot": "src",
"projectType": "application",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist",
"index": "src/index.html",
"main": "src/main.ts",
"tsConfig": "src/tsconfig.app.json",
"polyfills": "src/polyfills.ts",
"extractCss": true,
"assets": [
"src/assets",
"src/favicon.ico",
"src/ReleaseNotes.txt"
],
"styles": [
"node_modules/bootstrap/dist/css/bootstrap.min.css",
"node_modules/notosans-fontface/css/notosans-fontface.min.css",
"src/styles.css",
{
"input": "src/theme.scss",
"lazy": true,
"bundleName": "theme-default-dark"
},
{
"input": "src/theme-light.scss",
"lazy": true,
"bundleName": "theme-default"
}
],
"scripts": []
},
"configurations": {
"production": {
"optimization": true,
"outputHashing": "all",
"sourceMap": {
"hidden": true,
"scripts": true,
"styles": false
},
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"gns3-web-ui": {
"root": "",
"sourceRoot": "src",
"projectType": "application",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"allowedCommonJsDependencies": [
"rxjs",
"rxjs-compat",
"uuid",
"css-tree",
"save-svg-as-png",
"angular-draggable-droppable",
"dom-set",
"dom-plane",
"mousetrap",
"@mattlewis92/dom-autoscroller",
"rxjs/Rx",
"rxjs/add/operator/map",
"rxjs-compat/add/operator/map",
"classnames",
"stylenames",
"source-map-js",
"spark-md5",
"xterm",
"xterm-addon-attach",
"xterm-addon-fit"
],
"outputPath": "dist",
"index": "src/index.html",
"main": "src/main.ts",
"tsConfig": "src/tsconfig.app.json",
"polyfills": "src/polyfills.ts",
"assets": [
"src/assets",
"src/favicon.ico",
"src/ReleaseNotes.txt"
],
"styles": [
"node_modules/bootstrap/dist/css/bootstrap.min.css",
"node_modules/notosans-fontface/css/notosans-fontface.min.css",
"src/styles.scss",
"src/theme.scss"
],
"scripts": [],
"vendorChunk": true,
"extractLicenses": false,
"buildOptimizer": true,
"sourceMap": true,
"optimization": false,
"namedChunks": true,
"aot": true
},
"configurations": {
"production": {
"budgets": [{
"type": "anyComponentStyle",
"maximumWarning": "6kb"
}],
"optimization": true,
"outputHashing": "all",
"sourceMap": {
"hidden": true,
"scripts": true,
"styles": false
},
"namedChunks": false,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"fileReplacements": [{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}]
},
"electronProd": {
"budgets": [{
"type": "anyComponentStyle",
"maximumWarning": "6kb"
}],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"namedChunks": false,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"fileReplacements": [{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.electron.prod.ts"
}]
},
"electronDev": {
"budgets": [{
"type": "anyComponentStyle",
"maximumWarning": "6kb"
}],
"fileReplacements": [{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.electron.ts"
}]
},
"githubProd": {
"budgets": [{
"type": "anyComponentStyle",
"maximumWarning": "6kb"
}],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"namedChunks": false,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"fileReplacements": [{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.github.prod.ts"
}]
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "gns3-web-ui:build"
},
"configurations": {
"production": {
"browserTarget": "gns3-web-ui:build:production"
},
"electronProd": {
"browserTarget": "gns3-web-ui:build:electronProd"
},
"electronDev": {
"browserTarget": "gns3-web-ui:build:electronDev"
},
"githubProd": {
"browserTarget": "gns3-web-ui:build:githubProd"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "gns3-web-ui:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "src/test.ts",
"karmaConfig": "./karma.conf.js",
"polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.spec.json",
"scripts": [],
"styles": [
"node_modules/bootstrap/dist/css/bootstrap.min.css",
"node_modules/notosans-fontface/css/notosans-fontface.min.css",
"src/styles.scss",
"src/theme.scss"
],
"sourceMap": false,
"assets": [
"src/assets",
"src/favicon.ico"
]
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"src/tsconfig.app.json",
"src/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**",
"**/*.spec.ts"
]
}
}
]
},
"electronProd": {
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.electron.prod.ts"
"schematics": {
"@schematics/angular:component": {
"style": "scss"
}
]
},
"electronDev": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.electron.ts"
}
]
},
"githubProd": {
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.github.prod.ts"
}
]
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "gns3-web-ui:build"
},
"configurations": {
"production": {
"browserTarget": "gns3-web-ui:build:production"
},
"electronProd": {
"browserTarget": "gns3-web-ui:build:electronProd"
},
"electronDev": {
"browserTarget": "gns3-web-ui:build:electronDev"
},
"githubProd": {
"browserTarget": "gns3-web-ui:build:githubProd"
"gns3-web-ui-e2e": {
"root": "e2e",
"sourceRoot": "e2e",
"projectType": "application",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "./protractor.conf.js",
"devServerTarget": "gns3-web-ui:serve"
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"e2e/tsconfig.e2e.json"
],
"exclude": [
"**/node_modules/**"
]
}
}
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "gns3-web-ui:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "src/test.ts",
"karmaConfig": "./karma.conf.js",
"polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.spec.json",
"scripts": [],
"styles": [
"node_modules/bootstrap/dist/css/bootstrap.min.css",
"node_modules/notosans-fontface/css/notosans-fontface.min.css",
"src/styles.css",
"src/theme.scss"
],
"assets": [
"src/assets",
"src/favicon.ico"
],
"codeCoverageExclude": [
"src/app/cartography/components/experimental-map/**/*"
]
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"src/tsconfig.app.json",
"src/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"gns3-web-ui-e2e": {
"root": "e2e",
"sourceRoot": "e2e",
"projectType": "application",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "./protractor.conf.js",
"devServerTarget": "gns3-web-ui:serve"
}
"schematics": {
"@schematics/angular:component": {
"prefix": "app",
"style": "scss"
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"e2e/tsconfig.e2e.json"
],
"exclude": [
"**/node_modules/**"
]
}
"@schematics/angular:directive": {
"prefix": "app"
}
}
}
},
"defaultProject": "gns3-web-ui",
"schematics": {
"@schematics/angular:component": {
"prefix": "app",
"styleext": "scss"
},
"@schematics/angular:directive": {
"prefix": "app"
"cli": {
"analytics": false
}
}
}

1
debug.log Normal file
View File

@ -0,0 +1 @@
[1109/003452.026:ERROR:directory_reader_win.cc(43)] FindFirstFile: The system cannot find the path specified. (0x3)

View File

@ -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();

View File

@ -0,0 +1,43 @@
import { TestHelper } from './helpers/common.po';
import { ControllersPage } from './helpers/controller.po';
describe('Controllers page', () => {
let page: ControllersPage;
let helper: TestHelper;
beforeEach(() => {
page = new ControllersPage();
helper = new TestHelper();
});
xit('user should have possibility to add controller', async () => {
// arrange
page.maximizeWindow();
await page.navigateToControllersPage();
// act
let text = await page.getAddControllerNotificationText();
// assert
expect(text).toBe("We've discovered GNS3 controller on 127.0.0.1:3080, would you like to add to the list?");
});
it('user should see added controller in the list', async () => {
// arrange
page.maximizeWindow();
await page.navigateToControllersPage();
await page.clickAddController();
helper.sleep(1000);
// act
let firstRowOfControllersTable = await page.checkControllersTable();
let controllerData = [];
await helper.asyncForEach(firstRowOfControllersTable, async (element) => {
controllerData.push(await element.getText());
});
// assert
expect(controllerData).toContain('127.0.0.1');
expect(controllerData).toContain('3080');
});
});

View File

@ -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();
}
}

View File

@ -0,0 +1,41 @@
import { browser, by } from 'protractor';
import { TestHelper } from './common.po';
export class ControllersPage {
helper = new TestHelper();
maximizeWindow() {
browser.driver.manage().window().maximize();
}
navigateToControllersPage() {
return browser.get('/controllers');
}
getAddControllerNotificationText() {
return browser.driver.findElement(by.className('mat-card-content')).getText();
}
async clickAddController() {
let controllerTable = await this.checkControllersTable();
if (controllerTable.length === 0) {
let buttons = await browser.driver.findElements(by.className('mat-button mat-button-base'));
await buttons[3].click();
}
}
checkControllersTable() {
return browser.driver.findElements(by.css('mat-cell'));
}
async navigateToControllerProjects() {
this.helper.sleep(2000);
let hyperlinks = await browser.driver.findElements(by.css('a.table-link'));
let controllerLink;
await this.helper.asyncForEach(hyperlinks, async (element) => {
let text = await element.getText();
if (text === '127.0.0.1') controllerLink = element;
});
await controllerLink.click();
}
}

View File

@ -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;
}
}

View File

@ -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();
}
}

View File

@ -1,41 +0,0 @@
import { browser, by, element } from 'protractor';
import { TestHelper } from './common.po';
export class ServersPage {
helper = new TestHelper;
maximizeWindow() {
browser.driver.manage().window().maximize();
}
navigateToServersPage() {
return browser.get('/servers');
}
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();
}
}
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();
}
}

View File

@ -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 { ControllersPage } from './helpers/controller.po';
describe('Project map page', () => {
let serversPage: ServersPage;
let projectsPage: ProjectsPage;
let projectMapPage: ProjectMapPage;
let helper: TestHelper;
let controllersPage: ControllersPage;
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 () => {
controllersPage = new ControllersPage();
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);
});
controllersPage.maximizeWindow();
await controllersPage.navigateToControllersPage();
await controllersPage.clickAddController();
await controllersPage.navigateToControllerProjects();
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);
});
});

View File

@ -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 { ControllersPage } from './helpers/controller.po';
describe('Projects page', () => {
let serversPage: ServersPage;
let projectsPage: ProjectsPage;
let helper: TestHelper;
let controllersPage: ControllersPage;
let projectsPage: ProjectsPage;
let helper: TestHelper;
beforeEach(() => {
serversPage = new ServersPage();
projectsPage = new ProjectsPage();
helper = new TestHelper();
});
beforeEach(() => {
controllersPage = new ControllersPage();
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
controllersPage.maximizeWindow();
await controllersPage.navigateToControllersPage();
await controllersPage.clickAddController();
await controllersPage.navigateToControllerProjects();
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('controller/1/project/');
});
});

View File

@ -1,44 +0,0 @@
import { ServersPage } from './helpers/server.po';
import { TestHelper } from './helpers/common.po';
import { element } from 'protractor';
describe('Servers page', () => {
let page: ServersPage;
let helper: 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());
});
// assert
expect(serverData).toContain('127.0.0.1');
expect(serverData).toContain('3080');
});
});

View File

@ -1,5 +1,5 @@
{
"extends": "../tsconfig.json",
"extends": "../tsconfig.base.json",
"compilerOptions": {
"outDir": "../out-tsc/e2e",
"baseUrl": "./",

View File

@ -15,7 +15,7 @@ files:
- renderer.js
- sentry.js
- installed-software.js
- local-server.js
- local-controller.js
- console-executor.js
- package.json

View File

@ -19,13 +19,13 @@ module.exports = function (config) {
dir: require('path').join(__dirname, 'coverage'), reports: [ 'html', 'lcovonly' ],
fixWebpackSourcePaths: true
},
reporters: ['progress', 'kjhtml'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
singleRun: false
browsers: ['ChromeHeadless'],
singleRun: true
});
};

View File

@ -8,9 +8,9 @@ const { app } = require('electron')
const isWin = /^win/.test(process.platform);
let runningServers = {};
let runningControllers = {};
exports.getLocalServerPath = async () => {
exports.getLocalControllerPath = async () => {
let binary = isWin ? 'gns3server.exe': 'gns3server';
return findBinary('exe.', binary);
}
@ -20,27 +20,27 @@ exports.getUbridgePath = async () => {
return findBinary('ubridge', binary);
}
exports.startLocalServer = async (server) => {
return await run(server, {
exports.startLocalController = async (controller) => {
return await run(controller, {
logStdout: true
});
}
exports.stopLocalServer = async (server) => {
return await stop(server.name);
exports.stopLocalController = async (controller) => {
return await stop(controller.name);
}
exports.getRunningServers = () => {
return Object.keys(runningServers);
exports.getRunningControllers = () => {
return Object.keys(runningControllers);
}
exports.stopAllLocalServers = async () => {
exports.stopAllLocalControllers = async () => {
return await stopAll();
}
async function findBinary(binaryDirectory, filename) {
const lookupDirectories = [
__dirname,
__dirname,
path.dirname(app.getPath('exe'))
];
@ -60,7 +60,7 @@ async function findBinaryInDirectory(baseDirectory, binaryDirectory, filename) {
}
const files = fs.readdirSync(distDirectory);
let binaryPath = null;
files.forEach((directory) => {
@ -77,33 +77,33 @@ async function findBinaryInDirectory(baseDirectory, binaryDirectory, filename) {
}
function getServerArguments(server, overrides, configPath) {
let serverArguments = [];
if(server.host) {
serverArguments.push('--host');
serverArguments.push(server.host);
function getControllerArguments(controller, overrides, configPath) {
let controllerArguments = [];
if(controller.host) {
controllerArguments.push('--host');
controllerArguments.push(controller.host);
}
if(server.port) {
serverArguments.push('--port');
serverArguments.push(server.port);
if(controller.port) {
controllerArguments.push('--port');
controllerArguments.push(controller.port);
}
serverArguments.push('--local');
controllerArguments.push('--local');
if(configPath) {
serverArguments.push('--config');
serverArguments.push(configPath);
controllerArguments.push('--config');
controllerArguments.push(configPath);
}
return serverArguments;
return controllerArguments;
}
function getChannelForServer(server) {
return `local-server-run-${server.name}`;
function getChannelForController(controller) {
return `local-controller-run-${controller.name}`;
}
function notifyStatus(status) {
ipcMain.emit('local-server-status-events', status);
ipcMain.emit('local-controller-status-events', status);
}
function filterOutput(line) {
@ -120,44 +120,44 @@ function filterOutput(line) {
}
async function stopAll() {
for(var serverName in runningServers) {
let result, error = await stop(serverName);
for(var controllerName in runningControllers) {
let result, error = await stop(controllerName);
}
console.log(`Stopped all servers`);
console.log(`Stopped all controllers`);
}
async function stop(serverName) {
async function stop(controllerName) {
let pid = undefined;
const runningServer = runningServers[serverName];
const runningController = runningControllers[controllerName];
if(runningServer !== undefined && runningServer.process) {
pid = runningServer.process.pid;
if(runningController !== undefined && runningController.process) {
pid = runningController.process.pid;
}
console.log(`Stopping '${serverName}' with PID='${pid}'`);
console.log(`Stopping '${controllerName}' with PID='${pid}'`);
const stopped = new Promise((resolve, reject) => {
if(pid === undefined) {
resolve(`Server '${serverName} is already stopped`);
delete runningServers[serverName];
resolve(`Controller '${controllerName} is already stopped`);
delete runningControllers[controllerName];
return;
}
kill(pid, (error) => {
if(error) {
console.error(`Error occured during stopping '${serverName}' with PID='${pid}'`);
console.error(`Error occured during stopping '${controllerName}' with PID='${pid}'`);
reject(error);
}
else {
delete runningServers[serverName];
console.log(`Stopped '${serverName}' with PID='${pid}'`);
resolve(`Stopped '${serverName}' with PID='${pid}'`);
delete runningControllers[controllerName];
console.log(`Stopped '${controllerName}' with PID='${pid}'`);
resolve(`Stopped '${controllerName}' with PID='${pid}'`);
notifyStatus({
serverName: serverName,
controllerName: controllerName,
status: 'stopped',
message: `Server '${serverName}' stopped'`
message: `Controller '${controllerName}' stopped'`
});
}
});
@ -166,11 +166,11 @@ async function stop(serverName) {
return stopped;
}
async function getIniFile(server) {
return path.join(app.getPath('userData'), `gns3_server_${server.id}.ini`);
async function getIniFile(controller) {
return path.join(app.getPath('userData'), `gns3_controller_${controller.id}.ini`);
}
async function configure(configPath, server) {
async function configure(configPath, controller) {
if(!fs.existsSync(configPath)) {
fs.closeSync(fs.openSync(configPath, 'w'));
console.log(`Configuration file '${configPath}' has been created.`);
@ -178,20 +178,20 @@ async function configure(configPath, server) {
var config = ini.parse(fs.readFileSync(configPath, 'utf-8'));
if(server.path) {
config.path = server.path;
if(controller.path) {
config.path = controller.path;
}
if(server.host) {
config.host = server.host;
if(controller.host) {
config.host = controller.host;
}
if(server.port) {
config.port = server.port;
if(controller.port) {
config.port = controller.port;
}
if(server.ubridge_path) {
config.ubridge_path = server.ubridge_path;
if(controller.ubridge_path) {
config.ubridge_path = controller.ubridge_path;
}
fs.writeFileSync(configPath, ini.stringify(config, { section: 'Server' }));
fs.writeFileSync(configPath, ini.stringify(config, { section: 'Controller' }));
}
async function setPATHEnv() {
@ -216,7 +216,7 @@ async function setPATHEnv() {
process.env.PATH = extra.join(";");
}
async function run(server, options) {
async function run(controller, options) {
if(!options) {
options = {};
}
@ -226,34 +226,34 @@ async function run(server, options) {
console.log(`Configuring`);
const configPath = await getIniFile(server);
await configure(configPath, server);
const configPath = await getIniFile(controller);
await configure(configPath, controller);
console.log(`Setting up PATH`);
await setPATHEnv();
console.log(`Running '${server.path}'`);
console.log(`Running '${controller.path}'`);
let serverProcess = spawn(server.path, getServerArguments(server, {}, configPath));
let controllerProcess = spawn(controller.path, getControllerArguments(controller, {}, configPath));
notifyStatus({
serverName: server.name,
controllerName: controller.name,
status: 'started',
message: `Server '${server.name}' started'`
message: `Controller '${controller.name}' started'`
});
runningServers[server.name] = {
process: serverProcess
runningControllers[controller.name] = {
process: controllerProcess
};
serverProcess.stdout.on('data', function(data) {
controllerProcess.stdout.on('data', function(data) {
const line = data.toString();
const { isCritical, errorMessage } = filterOutput(line);
if(isCritical) {
notifyStatus({
serverName: server.name,
controllerName: controller.name,
status: 'stderr',
message: `Server reported error: '${errorMessage}`
message: `Controller reported error: '${errorMessage}`
});
}
@ -262,25 +262,25 @@ async function run(server, options) {
}
});
serverProcess.stderr.on('data', function(data) {
controllerProcess.stderr.on('data', function(data) {
if(logSterr) {
console.log(data.toString());
}
});
serverProcess.on('exit', (code, signal) => {
controllerProcess.on('exit', (code, signal) => {
notifyStatus({
serverName: server.name,
controllerName: controller.name,
status: 'errored',
message: `Server '${server.name}' has exited with status='${code}'`
message: `controller '${controller.name}' has exited with status='${code}'`
});
});
serverProcess.on('error', (err) => {
controllerProcess.on('error', (err) => {
notifyStatus({
serverName: server.name,
controllerName: controller.name,
status: 'errored',
message: `Server errored: '${err}`
message: `Controller errored: '${err}`
});
});
@ -297,9 +297,9 @@ async function main() {
}
if(ipcMain) {
ipcMain.on('local-server-run', async function (event, server) {
const responseChannel = getChannelForServer();
await run(server);
ipcMain.on('local-controller-run', async function (event, controller) {
const responseChannel = getChannelForController();
await run(controller);
event.sender.send(responseChannel, {
success: true
});
@ -318,4 +318,4 @@ if (require.main === module) {
});
main();
}
}

View File

@ -1,6 +1,6 @@
{
"name": "gns3-web-ui",
"version": "2020.2.0-beta.1",
"version": "3.0.0.dev7",
"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",
@ -34,94 +35,106 @@
"prettier:write": "yarn prettier:base -- --write \"src/**/*.{ts,js,html,scss}\"",
"generate-licenses-file": "yarn license-checker --production --csv --out licenses.csv",
"prebuildforelectron": "node set-variables-in-env.js --set src/environments/environment.electron.prod.ts",
"postbuildforelectron": "node set-variables-in-env.js --unset src/environments/environment.electron.prod.ts"
"postbuildforelectron": "node set-variables-in-env.js --unset src/environments/environment.electron.prod.ts",
"postinstall": "ngcc --properties es2020 browser module main --first-only --create-ivy-entry-points --tsconfig \"./src/tsconfig.app.json\" && ngcc --properties es2020 browser module main --first-only --create-ivy-entry-points --tsconfig \"./src/tsconfig.app.json\"",
"snyk-protect": "snyk-protect",
"prepare": "yarn run snyk-protect"
},
"private": true,
"dependencies": {
"@angular/animations": "^8.2.11",
"@angular/cdk": "^8.2.3",
"@angular/common": "^8.2.11",
"@angular/compiler": "^8.2.11",
"@angular/core": "^8.2.11",
"@angular/forms": "^8.2.11",
"@angular/http": "^7.2.15",
"@angular/material": "^8.2.3",
"@angular/platform-browser": "^8.2.11",
"@angular/platform-browser-dynamic": "^8.2.11",
"@angular/router": "^8.2.11",
"angular-draggable-droppable": "^4.3.8",
"angular-persistence": "^1.0.1",
"angular-resizable-element": "^3.2.6",
"angular2-draggable": "^2.3.2",
"angular2-hotkeys": "^2.1.5",
"angular2-indexeddb": "^1.2.3",
"bootstrap": "4.3.1",
"command-exists": "^1.2.8",
"core-js": "^3.3.2",
"css-tree": "^1.0.0-alpha.36",
"d3-ng2-service": "^2.1.0",
"file-saver": "^2.0.2",
"hammerjs": "^2.0.8",
"ini": "^1.3.5",
"@angular/animations": "^14.3.0",
"@angular/cdk": "^14.2.7",
"@angular/common": "^14.3.0",
"@angular/compiler": "^14.3.0",
"@angular/core": "^14.3.0",
"@angular/forms": "^14.3.0",
"@angular/material": "^14.2.7",
"@angular/platform-browser": "^14.3.0",
"@angular/platform-browser-dynamic": "^14.3.0",
"@angular/router": "^14.3.0",
"@sentry/browser": "^6.14.1",
"@snyk/protect": "^1.972.0",
"@types/jest": "^27.0.2",
"@types/mocha": "^9.1.1",
"@types/react": "^17.0.34",
"@types/react-dom": "^17.0.11",
"angular-draggable-droppable": "^6.1.0",
"angular-resizable-element": "^3.4.0",
"autoprefixer": "10.4.5",
"bootstrap": "^5.1.3",
"command-exists": "^1.2.9",
"core-js": "^3.22.3",
"css-tree": "^2.1.0",
"d3-ng2-service": "^2.2.0",
"eev": "^0.1.5",
"ini": "^3.0.0",
"marked": "^4.0.14",
"material-design-icons": "^3.0.1",
"ng-circle-progress": "^1.5.1",
"ng2-file-upload": "^1.3.0",
"mousetrap": "^1.6.5",
"ng-circle-progress": "^1.6.0",
"ng2-file-upload": "^3.0.0",
"ngx-childprocess": "^0.0.6",
"ngx-device-detector": "^1.3.18",
"ngx-electron": "^2.1.1",
"node-fetch": "^2.6.0",
"notosans-fontface": "^1.1.0",
"raven-js": "^3.27.2",
"rxjs": "^6.5.3",
"rxjs-compat": "^6.5.3",
"save-html-as-image": "^1.2.0",
"save-svg-as-png": "^1.4.14",
"svg-crowbar": "^0.2.4",
"tree-kill": "^1.2.1",
"typeface-roboto": "^0.0.75",
"xterm": "^4.1.0",
"xterm-addon-attach": "^0.5.0",
"xterm-addon-fit": "^0.3.0",
"yargs": "^15.0.2",
"zone.js": "^0.10.2"
"ngx-device-detector": "4.0.1",
"ngx-electron": "^2.2.0",
"node-fetch": "^3.2.10",
"notosans-fontface": "^1.3.0",
"postcss-loader": "^6.2.1",
"prettier-plugin-organize-imports": "^2.3.4",
"rxjs": "^6.6.7",
"rxjs-compat": "^6.6.7",
"save-svg-as-png": "^1.4.17",
"spark-md5": "^3.0.2",
"svg-crowbar": "^0.7.0",
"tree-kill": "^1.2.2",
"tslib": "^2.4.0",
"typeface-roboto": "^1.1.13",
"xterm": "^4.18.0",
"xterm-addon-attach": "^0.6.0",
"xterm-addon-fit": "^0.5.0",
"yargs": "^17.4.1",
"zone.js": "^0.11.5"
},
"devDependencies": {
"@angular-devkit/build-angular": "^0.803.10",
"@angular/cli": "^8.3.10",
"@angular/compiler-cli": "^8.2.11",
"@angular/language-service": "^8.2.11",
"@sentry/cli": "^1.48.0",
"@sentry/electron": "^0.17.4",
"@types/jasmine": "^3.4.4",
"@types/jasminewd2": "^2.0.8",
"@types/node": "^12.12.10",
"codelyzer": "^5.1.2",
"electron": "7.1.2",
"electron-builder": "21.2.0",
"jasmine-core": "~3.5.0",
"jasmine-spec-reporter": "~4.2.1",
"jquery": "^3.4.1",
"karma": "~4.4.0",
"karma-chrome-launcher": "~3.1.0",
"karma-cli": "~2.0.0",
"karma-coverage-istanbul-reporter": "^2.1.0",
"karma-jasmine": "~2.0.1",
"karma-jasmine-html-reporter": "^1.4.2",
"@angular-devkit/build-angular": "^14.2.12",
"@angular/cli": "^14.2.12",
"@angular/compiler-cli": "^14.3.0",
"@angular/language-service": "^14.3.0",
"@sentry/cli": "^2.0.4",
"@sentry/electron": "^3.0.7",
"@types/jasmine": "^4.0.3",
"@types/jasminewd2": "^2.0.10",
"@types/node": "^17.0.31",
"codelyzer": "^0.0.28",
"electron": "13.6.6",
"electron-builder": "^23.0.3",
"file-loader": "^6.2.0",
"jasmine-core": "^4.1.0",
"jasmine-spec-reporter": "^7.0.0",
"jquery": "^3.6.0",
"karma": "^6.3.19",
"karma-chrome-launcher": "^3.1.1",
"karma-cli": "^2.0.0",
"karma-coverage-istanbul-reporter": "^3.0.3",
"karma-jasmine": "^5.0.0",
"karma-jasmine-html-reporter": "^1.7.0",
"license-checker": "^25.0.1",
"node-sass": "^4.12.0",
"popper.js": "^1.16.0",
"prettier": "^1.18.2",
"protractor": "~5.4.2",
"replace": "^1.1.1",
"ts-mockito": "^2.5.0",
"ts-node": "~8.4.1",
"tslint": "~5.20.0",
"popper.js": "^1.16.1",
"prettier": "^2.6.2",
"protractor": "^7.0.0",
"replace": "^1.2.1",
"rxjs-tslint": "^0.1.8",
"ts-mockito": "^2.6.1",
"ts-node": "^10.7.0",
"tslint": "^6.1.3",
"tslint-config-prettier": "^1.18.0",
"typescript": ">=3.4.0 <3.6.0"
"typescript": "4.6.4",
"webpack": "^5.72.0",
"yarn-upgrade-all": "^0.7.1"
},
"greenkeeper": {
"ignore": [
"typescript"
]
}
}
},
"snyk": true
}

View File

@ -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'
@ -277,13 +279,11 @@ def build_command(arguments):
]
excludes = [
"raven.deprecation", # reported problem in raven package (6.4.0)
"distutils", # issue on macOS
"tkinter", # issue on Windows
]
packages = [
"raven",
"psutil",
"asyncio",
"packaging", # needed for linux

View File

@ -1,7 +1,6 @@
setuptools==40.8.0
setuptools==65.5.1
cx_Freeze==5.1.1
requests==2.21.0
packaging==19.0
appdirs==1.4.3
psutil==5.6.3
jsonschema==2.6.0 # lock down jsonschema, 3.0 makes problems
requests==2.31.0
packaging==20.9
appdirs==1.4.4
psutil==5.8.0

View File

@ -1,6 +1,111 @@
GNS3 WebUI is web implementation of user interface for GNS3 software.
Current version: GNS3 Web UI 2020.2.0
Current version: 2.2.24
Bug Fixes & enhancements
- security fixes
Current version: 2020.4.0-beta.1
Bug Fixes & enhancements
- symbol is not properly selected in change symbol dialog
- issue when using the scroll wheel on the web console
- missing settings for Docker nodes
- error on servers page
What's new
- double click nodes to open the console
Current version: 2020.3.0-beta.3
Bug Fixes & enhancements
- direct download URL in template dialog
- fix for issues with suspnded nodes
- fix for bug with deleting templates
- fix for importing images
What's new
- Option to resize console
- Improvements in creating templates
GNS3 Web UI 2020.3.0-beta.1
Bug Fixes & enhancements
- refreshing list of templates after adding new template from project map 
- link to preferences from project page 
- disallow user to create Qemu template when binary is not selected 
- extending the time for notification to appear 
- open first settings menu at start 
- the menu for the map rearranged 
- restyling SystemStatus page 
- marking files which already exist in appliance wizard
What's new
- Option to import appliances
GNS3 Web UI 2020.2.0-beta.5
Bug Fixes
- Bug in symbol selection
- Same question is asked after going back to project
- Cannot read property 'forEach' of undefined
- Error when selecting existing Docker image
- Invalid property when adding VMware VM template
- Invalid type for adapters field when adding Docker template
- Prevent user to move to another step when adding template
- Web UI cannot set flag "Leave this project running in the background after closing"
What's new
- Default values in templates
- New option for Qemu VMs
- Ability to quickly change Hostname from right click
- Progress bar for node creation
GNS3 Web UI 2020.2.0-beta.4
Bug Fixes
- New port setting for GNS3 VM preferences
- Option to auto-hide menu toolbar on the left side
-Controller type in template preferences
- Error when selecting existing Docker image
- Default values in templates
- TypeError: Cannot read property 'message' of undefined
- TypeError: e.error is undefined
- TypeError: Cannot read property 'placements' of null
- Creating IOS templates -> fix for platforms and network adapters
GNS3 Web UI 2020.2.0-beta.2
What's New
- Drag & drop to add new nodes on topology
- Option to minimize/maximize and hide console widget
- Ability to add IOS templates
- Node names in HTTP console tabs
- Default settings for templates
- Support for adding IOS images
- Node dialog updated
- Messages with description in toasts
- Adding interfaces to cloud nodes
- Changes in notification box mechanism (once per day option)
- Additional tooltips added
- Copy/paste options in console (only Chrome full support)
- More details for server failed connections
Bug Fixes
- Fix for console icons
- Fix for creating ethernet switches and hubs
- Fix for opening console from context menu
- Qemu configurator now works properly
- Fixes in snap to grid option
- Symbols preview now works correctly
- Error messages in preferences should be displayed
- Default values for New Ethernet devices in configurator
- Fix for wrong adapter types in Qemu
- Fix for fit in view option on Firefox
- Fix for navigation errors
GNS3 Web UI 2020.2.0-beta.1
What's New
- Support for suspended status added

View File

@ -1,173 +1,320 @@
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 { BundledControllerFinderComponent } from './components/bundled-controller-finder/bundled-controller-finder.component';
import { DirectLinkComponent } from './components/direct-link/direct-link.component';
import { HelpComponent } from './components/help/help.component';
import { InstalledSoftwareComponent } from './components/installed-software/installed-software.component';
import { LoginComponent } from './components/login/login.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 { 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 { 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 { ListOfSnapshotsComponent } from './components/snapshots/list-of-snapshots/list-of-snapshots.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 { ControllersComponent } from './components/controllers/controllers.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 { Gns3vmComponent } from './components/preferences/gns3vm/gns3vm.component';
import { DirectLinkComponent } from './components/direct-link/direct-link.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 { ProjectMapGuard } from './guards/project-map-guard';
import { WebConsoleFullWindowComponent } from './components/web-console-full-window/web-console-full-window.component';
import { ConsoleGuard } from './guards/console-guard';
import { LoginGuard } from './guards/login-guard';
import { DefaultLayoutComponent } from './layouts/default-layout/default-layout.component';
import { ControllerResolve } from './resolvers/controller-resolve';
import { UserManagementComponent } from './components/user-management/user-management.component';
import { LoggedUserComponent } from './components/users/logged-user/logged-user.component';
import { ImageManagerComponent } from './components/image-manager/image-manager.component';
import { UserDetailComponent } from "./components/user-management/user-detail/user-detail.component";
import { UserDetailResolver } from "./resolvers/user-detail.resolver";
import { ManagementComponent } from "./components/management/management.component";
import { PermissionResolver } from "./resolvers/permission.resolver";
import { UserGroupsResolver } from "./resolvers/user-groups.resolver";
import { UserPermissionsResolver } from "./resolvers/user-permissions.resolver";
import { GroupManagementComponent } from "./components/group-management/group-management.component";
import { RoleManagementComponent } from "./components/role-management/role-management.component";
import { PermissionsManagementComponent } from "./components/permissions-management/permissions-management.component";
import { GroupDetailsComponent } from "./components/group-details/group-details.component";
import { GroupMembersResolver } from "./resolvers/group-members.resolver";
import { GroupResolver } from "./resolvers/group.resolver";
import { GroupRoleResolver } from "./resolvers/group-role.resolver";
import { RoleDetailComponent } from "./components/role-management/role-detail/role-detail.component";
import { RoleDetailResolver } from "./resolvers/role-detail.resolver";
import { RolePermissionsComponent } from "./components/role-management/role-detail/role-permissions/role-permissions.component";
import { UserPermissionsComponent } from "./components/user-management/user-detail/user-permissions/user-permissions.component";
const routes: Routes = [
{
path: '',
component: DefaultLayoutComponent,
children: [
{ path: '', redirectTo: 'servers', pathMatch: 'full' },
{ path: 'servers', component: ServersComponent },
{ path: 'bundled', component: BundledServerFinderComponent },
{
path: 'server/:server_id/projects',
{ path: '', redirectTo: 'controllers', pathMatch: 'full' },
{ path: 'controllers', component: ControllersComponent },
{ path: 'bundled', component: BundledControllerFinderComponent },
{ path: 'controller/:controller_id/login', component: LoginComponent },
{ path: 'controller/:controller_id/loggeduser', component: LoggedUserComponent },
{path : 'controller/:controller_id/image-manager', component: ImageManagerComponent},
{
path: 'controller/:controller_id/projects',
component: ProjectsComponent,
resolve: { server : ServerResolve }
canActivate: [LoginGuard],
resolve: { controller: ControllerResolve },
},
{ path: 'controller/:controller_id/help', component: HelpComponent },
{ path: 'controller/:controller_id/settings', component: SettingsComponent },
{ path: 'controller/:controller_id/settings/console', component: ConsoleComponent },
{
path: 'controller/:controller_id/management/users/:user_id',
component: UserDetailComponent,
canActivate: [LoginGuard],
resolve: {
user: UserDetailResolver,
groups: UserGroupsResolver,
permissions: UserPermissionsResolver,
controller: ControllerResolve},
},
{ path: 'help', component: HelpComponent },
{ path: 'settings', component: SettingsComponent },
{ path: 'settings/console', component: ConsoleComponent },
{ path: 'installed-software', component: InstalledSoftwareComponent },
{ path: 'server/:server_id/systemstatus', component: SystemStatusComponent },
{ path: 'controller/:controller_id/systemstatus', component: SystemStatusComponent, canActivate: [LoginGuard] },
{ path: 'server/:server_ip/:server_port/project/:project_id', component: DirectLinkComponent},
{
path: 'server/:server_id/project/:project_id/snapshots',
{ path: 'controller/:controller_ip/:controller_port/project/:project_id', component: DirectLinkComponent, canActivate: [LoginGuard] },
{
path: 'controller/:controller_id/project/:project_id/snapshots',
component: ListOfSnapshotsComponent,
resolve: { server : ServerResolve }
canActivate: [LoginGuard],
resolve: { controller: ControllerResolve },
},
{ 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: 'controller/:controller_id/preferences', component: PreferencesComponent, canActivate: [LoginGuard] },
// { path: 'controller/:controller_id/preferences/general', component: GeneralPreferencesComponent },
{ path: 'controller/:controller_id/preferences/builtin', component: BuiltInPreferencesComponent, canActivate: [LoginGuard] },
{ 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: 'controller/:controller_id/preferences/builtin/ethernet-hubs', component: EthernetHubsTemplatesComponent, canActivate: [LoginGuard] },
{
path: 'controller/:controller_id/preferences/builtin/ethernet-hubs/addtemplate',
component: EthernetHubsAddTemplateComponent,
canActivate: [LoginGuard]
},
{
path: 'controller/:controller_id/preferences/builtin/ethernet-hubs/:template_id',
component: EthernetHubsTemplateDetailsComponent,
canActivate: [LoginGuard]
},
{ 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: 'controller/:controller_id/preferences/builtin/ethernet-switches',
component: EthernetSwitchesTemplatesComponent,
canActivate: [LoginGuard]
},
{
path: 'controller/:controller_id/preferences/builtin/ethernet-switches/addtemplate',
component: EthernetSwitchesAddTemplateComponent,
canActivate: [LoginGuard]
},
{
path: 'controller/:controller_id/preferences/builtin/ethernet-switches/:template_id',
component: EthernetSwitchesTemplateDetailsComponent,
canActivate: [LoginGuard]
},
{ 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: 'controller/:controller_id/preferences/builtin/cloud-nodes', component: CloudNodesTemplatesComponent, canActivate: [LoginGuard] },
{
path: 'controller/:controller_id/preferences/builtin/cloud-nodes/addtemplate',
component: CloudNodesAddTemplateComponent,
canActivate: [LoginGuard]
},
{
path: 'controller/:controller_id/preferences/builtin/cloud-nodes/:template_id',
component: CloudNodesTemplateDetailsComponent,
canActivate: [LoginGuard]
},
//{ 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: 'controller/:controller_id/preferences/dynamips', component: DynamipsPreferencesComponent },
{ path: 'controller/:controller_id/preferences/dynamips/templates', component: IosTemplatesComponent, canActivate: [LoginGuard] },
{ path: 'controller/:controller_id/preferences/dynamips/templates/addtemplate', component: AddIosTemplateComponent, canActivate: [LoginGuard] },
{ path: 'controller/:controller_id/preferences/dynamips/templates/:template_id', component: IosTemplateDetailsComponent, canActivate: [LoginGuard] },
{
path: 'controller/:controller_id/preferences/dynamips/templates/:template_id/copy',
component: CopyIosTemplateComponent,
canActivate: [LoginGuard]
},
// { 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', component: QemuVmTemplateDetailsComponent },
{ path: 'server/:server_id/preferences/qemu/addtemplate', component: AddQemuVmTemplateComponent },
// { path: 'controller/:controller_id/preferences/qemu', component: QemuPreferencesComponent },
{ path: 'controller/:controller_id/preferences/qemu/templates', component: QemuVmTemplatesComponent, canActivate: [LoginGuard] },
{
path: 'controller/:controller_id/preferences/qemu/templates/:template_id/copy',
component: CopyQemuVmTemplateComponent,
canActivate: [LoginGuard]
},
{ path: 'controller/:controller_id/preferences/qemu/templates/:template_id', component: QemuVmTemplateDetailsComponent, canActivate: [LoginGuard] },
{ path: 'controller/:controller_id/preferences/qemu/addtemplate', component: AddQemuVmTemplateComponent, canActivate: [LoginGuard] },
// { 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/addtemplate', component: AddVpcsTemplateComponent },
// { path: 'controller/:controller_id/preferences/vpcs', component: VpcsPreferencesComponent },
{ path: 'controller/:controller_id/preferences/vpcs/templates', component: VpcsTemplatesComponent, canActivate: [LoginGuard] },
{ path: 'controller/:controller_id/preferences/vpcs/templates/:template_id', component: VpcsTemplateDetailsComponent, canActivate: [LoginGuard] },
{ path: 'controller/:controller_id/preferences/vpcs/addtemplate', component: AddVpcsTemplateComponent, canActivate: [LoginGuard] },
// { 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/addtemplate', component: AddVirtualBoxTemplateComponent },
// { path: 'controller/:controller_id/preferences/virtualbox', component: VirtualBoxPreferencesComponent },
{ path: 'controller/:controller_id/preferences/virtualbox/templates', component: VirtualBoxTemplatesComponent, canActivate: [LoginGuard] },
{
path: 'controller/:controller_id/preferences/virtualbox/templates/:template_id',
component: VirtualBoxTemplateDetailsComponent,
canActivate: [LoginGuard]
},
{ path: 'controller/:controller_id/preferences/virtualbox/addtemplate', component: AddVirtualBoxTemplateComponent, canActivate: [LoginGuard] },
// { 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/addtemplate', component: AddVmwareTemplateComponent },
// { path: 'controller/:controller_id/preferences/vmware', component: VmwarePreferencesComponent },
{ path: 'controller/:controller_id/preferences/vmware/templates', component: VmwareTemplatesComponent, canActivate: [LoginGuard] },
{
path: 'controller/:controller_id/preferences/vmware/templates/:template_id',
component: VmwareTemplateDetailsComponent,
canActivate: [LoginGuard]
},
{ path: 'controller/:controller_id/preferences/vmware/addtemplate', component: AddVmwareTemplateComponent, canActivate: [LoginGuard] },
// { path: 'server/:server_id/preferences/traceng', component: TracengPreferencesComponent },
// { path: 'server/:server_id/preferences/traceng/templates', component: TracengTemplatesComponent },
// { path: 'server/:server_id/preferences/traceng/templates/:template_id', component: TracengTemplateDetailsComponent },
// { 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/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: 'controller/:controller_id/preferences/docker/templates', component: DockerTemplatesComponent, canActivate: [LoginGuard] },
{
path: 'controller/:controller_id/preferences/docker/templates/:template_id',
component: DockerTemplateDetailsComponent,
canActivate: [LoginGuard]
},
{
path: 'controller/:controller_id/preferences/docker/templates/:template_id/copy',
component: CopyDockerTemplateComponent,
canActivate: [LoginGuard]
},
{ path: 'controller/:controller_id/preferences/docker/addtemplate', component: AddDockerTemplateComponent, canActivate: [LoginGuard] },
{ path: 'controller/:controller_id/preferences/iou/templates', component: IouTemplatesComponent, canActivate: [LoginGuard] },
{ path: 'controller/:controller_id/preferences/iou/templates/:template_id', component: IouTemplateDetailsComponent, canActivate: [LoginGuard] },
{
path: 'controller/:controller_id/preferences/iou/templates/:template_id/copy',
component: CopyIouTemplateComponent,
canActivate: [LoginGuard]
},
{ path: 'controller/:controller_id/preferences/iou/addtemplate', component: AddIouTemplateComponent, canActivate: [LoginGuard] },
{
path: 'controller/:controller_id/management',
component: ManagementComponent,
children: [
{
path: 'users',
component: UserManagementComponent
},
{
path: 'groups',
component: GroupManagementComponent
},
{
path: 'roles',
component: RoleManagementComponent
},
{
path: 'permissions',
component: PermissionsManagementComponent
}
]
},
{
path: 'controller/:controller_id/management/groups/:user_group_id',
component: GroupDetailsComponent,
resolve: {
members: GroupMembersResolver,
controller: ControllerResolve,
group: GroupResolver,
roles: GroupRoleResolver
}
},
{
path: 'controller/:controller_id/management/roles/:role_id',
component: RoleDetailComponent,
resolve: {
role: RoleDetailResolver,
controller: ControllerResolve
}
},
{
path: 'controller/:controller_id/management/roles/:role_id/permissions',
component: RolePermissionsComponent,
resolve: {
role: RoleDetailResolver,
controller: ControllerResolve,
permissions: PermissionResolver
}
},
{
path: 'controller/:controller_id/management/users/:user_id/permissions',
component: UserPermissionsComponent,
resolve: {
user: UserDetailResolver,
userPermissions: UserPermissionsResolver,
controller: ControllerResolve,
permissions: PermissionResolver
}
}
],
},
{
path: 'server/:server_id/project/:project_id',
{
path: 'controller/:controller_id/project/:project_id',
component: ProjectMapComponent,
canActivate: [ProjectMapGuard]
canActivate: [LoginGuard],
canDeactivate: [ConsoleGuard],
},
{
path: 'server/:server_id/project/:project_id/nodes/:node_id',
{
path: 'controller/:controller_id/project/:project_id/nodes/:node_id',
component: WebConsoleFullWindowComponent,
canActivate: [ProjectMapGuard]
canActivate: [LoginGuard]
},
{
path: 'static/web-ui/controller/:controller_id/project/:project_id/nodes/:node_id',
component: WebConsoleFullWindowComponent,
canActivate: [LoginGuard]
},
{
path: '**',
component: PageNotFoundComponent
component: PageNotFoundComponent,
}
];
@NgModule({
imports: [RouterModule.forRoot(routes, { anchorScrolling: 'enabled', enableTracing: true, scrollPositionRestoration: 'enabled'})],
exports: [RouterModule]
imports: [
RouterModule.forRoot(routes, {
anchorScrolling: 'enabled',
enableTracing: false,
scrollPositionRestoration: 'enabled',
}),
],
exports: [RouterModule],
})
export class AppRoutingModule {}
export class AppRoutingModule {
}

View File

@ -1,3 +0,0 @@
mat-menu-panel {
min-height: 0px;
}

View File

@ -1,2 +1,4 @@
<router-outlet></router-outlet>
<app-notification-box></app-notification-box>
<div [ngClass]="{ dark: darkThemeEnabled, light: !darkThemeEnabled }">
<router-outlet></router-outlet>
<app-adbutler></app-adbutler>
</div>

View File

@ -0,0 +1,11 @@
mat-menu-panel {
min-height: 0px;
}
.dark {
background: #263238 !important;
}
.light {
background: white !important;
}

View File

@ -1,14 +1,14 @@
import { TestBed, async, ComponentFixture } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { AppComponent } from './app.component';
import { MatIconModule } from '@angular/material';
import { SettingsService } from './services/settings.service';
import { PersistenceService } from 'angular-persistence';
import { ElectronService, NgxElectronModule } from 'ngx-electron';
import createSpyObj = jasmine.createSpyObj;
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatIconModule } from '@angular/material/icon';
import { RouterTestingModule } from '@angular/router/testing';
import { ElectronService, NgxElectronModule } from 'ngx-electron';
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', () => {
let component: AppComponent;
@ -16,17 +16,17 @@ describe('AppComponent', () => {
let electronService: ElectronService;
let settingsService: SettingsService;
beforeEach(async(() => {
TestBed.configureTestingModule({
beforeEach(async() => {
await TestBed.configureTestingModule({
declarations: [AppComponent],
imports: [RouterTestingModule, MatIconModule, NgxElectronModule],
providers: [SettingsService, PersistenceService, ProgressService],
schemas: [NO_ERRORS_SCHEMA]
providers: [SettingsService, ProgressService],
schemas: [NO_ERRORS_SCHEMA],
}).compileComponents();
electronService = TestBed.get(ElectronService);
settingsService = TestBed.get(SettingsService);
}));
electronService = TestBed.inject(ElectronService);
settingsService = TestBed.inject(SettingsService);
});
beforeEach(() => {
fixture = TestBed.createComponent(AppComponent);
@ -34,34 +34,29 @@ describe('AppComponent', () => {
fixture.detectChanges();
});
it('should create the app', async(() => {
it('should create the app', async() => {
const app = fixture.debugElement.componentInstance;
expect(app).toBeTruthy();
}));
await expect(app).toBeTruthy();
});
it('should have footer', async(() => {
it('should have footer', async() => {
const compiled = fixture.debugElement.nativeElement;
expect(compiled.querySelector('router-outlet').textContent).toEqual('');
}));
await expect(compiled.querySelector('router-outlet').textContent).toEqual('');
});
it('should receive changed settings and forward to electron', async(() => {
const spy = createSpyObj('Electron.IpcRenderer', ['send']);
spyOnProperty(electronService, 'isElectronApp').and.returnValue(true);
spyOnProperty(electronService, 'ipcRenderer').and.returnValue(spy);
settingsService.set('crash_reports', true);
it('should receive changed settings and forward to electron', async() => {
await spyOnProperty(electronService, 'isElectronApp').and.returnValue(true);
settingsService.setReportsSettings(true);
component.ngOnInit();
settingsService.set('crash_reports', false);
expect(spy.send).toHaveBeenCalled();
expect(spy.send.calls.mostRecent().args[0]).toEqual('settings.changed');
expect(spy.send.calls.mostRecent().args[1].crash_reports).toEqual(false);
}));
settingsService.setReportsSettings(false);
});
it('should receive changed settings and do not forward to electron', async(() => {
it('should receive changed settings and do not forward to electron', async() => {
const spy = createSpyObj('Electron.IpcRenderer', ['send']);
spyOnProperty(electronService, 'isElectronApp').and.returnValue(false);
settingsService.set('crash_reports', true);
settingsService.setReportsSettings(true);
component.ngOnInit();
settingsService.set('crash_reports', false);
expect(spy.send).not.toHaveBeenCalled();
}));
settingsService.setReportsSettings(false);
await expect(spy.send).not.toHaveBeenCalled();
});
});

View File

@ -1,19 +1,23 @@
import { Component, OnInit } from '@angular/core';
import { MatIconRegistry } from '@angular/material';
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.css']
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,33 @@ export class AppComponent implements OnInit {
});
}
@HostBinding('class') componentCssClass;
ngOnInit(): void {
if (this.electronService.isElectronApp) {
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();
}
}

File diff suppressed because it is too large Load Diff

View File

@ -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,
];

View File

@ -1,26 +1,23 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MatMenuModule, MatIconModule } from '@angular/material';
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 { NgModule } from '@angular/core';
import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu';
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 { LinkEditingComponent } from './components/link-editing/link-editing.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';
@ -30,34 +27,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';
@ -73,8 +74,9 @@ import { SerialLinkWidget } from './widgets/links/serial-link';
SelectionControlComponent,
SelectionSelectComponent,
DraggableSelectionComponent,
LinkEditingComponent,
MovingCanvasDirective,
ZoomingCanvasDirective
ZoomingCanvasDirective,
],
providers: [
CssFixer,
@ -121,8 +123,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 {}

View File

@ -1,14 +1,38 @@
<svg id="map" #svg class="map" preserveAspectRatio="none" movingCanvas zoomingCanvas>
<filter id="grayscale"><feColorMatrix id="feGrayscale" type="saturate" values="0" /></filter>
<defs>
<pattern id="gridDrawing" attr.width="{{project.drawing_grid_size}}" attr.height="{{project.drawing_grid_size}}" patternUnits="userSpaceOnUse">
<path attr.d="M {{project.drawing_grid_size}} 0 L 0 0 0 {{project.drawing_grid_size}}" fill="none" stroke="silver" attr.stroke-width="{{gridVisibility}}"/>
<pattern
attr.x="{{ drawingGridX }}"
attr.y="{{ drawingGridY }}"
id="gridDrawing"
attr.width="{{ project.drawing_grid_size }}"
attr.height="{{ project.drawing_grid_size }}"
patternUnits="userSpaceOnUse"
>
<path
attr.d="M {{ project.drawing_grid_size }} 0 L 0 0 0 {{ project.drawing_grid_size }}"
fill="none"
stroke="silver"
attr.stroke-width="{{ gridVisibility }}"
/>
</pattern>
</defs>
<defs>
<pattern id="gridNode" attr.width="{{project.grid_size}}" attr.height="{{project.grid_size}}" patternUnits="userSpaceOnUse">
<path attr.d="M {{project.grid_size}} 0 L 0 0 0 {{project.grid_size}}" fill="none" stroke="DarkSlateGray" attr.stroke-width="{{gridVisibility}}"/>
<pattern
attr.x="{{ nodeGridX }}"
attr.y="{{ nodeGridY }}"
id="gridNode"
attr.width="{{ project.grid_size }}"
attr.height="{{ project.grid_size }}"
patternUnits="userSpaceOnUse"
>
<path
attr.d="M {{ project.grid_size }} 0 L 0 0 0 {{ project.grid_size }}"
fill="none"
stroke="DarkSlateGray"
attr.stroke-width="{{ gridVisibility }}"
/>
</pattern>
</defs>
@ -20,5 +44,6 @@
<app-drawing-resizing></app-drawing-resizing>
<app-selection-control></app-selection-control>
<app-selection-select></app-selection-select>
<app-text-editor #textEditor [server]="server" [svg]="svg"></app-text-editor>
<app-text-editor #textEditor [controller]="controller" [svg]="svg"></app-text-editor>
<app-draggable-selection [svg]="svg"></app-draggable-selection>
<app-link-editing [svg]="svg"></app-link-editing>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -1,24 +1,17 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { D3MapComponent } from './d3-map.component';
describe('D3MapComponent', () => {
let component: D3MapComponent;
let fixture: ComponentFixture<D3MapComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [D3MapComponent]
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [D3MapComponent],
}).compileComponents();
}));
});
// beforeEach(() => {
// fixture = TestBed.createComponent(MapComponent);
// component = fixture.componentInstance;
// fixture.detectChanges();
// });
//
// it('should create', () => {
// expect(component).toBeTruthy();
// });
it('should create', () => {
expect(component)
});
});

View File

@ -7,38 +7,35 @@ import {
OnDestroy,
OnInit,
SimpleChange,
EventEmitter,
Output,
ViewChild
ViewChild,
} from '@angular/core';
import { Selection, select } from 'd3-selection';
import { GraphLayout } from '../../widgets/graph-layout';
import { Context } from '../../models/context';
import { Size } from '../../models/size';
import { select, Selection } from 'd3-selection';
import { Subscription } from 'rxjs';
import { InterfaceLabelWidget } from '../../widgets/interface-label';
import { SelectionTool } from '../../tools/selection-tool';
import { MovingTool } from '../../tools/moving-tool';
import { MapChangeDetectorRef } from '../../services/map-change-detector-ref';
import { CanvasSizeDetector } from '../../helpers/canvas-size-detector';
import { Node } from '../../models/node';
import { Link } from '../../../models/link';
import { Drawing } from '../../models/drawing';
import { Project } from '../../../models/project';
import { Controller } from '../../../models/controller';
import { Symbol } from '../../../models/symbol';
import { MapScaleService } from '../../../services/mapScale.service';
import { MapSettingsService } from '../../../services/mapsettings.service';
import { ToolsService } from '../../../services/tools.service';
import { CanvasSizeDetector } from '../../helpers/canvas-size-detector';
import { GraphDataManager } from '../../managers/graph-data-manager';
import { MapSettingsManager } from '../../managers/map-settings-manager';
import { Server } from '../../../models/server';
import { ToolsService } from '../../../services/tools.service';
import { Context } from '../../models/context';
import { Drawing } from '../../models/drawing';
import { Node } from '../../models/node';
import { Size } from '../../models/size';
import { MapChangeDetectorRef } from '../../services/map-change-detector-ref';
import { MovingTool } from '../../tools/moving-tool';
import { SelectionTool } from '../../tools/selection-tool';
import { GraphLayout } from '../../widgets/graph-layout';
import { InterfaceLabelWidget } from '../../widgets/interface-label';
import { TextEditorComponent } from '../text-editor/text-editor.component';
import { MapScaleService } from '../../../services/mapScale.service';
import { Project } from '../../../models/project';
import { MapSettingsService } from '../../../services/mapsettings.service';
@Component({
selector: 'app-d3-map',
templateUrl: './d3-map.component.html',
styleUrls: ['./d3-map.component.scss']
styleUrls: ['./d3-map.component.scss'],
})
export class D3MapComponent implements OnInit, OnChanges, OnDestroy {
@Input() nodes: Node[] = [];
@ -46,13 +43,13 @@ export class D3MapComponent implements OnInit, OnChanges, OnDestroy {
@Input() drawings: Drawing[] = [];
@Input() symbols: Symbol[] = [];
@Input() project: Project;
@Input() server: Server;
@Input() controller: Controller;
@Input() width = 1500;
@Input() height = 600;
@ViewChild('svg', {static: false}) svgRef: ElementRef;
@ViewChild('textEditor', {static: false}) textEditor: TextEditorComponent;
@ViewChild('svg') svgRef: ElementRef;
@ViewChild('textEditor') textEditor: TextEditorComponent;
private parentNativeElement: any;
private svg: Selection<SVGSVGElement, any, null, undefined>;
@ -60,10 +57,15 @@ export class D3MapComponent implements OnInit, OnChanges, OnDestroy {
private subscriptions: Subscription[] = [];
private drawLinkTool: boolean;
protected settings = {
show_interface_labels: true
show_interface_labels: true,
};
public gridVisibility: number = 0;
public nodeGridX: number = 0;
public nodeGridY: number = 0;
public drawingGridX: number = 0;
public drawingGridY: number = 0;
constructor(
private graphDataManager: GraphDataManager,
public context: Context,
@ -84,8 +86,14 @@ export class D3MapComponent implements OnInit, OnChanges, OnDestroy {
@Input('show-interface-labels')
set showInterfaceLabels(value) {
this.settings.show_interface_labels = value;
this.interfaceLabelWidget.setEnabled(value);
if (value && !this.mapSettingsService.integrateLinkLabelsToLinks) {
this.settings.show_interface_labels = true;
this.interfaceLabelWidget.setEnabled(true);
} else {
this.settings.show_interface_labels = false;
this.interfaceLabelWidget.setEnabled(false);
}
this.mapChangeDetectorRef.detectChanges();
}
@ -93,6 +101,20 @@ export class D3MapComponent implements OnInit, OnChanges, OnDestroy {
this.mapSettings.isReadOnly = value;
}
resize(val: boolean) {
if (val) {
this.svg.attr('height', window.innerHeight + window.scrollY - 16);
} else {
let heightOfProjectWindow = window.innerHeight - 16;
if (this.height > heightOfProjectWindow) {
this.svg.attr('height', this.height);
} else {
this.svg.attr('height', heightOfProjectWindow);
}
}
}
ngOnChanges(changes: { [propKey: string]: SimpleChange }) {
if (
(changes['width'] && !changes['width'].isFirstChange()) ||
@ -123,9 +145,7 @@ export class D3MapComponent implements OnInit, OnChanges, OnDestroy {
}
});
this.subscriptions.push(
this.mapScaleService.scaleChangeEmitter.subscribe((value: number) => this.redraw())
);
this.subscriptions.push(this.mapScaleService.scaleChangeEmitter.subscribe((value: number) => this.redraw()));
this.subscriptions.push(
this.toolsService.isMovingToolActivated.subscribe((value: boolean) => {
@ -147,6 +167,7 @@ export class D3MapComponent implements OnInit, OnChanges, OnDestroy {
);
this.gridVisibility = localStorage.getItem('gridVisibility') === 'true' ? 1 : 0;
this.mapSettingsService.isScrollDisabled.subscribe((val) => this.resize(val));
}
ngOnDestroy() {
@ -164,10 +185,7 @@ export class D3MapComponent implements OnInit, OnChanges, OnDestroy {
public createGraph(domElement: HTMLElement) {
const rootElement = select(domElement);
this.svg = rootElement.select<SVGSVGElement>('svg');
this.graphLayout.connect(
this.svg,
this.context
);
this.graphLayout.connect(this.svg, this.context);
this.graphLayout.draw(this.svg, this.context);
this.mapChangeDetectorRef.hasBeenDrawn = true;
}
@ -189,6 +207,8 @@ export class D3MapComponent implements OnInit, OnChanges, OnDestroy {
}
private redraw() {
this.updateGrid();
this.graphDataManager.setNodes(this.nodes);
this.graphDataManager.setLinks(this.links);
this.graphDataManager.setDrawings(this.drawings);
@ -198,6 +218,26 @@ export class D3MapComponent implements OnInit, OnChanges, OnDestroy {
this.mapSettingsService.mapRenderedEmitter.emit(true);
}
updateGrid() {
if (this.project.grid_size && this.project.grid_size > 0)
this.nodeGridX =
this.project.scene_width / 2 -
Math.floor(this.project.scene_width / 2 / this.project.grid_size) * this.project.grid_size;
if (this.project.grid_size && this.project.grid_size > 0)
this.nodeGridY =
this.project.scene_height / 2 -
Math.floor(this.project.scene_height / 2 / this.project.grid_size) * this.project.grid_size;
if (this.project.drawing_grid_size && this.project.drawing_grid_size > 0)
this.drawingGridX =
this.project.scene_width / 2 -
Math.floor(this.project.scene_width / 2 / this.project.drawing_grid_size) * this.project.drawing_grid_size;
if (this.project.drawing_grid_size && this.project.drawing_grid_size > 0)
this.drawingGridY =
this.project.scene_height / 2 -
Math.floor(this.project.scene_height / 2 / this.project.drawing_grid_size) * this.project.drawing_grid_size;
}
@HostListener('window:resize', ['$event'])
onResize(event) {
this.changeLayout();

View File

@ -1,27 +1,26 @@
import { async, ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing';
import { DraggableSelectionComponent } from './draggable-selection.component';
import { NodesWidget } from '../../widgets/nodes';
import { DrawingsWidget } from '../../widgets/drawings';
import { LinksWidget } from '../../widgets/links';
import { LabelWidget } from '../../widgets/label';
import { InterfaceLabelWidget } from '../../widgets/interface-label';
import { SelectionManager } from '../../managers/selection-manager';
import { SelectionManagerMock } from '../../managers/selection-manager.spec';
import { NodesEventSource } from '../../events/nodes-event-source';
import { EventEmitter } from '@angular/core';
import { async, ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing';
import { select } from 'd3-selection';
import { MapSettingsService } from '../../../services/mapsettings.service';
import { DraggableDrag, DraggableEnd, DraggableStart } from '../../events/draggable';
import { DrawingsEventSource } from '../../events/drawings-event-source';
import { LinksEventSource } from '../../events/links-event-source';
import { NodesEventSource } from '../../events/nodes-event-source';
import { GraphDataManager } from '../../managers/graph-data-manager';
import { MockedGraphDataManager } from '../../managers/graph-data-manager.spec';
import { LinksEventSource } from '../../events/links-event-source';
import { DraggableStart, DraggableDrag, DraggableEnd } from '../../events/draggable';
import { MapNode } from '../../models/map/map-node';
import { EventEmitter } from '@angular/core';
import { SelectionManager } from '../../managers/selection-manager';
import { SelectionManagerMock } from '../../managers/selection-manager.spec';
import { MapDrawing } from '../../models/map/map-drawing';
import { MapLabel } from '../../models/map/map-label';
import { MapLinkNode } from '../../models/map/map-link-node';
import { select } from 'd3-selection';
import { MapLink } from '../../models/map/map-link';
import { MapSettingsService } from '../../../services/mapsettings.service';
import { MapLinkNode } from '../../models/map/map-link-node';
import { MapNode } from '../../models/map/map-node';
import { DrawingsWidget } from '../../widgets/drawings';
import { InterfaceLabelWidget } from '../../widgets/interface-label';
import { LabelWidget } from '../../widgets/label';
import { LinksWidget } from '../../widgets/links';
import { NodesWidget } from '../../widgets/nodes';
import { DraggableSelectionComponent } from './draggable-selection.component';
describe('DraggableSelectionComponent', () => {
let component: DraggableSelectionComponent;
@ -43,7 +42,7 @@ describe('DraggableSelectionComponent', () => {
let interfaceLabelDragEventEmitter: EventEmitter<DraggableDrag<MapLinkNode>>;
let interfaceLabelEndEventEmitter: EventEmitter<DraggableEnd<MapLinkNode>>;
beforeEach(async(() => {
beforeEach(async () => {
mockedGraphDataManager = new MockedGraphDataManager();
nodesStartEventEmitter = new EventEmitter<DraggableStart<MapNode>>();
@ -67,8 +66,8 @@ describe('DraggableSelectionComponent', () => {
draggable: {
start: nodesStartEventEmitter,
drag: nodesDragEventEmitter,
end: nodesEndEventEmitter
}
end: nodesEndEventEmitter,
},
};
const drawingsWidgetStub = {
@ -76,11 +75,11 @@ describe('DraggableSelectionComponent', () => {
draggable: {
start: drawingsStartEventEmitter,
drag: drawingsDragEventEmitter,
end: drawingsEndEventEmitter
}
end: drawingsEndEventEmitter,
},
};
const linksWidgetStub = {
redrawLink: () => {}
redrawLink: () => {},
};
const labelWidgetStub = {
@ -88,30 +87,30 @@ describe('DraggableSelectionComponent', () => {
draggable: {
start: labelStartEventEmitter,
drag: labelDragEventEmitter,
end: labelEndEventEmitter
}
end: labelEndEventEmitter,
},
};
const interfaceLabelWidgetStub = {
draggable: {
start: interfaceLabelStartEventEmitter,
drag: interfaceLabelDragEventEmitter,
end: interfaceLabelEndEventEmitter
}
end: interfaceLabelEndEventEmitter,
},
};
const nodesEventSourceStub = {
dragged: { emit: () => {} },
labelDragged: { emit: () => {} }
labelDragged: { emit: () => {} },
};
const drawingsEventSourceStub = {
dragged: { emit: () => {} }
dragged: { emit: () => {} },
};
const linksEventSourceStub = {
interfaceDragged: { emit: () => {} }
interfaceDragged: { emit: () => {} },
};
TestBed.configureTestingModule({
await TestBed.configureTestingModule({
providers: [
{ provide: NodesWidget, useValue: nodesWidgetStub },
{ provide: DrawingsWidget, useValue: drawingsWidgetStub },
@ -123,11 +122,11 @@ describe('DraggableSelectionComponent', () => {
{ provide: DrawingsEventSource, useValue: drawingsEventSourceStub },
{ provide: GraphDataManager, useValue: mockedGraphDataManager },
{ provide: LinksEventSource, useValue: linksEventSourceStub },
{ provide: MapSettingsService, useClass: MapSettingsService }
{ provide: MapSettingsService, useClass: MapSettingsService },
],
declarations: [DraggableSelectionComponent]
declarations: [DraggableSelectionComponent],
}).compileComponents();
}));
});
beforeEach(() => {
fixture = TestBed.createComponent(DraggableSelectionComponent);

View File

@ -1,28 +1,28 @@
import { Component, OnInit, OnDestroy, Input } from '@angular/core';
import { Subscription, merge } from 'rxjs';
import { NodesWidget } from '../../widgets/nodes';
import { DrawingsWidget } from '../../widgets/drawings';
import { LinksWidget } from '../../widgets/links';
import { SelectionManager } from '../../managers/selection-manager';
import { NodesEventSource } from '../../events/nodes-event-source';
import { DrawingsEventSource } from '../../events/drawings-event-source';
import { GraphDataManager } from '../../managers/graph-data-manager';
import { DraggableStart, DraggableDrag, DraggableEnd } from '../../events/draggable';
import { MapNode } from '../../models/map/map-node';
import { MapDrawing } from '../../models/map/map-drawing';
import { DraggedDataEvent } from '../../events/event-source';
import { Component, Input, OnDestroy, OnInit } from '@angular/core';
import { select } from 'd3-selection';
import { MapLabel } from '../../models/map/map-label';
import { LabelWidget } from '../../widgets/label';
import { InterfaceLabelWidget } from '../../widgets/interface-label';
import { MapLinkNode } from '../../models/map/map-link-node';
import { LinksEventSource } from '../../events/links-event-source';
import { merge, Subscription } from 'rxjs';
import { MapSettingsService } from '../../../services/mapsettings.service';
import { DraggableDrag, DraggableEnd, DraggableStart } from '../../events/draggable';
import { DrawingsEventSource } from '../../events/drawings-event-source';
import { DraggedDataEvent } from '../../events/event-source';
import { LinksEventSource } from '../../events/links-event-source';
import { NodesEventSource } from '../../events/nodes-event-source';
import { GraphDataManager } from '../../managers/graph-data-manager';
import { SelectionManager } from '../../managers/selection-manager';
import { MapDrawing } from '../../models/map/map-drawing';
import { MapLabel } from '../../models/map/map-label';
import { MapLinkNode } from '../../models/map/map-link-node';
import { MapNode } from '../../models/map/map-node';
import { DrawingsWidget } from '../../widgets/drawings';
import { InterfaceLabelWidget } from '../../widgets/interface-label';
import { LabelWidget } from '../../widgets/label';
import { LinksWidget } from '../../widgets/links';
import { NodesWidget } from '../../widgets/nodes';
@Component({
selector: 'app-draggable-selection',
templateUrl: './draggable-selection.component.html',
styleUrls: ['./draggable-selection.component.scss']
styleUrls: ['./draggable-selection.component.scss'],
})
export class DraggableSelectionComponent implements OnInit, OnDestroy {
private start: Subscription;
@ -62,25 +62,25 @@ export class DraggableSelectionComponent implements OnInit, OnDestroy {
).subscribe((evt: DraggableStart<any>) => {
const selected = this.selectionManager.getSelected();
if (evt.datum instanceof MapNode) {
if (selected.filter(item => item instanceof MapNode && item.id === evt.datum.id).length === 0) {
if (selected.filter((item) => item instanceof MapNode && item.id === evt.datum.id).length === 0) {
this.selectionManager.setSelected([evt.datum]);
}
}
if (evt.datum instanceof MapDrawing) {
if (selected.filter(item => item instanceof MapDrawing && item.id === evt.datum.id).length === 0) {
if (selected.filter((item) => item instanceof MapDrawing && item.id === evt.datum.id).length === 0) {
this.selectionManager.setSelected([evt.datum]);
}
}
if (evt.datum instanceof MapLabel) {
if (selected.filter(item => item instanceof MapLabel && item.id === evt.datum.id).length === 0) {
if (selected.filter((item) => item instanceof MapLabel && item.id === evt.datum.id).length === 0) {
this.selectionManager.setSelected([evt.datum]);
}
}
if (evt.datum instanceof MapLinkNode) {
if (selected.filter(item => item instanceof MapLinkNode && item.id === evt.datum.id).length === 0) {
if (selected.filter((item) => item instanceof MapLinkNode && item.id === evt.datum.id).length === 0) {
this.selectionManager.setSelected([evt.datum]);
}
}
@ -95,7 +95,7 @@ export class DraggableSelectionComponent implements OnInit, OnDestroy {
if (!this.isMapLocked) {
const selected = this.selectionManager.getSelected();
// update nodes
let mapNodes = selected.filter(item => item instanceof MapNode);
let mapNodes = selected.filter((item) => item instanceof MapNode);
const lockedNodes = mapNodes.filter((item: MapNode) => item.locked);
const selectedNodes = mapNodes.filter((item: MapNode) => !item.locked);
selectedNodes.forEach((node: MapNode) => {
@ -107,18 +107,18 @@ export class DraggableSelectionComponent implements OnInit, OnDestroy {
const links = this.graphDataManager
.getLinks()
.filter(
link =>
(link) =>
(link.target !== undefined && link.target.id === node.id) ||
(link.source !== undefined && link.source.id === node.id)
);
links.forEach(link => {
links.forEach((link) => {
this.linksWidget.redrawLink(svg, link);
});
});
// update drawings
let mapDrawings = selected.filter(item => item instanceof MapDrawing);
let mapDrawings = selected.filter((item) => item instanceof MapDrawing);
const selectedDrawings = mapDrawings.filter((item: MapDrawing) => !item.locked);
selectedDrawings.forEach((drawing: MapDrawing) => {
drawing.x += evt.dx;
@ -127,32 +127,36 @@ export class DraggableSelectionComponent implements OnInit, OnDestroy {
});
// update labels
let mapLabels = selected.filter(item => item instanceof MapLabel);
const selectedLabels = mapLabels.filter((item: MapLabel) => lockedNodes.filter((node) => node.id === item.nodeId).length === 0);
let mapLabels = selected.filter((item) => item instanceof MapLabel);
const selectedLabels = mapLabels.filter(
(item: MapLabel) => lockedNodes.filter((node) => node.id === item.nodeId).length === 0
);
selectedLabels.forEach((label: MapLabel) => {
const isParentNodeSelected = selectedNodes.filter(node => node.id === label.nodeId).length > 0;
const isParentNodeSelected = selectedNodes.filter((node) => node.id === label.nodeId).length > 0;
if (isParentNodeSelected) {
return;
}
const node = this.graphDataManager.getNodes().filter(node => node.id === label.nodeId)[0];
const node = this.graphDataManager.getNodes().filter((node) => node.id === label.nodeId)[0];
node.label.x += evt.dx;
node.label.y += evt.dy;
this.labelWidget.redrawLabel(svg, label);
});
// update interface labels
let mapLinkNodes = selected.filter(item => item instanceof MapLinkNode);
const selectedLinkNodes = mapLinkNodes.filter((item: MapLinkNode) => lockedNodes.filter((node) => node.id === item.nodeId).length === 0);
let mapLinkNodes = selected.filter((item) => item instanceof MapLinkNode);
const selectedLinkNodes = mapLinkNodes.filter(
(item: MapLinkNode) => lockedNodes.filter((node) => node.id === item.nodeId).length === 0
);
selectedLinkNodes.forEach((interfaceLabel: MapLinkNode) => {
const isParentNodeSelected = selectedNodes.filter(node => node.id === interfaceLabel.nodeId).length > 0;
const isParentNodeSelected = selectedNodes.filter((node) => node.id === interfaceLabel.nodeId).length > 0;
if (isParentNodeSelected) {
return;
}
const link = this.graphDataManager
.getLinks()
.filter(link => link.nodes[0].id === interfaceLabel.id || link.nodes[1].id === interfaceLabel.id)[0];
.filter((link) => link.nodes[0].id === interfaceLabel.id || link.nodes[1].id === interfaceLabel.id)[0];
if (link.nodes[0].id === interfaceLabel.id) {
link.nodes[0].label.x += evt.dx;
link.nodes[0].label.y += evt.dy;
@ -176,23 +180,25 @@ export class DraggableSelectionComponent implements OnInit, OnDestroy {
if (!this.isMapLocked) {
const selected = this.selectionManager.getSelected();
let mapNodes = selected.filter(item => item instanceof MapNode);
let mapNodes = selected.filter((item) => item instanceof MapNode);
const lockedNodes = mapNodes.filter((item: MapNode) => item.locked);
const selectedNodes = mapNodes.filter((item: MapNode) => !item.locked);
selectedNodes.forEach((item: MapNode) => {
this.nodesEventSource.dragged.emit(new DraggedDataEvent<MapNode>(item, evt.dx, evt.dy));
});
let mapDrawings = selected.filter(item => item instanceof MapDrawing);
let mapDrawings = selected.filter((item) => item instanceof MapDrawing);
const selectedDrawings = mapDrawings.filter((item: MapDrawing) => !item.locked);
selectedDrawings.forEach((item: MapDrawing) => {
this.drawingsEventSource.dragged.emit(new DraggedDataEvent<MapDrawing>(item, evt.dx, evt.dy));
});
let mapLabels = selected.filter(item => item instanceof MapLabel);
const selectedLabels = mapLabels.filter((item: MapLabel) => lockedNodes.filter((node) => node.id === item.nodeId).length === 0);
let mapLabels = selected.filter((item) => item instanceof MapLabel);
const selectedLabels = mapLabels.filter(
(item: MapLabel) => lockedNodes.filter((node) => node.id === item.nodeId).length === 0
);
selectedLabels.forEach((label: MapLabel) => {
const isParentNodeSelected = selectedNodes.filter(node => node.id === label.nodeId).length > 0;
const isParentNodeSelected = selectedNodes.filter((node) => node.id === label.nodeId).length > 0;
if (isParentNodeSelected) {
return;
}
@ -200,10 +206,12 @@ export class DraggableSelectionComponent implements OnInit, OnDestroy {
this.nodesEventSource.labelDragged.emit(new DraggedDataEvent<MapLabel>(label, evt.dx, evt.dy));
});
let mapLinkNodes = selected.filter(item => item instanceof MapLinkNode);
const selectedLinkNodes = mapLinkNodes.filter((item: MapLinkNode) => lockedNodes.filter((node) => node.id === item.nodeId).length === 0)
let mapLinkNodes = selected.filter((item) => item instanceof MapLinkNode);
const selectedLinkNodes = mapLinkNodes.filter(
(item: MapLinkNode) => lockedNodes.filter((node) => node.id === item.nodeId).length === 0
);
selectedLinkNodes.forEach((label: MapLinkNode) => {
const isParentNodeSelected = selectedNodes.filter(node => node.id === label.nodeId).length > 0;
const isParentNodeSelected = selectedNodes.filter((node) => node.id === label.nodeId).length > 0;
if (isParentNodeSelected) {
return;
}

View File

@ -1,24 +1,24 @@
import { DrawingAddingComponent } from './drawing-adding.component';
import { ComponentFixture, TestBed, async } from '@angular/core/testing';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { DrawingsEventSource } from '../../events/drawings-event-source';
import { Context } from '../../models/context';
import { DrawingAddingComponent } from './drawing-adding.component';
describe('DrawingAddingComponent', () => {
let component: DrawingAddingComponent;
let fixture: ComponentFixture<DrawingAddingComponent>;
let drawingsEventSource = new DrawingsEventSource();
beforeEach(async(() => {
TestBed.configureTestingModule({
beforeEach(async() => {
await TestBed.configureTestingModule({
imports: [NoopAnimationsModule],
providers: [
{ provide: DrawingsEventSource, useValue: drawingsEventSource },
{ provide: Context, useClass: Context }
{ provide: Context, useClass: Context },
],
declarations: [DrawingAddingComponent]
declarations: [DrawingAddingComponent],
}).compileComponents();
}));
});
beforeEach(() => {
fixture = TestBed.createComponent(DrawingAddingComponent);

View File

@ -1,13 +1,13 @@
import { Component, Input, OnDestroy, OnInit } from '@angular/core';
import { Context } from '../../models/context';
import { Subscription } from 'rxjs';
import { DrawingsEventSource } from '../../events/drawings-event-source';
import { AddedDataEvent } from '../../events/event-source';
import { Subscription } from 'rxjs';
import { Context } from '../../models/context';
@Component({
selector: 'app-drawing-adding',
templateUrl: './drawing-adding.component.html',
styleUrls: ['./drawing-adding.component.scss']
styleUrls: ['./drawing-adding.component.scss'],
})
export class DrawingAddingComponent implements OnInit, OnDestroy {
@Input('svg') svg: SVGSVGElement;
@ -18,15 +18,19 @@ export class DrawingAddingComponent implements OnInit, OnDestroy {
constructor(private drawingsEventSource: DrawingsEventSource, private context: Context) {}
ngOnInit() {
this.drawingSelected = this.drawingsEventSource.selected.subscribe(evt => {
this.drawingSelected = this.drawingsEventSource.selected.subscribe((evt) => {
evt === '' ? this.deactivate() : this.activate();
});
}
activate() {
let listener = (event: MouseEvent) => {
let x = (event.pageX - (this.context.getZeroZeroTransformationPoint().x + this.context.transformation.x))/this.context.transformation.k;
let y = (event.pageY - (this.context.getZeroZeroTransformationPoint().y + this.context.transformation.y))/this.context.transformation.k;
let x =
(event.pageX - (this.context.getZeroZeroTransformationPoint().x + this.context.transformation.x)) /
this.context.transformation.k;
let y =
(event.pageY - (this.context.getZeroZeroTransformationPoint().y + this.context.transformation.y)) /
this.context.transformation.k;
this.drawingsEventSource.pointToAddSelected.emit(new AddedDataEvent(x, y));
this.deactivate();

View File

@ -1,12 +1,11 @@
import { ComponentFixture, TestBed, async } from '@angular/core/testing';
import { DrawingResizingComponent } from './drawing-resizing.component';
import { DrawingsWidget } from '../../widgets/drawings';
import { DrawingsEventSource } from '../../events/drawings-event-source';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { EventEmitter } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { DrawingsEventSource } from '../../events/drawings-event-source';
import { ResizingEnd } from '../../events/resizing';
import { MapDrawing } from '../../models/map/map-drawing';
import { DrawingsWidget } from '../../widgets/drawings';
import { DrawingResizingComponent } from './drawing-resizing.component';
export class DrawingWidgetMock {
resizingFinished = new EventEmitter<ResizingEnd<MapDrawing>>();
@ -31,16 +30,16 @@ describe('DrawingResizingComponent', () => {
let drawingsWidgetMock = new DrawingWidgetMock();
let drawingsEventSource = new DrawingsEventSource();
beforeEach(async(() => {
TestBed.configureTestingModule({
beforeEach(async() => {
await TestBed.configureTestingModule({
imports: [NoopAnimationsModule],
providers: [
{ provide: DrawingsWidget, useValue: drawingsWidgetMock },
{ provide: DrawingsEventSource, useValue: drawingsEventSource }
{ provide: DrawingsEventSource, useValue: drawingsEventSource },
],
declarations: [DrawingResizingComponent]
declarations: [DrawingResizingComponent],
}).compileComponents();
}));
});
beforeEach(() => {
fixture = TestBed.createComponent(DrawingResizingComponent);

View File

@ -1,17 +1,15 @@
import { Component, OnInit, ElementRef, OnDestroy, Input, Output, EventEmitter } from '@angular/core';
import { Component, OnDestroy, OnInit } from '@angular/core';
import { Subscription } from 'rxjs';
import { DrawingsEventSource } from '../../events/drawings-event-source';
import { DrawingsWidget } from '../../widgets/drawings';
import { MapDrawing } from '../../models/map/map-drawing';
import { ResizedDataEvent } from '../../events/event-source';
import { ResizingEnd } from '../../events/resizing';
import { MapDrawing } from '../../models/map/map-drawing';
import { DrawingsWidget } from '../../widgets/drawings';
@Component({
selector: 'app-drawing-resizing',
template: `
<ng-content></ng-content>
`,
styleUrls: ['./drawing-resizing.component.scss']
template: ` <ng-content></ng-content> `,
styleUrls: ['./drawing-resizing.component.scss'],
})
export class DrawingResizingComponent implements OnInit, OnDestroy {
resizingFinished: Subscription;

View File

@ -1,16 +1,15 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { DraggableComponent } from './draggable.component';
describe('DraggableComponent', () => {
let component: DraggableComponent;
let fixture: ComponentFixture<DraggableComponent>;
beforeEach(async(() => {
beforeEach(async() => {
TestBed.configureTestingModule({
declarations: [DraggableComponent]
declarations: [DraggableComponent],
}).compileComponents();
}));
});
beforeEach(() => {
fixture = TestBed.createComponent(DraggableComponent);
@ -18,7 +17,7 @@ describe('DraggableComponent', () => {
fixture.detectChanges();
});
// it('should create', () => {
// expect(component).toBeTruthy();
// });
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,4 +1,4 @@
import { Component, OnInit, ElementRef, AfterViewInit, OnDestroy, Input, Output, EventEmitter } from '@angular/core';
import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';
import { Observable, Subscription } from 'rxjs';
import { Point } from '../../../models/point';
@ -8,10 +8,8 @@ export class DraggableDraggedEvent {
@Component({
selector: '[app-draggable]',
template: `
<ng-content></ng-content>
`,
styleUrls: ['./draggable.component.scss']
template: ` <ng-content></ng-content> `,
styleUrls: ['./draggable.component.scss'],
})
export class DraggableComponent implements OnInit, AfterViewInit, OnDestroy {
@Input('app-draggable') item: Point;

View File

@ -5,13 +5,13 @@
(dragging)="OnDragging($event)"
(dragged)="OnDragged($event)"
>
<svg:g *ngIf="is(drawing.element, 'ellipse')" [app-ellipse]="drawing.element" />
<svg:g *ngIf="is(drawing?.element, 'ellipse')" [app-ellipse]="drawing?.element" />
<svg:g *ngIf="is(drawing.element, 'image')" [app-image]="drawing.element" />
<svg:g *ngIf="is(drawing?.element, 'image')" [app-image]="drawing?.element" />
<svg:g *ngIf="is(drawing.element, 'line')" [app-line]="drawing.element" />
<svg:g *ngIf="is(drawing?.element, 'line')" [app-line]="drawing?.element" />
<svg:g *ngIf="is(drawing.element, 'rect')" [app-rect]="drawing.element" />
<svg:g *ngIf="is(drawing?.element, 'rect')" [app-rect]="drawing?.element" />
<svg:g *ngIf="is(drawing.element, 'text')" [app-text]="drawing.element" />
<svg:g *ngIf="is(drawing?.element, 'text')" [app-text]="drawing?.element" />
</svg:g>

Before

Width:  |  Height:  |  Size: 563 B

After

Width:  |  Height:  |  Size: 573 B

View File

@ -1,16 +1,18 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import {ComponentFixture, TestBed } from '@angular/core/testing';
import { DrawingsEventSource } from 'app/cartography/events/drawings-event-source';
import { SvgToDrawingConverter } from 'app/cartography/helpers/svg-to-drawing-converter';
import { DrawingComponent } from './drawing.component';
describe('DrawingComponent', () => {
let component: DrawingComponent;
let fixture: ComponentFixture<DrawingComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [DrawingComponent]
beforeEach(async() => {
await TestBed.configureTestingModule({
declarations: [DrawingComponent],
providers:[SvgToDrawingConverter,DrawingsEventSource]
}).compileComponents();
}));
});
beforeEach(() => {
fixture = TestBed.createComponent(DrawingComponent);
@ -18,7 +20,7 @@ describe('DrawingComponent', () => {
fixture.detectChanges();
});
// it('should create', () => {
// expect(component).toBeTruthy();
// });
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,18 +1,18 @@
import { Component, OnInit, Input, ChangeDetectorRef } from '@angular/core';
import { ChangeDetectorRef, Component, Input, OnInit } from '@angular/core';
import { DrawingsEventSource } from '../../../events/drawings-event-source';
import { DraggedDataEvent } from '../../../events/event-source';
import { SvgToDrawingConverter } from '../../../helpers/svg-to-drawing-converter';
import { EllipseElement } from '../../../models/drawings/ellipse-element';
import { ImageElement } from '../../../models/drawings/image-element';
import { LineElement } from '../../../models/drawings/line-element';
import { RectElement } from '../../../models/drawings/rect-element';
import { TextElement } from '../../../models/drawings/text-element';
import { SvgToDrawingConverter } from '../../../helpers/svg-to-drawing-converter';
import { DraggedDataEvent } from '../../../events/event-source';
import { MapDrawing } from '../../../models/map/map-drawing';
import { DrawingsEventSource } from '../../../events/drawings-event-source';
@Component({
selector: '[app-drawing]',
templateUrl: './drawing.component.html',
styleUrls: ['./drawing.component.scss']
styleUrls: ['./drawing.component.scss'],
})
export class DrawingComponent implements OnInit {
@Input('app-drawing') drawing: MapDrawing;
@ -21,19 +21,17 @@ export class DrawingComponent implements OnInit {
private svgToDrawingConverter: SvgToDrawingConverter,
private drawingsEventSource: DrawingsEventSource,
private cd: ChangeDetectorRef
) {}
) { }
ngOnInit() {
try {
this.drawing.element = this.svgToDrawingConverter.convert(this.drawing.svg);
} catch (error) {
console.log(`Cannot convert due to Error: '${error}'`);
}
} catch (error) { }
}
OnDragging(evt) {
this.drawing.x = evt.x;
this.drawing.y = evt.y;
this.drawing.x = evt ? evt.x : '';
this.drawing.y = evt ? evt.y : '';
this.cd.detectChanges();
}
@ -66,6 +64,8 @@ export class DrawingComponent implements OnInit {
}
get transformation() {
return `translate(${this.drawing.x},${this.drawing.y}) rotate(${this.drawing.rotation})`;
if (this.drawing) {
return `translate(${this.drawing.x},${this.drawing.y}) rotate(${this.drawing.rotation})`;
}
}
}

View File

@ -1,12 +1,12 @@
<svg:ellipse
class="ellipse_element noselect"
[attr.fill]="ellipse.fill"
[attr.fill]="ellipse?.fill"
[attr.fill-opacity]="fill_opacity"
[attr.stroke]="ellipse.stroke"
[attr.stroke]="ellipse?.stroke"
[attr.stroke-width]="stroke_width"
[attr.stroke-dasharray]="stroke_dasharray"
[attr.cx]="ellipse.cx"
[attr.cy]="ellipse.cy"
[attr.rx]="ellipse.rx"
[attr.ry]="ellipse.ry"
[attr.cx]="ellipse?.cx"
[attr.cy]="ellipse?.cy"
[attr.rx]="ellipse?.rx"
[attr.ry]="ellipse?.ry"
/>

Before

Width:  |  Height:  |  Size: 332 B

After

Width:  |  Height:  |  Size: 338 B

View File

@ -1,16 +1,17 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { QtDasharrayFixer } from 'app/cartography/helpers/qt-dasharray-fixer';
import { EllipseComponent } from './ellipse.component';
describe('EllipseComponent', () => {
let component: EllipseComponent;
let fixture: ComponentFixture<EllipseComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [EllipseComponent]
beforeEach(async() => {
await TestBed.configureTestingModule({
declarations: [EllipseComponent],
providers:[QtDasharrayFixer]
}).compileComponents();
}));
});
beforeEach(() => {
fixture = TestBed.createComponent(EllipseComponent);
@ -18,7 +19,7 @@ describe('EllipseComponent', () => {
fixture.detectChanges();
});
// it('should create', () => {
// expect(component).toBeTruthy();
// });
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,11 +1,11 @@
import { Component, OnInit, Input } from '@angular/core';
import { EllipseElement } from '../../../../../models/drawings/ellipse-element';
import { Component, Input, OnInit } from '@angular/core';
import { QtDasharrayFixer } from '../../../../../helpers/qt-dasharray-fixer';
import { EllipseElement } from '../../../../../models/drawings/ellipse-element';
@Component({
selector: '[app-ellipse]',
templateUrl: './ellipse.component.html',
styleUrls: ['./ellipse.component.scss']
styleUrls: ['./ellipse.component.scss'],
})
export class EllipseComponent implements OnInit {
@Input('app-ellipse') ellipse: EllipseElement;
@ -15,21 +15,21 @@ export class EllipseComponent implements OnInit {
ngOnInit() {}
get fill_opacity() {
if (isFinite(this.ellipse.fill_opacity)) {
if (this.ellipse && isFinite(this.ellipse.fill_opacity)) {
return this.ellipse.fill_opacity;
}
return null;
}
get stroke_width() {
if (isFinite(this.ellipse.stroke_width)) {
if (this.ellipse && isFinite(this.ellipse.stroke_width)) {
return this.ellipse.stroke_width;
}
return null;
}
get stroke_dasharray() {
if (this.ellipse.stroke_dasharray) {
if (this.ellipse && this.ellipse.stroke_dasharray) {
return this.qtDasharrayFixer.fix(this.ellipse.stroke_dasharray);
}
return null;

View File

@ -1,6 +1,6 @@
<svg:image
class="image_element noselect"
[attr.xlink:href]="image.data"
[attr.width]="image.width"
[attr.height]="image.height"
[attr.xlink:href]="image?.data"
[attr.width]="image?.width"
[attr.height]="image?.height"
/>

Before

Width:  |  Height:  |  Size: 140 B

After

Width:  |  Height:  |  Size: 143 B

View File

@ -1,16 +1,15 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ImageComponent } from './image.component';
describe('ImageComponent', () => {
let component: ImageComponent;
let fixture: ComponentFixture<ImageComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ImageComponent]
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ImageComponent],
}).compileComponents();
}));
});
beforeEach(() => {
fixture = TestBed.createComponent(ImageComponent);
@ -18,7 +17,7 @@ describe('ImageComponent', () => {
fixture.detectChanges();
});
// it('should create', () => {
// expect(component).toBeTruthy();
// });
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,13 +1,14 @@
import { Component, OnInit, Input } from '@angular/core';
import { Component, Input, OnInit } from '@angular/core';
import { ImageElement } from '../../../../../models/drawings/image-element';
@Component({
selector: '[app-image]',
templateUrl: './image.component.html',
styleUrls: ['./image.component.scss']
styleUrls: ['./image.component.scss'],
})
export class ImageComponent implements OnInit {
@Input('app-image') image: ImageElement;
data:any
constructor() {}

View File

@ -1,10 +1,10 @@
<svg:line
class="line_element noselect"
[attr.stroke]="line.stroke"
[attr.stroke-width]="stroke_width"
[attr.stroke]="line?.stroke"
[attr.stroke-width]="stroke_width ?? ''"
[attr.stroke-dasharray]="stroke_dasharray"
[attr.x1]="line.x1"
[attr.x2]="line.x2"
[attr.y1]="line.y1"
[attr.y2]="line.y2"
[attr.x1]="line?.x1"
[attr.x2]="line?.x2"
[attr.y1]="line?.y1"
[attr.y2]="line?.y2"
/>

Before

Width:  |  Height:  |  Size: 245 B

After

Width:  |  Height:  |  Size: 256 B

View File

@ -1,16 +1,17 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import {ComponentFixture, TestBed } from '@angular/core/testing';
import { QtDasharrayFixer } from 'app/cartography/helpers/qt-dasharray-fixer';
import { LineComponent } from './line.component';
describe('LineComponent', () => {
let component: LineComponent;
let fixture: ComponentFixture<LineComponent>;
beforeEach(async(() => {
beforeEach(async() => {
TestBed.configureTestingModule({
declarations: [LineComponent]
declarations: [LineComponent],
providers:[QtDasharrayFixer]
}).compileComponents();
}));
});
beforeEach(() => {
fixture = TestBed.createComponent(LineComponent);
@ -18,7 +19,7 @@ describe('LineComponent', () => {
fixture.detectChanges();
});
// it('should create', () => {
// expect(component).toBeTruthy();
// });
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,11 +1,11 @@
import { Component, OnInit, Input } from '@angular/core';
import { Component, Input, OnInit } from '@angular/core';
import { QtDasharrayFixer } from '../../../../../helpers/qt-dasharray-fixer';
import { LineElement } from '../../../../../models/drawings/line-element';
@Component({
selector: '[app-line]',
templateUrl: './line.component.html',
styleUrls: ['./line.component.scss']
styleUrls: ['./line.component.scss'],
})
export class LineComponent implements OnInit {
@Input('app-line') line: LineElement;
@ -15,14 +15,14 @@ export class LineComponent implements OnInit {
ngOnInit() {}
get stroke_width() {
if (isFinite(this.line.stroke_width)) {
if (this.line && isFinite(this.line.stroke_width)) {
return this.line.stroke_width;
}
return null;
}
get stroke_dasharray() {
if (this.line.stroke_dasharray) {
if ( this.line && this.line.stroke_dasharray) {
return this.qtDasharrayFixer.fix(this.line.stroke_dasharray);
}
return null;

View File

@ -1,10 +1,12 @@
<svg:rect
class="rect_element noselect"
[attr.fill]="rect.fill"
[attr.fill-opacity]="fill_opacity"
[attr.stroke]="rect.stroke"
[attr.fill]="rect?.fill"
[attr.fill-opacity]="fill_opacity ? fill_opacity : '' "
[attr.stroke]="rect?.stroke"
[attr.stroke-width]="stroke_width"
[attr.stroke-dasharray]="stroke_dasharray"
[attr.width]="rect.width"
[attr.height]="rect.height"
[attr.width]="rect?.width"
[attr.height]="rect?.height"
[attr.rx]="rect?.rx"
[attr.ry]="rect?.ry"
/>

Before

Width:  |  Height:  |  Size: 278 B

After

Width:  |  Height:  |  Size: 349 B

View File

@ -1,16 +1,17 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import {ComponentFixture, TestBed } from '@angular/core/testing';
import { QtDasharrayFixer } from 'app/cartography/helpers/qt-dasharray-fixer';
import { RectComponent } from './rect.component';
describe('RectComponent', () => {
let component: RectComponent;
let fixture: ComponentFixture<RectComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [RectComponent]
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [RectComponent],
providers:[QtDasharrayFixer]
}).compileComponents();
}));
});
beforeEach(() => {
fixture = TestBed.createComponent(RectComponent);
@ -18,7 +19,7 @@ describe('RectComponent', () => {
fixture.detectChanges();
});
// it('should create', () => {
// expect(component).toBeTruthy();
// });
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,11 +1,11 @@
import { Component, OnInit, Input } from '@angular/core';
import { RectElement } from '../../../../../models/drawings/rect-element';
import { Component, Input, OnInit } from '@angular/core';
import { QtDasharrayFixer } from '../../../../../helpers/qt-dasharray-fixer';
import { RectElement } from '../../../../../models/drawings/rect-element';
@Component({
selector: '[app-rect]',
templateUrl: './rect.component.html',
styleUrls: ['./rect.component.scss']
styleUrls: ['./rect.component.scss'],
})
export class RectComponent implements OnInit {
@Input('app-rect') rect: RectElement;
@ -15,21 +15,21 @@ export class RectComponent implements OnInit {
ngOnInit() {}
get fill_opacity() {
if (isFinite(this.rect.fill_opacity)) {
return this.rect.fill_opacity;
if (this.rect && isFinite(this.rect.fill_opacity)) {
return this.rect.fill_opacity ? this.rect.fill_opacity : null;
}
return null;
}
get stroke_width() {
if (isFinite(this.rect.stroke_width)) {
return this.rect.stroke_width;
if (this.rect && isFinite(this.rect.stroke_width)) {
return this.rect.stroke_width ? this.rect.stroke_width : null;
}
return null;
}
get stroke_dasharray() {
if (this.rect.stroke_dasharray) {
if (this.rect && this.rect.stroke_dasharray) {
return this.qtDasharrayFixer.fix(this.rect.stroke_dasharray);
}
return null;

View File

@ -3,7 +3,7 @@
class="text_element noselect"
[attr.style]="style"
[attr.text-decoration]="textDecoration"
[attr.fill]="text.fill"
[attr.fill]="text?.fill"
[attr.transform]="transformation"
>
<svg:tspan *ngFor="let line of lines; index as i" xml:space="preserve" x="0" [attr.dy]="i == 0 ? '0em' : '1.4em'">

Before

Width:  |  Height:  |  Size: 338 B

After

Width:  |  Height:  |  Size: 339 B

View File

@ -1,16 +1,17 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { FontFixer } from 'app/cartography/helpers/font-fixer';
import { TextComponent } from './text.component';
describe('TextComponent', () => {
let component: TextComponent;
let fixture: ComponentFixture<TextComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [TextComponent]
beforeEach(async() => {
await TestBed.configureTestingModule({
declarations: [TextComponent],
providers:[FontFixer]
}).compileComponents();
}));
});
beforeEach(() => {
fixture = TestBed.createComponent(TextComponent);
@ -18,7 +19,7 @@ describe('TextComponent', () => {
fixture.detectChanges();
});
// it('should create', () => {
// expect(component).toBeTruthy();
// });
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,28 +1,30 @@
import { Component, OnInit, Input, ViewChild, ElementRef, DoCheck } from '@angular/core';
import { Component, DoCheck, ElementRef, Input, OnInit, ViewChild } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { TextElement } from '../../../../../models/drawings/text-element';
import { FontFixer } from '../../../../../helpers/font-fixer';
import { TextElement } from '../../../../../models/drawings/text-element';
@Component({
selector: '[app-text]',
templateUrl: './text.component.html',
styleUrls: ['./text.component.scss']
styleUrls: ['./text.component.scss'],
})
export class TextComponent implements OnInit, DoCheck {
static MARGIN = 4;
@Input('app-text') text: TextElement;
@ViewChild('text', {static: false}) textRef: ElementRef;
@ViewChild('text') textRef: ElementRef;
lines: string[] = [];
transformation = '';
constructor(private fontFixer: FontFixer, private sanitizer: DomSanitizer) {}
constructor(private fontFixer: FontFixer, private sanitizer: DomSanitizer) { }
ngOnInit() {
this.lines = this.getLines(this.text.text);
if (this.text) {
this.lines = this.getLines(this.text.text);
}
}
ngDoCheck() {
@ -30,32 +32,38 @@ export class TextComponent implements OnInit, DoCheck {
}
get style() {
const font = this.fontFixer.fix(this.text);
if (this.text) {
const font = this.fontFixer.fix(this.text);
const styles: string[] = [];
if (font.font_family) {
styles.push(`font-family: "${this.text.font_family}"`);
const styles: string[] = [];
if (font.font_family) {
styles.push(`font-family: "${this.text.font_family}"`);
}
if (font.font_size) {
styles.push(`font-size: ${this.text.font_size}pt`);
}
if (font.font_weight) {
styles.push(`font-weight: ${this.text.font_weight}`);
}
return this.sanitizer.bypassSecurityTrustStyle(styles.join('; '));
}
if (font.font_size) {
styles.push(`font-size: ${this.text.font_size}pt`);
}
if (font.font_weight) {
styles.push(`font-weight: ${this.text.font_weight}`);
}
return this.sanitizer.bypassSecurityTrustStyle(styles.join('; '));
}
get textDecoration() {
return this.text.text_decoration;
if (this.text) {
return this.text.text_decoration;
}
}
calculateTransformation() {
const tspans = this.textRef.nativeElement.getElementsByTagName('tspan');
if (tspans.length > 0) {
const height = this.textRef.nativeElement.getBBox().height / tspans.length;
return `translate(${TextComponent.MARGIN}, ${height - TextComponent.MARGIN})`;
if (this.textRef != undefined) {
const tspans = this.textRef.nativeElement.getElementsByTagName('tspan');
if (tspans.length > 0) {
const height = this.textRef.nativeElement.getBBox().height / tspans.length;
return `translate(${TextComponent.MARGIN}, ${height - TextComponent.MARGIN})`;
}
return '';
}
return '';
}
getLines(text: string) {

View File

@ -1,4 +1,6 @@
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
ElementRef,
HostListener,
@ -7,29 +9,26 @@ import {
OnDestroy,
OnInit,
SimpleChange,
ChangeDetectionStrategy,
ChangeDetectorRef,
ViewChild
ViewChild,
} from '@angular/core';
import { GraphLayout } from '../../widgets/graph-layout';
import { Context } from '../../models/context';
import { Size } from '../../models/size';
import { Subscription } from 'rxjs';
import { MapChangeDetectorRef } from '../../services/map-change-detector-ref';
import { CanvasSizeDetector } from '../../helpers/canvas-size-detector';
import { Node } from '../../models/node';
import { Link } from '../../../models/link';
import { Drawing } from '../../models/drawing';
import { Symbol } from '../../../models/symbol';
import { CanvasSizeDetector } from '../../helpers/canvas-size-detector';
import { GraphDataManager } from '../../managers/graph-data-manager';
import { LayersManager } from '../../managers/layers-manager';
import { Context } from '../../models/context';
import { Drawing } from '../../models/drawing';
import { Node } from '../../models/node';
import { Size } from '../../models/size';
import { MapChangeDetectorRef } from '../../services/map-change-detector-ref';
import { GraphLayout } from '../../widgets/graph-layout';
@Component({
selector: 'app-experimental-map',
templateUrl: './experimental-map.component.html',
styleUrls: ['./experimental-map.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ExperimentalMapComponent implements OnInit, OnChanges, OnDestroy {
@Input() nodes: Node[] = [];
@ -43,12 +42,12 @@ export class ExperimentalMapComponent implements OnInit, OnChanges, OnDestroy {
@Input() width = 1500;
@Input() height = 600;
@ViewChild('svg', {static: false}) svg: ElementRef;
@ViewChild('svg') svg: ElementRef;
private changesDetected: Subscription;
protected settings = {
show_interface_labels: true
show_interface_labels: true,
};
constructor(

View File

@ -1,16 +1,28 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ChangeDetectorRef, ElementRef, Injectable } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { CssFixer } from 'app/cartography/helpers/css-fixer';
import { InterfaceLabelComponent } from './interface-label.component';
describe('InterfaceLabelComponent', () => {
export class MockElementRef extends ElementRef {
constructor() { super(null || undefined); }
nativeElement={}
}
xdescribe('InterfaceLabelComponent', () => {
let component: InterfaceLabelComponent;
let fixture: ComponentFixture<InterfaceLabelComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [InterfaceLabelComponent]
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [InterfaceLabelComponent],
providers: [
CssFixer,
ChangeDetectorRef,
{ provide: ElementRef, useValue: new MockElementRef() },
]
}).compileComponents();
}));
});
beforeEach(() => {
fixture = TestBed.createComponent(InterfaceLabelComponent);
@ -18,7 +30,7 @@ describe('InterfaceLabelComponent', () => {
fixture.detectChanges();
});
// it('should create', () => {
// expect(component).toBeTruthy();
// });
it('should create', () => {
expect(component).toBeTruthy()
});
});

View File

@ -1,23 +1,23 @@
import { Component, OnInit, Input, ChangeDetectorRef, ElementRef, ViewChild } from '@angular/core';
import { ChangeDetectorRef, Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { CssFixer } from '../../../helpers/css-fixer';
@Component({
selector: '[app-interface-label]',
templateUrl: './interface-label.component.html',
styleUrls: ['./interface-label.component.scss']
styleUrls: ['./interface-label.component.scss'],
})
export class InterfaceLabelComponent implements OnInit {
@Input('app-interface-label') ignore: any;
@ViewChild('textSvg', {static: false}) textRef: ElementRef;
@ViewChild('textSvg') textRef: ElementRef;
private label = {
x: 0,
y: 0,
text: '',
style: '',
rotation: 0
rotation: 0,
};
borderSize = 5;
@ -30,9 +30,9 @@ export class InterfaceLabelComponent implements OnInit {
private ref: ChangeDetectorRef,
private sanitizer: DomSanitizer,
private cssFixer: CssFixer
) {}
) { }
ngOnInit() {}
ngOnInit() { }
@Input('x')
set x(value) {
@ -89,9 +89,11 @@ export class InterfaceLabelComponent implements OnInit {
}
get transform() {
const bbox = this.elementRef.nativeElement.getBBox();
const x = this.label.x;
const y = this.label.y + bbox.height;
return `translate(${x}, ${y}) rotate(${this.label.rotation}, ${x}, ${y})`;
if (this.elementRef.nativeElement.getBBox) {
const bbox = this.elementRef.nativeElement.getBBox()
const x = this.label.x;
const y = this.label.y + bbox.height;
return `translate(${x}, ${y}) rotate(${this.label.rotation}, ${x}, ${y})`;
}
}
}

View File

@ -1,13 +1,13 @@
<svg:g
class="link"
[attr.link_id]="link.id"
[attr.map-source]="link.source.id"
[attr.map-target]="link.target.id"
[attr.link_id]="link?.id"
[attr.map-source]="link?.source?.id"
[attr.map-target]="link?.target?.id"
[attr.transform]="transform"
>
<svg:path
#path
*ngIf="link.linkType == 'ethernet'"
*ngIf="link?.linkType == 'ethernet'"
class="ethernet_link"
stroke="#000"
stroke-width="2"
@ -16,7 +16,7 @@
<svg:path
#path
*ngIf="link.linkType == 'serial'"
*ngIf="link?.linkType == 'serial'"
class="serial_link"
stroke="#B22222"
fill="none"
@ -24,27 +24,27 @@
[attr.d]="d"
/>
<svg:g [app-status]="link.source.status" [direction]="'source'" [path]="path" [d]="d" />
<svg:g [app-status]="link?.source?.status" [direction]="'source'" [path]="path" [d]="d" />
<svg:g [app-status]="link.target.status" [direction]="'target'" [path]="path" [d]="d" />
<svg:g [app-status]="link?.target?.status" [direction]="'target'" [path]="path" [d]="d" />
<svg:g
*ngIf="showInterfaceLabels"
[app-interface-label]
[x]="link.source.x + link.nodes[0].label.x"
[y]="link.source.y + link.nodes[0].label.y"
[text]="link.nodes[0].label.text"
[style]="link.nodes[0].label.style"
[rotation]="link.nodes[0].label.rotation"
[x]="link?.source?.x + link?.nodes[0]?.label?.x"
[y]="link?.source?.y + link?.nodes[0]?.label?.y"
[text]="link?.nodes[0]?.label?.text"
[style]="link?.nodes[0]?.label?.style"
[rotation]="link?.nodes[0]?.label?.rotation"
/>
<svg:g
*ngIf="showInterfaceLabels"
[app-interface-label]
[x]="link.target.x + link.nodes[1].label.x"
[y]="link.target.y + link.nodes[1].label.y"
[text]="link.nodes[1].label.text"
[style]="link.nodes[1].label.style"
[rotation]="link.nodes[1].label.rotation"
[x]="link?.target?.x + link?.nodes[1]?.label?.x"
[y]="link?.target?.y + link?.nodes[1]?.label?.y"
[text]="link?.nodes[1]?.label?.text"
[style]="link?.nodes[1]?.label?.style"
[rotation]="link?.nodes[1]?.label?.rotation"
/>
</svg:g>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1,16 +1,18 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MultiLinkCalculatorHelper } from 'app/cartography/helpers/multi-link-calculator-helper';
import { LinkComponent } from './link.component';
describe('LinkComponent', () => {
let component: LinkComponent;
let fixture: ComponentFixture<LinkComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [LinkComponent]
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [LinkComponent],
providers: [
{ provide: MultiLinkCalculatorHelper, useValue: {} }
]
}).compileComponents();
}));
});
beforeEach(() => {
fixture = TestBed.createComponent(LinkComponent);
@ -18,7 +20,7 @@ describe('LinkComponent', () => {
fixture.detectChanges();
});
// it('should create', () => {
// expect(component).toBeTruthy();
// });
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,39 +1,39 @@
import {
ChangeDetectorRef,
Component,
OnInit,
Input,
ViewChild,
ElementRef,
EventEmitter,
ChangeDetectorRef,
OnDestroy
Input,
OnDestroy,
OnInit,
ViewChild,
} from '@angular/core';
import { Subscription } from 'rxjs';
import { LinkStrategy } from './strategies/link-strategy';
import { EthernetLinkStrategy } from './strategies/ethernet-link-strategy';
import { SerialLinkStrategy } from './strategies/serial-link-strategy';
import { MultiLinkCalculatorHelper } from '../../../helpers/multi-link-calculator-helper';
import { Node } from '../../../models/node';
import { MapLink } from '../../../models/map/map-link';
import { Node } from '../../../models/node';
import { EthernetLinkStrategy } from './strategies/ethernet-link-strategy';
import { LinkStrategy } from './strategies/link-strategy';
import { SerialLinkStrategy } from './strategies/serial-link-strategy';
@Component({
selector: '[app-link]',
templateUrl: './link.component.html',
styleUrls: ['./link.component.scss']
styleUrls: ['./link.component.scss'],
})
export class LinkComponent implements OnInit, OnDestroy {
@Input('app-link') link: MapLink;
@Input('node-changed') nodeChanged: EventEmitter<Node>;
@Input('show-interface-labels') showInterfaceLabels: boolean;
@ViewChild('path', {static: false}) path: ElementRef;
@ViewChild('path') path: ElementRef;
private ethernetLinkStrategy = new EthernetLinkStrategy();
private serialLinkStrategy = new SerialLinkStrategy();
private nodeChangedSubscription: Subscription;
constructor(private multiLinkCalculatorHelper: MultiLinkCalculatorHelper, private ref: ChangeDetectorRef) {}
constructor(private multiLinkCalculatorHelper: MultiLinkCalculatorHelper, private ref: ChangeDetectorRef) { }
ngOnInit() {
this.ref.detectChanges();
@ -49,19 +49,21 @@ export class LinkComponent implements OnInit, OnDestroy {
}
get strategy(): LinkStrategy {
if (this.link.linkType === 'serial') {
if (this.link && this.link != undefined && this.link.linkType === 'serial') {
return this.serialLinkStrategy;
}
return this.ethernetLinkStrategy;
}
get transform() {
const translation = this.multiLinkCalculatorHelper.linkTranslation(
this.link.distance,
this.link.source,
this.link.target
);
return `translate (${translation.dx}, ${translation.dy})`;
if (this.link) {
const translation = this.multiLinkCalculatorHelper.linkTranslation(
this.link.distance,
this.link.source,
this.link.target
);
return `translate (${translation.dx}, ${translation.dy})`;
}
}
get d() {

View File

@ -1,12 +1,13 @@
import { LinkStrategy } from './link-strategy';
import { path } from 'd3-path';
import { MapLink } from '../../../../models/map/map-link';
import { LinkStrategy } from './link-strategy';
export class EthernetLinkStrategy implements LinkStrategy {
public d(link: MapLink): string {
const points = [
[link.source.x + link.source.width / 2, link.source.y + link.source.height / 2],
[link.target.x + link.target.width / 2, link.target.y + link.target.height / 2]
[link?.source?.x + link?.source?.width / 2, link?.source.y + link?.source?.height / 2],
[link?.target?.x + link?.target?.width / 2, link?.target?.y + link?.target?.height / 2],
];
const line_generator = path();

View File

@ -1,16 +1,16 @@
import { path } from 'd3-path';
import { LinkStrategy } from './link-strategy';
import { MapLink } from '../../../../models/map/map-link';
import { LinkStrategy } from './link-strategy';
export class SerialLinkStrategy implements LinkStrategy {
private linkToPoints(link: MapLink) {
const source = {
x: link.source.x + link.source.width / 2,
y: link.source.y + link.source.height / 2
y: link.source.y + link.source.height / 2,
};
const target = {
x: link.target.x + link.target.width / 2,
y: link.target.y + link.target.height / 2
y: link.target.y + link.target.height / 2,
};
const dx = target.x - source.x;
@ -22,12 +22,12 @@ export class SerialLinkStrategy implements LinkStrategy {
const angle_source: [number, number] = [
source.x + dx / 2.0 + 15 * vect_rot[0],
source.y + dy / 2.0 + 15 * vect_rot[1]
source.y + dy / 2.0 + 15 * vect_rot[1],
];
const angle_target: [number, number] = [
target.x - dx / 2.0 - 15 * vect_rot[0],
target.y - dy / 2.0 - 15 * vect_rot[1]
target.y - dy / 2.0 - 15 * vect_rot[1],
];
return [[source.x, source.y], angle_source, angle_target, [target.x, target.y]];

View File

@ -1,8 +1,8 @@
<svg:g class="node" [attr.transform]="'translate(' + node.x + ',' + node.y + ')'">
<svg:g class="node" [attr.transform]="'translate(' + node?.x + ',' + node?.y + ')'">
<svg:image
#image
[attr.width]="node.width"
[attr.height]="node.height"
[attr.width]="node?.width"
[attr.height]="node?.height"
[attr.x]="0"
[attr.y]="0"
[attr.xlink:href]="symbol"
@ -11,6 +11,6 @@
(dragged)="OnDragged($event)"
/>
<svg:text #label class="label" [attr.style]="label_style" [attr.x]="label_x" [attr.y]="label_y">
{{ node.label.text }}
{{ node?.label?.text }}
</svg:text>
</svg:g>

Before

Width:  |  Height:  |  Size: 484 B

After

Width:  |  Height:  |  Size: 490 B

View File

@ -1,16 +1,23 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { NodesEventSource } from 'app/cartography/events/nodes-event-source';
import { CssFixer } from 'app/cartography/helpers/css-fixer';
import { FontFixer } from 'app/cartography/helpers/font-fixer';
import { NodeComponent } from './node.component';
describe('NodeComponent', () => {
let component: NodeComponent;
let fixture: ComponentFixture<NodeComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [NodeComponent]
beforeEach(async() => {
await TestBed.configureTestingModule({
declarations: [NodeComponent],
providers:[
CssFixer,
FontFixer,
NodesEventSource,
]
}).compileComponents();
}));
});
beforeEach(() => {
fixture = TestBed.createComponent(NodeComponent);
@ -18,7 +25,7 @@ describe('NodeComponent', () => {
fixture.detectChanges();
});
// it('should create', () => {
// expect(component).toBeTruthy();
// });
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,37 +1,36 @@
import {
Component,
OnInit,
Input,
ElementRef,
ViewChild,
ChangeDetectorRef,
AfterViewInit,
ChangeDetectionStrategy,
Output,
ChangeDetectorRef,
Component,
ElementRef,
EventEmitter,
OnDestroy,
Input,
OnChanges,
AfterViewInit
OnDestroy,
OnInit,
ViewChild,
} from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { Subscription } from 'rxjs';
import { Symbol } from '../../../../models/symbol';
import { DraggedDataEvent } from '../../../events/event-source';
import { NodesEventSource } from '../../../events/nodes-event-source';
import { CssFixer } from '../../../helpers/css-fixer';
import { FontFixer } from '../../../helpers/font-fixer';
import { Symbol } from '../../../../models/symbol';
import { MapNode } from '../../../models/map/map-node';
import { NodesEventSource } from '../../../events/nodes-event-source';
import { DraggedDataEvent } from '../../../events/event-source';
@Component({
selector: '[app-node]',
templateUrl: './node.component.html',
styleUrls: ['./node.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class NodeComponent implements OnInit, OnDestroy, OnChanges, AfterViewInit {
static NODE_LABEL_MARGIN = 3;
@ViewChild('label', {static: false}) label: ElementRef;
@ViewChild('image', {static: false}) imageRef: ElementRef;
@ViewChild('label') label: ElementRef;
@ViewChild('image') imageRef: ElementRef;
@Input('app-node') node: MapNode;
@Input('symbols') symbols: Symbol[];
@ -50,7 +49,7 @@ export class NodeComponent implements OnInit, OnDestroy, OnChanges, AfterViewIni
protected element: ElementRef,
private cd: ChangeDetectorRef,
private nodesEventSource: NodesEventSource
) {}
) { }
ngOnInit() {
// this.nodeChangedSubscription = this.nodeChanged.subscribe((node: Node) => {
@ -86,42 +85,52 @@ export class NodeComponent implements OnInit, OnDestroy, OnChanges, AfterViewIni
}
get symbol(): string {
const symbol = this.symbols.find((s: Symbol) => s.symbol_id === this.node.symbol);
if (symbol) {
return 'data:image/svg+xml;base64,' + btoa(symbol.raw);
if (this.symbols) {
const symbol = this.symbols.find((s: Symbol) => s.symbol_id === this.node.symbol);
if (symbol) {
return 'data:image/svg+xml;base64,' + btoa(symbol.raw);
}
// @todo; we need to have default image
return 'data:image/svg+xml;base64,none';
}
// @todo; we need to have default image
return 'data:image/svg+xml;base64,none';
}
get label_style() {
let styles = this.cssFixer.fix(this.node.label.style);
styles = this.fontFixer.fixStyles(styles);
return this.sanitizer.bypassSecurityTrustStyle(styles);
if (this.node != undefined) {
let styles = this.cssFixer.fix(this.node.label.style);
styles = this.fontFixer.fixStyles(styles);
return this.sanitizer.bypassSecurityTrustStyle(styles);
}
}
get label_x(): number {
if (this.node.label.x === null) {
// center
const bbox = this.label.nativeElement.getBBox();
if (this.node != undefined) {
if (this.node.label.x === null) {
// center
const bbox = this.label.nativeElement.getBBox();
return -bbox.width / 2;
return -bbox.width / 2;
}
return this.node.label.x + NodeComponent.NODE_LABEL_MARGIN;
}
return this.node.label.x + NodeComponent.NODE_LABEL_MARGIN;
}
get label_y(): number {
this.labelHeight = this.getLabelHeight();
if (this.node.label.x === null) {
// center
return -this.node.height / 2 - this.labelHeight;
if (this.node != undefined) {
if (this.node.label.x === null) {
// center
return -this.node.height / 2 - this.labelHeight;
}
return this.node.label.y + this.labelHeight - NodeComponent.NODE_LABEL_MARGIN;
}
return this.node.label.y + this.labelHeight - NodeComponent.NODE_LABEL_MARGIN;
}
private getLabelHeight() {
const bbox = this.label.nativeElement.getBBox();
return bbox.height;
if (this.label != undefined) {
const bbox = this.label.nativeElement.getBBox();
return bbox.height;
}
}
}

View File

@ -1,24 +1,24 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { SelectionComponent } from './selection.component';
describe('SelectionComponent', () => {
let component: SelectionComponent;
let fixture: ComponentFixture<SelectionComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [SelectionComponent]
}).compileComponents();
}));
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [SelectionComponent],
}).compileComponents();
fixture = TestBed.createComponent(SelectionComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
afterEach(() => {
fixture.destroy()
})
// it('should create', () => {
// expect(component).toBeTruthy();
// });
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,11 +1,11 @@
import { Component, OnInit, Input, AfterViewInit, ChangeDetectorRef, Output, EventEmitter } from '@angular/core';
import { Observable, Subscription, Subject } from 'rxjs';
import { AfterViewInit, ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { Observable, Subscription} from 'rxjs';
import { Rectangle } from '../../../models/rectangle';
@Component({
selector: '[app-selection]',
templateUrl: './selection.component.html',
styleUrls: ['./selection.component.scss']
styleUrls: ['./selection.component.scss'],
})
export class SelectionComponent implements OnInit, AfterViewInit {
@Input('app-selection') svg: SVGSVGElement;
@ -28,15 +28,14 @@ export class SelectionComponent implements OnInit, AfterViewInit {
ngAfterViewInit() {
const down = Observable.fromEvent(this.svg, 'mousedown').do((e: MouseEvent) => e.preventDefault());
down.subscribe((e: MouseEvent) => {
if (e.target !== this.svg) {
return;
}
this.started = true;
this.startX = e.clientX + window.scrollX;
this.startY = e.clientY + window.scrollY;
this.startX = e?.clientX + window?.scrollX;
this.startY = e?.clientY + window?.scrollY;
this.width = 0;
this.height = 0;
this.visible = true;
@ -51,7 +50,7 @@ export class SelectionComponent implements OnInit, AfterViewInit {
const scrollWindow = Observable.fromEvent(document, 'scroll').startWith({});
const move = Observable.combineLatest(mouseMove, scrollWindow);
const move = Observable.combineLatest([mouseMove, scrollWindow]);
const drag = down.mergeMap((md: MouseEvent) => {
return move
@ -76,11 +75,11 @@ export class SelectionComponent implements OnInit, AfterViewInit {
this.visible = false;
this.started = false;
this.width = e.clientX - this.startX + window.scrollX;
this.height = e.clientY - this.startY + window.scrollY;
this.ref.detectChanges();
this.selectedEvent([this.startX, this.startY], [this.width, this.height]);
})
)

View File

@ -1,16 +1,15 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { StatusComponent } from './status.component';
describe('StatusComponent', () => {
let component: StatusComponent;
let fixture: ComponentFixture<StatusComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [StatusComponent]
beforeEach(async() => {
await TestBed.configureTestingModule({
declarations: [StatusComponent],
}).compileComponents();
}));
});
beforeEach(() => {
fixture = TestBed.createComponent(StatusComponent);

View File

@ -1,9 +1,9 @@
import { Component, ElementRef, Input, ChangeDetectorRef } from '@angular/core';
import { ChangeDetectorRef, Component, ElementRef, Input } from '@angular/core';
@Component({
selector: '[app-status]',
templateUrl: './status.component.html',
styleUrls: ['./status.component.scss']
styleUrls: ['./status.component.scss'],
})
export class StatusComponent {
static STOPPED_STATUS_RECT_WIDTH = 10;
@ -12,7 +12,7 @@ export class StatusComponent {
status: '',
path: null,
direction: null,
d: null
d: null,
};
constructor(protected element: ElementRef, private ref: ChangeDetectorRef) {}

View File

@ -0,0 +1,31 @@
import { Component, Input, OnDestroy, OnInit } from '@angular/core';
import { select } from 'd3-selection';
import { Subscription } from 'rxjs';
import { LinksEventSource } from '../../events/links-event-source';
import { MapLink } from '../../models/map/map-link';
import { LinksWidget } from '../../widgets/links';
@Component({
selector: 'app-link-editing',
templateUrl: './link-editing.component.html',
styleUrls: ['./link-editing.component.scss'],
})
export class LinkEditingComponent implements OnInit, OnDestroy {
private linkEditedSubscription: Subscription;
@Input('svg') svg: SVGSVGElement;
constructor(
private linksWidget: LinksWidget,
private linksEventSource: LinksEventSource ) {}
ngOnInit() {
const svg = select(this.svg);
this.linkEditedSubscription = this.linksEventSource.edited.subscribe((link: MapLink) => {
this.linksWidget.redrawLink(svg, link);
});
}
ngOnDestroy() {
this.linkEditedSubscription.unsubscribe();
}
}

View File

@ -1,14 +1,13 @@
import { fakeAsync, tick } from '@angular/core/testing';
import { SelectionControlComponent } from './selection-control.component';
import { SelectionManager } from '../../managers/selection-manager';
import { instance, mock, when } from 'ts-mockito';
import { SelectionEventSource } from '../../events/selection-event-source';
import { mock, when, instance } from 'ts-mockito';
import { GraphDataManager } from '../../managers/graph-data-manager';
import { MapNode } from '../../models/map/map-node';
import { MapLink } from '../../models/map/map-link';
import { InRectangleHelper } from '../../helpers/in-rectangle-helper';
import { GraphDataManager } from '../../managers/graph-data-manager';
import { SelectionManager } from '../../managers/selection-manager';
import { MapLink } from '../../models/map/map-link';
import { MapNode } from '../../models/map/map-node';
import { Rectangle } from '../../models/rectangle';
import { SelectionControlComponent } from './selection-control.component';
describe('SelectionControlComponent', () => {
let component: SelectionControlComponent;

View File

@ -1,15 +1,15 @@
import { Component, OnInit, OnDestroy } from '@angular/core';
import { Component, OnDestroy, OnInit } from '@angular/core';
import { Subscription } from 'rxjs';
import { SelectionEventSource } from '../../events/selection-event-source';
import { GraphDataManager } from '../../managers/graph-data-manager';
import { InRectangleHelper } from '../../helpers/in-rectangle-helper';
import { GraphDataManager } from '../../managers/graph-data-manager';
import { SelectionManager } from '../../managers/selection-manager';
import { Rectangle } from '../../models/rectangle';
@Component({
selector: 'app-selection-control',
templateUrl: './selection-control.component.html',
styleUrls: ['./selection-control.component.scss']
styleUrls: ['./selection-control.component.scss'],
})
export class SelectionControlComponent implements OnInit, OnDestroy {
private onSelection: Subscription;
@ -23,21 +23,21 @@ export class SelectionControlComponent implements OnInit, OnDestroy {
ngOnInit() {
this.onSelection = this.selectionEventSource.selected.subscribe((rectangle: Rectangle) => {
const selectedNodes = this.graphDataManager.getNodes().filter(node => {
const selectedNodes = this.graphDataManager.getNodes().filter((node) => {
return this.inRectangleHelper.inRectangle(rectangle, node.x, node.y);
});
const selectedLinks = this.graphDataManager.getLinks().filter(link => {
const selectedLinks = this.graphDataManager.getLinks().filter((link) => {
return this.inRectangleHelper.inRectangle(rectangle, link.x, link.y);
});
const selectedDrawings = this.graphDataManager.getDrawings().filter(drawing => {
const selectedDrawings = this.graphDataManager.getDrawings().filter((drawing) => {
return this.inRectangleHelper.inRectangle(rectangle, drawing.x, drawing.y);
});
const selectedLabels = this.graphDataManager
.getNodes()
.filter(node => {
.filter((node) => {
if (node.label === undefined) {
return false;
}
@ -45,11 +45,11 @@ export class SelectionControlComponent implements OnInit, OnDestroy {
const labelY = node.y + node.label.y;
return this.inRectangleHelper.inRectangle(rectangle, labelX, labelY);
})
.map(node => node.label);
.map((node) => node.label);
const selectedInterfacesLabelsSources = this.graphDataManager
.getLinks()
.filter(link => {
.filter((link) => {
if (link.source === undefined || link.nodes.length != 2 || link.nodes[0].label === undefined) {
return false;
}
@ -57,11 +57,11 @@ export class SelectionControlComponent implements OnInit, OnDestroy {
const interfaceLabelY = link.source.y + link.nodes[0].label.y;
return this.inRectangleHelper.inRectangle(rectangle, interfaceLabelX, interfaceLabelY);
})
.map(link => link.nodes[0]);
.map((link) => link.nodes[0]);
const selectedInterfacesLabelsTargets = this.graphDataManager
.getLinks()
.filter(link => {
.filter((link) => {
if (link.target === undefined || link.nodes.length != 2 || link.nodes[1].label === undefined) {
return false;
}
@ -69,7 +69,7 @@ export class SelectionControlComponent implements OnInit, OnDestroy {
const interfaceLabelY = link.target.y + link.nodes[1].label.y;
return this.inRectangleHelper.inRectangle(rectangle, interfaceLabelX, interfaceLabelY);
})
.map(link => link.nodes[1]);
.map((link) => link.nodes[1]);
const selectedInterfaces = [...selectedInterfacesLabelsSources, ...selectedInterfacesLabelsTargets];
@ -78,7 +78,7 @@ export class SelectionControlComponent implements OnInit, OnDestroy {
...selectedLinks,
...selectedDrawings,
...selectedLabels,
...selectedInterfaces
...selectedInterfaces,
];
this.selectionManager.setSelected(selected);

View File

@ -1,16 +1,18 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { SelectionManager } from 'app/cartography/managers/selection-manager';
import { MapChangeDetectorRef } from 'app/cartography/services/map-change-detector-ref';
import { SelectionSelectComponent } from './selection-select.component';
describe('SelectionSelectComponent', () => {
let component: SelectionSelectComponent;
let fixture: ComponentFixture<SelectionSelectComponent>;
beforeEach(async(() => {
beforeEach(async () => {
TestBed.configureTestingModule({
declarations: [SelectionSelectComponent]
declarations: [SelectionSelectComponent],
providers: [MapChangeDetectorRef,SelectionManager]
}).compileComponents();
}));
});
beforeEach(() => {
fixture = TestBed.createComponent(SelectionSelectComponent);
@ -18,7 +20,7 @@ describe('SelectionSelectComponent', () => {
fixture.detectChanges();
});
// it('should create', () => {
// expect(component).toBeTruthy();
// });
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,4 +1,4 @@
import { Component, Input, OnInit, OnDestroy } from '@angular/core';
import { Component, OnDestroy, OnInit } from '@angular/core';
import { Subscription } from 'rxjs';
import { SelectionManager } from '../../managers/selection-manager';
import { MapChangeDetectorRef } from '../../services/map-change-detector-ref';
@ -6,16 +6,13 @@ import { MapChangeDetectorRef } from '../../services/map-change-detector-ref';
@Component({
selector: 'app-selection-select',
templateUrl: './selection-select.component.html',
styleUrls: ['./selection-select.component.scss']
styleUrls: ['./selection-select.component.scss'],
})
export class SelectionSelectComponent implements OnInit, OnDestroy {
private onSelected: Subscription;
private onUnselected: Subscription;
constructor(
private selectionManager: SelectionManager,
private mapChangeDetectorRef: MapChangeDetectorRef
) {}
constructor(private selectionManager: SelectionManager, private mapChangeDetectorRef: MapChangeDetectorRef) {}
ngOnInit() {
this.onSelected = this.selectionManager.selected.subscribe(() => {

View File

@ -1,24 +1,24 @@
import { TextEditorComponent } from './text-editor.component';
import { ComponentFixture, TestBed, async } from '@angular/core/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { DrawingsEventSource } from '../../events/drawings-event-source';
import { ToolsService } from '../../../services/tools.service';
import { Context } from '../../models/context';
import { Renderer2 } from '@angular/core';
import { MapScaleService } from '../../../services/mapScale.service';
import { LinkService } from '../../../services/link.service';
import { NodesDataSource } from '../../datasources/nodes-datasource';
import { LinksDataSource } from '../../datasources/links-datasource';
import { SelectionManager } from '../../managers/selection-manager';
import { FontFixer } from '../../helpers/font-fixer';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { MockedLinkService } from '../../../components/project-map/project-map.component.spec';
import { LinkService } from '../../../services/link.service';
import { MapScaleService } from '../../../services/mapScale.service';
import { ToolsService } from '../../../services/tools.service';
import { LinksDataSource } from '../../datasources/links-datasource';
import { NodesDataSource } from '../../datasources/nodes-datasource';
import { DrawingsEventSource } from '../../events/drawings-event-source';
import { FontFixer } from '../../helpers/font-fixer';
import { SelectionManager } from '../../managers/selection-manager';
import { Context } from '../../models/context';
import { TextEditorComponent } from './text-editor.component';
describe('TextEditorComponent', () => {
let component: TextEditorComponent;
let fixture: ComponentFixture<TextEditorComponent>;
let mockedLinkService: MockedLinkService = new MockedLinkService();
beforeEach(async(() => {
beforeEach(async() => {
TestBed.configureTestingModule({
imports: [NoopAnimationsModule],
providers: [
@ -31,11 +31,11 @@ describe('TextEditorComponent', () => {
{ provide: NodesDataSource, useClass: NodesDataSource },
{ provide: LinksDataSource, useClass: LinksDataSource },
{ provide: SelectionManager, useClass: SelectionManager },
{ provide: FontFixer, useClass: FontFixer }
{ provide: FontFixer, useClass: FontFixer },
],
declarations: [TextEditorComponent]
declarations: [TextEditorComponent],
}).compileComponents();
}));
});
beforeEach(() => {
fixture = TestBed.createComponent(TextEditorComponent);

View File

@ -1,35 +1,43 @@
import { Component, ViewChild, ElementRef, OnInit, Input, EventEmitter, OnDestroy, Renderer2, NgZone } from '@angular/core';
import {
Component,
ElementRef,
EventEmitter,
Input,
NgZone,
OnDestroy,
OnInit,
Renderer2,
ViewChild,
} from '@angular/core';
import { select } from 'd3-selection';
import { Subscription } from 'rxjs';
import { StyleProperty } from '../../../components/project-map/drawings-editors/text-editor/text-editor.component';
import { Link } from '../../../models/link';
import { Controller } from '../../../models/controller';
import { LinkService } from '../../../services/link.service';
import { MapScaleService } from '../../../services/mapScale.service';
import { ToolsService } from '../../../services/tools.service';
import { LinksDataSource } from '../../datasources/links-datasource';
import { NodesDataSource } from '../../datasources/nodes-datasource';
import { DrawingsEventSource } from '../../events/drawings-event-source';
import { TextAddedDataEvent, TextEditedDataEvent } from '../../events/event-source';
import { ToolsService } from '../../../services/tools.service';
import { select } from 'd3-selection';
import { TextElement } from '../../models/drawings/text-element';
import { Context } from '../../models/context';
import { Subscription } from 'rxjs';
import { MapScaleService } from '../../../services/mapScale.service';
import { MapLabel } from '../../models/map/map-label';
import { MapNode } from '../../models/map/map-node';
import { NodesDataSource } from '../../datasources/nodes-datasource';
import { Node } from '../../models/node';
import { SelectionManager } from '../../managers/selection-manager';
import { Server } from '../../../models/server';
import { MapLinkNode } from '../../models/map/map-link-node';
import { LinkService } from '../../../services/link.service';
import { LinksDataSource } from '../../datasources/links-datasource';
import { Link } from '../../../models/link';
import { StyleProperty } from '../../../components/project-map/drawings-editors/text-editor/text-editor.component';
import { FontFixer } from '../../helpers/font-fixer';
import { SelectionManager } from '../../managers/selection-manager';
import { Context } from '../../models/context';
import { TextElement } from '../../models/drawings/text-element';
import { Font } from '../../models/font';
import { MapLinkNode } from '../../models/map/map-link-node';
import { Node } from '../../models/node';
@Component({
selector: 'app-text-editor',
templateUrl: './text-editor.component.html',
styleUrls: ['./text-editor.component.scss']
styleUrls: ['./text-editor.component.scss'],
})
export class TextEditorComponent implements OnInit, OnDestroy {
@ViewChild('temporaryTextElement', {static: false}) temporaryTextElement: ElementRef;
@ViewChild('temporaryTextElement') temporaryTextElement: ElementRef;
@Input('svg') svg: SVGSVGElement;
@Input('server') server: Server;
@Input('controller') controller: Controller;
leftPosition: string = '0px';
topPosition: string = '0px';
@ -73,8 +81,13 @@ export class TextEditorComponent implements OnInit, OnDestroy {
this.leftPosition = event.pageX.toString() + 'px';
this.topPosition = event.pageY.toString() + 'px';
this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'display', 'initial');
this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'transform', `scale(${this.mapScaleService.getScale()})`);
this.renderer.setStyle(
this.temporaryTextElement.nativeElement,
'transform',
`scale(${this.mapScaleService.getScale()})`
);
this.temporaryTextElement.nativeElement.focus();
document.documentElement.style.cursor = "default";
let textListener = () => {
this.drawingsEventSource.textAdded.emit(
@ -113,7 +126,11 @@ export class TextEditorComponent implements OnInit, OnDestroy {
this.selectionManager.setSelected([]);
this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'display', 'initial');
this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'transform', `scale(${this.mapScaleService.getScale()})`);
this.renderer.setStyle(
this.temporaryTextElement.nativeElement,
'transform',
`scale(${this.mapScaleService.getScale()})`
);
this.editedLink = elem;
select(textElements[index]).attr('visibility', 'hidden');
@ -121,36 +138,54 @@ export class TextEditorComponent implements OnInit, OnDestroy {
this.editedNode = this.nodesDataSource.get(elem.nodeId);
this.editedLink = elem;
let x = ((elem.label.originalX + this.editedNode.x - 1) * this.context.transformation.k) + this.context.getZeroZeroTransformationPoint().x + this.context.transformation.x;
let y = ((elem.label.originalY + this.editedNode.y + 4) * this.context.transformation.k) + this.context.getZeroZeroTransformationPoint().y + this.context.transformation.y;
let x =
(elem.label.originalX + this.editedNode.x - 1) * this.context.transformation.k +
this.context.getZeroZeroTransformationPoint().x +
this.context.transformation.x;
let y =
(elem.label.originalY + this.editedNode.y + 4) * this.context.transformation.k +
this.context.getZeroZeroTransformationPoint().y +
this.context.transformation.y;
this.leftPosition = x.toString() + 'px';
this.topPosition = y.toString() + 'px';
this.temporaryTextElement.nativeElement.innerText = elem.label.text;
let styleProperties: StyleProperty[] = [];
for (let property of elem.label.style.split(";")){
for (let property of elem.label.style.split(';')) {
styleProperties.push({
property: property.split(": ")[0],
value: property.split(": ")[1]
property: property.split(': ')[0],
value: property.split(': ')[1],
});
}
let font: Font = {
font_family: styleProperties.find(p => p.property === 'font-family') ? styleProperties.find(p => p.property === 'font-family').value : 'TypeWriter',
font_size: styleProperties.find(p => p.property === 'font-size') ? Number(styleProperties.find(p => p.property === 'font-size').value) : 10.0,
font_weight: styleProperties.find(p => p.property === 'font-weight') ? styleProperties.find(p => p.property === 'font-weight').value : 'normal'
font_family: styleProperties.find((p) => p.property === 'font-family')
? styleProperties.find((p) => p.property === 'font-family').value
: 'TypeWriter',
font_size: styleProperties.find((p) => p.property === 'font-size')
? Number(styleProperties.find((p) => p.property === 'font-size').value)
: 10.0,
font_weight: styleProperties.find((p) => p.property === 'font-weight')
? styleProperties.find((p) => p.property === 'font-weight').value
: 'normal',
};
font = this.fontFixer.fix(font);
this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'color', styleProperties.find(p => p.property === 'fill') ? styleProperties.find(p => p.property === 'fill').value : '#000000');
this.renderer.setStyle(
this.temporaryTextElement.nativeElement,
'color',
styleProperties.find((p) => p.property === 'fill')
? styleProperties.find((p) => p.property === 'fill').value
: '#000000'
);
this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'font-family', font.font_family);
this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'font-size', `${font.font_size}pt`);
this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'font-weight', font.font_weight);
let listener = () => {
let innerText = this.temporaryTextElement.nativeElement.innerText;
let link: Link = this.linksDataSource.get(this.editedLink.linkId);
link.nodes.find(n => n.node_id === this.editedNode.node_id).label.text = innerText;
link.nodes.find((n) => n.node_id === this.editedNode.node_id).label.text = innerText;
this.linkService.updateLink(this.server, link).subscribe((link: Link) => {
this.linkService.updateLink(this.controller, link).subscribe((link: Link) => {
rootElement
.selectAll<SVGTextElement, TextElement>('text.editingMode')
.attr('visibility', 'visible')
@ -177,7 +212,11 @@ export class TextEditorComponent implements OnInit, OnDestroy {
.selectAll<SVGTextElement, TextElement>('text.text_element')
.on('dblclick', (elem, index, textElements) => {
this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'display', 'initial');
this.renderer.setStyle(this.temporaryTextElement.nativeElement, 'transform', `scale(${this.mapScaleService.getScale()})`);
this.renderer.setStyle(
this.temporaryTextElement.nativeElement,
'transform',
`scale(${this.mapScaleService.getScale()})`
);
this.editedElement = elem;
select(textElements[index]).attr('visibility', 'hidden');
@ -185,8 +224,14 @@ export class TextEditorComponent implements OnInit, OnDestroy {
this.editingDrawingId = textElements[index].parentElement.parentElement.getAttribute('drawing_id');
var transformData = textElements[index].parentElement.getAttribute('transform').split(/\(|\)/);
var x = (Number(transformData[1].split(/,/)[0]) * this.context.transformation.k) + this.context.getZeroZeroTransformationPoint().x + this.context.transformation.x;
var y = (Number(transformData[1].split(/,/)[1]) * this.context.transformation.k) + this.context.getZeroZeroTransformationPoint().y + this.context.transformation.y;
var x =
Number(transformData[1].split(/,/)[0]) * this.context.transformation.k +
this.context.getZeroZeroTransformationPoint().x +
this.context.transformation.x;
var y =
Number(transformData[1].split(/,/)[1]) * this.context.transformation.k +
this.context.getZeroZeroTransformationPoint().y +
this.context.transformation.y;
this.leftPosition = x.toString() + 'px';
this.topPosition = y.toString() + 'px';
this.temporaryTextElement.nativeElement.innerText = elem.text;

View File

@ -1,8 +1,7 @@
import { Injectable } from '@angular/core';
import { Converter } from '../converter';
import { Drawing } from '../../models/drawing';
import { MapDrawing } from '../../models/map/map-drawing';
import { Converter } from '../converter';
@Injectable()
export class DrawingToMapDrawingConverter implements Converter<Drawing, MapDrawing> {

View File

@ -1,11 +1,10 @@
import { Injectable } from '@angular/core';
import { Converter } from '../converter';
import { CssFixer } from '../../helpers/css-fixer';
import { FontBBoxCalculator } from '../../helpers/font-bbox-calculator';
import { FontFixer } from '../../helpers/font-fixer';
import { Label } from '../../models/label';
import { MapLabel } from '../../models/map/map-label';
import { FontBBoxCalculator } from '../../helpers/font-bbox-calculator';
import { CssFixer } from '../../helpers/css-fixer';
import { FontFixer } from '../../helpers/font-fixer';
import { Converter } from '../converter';
@Injectable()
export class LabelToMapLabelConverter implements Converter<Label, MapLabel> {

View File

@ -1,9 +1,8 @@
import { Injectable } from '@angular/core';
import { Converter } from '../converter';
import { LabelToMapLabelConverter } from './label-to-map-label-converter';
import { LinkNode } from '../../../models/link-node';
import { MapLinkNode } from '../../models/map/map-link-node';
import { Converter } from '../converter';
import { LabelToMapLabelConverter } from './label-to-map-label-converter';
@Injectable()
export class LinkNodeToMapLinkNodeConverter implements Converter<LinkNode, MapLinkNode> {

View File

@ -1,9 +1,8 @@
import { Injectable } from '@angular/core';
import { Converter } from '../converter';
import { LinkNodeToMapLinkNodeConverter } from './link-node-to-map-link-node-converter';
import { Link } from '../../../models/link';
import { MapLink } from '../../models/map/map-link';
import { Converter } from '../converter';
import { LinkNodeToMapLinkNodeConverter } from './link-node-to-map-link-node-converter';
@Injectable()
export class LinkToMapLinkConverter implements Converter<Link, MapLink> {
@ -16,8 +15,11 @@ export class LinkToMapLinkConverter implements Converter<Link, MapLink> {
mapLink.captureFilePath = link.capture_file_path;
mapLink.capturing = link.capturing;
mapLink.filters = link.filters;
mapLink.link_style = link.link_style;
mapLink.linkType = link.link_type;
mapLink.nodes = link.nodes.map(linkNode => this.linkNodeToMapLinkNode.convert(linkNode, { link_id: link.link_id }));
mapLink.nodes = link.nodes.map((linkNode) =>
this.linkNodeToMapLinkNode.convert(linkNode, { link_id: link.link_id })
);
mapLink.projectId = link.project_id;
mapLink.suspend = link.suspend;
return mapLink;

Some files were not shown because too many files have changed in this diff Show More