Compare commits

..

171 Commits

Author SHA1 Message Date
255fdae3e2 Release v3.0.5
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build / Node 14 (push) Has been cancelled
Build / Node 16 (push) Has been cancelled
Build / Node 18 (push) Has been cancelled
2025-05-14 19:02:09 +02:00
b18b617b24 Fix issue when login with wrong credentials. Fixes https://github.com/GNS3/gns3-gui/issues/3714
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build / Node 14 (push) Has been cancelled
Build / Node 16 (push) Has been cancelled
Build / Node 18 (push) Has been cancelled
2025-03-16 20:30:03 +07:00
cdf1b0ab72 Fix issue when login with wrong credentials. Fixes #1481
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build / Node 14 (push) Has been cancelled
Build / Node 16 (push) Has been cancelled
Build / Node 18 (push) Has been cancelled
2025-03-15 14:58:54 +07:00
8222417c91 Use short imports
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build / Node 14 (push) Has been cancelled
Build / Node 16 (push) Has been cancelled
Build / Node 18 (push) Has been cancelled
2025-03-02 17:44:00 +07:00
c7ebc354b9 Formatting for Controller 2025-03-02 17:53:30 +08:00
82905ea72f Development on 3.0.5.dev1
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build / Node 14 (push) Has been cancelled
Build / Node 16 (push) Has been cancelled
Build / Node 18 (push) Has been cancelled
2025-02-25 22:37:10 +08:00
c49e5d2573 Release v3.0.4
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build / Node 14 (push) Has been cancelled
Build / Node 16 (push) Has been cancelled
Build / Node 18 (push) Has been cancelled
2025-02-23 12:00:58 +10:00
de186fef4c Merge pull request #1543 from GNS3/idlepc
Some checks are pending
CodeQL / Analyze (javascript) (push) Waiting to run
CodeQL / Analyze (python) (push) Waiting to run
Build / Node 14 (push) Waiting to run
Build / Node 16 (push) Waiting to run
Build / Node 18 (push) Waiting to run
Idle-PC configuration support
2025-02-22 19:11:43 +08:00
346e3d988f Fix tests 2025-02-22 21:04:51 +10:00
4a34007cf4 Implement Idle-PC finder for IOS templates 2025-02-22 20:57:32 +10:00
aeb26b0f17 Add tooltip for idle-pc dialog and implement auto idle-pc action 2025-02-22 18:59:57 +10:00
6a9505fc0a Allow users to compute Idle-PC values 2025-02-22 16:51:23 +10:00
445ce5a864 Enforce password complexity. Ref https://github.com/GNS3/gns3-gui/issues/3698
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build / Node 14 (push) Has been cancelled
Build / Node 16 (push) Has been cancelled
Build / Node 18 (push) Has been cancelled
2025-02-19 18:51:36 +10:00
050d4158ed Add possibility for a user to change his/her password. Ref https://github.com/GNS3/gns3-gui/issues/3698
Some checks are pending
CodeQL / Analyze (javascript) (push) Waiting to run
CodeQL / Analyze (python) (push) Waiting to run
Build / Node 14 (push) Waiting to run
Build / Node 16 (push) Waiting to run
Build / Node 18 (push) Waiting to run
2025-02-18 11:44:06 +10:00
6b28370111 Fix tests
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build / Node 14 (push) Has been cancelled
Build / Node 16 (push) Has been cancelled
Build / Node 18 (push) Has been cancelled
2025-02-16 13:32:10 +10:00
8ec03968df Fix import/export Dynamips configs 2025-02-16 12:57:01 +10:00
097efdcbcd Add prune images and install images to image manager
Some checks are pending
CodeQL / Analyze (javascript) (push) Waiting to run
CodeQL / Analyze (python) (push) Waiting to run
Build / Node 14 (push) Waiting to run
Build / Node 16 (push) Waiting to run
Build / Node 18 (push) Waiting to run
2025-02-15 23:57:30 +10:00
cd483e047b Improvements to add new Ethernet switch ports 2025-02-15 18:16:21 +10:00
64cc001512 Merge pull request #1541 from GNS3/add-missing-settings
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build / Node 14 (push) Has been cancelled
Build / Node 16 (push) Has been cancelled
Build / Node 18 (push) Has been cancelled
Add missing settings for nodes/templates
2025-02-05 18:14:59 +08:00
55bc69389d Add missing adapter and mac address settings for Qemu and Docker nodes 2025-02-05 20:02:58 +10:00
10c1461d93 Fix tests
Some checks failed
Build / Node 14 (push) Has been cancelled
Build / Node 16 (push) Has been cancelled
Build / Node 18 (push) Has been cancelled
2025-02-04 21:45:22 +10:00
86db2e208c Fix and improve IOS template configuration 2025-02-04 21:00:20 +10:00
80884a7929 Fix aux and aux_type usage 2025-02-04 14:23:32 +10:00
9523cd7703 Add missing IOS router settings in node configurator 2025-02-04 14:17:51 +10:00
042eb79e36 Development on 3.0.4.dev1
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build / Node ${{ matrix.node }} (14) (push) Has been cancelled
Build / Node ${{ matrix.node }} (16) (push) Has been cancelled
Build / Node ${{ matrix.node }} (18) (push) Has been cancelled
2025-01-22 19:09:08 +10:00
67b597d8ec Release v3.0.3 2025-01-22 18:53:25 +10:00
7fd37610ee Merge remote-tracking branch 'origin/2.2' into master-3.0
# Conflicts:
#	package.json
#	src/app/components/project-map/new-template-dialog/new-template-dialog.component.ts
2025-01-22 18:44:55 +10:00
c8ccf4d475 Development on 2.2.54.dev1
Some checks failed
Build / build (push) Has been cancelled
2025-01-21 12:13:40 +10:00
1a49bec3d4 Release v2.2.53 2025-01-21 11:37:59 +10:00
64f9631946 Fix use of FileUploader 2025-01-21 11:37:22 +10:00
b02fe4c751 Merge remote-tracking branch 'origin/2.2' into master-3.0
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build / Node ${{ matrix.node }} (14) (push) Has been cancelled
Build / Node ${{ matrix.node }} (16) (push) Has been cancelled
Build / Node ${{ matrix.node }} (18) (push) Has been cancelled
# Conflicts:
#	src/app/components/project-map/new-template-dialog/new-template-dialog.component.html
#	src/app/services/mapsettings.service.ts
2025-01-20 16:51:31 +10:00
84169a2c1e Add missing checkImageFromVersion() for IOS and IOU
Some checks are pending
Build / build (push) Waiting to run
2025-01-20 16:46:26 +10:00
2a9ced5cbd Allow ':' in project names. Fixes https://github.com/GNS3/gns3-gui/issues/3686 2025-01-20 13:39:04 +10:00
7c7e20d95f Release v3.0.2
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build / Node ${{ matrix.node }} (14) (push) Has been cancelled
Build / Node ${{ matrix.node }} (16) (push) Has been cancelled
Build / Node ${{ matrix.node }} (18) (push) Has been cancelled
2025-01-03 21:36:27 +07:00
e959a947cc Use correct image upload endpoint
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build / Node ${{ matrix.node }} (14) (push) Has been cancelled
Build / Node ${{ matrix.node }} (16) (push) Has been cancelled
Build / Node ${{ matrix.node }} (18) (push) Has been cancelled
2024-12-31 18:57:36 +07:00
7b633c29dd Allow ':' in project names. Fixes https://github.com/GNS3/gns3-gui/issues/3686
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build / Node ${{ matrix.node }} (14) (push) Has been cancelled
Build / Node ${{ matrix.node }} (16) (push) Has been cancelled
Build / Node ${{ matrix.node }} (18) (push) Has been cancelled
2024-12-30 16:26:51 +07:00
c24517d1f0 Release v3.0.1
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build / Node ${{ matrix.node }} (14) (push) Has been cancelled
Build / Node ${{ matrix.node }} (16) (push) Has been cancelled
Build / Node ${{ matrix.node }} (18) (push) Has been cancelled
2024-12-27 20:58:03 +07:00
9043c5b97c Use template image name when uploading to controller 2024-12-27 20:57:23 +07:00
2227d11932 Handle normal user cannot access user management page. Fixes https://github.com/GNS3/gns3-server/issues/2460
Some checks are pending
CodeQL / Analyze (javascript) (push) Waiting to run
CodeQL / Analyze (python) (push) Waiting to run
Build / Node ${{ matrix.node }} (14) (push) Waiting to run
Build / Node ${{ matrix.node }} (16) (push) Waiting to run
Build / Node ${{ matrix.node }} (18) (push) Waiting to run
2024-12-26 17:21:37 +07:00
2e581c4495 Merge pull request #1533 from GNS3/bugfix/1436
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build / Node ${{ matrix.node }} (14) (push) Has been cancelled
Build / Node ${{ matrix.node }} (16) (push) Has been cancelled
Build / Node ${{ matrix.node }} (18) (push) Has been cancelled
Fix error 404 when editing a project
2024-12-23 17:27:07 +07:00
ee5b88e19a Backport: fix interface labels are not persistant
Some checks failed
Build / build (push) Has been cancelled
2024-12-23 16:05:05 +07:00
cddce63e2b Fix error 404 when editing a project 2024-12-23 15:44:43 +07:00
180c65351b Merge pull request #1532 from GNS3/bugfix/1435
Fix interface labels are not persistant
2024-12-23 15:13:50 +07:00
27eb8eb9c3 Fix interface labels are not persistant 2024-12-23 15:07:09 +07:00
ab84d1eea6 Development on 3.1.0.dev1
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build / Node ${{ matrix.node }} (14) (push) Has been cancelled
Build / Node ${{ matrix.node }} (16) (push) Has been cancelled
Build / Node ${{ matrix.node }} (18) (push) Has been cancelled
2024-12-20 18:11:44 +07:00
89a7588612 Release v3.0.0
Some checks are pending
CodeQL / Analyze (javascript) (push) Waiting to run
CodeQL / Analyze (python) (push) Waiting to run
Build / Node ${{ matrix.node }} (14) (push) Waiting to run
Build / Node ${{ matrix.node }} (16) (push) Waiting to run
Build / Node ${{ matrix.node }} (18) (push) Waiting to run
2024-12-19 19:46:49 +07:00
ab5d298d7b Merge branch '2.2' into master-3.0
# Conflicts:
#	package.json
2024-12-19 18:17:25 +07:00
608fcfd04e Fix unable to configure Ethernet Switch. Fixes #1530
Some checks failed
Build / build (push) Has been cancelled
2024-12-19 18:16:41 +07:00
99c6502a65 Development on 2.2.53.dev1 2024-12-02 11:27:15 +10:00
28d27194be Release v2.2.52 2024-12-02 11:05:45 +10:00
bbb7f08925 Add .iol extension filter to image dialog. Ref https://github.com/GNS3/gns3-gui/issues/3664 2024-11-25 11:03:44 +10:00
c1fa038f27 Merge branch '2.2' into master-3.0 2024-11-25 11:03:29 +10:00
52f772676b Add .iol extension filter. Ref https://github.com/GNS3/gns3-gui/issues/3664 2024-11-25 11:02:49 +10:00
e424a7f410 Release v3.0.0rc2 2024-11-20 13:46:43 +10:00
27eecf2ec9 Merge branch '2.2' into master-3.0
# Conflicts:
#	package.json
#	src/app/models/templates/docker-template.ts
#	src/app/services/template-mocks.service.ts
#	yarn.lock
2024-11-20 12:37:26 +10:00
8068751032 Development on 2.2.51.dev1 2024-10-21 13:25:06 +10:00
28f8de0da1 Release v2.2.50 2024-10-21 12:02:41 +10:00
8cc4fb6f75 Merge remote-tracking branch 'origin/master' into 2.2 2024-10-21 11:56:21 +10:00
1196742e3b Merge pull request #1525 from GNS3/dependabot/npm_and_yarn/body-parser-1.20.3
Bump body-parser from 1.20.1 to 1.20.3
2024-09-21 16:54:09 +07:00
d398efe229 Bump body-parser from 1.20.1 to 1.20.3
Bumps [body-parser](https://github.com/expressjs/body-parser) from 1.20.1 to 1.20.3.
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/1.20.1...1.20.3)

