Compare commits

..

1961 Commits

Author SHA1 Message Date
aac7b57d22 Release 2.2.22 2021-06-05 10:24:00 +02:00
9421b4bf57 Update ReleaseNotes.txt 2021-06-05 10:23:37 +02:00
354b313eaa Merge pull request #1157 from GNS3/master-2.2.22
Version 2.2.22
2021-05-28 13:20:14 +02:00
b048a846e0 Merge branch 'master' into master-2.2.22 2021-05-27 23:32:27 +02:00
092fe5991b Update bundled-server-finder.component.ts 2021-05-27 23:32:15 +02:00
1a03bb0456 Updating help component 2021-05-27 23:28:46 +02:00
a04804eaa0 Create server.service.spec.ts 2021-05-27 23:16:47 +02:00
8a56032291 Updating dependencies 2021-05-27 22:58:34 +02:00
c80dbe6baf Updating angular to 12, removing indexed db 2021-05-27 22:17:22 +02:00
2b17b3d627 Removing unused packages 2021-05-27 20:12:06 +02:00
6e9ebfb69d Removing react-related components 2021-05-27 18:58:28 +02:00
6faba7c4ec Update bundled-server-finder.component.ts 2021-05-27 18:01:58 +02:00
3f7fe0a7f3 Merge pull request #1152 from GNS3/dependabot/npm_and_yarn/dns-packet-1.3.4
Bump dns-packet from 1.3.1 to 1.3.4
2021-05-27 17:14:01 +02:00
666e39ede3 Removing angular-persistence package, updating unit tests 2021-05-27 17:12:44 +02:00
60f8685c68 Bump dns-packet from 1.3.1 to 1.3.4
Bumps [dns-packet](https://github.com/mafintosh/dns-packet) from 1.3.1 to 1.3.4.
- [Release notes](https://github.com/mafintosh/dns-packet/releases)
- [Changelog](https://github.com/mafintosh/dns-packet/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mafintosh/dns-packet/compare/v1.3.1...v1.3.4)

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

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

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

Signed-off-by: dependabot[bot] <support@github.com>
2020-07-07 19:36:20 +00:00
76f71b7c8b Reelease 2020.3.0-beta.1 2020-07-07 13:32:32 +02:00
1924fcbce0 Update ReleaseNotes.txt 2020-07-07 13:30:38 +02:00
20441a3e38 Update yarn.lock 2020-07-07 13:26:16 +02:00
aa78dc682f Merge pull request #934 from GNS3/Updating-dependencies
Upgrade to Angular 10 [high importance]
2020-07-07 11:19:35 +02:00
ed2ec8f004 Update tsconfig.base.json 2020-07-06 17:56:01 +02:00
290ed5ee89 Update angular.json 2020-07-06 17:02:12 +02:00
491eb86451 Update from master 2020-07-06 15:06:43 +02:00
b8ed394937 Merge pull request #895 from GNS3/Upgrade-Sentry-SDK
Upgrade sentry SDK
2020-07-06 14:33:08 +02:00
0195b3dfc9 All packages updated to newest version 2020-07-01 10:25:59 +02:00
33786ccd14 Upgrade bootstrap 2020-06-30 17:05:10 +02:00
c7d7a97279 Upgrading angular material 2020-06-30 16:35:17 +02:00
4ddc8a198d Update package.json 2020-06-30 16:27:38 +02:00
fc7c52efb7 Update yarn.lock 2020-06-30 15:55:00 +02:00
9b626b6805 Update package.json 2020-06-30 15:44:33 +02:00
5365e228a6 Update yarn.lock 2020-06-30 15:16:59 +02:00
9215ab8e87 downgrade types/node 2020-06-30 13:41:43 +02:00
38941c209b tsconfig updated 2020-06-30 13:30:48 +02:00
c8104a577f Update to Angular 10 2020-06-30 10:42:31 +02:00
7c4e745075 Update package.json 2020-06-30 09:59:13 +02:00
b91ca628a0 Update package.json 2020-06-29 13:02:59 +02:00
f0ec495ff4 Merge pull request #904 from GNS3/whitesource/configure
Configure WhiteSource for GitHub.com
2020-06-26 09:04:49 +08:00
b35c4ace6a Add .whitesource configuration file 2020-06-26 01:02:01 +00:00
31fa79472a Replace Greenkeeper's badge by Snyk's badge 2020-06-25 13:42:51 +09:30
9938055638 Merge pull request #898 from GNS3/snyk-fix-456c9ae5252b41ddd3db2dcc687a93bd
[Snyk] Security upgrade psutil from 5.6.6 to 5.6.7
2020-06-24 20:56:36 +08:00
f4dde0ecae fix: scripts/requirements.txt to reduce vulnerabilities
The following vulnerabilities are fixed by pinning transitive dependencies:
- https://snyk.io/vuln/SNYK-PYTHON-PSUTIL-483082
2020-06-24 12:34:46 +00:00
62e866273b Removing raven dependencies 2020-06-24 12:57:02 +02:00
3e2c537a6d message for system status page 2020-06-24 11:49:29 +02:00
1658845022 Update status-chart.component.scss 2020-06-24 10:32:56 +02:00
e76527840b Upgrade sentry SDK 2020-06-23 16:56:53 +02:00
09fe6dbcbb Update new-template-dialog.component.html 2020-06-23 15:08:26 +02:00
92cfb2d94a Fix for importing appliances 2020-06-23 14:36:48 +02:00
206242dba9 Update link.service.ts 2020-06-23 12:16:28 +02:00
c78517c22e Update status page 2020-06-23 12:11:28 +02:00
91cfd1d257 Link to preferences 2020-06-22 20:19:23 +02:00
7b1c5deff5 Refreshing list of templates 2020-06-22 18:15:50 +02:00
fc6a5671fb Update new-template-dialog.component.ts 2020-06-22 15:27:09 +02:00
b0c331d054 Support for IOU appliances 2020-06-22 15:25:02 +02:00
d07fad3c79 Update new-template-dialog.component.html 2020-06-22 14:35:35 +02:00
c0b9311b38 Fix for IOS appliances 2020-06-22 14:13:25 +02:00
41e7f1c53e Fix for docker templates 2020-06-22 11:36:21 +02:00
e7dfa6242b Update new-template-dialog.component.ts 2020-06-19 11:47:35 +02:00
3c47cbcb1b Update new-template-dialog.component.html 2020-06-18 19:20:26 +02:00
671b2d9d37 Merge pull request #884 from GNS3/Create-templates-from-appliances
Create templates from appliances
2020-06-18 17:43:21 +02:00
df8f39e951 Fix for importing images 2020-06-18 17:27:52 +02:00
7a62a7589a Settings for appliances added 2020-06-18 17:12:39 +02:00
b8e2bb00ac Option to upload image for appliance added 2020-06-18 16:50:31 +02:00
300e710341 Settings for appliances added 2020-06-18 15:01:35 +02:00
67754192ea Info dialog updated 2020-06-18 10:08:21 +02:00
c415011f34 Update d3-map.component.ts 2020-06-18 09:45:31 +02:00
561226f31b Merge branch 'master' into Create-templates-from-appliances 2020-06-17 17:40:01 +02:00
c7dc56babd Fix for drawing grid 2020-06-17 17:30:11 +02:00
1a8701d845 Fix for node grid 2020-06-17 17:17:51 +02:00
2fd1bb2358 Release 2020.2.0-beta.5 2020-06-17 15:45:26 +02:00
976d92a866 Update ReleaseNotes.txt 2020-06-17 15:44:37 +02:00
220bda22f5 Update node.service.ts 2020-06-17 13:49:05 +02:00
57490b7272 Update node.service.ts 2020-06-17 11:56:52 +02:00
6d0f41714a Update web-console-full-window.component.ts 2020-06-17 11:17:27 +02:00
e853849cc9 code cleaned up 2020-06-17 10:55:39 +02:00
0f4890fd10 Update project-map.component.ts 2020-06-17 10:12:59 +02:00
edb7aefba2 Fix for Chrome browser in private mode 2020-06-16 19:16:18 +02:00
71415dac8f info dialog for appiances 2020-06-16 14:09:09 +02:00
15505b9b8c update for template dialog 2020-06-15 14:29:07 +02:00
66bbe2cd11 Update appliances.service.ts 2020-06-15 12:33:37 +02:00
b3109a8cc5 Merge branch 'master' into Create-templates-from-appliances 2020-06-15 12:21:30 +02:00
41f5af2b90 Merge pull request #889 from GNS3/Strange-behavior-with-Firefox
Strange behavior with firefox
2020-06-15 12:18:42 +02:00
a7f5a5fa09 Fix for auto_close 2020-06-15 10:39:22 +02:00
7248a0f183 Code cleaned up 2020-06-12 16:08:12 +02:00
53b4e064ee Updating server service 2020-06-12 15:44:04 +02:00
5f52f25da4 Update server.service.ts 2020-06-12 14:28:53 +02:00
84212c0c33 Update server.service.ts 2020-06-12 12:05:27 +02:00
d6808ba1d7 Updating mat-stepper for docker templates 2020-06-10 13:53:34 +02:00
d190765a99 Updating stepper for qemu nodes 2020-06-10 12:39:59 +02:00
68a13e293b Updating stepper for IOU devices 2020-06-10 11:41:40 +02:00
0463b8c3b8 Update add-ios-template.component.html 2020-06-10 11:18:20 +02:00
da5dcd5fe9 Update add-docker-template.component.ts 2020-06-10 10:33:14 +02:00
f06ba2bf77 Update template-mocks.service.ts 2020-06-10 10:14:33 +02:00
06e3befe0e Update project-map.component.ts 2020-06-09 17:55:35 +02:00
932c482855 Dialog for changing hostname added 2020-06-09 17:21:13 +02:00
bf292b4286 Update toaster-error-handler.ts 2020-06-09 13:17:37 +02:00
7fa49824c6 Update node.ts 2020-06-09 12:34:14 +02:00
2b380a2699 replicate_network_connection_state added to qemu configurator 2020-06-08 16:05:59 +02:00
eb9102769c Fix for chid.value is undefined 2020-06-08 11:58:11 +02:00
672d25132f Update node.ts 2020-06-05 02:32:53 +02:00
b8ded15ef7 Update project-map.component.ts 2020-06-04 03:02:17 +02:00
3a57e73192 Update symbols.component.html 2020-06-04 02:39:27 +02:00
38dc9ccced Release 2020.2.0-beta.4 2020-06-03 18:56:21 +02:00
f3b6b8393a Update ReleaseNotes.txt 2020-06-03 18:55:32 +02:00
de0454f420 Fix for platforms and adapters 2020-06-03 14:22:37 +02:00
6bf268b47f Fix for network addapters c7200, c3725, c3745, c2691 2020-06-03 12:49:05 +02:00
7625ff5cfa Update add-docker-template.component.ts 2020-06-02 18:08:25 +02:00
455a13b96f Default values in templates 2020-06-02 17:29:14 +02:00
25b1edd178 Option to upload appliance added 2020-06-02 03:15:45 +02:00
d15b4db9fe Filter option added 2020-05-29 01:37:30 +02:00
d5e0c8271b Update new-template-dialog.component.ts 2020-05-28 13:22:57 +02:00
b37b5c7134 Appliance table added 2020-05-28 03:19:59 +02:00
4992eae284 Creating appliance service 2020-05-22 17:49:21 +02:00
0cee6188fb Change sentence "on your local computer" to "locally" 2020-05-20 15:42:14 +09:30
1ed8123082 Change title to "IOU device templates" 2020-05-20 15:27:03 +09:30
424799a54d Change title to "IOS router templates" 2020-05-20 15:26:26 +09:30
5a314f2631 Merge pull request #864 from GNS3/greenkeeper/@sentry/cli-1.53.0
Update @sentry/cli to version 1.53.0
2020-05-18 21:46:40 +02:00
3adc53eda9 chore(package): update @sentry/cli to version 1.53.0 2020-05-18 18:43:26 +00:00
6fc059bd10 fix for docker templates 2020-05-15 23:46:36 +02:00
0e8f9326a3 Update adbutler.component.ts 2020-05-15 00:11:50 +02:00
9a2744bc64 Update add-docker-template.component.ts 2020-05-14 23:04:47 +02:00
d127986b03 Support for Qemu 2020-05-14 16:35:26 +02:00
9e5985c8c8 Update add-iou-template.component.html 2020-05-14 16:34:56 +02:00
5e2d3c6a87 Update add-iou-template.component.ts 2020-05-14 16:14:22 +02:00
482834594f Update add-iou-template.component.ts 2020-05-14 16:13:38 +02:00
3eda507229 Update toaster-error-handler.ts 2020-05-14 16:13:17 +02:00
2f3014fcf6 Support for IOU images 2020-05-12 15:21:18 +02:00
494055a5b5 Merge branch 'master' of https://github.com/GNS3/gns3-web-ui 2020-05-12 13:17:36 +02:00
9f58be90ea Update add-ios-template.component.ts 2020-05-12 13:17:32 +02:00
6f118413af Change "New IOS router" to "New IOS router template" 2020-05-12 11:53:51 +09:30
7a5437c29e Server type in template preferences 2020-05-08 17:02:13 +02:00
c684577c57 Server type in template preferences 2020-05-08 17:01:51 +02:00
afa9facb3a Update gns3vm.component.html 2020-05-08 14:52:46 +02:00
82891b248f Option to auto-hide menu toolbar on the left side 2020-05-07 18:09:43 +02:00
81b388a7fe New port setting for GNS3 VM preferences 2020-05-07 17:18:53 +02:00
cace01ce9a Release 2020.2.0-beta.3 2020-05-06 23:50:53 +02:00
02095ca359 Fix for node select interface 2020-05-06 23:40:33 +02:00
5e95cfdea1 Update add-ios-template.component.ts 2020-05-06 19:44:46 +02:00
449c8a97db roll back changes 2020-05-06 12:18:00 +02:00
f185762969 Update http-console-new-tab-action.component.ts 2020-05-06 11:16:31 +02:00
3f0772c352 Update bundled-server-finder.component.ts 2020-05-06 10:58:52 +02:00
79dee73590 Update template.component.ts 2020-05-06 10:03:45 +02:00
11e116f508 Release 2020.2.0-beta.2 2020-05-05 23:30:25 +02:00
5600364583 Update template.component.ts 2020-05-05 21:40:56 +02:00
e01c06a54e Update template.component.html 2020-05-05 18:19:06 +02:00
81b6eb32cf Update template.component.scss 2020-05-05 18:02:00 +02:00
53c57b069e Update project-map.component.html 2020-05-05 17:38:40 +02:00
626769aa61 Update web-console-full-window.component.ts 2020-05-05 17:05:12 +02:00
467cf2b1d8 Update ReleaseNotes.txt 2020-05-04 18:51:44 +02:00
1fd926593a Update ReleaseNotes.txt 2020-05-04 18:50:18 +02:00
9595787e59 Merge pull request #832 from GNS3/Drag-&-drop-to-add-new-nodes
Initial implementation of drag & drop to add new node
2020-05-04 18:19:20 +02:00
9b482837d8 Menu height extended 2020-05-04 18:05:39 +02:00
fe51a1797d List restyled 2020-05-04 16:36:14 +02:00
6b6ac2f312 Calculating node position updated 2020-05-04 12:35:44 +02:00
8da4407109 CanDeactivate project map component when console is open 2020-05-02 20:26:42 +02:00
c3ebdd6498 Fix for console icons 2020-05-02 11:06:25 +02:00
c23892f836 Option to minimize added 2020-05-01 23:30:30 +02:00
9e2bc25c01 Fix for console widget 2020-04-30 16:33:20 +02:00
9594e397e5 Updating drop mechanism 2020-04-30 15:16:01 +02:00
a75de3b179 Update add-ios-template.component.ts 2020-04-29 17:34:26 +02:00
e78ca38f30 Possibility to manage network adapters added 2020-04-29 17:27:47 +02:00
57c9caa40f Update add-ios-template.component.html 2020-04-28 10:31:14 +02:00
b6d02ca5d4 Default settings for templates 2020-04-27 22:38:37 +02:00
18f7f350f7 Use node names in HTTP console tabs 2020-04-27 18:02:33 +02:00
72b6be6862 IOS service updated 2020-04-22 16:36:11 +02:00
1d0baa8857 Support for adding IOS images 2020-04-21 22:35:52 +02:00
d3d897c936 Update add-docker-template.component.html 2020-04-20 19:38:06 +02:00
01d49a7321 Initial implementation of drag & drop to add new node 2020-04-20 15:21:34 +02:00
6860efa2a6 Fix for symbols component 2020-04-19 00:24:55 +02:00
505c6152fb Update project-map.component.html 2020-04-17 13:12:31 +02:00
9a33b28576 Adding node dialog updated 2020-04-16 17:40:45 +02:00
b3aee79f40 Update toaster-error-handler.ts 2020-04-16 14:58:09 +02:00
ee784783a9 fix for creating ethernet switches and hubs 2020-04-16 13:49:20 +02:00
09a03ea013 Update configurator-cloud.component.ts 2020-04-16 13:10:42 +02:00
0bcc662d91 Update project-map.component.ts 2020-04-15 22:42:58 +02:00
0e4ea77d3f Update web-console-full-window.component.ts 2020-04-15 17:18:34 +02:00
71c1798152 Update web-console.component.ts 2020-04-15 17:12:05 +02:00
1199dedc23 Update mapsettings.service.ts 2020-04-15 11:57:04 +02:00
e85fb93923 Update project-map.component.html 2020-04-14 10:26:10 +02:00
ffefd65625 Upgrade psutil to version 5.6.6 2020-04-12 21:54:20 +09:30
10f7376030 Update configurator-qemu.component.ts 2020-04-10 14:35:44 +02:00
3f4bb0b172 Update notification-box.component.ts 2020-04-10 13:07:31 +02:00
33c35308f9 Update notification-box.component.ts 2020-04-10 11:06:00 +02:00
e7766ec708 Update project-map-guard.ts 2020-04-09 13:32:41 +02:00
1afbb39d85 Update project-map.component.ts 2020-04-09 12:14:46 +02:00
5c57135a80 Release 2020.2.0-beta.1 2020-04-07 14:29:16 +02:00
252bcf89d5 Update import-appliance.component.html 2020-04-07 14:25:07 +02:00
7279ca71ed Update context-menu.component.html 2020-04-03 18:47:12 +02:00
2b2511537b Update project-map.component.scss 2020-04-03 18:41:02 +02:00
e21602069e Update add-server-dialog.component.ts 2020-04-03 18:26:07 +02:00
24fffafbf1 Update screenshot-dialog.component.ts 2020-04-02 01:08:57 +02:00
f71af8c57c Update info-dialog.component.html 2020-04-01 23:54:15 +02:00
f722872a94 Fix for footer 2020-04-01 23:51:13 +02:00
b424abb600 Update web-console-full-window.component.ts 2020-04-01 18:35:05 +02:00
48dbd7f6aa Web console in new tab 2020-04-01 00:07:19 +02:00
2d8c5966cd Close button for console added 2020-03-30 18:40:55 +02:00
d16913a678 Merge pull request #768 from GNS3/HTML5-console-support
HTML5 console support
2020-03-30 17:50:57 +02:00
65f86ee4e4 Resizing disabled 2020-03-30 09:29:16 +02:00
7393fd52e1 Bug fixes 2020-03-28 19:28:31 +01:00
bb75727aaf Update yarn.lock 2020-03-28 09:35:05 -07:00
ee9fc3cb29 Update yarn.lock 2020-03-28 09:33:30 -07:00
2cd3b7a4d6 Update dependencies 2020-03-27 16:31:22 -07:00
7f16a6db1e Update yarn.lock 2020-03-27 22:38:38 +01:00
6e21cfeb4f Fix for style 2020-03-27 22:20:40 +01:00
2c3387c960 Update web-console.component.ts 2020-03-27 13:45:05 +01:00
a341d7c2ec Fix for tabs 2020-03-27 13:14:14 +01:00
43787e94e8 Resize evnt added 2020-03-26 22:53:29 +01:00
4402a53ae0 Fix for xtermjs 2020-03-26 21:18:22 +01:00
c33c6b8f36 Release 2020.1.0-alpha.1 2020-03-24 23:32:07 +01:00
4fc87c4cda Initial implementation 2020-03-23 01:26:52 +01:00
34059da0f6 Show interface availability 2020-03-18 16:13:14 +01:00
6a21b88a4a Fix for unit tests 2020-03-18 14:11:43 +01:00
7ca696643f Merge branch 'master' of https://github.com/GNS3/gns3-web-ui 2020-03-18 11:07:15 +01:00
a0aa918016 Update topology-summary.component.spec.ts 2020-03-18 11:07:11 +01:00
0cad0ee459 Switch to circleci 2.1 configuration to enable pipelines 2020-03-18 17:41:16 +10:30
2b45f7a643 Extending error information 2020-03-17 17:45:01 +01:00
ae540777a4 Update symbols.component.scss 2020-03-17 14:37:07 +01:00
117e67ed33 Suffixes added 2020-03-17 14:01:57 +01:00
8b332a51f5 Update toaster.service.ts 2020-03-16 22:26:30 +01:00
1622d7d60a Update bring-to-front-action.component.ts 2020-03-16 17:43:31 +01:00
ac3335a33d Fix for 'back to project' error 2020-03-16 13:00:02 +01:00
b33eb4ce24 Updating topology summary widget 2020-03-09 13:52:26 +01:00
271807cd9a Update import-project-dialog.component.html 2020-03-09 09:35:36 +01:00
a83d2141f6 Update project-map.component.html 2020-03-06 18:11:10 +01:00
00ed82183c Update toaster.service.ts 2020-03-06 18:03:26 +01:00
6b5051d58b Update servers.component.ts 2020-03-06 17:57:57 +01:00
51805832c3 Update add-server-dialog.component.ts 2020-03-06 17:36:37 +01:00
f0aeb8df07 Update projects.component.html 2020-03-06 17:31:37 +01:00
f6f7ceb627 Updating node converters 2020-03-02 16:12:36 +01:00
c2c74f34ea Merge pull request #687 from GNS3/e2e
Introducing E2E tests in GNS3 Web UI
2020-03-02 10:33:02 +01:00
ea2f5e8801 Update package.json 2020-03-02 10:12:00 +01:00
e5f0bbb07c Merge branch 'master' into e2e 2020-03-02 09:57:16 +01:00
a0043660e8 Merge branch 'master' into e2e 2020-02-28 15:39:42 +01:00
541fc18811 Merge pull request #698 from GNS3/async-validators
Async validator for projects
2020-02-28 15:17:44 +01:00
487eda0dee Update add-blank-project-dialog.component.spec.ts 2020-02-28 15:17:09 +01:00
7598cfffcd Merge branch 'master' into async-validators 2020-02-28 14:44:22 +01:00
04a2cd543a Merge pull request #688 from GNS3/angular-resolvers
Introducing the Angular 8 Resolvers to Web UI to fetch data before navigating to the route
2020-02-28 14:30:13 +01:00
5c37f4dfa6 Merge branch 'master' into angular-resolvers 2020-02-28 14:27:52 +01:00
0148480d5b Merge branch 'master' into angular-resolvers 2020-02-28 14:11:32 +01:00
0d1739e63e Merge branch 'master' into e2e 2020-02-28 14:07:50 +01:00
cfdfebc2d4 Merge pull request #701 from GNS3/Route-guards-for-project-map-page
Route guards for project-map page
2020-02-28 14:06:41 +01:00
1950a675cc Merge branch 'master' into Route-guards-for-project-map-page 2020-02-28 14:04:20 +01:00
52880ddc3e Updating list when project removed 2020-02-28 14:02:00 +01:00
c996c1fe51 Update project-map-guard.ts 2020-02-28 13:24:34 +01:00
54c2af8896 Update project-map-guard.ts 2020-02-28 12:33:09 +01:00
851d006ef2 Updating e2e tests 2020-02-27 13:11:35 +01:00
53b3128c66 Update project-map.po.ts 2020-02-27 11:30:05 +01:00
8b2535c03d Merge branch 'master' into async-validators 2020-02-27 10:50:04 +01:00
7ddc75b2ff Merge pull request #696 from GNS3/Activating-text-editing-in-ngZone.runOutsideAngular-to-avoid-'refreshing-effect'
Activating text editing in ngZone.runOutsideAngular to avoid 'refresh effect'
2020-02-27 10:46:10 +01:00
b195bad841 Merge branch 'master' into Activating-text-editing-in-ngZone.runOutsideAngular-to-avoid-'refreshing-effect' 2020-02-27 10:44:54 +01:00
1df117ba60 Merge pull request #694 from GNS3/Handle-router-events-with-progress-service
Handle router events with progress service
2020-02-27 10:41:28 +01:00
5f448da7d3 Merge branch 'master' into Handle-router-events-with-progress-service 2020-02-27 10:39:51 +01:00
5abbbcdb65 Update app.component.spec.ts 2020-02-27 10:39:01 +01:00
f9938db312 Merge pull request #702 from GNS3/Basic-cache-for-some-of-the-services
Basic cache for some of the services
2020-02-27 10:14:41 +01:00
e69b4684e7 Update symbol.service.spec.ts 2020-02-27 10:08:53 +01:00
94f690bb2f Merge branch 'master' into Basic-cache-for-some-of-the-services 2020-02-27 08:51:21 +01:00
e6c9df863c Merge pull request #709 from GNS3/Node-information-dialog-improvements
Node information dialog improvements
2020-02-27 08:48:59 +01:00
ca3045d236 Merge branch 'master' into Node-information-dialog-improvements 2020-02-27 08:29:12 +01:00
cf60f1a046 E2E for project map page 2020-02-26 19:39:36 +01:00
2e82ed8ebf Merge branch 'master' into e2e 2020-02-26 17:21:33 +01:00
36a5596d33 Test for projects page added 2020-02-26 13:43:30 +01:00
6ac9c94922 Merge pull request #699 from GNS3/scrollPositionRestoration
Scroll position restoration
2020-02-25 15:11:33 +01:00
556f0f8ed5 Merge pull request #710 from GNS3/System-status-improvements
System status improvements
2020-02-25 15:10:38 +01:00
8fc1505a96 Merge pull request #708 from GNS3/Changes-with-add-node-dialog
Updating add node dialog
2020-02-25 15:10:04 +01:00
82d31b8f19 Merge pull request #704 from GNS3/Disable-click-outside-of-angular-material-dialog-area-to-close-the-dialog
Disable click outside of angular material dialog area to close the di…
2020-02-25 15:08:07 +01:00
b54fe1d9d1 Merge pull request #707 from GNS3/Dynamic-AdButler-component
Dynamic components
2020-02-25 15:06:54 +01:00
882bc94bb6 Merge pull request #703 from GNS3/New-disk-interface-and-NIC-models-for-Qemu-VMs
Update qemu-configuration.service.ts
2020-02-25 15:06:23 +01:00
adadf886ab Merge pull request #695 from GNS3/One-subscription-instead-of-many-subscriptions
One subscription instead of many subscriptions
2020-02-25 15:05:42 +01:00
135f37fa92 Merge pull request #692 from GNS3/remove-extended-ng-classes
Getters in code instead of extended ngClass in HTML files
2020-02-25 15:05:07 +01:00
3c722f3baa Merge pull request #690 from GNS3/angular-onpush
Introducing onPush strategy
2020-02-25 15:04:43 +01:00
cd111fde13 Merge pull request #697 from GNS3/Project-name-as-page-title
Project name as page title
2020-02-25 15:04:19 +01:00
7f1d91ff1e System status improvements 2020-02-24 15:46:21 +01:00
62e0d64bf7 Node information dialog improvements 2020-02-24 15:40:49 +01:00
c73a8ddf16 Updating add node dialog 2020-02-24 15:19:28 +01:00
f40b2c64c2 Update template-list-dialog.component.ts 2020-02-24 13:49:31 +01:00
0f542c3e3b Dynamic AdButler component 2020-02-24 11:55:23 +01:00
2396bef0cc Disable click outside of angular material dialog area to close the dialog 2020-02-20 12:17:36 +01:00
156096a948 Update qemu-configuration.service.ts 2020-02-20 09:58:16 +01:00
76d0f0d209 Basic cache for some of the services 2020-02-19 15:54:18 +01:00
0beff5f418 Route guards for project-map page 2020-02-19 11:23:18 +01:00
6413c2fdec Scroll position restoration 2020-02-17 15:53:41 +01:00
f7143b4d93 Async validator for projects 2020-02-17 15:02:25 +01:00
2e851cd6d2 Project name as page title 2020-02-17 11:48:25 +01:00
d8a8af306e Activating text editing in ngZone.runOutsideAngular to avoid 'refreshing effect' 2020-02-17 11:24:35 +01:00
a1476384e6 One subscription instead of many subscriptions 2020-02-14 15:40:06 +01:00
20a86eb6bf Handle router events with progress service 2020-02-14 11:55:00 +01:00
b28f224fdd Getters in code instead of extended ngClass in HTML files 2020-02-13 11:26:27 +01:00
4de4471d73 On push strategy for project map components 2020-02-11 17:16:47 +01:00
875c4f3152 Fix for unit tests 2020-02-10 14:52:54 +01:00
4d369eef30 server resolver for snapshots page 2020-02-10 13:43:48 +01:00
f5ee039510 server reolver for projects page 2020-02-10 11:52:39 +01:00
fce7241bb2 e2e 2020-02-07 16:52:12 +01:00
f744c02c44 e2e 2020-02-07 13:57:32 +01:00
e11281ddf6 Update node.ts 2020-01-27 17:37:24 +01:00
b134a7fecf Support for starting local server 2020-01-21 06:34:44 -08:00
f49cc1960c Option to open file explorer added 2020-01-21 12:06:26 +01:00
235483dba5 Merge pull request #669 from GNS3/System-status
Support for system status
2020-01-20 23:24:29 -08:00
4955245b9c Update status-info.component.ts 2020-01-20 17:38:40 +01:00
8175c47b6f Update status-info.component.ts 2020-01-20 17:23:00 +01:00
61cca78609 Memory data added 2020-01-20 17:16:07 +01:00
acc41aebe1 Update status-chart.component.ts 2020-01-20 16:54:57 +01:00
9835c5b4cc Circle progress added 2020-01-20 16:43:29 +01:00
eab9bca34a Merge pull request #668 from GNS3/During-adding-the-node-customer-is-able-to-change-the-server-where-node-should-be-located-at
Option to choose server type for node added
2020-01-20 04:02:06 -08:00
31cffedd93 Option to choose server type for node added 2020-01-20 10:34:07 +01:00
46f3b9f1f0 Merge pull request #653 from GNS3/Direct-links-to-servers-and-projects
Direct links to servers and projects
2020-01-16 05:18:04 -08:00
fd2599f4a1 Update edit-project-dialog.component.ts 2020-01-16 13:08:13 +01:00
0adaa88e6d Update adbutler.component.ts 2020-01-13 15:00:29 +01:00
7b94cb779a Update direct-link.component.ts 2020-01-07 06:38:07 -08:00
50c5701192 Basic implementation 2020-01-07 05:54:31 -08:00
2d2738024e Merge pull request #649 from GNS3/Integrate-Google-Analytics-in-Web-UI
Integrate Google Analytics in Web UI
2020-01-07 10:28:25 +01:00
11baa33169 GoogleAnalytics service added 2020-01-03 03:53:33 -08:00
939d6d4e0a Merge pull request #651 from GNS3/TypeError-n.source-is-undefined
Update interface-status.ts
2020-01-03 11:58:32 +01:00
50e2c02f93 Update interface-status.ts 2020-01-03 02:12:51 -08:00
85f3172111 Update index.html 2020-01-02 05:45:06 -08:00
67aaaa8b2a Update package.json 2019-12-30 05:19:19 -08:00
5c2b773d33 Release naming convention 2019-12-30 14:17:39 +01:00
3b452d746c Release 2019.2.0-alpha.11 2019-12-30 02:29:52 -08:00
492539460d Merge pull request #644 from GNS3/Updating-release-notes
Updating ReleaseNotes.txt
2019-12-30 11:22:36 +01:00
5cf1326d1e Update ReleaseNotes.txt 2019-12-30 02:20:20 -08:00
46dbd31ec1 Bump psutil version to 5.6.3 2019-12-24 03:38:12 +08:00
0820b835d7 Force Python 3.6.5 for building on macOS 2019-12-24 02:52:23 +08:00
a88fd0df76 Try to upgrade yarn before node 2019-12-24 01:52:43 +08:00
9b239ebc85 Merge pull request #639 from GNS3/GNS3---Importing-appliances-&-creating-templates-from-appliances
GNS3 - Importing appliances & creating templates from appliances
2019-12-23 13:16:37 +01:00
9a4bb93add Code cleaned up 2019-12-23 04:16:17 -08:00
58069d4962 Update import-appliance.component.ts 2019-12-23 04:08:54 -08:00
e965bc11e2 Update import-appliance.component.ts 2019-12-23 03:50:12 -08:00
60f3bd6f1e Update yarn.lock 2019-12-20 01:20:02 -08:00
a704d0dcd0 Creating templates added 2019-12-20 01:10:51 -08:00
b048c308d6 Importing appliances extracted to separated component 2019-12-17 07:12:25 -08:00
d60d906043 Test version 2019-12-09 15:59:02 +01:00
14fcf9466d Merge pull request #631 from GNS3/Wizard-with-option-to-configure-gns3vm-(electron-version)
GNS3 - Wizard with option to configure gns3vm (electron version)
2019-12-05 15:29:48 +01:00
fe29be8237 Unit tests updated 2019-12-05 15:28:13 +01:00
bbe19e0513 Dialog added to projects page 2019-12-05 14:53:23 +01:00
8f4b2c502f Merge pull request #626 from GNS3/white-theme
Light theme (white) support
2019-11-28 14:25:44 +01:00
f9af6e32be Saving theme in local storage 2019-11-28 05:25:07 -08:00
6870f707bf Fix for map view 2019-11-28 05:07:29 -08:00
80207eda36 White theme for web UI 2019-11-28 04:27:11 -08:00
999921bfe4 Fix for dialogs 2019-11-27 07:23:03 -08:00
0c8c09ef56 Light theme added for non-material components 2019-11-27 07:18:41 -08:00
919e5fb44b Theme for mat icons updated 2019-11-26 08:06:07 -08:00
49b669819d Update theme-light.scss 2019-11-26 06:02:06 -08:00
aefcc16b3a Update theme-light.scss 2019-11-26 05:32:02 -08:00
578038e792 Update default-layout.component.css 2019-11-26 04:49:44 -08:00
5b340507e5 Update default-layout.component.css 2019-11-26 03:44:19 -08:00
8b25b2fa08 Initial implementation 2019-11-26 02:39:24 -08:00
4c7bf86ff0 Merge pull request #609 from GNS3/greenkeeper/electron-7.1.2
Update electron to the latest version 🚀
2019-11-21 13:46:48 +01:00
e02311af57 Merge pull request #606 from GNS3/greenkeeper/yargs-15.0.2
Update yargs to the latest version 🚀
2019-11-21 13:46:28 +01:00
7062f4b874 Merge pull request #610 from GNS3/GNS3-VM-preferences
Support for GNS3 VM preferences
2019-11-20 14:47:41 +01:00
fbcebb9c2a Merge pull request #612 from GNS3/greenkeeper/@types/node-12.12.10
Greenkeeper/@types/node 12.12.10
2019-11-20 14:35:36 +01:00
5048f84e9c Merge pull request #611 from GNS3/greenkeeper/ngx-device-detector-1.3.18
Greenkeeper/ngx device detector 1.3.18
2019-11-20 14:34:48 +01:00
de3938d5e0 Support for managing GNS3 VM preferences enabled 2019-11-20 05:26:09 -08:00
95d0645506 Support for GNS3 VM preferences 2019-11-20 02:37:51 -08:00
abad187ea6 chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2019-11-20 02:58:03 +00:00
2d364c3636 chore(package): update electron to version 7.1.2 2019-11-20 02:53:16 +00:00
0782994340 chore(package): update lockfile yarn.lock 2019-11-19 23:28:46 +00:00
8aa4a52d34 chore(package): update ngx-device-detector to version 1.3.18 2019-11-19 23:28:42 +00:00
1f624e3957 chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2019-11-19 19:30:08 +00:00
b1b84efa61 chore(package): update @types/node to version 12.12.10 2019-11-19 19:25:10 +00:00
84efd2d2a9 chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2019-11-19 12:51:59 +00:00
12616a6519 fix(package): update yargs to version 15.0.2 2019-11-19 12:47:13 +00:00
d37d4ebac1 Merge pull request #603 from GNS3/Before-connection-to-the-server-we-need-to-check-minimal-supported-version
Before connection to the server we need to check minimal supported version
2019-11-19 11:10:53 +01:00
91fa54cf9b Before connection to the server we need to check minimal supported version 2019-11-19 02:01:20 -08:00
58a02c7066 Merge pull request #596 from GNS3/Improvements-for-adding-nodes
Improvements for adding nodes
2019-11-18 16:26:33 +01:00
f8c798340e Merge branch 'master' into Improvements-for-adding-nodes 2019-11-18 07:25:55 -08:00
f16be0b97b Merge pull request #597 from GNS3/Some-issues-with-projects-that-don't-exist
Some issues with projects that don't exist
2019-11-18 16:23:51 +01:00
9ade466b80 Merge branch 'master' into Some-issues-with-projects-that-don't-exist 2019-11-18 07:23:55 -08:00
4b1ee170df Merge pull request #599 from GNS3/Screenshot-SVG-image-issue
Screenshot SVG image issue
2019-11-18 16:22:53 +01:00
e982c6d4c7 Merge branch 'master' into Screenshot-SVG-image-issue 2019-11-18 07:22:47 -08:00
7eaabf0cc8 Merge pull request #602 from GNS3/Missing-import-config-in-node-contextual-menu
Missing import config in node contextual menu
2019-11-18 16:21:21 +01:00
ff5d79f38f Dialog for im porting private config added 2019-11-18 07:21:17 -08:00
8ca4eabe22 Dialog to choose config type to export 2019-11-18 05:47:44 -08:00
01d2fc2d43 Initial implementation added 2019-11-18 04:25:54 -08:00
5db7fbc461 Fix for unit tests 2019-11-15 04:36:56 -08:00
6986dccf6e Support for png files 2019-11-15 03:45:30 -08:00
ed9ca9ed03 Update adbutler.component.ts 2019-11-14 05:07:58 -08:00
fa59471dd8 Fix for open project error 2019-11-14 04:34:28 -08:00
1ff8f00397 Fix for navigation issue 2019-11-14 03:58:29 -08:00
f225de7467 Support for different names 2019-11-14 00:42:22 -08:00
b6d74c58cb Code cleaned up 2019-11-13 07:30:06 -08:00
ce97ba085d Initial implementation 2019-11-13 01:54:54 -08:00
a0cace9b62 Update projects.component.spec.ts 2019-11-06 05:36:48 -08:00
ffc3e02855 Close button added 2019-11-06 05:15:26 -08:00
47cc51a68d Option to close project from map menu added 2019-11-06 03:30:43 -08:00
fabfff2e8f Update node.ts 2019-11-06 02:47:31 -08:00
bc89f796a6 Merge pull request #577 from GNS3/Some-actions-should-be-allowed-when-selecting-multiple-nodes
Actions for group of nodes added
2019-11-05 13:47:09 +01:00
ed7d67f570 Actions for group of niodes added 2019-11-05 04:44:14 -08:00
1798aaf7dd Fix for routing 2019-11-05 02:24:19 -08:00
00cf8a29c7 Merge pull request #576 from GNS3/404-Not-found-page-support
404 Not found page support
2019-11-05 10:43:00 +01:00
0e04e9b021 Support for 404 2019-11-05 01:42:04 -08:00
e6e518b40f Merge pull request #575 from GNS3/Adbutler-error
Checking if ad is loaded correctly added
2019-11-05 09:43:17 +01:00
6f65063477 Checking if ad is loaded correctly added 2019-11-05 00:31:11 -08:00
1a531e5f6e Merge pull request #574 from GNS3/No-indicators-that-a-link-is-suspended
Support for suspended status added
2019-11-04 14:16:27 +01:00
c9c11d1031 Support for suspended status added 2019-11-04 05:14:05 -08:00
3132136020 Update package.json 2019-10-31 04:18:58 -07:00
67e6003f47 Release 2019.2.0-alpha.10 2019-10-31 03:52:22 -07:00
ae414c1f60 Update package.json 2019-10-31 02:53:47 -07:00
c5515ca832 Release 2019.2.0-alpha.9 2019-10-31 01:39:43 -07:00
97c5c4599f Merge pull request #564 from GNS3/release_branch
Updating release notes
2019-10-30 14:18:44 +01:00
a8731da525 Update ReleaseNotes.txt 2019-10-30 06:15:22 -07:00
349078a61c Update ReleaseNotes.txt 2019-10-30 05:37:10 -07:00
20b87dd330 Update config.yml 2019-10-30 02:32:49 -07:00
44ce03d354 Update config.yml 2019-10-30 02:28:04 -07:00
fb381370f5 Update config.yml 2019-10-30 02:24:43 -07:00
146543bc87 Update config.yml 2019-10-30 02:20:15 -07:00
43131547e5 Merge pull request #543 from GNS3/Widget-dragging
Topology summary widget & servers summary & console with option to drag
2019-10-29 10:12:33 +01:00
50b28596ae Dragging for console widget 2019-10-29 01:29:53 -07:00
3e8c21082b Solution ready for topology summary widget 2019-10-28 08:09:59 -07:00
cb71af1ea3 Dragging with resizing 2019-10-28 07:48:39 -07:00
6b327316b7 Merge pull request #555 from GNS3/Support-for-global-variables
Support for global variables
2019-10-28 12:52:54 +01:00
a6ed6660ca Update topology-summary.component.ts 2019-10-28 03:57:57 -07:00
d51f024a16 Support for global variables added 2019-10-28 03:39:36 -07:00
3447ac4b42 Merge branch 'master' into Widget-dragging 2019-10-28 01:20:20 -07:00
830e9edc60 Merge branch 'master' into Support-for-global-variables 2019-10-28 01:19:22 -07:00
e80aec68fe Fix for unit tests 2019-10-28 01:12:20 -07:00
2d588c411d Merge pull request #530 from GNS3/Fit-in-view-option
Option to fit in view
2019-10-25 14:29:56 +02:00
0c788b9898 Code cleaned up 2019-10-25 05:19:30 -07:00
1762c118b6 Merge branch 'master' into Support-for-global-variables 2019-10-25 04:23:34 -07:00
3a10302a9b Merge branch 'master' into Widget-dragging 2019-10-25 04:22:39 -07:00
92b9163bf3 Merge branch 'master' into Fit-in-view-option 2019-10-25 04:22:19 -07:00
8e97a71696 Code cleaned up 2019-10-25 04:22:02 -07:00
3e54df0b79 Merge pull request #553 from GNS3/Snap-to-grid
Snap to grid
2019-10-25 10:48:56 +02:00
0dbede58f2 Merge pull request #552 from GNS3/Option-to-show-the-grid
Option to show the grid
2019-10-25 10:48:31 +02:00
0bffe1b0b0 Merge pull request #547 from GNS3/Usage-instructions-should-be-available-from-context-menu
Usage instructions for nodes
2019-10-25 10:47:58 +02:00
98f93901ec Initial implementaion - global variables 2019-10-25 00:43:13 -07:00
ceda238507 Fix for unit tests 2019-10-24 23:27:15 -07:00
6274c90a33 Button added 2019-10-24 08:10:03 -07:00
b372493e51 Snap to grid for drawings 2019-10-24 08:05:50 -07:00
6b804fa525 Snap to grid for nodes applied 2019-10-24 07:34:01 -07:00
2f1d6d80d5 Option to show grid available from menu 2019-10-24 05:11:26 -07:00
128953b0fe Initial implementation 2019-10-24 03:02:32 -07:00
97aa9d7413 Usage instructions added 2019-10-23 05:39:03 -07:00
cb7ec182d3 Merge branch 'master' into Fit-in-view-option 2019-10-23 04:40:09 -07:00
adb65dc50c Merge branch 'master' into Widget-dragging 2019-10-23 04:39:42 -07:00
6d81bd4a0b Merge pull request #542 from GNS3/Widget-resizing
Topology summary widget & servers summary & console widget with option to resize
2019-10-23 13:35:12 +02:00
9a6bcad71c Merge branch 'master' into Widget-dragging 2019-10-23 04:33:50 -07:00
9c49236f1c Merge branch 'master' into Widget-resizing 2019-10-23 04:31:35 -07:00
6880c993ab Merge pull request #535 from GNS3/Support-for-layers
Support for layers
2019-10-23 13:22:38 +02:00
9674f20941 Merge pull request #534 from GNS3/update-dependencies
Updating dependencies
2019-10-23 13:10:57 +02:00
d32e3f6b7f Merge pull request #540 from GNS3/Context-menu-for-inserted-drawings
Context menu for inserted drawings
2019-10-23 12:47:32 +02:00
1db8157f1a Toggle button added 2019-10-23 03:00:40 -07:00
e7973839c7 Update config.yml 2019-10-23 02:17:24 -07:00
df125f87b2 Update config.yml 2019-10-23 02:09:55 -07:00
b3f9a61d60 Update config.yml 2019-10-23 02:08:32 -07:00
949dcb0fc1 Merge branch 'master' into Widget-dragging 2019-10-23 01:30:49 -07:00
f7a9b78833 Merge branch 'master' into Widget-resizing 2019-10-23 01:30:35 -07:00
1703075b63 Merge branch 'master' into Context-menu-for-inserted-drawings 2019-10-23 01:30:18 -07:00
fc21c0717f Merge branch 'master' into Support-for-layers 2019-10-23 01:29:59 -07:00
01f90433b0 Merge branch 'master' into update-dependencies 2019-10-23 01:29:36 -07:00
3051368ee7 Merge branch 'master' into Fit-in-view-option 2019-10-23 01:28:52 -07:00
052eab0367 Merge pull request #533 from GNS3/Show-errors-&-warnings-as-notifications
Show errors & warnings as notifications
2019-10-23 10:26:32 +02:00
761e1a62ce Another approach for topology summary widget 2019-10-22 07:06:02 -07:00
b17fcd251b Ability to drag widgets added 2019-10-22 06:15:53 -07:00
3d3983926b Log console with option to resize 2019-10-22 04:57:13 -07:00
0659bf01fe Resizing topology & servers summary applied 2019-10-22 02:42:32 -07:00
3f1257cfe9 Initial implementation 2019-10-22 01:09:38 -07:00
31d7719fee Context menu for inserted drawings 2019-10-21 07:03:37 -07:00
bea4d4f296 Update drawing.ts 2019-10-21 06:05:33 -07:00
87454fd7ed Layers for nodes added 2019-10-17 07:35:22 -07:00
3ac5bf879a Update package.json 2019-10-17 05:31:55 -07:00
8e8d5a46a5 Update package.json 2019-10-17 05:15:46 -07:00
85b60f390d Update package.json 2019-10-17 05:08:55 -07:00
c01ad75457 Update node.ts 2019-10-17 04:16:04 -07:00
a60595c299 Merge branch 'master' into Show-errors-&-warnings-as-notifications 2019-10-17 01:49:41 -07:00
eac1662294 Merge branch 'master' into Fit-in-view-option 2019-10-17 01:49:23 -07:00
7576b1c81c Update project-map.component.ts 2019-10-16 08:19:00 -07:00
18b037ef04 Merge pull request #502 from GNS3/greenkeeper/xterm-4.0.0
Update xterm to the latest version 🚀
2019-10-16 16:12:26 +02:00
623ff89f1a Notifications added 2019-10-16 06:58:59 -07:00
b8d607b7c6 Update project-map.component.ts 2019-10-16 05:07:43 -07:00
2981d6eafe Update project-map.component.ts 2019-10-11 05:55:05 -07:00
ebd2614b84 Initial implementation 2019-10-11 04:02:13 -07:00
3cb517743c Merge pull request #446 from GNS3/custom-html-adbutler-ads
AdButler - custom HTML ad
2019-10-11 08:35:22 +02:00
59778da856 Merge pull request #528 from GNS3/Disabling-experimental-features
Disabling experimental features
2019-10-11 08:33:07 +02:00
8def343892 Disabling experimental features 2019-10-10 06:55:19 -07:00
8233985136 Update notification-box.component.ts 2019-10-10 06:03:28 -07:00
d756ce9b87 Merge branch 'master' into custom-html-adbutler-ads 2019-10-10 05:44:00 -07:00
63987f5df8 Update log-console.component.ts 2019-10-09 08:10:28 -07:00
efdf98b869 Update project-map-menu.component.spec.ts 2019-10-09 00:40:25 -07:00
37c491acc6 Merge pull request #521 from GNS3/screenshots
Fix for screenshots
2019-10-08 14:55:13 +02:00
4a180adda9 Update screenshot-dialog.component.html 2019-10-08 05:54:35 -07:00
b0b2c0718e Dialog for screenshots introduced 2019-10-08 05:21:35 -07:00
e4d977fe15 Merge branch 'master' into screenshots 2019-10-08 00:59:52 -07:00
3afcac3963 Merge pull request #524 from GNS3/node_configs
Support for editing config files - IOU & routers
2019-10-08 09:23:44 +02:00
864bb84270 Update export-config-action.component.ts 2019-10-08 00:21:02 -07:00
70f7c54de0 Unit tests updated 2019-10-07 23:42:36 -07:00
0d89b7df11 Support for editing config files - IOU & routers 2019-10-04 06:27:34 -07:00
70c9b98c3f Merge pull request #523 from GNS3/WebUI-starts-at-0,0-position
Option to center view added
2019-10-04 12:51:27 +02:00
ff5f8eddc3 Option to center view added 2019-10-04 03:45:34 -07:00
14581d0d5f Merge branch 'master' of https://github.com/GNS3/gns3-web-ui 2019-10-04 01:22:06 -07:00
5e76902934 Update nodes-menu.component.ts 2019-10-04 01:21:51 -07:00
725c387bdd Merge pull request #522 from GNS3/View-options-(like-show-interface-labels,-etc.)-should-be-taken-from-configuration-file
View options (like show interface labels, etc.) should be taken from configuration file
2019-10-04 10:16:53 +02:00
e7ac895b85 Editing projects updated 2019-10-04 01:15:46 -07:00
fb148ff534 Update project-map-menu.component.spec.ts 2019-10-04 00:34:40 -07:00
077c94f567 Update project-map-menu.component.ts 2019-10-03 08:31:39 -07:00
20413c6d8a Merge pull request #520 from GNS3/GNS3---After-importing/adding-new-project-we-should-ask-user-if-we-should-navigate-to-the-map-page
After importing new project we should ask user if we should navigate to the map page
2019-10-03 16:53:23 +02:00
1a7be375a9 Unit tests updated 2019-10-03 07:52:48 -07:00
41c67ae6ec Bottom sheet for imported projects 2019-10-03 07:16:57 -07:00
0ab0e7712e Merge pull request #519 from GNS3/WebUI-Cannot-read-property-'forEach'-of-undefined
Web ui cannot read property 'for each' of undefined
2019-10-03 13:48:35 +02:00
ce8574d64b Update node-to-map-node-converter.ts 2019-10-03 04:15:30 -07:00
02be6b2449 Bug fixed 2019-10-03 02:56:12 -07:00
42f1f8b49a Update lock-action.component.ts 2019-10-02 07:07:52 -07:00
6cf670d5cf Merge pull request #516 from GNS3/Ability-to-lock-single-item-on-map
Ability to lock single item on map
2019-10-02 15:43:41 +02:00
c2263336a9 Solution with svg crowbar library 2019-10-02 06:14:51 -07:00
26fed4cabb Another approach for map screenshots 2019-10-02 04:29:32 -07:00
45653036f9 Fix for #515 2019-10-01 06:14:35 -07:00
4d5ac71f0b Fix for #514 2019-10-01 01:24:26 -07:00
dfa25d7b94 Fix for 512 2019-09-30 06:44:19 -07:00
a242c1c66f Unit tests fixed 2019-09-30 05:53:30 -07:00
8764a417d3 Action available from context menu 2019-09-30 04:48:01 -07:00
35ade675df Merge pull request #511 from GNS3/package-updating
Package updating
2019-09-28 16:05:17 +02:00
5a82f982a9 Update import-project-dialog.component.spec.ts 2019-09-27 05:26:54 -07:00
f92894d4c2 Tests updated 2019-09-27 04:56:21 -07:00
4bb9b98154 Update package.json 2019-09-27 03:02:44 -07:00
c94c12c27a Update package.json 2019-09-27 00:09:24 -07:00
ac53a8d936 Release 2019.2.0-alpha.8 2019-09-26 23:43:47 -07:00
088a6c4399 Update .appveyor.yml 2019-09-26 13:18:52 -07:00
c1c679593e Fix for appveyor 2019-09-26 13:16:43 -07:00
bb11e88f13 Merge pull request #508 from GNS3/winpcap-support
User should have possibility to start capture in WebUI (branch from node configurator to avoid conflicts) & console connect to all nodes
2019-09-25 14:23:32 +02:00
5d8d2a3c2b Build command updated 2019-09-25 05:23:10 -07:00
68453092b2 Update .appveyor.yml 2019-09-25 04:57:25 -07:00
98c079175f Unit tests added 2019-09-25 04:37:25 -07:00
d594fc0a36 Merge branch 'master' into winpcap-support 2019-09-25 02:57:19 -07:00
eba1e07a0f Update topology-summary.component.spec.ts 2019-09-25 02:52:12 -07:00
1b4d4d2837 Filters on topology summary added 2019-09-25 02:41:34 -07:00
258623f62e Merge pull request #507 from GNS3/User-should-have-option-to-choose-name-for-exporting-project
User should have option to choose name for duplicated project (branch from node configurator to avoid conflicts)
2019-09-25 11:15:24 +02:00
5aedd2758d Merge pull request #505 from GNS3/custom-console-for-particular-node
Custom console for particular node (branch from node configurator to avoid conflicts)
2019-09-25 10:01:34 +02:00
170560e5f7 Merge branch 'master' into winpcap-support 2019-09-25 00:27:00 -07:00
2d227bc05b Merge branch 'master' into User-should-have-option-to-choose-name-for-exporting-project 2019-09-25 00:26:34 -07:00
c80a052e55 Merge branch 'master' into custom-console-for-particular-node 2019-09-25 00:17:48 -07:00
e513d7145e Update .appveyor.yml 2019-09-25 00:17:10 -07:00
a75acc3747 Adding filters on topology summary 2019-09-24 23:58:41 -07:00
b55d5ff59f Merge pull request #504 from GNS3/node-configurator
Configurators for nodes & template preferences for TraceNG & Qemu image creator
2019-09-25 08:42:29 +02:00
5832d3f36e Console connect to all nodes added 2019-09-24 07:12:26 -07:00
03b88da9f6 Merge branch 'custom-console-for-particular-node' into winpcap-support 2019-09-24 05:48:13 -07:00
abad45814a Update start-capture.component.spec.ts 2019-09-24 05:12:09 -07:00
53b85fa57f Update context-menu.component.html 2019-09-24 04:14:57 -07:00
679a0d02bb Support for starting wireshark 2019-09-24 04:14:44 -07:00
a989a88dbb Support for packet capture 2019-09-24 02:10:03 -07:00
cdbf2e4eb2 Unit tests updated 2019-09-23 06:08:42 -07:00
544e77d82e Option to choose project name added 2019-09-23 04:51:49 -07:00
716ca9d47f Merge branch 'master' into node-configurator 2019-09-23 02:26:10 -07:00
f678a6cdd7 Merge branch 'master' into custom-console-for-particular-node 2019-09-23 02:25:51 -07:00
d893c54362 Update .appveyor.yml 2019-09-23 02:25:37 -07:00
46b5a136d9 Update .appveyor.yml 2019-09-23 02:05:26 -07:00
1dddc2462c Merge branch 'master' into custom-console-for-particular-node 2019-09-23 01:01:08 -07:00
d0445daa75 Merge branch 'master' into node-configurator 2019-09-23 01:00:47 -07:00
f6c1454cfc Update .appveyor.yml 2019-09-23 00:44:58 -07:00
8c375da67c Update .appveyor.yml 2019-09-23 00:37:06 -07:00
6ac5a40009 Update .appveyor.yml 2019-09-23 00:29:53 -07:00
380a45883e Custom console for particular node 2019-09-20 07:01:28 -07:00
78767399fc Qemu configurator extended 2019-09-20 03:19:55 -07:00
041b9bc271 Qemu image configurator added 2019-09-19 08:30:48 -07:00
074b1d840e Support for managing traceng templates added 2019-09-18 05:37:51 -07:00
5ec9e0134a Configurator for traceng added 2019-09-18 03:00:53 -07:00
02fc46567b Configurator for nat added 2019-09-18 01:47:24 -07:00
c8a2067847 Configurator for docker added 2019-09-18 01:07:24 -07:00
125706dd7b Dialog for IOS added 2019-09-17 06:27:34 -07:00
6f92207847 Configurator for IOU added 2019-09-17 04:15:50 -07:00
c1099b22bb Update configurator-vmware.component.html 2019-09-17 01:58:48 -07:00
94f179c74f Temporary fix for qemu template details page 2019-09-17 01:53:30 -07:00
fb06398517 Configurator for VMware added 2019-09-17 00:57:06 -07:00
75bf2ef3de Support for ATM switch added 2019-09-16 04:00:05 -07:00
83558d0d4e Support for frame-relay-switch added 2019-09-16 02:35:10 -07:00
a50209455c Dialog for cloud added 2019-09-13 07:29:59 -07:00
9800e3ea4c Component fpor udp tunnels added 2019-09-13 06:29:34 -07:00
aea8010e0a Configurator for switch 2019-09-12 07:55:17 -07:00
36a8387ea2 Update node.service.ts 2019-09-12 04:28:31 -07:00
4b90568b7b Configurator for qemu 2019-09-12 04:26:00 -07:00
8fe6a3d517 Basic implementation for qemu 2019-09-11 08:11:43 -07:00
41707d6724 Update custom-adapters.component.spec.ts 2019-09-11 05:45:58 -07:00
35c96d1c90 Code cleaned up 2019-09-11 05:40:23 -07:00
e904454623 Fix for virtualbox 2019-09-11 04:58:45 -07:00
838359b4ac Code cleaned up 2019-09-11 04:33:42 -07:00
eaf74aa878 chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2019-09-11 00:20:07 +00:00
b1480670e1 fix(package): update xterm to version 4.0.0 2019-09-11 00:15:42 +00:00
24ab40bfa9 Support for virtualbox 2019-09-10 06:55:58 -07:00
9ab7616d89 Fix for configurator name 2019-09-10 04:07:08 -07:00
32dc9e3c07 Update ethernet-switches-template-details.component.spec.ts 2019-09-10 03:57:46 -07:00
bdf8e89dfa Support for ethernet switches 2019-09-10 03:05:54 -07:00
0fe44b2235 Dialog for ethernet hubs added 2019-09-09 09:33:10 -07:00
96e297ff6a Validation added 2019-09-09 08:56:14 -07:00
ecce86aaf7 Dialog for VPCS added 2019-09-09 06:57:42 -07:00
5e76feca5c Action to suspend added 2019-09-09 02:27:48 -07:00
cd5edebd98 Reload action added 2019-09-06 08:51:13 -07:00
00597accac Option to show interface labels should be saved for opened project 2019-09-06 08:18:26 -07:00
03dbac5aba Console updated 2019-09-06 06:18:03 -07:00
92d0908327 Servers summary added 2019-09-06 05:05:57 -07:00
9344174e89 Update projects.component.spec.ts 2019-09-05 05:48:04 -07:00
f07353943c Filtering for projects added 2019-09-05 05:32:34 -07:00
903448f102 Dialog for editing project properties added 2019-09-05 02:27:56 -07:00
7450dd6731 Ability to change symbol by context menu added 2019-09-04 05:14:29 -07:00
df8e5825cc Update save-project-dialog.component.ts 2019-09-04 02:03:16 -07:00
5b2eaefc01 Merge pull request #498 from GNS3/Support-for-editing-config-files
Ability to add custom symbols
2019-09-03 19:43:25 +02:00
6bca43563d Filtering symbols added 2019-09-03 10:42:16 -07:00
2fe8cc72aa Importing symbols added 2019-09-03 08:22:55 -07:00
675bb04b6c Merge pull request #472 from GNS3/Support-for-editing-config-files
Support for editing config files - VPCS
2019-09-03 10:12:18 +02:00
a879aab519 Merge branch 'master' into Support-for-editing-config-files 2019-09-02 07:10:05 -07:00
e89a8c79f2 Update log-console.component.ts 2019-09-02 07:08:08 -07:00
2fca17376a Merge branch 'master' into Support-for-editing-config-files 2019-09-02 06:16:21 -07:00
506394336b Merge pull request #495 from GNS3/screenshot-of-map
Ability to take screenshot of map
2019-09-02 15:11:05 +02:00
a1dcf6b8b3 Merge pull request #478 from GNS3/List-of-debug-events
Console with log events
2019-09-02 15:04:08 +02:00
998889b721 Merge pull request #496 from GNS3/Web-console-support
Support for default telnet console - basic implementation as agreed
2019-09-02 14:44:53 +02:00
4d2d7f6180 Code cleaned up 2019-09-02 05:43:36 -07:00
a146dfcb40 Export config added 2019-09-02 01:24:12 -07:00
9d9481e983 Merge branch 'master' into Support-for-editing-config-files 2019-08-30 05:41:05 -07:00
b4eff2361f Support for default telnet console added 2019-08-30 04:59:08 -07:00
583be8032a Update package.json 2019-08-30 00:41:05 -07:00
f7b113f813 Release 2019.2.0-alpha.7 2019-08-29 08:23:19 -07:00
b25cfa229c Bug fixing 2019-08-29 08:07:08 -07:00
63bcd6f4b2 Overriding wrong styles 2019-08-29 05:50:51 -07:00
c4959b97da Release notes updated 2019-08-29 03:52:30 -07:00
f257992ffc Console log component modified 2019-08-28 07:43:49 -07:00
aef6d044b3 exchnaging filter to mat menu 2019-08-28 07:04:17 -07:00
94240ee783 Code cleaned up 2019-08-28 04:19:20 -07:00
eca520073b Update project-map-menu.component.ts 2019-08-28 03:59:48 -07:00
26bc2df064 Update project-map-menu.component.ts 2019-08-28 02:03:17 -07:00
c2d40943ee Test implementation 2019-08-28 01:08:37 -07:00
69934fb870 Support for log events added 2019-08-26 08:16:36 -07:00
40ef11edbe Update log-console.component.spec.ts 2019-08-26 06:48:43 -07:00
801b3ebfac Introducing filters 2019-08-26 05:17:50 -07:00
fee26eff87 Requests to server visible in console 2019-08-22 05:26:48 -07:00
fc746f04cb Merge branch 'master' into List-of-debug-events 2019-08-22 03:02:13 -07:00
e181be93c2 Merge pull request #493 from GNS3/Export/import-project
Update import-project-dialog.component.spec.ts
2019-08-22 11:42:15 +02:00
a25f71c523 Merge pull request #483 from GNS3/Export/import-project
Import/export option available from map menu
2019-08-22 11:41:24 +02:00
44c924b654 Update import-project-dialog.component.spec.ts 2019-08-22 01:50:58 -07:00
8ad744213b Review fixes 2019-08-22 00:32:28 -07:00
c2d5e6fd08 Merge branch 'master' into Export/import-project 2019-08-21 23:48:18 -07:00
554944fb51 Merge branch 'master' into List-of-debug-events 2019-08-21 07:37:11 -07:00
9eca05016c Merge branch 'master' into Export/import-project 2019-08-21 07:34:00 -07:00
92ae767a6f Merge pull request #491 from GNS3/Topology-summary---prototype
Topology summary
2019-08-21 16:24:42 +02:00
37aa6191ab Code cleaned up 2019-08-21 06:32:44 -07:00
b515f53b24 Merge branch 'master' into Topology-summary---prototype 2019-08-21 05:15:43 -07:00
22820f6320 Unit tests for filtering & sorting nodes on topology summary added 2019-08-21 05:02:47 -07:00
d8e1486692 Merge pull request #481 from GNS3/Show-node-information-by-context-menu
Show node information by context menu
2019-08-21 11:35:23 +02:00
f3bfcebcf6 Merge pull request #476 from GNS3/Changing-scrollbar-style-to-modern-look
Changing scrollbar style to modern look
2019-08-21 11:28:54 +02:00
b9a2879f60 Merge branch 'master' into Topology-summary---prototype 2019-08-21 00:14:45 -07:00
cfef46e25c Update log-console.component.spec.ts 2019-08-21 00:13:44 -07:00
43e87307ba Update project-map-component 2019-08-20 06:52:13 -07:00
6f62f4171d Update project-map.component.ts 2019-08-20 06:20:03 -07:00
032a700040 Merge branch 'master' into Export/import-project 2019-08-20 06:09:01 -07:00
25588f5953 Merge pull request #485 from GNS3/Action-to-duplicate-project-should-be-available-on-projects-page
Action to duplicate project should be available on projects page
2019-08-20 14:56:06 +02:00
8163b4d709 Unit tests added 2019-08-20 05:49:54 -07:00
af4ef62132 Merge branch 'master' into Action-to-duplicate-project-should-be-available-on-projects-page 2019-08-20 05:06:26 -07:00
73bbc12d84 Merge branch 'master' into Topology-summary---prototype 2019-08-20 04:56:54 -07:00
6be70591c9 Merge branch 'master' into List-of-debug-events 2019-08-20 04:52:22 -07:00
0524099dce Update info-dialog-component 2019-08-20 04:44:14 -07:00
72998d87e2 Merge branch 'master' into Changing-scrollbar-style-to-modern-look 2019-08-20 03:40:15 -07:00
672c6577e2 Merge branch 'master' into Show-node-information-by-context-menu 2019-08-20 03:30:03 -07:00
12f31987d4 Merge branch 'master' into Export/import-project 2019-08-20 02:21:54 -07:00
ef0803a94a Merge branch 'master' into Export/import-project 2019-08-20 02:16:48 -07:00
3cc062f457 Merge pull request #479 from GNS3/User-has-ability-to-delete-project-in-the-opened-project
User has ability to delete project in the opened project
2019-08-20 11:05:05 +02:00
3e96766daa Merge branch 'master' into User-has-ability-to-delete-project-in-the-opened-project 2019-08-20 01:59:38 -07:00
ded882a7bc Merge pull request #473 from GNS3/Keyboard-shortcuts-support
Keyboard shortcuts added
2019-08-20 10:40:55 +02:00
479a9e1df9 Merge pull request #488 from GNS3/Action-'bring-to-front'-should-be-available-from-context-menu
Action 'bring to front' should be available from context menu
2019-08-20 10:27:22 +02:00
3da59f20e0 Update log console component 2019-08-19 01:34:29 -07:00
51ef91f8d3 Update topology summary component 2019-08-19 00:59:04 -07:00
909e197b9a Filters added 2019-08-14 06:10:41 -07:00
8581753520 Initial implementation of topology summary 2019-08-12 08:46:15 -07:00
cd365798bb Unit tests added 2019-08-12 05:40:40 -07:00
528842b713 Action created 2019-08-12 04:05:04 -07:00
1abcad72d2 Update project-map.component.ts 2019-08-12 01:58:10 -07:00
cd5890ca2b Save as button added 2019-08-09 07:43:22 -07:00
85b7d0943d Option to add blank project 2019-08-09 07:27:27 -07:00
c0ef682e9c Duplicate action added 2019-08-09 06:32:58 -07:00
2f1f6b5a35 Update project-map.component.spec.ts 2019-08-09 04:33:54 -07:00
46ef26931d Import/export buttons added 2019-08-09 04:14:55 -07:00
c70d9852f6 Displaying ports updated 2019-08-08 06:25:28 -07:00
162806b268 Information dialog added 2019-08-08 05:44:35 -07:00
c9bdfeba8f Delete button added 2019-08-07 05:59:24 -07:00
99df35282e Button on map to show/hide console 2019-08-07 05:19:54 -07:00
7f30d6ddf6 Update log-console.component.ts 2019-08-07 03:02:52 -07:00
668b640a9e Unit tests added 2019-08-07 01:55:19 -07:00
91545e5049 Extending commands 2019-08-06 07:19:59 -07:00
6d965e5773 Merge branch 'master' into List-of-debug-events 2019-08-06 07:05:28 -07:00
34a31449f3 start/stop/suspend/reload commands added 2019-08-06 04:44:29 -07:00
4487ab5167 Update template-list-dialog 2019-08-06 00:15:28 -07:00
031291612f Update template-list-dialog.component.ts 2019-08-05 23:49:22 -07:00
3f696a9200 Widget prepared 2019-08-05 07:07:47 -07:00
9b876dd1a9 Update adbutler.component.spec.ts 2019-08-02 01:58:44 -07:00
ee1b18dee1 Update adbutler.component.scss 2019-08-02 01:28:06 -07:00
1e346c9e72 Breaktime reduced for demo 2019-08-02 01:03:44 -07:00
ebbeac6e0b Merge branch 'master' into custom-html-adbutler-ads 2019-08-02 00:49:03 -07:00
d94f6d3d7d Keyboard shortcuts added 2019-08-01 09:10:51 -07:00
e610fcd6ec Merge branch 'master' into Support-for-editing-config-files 2019-08-01 04:14:13 -07:00
8da7311fa4 Fix for text-editor component 2019-08-01 03:42:50 -07:00
649bd0f245 Merge pull request #471 from GNS3/Editing-node-labels-on-double-click
Editing interface labels on double click
2019-08-01 11:02:33 +02:00
ee2d755eb0 Update text-editor.component.spec.ts 2019-08-01 00:51:42 -07:00
07aefc6933 Update text-editor.component.ts 2019-08-01 00:19:27 -07:00
4ed1f3da30 Option to edit on double click added 2019-07-31 08:06:25 -07:00
6a5aca2dcd Unit tests added 2019-07-30 08:44:43 -07:00
753649a321 Support for editing VPCS config files 2019-07-30 07:21:55 -07:00
d2271f0421 Update text-editor.component.ts 2019-07-30 01:17:45 -07:00
13ddddb944 Merge pull request #461 from GNS3/object-CloseEvent
Failed to construct WebSocket error fixed
2019-07-29 10:02:10 +02:00
dfaea6297b Bug fixed 2019-07-26 07:56:51 -07:00
430107c065 Update project-web-service-handler 2019-07-26 06:13:42 -07:00
d11413d10e Merge pull request #459 from GNS3/Licenses-are-not-shown-when-web-ui-released-in-gns3server
Licenses are not shown when web ui released in gns3server
2019-07-26 13:44:19 +02:00
8b5aed9597 Merge pull request #458 from GNS3/Option-to-duplicate-should-not-be-available-while-node-is-running
Option to duplicate should not be available while node is running
2019-07-26 13:36:44 +02:00
e5817cc3fb Merge branch 'master' into Licenses-are-not-shown-when-web-ui-released-in-gns3server 2019-07-26 03:41:26 -07:00
37c43c8e1b Merge branch 'master' into Option-to-duplicate-should-not-be-available-while-node-is-running 2019-07-26 03:40:57 -07:00
28d05a70cf Merge pull request #456 from GNS3/Update-dependencies-June-2019
Angular 8 Upgrade
2019-07-26 12:35:20 +02:00
485e41c329 Update config.yml 2019-07-26 03:07:36 -07:00
1b63b2082d Update config.yml 2019-07-26 03:00:15 -07:00
c17bc3731c Update config.yml 2019-07-26 02:53:04 -07:00
15c5203678 Update config.yml 2019-07-26 02:50:18 -07:00
4d05a4269e Update config.yml 2019-07-26 02:00:11 -07:00
478a09fc34 Update config.yml 2019-07-26 01:58:35 -07:00
a1909c19d0 Update config.yml 2019-07-26 01:56:22 -07:00
f81f3b5887 Update config.yml 2019-07-26 01:43:48 -07:00
4351e93d70 Update config.yml 2019-07-26 01:34:50 -07:00
1b3f2b5623 Merge branch 'Update-dependencies-June-2019' into Licenses-are-not-shown-when-web-ui-released-in-gns3server 2019-07-25 06:15:24 -07:00
5c99ec64eb Update duplicate-action-component 2019-07-25 06:11:51 -07:00
6e23aed7b9 Update config.yml 2019-07-25 05:13:18 -07:00
7893858b6d Update config.yml 2019-07-25 04:44:19 -07:00
0904d94019 Update yarn.lock 2019-07-25 04:04:44 -07:00
b6404a6bdf Upgrading node version 2019-07-25 03:16:35 -07:00
c2bff662ec Angular 8 Upgrade 2019-07-25 01:25:47 -07:00
da7ecf3446 Update console-device-action-component 2019-07-23 04:31:00 -07:00
ebd24bf235 Update adbutler.component.scss 2019-07-09 04:59:09 -07:00
2be02a8bd0 Implementation of custom html ad 2019-07-09 03:48:02 -07:00
4f33fb49f9 Update help.component.ts 2019-07-04 04:57:58 -07:00
16bf6ebffa Update package.json 2019-07-04 00:22:20 -07:00
3ea21e0bc6 Release 2019.2.0-alpha.5 2019-07-04 00:03:19 -07:00
87eba6ce09 Update servers.component.html 2019-07-03 23:28:54 -07:00
e068740412 Update package.json 2019-07-03 06:29:48 -07:00
ce9305ec2c Release 2019.2.0-alpha.4 2019-07-03 05:12:15 -07:00
4a7a92078a Merge pull request #440 from GNS3/removing-console-errors
Removing errors & warnings, missing validation added
2019-07-03 04:58:22 -07:00
830bc8140d fix for unit tests 2019-07-03 04:57:49 -07:00
4377835153 coorect flag in styl;e editor + width of menu changed + validation added 2019-07-03 03:26:29 -07:00
29429f0e04 Add tag for relasing WebUI in gns3server 2019-07-03 12:16:30 +02:00
ef954600ea Update docs how to release WebUI 2019-07-03 12:14:19 +02:00
b4cb013090 Merge branch 'master' into removing-console-errors 2019-07-03 00:42:13 -07:00
383b246020 removing console errors from iou & qemu template pages 2019-07-02 05:57:25 -07:00
3d73703995 Merge branch 'master' into removing-console-errors 2019-07-02 05:15:04 -07:00
690f040da5 Merge pull request #425 from GNS3/Support-node-label-edit-mode---only-by-menu
Support node label & interface label edit mode only by menu #381 #410
2019-07-02 14:06:55 +02:00
cb7215abc8 Merge branch 'master' into Support-node-label-edit-mode---only-by-menu 2019-07-02 04:48:30 -07:00
3a1111c82d Fix for selecting issue 2019-07-02 04:45:23 -07:00
7fab6fade6 Removing console errors from built-in, dynampis, docker 2019-07-02 01:53:09 -07:00
345d5d7313 Merge pull request #435 from GNS3/Release-notes-section
Release notes section
2019-07-02 10:08:35 +02:00
5e5a72f510 Merge pull request #431 from GNS3/Extend-context-menu-with-option-to-duplicate
Ability to duplicate items by context menu #430
2019-07-02 10:08:22 +02:00
f1f2b5b40d Merge pull request #439 from GNS3/preferences-error
Error after clicking "Go to preferences" on map; latest gns3server 2.2 #436
2019-07-01 22:21:05 -07:00
d398bd9bd5 bug fixed 2019-07-01 04:54:23 -07:00
d63fbe54cc Merge branch 'master' into Release-notes-section 2019-07-01 03:52:57 -07:00
d9341fa60a Merge branch 'master' into Extend-context-menu-with-option-to-duplicate 2019-07-01 03:48:24 -07:00
02f42c6681 Merge branch 'master' into Support-node-label-edit-mode---only-by-menu 2019-07-01 03:47:22 -07:00
cfa5d02406 Merge pull request #434 from GNS3/Moving-the-menu-code-from-the-project-map-component
Moving the menu code from the project map component #356
2019-06-29 07:50:04 +02:00
79b5909b7a Merge pull request #433 from GNS3/Lock/unlock-all-items-on-map
Lock/unlock all items on map
2019-06-29 07:49:23 +02:00
f1adc64216 Removing typo 2019-06-28 03:33:07 -07:00
d25ec6686d Description added 2019-06-28 02:04:03 -07:00
b3e73b81c7 Merge branch 'master' into Extend-context-menu-with-option-to-duplicate 2019-06-28 01:36:01 -07:00
5a9380de4a Merge branch 'Lock/unlock-all-items-on-map' into Moving-the-menu-code-from-the-project-map-component 2019-06-28 01:32:00 -07:00
abec70fe3a Merge branch 'master' into Lock/unlock-all-items-on-map 2019-06-28 01:06:47 -07:00
0f6bfe5912 Merge branch 'master' into Release-notes-section 2019-06-28 00:47:02 -07:00
c1de0c9625 Release notes section added 2019-06-28 00:46:44 -07:00
d790a80924 Merge pull request #360 from GNS3/Rewrite-MovingTool-to-custom-solution
Rewrite MovingTool to custom solution
2019-06-28 09:01:38 +02:00
3a358d199c Merge pull request #419 from GNS3/Display-progress-when-server-is-starting
Display progress when server is starting #390
2019-06-28 08:59:09 +02:00
4bbd78114d Merge pull request #420 from GNS3/Correct-interface-label-positioning-during-adding-the-line-between-nodes
Correct interface label positioning during adding the line between nodes #409
2019-06-28 08:57:31 +02:00
e011af09c9 Merge pull request #432 from GNS3/Third-Party-Components-Section
Third Party Components section #422
2019-06-28 08:55:07 +02:00
2c1d85f7b9 bugfix 2019-06-26 03:24:32 -07:00
e905a91fd1 Unit test added 2019-06-26 02:48:02 -07:00
4b60041f8f Menu code moved to separate component 2019-06-26 01:28:52 -07:00
6defbdb9df unit tests added 2019-06-25 01:51:26 -07:00
6dbce19481 Tests added 2019-06-24 06:44:51 -07:00
b4bbd97a40 Locking items added 2019-06-24 06:24:38 -07:00
eaf38d4374 Help component added 2019-06-24 01:41:28 -07:00
ba478d4894 Initial implementation 2019-06-19 06:38:50 -07:00
86c13644a8 reimplementation of adding links 2019-06-18 08:09:19 -07:00
67741ca601 Duplication option added 2019-06-17 06:50:26 -07:00
4ed93ed6ab Merge pull request #429 from GNS3/Wrong-positioning-of-context-menu-while-adding-links
Fix for positioning menu while adding link #428
2019-06-14 15:49:04 +02:00
c83dc9818c Fix for positioning menu 2019-06-14 05:07:03 -07:00
9e05dfc2e7 Improvement in positioning labels 2019-06-14 02:47:31 -07:00
2e6192914a Fix for selection component 2019-06-14 00:51:04 -07:00
00b4e1ef7f Zoom functionality applied to drawings & texts 2019-06-13 06:43:23 -07:00
14ecf09a1b Merge branch 'master' into Display-progress-when-server-is-starting 2019-06-13 00:22:00 -07:00
bec54a8fa4 Removing bug with style translation 2019-06-12 07:36:01 -07:00
7a166cc69d Fixes after review 2019-06-12 03:01:40 -07:00
7f0fb3ac80 Update from master 2019-06-12 02:45:42 -07:00
da896ac783 Merge pull request #418 from GNS3/No-validation-during-text-edit
Validation in text & style editor added Ref. #411
2019-06-11 08:49:53 +02:00
24856d8f96 Zooming directive rewritten 2019-06-10 05:00:06 -07:00
ee54d620ab Merge branch 'master' into Rewrite-MovingTool-to-custom-solution 2019-06-10 01:37:01 -07:00
572045fb20 Fix for tests 2019-06-07 01:56:17 -07:00
7b28f55e50 Interface label positioning rewritten 2019-06-07 01:18:16 -07:00
8a3896af28 Adding link labels rewritten 2019-06-06 04:44:32 -07:00
230aaf31fd Fixes after review 2019-06-05 01:56:28 -07:00
ceafe49ebd Fixes after review 2019-06-04 06:24:46 -07:00
3f823fac4c Fixes after review 2019-06-04 05:56:25 -07:00
536a1c4d08 Editing labels added 2019-06-04 04:25:51 -07:00
7342436948 Initial implementation 2019-05-31 07:24:28 -07:00
db1025d2f7 Initial solution 2019-05-30 07:02:51 -07:00
80338f194b Display progress when server is starting 2019-05-30 06:21:36 -07:00
2a56441ce9 Validation in text & style editor added 2019-05-30 03:57:30 -07:00
8eafbf66c9 Revert break time to default value 2019-05-29 00:45:50 -07:00
d37b043711 Fixes after review 2019-05-29 00:42:14 -07:00
889c48be65 Merge pull request #407 from GNS3/greenkeeper/electron-5.0.2
Update electron to the latest version 🚀
2019-05-29 07:58:58 +02:00
64ad61c15b Merge pull request #406 from GNS3/Refresh-page-button-redirects-to-empty-page
Refresh page button redirects to empty page while in ElectronJS  #371
2019-05-29 07:58:13 +02:00
a3110e87aa Fixes after review 2019-05-28 13:41:30 -07:00
d53a765c4d chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2019-05-23 15:33:13 +00:00
69d5f66d80 chore(package): update electron to version 5.0.2 2019-05-23 15:29:01 +00:00
fc43f98f86 Restyling box 2019-05-23 02:17:57 -07:00
6da54a290c Restyling box 2019-05-22 00:26:19 -07:00
d7b73b4653 Unit tests fixed 2019-05-21 23:31:19 -07:00
fd6393acf7 Initial implementation 2019-05-20 07:23:50 -07:00
822a96cdaa Development on v2019.2.0-alpha.4dev 2019-05-20 14:24:06 +02:00
1b067e78bd Release 2019.2.0-alpha.3 2019-05-20 13:56:43 +02:00
971b2a9062 Merge pull request #404 from GNS3/ubridge-to-0.9.16
Upgrade ubridge to 0.9.16, Fixes: #403
2019-05-20 13:51:00 +02:00
dd5df6c5e2 Upgrade ubridge to 0.9.16, Fixes: #403 2019-05-20 13:50:26 +02:00
dd4da4031e Bug fixed 2019-05-20 04:13:37 -07:00
0809759765 Initial implementation 2019-05-16 04:42:23 -07:00
7e5172bb7a Merge pull request #394 from GNS3/greenkeeper/@types/node-12.0.0
Update @types/node to the latest version 🚀
2019-05-09 13:46:54 +02:00
ef9f749c34 Merge pull request #398 from GNS3/upgrade-ubridge-to-0.9.15
Upgrade ubridge to 0.9.15, Fixes: #397
2019-05-09 13:43:39 +02:00
11a29e29d3 Merge pull request #395 from GNS3/greenkeeper/electron-5.0.1
Update electron to the latest version 🚀
2019-05-09 13:39:55 +02:00
2c5cee3be6 Upgrade ubridge to 0.9.15 2019-05-09 10:53:42 +02:00
fb4d39c67c chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2019-05-04 05:24:47 +00:00
62f2acf6fd chore(package): update electron to version 5.0.1 2019-05-04 05:20:21 +00:00
ea08b11754 chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2019-05-03 22:13:01 +00:00
97ef3884e3 chore(package): update @types/node to version 12.0.0 2019-05-03 22:08:06 +00:00
148ef5c754 Merge branch 'master' of github.com:GNS3/gns3-web-ui 2019-04-30 08:58:48 +02:00
6a87d3d8b2 Detect non-dev version of web ui, Fixes: #392 2019-04-30 08:58:38 +02:00
3f28256932 Merge pull request #393 from GNS3/adbutler-integration
Adbutler integration, Fixes: #361
2019-04-30 06:50:03 +02:00
e56085cbb6 Merge branch 'master' into adbutler-integration 2019-04-30 06:49:17 +02:00
3ac041733d Update VPCS to 0.6.2, Fixes #369 2019-04-29 15:44:16 +02:00
e953a65f46 Merge branch 'master' of github.com:GNS3/gns3-web-ui 2019-04-29 15:27:45 +02:00
98e82a3e27 Development on 2019.2.0-alpha.3dev 2019-04-29 15:24:02 +02:00
baf356a4ba Merge pull request #391 from GNS3/deps-2019-04
Update dependencies, Fixes: #373
2019-04-29 13:20:54 +02:00
19ebd65b3a Fixing angular-cli 2019-04-29 13:00:04 +02:00
dedfc81b48 Release 2019.2.0-alpha.2 2019-04-29 12:24:17 +02:00
c1d6db586c Fix publishing symbols to sentry 2019-04-29 12:22:55 +02:00
b1cf54b03a Fix download url for gns3server, Ref: #387 2019-04-29 11:30:59 +02:00
c0acc805e8 Remove empty files, Ref: #373 2019-04-29 11:01:24 +02:00
e020ca00f5 Upgrade packages, Ref: #373 2019-04-29 11:01:06 +02:00
940a93c66d Fix APPVEYOR_REPO_TAG, Ref. #387 2019-04-29 10:25:04 +02:00
9c1562a06d Development on 2019.2.0-alpha.2dev 2019-04-29 10:24:03 +02:00
12345b4870 Release 2019.2.0-alpha.1 2019-04-29 10:10:47 +02:00
1f197c2b31 Download latest published release of gns3server, auto support in CDs, Ref: #387 2019-04-29 10:09:08 +02:00
12a24b5d1d Develop on v2019.2.0-alpha.1dev 2019-04-29 09:14:49 +02:00
0b8d2d2b95 Merge pull request #386 from GNS3/fix-tci-gyp
Use node v10 istead of latest - 12, Fixes 385
2019-04-29 08:11:39 +02:00
4b23007660 Use node v10 istead of latest - 12 2019-04-29 07:44:15 +02:00
43cbc60f62 Merge pull request #384 from GNS3/fix-adding-node
Fix label of added node (when GUI is not running). Fixes #292
2019-04-29 06:39:11 +02:00
d04aea0f25 Fix label of added node (when GUI is not running). Fixes #292 2019-04-29 06:38:41 +02:00
a4c3bd254b NodeCreatedLabelStylesFixer prepartion 2019-04-26 15:15:40 +02:00
092789eecc Code clean 2019-04-25 11:17:27 +02:00
0afa6f7e0b Merge pull request #380 from GNS3/putty-bundled
PuTTY in Web UI on Windows, Fixes #368
2019-04-25 11:14:40 +02:00
16eeb8638a Console command tests 2019-04-25 10:13:13 +02:00
b6ed486ce0 Console setting edition 2019-04-17 11:16:35 +02:00
f6b50526f4 Basic PuTTY support, Ref. #368 2019-04-12 12:16:46 +02:00
39e98e31ba Merge remote-tracking branch 'origin/os-console' into putty-bundled 2019-04-10 13:42:45 +02:00
9478f8f6f9 Merge with master 2019-04-10 13:23:54 +02:00
c5b783c722 Download PuTTY from external URL, Ref: #368 2019-04-10 13:14:02 +02:00
88336ed9f7 Display placeholder in installedsoftware, Ref: #361 2019-04-04 10:00:36 +02:00
7b1371dff9 Styles and fixes switching between pages, Ref: #361 2019-04-04 09:13:06 +02:00
e2afeffe2f Hacking including plain javascript into Angular, Ref: #361 2019-04-03 16:30:21 +02:00
83ac53e0a1 Code cleaned up 2019-04-03 04:24:26 -07:00
2d3a4798d9 Merge branch 'master' into Rewrite-MovingTool-to-custom-solution 2019-04-03 04:24:13 -07:00
3c05b47032 Zoom buttons added 2019-04-03 03:31:14 -07:00
c3d8fd2399 Unit tests for moving & zooming directives added 2019-04-03 02:55:11 -07:00
3405f89a4a Reimplementation of moving component 2019-04-01 10:06:31 -07:00
55ff72e7e2 Merge pull request #351 from GNS3/Insert-image-drawing
Insert image drawing
2019-04-01 13:01:52 +02:00
f1e0b5b705 Merge branch 'master' into Insert-image-drawing 2019-04-01 02:02:17 -07:00
5a71481d47 Removing comments 2019-04-01 02:01:05 -07:00
d833b6409f Merge branch 'master' into Rewrite-MovingTool-to-custom-solution 2019-04-01 01:58:19 -07:00
9d88834e14 Merge branch 'master' into Rewrite-MovingTool-to-custom-solution 2019-04-01 01:51:24 -07:00
5fae9e1db0 Merge pull request #339 from GNS3/Packet-capture-preferences
Packet capture preferences
2019-04-01 10:48:44 +02:00
0e2f462b73 Preventing from default browser behaviour on zoom in/out 2019-03-29 05:27:38 -07:00
5558e17aaf Code cleaned up 2019-03-29 03:32:12 -07:00
f29c705bba Unit tests added 2019-03-29 02:31:01 -07:00
b93490fbd2 Initial implementation 2019-03-27 08:28:10 -07:00
12ba435fa6 Display version name in the footer, Fixes: #359 2019-03-27 12:46:09 +01:00
dcd4d2f8fa Development on v2019.1.0-alpha.4dev 2019-03-27 12:05:52 +01:00
3890cc5ceb Release v2019.1.0-alpha.3 2019-03-27 12:04:33 +01:00
61210fd0e1 Merge pull request #358 from GNS3/sm-and-travis
Support SourceMaps in Sentry, Fixes: #345
2019-03-27 11:47:47 +01:00
d537a51b32 Upload SourceMaps only when on tag 2019-03-27 11:44:17 +01:00
9a7290b7e7 Create SourceMaps and upload to Sentry via CLI 2019-03-27 10:50:03 +01:00
3e0451c3b1 Added .sentryclirc 2019-03-27 10:49:33 +01:00
166756cd7c Revert "Try to build production with sourcemaps"
This reverts commit f591340411.
2019-03-27 08:50:09 +01:00
f591340411 Try to build production with sourcemaps 2019-03-27 08:35:59 +01:00
c694309875 Code updated 2019-03-26 08:24:12 -07:00
d4b09e15d1 Merge branch 'master' into Packet-capture-preferences 2019-03-26 08:17:51 -07:00
226a04a638 Merge branch 'master' into Packet-capture-preferences 2019-03-26 08:12:20 -07:00
a6dd971580 Merge pull request #355 from GNS3/Support-for-bundled-location
Support for "bundled" location to WebUI
2019-03-26 16:07:19 +01:00
07722cf8ea Code refactored 2019-03-26 07:41:28 -07:00
ca9cb13c2b Bundled state added 2019-03-26 06:38:10 -07:00
5ff0049a13 Merge branch 'master' into Insert-image-drawing 2019-03-26 05:22:53 -07:00
9ff7a58df0 Merge pull request #352 from GNS3/test-fix
Fix for server service test
2019-03-26 12:54:12 +01:00
992712591a fix for server service test 2019-03-26 03:56:36 -07:00
ef3acfa459 Code cleaned up 2019-03-26 03:25:49 -07:00
062f3f7726 Update context-menu.component.spec.ts 2019-03-26 01:38:49 -07:00
d61825506a Initial implementation of inserting images 2019-03-25 07:42:03 -07:00
4c681f5097 Fix for local server 2019-03-25 06:25:54 -07:00
1b8034e366 Development on 2019.1.0-alpha.3dev 2019-03-22 14:07:02 +01:00
ddf2db7df6 Use DOCUMENT from angular/common, Ref: #347 2019-03-22 13:43:53 +01:00
038f3682eb Local server discovery should be visible as remote 2019-03-22 10:11:31 +01:00
36fb802454 Fixes after review 2019-03-22 01:25:29 -07:00
60a23d4902 Freeze static/web-ui 2019-03-21 10:42:48 +01:00
4b2208e61e Redirect to /servers when page is not found, Fixes: #338 2019-03-21 07:54:23 +01:00
ce5c46df1a Code cleaned up 2019-03-20 08:23:30 -07:00
69e18494bb Unit tests added 2019-03-20 07:04:39 -07:00
1f928690b3 Missing icons added 2019-03-20 05:52:28 -07:00
a7386104b4 Merge pull request #343 from GNS3/Style-fix-for-divider
Style fix for divider
2019-03-20 12:17:16 +01:00
4c9adb13c7 Style fix for divider 2019-03-20 03:15:51 -07:00
0bc701ea38 Merge pull request #342 from GNS3/Snapshots-additional-dialog
Bug with creating snapshots fixed
2019-03-20 11:14:28 +01:00
e5a77ea15a Bug with creating snapshots fixed 2019-03-20 02:58:42 -07:00
2997d1ff66 Capturing packets visible on map 2019-03-18 06:40:06 -07:00
e507e26cda Initial implementation 2019-03-18 01:59:21 -07:00
ca42465ebc Merge pull request #332 from GNS3/Start,-pause,-stop-all-nodes
Start, pause, stop all nodes #317
2019-03-14 12:41:05 +01:00
36870e170e Typo fixed 2019-03-13 01:26:01 -07:00
e18f57e2ed Development on 2019.1.0-alpha.2dev 2019-03-12 14:14:21 +01:00
0b5703c0ca Release 2019.1.0-alpha.1 2019-03-12 14:13:17 +01:00
8442a9055c Fix starting and stopping nodes 2019-03-12 14:11:05 +01:00
aac20a6830 Fix adding link 2019-03-12 13:43:21 +01:00
8cda33c0d9 Actions for all nodes added 2019-03-11 04:35:27 -07:00
f3ef8dc273 Merge pull request #331 from GNS3/unit-tests
Unit tests improvements
2019-03-11 08:55:31 +01:00
3a79abacb8 Disabling tests due to instability 2019-03-08 06:49:59 -08:00
dfd9ca60ca Disabling tests due to instability 2019-03-08 06:24:13 -08:00
55db0452f6 Back to 2019.1.0-alpha.1dev 2019-03-08 13:08:47 +01:00
57fc827af5 2019.1.0-alpha.0 Version 2019-03-08 13:07:45 +01:00
d1c841ec2c Merge branch 'master' into unit-tests 2019-03-08 00:07:18 -08:00
4728064675 Sever service tests fixed 2019-03-08 00:06:55 -08:00
905b33af1b Fix CCI with --publish always 2019-03-08 09:02:21 +01:00
d933135912 Merge branch 'master' into unit-tests 2019-03-07 07:15:22 -08:00
7a4c882c16 Electron-builder: publish always 2019-03-07 16:02:59 +01:00
e7f2bcfcbf Fixing errors in tests 2019-03-07 06:17:58 -08:00
75f4c6e733 Move build config to electron-builder.yml 2019-03-07 13:30:24 +01:00
56eebc2695 Move build config to electron-builder.yml 2019-03-07 13:30:13 +01:00
56dae618fb Development version 2019-03-07 13:00:13 +01:00
8689ccde8c Use 20XX.X versioning and support alpha channel 2019-03-07 12:56:06 +01:00
1f3e59cdbe During adding server mark it as a local 2019-03-07 11:32:12 +01:00
b82b883f06 Disable drawings in readonly mode 2019-03-07 08:56:14 +01:00
9e1a6df93a Disable zooming on wheel 2019-03-07 08:54:14 +01:00
3764ef84ec Fix settings padding and disable angular map option 2019-03-07 08:44:19 +01:00
42c0297daf Another approach for unit tests 2019-03-06 07:54:56 -08:00
267c88032f Init console settings 2019-03-05 15:12:47 +01:00
0c2fff6ac1 Basic OS Console executor 2019-03-05 14:26:09 +01:00
2b0bb19f88 Merge pull request #327 from GNS3/enhanced-configuration
Enhanced configuration of local server; Binary dependencies
2019-03-05 12:42:04 +01:00
a7a036ed8a Dynamips delivery with WebUI, Fixes: #326 2019-03-05 12:40:19 +01:00
f471d8134a Support VPCS delivered with WebUI on gns3server, Fixes: #325 2019-03-05 12:01:24 +01:00
5f32945f9f VPCS delivery with WebUI, Fixes: #315 2019-03-05 11:59:17 +01:00
b7b2bd4592 Support bundled ubridge, Ref: #314 2019-03-05 10:43:31 +01:00
c40767879f Bundle ubridge in package for Windows 2019-03-05 09:57:24 +01:00
eab95c2bdb Download ubridge from Github 2019-03-05 09:53:11 +01:00
24e9e23f7e Support gns3_server.ini configuration, Fixes: #324 2019-03-05 09:06:15 +01:00
7ccc9db33b Limit number of local servers to one, Fixes: #322 2019-03-05 07:14:21 +01:00
23819b48c0 Merge pull request #320 from GNS3/Ability-to-manage-snapshots
Managing snapshots
2019-03-05 06:51:06 +01:00
612d0dbe1f Removing autofocus from dialog 2019-03-04 04:36:13 -08:00
87d9144f1e Fixing unit tests 2019-03-04 03:55:33 -08:00
42413d51a3 Update from master 2019-03-04 03:08:32 -08:00
1d8950152e Unit tests added 2019-03-04 03:06:30 -08:00
b195ee52b1 Merge pull request #309 from GNS3/Rewriting-custom-adapters-component
Rewriting custom adapters component
2019-03-04 08:57:59 +01:00
e73dc45f4c Basic implementation of managing snapshots 2019-03-01 05:35:42 -08:00
6a6af2432f Merge pull request #313 from GNS3/local-server-outside-asar
Run local server while inside packed version, Ref: #310
2019-03-01 08:08:52 +01:00
50b12f54d8 Run local server while inside packed version, Fixes: #310 2019-02-28 15:07:06 +01:00
d7f4aeb7d8 Unit tests added 2019-02-28 02:09:40 -08:00
06290a2dec Unit tests fixed 2019-02-28 01:45:01 -08:00
18a80468d0 Custom adapters separated to new component 2019-02-28 01:26:15 -08:00
3cf7492452 Merge pull request #308 from GNS3/Adding-new-project-on-enter
Adding new project on enter
2019-02-28 10:11:56 +01:00
ebde71eba5 Merge branch 'master' into Rewriting-custom-adapters-component 2019-02-27 04:22:54 -08:00
f866de520a Merge branch 'master' into Adding-new-project-on-enter 2019-02-27 04:10:09 -08:00
19d450d5cd Fix Error Message 2019-02-27 12:28:42 +01:00
6b2d74e7a3 Proper electron-builder version 2019-02-27 12:04:09 +01:00
d39e2d7749 Improve caching on AppVeyor - fix filename 2019-02-27 11:58:47 +01:00
ebcbfc4f1e Improve caching on AppVeyor - fix filename 2019-02-27 11:56:53 +01:00
f85ad08a97 Improve caching on AppVeyor - fix filename 2019-02-27 11:33:49 +01:00
3883f808f4 Improve caching on AppVeyor 2019-02-27 11:32:54 +01:00
c31e653048 Merge branch 'master' of github.com:GNS3/gns3-web-ui 2019-02-27 11:28:58 +01:00
f13a339ff3 Update yarn.lock 2019-02-27 11:28:45 +01:00
1af597939b Merge pull request #306 from GNS3/Client-offset-not-supported-in-scrolled-area
Client offset not supported in scrolled area #299
2019-02-27 11:11:59 +01:00
bc7eda33b3 Adding new project on enter 2019-02-27 02:06:52 -08:00
f11c7f37ee Move tree-kill to deps for Electron 2019-02-27 11:03:43 +01:00
66c87bd50c Merge pull request #307 from GNS3/update-deps-2019-02
Upgrade packages - 2019-02, Fixes: #305
2019-02-27 10:59:56 +01:00
ab70d8d1be Downgrade electron-builder to 20.38.2 due to issue with publishing 2019-02-27 10:53:04 +01:00
a2d81b75b4 Fix for moving tool 2019-02-27 01:44:26 -08:00
2a32db47cd Upgrade packages, Fixes: #305 2019-02-27 10:04:34 +01:00
cc9a3a288c Add local-server.js to builder 2019-02-27 09:42:33 +01:00
ff9993f861 Fix CVE-2019-8331 2019-02-27 09:27:01 +01:00
6a8192e233 Fix building gns3server 2019-02-27 09:23:03 +01:00
ec75f107bc Update qemu-vm-template-details.component.ts 2019-02-27 00:15:05 -08:00
d05bdd5200 Code related to custom adapters rewritten 2019-02-27 00:14:49 -08:00
296548ffd6 Merge pull request #304 from GNS3/adding-server-validation
Adding server validation & running local server on custom ports
2019-02-27 09:05:15 +01:00
28c4c25d14 Support local servers on custom ports, Ref. #303 2019-02-26 16:16:54 +01:00
e0bae16093 Local and Remote server adding validation, Ref. #295 2019-02-26 16:04:05 +01:00
bb9cfc988b Async getting local server path 2019-02-26 10:46:36 +01:00
c841a3d879 Merge pull request #301 from GNS3/As-a-user-I-can-delete-project
As a user i can delete project & deletion support for drawings/nodes/links in context menu & offset support in scrolled area
2019-02-26 10:00:39 +01:00
f3e2e8bf28 Merge pull request #275 from GNS3/As-user-I-can-add-QEMU-VM
As user i can add qemu vm Fixes: #272 #273 #280 #281 #282 #283 #284 #285 #286
2019-02-26 09:58:48 +01:00
1535166837 Unit tests added 2019-02-25 03:20:21 -08:00
c063620cbf Support for client offset in scrolled area 2019-02-25 01:42:39 -08:00
f553c7a200 Deletion supported in context menu 2019-02-22 00:17:00 -08:00
fb1a64fe5d Ability to delete project added 2019-02-21 04:03:14 -08:00
5b621e9468 Fixing unit tests 2019-02-20 04:55:12 -08:00
cc1d255de9 Merge branch 'master' into As-user-I-can-add-QEMU-VM 2019-02-20 04:50:04 -08:00
369743e2ea Review fixes 2019-02-20 04:41:32 -08:00
c17f115085 Merge pull request #294 from GNS3/local-server-runner
Local server runner, Ref: #254,  Fix wrong toaster position for error/success, Fixes: #291
2019-02-20 12:37:32 +01:00
85a5ece8ae Fix UnhandledRejection handle message 2019-02-20 12:36:09 +01:00
cdadbd9140 Support of stderr CRITICAL issues forwarded to app 2019-02-20 11:32:54 +01:00
16185d2461 Stopping all local servers when leaving application 2019-02-19 15:03:33 +01:00
31f22728a9 Fixes after review
Unit tests updated
Cancel option added to every step
Code cleaned up
2019-02-19 05:16:02 -08:00
b3aa58b9c9 Unit tests updated #1 2019-02-18 04:06:21 -08:00
aec31c5fbc Fixes after review #2 2019-02-18 02:16:50 -08:00
30ede76507 Fixes after review
BuilInTemplates,
EthernetHubs
EthernetSwitches,
CloudNodes modificated, back and cancel buttons added
2019-02-15 06:17:27 -08:00
f87530b3ee Review fixes 2019-02-14 01:38:30 -08:00
c6d37ea3af Missing unit tests added 2019-02-14 01:22:46 -08:00
ab79d84edb Copy actions added 2019-02-13 04:22:17 -08:00
30c5e95170 Code cleaned up 2019-02-13 01:14:25 -08:00
589886d6e9 Support for IOU 2019-02-13 00:38:50 -08:00
02a040662e Support for docker containers 2019-02-12 15:34:01 -08:00
6759568933 Update status of server when is already running 2019-02-12 15:34:18 +01:00
af90fe46d0 Communication betwen angular and local-server.js 2019-02-12 15:11:50 +01:00
b00604cc39 Fix wrong toaster position for error/success, Fixes: #291 2019-02-12 13:05:37 +01:00
41e715feeb Delete function added to templates 2019-02-11 10:22:01 -08:00
d772a0d9df Basic starting and stopping servers on UI 2019-02-11 14:53:45 +01:00
e16eb69fee Support for vmware added 2019-02-11 05:46:37 -08:00
2cae9de2de Communication with local-server.js 2019-02-11 11:26:32 +01:00
42d1f20d15 Distinction between local and remote server; Refactor IP to HOST 2019-02-11 11:24:26 +01:00
494b292238 Discover server as remote server 2019-02-11 11:10:31 +01:00
ba8bd4d4c6 Code cleaned up 2019-02-10 22:33:47 -08:00
6ec6dfe866 Configuration services for templates 2019-02-08 04:40:05 -08:00
c15b00a6bf Unit test added 2019-02-08 01:59:54 -08:00
7410455bdf Sequential execution of stopping servers 2019-02-07 16:02:25 +01:00
dd199b0058 Unit tests added 2019-02-07 06:16:41 -08:00
06bda9fc79 Starting and stopping gns3server in local-server.js manager 2019-02-07 13:35:07 +01:00
6c7196c0be Initial local server management 2019-02-06 09:12:14 +01:00
71f76be839 Edit page for Ios routers 2019-02-05 04:40:26 -08:00
43d08a9044 Adding templates of IOS routers 2019-02-05 01:26:35 -08:00
643240eb59 Merge pull request #279 from GNS3/as-user-can-install-solarputty
As user I can install solarputty and get list of installed software
2019-02-04 11:40:24 +01:00
39603b7da7 Consistency of env 2019-02-04 11:37:57 +01:00
f9597a46d6 Merge branch 'as-user-can-install-solarputty' of https://github.com/GNS3/gns3-web-ui into as-user-can-install-solarputty 2019-02-04 11:36:41 +01:00
5811824574 Install SolarPuTTY when available 2019-02-04 11:35:38 +01:00
b98b607614 Install SolarPuTTY when available 2019-02-04 11:32:01 +01:00
8cd9779067 Updating from master 2019-02-03 23:31:46 -08:00
f180f7f76f Separate component for symbol selecting 2019-02-03 23:24:07 -08:00
eed6466df5 Unit tests added 2019-02-01 04:35:58 -08:00
72d0323783 Environment file convention 2019-02-01 12:51:20 +01:00
e8fa0942a3 Set vars only when building 2019-02-01 11:01:03 +01:00
42821f28b2 Configuration menu for cloud nodes 2019-02-01 01:39:34 -08:00
5ce609ffc3 Move node-fetch to dependencies 2019-02-01 09:58:31 +01:00
6f879add81 Configuration ethernet switches 2019-01-31 23:17:05 -08:00
0bfff9c79e Creating templates for ethernet switches 2019-01-31 06:51:53 -08:00
516ad5a045 Support for templates for Ethernet Hubs 2019-01-31 01:27:04 -08:00
23c7e3bc8e Support for creating virtual box templates added 2019-01-30 08:40:32 -08:00
41eb0d882d Renaming styles 2019-01-29 07:20:31 -08:00
a6b4c4a9c8 Form validation for Qemu 2019-01-29 06:53:18 -08:00
5a21d117ca Form validation for VPCS components 2019-01-29 03:25:48 -08:00
a12f8e6ddd Ignore missing template during creation 2019-01-29 11:39:25 +01:00
250e3bdd6f Managing templates for VPCS 2019-01-29 02:14:32 -08:00
6734776153 Update prod env only when variables are defined 2019-01-29 09:54:26 +01:00
e55c273f3c Components for Vpcs templates 2019-01-28 10:23:32 -08:00
dc6b2f0940 Configuration for adapters added 2019-01-28 07:42:09 -08:00
0eeb983951 Merge pull request #278 from GNS3/update-travisci-xenial
Update TravisCI to Xenial, Fixes: #277
2019-01-28 14:20:45 +01:00
8fcf3348e2 Clean .travis.yml 2019-01-28 14:18:55 +01:00
2e69c938d7 google_chrome package 2019-01-28 14:00:22 +01:00
7dd74a31e1 Xvfb as a service 2019-01-28 13:54:33 +01:00
361a960531 CHROME_BIN var 2019-01-28 13:26:56 +01:00
0a9c849431 Install pip from apt-get using sudo 2019-01-28 13:20:55 +01:00
47afb8c937 Install external PIP 2019-01-28 13:16:00 +01:00
09dacccf38 Install pip from apt-get 2019-01-28 13:08:02 +01:00
77b4b1213e Use bundled pip tool 2019-01-28 13:05:10 +01:00
1a85be06eb Adjust Python version 2019-01-28 13:02:54 +01:00
9f185bd626 Disable config for XVFB 2019-01-28 12:57:34 +01:00
0476f75dd7 Use Xenial for travis builds 2019-01-28 12:55:20 +01:00
b4d9b28392 Merge pull request #276 from GNS3/dependencies-list
Installation of external software on Windows, Ref. #251, #258
2019-01-28 12:14:11 +01:00
9073230b2d ExternalSoftwareDefinitionService tests 2019-01-28 11:28:12 +01:00
6da769a79b Update yarn.lock 2019-01-28 11:12:55 +01:00
ed204d3229 PlatformService tests 2019-01-28 11:12:46 +01:00
65acfbb11c Env definition 2019-01-28 10:24:00 +01:00
7eac08ab91 Preferences options for qemu temporary disabled 2019-01-25 06:31:32 -08:00
a813516dac Component for editing Qemu preferences added 2019-01-25 05:11:17 -08:00
4ea8c9568f Clean set-variables-in-env.js 2019-01-25 13:49:34 +01:00
7e6f64b16a Transport OS ENV into environment.prod.ts - Append file 2019-01-25 13:48:45 +01:00
ef38319b5f Transport OS ENV into environment.prod.ts 2019-01-25 13:48:22 +01:00
c1bdce4fce Move definition of external software to separate file 2019-01-23 16:08:08 +01:00
dc22510d30 Tests for default layout component 2019-01-23 15:31:03 +01:00
6853901341 Merge with master 2019-01-23 09:09:14 +01:00
daab31abb5 Page for creating new templates added 2019-01-22 07:20:18 -08:00
e60a5bbf07 Code cleaned up 2019-01-22 01:03:54 -08:00
8977750d90 Qemu preferences page added 2019-01-18 05:02:26 -08:00
d475b6ea8b Merge pull request #271 from GNS3/Consistance-of-dialogs-style
Styles for dialogs edited
2019-01-17 14:54:13 +01:00
9ecb6b4a24 Fix for text adding 2019-01-17 05:20:39 -08:00
347a3de22c Fixes for context menu & selection 2019-01-17 05:02:56 -08:00
bee62ef726 Initial implementation 2019-01-17 04:24:52 -08:00
b084677cf7 Style for import project dialog edited 2019-01-17 02:29:16 -08:00
ee7cfcd705 Styles for dialogs edited 2019-01-16 07:50:22 -08:00
624dca3bcd Styles for dialogs edited 2019-01-16 05:38:58 -08:00
e7a9e54fab Merge pull request #270 from GNS3/Context-menu-for-multiple-drawings-&-nodes
Context menu for multiple drawings & nodes
2019-01-16 13:26:23 +01:00
3a72e98201 Code cleaned up 2019-01-16 04:11:19 -08:00
ed59d2ba02 Context menu for list of items 2019-01-16 04:03:26 -08:00
4fa82bc81d Merge pull request #268 from GNS3/code-style-update
Apply code style
2019-01-15 11:18:05 +01:00
74b84a13f0 Apply code style 2019-01-15 11:15:54 +01:00
2e9d2412a9 Merge with dependencies-list 2019-01-15 11:04:49 +01:00
fd8fbf3919 Merge pull request #267 from GNS3/As-user-I-can-change-styles-of-drawings
Style & text editor - build fixing
2019-01-15 10:52:21 +01:00
0ad3b30181 Code cleaned up 2019-01-15 01:24:26 -08:00
3b38408a8c Build fixes 2019-01-15 01:17:05 -08:00
a9f2021d0b Merge pull request #263 from GNS3/As-user-I-can-change-styles-of-drawings
As user i can change styles of drawings, Fixes: #260
2019-01-15 10:07:27 +01:00
90b9e424ea Unit tests added 2019-01-14 10:56:33 -08:00
e30e3893c6 Dialog for editing text created 2019-01-14 08:08:41 -08:00
366ed96f28 Software model 2019-01-14 14:55:18 +01:00
36a23fac12 Merge pull request #261 from GNS3/As-user-I-can-use-context-menu-of-drawings
Basic implementation of context menu for drawings
2019-01-14 14:19:29 +01:00
6527554aa3 Improve control of installation 2019-01-14 14:07:42 +01:00
157e3150b5 Installation flow control 2019-01-14 13:52:31 +01:00
fecc81badf Aks for permission when installing Wireshark 2019-01-14 12:47:09 +01:00
f46caaf5e0 Error handler for downloading resource and basic WS support 2019-01-14 09:20:07 +01:00
27fa5f86fb Code cleaned up 2019-01-11 06:03:57 -08:00
e926a2039d Implementation of style editor 2019-01-11 06:00:53 -08:00
c3e70e7800 Basic external software download and run 2019-01-11 13:51:23 +01:00
25e137a488 Basic definition of installed software 2019-01-11 08:38:22 +01:00
669fcc0ddc Fix for unit tests after changes in project map component 2019-01-10 06:48:21 -08:00
b39cf7033f Basic implementation of context menu for drawings 2019-01-10 06:42:20 -08:00
71129e28cf Merge with master 2019-01-10 10:18:32 +01:00
9b9c0cdf4d Merge pull request #229 from GNS3/add-text
Ability to add notes on map
2019-01-10 07:55:22 +01:00
39778f9513 Merge branch 'master' into add-text 2019-01-10 07:53:52 +01:00
e3ea7f323e Fix install button apperance and prepare for installation support 2019-01-09 15:32:19 +01:00
290f8820bc Draw menu rewritten 2019-01-09 06:24:04 -08:00
9925b49725 Code cleaned up 2019-01-09 04:46:10 -08:00
c1b76d8d4d Basic list of installed software 2019-01-09 13:45:37 +01:00
740a042b0e Removing timeouts from code 2019-01-09 03:58:54 -08:00
6b4a5337d8 Bug fixing 2019-01-09 01:38:07 -08:00
77a47e8fd2 Installed software link in application menu when in electron 2019-01-09 10:20:17 +01:00
8aa4e33011 Expended list of settings on default 2019-01-09 09:54:28 +01:00
417cdfb105 Text editing moved to common component 2019-01-08 06:53:01 -08:00
09b87fa747 Merge pull request #250 from GNS3/publisher-in-apps
Add publisher name to Apps and features, Fixes: #249
2019-01-08 14:32:06 +01:00
56cd254579 Add publisher name to Apps and features, Fixes: #249 2019-01-08 14:31:24 +01:00
af1957915b Unit tests for new components added 2019-01-08 05:13:52 -08:00
7db2fea996 Updating signing certificate in README 2019-01-08 14:11:09 +01:00
f4cc1b73bd Merge pull request #248 from GNS3/code-signing-windows
Add publisher name to electron-builder.yml, Fixes: #105
2019-01-08 14:01:48 +01:00
32646889df Adding drawings rewritten 2019-01-08 03:06:25 -08:00
f29a50c02e Add publisher name to electron-builder.yml, Ref: #105 2019-01-08 11:48:38 +01:00
fe9e322c1f Code refactoring 2019-01-04 10:06:41 -08:00
39bacef792 Merge pull request #246 from GNS3/white-screen-on-windows
Fixing white screen on Windows, Fixing: #244
2019-01-04 14:29:14 +01:00
404521881d Remove unused dependency from package.json 2019-01-04 13:00:49 +01:00
218a2a511d Fix white screen on electron app, Ref: #244 2019-01-04 12:57:58 +01:00
37ec1cc21d Code responsible for adding text refactored 2019-01-04 03:17:10 -08:00
d7529e93fd Fix base href for electron env 2019-01-04 10:58:35 +01:00
c9b0eca05b Exchanging tools to components 2019-01-03 07:17:47 -08:00
f4fbfe1ed3 Merge pull request #243 from GNS3/windows-installation-improvements
License view and ask for path to install on Windows, Fixes: #242, #241
2019-01-03 11:21:09 +01:00
949eaf2b8b License view and ask for path to install on Windows, Fixes: #242, #241 2019-01-03 11:07:06 +01:00
2c6a2e7a8b Merge pull request #238 from GNS3/fix-rotated-node-label
Fix rotated node label border, Fixes: #237
2019-01-02 14:37:14 +01:00
81562b5d80 Fix rotated node label border, Fixes: #237 2019-01-02 14:36:33 +01:00
c0d77ed279 Review fixes 2018-12-31 07:14:48 -08:00
5eee9c9563 Unit tests for extracted components 2018-12-29 02:02:32 -08:00
b156622c67 Merge pull request #235 from GNS3/greenkeeper/bootstrap-4.2.1
Update bootstrap to the latest version 🚀
2018-12-28 11:34:08 +01:00
2fb0c6cfbc Merge branch 'master' into greenkeeper/bootstrap-4.2.1 2018-12-28 11:33:58 +01:00
f9eab66bef Merge pull request #234 from GNS3/greenkeeper/electron-4.0.0
Update electron to the latest version 🚀
2018-12-28 11:32:53 +01:00
2ce1dd5066 chore(package): update lockfile yarn.lock 2018-12-21 19:43:36 +00:00
eb0913c69f fix(package): update bootstrap to version 4.2.1 2018-12-21 19:43:32 +00:00
5cabe20728 Unit tests for new components added 2018-12-21 05:30:39 -08:00
7e4ebded24 chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-12-21 00:46:57 +00:00
26c83152b4 chore(package): update electron to version 4.0.0 2018-12-21 00:42:07 +00:00
0691a17d29 Removing listeners from project map component 2018-12-20 05:19:19 -08:00
085b099e96 Fixes after review 2018-12-19 07:25:09 -08:00
e2a01a6f22 Update packages, Fixes: #233 2018-12-19 09:29:16 +01:00
79f174faea Merge branch 'code-refactoring' into add-text 2018-12-18 05:58:26 -08:00
9ce2adfb67 extracting code from main component 2018-12-18 05:53:18 -08:00
ea3886650c Merge pull request #230 from GNS3/greenkeeper/electron-3.0.12
Update electron to the latest version 🚀
2018-12-18 12:45:56 +01:00
cbddb8344d chore(package): update lockfile yarn.lock 2018-12-14 22:50:56 +00:00
50d28e10f3 chore(package): update electron to version 3.0.12 2018-12-14 22:50:52 +00:00
019584c32c extracting methods from main component 2018-12-14 03:17:38 -08:00
d7eb21a0da Code cleaned up 2018-12-13 05:44:48 -08:00
c951a405af Removing bugs 2018-12-13 05:34:17 -08:00
3e9eb81dfd Fix interface labels positions 2018-12-13 13:04:52 +01:00
894b7904c3 Code cleaned up 2018-12-13 03:53:53 -08:00
e58d33f690 Removing bug from chrome browser 2018-12-13 03:29:26 -08:00
b733d94fbe Adjust text conversion 2018-12-13 10:17:02 +01:00
f859dc0c22 Merge branch 'master' into add-text 2018-12-13 01:05:59 -08:00
2a859e6329 Fix updating text position when zoomed in/out 2018-12-13 09:46:00 +01:00
f866741011 Round position of nodes and drawings during update to the closest integer 2018-12-13 09:17:04 +01:00
e76d6c4236 Fix gray background of drawing menu on Chrome 2018-12-13 08:38:11 +01:00
9c02e63d69 Disable drawing menu when in read only mode 2018-12-13 08:36:20 +01:00
852e265273 Apply gray background fix only on Firefox 2018-12-13 08:35:05 +01:00
0ab6cf2f93 Merge branch 'develop' 2018-12-13 07:59:43 +01:00
a59534be65 Merge pull request #208 from GNS3/add-rectangle-change-border-position
Add rectangle change border position
2018-12-13 07:59:00 +01:00
f0582e6a9e Reimplementation of text editing 2018-12-12 06:55:22 -08:00
674d0c4980 Fix for tests 2018-12-12 04:29:18 -08:00
92d6c8e411 Reimplementation of adding text 2018-12-12 03:34:44 -08:00
78df22fae4 Merge branch 'add-rectangle-change-border-position' of https://github.com/GNS3/gns3-web-ui into add-rectangle-change-border-position 2018-12-11 06:14:07 -08:00
a12af56561 Update project-map.component.ts
Exchanging adding text methods
2018-12-11 06:14:04 -08:00
2b7ad9e50d Merge pull request #228 from GNS3/appliances-to-templates
Rename appliances to templates in order to support 2.2 API, Fixes #227
2018-12-11 14:28:18 +01:00
ff8f595cd4 Rename appliances to templates in order to support 2.2 API, Fixes #227 2018-12-11 14:26:44 +01:00
79a374db9d Fix background on drawing toolbar and SVG 2018-12-11 13:49:06 +01:00
13828b6d13 Resizing of drawings on Firefox, Fixes: #226 2018-12-11 13:35:57 +01:00
7fff8feec7 Bug with drawer removed 2018-12-11 02:09:40 -08:00
16ee7f2f95 Removing bugs 2018-12-11 01:36:23 -08:00
72a0a8dfcb Cleanup 2018-12-11 00:55:51 -08:00
c466275e62 Merge branch 'add-rectangle-change-border-position' of https://github.com/GNS3/gns3-web-ui into add-rectangle-change-border-position 2018-12-11 00:46:19 -08:00
79157854be Adding text separated from main component 2018-12-11 00:37:55 -08:00
9390fd4bbe Merge branch 'master' into add-rectangle-change-border-position 2018-12-11 08:32:27 +01:00
2cc27b332d Fix missing select import 2018-12-11 08:32:08 +01:00
3bff5af16e Merge pull request #224 from GNS3/greenkeeper/electron-3.0.11
Update electron to the latest version 🚀
2018-12-11 08:29:14 +01:00
59e7624537 chore(package): update lockfile yarn.lock 2018-12-11 00:57:12 +00:00
8a5fe2c57a chore(package): update electron to version 3.0.11 2018-12-11 00:57:09 +00:00
8ceb839052 Clean not used dependecies in package.json, Fixes: #221 2018-12-10 14:22:48 +01:00
5597168e88 Merge branch 'add-rectangle-change-border-position' of https://github.com/GNS3/gns3-web-ui into add-rectangle-change-border-position 2018-12-10 05:18:34 -08:00
1b2206852b Saving edited text 2018-12-10 05:17:40 -08:00
8e6abf8b55 Add Hammer.JS to project, Fixes: #222 2018-12-10 14:08:47 +01:00
64a0da4d4c Add license-checker to project, Fixes: #223 2018-12-10 14:04:49 +01:00
8a3709c256 Upgrade packages to the latest version 2018-12-10 13:59:20 +01:00
43453e22ed Merge branch 'develop' 2018-12-10 13:45:32 +01:00
4dc51de39f Implement prettier in package.json, Fixes: #220 2018-12-10 13:44:49 +01:00
47b2dcaf62 Merge pull request #210 from GNS3/greenkeeper/@angular-devkit/build-angular-0.11.0
Update @angular-devkit/build-angular to the latest version 🚀
2018-12-10 13:16:16 +01:00
b1988650b8 Merge branch 'master' into greenkeeper/@angular-devkit/build-angular-0.11.0 2018-12-10 13:16:06 +01:00
fdd7491fd3 Update README with branches policy 2018-12-10 12:37:17 +01:00
03478fdb60 Merge branch 'develop' 2018-12-10 12:26:48 +01:00
5ef46dd567 Merge pull request #219 from GNS3/2.2-symbols-handling
Support of 2.2 symbols API, Fixes: #218
2018-12-10 12:26:20 +01:00
8ee33a0c07 Support of 2.2 symbols API, Fixes: #218 2018-12-10 12:19:15 +01:00
91046ecd66 Merge remote-tracking branch 'origin/develop' into add-rectangle-change-border-position 2018-12-07 09:45:35 -08:00
492e6869ad Cleaning up code 2018-12-07 09:42:55 -08:00
fb14e657bb Cleaning up files 2018-12-07 09:15:33 -08:00
c0bfc3ed35 Initial implementation of text editing 2018-12-07 09:10:57 -08:00
e389e12181 Code clean 2018-12-07 14:08:55 +01:00
d5f8f78e49 Merge pull request #215 from GNS3/center-label-position
Precalculate labels position in converters, Fixes: #212
2018-11-30 14:01:26 +01:00
622e106f12 Precalculate labels position in converters 2018-11-30 13:59:57 +01:00
acac9edf0e Fix for unit tests 2018-11-28 05:25:04 -08:00
42d1ce522e Merge branch 'develop' into add-rectangle-change-border-position 2018-11-28 04:29:15 -08:00
da1c8b3c11 Unit tests added 2018-11-28 02:49:35 -08:00
007670e4e0 Merge pull request #211 from GNS3/testing-dragging
Testing dragging, Fixes: #185, #184, #183,  #85, #191
2018-11-28 10:30:36 +01:00
e8716f84de Public NodeContextMenuComponent properties 2018-11-28 10:22:19 +01:00
c14a59d946 Tools as public 2018-11-28 10:09:53 +01:00
bfabc6b50c Tests interface labels 2018-11-28 10:04:26 +01:00
fba0c2fdd0 Test dragging drawings 2018-11-27 16:46:09 +01:00
eb36e49622 Test dragging nodes 2018-11-27 16:39:38 +01:00
9184913803 Move draw-link-tool 2018-11-27 13:48:30 +01:00
6c2399357d Unit test for drawing resizing component added 2018-11-27 03:57:29 -08:00
f0f3ee1bf7 Fix paths 2018-11-27 12:40:13 +01:00
e0b84d81cb Move experimental components into experimental-map 2018-11-27 12:38:39 +01:00
0f29270cb8 Exclude experimental map from coverage 2018-11-27 11:31:12 +01:00
b83d2c8efd Debugging configruation and merge with latest angular 2018-11-27 11:26:23 +01:00
462c994143 chore(package): update lockfile yarn.lock 2018-11-26 20:01:59 +00:00
e7456b18d9 chore(package): update @angular-devkit/build-angular to version 0.11.0 2018-11-26 20:01:55 +00:00
81f9a65617 Simplify coverage command 2018-11-26 16:45:13 +01:00
6fc98e3577 Merge branch 'develop' into add-rectangle-change-border-position 2018-11-26 07:17:39 -08:00
d0d5a1c185 Code cleaned up 2018-11-26 07:03:22 -08:00
ae9572032d Merge pull request #209 from GNS3/dragging-interface-labels
Dragging interface labels,  Ref. #184
2018-11-26 14:36:45 +01:00
2bb1dbb321 Adding new blank project and importing project disabled when experimental features are disabled 2018-11-26 14:33:08 +01:00
a4a4415c38 Map settings introduction and disable dragging of labels and interfaces when in readonly 2018-11-26 14:29:51 +01:00
21a85cd69a Resizing line added 2018-11-26 05:19:48 -08:00
1217c4e31c Remove unused code 2018-11-26 14:10:14 +01:00
8b91549984 Drag interface labels 2018-11-26 13:36:33 +01:00
01cefc5c79 Remove debug 2018-11-26 10:23:51 +01:00
204eae98c4 Improve multiline text position 2018-11-26 09:54:44 +01:00
f48a029315 Code cleaned-up 2018-11-23 05:34:59 -08:00
317f537de3 Merge branch 'develop' into add-rectangle-change-border-position 2018-11-23 02:57:08 -08:00
683a7bab1c Adding drawings finished 2018-11-23 01:46:53 -08:00
36ea584d62 Menu extended 2018-11-22 05:42:46 -08:00
bd2fdd318e Fix onNodeClicked 2018-11-21 12:59:51 +01:00
790297c3f7 Merge pull request #207 from GNS3/merge
Angular's experimental implementation of map and dragging nodes labels, Ref: #185
2018-11-21 11:31:47 +01:00
c1b9d29b43 Fix tests 2018-11-21 11:24:43 +01:00
3e4bf71c9c Apply rotation to node label selection 2018-11-21 10:56:52 +01:00
593a91dfd3 Improve position of rotated node label 2018-11-21 10:48:21 +01:00
f802d8d952 Dragging nodes labels and updating their positions 2018-11-21 10:42:36 +01:00
974759fc61 Saving data for rectangle added 2018-11-21 01:26:50 -08:00
f469a8dbe1 Initial implementation 2018-11-20 23:55:17 -08:00
f9d8f0db29 Draw node label selection 2018-11-20 15:46:29 +01:00
c68a332143 Missing files 2018-11-20 13:47:56 +01:00
311ef8c348 Merge with different approach 2018-11-20 13:43:59 +01:00
dea0f58ea0 Merge branch 'develop' into add-rectangle-change-border-position 2018-11-20 00:16:46 -08:00
8de4c6ea4b Merge with develop 2018-11-19 09:09:58 +01:00
27946c6a8e Merge pull request #203 from GNS3/upgrade-packages-11-2018
Upgrade packages, Fixes: #179
2018-11-19 09:02:19 +01:00
4a0b960634 Update packages, incl. Angular 7, Ref. #179 2018-11-19 08:28:24 +01:00
c81a1fa659 Merge 2018-11-19 08:19:20 +01:00
759307266c Merge branch 'develop' into add-rectangle-change-border-position 2018-11-16 06:51:53 -08:00
409133db42 Merge pull request #200 from GNS3/change-communication-between-map-and-project
Move out responsibilities to project-map
2018-11-16 13:49:27 +01:00
17b07de620 Clean unused code 2018-11-16 13:49:06 +01:00
8de7e58dec Move out responsibilities to project-map 2018-11-16 11:38:42 +01:00
2f5f6fe4eb Merge branch 'develop' into add-rectangle-change-border-position 2018-11-15 03:19:11 -08:00
3595a47d56 Merge pull request #160 from GNS3/greenkeeper/bootstrap-4.1.3
Update bootstrap to the latest version 🚀
2018-11-15 12:03:38 +01:00
a01fb0b0c2 Merge branch 'master' into greenkeeper/bootstrap-4.1.3 2018-11-15 12:03:30 +01:00
63281ee25d Merge pull request #162 from GNS3/greenkeeper/@angular-devkit/build-angular-0.7.0
Update @angular-devkit/build-angular to the latest version 🚀
2018-11-15 12:01:33 +01:00
8590975acc Merge branch 'master' into greenkeeper/@angular-devkit/build-angular-0.7.0 2018-11-15 12:01:24 +01:00
84aa5d050a Merge pull request #163 from GNS3/greenkeeper/electron-2.0.6
Update electron to the latest version 🚀
2018-11-15 11:59:29 +01:00
bdc80d3f68 Merge branch 'master' into greenkeeper/electron-2.0.6 2018-11-15 11:59:20 +01:00
f73d3e9080 Merge pull request #164 from GNS3/greenkeeper/jasmine-core-3.2.0
Update jasmine-core to the latest version 🚀
2018-11-15 11:58:54 +01:00
54eb2b54ab Merge branch 'master' into greenkeeper/jasmine-core-3.2.0 2018-11-15 11:58:47 +01:00
f4a45947e1 Merge pull request #165 from GNS3/greenkeeper/karma-3.0.0
Update karma to the latest version 🚀
2018-11-15 11:58:20 +01:00
ab0bb9e933 Merge branch 'master' into greenkeeper/karma-3.0.0 2018-11-15 11:58:11 +01:00
e668413f55 Merge pull request #166 from GNS3/greenkeeper/@ng-bootstrap/ng-bootstrap-3.0.0
Update @ng-bootstrap/ng-bootstrap to the latest version 🚀
2018-11-15 11:51:28 +01:00
9036dad96d Merge branch 'master' into greenkeeper/@ng-bootstrap/ng-bootstrap-3.0.0 2018-11-15 11:51:13 +01:00
7112da2e96 Merge pull request #167 from GNS3/greenkeeper/@types/node-10.7.0
Update @types/node to the latest version 🚀
2018-11-15 11:50:11 +01:00
5a8206750e Merge pull request #198 from GNS3/data-model-change
Data model change
2018-11-15 11:43:28 +01:00
ba8bcb8c18 Merge branch 'develop' into data-model-change 2018-11-15 11:41:58 +01:00
dd454b2eda Merge pull request #195 from GNS3/adding-blank-project
Adding blank project
2018-11-15 11:40:38 +01:00
97e8be855c Clean code 2018-11-15 11:35:20 +01:00
35bb758244 Clean 2018-11-15 11:31:39 +01:00
e174de142c Disable/enable selection 2018-11-15 10:12:53 +01:00
b8ea53b32b Redirecting to project page after creating added 2018-11-15 01:00:48 -08:00
320ce4a827 Force to make it green 2018-11-15 09:09:14 +01:00
9e54287e1c Remove last dependecies on selection store 2018-11-14 16:29:31 +01:00
c25e7f538d Merge store into selection manager and separate selection listener 2018-11-14 16:24:12 +01:00
71ae1f374f Drag nodes and drawings at the same time 2018-11-14 14:51:27 +01:00
332303da4c Update nodes and drawings at the same time 2018-11-14 14:20:30 +01:00
0e04e85e53 New selection manager and graph data manager 2018-11-14 11:54:40 +01:00
39bc162414 fixes after cr 2018-11-14 00:50:00 -08:00
618f966361 Fixes after review 2018-11-13 15:10:24 -08:00
e4e9c671c7 Use Map* instead of plain models 2018-11-09 14:46:56 +01:00
0e35d1c7f6 Initial implementation of adding blank projects 2018-11-09 02:13:54 -08:00
17e59fde68 Symbols converter 2018-11-09 09:31:15 +01:00
600bb91ad1 Converters between server and map models 2018-11-09 09:05:41 +01:00
b10e345261 clean 2018-11-09 06:35:36 +01:00
290ca022e2 clean 2018-11-08 15:40:30 +01:00
56138f7fb7 Fix drawings 2018-11-08 13:09:37 +01:00
9d35d47d50 Merge branch 'develop' into drag-nodes-and-drawings 2018-11-08 12:28:35 +01:00
ed604a755e Clean 2018-11-08 12:27:14 +01:00
5cb520f39d Merge branch 'develop' into adding-blank-project 2018-11-08 03:21:27 -08:00
d0c39c8a11 Merge pull request #171 from GNS3/importing-projects
Projects importing
2018-11-08 11:43:54 +01:00
e79522d00e Merge pull request #192 from GNS3/drag-multiple-nodes-at-once
Drag multiple nodes/drawings. Ref: #85, #183
2018-11-08 10:56:14 +01:00
b89e9f1434 Disable dragging on readonly mode 2018-11-08 10:51:56 +01:00
69163e7b6d Drawings can communicate with server after dragged 2018-11-08 10:29:00 +01:00
b7fb7521f2 Drawings can be dragged 2018-11-08 08:41:28 +01:00
6fcbf0da28 Rename DrawingWidget to DrawingShapeWidget 2018-11-08 08:28:19 +01:00
5c51dc043e Merge branch 'master' into importing-projects 2018-11-07 06:00:45 -08:00
b57bc7370b New approach for draggable 2018-11-07 14:44:17 +01:00
58a4ed08b1 Code cleaned up 2018-11-07 05:43:57 -08:00
ce13d3a68c Removing stepper 2018-11-07 05:43:19 -08:00
2f822580a9 Ability to drag more than one node at once 2018-11-07 11:44:33 +01:00
0fe3d0e7ca Separate node rendering from nodes; inital drag multiple nodes 2018-11-07 10:42:22 +01:00
5da90118c7 Canvas size detector 2018-11-06 15:09:14 +01:00
6435a84da2 Clean 2018-11-06 14:59:31 +01:00
cf62f3634b Clean code 2018-11-06 14:45:32 +01:00
467d6b6851 Clean 2018-11-06 14:26:25 +01:00
6f263392a0 Merge pull request #182 from GNS3/chrome-svg-filter
Fix node color selection on Chrome, Fixes: #181
2018-11-06 14:19:14 +01:00
b22d0dfc1d Fix node color selection on Chrome, Fixes: #181 2018-11-06 14:15:29 +01:00
22ddb3d51e Separate events 2018-11-06 13:04:52 +01:00
c6f59243ff Separate imports 2018-11-06 11:50:33 +01:00
6bf5ff133f Upgrade to angular 7, Ref. #179 2018-11-06 11:13:50 +01:00
cf8dacfef1 Merge pull request #178 from GNS3/update-deps-for-gns3server
Update requests to 2.20.0, Fixes: #177
2018-11-06 10:46:45 +01:00
150b3df52e Remove .md from yarnclean 2018-11-06 10:31:09 +01:00
8c17718ddd Update requests to 2.20.0 2018-11-06 10:12:16 +01:00
e254395459 Merge pull request #176 from GNS3/refactor
Refactor, Fixes: #169
2018-11-06 10:06:51 +01:00
f9e3200550 Improve styles for context menus 2018-11-06 09:15:17 +01:00
d0ecd3b2ef Move link creation to cartography 2018-11-06 08:23:39 +01:00
9106e8bf88 Integrities for yarn.lock 2018-11-05 16:05:16 +01:00
caca22edb6 Map change detector ref 2018-11-05 15:24:14 +01:00
e296dd004f Fix tests 2018-11-05 15:10:13 +01:00
e279a1403f Code clean 2018-11-05 14:28:42 +01:00
1d1cf149bb Decouple project-map from map 2018-11-05 14:21:53 +01:00
48dcfcbf1c Node dragged unified way 2018-11-05 12:10:51 +01:00
58f0954c08 Remove callbacks 2018-11-05 11:23:33 +01:00
df75a1bc03 Fix Show/hide interface labels 2018-11-05 08:46:21 +01:00
c4486ee104 Fixes after cr 2018-11-02 02:22:04 -07:00
98acd62b74 Code clean 2018-10-31 12:57:07 +01:00
a681072b86 Code clean 2018-10-31 11:41:47 +01:00
687ce54ccb Move out snapshots from project map 2018-10-31 10:55:55 +01:00
35f16d3eff Fix for tests 2018-10-30 07:50:54 -07:00
606b7fa01c Unit tests for confirmation dialog component added 2018-10-30 07:36:16 -07:00
cc401a584d Confirmation dialog for existing project added, error message handling added 2018-10-30 04:13:37 -07:00
668235936d Fixes after review 2018-10-26 05:35:02 -07:00
4084fb39e0 initial implementation of projects importing 2018-10-25 02:40:37 -07:00
ffb261ce64 clean 2018-10-25 11:35:29 +02:00
055a161b17 Improved separation between Widgets 2018-10-24 16:31:33 +02:00
dcbefa996c seprate dir for links 2018-10-24 10:09:50 +02:00
778efff79a separate createGraph 2018-10-18 12:54:24 +02:00
01586f500f Merge with develop 2018-10-15 14:05:55 +02:00
88ae3704dc fix tests 2018-10-15 13:46:43 +02:00
0b0ebd01d5 Merge pull request #168 from GNS3/automatic-server-discovery
Automatic server discovery, Fixes: #159
2018-10-15 12:12:23 +02:00
40ded4b779 Automatic server discovery 2018-10-15 11:26:50 +02:00
15784887a1 Discover servers 2018-10-10 15:50:10 +02:00
5f64df2273 chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-08-14 02:01:24 +00:00
b2f8239d33 chore(package): update @types/node to version 10.7.0 2018-08-14 01:52:42 +00:00
6113747b2d chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-08-13 09:53:25 +00:00
455d2d561a fix(package): update @ng-bootstrap/ng-bootstrap to version 3.0.0 2018-08-13 09:46:18 +00:00
9b0707d941 chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-08-09 20:34:44 +00:00
cc507ae27e chore(package): update karma to version 3.0.0 2018-08-09 20:26:06 +00:00
ca693582b2 chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-08-09 01:00:29 +00:00
a0b1bd97dd chore(package): update jasmine-core to version 3.2.0 2018-08-09 00:52:01 +00:00
24f5f958f0 isServerAvailable check 2018-08-02 10:13:56 +02:00
b22cfe228e chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-08-01 01:25:36 +00:00
3ac4575e20 chore(package): update electron to version 2.0.6 2018-08-01 01:17:49 +00:00
608198ec29 chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-07-25 23:15:23 +00:00
d332f07786 chore(package): update @angular-devkit/build-angular to version 0.7.0 2018-07-25 23:07:28 +00:00
7996bb567a chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-07-24 16:08:43 +00:00
e368636e31 fix(package): update bootstrap to version 4.1.3 2018-07-24 15:59:53 +00:00
e8e951afa7 Base for server-discovery, Ref: #159 2018-07-23 21:04:11 +02:00
c7d079ed0d Fix default map size 2018-07-23 17:57:09 +02:00
88f6134092 Reenable sentry 2018-07-23 16:37:09 +02:00
da49ac51e6 Disable sentry, Ref: #158 2018-07-20 13:28:49 +02:00
fd606194b8 Disable base href for electron 2018-07-20 09:01:37 +02:00
5b335f25e9 Merge pull request #156 from GNS3/greenkeeper/protractor-5.4.0
Update protractor to the latest version 🚀
2018-07-19 10:45:33 +02:00
cc8c6aa947 Remove Prototype, fix path to font 2018-07-19 10:42:04 +02:00
7042d2710c Add font on win and move sentry to deps instead of devDeps, Ref:#158,#157 2018-07-19 10:36:12 +02:00
a916b00ef8 Move models 2018-07-19 10:00:09 +02:00
d4d3b7a281 chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-07-18 17:56:26 +00:00
838eca6ebc chore(package): update protractor to version 5.4.0 2018-07-18 17:47:54 +00:00
e4e8fe6151 Disable LocationStrategies if on electron/non-electron, README update 2018-07-16 10:28:45 +02:00
9cf8e7e566 Fix tests 2018-07-09 09:55:50 +02:00
910fa5ae33 Dynamic routing strategy, fixed for AOT changes 2018-07-06 15:18:24 +02:00
faf214ea40 Re-enable cache 2018-07-06 13:24:17 +02:00
957871e459 Check also pip version 2018-07-06 13:19:44 +02:00
827f036cf1 Check python version 2018-07-06 13:18:16 +02:00
610b7384c5 Use configuration instead of env switch for building 2018-07-06 13:16:45 +02:00
4700a153cc Increase network timeout for material-design-icons 2018-07-06 13:06:29 +02:00
d641cc6ce6 Lock down typescript to <2.8.0 and fix tests 2018-07-06 12:36:25 +02:00
993084290c merge 2018-07-06 11:58:39 +02:00
cde77ab232 Node as Element, Ref: 154 2018-07-06 11:50:42 +02:00
06269bf2a2 Basic migration to RxJS 6, Ref: #154 2018-07-06 11:31:44 +02:00
65c0739b3e Fix tests 2018-07-06 10:17:34 +02:00
290ce6641f getLocalServer tests 2018-07-05 13:14:38 +02:00
bcc21da585 Server service tests 2018-07-05 12:56:46 +02:00
9888b6db74 Improve ServerError tests 2018-07-05 09:50:13 +02:00
0c58ec9260 Project - readonly tests 2018-07-05 09:42:48 +02:00
acc4fdc3c5 Tests for ServerError 2018-07-05 09:35:02 +02:00
b7ef2fe643 CCI: Back to 9.3.0 2018-07-05 07:56:21 +02:00
3ee8883d13 CCI: 9.4.0 image 2018-07-05 07:53:46 +02:00
2374be1d83 Merge branch 'master' into fix-cci 2018-07-05 07:42:55 +02:00
c2f37a5f5f Merge pull request #153 from GNS3/server-errors
Improve errors when server is unavailable, Fixes: #146
2018-07-04 13:49:51 +02:00
db3e700204 Progress error status, Fixes: #146 2018-07-04 13:44:35 +02:00
ca45804b5e Move error handlers into one dir 2018-07-03 11:40:12 +02:00
0cc0b765b5 Handle case when server is unavailable, Ref: #146 2018-07-03 11:34:37 +02:00
12228fe733 Try with Xcode 9.3.0 2018-07-02 12:51:52 +02:00
82c3c8daec Clean CCI 2018-07-02 12:37:55 +02:00
c3667a344a Try with default python3 version 2018-07-02 12:34:34 +02:00
976eb283f4 Python3 version 2018-07-02 12:32:00 +02:00
94135d0aa7 Remove brew update na python upgrade 2018-07-02 12:25:42 +02:00
ed84799ed1 Fix naming 2018-07-02 12:23:22 +02:00
5f4515e2fb Toaster - default error handler 2018-07-02 12:11:43 +02:00
fff1439238 Merge pull request #151 from GNS3/start-stop
Open/close projects, Fixes: #148
2018-07-02 11:10:04 +02:00
9138d73b5d Open/close projects, Fixes: #148 2018-07-02 11:09:19 +02:00
e6669a7df8 Merge pull request #149 from GNS3/progress
Progress, small refactor and sentry fixes.
2018-06-27 12:36:58 +02:00
0435fcec89 Send version to Sentry 2018-06-27 12:34:15 +02:00
957b93ec41 Disable delete button 2018-06-27 10:58:45 +02:00
a2d9ba678e Fix paths 2018-06-27 10:58:04 +02:00
e82b4e48cd Introduce components directories 2018-06-27 10:34:15 +02:00
4f3ad287f0 Drop shared directories 2018-06-27 10:29:12 +02:00
4145581caf Move MockedToasterService to spec 2018-06-27 10:23:04 +02:00
6a85c2754e Progress component tests 2018-06-27 10:18:25 +02:00
934c2f9933 Progress screen 2018-06-26 16:47:40 +02:00
5bb5374b65 Merge pull request #147 from GNS3/local-server
Local server support and limit experimental features
2018-06-26 12:12:41 +02:00
0cb1b4197a Local server support 2018-06-26 11:13:09 +02:00
f1493800cd Basic support of local server 2018-06-22 13:41:09 +02:00
d929cd4187 Limit experimental features 2018-06-22 12:01:46 +02:00
e6c1851b16 Introduction of experimental features 2018-06-14 15:52:41 +02:00
c2f8065890 Merge pull request #144 from GNS3/show-hide-interfaces
Show/hide interfaces labels support, Fixes: #133
2018-06-11 15:38:43 +02:00
2b5b73ba38 Show/hide interfaces labels support, Fixes: #133 2018-06-11 14:08:35 +02:00
53db28b5dc Fix nodes default labels font and position 2018-06-11 12:37:13 +02:00
ee850fbfe6 Improve CodeCov 2018-05-30 12:22:18 +02:00
a536452cd0 Merge pull request #141 from GNS3/read-only-mode
Read-only mode for WebUI per project and other features, Fixes: #113
2018-05-29 17:46:01 +02:00
505f3fb59e Disable selectiontool when in readonly mode 2018-05-29 17:44:16 +02:00
e2a21bbd2b Disable dragging on readonly project 2018-05-29 17:23:08 +02:00
0d18166848 Fix ethernet and serial links 2018-05-29 15:19:47 +02:00
96ec866b2e Improved text position matching 2018-05-29 13:14:55 +02:00
f01cf63a6c Drawing: Text with text-decoration support, Fixes: #139 2018-05-28 15:40:40 +02:00
289abf344f Fix tests 2018-05-28 15:31:04 +02:00
cc2544e3d0 Drawings - rotation support, Fixes: #140 2018-05-28 15:24:39 +02:00
46d028a4d2 Qt ArrayDash fixer, Ref: #137 2018-05-28 15:01:47 +02:00
cdd377b356 Different styles of border, Ref: #137 2018-05-28 14:23:09 +02:00
2a0a1d7e9f Whitespace support on text field, Fixes: #138 2018-05-28 13:52:30 +02:00
6cdca71a45 Adjust default system font #127 2018-05-28 12:40:49 +02:00
cbe8f2d584 Improve opacity support 2018-05-24 14:56:09 +02:00
599491fa88 Text font color support 2018-05-24 14:51:28 +02:00
fa38d6bdf2 Compact to DrawingWidget 2018-05-21 13:36:57 +02:00
e581f933bc Merge pull request #126 from GNS3/text-drawing
Draw text and other drawing separetly, Fixes: #10
2018-05-21 13:20:46 +02:00
e4c07e7955 Merge remote-tracking branch 'origin/read-only-mode' into text-drawing 2018-05-21 13:17:04 +02:00
b4da7291e5 Fix tests 2018-05-21 13:15:58 +02:00
607e8c199a Small clean 2018-05-21 13:02:48 +02:00
6002ebacdf Drawings - draw as different shapes 2018-05-21 12:59:20 +02:00
bd54786f20 Hide layer up/down when project is readonly 2018-05-17 16:54:09 +02:00
edcf42cf77 Don't delete items on topology when in readonly mode 2018-05-17 13:46:43 +02:00
0b47232f89 Image drawing widget 2018-05-16 14:29:54 +02:00
230ae32f0e Move converter one level up 2018-05-16 13:52:16 +02:00
8f600b3e72 Draw text on topology 2018-05-16 13:18:44 +02:00
e0ccfda3e2 Merge branch 'master' into text-drawing 2018-05-16 09:24:50 +02:00
ff2f6f4969 Merge pull request #124 from GNS3/up
Update yarn.lock and fix tests
2018-05-16 09:24:17 +02:00
4ec4f41a22 Stop screaming about interface 2018-05-16 09:04:29 +02:00
52456921d1 Fix support for pip>=10, Fixes: #123 2018-05-15 14:05:24 +02:00
e465be94b4 Update packages and fix tests 2018-05-15 13:39:06 +02:00
3169c3bf14 Text converter 2018-05-15 10:09:47 +02:00
44f4388e41 Init SvgToDrawingConverter 2018-05-14 15:05:56 +02:00
3ddc2ee550 Merge pull request #122 from GNS3/draw-interfaces
Draw interfaces, Fixes: #104
2018-05-14 11:46:19 +02:00
c2eac40440 Disable interface selection 2018-05-14 11:44:03 +02:00
efec6c4a04 Merge branch 'draw-interfaces' of github.com:GNS3/gns3-web-ui into draw-interfaces 2018-05-14 10:53:10 +02:00
6ed754252c Border change 2018-04-27 16:38:46 +02:00
5760e77609 Clear selection 2018-04-20 11:48:05 +02:00
4259aad348 Interface labels - surrounding box when selected 2018-04-20 10:29:10 +02:00
384a51ccea Change the way of drawing interfaces 2018-04-17 13:47:18 +02:00
03b61b371a Fix drawing lines, Ref: #111 2018-04-16 16:56:21 +02:00
7415a915ed Improved positions of interfaces 2018-04-16 16:50:50 +02:00
ad8a064879 Hide statuses when too close 2018-04-16 15:26:22 +02:00
1782c6c3d3 Normalize positions of elements, Ref: #111, Fix double nodes and drawings 2018-04-16 15:09:04 +02:00
4ca6c05f31 Fix CSS styles when provided wrong from server 2018-04-16 10:21:44 +02:00
a1f8066b0d Update map on project change, Fixes: #110 2018-04-16 08:24:49 +02:00
e6920af03b Doesn't allow user to select labels text during selection 2018-04-13 11:08:52 +02:00
712aef6834 Interface labels tests 2018-04-13 10:50:45 +02:00
a88d829f4d Draw interface labels 2018-04-12 13:15:25 +02:00
9fc90bb0eb Merge branch 'master' into draw-interfaces 2018-04-12 09:11:32 +02:00
dac8979ca3 Adjust initialize of sentry for electron on new lib version 2018-04-11 12:32:33 +02:00
342e87e42e Merge pull request #108 from GNS3/update-packages-2
Update packages
2018-04-11 09:28:24 +02:00
0a754a70e5 Fix tests and lock typescript 2018-04-11 09:11:18 +02:00
21e9932cbc Update packages 2018-04-11 08:44:20 +02:00
23ff9a8897 Preparation for interfaces labels 2018-04-11 08:21:01 +02:00
5522322ff1 Disable server startup on running electron 2018-04-10 13:09:42 +02:00
0d83972e71 Missing files for electron build 2018-04-10 13:08:15 +02:00
8f83ebea1c Merge pull request #102 from GNS3/local-fonts
Fonts&icons offline in electron app, Fixes: #94
2018-04-10 12:47:22 +02:00
fe4cd9082b Fonts&icons offline in electron app, Fixes: #94 2018-04-10 12:45:40 +02:00
99fceed253 Form for supporting servers with credentials, Ref: #100 2018-04-10 11:25:31 +02:00
31df9cfb93 Projects list can be sorted, Fixes: #99 2018-04-10 10:57:29 +02:00
6286980327 Fix issue with wrong base-href for github.io 2018-04-09 15:24:41 +02:00
b0461d69ea Merge pull request #98 from GNS3/scrolls
Support scrolls on svg bigger than screen, Fixes: #97
2018-04-09 14:16:22 +02:00
f62552da63 Support scrolls on svg bigger than screen, Fixes: #97 2018-04-09 14:14:49 +02:00
8280532764 Make project-toolbar sticky 2018-04-09 11:47:51 +02:00
e38bc532b2 Fix footer on the long list, Fixes: #55 2018-04-09 11:28:34 +02:00
74e60bd8d0 Support canvas transformation when dragged, Fixes: #96 2018-04-09 10:37:58 +02:00
01f2518323 Merge pull request #95 from GNS3/sentry
Connect crash analytics service, Fixes: #13
2018-04-09 09:25:12 +02:00
82aa9c6c51 Remove unnecessary html 2018-04-09 09:24:54 +02:00
9c2f8eeda6 Fix tests for AppComponent 2018-04-09 09:19:35 +02:00
2e0eae5602 Disable cache 2018-04-09 08:59:19 +02:00
cda17e0e88 CCI: back to yarn.lock cache 2018-04-06 13:37:18 +02:00
1da29a2096 CCI: remove yarn cache dir from cache 2018-04-06 13:33:59 +02:00
0ee66da007 Communication with electron, Ref. #13 2018-04-06 13:15:23 +02:00
37acae2697 Cleaning 2018-04-06 10:04:11 +02:00
dd98b69f3a Send IPC settings.changed event to Electron, Ref. #13 2018-04-06 10:03:16 +02:00
9ea42966d3 CCI: cache based on package.json 2018-04-06 08:24:20 +02:00
23d8740782 Test SettingsComponent 2018-04-06 07:50:28 +02:00
f893714d69 Fix Raven tests 2018-04-05 15:45:21 +02:00
6f0de11bda Local settings and sentry 2018-04-04 16:05:29 +02:00
116b164da2 Check if we are on develop version and don't send reports 2018-04-03 15:58:21 +02:00
3db58dfe7c Support Sentry for electron, Ref: #13 2018-04-03 14:35:41 +02:00
235d841b1e Report to sentry only on production 2018-03-30 12:48:27 +02:00
d84af3dd4d Integration with angular sentry, Ref: #13 2018-03-30 12:42:42 +02:00
352a9a1fa3 Merge pull request #93 from GNS3/keyboard-shortcuts
Delete nodes by `delete` key, Fixes: #86
2018-03-30 12:10:34 +02:00
c913c351cc Symbol and Version services tests 2018-03-30 12:01:59 +02:00
51f4fe4627 Snapshot and Version services tests 2018-03-30 11:38:08 +02:00
6513cb565c ProjectService tests 2018-03-30 11:13:48 +02:00
d8d6398d26 NodeService tests 2018-03-30 11:04:03 +02:00
d5807070f4 LinkService tests 2018-03-30 10:41:19 +02:00
c87c8f12fb IndexedDbService 2018-03-30 10:11:36 +02:00
014cef0697 Improved separation between links, nodes and drawings 2018-03-30 09:27:45 +02:00
758c8ad7c7 Removed uncecessary files 2018-03-30 09:15:00 +02:00
228dd64d81 Delete nodes by delete key, Fixes: #86 2018-03-30 09:13:30 +02:00
1040db4308 Merge pull request #92 from GNS3/different-layers
Support of drawing elements on different layers, Fixes: #11
2018-03-30 07:48:35 +02:00
343544ff4c Merge pull request #91 from GNS3/speed-up-travis
Speed up TravisCI, AppVeyor and CircleCi, Fixes: #46,#47,#48
2018-03-30 07:22:41 +02:00
ce9dd9eb66 Cache yarn on CircleCi, Ref. #48 2018-03-29 15:01:32 +02:00
566919b7d7 Cache yarn on AppVeyor, Ref. #47 2018-03-29 14:58:01 +02:00
06209d8881 Try also with node_modules cache, Ref. 46 2018-03-29 14:54:16 +02:00
31527f8ab6 Speed up TravisCI builds using cache, Ref. #46 2018-03-29 13:50:40 +02:00
ef337d6a19 Make sure we have correct layer 2018-03-29 13:00:36 +02:00
e23e920278 Check if Layers are updated 2018-03-29 12:59:36 +02:00
44bda141b8 Move node to one layer up/down 2018-03-29 12:36:35 +02:00
789a69cabb LinksWidget tests 2018-03-29 09:33:20 +02:00
c75f8ce459 LayersManager 2018-03-28 16:20:00 +02:00
e2779620d3 Apply style 2018-03-28 13:22:57 +02:00
9dfbd5268b InRectangleHelper tests 2018-03-28 13:17:26 +02:00
38e172f9b6 ts-mockito and tests LayersWidget 2018-03-28 12:02:58 +02:00
dab3db3f17 Remove .widget from files and introduce TestSVGCanvas 2018-03-28 10:03:04 +02:00
cc27c56216 Support drawings on WS 2018-03-27 17:50:06 +02:00
ce6a727300 Get nodes earlier than nodes for compatibility 2018-03-27 17:29:41 +02:00
3d42d46987 DrawingsDataSource 2018-03-27 17:21:50 +02:00
1dc911fc92 Correct position of links 2018-03-27 16:57:39 +02:00
f03abfe761 Different layers, Ref: #11 2018-03-27 16:57:22 +02:00
bdbbc0a3f4 Update README for using yarn 2018-03-26 12:04:28 +02:00
2f5360b174 Merge pull request #87 from GNS3/greenkeeper/electron-1.8.4
Update electron to the latest version 🚀
2018-03-26 10:28:45 +02:00
3a1a21e9c1 Merge pull request #89 from GNS3/greenkeeper/@types/node-9.6.0
Update @types/node to the latest version 🚀
2018-03-26 10:28:25 +02:00
b033b7b9b3 Merge pull request #90 from GNS3/selection
Select nodes on topology, Ref. #16
2018-03-26 10:27:43 +02:00
9f86414210 Merge when updates items in datasource 2018-03-26 10:25:30 +02:00
c5de9256c7 Change the way of selection 2018-03-23 13:44:41 +01:00
33606b4cd7 Small refactor 2018-03-23 11:32:09 +01:00
b819e106fc Manually select nodes and links 2018-03-23 11:29:35 +01:00
28ead48c40 Selection Manager 2018-03-23 10:30:22 +01:00
1d6499e33b chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-03-22 22:09:22 +00:00
18c01facea chore(package): update @types/node to version 9.6.0 2018-03-22 22:04:41 +00:00
6dc7f870b2 Select links and nodes 2018-03-22 15:40:06 +01:00
0cc1cd8db1 More tests for HttpServer 2018-03-21 11:41:53 +01:00
b4e2b38585 Tests for HttpServer 2018-03-21 11:22:42 +01:00
8dcace80e0 Tests for ApplianceService 2018-03-21 11:06:29 +01:00
201b802707 Correct way of loading symbols 2018-03-21 10:06:39 +01:00
d399a59d7f Update Http to HttpClient, Ref: #88 2018-03-20 16:02:41 +01:00
d24a6aeed6 Try to test http service 2018-03-20 12:54:58 +01:00
b60d2362ef Symbols datasource and models names refactor 2018-03-20 08:18:36 +01:00
7224bade9c Move clearing graph layout into disconnect 2018-03-19 15:39:39 +01:00
e2bcd72319 Introduce Nodes and Links DataSources 2018-03-19 15:09:22 +01:00
8432fb9d24 Project WS Handler refactor 2018-03-19 15:01:18 +01:00
2cbe216f76 Fix tests 2018-03-19 13:28:53 +01:00
6aa7070196 NodesDataSource 2018-03-19 13:23:39 +01:00
65b491e54e Move transformation not as inline function 2018-03-19 11:24:40 +01:00
3d25633a38 Get selected nodes 2018-03-19 10:30:29 +01:00
40afdd93b5 chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-03-16 20:33:13 +00:00
576bda1cb1 chore(package): update electron to version 1.8.4 2018-03-16 20:27:27 +00:00
bfe6613871 Nodes can be deselected on click 2018-03-15 15:27:35 +01:00
3192ce4376 Graphically select nodes 2018-03-15 15:19:50 +01:00
f7ec7ea7df Context with centering 2018-03-15 10:33:56 +01:00
e785790cf5 MovingTool tests 2018-03-15 10:31:13 +01:00
1867a77b2b Test deactivation of SelectionTool 2018-03-14 14:21:05 +01:00
7f03d2f372 Removed beforeEach 2018-03-14 14:07:44 +01:00
477ed3008f SelectionTool tests 2018-03-14 14:01:10 +01:00
5987ea8fc7 Activation/deactivation of selection/zoom works 2018-03-14 10:38:28 +01:00
5d1783af5c Move moving tool outside graph 2018-03-13 16:10:33 +01:00
31a20c2709 Deactivate/activate tools 2018-03-13 15:05:50 +01:00
c128863d47 Use python3 on CirleCI 2018-03-13 14:06:42 +01:00
2449ba8c66 Project toolbar toggle moving button 2018-03-13 14:04:42 +01:00
ca1a6ad6cd Selection UI, Ref. #16 2018-03-13 13:03:27 +01:00
7589c46285 Merge branch 'master' into selection 2018-03-13 09:39:16 +01:00
483aa5f38f Merge branch 'master' of github.com:GNS3/gns3-web-ui 2018-03-12 15:13:53 +01:00
f5f5cd172a Black&white effect on hover node 2018-03-12 15:13:41 +01:00
f92596bd25 Merge pull request #82 from GNS3/coverage
Coverage support, Fixes: #51
2018-03-12 14:22:58 +01:00
ac534093d1 Code coverage, Fixes: #51 2018-03-12 14:22:02 +01:00
5ca570e593 Codecov support 2018-03-12 13:43:03 +01:00
fd5a5c2079 chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-03-09 09:10:47 +01:00
c0698d588a chore(package): update @angular/cli to version 6.0.0-beta.5 2018-03-09 09:10:47 +01:00
9fd3770a15 Remove ng2-toasty from styles 2018-03-09 09:07:17 +01:00
ee030344ca Remove ng2-toasty from deps 2018-03-08 09:17:26 +01:00
787768ed7e Merge pull request #78 from GNS3/fix-circle-ci
Python3 as default on CircleCI, Ref. #77
2018-03-08 09:16:00 +01:00
97b0879b34 Python3 as default on CircleCI, Ref. #77 2018-03-08 09:02:35 +01:00
6b6d898091 Merge pull request #76 from GNS3/replace-ng-toasty-with-md
Replace ng2-toast with material snacbar, Fixes: #75
2018-03-08 08:49:40 +01:00
301edb0bbb Replace ng2-toast with material snacbar, Fixes: #75 2018-03-08 08:48:09 +01:00
5f477a58ce Fix GNS3 icon on the project menu 2018-03-06 11:45:34 +01:00
26cde44cba Merge pull request #74 from GNS3/greenkeeper/electron-1.8.3
Update electron to the latest version 🚀
2018-03-06 09:35:21 +01:00
a96b1a22db chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-03-06 01:52:52 +00:00
8dd02761df chore(package): update electron to version 1.8.3 2018-03-06 01:47:54 +00:00
142c996420 Merge pull request #72 from nabilbendafi/master
Fix e2e test
2018-02-27 11:36:51 +01:00
8d6b5cbd96 Fix e2e test 2018-02-23 17:22:14 +01:00
8b3d953fd3 Merge pull request #70 from nabilbendafi/badge
Add TravisCI/AppVeyor/CircleCI badges
2018-02-23 11:08:59 +01:00
9b2deb8f21 Merge pull request #69 from nabilbendafi/master
Add Dockerfile for development
2018-02-23 11:08:06 +01:00
1862de2bf9 Add TravisCI/AppVeyor/CircleCI badges 2018-02-23 09:14:23 +01:00
19bbb4e90a Move from npm to yarn 2018-02-22 12:05:13 +01:00
02a3d8757a Add Dockerfile for development 2018-02-21 13:21:32 +01:00
26dab454b1 Merge pull request #67 from GNS3/greenkeeper/electron-builder-20.0.4
Update electron-builder to the latest version 🚀
2018-02-20 10:49:05 +01:00
66a10e2638 Merge 2018-02-20 09:52:47 +01:00
75b1abdbd1 Merge pull request #65 from GNS3/greenkeeper/electron-1.7.12
Update electron to the latest version 🚀
2018-02-20 09:42:13 +01:00
f080b6d92a Merge pull request #66 from GNS3/greenkeeper/jasmine-core-2.99.0
Update jasmine-core to the latest version 🚀
2018-02-20 09:41:56 +01:00
361fd782aa Merge pull request #68 from GNS3/greenkeeper/ts-node-5.0.0
Update ts-node to the latest version 🚀
2018-02-20 09:41:40 +01:00
901dee80b2 chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-02-19 22:40:30 +00:00
bdb7bffb2d chore(package): update ts-node to version 5.0.0 2018-02-19 22:34:27 +00:00
82b460bc7d chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-02-13 07:55:15 +00:00
b81ca8f4f7 chore(package): update electron-builder to version 20.0.4 2018-02-13 07:50:30 +00:00
e097adbb91 chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-02-06 18:49:18 +00:00
017ed26ef5 chore(package): update jasmine-core to version 2.99.0 2018-02-06 18:42:43 +00:00
9ced332b7e chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-01-31 22:34:15 +00:00
a8d83d30f5 chore(package): update electron to version 1.7.12 2018-01-31 22:29:15 +00:00
ab565b6708 Merge pull request #62 from GNS3/greenkeeper/@types/node-9.4.0
Update @types/node to the latest version 🚀
2018-01-29 08:16:58 +01:00
2e17ed390c Disable CircleCi and AppVeyor deploys on commits, Fixes: #63 2018-01-29 08:15:53 +01:00
996cae01ef chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-01-26 18:03:32 +00:00
3bc2ee32a2 chore(package): update @types/node to version 9.4.0 2018-01-26 17:58:27 +00:00
03fcdcf91c Merge pull request #61 from GNS3/greenkeeper/protractor-5.3.0
Update protractor to the latest version 🚀
2018-01-26 09:20:53 +01:00
1b75d41ce7 chore(package): update lockfile
https://npm.im/greenkeeper-lockfile
2018-01-25 18:39:47 +00:00
e03c814e52 chore(package): update protractor to version 5.3.0 2018-01-25 18:34:21 +00:00
263f8c9e77 Merge pull request #60 from GNS3/greenkeeper/initial
Update dependencies to enable Greenkeeper 🌴
2018-01-24 08:36:37 +01:00
510a0f9e3d Support for auto-update of lock file, Ref. #59 2018-01-24 08:35:45 +01:00
39ea75e92d Update package.json 2018-01-23 10:20:30 +01:00
22a46491aa Greenkeeper - ignore typescript, Ref. #59 2018-01-23 10:19:45 +01:00
6753d1c027 docs(readme): add Greenkeeper badge 2018-01-23 08:19:04 +00:00
5a282d5574 chore(package): update dependencies 2018-01-23 08:19:01 +00:00
07a3142ddf Merge pull request #58 from GNS3/update-packages
Update package.json, Fixes: #57
2018-01-23 09:12:21 +01:00
d90f126a21 Update package.json, Fixes: #57 2018-01-23 09:01:58 +01:00
da87f5df8a Merge pull request #56 from GNS3/canvas-resizes
Canvas resizes on window size change, fixes #54
2018-01-22 11:59:33 +01:00
6afdeb51a8 Canvas resizes on window size change, fixes #54 2018-01-22 11:58:18 +01:00
e563dd6381 Merge pull request #53 from GNS3/restore-functionalities
Restore functionality, Fixes: #50
2018-01-19 11:11:56 +01:00
dd54cd3689 Restore functionality, Fixes: #50 2018-01-19 11:03:00 +01:00
495cb89030 Merge pull request #52 from GNS3/fix-passing-tests
Fix passing tests
2018-01-18 13:22:40 +01:00
48604fcc95 Add one test to make it green 2018-01-18 12:39:36 +01:00
f9f4f8560b Comment out tests 2018-01-18 12:21:57 +01:00
7edb01534f TravisCI: Workaround for the issue with travis' Chrome 2018-01-18 11:27:22 +01:00
442666fd50 Fix issue with Material Icons and angular/cli-1.6.4 2018-01-18 10:51:17 +01:00
b69b0c7db4 Upgrade packages 2018-01-18 10:50:46 +01:00
de21cbb48b Fix angular2-indexeddb complains 2018-01-18 10:39:20 +01:00
5c18f95c75 Add to README how to upgrade package.json 2018-01-18 10:18:59 +01:00
d38eecd27f Merge pull request #45 from GNS3/travis-validate-gns3server
Travis validate gns3server, Ref. #37, #39
2018-01-18 09:44:57 +01:00
590af0e344 CIs: change build output for gns3server 2018-01-18 09:28:32 +01:00
f20b6a6aa6 Silent gns3build on CIs 2018-01-18 09:18:12 +01:00
004e616ac7 TCI: gns3server validation 2018-01-18 07:48:23 +01:00
843044eef7 Merge pull request #44 from GNS3/fix-gns3server-checks
Add 'idna' to build process, Fixes. #43
2018-01-18 07:44:27 +01:00
068138a772 Add 'idna' to build process, Ref. #43 2018-01-18 07:26:21 +01:00
9f965a200a Merge pull request #42 from GNS3/ignore-package-lock
Ignore package-lock.json, #Ref. 41
2018-01-18 06:46:03 +01:00
81868cdc5e Ignore package-lock.json 2018-01-18 06:45:05 +01:00
855c799d44 Merge pull request #40 from GNS3/electronjs
Initial electronjs integration
2018-01-17 16:28:06 +01:00
55d049e945 Icons set
Build electron for Linux, Windows and macOS. Ref. #18, #19, #20, #22
Include gns3server in electron app. Ref. #21
Bumping version Ref. #24
CD and Release for AppVeyor, CircleCi and TCI. Ref. #25, #26, #27, #28
Make lighter artifacts #31
Build gns3server for Linux, Windows and macOS. Ref. #33, #34, #35
2018-01-17 15:46:45 +01:00
9909fffcbd More selection 2018-01-04 09:17:50 +01:00
e95c63139a Init selection 2018-01-04 09:17:08 +01:00
1127 changed files with 64519 additions and 24506 deletions

View File

@ -1,66 +0,0 @@
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"project": {
"name": "gns3-web-ui"
},
"apps": [
{
"root": "src",
"outDir": "dist",
"assets": [
"assets",
"favicon.ico"
],
"index": "index.html",
"main": "main.ts",
"polyfills": "polyfills.ts",
"test": "test.ts",
"tsconfig": "tsconfig.app.json",
"testTsconfig": "tsconfig.spec.json",
"prefix": "app",
"styles": [
"../node_modules/bootstrap/dist/css/bootstrap.min.css",
"../node_modules/ng2-toasty/bundles/style-material.css",
"styles.css",
"theme.scss"
],
"scripts": [],
"environmentSource": "environments/environment.ts",
"environments": {
"dev": "environments/environment.ts",
"prod": "environments/environment.prod.ts",
"electronProd": "environments/environment.electron.prod.ts",
"electronDev": "environments/environment.electron.ts"
}
}
],
"e2e": {
"protractor": {
"config": "./protractor.conf.js"
}
},
"lint": [
{
"project": "src/tsconfig.app.json",
"exclude": "**/node_modules/**"
},
{
"project": "src/tsconfig.spec.json",
"exclude": "**/node_modules/**"
},
{
"project": "e2e/tsconfig.e2e.json",
"exclude": "**/node_modules/**"
}
],
"test": {
"karma": {
"config": "./karma.conf.js"
}
},
"defaults": {
"styleExt": "scss",
"component": {
}
}
}

View File

@ -3,45 +3,38 @@ version: 1.0.{build}
# Do not build feature branch with open Pull Requests
skip_branch_with_pr: true
cache:
- node_modules -> .appveyor.yml,package.json,yarn.lock
- '%LOCALAPPDATA%\Yarn -> .appveyor.yml,package.json,yarn.lock'
platform:
- x64
#init:
# - git config --global core.autocrlf input
init:
- git config --global core.autocrlf input
install:
- ps: Install-Product node 8 x64
- yarn
- ps: Install-Product node 12 x64
- yarn install
build_script:
- yarn distwin
- ps: $OutputDirectory = $((Get-Date).ToString('yyyy-MM-dd'))
- ps: If ($env:APPVEYOR_REPO_TAG -eq $false) { New-Item -ItemType Directory -Path "$OutputDirectory" }
- ps: If ($env:APPVEYOR_REPO_TAG -eq $false) { move build\*.exe "$OutputDirectory" }
- ps: If ($env:APPVEYOR_REPO_TAG -eq $false) { cd $OutputDirectory; Get-ChildItem -Filter '*.exe' | Rename-Item -NewName {$_.Name -replace ".exe","-$env:APPVEYOR_REPO_BRANCH-$env:APPVEYOR_BUILD_NUMBER.exe"} }
- ps: If ($env:APPVEYOR_REPO_TAG -eq $false) { $execs = Get-ChildItem -Filter '*.exe'; $artifact = $execs[0].basename; }
- ps: If ($env:APPVEYOR_REPO_TAG -eq $false) { cd ..; Push-AppveyorArtifact "$((Get-Date).ToString('yyyy-MM-dd'))\*.exe" -FileName "$((Get-Date).ToString('yyyy-MM-dd'))\$artifact.exe" }
# - ps: If ($env:APPVEYOR_REPO_TAG -eq $true) { yarn release }
- cmd: set NODE_OPTIONS=--max-old-space-size=8092
- yarn buildforelectron
- "%PYTHON%\\python.exe -m pip install -U pip"
- "%PYTHON%\\python.exe -m pip install -r scripts\\requirements.txt"
- "%PYTHON%\\python.exe scripts\\build.py download -a"
- "%PYTHON%\\python.exe scripts\\build.py build_exe -b dist/exe.gns3server -s"
- "%PYTHON%\\python.exe scripts\\build.py validate -b dist"
- "%PYTHON%\\python.exe scripts\\build.py download_dependencies -b dist"
- yarn electron-builder --win --x64 --publish always
test: off
#artifacts:
# - path: '$(OutputDirectory)\*.exe'
deploy:
- provider: FTP
protocol: sftp
host: frs.sourceforge.net
username: gns3build
password:
secure: YRiLLoY27UOZ8QJHqqdESBQFfPfENKV0cLI/QFSsbWc=
folder: "../../../../frs/project/gns-3/Nightly Builds"
artifact: /.*\.exe/
on:
appveyor_repo_tag: false # deploy on branch only
artifacts:
- path: 'gns3-web-ui*.exe'
name: gns3-web-ui
environment:
GH_TOKEN:
secure: EgwJ4mP2sPsfurW//aPDUXW+O7R+3N0pSfr+Y3SpiKK+70tGVbqy93pWCcdrPf45
secure: Zb0F4wfA/3zXZBQiEmEGpKIP17hD9gb/CNwxQE2N3J4Eq3z58mp0K0ey5g8Dupsb
PYTHON: "C:\\Python36-x64"

View File

@ -1,12 +1,26 @@
# iOS CircleCI 2.0 configuration file
version: 2
# iOS CircleCI 2.1 configuration file
version: 2.1
orbs:
node: circleci/node@4.2.0
jobs:
build:
macos:
xcode: "9.1.0"
xcode: "10.1.0"
steps:
- checkout
- node/install:
install-yarn: true
- run:
name: Update BREW and print configs
command: |
brew update
brew analytics off
brew --env
brew --config
- run:
name: Set timezone and check current datetime
@ -15,17 +29,75 @@ jobs:
echo "Today is $(date +"%Y-%m-%d %T")"
- run:
name: Install project
# there is an issue with yarn and cache during executed on CI; for now we just run it twice, second should
# be successful. Check it later if updates fixed the issue
name: Set ENV variables
command: |
yarn || true
yarn || true
echo 'export HOMEBREW_NO_AUTO_UPDATE=1' >> ~/.envs
- run:
name: Install Python version 3.6.5 & readline 7.0.5
command: |
source ~/.envs
curl -o /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/python.rb https://raw.githubusercontent.com/Homebrew/homebrew-core/f2a764ef944b1080be64bd88dca9a1d80130c558/Formula/python.rb
curl -o /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/readline.rb https://raw.githubusercontent.com/Homebrew/homebrew-core/b1bd1c4a62e1336422de3614d1fc49ffbce589a8/Formula/readline.rb
# remove check for old compilers which creates the error described in https://github.com/sashkab/homebrew-python/issues/36
sed -i.bak -e '58,61d' /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/python.rb
# remove 'do devel' block to avoid error: Calling 'devel' blocks in formulae is disabled!
sed -i.bak -e '14,17d' /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/python.rb
brew unlink python
brew uninstall --ignore-dependencies readline
brew install readline
brew info readline
brew pin readline
# --ignore-dependencies is used to prevent this issue: https://github.com/tensorflow/tensorflow/issues/25093
brew install --ignore-dependencies python
#brew link python 3.6.5_1
brew info python
brew pin python
- run:
name: Installed python and pip version
command: |
python3 -V
pip3 -V
- restore_cache:
name: Restore Yarn Package Cache
keys:
- yarn-packages-{{ checksum "yarn.lock" }}
- run:
name: Install project
# increased timeout is for material-design-icons
command: |
yarn install --network-timeout 1000000
- save_cache:
name: Save Yarn Package Cache
key: yarn-packages-{{ checksum "yarn.lock" }}
paths:
- ~/.cache/yarn
- run:
name: Building WebUI for distribution
command: |
yarn buildforelectron
- run:
name: Building gns3server
command: |
python3 -V
python3 -m pip install -U pip
python3 -m pip install -r scripts/requirements.txt
python3 scripts/build.py download -a
# necessary because of https://github.com/GNS3/gns3-gui/issues/2849
python3 -m pip install jsonschema==2.6.0
python3 scripts/build.py build_exe -b dist/exe.gns3server -s
python3 scripts/build.py validate -b dist
- run:
name: Dist project
command: |
yarn distmac
yarn electron-builder --mac --x64 --publish always
- run:
name: Gather artifacts
@ -37,25 +109,6 @@ jobs:
path: artifacts
destination: artifacts
- deploy:
name: Deploying on SourceForge
command: |
echo "Deploying on SourceForge"
ssh-keyscan -H frs.sourceforge.net >> ~/.ssh/known_hosts
mkdir -p artifacts/release
cd artifacts; for file in *.dmg; do mv "$file" "release/${file%.dmg}-${CIRCLE_BRANCH}-${CIRCLE_BUILD_NUM}.dmg"; done; cd ..
echo "mkdir \"/home/frs/project/gns-3/Nightly Builds/$(date +"%Y-%m-%d")\"" | sftp gns3build@frs.sourceforge.net || true
echo "Copying to SourceForge"
scp artifacts/release/* gns3build@frs.sourceforge.net:"/home/frs/project/gns-3/Nightly\ Builds/$(date +"%Y-%m-%d")/"
#
# release:
# macos:
# xcode: "9.1.0"
#
# steps:
# - yarn release
#
workflows:
version: 2
build_and_deploy:
@ -64,4 +117,3 @@ workflows:
filters:
tags:
only: /v.*/

View File

@ -1,4 +1,4 @@
# Editor configuration, see http://editorconfig.org
# Editor configuration, see https://editorconfig.org
root = true
[*]

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

@ -0,0 +1,25 @@
name: Build
on:
push:
branches:
- '**'
pull_request:
branches:
- master
- master-3.0
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
- name: Setup node 12
uses: actions/setup-node@v2
with:
node-version: 12.x
- uses: c-hive/gha-yarn-cache@v1
- name: Install JS dependencies
run: yarn install
- name: Test
run: yarn test

15
.gitignore vendored
View File

@ -6,6 +6,11 @@
/out-tsc
/ng-dist
/build
/scripts/tmp
/scripts/env
/scripts/build
/scripts/dist
/env
# dependencies
/node_modules
@ -35,6 +40,7 @@ npm-debug.log
testem.log
/typings
/yarn-error.log
package-lock.json
# e2e
/e2e/*.js
@ -43,3 +49,12 @@ testem.log
# System Files
.DS_Store
Thumbs.db
# Licenses file
licenses.csv
# Temps
.temp-var-file.ts
# external software
/external

9
.prettierrc Normal file
View File

@ -0,0 +1,9 @@
{
"printWidth": 120,
"singleQuote": true,
"useTabs": false,
"tabWidth": 2,
"semi": true,
"bracketSpacing": true,
"jsxBracketSameLine": false,
}

4
.sentryclirc Normal file
View File

@ -0,0 +1,4 @@
[defaults]
url = https://sentry.io/
org = gns3
project = gns3-web-ui

8
.snyk Normal file
View File

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

View File

@ -1,29 +1,54 @@
language: node_js
node_js:
- node
- '11' # use node for latest
# Issue with Travis: https://github.com/travis-ci/travis-ci/issues/8836#issuecomment-356362524
sudo: required
cache:
yarn: true
directories:
- node_modules
dist: xenial
addons:
apt:
sources:
- google-chrome
- ubuntu-toolchain-r-test
packages:
- google-chrome-stable
- google-chrome-beta
- google_chrome
- g++-4.8
services:
- xvfb
before_install:
- export CHROME_BIN=chromium-browser
- export DISPLAY=:99.0
- sh -e /etc/init.d/xvfb start
# greenkeeper-lockfile support
- yarn global add greenkeeper-lockfile@1
- |
python3 -V
wget -qO- https://bootstrap.pypa.io/get-pip.py | sudo python3
python3 -m pip -V
before_script:
- npm install -g karma
# greenkeeper-lockfile support
- greenkeeper-lockfile-update
# - npm install -g codecov
script: ng test --watch=false
script: yarn coverage
after_success:
# - codecov
after_script:
# greenkeeper-lockfile support
- greenkeeper-lockfile-upload
# publish on gns3.github.io
- ng build --base-href /${TRAVIS_BRANCH}/
- yarn buildforgithub --base-href /${TRAVIS_BRANCH}/
- export GIT_LAST_LOG="$(git log -1 --pretty=%B)"
- git clone https://${GITHUB_CREDENTIALS}@github.com/GNS3/gns3.github.io.git github-pages
- mkdir -p github-pages/${TRAVIS_BRANCH}
@ -34,7 +59,24 @@ after_script:
- git add -A
- git commit -m "Deploy - $GIT_LAST_LOG"
- git push origin master
- cd $TRAVIS_BUILD_DIR
# publish
- yarn
- yarn distlinux
- yarn buildforelectron
- |
python3 -m pip install -r scripts/requirements.txt
python3 scripts/build.py download -a
python3 scripts/build.py build_exe -b dist/exe.gns3server -s
python3 scripts/build.py validate -b dist
- yarn electron-builder --linux --x64 --publish always
# build sourcemaps and upload to Sentry
# fix node issue with memory
- |
if [ -n "$TRAVIS_TAG" ]; then
export NODE_OPTIONS=--max_old_space_size=4096
export RELEASE_VERSION=$(node -e "const fs = require('fs'); let p = fs.readFileSync('package.json'); console.log(JSON.parse(p).version);")
yarn ng build --configuration=production --base-href /static/web-ui/
yarn sentry-cli releases new $RELEASE_VERSION
yarn sentry-cli releases files $RELEASE_VERSION upload-sourcemaps dist/
fi

16
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,16 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch localhost",
"type": "firefox",
"request": "launch",
"reAttach": true,
"url": "http://localhost:4200",
"webRoot": "${workspaceFolder}"
}
]
}

13
.whitesource Normal file
View File

@ -0,0 +1,13 @@
{
"scanSettings": {
"configMode": "AUTO",
"configExternalURL": "",
"projectToken" : ""
},
"checkRunSettings": {
"vulnerableCheckRunConclusionLevel": "failure"
},
"issueSettings": {
"minSeverityLevel": "LOW"
}
}

View File

@ -37,4 +37,3 @@ Gruntfile.js
# misc
*.gz
*.md

26
Dockerfile Normal file
View File

@ -0,0 +1,26 @@
# Dockerfile for GNS3 Web-ui development
FROM node:stretch
# Create user
RUN useradd --user-group --create-home --shell /bin/false gns3-web-ui
# Create app directory
ENV HOME /home/gns3-web-ui
WORKDIR $HOME
# Copy source
COPY . .
RUN chown -R gns3-web-ui:gns3-web-ui $HOME
# Switch to gns3-web-ui user
USER gns3-web-ui
# Install dependencies
RUN yarn global add @angular/cli
RUN yarn install --pure-lockfile
ENV PATH /home/gns3-web-ui/.yarn/bin:$PATH
EXPOSE 8080
CMD ng serve --host 0.0.0.0 --port 8080

131
README.md
View File

@ -1,63 +1,94 @@
# gns3-web-ui
Test WebUI implementation for GNS3.
[![Build](https://github.com/GNS3/gns3-web-ui/actions/workflows/main.yml/badge.svg)](https://github.com/GNS3/gns3-web-ui/actions/workflows/main.yml)
[![Dependency](https://img.shields.io/librariesio/github/GNS3/gns3-web-ui)](https://libraries.io/github/GNS3/gns3-web-ui)
[![Packages versions](https://repology.org/badge/latest-versions/gns3.svg)](https://repology.org/metapackage/gns3/versions)
[![Packages](https://repology.org/badge/tiny-repos/gns3.svg)](https://repology.org/metapackage/gns3/versions)
This is not production ready version. It has been made to evaluate possibility of creation Web User Interface for GNS3 application.
## Demo
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.2.6.
Please use GNS3 WebUI bundled in `gns3server` and `gns3`.
## Installation for development
## Development
Please install `npm` if not present in your system.
### Branches policy
Next step is `angular-cli` installation:
On branch `master` you can find the latest codebase including under development features. If you are looking for stable version with features promoted to be included in the current/next release please switch to `stable` branch.
### Installation
We're using [yarn](https://yarnpkg.com/lang/en/) for packages installation:
```
npm install @angular/cli
yarn install
```
## Development server
## JavaScript heap out of memory
### Run GNS3 server
Please run locally GNS3 server.
### Using default CORS policy.
GNS3 server contains CORS policies to run Web UI on 8080 at localhost. In order to use it, please run development server with custom port:
Increase the memory allocated to Node if you get JavaScript heap out of memory errors.
```
ng serve --port 8080
export NODE_OPTIONS=--max-old-space-size=8192
```
#### Run GNS3 server
Visit [gns3-server](https://github.com/GNS3/gns3-server) for guide how to run GNS3 server.
#### Run WebUI
```
yarn ng serve
```
Application is accessible on `http://localhost:8080/`. The app will automatically reload if you change any of the source files.
Application is accessible on `http://127.0.0.1:4200/`. The app will automatically reload if you change any of the source files.
### Docker container
For development you can also run the GNS3 Web UI in a container
```
bash scripts/docker_dev_webui.sh
```
### How to upgrade package.json?
```
yarn upgrade --latest
```
### gns3server bundled in WebUI - electron based
In special cases it's possible to build `gns3server` for GNS3 WebUI. This version is included in `electronjs` dist application.
```
python3 scripts/build.py build -b dist
```
### Code scaffolding
Run `yarn ng generate component component-name` to generate a new component. You can also use `yarn ng generate directive|pipe|service|class|module`.
### Build
Run `yarn ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build.
### Running unit tests
Run `yarn ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
## Code scaffolding
## Releasing
Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|module`.
### Release naming convention
## Build
Releases are named by the year and quarter when release is happening, e.g. January 2020 release is named 2020.1.X.
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build.
## Running unit tests
Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
## Running end-to-end tests
Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
Before running the tests make sure you are serving the app via `ng serve`.
# Releasing
## Bumping releases
### Bumping releases
We're using [version-bump-prompt](https://www.npmjs.com/package/version-bump-prompt) for increasing version.
Intall `bump` via:
Install `version-bump-prompt` via:
npm install -g version-bump-prompt
@ -65,31 +96,31 @@ If you would like to bump prepatch just type:
bump --prepatch --tag --push
## Final release
### Distribute release
We have got configured CircleCI, TravisCI and AppVeyor for distributing application for particular platform. In order to release you need to tag your code nad push it.
We have got configured CircleCI, TravisCI and AppVeyor for distributing application for particular platform. In order to release you need to tag&push your changes from master.
Using `bump`:
First of all please remove `dev` from version in `package.json` (for instance `2019.2.0-alpha.4dev` to `2019.2.0-alpha.4`). Commit & push changes with message `Release 2019.2.0-alpha.4` . Next step is to tag repository and push to origin:
bump --patch --tag --push
Or manually:
git tag v0.0.1
git push origin v0.0.1
git tag v2019.2.0-alpha.4
git push origin v2019.2.0-alpha.4
When artifacts are made you can see draft release here: [gns3-web-ui releases](https://github.com/GNS3/gns3-web-ui/releases) which is waiting to be published.
After release please change current version in `package.json` to `X.X.X-beta.0`'. Otherwise artifacts will be overwritten during the next commit.
After release please change current version in `package.json` to `2019.2.0-alpha.5dev`'. Otherwise artifacts will be overwritten during the next commit. Don't forget to commit & push changes.
You may use `bump` to achieve that:
bump --prepatch
#### Updating gns3server
## Staging release
Checkout the latest master of `gns3server`. Run command `./scripts/update-bundled-web-ui.sh --tag=v2019.2.0-alpha.5`. Commit & push changes with message `Release 2019.2.0-alpha.4`.
In case you would like to create a new staging release. Please create draft release on github, like `0.0.1-dev1`. After successful build you can find there artifacts.
### Staging release
In case you would like to create a new staging release. Please create draft release on github, like `0.0.1-dev1`. After successful build you can find artifacts there.
### Updating signing certificate for Windows
Please follow this guide: [code-signing](https://www.electron.build/code-signing), use `certmgr.msc` exporting tool to limit the size of certificate.
## Further help

244
angular.json Normal file
View File

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

65
console-executor.js Normal file
View File

@ -0,0 +1,65 @@
const { spawn } = require('child_process');
const { app } = require('electron');
const path = require('path');
async function setPATHEnv() {
const puttyLookup = [
path.join(__dirname, 'dist', 'putty'),
path.join(path.dirname(app.getPath('exe')), 'dist', 'putty')
];
// prevent adding duplicates
let extra = [
...puttyLookup,
].filter((dir) => {
return process.env.PATH.indexOf(dir) < 0;
});
extra.push(process.env.PATH);
process.env.PATH = extra.join(";");
}
exports.openConsole = async (consoleRequest) => {
// const genericConsoleCommand = 'xfce4-terminal --tab -T "%d" -e "telnet %h %p"';
const genericConsoleCommand = 'putty.exe -telnet %h %p -loghost "%d"';
const command = prepareCommand(genericConsoleCommand, consoleRequest);
console.log(`Setting up PATH`);
await setPATHEnv();
console.log(`Starting console with command: '${command}'`);
let consoleProcess = spawn(command, [], {
shell :true
});
consoleProcess.stdout.on('data', (data) => {
console.log(`Console stdout is producing: ${data.toString()}`);
});
consoleProcess.stderr.on('data', (data) => {
console.log(`Console stderr is producing: ${data.toString()}`);
});
consoleProcess.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
}
function prepareCommand(consoleCommand, consoleRequest) {
const mapping = {
h: consoleRequest.host,
p: consoleRequest.port,
d: consoleRequest.name,
i: consoleRequest.project_id,
n: consoleRequest.node_id,
c: consoleRequest.server_url
};
for(var key in mapping) {
const regExp = new RegExp(`%${key}`, 'g');
consoleCommand = consoleCommand.replace(regExp, mapping[key]);
}
return consoleCommand;
}

1
debug.log Normal file
View File

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

View File

@ -1,14 +1,20 @@
import { Gns3WebUiPage } from './app.po';
describe('gns3-web-ui App', () => {
describe('GNS3 Web UI Application', () => {
let page: Gns3WebUiPage;
beforeEach(() => {
page = new Gns3WebUiPage();
});
it('should display welcome message', () => {
page.navigateTo();
expect(page.getParagraphText()).toEqual('Welcome to app!');
it('should have correct page title', async () => {
// arrange
await page.navigateTo();
// act
let text = await page.getTitleText();
// assert
expect(text).toEqual('GNS3 Web UI');
});
});

View File

@ -5,6 +5,10 @@ export class Gns3WebUiPage {
return browser.get('/');
}
getTitleText() {
return browser.driver.getTitle();
}
getParagraphText() {
return element(by.css('app-root h1')).getText();
}

21
e2e/helpers/common.po.ts Normal file
View File

@ -0,0 +1,21 @@
import { browser } from 'protractor';
export class TestHelper {
sleep(value: number) {
browser.sleep(value);
}
waitForLoading() {
browser.waitForAngular();
}
async asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
}
getCurrentUrl() {
return browser.getCurrentUrl();
}
}

View File

@ -0,0 +1,50 @@
import { browser, by } from 'protractor';
import { TestHelper } from './common.po';
export class ProjectMapPage {
helper = new TestHelper();
async openAddProjectDialog() {
let addButton = await browser.driver.findElement(by.css('button.addNode'));
await addButton.click();
}
async addNode() {
let inputs = await browser.driver.findElements(by.css('input.mat-input-element'));
await inputs[0].sendKeys('VPCS');
this.helper.sleep(1000);
let selects = await browser.driver.findElements(by.css('mat-select.mat-select'));
await selects[1].click();
this.helper.sleep(1000);
let options = await browser.driver.findElements(by.css('mat-option.mat-option'));
await options[1].click(); //first option should be chosen
this.helper.sleep(1000);
// new select appears after refreshing data
selects = await browser.driver.findElements(by.css('mat-select.mat-select'));
if (selects[2]) {
await selects[2].click();
this.helper.sleep(1000);
options = await browser.driver.findElements(by.css('mat-option.mat-option'));
await options[0].click();
this.helper.sleep(1000);
}
let addButton = await browser.driver.findElement(by.css('button.addButton'));
await addButton.click();
this.helper.sleep(1000);
}
async verifyIfNodeWithLabelExists(labelToFind: string) {
this.helper.sleep(5000);
let nodeLabel = await browser.driver.findElement(by.css('#map > g > g.layer > g.nodes > g > g > g > g > text'));
let selectedNode;
let textFromNodeLabel = await nodeLabel.getText();
if (textFromNodeLabel == labelToFind) selectedNode = nodeLabel;
return selectedNode ? true : false;
}
}

20
e2e/helpers/project.po.ts Normal file
View File

@ -0,0 +1,20 @@
import { browser, by } from 'protractor';
import { TestHelper } from './common.po';
export class ProjectsPage {
helper = new TestHelper();
async openAddProjectDialog() {
let addButton = await browser.driver.findElement(by.css('button.add-button'));
await addButton.click();
}
async createProject() {
let today = new Date();
let inputs = await browser.driver.findElements(by.css('input.mat-input-element'));
await inputs[1].sendKeys('test project ' + today.getUTCMilliseconds());
this.helper.sleep(2000);
let dialogButton = await browser.driver.findElement(by.css('button.add-project-button'));
await dialogButton.click();
}
}

41
e2e/helpers/server.po.ts Normal file
View File

@ -0,0 +1,41 @@
import { browser, by } from 'protractor';
import { TestHelper } from './common.po';
export class ServersPage {
helper = new TestHelper();
maximizeWindow() {
browser.driver.manage().window().maximize();
}
navigateToServersPage() {
return browser.get('/servers');
}
getAddServerNotificationText() {
return browser.driver.findElement(by.className('mat-card-content')).getText();
}
async clickAddServer() {
let serversTable = await this.checkServersTable();
if (serversTable.length === 0) {
let buttons = await browser.driver.findElements(by.className('mat-button mat-button-base'));
await buttons[3].click();
}
}
checkServersTable() {
return browser.driver.findElements(by.css('mat-cell'));
}
async navigateToServerProjects() {
this.helper.sleep(2000);
let hyperlinks = await browser.driver.findElements(by.css('a.table-link'));
let serverLink;
await this.helper.asyncForEach(hyperlinks, async (element) => {
let text = await element.getText();
if (text === '127.0.0.1') serverLink = element;
});
await serverLink.click();
}
}

View File

@ -0,0 +1,40 @@
import { TestHelper } from './helpers/common.po';
import { ProjectMapPage } from './helpers/project-map.po';
import { ProjectsPage } from './helpers/project.po';
import { ServersPage } from './helpers/server.po';
describe('Project map page', () => {
let serversPage: ServersPage;
let projectsPage: ProjectsPage;
let projectMapPage: ProjectMapPage;
let helper: TestHelper;
beforeEach(async () => {
serversPage = new ServersPage();
projectsPage = new ProjectsPage();
projectMapPage = new ProjectMapPage();
helper = new TestHelper();
serversPage.maximizeWindow();
await serversPage.navigateToServersPage();
await serversPage.clickAddServer();
await serversPage.navigateToServerProjects();
await projectsPage.openAddProjectDialog();
helper.sleep(2000);
await projectsPage.createProject();
helper.sleep(2000);
});
it('user should have possibility to add nodes to map', async () => {
// arrange
projectMapPage.openAddProjectDialog();
helper.sleep(2000);
//act
projectMapPage.addNode();
helper.sleep(2000);
//assert
expect(await projectMapPage.verifyIfNodeWithLabelExists('PC1')).toBe(true);
});
});

33
e2e/projects.e2e-spec.ts Normal file
View File

@ -0,0 +1,33 @@
import { TestHelper } from './helpers/common.po';
import { ProjectsPage } from './helpers/project.po';
import { ServersPage } from './helpers/server.po';
describe('Projects page', () => {
let serversPage: ServersPage;
let projectsPage: ProjectsPage;
let helper: TestHelper;
beforeEach(() => {
serversPage = new ServersPage();
projectsPage = new ProjectsPage();
helper = new TestHelper();
});
it('user should have possibility to create new project', async () => {
// arrange
serversPage.maximizeWindow();
await serversPage.navigateToServersPage();
await serversPage.clickAddServer();
await serversPage.navigateToServerProjects();
helper.sleep(2000);
//act
await projectsPage.openAddProjectDialog();
helper.sleep(2000);
await projectsPage.createProject();
helper.sleep(2000);
//assert
expect(helper.getCurrentUrl()).toMatch('server/1/project/');
});
});

43
e2e/servers.e2e-spec.ts Normal file
View File

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

View File

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

View File

@ -1,10 +1,10 @@
appId: com.gns3.web-ui
copyright: "Copyright © 2018 GNS3"
productName: "GNS3 Web UI Prototype"
#forceCodeSigning: true
productName: "GNS3 Web UI"
artifactName: "${productName}-${os}-${arch}-${version}.${ext}"
asar: true
compression: normal
generateUpdatesFilesForAllChannels: true
directories:
output: build
@ -12,8 +12,19 @@ directories:
files:
- dist
- main.js
- renderer.js
- sentry.js
- installed-software.js
- local-server.js
- console-executor.js
- package.json
extraFiles:
- dist/exe.gns3server/**
- dist/ubridge/**
- dist/vpcs/**
- dist/dynamips/**
mac:
category: public.app-category.developer-tools
# publish: github
@ -37,15 +48,20 @@ linux:
icon: "dist/assets/icons/png"
category: "Network"
packageCategory: "Network"
description: "GNS3 Web Ui Prototype application. Please don't use it as long as it's not officially announced."
description: "GNS3 Web UI Prototype application. Please don't use it as long as it's not officially announced."
target:
- deb
- AppImage
maintainer: "Dominik Ziajka <dominik@gns3.net>"
win:
# publish: github
publish:
provider: "github"
owner: "GNS3"
icon: "dist/assets/icons/win/icon.ico"
publisherName: GNS3 Technologies Corporation
nsis:
perMachine: true
oneClick: false
allowToChangeInstallationDirectory: true
license: "LICENSE"

104
installed-software.js Normal file
View File

@ -0,0 +1,104 @@
var commandExistsSync = require('command-exists').sync;
var app = require('electron').app;
var fs = require('fs');
var util = require('util');
var fetch = require('node-fetch')
var stream = require('stream');
var path = require('path');
const { spawn } = require('child_process');
const { ipcMain } = require('electron');
var pipeline = util.promisify(stream.pipeline);
exports.getInstalledSoftware = (softwareList) => {
const installed = {};
for(var software of softwareList) {
var name = software.name;
var locations = software.locations;
installed[name] = [];
for(var location of locations) {
// var exists = commandExistsSync(command);
var exists = fs.existsSync(location);
if(exists) {
installed[name].push(location);
}
}
}
return installed;
}
async function downloadFile(resource, softwarePath) {
var response = await fetch(resource);
if (response.status != 200) {
throw new Error(`Cannot download file ${resource}, response status = ${response.status}`);
}
await pipeline(
response.body,
fs.createWriteStream(softwarePath)
);
}
async function getSoftwareInstallationPath(software) {
if (software.installer) {
return path.join(app.getPath('temp'), software.binary);
}
else {
const externalPath = path.join(app.getAppPath(), 'external');
const exists = fs.existsSync(externalPath);
if (!exists) {
fs.mkdirSync(externalPath);
}
return path.join(externalPath, software.binary);
}
}
ipcMain.on('installed-software-install', async function (event, software) {
const softwarePath = await getSoftwareInstallationPath(software);
const responseChannel = `installed-software-installed-${software.name}`;
if (software.type == 'web') {
const exists = fs.existsSync(softwarePath);
if (exists) {
console.log(`Skipping downloading file due to '${softwarePath}' path exists`);
}
else {
console.log(`File '${softwarePath}' doesn't exist. Downloading file.`);
try {
await downloadFile(software.resource, softwarePath);
} catch(error) {
event.sender.send(responseChannel, {
success: false,
message: error.message
});
}
}
}
let child;
if (software.sudo) {
child = spawn('powershell.exe', ['Start-Process', '-FilePath', `"${softwarePath}"`]);
}
else {
child = spawn(softwarePath, software.installation_arguments);
}
child.on('exit', () => {
event.sender.send(responseChannel, {
success: true
});
});
child.on('error', (err) => {
event.sender.send(responseChannel, {
success: false,
message: err.message
});
});
child.stdin.end();
});

View File

@ -4,30 +4,28 @@
module.exports = function (config) {
config.set({
basePath: '',
frameworks: ['jasmine', '@angular/cli'],
frameworks: ['jasmine', '@angular-devkit/build-angular'],
plugins: [
require('karma-jasmine'),
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage-istanbul-reporter'),
require('@angular/cli/plugins/karma')
require('@angular-devkit/build-angular/plugins/karma')
],
client:{
clearContext: false // leave Jasmine Spec Runner output visible in browser
},
coverageIstanbulReporter: {
reports: [ 'html', 'lcovonly' ],
dir: require('path').join(__dirname, 'coverage'), reports: [ 'html', 'lcovonly' ],
fixWebpackSourcePaths: true
},
angularCli: {
environment: 'dev'
},
reporters: ['progress', 'kjhtml'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
singleRun: false
browsers: ['ChromeHeadless'],
singleRun: true
});
};

321
local-server.js Normal file
View File

@ -0,0 +1,321 @@
const { spawn } = require('child_process');
const kill = require('tree-kill');
const path = require('path');
const fs = require('fs');
const ini = require('ini');
const { ipcMain } = require('electron')
const { app } = require('electron')
const isWin = /^win/.test(process.platform);
let runningServers = {};
exports.getLocalServerPath = async () => {
let binary = isWin ? 'gns3server.exe': 'gns3server';
return findBinary('exe.', binary);
}
exports.getUbridgePath = async () => {
let binary = isWin ? 'ubridge.exe': 'ubridge';
return findBinary('ubridge', binary);
}
exports.startLocalServer = async (server) => {
return await run(server, {
logStdout: true
});
}
exports.stopLocalServer = async (server) => {
return await stop(server.name);
}
exports.getRunningServers = () => {
return Object.keys(runningServers);
}
exports.stopAllLocalServers = async () => {
return await stopAll();
}
async function findBinary(binaryDirectory, filename) {
const lookupDirectories = [
__dirname,
path.dirname(app.getPath('exe'))
];
for(var directory of lookupDirectories) {
const serverPath = await findBinaryInDirectory(directory, binaryDirectory, filename);
if(serverPath !== undefined) {
return serverPath;
}
}
}
async function findBinaryInDirectory(baseDirectory, binaryDirectory, filename) {
const distDirectory = path.join(baseDirectory, 'dist');
if (!fs.existsSync(distDirectory)) {
return;
}
const files = fs.readdirSync(distDirectory);
let binaryPath = null;
files.forEach((directory) => {
if(directory.startsWith(binaryDirectory)) {
binaryPath = path.join(baseDirectory, 'dist', directory, filename);
}
});
if(binaryPath !== null && fs.existsSync(binaryPath)) {
return binaryPath;
}
return;
}
function getServerArguments(server, overrides, configPath) {
let serverArguments = [];
if(server.host) {
serverArguments.push('--host');
serverArguments.push(server.host);
}
if(server.port) {
serverArguments.push('--port');
serverArguments.push(server.port);
}
serverArguments.push('--local');
if(configPath) {
serverArguments.push('--config');
serverArguments.push(configPath);
}
return serverArguments;
}
function getChannelForServer(server) {
return `local-server-run-${server.name}`;
}
function notifyStatus(status) {
ipcMain.emit('local-server-status-events', status);
}
function filterOutput(line) {
const index = line.search('CRITICAL');
if(index > -1) {
return {
isCritical: true,
errorMessage: line.substr(index)
};
}
return {
isCritical: false
}
}
async function stopAll() {
for(var serverName in runningServers) {
let result, error = await stop(serverName);
}
console.log(`Stopped all servers`);
}
async function stop(serverName) {
let pid = undefined;
const runningServer = runningServers[serverName];
if(runningServer !== undefined && runningServer.process) {
pid = runningServer.process.pid;
}
console.log(`Stopping '${serverName}' with PID='${pid}'`);
const stopped = new Promise((resolve, reject) => {
if(pid === undefined) {
resolve(`Server '${serverName} is already stopped`);
delete runningServers[serverName];
return;
}
kill(pid, (error) => {
if(error) {
console.error(`Error occured during stopping '${serverName}' with PID='${pid}'`);
reject(error);
}
else {
delete runningServers[serverName];
console.log(`Stopped '${serverName}' with PID='${pid}'`);
resolve(`Stopped '${serverName}' with PID='${pid}'`);
notifyStatus({
serverName: serverName,
status: 'stopped',
message: `Server '${serverName}' stopped'`
});
}
});
});
return stopped;
}
async function getIniFile(server) {
return path.join(app.getPath('userData'), `gns3_server_${server.id}.ini`);
}
async function configure(configPath, server) {
if(!fs.existsSync(configPath)) {
fs.closeSync(fs.openSync(configPath, 'w'));
console.log(`Configuration file '${configPath}' has been created.`);
}
var config = ini.parse(fs.readFileSync(configPath, 'utf-8'));
if(server.path) {
config.path = server.path;
}
if(server.host) {
config.host = server.host;
}
if(server.port) {
config.port = server.port;
}
if(server.ubridge_path) {
config.ubridge_path = server.ubridge_path;
}
fs.writeFileSync(configPath, ini.stringify(config, { section: 'Server' }));
}
async function setPATHEnv() {
const vpcsLookup = [
path.join(__dirname, 'dist', 'vpcs'),
path.join(path.dirname(app.getPath('exe')), 'dist', 'vpcs')
];
const dynamipsLookup = [
path.join(__dirname, 'dist', 'dynamips'),
path.join(path.dirname(app.getPath('exe')), 'dist', 'dynamips')
];
// prevent adding duplicates
let extra = [
...vpcsLookup,
...dynamipsLookup
].filter((dir) => {
return process.env.PATH.indexOf(dir) < 0;
});
extra.push(process.env.PATH);
process.env.PATH = extra.join(";");
}
async function run(server, options) {
if(!options) {
options = {};
}
const logStdout = options.logStdout || false;
const logSterr = options.logSterr || false;
console.log(`Configuring`);
const configPath = await getIniFile(server);
await configure(configPath, server);
console.log(`Setting up PATH`);
await setPATHEnv();
console.log(`Running '${server.path}'`);
let serverProcess = spawn(server.path, getServerArguments(server, {}, configPath));
notifyStatus({
serverName: server.name,
status: 'started',
message: `Server '${server.name}' started'`
});
runningServers[server.name] = {
process: serverProcess
};
serverProcess.stdout.on('data', function(data) {
const line = data.toString();
const { isCritical, errorMessage } = filterOutput(line);
if(isCritical) {
notifyStatus({
serverName: server.name,
status: 'stderr',
message: `Server reported error: '${errorMessage}`
});
}
if(logStdout) {
console.log(data.toString());
}
});
serverProcess.stderr.on('data', function(data) {
if(logSterr) {
console.log(data.toString());
}
});
serverProcess.on('exit', (code, signal) => {
notifyStatus({
serverName: server.name,
status: 'errored',
message: `Server '${server.name}' has exited with status='${code}'`
});
});
serverProcess.on('error', (err) => {
notifyStatus({
serverName: server.name,
status: 'errored',
message: `Server errored: '${err}`
});
});
}
async function main() {
await run({
name: 'my-local',
path: 'c:\\Program Files\\GNS3\\gns3server.EXE',
port: 3080
}, {
logStdout: true
});
}
if(ipcMain) {
ipcMain.on('local-server-run', async function (event, server) {
const responseChannel = getChannelForServer();
await run(server);
event.sender.send(responseChannel, {
success: true
});
});
}
if (require.main === module) {
process.on('SIGINT', function() {
console.log("Caught interrupt signal");
stopAll();
});
process.on('unhandledRejection', (reason, promise) => {
console.log(`UnhandledRejection occured '${reason}'`);
process.exit(1);
});
main();
}

71
main.js
View File

@ -1,36 +1,75 @@
const electron = require('electron');
// Module to control application life.
const app = electron.app;
// Module to create native browser window.
const BrowserWindow = electron.BrowserWindow;
const path = require('path');
const url = require('url');
const yargs = require('yargs');
// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let mainWindow;
let isDev = false;
const argv = yargs
.describe('m', 'Maximizes window on startup.')
.boolean('m')
.describe('e', 'Environment, `dev` for developer mode and when not specified then production mode.')
.choices('e', ['dev', null])
.describe('d', 'Enable developer tools.')
.boolean('d')
.argv;
if (argv.e == 'dev') {
isDev = true;
}
function createWindow () {
// Create the browser window.
mainWindow = new BrowserWindow({width: 800, height: 600});
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
preload: path.join(__dirname, 'sentry.js')
}
});
// and load the index.html of the app.
mainWindow.loadURL(url.format({
pathname: path.join(__dirname, 'dist/index.html'),
protocol: 'file:',
slashes: true
}));
// Open the DevTools.
// mainWindow.webContents.openDevTools();
if(isDev) {
mainWindow.loadURL('http://localhost:4200/');
}
else {
mainWindow.loadURL(url.format({
pathname: path.join(__dirname, 'dist/index.html'),
protocol: 'file:',
slashes: true
}));
mainWindow.maximize();
}
if(argv.d) {
// Open the DevTools.
mainWindow.webContents.openDevTools();
}
if(argv.m) {
mainWindow.maximize();
}
// Emitted when the window is closed.
mainWindow.on('closed', function () {
mainWindow.on('closed',async function () {
// Dereference the window object, usually you would store windows
// in an array if your app supports multi windows, this is the time
// when you should delete the corresponding element.
mainWindow = null
mainWindow = null;
});
// forward event to renderer
electron.ipcMain.on('local-server-status-events', (event) => {
mainWindow.webContents.send('local-server-status-events', event);
});
}
@ -39,6 +78,9 @@ function createWindow () {
// Some APIs can only be used after this event occurs.
app.on('ready', createWindow);
// app.on('ready', createServerProc);
// app.on('will-quit', exitServerProc);
// Quit when all windows are closed.
app.on('window-all-closed', function () {
// On OS X it is common for applications and their menu bar
@ -52,9 +94,10 @@ app.on('activate', function () {
// On OS X it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (mainWindow === null) {
createWindow()
createWindow();
}
});
// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.

14063
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,69 +1,135 @@
{
"name": "gns3-web-ui",
"version": "0.0.1-beta.0",
"version": "2.2.22",
"author": {
"name": "GNS3 Technology Inc.",
"email": "developers@gns3.com"
},
"description": "Graphical Network Simulator-3 is a network software emulator.",
"license": "GPLv3",
"main": "main.js",
"repository": {
"type": "git",
"url": "https://github.com/GNS3/gns3-web-ui.git"
},
"scripts": {
"ng": "ng",
"start": "ng serve",
"startforelectron": "ng serve --configuration=electronDev",
"build": "ng build",
"buildforelectron": "ng build -e electronProd",
"buildforproduction": "ng build --source-map=false --build-optimizer --configuration=production --base-href /static/web-ui/",
"buildforelectron": "ng build --configuration=electronProd",
"buildforgithub": "ng build --configuration=githubProd",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e",
"electrondev": "concurrently -k \"ng serve -e electronDev\" \"electron .\"",
"electron": "electron .",
"electrondev": "concurrently -k \"yarn startforelectron\" \"electron . -e dev\"",
"distlinux": "yarn buildforelectron && electron-builder --linux --x64",
"distwin": "yarn buildforelectron && electron-builder --win --x64",
"distmac": "yarn buildforelectron && electron-builder --mac --x64",
"release": "build"
"release": "build",
"coverage": "ng test --watch=false --code-coverage",
"prettier:base": "prettier",
"prettier:check": "yarn prettier:base -- --list-different \"src/**/*.{ts,js,html,scss}\"",
"prettier:write": "yarn prettier:base -- --write \"src/**/*.{ts,js,html,scss}\"",
"generate-licenses-file": "yarn license-checker --production --csv --out licenses.csv",
"prebuildforelectron": "node set-variables-in-env.js --set src/environments/environment.electron.prod.ts",
"postbuildforelectron": "node set-variables-in-env.js --unset src/environments/environment.electron.prod.ts",
"snyk-protect": "snyk protect",
"prepare": "yarn run snyk-protect"
},
"private": true,
"dependencies": {
"@angular/animations": "^5.1.2",
"@angular/cdk": "^5.0.3",
"@angular/common": "^5.1.2",
"@angular/compiler": "^5.1.2",
"@angular/core": "^5.1.2",
"@angular/forms": "^5.1.2",
"@angular/http": "^5.1.2",
"@angular/material": "^5.0.3",
"@angular/platform-browser": "^5.1.2",
"@angular/platform-browser-dynamic": "^5.1.2",
"@angular/router": "^5.1.2",
"@ng-bootstrap/ng-bootstrap": "^1.0.0-beta.4",
"angular2-indexeddb": "^1.0.11",
"bootstrap": "4.0.0-beta.2",
"core-js": "^2.4.1",
"d3-ng2-service": "^1.16.0",
"ng2-toasty": "^4.0.3",
"npm-check-updates": "^2.13.0",
"rxjs": "^5.4.1",
"zone.js": "^0.8.14"
"@angular/animations": "^12.0.2",
"@angular/cdk": "^12.0.2",
"@angular/common": "^12.0.2",
"@angular/compiler": "^12.0.2",
"@angular/core": "^12.0.2",
"@angular/forms": "^12.0.2",
"@angular/material": "^12.0.2",
"@angular/platform-browser": "^12.0.2",
"@angular/platform-browser-dynamic": "^12.0.2",
"@angular/router": "^12.0.2",
"@sentry/browser": "^6.3.6",
"@types/jest": "^26.0.23",
"@types/mocha": "^8.2.2",
"@types/react": "^17.0.5",
"@types/react-dom": "^17.0.3",
"angular-draggable-droppable": "^4.6.0",
"angular-resizable-element": "^3.3.5",
"bootstrap": "^5.0.0",
"command-exists": "^1.2.9",
"core-js": "^3.12.1",
"d3-ng2-service": "^2.2.0",
"eev": "^0.1.5",
"ini": "^2.0.0",
"material-design-icons": "^3.0.1",
"mousetrap": "^1.6.5",
"ng-circle-progress": "^1.6.0",
"ng2-file-upload": "^1.4.0",
"ngx-childprocess": "^0.0.6",
"ngx-device-detector": "^2.0.9",
"ngx-electron": "^2.2.0",
"node-fetch": "^2.6.1",
"notosans-fontface": "1.2.2",
"prettier-plugin-organize-imports": "^2.0.0",
"rxjs": "^6.5.3",
"rxjs-compat": "^6.5.3",
"save-svg-as-png": "^1.4.17",
"snyk": "^1.589.0",
"spark-md5": "^3.0.1",
"svg-crowbar": "^0.6.5",
"tree-kill": "^1.2.2",
"tslib": "^2.2.0",
"typeface-roboto": "^1.1.13",
"xterm": "^4.11.0",
"xterm-addon-attach": "^0.6.0",
"xterm-addon-fit": "^0.5.0",
"yargs": "^17.0.1",
"zone.js": "~0.11.4"
},
"devDependencies": {
"@angular/cli": "^1.6.3",
"@angular/compiler-cli": "^5.1.2",
"@angular/language-service": "^5.1.2",
"@types/jasmine": "~2.8.3",
"@types/jasminewd2": "~2.0.2",
"@types/node": "~8.5.2",
"codelyzer": "~4.0.2",
"electron": "1.7.10",
"electron-builder": "^19.42.1",
"jasmine-core": "~2.8.0",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~2.0.0",
"karma-chrome-launcher": "~2.2.0",
"karma-cli": "~1.0.1",
"karma-coverage-istanbul-reporter": "^1.2.1",
"karma-jasmine": "~1.1.0",
"karma-jasmine-html-reporter": "^0.2.2",
"node-sass": "^4.5.3",
"protractor": "~5.2.0",
"ts-node": "~4.1.0",
"tslint": "~5.8.0",
"typescript": ">=2.4.0 <2.6.0",
"popper.js": "^1.12.3",
"jquery": "1.9.1 - 3"
}
"@angular-devkit/build-angular": "^12.0.2",
"@angular/cli": "^12.0.2",
"@angular/compiler-cli": "^12.0.2",
"@angular/language-service": "^12.0.2",
"@sentry/cli": "^1.64.2",
"@sentry/electron": "^2.4.1",
"@types/jasmine": "^3.7.1",
"@types/jasminewd2": "^2.0.9",
"@types/node": "15.6.1",
"codelyzer": "^6.0.2",
"electron": "^13.0.1",
"electron-builder": "22.10.5",
"file-loader": "^6.2.0",
"jasmine-core": "~3.7.1",
"jasmine-spec-reporter": "~7.0.0",
"jquery": "^3.6.0",
"karma": "^6.3.2",
"karma-chrome-launcher": "~3.1.0",
"karma-cli": "^2.0.0",
"karma-coverage-istanbul-reporter": "~3.0.3",
"karma-jasmine": "~4.0.1",
"karma-jasmine-html-reporter": "^1.6.0",
"license-checker": "^25.0.1",
"popper.js": "^1.16.1",
"prettier": "^2.3.0",
"protractor": "^7.0.0",
"replace": "^1.2.1",
"rxjs-tslint": "^0.1.8",
"ts-mockito": "^2.6.1",
"ts-node": "~10.0.0",
"tslint": "^6.1.3",
"tslint-config-prettier": "^1.18.0",
"typescript": "4.2.4",
"webpack": "5.38.0",
"yarn-upgrade-all": "^0.5.4"
},
"greenkeeper": {
"ignore": [
"typescript"
]
},
"snyk": true
}

View File

@ -1,3 +1,11 @@
// This file is required by the index.html file and will
// be executed in the renderer process for that window.
// All of the Node.js APIs are available in this process.
let shell = require('electron').shell
document.addEventListener('click', function (event) {
if (event.target.tagName === 'A' && event.target.href.startsWith('http')) {
event.preventDefault()
shell.openExternal(event.target.href)
}
})

413
scripts/build.py Normal file
View File

@ -0,0 +1,413 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2018 GNS3 Technologies Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os
import re
import sys
import json
import shutil
import psutil
import zipfile
import requests
import platform
import argparse
import subprocess
from multiprocessing import Process, Queue
from multiprocessing.queues import Empty
from cx_Freeze import setup, Executable
DEFAULT_GNS3_SERVER_DEV_BRANCH = '2.2'
FILE_DIR = os.path.dirname(os.path.realpath(__file__))
WORKING_DIR = os.path.join(FILE_DIR, 'tmp')
SOURCE_ZIP = os.path.join(WORKING_DIR, 'gns3-server.source.zip')
SOURCE_DESTINATION = os.path.join(WORKING_DIR, 'source')
BINARIES_EXTENSION = platform.system() == "Windows" and ".exe" or ""
DEPENDENCIES = {
'ubridge': {
'type': 'github',
'releases': 'https://api.github.com/repos/GNS3/ubridge/releases',
'version': '0.9.16', # possible to use LATEST as value
'files': {
'windows': [
'cygwin1.dll',
'ubridge.exe'
]
}
},
'vpcs': {
'type': 'github',
'releases': 'https://api.github.com/repos/GNS3/vpcs/releases',
'version': '0.6.2',
'files': {
'windows': [
'cygwin1.dll',
'vpcs.exe'
]
}
},
'dynamips': {
'type': 'github',
'releases': 'https://api.github.com/repos/GNS3/dynamips/releases',
'version': '0.2.17',
'files': {
'windows': [
'cygwin1.dll',
'dynamips.exe',
'nvram_export.exe'
]
}
},
'putty': {
'type': 'http',
'url': 'https://the.earth.li/~sgtatham/putty/{version}/w64/putty.exe',
'version': '0.71',
'files': {
'windows': [
'putty.exe',
]
}
}
}
def download(url, output):
print("Downloading {} to {}".format(url, output))
if os.path.exists(output):
print("{} already exist skip downloading".format(output))
return
r = requests.get(url, stream=True)
if r.status_code == 200:
with open(output, 'wb') as f:
for chunk in r.iter_content():
f.write(chunk)
else:
print("Download error for {} status {}".format(url, r.status_code))
sys.exit(1)
def unzip(filename, directory):
zip = zipfile.ZipFile(filename, 'r')
zip.extractall(directory)
zip.close()
return zip.filelist
def getversion(version):
match = re.search("^(\d+\.\d+(.\d+)?).*$", version)
assert match
return match.group(1)
def getsource_directory():
files = os.listdir(SOURCE_DESTINATION)
if len(files) > 0:
return os.path.join(SOURCE_DESTINATION, files[0])
raise Exception("Cannot find sources for gns3server")
def prepare():
os.makedirs(WORKING_DIR, exist_ok=True)
def download_from_github(name, definition, output_directory):
response = requests.get(definition['releases'])
response.raise_for_status()
releases = response.json()
if definition['version'] == 'LATEST':
release = releases[0]
else:
release = list(filter(lambda x: x['tag_name'] == "v{}".format(definition['version']), releases))[0]
dependency_dir = os.path.join(output_directory, name)
os.makedirs(dependency_dir, exist_ok=True)
files = []
if platform.system() == "Windows":
files = definition['files']['windows']
for filename in files:
dependency_file = os.path.join(dependency_dir, filename)
dependency_url = list(filter(lambda x: x['name'] == filename, release['assets']))[0]['browser_download_url']
download(dependency_url, dependency_file)
print('Downloaded {} to {}'.format(filename, dependency_file))
def download_from_http(name, definition, output_directory):
url = definition['url'].format(version=definition['version'])
dependency_dir = os.path.join(output_directory, name)
os.makedirs(dependency_dir, exist_ok=True)
files = []
if platform.system() == "Windows":
files = definition['files']['windows']
for filename in files:
dependency_file = os.path.join(dependency_dir, filename)
download(url, dependency_file)
print('Downloaded {} to {}'.format(filename, dependency_file))
def download_dependencies_command(arguments):
output_directory = os.path.join(os.getcwd(), arguments.b)
for name, definition in DEPENDENCIES.items():
if definition['type'] == 'github':
download_from_github(name, definition, output_directory)
if definition['type'] == 'http':
download_from_http(name, definition, output_directory)
def get_latest_version():
response = requests.get('https://api.github.com/repos/GNS3/gns3-server/releases')
response.raise_for_status()
releases = response.json()
latest = list(filter(lambda r: r['tag_name'].startswith('v'.format(DEFAULT_GNS3_SERVER_DEV_BRANCH)), releases))[0]
return latest['tag_name'].replace('v', '')
def is_tagged():
if 'TRAVIS_TAG' in os.environ.keys():
return True
if 'CIRCLE_TAG' in os.environ.keys():
return True
if os.environ.get('APPVEYOR_REPO_TAG', False) in (1, "True", "true"):
return True
def is_web_ui_non_dev():
package_file = os.path.join(FILE_DIR, '..', 'package.json')
with open(package_file) as fp:
package_content = fp.read()
package = json.loads(package_content)
version = package['version']
return not version.endswith('dev')
def auto_version(arguments):
# if we are on tagged repo it means we should use released gns3server
if is_tagged():
arguments.l = True
# if we are building non-dev version it should be same as above
if is_web_ui_non_dev():
arguments.l = True
def download_command(arguments):
if arguments.a:
auto_version(arguments)
shutil.rmtree(SOURCE_DESTINATION, ignore_errors=True)
os.makedirs(SOURCE_DESTINATION)
if arguments.l:
version = get_latest_version()
download_url = "https://api.github.com/repos/GNS3/gns3-server/zipball/v{version}"
else:
version = DEFAULT_GNS3_SERVER_DEV_BRANCH
download_url = "https://github.com/GNS3/gns3-server/archive/{version}.zip"
print("Using {version} with download_url: {download_url}".format(version=version, download_url=download_url))
download(download_url.format(version=version), SOURCE_ZIP)
files = unzip(SOURCE_ZIP, SOURCE_DESTINATION)
source_directory = os.path.join(SOURCE_DESTINATION, files[0].filename)
if platform.system() == "Windows":
requirements = 'win-requirements.txt'
elif platform.system() == "Darwin":
requirements = 'mac-requirements.txt'
else:
requirements = 'requirements.txt'
subprocess.check_call([sys.executable, '-m', 'pip', 'install', '-r', os.path.join(source_directory, requirements)])
def build_command(arguments):
source_directory = getsource_directory()
sys.path.append(source_directory)
if platform.system() == 'Darwin':
# this fixes cx_freeze bug for OSX and python 3.6, see:
# https://bitbucket.org/ronaldoussoren/pyobjc/issues/185/python-36-modulenotfounderror-no-module
with open(os.path.join(source_directory, 'gns3server', 'main.py')) as f:
main_content = f.read()
if 'cx_freeze_and_python_3_6_missing_library' not in main_content:
main_content += "\ndef cx_freeze_and_python_3_6_missing_library():\n import _sysconfigdata_m_darwin_darwin\n\n"
with open(os.path.join(source_directory, 'gns3server', 'main.py'), 'w') as f:
f.write(main_content)
from gns3server.version import __version__
# cx_Freeze on Windows requires version to be in format a.b.c.d
server_version = getversion(__version__)
executables = [
Executable(
os.path.join(source_directory, "gns3server/main.py"),
targetName="gns3server{}".format(BINARIES_EXTENSION)
),
Executable(
os.path.join(source_directory, "gns3server/utils/vmnet.py"),
targetName="gns3vmnet{}".format(BINARIES_EXTENSION)
)
]
excludes = [
"distutils", # issue on macOS
"tkinter", # issue on Windows
]
packages = [
"psutil",
"asyncio",
"packaging", # needed for linux
"appdirs",
"idna", # required by aiohttp >= 2.3, cannot be found by cx_Freeze
]
include_files = [
("gns3server/configs", "configs"),
("gns3server/appliances", "appliances"),
("gns3server/templates", "templates"),
("gns3server/symbols", "symbols"),
("gns3server/static/web-ui", "static/web-ui")
]
include_files = [(os.path.join(source_directory, x), y) for x, y in include_files]
setup(
name="GNS3",
version=server_version,
description="GNS3 Network simulator",
executables=executables,
options={
"build_exe": {
"includes": [],
"excludes": excludes,
"packages": packages,
"include_files": include_files
},
}
)
def execute(exe, queue, pid_q):
binary_process = subprocess.Popen(
[exe],
bufsize=1, shell=False,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT
)
pid_q.put(binary_process.pid)
while True:
out = binary_process.stdout.read(1)
if out == b'' and binary_process.poll() is not None:
break
queue.put(out)
def validate_command(arguments):
output_directory = os.path.join(os.getcwd(), arguments.b)
files = os.listdir(output_directory)
matching = [f for f in files if f.startswith('exe.')]
if len(matching) == 0:
raise Exception("Cannot find binaries of gns3server")
binary = os.path.join(output_directory, matching[0], 'gns3server{}'.format(BINARIES_EXTENSION))
print("Validating: {}".format(binary))
pid_queue = Queue()
output_queue = Queue()
process = Process(target=execute, args=(binary, output_queue, pid_queue))
process.start()
pid = pid_queue.get()
print("Process is running on pid: " + str(pid))
output = ""
while True:
try:
char = output_queue.get(timeout=3)
output += char.decode()
except Empty:
break
process.terminate()
print("Output of process:")
print(output)
parent = psutil.Process(pid)
parent.kill()
result = "GNS3 Technologies Inc" not in output and 1 or 0
sys.exit(result)
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Building gns3server for distribution')
subparsers = parser.add_subparsers(
dest='command', help='Command which needs to be executed')
parser_download = subparsers.add_parser(
'download', help='Downloads source code of gns3server')
parser_download.add_argument('-l', action='store_true', help="Use the latest released version (incl. alpha), if not specified then dev version will be taken.")
parser_download.add_argument('-a', action='store_true', help="Automatically choose version based on CI/CD pipeline")
parser_build = subparsers.add_parser('build_exe', help='Build gns3server')
parser_build.add_argument('-b', help='Output directory')
parser_build.add_argument('-s', action='store_true', help='Silient building')
parser_validate = subparsers.add_parser('validate', help='Validate build')
parser_validate.add_argument('-b', help='Output directory')
parser_validate = subparsers.add_parser('download_dependencies', help='Download dependencies')
parser_validate.add_argument('-b', help='Output directory')
args = parser.parse_args()
if args.command == 'build_exe':
prepare()
build_command(args)
elif args.command == 'download':
prepare()
download_command(args)
elif args.command == 'download_dependencies':
prepare()
download_dependencies_command(args)
elif args.command == 'validate':
prepare()
validate_command(args)

22
scripts/docker_dev_webui.sh Executable file
View File

@ -0,0 +1,22 @@
#!/bin/sh
#
# Copyright (C) 2018 GNS3 Technologies Inc.
# Copyright (C) 2018 Nabil Bendafi <nabil@bendafi.fr>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# A docker web UI use for localy test
docker build -t gns3-web-ui .
docker run -i -h gns3UIvm -p 8080:8080/tcp -t gns3-web-ui

6
scripts/requirements.txt Normal file
View File

@ -0,0 +1,6 @@
setuptools==54.2.0
cx_Freeze==5.1.1
requests==2.25.1
packaging==20.9
appdirs==1.4.4
psutil==5.8.0

27
sentry.js Normal file
View File

@ -0,0 +1,27 @@
const { init } = require('@sentry/electron');
const fs = require('fs');
const { ipcMain } = require('electron')
let crashReportsEnabled = true;
const DSN =
'https://cb7b474b2e874afb8e400c47d1452ecc:7876224cbff543d992cb0ac4021962f8@sentry.io/1040940';
const isDev = () => {
return fs.existsSync('.git');
};
const shouldSendCallback = () => {
return !isDev() && crashReportsEnabled;
};
ipcMain.on('settings.changed', function (event, settings) {
crashReportsEnabled = settings.crash_reports;
});
init({
dsn: DSN,
shouldSendCallback: shouldSendCallback
});

25
set-variables-in-env.js Normal file
View File

@ -0,0 +1,25 @@
const yargs = require('yargs');
const fs = require('fs');
const argv = yargs.argv;
const tempFile = `.temp-var-file.ts`;
if(argv.set) {
const envFile = argv.set;
console.log(`Backuping up '${envFile}' into '${tempFile}'.`);
fs.copyFileSync(envFile, tempFile);
let content = fs.readFileSync(envFile, "utf8");
if(process.env.SOLARPUTTY_DOWNLOAD_URL) {
const variables = `solarputty_download_url: '${process.env.SOLARPUTTY_DOWNLOAD_URL}',`
content = content.replace('solarputty_download_url: "",', variables);
}
fs.writeFileSync(envFile, content);
}
if(argv.unset) {
const envFile = argv.unset;
console.log(`Restoring '${tempFile}' into '${envFile}'.`);
fs.copyFileSync(tempFile, envFile);
}

176
src/ReleaseNotes.txt Normal file
View File

@ -0,0 +1,176 @@
GNS3 WebUI is web implementation of user interface for GNS3 software.
Current version: 2.2.22
Current version: 2020.4.0-beta.1
Bug Fixes & enhancements
- symbol is not properly selected in change symbol dialog
- issue when using the scroll wheel on the web console
- missing settings for Docker nodes
- error on servers page
What's new
- double click nodes to open the console
Current version: 2020.3.0-beta.3
Bug Fixes & enhancements
- direct download URL in template dialog
- fix for issues with suspnded nodes
- fix for bug with deleting templates
- fix for importing images
What's new
- Option to resize console
- Improvements in creating templates
GNS3 Web UI 2020.3.0-beta.1
Bug Fixes & enhancements
- refreshing list of templates after adding new template from project map 
- link to preferences from project page 
- disallow user to create Qemu template when binary is not selected 
- extending the time for notification to appear 
- open first settings menu at start 
- the menu for the map rearranged 
- restyling SystemStatus page 
- marking files which already exist in appliance wizard
What's new
- Option to import appliances
GNS3 Web UI 2020.2.0-beta.5
Bug Fixes
- Bug in symbol selection
- Same question is asked after going back to project
- Cannot read property 'forEach' of undefined
- Error when selecting existing Docker image
- Invalid property when adding VMware VM template
- Invalid type for adapters field when adding Docker template
- Prevent user to move to another step when adding template
- Web UI cannot set flag "Leave this project running in the background after closing"
What's new
- Default values in templates
- New option for Qemu VMs
- Ability to quickly change Hostname from right click
- Progress bar for node creation
GNS3 Web UI 2020.2.0-beta.4
Bug Fixes
- New port setting for GNS3 VM preferences
- Option to auto-hide menu toolbar on the left side
- Server type in template preferences
- Error when selecting existing Docker image
- Default values in templates
- TypeError: Cannot read property 'message' of undefined
- TypeError: e.error is undefined
- TypeError: Cannot read property 'placements' of null
- Creating IOS templates -> fix for platforms and network adapters
GNS3 Web UI 2020.2.0-beta.2
What's New
- Drag & drop to add new nodes on topology
- Option to minimize/maximize and hide console widget
- Ability to add IOS templates
- Node names in HTTP console tabs
- Default settings for templates
- Support for adding IOS images
- Node dialog updated
- Messages with description in toasts
- Adding interfaces to cloud nodes
- Changes in notification box mechanism (once per day option)
- Additional tooltips added
- Copy/paste options in console (only Chrome full support)
- More details for server failed connections
Bug Fixes
- Fix for console icons
- Fix for creating ethernet switches and hubs
- Fix for opening console from context menu
- Qemu configurator now works properly
- Fixes in snap to grid option
- Symbols preview now works correctly
- Error messages in preferences should be displayed
- Default values for New Ethernet devices in configurator
- Fix for wrong adapter types in Qemu
- Fix for fit in view option on Firefox
- Fix for navigation errors
GNS3 Web UI 2020.2.0-beta.1
What's New
- Support for suspended status added
- Suport for 404 page
- Actions for group of nodes added
- Updating packages
- Button to close project added
- Opening ads in new window
- New dialog for adding nodes
- Option to import config
- Support for light theme added
Bug Fixes
- Fix for navigating to project that doesn't exist
- Fix for AdButler errors
- Fix for screenshot issue
- Proper centering of icons
- Fix for adding custom symbols
- Fix for return command in console
- Fix for deleting links
- Fix for duplicating any node type
- Fix for console errors on servers page
- Fix for console errors on projects page
GNS3 Web UI 2019.2.0 v10
What's New
- Qemu image configurator
- Custom console for particular node
- Option to connect console to all nodes
- Option to start Winpcap
- Filtering devices with packet filters on topology summary
- Filtering devices with captures on topology summary
- View options taken from map configuration
- Servers summary widget
- Ability to lock single item on the map
- Editing & import & export config files
- Context menu for inserted drawings
- Ability to drag topology summary & servers summary & console widgets
- Ability to resize topology summary & servers summary & console widgets
- Option to show the grid
- Option to snap to grid
- Usage instructions available from context menu
- Errors & warnings visible as notifications
- Fit in view options
- Support for global variables
- Support for layers
- Extending template preferences
Bug Fixes
- Input validation in styles editor
- Fix for saving map as image
- Removing errors with uncorrect subscriptions
GNS3 Web UI 2019.2.0 v9
What's New
- Editing interface labels on double click
- Support for keyboard shortcuts
- Menu extended with option to delete currently opened project, export & import project
- Possibility to save current state of project
- Ability to duplicate project from projects page
- Node information dialog available from context menu
- Topology summary widget on map view
- Improvements in dialog styles
Bug Fixes
- Removing issues with opening console
- Context menu now is correctly placed
- Text validation in dialogs
- Removing errors with creating WebSockets

View File

@ -1,36 +1,210 @@
import { environment } from "../environments/environment";
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { ProjectMapComponent } from './project-map/project-map.component';
import { ServersComponent } from "./servers/servers.component";
import { ProjectsComponent } from "./projects/projects.component";
import { DefaultLayoutComponent } from "./default-layout/default-layout.component";
import { BundledServerFinderComponent } from './components/bundled-server-finder/bundled-server-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 { 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 { Gns3vmComponent } from './components/preferences/gns3vm/gns3vm.component';
import { AddIouTemplateComponent } from './components/preferences/ios-on-unix/add-iou-template/add-iou-template.component';
import { CopyIouTemplateComponent } from './components/preferences/ios-on-unix/copy-iou-template/copy-iou-template.component';
import { IouTemplateDetailsComponent } from './components/preferences/ios-on-unix/iou-template-details/iou-template-details.component';
import { IouTemplatesComponent } from './components/preferences/ios-on-unix/iou-templates/iou-templates.component';
import { PreferencesComponent } from './components/preferences/preferences.component';
import { AddQemuVmTemplateComponent } from './components/preferences/qemu/add-qemu-vm-template/add-qemu-vm-template.component';
import { CopyQemuVmTemplateComponent } from './components/preferences/qemu/copy-qemu-vm-template/copy-qemu-vm-template.component';
import { QemuVmTemplateDetailsComponent } from './components/preferences/qemu/qemu-vm-template-details/qemu-vm-template-details.component';
import { QemuVmTemplatesComponent } from './components/preferences/qemu/qemu-vm-templates/qemu-vm-templates.component';
import { AddVirtualBoxTemplateComponent } from './components/preferences/virtual-box/add-virtual-box-template/add-virtual-box-template.component';
import { VirtualBoxTemplateDetailsComponent } from './components/preferences/virtual-box/virtual-box-template-details/virtual-box-template-details.component';
import { VirtualBoxTemplatesComponent } from './components/preferences/virtual-box/virtual-box-templates/virtual-box-templates.component';
import { AddVmwareTemplateComponent } from './components/preferences/vmware/add-vmware-template/add-vmware-template.component';
import { VmwareTemplateDetailsComponent } from './components/preferences/vmware/vmware-template-details/vmware-template-details.component';
import { VmwareTemplatesComponent } from './components/preferences/vmware/vmware-templates/vmware-templates.component';
import { AddVpcsTemplateComponent } from './components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component';
import { VpcsTemplateDetailsComponent } from './components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component';
import { VpcsTemplatesComponent } from './components/preferences/vpcs/vpcs-templates/vpcs-templates.component';
import { ProjectMapComponent } from './components/project-map/project-map.component';
import { ProjectsComponent } from './components/projects/projects.component';
import { ServersComponent } from './components/servers/servers.component';
import { ConsoleComponent } from './components/settings/console/console.component';
import { SettingsComponent } from './components/settings/settings.component';
import { ListOfSnapshotsComponent } from './components/snapshots/list-of-snapshots/list-of-snapshots.component';
import { SystemStatusComponent } from './components/system-status/system-status.component';
import { WebConsoleFullWindowComponent } from './components/web-console-full-window/web-console-full-window.component';
import { ConsoleGuard } from './guards/console-guard';
import { DefaultLayoutComponent } from './layouts/default-layout/default-layout.component';
import { ServerResolve } from './resolvers/server-resolve';
const routes: Routes = [
{ path: '', component: DefaultLayoutComponent,
{
path: '',
component: DefaultLayoutComponent,
children: [
{ path: '', redirectTo: 'servers', pathMatch: 'full'},
{ path: '', redirectTo: 'servers', pathMatch: 'full' },
{ path: 'servers', component: ServersComponent },
{ path: 'server/:server_id/projects', component: ProjectsComponent }
]
{ path: 'bundled', component: BundledServerFinderComponent },
{
path: 'server/:server_id/projects',
component: ProjectsComponent,
resolve: { server: ServerResolve },
},
{ path: 'help', component: HelpComponent },
{ path: 'settings', component: SettingsComponent },
{ path: 'settings/console', component: ConsoleComponent },
{ path: 'installed-software', component: InstalledSoftwareComponent },
{ path: 'server/:server_id/systemstatus', component: SystemStatusComponent },
{ path: 'server/:server_ip/:server_port/project/:project_id', component: DirectLinkComponent },
{
path: 'server/:server_id/project/:project_id/snapshots',
component: ListOfSnapshotsComponent,
resolve: { server: ServerResolve },
},
{ path: 'server/:server_id/preferences', component: PreferencesComponent },
{ path: 'server/:server_id/preferences/gns3vm', component: Gns3vmComponent },
// { path: 'server/:server_id/preferences/general', component: GeneralPreferencesComponent },
{ path: 'server/:server_id/preferences/builtin', component: BuiltInPreferencesComponent },
{ path: 'server/:server_id/preferences/builtin/ethernet-hubs', component: EthernetHubsTemplatesComponent },
{
path: 'server/:server_id/preferences/builtin/ethernet-hubs/addtemplate',
component: EthernetHubsAddTemplateComponent,
},
{
path: 'server/:server_id/preferences/builtin/ethernet-hubs/:template_id',
component: EthernetHubsTemplateDetailsComponent,
},
{
path: 'server/:server_id/preferences/builtin/ethernet-switches',
component: EthernetSwitchesTemplatesComponent,
},
{
path: 'server/:server_id/preferences/builtin/ethernet-switches/addtemplate',
component: EthernetSwitchesAddTemplateComponent,
},
{
path: 'server/:server_id/preferences/builtin/ethernet-switches/:template_id',
component: EthernetSwitchesTemplateDetailsComponent,
},
{ path: 'server/:server_id/preferences/builtin/cloud-nodes', component: CloudNodesTemplatesComponent },
{
path: 'server/:server_id/preferences/builtin/cloud-nodes/addtemplate',
component: CloudNodesAddTemplateComponent,
},
{
path: 'server/:server_id/preferences/builtin/cloud-nodes/:template_id',
component: CloudNodesTemplateDetailsComponent,
},
//{ path: 'server/:server_id/preferences/dynamips', component: DynamipsPreferencesComponent },
{ path: 'server/:server_id/preferences/dynamips/templates', component: IosTemplatesComponent },
{ path: 'server/:server_id/preferences/dynamips/templates/addtemplate', component: AddIosTemplateComponent },
{ path: 'server/:server_id/preferences/dynamips/templates/:template_id', component: IosTemplateDetailsComponent },
{
path: 'server/:server_id/preferences/dynamips/templates/:template_id/copy',
component: CopyIosTemplateComponent,
},
// { path: 'server/:server_id/preferences/qemu', component: QemuPreferencesComponent },
{ path: 'server/:server_id/preferences/qemu/templates', component: QemuVmTemplatesComponent },
{
path: 'server/:server_id/preferences/qemu/templates/:template_id/copy',
component: CopyQemuVmTemplateComponent,
},
{ path: 'server/:server_id/preferences/qemu/templates/:template_id', component: QemuVmTemplateDetailsComponent },
{ path: 'server/:server_id/preferences/qemu/addtemplate', component: AddQemuVmTemplateComponent },
// { path: 'server/:server_id/preferences/vpcs', component: VpcsPreferencesComponent },
{ path: 'server/:server_id/preferences/vpcs/templates', component: VpcsTemplatesComponent },
{ path: 'server/:server_id/preferences/vpcs/templates/:template_id', component: VpcsTemplateDetailsComponent },
{ path: 'server/:server_id/preferences/vpcs/addtemplate', component: AddVpcsTemplateComponent },
// { path: 'server/:server_id/preferences/virtualbox', component: VirtualBoxPreferencesComponent },
{ path: 'server/:server_id/preferences/virtualbox/templates', component: VirtualBoxTemplatesComponent },
{
path: 'server/:server_id/preferences/virtualbox/templates/:template_id',
component: VirtualBoxTemplateDetailsComponent,
},
{ path: 'server/:server_id/preferences/virtualbox/addtemplate', component: AddVirtualBoxTemplateComponent },
// { path: 'server/:server_id/preferences/vmware', component: VmwarePreferencesComponent },
{ path: 'server/:server_id/preferences/vmware/templates', component: VmwareTemplatesComponent },
{
path: 'server/:server_id/preferences/vmware/templates/:template_id',
component: VmwareTemplateDetailsComponent,
},
{ path: 'server/:server_id/preferences/vmware/addtemplate', component: AddVmwareTemplateComponent },
// { path: 'server/:server_id/preferences/traceng', component: TracengPreferencesComponent },
// { path: 'server/:server_id/preferences/traceng/templates', component: TracengTemplatesComponent },
// { path: 'server/:server_id/preferences/traceng/templates/:template_id', component: TracengTemplateDetailsComponent },
// { path: 'server/:server_id/preferences/traceng/addtemplate', component: AddTracengTemplateComponent },
{ path: 'server/:server_id/preferences/docker/templates', component: DockerTemplatesComponent },
{
path: 'server/:server_id/preferences/docker/templates/:template_id',
component: DockerTemplateDetailsComponent,
},
{
path: 'server/:server_id/preferences/docker/templates/:template_id/copy',
component: CopyDockerTemplateComponent,
},
{ path: 'server/:server_id/preferences/docker/addtemplate', component: AddDockerTemplateComponent },
{ path: 'server/:server_id/preferences/iou/templates', component: IouTemplatesComponent },
{ path: 'server/:server_id/preferences/iou/templates/:template_id', component: IouTemplateDetailsComponent },
{ path: 'server/:server_id/preferences/iou/templates/:template_id/copy', component: CopyIouTemplateComponent },
{ path: 'server/:server_id/preferences/iou/addtemplate', component: AddIouTemplateComponent },
],
},
{
path: 'server/:server_id/project/:project_id',
component: ProjectMapComponent,
canDeactivate: [ConsoleGuard],
},
{
path: 'server/:server_id/project/:project_id/nodes/:node_id',
component: WebConsoleFullWindowComponent,
},
{
path: 'static/web-ui/server/:server_id/project/:project_id/nodes/:node_id',
component: WebConsoleFullWindowComponent,
},
{
path: '**',
component: PageNotFoundComponent,
},
{ path: 'server/:server_id/project/:project_id', component: ProjectMapComponent },
];
let routerModule;
if (environment.electron) {
// angular in electron has problem with base-href and links separated by slashes, because of that
// we use simply hashes
routerModule = RouterModule.forRoot(routes, {useHash: true});
} else {
routerModule = RouterModule.forRoot(routes);
}
@NgModule({
imports: [ routerModule ],
exports: [ RouterModule ]
imports: [
RouterModule.forRoot(routes, {
anchorScrolling: 'enabled',
enableTracing: false,
scrollPositionRestoration: 'enabled',
}),
],
exports: [RouterModule],
})
export class AppRoutingModule {}

View File

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

View File

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

View File

@ -1,30 +1,62 @@
import { TestBed, async } from '@angular/core/testing';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MatIconModule } from '@angular/material/icon';
import { RouterTestingModule } from '@angular/router/testing';
import { ElectronService, NgxElectronModule } from 'ngx-electron';
import { AppComponent } from './app.component';
import { ProgressService } from './common/progress/progress.service';
import { SettingsService } from './services/settings.service';
import createSpyObj = jasmine.createSpyObj;
// import 'jasmine';
describe('AppComponent', () => {
let component: AppComponent;
let fixture: ComponentFixture<AppComponent>;
let electronService: ElectronService;
let settingsService: SettingsService;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
AppComponent
],
imports: [
RouterTestingModule
]
declarations: [AppComponent],
imports: [RouterTestingModule, MatIconModule, NgxElectronModule],
providers: [SettingsService, ProgressService],
schemas: [NO_ERRORS_SCHEMA],
}).compileComponents();
electronService = TestBed.inject(ElectronService);
settingsService = TestBed.inject(SettingsService);
}));
// it('should create the app', async(() => {
// const fixture = TestBed.createComponent(AppComponent);
// const app = fixture.debugElement.componentInstance;
// expect(app).toBeTruthy();
// }));
beforeEach(() => {
fixture = TestBed.createComponent(AppComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
// it('should have footer', async(() => {
// const fixture = TestBed.createComponent(AppComponent);
// fixture.detectChanges();
// const compiled = fixture.debugElement.nativeElement;
// expect(compiled.querySelector('.text-muted').textContent).toContain('GNS3 Web UI demo');
// }));
it('should create the app', async(() => {
const app = fixture.debugElement.componentInstance;
expect(app).toBeTruthy();
}));
it('should have footer', async(() => {
const compiled = fixture.debugElement.nativeElement;
expect(compiled.querySelector('router-outlet').textContent).toEqual('');
}));
it('should receive changed settings and forward to electron', async(() => {
spyOnProperty(electronService, 'isElectronApp').and.returnValue(true);
settingsService.setReportsSettings(true);
component.ngOnInit();
settingsService.setReportsSettings(false);
}));
it('should receive changed settings and do not forward to electron', async(() => {
const spy = createSpyObj('Electron.IpcRenderer', ['send']);
spyOnProperty(electronService, 'isElectronApp').and.returnValue(false);
settingsService.setReportsSettings(true);
component.ngOnInit();
settingsService.setReportsSettings(false);
expect(spy.send).not.toHaveBeenCalled();
}));
});

View File

@ -1,23 +1,67 @@
import { Component, OnInit } from '@angular/core';
import {Http} from "@angular/http";
import {MatIconRegistry} from "@angular/material";
import {DomSanitizer} from "@angular/platform-browser";
import {ToastyConfig} from "ng2-toasty";
import { OverlayContainer } from '@angular/cdk/overlay';
import { Component, HostBinding, OnInit } from '@angular/core';
import { MatIconRegistry } from '@angular/material/icon';
import { DomSanitizer } from '@angular/platform-browser';
import { NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Router } from '@angular/router';
import { ElectronService } from 'ngx-electron';
import { ProgressService } from './common/progress/progress.service';
import { SettingsService } from './services/settings.service';
import { ThemeService } from './services/theme.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: [
'./app.component.css'
]
styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit {
constructor(http: Http, iconReg: MatIconRegistry, sanitizer: DomSanitizer, toastyConfig: ToastyConfig) {
toastyConfig.theme = 'material';
public darkThemeEnabled: boolean = false;
iconReg.addSvgIcon('gns3', sanitizer.bypassSecurityTrustResourceUrl('./assets/gns3_icon.svg'));
constructor(
private overlayContainer: OverlayContainer,
iconReg: MatIconRegistry,
sanitizer: DomSanitizer,
private settingsService: SettingsService,
private electronService: ElectronService,
private themeService: ThemeService,
private router: Router,
private progressService: ProgressService
) {
iconReg.addSvgIcon('gns3', sanitizer.bypassSecurityTrustResourceUrl('./assets/gns3_icon.svg'));
iconReg.addSvgIcon('gns3black', sanitizer.bypassSecurityTrustResourceUrl('./assets/gns3_icon_black.svg'));
router.events.subscribe((value) => {
this.checkEvent(value);
});
}
@HostBinding('class') componentCssClass;
ngOnInit(): void {
this.applyTheme(this.themeService.savedTheme + '-theme');
this.themeService.themeChanged.subscribe((event: string) => {
this.applyTheme(event);
});
}
applyTheme(theme: string) {
if (theme === 'dark-theme') {
this.darkThemeEnabled = true;
} else {
this.darkThemeEnabled = false;
}
this.overlayContainer.getContainerElement().classList.add(theme);
this.componentCssClass = theme;
}
checkEvent(routerEvent): void {
if (routerEvent instanceof NavigationStart) {
this.progressService.activate();
} else if (
routerEvent instanceof NavigationEnd ||
routerEvent instanceof NavigationCancel ||
routerEvent instanceof NavigationError
) {
this.progressService.deactivate();
}
}
}

View File

@ -1,58 +1,273 @@
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpModule } from '@angular/http';
import { FormsModule } from '@angular/forms';
import { CdkTableModule } from "@angular/cdk/table";
import { DragDropModule } from '@angular/cdk/drag-drop';
import { OverlayModule } from '@angular/cdk/overlay';
import { CdkTableModule } from '@angular/cdk/table';
import { HttpClientModule } from '@angular/common/http';
import { ErrorHandler, NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatSidenavModule } from '@angular/material/sidenav';
import { BrowserModule, Title } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import {
MatButtonModule,
MatCardModule,
MatMenuModule,
MatToolbarModule,
MatIconModule,
MatFormFieldModule,
MatInputModule,
MatTableModule,
MatDialogModule,
MatProgressBarModule,
MatProgressSpinnerModule
} from '@angular/material';
import { DragAndDropModule } from 'angular-draggable-droppable';
import { ResizableModule } from 'angular-resizable-element';
import { D3Service } from 'd3-ng2-service';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { ToastyModule } from 'ng2-toasty';
import { NgCircleProgressModule } from 'ng-circle-progress';
import { FileUploadModule } from 'ng2-file-upload';
import { NgxChildProcessModule } from 'ngx-childprocess';
import { NgxElectronModule } from 'ngx-electron';
import { AppRoutingModule } from './app-routing.module';
import { VersionService } from './shared/services/version.service';
import { ProjectService } from './shared/services/project.service';
import { SymbolService } from "./shared/services/symbol.service";
import { ServerService } from "./shared/services/server.service";
import { IndexedDbService } from "./shared/services/indexed-db.service";
import { HttpServer } from "./shared/services/http-server.service";
import { SnapshotService } from "./shared/services/snapshot.service";
import { ProgressDialogService } from "./shared/progress-dialog/progress-dialog.service";
import { NodeService } from "./shared/services/node.service";
import { ApplianceService } from "./shared/services/appliance.service";
import { LinkService } from "./shared/services/link.service";
import { ProjectsComponent } from './projects/projects.component';
import { DefaultLayoutComponent } from './default-layout/default-layout.component';
import { ProgressDialogComponent } from './shared/progress-dialog/progress-dialog.component';
import { AppComponent } from './app.component';
//import { MapComponent } from './cartography/map/map.component';
import { CreateSnapshotDialogComponent, ProjectMapComponent } from './project-map/project-map.component';
import { ServersComponent, AddServerDialogComponent } from './servers/servers.component';
import { NodeContextMenuComponent } from './shared/node-context-menu/node-context-menu.component';
import { StartNodeActionComponent } from './shared/node-context-menu/actions/start-node-action/start-node-action.component';
import { StopNodeActionComponent } from './shared/node-context-menu/actions/stop-node-action/stop-node-action.component';
import { ApplianceComponent } from './appliance/appliance.component';
import { ApplianceListDialogComponent } from './appliance/appliance-list-dialog/appliance-list-dialog.component';
import { NodeSelectInterfaceComponent } from './shared/node-select-interface/node-select-interface.component';
import { CartographyModule } from './cartography/cartography.module';
import { DrawingsDataSource } from './cartography/datasources/drawings-datasource';
import { LinksDataSource } from './cartography/datasources/links-datasource';
import { NodesDataSource } from './cartography/datasources/nodes-datasource';
import { SymbolsDataSource } from './cartography/datasources/symbols-datasource';
import { InRectangleHelper } from './cartography/helpers/in-rectangle-helper';
import { SelectionManager } from './cartography/managers/selection-manager';
import { ToasterErrorHandler } from './common/error-handlers/toaster-error-handler';
import { ProgressDialogComponent } from './common/progress-dialog/progress-dialog.component';
import { ProgressDialogService } from './common/progress-dialog/progress-dialog.service';
import { ProgressComponent } from './common/progress/progress.component';
import { ProgressService } from './common/progress/progress.service';
import { AdbutlerComponent } from './components/adbutler/adbutler.component';
import { BundledServerFinderComponent } from './components/bundled-server-finder/bundled-server-finder.component';
import { InformationDialogComponent } from './components/dialogs/information-dialog.component';
import { DirectLinkComponent } from './components/direct-link/direct-link.component';
import { DrawingAddedComponent } from './components/drawings-listeners/drawing-added/drawing-added.component';
import { DrawingDraggedComponent } from './components/drawings-listeners/drawing-dragged/drawing-dragged.component';
import { DrawingResizedComponent } from './components/drawings-listeners/drawing-resized/drawing-resized.component';
import { 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 { Gns3vmComponent } from './components/preferences/gns3vm/gns3vm.component';
import { AddIouTemplateComponent } from './components/preferences/ios-on-unix/add-iou-template/add-iou-template.component';
import { CopyIouTemplateComponent } from './components/preferences/ios-on-unix/copy-iou-template/copy-iou-template.component';
import { IouTemplateDetailsComponent } from './components/preferences/ios-on-unix/iou-template-details/iou-template-details.component';
import { IouTemplatesComponent } from './components/preferences/ios-on-unix/iou-templates/iou-templates.component';
import { PreferencesComponent } from './components/preferences/preferences.component';
import { AddQemuVmTemplateComponent } from './components/preferences/qemu/add-qemu-vm-template/add-qemu-vm-template.component';
import { CopyQemuVmTemplateComponent } from './components/preferences/qemu/copy-qemu-vm-template/copy-qemu-vm-template.component';
import { QemuPreferencesComponent } from './components/preferences/qemu/qemu-preferences/qemu-preferences.component';
import { QemuVmTemplateDetailsComponent } from './components/preferences/qemu/qemu-vm-template-details/qemu-vm-template-details.component';
import { QemuVmTemplatesComponent } from './components/preferences/qemu/qemu-vm-templates/qemu-vm-templates.component';
import { AddTracengTemplateComponent } from './components/preferences/traceng/add-traceng/add-traceng-template.component';
import { TracengPreferencesComponent } from './components/preferences/traceng/traceng-preferences/traceng-preferences.component';
import { TracengTemplateDetailsComponent } from './components/preferences/traceng/traceng-template-details/traceng-template-details.component';
import { TracengTemplatesComponent } from './components/preferences/traceng/traceng-templates/traceng-templates.component';
import { AddVirtualBoxTemplateComponent } from './components/preferences/virtual-box/add-virtual-box-template/add-virtual-box-template.component';
import { VirtualBoxPreferencesComponent } from './components/preferences/virtual-box/virtual-box-preferences/virtual-box-preferences.component';
import { VirtualBoxTemplateDetailsComponent } from './components/preferences/virtual-box/virtual-box-template-details/virtual-box-template-details.component';
import { VirtualBoxTemplatesComponent } from './components/preferences/virtual-box/virtual-box-templates/virtual-box-templates.component';
import { AddVmwareTemplateComponent } from './components/preferences/vmware/add-vmware-template/add-vmware-template.component';
import { VmwarePreferencesComponent } from './components/preferences/vmware/vmware-preferences/vmware-preferences.component';
import { VmwareTemplateDetailsComponent } from './components/preferences/vmware/vmware-template-details/vmware-template-details.component';
import { VmwareTemplatesComponent } from './components/preferences/vmware/vmware-templates/vmware-templates.component';
import { AddVpcsTemplateComponent } from './components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component';
import { VpcsPreferencesComponent } from './components/preferences/vpcs/vpcs-preferences/vpcs-preferences.component';
import { VpcsTemplateDetailsComponent } from './components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component';
import { VpcsTemplatesComponent } from './components/preferences/vpcs/vpcs-templates/vpcs-templates.component';
import { ChangeHostnameDialogComponent } from './components/project-map/change-hostname-dialog/change-hostname-dialog.component';
import { ChangeSymbolDialogComponent } from './components/project-map/change-symbol-dialog/change-symbol-dialog.component';
import { ConsoleWrapperComponent } from './components/project-map/console-wrapper/console-wrapper.component';
import { ContextConsoleMenuComponent } from './components/project-map/context-console-menu/context-console-menu.component';
import { AlignHorizontallyActionComponent } from './components/project-map/context-menu/actions/align-horizontally/align-horizontally.component';
import { AlignVerticallyActionComponent } from './components/project-map/context-menu/actions/align_vertically/align-vertically.component';
import { 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 { EditTextActionComponent } from './components/project-map/context-menu/actions/edit-text-action/edit-text-action.component';
import { ExportConfigActionComponent } from './components/project-map/context-menu/actions/export-config/export-config-action.component';
import { HttpConsoleNewTabActionComponent } from './components/project-map/context-menu/actions/http-console-new-tab/http-console-new-tab-action.component';
import { HttpConsoleActionComponent } from './components/project-map/context-menu/actions/http-console/http-console-action.component';
import { ImportConfigActionComponent } from './components/project-map/context-menu/actions/import-config/import-config-action.component';
import { LockActionComponent } from './components/project-map/context-menu/actions/lock-action/lock-action.component';
import { MoveLayerDownActionComponent } from './components/project-map/context-menu/actions/move-layer-down-action/move-layer-down-action.component';
import { MoveLayerUpActionComponent } from './components/project-map/context-menu/actions/move-layer-up-action/move-layer-up-action.component';
import { OpenFileExplorerActionComponent } from './components/project-map/context-menu/actions/open-file-explorer/open-file-explorer-action.component';
import { PacketFiltersActionComponent } from './components/project-map/context-menu/actions/packet-filters-action/packet-filters-action.component';
import { ReloadNodeActionComponent } from './components/project-map/context-menu/actions/reload-node-action/reload-node-action.component';
import { ResumeLinkActionComponent } from './components/project-map/context-menu/actions/resume-link-action/resume-link-action.component';
import { ShowNodeActionComponent } from './components/project-map/context-menu/actions/show-node-action/show-node-action.component';
import { StartCaptureOnStartedLinkActionComponent } from './components/project-map/context-menu/actions/start-capture-on-started-link/start-capture-on-started-link.component';
import { StartCaptureActionComponent } from './components/project-map/context-menu/actions/start-capture/start-capture-action.component';
import { StartNodeActionComponent } from './components/project-map/context-menu/actions/start-node-action/start-node-action.component';
import { StopCaptureActionComponent } from './components/project-map/context-menu/actions/stop-capture/stop-capture-action.component';
import { StopNodeActionComponent } from './components/project-map/context-menu/actions/stop-node-action/stop-node-action.component';
import { SuspendLinkActionComponent } from './components/project-map/context-menu/actions/suspend-link/suspend-link-action.component';
import { SuspendNodeActionComponent } from './components/project-map/context-menu/actions/suspend-node-action/suspend-node-action.component';
import { ContextMenuComponent } from './components/project-map/context-menu/context-menu.component';
import { ConfigDialogComponent } from './components/project-map/context-menu/dialogs/config-dialog/config-dialog.component';
import { DrawLinkToolComponent } from './components/project-map/draw-link-tool/draw-link-tool.component';
import { StyleEditorDialogComponent } from './components/project-map/drawings-editors/style-editor/style-editor.component';
import { TextEditorDialogComponent } from './components/project-map/drawings-editors/text-editor/text-editor.component';
import { HelpDialogComponent } from './components/project-map/help-dialog/help-dialog.component';
import { NodeCreatedLabelStylesFixer } from './components/project-map/helpers/node-created-label-styles-fixer';
import { ImportApplianceComponent } from './components/project-map/import-appliance/import-appliance.component';
import { InfoDialogComponent } from './components/project-map/info-dialog/info-dialog.component';
import { LogConsoleComponent } from './components/project-map/log-console/log-console.component';
import { LogEventsDataSource } from './components/project-map/log-console/log-events-datasource';
import { ApplianceInfoDialogComponent } from './components/project-map/new-template-dialog/appliance-info-dialog/appliance-info-dialog.component';
import { 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 { ConfiguratorDialogTracengComponent } from './components/project-map/node-editors/configurator/traceng/configurator-traceng.component';
import { ConfiguratorDialogVirtualBoxComponent } from './components/project-map/node-editors/configurator/virtualbox/configurator-virtualbox.component';
import { ConfiguratorDialogVmwareComponent } from './components/project-map/node-editors/configurator/vmware/configurator-vmware.component';
import { ConfiguratorDialogVpcsComponent } from './components/project-map/node-editors/configurator/vpcs/configurator-vpcs.component';
import { NodeSelectInterfaceComponent } from './components/project-map/node-select-interface/node-select-interface.component';
import { NodesMenuComponent } from './components/project-map/nodes-menu/nodes-menu.component';
import { PacketFiltersDialogComponent } from './components/project-map/packet-capturing/packet-filters/packet-filters.component';
import { StartCaptureDialogComponent } from './components/project-map/packet-capturing/start-capture/start-capture.component';
import { ProjectMapMenuComponent } from './components/project-map/project-map-menu/project-map-menu.component';
import { ProjectMapComponent } from './components/project-map/project-map.component';
import { 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 { ImportProjectDialogComponent } from './components/projects/import-project-dialog/import-project-dialog.component';
import { ProjectNameValidator } from './components/projects/models/projectNameValidator';
import { NavigationDialogComponent } from './components/projects/navigation-dialog/navigation-dialog.component';
import { ProjectsComponent } from './components/projects/projects.component';
import { SaveProjectDialogComponent } from './components/projects/save-project-dialog/save-project-dialog.component';
import { AddServerDialogComponent } from './components/servers/add-server-dialog/add-server-dialog.component';
import { ConfigureGns3VMDialogComponent } from './components/servers/configure-gns3vm-dialog/configure-gns3vm-dialog.component';
import { ServerDiscoveryComponent } from './components/servers/server-discovery/server-discovery.component';
import { ServersComponent } from './components/servers/servers.component';
import { ConsoleComponent } from './components/settings/console/console.component';
import { SettingsComponent } from './components/settings/settings.component';
import { CreateSnapshotDialogComponent } from './components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component';
import { ListOfSnapshotsComponent } from './components/snapshots/list-of-snapshots/list-of-snapshots.component';
import { SnapshotMenuItemComponent } from './components/snapshots/snapshot-menu-item/snapshot-menu-item.component';
import { StatusChartComponent } from './components/system-status/status-chart/status-chart.component';
import { StatusInfoComponent } from './components/system-status/status-info/status-info.component';
import { SystemStatusComponent } from './components/system-status/system-status.component';
import { TemplateListDialogComponent } from './components/template/template-list-dialog/template-list-dialog.component';
import { TemplateComponent } from './components/template/template.component';
import { TopologySummaryComponent } from './components/topology-summary/topology-summary.component';
import { WebConsoleFullWindowComponent } from './components/web-console-full-window/web-console-full-window.component';
import { DataSourceFilter } from './filters/dataSourceFilter';
import { DateFilter } from './filters/dateFilter.pipe';
import { NameFilter } from './filters/nameFilter.pipe';
import { ProjectsFilter } from './filters/projectsFilter.pipe';
import { SearchFilter } from './filters/searchFilter.pipe';
import { TemplateFilter } from './filters/templateFilter.pipe';
import { ConsoleGuard } from './guards/console-guard';
import { ProjectWebServiceHandler } from './handlers/project-web-service-handler';
import { DefaultLayoutComponent } from './layouts/default-layout/default-layout.component';
import { MATERIAL_IMPORTS } from './material.imports';
import { ServerResolve } from './resolvers/server-resolve';
import { ApplianceService } from './services/appliances.service';
import { BuiltInTemplatesConfigurationService } from './services/built-in-templates-configuration.service';
import { BuiltInTemplatesService } from './services/built-in-templates.service';
import { ComputeService } from './services/compute.service';
import { DockerConfigurationService } from './services/docker-configuration.service';
import { DockerService } from './services/docker.service';
import { DrawingService } from './services/drawing.service';
import { ExternalSoftwareDefinitionService } from './services/external-software-definition.service';
import { Gns3vmService } from './services/gns3vm.service';
import { GoogleAnalyticsService } from './services/google-analytics.service';
import { HttpServer, ServerErrorHandler } from './services/http-server.service';
import { InfoService } from './services/info.service';
import { InstalledSoftwareService } from './services/installed-software.service';
import { IosConfigurationService } from './services/ios-configuration.service';
import { IosService } from './services/ios.service';
import { IouConfigurationService } from './services/iou-configuration.service';
import { IouService } from './services/iou.service';
import { LinkService } from './services/link.service';
import { MapScaleService } from './services/mapScale.service';
import { MapSettingsService } from './services/mapsettings.service';
import { NodeService } from './services/node.service';
import { NodeConsoleService } from './services/nodeConsole.service';
import { NotificationService } from './services/notification.service';
import { PacketCaptureService } from './services/packet-capture.service';
import { PlatformService } from './services/platform.service';
import { ProjectService } from './services/project.service';
import { QemuConfigurationService } from './services/qemu-configuration.service';
import { QemuService } from './services/qemu.service';
import { RecentlyOpenedProjectService } from './services/recentlyOpenedProject.service';
import { ServerManagementService } from './services/server-management.service';
import { ServerSettingsService } from './services/server-settings.service';
import { ServerDatabase } from './services/server.database';
import { ServerService } from './services/server.service';
import { SettingsService } from './services/settings.service';
import { ConsoleService } from './services/settings/console.service';
import { DefaultConsoleService } from './services/settings/default-console.service';
import { SnapshotService } from './services/snapshot.service';
import { SymbolService } from './services/symbol.service';
import { TemplateMocksService } from './services/template-mocks.service';
import { TemplateService } from './services/template.service';
import { ThemeService } from './services/theme.service';
import { ToasterService } from './services/toaster.service';
import { ToolsService } from './services/tools.service';
import { TracengService } from './services/traceng.service';
import { UpdatesService } from './services/updates.service';
import { VersionService } from './services/version.service';
import { VirtualBoxConfigurationService } from './services/virtual-box-configuration.service';
import { VirtualBoxService } from './services/virtual-box.service';
import { VmwareConfigurationService } from './services/vmware-configuration.service';
import { VmwareService } from './services/vmware.service';
import { VpcsConfigurationService } from './services/vpcs-configuration.service';
import { VpcsService } from './services/vpcs.service';
import { NonNegativeValidator } from './validators/non-negative-validator';
import { RotationValidator } from './validators/rotation-validator';
@NgModule({
declarations: [
@ -61,59 +276,329 @@ import { CartographyModule } from './cartography/cartography.module';
ServersComponent,
AddServerDialogComponent,
CreateSnapshotDialogComponent,
SnapshotMenuItemComponent,
ProjectsComponent,
AddBlankProjectDialogComponent,
ImportProjectDialogComponent,
ConfirmationDialogComponent,
DefaultLayoutComponent,
ProgressDialogComponent,
NodeContextMenuComponent,
ContextMenuComponent,
ContextConsoleMenuComponent,
StartNodeActionComponent,
StopNodeActionComponent,
ApplianceComponent,
ApplianceListDialogComponent,
TemplateComponent,
TemplateListDialogComponent,
MoveLayerDownActionComponent,
MoveLayerUpActionComponent,
EditStyleActionComponent,
EditTextActionComponent,
DeleteActionComponent,
DuplicateActionComponent,
PacketFiltersActionComponent,
StartCaptureActionComponent,
StopCaptureActionComponent,
ResumeLinkActionComponent,
SuspendLinkActionComponent,
SettingsComponent,
PreferencesComponent,
BundledServerFinderComponent,
ProgressComponent,
ServerDiscoveryComponent,
NodeSelectInterfaceComponent,
DrawLinkToolComponent,
InstalledSoftwareComponent,
DrawingAddedComponent,
DrawingResizedComponent,
TextAddedComponent,
TextEditedComponent,
NodeDraggedComponent,
NodeLabelDraggedComponent,
DrawingDraggedComponent,
LinkCreatedComponent,
InterfaceLabelDraggedComponent,
InstallSoftwareComponent,
StyleEditorDialogComponent,
TextEditorDialogComponent,
PacketFiltersDialogComponent,
QemuPreferencesComponent,
QemuVmTemplatesComponent,
AddQemuVmTemplateComponent,
QemuVmTemplateDetailsComponent,
GeneralPreferencesComponent,
VpcsPreferencesComponent,
VpcsTemplatesComponent,
AddVpcsTemplateComponent,
VpcsTemplateDetailsComponent,
VirtualBoxPreferencesComponent,
VirtualBoxTemplatesComponent,
VirtualBoxTemplateDetailsComponent,
AddVirtualBoxTemplateComponent,
BuiltInPreferencesComponent,
EthernetHubsTemplatesComponent,
EthernetHubsAddTemplateComponent,
EthernetHubsTemplateDetailsComponent,
CloudNodesTemplatesComponent,
CloudNodesAddTemplateComponent,
CloudNodesTemplateDetailsComponent,
EthernetSwitchesTemplatesComponent,
EthernetSwitchesAddTemplateComponent,
EthernetSwitchesTemplateDetailsComponent,
DynamipsPreferencesComponent,
IosTemplatesComponent,
IosTemplateDetailsComponent,
AddIosTemplateComponent,
SymbolsComponent,
VmwarePreferencesComponent,
VmwareTemplatesComponent,
VmwareTemplateDetailsComponent,
AddVmwareTemplateComponent,
DeleteConfirmationDialogComponent,
HelpDialogComponent,
StartCaptureDialogComponent,
DeleteTemplateComponent,
DockerTemplatesComponent,
AddDockerTemplateComponent,
DockerTemplateDetailsComponent,
IouTemplatesComponent,
AddIouTemplateComponent,
IouTemplateDetailsComponent,
CopyQemuVmTemplateComponent,
CopyIosTemplateComponent,
CopyIouTemplateComponent,
CopyDockerTemplateComponent,
EmptyTemplatesListComponent,
SymbolsMenuComponent,
SearchFilter,
DateFilter,
NameFilter,
DataSourceFilter,
TemplateFilter,
ProjectsFilter,
ListOfSnapshotsComponent,
CustomAdaptersComponent,
NodesMenuComponent,
AdbutlerComponent,
ConsoleDeviceActionComponent,
ShowNodeActionComponent,
ConsoleComponent,
NodesMenuComponent,
ProjectMapMenuComponent,
HelpComponent,
ConfigEditorDialogComponent,
EditConfigActionComponent,
LogConsoleComponent,
SaveProjectDialogComponent,
TopologySummaryComponent,
InfoDialogComponent,
BringToFrontActionComponent,
ExportConfigActionComponent,
ImportConfigActionComponent,
ConsoleDeviceActionBrowserComponent,
ChangeSymbolDialogComponent,
ChangeSymbolActionComponent,
EditProjectDialogComponent,
ReloadNodeActionComponent,
SuspendNodeActionComponent,
ConfigActionComponent,
ConfiguratorDialogVpcsComponent,
ConfiguratorDialogEthernetHubComponent,
ConfiguratorDialogEthernetSwitchComponent,
PortsComponent,
ConfiguratorDialogSwitchComponent,
ConfiguratorDialogVirtualBoxComponent,
CustomAdaptersTableComponent,
ConfiguratorDialogQemuComponent,
ConfiguratorDialogCloudComponent,
UdpTunnelsComponent,
ConfiguratorDialogAtmSwitchComponent,
ConfiguratorDialogVmwareComponent,
ConfiguratorDialogIouComponent,
ConfiguratorDialogIosComponent,
ConfiguratorDialogDockerComponent,
ConfiguratorDialogNatComponent,
ConfiguratorDialogTracengComponent,
AddTracengTemplateComponent,
TracengPreferencesComponent,
TracengTemplatesComponent,
TracengTemplateDetailsComponent,
QemuImageCreatorComponent,
ChooseNameDialogComponent,
StartCaptureOnStartedLinkActionComponent,
LockActionComponent,
NavigationDialogComponent,
ScreenshotDialogComponent,
PageNotFoundComponent,
AlignHorizontallyActionComponent,
AlignVerticallyActionComponent,
ConfirmationBottomSheetComponent,
ConfigDialogComponent,
Gns3vmComponent,
ConfigureGns3VMDialogComponent,
ImportApplianceComponent,
DirectLinkComponent,
SystemStatusComponent,
StatusInfoComponent,
StatusChartComponent,
OpenFileExplorerActionComponent,
HttpConsoleActionComponent,
WebConsoleComponent,
ConsoleWrapperComponent,
HttpConsoleNewTabActionComponent,
WebConsoleFullWindowComponent,
NewTemplateDialogComponent,
ChangeHostnameActionComponent,
ChangeHostnameDialogComponent,
ApplianceInfoDialogComponent,
InformationDialogComponent,
TemplateNameDialogComponent,
ConfigureCustomAdaptersDialogComponent,
EditNetworkConfigurationDialogComponent
],
imports: [
NgbModule.forRoot(),
ToastyModule.forRoot(),
BrowserModule,
HttpModule,
HttpClientModule,
AppRoutingModule,
FormsModule,
ReactiveFormsModule,
BrowserAnimationsModule,
MatButtonModule,
MatMenuModule,
MatCardModule,
MatToolbarModule,
MatIconModule,
MatFormFieldModule,
MatInputModule,
MatTableModule,
MatDialogModule,
MatProgressBarModule,
MatProgressSpinnerModule,
CdkTableModule,
CartographyModule
CartographyModule,
NgxElectronModule,
FileUploadModule,
MatSidenavModule,
ResizableModule,
DragAndDropModule,
DragDropModule,
NgxChildProcessModule,
MATERIAL_IMPORTS,
NgCircleProgressModule.forRoot(),
OverlayModule,
],
providers: [
SettingsService,
{ provide: ErrorHandler, useClass: ToasterErrorHandler },
D3Service,
VersionService,
ProjectService,
SymbolService,
ServerService,
ApplianceService,
TemplateService,
NodeService,
LinkService,
IndexedDbService,
DrawingService,
HttpServer,
SnapshotService,
ProgressDialogService
ProgressDialogService,
ToasterService,
ProgressService,
ProjectWebServiceHandler,
LinksDataSource,
NodesDataSource,
SymbolsDataSource,
LogEventsDataSource,
SelectionManager,
InRectangleHelper,
DrawingsDataSource,
ServerErrorHandler,
ServerDatabase,
ProjectNameValidator,
ToolsService,
ServerSettingsService,
QemuService,
VpcsService,
TemplateMocksService,
VirtualBoxService,
BuiltInTemplatesService,
IosService,
InstalledSoftwareService,
ExternalSoftwareDefinitionService,
PlatformService,
IosConfigurationService,
QemuConfigurationService,
VirtualBoxConfigurationService,
VpcsConfigurationService,
BuiltInTemplatesConfigurationService,
VmwareService,
VmwareConfigurationService,
DockerService,
DockerConfigurationService,
IouService,
IouConfigurationService,
RecentlyOpenedProjectService,
ServerManagementService,
MapScaleService,
ConsoleService,
DefaultConsoleService,
NodeCreatedLabelStylesFixer,
NonNegativeValidator,
RotationValidator,
MapSettingsService,
InfoService,
ComputeService,
TracengService,
PacketCaptureService,
NotificationService,
Gns3vmService,
ThemeService,
GoogleAnalyticsService,
NodeConsoleService,
ServerResolve,
ConsoleGuard,
Title,
ApplianceService,
UpdatesService,
],
entryComponents: [
AddServerDialogComponent,
CreateSnapshotDialogComponent,
ProgressDialogComponent,
ApplianceListDialogComponent
TemplateListDialogComponent,
AddBlankProjectDialogComponent,
ImportProjectDialogComponent,
ConfirmationDialogComponent,
StyleEditorDialogComponent,
PacketFiltersDialogComponent,
TextEditorDialogComponent,
SymbolsComponent,
DeleteConfirmationDialogComponent,
HelpDialogComponent,
StartCaptureDialogComponent,
ConfigEditorDialogComponent,
SaveProjectDialogComponent,
InfoDialogComponent,
ChangeSymbolDialogComponent,
EditProjectDialogComponent,
ConfigureGns3VMDialogComponent,
ConfiguratorDialogVpcsComponent,
ConfiguratorDialogEthernetHubComponent,
ConfiguratorDialogEthernetSwitchComponent,
ConfiguratorDialogSwitchComponent,
ConfiguratorDialogVirtualBoxComponent,
ConfiguratorDialogQemuComponent,
ConfiguratorDialogCloudComponent,
ConfiguratorDialogAtmSwitchComponent,
ConfiguratorDialogVmwareComponent,
ConfiguratorDialogIouComponent,
ConfiguratorDialogIosComponent,
ConfiguratorDialogDockerComponent,
ConfiguratorDialogNatComponent,
ConfiguratorDialogTracengComponent,
QemuImageCreatorComponent,
ChooseNameDialogComponent,
NavigationDialogComponent,
ScreenshotDialogComponent,
ConfirmationBottomSheetComponent,
ConfigDialogComponent,
AdbutlerComponent,
NewTemplateDialogComponent,
ChangeHostnameDialogComponent,
ApplianceInfoDialogComponent,
ConfigureCustomAdaptersDialogComponent,
EditNetworkConfigurationDialogComponent,
],
bootstrap: [ AppComponent ]
bootstrap: [AppComponent],
})
export class AppModule { }
export class AppModule {
constructor(protected _googleAnalyticsService: GoogleAnalyticsService) {}
}

View File

@ -1,21 +0,0 @@
<div mat-dialog-content>
<div class="example-header">
<mat-form-field floatPlaceholder="never">
<input matInput #filter placeholder="Filter appliances">
</mat-form-field>
</div>
<mat-table #table [dataSource]="dataSource">
<ng-container matColumnDef="name">
<mat-header-cell *matHeaderCellDef> Name </mat-header-cell>
<mat-cell *matCellDef="let row;"> <a (click)="addNode(row)" href='javascript:void(0);' class="table-link">{{row.name}}</a> </mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
</mat-table>
</div>
<div mat-dialog-actions align="end">
<button mat-button (click)="onNoClick()" tabindex="-1" color="accent">Close</button>
</div>

View File

@ -1,19 +0,0 @@
.example-header {
min-height: 64px;
display: flex;
align-items: baseline;
padding: 8px 24px 0;
font-size: 20px;
justify-content: space-between;
}
.mat-table {
overflow: auto;
max-height: 400px;
}
.mat-form-field {
font-size: 16px;
flex-grow: 1;
}

View File

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ApplianceListDialogComponent } from './appliance-list-dialog.component';
describe('ApplianceListDialogComponent', () => {
let component: ApplianceListDialogComponent;
let fixture: ComponentFixture<ApplianceListDialogComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ApplianceListDialogComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ApplianceListDialogComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,104 +0,0 @@
import {Component, ElementRef, Inject, Input, OnInit, ViewChild} from '@angular/core';
import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material";
import {DataSource} from "@angular/cdk/collections";
import {Observable} from "rxjs/Observable";
import {Appliance} from "../../shared/models/appliance";
import {ApplianceService} from "../../shared/services/appliance.service";
import {Server} from "../../shared/models/server";
import {BehaviorSubject} from "rxjs/BehaviorSubject";
import 'rxjs/add/operator/startWith';
import 'rxjs/add/observable/merge';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/debounceTime';
import 'rxjs/add/operator/distinctUntilChanged';
import 'rxjs/add/observable/fromEvent';
@Component({
selector: 'app-appliance-list-dialog',
templateUrl: './appliance-list-dialog.component.html',
styleUrls: ['./appliance-list-dialog.component.scss']
})
export class ApplianceListDialogComponent implements OnInit {
server: Server;
applianceDatabase: ApplianceDatabase;
dataSource: ApplianceDataSource;
displayedColumns = ['name'];
@ViewChild('filter') filter: ElementRef;
constructor(
public dialogRef: MatDialogRef<ApplianceListDialogComponent>,
private applianceService: ApplianceService,
@Inject(MAT_DIALOG_DATA) public data: any) {
this.server = data['server'];
}
ngOnInit() {
this.applianceDatabase = new ApplianceDatabase(this.server, this.applianceService);
this.dataSource = new ApplianceDataSource(this.applianceDatabase);
Observable.fromEvent(this.filter.nativeElement, 'keyup')
.debounceTime(150)
.distinctUntilChanged()
.subscribe(() => {
if (!this.dataSource) { return; }
this.dataSource.filter = this.filter.nativeElement.value;
});
}
onNoClick(): void {
this.dialogRef.close();
}
addNode(appliance: Appliance): void {
this.dialogRef.close(appliance);
}
}
export class ApplianceDatabase {
dataChange: BehaviorSubject<Appliance[]> = new BehaviorSubject<Appliance[]>([]);
get data(): Appliance[] {
return this.dataChange.value;
}
constructor(private server: Server, private applianceService: ApplianceService) {
this.applianceService.list(this.server).subscribe((appliances: Appliance[]) => {
this.dataChange.next(appliances);
});
}
};
export class ApplianceDataSource extends DataSource<Appliance> {
filterChange = new BehaviorSubject('');
get filter(): string { return this.filterChange.value; }
set filter(filter: string) { this.filterChange.next(filter); }
constructor(private applianceDatabase: ApplianceDatabase) {
super();
}
connect(): Observable<Appliance[]> {
const displayDataChanges = [
this.applianceDatabase.dataChange,
this.filterChange,
];
return Observable.merge(...displayDataChanges).map(() => {
return this.applianceDatabase.data.slice().filter((item: Appliance) => {
const searchStr = (item.name).toLowerCase();
return searchStr.indexOf(this.filter.toLowerCase()) !== -1;
});
});
}
disconnect() {}
}

View File

@ -1,3 +0,0 @@
<button mat-icon-button (click)="listAppliancesModal()">
<mat-icon>add_to_queue</mat-icon>
</button>

View File

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

View File

@ -1,36 +0,0 @@
import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
import {MatDialog} from "@angular/material";
import {ApplianceListDialogComponent} from "./appliance-list-dialog/appliance-list-dialog.component";
import {Server} from "../shared/models/server";
@Component({
selector: 'app-appliance',
templateUrl: './appliance.component.html',
styleUrls: ['./appliance.component.scss']
})
export class ApplianceComponent implements OnInit {
@Input() server: Server;
@Output() onNodeCreation = new EventEmitter<any>();
constructor(private dialog: MatDialog) { }
ngOnInit() {}
listAppliancesModal() {
const dialogRef = this.dialog.open(ApplianceListDialogComponent, {
width: '600px',
height: '560px',
data: {
'server': this.server
}
});
dialogRef.afterClosed().subscribe((appliance: AppendMode) => {
if (appliance !== null) {
this.onNodeCreation.emit(appliance);
}
});
}
}

View File

@ -0,0 +1,27 @@
import { DraggableComponent } from './components/experimental-map/draggable/draggable.component';
import { DrawingComponent } from './components/experimental-map/drawing/drawing.component';
import { EllipseComponent } from './components/experimental-map/drawing/drawings/ellipse/ellipse.component';
import { ImageComponent } from './components/experimental-map/drawing/drawings/image/image.component';
import { LineComponent } from './components/experimental-map/drawing/drawings/line/line.component';
import { RectComponent } from './components/experimental-map/drawing/drawings/rect/rect.component';
import { TextComponent } from './components/experimental-map/drawing/drawings/text/text.component';
import { InterfaceLabelComponent } from './components/experimental-map/interface-label/interface-label.component';
import { LinkComponent } from './components/experimental-map/link/link.component';
import { NodeComponent } from './components/experimental-map/node/node.component';
import { SelectionComponent } from './components/experimental-map/selection/selection.component';
import { StatusComponent } from './components/experimental-map/status/status.component';
export const ANGULAR_MAP_DECLARATIONS = [
NodeComponent,
LinkComponent,
StatusComponent,
DrawingComponent,
EllipseComponent,
ImageComponent,
LineComponent,
RectComponent,
TextComponent,
DraggableComponent,
SelectionComponent,
InterfaceLabelComponent,
];

View File

@ -1,12 +1,128 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MapComponent } from './map/map.component';
import { NgModule } from '@angular/core';
import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu';
import { ANGULAR_MAP_DECLARATIONS } from './angular-map.imports';
import { D3MapComponent } from './components/d3-map/d3-map.component';
import { DraggableSelectionComponent } from './components/draggable-selection/draggable-selection.component';
import { DrawingAddingComponent } from './components/drawing-adding/drawing-adding.component';
import { DrawingResizingComponent } from './components/drawing-resizing/drawing-resizing.component';
import { ExperimentalMapComponent } from './components/experimental-map/experimental-map.component';
import { SelectionControlComponent } from './components/selection-control/selection-control.component';
import { SelectionSelectComponent } from './components/selection-select/selection-select.component';
import { TextEditorComponent } from './components/text-editor/text-editor.component';
import { DrawingToMapDrawingConverter } from './converters/map/drawing-to-map-drawing-converter';
import { LabelToMapLabelConverter } from './converters/map/label-to-map-label-converter';
import { LinkNodeToMapLinkNodeConverter } from './converters/map/link-node-to-map-link-node-converter';
import { LinkToMapLinkConverter } from './converters/map/link-to-map-link-converter';
import { MapDrawingToDrawingConverter } from './converters/map/map-drawing-to-drawing-converter';
import { MapDrawingToSvgConverter } from './converters/map/map-drawing-to-svg-converter';
import { MapLabelToLabelConverter } from './converters/map/map-label-to-label-converter';
import { MapLinkNodeToLinkNodeConverter } from './converters/map/map-link-node-to-link-node-converter';
import { MapLinkToLinkConverter } from './converters/map/map-link-to-link-converter';
import { MapNodeToNodeConverter } from './converters/map/map-node-to-node-converter';
import { MapPortToPortConverter } from './converters/map/map-port-to-port-converter';
import { MapSymbolToSymbolConverter } from './converters/map/map-symbol-to-symbol-converter';
import { NodeToMapNodeConverter } from './converters/map/node-to-map-node-converter';
import { PortToMapPortConverter } from './converters/map/port-to-map-port-converter';
import { SymbolToMapSymbolConverter } from './converters/map/symbol-to-map-symbol-converter';
import { StylesToFontConverter } from './converters/styles-to-font-converter';
import { D3_MAP_IMPORTS } from './d3-map.imports';
import {
MapDrawingsDataSource,
MapLinksDataSource,
MapNodesDataSource,
MapSymbolsDataSource,
} from './datasources/map-datasource';
import { MovingCanvasDirective } from './directives/moving-canvas.directive';
import { ZoomingCanvasDirective } from './directives/zooming-canvas.directive';
import { DrawingsEventSource } from './events/drawings-event-source';
import { LinksEventSource } from './events/links-event-source';
import { MovingEventSource } from './events/moving-event-source';
import { NodesEventSource } from './events/nodes-event-source';
import { SelectionEventSource } from './events/selection-event-source';
import { CanvasSizeDetector } from './helpers/canvas-size-detector';
import { CssFixer } from './helpers/css-fixer';
import { DefaultDrawingsFactory } from './helpers/default-drawings-factory';
import { EllipseElementFactory } from './helpers/drawings-factory/ellipse-element-factory';
import { LineElementFactory } from './helpers/drawings-factory/line-element-factory';
import { RectangleElementFactory } from './helpers/drawings-factory/rectangle-element-factory';
import { TextElementFactory } from './helpers/drawings-factory/text-element-factory';
import { FontBBoxCalculator } from './helpers/font-bbox-calculator';
import { FontFixer } from './helpers/font-fixer';
import { MultiLinkCalculatorHelper } from './helpers/multi-link-calculator-helper';
import { QtDasharrayFixer } from './helpers/qt-dasharray-fixer';
import { SvgToDrawingConverter } from './helpers/svg-to-drawing-converter';
import { GraphDataManager } from './managers/graph-data-manager';
import { LayersManager } from './managers/layers-manager';
import { MapSettingsManager } from './managers/map-settings-manager';
import { Context } from './models/context';
import { MapChangeDetectorRef } from './services/map-change-detector-ref';
import { EthernetLinkWidget } from './widgets/links/ethernet-link';
import { SerialLinkWidget } from './widgets/links/serial-link';
@NgModule({
imports: [
CommonModule
imports: [CommonModule, MatMenuModule, MatIconModule],
declarations: [
D3MapComponent,
ExperimentalMapComponent,
DrawingAddingComponent,
DrawingResizingComponent,
TextEditorComponent,
...ANGULAR_MAP_DECLARATIONS,
SelectionControlComponent,
SelectionSelectComponent,
DraggableSelectionComponent,
MovingCanvasDirective,
ZoomingCanvasDirective,
],
declarations: [MapComponent],
exports: [MapComponent]
providers: [
CssFixer,
FontFixer,
DefaultDrawingsFactory,
TextElementFactory,
EllipseElementFactory,
RectangleElementFactory,
LineElementFactory,
MultiLinkCalculatorHelper,
SvgToDrawingConverter,
QtDasharrayFixer,
LayersManager,
MapChangeDetectorRef,
CanvasSizeDetector,
Context,
DrawingsEventSource,
NodesEventSource,
LinksEventSource,
MovingEventSource,
MapDrawingToSvgConverter,
DrawingToMapDrawingConverter,
LabelToMapLabelConverter,
LinkToMapLinkConverter,
LinkNodeToMapLinkNodeConverter,
MapDrawingToDrawingConverter,
MapLabelToLabelConverter,
MapLinkNodeToLinkNodeConverter,
MapLinkToLinkConverter,
MapNodeToNodeConverter,
MapPortToPortConverter,
MapSymbolToSymbolConverter,
NodeToMapNodeConverter,
PortToMapPortConverter,
SymbolToMapSymbolConverter,
GraphDataManager,
MapNodesDataSource,
MapLinksDataSource,
MapDrawingsDataSource,
MapSymbolsDataSource,
SelectionEventSource,
MapSettingsManager,
FontBBoxCalculator,
StylesToFontConverter,
EthernetLinkWidget,
SerialLinkWidget,
...D3_MAP_IMPORTS,
],
exports: [D3MapComponent, ExperimentalMapComponent],
})
export class CartographyModule { }
export class CartographyModule {}

View File

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

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,3 @@
svg {
display: block;
}

View File

@ -1,16 +1,14 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { D3MapComponent } from './d3-map.component';
import { MapComponent } from './map.component';
describe('MapComponent', () => {
let component: MapComponent;
let fixture: ComponentFixture<MapComponent>;
describe('D3MapComponent', () => {
let component: D3MapComponent;
let fixture: ComponentFixture<D3MapComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ MapComponent ]
})
.compileComponents();
declarations: [D3MapComponent],
}).compileComponents();
}));
// beforeEach(() => {

View File

@ -0,0 +1,245 @@
import {
Component,
ElementRef,
HostListener,
Input,
OnChanges,
OnDestroy,
OnInit,
SimpleChange,
ViewChild,
} from '@angular/core';
import { select, Selection } from 'd3-selection';
import { Subscription } from 'rxjs';
import { Link } from '../../../models/link';
import { Project } from '../../../models/project';
import { Server } from '../../../models/server';
import { Symbol } from '../../../models/symbol';
import { MapScaleService } from '../../../services/mapScale.service';
import { MapSettingsService } from '../../../services/mapsettings.service';
import { ToolsService } from '../../../services/tools.service';
import { CanvasSizeDetector } from '../../helpers/canvas-size-detector';
import { GraphDataManager } from '../../managers/graph-data-manager';
import { MapSettingsManager } from '../../managers/map-settings-manager';
import { Context } from '../../models/context';
import { Drawing } from '../../models/drawing';
import { Node } from '../../models/node';
import { Size } from '../../models/size';
import { MapChangeDetectorRef } from '../../services/map-change-detector-ref';
import { MovingTool } from '../../tools/moving-tool';
import { SelectionTool } from '../../tools/selection-tool';
import { GraphLayout } from '../../widgets/graph-layout';
import { InterfaceLabelWidget } from '../../widgets/interface-label';
import { TextEditorComponent } from '../text-editor/text-editor.component';
@Component({
selector: 'app-d3-map',
templateUrl: './d3-map.component.html',
styleUrls: ['./d3-map.component.scss'],
})
export class D3MapComponent implements OnInit, OnChanges, OnDestroy {
@Input() nodes: Node[] = [];
@Input() links: Link[] = [];
@Input() drawings: Drawing[] = [];
@Input() symbols: Symbol[] = [];
@Input() project: Project;
@Input() server: Server;
@Input() width = 1500;
@Input() height = 600;
@ViewChild('svg') svgRef: ElementRef;
@ViewChild('textEditor') textEditor: TextEditorComponent;
private parentNativeElement: any;
private svg: Selection<SVGSVGElement, any, null, undefined>;
private onChangesDetected: Subscription;
private subscriptions: Subscription[] = [];
private drawLinkTool: boolean;
protected settings = {
show_interface_labels: true,
};
public gridVisibility: number = 0;
public nodeGridX: number = 0;
public nodeGridY: number = 0;
public drawingGridX: number = 0;
public drawingGridY: number = 0;
constructor(
private graphDataManager: GraphDataManager,
public context: Context,
private mapChangeDetectorRef: MapChangeDetectorRef,
private canvasSizeDetector: CanvasSizeDetector,
private mapSettings: MapSettingsManager,
protected element: ElementRef,
protected interfaceLabelWidget: InterfaceLabelWidget,
protected selectionToolWidget: SelectionTool,
protected movingToolWidget: MovingTool,
public graphLayout: GraphLayout,
private toolsService: ToolsService,
private mapScaleService: MapScaleService,
private mapSettingsService: MapSettingsService
) {
this.parentNativeElement = element.nativeElement;
}
@Input('show-interface-labels')
set showInterfaceLabels(value) {
if (value && !this.mapSettingsService.integrateLinkLabelsToLinks) {
this.settings.show_interface_labels = true;
this.interfaceLabelWidget.setEnabled(true);
} else {
this.settings.show_interface_labels = false;
this.interfaceLabelWidget.setEnabled(false);
}
this.mapChangeDetectorRef.detectChanges();
}
@Input('readonly') set readonly(value) {
this.mapSettings.isReadOnly = value;
}
resize(val: boolean) {
if (val) {
this.svg.attr('height', window.innerHeight + window.scrollY - 16);
} else {
let heightOfProjectWindow = window.innerHeight - 16;
if (this.height > heightOfProjectWindow) {
this.svg.attr('height', this.height);
} else {
this.svg.attr('height', heightOfProjectWindow);
}
}
}
ngOnChanges(changes: { [propKey: string]: SimpleChange }) {
if (
(changes['width'] && !changes['width'].isFirstChange()) ||
(changes['height'] && !changes['height'].isFirstChange()) ||
(changes['drawings'] && !changes['drawings'].isFirstChange()) ||
(changes['nodes'] && !changes['nodes'].isFirstChange()) ||
(changes['links'] && !changes['links'].isFirstChange()) ||
(changes['symbols'] && !changes['symbols'].isFirstChange())
) {
if (this.svg.empty && !this.svg.empty()) {
if (changes['symbols']) {
this.onSymbolsChange(changes['symbols']);
}
this.changeLayout();
}
}
}
ngOnInit() {
if (this.parentNativeElement !== null) {
this.createGraph(this.parentNativeElement);
}
this.context.size = this.getSize();
this.onChangesDetected = this.mapChangeDetectorRef.changesDetected.subscribe(() => {
if (this.mapChangeDetectorRef.hasBeenDrawn) {
this.redraw();
}
});
this.subscriptions.push(this.mapScaleService.scaleChangeEmitter.subscribe((value: number) => this.redraw()));
this.subscriptions.push(
this.toolsService.isMovingToolActivated.subscribe((value: boolean) => {
this.mapChangeDetectorRef.detectChanges();
})
);
this.subscriptions.push(
this.toolsService.isSelectionToolActivated.subscribe((value: boolean) => {
this.selectionToolWidget.setEnabled(value);
this.mapChangeDetectorRef.detectChanges();
})
);
this.subscriptions.push(
this.toolsService.isDrawLinkToolActivated.subscribe((value: boolean) => {
this.drawLinkTool = value;
})
);
this.gridVisibility = localStorage.getItem('gridVisibility') === 'true' ? 1 : 0;
this.mapSettingsService.isScrollDisabled.subscribe((val) => this.resize(val));
}
ngOnDestroy() {
this.graphLayout.disconnect(this.svg);
this.onChangesDetected.unsubscribe();
this.subscriptions.forEach((subscription: Subscription) => {
subscription.unsubscribe();
});
}
public applyMapSettingsChanges() {
this.redraw();
}
public createGraph(domElement: HTMLElement) {
const rootElement = select(domElement);
this.svg = rootElement.select<SVGSVGElement>('svg');
this.graphLayout.connect(this.svg, this.context);
this.graphLayout.draw(this.svg, this.context);
this.mapChangeDetectorRef.hasBeenDrawn = true;
}
public getSize(): Size {
return this.canvasSizeDetector.getOptimalSize(this.width, this.height);
}
private changeLayout() {
if (this.parentNativeElement != null) {
this.context.size = this.getSize();
}
this.redraw();
}
private onSymbolsChange(change: SimpleChange) {
this.graphDataManager.setSymbols(this.symbols);
}
private redraw() {
this.updateGrid();
this.graphDataManager.setNodes(this.nodes);
this.graphDataManager.setLinks(this.links);
this.graphDataManager.setDrawings(this.drawings);
this.graphLayout.draw(this.svg, this.context);
this.textEditor.activateTextEditingForDrawings();
this.textEditor.activateTextEditingForNodeLabels();
this.mapSettingsService.mapRenderedEmitter.emit(true);
}
updateGrid() {
if (this.project.grid_size && this.project.grid_size > 0)
this.nodeGridX =
this.project.scene_width / 2 -
Math.floor(this.project.scene_width / 2 / this.project.grid_size) * this.project.grid_size;
if (this.project.grid_size && this.project.grid_size > 0)
this.nodeGridY =
this.project.scene_height / 2 -
Math.floor(this.project.scene_height / 2 / this.project.grid_size) * this.project.grid_size;
if (this.project.drawing_grid_size && this.project.drawing_grid_size > 0)
this.drawingGridX =
this.project.scene_width / 2 -
Math.floor(this.project.scene_width / 2 / this.project.drawing_grid_size) * this.project.drawing_grid_size;
if (this.project.drawing_grid_size && this.project.drawing_grid_size > 0)
this.drawingGridY =
this.project.scene_height / 2 -
Math.floor(this.project.scene_height / 2 / this.project.drawing_grid_size) * this.project.drawing_grid_size;
}
@HostListener('window:resize', ['$event'])
onResize(event) {
this.changeLayout();
}
}

View File

@ -0,0 +1,547 @@
import { EventEmitter } from '@angular/core';
import { async, ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing';
import { select } from 'd3-selection';
import { MapSettingsService } from '../../../services/mapsettings.service';
import { DraggableDrag, DraggableEnd, DraggableStart } from '../../events/draggable';
import { DrawingsEventSource } from '../../events/drawings-event-source';
import { LinksEventSource } from '../../events/links-event-source';
import { NodesEventSource } from '../../events/nodes-event-source';
import { GraphDataManager } from '../../managers/graph-data-manager';
import { MockedGraphDataManager } from '../../managers/graph-data-manager.spec';
import { SelectionManager } from '../../managers/selection-manager';
import { SelectionManagerMock } from '../../managers/selection-manager.spec';
import { MapDrawing } from '../../models/map/map-drawing';
import { MapLabel } from '../../models/map/map-label';
import { MapLink } from '../../models/map/map-link';
import { MapLinkNode } from '../../models/map/map-link-node';
import { MapNode } from '../../models/map/map-node';
import { DrawingsWidget } from '../../widgets/drawings';
import { InterfaceLabelWidget } from '../../widgets/interface-label';
import { LabelWidget } from '../../widgets/label';
import { LinksWidget } from '../../widgets/links';
import { NodesWidget } from '../../widgets/nodes';
import { DraggableSelectionComponent } from './draggable-selection.component';
describe('DraggableSelectionComponent', () => {
let component: DraggableSelectionComponent;
let fixture: ComponentFixture<DraggableSelectionComponent>;
let mockedGraphDataManager: MockedGraphDataManager;
let nodesStartEventEmitter: EventEmitter<DraggableStart<MapNode>>;
let nodesDragEventEmitter: EventEmitter<DraggableDrag<MapNode>>;
let nodesEndEventEmitter: EventEmitter<DraggableEnd<MapNode>>;
let drawingsStartEventEmitter: EventEmitter<DraggableStart<MapDrawing>>;
let drawingsDragEventEmitter: EventEmitter<DraggableDrag<MapDrawing>>;
let drawingsEndEventEmitter: EventEmitter<DraggableEnd<MapDrawing>>;
let labelStartEventEmitter: EventEmitter<DraggableStart<MapLabel>>;
let labelDragEventEmitter: EventEmitter<DraggableDrag<MapLabel>>;
let labelEndEventEmitter: EventEmitter<DraggableEnd<MapLabel>>;
let interfaceLabelStartEventEmitter: EventEmitter<DraggableStart<MapLinkNode>>;
let interfaceLabelDragEventEmitter: EventEmitter<DraggableDrag<MapLinkNode>>;
let interfaceLabelEndEventEmitter: EventEmitter<DraggableEnd<MapLinkNode>>;
beforeEach(async(() => {
mockedGraphDataManager = new MockedGraphDataManager();
nodesStartEventEmitter = new EventEmitter<DraggableStart<MapNode>>();
nodesDragEventEmitter = new EventEmitter<DraggableDrag<MapNode>>();
nodesEndEventEmitter = new EventEmitter<DraggableEnd<MapNode>>();
drawingsStartEventEmitter = new EventEmitter<DraggableStart<MapDrawing>>();
drawingsDragEventEmitter = new EventEmitter<DraggableDrag<MapDrawing>>();
drawingsEndEventEmitter = new EventEmitter<DraggableEnd<MapDrawing>>();
labelStartEventEmitter = new EventEmitter<DraggableStart<MapLabel>>();
labelDragEventEmitter = new EventEmitter<DraggableDrag<MapLabel>>();
labelEndEventEmitter = new EventEmitter<DraggableEnd<MapLabel>>();
interfaceLabelStartEventEmitter = new EventEmitter<DraggableStart<MapLinkNode>>();
interfaceLabelDragEventEmitter = new EventEmitter<DraggableDrag<MapLinkNode>>();
interfaceLabelEndEventEmitter = new EventEmitter<DraggableEnd<MapLinkNode>>();
const nodesWidgetStub = {
redrawNode: () => {},
draggable: {
start: nodesStartEventEmitter,
drag: nodesDragEventEmitter,
end: nodesEndEventEmitter,
},
};
const drawingsWidgetStub = {
redrawDrawing: () => {},
draggable: {
start: drawingsStartEventEmitter,
drag: drawingsDragEventEmitter,
end: drawingsEndEventEmitter,
},
};
const linksWidgetStub = {
redrawLink: () => {},
};
const labelWidgetStub = {
redrawLabel: () => {},
draggable: {
start: labelStartEventEmitter,
drag: labelDragEventEmitter,
end: labelEndEventEmitter,
},
};
const interfaceLabelWidgetStub = {
draggable: {
start: interfaceLabelStartEventEmitter,
drag: interfaceLabelDragEventEmitter,
end: interfaceLabelEndEventEmitter,
},
};
const nodesEventSourceStub = {
dragged: { emit: () => {} },
labelDragged: { emit: () => {} },
};
const drawingsEventSourceStub = {
dragged: { emit: () => {} },
};
const linksEventSourceStub = {
interfaceDragged: { emit: () => {} },
};
TestBed.configureTestingModule({
providers: [
{ provide: NodesWidget, useValue: nodesWidgetStub },
{ provide: DrawingsWidget, useValue: drawingsWidgetStub },
{ provide: LinksWidget, useValue: linksWidgetStub },
{ provide: LabelWidget, useValue: labelWidgetStub },
{ provide: InterfaceLabelWidget, useValue: interfaceLabelWidgetStub },
{ provide: SelectionManager, useValue: new SelectionManagerMock() },
{ provide: NodesEventSource, useValue: nodesEventSourceStub },
{ provide: DrawingsEventSource, useValue: drawingsEventSourceStub },
{ provide: GraphDataManager, useValue: mockedGraphDataManager },
{ provide: LinksEventSource, useValue: linksEventSourceStub },
{ provide: MapSettingsService, useClass: MapSettingsService },
],
declarations: [DraggableSelectionComponent],
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(DraggableSelectionComponent);
component = fixture.componentInstance;
component.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
describe('nodes dragging', () => {
let nodesWidgetStub: NodesWidget;
let linksWidgetStub: LinksWidget;
let selectionManagerStub: SelectionManager;
let node: MapNode;
beforeEach(() => {
nodesWidgetStub = fixture.debugElement.injector.get(NodesWidget);
linksWidgetStub = fixture.debugElement.injector.get(LinksWidget);
selectionManagerStub = fixture.debugElement.injector.get(SelectionManager);
node = new MapNode();
node.id = 'nodeid';
node.x = 1;
node.y = 2;
});
it('should select node when started dragging', fakeAsync(() => {
nodesWidgetStub.draggable.start.emit(new DraggableStart<MapNode>(node));
tick();
expect(selectionManagerStub.getSelected().length).toEqual(1);
}));
it('should ignore node when started dragging and node is in selection', fakeAsync(() => {
selectionManagerStub.setSelected([node]);
nodesWidgetStub.draggable.start.emit(new DraggableStart<MapNode>(node));
tick();
expect(selectionManagerStub.getSelected().length).toEqual(1);
}));
it('should update node position when dragging', fakeAsync(() => {
spyOn(nodesWidgetStub, 'redrawNode');
selectionManagerStub.setSelected([node]);
const dragEvent = new DraggableDrag<MapNode>(node);
dragEvent.dx = 10;
dragEvent.dy = 20;
nodesWidgetStub.draggable.drag.emit(dragEvent);
tick();
expect(nodesWidgetStub.redrawNode).toHaveBeenCalledWith(select(fixture.componentInstance.svg), node);
expect(node.x).toEqual(11);
expect(node.y).toEqual(22);
}));
it('should redraw related links target when dragging node', fakeAsync(() => {
spyOn(nodesWidgetStub, 'redrawNode');
spyOn(linksWidgetStub, 'redrawLink');
const link = new MapLink();
link.target = node;
mockedGraphDataManager.setLinks([link]);
selectionManagerStub.setSelected([node]);
nodesWidgetStub.draggable.drag.emit(new DraggableDrag<MapNode>(node));
tick();
expect(linksWidgetStub.redrawLink).toHaveBeenCalledWith(select(fixture.componentInstance.svg), link);
}));
it('should redraw related links source when dragging node', fakeAsync(() => {
spyOn(nodesWidgetStub, 'redrawNode');
spyOn(linksWidgetStub, 'redrawLink');
const link = new MapLink();
link.source = node;
mockedGraphDataManager.setLinks([link]);
selectionManagerStub.setSelected([node]);
nodesWidgetStub.draggable.drag.emit(new DraggableDrag<MapNode>(node));
tick();
expect(linksWidgetStub.redrawLink).toHaveBeenCalledWith(select(fixture.componentInstance.svg), link);
}));
it('should emit event when node stopped dragging', fakeAsync(() => {
const nodesEventSourceStub = fixture.debugElement.injector.get(NodesEventSource);
const spyDragged = spyOn(nodesEventSourceStub.dragged, 'emit');
selectionManagerStub.setSelected([node]);
const dragEvent = new DraggableEnd<MapNode>(node);
dragEvent.dx = 10;
dragEvent.dy = 20;
nodesWidgetStub.draggable.end.emit(dragEvent);
tick();
expect(nodesEventSourceStub.dragged.emit).toHaveBeenCalled();
expect(spyDragged.calls.mostRecent().args[0].datum).toEqual(node);
expect(spyDragged.calls.mostRecent().args[0].dx).toEqual(10);
expect(spyDragged.calls.mostRecent().args[0].dy).toEqual(20);
}));
});
describe('drawings dragging', () => {
let drawingsWidgetStub: DrawingsWidget;
let selectionManagerStub: SelectionManager;
let drawing: MapDrawing;
beforeEach(() => {
drawingsWidgetStub = fixture.debugElement.injector.get(DrawingsWidget);
selectionManagerStub = fixture.debugElement.injector.get(SelectionManager);
drawing = new MapDrawing();
drawing.id = 'drawingid';
drawing.x = 1;
drawing.y = 2;
});
it('should select drawing when started dragging', fakeAsync(() => {
drawingsWidgetStub.draggable.start.emit(new DraggableStart<MapDrawing>(drawing));
tick();
expect(selectionManagerStub.getSelected().length).toEqual(1);
}));
it('should ignore drawing when started dragging and node is in selection', fakeAsync(() => {
selectionManagerStub.setSelected([drawing]);
drawingsWidgetStub.draggable.start.emit(new DraggableStart<MapDrawing>(drawing));
tick();
expect(selectionManagerStub.getSelected().length).toEqual(1);
}));
it('should update drawing position when dragging', fakeAsync(() => {
spyOn(drawingsWidgetStub, 'redrawDrawing');
selectionManagerStub.setSelected([drawing]);
const dragEvent = new DraggableDrag<MapDrawing>(drawing);
dragEvent.dx = 10;
dragEvent.dy = 20;
drawingsWidgetStub.draggable.drag.emit(dragEvent);
tick();
expect(drawingsWidgetStub.redrawDrawing).toHaveBeenCalledWith(select(fixture.componentInstance.svg), drawing);
expect(drawing.x).toEqual(11);
expect(drawing.y).toEqual(22);
}));
it('should emit event when drawing stopped dragging', fakeAsync(() => {
const drawingsEventSourceStub = fixture.debugElement.injector.get(DrawingsEventSource);
const spyDragged = spyOn(drawingsEventSourceStub.dragged, 'emit');
selectionManagerStub.setSelected([drawing]);
const dragEvent = new DraggableEnd<MapDrawing>(drawing);
dragEvent.dx = 10;
dragEvent.dy = 20;
drawingsWidgetStub.draggable.end.emit(dragEvent);
tick();
expect(drawingsEventSourceStub.dragged.emit).toHaveBeenCalled();
expect(spyDragged.calls.mostRecent().args[0].datum).toEqual(drawing);
expect(spyDragged.calls.mostRecent().args[0].dx).toEqual(10);
expect(spyDragged.calls.mostRecent().args[0].dy).toEqual(20);
}));
});
describe('labels dragging', () => {
let labelWidgetStub: LabelWidget;
let selectionManagerStub: SelectionManager;
let label: MapLabel;
beforeEach(() => {
labelWidgetStub = fixture.debugElement.injector.get(LabelWidget);
selectionManagerStub = fixture.debugElement.injector.get(SelectionManager);
label = new MapLabel();
label.id = 'labelid';
label.x = 1;
label.y = 2;
});
it('should select label when started dragging', fakeAsync(() => {
labelWidgetStub.draggable.start.emit(new DraggableStart<MapLabel>(label));
tick();
expect(selectionManagerStub.getSelected().length).toEqual(1);
}));
it('should ignore label when started dragging and node is in selection', fakeAsync(() => {
selectionManagerStub.setSelected([label]);
labelWidgetStub.draggable.start.emit(new DraggableStart<MapLabel>(label));
tick();
expect(selectionManagerStub.getSelected().length).toEqual(1);
}));
it('should update label position when dragging', fakeAsync(() => {
spyOn(labelWidgetStub, 'redrawLabel');
selectionManagerStub.setSelected([label]);
const node = new MapNode();
node.id = 'nodeid';
node.label = label;
label.nodeId = node.id;
mockedGraphDataManager.setNodes([node]);
const dragEvent = new DraggableDrag<MapLabel>(label);
dragEvent.dx = 10;
dragEvent.dy = 20;
labelWidgetStub.draggable.drag.emit(dragEvent);
tick();
expect(labelWidgetStub.redrawLabel).toHaveBeenCalledWith(select(fixture.componentInstance.svg), label);
expect(label.x).toEqual(11);
expect(label.y).toEqual(22);
}));
it('should not update label position when dragging and parent is selected', fakeAsync(() => {
spyOn(labelWidgetStub, 'redrawLabel');
const node = new MapNode();
node.id = 'nodeid';
node.label = label;
label.nodeId = node.id;
selectionManagerStub.setSelected([label, node]);
mockedGraphDataManager.setNodes([node]);
const dragEvent = new DraggableDrag<MapLabel>(label);
dragEvent.dx = 10;
dragEvent.dy = 20;
labelWidgetStub.draggable.drag.emit(dragEvent);
tick();
expect(labelWidgetStub.redrawLabel).not.toHaveBeenCalled();
expect(label.x).toEqual(1);
expect(label.y).toEqual(2);
}));
it('should emit event when label stopped dragging', fakeAsync(() => {
const nodesEventSourceStub = fixture.debugElement.injector.get(NodesEventSource);
const spyDragged = spyOn(nodesEventSourceStub.labelDragged, 'emit');
selectionManagerStub.setSelected([label]);
const dragEvent = new DraggableEnd<MapLabel>(label);
dragEvent.dx = 10;
dragEvent.dy = 20;
labelWidgetStub.draggable.end.emit(dragEvent);
tick();
expect(nodesEventSourceStub.labelDragged.emit).toHaveBeenCalled();
expect(spyDragged.calls.mostRecent().args[0].datum).toEqual(label);
expect(spyDragged.calls.mostRecent().args[0].dx).toEqual(10);
expect(spyDragged.calls.mostRecent().args[0].dy).toEqual(20);
}));
it('should not emit event when label stopped dragging and parent node is selected', fakeAsync(() => {
const nodesEventSourceStub = fixture.debugElement.injector.get(NodesEventSource);
spyOn(nodesEventSourceStub.labelDragged, 'emit');
const node = new MapNode();
node.id = 'nodeid';
label.nodeId = node.id;
selectionManagerStub.setSelected([label, node]);
const dragEvent = new DraggableEnd<MapLabel>(label);
dragEvent.dx = 10;
dragEvent.dy = 20;
labelWidgetStub.draggable.end.emit(dragEvent);
tick();
expect(nodesEventSourceStub.labelDragged.emit).not.toHaveBeenCalled();
}));
});
describe('interfaces labels dragging', () => {
let linksWidgetStub: LinksWidget;
let interfaceLabelWidgetStub: InterfaceLabelWidget;
let selectionManagerStub: SelectionManager;
let linkNode: MapLinkNode;
beforeEach(() => {
interfaceLabelWidgetStub = fixture.debugElement.injector.get(InterfaceLabelWidget);
linksWidgetStub = fixture.debugElement.injector.get(LinksWidget);
selectionManagerStub = fixture.debugElement.injector.get(SelectionManager);
linkNode = new MapLinkNode();
linkNode.label = new MapLabel();
linkNode.label.x = 1;
linkNode.label.y = 2;
linkNode.id = 'linknodeid';
});
it('should select interface label when started dragging', fakeAsync(() => {
interfaceLabelWidgetStub.draggable.start.emit(new DraggableStart<MapLinkNode>(linkNode));
tick();
expect(selectionManagerStub.getSelected().length).toEqual(1);
}));
it('should ignore interface label when started dragging and node is in selection', fakeAsync(() => {
selectionManagerStub.setSelected([linkNode]);
interfaceLabelWidgetStub.draggable.start.emit(new DraggableStart<MapLinkNode>(linkNode));
tick();
expect(selectionManagerStub.getSelected().length).toEqual(1);
}));
it('should update interface label position when dragging first node', fakeAsync(() => {
spyOn(linksWidgetStub, 'redrawLink');
selectionManagerStub.setSelected([linkNode]);
const node = new MapNode();
node.id = 'nodeid';
linkNode.nodeId = node.id;
const secondLinkNode = new MapLinkNode();
secondLinkNode.label = new MapLabel();
secondLinkNode.label.x = 1;
secondLinkNode.label.y = 2;
secondLinkNode.id = 'secondlinknodeid';
const link = new MapLink();
link.nodes = [linkNode, secondLinkNode];
mockedGraphDataManager.setLinks([link]);
const dragEvent = new DraggableDrag<MapLinkNode>(linkNode);
dragEvent.dx = 10;
dragEvent.dy = 20;
interfaceLabelWidgetStub.draggable.drag.emit(dragEvent);
tick();
expect(linksWidgetStub.redrawLink).toHaveBeenCalledWith(select(fixture.componentInstance.svg), link);
expect(linkNode.label.x).toEqual(11);
expect(linkNode.label.y).toEqual(22);
}));
it('should update interface label position when dragging second node', fakeAsync(() => {
spyOn(linksWidgetStub, 'redrawLink');
selectionManagerStub.setSelected([linkNode]);
const node = new MapNode();
node.id = 'nodeid';
linkNode.nodeId = node.id;
const secondLinkNode = new MapLinkNode();
secondLinkNode.label = new MapLabel();
secondLinkNode.label.x = 1;
secondLinkNode.label.y = 2;
secondLinkNode.id = 'secondlinknodeid';
const link = new MapLink();
link.nodes = [secondLinkNode, linkNode];
mockedGraphDataManager.setLinks([link]);
const dragEvent = new DraggableDrag<MapLinkNode>(linkNode);
dragEvent.dx = 10;
dragEvent.dy = 20;
interfaceLabelWidgetStub.draggable.drag.emit(dragEvent);
tick();
expect(linksWidgetStub.redrawLink).toHaveBeenCalledWith(select(fixture.componentInstance.svg), link);
expect(linkNode.label.x).toEqual(11);
expect(linkNode.label.y).toEqual(22);
}));
it('should not update interface label position when dragging and parent node is selected', fakeAsync(() => {
spyOn(linksWidgetStub, 'redrawLink');
const node = new MapNode();
node.id = 'nodeid';
linkNode.nodeId = node.id;
selectionManagerStub.setSelected([linkNode, node]);
const secondLinkNode = new MapLinkNode();
secondLinkNode.label = new MapLabel();
secondLinkNode.label.x = 1;
secondLinkNode.label.y = 2;
secondLinkNode.id = 'secondlinknodeid';
const link = new MapLink();
link.nodes = [linkNode, secondLinkNode];
mockedGraphDataManager.setLinks([link]);
const dragEvent = new DraggableDrag<MapLinkNode>(linkNode);
dragEvent.dx = 10;
dragEvent.dy = 20;
interfaceLabelWidgetStub.draggable.drag.emit(dragEvent);
tick();
expect(linksWidgetStub.redrawLink).not.toHaveBeenCalled();
expect(linkNode.label.x).toEqual(1);
expect(linkNode.label.y).toEqual(2);
}));
it('should emit event when interface label stopped dragging', fakeAsync(() => {
const linksEventSourceStub = fixture.debugElement.injector.get(LinksEventSource);
const spyDragged = spyOn(linksEventSourceStub.interfaceDragged, 'emit');
selectionManagerStub.setSelected([linkNode]);
const dragEvent = new DraggableEnd<MapLinkNode>(linkNode);
dragEvent.dx = 10;
dragEvent.dy = 20;
interfaceLabelWidgetStub.draggable.end.emit(dragEvent);
tick();
expect(linksEventSourceStub.interfaceDragged.emit).toHaveBeenCalled();
expect(spyDragged.calls.mostRecent().args[0].datum).toEqual(linkNode);
expect(spyDragged.calls.mostRecent().args[0].dx).toEqual(10);
expect(spyDragged.calls.mostRecent().args[0].dy).toEqual(20);
}));
it('should not emit event when interface label stopped dragging and parent node is selected', fakeAsync(() => {
const linksEventSourceStub = fixture.debugElement.injector.get(LinksEventSource);
spyOn(linksEventSourceStub.interfaceDragged, 'emit');
const node = new MapNode();
node.id = 'nodeid';
linkNode.nodeId = node.id;
selectionManagerStub.setSelected([linkNode, node]);
const dragEvent = new DraggableEnd<MapLinkNode>(linkNode);
dragEvent.dx = 10;
dragEvent.dy = 20;
interfaceLabelWidgetStub.draggable.end.emit(dragEvent);
tick();
expect(linksEventSourceStub.interfaceDragged.emit).not.toHaveBeenCalled();
}));
});
});

View File

@ -0,0 +1,230 @@
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 { DraggableDrag, DraggableEnd, DraggableStart } from '../../events/draggable';
import { DrawingsEventSource } from '../../events/drawings-event-source';
import { DraggedDataEvent } from '../../events/event-source';
import { LinksEventSource } from '../../events/links-event-source';
import { NodesEventSource } from '../../events/nodes-event-source';
import { GraphDataManager } from '../../managers/graph-data-manager';
import { SelectionManager } from '../../managers/selection-manager';
import { MapDrawing } from '../../models/map/map-drawing';
import { MapLabel } from '../../models/map/map-label';
import { MapLinkNode } from '../../models/map/map-link-node';
import { MapNode } from '../../models/map/map-node';
import { DrawingsWidget } from '../../widgets/drawings';
import { InterfaceLabelWidget } from '../../widgets/interface-label';
import { LabelWidget } from '../../widgets/label';
import { LinksWidget } from '../../widgets/links';
import { NodesWidget } from '../../widgets/nodes';
@Component({
selector: 'app-draggable-selection',
templateUrl: './draggable-selection.component.html',
styleUrls: ['./draggable-selection.component.scss'],
})
export class DraggableSelectionComponent implements OnInit, OnDestroy {
private start: Subscription;
private drag: Subscription;
private end: Subscription;
private mapSettingsSubscription: Subscription;
private isMapLocked: boolean = false;
@Input('svg') svg: SVGSVGElement;
constructor(
private nodesWidget: NodesWidget,
private drawingsWidget: DrawingsWidget,
private linksWidget: LinksWidget,
private labelWidget: LabelWidget,
private interfaceWidget: InterfaceLabelWidget,
private selectionManager: SelectionManager,
private nodesEventSource: NodesEventSource,
private drawingsEventSource: DrawingsEventSource,
private graphDataManager: GraphDataManager,
private linksEventSource: LinksEventSource,
private mapSettingsService: MapSettingsService
) {}
ngOnInit() {
const svg = select(this.svg);
this.mapSettingsSubscription = this.mapSettingsService.isMapLocked.subscribe((value) => {
this.isMapLocked = value;
});
this.start = merge(
this.nodesWidget.draggable.start,
this.drawingsWidget.draggable.start,
this.labelWidget.draggable.start,
this.interfaceWidget.draggable.start
).subscribe((evt: DraggableStart<any>) => {
const selected = this.selectionManager.getSelected();
if (evt.datum instanceof MapNode) {
if (selected.filter((item) => item instanceof MapNode && item.id === evt.datum.id).length === 0) {
this.selectionManager.setSelected([evt.datum]);
}
}
if (evt.datum instanceof MapDrawing) {
if (selected.filter((item) => item instanceof MapDrawing && item.id === evt.datum.id).length === 0) {
this.selectionManager.setSelected([evt.datum]);
}
}
if (evt.datum instanceof MapLabel) {
if (selected.filter((item) => item instanceof MapLabel && item.id === evt.datum.id).length === 0) {
this.selectionManager.setSelected([evt.datum]);
}
}
if (evt.datum instanceof MapLinkNode) {
if (selected.filter((item) => item instanceof MapLinkNode && item.id === evt.datum.id).length === 0) {
this.selectionManager.setSelected([evt.datum]);
}
}
});
this.drag = merge(
this.nodesWidget.draggable.drag,
this.drawingsWidget.draggable.drag,
this.labelWidget.draggable.drag,
this.interfaceWidget.draggable.drag
).subscribe((evt: DraggableDrag<any>) => {
if (!this.isMapLocked) {
const selected = this.selectionManager.getSelected();
// update nodes
let mapNodes = selected.filter((item) => item instanceof MapNode);
const lockedNodes = mapNodes.filter((item: MapNode) => item.locked);
const selectedNodes = mapNodes.filter((item: MapNode) => !item.locked);
selectedNodes.forEach((node: MapNode) => {
node.x += evt.dx;
node.y += evt.dy;
this.nodesWidget.redrawNode(svg, node);
const links = this.graphDataManager
.getLinks()
.filter(
(link) =>
(link.target !== undefined && link.target.id === node.id) ||
(link.source !== undefined && link.source.id === node.id)
);
links.forEach((link) => {
this.linksWidget.redrawLink(svg, link);
});
});
// update drawings
let mapDrawings = selected.filter((item) => item instanceof MapDrawing);
const selectedDrawings = mapDrawings.filter((item: MapDrawing) => !item.locked);
selectedDrawings.forEach((drawing: MapDrawing) => {
drawing.x += evt.dx;
drawing.y += evt.dy;
this.drawingsWidget.redrawDrawing(svg, drawing);
});
// update labels
let mapLabels = selected.filter((item) => item instanceof MapLabel);
const selectedLabels = mapLabels.filter(
(item: MapLabel) => lockedNodes.filter((node) => node.id === item.nodeId).length === 0
);
selectedLabels.forEach((label: MapLabel) => {
const isParentNodeSelected = selectedNodes.filter((node) => node.id === label.nodeId).length > 0;
if (isParentNodeSelected) {
return;
}
const node = this.graphDataManager.getNodes().filter((node) => node.id === label.nodeId)[0];
node.label.x += evt.dx;
node.label.y += evt.dy;
this.labelWidget.redrawLabel(svg, label);
});
// update interface labels
let mapLinkNodes = selected.filter((item) => item instanceof MapLinkNode);
const selectedLinkNodes = mapLinkNodes.filter(
(item: MapLinkNode) => lockedNodes.filter((node) => node.id === item.nodeId).length === 0
);
selectedLinkNodes.forEach((interfaceLabel: MapLinkNode) => {
const isParentNodeSelected = selectedNodes.filter((node) => node.id === interfaceLabel.nodeId).length > 0;
if (isParentNodeSelected) {
return;
}
const link = this.graphDataManager
.getLinks()
.filter((link) => link.nodes[0].id === interfaceLabel.id || link.nodes[1].id === interfaceLabel.id)[0];
if (link.nodes[0].id === interfaceLabel.id) {
link.nodes[0].label.x += evt.dx;
link.nodes[0].label.y += evt.dy;
}
if (link.nodes[1].id === interfaceLabel.id) {
link.nodes[1].label.x += evt.dx;
link.nodes[1].label.y += evt.dy;
}
this.linksWidget.redrawLink(svg, link);
});
}
});
this.end = merge(
this.nodesWidget.draggable.end,
this.drawingsWidget.draggable.end,
this.labelWidget.draggable.end,
this.interfaceWidget.draggable.end
).subscribe((evt: DraggableEnd<any>) => {
if (!this.isMapLocked) {
const selected = this.selectionManager.getSelected();
let mapNodes = selected.filter((item) => item instanceof MapNode);
const lockedNodes = mapNodes.filter((item: MapNode) => item.locked);
const selectedNodes = mapNodes.filter((item: MapNode) => !item.locked);
selectedNodes.forEach((item: MapNode) => {
this.nodesEventSource.dragged.emit(new DraggedDataEvent<MapNode>(item, evt.dx, evt.dy));
});
let mapDrawings = selected.filter((item) => item instanceof MapDrawing);
const selectedDrawings = mapDrawings.filter((item: MapDrawing) => !item.locked);
selectedDrawings.forEach((item: MapDrawing) => {
this.drawingsEventSource.dragged.emit(new DraggedDataEvent<MapDrawing>(item, evt.dx, evt.dy));
});
let mapLabels = selected.filter((item) => item instanceof MapLabel);
const selectedLabels = mapLabels.filter(
(item: MapLabel) => lockedNodes.filter((node) => node.id === item.nodeId).length === 0
);
selectedLabels.forEach((label: MapLabel) => {
const isParentNodeSelected = selectedNodes.filter((node) => node.id === label.nodeId).length > 0;
if (isParentNodeSelected) {
return;
}
this.nodesEventSource.labelDragged.emit(new DraggedDataEvent<MapLabel>(label, evt.dx, evt.dy));
});
let mapLinkNodes = selected.filter((item) => item instanceof MapLinkNode);
const selectedLinkNodes = mapLinkNodes.filter(
(item: MapLinkNode) => lockedNodes.filter((node) => node.id === item.nodeId).length === 0
);
selectedLinkNodes.forEach((label: MapLinkNode) => {
const isParentNodeSelected = selectedNodes.filter((node) => node.id === label.nodeId).length > 0;
if (isParentNodeSelected) {
return;
}
this.linksEventSource.interfaceDragged.emit(new DraggedDataEvent<MapLinkNode>(label, evt.dx, evt.dy));
});
}
});
}
ngOnDestroy() {
this.start.unsubscribe();
this.drag.unsubscribe();
this.end.unsubscribe();
this.mapSettingsSubscription.unsubscribe();
}
}

View File

@ -0,0 +1,48 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { DrawingsEventSource } from '../../events/drawings-event-source';
import { Context } from '../../models/context';
import { DrawingAddingComponent } from './drawing-adding.component';
describe('DrawingAddingComponent', () => {
let component: DrawingAddingComponent;
let fixture: ComponentFixture<DrawingAddingComponent>;
let drawingsEventSource = new DrawingsEventSource();
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [NoopAnimationsModule],
providers: [
{ provide: DrawingsEventSource, useValue: drawingsEventSource },
{ provide: Context, useClass: Context },
],
declarations: [DrawingAddingComponent],
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(DrawingAddingComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
it('should deactivate listener when none of the available drawings is selected', () => {
spyOn(component, 'deactivate');
drawingsEventSource.selected.emit('');
expect(component.deactivate).toHaveBeenCalled();
});
it('should activate listener when drawing is selected', () => {
spyOn(component, 'activate');
drawingsEventSource.selected.emit('rectangle');
expect(component.activate).toHaveBeenCalled();
});
});

View File

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

View File

@ -0,0 +1,67 @@
import { EventEmitter } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { DrawingsEventSource } from '../../events/drawings-event-source';
import { ResizingEnd } from '../../events/resizing';
import { MapDrawing } from '../../models/map/map-drawing';
import { DrawingsWidget } from '../../widgets/drawings';
import { DrawingResizingComponent } from './drawing-resizing.component';
export class DrawingWidgetMock {
resizingFinished = new EventEmitter<ResizingEnd<MapDrawing>>();
evt: any;
constructor() {}
emitEvent() {
const evt = new ResizingEnd<MapDrawing>();
evt.x = 0;
evt.y = 0;
evt.width = 10;
evt.height = 10;
evt.datum = {} as MapDrawing;
this.resizingFinished.emit(evt);
}
}
describe('DrawingResizingComponent', () => {
let component: DrawingResizingComponent;
let fixture: ComponentFixture<DrawingResizingComponent>;
let drawingsWidgetMock = new DrawingWidgetMock();
let drawingsEventSource = new DrawingsEventSource();
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [NoopAnimationsModule],
providers: [
{ provide: DrawingsWidget, useValue: drawingsWidgetMock },
{ provide: DrawingsEventSource, useValue: drawingsEventSource },
],
declarations: [DrawingResizingComponent],
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(DrawingResizingComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
it('should emit event after size changes', () => {
spyOn(drawingsEventSource.resized, 'emit');
const evt = new ResizingEnd<MapDrawing>();
evt.x = 0;
evt.y = 0;
evt.width = 10;
evt.height = 10;
evt.datum = {} as MapDrawing;
drawingsWidgetMock.emitEvent();
expect(drawingsEventSource.resized.emit).toHaveBeenCalled();
});
});

View File

@ -0,0 +1,30 @@
import { Component, OnDestroy, OnInit } from '@angular/core';
import { Subscription } from 'rxjs';
import { DrawingsEventSource } from '../../events/drawings-event-source';
import { ResizedDataEvent } from '../../events/event-source';
import { ResizingEnd } from '../../events/resizing';
import { MapDrawing } from '../../models/map/map-drawing';
import { DrawingsWidget } from '../../widgets/drawings';
@Component({
selector: 'app-drawing-resizing',
template: ` <ng-content></ng-content> `,
styleUrls: ['./drawing-resizing.component.scss'],
})
export class DrawingResizingComponent implements OnInit, OnDestroy {
resizingFinished: Subscription;
constructor(private drawingsWidget: DrawingsWidget, private drawingsEventSource: DrawingsEventSource) {}
ngOnInit() {
this.resizingFinished = this.drawingsWidget.resizingFinished.subscribe((evt: ResizingEnd<MapDrawing>) => {
this.drawingsEventSource.resized.emit(
new ResizedDataEvent<MapDrawing>(evt.datum, evt.x, evt.y, evt.width, evt.height)
);
});
}
ngOnDestroy() {
this.resizingFinished.unsubscribe();
}
}

View File

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

View File

@ -0,0 +1,87 @@
import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';
import { Observable, Subscription } from 'rxjs';
import { Point } from '../../../models/point';
export class DraggableDraggedEvent {
constructor(public x: number, public y: number, public dx: number, public dy: number) {}
}
@Component({
selector: '[app-draggable]',
template: ` <ng-content></ng-content> `,
styleUrls: ['./draggable.component.scss'],
})
export class DraggableComponent implements OnInit, AfterViewInit, OnDestroy {
@Input('app-draggable') item: Point;
@Output() dragging = new EventEmitter<DraggableDraggedEvent>();
@Output() dragged = new EventEmitter<DraggableDraggedEvent>();
draggable: Subscription;
private startX: number;
private startY: number;
private posX: number;
private posY: number;
constructor(private elementRef: ElementRef) {}
ngOnInit() {}
ngAfterViewInit() {
const down = Observable.fromEvent(this.elementRef.nativeElement, 'mousedown').do((e: MouseEvent) =>
e.preventDefault()
);
down.subscribe((e: MouseEvent) => {
this.posX = this.item.x;
this.posY = this.item.y;
this.startX = e.clientX;
this.startY = e.clientY;
});
const up = Observable.fromEvent(document, 'mouseup').do((e: MouseEvent) => {
e.preventDefault();
});
const mouseMove = Observable.fromEvent(document, 'mousemove').do((e: MouseEvent) => e.stopPropagation());
const scrollWindow = Observable.fromEvent(document, 'scroll').startWith({});
const move = Observable.combineLatest(mouseMove, scrollWindow);
const drag = down.mergeMap((md: MouseEvent) => {
return move
.map(([mm, s]) => mm)
.do((mm: MouseEvent) => {
const x = this.startX - mm.clientX;
const y = this.startY - mm.clientY;
this.item.x = Math.round(this.posX - x);
this.item.y = Math.round(this.posY - y);
this.dragging.emit(new DraggableDraggedEvent(this.item.x, this.item.y, -x, -y));
})
.skipUntil(
up.take(1).do((e: MouseEvent) => {
const x = this.startX - e.clientX;
const y = this.startY - e.clientY;
this.item.x = Math.round(this.posX - x);
this.item.y = Math.round(this.posY - y);
this.dragged.emit(new DraggableDraggedEvent(this.item.x, this.item.y, -x, -y));
})
)
.take(1);
});
this.draggable = drag.subscribe((e: MouseEvent) => {
// this.cd.detectChanges();
});
}
ngOnDestroy() {
this.draggable.unsubscribe();
}
}

View File

@ -0,0 +1,17 @@
<svg:g
class="drawing"
[attr.transform]="transformation"
[app-draggable]="drawing"
(dragging)="OnDragging($event)"
(dragged)="OnDragged($event)"
>
<svg:g *ngIf="is(drawing.element, 'ellipse')" [app-ellipse]="drawing.element" />
<svg:g *ngIf="is(drawing.element, 'image')" [app-image]="drawing.element" />
<svg:g *ngIf="is(drawing.element, 'line')" [app-line]="drawing.element" />
<svg:g *ngIf="is(drawing.element, 'rect')" [app-rect]="drawing.element" />
<svg:g *ngIf="is(drawing.element, 'text')" [app-text]="drawing.element" />
</svg:g>

After

Width:  |  Height:  |  Size: 563 B

View File

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

View File

@ -0,0 +1,69 @@
import { ChangeDetectorRef, Component, Input, OnInit } from '@angular/core';
import { DrawingsEventSource } from '../../../events/drawings-event-source';
import { DraggedDataEvent } from '../../../events/event-source';
import { SvgToDrawingConverter } from '../../../helpers/svg-to-drawing-converter';
import { EllipseElement } from '../../../models/drawings/ellipse-element';
import { ImageElement } from '../../../models/drawings/image-element';
import { LineElement } from '../../../models/drawings/line-element';
import { RectElement } from '../../../models/drawings/rect-element';
import { TextElement } from '../../../models/drawings/text-element';
import { MapDrawing } from '../../../models/map/map-drawing';
@Component({
selector: '[app-drawing]',
templateUrl: './drawing.component.html',
styleUrls: ['./drawing.component.scss'],
})
export class DrawingComponent implements OnInit {
@Input('app-drawing') drawing: MapDrawing;
constructor(
private svgToDrawingConverter: SvgToDrawingConverter,
private drawingsEventSource: DrawingsEventSource,
private cd: ChangeDetectorRef
) {}
ngOnInit() {
try {
this.drawing.element = this.svgToDrawingConverter.convert(this.drawing.svg);
} catch (error) {}
}
OnDragging(evt) {
this.drawing.x = evt.x;
this.drawing.y = evt.y;
this.cd.detectChanges();
}
OnDragged(evt) {
this.cd.detectChanges();
this.drawingsEventSource.dragged.emit(new DraggedDataEvent<MapDrawing>(this.drawing, evt.dx, evt.dy));
}
is(element, type: string) {
if (!element) {
return false;
}
if (type === 'ellipse') {
return element instanceof EllipseElement;
}
if (type === 'image') {
return element instanceof ImageElement;
}
if (type === 'line') {
return element instanceof LineElement;
}
if (type === 'rect') {
return element instanceof RectElement;
}
if (type === 'text') {
return element instanceof TextElement;
}
return false;
}
get transformation() {
return `translate(${this.drawing.x},${this.drawing.y}) rotate(${this.drawing.rotation})`;
}
}

View File

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

After

Width:  |  Height:  |  Size: 332 B

View File

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

View File

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

View File

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

After

Width:  |  Height:  |  Size: 140 B

View File

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

View File

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

View File

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

After

Width:  |  Height:  |  Size: 245 B

View File

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

View File

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

View File

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

After

Width:  |  Height:  |  Size: 278 B

View File

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

View File

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

View File

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

After

Width:  |  Height:  |  Size: 338 B

View File

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

View File

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

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