├── .appveyor.yml ├── .circleci └── config.yml ├── .editorconfig ├── .github └── workflows │ ├── add-new-issues-to-project.yml │ ├── codeql.yml │ └── main.yml ├── .gitignore ├── .prettierrc ├── .sentryclirc ├── .snyk ├── .travis.yml ├── .vscode └── launch.json ├── .whitesource ├── .yarnclean ├── Dockerfile ├── LICENSE ├── README.md ├── SECURITY.md ├── angular.json ├── console-executor.js ├── debug.log ├── e2e ├── app.e2e-spec.ts ├── app.po.ts ├── helpers │ ├── common.po.ts │ ├── project-map.po.ts │ ├── project.po.ts │ └── server.po.ts ├── project-map.e2e-spec.ts ├── projects.e2e-spec.ts ├── servers.e2e-spec.ts └── tsconfig.e2e.json ├── electron-builder.yml ├── installed-software.js ├── karma.conf.js ├── local-server.js ├── main.js ├── package.json ├── protractor.conf.js ├── renderer.js ├── scripts ├── build.py ├── docker_dev_webui.sh └── requirements.txt ├── sentry.js ├── set-variables-in-env.js ├── src ├── ReleaseNotes.txt ├── app │ ├── app-routing.module.ts │ ├── app.component.html │ ├── app.component.scss │ ├── app.component.spec.ts │ ├── app.component.ts │ ├── app.module.ts │ ├── cartography │ │ ├── angular-map.imports.ts │ │ ├── cartography.module.ts │ │ ├── components │ │ │ ├── d3-map │ │ │ │ ├── d3-map.component.html │ │ │ │ ├── d3-map.component.scss │ │ │ │ ├── d3-map.component.spec.ts │ │ │ │ └── d3-map.component.ts │ │ │ ├── draggable-selection │ │ │ │ ├── draggable-selection.component.html │ │ │ │ ├── draggable-selection.component.scss │ │ │ │ ├── draggable-selection.component.spec.ts │ │ │ │ └── draggable-selection.component.ts │ │ │ ├── drawing-adding │ │ │ │ ├── drawing-adding.component.html │ │ │ │ ├── drawing-adding.component.scss │ │ │ │ ├── drawing-adding.component.spec.ts │ │ │ │ └── drawing-adding.component.ts │ │ │ ├── drawing-resizing │ │ │ │ ├── drawing-resizing.component.html │ │ │ │ ├── drawing-resizing.component.scss │ │ │ │ ├── drawing-resizing.component.spec.ts │ │ │ │ └── drawing-resizing.component.ts │ │ │ ├── experimental-map │ │ │ │ ├── draggable │ │ │ │ │ ├── draggable.component.scss │ │ │ │ │ ├── draggable.component.spec.ts │ │ │ │ │ └── draggable.component.ts │ │ │ │ ├── drawing │ │ │ │ │ ├── drawing.component.html │ │ │ │ │ ├── drawing.component.scss │ │ │ │ │ ├── drawing.component.spec.ts │ │ │ │ │ ├── drawing.component.ts │ │ │ │ │ └── drawings │ │ │ │ │ │ ├── ellipse │ │ │ │ │ │ ├── ellipse.component.html │ │ │ │ │ │ ├── ellipse.component.scss │ │ │ │ │ │ ├── ellipse.component.spec.ts │ │ │ │ │ │ └── ellipse.component.ts │ │ │ │ │ │ ├── image │ │ │ │ │ │ ├── image.component.html │ │ │ │ │ │ ├── image.component.scss │ │ │ │ │ │ ├── image.component.spec.ts │ │ │ │ │ │ └── image.component.ts │ │ │ │ │ │ ├── line │ │ │ │ │ │ ├── line.component.html │ │ │ │ │ │ ├── line.component.scss │ │ │ │ │ │ ├── line.component.spec.ts │ │ │ │ │ │ └── line.component.ts │ │ │ │ │ │ ├── rect │ │ │ │ │ │ ├── rect.component.html │ │ │ │ │ │ ├── rect.component.scss │ │ │ │ │ │ ├── rect.component.spec.ts │ │ │ │ │ │ └── rect.component.ts │ │ │ │ │ │ └── text │ │ │ │ │ │ ├── text.component.html │ │ │ │ │ │ ├── text.component.scss │ │ │ │ │ │ ├── text.component.spec.ts │ │ │ │ │ │ └── text.component.ts │ │ │ │ ├── experimental-map.component.html │ │ │ │ ├── experimental-map.component.scss │ │ │ │ ├── experimental-map.component.spec.ts │ │ │ │ ├── experimental-map.component.ts │ │ │ │ ├── interface-label │ │ │ │ │ ├── interface-label.component.html │ │ │ │ │ ├── interface-label.component.scss │ │ │ │ │ ├── interface-label.component.spec.ts │ │ │ │ │ └── interface-label.component.ts │ │ │ │ ├── link │ │ │ │ │ ├── link.component.html │ │ │ │ │ ├── link.component.scss │ │ │ │ │ ├── link.component.spec.ts │ │ │ │ │ ├── link.component.ts │ │ │ │ │ └── strategies │ │ │ │ │ │ ├── ethernet-link-strategy.ts │ │ │ │ │ │ ├── link-strategy.ts │ │ │ │ │ │ └── serial-link-strategy.ts │ │ │ │ ├── node │ │ │ │ │ ├── node.component.html │ │ │ │ │ ├── node.component.scss │ │ │ │ │ ├── node.component.spec.ts │ │ │ │ │ └── node.component.ts │ │ │ │ ├── selection │ │ │ │ │ ├── selection.component.html │ │ │ │ │ ├── selection.component.scss │ │ │ │ │ ├── selection.component.spec.ts │ │ │ │ │ └── selection.component.ts │ │ │ │ └── status │ │ │ │ │ ├── status.component.html │ │ │ │ │ ├── status.component.scss │ │ │ │ │ ├── status.component.spec.ts │ │ │ │ │ └── status.component.ts │ │ │ ├── selection-control │ │ │ │ ├── selection-control.component.html │ │ │ │ ├── selection-control.component.scss │ │ │ │ ├── selection-control.component.spec.ts │ │ │ │ └── selection-control.component.ts │ │ │ ├── selection-select │ │ │ │ ├── selection-select.component.html │ │ │ │ ├── selection-select.component.scss │ │ │ │ ├── selection-select.component.spec.ts │ │ │ │ └── selection-select.component.ts │ │ │ └── text-editor │ │ │ │ ├── text-editor.component.html │ │ │ │ ├── text-editor.component.scss │ │ │ │ ├── text-editor.component.spec.ts │ │ │ │ └── text-editor.component.ts │ │ ├── converters │ │ │ ├── converter.ts │ │ │ ├── map │ │ │ │ ├── drawing-to-map-drawing-converter.ts │ │ │ │ ├── label-to-map-label-converter.ts │ │ │ │ ├── link-node-to-map-link-node-converter.ts │ │ │ │ ├── link-to-map-link-converter.ts │ │ │ │ ├── map-drawing-to-drawing-converter.ts │ │ │ │ ├── map-drawing-to-svg-converter.ts │ │ │ │ ├── map-label-to-label-converter.ts │ │ │ │ ├── map-link-node-to-link-node-converter.ts │ │ │ │ ├── map-link-to-link-converter.ts │ │ │ │ ├── map-node-to-node-converter.ts │ │ │ │ ├── map-port-to-port-converter.ts │ │ │ │ ├── map-symbol-to-symbol-converter.ts │ │ │ │ ├── node-to-map-node-converter.ts │ │ │ │ ├── port-to-map-port-converter.ts │ │ │ │ └── symbol-to-map-symbol-converter.ts │ │ │ ├── styles-to-font-converter.spec.ts │ │ │ └── styles-to-font-converter.ts │ │ ├── d3-map.imports.ts │ │ ├── datasources │ │ │ ├── datasource.spec.ts │ │ │ ├── datasource.ts │ │ │ ├── drawings-datasource.spec.ts │ │ │ ├── drawings-datasource.ts │ │ │ ├── links-datasource.spec.ts │ │ │ ├── links-datasource.ts │ │ │ ├── map-datasource.ts │ │ │ ├── nodes-datasource.spec.ts │ │ │ ├── nodes-datasource.ts │ │ │ ├── symbols-datasource.spec.ts │ │ │ └── symbols-datasource.ts │ │ ├── directives │ │ │ ├── moving-canvas.directive.spec.ts │ │ │ ├── moving-canvas.directive.ts │ │ │ ├── zooming-canvas.directive.spec.ts │ │ │ └── zooming-canvas.directive.ts │ │ ├── events │ │ │ ├── draggable.ts │ │ │ ├── drawings-event-source.ts │ │ │ ├── event-source.ts │ │ │ ├── links-event-source.ts │ │ │ ├── links.ts │ │ │ ├── moving-event-source.ts │ │ │ ├── nodes-event-source.ts │ │ │ ├── nodes.ts │ │ │ ├── resizing.ts │ │ │ └── selection-event-source.ts │ │ ├── helpers │ │ │ ├── canvas-size-detector.ts │ │ │ ├── css-fixer.spec.ts │ │ │ ├── css-fixer.ts │ │ │ ├── default-drawings-factory.ts │ │ │ ├── drawings-factory │ │ │ │ ├── drawing-element-factory.ts │ │ │ │ ├── ellipse-element-factory.ts │ │ │ │ ├── line-element-factory.ts │ │ │ │ ├── rectangle-element-factory.ts │ │ │ │ └── text-element-factory.ts │ │ │ ├── font-bbox-calculator.spec.ts │ │ │ ├── font-bbox-calculator.ts │ │ │ ├── font-fixer.spec.ts │ │ │ ├── font-fixer.ts │ │ │ ├── in-rectangle-helper.spec.ts │ │ │ ├── in-rectangle-helper.ts │ │ │ ├── multi-link-calculator-helper.ts │ │ │ ├── qt-dasharray-fixer.spec.ts │ │ │ ├── qt-dasharray-fixer.ts │ │ │ ├── svg-to-drawing-converter.spec.ts │ │ │ ├── svg-to-drawing-converter.ts │ │ │ └── svg-to-drawing-converter │ │ │ │ ├── ellipse-converter.spec.ts │ │ │ │ ├── ellipse-converter.ts │ │ │ │ ├── image-converter.spec.ts │ │ │ │ ├── image-converter.ts │ │ │ │ ├── line-converter.spec.ts │ │ │ │ ├── line-converter.ts │ │ │ │ ├── rect-converter.spec.ts │ │ │ │ ├── rect-converter.ts │ │ │ │ ├── svg-converter.ts │ │ │ │ ├── text-converter.spec.ts │ │ │ │ └── text-converter.ts │ │ ├── managers │ │ │ ├── graph-data-manager.spec.ts │ │ │ ├── graph-data-manager.ts │ │ │ ├── layers-manager.spec.ts │ │ │ ├── layers-manager.ts │ │ │ ├── map-settings-manager.ts │ │ │ ├── selection-manager.spec.ts │ │ │ └── selection-manager.ts │ │ ├── models │ │ │ ├── context.ts │ │ │ ├── drawing-line.ts │ │ │ ├── drawing.ts │ │ │ ├── drawings │ │ │ │ ├── drawing-element.ts │ │ │ │ ├── ellipse-element.ts │ │ │ │ ├── image-element.ts │ │ │ │ ├── line-element.ts │ │ │ │ ├── rect-element.ts │ │ │ │ └── text-element.ts │ │ │ ├── font.ts │ │ │ ├── label.ts │ │ │ ├── layer.ts │ │ │ ├── link-status.ts │ │ │ ├── map │ │ │ │ ├── map-drawing.ts │ │ │ │ ├── map-label.ts │ │ │ │ ├── map-link-node.ts │ │ │ │ ├── map-link.ts │ │ │ │ ├── map-node.ts │ │ │ │ ├── map-port.ts │ │ │ │ └── map-symbol.ts │ │ │ ├── node.ts │ │ │ ├── point.ts │ │ │ ├── rectangle.ts │ │ │ ├── size.ts │ │ │ └── types.ts │ │ ├── services │ │ │ ├── map-change-detector-ref.spec.ts │ │ │ └── map-change-detector-ref.ts │ │ ├── testing.ts │ │ ├── tool.ts │ │ ├── tools │ │ │ ├── moving-tool.spec.ts │ │ │ ├── moving-tool.ts │ │ │ ├── selection-tool.spec.ts │ │ │ └── selection-tool.ts │ │ └── widgets │ │ │ ├── drawing-line.ts │ │ │ ├── drawing.ts │ │ │ ├── drawings.backup.ts │ │ │ ├── drawings.ts │ │ │ ├── drawings │ │ │ ├── drawing-shape-widget.ts │ │ │ ├── ellipse-drawing.spec.ts │ │ │ ├── ellipse-drawing.ts │ │ │ ├── image-drawing.spec.ts │ │ │ ├── image-drawing.ts │ │ │ ├── line-drawing.spec.ts │ │ │ ├── line-drawing.ts │ │ │ ├── rect-drawing.spec.ts │ │ │ ├── rect-drawing.ts │ │ │ ├── text-drawing.spec.ts │ │ │ └── text-drawing.ts │ │ │ ├── graph-layout.ts │ │ │ ├── interface-label.spec.ts │ │ │ ├── interface-label.ts │ │ │ ├── interface-status.ts │ │ │ ├── label.ts │ │ │ ├── layers.spec.ts │ │ │ ├── layers.ts │ │ │ ├── link.ts │ │ │ ├── links.spec.ts │ │ │ ├── links.ts │ │ │ ├── links │ │ │ ├── ethernet-link.ts │ │ │ └── serial-link.ts │ │ │ ├── node.spec.ts │ │ │ ├── node.ts │ │ │ ├── nodes.spec.ts │ │ │ ├── nodes.ts │ │ │ └── widget.ts │ ├── common │ │ ├── error-handlers │ │ │ ├── sentry-error-handler.ts │ │ │ ├── toaster-error-handler.spec.ts │ │ │ └── toaster-error-handler.ts │ │ ├── progress-dialog │ │ │ ├── progress-dialog.component.html │ │ │ ├── progress-dialog.component.scss │ │ │ ├── progress-dialog.component.spec.ts │ │ │ ├── progress-dialog.component.ts │ │ │ ├── progress-dialog.service.spec.ts │ │ │ └── progress-dialog.service.ts │ │ └── progress │ │ │ ├── progress.component.html │ │ │ ├── progress.component.scss │ │ │ ├── progress.component.spec.ts │ │ │ ├── progress.component.ts │ │ │ ├── progress.service.spec.ts │ │ │ └── progress.service.ts │ ├── components │ │ ├── adbutler │ │ │ ├── adbutler.component.html │ │ │ ├── adbutler.component.scss │ │ │ ├── adbutler.component.spec.ts │ │ │ └── adbutler.component.ts │ │ ├── bundled-server-finder │ │ │ ├── bundled-server-finder.component.html │ │ │ ├── bundled-server-finder.component.scss │ │ │ ├── bundled-server-finder.component.spec.ts │ │ │ └── bundled-server-finder.component.ts │ │ ├── dialogs │ │ │ ├── information-dialog.component.html │ │ │ ├── information-dialog.component.scss │ │ │ └── information-dialog.component.ts │ │ ├── direct-link │ │ │ ├── direct-link.component.html │ │ │ ├── direct-link.component.scss │ │ │ ├── direct-link.component.spec.ts │ │ │ └── direct-link.component.ts │ │ ├── drawings-listeners │ │ │ ├── drawing-added │ │ │ │ ├── drawing-added.component.html │ │ │ │ ├── drawing-added.component.scss │ │ │ │ ├── drawing-added.component.spec.ts │ │ │ │ └── drawing-added.component.ts │ │ │ ├── drawing-dragged │ │ │ │ ├── drawing-dragged.component.html │ │ │ │ ├── drawing-dragged.component.scss │ │ │ │ ├── drawing-dragged.component.spec.ts │ │ │ │ └── drawing-dragged.component.ts │ │ │ ├── drawing-resized │ │ │ │ ├── drawing-resized.component.html │ │ │ │ ├── drawing-resized.component.scss │ │ │ │ ├── drawing-resized.component.spec.ts │ │ │ │ └── drawing-resized.component.ts │ │ │ ├── interface-label-dragged │ │ │ │ ├── interface-label-dragged.component.html │ │ │ │ ├── interface-label-dragged.component.scss │ │ │ │ ├── interface-label-dragged.component.spec.ts │ │ │ │ └── interface-label-dragged.component.ts │ │ │ ├── link-created │ │ │ │ ├── link-created.component.html │ │ │ │ ├── link-created.component.scss │ │ │ │ ├── link-created.component.spec.ts │ │ │ │ └── link-created.component.ts │ │ │ ├── node-dragged │ │ │ │ ├── node-dragged.component.html │ │ │ │ ├── node-dragged.component.scss │ │ │ │ ├── node-dragged.component.spec.ts │ │ │ │ └── node-dragged.component.ts │ │ │ ├── node-label-dragged │ │ │ │ ├── node-label-dragged.component.html │ │ │ │ ├── node-label-dragged.component.scss │ │ │ │ ├── node-label-dragged.component.spec.ts │ │ │ │ └── node-label-dragged.component.ts │ │ │ ├── text-added │ │ │ │ ├── text-added.component.html │ │ │ │ ├── text-added.component.scss │ │ │ │ ├── text-added.component.spec.ts │ │ │ │ └── text-added.component.ts │ │ │ └── text-edited │ │ │ │ ├── text-edited.component.html │ │ │ │ ├── text-edited.component.scss │ │ │ │ ├── text-edited.component.spec.ts │ │ │ │ └── text-edited.component.ts │ │ ├── help │ │ │ ├── help.component.html │ │ │ ├── help.component.scss │ │ │ ├── help.component.spec.ts │ │ │ └── help.component.ts │ │ ├── installed-software │ │ │ ├── install-software │ │ │ │ ├── install-software.component.html │ │ │ │ ├── install-software.component.scss │ │ │ │ ├── install-software.component.spec.ts │ │ │ │ └── install-software.component.ts │ │ │ ├── installed-software.component.html │ │ │ ├── installed-software.component.scss │ │ │ ├── installed-software.component.spec.ts │ │ │ └── installed-software.component.ts │ │ ├── page-not-found │ │ │ ├── page-not-found.component.html │ │ │ ├── page-not-found.component.scss │ │ │ ├── page-not-found.component.spec.ts │ │ │ └── page-not-found.component.ts │ │ ├── preferences │ │ │ ├── built-in │ │ │ │ ├── built-in-preferences.component.html │ │ │ │ ├── built-in-preferences.component.scss │ │ │ │ ├── built-in-preferences.component.spec.ts │ │ │ │ ├── built-in-preferences.component.ts │ │ │ │ ├── cloud-nodes │ │ │ │ │ ├── cloud-nodes-add-template │ │ │ │ │ │ ├── cloud-nodes-add-template.component.html │ │ │ │ │ │ ├── cloud-nodes-add-template.component.scss │ │ │ │ │ │ ├── cloud-nodes-add-template.component.spec.ts │ │ │ │ │ │ └── cloud-nodes-add-template.component.ts │ │ │ │ │ ├── cloud-nodes-template-details │ │ │ │ │ │ ├── cloud-nodes-template-details.component.html │ │ │ │ │ │ ├── cloud-nodes-template-details.component.scss │ │ │ │ │ │ ├── cloud-nodes-template-details.component.spec.ts │ │ │ │ │ │ └── cloud-nodes-template-details.component.ts │ │ │ │ │ └── cloud-nodes-templates │ │ │ │ │ │ ├── cloud-nodes-templates.component.html │ │ │ │ │ │ ├── cloud-nodes-templates.component.scss │ │ │ │ │ │ ├── cloud-nodes-templates.component.spec.ts │ │ │ │ │ │ └── cloud-nodes-templates.component.ts │ │ │ │ ├── ethernet-hubs │ │ │ │ │ ├── ethernet-hubs-add-template │ │ │ │ │ │ ├── ethernet-hubs-add-template.component.html │ │ │ │ │ │ ├── ethernet-hubs-add-template.component.scss │ │ │ │ │ │ ├── ethernet-hubs-add-template.component.spec.ts │ │ │ │ │ │ └── ethernet-hubs-add-template.component.ts │ │ │ │ │ ├── ethernet-hubs-template-details │ │ │ │ │ │ ├── ethernet-hubs-template-details.component.html │ │ │ │ │ │ ├── ethernet-hubs-template-details.component.scss │ │ │ │ │ │ ├── ethernet-hubs-template-details.component.spec.ts │ │ │ │ │ │ └── ethernet-hubs-template-details.component.ts │ │ │ │ │ └── ethernet-hubs-templates │ │ │ │ │ │ ├── ethernet-hubs-templates.component.html │ │ │ │ │ │ ├── ethernet-hubs-templates.component.scss │ │ │ │ │ │ ├── ethernet-hubs-templates.component.spec.ts │ │ │ │ │ │ └── ethernet-hubs-templates.component.ts │ │ │ │ └── ethernet-switches │ │ │ │ │ ├── ethernet-switches-add-template │ │ │ │ │ ├── ethernet-switches-add-template.component.html │ │ │ │ │ ├── ethernet-switches-add-template.component.scss │ │ │ │ │ ├── ethernet-switches-add-template.component.spec.ts │ │ │ │ │ └── ethernet-switches-add-template.component.ts │ │ │ │ │ ├── ethernet-switches-template-details │ │ │ │ │ ├── ethernet-switches-template-details.component.html │ │ │ │ │ ├── ethernet-switches-template-details.component.scss │ │ │ │ │ ├── ethernet-switches-template-details.component.spec.ts │ │ │ │ │ └── ethernet-switches-template-details.component.ts │ │ │ │ │ └── ethernet-switches-templates │ │ │ │ │ ├── ethernet-switches-templates.component.html │ │ │ │ │ ├── ethernet-switches-templates.component.scss │ │ │ │ │ ├── ethernet-switches-templates.component.spec.ts │ │ │ │ │ └── ethernet-switches-templates.component.ts │ │ │ ├── common │ │ │ │ ├── custom-adapters-table │ │ │ │ │ ├── custom-adapters-table.component.html │ │ │ │ │ └── custom-adapters-table.component.ts │ │ │ │ ├── custom-adapters │ │ │ │ │ ├── custom-adapters.component.html │ │ │ │ │ ├── custom-adapters.component.scss │ │ │ │ │ ├── custom-adapters.component.spec.ts │ │ │ │ │ └── custom-adapters.component.ts │ │ │ │ ├── delete-confirmation-dialog │ │ │ │ │ ├── delete-confirmation-dialog.component.html │ │ │ │ │ ├── delete-confirmation-dialog.component.scss │ │ │ │ │ └── delete-confirmation-dialog.component.ts │ │ │ │ ├── delete-template-component │ │ │ │ │ ├── delete-template.component.html │ │ │ │ │ ├── delete-template.component.scss │ │ │ │ │ └── delete-template.component.ts │ │ │ │ ├── empty-templates-list │ │ │ │ │ ├── empty-templates-list.component.html │ │ │ │ │ ├── empty-templates-list.component.scss │ │ │ │ │ └── empty-templates-list.component.ts │ │ │ │ ├── ports │ │ │ │ │ ├── ports.component.html │ │ │ │ │ ├── ports.component.scss │ │ │ │ │ ├── ports.component.spec.ts │ │ │ │ │ └── ports.component.ts │ │ │ │ ├── symbols-menu │ │ │ │ │ ├── symbols-menu.component.html │ │ │ │ │ ├── symbols-menu.component.scss │ │ │ │ │ └── symbols-menu.component.ts │ │ │ │ ├── symbols │ │ │ │ │ ├── symbols.component.html │ │ │ │ │ ├── symbols.component.scss │ │ │ │ │ ├── symbols.component.spec.ts │ │ │ │ │ └── symbols.component.ts │ │ │ │ └── udp-tunnels │ │ │ │ │ ├── udp-tunnels.component.html │ │ │ │ │ └── udp-tunnels.component.ts │ │ │ ├── docker │ │ │ │ ├── add-docker-template │ │ │ │ │ ├── add-docker-template.component.html │ │ │ │ │ ├── add-docker-template.component.scss │ │ │ │ │ ├── add-docker-template.component.spec.ts │ │ │ │ │ └── add-docker-template.component.ts │ │ │ │ ├── copy-docker-template │ │ │ │ │ ├── copy-docker-template.component.html │ │ │ │ │ ├── copy-docker-template.component.scss │ │ │ │ │ └── copy-docker-template.component.ts │ │ │ │ ├── docker-template-details │ │ │ │ │ ├── docker-template-details.component.html │ │ │ │ │ ├── docker-template-details.component.scss │ │ │ │ │ ├── docker-template-details.component.spec.ts │ │ │ │ │ └── docker-template-details.component.ts │ │ │ │ └── docker-templates │ │ │ │ │ ├── docker-templates.component.html │ │ │ │ │ ├── docker-templates.component.scss │ │ │ │ │ ├── docker-templates.component.spec.ts │ │ │ │ │ └── docker-templates.component.ts │ │ │ ├── dynamips │ │ │ │ ├── add-ios-template │ │ │ │ │ ├── add-ios-template.component.html │ │ │ │ │ ├── add-ios-template.component.scss │ │ │ │ │ ├── add-ios-template.component.spec.ts │ │ │ │ │ └── add-ios-template.component.ts │ │ │ │ ├── copy-ios-template │ │ │ │ │ ├── copy-ios-template.component.html │ │ │ │ │ ├── copy-ios-template.component.scss │ │ │ │ │ └── copy-ios-template.component.ts │ │ │ │ ├── dynamips-preferences │ │ │ │ │ ├── dynamips-preferences.component.html │ │ │ │ │ ├── dynamips-preferences.component.scss │ │ │ │ │ ├── dynamips-preferences.component.spec.ts │ │ │ │ │ └── dynamips-preferences.component.ts │ │ │ │ ├── ios-template-details │ │ │ │ │ ├── ios-template-details.component.html │ │ │ │ │ ├── ios-template-details.component.scss │ │ │ │ │ ├── ios-template-details.component.spec.ts │ │ │ │ │ └── ios-template-details.component.ts │ │ │ │ └── ios-templates │ │ │ │ │ ├── ios-templates.component.html │ │ │ │ │ ├── ios-templates.component.scss │ │ │ │ │ ├── ios-templates.component.spec.ts │ │ │ │ │ └── ios-templates.component.ts │ │ │ ├── general │ │ │ │ ├── general-preferences.component.html │ │ │ │ ├── general-preferences.component.scss │ │ │ │ ├── general-preferences.component.spec.ts │ │ │ │ └── general-preferences.component.ts │ │ │ ├── gns3vm │ │ │ │ ├── gns3vm.component.html │ │ │ │ ├── gns3vm.component.scss │ │ │ │ ├── gns3vm.component.spec.ts │ │ │ │ └── gns3vm.component.ts │ │ │ ├── ios-on-unix │ │ │ │ ├── add-iou-template │ │ │ │ │ ├── add-iou-template.component.html │ │ │ │ │ ├── add-iou-template.component.scss │ │ │ │ │ ├── add-iou-template.component.spec.ts │ │ │ │ │ └── add-iou-template.component.ts │ │ │ │ ├── copy-iou-template │ │ │ │ │ ├── copy-iou-template.component.html │ │ │ │ │ ├── copy-iou-template.component.scss │ │ │ │ │ └── copy-iou-template.component.ts │ │ │ │ ├── iou-template-details │ │ │ │ │ ├── iou-template-details.component.html │ │ │ │ │ ├── iou-template-details.component.scss │ │ │ │ │ ├── iou-template-details.component.spec.ts │ │ │ │ │ └── iou-template-details.component.ts │ │ │ │ └── iou-templates │ │ │ │ │ ├── iou-templates.component.html │ │ │ │ │ ├── iou-templates.component.scss │ │ │ │ │ ├── iou-templates.component.spec.ts │ │ │ │ │ └── iou-templates.component.ts │ │ │ ├── preferences.component.html │ │ │ ├── preferences.component.scss │ │ │ ├── preferences.component.spec.ts │ │ │ ├── preferences.component.ts │ │ │ ├── qemu │ │ │ │ ├── add-qemu-vm-template │ │ │ │ │ ├── add-qemu-vm-template.component.html │ │ │ │ │ ├── add-qemu-vm-template.component.scss │ │ │ │ │ ├── add-qemu-vm-template.component.spec.ts │ │ │ │ │ └── add-qemu-vm-template.component.ts │ │ │ │ ├── copy-qemu-vm-template │ │ │ │ │ ├── copy-qemu-vm-template.component.html │ │ │ │ │ ├── copy-qemu-vm-template.component.scss │ │ │ │ │ └── copy-qemu-vm-template.component.ts │ │ │ │ ├── qemu-preferences │ │ │ │ │ ├── qemu-preferences.component.html │ │ │ │ │ ├── qemu-preferences.component.scss │ │ │ │ │ ├── qemu-preferences.component.spec.ts │ │ │ │ │ └── qemu-preferences.component.ts │ │ │ │ ├── qemu-vm-template-details │ │ │ │ │ ├── qemu-vm-template-details.component.html │ │ │ │ │ ├── qemu-vm-template-details.component.scss │ │ │ │ │ ├── qemu-vm-template-details.component.spec.ts │ │ │ │ │ └── qemu-vm-template-details.component.ts │ │ │ │ └── qemu-vm-templates │ │ │ │ │ ├── qemu-vm-templates.component.html │ │ │ │ │ ├── qemu-vm-templates.component.scss │ │ │ │ │ ├── qemu-vm-templates.component.spec.ts │ │ │ │ │ └── qemu-vm-templates.component.ts │ │ │ ├── traceng │ │ │ │ ├── add-traceng │ │ │ │ │ ├── add-traceng-template.component.html │ │ │ │ │ ├── add-traceng-template.component.scss │ │ │ │ │ └── add-traceng-template.component.ts │ │ │ │ ├── traceng-preferences │ │ │ │ │ ├── traceng-preferences.component.html │ │ │ │ │ ├── traceng-preferences.component.scss │ │ │ │ │ └── traceng-preferences.component.ts │ │ │ │ ├── traceng-template-details │ │ │ │ │ ├── traceng-template-details.component.html │ │ │ │ │ ├── traceng-template-details.component.scss │ │ │ │ │ └── traceng-template-details.component.ts │ │ │ │ └── traceng-templates │ │ │ │ │ ├── traceng-templates.component.html │ │ │ │ │ ├── traceng-templates.component.scss │ │ │ │ │ └── traceng-templates.component.ts │ │ │ ├── virtual-box │ │ │ │ ├── add-virtual-box-template │ │ │ │ │ ├── add-virtual-box-template.component.html │ │ │ │ │ ├── add-virtual-box-template.component.scss │ │ │ │ │ ├── add-virtual-box-template.component.spec.ts │ │ │ │ │ └── add-virtual-box-template.component.ts │ │ │ │ ├── virtual-box-preferences │ │ │ │ │ ├── virtual-box-preferences.component.html │ │ │ │ │ ├── virtual-box-preferences.component.scss │ │ │ │ │ ├── virtual-box-preferences.component.ts │ │ │ │ │ └── virtual-box-prefernces.component.spec.ts │ │ │ │ ├── virtual-box-template-details │ │ │ │ │ ├── virtual-box-template-details.component.html │ │ │ │ │ ├── virtual-box-template-details.component.scss │ │ │ │ │ ├── virtual-box-template-details.component.spec.ts │ │ │ │ │ └── virtual-box-template-details.component.ts │ │ │ │ └── virtual-box-templates │ │ │ │ │ ├── virtual-box-templates.component.html │ │ │ │ │ ├── virtual-box-templates.component.scss │ │ │ │ │ ├── virtual-box-templates.component.spec.ts │ │ │ │ │ └── virtual-box-templates.component.ts │ │ │ ├── vmware │ │ │ │ ├── add-vmware-template │ │ │ │ │ ├── add-vmware-template.component.html │ │ │ │ │ ├── add-vmware-template.component.scss │ │ │ │ │ ├── add-vmware-template.component.ts │ │ │ │ │ └── add-vmware.component.template.spec.ts │ │ │ │ ├── vmware-preferences │ │ │ │ │ ├── vmware-preferences.component.html │ │ │ │ │ ├── vmware-preferences.component.scss │ │ │ │ │ ├── vmware-preferences.component.spec.ts │ │ │ │ │ └── vmware-preferences.component.ts │ │ │ │ ├── vmware-template-details │ │ │ │ │ ├── vmware-template-details.component.html │ │ │ │ │ ├── vmware-template-details.component.scss │ │ │ │ │ ├── vmware-template-details.component.spec.ts │ │ │ │ │ └── vmware-template-details.component.ts │ │ │ │ └── vmware-templates │ │ │ │ │ ├── vmware-templates.component.html │ │ │ │ │ ├── vmware-templates.component.scss │ │ │ │ │ ├── vmware-templates.component.spec.ts │ │ │ │ │ └── vmware-templates.component.ts │ │ │ └── vpcs │ │ │ │ ├── add-vpcs-template │ │ │ │ ├── add-vpcs-template.component.html │ │ │ │ ├── add-vpcs-template.component.scss │ │ │ │ ├── add-vpcs-template.component.spec.ts │ │ │ │ └── add-vpcs-template.component.ts │ │ │ │ ├── vpcs-preferences │ │ │ │ ├── vpcs-preferences.component.html │ │ │ │ ├── vpcs-preferences.component.scss │ │ │ │ ├── vpcs-preferences.component.spec.ts │ │ │ │ └── vpcs-preferences.component.ts │ │ │ │ ├── vpcs-template-details │ │ │ │ ├── vpcs-template-details.component.html │ │ │ │ ├── vpcs-template-details.component.scss │ │ │ │ ├── vpcs-template-details.component.spec.ts │ │ │ │ └── vpcs-template-details.component.ts │ │ │ │ └── vpcs-templates │ │ │ │ ├── vpcs-templates.component.html │ │ │ │ ├── vpcs-templates.component.scss │ │ │ │ ├── vpcs-templates.component.spec.ts │ │ │ │ └── vpcs-templates.component.ts │ │ ├── project-map │ │ │ ├── change-hostname-dialog │ │ │ │ ├── change-hostname-dialog.component.html │ │ │ │ ├── change-hostname-dialog.component.scss │ │ │ │ └── change-hostname-dialog.component.ts │ │ │ ├── change-symbol-dialog │ │ │ │ ├── change-symbol-dialog.component.html │ │ │ │ ├── change-symbol-dialog.component.scss │ │ │ │ └── change-symbol-dialog.component.ts │ │ │ ├── console-wrapper │ │ │ │ ├── console-wrapper.component.html │ │ │ │ ├── console-wrapper.component.scss │ │ │ │ ├── console-wrapper.component.spec.ts │ │ │ │ └── console-wrapper.component.ts │ │ │ ├── context-console-menu │ │ │ │ ├── context-console-menu.component.html │ │ │ │ ├── context-console-menu.component.scss │ │ │ │ ├── context-console-menu.component.spec.ts │ │ │ │ └── context-console-menu.component.ts │ │ │ ├── context-menu │ │ │ │ ├── actions │ │ │ │ │ ├── align-horizontally │ │ │ │ │ │ ├── align-horizontally.component.html │ │ │ │ │ │ ├── align-horizontally.component.spec.ts │ │ │ │ │ │ └── align-horizontally.component.ts │ │ │ │ │ ├── align_vertically │ │ │ │ │ │ ├── align-vertically.component.html │ │ │ │ │ │ ├── align-vertically.component.spec.ts │ │ │ │ │ │ └── align-vertically.component.ts │ │ │ │ │ ├── bring-to-front-action │ │ │ │ │ │ ├── bring-to-front-action.component.html │ │ │ │ │ │ ├── bring-to-front-action.component.spec.ts │ │ │ │ │ │ └── bring-to-front-action.component.ts │ │ │ │ │ ├── change-hostname │ │ │ │ │ │ ├── change-hostname-action.component.html │ │ │ │ │ │ └── change-hostname-action.component.ts │ │ │ │ │ ├── change-symbol │ │ │ │ │ │ ├── change-symbol-action.component.html │ │ │ │ │ │ ├── change-symbol-action.component.spec.ts │ │ │ │ │ │ └── change-symbol-action.component.ts │ │ │ │ │ ├── config-action │ │ │ │ │ │ ├── config-action.component.html │ │ │ │ │ │ ├── config-action.component.spec.ts │ │ │ │ │ │ └── config-action.component.ts │ │ │ │ │ ├── console-device-action-browser │ │ │ │ │ │ ├── console-device-action-browser.component.html │ │ │ │ │ │ ├── console-device-action-browser.component.spec.ts │ │ │ │ │ │ └── console-device-action-browser.component.ts │ │ │ │ │ ├── console-device-action │ │ │ │ │ │ ├── console-device-action.component.html │ │ │ │ │ │ ├── console-device-action.component.spec.ts │ │ │ │ │ │ └── console-device-action.component.ts │ │ │ │ │ ├── delete-action │ │ │ │ │ │ ├── delete-action.component.html │ │ │ │ │ │ ├── delete-action.component.spec.ts │ │ │ │ │ │ └── delete-action.component.ts │ │ │ │ │ ├── duplicate-action │ │ │ │ │ │ ├── duplicate-action.component.html │ │ │ │ │ │ ├── duplicate-action.component.spec.ts │ │ │ │ │ │ └── duplicate-action.component.ts │ │ │ │ │ ├── edit-config │ │ │ │ │ │ ├── edit-config-action.component.html │ │ │ │ │ │ └── edit-config-action.component.ts │ │ │ │ │ ├── edit-style-action │ │ │ │ │ │ ├── edit-style-action.component.html │ │ │ │ │ │ └── edit-style-action.component.ts │ │ │ │ │ ├── edit-text-action │ │ │ │ │ │ ├── edit-text-action.component.html │ │ │ │ │ │ └── edit-text-action.component.ts │ │ │ │ │ ├── export-config │ │ │ │ │ │ ├── export-config-action.component.html │ │ │ │ │ │ └── export-config-action.component.ts │ │ │ │ │ ├── http-console-new-tab │ │ │ │ │ │ ├── http-console-new-tab-action.component.html │ │ │ │ │ │ ├── http-console-new-tab-action.component.spec.ts │ │ │ │ │ │ └── http-console-new-tab-action.component.ts │ │ │ │ │ ├── http-console │ │ │ │ │ │ ├── http-console-action.component.html │ │ │ │ │ │ ├── http-console-action.component.spec.ts │ │ │ │ │ │ └── http-console-action.component.ts │ │ │ │ │ ├── import-config │ │ │ │ │ │ ├── import-config-action.component.html │ │ │ │ │ │ ├── import-config-action.component.scss │ │ │ │ │ │ └── import-config-action.component.ts │ │ │ │ │ ├── lock-action │ │ │ │ │ │ ├── lock-action.component.html │ │ │ │ │ │ └── lock-action.component.ts │ │ │ │ │ ├── move-layer-down-action │ │ │ │ │ │ ├── move-layer-down-action.component.html │ │ │ │ │ │ ├── move-layer-down-action.component.spec.ts │ │ │ │ │ │ └── move-layer-down-action.component.ts │ │ │ │ │ ├── move-layer-up-action │ │ │ │ │ │ ├── move-layer-up-action.component.html │ │ │ │ │ │ ├── move-layer-up-action.component.spec.ts │ │ │ │ │ │ └── move-layer-up-action.component.ts │ │ │ │ │ ├── open-file-explorer │ │ │ │ │ │ ├── open-file-explorer-action.component.html │ │ │ │ │ │ └── open-file-explorer-action.component.ts │ │ │ │ │ ├── packet-filters-action │ │ │ │ │ │ ├── packet-filters-action.component.html │ │ │ │ │ │ └── packet-filters-action.component.ts │ │ │ │ │ ├── reload-node-action │ │ │ │ │ │ ├── reload-node-action.component.html │ │ │ │ │ │ ├── reload-node-action.component.spec.ts │ │ │ │ │ │ └── reload-node-action.component.ts │ │ │ │ │ ├── resume-link-action │ │ │ │ │ │ ├── resume-link-action.component.html │ │ │ │ │ │ └── resume-link-action.component.ts │ │ │ │ │ ├── show-node-action │ │ │ │ │ │ ├── show-node-action.component.html │ │ │ │ │ │ └── show-node-action.component.ts │ │ │ │ │ ├── start-capture-on-started-link │ │ │ │ │ │ ├── start-capture-on-started-link.component.html │ │ │ │ │ │ └── start-capture-on-started-link.component.ts │ │ │ │ │ ├── start-capture │ │ │ │ │ │ ├── start-capture-action.component.html │ │ │ │ │ │ └── start-capture-action.component.ts │ │ │ │ │ ├── start-node-action │ │ │ │ │ │ ├── start-node-action.component.html │ │ │ │ │ │ ├── start-node-action.component.spec.ts │ │ │ │ │ │ └── start-node-action.component.ts │ │ │ │ │ ├── stop-capture │ │ │ │ │ │ ├── stop-capture-action.component.html │ │ │ │ │ │ └── stop-capture-action.component.ts │ │ │ │ │ ├── stop-node-action │ │ │ │ │ │ ├── stop-node-action.component.html │ │ │ │ │ │ ├── stop-node-action.component.spec.ts │ │ │ │ │ │ └── stop-node-action.component.ts │ │ │ │ │ ├── suspend-link │ │ │ │ │ │ ├── suspend-link-action.component.html │ │ │ │ │ │ └── suspend-link-action.component.ts │ │ │ │ │ └── suspend-node-action │ │ │ │ │ │ ├── suspend-node-action.component.html │ │ │ │ │ │ ├── suspend-node-action.component.spec.ts │ │ │ │ │ │ └── suspend-node-action.component.ts │ │ │ │ ├── context-menu.component.html │ │ │ │ ├── context-menu.component.scss │ │ │ │ ├── context-menu.component.spec.ts │ │ │ │ ├── context-menu.component.ts │ │ │ │ └── dialogs │ │ │ │ │ └── config-dialog │ │ │ │ │ ├── config-dialog.component.html │ │ │ │ │ ├── config-dialog.component.scss │ │ │ │ │ ├── config-dialog.component.spec.ts │ │ │ │ │ └── config-dialog.component.ts │ │ │ ├── draw-link-tool │ │ │ │ ├── draw-link-tool.component.html │ │ │ │ ├── draw-link-tool.component.scss │ │ │ │ ├── draw-link-tool.component.spec.ts │ │ │ │ └── draw-link-tool.component.ts │ │ │ ├── drawings-editors │ │ │ │ ├── style-editor │ │ │ │ │ ├── style-editor.component.html │ │ │ │ │ ├── style-editor.component.scss │ │ │ │ │ └── style-editor.component.ts │ │ │ │ └── text-editor │ │ │ │ │ ├── text-editor.component.html │ │ │ │ │ ├── text-editor.component.scss │ │ │ │ │ └── text-editor.component.ts │ │ │ ├── help-dialog │ │ │ │ ├── help-dialog.component.html │ │ │ │ ├── help-dialog.component.scss │ │ │ │ └── help-dialog.component.ts │ │ │ ├── helpers │ │ │ │ ├── node-created-label-styles-fixer.spec.ts │ │ │ │ └── node-created-label-styles-fixer.ts │ │ │ ├── import-appliance │ │ │ │ ├── import-appliance.component.html │ │ │ │ ├── import-appliance.component.scss │ │ │ │ ├── import-appliance.component.spec.ts │ │ │ │ └── import-appliance.component.ts │ │ │ ├── info-dialog │ │ │ │ ├── info-dialog.component.html │ │ │ │ ├── info-dialog.component.scss │ │ │ │ └── info-dialog.component.ts │ │ │ ├── log-console │ │ │ │ ├── log-console.component.html │ │ │ │ ├── log-console.component.scss │ │ │ │ ├── log-console.component.spec.ts │ │ │ │ ├── log-console.component.ts │ │ │ │ └── log-events-datasource.ts │ │ │ ├── new-template-dialog │ │ │ │ ├── appliance-info-dialog │ │ │ │ │ ├── appliance-info-dialog.component.html │ │ │ │ │ ├── appliance-info-dialog.component.scss │ │ │ │ │ └── appliance-info-dialog.component.ts │ │ │ │ ├── new-template-dialog.component.html │ │ │ │ ├── new-template-dialog.component.scss │ │ │ │ ├── new-template-dialog.component.ts │ │ │ │ └── template-name-dialog │ │ │ │ │ ├── template-name-dialog.component.html │ │ │ │ │ ├── template-name-dialog.component.scss │ │ │ │ │ └── template-name-dialog.component.ts │ │ │ ├── node-editors │ │ │ │ ├── config-editor │ │ │ │ │ ├── config-editor.component.html │ │ │ │ │ ├── config-editor.component.scss │ │ │ │ │ ├── config-editor.component.spec.ts │ │ │ │ │ └── config-editor.component.ts │ │ │ │ └── configurator │ │ │ │ │ ├── atm_switch │ │ │ │ │ ├── configurator-atm-switch.component.html │ │ │ │ │ └── configurator-atm-switch.component.ts │ │ │ │ │ ├── cloud │ │ │ │ │ ├── configurator-cloud.component.html │ │ │ │ │ └── configurator-cloud.component.ts │ │ │ │ │ ├── configurator.component.scss │ │ │ │ │ ├── docker │ │ │ │ │ ├── configurator-docker.component.html │ │ │ │ │ ├── configurator-docker.component.ts │ │ │ │ │ ├── configure-custom-adapters │ │ │ │ │ │ ├── configure-custom-adapters.component.html │ │ │ │ │ │ ├── configure-custom-adapters.component.scss │ │ │ │ │ │ └── configure-custom-adapters.component.ts │ │ │ │ │ └── edit-network-configuration │ │ │ │ │ │ ├── edit-network-configuration.component.html │ │ │ │ │ │ ├── edit-network-configuration.component.scss │ │ │ │ │ │ └── edit-network-configuration.component.ts │ │ │ │ │ ├── ethernet-switch │ │ │ │ │ ├── configurator-ethernet-switch.component.html │ │ │ │ │ └── configurator-ethernet-switch.component.ts │ │ │ │ │ ├── ethernet_hub │ │ │ │ │ ├── configurator-ethernet-hub.component.html │ │ │ │ │ └── configurator-ethernet-hub.component.ts │ │ │ │ │ ├── ios │ │ │ │ │ ├── configurator-ios.component.html │ │ │ │ │ └── configurator-ios.component.ts │ │ │ │ │ ├── iou │ │ │ │ │ ├── configurator-iou.component.html │ │ │ │ │ └── configurator-iou.component.ts │ │ │ │ │ ├── nat │ │ │ │ │ ├── configurator-nat.component.html │ │ │ │ │ └── configurator-nat.component.ts │ │ │ │ │ ├── qemu │ │ │ │ │ ├── configurator-qemu.component.html │ │ │ │ │ ├── configurator-qemu.component.ts │ │ │ │ │ └── qemu-image-creator │ │ │ │ │ │ ├── qemu-image-creator.component.html │ │ │ │ │ │ └── qemu-image-creator.component.ts │ │ │ │ │ ├── switch │ │ │ │ │ ├── configurator-switch.component.html │ │ │ │ │ └── configurator-switch.component.ts │ │ │ │ │ ├── traceng │ │ │ │ │ ├── configurator-traceng.component.html │ │ │ │ │ └── configurator-traceng.component.ts │ │ │ │ │ ├── virtualbox │ │ │ │ │ ├── configurator-virtualbox.component.html │ │ │ │ │ └── configurator-virtualbox.component.ts │ │ │ │ │ ├── vmware │ │ │ │ │ ├── configurator-vmware.component.html │ │ │ │ │ └── configurator-vmware.component.ts │ │ │ │ │ └── vpcs │ │ │ │ │ ├── configurator-vpcs.component.html │ │ │ │ │ └── configurator-vpcs.component.ts │ │ │ ├── node-select-interface │ │ │ │ ├── node-select-interface.component.html │ │ │ │ ├── node-select-interface.component.scss │ │ │ │ ├── node-select-interface.component.spec.ts │ │ │ │ └── node-select-interface.component.ts │ │ │ ├── nodes-menu │ │ │ │ ├── nodes-menu.component.html │ │ │ │ ├── nodes-menu.component.scss │ │ │ │ ├── nodes-menu.component.spec.ts │ │ │ │ └── nodes-menu.component.ts │ │ │ ├── packet-capturing │ │ │ │ ├── packet-filters │ │ │ │ │ ├── packet-filters.component.html │ │ │ │ │ ├── packet-filters.component.scss │ │ │ │ │ ├── packet-filters.component.spec.ts │ │ │ │ │ └── packet-filters.component.ts │ │ │ │ └── start-capture │ │ │ │ │ ├── start-capture.component.html │ │ │ │ │ ├── start-capture.component.scss │ │ │ │ │ ├── start-capture.component.spec.ts │ │ │ │ │ └── start-capture.component.ts │ │ │ ├── project-map-menu │ │ │ │ ├── project-map-menu.component.html │ │ │ │ ├── project-map-menu.component.scss │ │ │ │ ├── project-map-menu.component.spec.ts │ │ │ │ └── project-map-menu.component.ts │ │ │ ├── project-map.component.html │ │ │ ├── project-map.component.scss │ │ │ ├── project-map.component.spec.ts │ │ │ ├── project-map.component.ts │ │ │ ├── screenshot-dialog │ │ │ │ ├── screenshot-dialog.component.html │ │ │ │ ├── screenshot-dialog.component.scss │ │ │ │ └── screenshot-dialog.component.ts │ │ │ └── web-console │ │ │ │ ├── web-console.component.html │ │ │ │ ├── web-console.component.scss │ │ │ │ ├── web-console.component.spec.ts │ │ │ │ └── web-console.component.ts │ │ ├── projects │ │ │ ├── add-blank-project-dialog │ │ │ │ ├── add-blank-project-dialog.component.html │ │ │ │ ├── add-blank-project-dialog.component.scss │ │ │ │ ├── add-blank-project-dialog.component.spec.ts │ │ │ │ └── add-blank-project-dialog.component.ts │ │ │ ├── choose-name-dialog │ │ │ │ ├── choose-name-dialog.component.html │ │ │ │ ├── choose-name-dialog.component.scss │ │ │ │ └── choose-name-dialog.component.ts │ │ │ ├── confirmation-bottomsheet │ │ │ │ ├── confirmation-bottomsheet.component.html │ │ │ │ ├── confirmation-bottomsheet.component.scss │ │ │ │ └── confirmation-bottomsheet.component.ts │ │ │ ├── confirmation-dialog │ │ │ │ ├── confirmation-dialog.component.html │ │ │ │ ├── confirmation-dialog.component.scss │ │ │ │ ├── confirmation-dialog.component.spec.ts │ │ │ │ └── confirmation-dialog.component.ts │ │ │ ├── edit-project-dialog │ │ │ │ ├── edit-project-dialog.component.html │ │ │ │ ├── edit-project-dialog.component.scss │ │ │ │ └── edit-project-dialog.component.ts │ │ │ ├── import-project-dialog │ │ │ │ ├── import-project-dialog.component.html │ │ │ │ ├── import-project-dialog.component.scss │ │ │ │ ├── import-project-dialog.component.spec.ts │ │ │ │ └── import-project-dialog.component.ts │ │ │ ├── models │ │ │ │ └── projectNameValidator.ts │ │ │ ├── navigation-dialog │ │ │ │ ├── navigation-dialog.component.html │ │ │ │ ├── navigation-dialog.component.scss │ │ │ │ └── navigation-dialog.component.ts │ │ │ ├── projects.component.html │ │ │ ├── projects.component.scss │ │ │ ├── projects.component.spec.ts │ │ │ ├── projects.component.ts │ │ │ └── save-project-dialog │ │ │ │ ├── save-project-dialog.component.html │ │ │ │ ├── save-project-dialog.component.scss │ │ │ │ └── save-project-dialog.component.ts │ │ ├── servers │ │ │ ├── add-server-dialog │ │ │ │ ├── add-server-dialog.component.html │ │ │ │ ├── add-server-dialog.component.scss │ │ │ │ └── add-server-dialog.component.ts │ │ │ ├── configure-gns3vm-dialog │ │ │ │ ├── configure-gns3vm-dialog.component.html │ │ │ │ ├── configure-gns3vm-dialog.component.scss │ │ │ │ └── configure-gns3vm-dialog.component.ts │ │ │ ├── server-discovery │ │ │ │ ├── server-discovery.component.html │ │ │ │ ├── server-discovery.component.scss │ │ │ │ ├── server-discovery.component.spec.ts │ │ │ │ └── server-discovery.component.ts │ │ │ ├── servers.component.html │ │ │ ├── servers.component.scss │ │ │ ├── servers.component.spec.ts │ │ │ └── servers.component.ts │ │ ├── settings │ │ │ ├── console │ │ │ │ ├── console.component.html │ │ │ │ ├── console.component.scss │ │ │ │ ├── console.component.spec.ts │ │ │ │ └── console.component.ts │ │ │ ├── settings.component.html │ │ │ ├── settings.component.scss │ │ │ ├── settings.component.spec.ts │ │ │ └── settings.component.ts │ │ ├── snapshots │ │ │ ├── create-snapshot-dialog │ │ │ │ ├── create-snapshot-dialog.component.html │ │ │ │ ├── create-snapshot-dialog.component.scss │ │ │ │ ├── create-snapshot-dialog.component.spec.ts │ │ │ │ └── create-snapshot-dialog.component.ts │ │ │ ├── list-of-snapshots │ │ │ │ ├── list-of-snaphshots.component.spec.ts │ │ │ │ ├── list-of-snapshots.component.html │ │ │ │ ├── list-of-snapshots.component.scss │ │ │ │ └── list-of-snapshots.component.ts │ │ │ └── snapshot-menu-item │ │ │ │ ├── snapshot-menu-item.component.html │ │ │ │ ├── snapshot-menu-item.component.scss │ │ │ │ ├── snapshot-menu-item.component.spec.ts │ │ │ │ └── snapshot-menu-item.component.ts │ │ ├── system-status │ │ │ ├── status-chart │ │ │ │ ├── status-chart.component.html │ │ │ │ ├── status-chart.component.scss │ │ │ │ ├── status-chart.component.spec.ts │ │ │ │ └── status-chart.component.ts │ │ │ ├── status-info │ │ │ │ ├── status-info.component.html │ │ │ │ ├── status-info.component.scss │ │ │ │ ├── status-info.component.spec.ts │ │ │ │ └── status-info.component.ts │ │ │ ├── system-status.component.html │ │ │ ├── system-status.component.scss │ │ │ ├── system-status.component.spec.ts │ │ │ └── system-status.component.ts │ │ ├── template │ │ │ ├── template-list-dialog │ │ │ │ ├── template-list-dialog.component.html │ │ │ │ ├── template-list-dialog.component.scss │ │ │ │ ├── template-list-dialog.component.spec.ts │ │ │ │ └── template-list-dialog.component.ts │ │ │ ├── template.component.html │ │ │ ├── template.component.scss │ │ │ ├── template.component.spec.ts │ │ │ └── template.component.ts │ │ ├── topology-summary │ │ │ ├── topology-summary.component.html │ │ │ ├── topology-summary.component.scss │ │ │ ├── topology-summary.component.spec.ts │ │ │ └── topology-summary.component.ts │ │ └── web-console-full-window │ │ │ ├── web-console-full-window.component.html │ │ │ └── web-console-full-window.component.ts │ ├── converters │ │ └── converter.ts │ ├── directives │ │ └── LazyImg.directive.ts │ ├── event-bus │ │ └── index.js │ ├── filters │ │ ├── dataSourceFilter.ts │ │ ├── dateFilter.pipe.ts │ │ ├── nameFilter.pipe.ts │ │ ├── projectsFilter.pipe.ts │ │ ├── searchFilter.pipe.ts │ │ └── templateFilter.pipe.ts │ ├── guards │ │ └── console-guard.ts │ ├── handlers │ │ ├── project-web-service-handler.spec.ts │ │ └── project-web-service-handler.ts │ ├── layouts │ │ └── default-layout │ │ │ ├── default-layout.component.html │ │ │ ├── default-layout.component.scss │ │ │ ├── default-layout.component.spec.ts │ │ │ └── default-layout.component.ts │ ├── material.imports.ts │ ├── models │ │ ├── adbutler.ts │ │ ├── appliance.ts │ │ ├── capturingSettings.ts │ │ ├── compute.ts │ │ ├── computeStatistics.ts │ │ ├── docker │ │ │ └── docker-image.ts │ │ ├── ethernetHub │ │ │ └── ports-mapping-enity.ts │ │ ├── filter-description.ts │ │ ├── filter.ts │ │ ├── gns3vm │ │ │ ├── gns3vm.ts │ │ │ ├── gns3vmEngine.ts │ │ │ └── vm.ts │ │ ├── images │ │ │ └── ios-image.ts │ │ ├── iou │ │ │ └── iou-image.ts │ │ ├── link-node.ts │ │ ├── link.ts │ │ ├── logEvent.ts │ │ ├── message.ts │ │ ├── port.ts │ │ ├── project-statistics.ts │ │ ├── project.ts │ │ ├── qemu │ │ │ ├── qemu-binary.ts │ │ │ ├── qemu-custom-adapter.ts │ │ │ ├── qemu-image.ts │ │ │ └── qemu-img.ts │ │ ├── server-settings-models │ │ │ ├── builtin.ts │ │ │ ├── docker.ts │ │ │ ├── dynamips.ts │ │ │ ├── graphics-view.ts │ │ │ ├── iou.ts │ │ │ ├── qemu.ts │ │ │ ├── virtual-box.ts │ │ │ ├── vmware.ts │ │ │ └── vpcs.ts │ │ ├── server.ts │ │ ├── serverResponse.ts │ │ ├── serverSettings.ts │ │ ├── settings │ │ │ └── qemu-settings.ts │ │ ├── snapshot.ts │ │ ├── software.ts │ │ ├── symbol.ts │ │ ├── template.ts │ │ ├── templates │ │ │ ├── cloud-template.ts │ │ │ ├── docker-template.ts │ │ │ ├── ethernet-hub-template.ts │ │ │ ├── ethernet-switch-template.ts │ │ │ ├── ios-template.ts │ │ │ ├── iou-template.ts │ │ │ ├── qemu-template.ts │ │ │ ├── traceng-template.ts │ │ │ ├── virtualbox-template.ts │ │ │ ├── vmware-template.ts │ │ │ └── vpcs-template.ts │ │ ├── version.ts │ │ ├── virtualBox │ │ │ └── virtual-box-vm.ts │ │ └── vmware │ │ │ └── vmware-vm.ts │ ├── resolvers │ │ └── server-resolve.ts │ ├── services │ │ ├── appliances.service.ts │ │ ├── built-in-templates-configuration.service.ts │ │ ├── built-in-templates.service.spec.ts │ │ ├── built-in-templates.service.ts │ │ ├── compute.service.ts │ │ ├── docker-configuration.service.ts │ │ ├── docker.service.ts │ │ ├── drawing.service.spec.ts │ │ ├── drawing.service.ts │ │ ├── external-software-definition.service.spec.ts │ │ ├── external-software-definition.service.ts │ │ ├── gns3vm.service.ts │ │ ├── google-analytics.service.ts │ │ ├── http-server.service.spec.ts │ │ ├── http-server.service.ts │ │ ├── info.service.ts │ │ ├── installed-software.service.spec.ts │ │ ├── installed-software.service.ts │ │ ├── ios-configuration.service.ts │ │ ├── ios.service.ts │ │ ├── iou-configuration.service.ts │ │ ├── iou.service.ts │ │ ├── link.service.spec.ts │ │ ├── link.service.ts │ │ ├── mapScale.service.ts │ │ ├── mapsettings.service.ts │ │ ├── node.service.spec.ts │ │ ├── node.service.ts │ │ ├── nodeConsole.service.ts │ │ ├── notification.service.ts │ │ ├── packet-capture.service.ts │ │ ├── platform.service.spec.ts │ │ ├── platform.service.ts │ │ ├── project.service.spec.ts │ │ ├── project.service.ts │ │ ├── protocol-handler.service.ts │ │ ├── qemu-configuration.service.ts │ │ ├── qemu.service.spec.ts │ │ ├── qemu.service.ts │ │ ├── recentlyOpenedProject.service.ts │ │ ├── server-management.service.spec.ts │ │ ├── server-management.service.ts │ │ ├── server-settings.service.spec.ts │ │ ├── server-settings.service.ts │ │ ├── server.database.ts │ │ ├── server.service.spec.ts │ │ ├── server.service.ts │ │ ├── settings.service.ts │ │ ├── settings │ │ │ ├── console.service.spec.ts │ │ │ ├── console.service.ts │ │ │ ├── default-console.service.spec.ts │ │ │ └── default-console.service.ts │ │ ├── snapshot.service.spec.ts │ │ ├── snapshot.service.ts │ │ ├── symbol.service.spec.ts │ │ ├── symbol.service.ts │ │ ├── template-mocks.service.ts │ │ ├── template.service.spec.ts │ │ ├── template.service.ts │ │ ├── testing.ts │ │ ├── theme.service.ts │ │ ├── toaster.service.spec.ts │ │ ├── toaster.service.ts │ │ ├── tools.service.ts │ │ ├── traceng.service.spec.ts │ │ ├── traceng.service.ts │ │ ├── updates.service.ts │ │ ├── version.service.spec.ts │ │ ├── version.service.ts │ │ ├── virtual-box-configuration.service.ts │ │ ├── virtual-box.service.spec.ts │ │ ├── virtual-box.service.ts │ │ ├── vmware-configuration.service.ts │ │ ├── vmware.service.spec.ts │ │ ├── vmware.service.ts │ │ ├── vpcs-configuration.service.ts │ │ ├── vpcs.service.spec.ts │ │ └── vpcs.service.ts │ ├── testing │ │ └── app-testing │ │ │ └── app-testing.module.ts │ ├── validators │ │ ├── non-negative-validator.ts │ │ ├── project-name-async-validator.ts │ │ ├── rotation-validator.ts │ │ └── template-name-async-validator.ts │ └── version.ts ├── assets │ ├── .gitkeep │ ├── favicon.ico │ ├── gns3_icon.svg │ ├── gns3_icon_black.svg │ ├── icons │ │ ├── mac │ │ │ └── icon.icns │ │ ├── png │ │ │ ├── 1024x1024.png │ │ │ ├── 128x128.png │ │ │ ├── 16x16.png │ │ │ ├── 24x24.png │ │ │ ├── 256x256.png │ │ │ ├── 32x32.png │ │ │ ├── 48x48.png │ │ │ ├── 512x512.png │ │ │ └── 64x64.png │ │ └── win │ │ │ └── icon.ico │ ├── logo-header.png │ └── resources │ │ └── images │ │ ├── filter-capture.svg │ │ ├── filter.svg │ │ ├── inspect.svg │ │ └── pause.svg ├── environments │ ├── environment.electron.prod.ts │ ├── environment.electron.ts │ ├── environment.github.prod.ts │ ├── environment.prod.ts │ └── environment.ts ├── favicon.ico ├── index.html ├── main.ts ├── polyfills.ts ├── styles.scss ├── test.ts ├── theme.scss ├── tsconfig.app.json ├── tsconfig.spec.json └── typings.d.ts ├── tsconfig.base.json ├── tsconfig.json ├── tslint.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.github/workflows/add-new-issues-to-project.yml: -------------------------------------------------------------------------------- 1 | name: Add new issues to GNS3 project 2 | 3 | on: 4 | issues: 5 | types: 6 | - opened 7 | 8 | jobs: 9 | add-to-project: 10 | name: Add issue to project 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/add-to-project@v0.4.0 14 | with: 15 | project-url: https://github.com/orgs/GNS3/projects/3 16 | github-token: ${{ secrets.ADD_NEW_ISSUES_TO_PROJECT }} 17 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | on: 3 | push: 4 | branches: 5 | - '**' 6 | pull_request: 7 | branches: 8 | - master 9 | - master-3.0 10 | 11 | jobs: 12 | build: 13 | runs-on: windows-latest 14 | 15 | steps: 16 | - uses: actions/checkout@v2 17 | - name: Setup node 14 18 | uses: actions/setup-node@v2 19 | with: 20 | node-version: 14.x 21 | - uses: c-hive/gha-yarn-cache@v1 22 | - name: Install JS dependencies 23 | run: yarn install 24 | - name: Test 25 | run: yarn test 26 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "singleQuote": true, 4 | "useTabs": false, 5 | "tabWidth": 2, 6 | "semi": true, 7 | "bracketSpacing": true, 8 | "jsxBracketSameLine": false, 9 | } -------------------------------------------------------------------------------- /.sentryclirc: -------------------------------------------------------------------------------- 1 | [defaults] 2 | url = https://sentry.io/ 3 | org = gns3 4 | project = gns3-web-ui 5 | -------------------------------------------------------------------------------- /.snyk: -------------------------------------------------------------------------------- 1 | # Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities. 2 | version: v1.16.0 3 | ignore: {} 4 | # patches apply the minimum changes required to fix a vulnerability 5 | patch: 6 | SNYK-JS-LODASH-567746: 7 | - ngx-childprocess > @types/electron > electron > @electron/get > global-tunnel-ng > lodash: 8 | patched: '2020-07-10T04:10:11.863Z' 9 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Launch localhost", 9 | "type": "firefox", 10 | "request": "launch", 11 | "reAttach": true, 12 | "url": "http://localhost:4200", 13 | "webRoot": "${workspaceFolder}" 14 | } 15 | ] 16 | } -------------------------------------------------------------------------------- /.whitesource: -------------------------------------------------------------------------------- 1 | { 2 | "scanSettings": { 3 | "configMode": "AUTO", 4 | "configExternalURL": "", 5 | "projectToken" : "", 6 | "baseBranches": ["master", "master-3.0"] 7 | }, 8 | "checkRunSettings": { 9 | "vulnerableCheckRunConclusionLevel": "failure" 10 | }, 11 | "issueSettings": { 12 | "minSeverityLevel": "LOW" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /.yarnclean: -------------------------------------------------------------------------------- 1 | # test directories 2 | __tests__ 3 | node_modules/*/test 4 | node_modules/*/tests 5 | powered-test 6 | e2e 7 | 8 | # asset directories 9 | docs 10 | doc 11 | website 12 | images 13 | 14 | # examples 15 | example 16 | examples 17 | 18 | # code coverage directories 19 | coverage 20 | .nyc_output 21 | 22 | # build scripts 23 | Makefile 24 | Gulpfile.js 25 | Gruntfile.js 26 | 27 | # configs 28 | .tern-project 29 | .gitattributes 30 | .editorconfig 31 | .*ignore 32 | .eslintrc 33 | .jshintrc 34 | .flowconfig 35 | .documentup.json 36 | .yarn-metadata.json 37 | 38 | # misc 39 | *.gz 40 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Dockerfile for GNS3 Web-ui development 2 | FROM node:stretch 3 | 4 | # Create user 5 | RUN useradd --user-group --create-home --shell /bin/false gns3-web-ui 6 | 7 | # Create app directory 8 | ENV HOME /home/gns3-web-ui 9 | WORKDIR $HOME 10 | 11 | # Copy source 12 | COPY . . 13 | RUN chown -R gns3-web-ui:gns3-web-ui $HOME 14 | 15 | # Switch to gns3-web-ui user 16 | USER gns3-web-ui 17 | 18 | # Install dependencies 19 | RUN yarn global add @angular/cli 20 | RUN yarn install --pure-lockfile 21 | 22 | ENV PATH /home/gns3-web-ui/.yarn/bin:$PATH 23 | 24 | EXPOSE 8080 25 | 26 | CMD ng serve --host 0.0.0.0 --port 8080 27 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Reporting a Vulnerability 4 | 5 | Please use GitHub's report a vulnerability feature. More information can be found in https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability 6 | -------------------------------------------------------------------------------- /debug.log: -------------------------------------------------------------------------------- 1 | [1109/003452.026:ERROR:directory_reader_win.cc(43)] FindFirstFile: The system cannot find the path specified. (0x3) 2 | -------------------------------------------------------------------------------- /e2e/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { Gns3WebUiPage } from './app.po'; 2 | 3 | describe('GNS3 Web UI Application', () => { 4 | let page: Gns3WebUiPage; 5 | 6 | beforeEach(() => { 7 | page = new Gns3WebUiPage(); 8 | }); 9 | 10 | it('should have correct page title', async () => { 11 | // arrange 12 | await page.navigateTo(); 13 | 14 | // act 15 | let text = await page.getTitleText(); 16 | 17 | // assert 18 | expect(text).toEqual('GNS3 Web UI'); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /e2e/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class Gns3WebUiPage { 4 | navigateTo() { 5 | return browser.get('/'); 6 | } 7 | 8 | getTitleText() { 9 | return browser.driver.getTitle(); 10 | } 11 | 12 | getParagraphText() { 13 | return element(by.css('app-root h1')).getText(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /e2e/helpers/common.po.ts: -------------------------------------------------------------------------------- 1 | import { browser } from 'protractor'; 2 | 3 | export class TestHelper { 4 | sleep(value: number) { 5 | browser.sleep(value); 6 | } 7 | 8 | waitForLoading() { 9 | browser.waitForAngular(); 10 | } 11 | 12 | async asyncForEach(array, callback) { 13 | for (let index = 0; index < array.length; index++) { 14 | await callback(array[index], index, array); 15 | } 16 | } 17 | 18 | getCurrentUrl() { 19 | return browser.getCurrentUrl(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /e2e/helpers/project.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by } from 'protractor'; 2 | import { TestHelper } from './common.po'; 3 | 4 | export class ProjectsPage { 5 | helper = new TestHelper(); 6 | 7 | async openAddProjectDialog() { 8 | let addButton = await browser.driver.findElement(by.css('button.add-button')); 9 | await addButton.click(); 10 | } 11 | 12 | async createProject() { 13 | let today = new Date(); 14 | let inputs = await browser.driver.findElements(by.css('input.mat-input-element')); 15 | await inputs[1].sendKeys('test project ' + today.getUTCMilliseconds()); 16 | this.helper.sleep(2000); 17 | let dialogButton = await browser.driver.findElement(by.css('button.add-project-button')); 18 | await dialogButton.click(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /e2e/tsconfig.e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.base.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/e2e", 5 | "baseUrl": "./", 6 | "module": "commonjs", 7 | "target": "es5", 8 | "types": [ 9 | "jasmine", 10 | "jasminewd2", 11 | "node" 12 | ] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /renderer.js: -------------------------------------------------------------------------------- 1 | // This file is required by the index.html file and will 2 | // be executed in the renderer process for that window. 3 | // All of the Node.js APIs are available in this process. 4 | 5 | let shell = require('electron').shell 6 | document.addEventListener('click', function (event) { 7 | if (event.target.tagName === 'A' && event.target.href.startsWith('http')) { 8 | event.preventDefault() 9 | shell.openExternal(event.target.href) 10 | } 11 | }) 12 | -------------------------------------------------------------------------------- /scripts/requirements.txt: -------------------------------------------------------------------------------- 1 | setuptools==78.1.1 2 | cx_Freeze==5.1.1 3 | requests==2.32.3 4 | packaging==20.9 5 | appdirs==1.4.4 6 | psutil==5.8.0 7 | -------------------------------------------------------------------------------- /sentry.js: -------------------------------------------------------------------------------- 1 | const { init } = require('@sentry/electron'); 2 | const fs = require('fs'); 3 | 4 | const { ipcMain } = require('electron') 5 | 6 | let crashReportsEnabled = true; 7 | const DSN = 8 | 'https://cb7b474b2e874afb8e400c47d1452ecc:7876224cbff543d992cb0ac4021962f8@sentry.io/1040940'; 9 | 10 | const isDev = () => { 11 | return fs.existsSync('.git'); 12 | }; 13 | 14 | const shouldSendCallback = () => { 15 | return !isDev() && crashReportsEnabled; 16 | }; 17 | 18 | 19 | ipcMain.on('settings.changed', function (event, settings) { 20 | crashReportsEnabled = settings.crash_reports; 21 | }); 22 | 23 | 24 | init({ 25 | dsn: DSN, 26 | shouldSendCallback: shouldSendCallback 27 | }); 28 | -------------------------------------------------------------------------------- /src/app/app.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | -------------------------------------------------------------------------------- /src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | mat-menu-panel { 2 | min-height: 0px; 3 | } 4 | 5 | .dark { 6 | background: #263238 !important; 7 | } 8 | 9 | .light { 10 | background: white !important; 11 | } 12 | -------------------------------------------------------------------------------- /src/app/cartography/components/d3-map/d3-map.component.scss: -------------------------------------------------------------------------------- 1 | svg { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/cartography/components/d3-map/d3-map.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | import { D3MapComponent } from './d3-map.component'; 3 | 4 | describe('D3MapComponent', () => { 5 | let component: D3MapComponent; 6 | let fixture: ComponentFixture; 7 | 8 | beforeEach(async(() => { 9 | TestBed.configureTestingModule({ 10 | declarations: [D3MapComponent], 11 | }).compileComponents(); 12 | })); 13 | 14 | // beforeEach(() => { 15 | // fixture = TestBed.createComponent(MapComponent); 16 | // component = fixture.componentInstance; 17 | // fixture.detectChanges(); 18 | // }); 19 | // 20 | // it('should create', () => { 21 | // expect(component).toBeTruthy(); 22 | // }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/cartography/components/draggable-selection/draggable-selection.component.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/draggable-selection/draggable-selection.component.html -------------------------------------------------------------------------------- /src/app/cartography/components/draggable-selection/draggable-selection.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/draggable-selection/draggable-selection.component.scss -------------------------------------------------------------------------------- /src/app/cartography/components/drawing-adding/drawing-adding.component.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/drawing-adding/drawing-adding.component.html -------------------------------------------------------------------------------- /src/app/cartography/components/drawing-adding/drawing-adding.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/drawing-adding/drawing-adding.component.scss -------------------------------------------------------------------------------- /src/app/cartography/components/drawing-resizing/drawing-resizing.component.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/drawing-resizing/drawing-resizing.component.html -------------------------------------------------------------------------------- /src/app/cartography/components/drawing-resizing/drawing-resizing.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/drawing-resizing/drawing-resizing.component.scss -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/draggable/draggable.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/experimental-map/draggable/draggable.component.scss -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawing.component.html: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawing.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/experimental-map/drawing/drawing.component.scss -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawing.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | import { DrawingComponent } from './drawing.component'; 3 | 4 | describe('DrawingComponent', () => { 5 | let component: DrawingComponent; 6 | let fixture: ComponentFixture; 7 | 8 | beforeEach(async(() => { 9 | TestBed.configureTestingModule({ 10 | declarations: [DrawingComponent], 11 | }).compileComponents(); 12 | })); 13 | 14 | beforeEach(() => { 15 | fixture = TestBed.createComponent(DrawingComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | // it('should create', () => { 21 | // expect(component).toBeTruthy(); 22 | // }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawings/ellipse/ellipse.component.html: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawings/ellipse/ellipse.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/experimental-map/drawing/drawings/ellipse/ellipse.component.scss -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawings/image/image.component.html: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawings/image/image.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/experimental-map/drawing/drawings/image/image.component.scss -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawings/image/image.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | import { ImageComponent } from './image.component'; 3 | 4 | describe('ImageComponent', () => { 5 | let component: ImageComponent; 6 | let fixture: ComponentFixture; 7 | 8 | beforeEach(async(() => { 9 | TestBed.configureTestingModule({ 10 | declarations: [ImageComponent], 11 | }).compileComponents(); 12 | })); 13 | 14 | beforeEach(() => { 15 | fixture = TestBed.createComponent(ImageComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | // it('should create', () => { 21 | // expect(component).toBeTruthy(); 22 | // }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawings/image/image.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | import { ImageElement } from '../../../../../models/drawings/image-element'; 3 | 4 | @Component({ 5 | selector: '[app-image]', 6 | templateUrl: './image.component.html', 7 | styleUrls: ['./image.component.scss'], 8 | }) 9 | export class ImageComponent implements OnInit { 10 | @Input('app-image') image: ImageElement; 11 | 12 | constructor() {} 13 | 14 | ngOnInit() {} 15 | } 16 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawings/line/line.component.html: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawings/line/line.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/experimental-map/drawing/drawings/line/line.component.scss -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawings/line/line.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | import { LineComponent } from './line.component'; 3 | 4 | describe('LineComponent', () => { 5 | let component: LineComponent; 6 | let fixture: ComponentFixture; 7 | 8 | beforeEach(async(() => { 9 | TestBed.configureTestingModule({ 10 | declarations: [LineComponent], 11 | }).compileComponents(); 12 | })); 13 | 14 | beforeEach(() => { 15 | fixture = TestBed.createComponent(LineComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | // it('should create', () => { 21 | // expect(component).toBeTruthy(); 22 | // }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawings/rect/rect.component.html: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawings/rect/rect.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/experimental-map/drawing/drawings/rect/rect.component.scss -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawings/rect/rect.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | import { RectComponent } from './rect.component'; 3 | 4 | describe('RectComponent', () => { 5 | let component: RectComponent; 6 | let fixture: ComponentFixture; 7 | 8 | beforeEach(async(() => { 9 | TestBed.configureTestingModule({ 10 | declarations: [RectComponent], 11 | }).compileComponents(); 12 | })); 13 | 14 | beforeEach(() => { 15 | fixture = TestBed.createComponent(RectComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | // it('should create', () => { 21 | // expect(component).toBeTruthy(); 22 | // }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawings/text/text.component.html: -------------------------------------------------------------------------------- 1 | 9 | 10 | {{ line }} 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawings/text/text.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/experimental-map/drawing/drawings/text/text.component.scss -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/drawing/drawings/text/text.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | import { TextComponent } from './text.component'; 3 | 4 | describe('TextComponent', () => { 5 | let component: TextComponent; 6 | let fixture: ComponentFixture; 7 | 8 | beforeEach(async(() => { 9 | TestBed.configureTestingModule({ 10 | declarations: [TextComponent], 11 | }).compileComponents(); 12 | })); 13 | 14 | beforeEach(() => { 15 | fixture = TestBed.createComponent(TextComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | // it('should create', () => { 21 | // expect(component).toBeTruthy(); 22 | // }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/experimental-map.component.scss: -------------------------------------------------------------------------------- 1 | svg { 2 | display: block; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/interface-label/interface-label.component.html: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | {{ text }} 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/interface-label/interface-label.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/experimental-map/interface-label/interface-label.component.scss -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/link/link.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/experimental-map/link/link.component.scss -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/link/link.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | import { LinkComponent } from './link.component'; 3 | 4 | describe('LinkComponent', () => { 5 | let component: LinkComponent; 6 | let fixture: ComponentFixture; 7 | 8 | beforeEach(async(() => { 9 | TestBed.configureTestingModule({ 10 | declarations: [LinkComponent], 11 | }).compileComponents(); 12 | })); 13 | 14 | beforeEach(() => { 15 | fixture = TestBed.createComponent(LinkComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | // it('should create', () => { 21 | // expect(component).toBeTruthy(); 22 | // }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/link/strategies/ethernet-link-strategy.ts: -------------------------------------------------------------------------------- 1 | import { path } from 'd3-path'; 2 | import { MapLink } from '../../../../models/map/map-link'; 3 | import { LinkStrategy } from './link-strategy'; 4 | 5 | export class EthernetLinkStrategy implements LinkStrategy { 6 | public d(link: MapLink): string { 7 | const points = [ 8 | [link.source.x + link.source.width / 2, link.source.y + link.source.height / 2], 9 | [link.target.x + link.target.width / 2, link.target.y + link.target.height / 2], 10 | ]; 11 | 12 | const line_generator = path(); 13 | line_generator.moveTo(points[0][0], points[0][1]); 14 | line_generator.lineTo(points[1][0], points[1][1]); 15 | return line_generator.toString(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/link/strategies/link-strategy.ts: -------------------------------------------------------------------------------- 1 | import { MapLink } from '../../../../models/map/map-link'; 2 | 3 | export interface LinkStrategy { 4 | d(link: MapLink): string; 5 | } 6 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/node/node.component.html: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | {{ node.label.text }} 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/node/node.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/experimental-map/node/node.component.scss -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/node/node.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | import { NodeComponent } from './node.component'; 3 | 4 | describe('NodeComponent', () => { 5 | let component: NodeComponent; 6 | let fixture: ComponentFixture; 7 | 8 | beforeEach(async(() => { 9 | TestBed.configureTestingModule({ 10 | declarations: [NodeComponent], 11 | }).compileComponents(); 12 | })); 13 | 14 | beforeEach(() => { 15 | fixture = TestBed.createComponent(NodeComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | // it('should create', () => { 21 | // expect(component).toBeTruthy(); 22 | // }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/selection/selection.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/selection/selection.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/experimental-map/selection/selection.component.scss -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/status/status.component.html: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 21 | 22 | -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/status/status.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/experimental-map/status/status.component.scss -------------------------------------------------------------------------------- /src/app/cartography/components/experimental-map/status/status.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | import { StatusComponent } from './status.component'; 3 | 4 | describe('StatusComponent', () => { 5 | let component: StatusComponent; 6 | let fixture: ComponentFixture; 7 | 8 | beforeEach(async(() => { 9 | TestBed.configureTestingModule({ 10 | declarations: [StatusComponent], 11 | }).compileComponents(); 12 | })); 13 | 14 | beforeEach(() => { 15 | fixture = TestBed.createComponent(StatusComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/cartography/components/selection-control/selection-control.component.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/selection-control/selection-control.component.html -------------------------------------------------------------------------------- /src/app/cartography/components/selection-control/selection-control.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/selection-control/selection-control.component.scss -------------------------------------------------------------------------------- /src/app/cartography/components/selection-select/selection-select.component.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/selection-select/selection-select.component.html -------------------------------------------------------------------------------- /src/app/cartography/components/selection-select/selection-select.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/cartography/components/selection-select/selection-select.component.scss -------------------------------------------------------------------------------- /src/app/cartography/components/text-editor/text-editor.component.html: -------------------------------------------------------------------------------- 1 |
9 | {{ innerText }} 10 |
11 | -------------------------------------------------------------------------------- /src/app/cartography/components/text-editor/text-editor.component.scss: -------------------------------------------------------------------------------- 1 | .temporaryElement { 2 | padding-left: 4px; 3 | width: fit-content; 4 | position: absolute; 5 | z-index: 99; 6 | font-family: 'Noto Sans'; 7 | font-size: 11pt; 8 | font-weight: bold; 9 | color: #000000; 10 | } 11 | -------------------------------------------------------------------------------- /src/app/cartography/converters/converter.ts: -------------------------------------------------------------------------------- 1 | export interface Converter { 2 | convert(obj: F): T; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/cartography/converters/map/map-port-to-port-converter.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Port } from '../../../models/port'; 3 | import { MapPort } from '../../models/map/map-port'; 4 | import { Converter } from '../converter'; 5 | 6 | @Injectable() 7 | export class MapPortToPortConverter implements Converter { 8 | convert(mapPort: MapPort) { 9 | const port = new Port(); 10 | port.adapter_number = mapPort.adapterNumber; 11 | port.link_type = mapPort.linkType; 12 | port.name = mapPort.name; 13 | port.port_number = mapPort.portNumber; 14 | port.short_name = mapPort.shortName; 15 | return port; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/cartography/converters/map/map-symbol-to-symbol-converter.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Symbol } from '../../../models/symbol'; 3 | import { MapSymbol } from '../../models/map/map-symbol'; 4 | import { Converter } from '../converter'; 5 | 6 | @Injectable() 7 | export class MapSymbolToSymbolConverter implements Converter { 8 | convert(mapSymbol: MapSymbol) { 9 | const symbol = new Symbol(); 10 | symbol.symbol_id = mapSymbol.id; 11 | symbol.builtin = mapSymbol.builtin; 12 | symbol.filename = mapSymbol.filename; 13 | symbol.raw = mapSymbol.raw; 14 | return symbol; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/app/cartography/converters/map/port-to-map-port-converter.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Port } from '../../../models/port'; 3 | import { MapPort } from '../../models/map/map-port'; 4 | import { Converter } from '../converter'; 5 | 6 | @Injectable() 7 | export class PortToMapPortConverter implements Converter { 8 | convert(port: Port) { 9 | const mapPort = new MapPort(); 10 | mapPort.adapterNumber = port.adapter_number; 11 | mapPort.linkType = port.link_type; 12 | mapPort.name = port.name; 13 | mapPort.portNumber = port.port_number; 14 | mapPort.shortName = port.short_name; 15 | return mapPort; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/cartography/converters/map/symbol-to-map-symbol-converter.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Symbol } from '../../../models/symbol'; 3 | import { MapSymbol } from '../../models/map/map-symbol'; 4 | import { Converter } from '../converter'; 5 | 6 | @Injectable() 7 | export class SymbolToMapSymbolConverter implements Converter { 8 | convert(symbol: Symbol) { 9 | const mapSymbol = new MapSymbol(); 10 | mapSymbol.id = symbol.symbol_id; 11 | mapSymbol.builtin = symbol.builtin; 12 | mapSymbol.filename = symbol.filename; 13 | mapSymbol.raw = symbol.raw; 14 | return mapSymbol; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/app/cartography/converters/styles-to-font-converter.spec.ts: -------------------------------------------------------------------------------- 1 | import { Font } from '../models/font'; 2 | import { StylesToFontConverter } from './styles-to-font-converter'; 3 | 4 | describe('StylesToFontConverter', () => { 5 | let converter: StylesToFontConverter; 6 | 7 | beforeEach(() => { 8 | converter = new StylesToFontConverter(); 9 | }); 10 | 11 | it('should parse fonts from styles', () => { 12 | const styles = 'font-family: TypeWriter; font-size: 10px; font-weight: bold'; 13 | 14 | const expectedFont: Font = { 15 | font_family: 'TypeWriter', 16 | font_size: 10, 17 | font_weight: 'bold', 18 | }; 19 | 20 | expect(converter.convert(styles)).toEqual(expectedFont); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /src/app/cartography/datasources/drawings-datasource.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Drawing } from '../models/drawing'; 3 | import { DataSource } from './datasource'; 4 | 5 | @Injectable() 6 | export class DrawingsDataSource extends DataSource { 7 | protected getItemKey(drawing: Drawing) { 8 | return drawing.drawing_id; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/app/cartography/datasources/links-datasource.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Link } from '../../models/link'; 3 | import { DataSource } from './datasource'; 4 | 5 | @Injectable() 6 | export class LinksDataSource extends DataSource { 7 | protected getItemKey(link: Link) { 8 | return link.link_id; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/app/cartography/datasources/nodes-datasource.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Node } from '../models/node'; 3 | import { DataSource } from './datasource'; 4 | 5 | @Injectable() 6 | export class NodesDataSource extends DataSource { 7 | protected getItemKey(node: Node) { 8 | return node.node_id; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/app/cartography/datasources/symbols-datasource.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Symbol } from '../../models/symbol'; 3 | import { DataSource } from './datasource'; 4 | 5 | @Injectable() 6 | export class SymbolsDataSource extends DataSource { 7 | protected getItemKey(symbol: Symbol) { 8 | return symbol.symbol_id; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/app/cartography/events/links-event-source.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter, Injectable } from '@angular/core'; 2 | import { MapLinkNode } from '../models/map/map-link-node'; 3 | import { DraggedDataEvent } from './event-source'; 4 | import { MapLinkCreated } from './links'; 5 | 6 | @Injectable() 7 | export class LinksEventSource { 8 | public created = new EventEmitter(); 9 | public interfaceDragged = new EventEmitter>(); 10 | } 11 | -------------------------------------------------------------------------------- /src/app/cartography/events/links.ts: -------------------------------------------------------------------------------- 1 | import { MapNode } from '../models/map/map-node'; 2 | import { MapPort } from '../models/map/map-port'; 3 | 4 | export class MapLinkCreated { 5 | constructor( 6 | public sourceNode: MapNode, 7 | public sourcePort: MapPort, 8 | public targetNode: MapNode, 9 | public targetPort: MapPort 10 | ) {} 11 | } 12 | -------------------------------------------------------------------------------- /src/app/cartography/events/moving-event-source.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter, Injectable } from '@angular/core'; 2 | 3 | @Injectable() 4 | export class MovingEventSource { 5 | public movingModeState = new EventEmitter(); 6 | } 7 | -------------------------------------------------------------------------------- /src/app/cartography/events/nodes-event-source.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter, Injectable } from '@angular/core'; 2 | import { MapLabel } from '../models/map/map-label'; 3 | import { MapNode } from '../models/map/map-node'; 4 | import { ClickedDataEvent, DraggedDataEvent } from './event-source'; 5 | 6 | @Injectable() 7 | export class NodesEventSource { 8 | public dragged = new EventEmitter>(); 9 | public labelDragged = new EventEmitter>(); 10 | public clicked = new EventEmitter>(); 11 | } 12 | -------------------------------------------------------------------------------- /src/app/cartography/events/nodes.ts: -------------------------------------------------------------------------------- 1 | import { MapNode } from '../models/map/map-node'; 2 | 3 | class NodeEvent { 4 | constructor(public event: any, public node: MapNode) {} 5 | } 6 | 7 | export class NodeClicked extends NodeEvent {} 8 | export class NodeContextMenu extends NodeEvent {} 9 | -------------------------------------------------------------------------------- /src/app/cartography/events/resizing.ts: -------------------------------------------------------------------------------- 1 | export class ResizingEnd { 2 | public datum: T; 3 | public x: number; 4 | public y: number; 5 | public width: number; 6 | public height: number; 7 | } 8 | -------------------------------------------------------------------------------- /src/app/cartography/events/selection-event-source.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Subject } from 'rxjs'; 3 | import { Rectangle } from '../models/rectangle'; 4 | 5 | @Injectable() 6 | export class SelectionEventSource { 7 | public selected = new Subject(); 8 | } 9 | -------------------------------------------------------------------------------- /src/app/cartography/helpers/canvas-size-detector.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Size } from '../models/size'; 3 | 4 | @Injectable() 5 | export class CanvasSizeDetector { 6 | public getOptimalSize(minWidth: number, minHeight: number) { 7 | let width = document.documentElement.clientWidth; 8 | let height = document.documentElement.clientHeight; 9 | if (minWidth > width) { 10 | width = minWidth; 11 | } 12 | if (minHeight > height) { 13 | height = minHeight; 14 | } 15 | return new Size(width, height); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/cartography/helpers/drawings-factory/drawing-element-factory.ts: -------------------------------------------------------------------------------- 1 | import { DrawingElement } from '../../models/drawings/drawing-element'; 2 | 3 | export interface DrawingElementFactory { 4 | getDrawingElement(): DrawingElement; 5 | } 6 | -------------------------------------------------------------------------------- /src/app/cartography/helpers/drawings-factory/line-element-factory.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { DrawingElement } from '../../models/drawings/drawing-element'; 3 | import { LineElement } from '../../models/drawings/line-element'; 4 | import { DrawingElementFactory } from './drawing-element-factory'; 5 | 6 | @Injectable() 7 | export class LineElementFactory implements DrawingElementFactory { 8 | getDrawingElement(): DrawingElement { 9 | let lineElement = new LineElement(); 10 | lineElement.stroke = '#000000'; 11 | lineElement.stroke_width = 2; 12 | lineElement.x1 = 0; 13 | lineElement.x2 = 200; 14 | lineElement.y1 = 0; 15 | lineElement.y2 = 0; 16 | lineElement.width = 100; 17 | lineElement.height = 0; 18 | return lineElement; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/cartography/helpers/drawings-factory/text-element-factory.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { DrawingElement } from '../../models/drawings/drawing-element'; 3 | import { TextElement } from '../../models/drawings/text-element'; 4 | import { DrawingElementFactory } from './drawing-element-factory'; 5 | 6 | @Injectable() 7 | export class TextElementFactory implements DrawingElementFactory { 8 | getDrawingElement(): DrawingElement { 9 | let textElement = new TextElement(); 10 | textElement.height = 100; 11 | textElement.width = 100; 12 | textElement.fill = '#000000'; 13 | textElement.fill_opacity = 0; 14 | textElement.font_family = 'Noto Sans'; 15 | textElement.font_size = 11; 16 | textElement.font_weight = 'bold'; 17 | return textElement; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/app/cartography/helpers/font-bbox-calculator.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | @Injectable() 4 | export class FontBBoxCalculator { 5 | calculate(text: string, styles: string) { 6 | const element = document.createElement('text'); 7 | element.innerText = text; 8 | element.setAttribute('fill', '#00000'); 9 | element.setAttribute('fill-opacity', '0'); 10 | element.setAttribute('style', styles); 11 | document.documentElement.appendChild(element); 12 | const bbox = element.getBoundingClientRect(); 13 | document.documentElement.removeChild(element); 14 | 15 | return { 16 | width: bbox.width, 17 | height: bbox.height, 18 | }; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/cartography/helpers/in-rectangle-helper.spec.ts: -------------------------------------------------------------------------------- 1 | import { Rectangle } from '../models/rectangle'; 2 | import { InRectangleHelper } from './in-rectangle-helper'; 3 | 4 | describe('InRectangleHelper', () => { 5 | let inRectangleHelper: InRectangleHelper; 6 | 7 | beforeEach(() => { 8 | inRectangleHelper = new InRectangleHelper(); 9 | }); 10 | 11 | it('should be in rectangle', () => { 12 | const isIn = inRectangleHelper.inRectangle(new Rectangle(10, 10, 150, 150), 100, 100); 13 | expect(isIn).toBeTruthy(); 14 | }); 15 | 16 | it('should be outside rectangle', () => { 17 | const isIn = inRectangleHelper.inRectangle(new Rectangle(10, 10, 50, 50), 100, 100); 18 | expect(isIn).toBeFalsy(); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /src/app/cartography/helpers/in-rectangle-helper.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Rectangle } from '../models/rectangle'; 3 | 4 | @Injectable() 5 | export class InRectangleHelper { 6 | public inRectangle(rectangle: Rectangle, x: number, y: number): boolean { 7 | return ( 8 | rectangle.x <= x && x < rectangle.x + rectangle.width && rectangle.y <= y && y < rectangle.y + rectangle.height 9 | ); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/app/cartography/helpers/qt-dasharray-fixer.spec.ts: -------------------------------------------------------------------------------- 1 | import { QtDasharrayFixer } from './qt-dasharray-fixer'; 2 | 3 | describe('QtDashArrayFixer', () => { 4 | let fixer: QtDasharrayFixer; 5 | 6 | beforeEach(() => { 7 | fixer = new QtDasharrayFixer(); 8 | }); 9 | 10 | it('should fix when matches mapping', () => { 11 | expect(fixer.fix('25, 25')).toEqual('10, 2'); 12 | }); 13 | 14 | it('should not fix when do not match mapping', () => { 15 | expect(fixer.fix('1, 2, 3')).toEqual('1, 2, 3'); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /src/app/cartography/helpers/qt-dasharray-fixer.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | /** 4 | * GNS3 GUI performs mapping from QT styles to SVG dasharray, but styles don't match 5 | * what you can see, here are improvements; later on please adjust GUI for proper values. 6 | */ 7 | @Injectable() 8 | export class QtDasharrayFixer { 9 | static MAPPING = { 10 | '25, 25': '10, 2', 11 | '5, 25': '4, 2', 12 | '5, 25, 25': '5, 5, 1, 5', 13 | '25, 25, 5, 25, 5': '5, 2, 5, 2, 5', 14 | }; 15 | 16 | public fix(dasharray: string): string { 17 | if (dasharray in QtDasharrayFixer.MAPPING) { 18 | return QtDasharrayFixer.MAPPING[dasharray]; 19 | } 20 | return dasharray; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/app/cartography/helpers/svg-to-drawing-converter/svg-converter.ts: -------------------------------------------------------------------------------- 1 | import { DrawingElement } from '../../models/drawings/drawing-element'; 2 | 3 | export interface SvgConverter { 4 | convert(element: Element): DrawingElement; 5 | } 6 | -------------------------------------------------------------------------------- /src/app/cartography/managers/graph-data-manager.spec.ts: -------------------------------------------------------------------------------- 1 | export class MockedGraphDataManager { 2 | private nodes = []; 3 | private links = []; 4 | private drawings = []; 5 | private symbols = []; 6 | 7 | public setNodes(value) { 8 | this.nodes = value; 9 | } 10 | 11 | public getNodes() { 12 | return this.nodes; 13 | } 14 | 15 | public setLinks(value) { 16 | this.links = value; 17 | } 18 | 19 | public getLinks() { 20 | return this.links; 21 | } 22 | 23 | public setDrawings(value) { 24 | this.drawings = value; 25 | } 26 | 27 | public getDrawings() { 28 | return this.drawings; 29 | } 30 | 31 | public setSymbols(value) { 32 | this.symbols = value; 33 | } 34 | 35 | public getSymbols() { 36 | return this.symbols; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/app/cartography/managers/map-settings-manager.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | @Injectable() 4 | export class MapSettingsManager { 5 | public isReadOnly = false; 6 | } 7 | -------------------------------------------------------------------------------- /src/app/cartography/managers/selection-manager.spec.ts: -------------------------------------------------------------------------------- 1 | import { MapNode } from '../models/map/map-node'; 2 | import { SelectionManager } from './selection-manager'; 3 | 4 | export class SelectionManagerMock { 5 | public items = []; 6 | setSelected(items: any) { 7 | this.items = items; 8 | } 9 | getSelected() { 10 | return this.items; 11 | } 12 | } 13 | 14 | describe('SelectionManager', () => { 15 | let manager: SelectionManager; 16 | 17 | beforeEach(() => { 18 | manager = new SelectionManager(); 19 | }); 20 | 21 | it('nodes should be manually selected', () => { 22 | const node = new MapNode(); 23 | node.id = 'test1'; 24 | manager.setSelected([node]); 25 | expect(manager.getSelected().length).toEqual(1); 26 | }); 27 | }); 28 | -------------------------------------------------------------------------------- /src/app/cartography/models/context.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Point } from './point'; 3 | import { Size } from './size'; 4 | 5 | export class Transformation { 6 | constructor(public x: number, public y: number, public k: number) {} 7 | } 8 | 9 | @Injectable() 10 | export class Context { 11 | public transformation: Transformation; 12 | public size: Size; 13 | public centerZeroZeroPoint = true; 14 | 15 | constructor() { 16 | this.size = new Size(0, 0); 17 | this.transformation = new Transformation(0, 0, 1); 18 | } 19 | 20 | public getZeroZeroTransformationPoint() { 21 | if (this.centerZeroZeroPoint) { 22 | return new Point(this.size.width / 2, this.size.height / 2); 23 | } 24 | return new Point(0, 0); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/app/cartography/models/drawing-line.ts: -------------------------------------------------------------------------------- 1 | import { Point } from './point'; 2 | 3 | export class DrawingLine { 4 | start: Point; 5 | end: Point; 6 | } 7 | -------------------------------------------------------------------------------- /src/app/cartography/models/drawing.ts: -------------------------------------------------------------------------------- 1 | import { DrawingElement } from './drawings/drawing-element'; 2 | 3 | export class Drawing { 4 | drawing_id: string; 5 | project_id: string; 6 | rotation: number; 7 | svg: string; 8 | locked: boolean; 9 | x: number; 10 | y: number; 11 | z: number; 12 | element: DrawingElement; // @todo; move to context 13 | } 14 | -------------------------------------------------------------------------------- /src/app/cartography/models/drawings/drawing-element.ts: -------------------------------------------------------------------------------- 1 | export interface DrawingElement { 2 | width: number; 3 | height: number; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/cartography/models/drawings/ellipse-element.ts: -------------------------------------------------------------------------------- 1 | import { DrawingElement } from './drawing-element'; 2 | 3 | export class EllipseElement implements DrawingElement { 4 | height: number; 5 | width: number; 6 | cx: number; 7 | cy: number; 8 | fill: string; 9 | fill_opacity: number; 10 | rx: number; 11 | ry: number; 12 | stroke: string; 13 | stroke_width: number; 14 | stroke_dasharray: string; 15 | } 16 | -------------------------------------------------------------------------------- /src/app/cartography/models/drawings/image-element.ts: -------------------------------------------------------------------------------- 1 | import { DrawingElement } from './drawing-element'; 2 | 3 | export class ImageElement implements DrawingElement { 4 | height: number; 5 | width: number; 6 | data: string; 7 | } 8 | -------------------------------------------------------------------------------- /src/app/cartography/models/drawings/line-element.ts: -------------------------------------------------------------------------------- 1 | import { DrawingElement } from './drawing-element'; 2 | 3 | export class LineElement implements DrawingElement { 4 | height: number; 5 | width: number; 6 | stroke: string; 7 | stroke_width: number; 8 | stroke_dasharray: string; 9 | x1: number; 10 | x2: number; 11 | y1: number; 12 | y2: number; 13 | } 14 | -------------------------------------------------------------------------------- /src/app/cartography/models/drawings/rect-element.ts: -------------------------------------------------------------------------------- 1 | import { DrawingElement } from './drawing-element'; 2 | 3 | export class RectElement implements DrawingElement { 4 | height: number; 5 | width: number; 6 | fill: string; 7 | fill_opacity: number; 8 | stroke: string; 9 | stroke_width: number; 10 | stroke_dasharray: string; 11 | rx: number; 12 | ry: number; 13 | } 14 | -------------------------------------------------------------------------------- /src/app/cartography/models/drawings/text-element.ts: -------------------------------------------------------------------------------- 1 | import { Font } from '../font'; 2 | import { DrawingElement } from './drawing-element'; 3 | 4 | export class TextElement implements DrawingElement, Font { 5 | height: number; 6 | width: number; 7 | text: string; 8 | fill: string; 9 | fill_opacity: number; 10 | font_family: string; 11 | font_size: number; 12 | font_weight: string; 13 | text_decoration: string; 14 | } 15 | -------------------------------------------------------------------------------- /src/app/cartography/models/font.ts: -------------------------------------------------------------------------------- 1 | export interface Font { 2 | font_family: string; 3 | font_size: number; 4 | font_weight: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/app/cartography/models/label.ts: -------------------------------------------------------------------------------- 1 | export class Label { 2 | rotation: number; 3 | style: string; 4 | text: string; 5 | x: number; 6 | y: number; 7 | } 8 | -------------------------------------------------------------------------------- /src/app/cartography/models/layer.ts: -------------------------------------------------------------------------------- 1 | import { MapDrawing } from './map/map-drawing'; 2 | import { MapLink } from './map/map-link'; 3 | import { MapNode } from './map/map-node'; 4 | 5 | export class Layer { 6 | constructor( 7 | public index?: number, 8 | public nodes: MapNode[] = [], 9 | public drawings: MapDrawing[] = [], 10 | public links: MapLink[] = [] 11 | ) {} 12 | } 13 | -------------------------------------------------------------------------------- /src/app/cartography/models/link-status.ts: -------------------------------------------------------------------------------- 1 | export class LinkStatus { 2 | public constructor(public x: number, public y: number, public status: string, public port?: string) {} 3 | } 4 | -------------------------------------------------------------------------------- /src/app/cartography/models/map/map-drawing.ts: -------------------------------------------------------------------------------- 1 | import { Indexed } from '../../datasources/map-datasource'; 2 | import { DrawingElement } from '../drawings/drawing-element'; 3 | 4 | export class MapDrawing implements Indexed { 5 | id: string; 6 | projectId: string; 7 | rotation: number; 8 | svg: string; 9 | locked: boolean; 10 | x: number; 11 | y: number; 12 | z: number; 13 | element: DrawingElement; // @todo; apply converters 14 | } 15 | -------------------------------------------------------------------------------- /src/app/cartography/models/map/map-label.ts: -------------------------------------------------------------------------------- 1 | import { Indexed } from '../../datasources/map-datasource'; 2 | 3 | export class MapLabel implements Indexed { 4 | id: string; 5 | rotation: number; 6 | style: string; 7 | text: string; 8 | x: number; 9 | y: number; 10 | originalX: number; 11 | originalY: number; 12 | nodeId: string; 13 | } 14 | -------------------------------------------------------------------------------- /src/app/cartography/models/map/map-link-node.ts: -------------------------------------------------------------------------------- 1 | import { Indexed } from '../../datasources/map-datasource'; 2 | import { MapLabel } from './map-label'; 3 | 4 | export class MapLinkNode implements Indexed { 5 | id: string; 6 | nodeId: string; 7 | linkId: string; 8 | adapterNumber: number; 9 | portNumber: number; 10 | label: MapLabel; 11 | } 12 | -------------------------------------------------------------------------------- /src/app/cartography/models/map/map-port.ts: -------------------------------------------------------------------------------- 1 | export class MapPort { 2 | adapterNumber: number; 3 | linkType: string; 4 | name: string; 5 | portNumber: number; 6 | shortName: string; 7 | } 8 | -------------------------------------------------------------------------------- /src/app/cartography/models/map/map-symbol.ts: -------------------------------------------------------------------------------- 1 | import { Indexed } from '../../datasources/map-datasource'; 2 | 3 | export class MapSymbol implements Indexed { 4 | id: string; 5 | builtin: boolean; 6 | filename: string; 7 | raw: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/app/cartography/models/point.ts: -------------------------------------------------------------------------------- 1 | export class Point { 2 | constructor(public x?: number, public y?: number) {} 3 | } 4 | -------------------------------------------------------------------------------- /src/app/cartography/models/rectangle.ts: -------------------------------------------------------------------------------- 1 | export class Rectangle { 2 | constructor(public x?: number, public y?: number, public width?: number, public height?: number) {} 3 | } 4 | -------------------------------------------------------------------------------- /src/app/cartography/models/size.ts: -------------------------------------------------------------------------------- 1 | export class Size { 2 | constructor(public width: number, public height: number) {} 3 | } 4 | -------------------------------------------------------------------------------- /src/app/cartography/models/types.ts: -------------------------------------------------------------------------------- 1 | import { BaseType, Selection } from 'd3-selection'; 2 | 3 | export type SVGSelection = Selection; 4 | 5 | export interface Dictionary { 6 | [Key: string]: T; 7 | } 8 | -------------------------------------------------------------------------------- /src/app/cartography/services/map-change-detector-ref.spec.ts: -------------------------------------------------------------------------------- 1 | import { MapChangeDetectorRef } from './map-change-detector-ref'; 2 | 3 | describe('MapChangeDetectorRef', () => { 4 | let detector: MapChangeDetectorRef; 5 | 6 | beforeEach(() => { 7 | detector = new MapChangeDetectorRef(); 8 | }); 9 | 10 | it('should emit event', () => { 11 | spyOn(detector.changesDetected, 'emit'); 12 | detector.detectChanges(); 13 | expect(detector.changesDetected.emit).toHaveBeenCalledWith(true); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /src/app/cartography/services/map-change-detector-ref.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter, Injectable } from '@angular/core'; 2 | 3 | @Injectable() 4 | export class MapChangeDetectorRef { 5 | public changesDetected = new EventEmitter(); 6 | 7 | public hasBeenDrawn = false; 8 | 9 | public detectChanges() { 10 | this.changesDetected.emit(true); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/app/cartography/testing.ts: -------------------------------------------------------------------------------- 1 | import { select, Selection } from 'd3-selection'; 2 | 3 | export class TestSVGCanvas { 4 | public svg: Selection; 5 | public canvas: Selection; 6 | 7 | constructor() { 8 | this.create(); 9 | } 10 | 11 | public create() { 12 | this.svg = select('body').append('svg').attr('width', 1000).attr('height', 1000); 13 | 14 | this.canvas = this.svg.append('g').attr('class', 'canvas'); 15 | } 16 | 17 | public destroy() { 18 | select('body').selectAll('svg').remove(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/cartography/tool.ts: -------------------------------------------------------------------------------- 1 | import { SVGSelection } from './models/types'; 2 | 3 | export interface Tool { 4 | connect(selection: SVGSelection); 5 | activate(); 6 | deactivate(); 7 | } 8 | -------------------------------------------------------------------------------- /src/app/cartography/widgets/drawings/drawing-shape-widget.ts: -------------------------------------------------------------------------------- 1 | import { SVGSelection } from '../../models/types'; 2 | 3 | export interface DrawingShapeWidget { 4 | draw(view: SVGSelection); 5 | } 6 | -------------------------------------------------------------------------------- /src/app/cartography/widgets/nodes.spec.ts: -------------------------------------------------------------------------------- 1 | import { instance, mock } from 'ts-mockito'; 2 | import { MapSettingsManager } from '../managers/map-settings-manager'; 3 | import { TestSVGCanvas } from '../testing'; 4 | import { NodeWidget } from './node'; 5 | import { NodesWidget } from './nodes'; 6 | 7 | describe('NodesWidget', () => { 8 | let svg: TestSVGCanvas; 9 | let nodeWidget: NodeWidget; 10 | let widget: NodesWidget; 11 | 12 | beforeEach(() => { 13 | svg = new TestSVGCanvas(); 14 | nodeWidget = instance(mock(NodeWidget)); 15 | widget = new NodesWidget(nodeWidget, new MapSettingsManager()); 16 | }); 17 | 18 | afterEach(() => { 19 | svg.destroy(); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /src/app/cartography/widgets/widget.ts: -------------------------------------------------------------------------------- 1 | export interface Widget { 2 | draw(view: any, datum: any): void; 3 | } 4 | 5 | export interface OnDraw { 6 | draw(view: any): void; 7 | } 8 | 9 | export interface OnConnect { 10 | onConnect(view: any): void; 11 | } 12 | 13 | export interface OnDisconnect { 14 | onDisconnect(view: any): void; 15 | } 16 | -------------------------------------------------------------------------------- /src/app/common/progress-dialog/progress-dialog.component.html: -------------------------------------------------------------------------------- 1 |

Operation in progress

2 |
3 |
4 | -------------------------------------------------------------------------------- /src/app/common/progress-dialog/progress-dialog.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/common/progress-dialog/progress-dialog.component.scss -------------------------------------------------------------------------------- /src/app/common/progress-dialog/progress-dialog.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Inject, OnInit } from '@angular/core'; 2 | import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; 3 | 4 | @Component({ 5 | selector: 'app-progress-dialog', 6 | templateUrl: './progress-dialog.component.html', 7 | styleUrls: ['./progress-dialog.component.scss'], 8 | }) 9 | export class ProgressDialogComponent implements OnInit { 10 | public static CANCELLED: 'canceled'; 11 | 12 | public value: 50; 13 | 14 | constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any) {} 15 | 16 | onCancelClick(): void { 17 | this.dialogRef.close(ProgressDialogComponent.CANCELLED); 18 | } 19 | 20 | ngOnInit() {} 21 | } 22 | -------------------------------------------------------------------------------- /src/app/common/progress-dialog/progress-dialog.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | import { ProgressDialogService } from './progress-dialog.service'; 3 | 4 | describe('ProgressDialogService', () => { 5 | beforeEach(() => { 6 | TestBed.configureTestingModule({ 7 | providers: [ProgressDialogService], 8 | }); 9 | }); 10 | 11 | // it('should be created', inject([ProgressDialogService], (service: ProgressDialogService) => { 12 | // expect(service).toBeTruthy(); 13 | // })); 14 | }); 15 | -------------------------------------------------------------------------------- /src/app/common/progress-dialog/progress-dialog.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { MatDialog } from '@angular/material/dialog'; 3 | import { ProgressDialogComponent } from './progress-dialog.component'; 4 | 5 | @Injectable() 6 | export class ProgressDialogService { 7 | constructor(private dialog: MatDialog) {} 8 | 9 | public open() { 10 | const ref = this.dialog.open(ProgressDialogComponent, { 11 | width: '250px', 12 | autoFocus: false, 13 | disableClose: true, 14 | }); 15 | return ref; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/common/progress/progress.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
error_outline
5 |
Error occurred: {{ error.message }}
6 |
7 | 10 | 13 |
14 |
15 |
16 | -------------------------------------------------------------------------------- /src/app/common/progress/progress.component.scss: -------------------------------------------------------------------------------- 1 | .overlay { 2 | position: fixed; 3 | width: 100%; 4 | height: 100%; 5 | top: 0; 6 | left: 0; 7 | right: 0; 8 | bottom: 0; 9 | background-color: rgba(0, 0, 0, 0.5); 10 | z-index: 2000; 11 | } 12 | 13 | .loading-spinner, 14 | .error-state { 15 | position: fixed; 16 | top: 50%; 17 | left: 50%; 18 | transform: translate(-50%, -50%); 19 | } 20 | 21 | .error-state div { 22 | text-align: center; 23 | } 24 | 25 | .error-icon mat-icon { 26 | font-size: 64px; 27 | width: 64px; 28 | height: 64px; 29 | } 30 | -------------------------------------------------------------------------------- /src/app/components/adbutler/adbutler.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | {{ adBody }} 5 | 6 | 9 |
10 | close 11 |
12 | -------------------------------------------------------------------------------- /src/app/components/adbutler/adbutler.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | import { AdbutlerComponent } from './adbutler.component'; 3 | 4 | xdescribe('AdbutlerComponent', () => { 5 | let component: AdbutlerComponent; 6 | let fixture: ComponentFixture; 7 | 8 | beforeEach(async(() => { 9 | TestBed.configureTestingModule({ 10 | declarations: [AdbutlerComponent], 11 | }).compileComponents(); 12 | })); 13 | 14 | beforeEach(() => { 15 | fixture = TestBed.createComponent(AdbutlerComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | xit('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/components/bundled-server-finder/bundled-server-finder.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/app/components/bundled-server-finder/bundled-server-finder.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/bundled-server-finder/bundled-server-finder.component.scss -------------------------------------------------------------------------------- /src/app/components/dialogs/information-dialog.component.html: -------------------------------------------------------------------------------- 1 | {{ confirmationMessage }} 2 |
3 | 4 | 7 |
8 | -------------------------------------------------------------------------------- /src/app/components/dialogs/information-dialog.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/dialogs/information-dialog.component.scss -------------------------------------------------------------------------------- /src/app/components/dialogs/information-dialog.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { MatDialogRef } from '@angular/material/dialog'; 3 | 4 | @Component({ 5 | selector: 'app-information-dialog', 6 | templateUrl: 'information-dialog.component.html', 7 | styleUrls: ['information-dialog.component.scss'], 8 | }) 9 | export class InformationDialogComponent implements OnInit { 10 | public confirmationMessage: string; 11 | constructor(public dialogRef: MatDialogRef) {} 12 | 13 | ngOnInit() {} 14 | 15 | onNoClick(): void { 16 | this.dialogRef.close(false); 17 | } 18 | 19 | onYesClick(): void { 20 | this.dialogRef.close(true); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/app/components/direct-link/direct-link.component.scss: -------------------------------------------------------------------------------- 1 | mat-form-field { 2 | width: 100%; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/components/direct-link/direct-link.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/direct-link/direct-link.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/drawing-added/drawing-added.component.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/drawing-added/drawing-added.component.html -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/drawing-added/drawing-added.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/drawing-added/drawing-added.component.scss -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/drawing-dragged/drawing-dragged.component.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/drawing-dragged/drawing-dragged.component.html -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/drawing-dragged/drawing-dragged.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/drawing-dragged/drawing-dragged.component.scss -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/drawing-resized/drawing-resized.component.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/drawing-resized/drawing-resized.component.html -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/drawing-resized/drawing-resized.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/drawing-resized/drawing-resized.component.scss -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/interface-label-dragged/interface-label-dragged.component.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/interface-label-dragged/interface-label-dragged.component.html -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/interface-label-dragged/interface-label-dragged.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/interface-label-dragged/interface-label-dragged.component.scss -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/link-created/link-created.component.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/link-created/link-created.component.html -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/link-created/link-created.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/link-created/link-created.component.scss -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/node-dragged/node-dragged.component.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/node-dragged/node-dragged.component.html -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/node-dragged/node-dragged.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/node-dragged/node-dragged.component.scss -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/node-label-dragged/node-label-dragged.component.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/node-label-dragged/node-label-dragged.component.html -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/node-label-dragged/node-label-dragged.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/node-label-dragged/node-label-dragged.component.scss -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/text-added/text-added.component.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/text-added/text-added.component.html -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/text-added/text-added.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/text-added/text-added.component.scss -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/text-edited/text-edited.component.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/text-edited/text-edited.component.html -------------------------------------------------------------------------------- /src/app/components/drawings-listeners/text-edited/text-edited.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/drawings-listeners/text-edited/text-edited.component.scss -------------------------------------------------------------------------------- /src/app/components/help/help.component.scss: -------------------------------------------------------------------------------- 1 | .full-width { 2 | width: 100%; 3 | margin-top: 20px; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/components/help/help.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/help/help.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/installed-software/install-software/install-software.component.html: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /src/app/components/installed-software/install-software/install-software.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/installed-software/install-software/install-software.component.scss -------------------------------------------------------------------------------- /src/app/components/installed-software/installed-software.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/installed-software/installed-software.component.scss -------------------------------------------------------------------------------- /src/app/components/page-not-found/page-not-found.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

404 Page not found

5 | 6 |
7 |
8 | -------------------------------------------------------------------------------- /src/app/components/page-not-found/page-not-found.component.scss: -------------------------------------------------------------------------------- 1 | div { 2 | text-align: center; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/components/page-not-found/page-not-found.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/page-not-found/page-not-found.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/page-not-found/page-not-found.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-page-not-found', 5 | templateUrl: './page-not-found.component.html', 6 | styleUrls: ['./page-not-found.component.scss'], 7 | }) 8 | export class PageNotFoundComponent { 9 | constructor() {} 10 | } 11 | -------------------------------------------------------------------------------- /src/app/components/preferences/built-in/built-in-preferences.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/built-in/built-in-preferences.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/built-in/built-in-preferences.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { ActivatedRoute } from '@angular/router'; 3 | 4 | @Component({ 5 | selector: 'app-built-in-preferences', 6 | templateUrl: './built-in-preferences.component.html', 7 | styleUrls: ['./built-in-preferences.component.scss', '../preferences.component.scss'], 8 | }) 9 | export class BuiltInPreferencesComponent implements OnInit { 10 | public serverId: string = ''; 11 | 12 | constructor(private route: ActivatedRoute) {} 13 | 14 | ngOnInit() { 15 | this.serverId = this.route.snapshot.paramMap.get('server_id'); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/components/preferences/built-in/cloud-nodes/cloud-nodes-add-template/cloud-nodes-add-template.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/built-in/cloud-nodes/cloud-nodes-add-template/cloud-nodes-add-template.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/built-in/cloud-nodes/cloud-nodes-template-details/cloud-nodes-template-details.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/built-in/cloud-nodes/cloud-nodes-template-details/cloud-nodes-template-details.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/built-in/cloud-nodes/cloud-nodes-templates/cloud-nodes-templates.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/built-in/cloud-nodes/cloud-nodes-templates/cloud-nodes-templates.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/built-in/ethernet-hubs/ethernet-hubs-add-template/ethernet-hubs-add-template.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/built-in/ethernet-hubs/ethernet-hubs-add-template/ethernet-hubs-add-template.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/built-in/ethernet-hubs/ethernet-hubs-template-details/ethernet-hubs-template-details.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/built-in/ethernet-hubs/ethernet-hubs-template-details/ethernet-hubs-template-details.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/built-in/ethernet-hubs/ethernet-hubs-templates/ethernet-hubs-templates.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/built-in/ethernet-hubs/ethernet-hubs-templates/ethernet-hubs-templates.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/built-in/ethernet-switches/ethernet-switches-add-template/ethernet-switches-add-template.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/built-in/ethernet-switches/ethernet-switches-add-template/ethernet-switches-add-template.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/built-in/ethernet-switches/ethernet-switches-template-details/ethernet-switches-template-details.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/built-in/ethernet-switches/ethernet-switches-template-details/ethernet-switches-template-details.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/built-in/ethernet-switches/ethernet-switches-templates/ethernet-switches-templates.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/built-in/ethernet-switches/ethernet-switches-templates/ethernet-switches-templates.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/common/custom-adapters/custom-adapters.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/common/custom-adapters/custom-adapters.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/common/delete-confirmation-dialog/delete-confirmation-dialog.component.html: -------------------------------------------------------------------------------- 1 |
2 |

Delete template

3 |
Are you sure you want to delete template {{ templateName }}?
4 | 5 |
6 | 7 |
8 | 9 | 12 |
13 |
14 | -------------------------------------------------------------------------------- /src/app/components/preferences/common/delete-confirmation-dialog/delete-confirmation-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .dialogcontainer { 2 | height: 100%; 3 | display: flex; 4 | flex-direction: column; 5 | } 6 | 7 | .spacer { 8 | flex-grow: 1; 9 | } 10 | -------------------------------------------------------------------------------- /src/app/components/preferences/common/delete-template-component/delete-template.component.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/common/delete-template-component/delete-template.component.html -------------------------------------------------------------------------------- /src/app/components/preferences/common/delete-template-component/delete-template.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/common/delete-template-component/delete-template.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/common/empty-templates-list/empty-templates-list.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | {{ emptyTemplatesListMessage }} 5 |
6 |
7 |
8 | -------------------------------------------------------------------------------- /src/app/components/preferences/common/empty-templates-list/empty-templates-list.component.scss: -------------------------------------------------------------------------------- 1 | .header { 2 | text-align: center; 3 | color: darkgray; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/components/preferences/common/empty-templates-list/empty-templates-list.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-empty-templates-list', 5 | templateUrl: './empty-templates-list.component.html', 6 | styleUrls: ['./empty-templates-list.component.scss'], 7 | }) 8 | export class EmptyTemplatesListComponent { 9 | @Input() textMessage: string; 10 | emptyTemplatesListMessage: string = 'Empty templates list'; 11 | 12 | constructor() { 13 | if (this.textMessage) { 14 | this.emptyTemplatesListMessage = this.textMessage; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/components/preferences/common/ports/ports.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/common/ports/ports.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/common/ports/ports.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/common/ports/ports.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/preferences/common/symbols-menu/symbols-menu.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Symbol selection

5 | 6 | 7 |
8 |
9 |
10 | 11 |
12 |
13 | -------------------------------------------------------------------------------- /src/app/components/preferences/common/symbols-menu/symbols-menu.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/common/symbols-menu/symbols-menu.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/docker/add-docker-template/add-docker-template.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/docker/add-docker-template/add-docker-template.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/docker/copy-docker-template/copy-docker-template.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/docker/copy-docker-template/copy-docker-template.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/docker/docker-template-details/docker-template-details.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/docker/docker-template-details/docker-template-details.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/docker/docker-templates/docker-templates.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/docker/docker-templates/docker-templates.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/dynamips/add-ios-template/add-ios-template.component.scss: -------------------------------------------------------------------------------- 1 | .non-visible { 2 | display: none; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/components/preferences/dynamips/copy-ios-template/copy-ios-template.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/dynamips/copy-ios-template/copy-ios-template.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/dynamips/dynamips-preferences/dynamips-preferences.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Dynamips preferences

5 |
6 |
7 |
8 | 9 | 10 | 11 |
12 |
13 | -------------------------------------------------------------------------------- /src/app/components/preferences/dynamips/dynamips-preferences/dynamips-preferences.component.scss: -------------------------------------------------------------------------------- 1 | .top-button { 2 | height: 36px; 3 | margin-top: 22px; 4 | } 5 | 6 | .form-field { 7 | width: 100%; 8 | } 9 | -------------------------------------------------------------------------------- /src/app/components/preferences/dynamips/ios-template-details/ios-template-details.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/dynamips/ios-template-details/ios-template-details.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/dynamips/ios-templates/ios-templates.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/dynamips/ios-templates/ios-templates.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/general/general-preferences.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

General preferences

5 |
6 |
7 |
8 |
9 |
10 |
11 | -------------------------------------------------------------------------------- /src/app/components/preferences/general/general-preferences.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/general/general-preferences.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/general/general-preferences.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { ActivatedRoute } from '@angular/router'; 3 | 4 | @Component({ 5 | selector: 'app-general-preferences', 6 | templateUrl: './general-preferences.component.html', 7 | styleUrls: ['./general-preferences.component.scss'], 8 | }) 9 | export class GeneralPreferencesComponent implements OnInit { 10 | public serverId: string = ''; 11 | 12 | constructor(private route: ActivatedRoute) {} 13 | 14 | ngOnInit() { 15 | this.serverId = this.route.snapshot.paramMap.get('server_id'); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/components/preferences/gns3vm/gns3vm.component.scss: -------------------------------------------------------------------------------- 1 | .form-field { 2 | width: 100%; 3 | } 4 | 5 | .select { 6 | width: 100%; 7 | } 8 | 9 | .radio-selection { 10 | display: flex; 11 | justify-content: space-between; 12 | } 13 | -------------------------------------------------------------------------------- /src/app/components/preferences/gns3vm/gns3vm.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/gns3vm/gns3vm.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/preferences/ios-on-unix/add-iou-template/add-iou-template.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/ios-on-unix/add-iou-template/add-iou-template.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/ios-on-unix/copy-iou-template/copy-iou-template.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/ios-on-unix/copy-iou-template/copy-iou-template.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/ios-on-unix/iou-template-details/iou-template-details.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/ios-on-unix/iou-template-details/iou-template-details.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/ios-on-unix/iou-templates/iou-templates.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/ios-on-unix/iou-templates/iou-templates.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/preferences.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { ActivatedRoute } from '@angular/router'; 3 | 4 | @Component({ 5 | selector: 'app-preferences', 6 | templateUrl: './preferences.component.html', 7 | styleUrls: ['./preferences.component.scss'], 8 | }) 9 | export class PreferencesComponent implements OnInit { 10 | public serverId: string = ''; 11 | 12 | constructor(private route: ActivatedRoute) {} 13 | 14 | ngOnInit() { 15 | this.serverId = this.route.snapshot.paramMap.get('server_id'); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/components/preferences/qemu/add-qemu-vm-template/add-qemu-vm-template.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/qemu/add-qemu-vm-template/add-qemu-vm-template.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/qemu/copy-qemu-vm-template/copy-qemu-vm-template.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/qemu/copy-qemu-vm-template/copy-qemu-vm-template.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/qemu/qemu-preferences/qemu-preferences.component.scss: -------------------------------------------------------------------------------- 1 | .top-button { 2 | height: 36px; 3 | margin-top: 22px; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/components/preferences/qemu/qemu-vm-template-details/qemu-vm-template-details.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/qemu/qemu-vm-template-details/qemu-vm-template-details.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/qemu/qemu-vm-templates/qemu-vm-templates.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/qemu/qemu-vm-templates/qemu-vm-templates.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/traceng/add-traceng/add-traceng-template.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/traceng/add-traceng/add-traceng-template.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/traceng/traceng-preferences/traceng-preferences.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

TraceNG preferences

5 |
6 |
7 |
8 | 9 | 10 | 11 |
12 |
13 | -------------------------------------------------------------------------------- /src/app/components/preferences/traceng/traceng-preferences/traceng-preferences.component.scss: -------------------------------------------------------------------------------- 1 | .form-field { 2 | width: 100%; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/components/preferences/traceng/traceng-template-details/traceng-template-details.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/traceng/traceng-template-details/traceng-template-details.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/traceng/traceng-templates/traceng-templates.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/traceng/traceng-templates/traceng-templates.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/virtual-box/add-virtual-box-template/add-virtual-box-template.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/virtual-box/add-virtual-box-template/add-virtual-box-template.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/virtual-box/virtual-box-preferences/virtual-box-preferences.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

VirtualBox preferences

5 |
6 |
7 |
8 | 9 | 10 | 11 |
12 |
13 | -------------------------------------------------------------------------------- /src/app/components/preferences/virtual-box/virtual-box-preferences/virtual-box-preferences.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/virtual-box/virtual-box-preferences/virtual-box-preferences.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/virtual-box/virtual-box-template-details/virtual-box-template-details.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/virtual-box/virtual-box-template-details/virtual-box-template-details.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/virtual-box/virtual-box-templates/virtual-box-templates.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/virtual-box/virtual-box-templates/virtual-box-templates.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/vmware/add-vmware-template/add-vmware-template.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/vmware/add-vmware-template/add-vmware-template.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/vmware/vmware-preferences/vmware-preferences.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

VMware preferences

5 |
6 |
7 |
8 | 9 | 10 | 11 |
12 |
13 | -------------------------------------------------------------------------------- /src/app/components/preferences/vmware/vmware-preferences/vmware-preferences.component.scss: -------------------------------------------------------------------------------- 1 | .form-field { 2 | width: 100%; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/components/preferences/vmware/vmware-template-details/vmware-template-details.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/vmware/vmware-template-details/vmware-template-details.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/vmware/vmware-templates/vmware-templates.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/vmware/vmware-templates/vmware-templates.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/vpcs/add-vpcs-template/add-vpcs-template.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/vpcs/vpcs-preferences/vpcs-preferences.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

VPCS preferences

5 |
6 |
7 |
8 | 9 | 10 | 11 |
12 |
13 | -------------------------------------------------------------------------------- /src/app/components/preferences/vpcs/vpcs-preferences/vpcs-preferences.component.scss: -------------------------------------------------------------------------------- 1 | .form-field { 2 | width: 100%; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/vpcs/vpcs-template-details/vpcs-template-details.component.scss -------------------------------------------------------------------------------- /src/app/components/preferences/vpcs/vpcs-templates/vpcs-templates.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/preferences/vpcs/vpcs-templates/vpcs-templates.component.scss -------------------------------------------------------------------------------- /src/app/components/project-map/change-hostname-dialog/change-hostname-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .form-field { 2 | width: 100%; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/components/project-map/change-symbol-dialog/change-symbol-dialog.component.html: -------------------------------------------------------------------------------- 1 |

Change symbol for node: {{ node.name }}

2 | 3 | 8 | 9 |
10 | 11 | 12 |
13 | -------------------------------------------------------------------------------- /src/app/components/project-map/change-symbol-dialog/change-symbol-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .symbolsWrapper { 2 | height: 350px; 3 | overflow-y: scroll; 4 | scrollbar-color: darkgrey #263238; 5 | scrollbar-width: thin; 6 | } 7 | 8 | ::-webkit-scrollbar { 9 | width: 0.5em; 10 | } 11 | 12 | ::-webkit-scrollbar-track { 13 | -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); 14 | } 15 | 16 | ::-webkit-scrollbar-thumb { 17 | background-color: darkgrey; 18 | outline: 1px solid #263238; 19 | } 20 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-console-menu/context-console-menu.component.scss: -------------------------------------------------------------------------------- 1 | .context-menu { 2 | position: absolute; 3 | min-height: 0px; 4 | } 5 | 6 | .mat-menu-panel 7 | ng-trigger 8 | ng-trigger-transformMenu 9 | ng-tns-c7-5 10 | context-menu-items 11 | mat-menu-after 12 | mat-menu-below 13 | ng-star-inserted 14 | mat-elevation-z4 { 15 | min-height: 0px !important; 16 | } 17 | 18 | .title { 19 | margin: 10px; 20 | } 21 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/align-horizontally/align-horizontally.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/align-horizontally/align-horizontally.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/project-map/context-menu/actions/align-horizontally/align-horizontally.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/align_vertically/align-vertically.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/align_vertically/align-vertically.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/project-map/context-menu/actions/align_vertically/align-vertically.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/bring-to-front-action/bring-to-front-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/change-hostname/change-hostname-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/change-symbol/change-symbol-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/change-symbol/change-symbol-action.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/project-map/context-menu/actions/change-symbol/change-symbol-action.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/config-action/config-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/config-action/config-action.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/project-map/context-menu/actions/config-action/config-action.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/console-device-action-browser/console-device-action-browser.component.html: -------------------------------------------------------------------------------- 1 | 5 | 13 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/console-device-action-browser/console-device-action-browser.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/project-map/context-menu/actions/console-device-action-browser/console-device-action-browser.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/console-device-action/console-device-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/delete-action/delete-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/duplicate-action/duplicate-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/edit-config/edit-config-action.component.html: -------------------------------------------------------------------------------- 1 | 9 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/edit-style-action/edit-style-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/edit-text-action/edit-text-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/export-config/export-config-action.component.html: -------------------------------------------------------------------------------- 1 | 9 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/http-console-new-tab/http-console-new-tab-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/http-console-new-tab/http-console-new-tab-action.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/project-map/context-menu/actions/http-console-new-tab/http-console-new-tab-action.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/http-console/http-console-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/http-console/http-console-action.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/project-map/context-menu/actions/http-console/http-console-action.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/import-config/import-config-action.component.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/import-config/import-config-action.component.scss: -------------------------------------------------------------------------------- 1 | .non-visible { 2 | display: none; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/lock-action/lock-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/move-layer-down-action/move-layer-down-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/move-layer-up-action/move-layer-up-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/open-file-explorer/open-file-explorer-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/open-file-explorer/open-file-explorer-action.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input, OnInit } from '@angular/core'; 2 | import { ElectronService } from 'ngx-electron'; 3 | import { Node } from '../../../../../cartography/models/node'; 4 | import { Server } from '../../../../../models/server'; 5 | 6 | @Component({ 7 | selector: 'app-open-file-explorer-action', 8 | templateUrl: './open-file-explorer-action.component.html', 9 | }) 10 | export class OpenFileExplorerActionComponent implements OnInit { 11 | @Input() server: Server; 12 | @Input() node: Node; 13 | 14 | constructor(private electronService: ElectronService) {} 15 | 16 | ngOnInit() {} 17 | 18 | open() { 19 | this.electronService.shell.openPath(this.node.node_directory); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/packet-filters-action/packet-filters-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/reload-node-action/reload-node-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/reload-node-action/reload-node-action.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/project-map/context-menu/actions/reload-node-action/reload-node-action.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/resume-link-action/resume-link-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/resume-link-action/resume-link-action.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | import { Link } from '../../../../../models/link'; 3 | import { Server } from '../../../../../models/server'; 4 | import { LinkService } from '../../../../../services/link.service'; 5 | 6 | @Component({ 7 | selector: 'app-resume-link-action', 8 | templateUrl: './resume-link-action.component.html', 9 | }) 10 | export class ResumeLinkActionComponent { 11 | @Input() server: Server; 12 | @Input() link: Link; 13 | 14 | constructor(private linkService: LinkService) {} 15 | 16 | resumeLink() { 17 | this.link.suspend = false; 18 | this.linkService.updateLink(this.server, this.link).subscribe(() => {}); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/show-node-action/show-node-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/start-capture-on-started-link/start-capture-on-started-link.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/start-capture/start-capture-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/start-node-action/start-node-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/stop-capture/stop-capture-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/stop-capture/stop-capture-action.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | import { Link } from '../../../../../models/link'; 3 | import { Server } from '../../../../../models/server'; 4 | import { LinkService } from '../../../../../services/link.service'; 5 | 6 | @Component({ 7 | selector: 'app-stop-capture-action', 8 | templateUrl: './stop-capture-action.component.html', 9 | }) 10 | export class StopCaptureActionComponent { 11 | @Input() server: Server; 12 | @Input() link: Link; 13 | 14 | constructor(private linkService: LinkService) {} 15 | 16 | stopCapture() { 17 | this.linkService.stopCaptureOnLink(this.server, this.link).subscribe(() => {}); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/stop-node-action/stop-node-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/suspend-link/suspend-link-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/suspend-link/suspend-link-action.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | import { Link } from '../../../../../models/link'; 3 | import { Server } from '../../../../../models/server'; 4 | import { LinkService } from '../../../../../services/link.service'; 5 | 6 | @Component({ 7 | selector: 'app-suspend-link-action', 8 | templateUrl: './suspend-link-action.component.html', 9 | }) 10 | export class SuspendLinkActionComponent { 11 | @Input() server: Server; 12 | @Input() link: Link; 13 | 14 | constructor(private linkService: LinkService) {} 15 | 16 | suspendLink() { 17 | this.link.suspend = true; 18 | this.linkService.updateLink(this.server, this.link).subscribe(() => {}); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/suspend-node-action/suspend-node-action.component.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/actions/suspend-node-action/suspend-node-action.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/project-map/context-menu/actions/suspend-node-action/suspend-node-action.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/context-menu.component.scss: -------------------------------------------------------------------------------- 1 | .context-menu { 2 | position: absolute; 3 | min-height: 0px; 4 | } 5 | 6 | .mat-menu-panel 7 | ng-trigger 8 | ng-trigger-transformMenu 9 | ng-tns-c7-5 10 | context-menu-items 11 | mat-menu-after 12 | mat-menu-below 13 | ng-star-inserted 14 | mat-elevation-z4 { 15 | min-height: 0px !important; 16 | } 17 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/dialogs/config-dialog/config-dialog.component.html: -------------------------------------------------------------------------------- 1 |

Choose configuration file

2 | 3 | 13 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/dialogs/config-dialog/config-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | width: 100%; 3 | display: flex; 4 | justify-content: space-between; 5 | } 6 | -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/dialogs/config-dialog/config-dialog.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/project-map/context-menu/dialogs/config-dialog/config-dialog.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/project-map/context-menu/dialogs/config-dialog/config-dialog.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { MatDialogRef } from '@angular/material/dialog'; 3 | 4 | @Component({ 5 | selector: 'app-config-dialog', 6 | templateUrl: './config-dialog.component.html', 7 | styleUrls: ['./config-dialog.component.scss'], 8 | }) 9 | export class ConfigDialogComponent { 10 | constructor(public dialogRef: MatDialogRef) {} 11 | 12 | close(fileType: string) { 13 | this.dialogRef.close(fileType); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/app/components/project-map/draw-link-tool/draw-link-tool.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/app/components/project-map/draw-link-tool/draw-link-tool.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/project-map/draw-link-tool/draw-link-tool.component.scss -------------------------------------------------------------------------------- /src/app/components/project-map/help-dialog/help-dialog.component.html: -------------------------------------------------------------------------------- 1 |

{{ title }}

2 | 3 | 13 | 14 |
15 | 16 |
17 | -------------------------------------------------------------------------------- /src/app/components/project-map/help-dialog/help-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .message { 2 | margin-bottom: 10px; 3 | } 4 | 5 | .description { 6 | color: #b0bec5; 7 | } 8 | -------------------------------------------------------------------------------- /src/app/components/project-map/help-dialog/help-dialog.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | import { MatDialogRef } from '@angular/material/dialog'; 3 | import { Message } from '../../../models/message'; 4 | 5 | @Component({ 6 | selector: 'app-help-dialog', 7 | templateUrl: './help-dialog.component.html', 8 | styleUrls: ['./help-dialog.component.scss'], 9 | }) 10 | export class HelpDialogComponent { 11 | @Input() title: string; 12 | @Input() messages: Message[]; 13 | 14 | constructor(public dialogRef: MatDialogRef) {} 15 | 16 | onCloseClick() { 17 | this.dialogRef.close(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/app/components/project-map/import-appliance/import-appliance.component.html: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /src/app/components/project-map/import-appliance/import-appliance.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/project-map/import-appliance/import-appliance.component.scss -------------------------------------------------------------------------------- /src/app/components/project-map/import-appliance/import-appliance.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/project-map/import-appliance/import-appliance.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/project-map/info-dialog/info-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .textBox { 2 | margin-top: 10px; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/components/project-map/log-console/log-events-datasource.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { DataSource } from '../../../cartography/datasources/datasource'; 3 | import { LogEvent } from '../../../models/logEvent'; 4 | 5 | @Injectable() 6 | export class LogEventsDataSource extends DataSource { 7 | protected getItemKey(log: LogEvent) { 8 | return log; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/app/components/project-map/new-template-dialog/appliance-info-dialog/appliance-info-dialog.component.html: -------------------------------------------------------------------------------- 1 |
2 |

{{ appliance.name }}

3 |
4 |
5 |
Vendor: {{ appliance.vendor_name }}
6 |
Status: {{ appliance.status }}
7 |
Maintainer: {{ appliance.maintainer }}
8 |
Adapters: {{ appliance.qemu.adapters }}
9 |
Console type: {{ appliance.qemu.console_type }}
10 |
11 |
12 | 13 |
14 | -------------------------------------------------------------------------------- /src/app/components/project-map/new-template-dialog/appliance-info-dialog/appliance-info-dialog.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/project-map/new-template-dialog/appliance-info-dialog/appliance-info-dialog.component.scss -------------------------------------------------------------------------------- /src/app/components/project-map/new-template-dialog/appliance-info-dialog/appliance-info-dialog.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Inject } from '@angular/core'; 2 | import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; 3 | import { Appliance } from '../../../../models/appliance'; 4 | 5 | @Component({ 6 | selector: 'appliance-info-dialog', 7 | templateUrl: 'appliance-info-dialog.component.html', 8 | }) 9 | export class ApplianceInfoDialogComponent { 10 | public appliance: Appliance; 11 | 12 | constructor( 13 | public dialogRef: MatDialogRef, 14 | @Inject(MAT_DIALOG_DATA) public data: any 15 | ) {} 16 | 17 | onNoClick(): void { 18 | this.dialogRef.close(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/components/project-map/new-template-dialog/template-name-dialog/template-name-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .file-name-form-field { 2 | width: 100%; 3 | } 4 | 5 | .project-snackbar { 6 | background: #2196f3; 7 | } 8 | -------------------------------------------------------------------------------- /src/app/components/project-map/node-editors/config-editor/config-editor.component.scss: -------------------------------------------------------------------------------- 1 | .textArea { 2 | width: 100%; 3 | height: 350px; 4 | } 5 | 6 | .textAreaTab { 7 | width: 100%; 8 | height: 300px; 9 | } 10 | -------------------------------------------------------------------------------- /src/app/components/project-map/node-editors/configurator/docker/configure-custom-adapters/configure-custom-adapters.component.scss: -------------------------------------------------------------------------------- 1 | th { 2 | border: 0px !important; 3 | } 4 | 5 | th.mat-header-cell { 6 | padding-bottom: 15px; 7 | } 8 | 9 | td.mat-cell { 10 | padding-top: 15px; 11 | } 12 | 13 | .header { 14 | display: flex; 15 | justify-content: space-between; 16 | width: 100%; 17 | } 18 | 19 | .column { 20 | width: 50%; 21 | } 22 | -------------------------------------------------------------------------------- /src/app/components/project-map/node-editors/configurator/docker/edit-network-configuration/edit-network-configuration.component.html: -------------------------------------------------------------------------------- 1 |

Edit network configuration for node {{ node.name }}

2 | 3 | 6 | 7 |
8 | 9 | 10 |
11 | -------------------------------------------------------------------------------- /src/app/components/project-map/node-editors/configurator/docker/edit-network-configuration/edit-network-configuration.component.scss: -------------------------------------------------------------------------------- 1 | .textArea { 2 | width: 100%; 3 | height: 350px; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/node-select-interface/node-select-interface.component.scss: -------------------------------------------------------------------------------- 1 | .context-menu { 2 | position: absolute; 3 | } 4 | 5 | .context-menu-items { 6 | min-height: 0px !important; 7 | } 8 | 9 | .status { 10 | margin-right: 10px; 11 | } 12 | 13 | .port { 14 | margin-left: 10px; 15 | } 16 | -------------------------------------------------------------------------------- /src/app/components/project-map/nodes-menu/nodes-menu.component.scss: -------------------------------------------------------------------------------- 1 | .menu-button { 2 | margin: 0px 5px !important; 3 | } 4 | 5 | .marked { 6 | color: #0097a7 !important; 7 | } 8 | -------------------------------------------------------------------------------- /src/app/components/project-map/packet-capturing/start-capture/start-capture.component.scss: -------------------------------------------------------------------------------- 1 | .input-field { 2 | width: 100%; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/components/project-map/project-map-menu/project-map-menu.component.scss: -------------------------------------------------------------------------------- 1 | .non-visible { 2 | display: none; 3 | } 4 | 5 | .unmarked { 6 | color: white !important; 7 | } 8 | 9 | .unmarkedLight { 10 | color: black !important; 11 | } 12 | 13 | .marked { 14 | color: #0097a7 !important; 15 | } 16 | -------------------------------------------------------------------------------- /src/app/components/project-map/screenshot-dialog/screenshot-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .name-form { 2 | width: 100%; 3 | } 4 | 5 | .radio-group { 6 | display: flex; 7 | justify-content: space-between; 8 | } 9 | -------------------------------------------------------------------------------- /src/app/components/project-map/web-console/web-console.component.html: -------------------------------------------------------------------------------- 1 |
2 | -------------------------------------------------------------------------------- /src/app/components/project-map/web-console/web-console.component.scss: -------------------------------------------------------------------------------- 1 | .lightTheme { 2 | background: white !important; 3 | color: black !important; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/components/project-map/web-console/web-console.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/project-map/web-console/web-console.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/projects/add-blank-project-dialog/add-blank-project-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .file-name-form-field { 2 | width: 100%; 3 | } 4 | 5 | .project-snackbar { 6 | background: #2196f3; 7 | } 8 | -------------------------------------------------------------------------------- /src/app/components/projects/choose-name-dialog/choose-name-dialog.component.html: -------------------------------------------------------------------------------- 1 |

Please choose name for exporting project

2 | 3 | 8 | 9 |
10 | 11 | 12 |
13 | -------------------------------------------------------------------------------- /src/app/components/projects/choose-name-dialog/choose-name-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .form-field { 2 | width: 100%; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/components/projects/confirmation-bottomsheet/confirmation-bottomsheet.component.html: -------------------------------------------------------------------------------- 1 |
2 |
{{ message }}
3 |
4 | 5 | 6 |
7 |
8 | -------------------------------------------------------------------------------- /src/app/components/projects/confirmation-bottomsheet/confirmation-bottomsheet.component.scss: -------------------------------------------------------------------------------- 1 | .dialogWrapper { 2 | background-color: #263238; 3 | padding: 10px 20px; 4 | margin-bottom: -8px; 5 | display: flex; 6 | justify-content: space-between; 7 | align-items: center; 8 | } 9 | 10 | .lightTheme { 11 | background-color: white !important; 12 | } 13 | 14 | .title { 15 | margin-right: 10px; 16 | margin-left: 10px; 17 | } 18 | -------------------------------------------------------------------------------- /src/app/components/projects/confirmation-dialog/confirmation-dialog.component.html: -------------------------------------------------------------------------------- 1 | {{ confirmationMessage }} 2 |
3 | 4 | 7 |
8 |
9 | -------------------------------------------------------------------------------- /src/app/components/projects/confirmation-dialog/confirmation-dialog.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/projects/confirmation-dialog/confirmation-dialog.component.scss -------------------------------------------------------------------------------- /src/app/components/projects/edit-project-dialog/edit-project-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .form-field { 2 | width: 100%; 3 | } 4 | 5 | th { 6 | border: 0px !important; 7 | } 8 | 9 | th.mat-header-cell { 10 | padding-bottom: 15px; 11 | } 12 | 13 | td.mat-cell { 14 | padding-top: 15px; 15 | } 16 | -------------------------------------------------------------------------------- /src/app/components/projects/import-project-dialog/import-project-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .non-visible { 2 | display: none; 3 | } 4 | 5 | .file-button { 6 | width: 100%; 7 | margin-top: 5px; 8 | margin-bottom: 10px; 9 | padding: 0px; 10 | } 11 | 12 | .file-name-form { 13 | float: right; 14 | width: 100%; 15 | } 16 | 17 | .file-name-form-field { 18 | width: 90%; 19 | } 20 | 21 | .empty { 22 | width: 100%; 23 | } 24 | 25 | .delete-button { 26 | background: transparent; 27 | border: none; 28 | outline: 0; 29 | width: 10%; 30 | } 31 | 32 | .delete-icon { 33 | vertical-align: 'middle'; 34 | } 35 | 36 | .result-message-box { 37 | margin-top: 10px; 38 | text-align: center; 39 | } 40 | 41 | .progress-bar { 42 | background-color: #0097a7; 43 | } 44 | -------------------------------------------------------------------------------- /src/app/components/projects/models/projectNameValidator.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | @Injectable() 4 | export class ProjectNameValidator { 5 | get(projectName) { 6 | var pattern = new RegExp(/[~`!#$%\^&*+=\[\]\\';,/{}|\\"<>\?]/); 7 | 8 | if (!pattern.test(projectName.value)) { 9 | return null; 10 | } 11 | 12 | return { invalidName: true }; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/app/components/projects/navigation-dialog/navigation-dialog.component.html: -------------------------------------------------------------------------------- 1 |
2 |
Do you want to navigate to {{ projectMessage }}?
3 |
4 | 5 | 6 |
7 |
8 | -------------------------------------------------------------------------------- /src/app/components/projects/navigation-dialog/navigation-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .dialogWrapper { 2 | background-color: #263238; 3 | padding: 10px 20px; 4 | margin-bottom: -8px; 5 | display: flex; 6 | justify-content: space-between; 7 | align-items: center; 8 | } 9 | 10 | .lightTheme { 11 | background-color: white !important; 12 | } 13 | 14 | .title { 15 | margin-right: 10px; 16 | margin-left: 10px; 17 | } 18 | -------------------------------------------------------------------------------- /src/app/components/projects/projects.component.scss: -------------------------------------------------------------------------------- 1 | .import-button { 2 | height: 40px; 3 | width: 160px; 4 | margin: 20px; 5 | } 6 | 7 | .add-button { 8 | height: 40px; 9 | width: 160px; 10 | margin: 20px; 11 | } 12 | 13 | .full-width { 14 | width: 940px; 15 | margin-left: -470px; 16 | left: 50%; 17 | } 18 | 19 | .row { 20 | display: flex; 21 | } 22 | -------------------------------------------------------------------------------- /src/app/components/projects/save-project-dialog/save-project-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .file-name-form-field { 2 | width: 100%; 3 | } 4 | 5 | .project-snackbar { 6 | background: #2196f3; 7 | } 8 | -------------------------------------------------------------------------------- /src/app/components/servers/add-server-dialog/add-server-dialog.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/servers/add-server-dialog/add-server-dialog.component.scss -------------------------------------------------------------------------------- /src/app/components/servers/configure-gns3vm-dialog/configure-gns3vm-dialog.component.html: -------------------------------------------------------------------------------- 1 | {{ message }} 2 |
3 | 4 | 7 |
8 | -------------------------------------------------------------------------------- /src/app/components/servers/configure-gns3vm-dialog/configure-gns3vm-dialog.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/servers/configure-gns3vm-dialog/configure-gns3vm-dialog.component.scss -------------------------------------------------------------------------------- /src/app/components/servers/configure-gns3vm-dialog/configure-gns3vm-dialog.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { MatDialogRef } from '@angular/material/dialog'; 3 | 4 | @Component({ 5 | selector: 'app-configure-gns3-vm-dialog', 6 | templateUrl: 'configure-gns3vm-dialog.component.html', 7 | styleUrls: ['configure-gns3vm-dialog.component.scss'], 8 | }) 9 | export class ConfigureGns3VMDialogComponent implements OnInit { 10 | public message: string = 'Do you want to configure GNS3 VM?'; 11 | constructor(public dialogRef: MatDialogRef) {} 12 | 13 | ngOnInit() {} 14 | 15 | onNoClick(): void { 16 | this.dialogRef.close(false); 17 | } 18 | 19 | onYesClick(): void { 20 | this.dialogRef.close(true); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/app/components/servers/server-discovery/server-discovery.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | We've discovered GNS3 server on {{ discoveredServer.host }}:{{ discoveredServer.port }}, would you like to add to the list? 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/app/components/servers/server-discovery/server-discovery.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/servers/server-discovery/server-discovery.component.scss -------------------------------------------------------------------------------- /src/app/components/servers/servers.component.scss: -------------------------------------------------------------------------------- 1 | .buttons-bar { 2 | padding-top: 0px; 3 | } 4 | 5 | .button { 6 | margin: 20px !important; 7 | } 8 | -------------------------------------------------------------------------------- /src/app/components/servers/servers.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | import { ServersComponent } from './servers.component'; 3 | 4 | describe('ServersComponent', () => { 5 | let component: ServersComponent; 6 | let fixture: ComponentFixture; 7 | 8 | beforeEach(async(() => { 9 | TestBed.configureTestingModule({ 10 | declarations: [ServersComponent], 11 | }).compileComponents(); 12 | })); 13 | 14 | beforeEach(() => { 15 | fixture = TestBed.createComponent(ServersComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /src/app/components/settings/console/console.component.scss: -------------------------------------------------------------------------------- 1 | .help { 2 | font-size: 14px; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/components/settings/settings.component.scss: -------------------------------------------------------------------------------- 1 | .theme-panel { 2 | justify-content: space-between; 3 | display: flex; 4 | padding: 10px; 5 | } 6 | 7 | .fullWidth { 8 | width: 100%; 9 | } 10 | -------------------------------------------------------------------------------- /src/app/components/snapshots/create-snapshot-dialog/create-snapshot-dialog.component.scss: -------------------------------------------------------------------------------- 1 | .title-container { 2 | display: flex; 3 | align-items: baseline; 4 | justify-content: space-between; 5 | } 6 | 7 | .name-input { 8 | width: 100%; 9 | } 10 | 11 | .top-button { 12 | outline: none; 13 | box-shadow: none !important; 14 | background: transparent !important; 15 | } 16 | 17 | button:focus { 18 | outline: 0 !important; 19 | border: 0 !important; 20 | box-shadow: none !important; 21 | } 22 | -------------------------------------------------------------------------------- /src/app/components/snapshots/list-of-snapshots/list-of-snapshots.component.scss: -------------------------------------------------------------------------------- 1 | .filter-field { 2 | width: 100%; 3 | } 4 | 5 | .mat-table { 6 | margin: -16px !important; 7 | } 8 | -------------------------------------------------------------------------------- /src/app/components/snapshots/snapshot-menu-item/snapshot-menu-item.component.html: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /src/app/components/snapshots/snapshot-menu-item/snapshot-menu-item.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/snapshots/snapshot-menu-item/snapshot-menu-item.component.scss -------------------------------------------------------------------------------- /src/app/components/system-status/status-chart/status-chart.component.scss: -------------------------------------------------------------------------------- 1 | .wrapper { 2 | width: 100%; 3 | display: flex; 4 | justify-content: space-between; 5 | max-height: 250px !important; 6 | } 7 | 8 | .chips-wrapper { 9 | width: 100%; 10 | display: flex; 11 | justify-content: space-between; 12 | margin-bottom: 10px; 13 | } 14 | -------------------------------------------------------------------------------- /src/app/components/system-status/status-chart/status-chart.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/system-status/status-chart/status-chart.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/system-status/status-info/status-info.component.html: -------------------------------------------------------------------------------- 1 |
Statistics not loaded
2 |
3 | {{ statistics.compute_name }} 4 | 5 |
6 | -------------------------------------------------------------------------------- /src/app/components/system-status/status-info/status-info.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/system-status/status-info/status-info.component.scss -------------------------------------------------------------------------------- /src/app/components/system-status/status-info/status-info.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/system-status/status-info/status-info.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/system-status/system-status.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

System status

5 |
6 |
7 |
8 | 9 |
10 |
11 | -------------------------------------------------------------------------------- /src/app/components/system-status/system-status.component.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/system-status/system-status.component.scss -------------------------------------------------------------------------------- /src/app/components/system-status/system-status.component.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/components/system-status/system-status.component.spec.ts -------------------------------------------------------------------------------- /src/app/components/system-status/system-status.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { ActivatedRoute } from '@angular/router'; 3 | 4 | @Component({ 5 | selector: 'app-system-status', 6 | templateUrl: './system-status.component.html', 7 | styleUrls: ['./system-status.component.scss'], 8 | }) 9 | export class SystemStatusComponent implements OnInit { 10 | public serverId: string = ''; 11 | 12 | constructor(private route: ActivatedRoute) {} 13 | 14 | ngOnInit() { 15 | this.serverId = this.route.snapshot.paramMap.get('server_id'); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/components/template/template.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 2 | import { TemplateComponent } from './template.component'; 3 | 4 | describe('TemplateComponent', () => { 5 | let component: TemplateComponent; 6 | let fixture: ComponentFixture; 7 | 8 | beforeEach(async(() => { 9 | TestBed.configureTestingModule({ 10 | declarations: [TemplateComponent], 11 | }).compileComponents(); 12 | })); 13 | 14 | beforeEach(() => { 15 | fixture = TestBed.createComponent(TemplateComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | // it('should create', () => { 21 | // expect(component).toBeTruthy(); 22 | // }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/components/web-console-full-window/web-console-full-window.component.html: -------------------------------------------------------------------------------- 1 |
2 | -------------------------------------------------------------------------------- /src/app/converters/converter.ts: -------------------------------------------------------------------------------- 1 | export interface Converter { 2 | convert(from: TSource): TDestination; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/directives/LazyImg.directive.ts: -------------------------------------------------------------------------------- 1 | import { Directive, ElementRef } from '@angular/core'; 2 | 3 | @Directive({ selector: '[lazyimg]' }) 4 | export class LazyImgDirective { 5 | constructor({ nativeElement }: ElementRef) { 6 | const supports = 'loading' in HTMLImageElement.prototype; 7 | 8 | if (supports) { 9 | nativeElement.setAttribute('loading', 'lazy'); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/app/event-bus/index.js: -------------------------------------------------------------------------------- 1 | import Eev from 'eev' 2 | 3 | export const e = new Eev() 4 | 5 | export default e 6 | -------------------------------------------------------------------------------- /src/app/filters/dataSourceFilter.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'datasourcefilter', 5 | }) 6 | export class DataSourceFilter implements PipeTransform { 7 | transform(items: any, searchText: string): any[] { 8 | if (!items) return []; 9 | if (!searchText) return items; 10 | 11 | searchText = searchText.toLowerCase(); 12 | return items.filteredData.filter((item) => { 13 | return item.name.toLowerCase().includes(searchText); 14 | }); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/app/filters/dateFilter.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'datefilter', 5 | }) 6 | export class DateFilter implements PipeTransform { 7 | transform(timestamp: string): string { 8 | let date = new Date(+timestamp * 1000); 9 | 10 | let hours = date.getHours(); 11 | let minutes = '0' + date.getMinutes(); 12 | let seconds = '0' + date.getSeconds(); 13 | 14 | let year = date.getFullYear(); 15 | let month = date.getMonth() + 1; 16 | let day = date.getDate(); 17 | 18 | return hours + ':' + minutes.substr(-2) + ':' + seconds.substr(-2) + ' ' + day + '/' + month + '/' + year; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/filters/nameFilter.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'namefilter', 5 | }) 6 | export class NameFilter implements PipeTransform { 7 | transform(items: any[], searchText: string): any[] { 8 | if (!items) return []; 9 | if (!searchText) return items; 10 | 11 | searchText = searchText.toLowerCase(); 12 | return items.filter((item) => { 13 | return item.name.toLowerCase().includes(searchText); 14 | }); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/app/filters/projectsFilter.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | import { ProjectDataSource } from '../components/projects/projects.component'; 3 | 4 | @Pipe({ 5 | name: 'projectsfilter', 6 | }) 7 | export class ProjectsFilter implements PipeTransform { 8 | transform(items: ProjectDataSource, searchText: string) { 9 | if (!items) return []; 10 | if (!searchText) return items; 11 | 12 | searchText = searchText.toLowerCase(); 13 | return items.projectDatabase.data.filter((item) => { 14 | return item.filename.toLowerCase().includes(searchText); 15 | }); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/filters/searchFilter.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | 3 | @Pipe({ 4 | name: 'filenamefilter', 5 | }) 6 | export class SearchFilter implements PipeTransform { 7 | transform(items: any[], searchText: string): any[] { 8 | if (!items) return []; 9 | if (!searchText) return items; 10 | 11 | searchText = searchText.toLowerCase(); 12 | return items.filter((item) => { 13 | return item.filename.toLowerCase().includes(searchText); 14 | }); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/app/filters/templateFilter.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Pipe, PipeTransform } from '@angular/core'; 2 | import { Template } from '../models/template'; 3 | 4 | @Pipe({ 5 | name: 'templatefilter', 6 | }) 7 | export class TemplateFilter implements PipeTransform { 8 | transform(items: Template[], searchText: string): any[] { 9 | if (!items) return []; 10 | if (!searchText) return items; 11 | 12 | searchText = searchText.toLowerCase(); 13 | return items.filter((item) => { 14 | return item.name.toLowerCase().includes(searchText); 15 | }); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/app/models/adbutler.ts: -------------------------------------------------------------------------------- 1 | export interface Placement1 { 2 | banner_id: string; 3 | width: string; 4 | height: string; 5 | alt_text: string; 6 | accompanied_html: string; 7 | target: string; 8 | tracking_pixel: string; 9 | body: string; 10 | redirect_url: string; 11 | refresh_url: string; 12 | refresh_time: string; 13 | image_url: string; 14 | } 15 | 16 | export interface Placements { 17 | placement_1: Placement1; 18 | } 19 | 20 | export interface AdButlerResponse { 21 | status: string; 22 | placements: Placements; 23 | } 24 | -------------------------------------------------------------------------------- /src/app/models/capturingSettings.ts: -------------------------------------------------------------------------------- 1 | export class CapturingSettings { 2 | capture_file_name: string; 3 | data_link_type: string; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/models/compute.ts: -------------------------------------------------------------------------------- 1 | export interface Capabilities { 2 | node_types: string[]; 3 | platform: string; 4 | version: string; 5 | } 6 | 7 | export interface Compute { 8 | capabilities: Capabilities; 9 | compute_id: string; 10 | connected: boolean; 11 | cpu_usage_percent: number; 12 | host: string; 13 | last_error?: any; 14 | memory_usage_percent: number; 15 | name: string; 16 | port: number; 17 | protocol: string; 18 | user: string; 19 | } 20 | -------------------------------------------------------------------------------- /src/app/models/computeStatistics.ts: -------------------------------------------------------------------------------- 1 | export interface Statistics { 2 | cpu_usage_percent: number; 3 | disk_usage_percent: number; 4 | load_average_percent: number[]; 5 | memory_free: number; 6 | memory_total: number; 7 | memory_usage_percent: number; 8 | memory_used: number; 9 | swap_free: number; 10 | swap_total: number; 11 | swap_usage_percent: number; 12 | swap_used: number; 13 | } 14 | 15 | export interface ComputeStatistics { 16 | compute_id: string; 17 | compute_name: string; 18 | statistics: Statistics; 19 | } 20 | -------------------------------------------------------------------------------- /src/app/models/docker/docker-image.ts: -------------------------------------------------------------------------------- 1 | export class DockerImage { 2 | image: string; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/models/ethernetHub/ports-mapping-enity.ts: -------------------------------------------------------------------------------- 1 | export interface PortsMappingEntity { 2 | ethertype?: string; 3 | interface?: string; 4 | name: string; 5 | port_number: number; 6 | type?: string; 7 | vlan?: number; 8 | rhost?: string; 9 | lport?: number; 10 | rport?: number; 11 | } 12 | -------------------------------------------------------------------------------- /src/app/models/filter-description.ts: -------------------------------------------------------------------------------- 1 | export class FilterDescription { 2 | description: string; 3 | name: string; 4 | parameters: Parameter[]; 5 | type: string; 6 | } 7 | 8 | interface Parameter { 9 | maximum?: number; 10 | minimum?: number; 11 | name: string; 12 | type: string; 13 | unit?: string; 14 | } 15 | -------------------------------------------------------------------------------- /src/app/models/filter.ts: -------------------------------------------------------------------------------- 1 | export class Filter { 2 | bpf?: string[]; 3 | corrupt?: number[]; 4 | delay?: number[]; 5 | frequency_drop?: number[]; 6 | packet_loss?: number[]; 7 | } 8 | -------------------------------------------------------------------------------- /src/app/models/gns3vm/gns3vm.ts: -------------------------------------------------------------------------------- 1 | export interface Gns3vm { 2 | enable: boolean; 3 | engine: string; 4 | headless: boolean; 5 | port: number; 6 | ram: number; 7 | vcpus: number; 8 | vmname: string; 9 | when_exit: string; 10 | } 11 | -------------------------------------------------------------------------------- /src/app/models/gns3vm/gns3vmEngine.ts: -------------------------------------------------------------------------------- 1 | export interface Gns3vmEngine { 2 | description: string; 3 | engine_id: string; 4 | name: string; 5 | support_headless: boolean; 6 | support_ram: boolean; 7 | support_when_exit: boolean; 8 | } 9 | -------------------------------------------------------------------------------- /src/app/models/gns3vm/vm.ts: -------------------------------------------------------------------------------- 1 | export interface VM { 2 | vmname: string; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/models/images/ios-image.ts: -------------------------------------------------------------------------------- 1 | export interface IosImage { 2 | filename: string; 3 | filesize: number; 4 | md5sum: string; 5 | path: string; 6 | } 7 | -------------------------------------------------------------------------------- /src/app/models/iou/iou-image.ts: -------------------------------------------------------------------------------- 1 | export class IouImage { 2 | filename: string; 3 | filesize: number; 4 | md5sum: string; 5 | path: string; 6 | } 7 | -------------------------------------------------------------------------------- /src/app/models/link-node.ts: -------------------------------------------------------------------------------- 1 | import { Label } from '../cartography/models/label'; 2 | 3 | export class LinkNode { 4 | node_id: string; 5 | adapter_number: number; 6 | port_number: number; 7 | label: Label; 8 | } 9 | -------------------------------------------------------------------------------- /src/app/models/link.ts: -------------------------------------------------------------------------------- 1 | import { Node } from '../cartography/models/node'; 2 | import { Filter } from './filter'; 3 | import { LinkNode } from './link-node'; 4 | 5 | export class Link { 6 | capture_file_name: string; 7 | capture_file_path: string; 8 | capturing: boolean; 9 | filters?: Filter; 10 | link_id: string; 11 | link_type: string; 12 | nodes: LinkNode[]; 13 | project_id: string; 14 | suspend: boolean; 15 | 16 | distance: number; // this is not from server 17 | length: number; // this is not from server 18 | source: Node; // this is not from server 19 | target: Node; // this is not from server 20 | 21 | x: number; // this is not from server 22 | y: number; // this is not from server 23 | } 24 | -------------------------------------------------------------------------------- /src/app/models/logEvent.ts: -------------------------------------------------------------------------------- 1 | export class LogEvent { 2 | type: string; 3 | message: string; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/models/message.ts: -------------------------------------------------------------------------------- 1 | export class Message { 2 | name?: string; 3 | description: string; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/models/port.ts: -------------------------------------------------------------------------------- 1 | export class Port { 2 | adapter_number: number; 3 | adapter_type: string; 4 | link_type: string; 5 | name: string; 6 | port_number: number; 7 | short_name: string; 8 | available?: boolean; 9 | } 10 | -------------------------------------------------------------------------------- /src/app/models/project-statistics.ts: -------------------------------------------------------------------------------- 1 | export class ProjectStatistics { 2 | drawings: number; 3 | links: number; 4 | nodes: number; 5 | snapshots: number; 6 | } 7 | -------------------------------------------------------------------------------- /src/app/models/project.ts: -------------------------------------------------------------------------------- 1 | export class Project { 2 | auto_close: boolean; 3 | auto_open: boolean; 4 | auto_start: boolean; 5 | drawing_grid_size: number; 6 | filename: string; 7 | grid_size: number; 8 | name: string; 9 | path: string; 10 | project_id: string; 11 | scene_height: number; 12 | scene_width: number; 13 | status: string; 14 | readonly: boolean; 15 | show_interface_labels: boolean; 16 | show_layers: boolean; 17 | show_grid: boolean; 18 | snap_to_grid: boolean; 19 | variables: ProjectVariable[]; 20 | } 21 | 22 | export class ProjectVariable { 23 | name: string; 24 | value: string; 25 | } 26 | -------------------------------------------------------------------------------- /src/app/models/qemu/qemu-binary.ts: -------------------------------------------------------------------------------- 1 | export class QemuBinary { 2 | path: string; 3 | version: string; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/models/qemu/qemu-custom-adapter.ts: -------------------------------------------------------------------------------- 1 | export class CustomAdapter { 2 | adapter_number: number; 3 | adapter_type: string; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/models/qemu/qemu-image.ts: -------------------------------------------------------------------------------- 1 | export class QemuImage { 2 | filename: string; 3 | filesize: number; 4 | md5sum: string; 5 | path: string; 6 | } 7 | -------------------------------------------------------------------------------- /src/app/models/qemu/qemu-img.ts: -------------------------------------------------------------------------------- 1 | export class QemuImg { 2 | cluster_size: number; 3 | format: string; 4 | lazy_refcounts: string; 5 | path: string; 6 | preallocation: string; 7 | qemu_img: string; 8 | refcount_bits: number; 9 | size: number; 10 | subformat: string; 11 | zeroed_grain: string; 12 | } 13 | -------------------------------------------------------------------------------- /src/app/models/server-settings-models/builtin.ts: -------------------------------------------------------------------------------- 1 | export class Builtin { 2 | default_nat_interface: string; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/models/server-settings-models/docker.ts: -------------------------------------------------------------------------------- 1 | export class Docker { 2 | containers: any[]; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/models/server-settings-models/dynamips.ts: -------------------------------------------------------------------------------- 1 | export class Dynamips { 2 | allocate_aux_console_ports: string; 3 | dynamips_path: string; 4 | ghost_ios_support: string; 5 | mmap_support: string; 6 | sparse_memory_support: string; 7 | } 8 | -------------------------------------------------------------------------------- /src/app/models/server-settings-models/graphics-view.ts: -------------------------------------------------------------------------------- 1 | export class GraphicsView { 2 | default_label_color: string; 3 | default_label_font: string; 4 | default_note_color: string; 5 | default_note_font: string; 6 | draw_link_status_points: boolean; 7 | draw_rectangle_selected_item: boolean; 8 | grid_size: number; 9 | scene_height: number; 10 | scene_width: 2000; 11 | show_grid: boolean; 12 | show_interface_labels: boolean; 13 | show_interface_labels_on_new_project: boolean; 14 | show_layers: boolean; 15 | snap_to_grid: boolean; 16 | zoom: any; 17 | } 18 | -------------------------------------------------------------------------------- /src/app/models/server-settings-models/iou.ts: -------------------------------------------------------------------------------- 1 | export class IOU { 2 | iourc_content: ''; 3 | license_check: boolean; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/models/server-settings-models/qemu.ts: -------------------------------------------------------------------------------- 1 | export class Qemu { 2 | enable_hardware_acceleration: boolean; 3 | enable_kvm: boolean; 4 | require_hardware_acceleration: boolean; 5 | require_kvm: boolean; 6 | vms: any[]; 7 | } 8 | -------------------------------------------------------------------------------- /src/app/models/server-settings-models/virtual-box.ts: -------------------------------------------------------------------------------- 1 | export class VirtualBox { 2 | vboxmanage_path: string; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/models/server-settings-models/vmware.ts: -------------------------------------------------------------------------------- 1 | export class VMware { 2 | block_host_traffic: boolean; 3 | host_type: string; 4 | vmnet_end_range: number; 5 | vmnet_start_range: number; 6 | vmrun_path: string; 7 | } 8 | -------------------------------------------------------------------------------- /src/app/models/server-settings-models/vpcs.ts: -------------------------------------------------------------------------------- 1 | export class VPCS { 2 | vpcs_path: string; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/models/server.ts: -------------------------------------------------------------------------------- 1 | export type ServerAuthorization = 'basic' | 'none'; 2 | export type ServerLocation = 'local' | 'remote' | 'bundled'; 3 | export type ServerStatus = 'stopped' | 'starting' | 'running'; 4 | export type ServerProtocol = 'http:' | 'https:'; 5 | 6 | export class Server { 7 | id: number; 8 | name: string; 9 | location: ServerLocation; 10 | host: string; 11 | port: number; 12 | path: string; 13 | ubridge_path: string; 14 | authorization: ServerAuthorization; 15 | login: string; 16 | password: string; 17 | status: ServerStatus; 18 | protocol: ServerProtocol; 19 | } 20 | -------------------------------------------------------------------------------- /src/app/models/serverResponse.ts: -------------------------------------------------------------------------------- 1 | export class ServerResponse { 2 | message: string; 3 | status: number; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/models/settings/qemu-settings.ts: -------------------------------------------------------------------------------- 1 | export class QemuSettings { 2 | enable_hardware_acceleration: boolean; 3 | require_hardware_acceleration: boolean; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/models/snapshot.ts: -------------------------------------------------------------------------------- 1 | export class Snapshot { 2 | snapshot_id: number; 3 | name: string; 4 | created_at: string; 5 | project_id: number; 6 | } 7 | -------------------------------------------------------------------------------- /src/app/models/software.ts: -------------------------------------------------------------------------------- 1 | export type SoftwareType = 'web'; 2 | 3 | export class Software { 4 | name: string; 5 | locations: string[]; 6 | type: SoftwareType; 7 | resource: string; 8 | binary: string; 9 | sudo: boolean; 10 | installation_arguments: string[]; 11 | installed: boolean; 12 | } 13 | -------------------------------------------------------------------------------- /src/app/models/symbol.ts: -------------------------------------------------------------------------------- 1 | export class Symbol { 2 | builtin: boolean; 3 | filename: string; 4 | symbol_id: string; 5 | raw: string; 6 | } 7 | -------------------------------------------------------------------------------- /src/app/models/template.ts: -------------------------------------------------------------------------------- 1 | export class Template { 2 | template_id: string; 3 | builtin: boolean; 4 | category: string; 5 | compute_id: string; 6 | default_name_format: string; 7 | name: string; 8 | node_type: string; 9 | symbol: string; 10 | template_type: string; 11 | } 12 | -------------------------------------------------------------------------------- /src/app/models/templates/cloud-template.ts: -------------------------------------------------------------------------------- 1 | import { PortsMappingEntity } from '../ethernetHub/ports-mapping-enity'; 2 | 3 | export interface CloudTemplate { 4 | builtin: boolean; 5 | category: string; 6 | compute_id: string; 7 | default_name_format: string; 8 | name: string; 9 | ports_mapping?: PortsMappingEntity[]; 10 | remote_console_host: string; 11 | remote_console_http_path: string; 12 | remote_console_port: number; 13 | remote_console_type: string; 14 | symbol: string; 15 | template_id: string; 16 | template_type: string; 17 | } 18 | -------------------------------------------------------------------------------- /src/app/models/templates/docker-template.ts: -------------------------------------------------------------------------------- 1 | import { CustomAdapter } from '../qemu/qemu-custom-adapter'; 2 | 3 | export class DockerTemplate { 4 | adapters: number; 5 | builtin: boolean; 6 | category: string; 7 | compute_id: string; 8 | console_auto_start: boolean; 9 | console_http_path: string; 10 | console_http_port: number; 11 | console_resolution: string; 12 | console_type: string; 13 | mac_address: string; 14 | custom_adapters: CustomAdapter[]; 15 | default_name_format: string; 16 | environment: string; 17 | extra_hosts: string; 18 | image: string; 19 | name: string; 20 | start_command: string; 21 | symbol: string; 22 | template_id: string; 23 | template_type: string; 24 | usage: string; 25 | } 26 | -------------------------------------------------------------------------------- /src/app/models/templates/ethernet-hub-template.ts: -------------------------------------------------------------------------------- 1 | import { PortsMappingEntity } from '../ethernetHub/ports-mapping-enity'; 2 | 3 | export interface EthernetHubTemplate { 4 | builtin: boolean; 5 | category: string; 6 | compute_id: string; 7 | default_name_format: string; 8 | name: string; 9 | ports_mapping?: PortsMappingEntity[]; 10 | symbol: string; 11 | template_id: string; 12 | template_type: string; 13 | } 14 | -------------------------------------------------------------------------------- /src/app/models/templates/ethernet-switch-template.ts: -------------------------------------------------------------------------------- 1 | import { PortsMappingEntity } from '../ethernetHub/ports-mapping-enity'; 2 | 3 | export interface EthernetSwitchTemplate { 4 | builtin: boolean; 5 | category: string; 6 | compute_id: string; 7 | console_type: string; 8 | default_name_format: string; 9 | name: string; 10 | ports_mapping: PortsMappingEntity[]; 11 | symbol: string; 12 | template_id: string; 13 | template_type: string; 14 | } 15 | -------------------------------------------------------------------------------- /src/app/models/templates/iou-template.ts: -------------------------------------------------------------------------------- 1 | export class IouTemplate { 2 | builtin: boolean; 3 | category: string; 4 | compute_id: string; 5 | console_auto_start: boolean; 6 | console_type: string; 7 | default_name_format: string; 8 | ethernet_adapters: number; 9 | l1_keepalives: boolean; 10 | name: string; 11 | nvram: number; 12 | path: string; 13 | private_config: string; 14 | ram: number; 15 | serial_adapters: number; 16 | startup_config: string; 17 | symbol: string; 18 | template_id: string; 19 | template_type: string; 20 | usage: string; 21 | use_default_iou_values: boolean; 22 | } 23 | -------------------------------------------------------------------------------- /src/app/models/templates/traceng-template.ts: -------------------------------------------------------------------------------- 1 | export interface TracengTemplate { 2 | builtin: boolean; 3 | category: string; 4 | compute_id: string; 5 | console_type: string; 6 | default_name_format: string; 7 | ip_address: string; 8 | name: string; 9 | symbol: string; 10 | template_id: string; 11 | template_type: string; 12 | } 13 | -------------------------------------------------------------------------------- /src/app/models/templates/virtualbox-template.ts: -------------------------------------------------------------------------------- 1 | import { CustomAdapter } from '../qemu/qemu-custom-adapter'; 2 | 3 | export interface VirtualBoxTemplate { 4 | adapter_type: string; 5 | adapters: number; 6 | builtin: boolean; 7 | category: string; 8 | compute_id: string; 9 | console_auto_start: boolean; 10 | console_type: string; 11 | custom_adapters?: CustomAdapter[]; 12 | default_name_format: string; 13 | first_port_name: string; 14 | headless: boolean; 15 | linked_clone: boolean; 16 | name: string; 17 | on_close: string; 18 | port_name_format: string; 19 | port_segment_size: number; 20 | ram: number; 21 | symbol: string; 22 | template_id: string; 23 | template_type: string; 24 | usage: string; 25 | use_any_adapter: boolean; 26 | vmname: string; 27 | } 28 | -------------------------------------------------------------------------------- /src/app/models/templates/vmware-template.ts: -------------------------------------------------------------------------------- 1 | import { CustomAdapter } from '../qemu/qemu-custom-adapter'; 2 | 3 | export class VmwareTemplate { 4 | adapter_type: string; 5 | adapters: number; 6 | builtin: boolean; 7 | category: string; 8 | compute_id: string; 9 | console_auto_start: boolean; 10 | console_type: string; 11 | custom_adapters: CustomAdapter[]; 12 | default_name_format: string; 13 | first_port_name: string; 14 | headless: boolean; 15 | linked_clone: boolean; 16 | name: string; 17 | on_close: string; 18 | port_name_format: string; 19 | port_segment_size: number; 20 | symbol: string; 21 | template_id: string; 22 | template_type: string; 23 | usage: string; 24 | use_any_adapter: boolean; 25 | vmx_path: string; 26 | } 27 | -------------------------------------------------------------------------------- /src/app/models/templates/vpcs-template.ts: -------------------------------------------------------------------------------- 1 | export interface VpcsTemplate { 2 | base_script_file: string; 3 | builtin: boolean; 4 | category: string; 5 | compute_id: string; 6 | console_auto_start: boolean; 7 | console_type: string; 8 | default_name_format: string; 9 | name: string; 10 | symbol: string; 11 | template_id: string; 12 | template_type: string; 13 | } 14 | -------------------------------------------------------------------------------- /src/app/models/version.ts: -------------------------------------------------------------------------------- 1 | export class Version { 2 | version: string; 3 | } 4 | -------------------------------------------------------------------------------- /src/app/models/virtualBox/virtual-box-vm.ts: -------------------------------------------------------------------------------- 1 | export class VirtualBoxVm { 2 | ram: number; 3 | vmname: string; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/models/vmware/vmware-vm.ts: -------------------------------------------------------------------------------- 1 | export class VmwareVm { 2 | vmname: string; 3 | vmx_path: string; 4 | } 5 | -------------------------------------------------------------------------------- /src/app/resolvers/server-resolve.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; 3 | import { Server } from '../models/server'; 4 | import { ServerService } from '../services/server.service'; 5 | 6 | @Injectable() 7 | export class ServerResolve implements Resolve { 8 | constructor(private serverService: ServerService) {} 9 | 10 | resolve(route: ActivatedRouteSnapshot) { 11 | return this.serverService.get(parseInt(route.params['server_id'])); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/services/docker-configuration.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | @Injectable() 4 | export class DockerConfigurationService { 5 | getConsoleTypes() { 6 | return ['telnet', 'vnc', 'http', 'https', 'none']; 7 | } 8 | 9 | getCategories() { 10 | let categories = [ 11 | ['Default', 'guest'], 12 | ['Routers', 'router'], 13 | ['Switches', 'switch'], 14 | ['End devices', 'guest'], 15 | ['Security devices', 'firewall'], 16 | ]; 17 | 18 | return categories; 19 | } 20 | 21 | getConsoleResolutions() { 22 | let consoleResolutions = ['2560x1440', '1920x1080', '1680x1050', '1440x900', '1366x768', '1280x1024', '1280x800', '1024x768', '800x600', '640x480']; 23 | 24 | return consoleResolutions; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/app/services/google-analytics.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { NavigationEnd, Router } from '@angular/router'; 3 | import { environment } from '../../environments/environment'; 4 | import { SettingsService } from './settings.service'; 5 | declare var gtag: Function; 6 | 7 | @Injectable() 8 | export class GoogleAnalyticsService { 9 | private settingsService: SettingsService; 10 | 11 | constructor(router: Router, settingsService: SettingsService) { 12 | if (!environment.production) return; 13 | router.events.subscribe((event) => { 14 | if (settingsService.getStatisticsSettings() && event instanceof NavigationEnd) { 15 | gtag('set', 'page', event.url); 16 | gtag('send', 'pageview'); 17 | } 18 | }); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/services/installed-software.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | 3 | describe('InstalledSoftwareService', () => { 4 | beforeEach(() => TestBed.configureTestingModule({})); 5 | 6 | // it('should be created', () => { 7 | // const service: InstalledSoftwareService = TestBed.get(InstalledSoftwareService); 8 | // expect(service).toBeTruthy(); 9 | // }); 10 | }); 11 | -------------------------------------------------------------------------------- /src/app/services/iou-configuration.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | @Injectable() 4 | export class IouConfigurationService { 5 | getConsoleTypes() { 6 | return ['telnet', 'none']; 7 | } 8 | 9 | getCategories() { 10 | let categories = [ 11 | ['Default', 'guest'], 12 | ['Routers', 'router'], 13 | ['Switches', 'switch'], 14 | ['End devices', 'guest'], 15 | ['Security devices', 'firewall'], 16 | ]; 17 | 18 | return categories; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/services/notification.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Server } from '../models/server'; 3 | 4 | @Injectable() 5 | export class NotificationService { 6 | notificationsPath(server: Server): string { 7 | let protocol:string = "ws" 8 | if (server.protocol === "https:") { 9 | protocol = "wss" 10 | } 11 | 12 | return `${protocol}://${server.host}:${server.port}/v2/notifications/ws`; 13 | } 14 | 15 | 16 | projectNotificationsPath(server: Server, project_id: string): string { 17 | let protocol:string = "ws" 18 | if (server.protocol === "https:") { 19 | protocol = "wss" 20 | } 21 | 22 | return `${protocol}://${server.host}:${server.port}/v2/projects/${project_id}/notifications/ws`; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/app/services/packet-capture.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Link } from '../models/link'; 3 | import { Project } from '../models/project'; 4 | import { Server } from '../models/server'; 5 | import { ProtocolHandlerService } from './protocol-handler.service'; 6 | 7 | @Injectable() 8 | export class PacketCaptureService { 9 | 10 | constructor(private protocolHandlerService: ProtocolHandlerService) {} 11 | 12 | startCapture(server: Server, project: Project, link: Link, name: string) { 13 | 14 | const uri = `gns3+pcap://${server.host}:${server.port}?protocol=${server.protocol.slice(0, -1)}&project_id=${project.project_id}&link_id=${link.link_id}&project=${project.name}&name=${name}`; 15 | this.protocolHandlerService.open(uri); 16 | 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/app/services/platform.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { ElectronService } from 'ngx-electron'; 3 | 4 | @Injectable() 5 | export class PlatformService { 6 | constructor(private electronService: ElectronService) {} 7 | 8 | isWindows() { 9 | return this.electronService.process.platform === 'win32'; 10 | } 11 | 12 | isLinux() { 13 | return this.electronService.process.platform === 'linux'; 14 | } 15 | 16 | isDarwin() { 17 | return this.electronService.process.platform === 'darwin'; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/app/services/settings/console.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { SettingsService } from '../settings.service'; 3 | import { DefaultConsoleService } from './default-console.service'; 4 | 5 | @Injectable() 6 | export class ConsoleService { 7 | constructor(private defaultConsoleService: DefaultConsoleService, private settingsService: SettingsService) {} 8 | 9 | get command(): string { 10 | const command = this.settingsService.getConsoleSettings(); 11 | if (command === undefined) { 12 | return this.defaultConsoleService.get(); 13 | } 14 | return command; 15 | } 16 | 17 | set command(command: string) { 18 | this.settingsService.setConsoleSettings(command); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/services/settings/default-console.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { ElectronService } from 'ngx-electron'; 3 | 4 | @Injectable() 5 | export class DefaultConsoleService { 6 | constructor(private electronService: ElectronService) {} 7 | 8 | get() { 9 | if (!this.electronService.isElectronApp) { 10 | return undefined; 11 | } 12 | 13 | if (this.electronService.isLinux) { 14 | return 'xfce4-terminal --tab -T "%d" -e "telnet %h %p"'; 15 | } 16 | 17 | if (this.electronService.isWindows) { 18 | return 'putty.exe -telnet %h %p -loghost "%d"'; 19 | } 20 | 21 | return undefined; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/app/services/testing.ts: -------------------------------------------------------------------------------- 1 | import { Server } from '../models/server'; 2 | 3 | export function getTestServer(): Server { 4 | const server = new Server(); 5 | server.host = '127.0.0.1'; 6 | server.port = 3080; 7 | server.authorization = 'none'; 8 | server.protocol = 'http:'; 9 | return server; 10 | } 11 | -------------------------------------------------------------------------------- /src/app/services/traceng.service.spec.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/app/services/traceng.service.spec.ts -------------------------------------------------------------------------------- /src/app/services/updates.service.ts: -------------------------------------------------------------------------------- 1 | import { HttpClient } from '@angular/common/http'; 2 | import { Injectable } from '@angular/core'; 3 | 4 | @Injectable() 5 | export class UpdatesService { 6 | constructor(private httpClient: HttpClient) {} 7 | 8 | getLatestVersion() { 9 | return this.httpClient.get('http://update.gns3.net/'); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/app/services/version.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import 'rxjs/add/operator/map'; 3 | import { Server } from '../models/server'; 4 | import { Version } from '../models/version'; 5 | import { HttpServer } from './http-server.service'; 6 | 7 | @Injectable() 8 | export class VersionService { 9 | constructor(private httpServer: HttpServer) {} 10 | 11 | get(server: Server) { 12 | return this.httpServer.get(server, '/version'); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/app/services/vpcs-configuration.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | @Injectable() 4 | export class VpcsConfigurationService { 5 | getConsoleTypes() { 6 | return ['telnet', 'none']; 7 | } 8 | 9 | getCategories() { 10 | let categories = [ 11 | ['Default', 'guest'], 12 | ['Routers', 'router'], 13 | ['Switches', 'switch'], 14 | ['End devices', 'guest'], 15 | ['Security devices', 'firewall'], 16 | ]; 17 | 18 | return categories; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app/testing/app-testing/app-testing.module.ts: -------------------------------------------------------------------------------- 1 | import { CommonModule } from '@angular/common'; 2 | import { NgModule } from '@angular/core'; 3 | import { ServerErrorHandler } from '../../services/http-server.service'; 4 | 5 | @NgModule({ 6 | imports: [CommonModule], 7 | declarations: [], 8 | providers: [ServerErrorHandler], 9 | }) 10 | export class AppTestingModule {} 11 | -------------------------------------------------------------------------------- /src/app/validators/non-negative-validator.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | @Injectable() 4 | export class NonNegativeValidator { 5 | get(control) { 6 | if (+control.value >= 0) { 7 | return null; 8 | } 9 | 10 | return { negativeValue: true }; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/app/validators/project-name-async-validator.ts: -------------------------------------------------------------------------------- 1 | import { FormControl } from '@angular/forms'; 2 | import { timer } from 'rxjs'; 3 | import { map, switchMap } from 'rxjs/operators'; 4 | import { Server } from '../models/server'; 5 | import { ProjectService } from '../services/project.service'; 6 | 7 | export const projectNameAsyncValidator = (server: Server, projectService: ProjectService) => { 8 | return (control: FormControl) => { 9 | return timer(500).pipe( 10 | switchMap(() => projectService.list(server)), 11 | map((response) => (response.find((n) => n.name === control.value) ? { projectExist: true } : null)) 12 | ); 13 | }; 14 | }; 15 | -------------------------------------------------------------------------------- /src/app/validators/rotation-validator.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | @Injectable() 4 | export class RotationValidator { 5 | get(control) { 6 | if (+control.value > -360 && +control.value <= 360) { 7 | return null; 8 | } 9 | 10 | return { negativeValue: true }; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/app/validators/template-name-async-validator.ts: -------------------------------------------------------------------------------- 1 | import { FormControl } from '@angular/forms'; 2 | import { timer } from 'rxjs'; 3 | import { map, switchMap } from 'rxjs/operators'; 4 | import { Server } from '../models/server'; 5 | import { TemplateService } from '../services/template.service'; 6 | 7 | export const templateNameAsyncValidator = (server: Server, templateService: TemplateService) => { 8 | return (control: FormControl) => { 9 | return timer(500).pipe( 10 | switchMap(() => templateService.list(server)), 11 | map((response) => (response.find((n) => n.name === control.value) ? { templateExist: true } : null)) 12 | ); 13 | }; 14 | }; 15 | -------------------------------------------------------------------------------- /src/app/version.ts: -------------------------------------------------------------------------------- 1 | export const version = require('../../package.json').version; 2 | -------------------------------------------------------------------------------- /src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/assets/.gitkeep -------------------------------------------------------------------------------- /src/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/assets/favicon.ico -------------------------------------------------------------------------------- /src/assets/icons/mac/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/assets/icons/mac/icon.icns -------------------------------------------------------------------------------- /src/assets/icons/png/1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/assets/icons/png/1024x1024.png -------------------------------------------------------------------------------- /src/assets/icons/png/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/assets/icons/png/128x128.png -------------------------------------------------------------------------------- /src/assets/icons/png/16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/assets/icons/png/16x16.png -------------------------------------------------------------------------------- /src/assets/icons/png/24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/assets/icons/png/24x24.png -------------------------------------------------------------------------------- /src/assets/icons/png/256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/assets/icons/png/256x256.png -------------------------------------------------------------------------------- /src/assets/icons/png/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/assets/icons/png/32x32.png -------------------------------------------------------------------------------- /src/assets/icons/png/48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/assets/icons/png/48x48.png -------------------------------------------------------------------------------- /src/assets/icons/png/512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/assets/icons/png/512x512.png -------------------------------------------------------------------------------- /src/assets/icons/png/64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/assets/icons/png/64x64.png -------------------------------------------------------------------------------- /src/assets/icons/win/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/assets/icons/win/icon.ico -------------------------------------------------------------------------------- /src/assets/logo-header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/assets/logo-header.png -------------------------------------------------------------------------------- /src/environments/environment.electron.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | solarputty_download_url: '', 3 | production: true, 4 | electron: true, 5 | }; 6 | -------------------------------------------------------------------------------- /src/environments/environment.electron.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: false, 3 | electron: true, 4 | solarputty_download_url: '', 5 | }; 6 | -------------------------------------------------------------------------------- /src/environments/environment.github.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true, 3 | electron: false, 4 | githubio: true, 5 | solarputty_download_url: '', 6 | }; 7 | -------------------------------------------------------------------------------- /src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true, 3 | electron: false, 4 | githubio: false, 5 | solarputty_download_url: '', 6 | }; 7 | -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GNS3/gns3-web-ui/e2e155c474fae3f337184f4c3d66b2457cd7860e/src/favicon.ico -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import '@angular/compiler'; 2 | import { ApplicationRef, enableProdMode } from '@angular/core'; 3 | import { enableDebugTools } from '@angular/platform-browser'; 4 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 5 | import { AppModule } from './app/app.module'; 6 | import { environment } from './environments/environment'; 7 | 8 | if (environment.production) { 9 | enableProdMode(); 10 | } 11 | 12 | platformBrowserDynamic() 13 | .bootstrapModule(AppModule) 14 | .then((moduleRef) => { 15 | const applicationRef = moduleRef.injector.get(ApplicationRef); 16 | const componentRef = applicationRef.components[0]; 17 | // allows to run `ng.profiler.timeChangeDetection();` 18 | enableDebugTools(componentRef); 19 | }) 20 | .catch((err) => console.log(err)); 21 | -------------------------------------------------------------------------------- /src/test.ts: -------------------------------------------------------------------------------- 1 | import 'zone.js/testing'; 2 | import { getTestBed } from '@angular/core/testing'; 3 | import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; 4 | 5 | declare const require: any; 6 | 7 | // First, initialize the Angular testing environment. 8 | getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting(), { 9 | teardown: { destroyAfterEach: false } 10 | }); 11 | // Then we find all the tests. 12 | const context = require.context('./', true, /\.spec\.ts$/); 13 | // And load the modules. 14 | context.keys().map(context); 15 | -------------------------------------------------------------------------------- /src/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.base.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "baseUrl": "./", 6 | "paths": { 7 | "@components/*": ["app/components/*"], 8 | "@services/*": ["app/services/*"], 9 | "@resolvers/*": ["app/resolvers/*"], 10 | "@filters/*": ["app/filters/*"], 11 | "@models/*": ["app/models/*"] 12 | }, 13 | "types": [] 14 | }, 15 | "files": [ 16 | "main.ts", 17 | "polyfills.ts" 18 | ], 19 | "include": [ 20 | // "../src/**/*" 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /src/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.base.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/spec", 5 | "baseUrl": "./", 6 | "target": "es5", 7 | "types": [ 8 | "jasmine", 9 | "node" 10 | ] 11 | }, 12 | "files": [ 13 | "test.ts", 14 | "polyfills.ts" 15 | ], 16 | "include": [ 17 | "**/*.spec.ts", 18 | "**/*.d.ts" 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /src/typings.d.ts: -------------------------------------------------------------------------------- 1 | /* SystemJS module definition */ 2 | declare var module: NodeModule; 3 | interface NodeModule { 4 | id: string; 5 | } 6 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | /* 2 | This is a "Solution Style" tsconfig.json file, and is used by editors and TypeScript’s language server to improve development experience. 3 | It is not intended to be used to perform a compilation. 4 | 5 | To learn more about this file see: https://angular.io/config/solution-tsconfig. 6 | */ 7 | { 8 | "files": [], 9 | "references": [ 10 | { 11 | "path": "./src/tsconfig.app.json" 12 | }, 13 | { 14 | "path": "./src/tsconfig.spec.json" 15 | } 16 | ] 17 | } --------------------------------------------------------------------------------