├── .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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
4 |
5 |
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 |
4 |
5 |
6 |
7 |
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 |
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 | }
--------------------------------------------------------------------------------