---
updated-dependencies:
- dependency-name: body-parser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-21 09:40:03 +00:00
33e8fa7f5f Merge pull request #1524 from GNS3/dependabot/npm_and_yarn/express-4.21.0
Bump express from 4.19.2 to 4.21.0
2024-09-21 16:38:57 +07:00
b9833aa00b Bump express from 4.19.2 to 4.21.0
Bumps [express](https://github.com/expressjs/express) from 4.19.2 to 4.21.0.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.19.2...4.21.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-21 08:22:26 +00:00
fc66124ea9 Add configure base mac address for Docker templates 2024-09-18 17:09:25 +07:00
9d0d88337a Release v3.0.0rc1 2024-08-11 11:00:56 -06:00
5283d074e7 Merge remote-tracking branch 'origin/2.2' into master-3.0
# Conflicts:
#	package.json
2024-08-11 10:53:25 -06:00
3f74a916d4 Merge pull request #1522 from GNS3/2.2
Release v2.2.49
2024-08-06 20:44:59 +02:00
ff78754fd5 Merge branch 'master' into 2.2 2024-08-06 20:26:35 +02:00
323255286b Development on 2.2.50.dev1 2024-08-06 20:25:51 +02:00
a9314b65f8 Release v2.2.49 2024-08-06 12:36:04 +02:00
9cb21c7dd1 Merge remote-tracking branch 'origin/2.2' into master-3.0
# Conflicts:
#	package.json
#	src/app/layouts/default-layout/default-layout.component.html
#	src/app/layouts/default-layout/default-layout.component.ts
#	yarn.lock
2024-07-22 19:16:37 +02:00
e5b3a101b8 Fix CVE-2024-6345 and CVE-2024-39689. Fixes #1521 #1520 2024-07-22 19:13:46 +02:00
8b2d20e8e9 Merge pull request #1519 from GNS3/dependabot/pip/scripts/setuptools-70.0.0
Bump setuptools from 65.5.1 to 70.0.0 in /scripts
2024-07-15 20:44:13 +02:00
26023fe884 Bump setuptools from 65.5.1 to 70.0.0 in /scripts
Bumps [setuptools](https://github.com/pypa/setuptools) from 65.5.1 to 70.0.0.
- [Release notes](https://github.com/pypa/setuptools/releases)
- [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst)
- [Commits](https://github.com/pypa/setuptools/compare/v65.5.1...v70.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-15 17:29:28 +00:00
9a2e06471c Development on 2.2.49.dev1 2024-07-13 16:33:10 +02:00
98f4ec1ce0 Merge pull request #1518 from GNS3/release/2.2.48.1
Release v2.2.48.1
2024-07-13 14:43:03 +02:00
4d695274bb Release v2.2.48.1 2024-07-11 23:40:15 +02:00
e5af89821d Show current year in default-layout.component.html 2024-07-11 23:39:53 +02:00
78b910504d Fix syntax error in index.html. Ref https://github.com/GNS3/gns3-server/issues/2399 2024-07-11 23:21:44 +02:00
93aabe0cbc Merge pull request #1515 from GNS3/2.2
Release v2.2.48
2024-07-09 00:31:25 +02:00
27446f8d14 Development on 2.2.49.dev1 2024-07-09 00:20:28 +02:00
a026374e75 Release v2.2.48 2024-07-08 18:21:21 +02:00
4f303921c6 Merge branch 'master' into 2.2 2024-07-08 18:19:14 +02:00
dea6a5021d Merge pull request #1511 from GNS3/dependabot/npm_and_yarn/socket.io-4.7.5
Bump socket.io from 4.4.1 to 4.7.5
2024-06-19 19:02:52 +02:00
46c7c58402 Bump socket.io from 4.4.1 to 4.7.5
Bumps [socket.io](https://github.com/socketio/socket.io) from 4.4.1 to 4.7.5.
- [Release notes](https://github.com/socketio/socket.io/releases)
- [Changelog](https://github.com/socketio/socket.io/blob/main/CHANGELOG.md)
- [Commits](https://github.com/socketio/socket.io/compare/4.4.1...4.7.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-19 16:25:06 +00:00
0df3525bbf Merge pull request #1509 from GNS3/dependabot/npm_and_yarn/ws-6.2.3
Bump ws from 6.2.2 to 6.2.3
2024-06-18 20:06:15 +02:00
9667e2363c Bump ws from 6.2.2 to 6.2.3
Bumps [ws](https://github.com/websockets/ws) from 6.2.2 to 6.2.3.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/6.2.2...6.2.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-18 16:17:11 +00:00
24ec96a2dd Change interface label to fit in the SVG rect. Ref #1504 2024-06-17 17:37:07 +02:00
9844a2f88f Disable AdButler 2024-06-17 17:16:33 +02:00
0cdbeb98a2 Update Google Analytics ID 2024-06-17 16:18:14 +02:00
dc40d3be6e Merge pull request #1502 from GNS3/dependabot/pip/scripts/requests-2.32.0
Bump requests from 2.31.0 to 2.32.0 in /scripts
2024-05-21 13:46:33 +07:00
2015917767 ---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-21 05:25:06 +00:00
f3b3f35d58 Development on 3.0.0.dev14 2024-05-19 20:55:35 +07:00
19b50fda9d Release v3.0.0b3 2024-05-19 17:13:55 +07:00
6c292aeb24 Enforce min/max for mat-input fields for ATM switch 2024-05-19 17:11:47 +07:00
a3d149dcbe Enforce min/max for mat-input fields for Frame-Relay switch 2024-05-19 17:08:18 +07:00
9287706185 New titles for node configurators and enforce min/max for mat-input fields. 2024-05-19 16:49:10 +07:00
84a145a701 Fix mat-table style and project readme edit 2024-05-19 12:47:11 +07:00
6ccddac32c Add missing categories for Dynamips IOS router templates 2024-05-19 00:44:53 +07:00
9447622e1f Fix tests 2024-05-18 23:30:08 +07:00
a27a7ff4ee Prevent to delete locked nodes and drawings 2024-05-18 23:11:35 +07:00
3c48ef67dc Change how ports are listed in the node info dialog 2024-05-18 22:36:46 +07:00
d411ece90e Merge pull request #1501 from GNS3/feature/aux-console-support
Auxiliary console support
2024-05-18 22:29:21 +07:00
c9c043b726 Auxiliary console support for IOS, Docker and Qemu templates/nodes 2024-05-18 22:24:19 +07:00
040447ffdf Code formatting 2024-05-18 21:06:19 +07:00
21f1d3e624 Build 3.0.0.dev13 2024-05-18 17:34:40 +07:00
4c597ce3af Development on 3.0.0.dev13 2024-05-18 16:28:35 +07:00
8f268e374c Use the image name from the controller when creating a new template from an appliance. 2024-05-18 16:27:22 +07:00
a9bca2e265 Release v3.0.0b3 2024-05-16 17:26:42 +07:00
948c600e1a Fix tests. 2024-05-16 17:19:17 +07:00
1c55972b00 Merge branch '2.2' into master-3.0 2024-05-16 17:14:39 +07:00
360d77d2ef Add Qemu for auxiliary console support. 2024-05-16 17:14:13 +07:00
d40324377e Update yarn.lock 2024-05-16 17:12:01 +07:00
75c3d8ed97 Merge pull request #1500 from GNS3/release/v2.2.47
Release v2.2.47
2024-05-15 16:44:26 +07:00
3880d28ec1 Merge branch '2.2' into master-3.0
# Conflicts:
#	package.json
#	src/app/app.module.ts
#	src/app/components/project-map/context-menu/actions/console-device-action-browser/console-device-action-browser.component.ts
#	src/app/components/project-map/packet-capturing/start-capture/start-capture.component.spec.ts
#	src/app/components/project-map/project-map.component.ts
#	src/app/services/packet-capture.service.ts
#	yarn.lock
2024-05-15 16:39:46 +07:00
f94d59206e Development on 2.2.48.dev1 2024-05-15 16:28:14 +07:00
5b41f9789a Release v2.2.47 2024-05-15 11:51:18 +07:00
ac84106dbc Merge pull request #1499 from GNS3/feature/aux-console
Auxiliary console support
2024-05-14 22:17:16 +07:00
21f2267960 Merge remote-tracking branch 'origin/feature/aux-console' into feature/aux-console 2024-05-14 22:12:01 +07:00
a9781943d5 Check auxiliary console port is defined 2024-05-14 22:11:38 +07:00
6fc2f6f964 Merge branch '2.2' into feature/aux-console 2024-05-14 20:19:59 +07:00
cd5773e58a Merge branch 'master' into 2.2 2024-05-14 20:18:30 +07:00
f4bcb844dc Merge pull request #1494
Bump @angular/core from 9.0.0 to 12.2.17
2024-05-14 20:18:10 +07:00
24cf0f5623 Merge pull request #1489 from GNS3/dependabot/npm_and_yarn/follow-redirects-1.15.6
Bump follow-redirects from 1.15.4 to 1.15.6
2024-05-14 20:10:14 +07:00
5e02a3d757 Merge pull request #1490 from GNS3/dependabot/npm_and_yarn/express-4.19.2
Bump express from 4.18.2 to 4.19.2
2024-05-14 20:09:48 +07:00
42599dafb5 Auxiliary console support 2024-05-14 20:07:30 +07:00
9c754f3444 Merge remote-tracking branch 'origin/2.2' into 2.2 2024-05-14 17:43:48 +07:00
6772f0cb16 Merge pull request #1498 from GNS3/feature/protocol-handler-service
Create protocol handler service
2024-05-14 17:43:33 +07:00
2730ee6f6e Merge branch 'master' into 2.2 2024-05-14 17:25:07 +07:00
de058e175b Fix tests 2024-05-14 17:15:29 +07:00
e9487c5ada Create protocol handler service 2024-05-14 15:18:59 +07:00
035c846f85 Merge pull request #1495 from GNS3/dependabot/npm_and_yarn/ejs-3.1.10
Bump ejs from 3.1.8 to 3.1.10
2024-05-02 08:54:27 +07:00
80239229aa Bump ejs from 3.1.8 to 3.1.10
Bumps [ejs](https://github.com/mde/ejs) from 3.1.8 to 3.1.10.
- [Release notes](https://github.com/mde/ejs/releases)
- [Commits](https://github.com/mde/ejs/compare/v3.1.8...v3.1.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-02 01:29:26 +00:00
c12a7acb2c Bump @angular/core from 9.0.0 to 12.2.17
Bumps [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) from 9.0.0 to 12.2.17.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/12.2.17/packages/core)

---
updated-dependencies:
- dependency-name: "@angular/core"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-11 07:52:40 +00:00
23bf5ad2f3 Merge pull request #1493 from GNS3/dependabot/npm_and_yarn/tar-6.2.1
Bump tar from 6.1.11 to 6.2.1
2024-04-11 14:51:41 +07:00
bed98624cc Bump tar from 6.1.11 to 6.2.1
Bumps [tar](https://github.com/isaacs/node-tar) from 6.1.11 to 6.2.1.
- [Release notes](https://github.com/isaacs/node-tar/releases)
- [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/isaacs/node-tar/compare/v6.1.11...v6.2.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-10 21:17:40 +00:00
eb82af94c9 Development on 3.0.0.dev13 2024-04-07 19:49:28 +07:00
316d3cb83e Release v3.0.0b2 2024-04-07 12:55:52 +07:00
11e1c382b2 Merge pull request #1492 from GNS3/feature/custom-qemu-path
Support for custom Qemu paths
2024-04-03 21:24:07 +07:00
d710c14218 Support for custom Qemu paths 2024-04-03 21:18:25 +07:00
66b88c288d Merge branch '2.2' into master-3.0
# Conflicts:
#	package.json
2024-04-03 17:55:07 +07:00
383c26dcef Merge branch 'master' into 2.2 2024-04-03 17:54:45 +07:00
f505c101f7 Merge pull request #1491 from qmwd2006/patch-1
web browser out ouf memory when upload large image file
2024-04-03 17:53:57 +07:00
db744d3c25 Merge branch 'master' into master-3.0
# Conflicts:
#	package.json
#	yarn.lock
2024-04-03 17:51:04 +07:00
ca071f79c2 web browser out ouf memory when upload large image file 2024-03-31 07:18:10 +08:00
20be9027fd Bump express from 4.18.2 to 4.19.2
Bumps [express](https://github.com/expressjs/express) from 4.18.2 to 4.19.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.18.2...4.19.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-28 17:27:08 +00:00
e63898a22a Show default username/password when authentication failed. Ref https://github.com/GNS3/gns3-server/issues/2332 2024-03-26 13:57:38 +01:00
63389812b5 Bump follow-redirects from 1.15.4 to 1.15.6
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-16 23:09:05 +00:00
6873432833 Merge pull request #1488 from GNS3/release/v2.2.46
Release v2.2.46
2024-02-26 17:53:06 +08:00
a7e3c24a27 Development on 2.2.47.dev1 2024-02-26 17:36:11 +08:00
358f50596c Release v2.2.46 2024-02-26 16:29:45 +08:00
b61f5803fd Merge branch 'master' into 2.2 2024-02-26 16:26:56 +08:00
c27f4aee57 Merge pull request #1486 from GNS3/dependabot/npm_and_yarn/ip-1.1.9
Bump ip from 1.1.5 to 1.1.9
2024-02-21 10:53:45 +08:00
5aa00a9f77 Bump ip from 1.1.5 to 1.1.9
Bumps [ip](https://github.com/indutny/node-ip) from 1.1.5 to 1.1.9.
- [Commits](https://github.com/indutny/node-ip/compare/v1.1.5...v1.1.9)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-20 21:27:19 +00:00
91075a60b1 Release v2.2.45 2024-01-12 21:18:37 +11:00
57e590a704 Merge branch 'master' into 2.2 2024-01-12 21:16:07 +11:00
8d3e571aa4 Merge pull request #1485 from GNS3/dependabot/npm_and_yarn/follow-redirects-1.15.4
Bump follow-redirects from 1.14.8 to 1.15.4
2024-01-12 12:21:20 +11:00
af5917b6e4 Bump follow-redirects from 1.14.8 to 1.15.4
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.8 to 1.15.4.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.8...v1.15.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-09 17:38:04 +00:00
49eee13f7c Merge branch '2.2' into master-3.0
# Conflicts:
#	angular.json
2023-12-07 11:17:28 +10:00
21ed977a55 Add ipaddr.js to "allowedCommonJsDependencies" 2023-12-06 22:34:22 +10:00
6bb451e01a Cleaning 2023-12-06 21:16:37 +10:00
f32998be47 Push development version of the Web UI 2023-12-06 19:32:28 +10:00
26a4205164 Merge branch '2.2' into master-3.0
# Conflicts:
#	package.json
#	yarn.lock
2023-12-06 19:28:09 +10:00
f861364727 Fix console launch with protocol handler for IPv6 addresses 2023-12-06 15:10:12 +10:00
8a796559de Development on 3.0.0.dev12 2023-11-27 11:32:14 +10:00
8cd821b9fe Release v3.0.0b1 2023-11-27 11:08:04 +10:00
6dfe28ec8f Fix typos 2023-11-27 11:00:22 +10:00
a465133ba3 Catch error if project cannot be created 2023-11-23 16:23:15 +10:00
5a46911730 Push development version of the Web UI 2023-11-23 16:19:36 +10:00
0a48b46754 Fix resource pool detail path. 2023-11-23 12:23:39 +10:00
607c190a9a Allow the API documentation to be accessed over HTTPS 2023-11-22 18:52:28 +10:00
ca408663a5 Merge pull request #1478 from GNS3/release-v2.2.44
Release v2.2.44
2023-11-06 16:27:49 +10:00
457 changed files with 3892 additions and 2998 deletions

1
.gitignore vendored
View File

@ -11,7 +11,6 @@
/scripts/build
/scripts/dist
/env
/.angular
# dependencies
/node_modules

View File

@ -5,5 +5,5 @@
"tabWidth": 2,
"semi": true,
"bracketSpacing": true,
"jsxBracketSameLine": false,
}
"jsxBracketSameLine": false
}

View File

@ -31,7 +31,8 @@
"spark-md5",
"xterm",
"xterm-addon-attach",
"xterm-addon-fit"
"xterm-addon-fit",
"ipaddr.js"
],
"outputPath": "dist",
"index": "src/index.html",

View File

@ -1493,6 +1493,29 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
ipaddr.js
MIT
Copyright (C) 2011-2017 whitequark <whitequark@whitequark.org>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
marked
MIT
# License information

2
dist/index.html vendored
View File

@ -46,6 +46,6 @@
gtag('config', 'G-5D6FZL9923');
</script>
<script src="runtime.53e0b4d68251ad21.js" type="module"></script><script src="polyfills.319c79dd175e50d0.js" type="module"></script><script src="main.1edc825200ac1c9e.js" type="module"></script>
<script src="runtime.24fa95b7061d7056.js" type="module"></script><script src="polyfills.319c79dd175e50d0.js" type="module"></script><script src="main.25127687b7793fef.js" type="module"></script>
</body></html>

File diff suppressed because one or more lines are too long

1
dist/main.25127687b7793fef.js vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/runtime.24fa95b7061d7056.js vendored Normal file
View File

@ -0,0 +1 @@
!function(){"use strict";var e,v={},g={};function n(e){var u=g[e];if(void 0!==u)return u.exports;var t=g[e]={id:e,loaded:!1,exports:{}};return v[e].call(t.exports,t,t.exports,n),t.loaded=!0,t.exports}n.m=v,e=[],n.O=function(u,t,o,a){if(!t){var r=1/0;for(i=0;i<e.length;i++){t=e[i][0],o=e[i][1],a=e[i][2];for(var l=!0,f=0;f<t.length;f++)(!1&a||r>=a)&&Object.keys(n.O).every(function(b){return n.O[b](t[f])})?t.splice(f--,1):(l=!1,a<r&&(r=a));if(l){e.splice(i--,1);var s=o();void 0!==s&&(u=s)}}return u}a=a||0;for(var i=e.length;i>0&&e[i-1][2]>a;i--)e[i]=e[i-1];e[i]=[t,o,a]},n.n=function(e){var u=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(u,{a:u}),u},n.d=function(e,u){for(var t in u)n.o(u,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:u[t]})},n.f={},n.e=function(e){return Promise.all(Object.keys(n.f).reduce(function(u,t){return n.f[t](e,u),u},[]))},n.u=function(e){return e+".92c7ab880f2504d3.js"},n.miniCssF=function(e){},n.hmd=function(e){return(e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:function(){throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e},n.o=function(e,u){return Object.prototype.hasOwnProperty.call(e,u)},function(){var e={},u="gns3-web-ui:";n.l=function(t,o,a,i){if(e[t])e[t].push(o);else{var r,l;if(void 0!==a)for(var f=document.getElementsByTagName("script"),s=0;s<f.length;s++){var c=f[s];if(c.getAttribute("src")==t||c.getAttribute("data-webpack")==u+a){r=c;break}}r||(l=!0,(r=document.createElement("script")).type="module",r.charset="utf-8",r.timeout=120,n.nc&&r.setAttribute("nonce",n.nc),r.setAttribute("data-webpack",u+a),r.src=n.tu(t)),e[t]=[o];var d=function(h,b){r.onerror=r.onload=null,clearTimeout(p);var _=e[t];if(delete e[t],r.parentNode&&r.parentNode.removeChild(r),_&&_.forEach(function(m){return m(b)}),h)return h(b)},p=setTimeout(d.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=d.bind(null,r.onerror),r.onload=d.bind(null,r.onload),l&&document.head.appendChild(r)}}}(),n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},function(){var e;n.tt=function(){return void 0===e&&(e={createScriptURL:function(u){return u}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("angular#bundler",e))),e}}(),n.tu=function(e){return n.tt().createScriptURL(e)},n.p="",function(){var e={666:0};n.f.j=function(o,a){var i=n.o(e,o)?e[o]:void 0;if(0!==i)if(i)a.push(i[2]);else if(666!=o){var r=new Promise(function(c,d){i=e[o]=[c,d]});a.push(i[2]=r);var l=n.p+n.u(o),f=new Error;n.l(l,function(c){if(n.o(e,o)&&(0!==(i=e[o])&&(e[o]=void 0),i)){var d=c&&("load"===c.type?"missing":c.type),p=c&&c.target&&c.target.src;f.message="Loading chunk "+o+" failed.\n("+d+": "+p+")",f.name="ChunkLoadError",f.type=d,f.request=p,i[1](f)}},"chunk-"+o,o)}else e[o]=0},n.O.j=function(o){return 0===e[o]};var u=function(o,a){var f,s,i=a[0],r=a[1],l=a[2],c=0;if(i.some(function(p){return 0!==e[p]})){for(f in r)n.o(r,f)&&(n.m[f]=r[f]);if(l)var d=l(n)}for(o&&o(a);c<i.length;c++)s=i[c],n.o(e,s)&&e[s]&&e[s][0](),e[s]=0;return n.O(d)},t=self.webpackChunkgns3_web_ui=self.webpackChunkgns3_web_ui||[];t.forEach(u.bind(null,0)),t.push=u.bind(null,t.push.bind(t))}()}();

View File

@ -1 +0,0 @@
!function(){"use strict";var e,v={},g={};function n(e){var u=g[e];if(void 0!==u)return u.exports;var t=g[e]={id:e,loaded:!1,exports:{}};return v[e](t,t.exports,n),t.loaded=!0,t.exports}n.m=v,e=[],n.O=function(u,t,o,a){if(!t){var r=1/0;for(i=0;i<e.length;i++){t=e[i][0],o=e[i][1],a=e[i][2];for(var d=!0,f=0;f<t.length;f++)(!1&a||r>=a)&&Object.keys(n.O).every(function(b){return n.O[b](t[f])})?t.splice(f--,1):(d=!1,a<r&&(r=a));if(d){e.splice(i--,1);var s=o();void 0!==s&&(u=s)}}return u}a=a||0;for(var i=e.length;i>0&&e[i-1][2]>a;i--)e[i]=e[i-1];e[i]=[t,o,a]},n.n=function(e){var u=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(u,{a:u}),u},n.d=function(e,u){for(var t in u)n.o(u,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:u[t]})},n.f={},n.e=function(e){return Promise.all(Object.keys(n.f).reduce(function(u,t){return n.f[t](e,u),u},[]))},n.u=function(e){return e+".92c7ab880f2504d3.js"},n.miniCssF=function(e){},n.hmd=function(e){return(e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:function(){throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e},n.o=function(e,u){return Object.prototype.hasOwnProperty.call(e,u)},function(){var e={},u="gns3-web-ui:";n.l=function(t,o,a,i){if(e[t])e[t].push(o);else{var r,d;if(void 0!==a)for(var f=document.getElementsByTagName("script"),s=0;s<f.length;s++){var c=f[s];if(c.getAttribute("src")==t||c.getAttribute("data-webpack")==u+a){r=c;break}}r||(d=!0,(r=document.createElement("script")).type="module",r.charset="utf-8",r.timeout=120,n.nc&&r.setAttribute("nonce",n.nc),r.setAttribute("data-webpack",u+a),r.src=n.tu(t)),e[t]=[o];var l=function(h,b){r.onerror=r.onload=null,clearTimeout(p);var _=e[t];if(delete e[t],r.parentNode&&r.parentNode.removeChild(r),_&&_.forEach(function(m){return m(b)}),h)return h(b)},p=setTimeout(l.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=l.bind(null,r.onerror),r.onload=l.bind(null,r.onload),d&&document.head.appendChild(r)}}}(),n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},function(){var e;n.tt=function(){return void 0===e&&(e={createScriptURL:function(u){return u}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("angular#bundler",e))),e}}(),n.tu=function(e){return n.tt().createScriptURL(e)},n.p="",function(){var e={666:0};n.f.j=function(o,a){var i=n.o(e,o)?e[o]:void 0;if(0!==i)if(i)a.push(i[2]);else if(666!=o){var r=new Promise(function(c,l){i=e[o]=[c,l]});a.push(i[2]=r);var d=n.p+n.u(o),f=new Error;n.l(d,function(c){if(n.o(e,o)&&(0!==(i=e[o])&&(e[o]=void 0),i)){var l=c&&("load"===c.type?"missing":c.type),p=c&&c.target&&c.target.src;f.message="Loading chunk "+o+" failed.\n("+l+": "+p+")",f.name="ChunkLoadError",f.type=l,f.request=p,i[1](f)}},"chunk-"+o,o)}else e[o]=0},n.O.j=function(o){return 0===e[o]};var u=function(o,a){var f,s,i=a[0],r=a[1],d=a[2],c=0;if(i.some(function(p){return 0!==e[p]})){for(f in r)n.o(r,f)&&(n.m[f]=r[f]);if(d)var l=d(n)}for(o&&o(a);c<i.length;c++)s=i[c],n.o(e,s)&&e[s]&&e[s][0](),e[s]=0;return n.O(l)},t=self.webpackChunkgns3_web_ui=self.webpackChunkgns3_web_ui||[];t.forEach(u.bind(null,0)),t.push=u.bind(null,t.push.bind(t))}()}();

View File

@ -1,6 +1,6 @@
{
"name": "gns3-web-ui",
"version": "3.0.0a6",
"version": "3.0.5",
"author": {
"name": "GNS3 Technology Inc.",
"email": "developers@gns3.com"
@ -69,6 +69,7 @@
"eev": "^0.1.5",
"ini": "^3.0.0",
"marked": "^4.0.14",
"ipaddr.js": "^2.1.0",
"material-design-icons": "^3.0.1",
"mousetrap": "^1.6.5",
"ng-circle-progress": "^1.6.0",

View File

@ -1,6 +1,6 @@
setuptools==65.5.1
setuptools==71.1.0
cx_Freeze==5.1.1
requests==2.31.0
requests==2.32.3
packaging==20.9
appdirs==1.4.4
psutil==5.8.0

View File

@ -1,74 +1,74 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
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 { 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 { 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 { 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 { 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 { 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 { 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 { WebConsoleFullWindowComponent } from './components/web-console-full-window/web-console-full-window.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 { 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 { 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 { 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 { 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 { 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 { 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 { 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 { UserGroupsResolver } from "./resolvers/user-groups.resolver";
import { GroupManagementComponent } from "./components/group-management/group-management.component";
import { RoleManagementComponent } from "./components/role-management/role-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 { 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 { UserGroupsResolver } from "@resolvers/user-groups.resolver";
import { GroupManagementComponent } from "@components/group-management/group-management.component";
import { RoleManagementComponent } from "@components/role-management/role-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 { AclManagementComponent } from "@components/acl-management/acl-management.component";
import { ResourcePoolsManagementComponent } from "@components/resource-pools-management/resource-pools-management.component";
import { ResourcePoolDetailsComponent } from "@components/resource-pool-details/resource-pool-details.component";
@ -86,7 +86,7 @@ const routes: Routes = [
{ 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/image-manager', component: ImageManagerComponent},
{
path: 'controller/:controller_id/projects',
component: ProjectsComponent,
@ -107,7 +107,7 @@ const routes: Routes = [
controller: ControllerResolve},
},
{
path: 'controller/:controller_id/management/resourcePools/:pool_id',
path: 'controller/:controller_id/management/pools/:pool_id',
component: ResourcePoolDetailsComponent,
canActivate: [LoginGuard],
resolve: {

View File

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

View File

@ -5,7 +5,7 @@ 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 { SettingsService } from '@services/settings.service';
import createSpyObj = jasmine.createSpyObj;
// import 'jasmine';

View File

@ -5,8 +5,8 @@ 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 { SettingsService } from '@services/settings.service';
import { ThemeService } from '@services/theme.service';
@Component({
selector: 'app-root',

View File

@ -29,302 +29,307 @@ import { ProgressDialogComponent } from './common/progress-dialog/progress-dialo
import { ProgressDialogService } from './common/progress-dialog/progress-dialog.service';
import { ProgressComponent } from './common/progress/progress.component';
import { ProgressService } from './common/progress/progress.service';
import { AdbutlerComponent } from './components/adbutler/adbutler.component';
import { BundledControllerFinderComponent } from './components/bundled-controller-finder/bundled-controller-finder.component';
import { InformationDialogComponent } from './components/dialogs/information-dialog.component';
import { DirectLinkComponent } from './components/direct-link/direct-link.component';
import { DrawingAddedComponent } from './components/drawings-listeners/drawing-added/drawing-added.component';
import { DrawingDraggedComponent } from './components/drawings-listeners/drawing-dragged/drawing-dragged.component';
import { DrawingResizedComponent } from './components/drawings-listeners/drawing-resized/drawing-resized.component';
import { InterfaceLabelDraggedComponent } from './components/drawings-listeners/interface-label-dragged/interface-label-dragged.component';
import { LinkCreatedComponent } from './components/drawings-listeners/link-created/link-created.component';
import { NodeDraggedComponent } from './components/drawings-listeners/node-dragged/node-dragged.component';
import { NodeLabelDraggedComponent } from './components/drawings-listeners/node-label-dragged/node-label-dragged.component';
import { TextAddedComponent } from './components/drawings-listeners/text-added/text-added.component';
import { TextEditedComponent } from './components/drawings-listeners/text-edited/text-edited.component';
import { HelpComponent } from './components/help/help.component';
import { InstallSoftwareComponent } from './components/installed-software/install-software/install-software.component';
import { InstalledSoftwareComponent } from './components/installed-software/installed-software.component';
import { PageNotFoundComponent } from './components/page-not-found/page-not-found.component';
import { BuiltInPreferencesComponent } from './components/preferences/built-in/built-in-preferences.component';
import { 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 { 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 { EthernetSwitchesTemplatesComponent } from './components/preferences/built-in/ethernet-switches/ethernet-switches-templates/ethernet-switches-templates.component';
import { CustomAdaptersTableComponent } from './components/preferences/common/custom-adapters-table/custom-adapters-table.component';
import { CustomAdaptersComponent } from './components/preferences/common/custom-adapters/custom-adapters.component';
import { DeleteConfirmationDialogComponent } from './components/preferences/common/delete-confirmation-dialog/delete-confirmation-dialog.component';
import { DeleteTemplateComponent } from './components/preferences/common/delete-template-component/delete-template.component';
import { EmptyTemplatesListComponent } from './components/preferences/common/empty-templates-list/empty-templates-list.component';
import { PortsComponent } from './components/preferences/common/ports/ports.component';
import { SymbolsMenuComponent } from './components/preferences/common/symbols-menu/symbols-menu.component';
import { SymbolsComponent } from './components/preferences/common/symbols/symbols.component';
import { UdpTunnelsComponent } from './components/preferences/common/udp-tunnels/udp-tunnels.component';
import { AddDockerTemplateComponent } from './components/preferences/docker/add-docker-template/add-docker-template.component';
import { CopyDockerTemplateComponent } from './components/preferences/docker/copy-docker-template/copy-docker-template.component';
import { DockerTemplateDetailsComponent } from './components/preferences/docker/docker-template-details/docker-template-details.component';
import { DockerTemplatesComponent } from './components/preferences/docker/docker-templates/docker-templates.component';
import { AddIosTemplateComponent } from './components/preferences/dynamips/add-ios-template/add-ios-template.component';
import { CopyIosTemplateComponent } from './components/preferences/dynamips/copy-ios-template/copy-ios-template.component';
import { DynamipsPreferencesComponent } from './components/preferences/dynamips/dynamips-preferences/dynamips-preferences.component';
import { IosTemplateDetailsComponent } from './components/preferences/dynamips/ios-template-details/ios-template-details.component';
import { IosTemplatesComponent } from './components/preferences/dynamips/ios-templates/ios-templates.component';
import { GeneralPreferencesComponent } from './components/preferences/general/general-preferences.component';
import { AddIouTemplateComponent } from './components/preferences/ios-on-unix/add-iou-template/add-iou-template.component';
import { CopyIouTemplateComponent } from './components/preferences/ios-on-unix/copy-iou-template/copy-iou-template.component';
import { IouTemplateDetailsComponent } from './components/preferences/ios-on-unix/iou-template-details/iou-template-details.component';
import { IouTemplatesComponent } from './components/preferences/ios-on-unix/iou-templates/iou-templates.component';
import { PreferencesComponent } from './components/preferences/preferences.component';
import { AddQemuVmTemplateComponent } from './components/preferences/qemu/add-qemu-vm-template/add-qemu-vm-template.component';
import { CopyQemuVmTemplateComponent } from './components/preferences/qemu/copy-qemu-vm-template/copy-qemu-vm-template.component';
import { QemuPreferencesComponent } from './components/preferences/qemu/qemu-preferences/qemu-preferences.component';
import { QemuVmTemplateDetailsComponent } from './components/preferences/qemu/qemu-vm-template-details/qemu-vm-template-details.component';
import { QemuVmTemplatesComponent } from './components/preferences/qemu/qemu-vm-templates/qemu-vm-templates.component';
import { AddVirtualBoxTemplateComponent } from './components/preferences/virtual-box/add-virtual-box-template/add-virtual-box-template.component';
import { VirtualBoxPreferencesComponent } from './components/preferences/virtual-box/virtual-box-preferences/virtual-box-preferences.component';
import { VirtualBoxTemplateDetailsComponent } from './components/preferences/virtual-box/virtual-box-template-details/virtual-box-template-details.component';
import { VirtualBoxTemplatesComponent } from './components/preferences/virtual-box/virtual-box-templates/virtual-box-templates.component';
import { AddVmwareTemplateComponent } from './components/preferences/vmware/add-vmware-template/add-vmware-template.component';
import { VmwarePreferencesComponent } from './components/preferences/vmware/vmware-preferences/vmware-preferences.component';
import { VmwareTemplateDetailsComponent } from './components/preferences/vmware/vmware-template-details/vmware-template-details.component';
import { VmwareTemplatesComponent } from './components/preferences/vmware/vmware-templates/vmware-templates.component';
import { AddVpcsTemplateComponent } from './components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component';
import { VpcsPreferencesComponent } from './components/preferences/vpcs/vpcs-preferences/vpcs-preferences.component';
import { VpcsTemplateDetailsComponent } from './components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component';
import { VpcsTemplatesComponent } from './components/preferences/vpcs/vpcs-templates/vpcs-templates.component';
import { ChangeHostnameDialogComponent } from './components/project-map/change-hostname-dialog/change-hostname-dialog.component';
import { ChangeSymbolDialogComponent } from './components/project-map/change-symbol-dialog/change-symbol-dialog.component';
import { ConsoleWrapperComponent } from './components/project-map/console-wrapper/console-wrapper.component';
import { ContextConsoleMenuComponent } from './components/project-map/context-console-menu/context-console-menu.component';
import { AlignHorizontallyActionComponent } from './components/project-map/context-menu/actions/align-horizontally/align-horizontally.component';
import { AlignVerticallyActionComponent } from './components/project-map/context-menu/actions/align_vertically/align-vertically.component';
import { BringToFrontActionComponent } from './components/project-map/context-menu/actions/bring-to-front-action/bring-to-front-action.component';
import { ChangeHostnameActionComponent } from './components/project-map/context-menu/actions/change-hostname/change-hostname-action.component';
import { ChangeSymbolActionComponent } from './components/project-map/context-menu/actions/change-symbol/change-symbol-action.component';
import { ConfigActionComponent } from './components/project-map/context-menu/actions/config-action/config-action.component';
import { ConsoleDeviceActionBrowserComponent } from './components/project-map/context-menu/actions/console-device-action-browser/console-device-action-browser.component';
import { ConsoleDeviceActionComponent } from './components/project-map/context-menu/actions/console-device-action/console-device-action.component';
import { DeleteActionComponent } from './components/project-map/context-menu/actions/delete-action/delete-action.component';
import { DuplicateActionComponent } from './components/project-map/context-menu/actions/duplicate-action/duplicate-action.component';
import { EditConfigActionComponent } from './components/project-map/context-menu/actions/edit-config/edit-config-action.component';
import { EditStyleActionComponent } from './components/project-map/context-menu/actions/edit-style-action/edit-style-action.component';
import { EditLinkStyleActionComponent } from './components/project-map/context-menu/actions/edit-link-style-action/edit-link-style-action.component';
import { EditTextActionComponent } from './components/project-map/context-menu/actions/edit-text-action/edit-text-action.component';
import { ExportConfigActionComponent } from './components/project-map/context-menu/actions/export-config/export-config-action.component';
import { HttpConsoleNewTabActionComponent } from './components/project-map/context-menu/actions/http-console-new-tab/http-console-new-tab-action.component';
import { HttpConsoleActionComponent } from './components/project-map/context-menu/actions/http-console/http-console-action.component';
import { ImportConfigActionComponent } from './components/project-map/context-menu/actions/import-config/import-config-action.component';
import { LockActionComponent } from './components/project-map/context-menu/actions/lock-action/lock-action.component';
import { MoveLayerDownActionComponent } from './components/project-map/context-menu/actions/move-layer-down-action/move-layer-down-action.component';
import { MoveLayerUpActionComponent } from './components/project-map/context-menu/actions/move-layer-up-action/move-layer-up-action.component';
import { OpenFileExplorerActionComponent } from './components/project-map/context-menu/actions/open-file-explorer/open-file-explorer-action.component';
import { PacketFiltersActionComponent } from './components/project-map/context-menu/actions/packet-filters-action/packet-filters-action.component';
import { ReloadNodeActionComponent } from './components/project-map/context-menu/actions/reload-node-action/reload-node-action.component';
import { ResumeLinkActionComponent } from './components/project-map/context-menu/actions/resume-link-action/resume-link-action.component';
import { ShowNodeActionComponent } from './components/project-map/context-menu/actions/show-node-action/show-node-action.component';
import { StartCaptureOnStartedLinkActionComponent } from './components/project-map/context-menu/actions/start-capture-on-started-link/start-capture-on-started-link.component';
import { StartCaptureActionComponent } from './components/project-map/context-menu/actions/start-capture/start-capture-action.component';
import { StartNodeActionComponent } from './components/project-map/context-menu/actions/start-node-action/start-node-action.component';
import { StopCaptureActionComponent } from './components/project-map/context-menu/actions/stop-capture/stop-capture-action.component';
import { IsolateNodeActionComponent } from './components/project-map/context-menu/actions/isolate-node-action/isolate-node-action.component';
import { UnisolateNodeActionComponent } from './components/project-map/context-menu/actions/unisolate-node-action/unisolate-node-action.component';
import {StopNodeActionComponent } from './components/project-map/context-menu/actions/stop-node-action/stop-node-action.component';
import { SuspendLinkActionComponent } from './components/project-map/context-menu/actions/suspend-link/suspend-link-action.component';
import { SuspendNodeActionComponent } from './components/project-map/context-menu/actions/suspend-node-action/suspend-node-action.component';
import { ContextMenuComponent } from './components/project-map/context-menu/context-menu.component';
import { ConfigDialogComponent } from './components/project-map/context-menu/dialogs/config-dialog/config-dialog.component';
import { DrawLinkToolComponent } from './components/project-map/draw-link-tool/draw-link-tool.component';
import { StyleEditorDialogComponent } from './components/project-map/drawings-editors/style-editor/style-editor.component';
import { LinkStyleEditorDialogComponent } from './components/project-map/drawings-editors/link-style-editor/link-style-editor.component';
import { TextEditorDialogComponent } from './components/project-map/drawings-editors/text-editor/text-editor.component';
import { HelpDialogComponent } from './components/project-map/help-dialog/help-dialog.component';
import { NodeCreatedLabelStylesFixer } from './components/project-map/helpers/node-created-label-styles-fixer';
import { ImportApplianceComponent } from './components/project-map/import-appliance/import-appliance.component';
import { InfoDialogComponent } from './components/project-map/info-dialog/info-dialog.component';
import { LogConsoleComponent } from './components/project-map/log-console/log-console.component';
import { LogEventsDataSource } from './components/project-map/log-console/log-events-datasource';
import { ApplianceInfoDialogComponent } from './components/project-map/new-template-dialog/appliance-info-dialog/appliance-info-dialog.component';
import { NewTemplateDialogComponent } from './components/project-map/new-template-dialog/new-template-dialog.component';
import { TemplateNameDialogComponent } from './components/project-map/new-template-dialog/template-name-dialog/template-name-dialog.component';
import { ConfigEditorDialogComponent } from './components/project-map/node-editors/config-editor/config-editor.component';
import { ConfiguratorDialogAtmSwitchComponent } from './components/project-map/node-editors/configurator/atm_switch/configurator-atm-switch.component';
import { ConfiguratorDialogCloudComponent } from './components/project-map/node-editors/configurator/cloud/configurator-cloud.component';
import { ConfiguratorDialogDockerComponent } from './components/project-map/node-editors/configurator/docker/configurator-docker.component';
import { ConfigureCustomAdaptersDialogComponent } from './components/project-map/node-editors/configurator/docker/configure-custom-adapters/configure-custom-adapters.component';
import { EditNetworkConfigurationDialogComponent } from './components/project-map/node-editors/configurator/docker/edit-network-configuration/edit-network-configuration.component';
import { ConfiguratorDialogEthernetSwitchComponent } from './components/project-map/node-editors/configurator/ethernet-switch/configurator-ethernet-switch.component';
import { ConfiguratorDialogEthernetHubComponent } from './components/project-map/node-editors/configurator/ethernet_hub/configurator-ethernet-hub.component';
import { ConfiguratorDialogIosComponent } from './components/project-map/node-editors/configurator/ios/configurator-ios.component';
import { ConfiguratorDialogIouComponent } from './components/project-map/node-editors/configurator/iou/configurator-iou.component';
import { ConfiguratorDialogNatComponent } from './components/project-map/node-editors/configurator/nat/configurator-nat.component';
import { ConfiguratorDialogQemuComponent } from './components/project-map/node-editors/configurator/qemu/configurator-qemu.component';
import { QemuImageCreatorComponent } from './components/project-map/node-editors/configurator/qemu/qemu-image-creator/qemu-image-creator.component';
import { ConfiguratorDialogSwitchComponent } from './components/project-map/node-editors/configurator/switch/configurator-switch.component';
import { ConfiguratorDialogVirtualBoxComponent } from './components/project-map/node-editors/configurator/virtualbox/configurator-virtualbox.component';
import { ConfiguratorDialogVmwareComponent } from './components/project-map/node-editors/configurator/vmware/configurator-vmware.component';
import { ConfiguratorDialogVpcsComponent } from './components/project-map/node-editors/configurator/vpcs/configurator-vpcs.component';
import { NodeSelectInterfaceComponent } from './components/project-map/node-select-interface/node-select-interface.component';
import { NodesMenuComponent } from './components/project-map/nodes-menu/nodes-menu.component';
import { PacketFiltersDialogComponent } from './components/project-map/packet-capturing/packet-filters/packet-filters.component';
import { StartCaptureDialogComponent } from './components/project-map/packet-capturing/start-capture/start-capture.component';
import { ProjectMapMenuComponent } from './components/project-map/project-map-menu/project-map-menu.component';
import { ProjectMapComponent } from './components/project-map/project-map.component';
import { ProjectReadmeComponent } from './components/project-map/project-readme/project-readme.component';
import { ScreenshotDialogComponent } from './components/project-map/screenshot-dialog/screenshot-dialog.component';
import { WebConsoleComponent } from './components/project-map/web-console/web-console.component';
import { AddBlankProjectDialogComponent } from './components/projects/add-blank-project-dialog/add-blank-project-dialog.component';
import { ChooseNameDialogComponent } from './components/projects/choose-name-dialog/choose-name-dialog.component';
import { ConfirmationBottomSheetComponent } from './components/projects/confirmation-bottomsheet/confirmation-bottomsheet.component';
import { ConfirmationDialogComponent } from './components/projects/confirmation-dialog/confirmation-dialog.component';
import { EditProjectDialogComponent } from './components/projects/edit-project-dialog/edit-project-dialog.component';
import { ReadmeEditorComponent } from './components/projects/edit-project-dialog/readme-editor/readme-editor.component';
import { ImportProjectDialogComponent } from './components/projects/import-project-dialog/import-project-dialog.component';
import { ProjectNameValidator } from './components/projects/models/projectNameValidator';
import { NavigationDialogComponent } from './components/projects/navigation-dialog/navigation-dialog.component';
import { ProjectsComponent } from './components/projects/projects.component';
import { SaveProjectDialogComponent } from './components/projects/save-project-dialog/save-project-dialog.component';
import { AddControllerDialogComponent } from './components/controllers/add-controller-dialog/add-controller-dialog.component';
import { ControllerDiscoveryComponent } from './components/controllers/controller-discovery/controller-discovery.component';
import { ControllersComponent } from './components/controllers/controllers.component';
import { ConsoleComponent } from './components/settings/console/console.component';
import { SettingsComponent } from './components/settings/settings.component';
import { CreateSnapshotDialogComponent } from './components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component';
import { ListOfSnapshotsComponent } from './components/snapshots/list-of-snapshots/list-of-snapshots.component';
import { SnapshotMenuItemComponent } from './components/snapshots/snapshot-menu-item/snapshot-menu-item.component';
import { StatusChartComponent } from './components/system-status/status-chart/status-chart.component';
import { StatusInfoComponent } from './components/system-status/status-info/status-info.component';
import { SystemStatusComponent } from './components/system-status/system-status.component';
import { TemplateListDialogComponent } from './components/template/template-list-dialog/template-list-dialog.component';
import { TemplateComponent } from './components/template/template.component';
import { TopologySummaryComponent } from './components/topology-summary/topology-summary.component';
import { WebConsoleFullWindowComponent } from './components/web-console-full-window/web-console-full-window.component';
import { DataSourceFilter } from './filters/dataSourceFilter';
import { AuthImageFilter } from './filters/authImageFilter';
import { DateFilter } from './filters/dateFilter.pipe';
import { NameFilter } from './filters/nameFilter.pipe';
import { ProjectsFilter } from './filters/projectsFilter.pipe';
import { SearchFilter } from './filters/searchFilter.pipe';
import { TemplateFilter } from './filters/templateFilter.pipe';
import { AdbutlerComponent } from '@components/adbutler/adbutler.component';
import { BundledControllerFinderComponent } from '@components/bundled-controller-finder/bundled-controller-finder.component';
import { InformationDialogComponent } from '@components/dialogs/information-dialog/information-dialog.component';
import { QuestionDialogComponent } from "@components/dialogs/question-dialog/question-dialog.component";
import { DirectLinkComponent } from '@components/direct-link/direct-link.component';
import { DrawingAddedComponent } from '@components/drawings-listeners/drawing-added/drawing-added.component';
import { DrawingDraggedComponent } from '@components/drawings-listeners/drawing-dragged/drawing-dragged.component';
import { DrawingResizedComponent } from '@components/drawings-listeners/drawing-resized/drawing-resized.component';
import { InterfaceLabelDraggedComponent } from '@components/drawings-listeners/interface-label-dragged/interface-label-dragged.component';
import { LinkCreatedComponent } from '@components/drawings-listeners/link-created/link-created.component';
import { NodeDraggedComponent } from '@components/drawings-listeners/node-dragged/node-dragged.component';
import { NodeLabelDraggedComponent } from '@components/drawings-listeners/node-label-dragged/node-label-dragged.component';
import { TextAddedComponent } from '@components/drawings-listeners/text-added/text-added.component';
import { TextEditedComponent } from '@components/drawings-listeners/text-edited/text-edited.component';
import { HelpComponent } from '@components/help/help.component';
import { InstallSoftwareComponent } from '@components/installed-software/install-software/install-software.component';
import { InstalledSoftwareComponent } from '@components/installed-software/installed-software.component';
import { PageNotFoundComponent } from '@components/page-not-found/page-not-found.component';
import { BuiltInPreferencesComponent } from '@components/preferences/built-in/built-in-preferences.component';
import { 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 { 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 { EthernetSwitchesTemplatesComponent } from '@components/preferences/built-in/ethernet-switches/ethernet-switches-templates/ethernet-switches-templates.component';
import { CustomAdaptersTableComponent } from '@components/preferences/common/custom-adapters-table/custom-adapters-table.component';
import { CustomAdaptersComponent } from '@components/preferences/common/custom-adapters/custom-adapters.component';
import { DeleteConfirmationDialogComponent } from '@components/preferences/common/delete-confirmation-dialog/delete-confirmation-dialog.component';
import { DeleteTemplateComponent } from '@components/preferences/common/delete-template-component/delete-template.component';
import { EmptyTemplatesListComponent } from '@components/preferences/common/empty-templates-list/empty-templates-list.component';
import { PortsComponent } from '@components/preferences/common/ports/ports.component';
import { SymbolsMenuComponent } from '@components/preferences/common/symbols-menu/symbols-menu.component';
import { SymbolsComponent } from '@components/preferences/common/symbols/symbols.component';
import { UdpTunnelsComponent } from '@components/preferences/common/udp-tunnels/udp-tunnels.component';
import { AddDockerTemplateComponent } from '@components/preferences/docker/add-docker-template/add-docker-template.component';
import { CopyDockerTemplateComponent } from '@components/preferences/docker/copy-docker-template/copy-docker-template.component';
import { DockerTemplateDetailsComponent } from '@components/preferences/docker/docker-template-details/docker-template-details.component';
import { DockerTemplatesComponent } from '@components/preferences/docker/docker-templates/docker-templates.component';
import { AddIosTemplateComponent } from '@components/preferences/dynamips/add-ios-template/add-ios-template.component';
import { CopyIosTemplateComponent } from '@components/preferences/dynamips/copy-ios-template/copy-ios-template.component';
import { DynamipsPreferencesComponent } from '@components/preferences/dynamips/dynamips-preferences/dynamips-preferences.component';
import { IosTemplateDetailsComponent } from '@components/preferences/dynamips/ios-template-details/ios-template-details.component';
import { IosTemplatesComponent } from '@components/preferences/dynamips/ios-templates/ios-templates.component';
import { GeneralPreferencesComponent } from '@components/preferences/general/general-preferences.component';
import { AddIouTemplateComponent } from '@components/preferences/ios-on-unix/add-iou-template/add-iou-template.component';
import { CopyIouTemplateComponent } from '@components/preferences/ios-on-unix/copy-iou-template/copy-iou-template.component';
import { IouTemplateDetailsComponent } from '@components/preferences/ios-on-unix/iou-template-details/iou-template-details.component';
import { IouTemplatesComponent } from '@components/preferences/ios-on-unix/iou-templates/iou-templates.component';
import { PreferencesComponent } from '@components/preferences/preferences.component';
import { AddQemuVmTemplateComponent } from '@components/preferences/qemu/add-qemu-vm-template/add-qemu-vm-template.component';
import { CopyQemuVmTemplateComponent } from '@components/preferences/qemu/copy-qemu-vm-template/copy-qemu-vm-template.component';
import { QemuPreferencesComponent } from '@components/preferences/qemu/qemu-preferences/qemu-preferences.component';
import { QemuVmTemplateDetailsComponent } from '@components/preferences/qemu/qemu-vm-template-details/qemu-vm-template-details.component';
import { QemuVmTemplatesComponent } from '@components/preferences/qemu/qemu-vm-templates/qemu-vm-templates.component';
import { AddVirtualBoxTemplateComponent } from '@components/preferences/virtual-box/add-virtual-box-template/add-virtual-box-template.component';
import { VirtualBoxPreferencesComponent } from '@components/preferences/virtual-box/virtual-box-preferences/virtual-box-preferences.component';
import { VirtualBoxTemplateDetailsComponent } from '@components/preferences/virtual-box/virtual-box-template-details/virtual-box-template-details.component';
import { VirtualBoxTemplatesComponent } from '@components/preferences/virtual-box/virtual-box-templates/virtual-box-templates.component';
import { AddVmwareTemplateComponent } from '@components/preferences/vmware/add-vmware-template/add-vmware-template.component';
import { VmwarePreferencesComponent } from '@components/preferences/vmware/vmware-preferences/vmware-preferences.component';
import { VmwareTemplateDetailsComponent } from '@components/preferences/vmware/vmware-template-details/vmware-template-details.component';
import { VmwareTemplatesComponent } from '@components/preferences/vmware/vmware-templates/vmware-templates.component';
import { AddVpcsTemplateComponent } from '@components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component';
import { VpcsPreferencesComponent } from '@components/preferences/vpcs/vpcs-preferences/vpcs-preferences.component';
import { VpcsTemplateDetailsComponent } from '@components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component';
import { VpcsTemplatesComponent } from '@components/preferences/vpcs/vpcs-templates/vpcs-templates.component';
import { ChangeHostnameDialogComponent } from '@components/project-map/change-hostname-dialog/change-hostname-dialog.component';
import { ChangeSymbolDialogComponent } from '@components/project-map/change-symbol-dialog/change-symbol-dialog.component';
import { ConsoleWrapperComponent } from '@components/project-map/console-wrapper/console-wrapper.component';
import { ContextConsoleMenuComponent } from '@components/project-map/context-console-menu/context-console-menu.component';
import { AlignHorizontallyActionComponent } from '@components/project-map/context-menu/actions/align-horizontally/align-horizontally.component';
import { AlignVerticallyActionComponent } from '@components/project-map/context-menu/actions/align_vertically/align-vertically.component';
import { BringToFrontActionComponent } from '@components/project-map/context-menu/actions/bring-to-front-action/bring-to-front-action.component';
import { ChangeHostnameActionComponent } from '@components/project-map/context-menu/actions/change-hostname/change-hostname-action.component';
import { ChangeSymbolActionComponent } from '@components/project-map/context-menu/actions/change-symbol/change-symbol-action.component';
import { ConfigActionComponent } from '@components/project-map/context-menu/actions/config-action/config-action.component';
import { ConsoleDeviceActionBrowserComponent } from '@components/project-map/context-menu/actions/console-device-action-browser/console-device-action-browser.component';
import { ConsoleDeviceActionComponent } from '@components/project-map/context-menu/actions/console-device-action/console-device-action.component';
import { DeleteActionComponent } from '@components/project-map/context-menu/actions/delete-action/delete-action.component';
import { DuplicateActionComponent } from '@components/project-map/context-menu/actions/duplicate-action/duplicate-action.component';
import { EditConfigActionComponent } from '@components/project-map/context-menu/actions/edit-config/edit-config-action.component';
import { EditStyleActionComponent } from '@components/project-map/context-menu/actions/edit-style-action/edit-style-action.component';
import { EditLinkStyleActionComponent } from '@components/project-map/context-menu/actions/edit-link-style-action/edit-link-style-action.component';
import { EditTextActionComponent } from '@components/project-map/context-menu/actions/edit-text-action/edit-text-action.component';
import { ExportConfigActionComponent } from '@components/project-map/context-menu/actions/export-config/export-config-action.component';
import { HttpConsoleNewTabActionComponent } from '@components/project-map/context-menu/actions/http-console-new-tab/http-console-new-tab-action.component';
import { HttpConsoleActionComponent } from '@components/project-map/context-menu/actions/http-console/http-console-action.component';
import { IdlePcActionComponent } from "@components/project-map/context-menu/actions/idle-pc-action/idle-pc-action.component";
import { AutoIdlePcActionComponent } from "@components/project-map/context-menu/actions/auto-idle-pc-action/auto-idle-pc-action.component";
import { ImportConfigActionComponent } from '@components/project-map/context-menu/actions/import-config/import-config-action.component';
import { LockActionComponent } from '@components/project-map/context-menu/actions/lock-action/lock-action.component';
import { MoveLayerDownActionComponent } from '@components/project-map/context-menu/actions/move-layer-down-action/move-layer-down-action.component';
import { MoveLayerUpActionComponent } from '@components/project-map/context-menu/actions/move-layer-up-action/move-layer-up-action.component';
import { OpenFileExplorerActionComponent } from '@components/project-map/context-menu/actions/open-file-explorer/open-file-explorer-action.component';
import { PacketFiltersActionComponent } from '@components/project-map/context-menu/actions/packet-filters-action/packet-filters-action.component';
import { ReloadNodeActionComponent } from '@components/project-map/context-menu/actions/reload-node-action/reload-node-action.component';
import { ResumeLinkActionComponent } from '@components/project-map/context-menu/actions/resume-link-action/resume-link-action.component';
import { ShowNodeActionComponent } from '@components/project-map/context-menu/actions/show-node-action/show-node-action.component';
import { StartCaptureOnStartedLinkActionComponent } from '@components/project-map/context-menu/actions/start-capture-on-started-link/start-capture-on-started-link.component';
import { StartCaptureActionComponent } from '@components/project-map/context-menu/actions/start-capture/start-capture-action.component';
import { StartNodeActionComponent } from '@components/project-map/context-menu/actions/start-node-action/start-node-action.component';
import { StopCaptureActionComponent } from '@components/project-map/context-menu/actions/stop-capture/stop-capture-action.component';
import { IsolateNodeActionComponent } from '@components/project-map/context-menu/actions/isolate-node-action/isolate-node-action.component';
import { UnisolateNodeActionComponent } from '@components/project-map/context-menu/actions/unisolate-node-action/unisolate-node-action.component';
import { StopNodeActionComponent } from '@components/project-map/context-menu/actions/stop-node-action/stop-node-action.component';
import { SuspendLinkActionComponent } from '@components/project-map/context-menu/actions/suspend-link/suspend-link-action.component';
import { SuspendNodeActionComponent } from '@components/project-map/context-menu/actions/suspend-node-action/suspend-node-action.component';
import { ContextMenuComponent } from '@components/project-map/context-menu/context-menu.component';
import { ConfigDialogComponent } from '@components/project-map/context-menu/dialogs/config-dialog/config-dialog.component';
import { IdlePCDialogComponent } from "@components/project-map/context-menu/dialogs/idle-pc-dialog/idle-pc-dialog.component";
import { DrawLinkToolComponent } from '@components/project-map/draw-link-tool/draw-link-tool.component';
import { StyleEditorDialogComponent } from '@components/project-map/drawings-editors/style-editor/style-editor.component';
import { LinkStyleEditorDialogComponent } from '@components/project-map/drawings-editors/link-style-editor/link-style-editor.component';
import { TextEditorDialogComponent } from '@components/project-map/drawings-editors/text-editor/text-editor.component';
import { HelpDialogComponent } from '@components/project-map/help-dialog/help-dialog.component';
import { NodeCreatedLabelStylesFixer } from '@components/project-map/helpers/node-created-label-styles-fixer';
import { ImportApplianceComponent } from '@components/project-map/import-appliance/import-appliance.component';
import { InfoDialogComponent } from '@components/project-map/info-dialog/info-dialog.component';
import { LogConsoleComponent } from '@components/project-map/log-console/log-console.component';
import { LogEventsDataSource } from '@components/project-map/log-console/log-events-datasource';
import { ApplianceInfoDialogComponent } from '@components/project-map/new-template-dialog/appliance-info-dialog/appliance-info-dialog.component';
import { NewTemplateDialogComponent } from '@components/project-map/new-template-dialog/new-template-dialog.component';
import { TemplateNameDialogComponent } from '@components/project-map/new-template-dialog/template-name-dialog/template-name-dialog.component';
import { ConfigEditorDialogComponent } from '@components/project-map/node-editors/config-editor/config-editor.component';
import { ConfiguratorDialogAtmSwitchComponent } from '@components/project-map/node-editors/configurator/atm_switch/configurator-atm-switch.component';
import { ConfiguratorDialogCloudComponent } from '@components/project-map/node-editors/configurator/cloud/configurator-cloud.component';
import { ConfiguratorDialogDockerComponent } from '@components/project-map/node-editors/configurator/docker/configurator-docker.component';
import { ConfigureCustomAdaptersDialogComponent } from '@components/project-map/node-editors/configurator/docker/configure-custom-adapters/configure-custom-adapters.component';
import { EditNetworkConfigurationDialogComponent } from '@components/project-map/node-editors/configurator/docker/edit-network-configuration/edit-network-configuration.component';
import { ConfiguratorDialogEthernetSwitchComponent } from '@components/project-map/node-editors/configurator/ethernet-switch/configurator-ethernet-switch.component';
import { ConfiguratorDialogEthernetHubComponent } from '@components/project-map/node-editors/configurator/ethernet_hub/configurator-ethernet-hub.component';
import { ConfiguratorDialogIosComponent } from '@components/project-map/node-editors/configurator/ios/configurator-ios.component';
import { ConfiguratorDialogIouComponent } from '@components/project-map/node-editors/configurator/iou/configurator-iou.component';
import { ConfiguratorDialogNatComponent } from '@components/project-map/node-editors/configurator/nat/configurator-nat.component';
import { ConfiguratorDialogQemuComponent } from '@components/project-map/node-editors/configurator/qemu/configurator-qemu.component';
import { QemuImageCreatorComponent } from '@components/project-map/node-editors/configurator/qemu/qemu-image-creator/qemu-image-creator.component';
import { ConfiguratorDialogSwitchComponent } from '@components/project-map/node-editors/configurator/switch/configurator-switch.component';
import { ConfiguratorDialogVirtualBoxComponent } from '@components/project-map/node-editors/configurator/virtualbox/configurator-virtualbox.component';
import { ConfiguratorDialogVmwareComponent } from '@components/project-map/node-editors/configurator/vmware/configurator-vmware.component';
import { ConfiguratorDialogVpcsComponent } from '@components/project-map/node-editors/configurator/vpcs/configurator-vpcs.component';
import { NodeSelectInterfaceComponent } from '@components/project-map/node-select-interface/node-select-interface.component';
import { NodesMenuComponent } from '@components/project-map/nodes-menu/nodes-menu.component';
import { PacketFiltersDialogComponent } from '@components/project-map/packet-capturing/packet-filters/packet-filters.component';
import { StartCaptureDialogComponent } from '@components/project-map/packet-capturing/start-capture/start-capture.component';
import { ProjectMapMenuComponent } from '@components/project-map/project-map-menu/project-map-menu.component';
import { ProjectMapComponent } from '@components/project-map/project-map.component';
import { ProjectReadmeComponent } from '@components/project-map/project-readme/project-readme.component';
import { ScreenshotDialogComponent } from '@components/project-map/screenshot-dialog/screenshot-dialog.component';
import { WebConsoleComponent } from '@components/project-map/web-console/web-console.component';
import { AddBlankProjectDialogComponent } from '@components/projects/add-blank-project-dialog/add-blank-project-dialog.component';
import { ChooseNameDialogComponent } from '@components/projects/choose-name-dialog/choose-name-dialog.component';
import { ConfirmationBottomSheetComponent } from '@components/projects/confirmation-bottomsheet/confirmation-bottomsheet.component';
import { ConfirmationDialogComponent } from '@components/projects/confirmation-dialog/confirmation-dialog.component';
import { EditProjectDialogComponent } from '@components/projects/edit-project-dialog/edit-project-dialog.component';
import { ReadmeEditorComponent } from '@components/projects/edit-project-dialog/readme-editor/readme-editor.component';
import { ImportProjectDialogComponent } from '@components/projects/import-project-dialog/import-project-dialog.component';
import { ProjectNameValidator } from '@components/projects/models/projectNameValidator';
import { NavigationDialogComponent } from '@components/projects/navigation-dialog/navigation-dialog.component';
import { ProjectsComponent } from '@components/projects/projects.component';
import { SaveProjectDialogComponent } from '@components/projects/save-project-dialog/save-project-dialog.component';
import { AddControllerDialogComponent } from '@components/controllers/add-controller-dialog/add-controller-dialog.component';
import { ControllerDiscoveryComponent } from '@components/controllers/controller-discovery/controller-discovery.component';
import { ControllersComponent } from '@components/controllers/controllers.component';
import { ConsoleComponent } from '@components/settings/console/console.component';
import { SettingsComponent } from '@components/settings/settings.component';
import { CreateSnapshotDialogComponent } from '@components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component';
import { ListOfSnapshotsComponent } from '@components/snapshots/list-of-snapshots/list-of-snapshots.component';
import { SnapshotMenuItemComponent } from '@components/snapshots/snapshot-menu-item/snapshot-menu-item.component';
import { StatusChartComponent } from '@components/system-status/status-chart/status-chart.component';
import { StatusInfoComponent } from '@components/system-status/status-info/status-info.component';
import { SystemStatusComponent } from '@components/system-status/system-status.component';
import { TemplateListDialogComponent } from '@components/template/template-list-dialog/template-list-dialog.component';
import { TemplateComponent } from '@components/template/template.component';
import { TopologySummaryComponent } from '@components/topology-summary/topology-summary.component';
import { WebConsoleFullWindowComponent } from '@components/web-console-full-window/web-console-full-window.component';
import { DataSourceFilter } from '@filters/dataSourceFilter';
import { AuthImageFilter } from '@filters/authImageFilter';
import { DateFilter } from '@filters/dateFilter.pipe';
import { NameFilter } from '@filters/nameFilter.pipe';
import { ProjectsFilter } from '@filters/projectsFilter.pipe';
import { SearchFilter } from '@filters/searchFilter.pipe';
import { TemplateFilter } from '@filters/templateFilter.pipe';
import { ConsoleGuard } from './guards/console-guard';
import { LoginGuard } from './guards/login-guard';
import { ProjectWebServiceHandler } from './handlers/project-web-service-handler';
import { DefaultLayoutComponent } from './layouts/default-layout/default-layout.component';
import { MATERIAL_IMPORTS } from './material.imports';
import { ControllerResolve } from './resolvers/controller-resolve';
import { ApplianceService } from './services/appliances.service';
import { BuiltInTemplatesConfigurationService } from './services/built-in-templates-configuration.service';
import { BuiltInTemplatesService } from './services/built-in-templates.service';
import { ComputeService } from './services/compute.service';
import { DockerConfigurationService } from './services/docker-configuration.service';
import { DockerService } from './services/docker.service';
import { DrawingService } from './services/drawing.service';
import { ExternalSoftwareDefinitionService } from './services/external-software-definition.service';
import { GoogleAnalyticsService } from './services/google-analytics.service';
import { HttpController, ControllerErrorHandler } from './services/http-controller.service';
import { InfoService } from './services/info.service';
import { InstalledSoftwareService } from './services/installed-software.service';
import { IosConfigurationService } from './services/ios-configuration.service';
import { IosService } from './services/ios.service';
import { IouConfigurationService } from './services/iou-configuration.service';
import { IouService } from './services/iou.service';
import { LinkService } from './services/link.service';
import { MapScaleService } from './services/mapScale.service';
import { MapSettingsService } from './services/mapsettings.service';
import { NodeService } from './services/node.service';
import { NodeConsoleService } from './services/nodeConsole.service';
import { NotificationService } from './services/notification.service';
import { PacketCaptureService } from './services/packet-capture.service';
import { PlatformService } from './services/platform.service';
import { ProjectService } from './services/project.service';
import { QemuConfigurationService } from './services/qemu-configuration.service';
import { QemuService } from './services/qemu.service';
import { RecentlyOpenedProjectService } from './services/recentlyOpenedProject.service';
import { ControllerManagementService } from './services/controller-management.service';
import { ControllerSettingsService } from './services/controller-settings.service';
import { ControllerDatabase } from './services/controller.database';
import { ControllerService } from './services/controller.service';
import { SettingsService } from './services/settings.service';
import { ConsoleService } from './services/settings/console.service';
import { DefaultConsoleService } from './services/settings/default-console.service';
import { SnapshotService } from './services/snapshot.service';
import { SymbolService } from './services/symbol.service';
import { TemplateMocksService } from './services/template-mocks.service';
import { TemplateService } from './services/template.service';
import { ThemeService } from './services/theme.service';
import { ToasterService } from './services/toaster.service';
import { ToolsService } from './services/tools.service';
import { UpdatesService } from './services/updates.service';
import { VersionService } from './services/version.service';
import { VirtualBoxConfigurationService } from './services/virtual-box-configuration.service';
import { VirtualBoxService } from './services/virtual-box.service';
import { VmwareConfigurationService } from './services/vmware-configuration.service';
import { VmwareService } from './services/vmware.service';
import { VpcsConfigurationService } from './services/vpcs-configuration.service';
import { VpcsService } from './services/vpcs.service';
import { ControllerResolve } from '@resolvers/controller-resolve';
import { ApplianceService } from '@services/appliances.service';
import { ProtocolHandlerService } from '@services/protocol-handler.service';
import { BuiltInTemplatesConfigurationService } from '@services/built-in-templates-configuration.service';
import { BuiltInTemplatesService } from '@services/built-in-templates.service';
import { ComputeService } from '@services/compute.service';
import { DockerConfigurationService } from '@services/docker-configuration.service';
import { DockerService } from '@services/docker.service';
import { DrawingService } from '@services/drawing.service';
import { ExternalSoftwareDefinitionService } from '@services/external-software-definition.service';
import { GoogleAnalyticsService } from '@services/google-analytics.service';
import { HttpController, ControllerErrorHandler } from '@services/http-controller.service';
import { InfoService } from '@services/info.service';
import { InstalledSoftwareService } from '@services/installed-software.service';
import { IosConfigurationService } from '@services/ios-configuration.service';
import { IosService } from '@services/ios.service';
import { IouConfigurationService } from '@services/iou-configuration.service';
import { IouService } from '@services/iou.service';
import { LinkService } from '@services/link.service';
import { MapScaleService } from '@services/mapScale.service';
import { MapSettingsService } from '@services/mapsettings.service';
import { NodeService } from '@services/node.service';
import { NodeConsoleService } from '@services/nodeConsole.service';
import { NotificationService } from '@services/notification.service';
import { PacketCaptureService } from '@services/packet-capture.service';
import { PlatformService } from '@services/platform.service';
import { ProjectService } from '@services/project.service';
import { QemuConfigurationService } from '@services/qemu-configuration.service';
import { QemuService } from '@services/qemu.service';
import { RecentlyOpenedProjectService } from '@services/recentlyOpenedProject.service';
import { ControllerManagementService } from '@services/controller-management.service';
import { ControllerSettingsService } from '@services/controller-settings.service';
import { ControllerDatabase } from '@services/controller.database';
import { ControllerService } from '@services/controller.service';
import { SettingsService } from '@services/settings.service';
import { ConsoleService } from '@services/settings/console.service';
import { DefaultConsoleService } from '@services/settings/default-console.service';
import { SnapshotService } from '@services/snapshot.service';
import { SymbolService } from '@services/symbol.service';
import { TemplateMocksService } from '@services/template-mocks.service';
import { TemplateService } from '@services/template.service';
import { ThemeService } from '@services/theme.service';
import { ToasterService } from '@services/toaster.service';
import { ToolsService } from '@services/tools.service';
import { UpdatesService } from '@services/updates.service';
import { VersionService } from '@services/version.service';
import { VirtualBoxConfigurationService } from '@services/virtual-box-configuration.service';
import { VirtualBoxService } from '@services/virtual-box.service';
import { VmwareConfigurationService } from '@services/vmware-configuration.service';
import { VmwareService } from '@services/vmware.service';
import { VpcsConfigurationService } from '@services/vpcs-configuration.service';
import { VpcsService } from '@services/vpcs.service';
import { NonNegativeValidator } from './validators/non-negative-validator';
import { RotationValidator } from './validators/rotation-validator';
import { MarkedDirective } from './directives/marked.directive';
import { LoginComponent } from './components/login/login.component';
import { LoginService } from './services/login.service';
import { LoginComponent } from '@components/login/login.component';
import { LoginService } from '@services/login.service';
import { HttpRequestsInterceptor } from './interceptors/http.interceptor';
import { UserManagementComponent } from './components/user-management/user-management.component';
import { UserService } from './services/user.service';
import { LoggedUserComponent } from './components/users/logged-user/logged-user.component';
import { AddUserDialogComponent } from './components/user-management/add-user-dialog/add-user-dialog.component';
import { UserFilterPipe } from './filters/user-filter.pipe';
import { GroupManagementComponent } from './components/group-management/group-management.component';
import { GroupFilterPipe } from './filters/group-filter.pipe';
import { AddGroupDialogComponent } from './components/group-management/add-group-dialog/add-group-dialog.component';
import { DeleteGroupDialogComponent } from './components/group-management/delete-group-dialog/delete-group-dialog.component';
import { DeleteUserDialogComponent } from './components/user-management/delete-user-dialog/delete-user-dialog.component';
import { GroupDetailsComponent } from './components/group-details/group-details.component';
import { UserDetailComponent } from './components/user-management/user-detail/user-detail.component';
import { AddUserToGroupDialogComponent } from './components/group-details/add-user-to-group-dialog/add-user-to-group-dialog.component';
import { UserManagementComponent } from '@components/user-management/user-management.component';
import { UserService } from '@services/user.service';
import { LoggedUserComponent } from '@components/users/logged-user/logged-user.component';
import { AddUserDialogComponent } from '@components/user-management/add-user-dialog/add-user-dialog.component';
import { UserFilterPipe } from '@filters/user-filter.pipe';
import { GroupManagementComponent } from '@components/group-management/group-management.component';
import { GroupFilterPipe } from '@filters/group-filter.pipe';
import { AddGroupDialogComponent } from '@components/group-management/add-group-dialog/add-group-dialog.component';
import { DeleteGroupDialogComponent } from '@components/group-management/delete-group-dialog/delete-group-dialog.component';
import { DeleteUserDialogComponent } from '@components/user-management/delete-user-dialog/delete-user-dialog.component';
import { GroupDetailsComponent } from '@components/group-details/group-details.component';
import { UserDetailComponent } from '@components/user-management/user-detail/user-detail.component';
import { AddUserToGroupDialogComponent } from '@components/group-details/add-user-to-group-dialog/add-user-to-group-dialog.component';
import { RemoveToGroupDialogComponent } from '@components/group-details/remove-to-group-dialog/remove-to-group-dialog.component';
import { PaginatorPipe } from './components/group-details/paginator.pipe';
import { MembersFilterPipe } from './components/group-details/members-filter.pipe';
import { ManagementComponent } from './components/management/management.component';
import { PaginatorPipe } from '@components/group-details/paginator.pipe';
import { MembersFilterPipe } from '@components/group-details/members-filter.pipe';
import { ManagementComponent } from '@components/management/management.component';
import {MatCheckboxModule} from "@angular/material/checkbox";
import { RoleManagementComponent } from './components/role-management/role-management.component';
import { RoleFilterPipe } from './components/role-management/role-filter.pipe';
import { AddRoleDialogComponent } from './components/role-management/add-role-dialog/add-role-dialog.component';
import { DeleteRoleDialogComponent } from './components/role-management/delete-role-dialog/delete-role-dialog.component';
import { RoleDetailComponent } from './components/role-management/role-detail/role-detail.component';
import { RoleManagementComponent } from '@components/role-management/role-management.component';
import { RoleFilterPipe } from '@components/role-management/role-filter.pipe';
import { AddRoleDialogComponent } from '@components/role-management/add-role-dialog/add-role-dialog.component';
import { DeleteRoleDialogComponent } from '@components/role-management/delete-role-dialog/delete-role-dialog.component';
import { RoleDetailComponent } from '@components/role-management/role-detail/role-detail.component';
import {MatSlideToggleModule} from '@angular/material/slide-toggle';
import {MatAutocompleteModule} from "@angular/material/autocomplete";;
import { AddRoleToGroupComponent } from './components/group-details/add-role-to-group/add-role-to-group.component';
import { AddRoleToGroupComponent } from '@components/group-details/add-role-to-group/add-role-to-group.component';
import {MatFormFieldModule} from "@angular/material/form-field";
import { ChangeUserPasswordComponent } from './components/user-management/user-detail/change-user-password/change-user-password.component';
import { ChangeUserPasswordComponent } from '@components/user-management/user-detail/change-user-password/change-user-password.component';
import {MatMenuModule} from "@angular/material/menu";
import { ImageManagerComponent } from './components/image-manager/image-manager.component';
import { AddImageDialogComponent } from './components/image-manager/add-image-dialog/add-image-dialog.component';
import { DeleteAllImageFilesDialogComponent } from './components/image-manager/deleteallfiles-dialog/deleteallfiles-dialog.component';
import { ImageManagerComponent } from '@components/image-manager/image-manager.component';
import { AddImageDialogComponent } from '@components/image-manager/add-image-dialog/add-image-dialog.component';
import { DeleteAllImageFilesDialogComponent } from '@components/image-manager/deleteallfiles-dialog/deleteallfiles-dialog.component';
import { UploadingProcessbarComponent } from './common/uploading-processbar/uploading-processbar.component';
import { ExportPortableProjectComponent } from './components/export-portable-project/export-portable-project.component';
import { NodesMenuConfirmationDialogComponent } from './components/project-map/nodes-menu/nodes-menu-confirmation-dialog/nodes-menu-confirmation-dialog.component';
import { ConfirmationDeleteAllProjectsComponent } from './components/projects/confirmation-delete-all-projects/confirmation-delete-all-projects.component';
import { ProjectMapLockConfirmationDialogComponent } from './components/project-map/project-map-menu/project-map-lock-confirmation-dialog/project-map-lock-confirmation-dialog.component';
import { ExportPortableProjectComponent } from '@components/export-portable-project/export-portable-project.component';
import { NodesMenuConfirmationDialogComponent } from '@components/project-map/nodes-menu/nodes-menu-confirmation-dialog/nodes-menu-confirmation-dialog.component';
import { ConfirmationDeleteAllProjectsComponent } from '@components/projects/confirmation-delete-all-projects/confirmation-delete-all-projects.component';
import { ProjectMapLockConfirmationDialogComponent } from '@components/project-map/project-map-menu/project-map-lock-confirmation-dialog/project-map-lock-confirmation-dialog.component';
import { AclManagementComponent } from "@components/acl-management/acl-management.component";
import { AddAceDialogComponent } from './components/acl-management/add-ace-dialog/add-ace-dialog.component';
import { AutocompleteComponent } from './components/acl-management/add-ace-dialog/autocomplete/autocomplete.component';
import { DeleteAceDialogComponent } from './components/acl-management/delete-ace-dialog/delete-ace-dialog.component';
import { AceFilterPipe } from './filters/ace-filter.pipe';
import { AddAceDialogComponent } from '@components/acl-management/add-ace-dialog/add-ace-dialog.component';
import { AutocompleteComponent } from '@components/acl-management/add-ace-dialog/autocomplete/autocomplete.component';
import { DeleteAceDialogComponent } from '@components/acl-management/delete-ace-dialog/delete-ace-dialog.component';
import { AceFilterPipe } from '@filters/ace-filter.pipe';
import { CdkAccordionModule } from "@angular/cdk/accordion";
import { CdkTreeModule } from "@angular/cdk/tree";
import { PrivilegeComponent } from './components/role-management/role-detail/privilege/privilege.component';
import { GroupPrivilegesPipe } from './components/role-management/role-detail/privilege/group-privileges.pipe';
import { ResourcePoolsManagementComponent } from './components/resource-pools-management/resource-pools-management.component';
import { AddResourcePoolDialogComponent } from './components/resource-pools-management/add-resource-pool-dialog/add-resource-pool-dialog.component';
import { DeleteResourcePoolComponent } from './components/resource-pools-management/delete-resource-pool/delete-resource-pool.component';
import { ResourcePoolsFilterPipe } from './components/resource-pools-management/resource-pools-filter.pipe';
import { ResourcePoolDetailsComponent } from './components/resource-pool-details/resource-pool-details.component';
import { DeleteResourceConfirmationDialogComponent } from './components/resource-pool-details/delete-resource-confirmation-dialog/delete-resource-confirmation-dialog.component';
import { PrivilegeComponent } from '@components/role-management/role-detail/privilege/privilege.component';
import { GroupPrivilegesPipe } from '@components/role-management/role-detail/privilege/group-privileges.pipe';
import { ResourcePoolsManagementComponent } from '@components/resource-pools-management/resource-pools-management.component';
import { AddResourcePoolDialogComponent } from '@components/resource-pools-management/add-resource-pool-dialog/add-resource-pool-dialog.component';
import { DeleteResourcePoolComponent } from '@components/resource-pools-management/delete-resource-pool/delete-resource-pool.component';
import { ResourcePoolsFilterPipe } from '@components/resource-pools-management/resource-pools-filter.pipe';
import { ResourcePoolDetailsComponent } from '@components/resource-pool-details/resource-pool-details.component';
import { DeleteResourceConfirmationDialogComponent } from '@components/resource-pool-details/delete-resource-confirmation-dialog/delete-resource-confirmation-dialog.component';
@NgModule({
declarations: [
@ -492,6 +497,7 @@ import { DeleteResourceConfirmationDialogComponent } from './components/resource
AlignVerticallyActionComponent,
ConfirmationBottomSheetComponent,
ConfigDialogComponent,
IdlePCDialogComponent,
ImportApplianceComponent,
DirectLinkComponent,
SystemStatusComponent,
@ -499,6 +505,8 @@ import { DeleteResourceConfirmationDialogComponent } from './components/resource
StatusChartComponent,
OpenFileExplorerActionComponent,
HttpConsoleActionComponent,
IdlePcActionComponent,
AutoIdlePcActionComponent,
WebConsoleComponent,
ConsoleWrapperComponent,
HttpConsoleNewTabActionComponent,
@ -510,6 +518,7 @@ import { DeleteResourceConfirmationDialogComponent } from './components/resource
ReadmeEditorComponent,
MarkedDirective,
InformationDialogComponent,
QuestionDialogComponent,
TemplateNameDialogComponent,
ConfigureCustomAdaptersDialogComponent,
EditNetworkConfigurationDialogComponent,
@ -651,6 +660,7 @@ import { DeleteResourceConfirmationDialogComponent } from './components/resource
InfoService,
ComputeService,
PacketCaptureService,
ProtocolHandlerService,
NotificationService,
ThemeService,
GoogleAnalyticsService,

View File

@ -11,13 +11,13 @@ import {
} from '@angular/core';
import { select, Selection } from 'd3-selection';
import { Subscription } from 'rxjs';
import { Link } from '../../../models/link';
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 { Link } from '@models/link';
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';

View File

@ -1,7 +1,7 @@
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 { 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';

View File

@ -1,7 +1,7 @@
import { Component, Input, OnDestroy, OnInit } from '@angular/core';
import { select } from 'd3-selection';
import { merge, Subscription } from 'rxjs';
import { MapSettingsService } from '../../../services/mapsettings.service';
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';

View File

@ -12,8 +12,8 @@ import {
ViewChild,
} from '@angular/core';
import { Subscription } from 'rxjs';
import { Link } from '../../../models/link';
import { Symbol } from '../../../models/symbol';
import { Link } from '@models/link';
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';

View File

@ -13,7 +13,7 @@ import {
} from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { Subscription } from 'rxjs';
import { Symbol } from '../../../../models/symbol';
import { Symbol } from '@models/symbol';
import { DraggedDataEvent } from '../../../events/event-source';
import { NodesEventSource } from '../../../events/nodes-event-source';
import { CssFixer } from '../../../helpers/css-fixer';

View File

@ -1,10 +1,10 @@
import { Renderer2 } from '@angular/core';
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 { 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';

View File

@ -11,12 +11,12 @@ import {
} 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 { 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';

View File

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core';
import { LinkNode } from '../../../models/link-node';
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';

View File

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core';
import { Link } from '../../../models/link';
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';

View File

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core';
import { LinkNode } from '../../../models/link-node';
import { LinkNode } from '@models/link-node';
import { MapLinkNode } from '../../models/map/map-link-node';
import { Converter } from '../converter';
import { MapLabelToLabelConverter } from './map-label-to-label-converter';

View File

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core';
import { Link } from '../../../models/link';
import { Link } from '@models/link';
import { MapLink } from '../../models/map/map-link';
import { Converter } from '../converter';
import { MapLinkNodeToLinkNodeConverter } from './map-link-node-to-link-node-converter';

View File

@ -27,6 +27,7 @@ export class MapNodeToNodeConverter implements Converter<MapNode, Node> {
node.port_name_format = mapNode.portNameFormat;
node.port_segment_size = mapNode.portSegmentSize;
node.ports = mapNode.ports ? mapNode.ports.map((mapPort) => this.mapPortToPort.convert(mapPort)) : [];
node.properties = mapNode.properties;
node.project_id = mapNode.projectId;
node.status = mapNode.status;
node.symbol = mapNode.symbol;

View File

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core';
import { Port } from '../../../models/port';
import { Port } from '@models/port';
import { MapPort } from '../../models/map/map-port';
import { Converter } from '../converter';

View File

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core';
import { Symbol } from '../../../models/symbol';
import { Symbol } from '@models/symbol';
import { MapSymbol } from '../../models/map/map-symbol';
import { Converter } from '../converter';

View File

@ -38,6 +38,7 @@ export class NodeToMapNodeConverter implements Converter<Node, MapNode> {
mapNode.portNameFormat = node.port_name_format;
mapNode.portSegmentSize = node.port_segment_size;
mapNode.ports = node.ports ? node.ports.map((port) => this.portToMapPort.convert(port)) : [];
mapNode.properties = node.properties;
mapNode.projectId = node.project_id;
mapNode.status = node.status;
mapNode.symbol = node.symbol;

View File

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core';
import { Port } from '../../../models/port';
import { Port } from '@models/port';
import { MapPort } from '../../models/map/map-port';
import { Converter } from '../converter';

View File

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core';
import { Symbol } from '../../../models/symbol';
import { Symbol } from '@models/symbol';
import { MapSymbol } from '../../models/map/map-symbol';
import { Converter } from '../converter';

View File

@ -1,4 +1,4 @@
import { Link } from '../../models/link';
import { Link } from '@models/link';
import { LinksDataSource } from './links-datasource';
describe('LinksDataSource', () => {

View File

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core';
import { Link } from '../../models/link';
import { Link } from '@models/link';
import { DataSource } from './datasource';
@Injectable()

View File

@ -1,4 +1,4 @@
import { Symbol } from '../../models/symbol';
import { Symbol } from '@models/symbol';
import { SymbolsDataSource } from './symbols-datasource';
describe('SymbolsDataSource', () => {

View File

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core';
import { Symbol } from '../../models/symbol';
import { Symbol } from '@models/symbol';
import { DataSource } from './datasource';
@Injectable()

View File

@ -1,7 +1,7 @@
import { Component } from '@angular/core';
import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { MapScaleService } from '../../services/mapScale.service';
import { MapScaleService } from '@services/mapScale.service';
import { MovingEventSource } from '../events/moving-event-source';
import { Context } from '../models/context';
import { ZoomingCanvasDirective } from './zooming-canvas.directive';

View File

@ -1,7 +1,7 @@
import { Directive, ElementRef, OnDestroy, OnInit } from '@angular/core';
import { select } from 'd3-selection';
import { Subscription } from 'rxjs';
import { MapScaleService } from '../../services/mapScale.service';
import { MapScaleService } from '@services/mapScale.service';
import { MovingEventSource } from '../events/moving-event-source';
import { Context } from '../models/context';

View File

@ -1,6 +1,6 @@
import { Injectable } from '@angular/core';
import { Link } from '../../models/link';
import { Symbol } from '../../models/symbol';
import { Link } from '@models/link';
import { Symbol } from '@models/symbol';
import { DrawingToMapDrawingConverter } from '../converters/map/drawing-to-map-drawing-converter';
import { LinkToMapLinkConverter } from '../converters/map/link-to-map-link-converter';
import { NodeToMapNodeConverter } from '../converters/map/node-to-map-node-converter';

View File

@ -1,8 +1,8 @@
import { Filter } from '../../../models/filter';
import { Filter } from '@models/filter';
import { Indexed } from '../../datasources/map-datasource';
import { MapLinkNode } from './map-link-node';
import { MapNode } from './map-node';
import { LinkStyle } from '../../../models/link-style';
import { LinkStyle } from '@models/link-style';
export class MapLink implements Indexed {
id: string;

View File

@ -1,6 +1,7 @@
import { Indexed } from '../../datasources/map-datasource';
import { MapLabel } from './map-label';
import { MapPort } from './map-port';
import { Properties } from '../node';
export class MapNode implements Indexed {
id: string;
@ -19,6 +20,7 @@ export class MapNode implements Indexed {
portNameFormat: string;
portSegmentSize: number;
ports: MapPort[];
properties: Properties;
projectId: string;
status: string;
symbol: string;

View File

@ -1,4 +1,4 @@
import { Port } from '../../models/port';
import { Port } from '@models/port';
import { Label } from './label';
export class PortsMapping {
@ -14,8 +14,15 @@ export class Properties {
headless: boolean;
linked_clone: boolean;
on_close: string;
aux: number;
aux_type: boolean;
ram: number;
system_id: string;
dynamips_id?: number;
npe?: string;
midplane?: string;
nvram: number;
image: string;
usage: string;
use_any_adapter: boolean;
vmname: string;
@ -46,16 +53,40 @@ export class Properties {
kernel_image: string;
kernel_image_md5sum?: any;
mac_address: string;
mac_addr: string;
options: string;
platform: string;
chassis?: string;
iomem?: number;
disk0: number;
disk1: number;
idlepc: string;
idlemax: number;
idlesleep: number;
exec_area: number;
mmap: boolean;
sparsemem: boolean;
auto_delete_disks: boolean;
process_priority: string;
qemu_path: string;
environment: string;
extra_hosts: string;
start_command: string;
replicate_network_connection_state: boolean;
memory: number;
tpm: boolean;
uefi: boolean;
slot0?: string;
slot1?: string;
slot2?: string;
slot3?: string;
slot4?: string;
slot5?: string;
slot6?: string;
slot7?: string;
wic0?: string;
wic1?: string;
wic2?: string;
}
export class Node {

View File

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core';
import { MapSettingsService } from '../../services/mapsettings.service';
import { MapSettingsService } from '@services/mapsettings.service';
import { SelectionManager } from '../managers/selection-manager';
import { EllipseElement } from '../models/drawings/ellipse-element';
import { LineElement } from '../models/drawings/line-element';

View File

@ -1,6 +1,6 @@
import { Injectable } from '@angular/core';
import { select } from 'd3-selection';
import { MapSettingsService } from '../../services/mapsettings.service';
import { MapSettingsService } from '@services/mapsettings.service';
import { LinkStatus } from '../models/link-status';
import { MapLink } from '../models/map/map-link';
import { SVGSelection } from '../models/types';
@ -90,7 +90,7 @@ export class InterfaceStatusWidget implements Widget {
.merge(status_started_enter)
.attr('class', 'status_started')
.attr('width', (ls: LinkStatus) => {
return ls.port.length * 8 + 10;
return ls.port.length * 10 + 5;
})
.attr('height', 20)
.attr('x', (ls: LinkStatus) => ls.x - 30)
@ -122,7 +122,7 @@ export class InterfaceStatusWidget implements Widget {
.merge(status_stopped_enter)
.attr('class', 'status_stopped')
.attr('width', (ls: LinkStatus) => {
return ls.port.length * 8 + 10;
return ls.port.length * 10 + 5;
})
.attr('height', 20)
.attr('x', (ls: LinkStatus) => ls.x - 30)
@ -154,7 +154,7 @@ export class InterfaceStatusWidget implements Widget {
.merge(status_suspended_enter)
.attr('class', 'status_suspended')
.attr('width', (ls: LinkStatus) => {
return ls.port.length * 8 + 10;
return ls.port.length * 10 + 5;
})
.attr('height', 20)
.attr('x', (ls: LinkStatus) => ls.x - 30)

View File

@ -4,7 +4,7 @@ import { LinkContextMenu } from '../../events/event-source';
import { MapLink } from '../../models/map/map-link';
import { SVGSelection } from '../../models/types';
import { Widget } from '../widget';
import { LinkStyle } from '../../../models/link-style';
import { LinkStyle } from '@models/link-style';
import { StyleTranslator} from './style-translator';
class EthernetLinkPath {

View File

@ -4,7 +4,7 @@ import { LinkContextMenu } from '../../events/event-source';
import { MapLink } from '../../models/map/map-link';
import { SVGSelection } from '../../models/types';
import { Widget } from '../widget';
import { LinkStyle } from '../../../models/link-style';
import { LinkStyle } from '@models/link-style';
import { StyleTranslator} from './style-translator';
class SerialLinkPath {
@ -56,10 +56,10 @@ export class SerialLinkWidget implements Widget {
];
return new SerialLinkPath(
[source.x, source.y],
angle_source,
angle_target,
[target.x, target.y],
[source.x, source.y],
angle_source,
angle_target,
[target.x, target.y],
link.link_style.color ? link.link_style : this.defaultSerialLinkStyle);
}

View File

@ -1,4 +1,4 @@
import { LinkStyle } from '../../../models/link-style';
import { LinkStyle } from '@models/link-style';
export class StyleTranslator {
static getLinkStyle(linkStyle: LinkStyle) {

View File

@ -1,6 +1,6 @@
import { EventEmitter, Injectable } from '@angular/core';
import { event, select } from 'd3-selection';
import { MapSettingsService } from '../../services/mapsettings.service';
import { MapSettingsService } from '@services/mapsettings.service';
import { ClickedDataEvent } from '../events/event-source';
import { NodeClicked, NodeContextMenu } from '../events/nodes';
import { NodesEventSource } from '../events/nodes-event-source';

View File

@ -1,8 +1,8 @@
import { Injector } from '@angular/core';
import { TestBed } from '@angular/core/testing';
import { SettingsService } from '../../services/settings.service';
import { ToasterService } from '../../services/toaster.service';
import { MockedToasterService } from '../../services/toaster.service.spec';
import { SettingsService } from '@services/settings.service';
import { ToasterService } from '@services/toaster.service';
import { MockedToasterService } from '@services/toaster.service.spec';
import { SentryErrorHandler } from './sentry-error-handler';
import { ToasterErrorHandler } from './toaster-error-handler';

View File

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core';
import { ToasterService } from '../../services/toaster.service';
import { ToasterService } from '@services/toaster.service';
import { SentryErrorHandler } from './sentry-error-handler';
@Injectable()

View File

@ -1,4 +1,4 @@
import {Endpoint, RessourceType} from "../../../models/api/endpoint";
import {Endpoint, RessourceType} from "@models/api/endpoint";
export interface EndpointNode {
endpoint: string;

View File

@ -120,7 +120,7 @@ export class AddAceDialogComponent implements OnInit {
this.toasterService.success(`ACE was added for path ${ACE.path}`);
},
(error) => {
this.toasterService.error(`Cannot create ACE : ${error.error.message}`)
this.toasterService.error(`Cannot create ACE: ${error.error.message}`)
})
this.dialogRef.close();
}

View File

@ -1,7 +1,7 @@
import { HttpClient } from '@angular/common/http';
import { Component, OnInit } from '@angular/core';
import { AdButlerResponse } from '../../models/adbutler';
import { ThemeService } from '../../services/theme.service';
import { AdButlerResponse } from '@models/adbutler';
import { ThemeService } from '@services/theme.service';
import { Location } from '@angular/common';
const adButlerResponseBodyRegex: RegExp = /<a href="(.*)">(.*)<\/a><br\/>(.*)<br\/>\s*<button><a .*>(.*)<\/a>\s*<\/button>/i;

View File

@ -4,9 +4,9 @@ import { By } from '@angular/platform-browser';
import { Router } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing';
import { ProgressService } from '../../common/progress/progress.service';
import{ Controller } from '../../models/controller';
import { ControllerService } from '../../services/controller.service';
import { MockedControllerService } from '../../services/controller.service.spec';
import { Controller } from '@models/controller';
import { ControllerService } from '@services/controller.service';
import { MockedControllerService } from '@services/controller.service.spec';
import { MockedProgressService } from '../project-map/project-map.component.spec';
import { BundledControllerFinderComponent } from './bundled-controller-finder.component';
@ -24,7 +24,7 @@ describe('BundledControllerFinderComponent', () => {
navigate: jasmine.createSpy('navigate'),
};
controllerServiceMock = jasmine.createSpyObj<ControllerService>([
"getLocalController"

View File

@ -2,8 +2,8 @@ import { DOCUMENT } from '@angular/common';
import { Component, Inject, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { ProgressService } from '../../common/progress/progress.service';
import{ Controller } from '../../models/controller';
import { ControllerService } from '../../services/controller.service';
import { Controller } from '@models/controller';
import { ControllerService } from '@services/controller.service';
@Component({
selector: 'app-bundled-controller-finder',
@ -22,7 +22,7 @@ export class BundledControllerFinderComponent implements OnInit {
this.progressService.activate();
setTimeout(() => {
let port;
if (parseInt(this.document.location.port, 10)) {
port = parseInt(this.document.location.port, 10);
} else if (this.document.location.protocol == "https:") {
@ -31,7 +31,7 @@ export class BundledControllerFinderComponent implements OnInit {
port = 80;
}
this.controllerService.getLocalController(this.document.location.hostname, port).then((controller:Controller ) => {
this.controllerService.getLocalController(this.document.location.hostname, port).then((controller: Controller ) => {
this.router.navigate(['/controller', controller.id, 'projects']);
this.progressService.deactivate();
});

View File

@ -2,9 +2,9 @@ import { Component, Inject, OnInit } from '@angular/core';
import { UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { ElectronService } from 'ngx-electron';
import { Controller } from '../../../models/controller';
import { ControllerService } from '../../../services/controller.service';
import { ToasterService } from '../../../services/toaster.service';
import { Controller } from '@models/controller';
import { ControllerService } from '@services/controller.service';
import { ToasterService } from '@services/toaster.service';
@Component({
selector: 'app-add-controller-dialog',
@ -124,7 +124,7 @@ export class AddControllerDialogComponent implements OnInit {
return;
}
const controller:Controller = Object.assign({}, this.controllerForm.value);
const controller: Controller = Object.assign({}, this.controllerForm.value);
this.controllerService.checkControllerVersion(controller).subscribe(
(controllerInfo) => {
if (controllerInfo.version.split('.')[0] >= 3) {

View File

@ -2,13 +2,13 @@ import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testin
import { MatCardModule } from '@angular/material/card';
import { MatDividerModule } from '@angular/material/divider';
import { Observable } from 'rxjs/Rx';
import{ Controller } from '../../../models/controller';
import { Version } from '../../../models/version';
import { ControllerDatabase } from '../../../services/controller.database';
import { ControllerService } from '../../../services/controller.service';
import { MockedControllerService } from '../../../services/controller.service.spec';
import { VersionService } from '../../../services/version.service';
import { MockedVersionService } from '../../../services/version.service.spec';
import { Controller } from '@models/controller';
import { Version } from '@models/version';
import { ControllerDatabase } from '@services/controller.database';
import { ControllerService } from '@services/controller.service';
import { MockedControllerService } from '@services/controller.service.spec';
import { VersionService } from '@services/version.service';
import { MockedVersionService } from '@services/version.service.spec';
import { ControllerDiscoveryComponent } from './controller-discovery.component';
xdescribe('ControllerDiscoveryComponent', () => {
@ -112,7 +112,7 @@ describe('discovery', () => {
});
describe('discoverFirstAvailableController', () => {
let controller:Controller ;
let controller: Controller;
beforeEach(function () {
controller = new Controller ();
@ -142,7 +142,7 @@ describe('discoverFirstAvailableController', () => {
});
describe('accepting and ignoring found controller', () => {
let controller:Controller ;
let controller: Controller;
beforeEach(() => {
controller = new Controller ();
(controller.host = '199.111.111.1'), (controller.port = 3333);

View File

@ -3,11 +3,11 @@ import { ActivatedRoute } from '@angular/router';
import { forkJoin, from } from 'rxjs';
import { map } from 'rxjs//operators';
import { Observable } from 'rxjs/Rx';
import { Controller, ControllerProtocol } from '../../../models/controller';
import { Version } from '../../../models/version';
import { ControllerDatabase } from '../../../services/controller.database';
import { ControllerService } from '../../../services/controller.service';
import { VersionService } from '../../../services/version.service';
import { Controller, ControllerProtocol } from '@models/controller';
import { Version } from '@models/version';
import { ControllerDatabase } from '@services/controller.database';
import { ControllerService } from '@services/controller.service';
import { VersionService } from '@services/version.service';
@Component({
selector: 'app-controller-discovery',

View File

@ -4,11 +4,11 @@ import { MatDialog, MatDialogModule } from '@angular/material/dialog';
import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu';
import { MatToolbarModule } from '@angular/material/toolbar';
import { ControllerDatabase } from '../../services/controller.database';
import { ControllerService } from '../../services/controller.service';
import { ControllerDatabase } from '@services/controller.database';
import { ControllerService } from '@services/controller.service';
import { MockedControllerService } from 'app/services/controller.service.spec';
import { ControllersComponent } from './controllers.component';
import { ControllerManagementService } from '../../services/controller-management.service';
import { ControllerManagementService } from '@services/controller-management.service';
import { ElectronService } from 'ngx-electron';
import { ChildProcessService } from 'ngx-childprocess';
import { MatBottomSheet, MatBottomSheetModule } from '@angular/material/bottom-sheet';

View File

@ -7,10 +7,10 @@ import { ChildProcessService } from 'ngx-childprocess';
import { ElectronService } from 'ngx-electron';
import { merge, Observable, Subscription } from 'rxjs';
import { map } from 'rxjs/operators';
import {Controller , ControllerProtocol } from '../../models/controller';
import { ControllerManagementService } from '../../services/controller-management.service';
import { ControllerDatabase } from '../../services/controller.database';
import { ControllerService } from '../../services/controller.service';
import {Controller, ControllerProtocol } from '@models/controller';
import { ControllerManagementService } from '@services/controller-management.service';
import { ControllerDatabase } from '@services/controller.database';
import { ControllerService } from '@services/controller.service';
import { ConfirmationBottomSheetComponent } from '../projects/confirmation-bottomsheet/confirmation-bottomsheet.component';
import { AddControllerDialogComponent } from './add-controller-dialog/add-controller-dialog.component';
@ -41,7 +41,7 @@ export class ControllersComponent implements OnInit, OnDestroy {
getControllers() {
const runningControllerNames = this.controllerManagement.getRunningControllers();
this.controllerService.findAll().then((controllers:Controller []) => {
this.controllerService.findAll().then((controllers: Controller []) => {
controllers.forEach((controller) => {
const controllerIndex = runningControllerNames.findIndex((controllerName) => controller.name === controllerName);
if (controllerIndex >= 0) {
@ -122,14 +122,14 @@ export class ControllersComponent implements OnInit, OnDestroy {
dialogRef.afterClosed().subscribe((controller) => {
if (controller) {
this.controllerService.create(controller).then((created:Controller ) => {
this.controllerService.create(controller).then((created: Controller ) => {
this.controllerDatabase.addController(created);
});
}
});
}
getControllerStatus(controller:Controller ) {
getControllerStatus(controller: Controller ) {
if (controller.location === 'local') {
if (controller.status === undefined) {
return 'stopped';
@ -138,7 +138,7 @@ export class ControllersComponent implements OnInit, OnDestroy {
}
}
deleteController(controller:Controller ) {
deleteController(controller: Controller ) {
this.bottomSheet.open(ConfirmationBottomSheetComponent);
let bottomSheetRef = this.bottomSheet._openedBottomSheetRef;
bottomSheetRef.instance.message = 'Do you want to delete the controller?';
@ -151,11 +151,11 @@ export class ControllersComponent implements OnInit, OnDestroy {
});
}
async startController(controller:Controller ) {
async startController(controller: Controller ) {
await this.controllerManagement.start(controller);
}
async stopController(controller:Controller ) {
async stopController(controller: Controller ) {
await this.controllerManagement.stop(controller);
}
}

View File

@ -0,0 +1,8 @@
<h1 mat-dialog-title>{{ data.title }}</h1>
<div mat-dialog-content>
<p>{{ data.question }}</p>
</div>
<div mat-dialog-actions>
<button mat-button (click)="onNoClick()">No</button>
<button mat-button (click)="onYesClick()">Yes</button>
</div>

View File

@ -0,0 +1,21 @@
import { Component, Inject } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
@Component({
selector: 'app-question-dialog',
templateUrl: './question-dialog.component.html',
})
export class QuestionDialogComponent {
constructor(
public dialogRef: MatDialogRef<QuestionDialogComponent>,
@Inject(MAT_DIALOG_DATA) public data: { title: string, question: string}
) {}
onNoClick(): void {
this.dialogRef.close(false);
}
onYesClick(): void {
this.dialogRef.close(true);
}
}

View File

@ -1,10 +1,10 @@
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import{ Controller } from '../../models/controller';
import { ControllerDatabase } from '../../services/controller.database';
import { ControllerService } from '../../services/controller.service';
import { ToasterService } from '../../services/toaster.service';
import { Controller } from '@models/controller';
import { ControllerDatabase } from '@services/controller.database';
import { ControllerService } from '@services/controller.service';
import { ToasterService } from '@services/toaster.service';
@Component({
selector: 'app-direct-link',
@ -72,7 +72,7 @@ export class DirectLinkComponent implements OnInit {
return;
}
let controllerToAdd:Controller = new Controller ();
let controllerToAdd: Controller = new Controller ();
controllerToAdd.host = this.controllerIp;
controllerToAdd.port = this.controllerPort;
@ -80,7 +80,7 @@ export class DirectLinkComponent implements OnInit {
controllerToAdd.location = this.controllerForm.get('location').value;
controllerToAdd.protocol = this.controllerForm.get('protocol').value;
this.controllerService.create(controllerToAdd).then((addedController:Controller ) => {
this.controllerService.create(controllerToAdd).then((addedController: Controller ) => {
this.router.navigate(['/controller', addedController.id, 'project', this.projectId]);
});
}

View File

@ -9,8 +9,8 @@ import { EllipseElementFactory } from '../../../cartography/helpers/drawings-fac
import { LineElementFactory } from '../../../cartography/helpers/drawings-factory/line-element-factory';
import { RectangleElementFactory } from '../../../cartography/helpers/drawings-factory/rectangle-element-factory';
import { TextElementFactory } from '../../../cartography/helpers/drawings-factory/text-element-factory';
import { Project } from '../../../models/project';
import { DrawingService } from '../../../services/drawing.service';
import { Project } from '@models/project';
import { DrawingService } from '@services/drawing.service';
import { MockedDrawingsDataSource, MockedDrawingService } from '../../project-map/project-map.component.spec';
import { DrawingAddedComponent } from './drawing-added.component';

View File

@ -6,9 +6,9 @@ import { DrawingsEventSource } from '../../../cartography/events/drawings-event-
import { AddedDataEvent } from '../../../cartography/events/event-source';
import { DefaultDrawingsFactory } from '../../../cartography/helpers/default-drawings-factory';
import { Drawing } from '../../../cartography/models/drawing';
import { Project } from '../../../models/project';
import{ Controller } from '../../../models/controller';
import { DrawingService } from '../../../services/drawing.service';
import { Project } from '@models/project';
import { Controller } from '@models/controller';
import { DrawingService } from '@services/drawing.service';
@Component({
selector: 'app-drawing-added',

View File

@ -5,7 +5,7 @@ import { DrawingsEventSource } from '../../../cartography/events/drawings-event-
import { DraggedDataEvent } from '../../../cartography/events/event-source';
import { DrawingElement } from '../../../cartography/models/drawings/drawing-element';
import { MapDrawing } from '../../../cartography/models/map/map-drawing';
import { DrawingService } from '../../../services/drawing.service';
import { DrawingService } from '@services/drawing.service';
import { MockedDrawingsDataSource, MockedDrawingService } from '../../project-map/project-map.component.spec';
import { DrawingDraggedComponent } from './drawing-dragged.component';

View File

@ -5,9 +5,9 @@ import { DrawingsEventSource } from '../../../cartography/events/drawings-event-
import { DraggedDataEvent } from '../../../cartography/events/event-source';
import { Drawing } from '../../../cartography/models/drawing';
import { MapDrawing } from '../../../cartography/models/map/map-drawing';
import { Project } from '../../../models/project';
import{ Controller } from '../../../models/controller';
import { DrawingService } from '../../../services/drawing.service';
import { Project } from '@models/project';
import { Controller } from '@models/controller';
import { DrawingService } from '@services/drawing.service';
@Component({
selector: 'app-drawing-dragged',
@ -15,7 +15,7 @@ import { DrawingService } from '../../../services/drawing.service';
styleUrls: ['./drawing-dragged.component.scss'],
})
export class DrawingDraggedComponent implements OnInit, OnDestroy {
@Input() controller:Controller ;
@Input() controller: Controller;
@Input() project: Project;
private drawingDragged: Subscription;

View File

@ -6,7 +6,7 @@ import { DrawingsEventSource } from '../../../cartography/events/drawings-event-
import { ResizedDataEvent } from '../../../cartography/events/event-source';
import { DrawingElement } from '../../../cartography/models/drawings/drawing-element';
import { MapDrawing } from '../../../cartography/models/map/map-drawing';
import { DrawingService } from '../../../services/drawing.service';
import { DrawingService } from '@services/drawing.service';
import { MockedDrawingsDataSource, MockedDrawingService } from '../../project-map/project-map.component.spec';
import { DrawingResizedComponent } from './drawing-resized.component';

View File

@ -6,8 +6,8 @@ import { DrawingsEventSource } from '../../../cartography/events/drawings-event-
import { ResizedDataEvent } from '../../../cartography/events/event-source';
import { Drawing } from '../../../cartography/models/drawing';
import { MapDrawing } from '../../../cartography/models/map/map-drawing';
import{ Controller } from '../../../models/controller';
import { DrawingService } from '../../../services/drawing.service';
import { Controller } from '@models/controller';
import { DrawingService } from '@services/drawing.service';
@Component({
selector: 'app-drawing-resized',
@ -15,7 +15,7 @@ import { DrawingService } from '../../../services/drawing.service';
styleUrls: ['./drawing-resized.component.scss'],
})
export class DrawingResizedComponent implements OnInit, OnDestroy {
@Input() controller:Controller ;
@Input() controller: Controller;
private drawingResized: Subscription;
constructor(

View File

@ -6,8 +6,8 @@ import { LinksEventSource } from '../../../cartography/events/links-event-source
import { Label } from '../../../cartography/models/label';
import { MapLabel } from '../../../cartography/models/map/map-label';
import { MapLinkNode } from '../../../cartography/models/map/map-link-node';
import { Link } from '../../../models/link';
import { LinkService } from '../../../services/link.service';
import { Link } from '@models/link';
import { LinkService } from '@services/link.service';
import { MockedLinkService } from '../../project-map/project-map.component.spec';
import { InterfaceLabelDraggedComponent } from './interface-label-dragged.component';

View File

@ -4,9 +4,9 @@ import { LinksDataSource } from '../../../cartography/datasources/links-datasour
import { DraggedDataEvent } from '../../../cartography/events/event-source';
import { LinksEventSource } from '../../../cartography/events/links-event-source';
import { MapLinkNode } from '../../../cartography/models/map/map-link-node';
import { Link } from '../../../models/link';
import{ Controller } from '../../../models/controller';
import { LinkService } from '../../../services/link.service';
import { Link } from '@models/link';
import { Controller } from '@models/controller';
import { LinkService } from '@services/link.service';
@Component({
selector: 'app-interface-label-dragged',
@ -14,7 +14,7 @@ import { LinkService } from '../../../services/link.service';
styleUrls: ['./interface-label-dragged.component.scss'],
})
export class InterfaceLabelDraggedComponent {
@Input() controller:Controller ;
@Input() controller: Controller;
private interfaceDragged: Subscription;
constructor(

View File

@ -12,10 +12,10 @@ import { FontFixer } from '../../../cartography/helpers/font-fixer';
import { MapLabel } from '../../../cartography/models/map/map-label';
import { MapNode } from '../../../cartography/models/map/map-node';
import { MapPort } from '../../../cartography/models/map/map-port';
import { Project } from '../../../models/project';
import { LinkService } from '../../../services/link.service';
import { ProjectService } from '../../../services/project.service';
import { MockedProjectService } from '../../../services/project.service.spec';
import { Project } from '@models/project';
import { LinkService } from '@services/link.service';
import { ProjectService } from '@services/project.service';
import { MockedProjectService } from '@services/project.service.spec';
import { MockedLinkService } from '../../project-map/project-map.component.spec';
import { LinkCreatedComponent } from './link-created.component';
@ -79,6 +79,7 @@ describe('LinkCreatedComponent', () => {
portNameFormat: 'samplePortNameFormat',
portSegmentSize: 0,
ports: [],
properties: undefined,
projectId: 'sampleProjectId',
status: 'sampleStatus',
symbol: 'sampleSymbol',

View File

@ -5,11 +5,11 @@ import { MapPortToPortConverter } from '../../../cartography/converters/map/map-
import { LinksDataSource } from '../../../cartography/datasources/links-datasource';
import { MapLinkCreated } from '../../../cartography/events/links';
import { LinksEventSource } from '../../../cartography/events/links-event-source';
import { Link } from '../../../models/link';
import { Project } from '../../../models/project';
import{ Controller } from '../../../models/controller';
import { LinkService } from '../../../services/link.service';
import { ProjectService } from '../../../services/project.service';
import { Link } from '@models/link';
import { Project } from '@models/project';
import { Controller } from '@models/controller';
import { LinkService } from '@services/link.service';
import { ProjectService } from '@services/project.service';
@Component({
selector: 'app-link-created',
@ -17,7 +17,7 @@ import { ProjectService } from '../../../services/project.service';
styleUrls: ['./link-created.component.scss'],
})
export class LinkCreatedComponent implements OnInit, OnDestroy {
@Input() controller:Controller ;
@Input() controller: Controller;
@Input() project: Project;
private linkCreated: Subscription;

View File

@ -5,7 +5,7 @@ import { DraggedDataEvent } from '../../../cartography/events/event-source';
import { NodesEventSource } from '../../../cartography/events/nodes-event-source';
import { MapLabel } from '../../../cartography/models/map/map-label';
import { MapNode } from '../../../cartography/models/map/map-node';
import { NodeService } from '../../../services/node.service';
import { NodeService } from '@services/node.service';
import { MockedNodesDataSource, MockedNodeService } from '../../project-map/project-map.component.spec';
import { NodeDraggedComponent } from './node-dragged.component';
@ -59,6 +59,7 @@ describe('NodeDraggedComponent', () => {
portNameFormat: 'samplePortNameFormat',
portSegmentSize: 0,
ports: [],
properties: undefined,
projectId: 'sampleProjectId',
status: 'sampleStatus',
symbol: 'sampleSymbol',

View File

@ -5,9 +5,9 @@ import { DraggedDataEvent } from '../../../cartography/events/event-source';
import { NodesEventSource } from '../../../cartography/events/nodes-event-source';
import { MapNode } from '../../../cartography/models/map/map-node';
import { Node } from '../../../cartography/models/node';
import { Project } from '../../../models/project';
import{ Controller } from '../../../models/controller';
import { NodeService } from '../../../services/node.service';
import { Project } from '@models/project';
import { Controller } from '@models/controller';
import { NodeService } from '@services/node.service';
@Component({
selector: 'app-node-dragged',
@ -15,7 +15,7 @@ import { NodeService } from '../../../services/node.service';
styleUrls: ['./node-dragged.component.scss'],
})
export class NodeDraggedComponent implements OnInit, OnDestroy {
@Input() controller:Controller ;
@Input() controller: Controller;
@Input() project: Project;
private nodeDragged: Subscription;

View File

@ -8,7 +8,7 @@ import { CssFixer } from '../../../cartography/helpers/css-fixer';
import { FontBBoxCalculator } from '../../../cartography/helpers/font-bbox-calculator';
import { FontFixer } from '../../../cartography/helpers/font-fixer';
import { MapLabel } from '../../../cartography/models/map/map-label';
import { NodeService } from '../../../services/node.service';
import { NodeService } from '@services/node.service';
import { MockedNodesDataSource, MockedNodeService } from '../../project-map/project-map.component.spec';
import { NodeLabelDraggedComponent } from './node-label-dragged.component';

View File

@ -6,8 +6,8 @@ import { DraggedDataEvent } from '../../../cartography/events/event-source';
import { NodesEventSource } from '../../../cartography/events/nodes-event-source';
import { MapLabel } from '../../../cartography/models/map/map-label';
import { Node } from '../../../cartography/models/node';
import{ Controller } from '../../../models/controller';
import { NodeService } from '../../../services/node.service';
import { Controller } from '@models/controller';
import { NodeService } from '@services/node.service';
@Component({
selector: 'app-node-label-dragged',
@ -15,7 +15,7 @@ import { NodeService } from '../../../services/node.service';
styleUrls: ['./node-label-dragged.component.scss'],
})
export class NodeLabelDraggedComponent implements OnInit, OnDestroy {
@Input() controller:Controller ;
@Input() controller: Controller;
private nodeLabelDragged: Subscription;
constructor(

View File

@ -10,8 +10,8 @@ import { LineElementFactory } from '../../../cartography/helpers/drawings-factor
import { RectangleElementFactory } from '../../../cartography/helpers/drawings-factory/rectangle-element-factory';
import { TextElementFactory } from '../../../cartography/helpers/drawings-factory/text-element-factory';
import { Context } from '../../../cartography/models/context';
import { Project } from '../../../models/project';
import { DrawingService } from '../../../services/drawing.service';
import { Project } from '@models/project';
import { DrawingService } from '@services/drawing.service';
import { MockedDrawingsDataSource, MockedDrawingService } from '../../project-map/project-map.component.spec';
import { TextAddedComponent } from './text-added.component';

View File

@ -8,9 +8,9 @@ import { DefaultDrawingsFactory } from '../../../cartography/helpers/default-dra
import { Context } from '../../../cartography/models/context';
import { Drawing } from '../../../cartography/models/drawing';
import { TextElement } from '../../../cartography/models/drawings/text-element';
import { Project } from '../../../models/project';
import{ Controller } from '../../../models/controller';
import { DrawingService } from '../../../services/drawing.service';
import { Project } from '@models/project';
import { Controller } from '@models/controller';
import { DrawingService } from '@services/drawing.service';
@Component({
selector: 'app-text-added',

View File

@ -5,7 +5,7 @@ import { DrawingsDataSource } from '../../../cartography/datasources/drawings-da
import { DrawingsEventSource } from '../../../cartography/events/drawings-event-source';
import { TextEditedDataEvent } from '../../../cartography/events/event-source';
import { TextElement } from '../../../cartography/models/drawings/text-element';
import { DrawingService } from '../../../services/drawing.service';
import { DrawingService } from '@services/drawing.service';
import { MockedDrawingsDataSource, MockedDrawingService } from '../../project-map/project-map.component.spec';
import { TextEditedComponent } from './text-edited.component';

View File

@ -7,8 +7,8 @@ import { TextEditedDataEvent } from '../../../cartography/events/event-source';
import { Drawing } from '../../../cartography/models/drawing';
import { TextElement } from '../../../cartography/models/drawings/text-element';
import { MapDrawing } from '../../../cartography/models/map/map-drawing';
import{ Controller } from '../../../models/controller';
import { DrawingService } from '../../../services/drawing.service';
import { Controller } from '@models/controller';
import { DrawingService } from '@services/drawing.service';
@Component({
selector: 'app-text-edited',

View File

@ -7,10 +7,10 @@ import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { ProjectService } from '../../services/project.service';
import { MockedProjectService } from '../../services/project.service.spec';
import { ToasterService } from '../../services/toaster.service';
import { MockedToasterService } from '../../services/toaster.service.spec';
import { ProjectService } from '@services/project.service';
import { MockedProjectService } from '@services/project.service.spec';
import { ToasterService } from '@services/toaster.service';
import { MockedToasterService } from '@services/toaster.service.spec';
import { ExportPortableProjectComponent } from './export-portable-project.component';
describe('ExportPortableProjectComponent', () => {

View File

@ -1,9 +1,9 @@
import { Component, Inject, OnInit } from '@angular/core';
import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { Project } from '../../models/project';
import{ Controller } from '../../models/controller';
import { ProjectService } from '../../services/project.service';
import { Project } from '@models/project';
import { Controller } from '@models/controller';
import { ProjectService } from '@services/project.service';
@Component({
selector: 'app-export-portable-project',
@ -16,7 +16,7 @@ export class ExportPortableProjectComponent implements OnInit {
compression_methods: any = [];
compression_level: any = [];
compression_filter_value: any = [];
controller:Controller ;
controller: Controller;
project: Project;
index: number = 4;
fileName: string;

View File

@ -15,8 +15,8 @@ import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';
import {UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators} from "@angular/forms";
import {groupNameAsyncValidator} from "@components/group-management/add-group-dialog/groupNameAsyncValidator";
import {GroupNameValidator} from "@components/group-management/add-group-dialog/GroupNameValidator";
import {GroupService} from "../../../services/group.service";
import {Controller} from "../../../models/controller";
import {GroupService} from "@services/group.service";
import {Controller} from "@models/controller";
import {BehaviorSubject, forkJoin, timer} from "rxjs";
import {User} from "@models/users/user";
import {UserService} from "@services/user.service";

View File

@ -13,8 +13,8 @@
import { UntypedFormControl } from '@angular/forms';
import { timer } from 'rxjs';
import { map, switchMap, tap } from 'rxjs/operators';
import { Controller } from "../../../models/controller";
import { GroupService } from "../../../services/group.service";
import { Controller } from "@models/controller";
import { GroupService } from "@services/group.service";
export const groupNameAsyncValidator = (controller: Controller, groupService: GroupService) => {
return (control: UntypedFormControl) => {

View File

@ -12,11 +12,11 @@
*/
import {Component, OnInit, QueryList, ViewChild, ViewChildren} from '@angular/core';
import {ActivatedRoute, Router} from "@angular/router";
import {ControllerService} from "../../services/controller.service";
import {ToasterService} from "../../services/toaster.service";
import {GroupService} from "../../services/group.service";
import {Controller} from "../../models/controller";
import {Group} from "../../models/groups/group";
import {ControllerService} from "@services/controller.service";
import {ToasterService} from "@services/toaster.service";
import {GroupService} from "@services/group.service";
import {Controller} from "@models/controller";
import {Group} from "@models/groups/group";
import {MatSort, Sort} from "@angular/material/sort";
import {MatDialog} from "@angular/material/dialog";
import {AddGroupDialogComponent} from "@components/group-management/add-group-dialog/add-group-dialog.component";

View File

@ -39,7 +39,7 @@
<div class="col-md-4 txt-align" *ngIf="uploaderImage.queue.length <= 0">
<input
type="file"
accept=".bin,.image,.qcow2,.vmdk"
accept=".bin,.image,.iol,.qcow2,.vmdk"
multiple
#file
class="non-visible"

View File

@ -5,10 +5,10 @@ import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu';
import { MatToolbarModule } from '@angular/material/toolbar';
import { ImageManagerService } from 'app/services/image-manager.service';
import { ControllerService } from '../../../services/controller.service';
import { MockedControllerService } from '../../../services/controller.service.spec';
import { ControllerService } from '@services/controller.service';
import { MockedControllerService } from '@services/controller.service.spec';
import { of } from 'rxjs';
import{ Controller } from '../../../models/controller';
import { Controller } from '@models/controller';
import { AddImageDialogComponent } from './add-image-dialog.component';
import { NO_ERRORS_SCHEMA } from '@angular/core';
@ -17,7 +17,7 @@ import { MockedToasterService } from 'app/services/toaster.service.spec';
import { MatSnackBarModule } from '@angular/material/snack-bar';
export class MockedImageManagerService {
public getImages(controller:Controller ) {
public getImages(controller: Controller ) {
return of();
}

View File

@ -3,9 +3,9 @@ import { Component, Inject, OnInit } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { UploadServiceService } from 'app/common/uploading-processbar/upload-service.service';
import { FileItem, FileUploader, ParsedResponseHeaders } from 'ng2-file-upload';
import{ Controller } from '../../../models/controller';
import { ImageManagerService } from '../../../services/image-manager.service';
import { ToasterService } from '../../../services/toaster.service';
import { Controller } from '@models/controller';
import { ImageManagerService } from '@services/image-manager.service';
import { ToasterService } from '@services/toaster.service';
@Component({
selector: 'app-add-image-dialog',
@ -20,7 +20,7 @@ import { ToasterService } from '../../../services/toaster.service';
],
})
export class AddImageDialogComponent implements OnInit {
controller:Controller ;
controller: Controller;
isInstallAppliance: boolean = false;
install_appliance: boolean = false;
selectFile: any = [];

View File

@ -9,9 +9,9 @@ import { ToasterService } from 'app/services/toaster.service';
import { MockedToasterService } from 'app/services/toaster.service.spec';
import { Server } from 'http';
import { of } from 'rxjs';
import { ImageManagerService } from '../../../services/image-manager.service';
import { ControllerService } from '../../../services/controller.service';
import { MockedControllerService } from '../../../services/controller.service.spec';
import { ImageManagerService } from '@services/image-manager.service';
import { ControllerService } from '@services/controller.service';
import { MockedControllerService } from '@services/controller.service.spec';
import { ImageManagerComponent } from '../image-manager.component';
import { DeleteAllImageFilesDialogComponent } from './deleteallfiles-dialog.component';

View File

@ -1,10 +1,10 @@
import { Component, Inject, OnInit } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { ImageManagerService } from '../../../services/image-manager.service';
import { ToasterService } from '../../../services/toaster.service';
import { ImageManagerService } from '@services/image-manager.service';
import { ToasterService } from '@services/toaster.service';
import { Observable, of } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { ImageData } from '../../../models/images';
import { ImageData } from '@models/images';
@Component({
selector: 'app-deleteallfiles-dialog',

View File

@ -4,7 +4,7 @@ import { DataSource, SelectionModel } from '@angular/cdk/collections';
import { MatSort } from '@angular/material/sort';
import { BehaviorSubject, Observable, Subscription, merge } from 'rxjs';
import { map } from 'rxjs/operators';
import { Image } from '../../models/images';
import { Image } from '@models/images';
export class imageDatabase {

View File

@ -1,19 +1,19 @@
<div class="content">
<div class="default-header">
<div class="row">
<div class="col-md-9">
<h1>Image Manager</h1>
</div>
<div class="col-md-3 btn-box">
<button class="img-btn" mat-button
(click)="addImageDialog()">
<mat-icon>add</mat-icon> Add Image
</button>
</div>
<h1 class="col">Image Manager</h1>
<button mat-raised-button color="primary" (click)="installAllImages()" class="install-all-button">
<mat-icon>done_all</mat-icon> Install all images
</button>
<button mat-raised-button color="primary" (click)="pruneImages()" class="prune-button">
<mat-icon>delete</mat-icon> Prune Images
</button>
<button mat-raised-button color="primary" (click)="addImageDialog()" class="add-button">
<mat-icon>add</mat-icon> Add Image
</button>
</div>
</div>
<div class="default-content">
<app-controller-discovery></app-controller-discovery>
@ -49,9 +49,9 @@
<mat-header-cell *matHeaderCellDef> Image Size </mat-header-cell>
<mat-cell *matCellDef="let row"> {{ (row.image_size/1000000).toFixed()}} MB </mat-cell>
</ng-container>
<ng-container matColumnDef="delete" >
<mat-header-cell *matHeaderCellDef>
<mat-header-cell *matHeaderCellDef>
<button mat-button *ngIf="(selection.hasValue() && isAllSelected()) || selection.selected.length > 1" (click)="deleteAllFiles()" aria-label="Example icon button with a delete icon">
<mat-icon>delete</mat-icon>
</button>
@ -67,4 +67,4 @@
</mat-table>
</div>
</div>
</div>
</div>

View File

@ -2,12 +2,22 @@
display: none;
}
.img-btn{
margin: auto;
}
.btn-box{
display: flex;
margin-top: 10px;
.install-all-button {
height: 40px;
width: 160px;
margin: 20px;
}
.prune-button {
height: 40px;
width: 160px;
margin: 20px;
}
.add-button {
height: 40px;
width: 160px;
margin: 20px;
}
mat-header-cell, mat-cell {
@ -21,4 +31,3 @@ mat-cell, mat-header-cell, mat-footer-cell {
min-height: inherit;
}

View File

@ -9,25 +9,25 @@ import { ImageManagerService } from 'app/services/image-manager.service';
import { ControllerService } from 'app/services/controller.service';
import { MockedControllerService } from 'app/services/controller.service.spec';
import { of } from 'rxjs';
import{ Controller } from '../../models/controller';
import { Controller } from '@models/controller';
import { ImageManagerComponent } from './image-manager.component';
import { Image } from '../../models/images';
import { Image } from '@models/images';
import { ProgressService } from 'app/common/progress/progress.service';
import { MockedProgressService } from '../project-map/project-map.component.spec';
import { MockedActivatedRoute } from '../preferences/preferences.component.spec';
import { ActivatedRoute } from '@angular/router';
import { MockedVersionService } from '../../services/version.service.spec';
import { MockedVersionService } from '@services/version.service.spec';
import { VersionService } from 'app/services/version.service';
import { ToasterService } from 'app/services/toaster.service';
import { MockedToasterService } from 'app/services/toaster.service.spec';
export class MockedImageManagerService {
public getImages(controller:Controller ) {
public getImages(controller: Controller ) {
return of();
}
public deleteFile(controller:Controller , image_path) {
public deleteFile(controller: Controller, image_path) {
return of();
}

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