├── .blubracket └── ignore.yaml ├── .dockerignore ├── .github ├── Contributing.md ├── PULL_REQUEST_TEMPLATE.md ├── dependabot.yml ├── semantic.yml └── workflows │ └── release.yml ├── .gitignore ├── Attribution.txt ├── CHANGELOG.md ├── CONTRIBUTING.md ├── Dockerfile ├── Jenkinsfile ├── LICENSE ├── Makefile ├── README.md ├── angularmigrationlogs.md ├── assets └── images │ └── metadata.png ├── bin ├── edgex-ui-go-launch.sh └── test-attribution-txt.sh ├── cmd └── edgex-ui-server │ ├── main.go │ ├── res │ ├── configuration.yaml │ └── docker │ │ └── configuration.yaml │ └── static │ └── web │ ├── en-US │ ├── 326.8be56b57a90287e1.js │ ├── 342.3ce63f6d55b045b5.js │ ├── 3rdpartylicenses.txt │ ├── 432.e79700db2ed7df33.js │ ├── 489.f8868c87db37e6fb.js │ ├── 649.7e9a93317471840f.js │ ├── 744.2855789ad15c8fa0.js │ ├── 79.fb4d3d25a9f15f90.js │ ├── 806.b3ec75ede1aafe15.js │ ├── 875.57e8f494eee016a9.js │ ├── 934.a3d10c8786cecdb6.js │ ├── assets │ │ └── img │ │ │ └── bg_x.png │ ├── favicon.ico │ ├── fontawesome-webfont.2b13baa7dd4f54c9.eot │ ├── fontawesome-webfont.8a7cb27d142e3e19.ttf │ ├── fontawesome-webfont.cf011583fb81df9f.woff │ ├── fontawesome-webfont.da909aa098b0ee2d.svg │ ├── fontawesome-webfont.e9955780856cf8aa.woff2 │ ├── index.html │ ├── main.2b2519a8a9927790.js │ ├── polyfills.0e60f20465ecee11.js │ ├── runtime.077a5f3578ef42eb.js │ ├── scripts.ab4a7dbb7346633b.js │ └── styles.2129745d589d91f5.css │ └── zh │ ├── 326.8be56b57a90287e1.js │ ├── 342.3ce63f6d55b045b5.js │ ├── 3rdpartylicenses.txt │ ├── 432.e79700db2ed7df33.js │ ├── 489.f8868c87db37e6fb.js │ ├── 649.7e9a93317471840f.js │ ├── 744.2855789ad15c8fa0.js │ ├── 79.fb4d3d25a9f15f90.js │ ├── 806.b3ec75ede1aafe15.js │ ├── 875.57e8f494eee016a9.js │ ├── 934.a3d10c8786cecdb6.js │ ├── assets │ └── img │ │ └── bg_x.png │ ├── favicon.ico │ ├── fontawesome-webfont.2b13baa7dd4f54c9.eot │ ├── fontawesome-webfont.8a7cb27d142e3e19.ttf │ ├── fontawesome-webfont.cf011583fb81df9f.woff │ ├── fontawesome-webfont.da909aa098b0ee2d.svg │ ├── fontawesome-webfont.e9955780856cf8aa.woff2 │ ├── index.html │ ├── main.2b2519a8a9927790.js │ ├── polyfills.0e60f20465ecee11.js │ ├── runtime.077a5f3578ef42eb.js │ ├── scripts.ab4a7dbb7346633b.js │ └── styles.2129745d589d91f5.css ├── docs └── README.md ├── go.mod ├── go.sum ├── internal ├── application.go ├── bootstrap.go ├── common │ └── types.go ├── config │ └── config.go ├── container │ └── container.go ├── errors │ └── types.go ├── handler │ ├── appservice.go │ ├── auth.go │ ├── profile.go │ ├── registercenter.go │ └── types.go ├── router.go └── service │ ├── httpserver.go │ └── service.go ├── redeploy.sh ├── testing ├── README.md ├── common │ └── configuration.ini ├── main.py └── pages │ ├── __init__.py │ ├── addNewDevice.py │ ├── appsvc.py │ ├── config.py │ ├── deviceprofile.py │ ├── devicesvc.py │ ├── driver.py │ ├── login.py │ ├── notification.py │ └── scheduler.py ├── version.go └── web ├── .dockerignore ├── .editorconfig ├── Dockerfile ├── Makefile ├── README.md ├── angular.json ├── e2e ├── protractor.conf.js ├── src │ ├── app.e2e-spec.ts │ └── app.po.ts └── tsconfig.json ├── karma.conf.js ├── package-lock.json ├── package.json ├── proxy.conf.json ├── src ├── app │ ├── app-routing.module.ts │ ├── app-service │ │ ├── app-service-configurable │ │ │ ├── app-service-configurable.component.css │ │ │ ├── app-service-configurable.component.html │ │ │ ├── app-service-configurable.component.spec.ts │ │ │ ├── app-service-configurable.component.ts │ │ │ ├── insecure-secrets │ │ │ │ ├── insecure-secrets.component.css │ │ │ │ ├── insecure-secrets.component.html │ │ │ │ ├── insecure-secrets.component.spec.ts │ │ │ │ └── insecure-secrets.component.ts │ │ │ ├── pipeline-function │ │ │ │ ├── add-tags │ │ │ │ │ ├── add-tags.component.css │ │ │ │ │ ├── add-tags.component.html │ │ │ │ │ ├── add-tags.component.spec.ts │ │ │ │ │ └── add-tags.component.ts │ │ │ │ ├── batch │ │ │ │ │ ├── batch.component.css │ │ │ │ │ ├── batch.component.html │ │ │ │ │ ├── batch.component.spec.ts │ │ │ │ │ └── batch.component.ts │ │ │ │ ├── compress │ │ │ │ │ ├── compress.component.css │ │ │ │ │ ├── compress.component.html │ │ │ │ │ ├── compress.component.spec.ts │ │ │ │ │ └── compress.component.ts │ │ │ │ ├── encrypt │ │ │ │ │ ├── encrypt.component.css │ │ │ │ │ ├── encrypt.component.html │ │ │ │ │ ├── encrypt.component.spec.ts │ │ │ │ │ └── encrypt.component.ts │ │ │ │ ├── filter-by-device-name │ │ │ │ │ ├── filter-by-device-name.component.css │ │ │ │ │ ├── filter-by-device-name.component.html │ │ │ │ │ ├── filter-by-device-name.component.spec.ts │ │ │ │ │ └── filter-by-device-name.component.ts │ │ │ │ ├── filter-by-profile-name │ │ │ │ │ ├── filter-by-profile-name.component.css │ │ │ │ │ ├── filter-by-profile-name.component.html │ │ │ │ │ ├── filter-by-profile-name.component.spec.ts │ │ │ │ │ └── filter-by-profile-name.component.ts │ │ │ │ ├── filter-by-resource-name │ │ │ │ │ ├── filter-by-resource-name.component.css │ │ │ │ │ ├── filter-by-resource-name.component.html │ │ │ │ │ ├── filter-by-resource-name.component.spec.ts │ │ │ │ │ └── filter-by-resource-name.component.ts │ │ │ │ ├── filter-by-source-name │ │ │ │ │ ├── filter-by-source-name.component.css │ │ │ │ │ ├── filter-by-source-name.component.html │ │ │ │ │ ├── filter-by-source-name.component.spec.ts │ │ │ │ │ └── filter-by-source-name.component.ts │ │ │ │ ├── httpexport │ │ │ │ │ ├── httpexport.component.css │ │ │ │ │ ├── httpexport.component.html │ │ │ │ │ ├── httpexport.component.spec.ts │ │ │ │ │ └── httpexport.component.ts │ │ │ │ ├── jsonlogic │ │ │ │ │ ├── jsonlogic.component.css │ │ │ │ │ ├── jsonlogic.component.html │ │ │ │ │ ├── jsonlogic.component.spec.ts │ │ │ │ │ └── jsonlogic.component.ts │ │ │ │ ├── mqttexport │ │ │ │ │ ├── mqttexport.component.css │ │ │ │ │ ├── mqttexport.component.html │ │ │ │ │ ├── mqttexport.component.spec.ts │ │ │ │ │ └── mqttexport.component.ts │ │ │ │ ├── pipeline-function.component.css │ │ │ │ ├── pipeline-function.component.html │ │ │ │ ├── pipeline-function.component.spec.ts │ │ │ │ ├── pipeline-function.component.ts │ │ │ │ ├── push-to-core │ │ │ │ │ ├── push-to-core.component.css │ │ │ │ │ ├── push-to-core.component.html │ │ │ │ │ ├── push-to-core.component.spec.ts │ │ │ │ │ └── push-to-core.component.ts │ │ │ │ ├── set-response-data │ │ │ │ │ ├── set-response-data.component.css │ │ │ │ │ ├── set-response-data.component.html │ │ │ │ │ ├── set-response-data.component.spec.ts │ │ │ │ │ └── set-response-data.component.ts │ │ │ │ └── transform │ │ │ │ │ ├── transform.component.css │ │ │ │ │ ├── transform.component.html │ │ │ │ │ ├── transform.component.spec.ts │ │ │ │ │ └── transform.component.ts │ │ │ ├── pipeline │ │ │ │ ├── pipeline.component.css │ │ │ │ ├── pipeline.component.html │ │ │ │ ├── pipeline.component.spec.ts │ │ │ │ └── pipeline.component.ts │ │ │ ├── store-and-forward │ │ │ │ ├── store-and-forward.component.css │ │ │ │ ├── store-and-forward.component.html │ │ │ │ ├── store-and-forward.component.spec.ts │ │ │ │ └── store-and-forward.component.ts │ │ │ └── trigger │ │ │ │ ├── trigger.component.css │ │ │ │ ├── trigger.component.html │ │ │ │ ├── trigger.component.spec.ts │ │ │ │ └── trigger.component.ts │ │ ├── app-service-list │ │ │ ├── app-service-list.component.css │ │ │ ├── app-service-list.component.html │ │ │ ├── app-service-list.component.spec.ts │ │ │ └── app-service-list.component.ts │ │ ├── app-service-routing.module.ts │ │ ├── app-service.component.css │ │ ├── app-service.component.html │ │ ├── app-service.component.spec.ts │ │ ├── app-service.component.ts │ │ └── app-service.module.ts │ ├── app.component.css │ ├── app.component.html │ ├── app.component.spec.ts │ ├── app.component.ts │ ├── app.module.ts │ ├── command │ │ ├── command-routing.module.ts │ │ ├── command-service-template │ │ │ ├── command-service-template.component.css │ │ │ ├── command-service-template.component.html │ │ │ ├── command-service-template.component.spec.ts │ │ │ ├── command-service-template.component.ts │ │ │ └── interfaces │ │ │ │ └── command-service-info.ts │ │ ├── command.module.ts │ │ └── device-core-command │ │ │ ├── device-associated-core-command-list │ │ │ ├── device-associated-core-command-list.component.css │ │ │ ├── device-associated-core-command-list.component.html │ │ │ ├── device-associated-core-command-list.component.spec.ts │ │ │ └── device-associated-core-command-list.component.ts │ │ │ ├── device-core-command-combo-list │ │ │ ├── device-core-command-combo-list.component.css │ │ │ ├── device-core-command-combo-list.component.html │ │ │ ├── device-core-command-combo-list.component.spec.ts │ │ │ └── device-core-command-combo-list.component.ts │ │ │ └── device-core-command-list │ │ │ ├── device-core-command-list.component.css │ │ │ ├── device-core-command-list.component.html │ │ │ ├── device-core-command-list.component.spec.ts │ │ │ └── device-core-command-list.component.ts │ ├── contracts │ │ ├── action.ts │ │ ├── addressable.ts │ │ ├── auto-event.ts │ │ ├── command.ts │ │ ├── device-profile.ts │ │ ├── device-resource.ts │ │ ├── device-service.ts │ │ ├── device.ts │ │ ├── get.ts │ │ ├── kuiper │ │ │ ├── rule-options.ts │ │ │ ├── rule.ts │ │ │ ├── sink-base-properties.ts │ │ │ ├── sink.ts │ │ │ ├── stream-fields.ts │ │ │ ├── stream-options.ts │ │ │ └── stream.ts │ │ ├── profile-property.ts │ │ ├── profile-resource.ts │ │ ├── property-value.ts │ │ ├── protocol-properties.ts │ │ ├── put.ts │ │ ├── resource-operation.ts │ │ ├── response.ts │ │ ├── sma-operation.ts │ │ ├── timestamps.ts │ │ ├── units.ts │ │ └── v3 │ │ │ ├── address.ts │ │ │ ├── appsvc │ │ │ ├── functions.ts │ │ │ ├── insecure-secrets.ts │ │ │ ├── pipeline.ts │ │ │ ├── store-and-forward.ts │ │ │ ├── trigger.ts │ │ │ └── writable.ts │ │ │ ├── auto-event.ts │ │ │ ├── common │ │ │ ├── base-request.ts │ │ │ ├── base-response.ts │ │ │ ├── count-response.ts │ │ │ ├── db-timestamp.ts │ │ │ └── versionable.ts │ │ │ ├── core-command.ts │ │ │ ├── device-command.ts │ │ │ ├── device-profile.ts │ │ │ ├── device-resource.ts │ │ │ ├── device-service.ts │ │ │ ├── device.ts │ │ │ ├── event.ts │ │ │ ├── interval-action.ts │ │ │ ├── interval.ts │ │ │ ├── notification.ts │ │ │ ├── provision-watcher.ts │ │ │ ├── reading.ts │ │ │ ├── register-center │ │ │ └── service-endpoint.ts │ │ │ ├── requests │ │ │ ├── device-profile-request.ts │ │ │ ├── device-request.ts │ │ │ ├── device-service-request.ts │ │ │ ├── interval-action-request.ts │ │ │ ├── interval-request.ts │ │ │ ├── notification-request.ts │ │ │ ├── operation-request.ts │ │ │ ├── provision-watcher-request.ts │ │ │ └── subscription-request.ts │ │ │ ├── resource-operation.ts │ │ │ ├── resource-properties.ts │ │ │ ├── responses │ │ │ ├── device-core-command-response.ts │ │ │ ├── device-profile-response.ts │ │ │ ├── device-response.ts │ │ │ ├── device-service-response.ts │ │ │ ├── event-response.ts │ │ │ ├── interval-action-response.ts │ │ │ ├── interval-response.ts │ │ │ ├── notification-response.ts │ │ │ ├── provision-watcher-response.ts │ │ │ ├── reading-response.ts │ │ │ └── subscription-response.ts │ │ │ └── subscription.ts │ ├── core-data │ │ ├── core-data-routing.module.ts │ │ ├── core-data.component.css │ │ ├── core-data.component.html │ │ ├── core-data.component.spec.ts │ │ ├── core-data.component.ts │ │ ├── core-data.module.ts │ │ ├── event │ │ │ ├── event.component.css │ │ │ ├── event.component.html │ │ │ ├── event.component.spec.ts │ │ │ └── event.component.ts │ │ └── reading │ │ │ ├── reading.component.css │ │ │ ├── reading.component.html │ │ │ ├── reading.component.spec.ts │ │ │ └── reading.component.ts │ ├── dashboard │ │ ├── dashboard-routing.module.ts │ │ ├── dashboard.component.css │ │ ├── dashboard.component.html │ │ ├── dashboard.component.spec.ts │ │ ├── dashboard.component.ts │ │ └── dashboard.module.ts │ ├── directives │ │ ├── drag-highlight.directive.spec.ts │ │ └── drag-highlight.directive.ts │ ├── guards │ │ ├── auth │ │ │ ├── auth-routing.module.ts │ │ │ ├── auth.module.ts │ │ │ ├── guard │ │ │ │ ├── auth.guard.spec.ts │ │ │ │ └── auth.guard.ts │ │ │ └── login │ │ │ │ ├── login.component.css │ │ │ │ ├── login.component.html │ │ │ │ ├── login.component.spec.ts │ │ │ │ └── login.component.ts │ │ └── health │ │ │ ├── coredata-alive.guard.spec.ts │ │ │ ├── coredata-alive.guard.ts │ │ │ ├── metadata-alive.guard.spec.ts │ │ │ ├── metadata-alive.guard.ts │ │ │ ├── notification-alive.guard.spec.ts │ │ │ ├── notification-alive.guard.ts │ │ │ ├── registry-center-alive.guard.spec.ts │ │ │ ├── registry-center-alive.guard.ts │ │ │ ├── rule-engine-alive.guard.spec.ts │ │ │ ├── rule-engine-alive.guard.ts │ │ │ ├── scheduler-alive.guard.spec.ts │ │ │ ├── scheduler-alive.guard.ts │ │ │ ├── service-unavailable │ │ │ ├── service-unavailable.component.css │ │ │ ├── service-unavailable.component.html │ │ │ ├── service-unavailable.component.spec.ts │ │ │ └── service-unavailable.component.ts │ │ │ ├── system-agent-alive.guard.spec.ts │ │ │ └── system-agent-alive.guard.ts │ ├── initializer │ │ ├── initializer.component.css │ │ ├── initializer.component.html │ │ ├── initializer.component.spec.ts │ │ └── initializer.component.ts │ ├── message │ │ ├── message.component.css │ │ ├── message.component.html │ │ ├── message.component.spec.ts │ │ ├── message.component.ts │ │ ├── message.service.spec.ts │ │ └── message.service.ts │ ├── metadata │ │ ├── device-service │ │ │ ├── device-service-list │ │ │ │ ├── device-service-list.component.css │ │ │ │ ├── device-service-list.component.html │ │ │ │ ├── device-service-list.component.spec.ts │ │ │ │ └── device-service-list.component.ts │ │ │ └── device-service-media-list │ │ │ │ ├── device-service-media-list.component.css │ │ │ │ ├── device-service-media-list.component.html │ │ │ │ ├── device-service-media-list.component.spec.ts │ │ │ │ └── device-service-media-list.component.ts │ │ ├── device │ │ │ ├── add-device │ │ │ │ ├── add-device.component.css │ │ │ │ ├── add-device.component.html │ │ │ │ ├── add-device.component.spec.ts │ │ │ │ └── add-device.component.ts │ │ │ ├── device-auto-event │ │ │ │ ├── device-auto-event.component.css │ │ │ │ ├── device-auto-event.component.html │ │ │ │ ├── device-auto-event.component.spec.ts │ │ │ │ └── device-auto-event.component.ts │ │ │ ├── device-center │ │ │ │ ├── device-center.component.css │ │ │ │ ├── device-center.component.html │ │ │ │ ├── device-center.component.spec.ts │ │ │ │ └── device-center.component.ts │ │ │ ├── device-combo-list │ │ │ │ ├── device-combo-list.component.css │ │ │ │ ├── device-combo-list.component.html │ │ │ │ ├── device-combo-list.component.spec.ts │ │ │ │ └── device-combo-list.component.ts │ │ │ ├── device-command-viewer │ │ │ │ ├── device-command-viewer.component.css │ │ │ │ ├── device-command-viewer.component.html │ │ │ │ ├── device-command-viewer.component.spec.ts │ │ │ │ └── device-command-viewer.component.ts │ │ │ ├── device-list │ │ │ │ ├── device-list.component.css │ │ │ │ ├── device-list.component.html │ │ │ │ ├── device-list.component.spec.ts │ │ │ │ └── device-list.component.ts │ │ │ ├── device-protocol │ │ │ │ ├── builtin-protocol-template │ │ │ │ │ └── types.ts │ │ │ │ ├── device-protocol.component.css │ │ │ │ ├── device-protocol.component.html │ │ │ │ ├── device-protocol.component.spec.ts │ │ │ │ └── device-protocol.component.ts │ │ │ └── edit-device │ │ │ │ ├── edit-device.component.css │ │ │ │ ├── edit-device.component.html │ │ │ │ ├── edit-device.component.spec.ts │ │ │ │ └── edit-device.component.ts │ │ ├── metadata-routing.module.ts │ │ ├── metadata.component.css │ │ ├── metadata.component.html │ │ ├── metadata.component.spec.ts │ │ ├── metadata.component.ts │ │ ├── metadata.module.ts │ │ ├── profile │ │ │ ├── add-profile │ │ │ │ ├── add-profile.component.css │ │ │ │ ├── add-profile.component.html │ │ │ │ ├── add-profile.component.spec.ts │ │ │ │ └── add-profile.component.ts │ │ │ ├── device-profile-center │ │ │ │ ├── device-profile-center.component.css │ │ │ │ ├── device-profile-center.component.html │ │ │ │ ├── device-profile-center.component.spec.ts │ │ │ │ └── device-profile-center.component.ts │ │ │ ├── device-profile-combo-list │ │ │ │ ├── device-profile-combo-list.component.css │ │ │ │ ├── device-profile-combo-list.component.html │ │ │ │ ├── device-profile-combo-list.component.spec.ts │ │ │ │ └── device-profile-combo-list.component.ts │ │ │ ├── device-profile-list │ │ │ │ ├── device-profile-list.component.css │ │ │ │ ├── device-profile-list.component.html │ │ │ │ ├── device-profile-list.component.spec.ts │ │ │ │ └── device-profile-list.component.ts │ │ │ ├── edit-profile │ │ │ │ ├── edit-profile.component.css │ │ │ │ ├── edit-profile.component.html │ │ │ │ ├── edit-profile.component.spec.ts │ │ │ │ └── edit-profile.component.ts │ │ │ ├── resource-combo-list │ │ │ │ ├── resource-combo-list.component.css │ │ │ │ ├── resource-combo-list.component.html │ │ │ │ ├── resource-combo-list.component.spec.ts │ │ │ │ └── resource-combo-list.component.ts │ │ │ └── source-combo-list │ │ │ │ ├── source-combo-list.component.css │ │ │ │ ├── source-combo-list.component.html │ │ │ │ ├── source-combo-list.component.spec.ts │ │ │ │ └── source-combo-list.component.ts │ │ └── provision-watcher │ │ │ ├── add-provision-watcher │ │ │ ├── add-provision-watcher.component.css │ │ │ ├── add-provision-watcher.component.html │ │ │ ├── add-provision-watcher.component.spec.ts │ │ │ └── add-provision-watcher.component.ts │ │ │ ├── edit-provision-watcher │ │ │ ├── edit-provision-watcher.component.css │ │ │ ├── edit-provision-watcher.component.html │ │ │ ├── edit-provision-watcher.component.spec.ts │ │ │ └── edit-provision-watcher.component.ts │ │ │ ├── provision-watcher-center │ │ │ ├── provision-watcher-center.component.css │ │ │ ├── provision-watcher-center.component.html │ │ │ ├── provision-watcher-center.component.spec.ts │ │ │ └── provision-watcher-center.component.ts │ │ │ └── provision-watcher-list │ │ │ ├── provision-watcher-list.component.css │ │ │ ├── provision-watcher-list.component.html │ │ │ ├── provision-watcher-list.component.spec.ts │ │ │ └── provision-watcher-list.component.ts │ ├── notifications │ │ ├── notification │ │ │ ├── notification-center │ │ │ │ ├── notification-center.component.css │ │ │ │ ├── notification-center.component.html │ │ │ │ ├── notification-center.component.spec.ts │ │ │ │ └── notification-center.component.ts │ │ │ └── notification-list │ │ │ │ ├── notification-list.component.css │ │ │ │ ├── notification-list.component.html │ │ │ │ ├── notification-list.component.spec.ts │ │ │ │ └── notification-list.component.ts │ │ ├── notifications-routing.module.ts │ │ ├── notifications.component.css │ │ ├── notifications.component.html │ │ ├── notifications.component.spec.ts │ │ ├── notifications.component.ts │ │ ├── notifications.module.ts │ │ └── subscription │ │ │ ├── add-subscription │ │ │ ├── add-subscription.component.css │ │ │ ├── add-subscription.component.html │ │ │ ├── add-subscription.component.spec.ts │ │ │ └── add-subscription.component.ts │ │ │ ├── edit-subscription │ │ │ ├── edit-subscription.component.css │ │ │ ├── edit-subscription.component.html │ │ │ ├── edit-subscription.component.spec.ts │ │ │ └── edit-subscription.component.ts │ │ │ ├── subscription-center │ │ │ ├── subscription-center.component.css │ │ │ ├── subscription-center.component.html │ │ │ ├── subscription-center.component.spec.ts │ │ │ └── subscription-center.component.ts │ │ │ └── subscription-list │ │ │ ├── subscription-list.component.css │ │ │ ├── subscription-list.component.html │ │ │ ├── subscription-list.component.spec.ts │ │ │ └── subscription-list.component.ts │ ├── rule-engine │ │ ├── rule-engine-routing.module.ts │ │ ├── rule-engine.component.css │ │ ├── rule-engine.component.html │ │ ├── rule-engine.component.spec.ts │ │ ├── rule-engine.component.ts │ │ ├── rule-engine.module.ts │ │ ├── rules │ │ │ ├── add-rules │ │ │ │ ├── add-rules.component.css │ │ │ │ ├── add-rules.component.html │ │ │ │ ├── add-rules.component.spec.ts │ │ │ │ └── add-rules.component.ts │ │ │ ├── edit-rules │ │ │ │ ├── edit-rules.component.css │ │ │ │ ├── edit-rules.component.html │ │ │ │ ├── edit-rules.component.spec.ts │ │ │ │ └── edit-rules.component.ts │ │ │ ├── rule-advanced-options │ │ │ │ ├── rule-advanced-options.component.css │ │ │ │ ├── rule-advanced-options.component.html │ │ │ │ ├── rule-advanced-options.component.spec.ts │ │ │ │ └── rule-advanced-options.component.ts │ │ │ ├── rules-center │ │ │ │ ├── rules-center.component.css │ │ │ │ ├── rules-center.component.html │ │ │ │ ├── rules-center.component.spec.ts │ │ │ │ └── rules-center.component.ts │ │ │ ├── rules-list │ │ │ │ ├── rules-list.component.css │ │ │ │ ├── rules-list.component.html │ │ │ │ ├── rules-list.component.spec.ts │ │ │ │ └── rules-list.component.ts │ │ │ └── sinks │ │ │ │ ├── edgex-sink │ │ │ │ ├── edgex-sink-optional │ │ │ │ │ ├── edgex-sink-optional.component.css │ │ │ │ │ ├── edgex-sink-optional.component.html │ │ │ │ │ ├── edgex-sink-optional.component.spec.ts │ │ │ │ │ └── edgex-sink-optional.component.ts │ │ │ │ ├── edgex-sink.component.css │ │ │ │ ├── edgex-sink.component.html │ │ │ │ ├── edgex-sink.component.spec.ts │ │ │ │ └── edgex-sink.component.ts │ │ │ │ ├── log-sink │ │ │ │ ├── log-sink.component.css │ │ │ │ ├── log-sink.component.html │ │ │ │ ├── log-sink.component.spec.ts │ │ │ │ └── log-sink.component.ts │ │ │ │ ├── mqtt-sink │ │ │ │ ├── mqtt-sink.component.css │ │ │ │ ├── mqtt-sink.component.html │ │ │ │ ├── mqtt-sink.component.spec.ts │ │ │ │ └── mqtt-sink.component.ts │ │ │ │ ├── nop-sink │ │ │ │ ├── nop-sink.component.css │ │ │ │ ├── nop-sink.component.html │ │ │ │ ├── nop-sink.component.spec.ts │ │ │ │ └── nop-sink.component.ts │ │ │ │ ├── rest-sink │ │ │ │ ├── rest-sink.component.css │ │ │ │ ├── rest-sink.component.html │ │ │ │ ├── rest-sink.component.spec.ts │ │ │ │ └── rest-sink.component.ts │ │ │ │ ├── sink-base-properties │ │ │ │ ├── sink-base-properties.component.css │ │ │ │ ├── sink-base-properties.component.html │ │ │ │ ├── sink-base-properties.component.spec.ts │ │ │ │ └── sink-base-properties.component.ts │ │ │ │ └── sink-list │ │ │ │ ├── sink-list.component.css │ │ │ │ ├── sink-list.component.html │ │ │ │ ├── sink-list.component.spec.ts │ │ │ │ └── sink-list.component.ts │ │ └── stream │ │ │ ├── add-stream │ │ │ ├── add-stream.component.css │ │ │ ├── add-stream.component.html │ │ │ ├── add-stream.component.spec.ts │ │ │ └── add-stream.component.ts │ │ │ ├── edit-stream │ │ │ ├── edit-stream.component.css │ │ │ ├── edit-stream.component.html │ │ │ ├── edit-stream.component.spec.ts │ │ │ └── edit-stream.component.ts │ │ │ ├── stream-center │ │ │ ├── stream-center.component.css │ │ │ ├── stream-center.component.html │ │ │ ├── stream-center.component.spec.ts │ │ │ └── stream-center.component.ts │ │ │ └── stream-list │ │ │ ├── stream-list.component.css │ │ │ ├── stream-list.component.html │ │ │ ├── stream-list.component.spec.ts │ │ │ └── stream-list.component.ts │ ├── scheduler │ │ ├── interval │ │ │ ├── add-interval │ │ │ │ ├── add-interval.component.css │ │ │ │ ├── add-interval.component.html │ │ │ │ ├── add-interval.component.spec.ts │ │ │ │ └── add-interval.component.ts │ │ │ ├── edit-interval │ │ │ │ ├── edit-interval.component.css │ │ │ │ ├── edit-interval.component.html │ │ │ │ ├── edit-interval.component.spec.ts │ │ │ │ └── edit-interval.component.ts │ │ │ ├── interval-center │ │ │ │ ├── interval-center.component.css │ │ │ │ ├── interval-center.component.html │ │ │ │ ├── interval-center.component.spec.ts │ │ │ │ └── interval-center.component.ts │ │ │ ├── interval-combo-list │ │ │ │ ├── interval-combo-list.component.css │ │ │ │ ├── interval-combo-list.component.html │ │ │ │ ├── interval-combo-list.component.spec.ts │ │ │ │ └── interval-combo-list.component.ts │ │ │ └── interval-list │ │ │ │ ├── interval-list.component.css │ │ │ │ ├── interval-list.component.html │ │ │ │ ├── interval-list.component.spec.ts │ │ │ │ └── interval-list.component.ts │ │ ├── intervalaction │ │ │ ├── add-interval-action │ │ │ │ ├── add-interval-action.component.css │ │ │ │ ├── add-interval-action.component.html │ │ │ │ ├── add-interval-action.component.spec.ts │ │ │ │ └── add-interval-action.component.ts │ │ │ ├── edit-interval-action │ │ │ │ ├── edit-interval-action.component.css │ │ │ │ ├── edit-interval-action.component.html │ │ │ │ ├── edit-interval-action.component.spec.ts │ │ │ │ └── edit-interval-action.component.ts │ │ │ ├── interval-action-center │ │ │ │ ├── interval-action-center.component.css │ │ │ │ ├── interval-action-center.component.html │ │ │ │ ├── interval-action-center.component.spec.ts │ │ │ │ └── interval-action-center.component.ts │ │ │ └── interval-action-list │ │ │ │ ├── interval-action-list.component.css │ │ │ │ ├── interval-action-list.component.html │ │ │ │ ├── interval-action-list.component.spec.ts │ │ │ │ └── interval-action-list.component.ts │ │ ├── scheduler-routing.module.ts │ │ ├── scheduler.component.css │ │ ├── scheduler.component.html │ │ ├── scheduler.component.spec.ts │ │ ├── scheduler.component.ts │ │ └── scheduler.module.ts │ └── services │ │ ├── auth.service.spec.ts │ │ ├── auth.service.ts │ │ ├── command.service.spec.ts │ │ ├── command.service.ts │ │ ├── data.service.spec.ts │ │ ├── data.service.ts │ │ ├── error.service.spec.ts │ │ ├── error.service.ts │ │ ├── init.service.spec.ts │ │ ├── init.service.ts │ │ ├── interceptors │ │ ├── auth.interceptor.spec.ts │ │ ├── auth.interceptor.ts │ │ └── index.ts │ │ ├── metadata.service.spec.ts │ │ ├── metadata.service.ts │ │ ├── notifications.service.spec.ts │ │ ├── notifications.service.ts │ │ ├── registry-center.service.spec.ts │ │ ├── registry-center.service.ts │ │ ├── rule-engine.service.spec.ts │ │ ├── rule-engine.service.ts │ │ ├── scheduler.service.spec.ts │ │ ├── scheduler.service.ts │ │ ├── system-agent.service.spec.ts │ │ └── system-agent.service.ts ├── assets │ ├── .gitkeep │ └── img │ │ └── bg_x.png ├── environments │ ├── environment.prod.ts │ └── environment.ts ├── favicon.ico ├── index.html ├── locale │ ├── messages.xlf │ └── messages.zh.xlf ├── main.ts ├── polyfills.ts ├── styles.css ├── test.ts └── typings.d.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.spec.json └── tslint.json /.blubracket/ignore.yaml: -------------------------------------------------------------------------------- 1 | - paths: 2 | - Attribution.txt 3 | - "cmd/edgex-ui-server/static/**" 4 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | web/node_modules 2 | 3 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | If your build fails due to your commit message not passing the build checks, please review the guidelines here: https://github.com/edgexfoundry/edgex-ui-go/blob/main/.github/Contributing.md 8 | 9 | ## PR Checklist 10 | Please check if your PR fulfills the following requirements: 11 | 12 | - [ ] I am not introducing a breaking change (if you are, flag in conventional commit message with `BREAKING CHANGE:` describing the break) 13 | - [ ] I am not introducing a new dependency (add notes below if you are) 14 | - [ ] I have added unit tests for the new feature or bug fix (if not, why?) 15 | - [ ] I have fully tested (add details below) this the new feature or bug fix (if not, why?) 16 | - [ ] I have opened a PR for the related docs change (if not, why?) 17 | 18 | 19 | ## Testing Instructions 20 | 21 | 22 | ## New Dependency Instructions (If applicable) 23 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | # Maintain dependencies for Go modules 4 | - package-ecosystem: "gomod" 5 | directory: "/" 6 | schedule: 7 | interval: "daily" 8 | ignore: 9 | - dependency-name: "github.com/edgexfoundry/go-mod-core-contracts/*" 10 | # Included when go-mod-bootstrap is updated 11 | - dependency-name: "github.com/edgexfoundry/go-mod-messaging/*" 12 | # Included when go-mod-bootstrap is updated 13 | - dependency-name: "github.com/edgexfoundry/go-mod-registry/*" 14 | # Included when go-mod-bootstrap is updated 15 | -------------------------------------------------------------------------------- /.github/semantic.yml: -------------------------------------------------------------------------------- 1 | allowMergeCommits: true 2 | # Always validate the PR title AND all the commits 3 | titleAndCommits: true 4 | types: 5 | - feat 6 | - fix 7 | - docs 8 | - style 9 | - refactor 10 | - perf 11 | - test 12 | - build 13 | - ci 14 | - revert 15 | 16 | 17 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Create Release 2 | on: 3 | push: 4 | tags: 5 | - 'v*.*.*' 6 | - '!v*-dev*' 7 | jobs: 8 | release: 9 | uses: edgexfoundry/edgex-global-pipelines/.github/workflows/release.yml@stable 10 | permissions: 11 | contents: write -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | vendor 3 | web/node_modules 4 | web/coverage 5 | web/dist 6 | web/*.imagebuilt 7 | *.exe 8 | *.DS_Store 9 | cmd/edgex-ui-server/edgex-ui-server 10 | .gitmessage 11 | coverage.out 12 | /web/VERSION 13 | **/.angular/cache -------------------------------------------------------------------------------- /Jenkinsfile: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2020 Intel Corporation 3 | // 4 | // Licensed under the Apache License, Version 2.0 (the "License"); 5 | // you may not use this file except in compliance with the License. 6 | // You may obtain a copy of the License at 7 | // 8 | // http://www.apache.org/licenses/LICENSE-2.0 9 | // 10 | // Unless required by applicable law or agreed to in writing, software 11 | // distributed under the License is distributed on an "AS IS" BASIS, 12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | // See the License for the specific language governing permissions and 14 | // limitations under the License. 15 | // 16 | 17 | edgeXBuildGoApp ( 18 | project: 'edgex-ui-go' 19 | ) -------------------------------------------------------------------------------- /assets/images/metadata.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/assets/images/metadata.png -------------------------------------------------------------------------------- /bin/edgex-ui-go-launch.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Copyright (c) 2018 4 | # Tencent 5 | # 6 | # SPDX-License-Identifier: Apache-2.0 7 | # 8 | 9 | DIR=$PWD 10 | CMD=../cmd/edgex-ui-server 11 | 12 | # Kill all edgex-ui-go* stuff 13 | function cleanup { 14 | pkill edgex-ui-server 15 | } 16 | 17 | cd $CMD 18 | exec -a edgex-ui-server ./edgex-ui-server & 19 | cd $DIR 20 | 21 | trap cleanup EXIT 22 | 23 | while : ; do sleep 1 ; done 24 | -------------------------------------------------------------------------------- /bin/test-attribution-txt.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # get the directory of this script 4 | # snippet from https://stackoverflow.com/a/246128/10102404 5 | SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" 6 | GIT_ROOT=$(dirname "$SCRIPT_DIR") 7 | 8 | EXIT_CODE=0 9 | 10 | cd "$GIT_ROOT" 11 | 12 | if [ ! -f Attribution.txt ]; then 13 | echo "An Attribution.txt file is missing, please add" 14 | EXIT_CODE=1 15 | else 16 | # loop over every library in the go.mod file 17 | while IFS= read -r lib; do 18 | if ! grep -q "$lib" Attribution.txt; then 19 | echo "An attribution for $lib is missing from Attribution.txt, please add" 20 | # need to do this in a bash subshell, see SC2031 21 | (( EXIT_CODE=1 )) 22 | fi 23 | done < <(cat $GIT_ROOT/go.mod | grep -v 'module ' | grep -v TODO | grep '/' | sed 's/require //' | sed 's/replace //' | awk '{print $1}') 24 | fi 25 | -------------------------------------------------------------------------------- /cmd/edgex-ui-server/main.go: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2017-2018 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | *******************************************************************************/ 14 | 15 | package main 16 | 17 | import ( 18 | "context" 19 | 20 | "github.com/edgexfoundry/edgex-ui-go/internal/service" 21 | "github.com/gorilla/mux" 22 | ) 23 | 24 | func main() { 25 | ctx, cancel := context.WithCancel(context.Background()) 26 | service.Main(ctx, cancel, mux.NewRouter()) 27 | } 28 | -------------------------------------------------------------------------------- /cmd/edgex-ui-server/static/web/en-US/assets/img/bg_x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/cmd/edgex-ui-server/static/web/en-US/assets/img/bg_x.png -------------------------------------------------------------------------------- /cmd/edgex-ui-server/static/web/en-US/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/cmd/edgex-ui-server/static/web/en-US/favicon.ico -------------------------------------------------------------------------------- /cmd/edgex-ui-server/static/web/en-US/fontawesome-webfont.2b13baa7dd4f54c9.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/cmd/edgex-ui-server/static/web/en-US/fontawesome-webfont.2b13baa7dd4f54c9.eot -------------------------------------------------------------------------------- /cmd/edgex-ui-server/static/web/en-US/fontawesome-webfont.8a7cb27d142e3e19.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/cmd/edgex-ui-server/static/web/en-US/fontawesome-webfont.8a7cb27d142e3e19.ttf -------------------------------------------------------------------------------- /cmd/edgex-ui-server/static/web/en-US/fontawesome-webfont.cf011583fb81df9f.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/cmd/edgex-ui-server/static/web/en-US/fontawesome-webfont.cf011583fb81df9f.woff -------------------------------------------------------------------------------- /cmd/edgex-ui-server/static/web/en-US/fontawesome-webfont.e9955780856cf8aa.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/cmd/edgex-ui-server/static/web/en-US/fontawesome-webfont.e9955780856cf8aa.woff2 -------------------------------------------------------------------------------- /cmd/edgex-ui-server/static/web/zh/assets/img/bg_x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/cmd/edgex-ui-server/static/web/zh/assets/img/bg_x.png -------------------------------------------------------------------------------- /cmd/edgex-ui-server/static/web/zh/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/cmd/edgex-ui-server/static/web/zh/favicon.ico -------------------------------------------------------------------------------- /cmd/edgex-ui-server/static/web/zh/fontawesome-webfont.2b13baa7dd4f54c9.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/cmd/edgex-ui-server/static/web/zh/fontawesome-webfont.2b13baa7dd4f54c9.eot -------------------------------------------------------------------------------- /cmd/edgex-ui-server/static/web/zh/fontawesome-webfont.8a7cb27d142e3e19.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/cmd/edgex-ui-server/static/web/zh/fontawesome-webfont.8a7cb27d142e3e19.ttf -------------------------------------------------------------------------------- /cmd/edgex-ui-server/static/web/zh/fontawesome-webfont.cf011583fb81df9f.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/cmd/edgex-ui-server/static/web/zh/fontawesome-webfont.cf011583fb81df9f.woff -------------------------------------------------------------------------------- /cmd/edgex-ui-server/static/web/zh/fontawesome-webfont.e9955780856cf8aa.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/cmd/edgex-ui-server/static/web/zh/fontawesome-webfont.e9955780856cf8aa.woff2 -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/docs/README.md -------------------------------------------------------------------------------- /internal/container/container.go: -------------------------------------------------------------------------------- 1 | package container 2 | 3 | import ( 4 | "github.com/edgexfoundry/edgex-ui-go/internal/config" 5 | "github.com/edgexfoundry/go-mod-bootstrap/v4/di" 6 | ) 7 | 8 | // ConfigurationName contains the name of command's config.ConfigurationStruct implementation in the DIC. 9 | var ConfigurationName = di.TypeInstanceToName(config.ConfigurationStruct{}) 10 | 11 | // ConfigurationFrom helper function queries the DIC and returns command's config.ConfigurationStruct implementation. 12 | func ConfigurationFrom(get di.Get) *config.ConfigurationStruct { 13 | return get(ConfigurationName).(*config.ConfigurationStruct) 14 | } 15 | -------------------------------------------------------------------------------- /internal/handler/auth.go: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2017-2018 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | package handler 18 | 19 | import ( 20 | "net/http" 21 | 22 | "github.com/edgexfoundry/edgex-ui-go/internal/common" 23 | ) 24 | 25 | func (rh *ResourceHandler) SecureMode(w http.ResponseWriter, r *http.Request) { 26 | defer r.Body.Close() 27 | mode := "insecure" 28 | if common.IsSecurityEnabled() { 29 | mode = "secure" 30 | } 31 | w.Header().Set("Content-Type", "text/plain; charset=utf-8") 32 | w.Write([]byte(mode)) 33 | } 34 | -------------------------------------------------------------------------------- /internal/handler/types.go: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | package handler 18 | 19 | import "github.com/edgexfoundry/go-mod-bootstrap/v4/di" 20 | 21 | const ( 22 | metadataSvcName = "core-metadata" 23 | Authorization = "Authorization" 24 | AclOfConsulPathDirect = "/v1/acl/token/self" 25 | AclOfConsulPathProxied = "/consul" + AclOfConsulPathDirect 26 | ) 27 | 28 | type ResourceHandler struct { 29 | dic *di.Container 30 | } 31 | 32 | func NewResourceHandler(dic *di.Container) *ResourceHandler { 33 | return &ResourceHandler{dic: dic} 34 | } 35 | -------------------------------------------------------------------------------- /redeploy.sh: -------------------------------------------------------------------------------- 1 | cd ~/git/github/dovholuknf/edgex/clean/edgex-compose 2 | docker compose stop ui 3 | docker compose rm -f ui 4 | 5 | docker images -q "edgexfoundry/edgex-ui:*" | xargs docker rmi -f 6 | docker images -q "edgexfoundry/edgex-web-ui:*" | xargs docker rmi -f 7 | 8 | cd ~/git/github/dovholuknf/edgex/clean/edgex-ui-go/web 9 | rm -r dist/web/ 10 | make build 11 | 12 | cd ~/git/github/dovholuknf/edgex/clean/edgex-ui-go 13 | make web 14 | make docker 15 | 16 | echo "Update docker compose with image: edgexfoundry/edgex-ui:0.0.0-dev" 17 | 18 | cd ~/git/github/dovholuknf/edgex/clean/edgex-compose 19 | docker compose up -d ui 20 | docker compose logs -f ui -------------------------------------------------------------------------------- /testing/README.md: -------------------------------------------------------------------------------- 1 | **Test code now only supports GUI that runs in safe mode! 2 | ** 3 | 4 | ## Dependent libraries 5 | 6 | - [selenium](https://www.selenium.dev/documentation/ "selenium") 7 | - python3.7 8 | 9 | ## How to run it 10 | `cd ./common/` 11 | `vim configuration.ini` 12 | - Change the address where the actual edgex GUI is running 13 | - Replace the value of the accessToken 14 | 15 | Run the following command to start testing work 16 | `python main.py` -------------------------------------------------------------------------------- /testing/common/configuration.ini: -------------------------------------------------------------------------------- 1 | [browser] 2 | name=firefox 3 | url=http://localhost:4000 4 | accessToken=eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJlZDNhOTc2My01YTQ3LTQ1NzgtYmZkOS00NGRkZTIzMjlkY2UiLCJleHAiOjE2NDczMzIzMDQsIm5iZiI6MTY0NzMyODcwNCwiaWF0IjoxNjQ3MzI4NzA0fQ.i2D1rWmRvO4gL5WXkKg1ePhg7-FuXeTjOHFhdhCHVUFUdyNjw5ypVUbLRv-Us4bagONqBqyklikJYFGGrO07tA -------------------------------------------------------------------------------- /testing/main.py: -------------------------------------------------------------------------------- 1 | from pages.driver import Driver 2 | from pages.login import LoginPage 3 | from pages.addNewDevice import AddNewDevice 4 | from pages.devicesvc import DeviceService 5 | from pages.appsvc import AppService 6 | from pages.scheduler import Scheduler 7 | from pages.notification import Notification 8 | from pages.config import Config 9 | import time 10 | 11 | if __name__ == '__main__': 12 | print('EdgeX GUI AUTO TESTING Starting...') 13 | 14 | # driver = Driver() 15 | # time.sleep(2) 16 | 17 | lp = LoginPage() 18 | lp.login() 19 | 20 | time.sleep(2) 21 | ad = AddNewDevice(lp.getDriver()) 22 | ad.addNewDevice() 23 | 24 | # time.sleep(1) 25 | # updateSvc = DeviceService(lp.getDriver()) 26 | # updateSvc.updateSvc() 27 | 28 | # time.sleep(1) 29 | # ap = AppService(lp.getDriver()) 30 | # ap.appSvcUpddate() 31 | 32 | # time.sleep(1) 33 | # sc = Scheduler(lp.getDriver()) 34 | # sc.addIntervalAndAction() 35 | 36 | # time.sleep(1) 37 | # noti = Notification(lp.getDriver()) 38 | # noti.addSub() 39 | 40 | time.sleep(2) 41 | lp.getDriver().quit() 42 | 43 | -------------------------------------------------------------------------------- /testing/pages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/testing/pages/__init__.py -------------------------------------------------------------------------------- /testing/pages/config.py: -------------------------------------------------------------------------------- 1 | import configparser 2 | import os 3 | 4 | class Config(): 5 | def __init__(self): 6 | self.cf = configparser.ConfigParser() 7 | self.cfpath = os.path.dirname(os.path.abspath('.')) + '/common/configuration.ini' 8 | self.cf.read(self.cfpath) 9 | def getConfig(self): 10 | return self.cf 11 | def getBrowserDriver(self): 12 | return self.cf.get('browser', 'name') 13 | def getUrl(self): 14 | return self.cf.get('browser', 'url') 15 | def getAccessToken(self): 16 | return self.cf.get('browser', 'accessToken') -------------------------------------------------------------------------------- /testing/pages/deviceprofile.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | class DeviceProfile(): 4 | def __init__(self): 5 | time.sleep(1) -------------------------------------------------------------------------------- /testing/pages/devicesvc.py: -------------------------------------------------------------------------------- 1 | import time 2 | from selenium import webdriver 3 | from selenium.webdriver.common.by import By 4 | from selenium.webdriver.common.action_chains import ActionChains 5 | 6 | from pages.login import LoginPage 7 | 8 | class DeviceService(LoginPage): 9 | def __init__(self, driver): 10 | self.driver = driver 11 | def updateSvc(self): 12 | self.driver.find_element(By.CSS_SELECTOR, ".nav-link:nth-child(3) > span").click() 13 | self.driver.find_element(By.CSS_SELECTOR, ".list-group-item:nth-child(1) .badge-secondary > span").click() 14 | self.driver.find_element(By.NAME, "deviceSvcDescription").click() 15 | self.driver.find_element(By.NAME, "deviceSvcDescription").send_keys("this is device rest service") 16 | time.sleep(1) 17 | self.driver.find_element(By.CSS_SELECTOR, ".btn-success").click() 18 | -------------------------------------------------------------------------------- /testing/pages/driver.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from pages.config import Config 3 | 4 | class Driver(): 5 | def __init__(self): 6 | cf = Config() 7 | print(cf.getBrowserDriver()) 8 | if cf.getBrowserDriver() == 'firefox': 9 | self.driver = webdriver.Firefox() 10 | elif cf.getBrowserDriver() == 'chrome': 11 | self.driver = webdriver.Chrome() 12 | self.driver.get(cf.getUrl()) 13 | def getDriver(self): 14 | return self.driver 15 | -------------------------------------------------------------------------------- /testing/pages/login.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from selenium.webdriver.common.by import By 3 | from selenium.webdriver.common.action_chains import ActionChains 4 | 5 | import time 6 | from pages.driver import Driver 7 | from pages.config import Config 8 | 9 | class LoginPage(): 10 | def __init__(self): 11 | self.cf = Config() 12 | def login(self): 13 | if self.cf.getBrowserDriver() == 'firefox': 14 | self.driver = webdriver.Firefox() 15 | elif self.cf.getBrowserDriver() == 'chrome': 16 | self.driver = webdriver.Chrome() 17 | self.driver.get(self.cf.getUrl()) 18 | time.sleep(3) 19 | # self.driver.set_window_size(1680, 951) 20 | # time.sleep(1) 21 | self.driver.find_element(By.ID, "accessToken").send_keys(self.cf.getAccessToken()) 22 | time.sleep(1) 23 | self.driver.find_element(By.CSS_SELECTOR, ".btn-success").click() 24 | 25 | def getDriver(self): 26 | return self.driver -------------------------------------------------------------------------------- /version.go: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2018 Tencent 3 | // 4 | // SPDX-License-Identifier: Apache-2.0 5 | // 6 | 7 | package edgex 8 | 9 | // Global version for edgex-go 10 | var Version string = "master" 11 | -------------------------------------------------------------------------------- /web/.dockerignore: -------------------------------------------------------------------------------- 1 | * 2 | !src 3 | !.browserslistrc 4 | !*.json 5 | !*.js 6 | 7 | -------------------------------------------------------------------------------- /web/.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 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /web/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:18-alpine3.18 2 | 3 | # Install Chromium for automated testing. 4 | RUN apk add --no-cache chromium 5 | ENV CHROME_BIN=/usr/bin/chromium-browser 6 | ENV NODE_OPTIONS=--openssl-legacy-provider 7 | 8 | ENV PATH=/app/node_modules/.bin:$PATH 9 | 10 | # Configure things to work with src mounted to "/app" directory. 11 | ARG USER=1000 12 | RUN deluser --remove-home node && \ 13 | adduser -u $USER -D -s /bin/sh node 14 | USER $USER:$USER 15 | WORKDIR /app 16 | 17 | -------------------------------------------------------------------------------- /web/e2e/protractor.conf.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | // Protractor configuration file, see link for more information 3 | // https://github.com/angular/protractor/blob/master/lib/config.ts 4 | 5 | const { SpecReporter, StacktraceOption } = require('jasmine-spec-reporter'); 6 | 7 | /** 8 | * @type { import("protractor").Config } 9 | */ 10 | exports.config = { 11 | allScriptsTimeout: 11000, 12 | specs: [ 13 | './src/**/*.e2e-spec.ts' 14 | ], 15 | capabilities: { 16 | browserName: 'chrome' 17 | }, 18 | directConnect: true, 19 | SELENIUM_PROMISE_MANAGER: false, 20 | baseUrl: 'http://localhost:4200/', 21 | framework: 'jasmine', 22 | jasmineNodeOpts: { 23 | showColors: true, 24 | defaultTimeoutInterval: 30000, 25 | print: function() {} 26 | }, 27 | onPrepare() { 28 | require('ts-node').register({ 29 | project: require('path').join(__dirname, './tsconfig.json') 30 | }); 31 | jasmine.getEnv().addReporter(new SpecReporter({ 32 | spec: { 33 | displayStacktrace: StacktraceOption.PRETTY 34 | } 35 | })); 36 | } 37 | }; -------------------------------------------------------------------------------- /web/e2e/src/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { AppPage } from './app.po'; 2 | import { browser, logging } from 'protractor'; 3 | 4 | describe('workspace-project App', () => { 5 | let page: AppPage; 6 | 7 | beforeEach(() => { 8 | page = new AppPage(); 9 | }); 10 | 11 | it('should display welcome message', async () => { 12 | await page.navigateTo(); 13 | expect(await page.getTitleText()).toEqual('web app is running!'); 14 | }); 15 | 16 | afterEach(async () => { 17 | // Assert that there are no errors emitted from the browser 18 | const logs = await browser.manage().logs().get(logging.Type.BROWSER); 19 | expect(logs).not.toContain(jasmine.objectContaining({ 20 | level: logging.Level.SEVERE, 21 | } as logging.Entry)); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /web/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | async navigateTo(): Promise { 5 | return browser.get(browser.baseUrl); 6 | } 7 | 8 | async getTitleText(): Promise { 9 | return element(by.css('app-root .content span')).getText(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /web/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "../tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "../out-tsc/e2e", 6 | "module": "commonjs", 7 | "target": "es2018", 8 | "types": [ 9 | "jasmine", 10 | "node" 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /web/proxy.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "/**": { 3 | "target": "http://localhost:4000", 4 | "secure": false 5 | } 6 | } -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/insecure-secrets/insecure-secrets.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/insecure-secrets/insecure-secrets.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/add-tags/add-tags.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/pipeline-function/add-tags/add-tags.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/add-tags/add-tags.component.html: -------------------------------------------------------------------------------- 1 | 18 | 19 |
20 |
21 | 28 |
29 | 30 |
31 |
32 |
-------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/add-tags/add-tags.component.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { Component, OnInit, OnChanges, Input, Output, EventEmitter } from '@angular/core'; 18 | import { AddTags } from '../../../../contracts/v3/appsvc/functions'; 19 | 20 | @Component({ 21 | selector: 'app-appsvc-function-add-tags', 22 | templateUrl: './add-tags.component.html', 23 | styleUrls: ['./add-tags.component.css'] 24 | }) 25 | export class AddTagsComponent implements OnInit, OnChanges { 26 | 27 | @Input() addTags: AddTags 28 | @Output() addTagsChange = new EventEmitter(); 29 | 30 | constructor() { 31 | this.addTags = { 32 | Parameters: { 33 | Tags:"" 34 | } 35 | } as AddTags 36 | } 37 | 38 | ngOnInit(): void { 39 | } 40 | 41 | ngOnChanges(): void { 42 | this.addTagsChange.emit(this.addTags) 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/batch/batch.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/pipeline-function/batch/batch.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/batch/batch.component.spec.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 18 | import { FormsModule } from '@angular/forms'; 19 | 20 | import { BatchComponent } from './batch.component'; 21 | 22 | describe('BatchComponent: unit test', () => { 23 | let component: BatchComponent; 24 | let fixture: ComponentFixture; 25 | 26 | beforeEach(async () => { 27 | await TestBed.configureTestingModule({ 28 | declarations: [ BatchComponent ], 29 | imports: [FormsModule] 30 | }) 31 | .compileComponents(); 32 | }); 33 | 34 | beforeEach(() => { 35 | fixture = TestBed.createComponent(BatchComponent); 36 | component = fixture.componentInstance; 37 | fixture.detectChanges(); 38 | }); 39 | 40 | it('renders without errors', () => { 41 | expect(component).toBeTruthy(); 42 | }); 43 | }); 44 | -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/batch/batch.component.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { Component, OnInit, OnChanges, Input, Output, EventEmitter } from '@angular/core'; 18 | import { Batch } from '../../../../contracts/v3/appsvc/functions'; 19 | 20 | @Component({ 21 | selector: 'app-appsvc-function-batch', 22 | templateUrl: './batch.component.html', 23 | styleUrls: ['./batch.component.css'] 24 | }) 25 | export class BatchComponent implements OnInit, OnChanges { 26 | 27 | @Input() batch: Batch 28 | @Output() batchChange = new EventEmitter() 29 | 30 | constructor() { 31 | this.batch = { 32 | Parameters: { 33 | Mode: 'bycount', 34 | IsEventData: 'true' 35 | } 36 | } as Batch 37 | } 38 | 39 | ngOnInit(): void { 40 | } 41 | 42 | ngOnChanges(): void { 43 | this.batchChange.emit(this.batch) 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/compress/compress.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/pipeline-function/compress/compress.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/compress/compress.component.html: -------------------------------------------------------------------------------- 1 | 18 | 19 |
20 |
21 | 22 |
23 | 27 |
28 |
29 |
-------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/compress/compress.component.spec.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 18 | import { FormsModule } from '@angular/forms'; 19 | 20 | import { CompressComponent } from './compress.component'; 21 | 22 | describe('CompressComponent: unit test', () => { 23 | let component: CompressComponent; 24 | let fixture: ComponentFixture; 25 | 26 | beforeEach(async () => { 27 | await TestBed.configureTestingModule({ 28 | declarations: [ CompressComponent ], 29 | imports: [FormsModule] 30 | }).compileComponents(); 31 | 32 | fixture = TestBed.createComponent(CompressComponent); 33 | component = fixture.componentInstance; 34 | fixture.detectChanges(); 35 | }); 36 | 37 | it('renders without errors', () => { 38 | expect(component).toBeTruthy(); 39 | }); 40 | }); 41 | -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/compress/compress.component.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { Component, OnInit, OnChanges, Input, Output, EventEmitter } from '@angular/core'; 18 | import { Compress } from '../../../../contracts/v3/appsvc/functions'; 19 | 20 | @Component({ 21 | selector: 'app-appsvc-function-compress', 22 | templateUrl: './compress.component.html', 23 | styleUrls: ['./compress.component.css'] 24 | }) 25 | export class CompressComponent implements OnInit, OnChanges { 26 | 27 | @Input() compress: Compress 28 | @Output() compressChange = new EventEmitter() 29 | 30 | constructor() { 31 | this.compress = { 32 | Parameters: { 33 | Algorithm: "gzip" 34 | } 35 | } as Compress 36 | } 37 | 38 | ngOnInit(): void { 39 | } 40 | 41 | ngOnChanges(): void { 42 | this.compressChange.emit(this.compress) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/encrypt/encrypt.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/pipeline-function/encrypt/encrypt.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/encrypt/encrypt.component.spec.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 18 | import { FormsModule } from '@angular/forms'; 19 | 20 | import { EncryptComponent } from './encrypt.component'; 21 | 22 | describe('EncryptComponent: unit test', () => { 23 | let component: EncryptComponent; 24 | let fixture: ComponentFixture; 25 | 26 | beforeEach(async () => { 27 | await TestBed.configureTestingModule({ 28 | declarations: [ EncryptComponent ], 29 | imports: [FormsModule] 30 | }).compileComponents(); 31 | 32 | fixture = TestBed.createComponent(EncryptComponent); 33 | component = fixture.componentInstance; 34 | fixture.detectChanges(); 35 | }); 36 | 37 | it('renders without errors', () => { 38 | expect(component).toBeTruthy(); 39 | }); 40 | }); 41 | -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/encrypt/encrypt.component.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { Component, OnInit, OnChanges, Input, Output, EventEmitter} from '@angular/core'; 18 | import { Encrypt } from '../../../../contracts/v3/appsvc/functions'; 19 | 20 | @Component({ 21 | selector: 'app-appsvc-function-encrypt', 22 | templateUrl: './encrypt.component.html', 23 | styleUrls: ['./encrypt.component.css'] 24 | }) 25 | export class EncryptComponent implements OnInit, OnChanges { 26 | 27 | @Input() encrypt: Encrypt 28 | @Output() encryptChange = new EventEmitter() 29 | 30 | constructor() { 31 | this.encrypt = { 32 | Parameters: { 33 | Algorithm: "aes256" 34 | } 35 | } as Encrypt 36 | } 37 | 38 | ngOnInit(): void { 39 | } 40 | 41 | ngOnChanges(): void { 42 | this.encryptChange.emit(this.encrypt) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/filter-by-device-name/filter-by-device-name.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/pipeline-function/filter-by-device-name/filter-by-device-name.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/filter-by-profile-name/filter-by-profile-name.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/pipeline-function/filter-by-profile-name/filter-by-profile-name.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/filter-by-resource-name/filter-by-resource-name.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/pipeline-function/filter-by-resource-name/filter-by-resource-name.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/filter-by-source-name/filter-by-source-name.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/pipeline-function/filter-by-source-name/filter-by-source-name.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/httpexport/httpexport.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/pipeline-function/httpexport/httpexport.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/httpexport/httpexport.component.spec.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 18 | import { FormsModule } from '@angular/forms'; 19 | 20 | import { HTTPExportComponent } from './httpexport.component'; 21 | 22 | describe('HTTPExportComponent: unit test', () => { 23 | let component: HTTPExportComponent; 24 | let fixture: ComponentFixture; 25 | 26 | beforeEach(async () => { 27 | await TestBed.configureTestingModule({ 28 | declarations: [ HTTPExportComponent ], 29 | imports: [FormsModule] 30 | }).compileComponents(); 31 | 32 | fixture = TestBed.createComponent(HTTPExportComponent); 33 | component = fixture.componentInstance; 34 | fixture.detectChanges(); 35 | }); 36 | 37 | it('renders without errors', () => { 38 | expect(component).toBeTruthy(); 39 | }); 40 | }); 41 | -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/jsonlogic/jsonlogic.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/pipeline-function/jsonlogic/jsonlogic.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/jsonlogic/jsonlogic.component.html: -------------------------------------------------------------------------------- 1 | 18 | 19 |
20 |
21 | 22 |
23 | 24 |
25 |
26 |
-------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/jsonlogic/jsonlogic.component.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { Component, OnInit, OnChanges, Input, Output, EventEmitter } from '@angular/core'; 18 | import { JSONLogic } from '../../../../contracts/v3/appsvc/functions'; 19 | 20 | @Component({ 21 | selector: 'app-appsvc-function-jsonlogic', 22 | templateUrl: './jsonlogic.component.html', 23 | styleUrls: ['./jsonlogic.component.css'] 24 | }) 25 | export class JSONLogicComponent implements OnInit, OnChanges { 26 | 27 | @Input() jsonLogic: JSONLogic 28 | @Output() jsonLogicChange = new EventEmitter() 29 | 30 | constructor() { 31 | this.jsonLogic = { 32 | Parameters: { 33 | Rule: '' 34 | } 35 | } as JSONLogic 36 | } 37 | 38 | ngOnInit(): void { 39 | } 40 | 41 | ngOnChanges(): void { 42 | this.jsonLogicChange.emit(this.jsonLogic) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/mqttexport/mqttexport.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/pipeline-function/mqttexport/mqttexport.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/mqttexport/mqttexport.component.spec.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 18 | import { FormsModule } from '@angular/forms'; 19 | 20 | import { MQTTExportComponent } from './mqttexport.component'; 21 | 22 | describe('MQTTExportComponent: unit test', () => { 23 | let component: MQTTExportComponent; 24 | let fixture: ComponentFixture; 25 | 26 | beforeEach(async () => { 27 | await TestBed.configureTestingModule({ 28 | declarations: [ MQTTExportComponent ], 29 | imports: [FormsModule] 30 | }).compileComponents(); 31 | 32 | fixture = TestBed.createComponent(MQTTExportComponent); 33 | component = fixture.componentInstance; 34 | fixture.detectChanges(); 35 | }); 36 | 37 | it('renders without errors create', () => { 38 | expect(component).toBeTruthy(); 39 | }); 40 | }); 41 | -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/pipeline-function.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/pipeline-function/pipeline-function.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/push-to-core/push-to-core.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/pipeline-function/push-to-core/push-to-core.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/push-to-core/push-to-core.component.spec.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 18 | import { FormsModule } from '@angular/forms'; 19 | 20 | import { PushToCoreComponent } from './push-to-core.component'; 21 | 22 | describe('PushToCoreComponent: unit test', () => { 23 | let component: PushToCoreComponent; 24 | let fixture: ComponentFixture; 25 | 26 | beforeEach(async () => { 27 | await TestBed.configureTestingModule({ 28 | declarations: [ PushToCoreComponent ], 29 | imports: [FormsModule] 30 | }).compileComponents(); 31 | 32 | fixture = TestBed.createComponent(PushToCoreComponent); 33 | component = fixture.componentInstance; 34 | fixture.detectChanges(); 35 | }); 36 | 37 | it('renders without errors', () => { 38 | expect(component).toBeTruthy(); 39 | }); 40 | }); 41 | -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/set-response-data/set-response-data.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/pipeline-function/set-response-data/set-response-data.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/set-response-data/set-response-data.component.html: -------------------------------------------------------------------------------- 1 | 18 | 19 |
20 |
21 | 26 |
27 | 28 |
29 |
30 |
-------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/transform/transform.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/pipeline-function/transform/transform.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/transform/transform.component.html: -------------------------------------------------------------------------------- 1 | 18 | 19 |
20 |
21 | 22 |
23 | 27 |
28 |
29 |
-------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline-function/transform/transform.component.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { Component, OnInit, OnChanges, Input, Output, EventEmitter } from '@angular/core'; 18 | import { Transform } from '../../../../contracts/v3/appsvc/functions'; 19 | 20 | @Component({ 21 | selector: 'app-appsvc-function-transform', 22 | templateUrl: './transform.component.html', 23 | styleUrls: ['./transform.component.css'] 24 | }) 25 | export class TransformComponent implements OnInit, OnChanges { 26 | 27 | @Input() transform: Transform 28 | @Output() transformChange = new EventEmitter(); 29 | 30 | constructor() { 31 | this.transform = { 32 | Parameters: { 33 | Type: 'json' 34 | } 35 | } as Transform 36 | } 37 | 38 | ngOnInit(): void { 39 | } 40 | 41 | ngOnChanges(): void { 42 | this.transformChange.emit(this.transform) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/pipeline/pipeline.component.css: -------------------------------------------------------------------------------- 1 | input:disabled { 2 | cursor: not-allowed 3 | } 4 | 5 | button:disabled { 6 | cursor: not-allowed 7 | } -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/store-and-forward/store-and-forward.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/store-and-forward/store-and-forward.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-configurable/trigger/trigger.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-configurable/trigger/trigger.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service-list/app-service-list.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service-list/app-service-list.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/app-service/app-service.component.css -------------------------------------------------------------------------------- /web/src/app/app-service/app-service.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/app/app-service/app-service.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-app-service', 5 | templateUrl: './app-service.component.html', 6 | styleUrls: ['./app-service.component.css'] 7 | }) 8 | export class AppServiceComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /web/src/app/app.component.css: -------------------------------------------------------------------------------- 1 | .sidebar { 2 | position: fixed; 3 | top:0; 4 | left: 0; 5 | width: 250px; 6 | z-index: 10; 7 | } 8 | 9 | .sidebar-shrink { 10 | position: fixed; 11 | top:0; 12 | left: 0; 13 | width: 45px; 14 | z-index: 10; 15 | } 16 | 17 | .sidebar-center { 18 | background-color: rgba(45,40,72, 0.9)!important; 19 | /* min-height: calc(100vh - 48px); */ 20 | } 21 | .sidebar-header { 22 | background-color: rgba(45,40,72)!important; 23 | height: 65px; 24 | } 25 | 26 | .active-link { 27 | color: rgb(146,44,72); 28 | background-color: rgba(146,44,72, 0.4) !important; 29 | } 30 | 31 | .sidebar-center .nav-link:hover { 32 | color: rgb(146,44,72); 33 | background-color: rgba(146,44,72, 0.4) !important; 34 | } 35 | 36 | .center { 37 | position: absolute; 38 | left: 250px; 39 | right: 0; 40 | } 41 | 42 | .center-shrink { 43 | position: absolute; 44 | left: 45px; 45 | right: 0; 46 | } 47 | 48 | .center-no-shrink { 49 | position: absolute; 50 | left: 45px; 51 | right: 0; 52 | } 53 | 54 | .center-header { 55 | height: 65px; 56 | } 57 | 58 | .loading { 59 | 60 | 61 | } -------------------------------------------------------------------------------- /web/src/app/command/command-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | 4 | const routes: Routes = []; 5 | 6 | @NgModule({ 7 | imports: [RouterModule.forChild(routes)], 8 | exports: [RouterModule] 9 | }) 10 | export class CommandRoutingModule { } 11 | -------------------------------------------------------------------------------- /web/src/app/command/command-service-template/command-service-template.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/command/command-service-template/command-service-template.component.css -------------------------------------------------------------------------------- /web/src/app/command/command-service-template/interfaces/command-service-info.ts: -------------------------------------------------------------------------------- 1 | import { CoreCommandParameter, CoreCommand } from '../../../contracts/v3/core-command'; 2 | 3 | export interface CommandServiceInfo { 4 | httpMethod: string, 5 | host: string, 6 | port: number 7 | path: string, 8 | pushEventOfGetCmdParamter: string, // 'true' or 'false' 9 | returnEventOfGetCmdParamter: string, // 'true' or 'false' 10 | parametersOfPutCommand: CoreCommandParameter[] // http put method 11 | } 12 | -------------------------------------------------------------------------------- /web/src/app/command/command.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { ReactiveFormsModule } from '@angular/forms'; 5 | 6 | import { CommandRoutingModule } from './command-routing.module'; 7 | import { DeviceCoreCommandComboListComponent } from './device-core-command/device-core-command-combo-list/device-core-command-combo-list.component'; 8 | import { DeviceAssociatedCoreCommandListComponent } from './device-core-command/device-associated-core-command-list/device-associated-core-command-list.component'; 9 | import { DeviceCoreCommandListComponent } from './device-core-command/device-core-command-list/device-core-command-list.component'; 10 | import { CommandServiceTemplateComponent } from './command-service-template/command-service-template.component'; 11 | 12 | 13 | @NgModule({ 14 | declarations: [DeviceCoreCommandComboListComponent, DeviceAssociatedCoreCommandListComponent, DeviceCoreCommandListComponent, CommandServiceTemplateComponent], 15 | imports: [ 16 | CommonModule, 17 | FormsModule, 18 | ReactiveFormsModule, 19 | CommandRoutingModule 20 | ], 21 | exports: [ 22 | DeviceCoreCommandComboListComponent, DeviceAssociatedCoreCommandListComponent, DeviceCoreCommandListComponent, CommandServiceTemplateComponent 23 | ] 24 | }) 25 | export class CommandModule { } 26 | -------------------------------------------------------------------------------- /web/src/app/command/device-core-command/device-associated-core-command-list/device-associated-core-command-list.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/command/device-core-command/device-associated-core-command-list/device-associated-core-command-list.component.css -------------------------------------------------------------------------------- /web/src/app/command/device-core-command/device-core-command-combo-list/device-core-command-combo-list.component.css: -------------------------------------------------------------------------------- 1 | .cmd-combo { 2 | position: relative; 3 | right: auto; 4 | } 5 | 6 | .cmd-combo-shielder { 7 | position: fixed; 8 | top: 0; 9 | bottom: 0; 10 | right: 0; 11 | left: 0; 12 | z-index: 101; 13 | } 14 | 15 | .cmd-combo-body { 16 | position: absolute; 17 | top: 33px; 18 | bottom: auto; 19 | left: 0; 20 | right: 0; 21 | z-index: 105; 22 | visibility: visible; 23 | display: inline-block; 24 | } -------------------------------------------------------------------------------- /web/src/app/command/device-core-command/device-core-command-list/device-core-command-list.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } -------------------------------------------------------------------------------- /web/src/app/contracts/action.ts: -------------------------------------------------------------------------------- 1 | import { Response } from "./response"; 2 | 3 | export interface Action { 4 | path?: string, 5 | responses?: Response[], 6 | url?: string, 7 | } 8 | -------------------------------------------------------------------------------- /web/src/app/contracts/addressable.ts: -------------------------------------------------------------------------------- 1 | import { Timestamps } from './timestamps'; 2 | 3 | export interface Addressable extends Timestamps { 4 | id: string, 5 | name: string, 6 | protocol?: string, 7 | method?: string, 8 | address?: string, 9 | port?: number, 10 | path?: string, 11 | publisher?: string, 12 | user?: string, 13 | password?: string, 14 | topic?: string 15 | } 16 | -------------------------------------------------------------------------------- /web/src/app/contracts/auto-event.ts: -------------------------------------------------------------------------------- 1 | export interface AutoEvent { 2 | frequency?: string, 3 | onChange?: boolean, 4 | resource?: string 5 | } 6 | -------------------------------------------------------------------------------- /web/src/app/contracts/command.ts: -------------------------------------------------------------------------------- 1 | import { Get } from './get'; 2 | import { Put } from './put'; 3 | import { Timestamps } from './timestamps'; 4 | 5 | export interface Command extends Timestamps { 6 | id: string, 7 | name: string, 8 | get?: Get, 9 | put?: Put 10 | } 11 | -------------------------------------------------------------------------------- /web/src/app/contracts/device-profile.ts: -------------------------------------------------------------------------------- 1 | import { Command } from './command'; 2 | import { DeviceResource } from './device-resource'; 3 | import { ProfileResource } from './profile-resource'; 4 | import { Timestamps } from './timestamps'; 5 | 6 | export interface DeviceProfile extends Timestamps { 7 | id: string, 8 | name: string, 9 | description?: string, 10 | manufacturer?: string, 11 | model?: string, 12 | labels?: string[], 13 | deviceResources: DeviceResource[] 14 | deviceCommands: ProfileResource[], 15 | coreCommands: Command[] 16 | } 17 | -------------------------------------------------------------------------------- /web/src/app/contracts/device-resource.ts: -------------------------------------------------------------------------------- 1 | import { ProfileProperty } from "./profile-property"; 2 | 3 | export interface DeviceResource { 4 | name: string, 5 | description: string, 6 | tag: string, 7 | properties: ProfileProperty, 8 | //map[string]string 9 | attributes: any 10 | } 11 | -------------------------------------------------------------------------------- /web/src/app/contracts/device-service.ts: -------------------------------------------------------------------------------- 1 | import { Addressable } from './addressable'; 2 | import { Timestamps } from './timestamps'; 3 | 4 | export interface DeviceService extends Timestamps { 5 | id: string, 6 | name: string, 7 | description: string, 8 | adminState: string, 9 | operatingState: string, 10 | labels: string[], 11 | addressable: Addressable, 12 | lastConnected: number, 13 | lastReported: number 14 | } 15 | -------------------------------------------------------------------------------- /web/src/app/contracts/device.ts: -------------------------------------------------------------------------------- 1 | import { AutoEvent } from './auto-event'; 2 | import { DeviceService } from './device-service'; 3 | import { DeviceProfile } from './v3/device-profile'; 4 | import { Timestamps } from './timestamps'; 5 | 6 | export interface Device extends Timestamps { 7 | id: string, 8 | name: string, 9 | description?: string, 10 | adminState: string, 11 | operatingState: string, 12 | labels: string[], 13 | lastConnected: number, 14 | lastReported: number, 15 | service: DeviceService, 16 | profile: DeviceProfile, 17 | autoEvents: AutoEvent[], 18 | location?: any, 19 | protocols: any 20 | } 21 | -------------------------------------------------------------------------------- /web/src/app/contracts/get.ts: -------------------------------------------------------------------------------- 1 | import { Action } from './action'; 2 | 3 | export interface Get extends Action { 4 | } 5 | -------------------------------------------------------------------------------- /web/src/app/contracts/kuiper/rule-options.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | export interface RuleOptions { 18 | isEventTime: boolean, 19 | lateTolerance: number, 20 | concurrency: number, 21 | bufferLength: number, 22 | sendMetaToSink: boolean, 23 | sendError: boolean, 24 | qos: number, 25 | checkpointInterval: number 26 | } -------------------------------------------------------------------------------- /web/src/app/contracts/kuiper/rule.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { RuleOptions } from './rule-options'; 18 | import { Sink } from './sink'; 19 | 20 | declare type protocol = { 21 | [key: string]: any; 22 | }; 23 | 24 | export interface Rule { 25 | id: string, 26 | status: string, // 27 | sql: string, //The sql query to run for the rule 28 | actions: Sink[], //An array of sink actions 29 | options: RuleOptions //A map of options 30 | } 31 | 32 | -------------------------------------------------------------------------------- /web/src/app/contracts/kuiper/sink-base-properties.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | export interface SinkBaseProperties { // or Advanced Sink Properties 18 | concurrency: number, //Specify how many instances of the sink will be run. If the value is bigger than 1, the order of the messages may not be retained. 19 | bufferLength: number, 20 | runAsync: boolean, 21 | retryInterval: number, 22 | retryCount: number, 23 | cacheLength: number, 24 | cacheSaveInterval: number, 25 | omitIfEmpty: boolean, 26 | sendSingle?: boolean, //The output messages are received as an array. This is indicate whether to send the results one by one. 27 | dataTemplate?: string 28 | } 29 | -------------------------------------------------------------------------------- /web/src/app/contracts/kuiper/stream-fields.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | export interface StreamFields { 18 | Name: string, 19 | FieldType: string 20 | } -------------------------------------------------------------------------------- /web/src/app/contracts/kuiper/stream-options.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | export interface StreamOptions { 18 | DATASOURCE: string, 19 | FORMAT: string, 20 | TYPE: string, 21 | KEY: string, 22 | CONF_KEY: string, 23 | SHARED: boolean, // Whether the source instance will be shared across all rules using this stream 24 | STRICT_VALIDATION: boolean, 25 | TIMESTAMP: number, 26 | TIMESTAMP_FORMAT: string, 27 | RETAIN_SIZE: number 28 | } -------------------------------------------------------------------------------- /web/src/app/contracts/kuiper/stream.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { StreamFields } from './stream-fields'; 18 | import { StreamOptions } from './stream-options'; 19 | 20 | export interface Stream { 21 | Name: string; 22 | StreamFields?: StreamFields[], 23 | Options: StreamOptions 24 | } -------------------------------------------------------------------------------- /web/src/app/contracts/profile-property.ts: -------------------------------------------------------------------------------- 1 | import { PropertyValue } from "./property-value"; 2 | import { Units } from "./units"; 3 | 4 | //deprecated 5 | export interface ProfileProperty { 6 | value: PropertyValue, 7 | units: Units 8 | } 9 | -------------------------------------------------------------------------------- /web/src/app/contracts/profile-resource.ts: -------------------------------------------------------------------------------- 1 | import { ResourceOperation } from "./resource-operation"; 2 | 3 | export interface ProfileResource { 4 | name: string, 5 | get: ResourceOperation[], 6 | set: ResourceOperation[] 7 | } 8 | -------------------------------------------------------------------------------- /web/src/app/contracts/property-value.ts: -------------------------------------------------------------------------------- 1 | export interface PropertyValue { 2 | type?: string, 3 | readWrite?: string, 4 | minimum?: string, 5 | maximum?: string, 6 | defaultValue?: string, 7 | size?: string, 8 | mask?: string, 9 | shift?: string, 10 | scale?: string, 11 | offset?: string, 12 | base?: string, 13 | assertion?: string, 14 | precision?: string, 15 | floatEncoding?: string, 16 | mediaType?: string 17 | } 18 | -------------------------------------------------------------------------------- /web/src/app/contracts/protocol-properties.ts: -------------------------------------------------------------------------------- 1 | export interface ProtocolProperties { 2 | } 3 | -------------------------------------------------------------------------------- /web/src/app/contracts/put.ts: -------------------------------------------------------------------------------- 1 | import { Action } from './action'; 2 | 3 | export interface Put extends Action { 4 | parameterNames?: string[] 5 | } 6 | -------------------------------------------------------------------------------- /web/src/app/contracts/resource-operation.ts: -------------------------------------------------------------------------------- 1 | export interface ResourceOperation { 2 | index: string, 3 | operation: string, 4 | object: string, // Deprecated 5 | deviceResource: string // The replacement of Object field 6 | parameter: string, 7 | resource: string, // Deprecated 8 | deviceCommand: string // The replacement of Resource field 9 | secondary: string, 10 | mappings: any 11 | } 12 | -------------------------------------------------------------------------------- /web/src/app/contracts/response.ts: -------------------------------------------------------------------------------- 1 | export interface Response { 2 | code?: string, 3 | description?: string, 4 | expectedValues?: string[] 5 | } 6 | -------------------------------------------------------------------------------- /web/src/app/contracts/sma-operation.ts: -------------------------------------------------------------------------------- 1 | import { Action } from "./action"; 2 | 3 | export interface SmaOperation { 4 | action: string, 5 | services: string[], 6 | params?: string[] 7 | } 8 | -------------------------------------------------------------------------------- /web/src/app/contracts/timestamps.ts: -------------------------------------------------------------------------------- 1 | export interface Timestamps { 2 | created: number, 3 | modified: number 4 | } -------------------------------------------------------------------------------- /web/src/app/contracts/units.ts: -------------------------------------------------------------------------------- 1 | export interface Units { 2 | type?: string, 3 | readWrite?: string, 4 | defaultValue?: string 5 | } 6 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/address.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | export interface Address extends RESTAddress, MQTTPubAddress, EmailAddress { 18 | type: string, //REST, MQTT, EMAIL 19 | host: string, //required unless EMAIL 20 | port: number, //required unless EMAIL 21 | } 22 | 23 | interface RESTAddress { 24 | path: string, 25 | httpMethod: string //required,'GET' 'HEAD' 'POST' 'PUT' 'DELETE' 'TRACE' 'CONNECT' 26 | } 27 | 28 | interface MQTTPubAddress { 29 | publisher: string, //required 30 | topic: string, //required 31 | qos: number, 32 | keepAlive: number, 33 | retained: boolean, 34 | autoReconnect: boolean, 35 | connectTimeout: number 36 | } 37 | 38 | interface EmailAddress { 39 | recipients: string[] 40 | } 41 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/appsvc/insecure-secrets.ts: -------------------------------------------------------------------------------- 1 | export interface InsecureSecrets { 2 | DB: DB, 3 | mqtt: mqtt, 4 | http: http, 5 | AES: AES 6 | } 7 | 8 | export interface DB { 9 | Path: string, //redisdb 10 | Secrets: DBSecrets 11 | } 12 | 13 | export interface DBSecrets { 14 | username: string, 15 | password: string 16 | } 17 | 18 | export interface mqtt { 19 | Path: string, //mqtt 20 | Secrets: mqttSecrets 21 | } 22 | 23 | export interface mqttSecrets { 24 | username: string, 25 | password: string, 26 | cacert: string, 27 | clientcert: string, 28 | clientkey: string 29 | } 30 | 31 | export interface http { 32 | Path: string, //http 33 | Secrets: httpSecrets 34 | } 35 | 36 | export interface httpSecrets { 37 | headervalue: string 38 | } 39 | 40 | export interface AES { 41 | Path: string, //aes 42 | Secrets: AESSecrets 43 | } 44 | 45 | export interface AESSecrets { 46 | key: string 47 | } -------------------------------------------------------------------------------- /web/src/app/contracts/v3/appsvc/pipeline.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { Functions } from "./functions"; 18 | 19 | export interface Pipeline { 20 | UseTargetTypeOfByteArray: boolean 21 | ExecutionOrder: string //multiple values split by comma 22 | Functions: Functions | any // is not an exacted built-in Functions from Jakarta version, it is a superset of built-in Function, the name of property maybe the value with an exacted name of one built-in Function. 23 | PerTopicPipelines: {[key:string]: PerTopicPipeline} // support for multiple pipelines 24 | } 25 | 26 | export interface PerTopicPipeline{ 27 | Id: string 28 | ExecutionOrder: string 29 | Topics: string 30 | } -------------------------------------------------------------------------------- /web/src/app/contracts/v3/appsvc/store-and-forward.ts: -------------------------------------------------------------------------------- 1 | export interface StoreAndForward { 2 | Enabled: string, // 'false' or 'true', 3 | RetryInterval: string, 4 | MaxRetryCount: string 5 | } 6 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/appsvc/writable.ts: -------------------------------------------------------------------------------- 1 | import { Pipeline } from './pipeline'; 2 | import { StoreAndForward } from './store-and-forward'; 3 | import { InsecureSecrets } from './insecure-secrets'; 4 | 5 | export interface Writable { 6 | Pipeline: Pipeline, 7 | StoreAndForward: StoreAndForward, 8 | InsecureSecrets: InsecureSecrets 9 | } 10 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/auto-event.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | export interface AutoEvent { 18 | interval: string, // replace frequency 19 | //frequency: string, //deprecated 20 | onChange?: boolean, 21 | sourceName: string 22 | } 23 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/common/base-request.ts: -------------------------------------------------------------------------------- 1 | import { Versionable } from "./versionable"; 2 | 3 | export interface BaseRequest extends Versionable { 4 | requestId?: string 5 | } 6 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/common/base-response.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { Versionable } from "./versionable"; 18 | 19 | export interface BaseResponse extends Versionable { 20 | requestId: string, 21 | message: string, 22 | statusCode: number 23 | } 24 | 25 | export interface BaseWithIdResponse extends BaseResponse { 26 | id: string 27 | } 28 | 29 | // Now only be used for system agent health check 30 | export interface BaseWithServiceNameResponse extends BaseResponse { 31 | serviceName: string 32 | } 33 | 34 | // Now only be used for system agent metric check with docker executer 35 | export interface BaseWithMetricsResponse extends BaseResponse { 36 | serviceName: string, 37 | metrics: any 38 | } 39 | 40 | // Now only be used for system agent config check 41 | export interface BaseWithConfigResponse extends BaseResponse { 42 | serviceName: string, 43 | config: any 44 | } 45 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/common/count-response.ts: -------------------------------------------------------------------------------- 1 | import { BaseResponse } from "./base-response"; 2 | 3 | export interface CountResponse extends BaseResponse { 4 | Count: number 5 | } 6 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/common/db-timestamp.ts: -------------------------------------------------------------------------------- 1 | export interface DBTimestamp { 2 | created: number, 3 | modified: number 4 | } 5 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/common/versionable.ts: -------------------------------------------------------------------------------- 1 | export interface Versionable { 2 | apiVersion: string 3 | } 4 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/core-command.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | export interface CoreCommand { 18 | name: string, 19 | get: boolean, 20 | set: boolean, 21 | path: string, 22 | url: string, 23 | parameters: CoreCommandParameter[] 24 | } 25 | 26 | export interface DeviceCoreCommand { 27 | deviceName: string, 28 | profileName: string, 29 | coreCommands: CoreCommand[] 30 | } 31 | 32 | export interface CoreCommandParameter { 33 | resourceName: string, 34 | valueType: string 35 | } 36 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/device-command.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { ResourceOperation } from "./resource-operation"; 18 | 19 | export interface DeviceCommand { 20 | name: string, 21 | isHidden: boolean, 22 | readWrite: string, 23 | resourceOperations: ResourceOperation[] 24 | } 25 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/device-profile.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { DeviceResource } from "./device-resource"; 18 | import { Versionable } from "./common/versionable"; 19 | import { DBTimestamp } from './common/db-timestamp'; 20 | import { DeviceCommand } from "./device-command"; 21 | 22 | export interface DeviceProfile extends Versionable, DBTimestamp { 23 | id: string, 24 | name: string, 25 | manufacturer: string, 26 | description: string, 27 | model: string, 28 | labels: string[], 29 | deviceResources: DeviceResource[], 30 | deviceCommands: DeviceCommand[] 31 | } 32 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/device-resource.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { ResourceProperties } from './resource-properties'; 18 | 19 | export interface DeviceResource { 20 | description: string, 21 | name: string, 22 | isHidden: boolean, 23 | tag: string, 24 | properties: ResourceProperties 25 | attributes: {} 26 | } 27 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/device-service.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { Versionable } from './common/versionable'; 18 | import { DBTimestamp } from './common/db-timestamp'; 19 | 20 | export interface DeviceService extends Versionable, DBTimestamp { 21 | id: string, 22 | name: string, 23 | description: string, 24 | lastConnected: number, 25 | lastReported: number, 26 | labels: string[], 27 | baseAddress: string, 28 | adminState: string //oneof='LOCKED' 'UNLOCKED' 29 | } 30 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/device.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { AutoEvent } from './auto-event'; 18 | import { Versionable } from './common/versionable'; 19 | import { DBTimestamp } from './common/db-timestamp'; 20 | 21 | export interface Device extends Versionable, DBTimestamp { 22 | id: string, 23 | name: string, 24 | description: string, 25 | adminState: string, //oneof='LOCKED' 'UNLOCKED' 26 | operatingState: string, //oneof='UP' 'DOWN' 'UNKNOWN' 27 | lastConnected?: number, 28 | lastReported?: number, 29 | labels?: string[], 30 | location?: {} | any, 31 | serviceName: string, 32 | profileName: string, 33 | autoEvents: AutoEvent[], 34 | protocols: any 35 | } 36 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/event.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { Versionable } from './common/versionable'; 18 | import { BaseReading } from './reading'; 19 | 20 | export interface Event extends Versionable { 21 | id: string, 22 | deviceName: string, 23 | profileName: string, 24 | sourceName: string, 25 | origin: number, 26 | readings: BaseReading[], 27 | tags: {} 28 | } 29 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/interval-action.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { Address } from './address'; 18 | import { Versionable } from './common/versionable'; 19 | import { DBTimestamp } from './common/db-timestamp'; 20 | 21 | export interface IntervalAction extends Versionable, DBTimestamp { 22 | id: string, 23 | name: string, 24 | intervalName: string, 25 | address: Address 26 | content: string, 27 | contentType: string, 28 | adminState: string //oneof='LOCKED' 'UNLOCKED' 29 | } 30 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/interval.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { Versionable } from './common/versionable'; 18 | import { DBTimestamp } from './common/db-timestamp'; 19 | 20 | export interface Interval extends Versionable, DBTimestamp { 21 | id: string, 22 | name: string, 23 | start?: string, 24 | end?: string, 25 | interval: string, // replace frequency 26 | 27 | runOnce?: boolean //deprecated 28 | } 29 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/notification.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { DBTimestamp } from "./common/db-timestamp"; 18 | import { Versionable } from "./common/versionable"; 19 | 20 | export interface Notification extends Versionable, DBTimestamp { 21 | id: string, 22 | category: string, 23 | labels: string[], 24 | content: string, 25 | contentType: string, 26 | description: string, 27 | sender: string, 28 | severity: string, //oneof='MINOR' 'NORMAL' 'CRITICAL' 29 | status: string //oneof='NEW' 'PROCESSED' 'ESCALATED' 30 | } 31 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/provision-watcher.ts: -------------------------------------------------------------------------------- 1 | import { Versionable } from './common/versionable'; 2 | import { DBTimestamp } from './common/db-timestamp'; 3 | 4 | export interface ProvisionWatcher extends Versionable, DBTimestamp { 5 | id:string, 6 | name: string, 7 | labels?: string[], 8 | identifiers:{ 9 | address:string, 10 | port:string, 11 | }, 12 | blockingIdentifiers:{ 13 | port:string[], 14 | } 15 | serviceName: string, 16 | adminState: string, 17 | discoveredDevice:{ 18 | profileName: string, 19 | adminState: string, 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/reading.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { Versionable } from "./common/versionable"; 18 | 19 | export interface BaseReading extends Versionable, SimpleReading, BinaryReading { 20 | id: string, 21 | origin: number, 22 | deviceName: string, 23 | resourceName: string, 24 | profileName: string, 25 | valueType: string 26 | } 27 | 28 | export interface SimpleReading { 29 | value: string 30 | } 31 | 32 | export interface BinaryReading { 33 | binaryValue: any, 34 | mediaType: string 35 | } -------------------------------------------------------------------------------- /web/src/app/contracts/v3/register-center/service-endpoint.ts: -------------------------------------------------------------------------------- 1 | export interface ServiceEndpoint { 2 | ServiceId: string 3 | Host: string 4 | Port: number 5 | } 6 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/requests/device-profile-request.ts: -------------------------------------------------------------------------------- 1 | import { DeviceProfile } from "../device-profile"; 2 | import { BaseRequest } from "../common/base-request"; 3 | 4 | export interface DeviceProfileRequest extends BaseRequest { 5 | profile: DeviceProfile 6 | } 7 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/requests/device-request.ts: -------------------------------------------------------------------------------- 1 | import { BaseRequest } from "../common/base-request"; 2 | import { Device } from "../device"; 3 | 4 | export interface DeviceRequest extends BaseRequest { 5 | device: Device 6 | } 7 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/requests/device-service-request.ts: -------------------------------------------------------------------------------- 1 | import { BaseRequest } from "../common/base-request"; 2 | import { DeviceService } from "../device-service"; 3 | 4 | export interface DeviceServiceRequest extends BaseRequest{ 5 | service: DeviceService 6 | } 7 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/requests/interval-action-request.ts: -------------------------------------------------------------------------------- 1 | import { BaseRequest } from "../common/base-request"; 2 | import { IntervalAction } from "../interval-action"; 3 | 4 | export interface IntervalActionRequest extends BaseRequest { 5 | action: IntervalAction 6 | } 7 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/requests/interval-request.ts: -------------------------------------------------------------------------------- 1 | import { BaseRequest } from "../common/base-request"; 2 | import { Interval } from "../interval"; 3 | 4 | 5 | export interface IntervalRequest extends BaseRequest { 6 | interval: Interval 7 | } 8 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/requests/notification-request.ts: -------------------------------------------------------------------------------- 1 | import { Notification } from "../notification"; 2 | import { BaseRequest } from "../common/base-request"; 3 | 4 | export interface NotificationRequest extends BaseRequest { 5 | notification: Notification 6 | } 7 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/requests/operation-request.ts: -------------------------------------------------------------------------------- 1 | import { BaseRequest } from "../common/base-request"; 2 | 3 | export interface OperationRequest extends BaseRequest { 4 | serviceName: string, //required 5 | action: string, // oneof='start' 'stop' 'restart' 6 | } 7 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/requests/provision-watcher-request.ts: -------------------------------------------------------------------------------- 1 | import { BaseRequest } from "../common/base-request"; 2 | import { ProvisionWatcher } from "../provision-watcher"; 3 | 4 | export interface ProvisionWatcherRequest extends BaseRequest { 5 | provisionWatcher: ProvisionWatcher 6 | } 7 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/requests/subscription-request.ts: -------------------------------------------------------------------------------- 1 | import { Subscription } from "../subscription"; 2 | import { BaseRequest } from "../common/base-request"; 3 | 4 | export interface SubscriptionRequest extends BaseRequest { 5 | subscription: Subscription 6 | } 7 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/resource-operation.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | export interface ResourceOperation { 18 | deviceResource: string, // The replacement of Object field 19 | defaultValue: string, 20 | mappings: {} 21 | } 22 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/resource-properties.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | export interface ResourceProperties { 18 | valueType: string, 19 | readWrite: string, 20 | units: string, 21 | minimum: string, 22 | maximum: string, 23 | defaultValue: string, 24 | mask: string, 25 | shift: string, 26 | scale: string, 27 | offset: string, 28 | base: string, 29 | assertion: string, 30 | mediaType: string 31 | } 32 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/responses/device-core-command-response.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { BaseResponse } from "../common/base-response"; 18 | import { DeviceCoreCommand } from "../core-command"; 19 | 20 | export interface DeviceCoreCommandResponse extends BaseResponse { 21 | deviceCoreCommand: DeviceCoreCommand 22 | } 23 | 24 | export interface MultiDeviceCoreCommandsResponse extends BaseResponse { 25 | deviceCoreCommands: DeviceCoreCommand[] 26 | } 27 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/responses/device-profile-response.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { DeviceProfile } from "../device-profile"; 18 | import { BaseResponse } from "../common/base-response"; 19 | 20 | export interface DeviceProfileResponse extends BaseResponse { 21 | profile: DeviceProfile 22 | } 23 | 24 | export interface MultiDeviceProfileResponse extends BaseResponse { 25 | profiles: DeviceProfile[] 26 | } 27 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/responses/device-response.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { BaseResponse } from "../common/base-response"; 18 | import { Device } from "../device"; 19 | 20 | export interface DeviceResponse extends BaseResponse { 21 | device: Device 22 | } 23 | 24 | export interface MultiDeviceResponse extends BaseResponse { 25 | devices: Device[] 26 | } 27 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/responses/device-service-response.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { BaseResponse } from "../common/base-response"; 18 | import { DeviceService } from "../device-service"; 19 | 20 | export interface DeviceServiceResponse extends BaseResponse { 21 | service: DeviceService 22 | } 23 | 24 | export interface MultiDeviceServiceResponse extends BaseResponse { 25 | services: DeviceService[] 26 | } 27 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/responses/event-response.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { Versionable } from "../common/versionable"; 18 | import { Event } from "../event"; 19 | 20 | export interface EventResponse extends Versionable { 21 | event: Event 22 | } 23 | 24 | export interface MultiEventsResponse extends Versionable { 25 | events: Event[] 26 | } 27 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/responses/interval-action-response.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { BaseResponse } from "../common/base-response"; 18 | import { IntervalAction } from "../interval-action"; 19 | 20 | export interface IntervalActionResponse extends BaseResponse { 21 | action: IntervalAction 22 | 23 | } 24 | 25 | export interface MultiIntervalActionResponse extends BaseResponse { 26 | actions: IntervalAction[] 27 | } 28 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/responses/interval-response.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { BaseResponse } from "../common/base-response"; 18 | import { Interval } from "../interval"; 19 | 20 | export interface IntervalResponse extends BaseResponse { 21 | interval: Interval 22 | } 23 | 24 | export interface MultiIntervalResponse extends BaseResponse { 25 | intervals: Interval[] 26 | 27 | } 28 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/responses/notification-response.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { Notification } from "../notification"; 18 | import { BaseResponse } from "../common/base-response"; 19 | 20 | export interface NotificationResponse extends BaseResponse { 21 | notification: Notification 22 | } 23 | 24 | export interface MultiNotificationResponse extends BaseResponse { 25 | notifications: Notification[] 26 | } 27 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/responses/provision-watcher-response.ts: -------------------------------------------------------------------------------- 1 | import { BaseResponse } from "../common/base-response"; 2 | import { ProvisionWatcher } from "../provision-watcher"; 3 | 4 | export interface ProvisionWatcherResponse extends BaseResponse { 5 | provisionWatcher: ProvisionWatcher 6 | } 7 | 8 | export interface MultiProvisionWatcherResponse extends BaseResponse { 9 | provisionWatchers: ProvisionWatcher[] 10 | } -------------------------------------------------------------------------------- /web/src/app/contracts/v3/responses/reading-response.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { BaseResponse } from "../common/base-response"; 18 | import { BaseReading } from "../reading"; 19 | 20 | export interface ReadingResponse extends BaseResponse { 21 | reading: BaseReading 22 | } 23 | 24 | export interface MultiReadingResponse extends BaseResponse { 25 | readings: BaseReading[] 26 | } 27 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/responses/subscription-response.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { BaseResponse } from "../common/base-response"; 18 | import { Subscription } from "../subscription"; 19 | 20 | export interface SubscriptionResponse extends BaseResponse { 21 | subscription: Subscription 22 | } 23 | 24 | export interface MultiSubscriptionResponse extends BaseResponse { 25 | subscriptions: Subscription[] 26 | } 27 | -------------------------------------------------------------------------------- /web/src/app/contracts/v3/subscription.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { Versionable } from "./common/versionable"; 18 | import { Address } from './address'; 19 | import { DBTimestamp } from "./common/db-timestamp"; 20 | 21 | export interface Subscription extends Versionable, DBTimestamp { 22 | id: string, 23 | name: string, 24 | description: string, 25 | channels: Address[], 26 | receiver: string, 27 | categories: string[], 28 | labels: string[], 29 | resendLimit: number, 30 | resendInterval: string, 31 | adminState: string //oneof='LOCKED' 'UNLOCKED' 32 | } 33 | -------------------------------------------------------------------------------- /web/src/app/core-data/core-data.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/core-data/core-data.component.css -------------------------------------------------------------------------------- /web/src/app/core-data/core-data.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-core-data', 5 | templateUrl: './core-data.component.html', 6 | styleUrls: ['./core-data.component.css'] 7 | }) 8 | export class CoreDataComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /web/src/app/core-data/core-data.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | import { CoreDataRoutingModule } from './core-data-routing.module'; 5 | import { CoreDataComponent } from './core-data.component'; 6 | import { EventComponent } from './event/event.component'; 7 | import { ReadingComponent } from './reading/reading.component'; 8 | 9 | 10 | @NgModule({ 11 | declarations: [CoreDataComponent, EventComponent, ReadingComponent], 12 | imports: [ 13 | CommonModule, 14 | CoreDataRoutingModule 15 | ] 16 | }) 17 | export class CoreDataModule { } 18 | -------------------------------------------------------------------------------- /web/src/app/core-data/event/event.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } -------------------------------------------------------------------------------- /web/src/app/core-data/reading/reading.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } -------------------------------------------------------------------------------- /web/src/app/core-data/reading/reading.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | import { DataService } from '../../services/data.service'; 4 | import { MultiReadingResponse } from '../../contracts/v3/responses/reading-response'; 5 | 6 | @Component({ 7 | selector: 'app-reading', 8 | templateUrl: './reading.component.html', 9 | styleUrls: ['./reading.component.css'] 10 | }) 11 | export class ReadingComponent implements OnInit { 12 | 13 | feedInterval: any; 14 | pauseOperate: boolean = true; 15 | 16 | constructor(private dataSvc: DataService) { } 17 | 18 | ngOnInit(): void { 19 | } 20 | 21 | feedEvents() { 22 | this.feedInterval = setInterval(() => { 23 | this.dataSvc.allReadingsPagination(0,5).subscribe((resp: MultiReadingResponse) => { 24 | if (resp.readings.length === 0) { 25 | $("#data-event-stream").prepend('

' + 26 | 'no data stream available, please confirm whether there is at least one device to collect data' + 27 | '

'); 28 | return 29 | } 30 | resp.readings.forEach((r,i) => { 31 | $("#data-reading-stream").prepend('

' + JSON.stringify(r) + '

'); 32 | }) 33 | }) 34 | },3000) 35 | } 36 | 37 | start() { 38 | this.pauseOperate = false; 39 | this.feedEvents(); 40 | } 41 | 42 | pause() { 43 | this.pauseOperate = true; 44 | window.clearInterval(this.feedInterval); 45 | } 46 | 47 | operateToggle() { 48 | if (this.pauseOperate) { 49 | this.pauseOperate = false; 50 | return 51 | } 52 | this.pauseOperate = true; 53 | } 54 | 55 | ngOnDestroy() { 56 | window.clearInterval(this.feedInterval); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /web/src/app/dashboard/dashboard-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | import { DashboardComponent } from './dashboard.component'; 4 | import { AuthGuard } from '../guards/auth/guard/auth.guard'; 5 | 6 | const routes: Routes = [ 7 | { 8 | path: '', 9 | canActivate: [AuthGuard], 10 | component: DashboardComponent 11 | } 12 | ]; 13 | 14 | @NgModule({ 15 | imports: [RouterModule.forChild(routes)], 16 | exports: [RouterModule] 17 | }) 18 | export class DashboardRoutingModule { } 19 | -------------------------------------------------------------------------------- /web/src/app/dashboard/dashboard.component.css: -------------------------------------------------------------------------------- 1 | .shadow { 2 | box-shadow: 0 .5rem 1rem rgba(0,0,0,.15)!important; 3 | border-radius: .25rem!important; 4 | } 5 | 6 | .card:hover { 7 | box-shadow: 0 .5rem 1rem rgba(0,0,0,.15)!important; 8 | border-radius: .25rem!important; 9 | } 10 | -------------------------------------------------------------------------------- /web/src/app/dashboard/dashboard.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | 4 | import { DashboardRoutingModule } from './dashboard-routing.module'; 5 | import { DashboardComponent } from './dashboard.component'; 6 | 7 | 8 | @NgModule({ 9 | declarations: [DashboardComponent], 10 | imports: [ 11 | CommonModule, 12 | DashboardRoutingModule 13 | ] 14 | }) 15 | export class DashboardModule { } 16 | -------------------------------------------------------------------------------- /web/src/app/guards/auth/auth-routing.module.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { NgModule } from '@angular/core'; 18 | import { RouterModule, Routes } from '@angular/router'; 19 | import { LoginComponent } from './login/login.component'; 20 | 21 | const routes: Routes = [ 22 | { 23 | path: 'login', 24 | component: LoginComponent 25 | } 26 | ]; 27 | 28 | @NgModule({ 29 | imports: [RouterModule.forChild(routes)], 30 | exports: [RouterModule] 31 | }) 32 | export class AuthRoutingModule { } 33 | -------------------------------------------------------------------------------- /web/src/app/guards/auth/auth.module.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { NgModule } from '@angular/core'; 18 | import { CommonModule } from '@angular/common'; 19 | import { FormsModule } from '@angular/forms'; 20 | 21 | import { AuthRoutingModule } from './auth-routing.module'; 22 | import { LoginComponent } from './login/login.component'; 23 | 24 | 25 | @NgModule({ 26 | declarations: [ 27 | LoginComponent 28 | ], 29 | imports: [ 30 | CommonModule, 31 | FormsModule, 32 | AuthRoutingModule 33 | ] 34 | }) 35 | export class AuthModule { } 36 | -------------------------------------------------------------------------------- /web/src/app/guards/auth/guard/auth.guard.spec.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { TestBed } from '@angular/core/testing'; 18 | import { RouterTestingModule } from '@angular/router/testing'; 19 | import { of } from 'rxjs'; 20 | 21 | import { AuthGuard } from './auth.guard'; 22 | import { AuthService } from '../../../services/auth.service'; 23 | 24 | describe('AuthGuard: unit test', () => { 25 | let guard: AuthGuard; 26 | let mockAuthService: AuthService 27 | 28 | beforeEach(() => { 29 | mockAuthService = jasmine.createSpyObj('AuthService', { 30 | login: of({}) 31 | }) 32 | 33 | TestBed.configureTestingModule({ 34 | imports: [RouterTestingModule], 35 | providers: [{provide: AuthService, useValue: mockAuthService}] 36 | }); 37 | guard = TestBed.inject(AuthGuard); 38 | }); 39 | 40 | it('is created without errors', () => { 41 | expect(guard).toBeTruthy(); 42 | }); 43 | }); 44 | -------------------------------------------------------------------------------- /web/src/app/guards/auth/login/login.component.css: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | .login { 18 | position: fixed; 19 | top: 0; 20 | bottom: 0; 21 | left: 0; 22 | right: 0; 23 | z-index: 999; 24 | } 25 | 26 | .login-form { 27 | position: absolute; 28 | left: 0; 29 | right: 0; 30 | top: 40%; 31 | width: 350px; 32 | margin: auto; 33 | } -------------------------------------------------------------------------------- /web/src/app/guards/health/service-unavailable/service-unavailable.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } -------------------------------------------------------------------------------- /web/src/app/initializer/initializer.component.css: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | .init { 18 | position: fixed; 19 | top: 0; 20 | bottom: -100px; 21 | left: 0; 22 | right: 0; 23 | z-index: 999; 24 | } 25 | 26 | .init-progress { 27 | position: absolute; 28 | left: 0; 29 | right: 0; 30 | top: 45%; 31 | } -------------------------------------------------------------------------------- /web/src/app/initializer/initializer.component.html: -------------------------------------------------------------------------------- 1 | 18 | 19 |
20 |
21 |
22 | Loading... 23 |
24 |
25 | Loading... 26 |
27 |
28 | Loading... 29 |
30 |
31 | Loading... 32 |
33 |

{{progressMsg}}...

34 |
35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /web/src/app/message/message.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/message/message.component.css -------------------------------------------------------------------------------- /web/src/app/message/message.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 | 6 | 7 |
8 | {{message.content}} 9 |
10 |
11 |
12 |
13 | 14 | 15 | -------------------------------------------------------------------------------- /web/src/app/message/message.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit, OnDestroy } from '@angular/core'; 2 | import { MessageService } from './message.service'; 3 | import { Message } from './message.service' 4 | 5 | @Component({ 6 | selector: 'app-message', 7 | templateUrl: './message.component.html', 8 | styleUrls: ['./message.component.css'] 9 | }) 10 | export class MessageComponent implements OnInit, OnDestroy { 11 | 12 | timer: any; 13 | 14 | constructor(public messageService: MessageService) { } 15 | 16 | ngOnInit(): void { 17 | // this.timer = setInterval(() => {this.messageService.clear() }, 3000) 18 | } 19 | 20 | close(msg: Message) { 21 | this.messageService.messages.splice(this.messageService.messages.indexOf(msg), 1) 22 | } 23 | 24 | ngOnDestroy(): void { 25 | if (this.timer) { 26 | clearInterval(this.timer); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /web/src/app/message/message.service.spec.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { TestBed } from '@angular/core/testing'; 18 | 19 | import { MessageService } from './message.service'; 20 | 21 | describe('MesssageService: unit test', () => { 22 | let service: MessageService; 23 | 24 | beforeEach(() => { 25 | TestBed.configureTestingModule({}); 26 | service = TestBed.inject(MessageService); 27 | }); 28 | 29 | it('is created without errors', () => { 30 | expect(service).toBeTruthy(); 31 | }); 32 | }); 33 | -------------------------------------------------------------------------------- /web/src/app/message/message.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | export enum Type { 4 | success, 5 | danger, 6 | info 7 | } 8 | 9 | export interface Message { 10 | type?: Type, 11 | content: string, 12 | class?: string 13 | } 14 | 15 | @Injectable({ 16 | providedIn: 'root' 17 | }) 18 | export class MessageService { 19 | 20 | messages: Message[] = []; 21 | constructor() { } 22 | 23 | success(operation = 'operation', message?: string) { 24 | this.messages.push({ class: `alert alert-success shadow rounded alert-dismissible fade show`, content: `${operation} success! ${message ? message : ''}` }); 25 | } 26 | 27 | errors(message: string) { 28 | this.messages.push({ class: `alert alert-danger shadow rounded alert-dismissible fade show`, content: message }); 29 | } 30 | 31 | clear() { 32 | this.messages.shift(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /web/src/app/metadata/device-service/device-service-list/device-service-list.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } -------------------------------------------------------------------------------- /web/src/app/metadata/device-service/device-service-media-list/device-service-media-list.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/metadata/device-service/device-service-media-list/device-service-media-list.component.css -------------------------------------------------------------------------------- /web/src/app/metadata/device/add-device/add-device.component.css: -------------------------------------------------------------------------------- 1 | /* .breadcrumb > li + li:before { 2 | content: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4IiBoZWlnaHQ9IjgiPjxwYXRoIGQ9Ik0yLjUgMEwxIDEuNSAzLjUgNCAxIDYuNSAyLjUgOGw0LTQtNC00eiIgZmlsbD0iY3VycmVudENvbG9yIi8+PC9zdmc+); 3 | padding: 0 5px; 4 | } */ 5 | 6 | .breadcrumb > li + li::before { 7 | color: inherit; 8 | font-weight: inherit; 9 | content: '>>'; 10 | padding: 0 5px; 11 | } 12 | 13 | .btn[disabled]:hover { 14 | cursor: not-allowed; 15 | } -------------------------------------------------------------------------------- /web/src/app/metadata/device/device-auto-event/device-auto-event.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/metadata/device/device-auto-event/device-auto-event.component.css -------------------------------------------------------------------------------- /web/src/app/metadata/device/device-center/device-center.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/metadata/device/device-center/device-center.component.css -------------------------------------------------------------------------------- /web/src/app/metadata/device/device-center/device-center.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/app/metadata/device/device-center/device-center.component.spec.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 18 | import { RouterTestingModule } from '@angular/router/testing'; 19 | 20 | import { DeviceCenterComponent } from './device-center.component'; 21 | 22 | describe('DeviceCenterComponent', () => { 23 | let component: DeviceCenterComponent; 24 | let fixture: ComponentFixture; 25 | 26 | beforeEach(async () => { 27 | await TestBed.configureTestingModule({ 28 | declarations: [ DeviceCenterComponent ], 29 | imports: [RouterTestingModule] 30 | }).compileComponents(); 31 | 32 | fixture = TestBed.createComponent(DeviceCenterComponent); 33 | component = fixture.componentInstance; 34 | fixture.detectChanges(); 35 | }); 36 | 37 | it('renders without errors', () => { 38 | expect(component).toBeTruthy(); 39 | }); 40 | }); 41 | -------------------------------------------------------------------------------- /web/src/app/metadata/device/device-center/device-center.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-device-center', 5 | templateUrl: './device-center.component.html', 6 | styleUrls: ['./device-center.component.css'] 7 | }) 8 | export class DeviceCenterComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /web/src/app/metadata/device/device-combo-list/device-combo-list.component.css: -------------------------------------------------------------------------------- 1 | .combo { 2 | position: relative; 3 | right: auto; 4 | } 5 | 6 | .combo-shielder { 7 | position: fixed; 8 | top: 0; 9 | bottom: 0; 10 | right: 0; 11 | left: 0; 12 | z-index: 100; 13 | } 14 | 15 | .combo-body { 16 | position: absolute; 17 | top: 33px; 18 | bottom: auto; 19 | left: 0; 20 | right: 0; 21 | z-index: 105; 22 | visibility: visible; 23 | display: inline-block; 24 | } -------------------------------------------------------------------------------- /web/src/app/metadata/device/device-command-viewer/device-command-viewer.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/metadata/device/device-command-viewer/device-command-viewer.component.css -------------------------------------------------------------------------------- /web/src/app/metadata/device/device-list/device-list.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } -------------------------------------------------------------------------------- /web/src/app/metadata/device/device-protocol/device-protocol.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/metadata/device/device-protocol/device-protocol.component.css -------------------------------------------------------------------------------- /web/src/app/metadata/device/edit-device/edit-device.component.css: -------------------------------------------------------------------------------- 1 | input[disabled]:hover { 2 | cursor: not-allowed; 3 | } 4 | 5 | .btn[disabled]:hover { 6 | cursor: not-allowed; 7 | } -------------------------------------------------------------------------------- /web/src/app/metadata/metadata.component.css: -------------------------------------------------------------------------------- 1 | .active-link { 2 | color: rgb(146,44,72); 3 | background-color: rgba(146,44,72, 0.4) !important; 4 | } -------------------------------------------------------------------------------- /web/src/app/metadata/metadata.component.spec.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 18 | import { RouterTestingModule } from '@angular/router/testing'; 19 | 20 | import { MetadataComponent } from './metadata.component'; 21 | 22 | describe('DeviceServiceComponent', () => { 23 | let component: MetadataComponent; 24 | let fixture: ComponentFixture; 25 | 26 | beforeEach(async () => { 27 | await TestBed.configureTestingModule({ 28 | declarations: [ MetadataComponent ], 29 | imports: [RouterTestingModule] 30 | }).compileComponents(); 31 | 32 | fixture = TestBed.createComponent(MetadataComponent); 33 | component = fixture.componentInstance; 34 | fixture.detectChanges(); 35 | }); 36 | 37 | it('renders without errors', () => { 38 | expect(component).toBeTruthy(); 39 | }); 40 | }); 41 | -------------------------------------------------------------------------------- /web/src/app/metadata/metadata.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-metadata', 5 | templateUrl: './metadata.component.html', 6 | styleUrls: ['./metadata.component.css'] 7 | }) 8 | export class MetadataComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void {} 13 | 14 | } 15 | -------------------------------------------------------------------------------- /web/src/app/metadata/profile/add-profile/add-profile.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/metadata/profile/add-profile/add-profile.component.css -------------------------------------------------------------------------------- /web/src/app/metadata/profile/add-profile/add-profile.component.html: -------------------------------------------------------------------------------- 1 | 18 | 19 |
20 |
21 | 22 | 23 | Add Profile 24 |  drag-and-drop is enabled 25 | 26 | 27 | 31 | 32 |
33 | 34 |
35 | 36 |
37 |
38 | -------------------------------------------------------------------------------- /web/src/app/metadata/profile/device-profile-center/device-profile-center.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/metadata/profile/device-profile-center/device-profile-center.component.css -------------------------------------------------------------------------------- /web/src/app/metadata/profile/device-profile-center/device-profile-center.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/app/metadata/profile/device-profile-center/device-profile-center.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-device-profile-center', 5 | templateUrl: './device-profile-center.component.html', 6 | styleUrls: ['./device-profile-center.component.css'] 7 | }) 8 | export class DeviceProfileCenterComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /web/src/app/metadata/profile/device-profile-combo-list/device-profile-combo-list.component.css: -------------------------------------------------------------------------------- 1 | .combo { 2 | position: relative; 3 | right: auto; 4 | } 5 | 6 | .combo-shielder { 7 | position: fixed; 8 | top: 0; 9 | bottom: 0; 10 | right: 0; 11 | left: 0; 12 | z-index: 100; 13 | } 14 | 15 | .combo-body { 16 | position: absolute; 17 | top: 33px; 18 | bottom: auto; 19 | left: 0; 20 | right: 0; 21 | z-index: 105; 22 | visibility: visible; 23 | display: inline-block; 24 | } -------------------------------------------------------------------------------- /web/src/app/metadata/profile/device-profile-list/device-profile-list.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } -------------------------------------------------------------------------------- /web/src/app/metadata/profile/edit-profile/edit-profile.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/metadata/profile/edit-profile/edit-profile.component.css -------------------------------------------------------------------------------- /web/src/app/metadata/profile/edit-profile/edit-profile.component.html: -------------------------------------------------------------------------------- 1 | 18 | 19 |
20 |
21 | 22 | {{profileName}} 23 | 24 | 25 | 28 | 29 |
30 | 31 |
32 | 33 |
34 |
35 | -------------------------------------------------------------------------------- /web/src/app/metadata/profile/resource-combo-list/resource-combo-list.component.css: -------------------------------------------------------------------------------- 1 | .combo { 2 | position: relative; 3 | right: auto; 4 | } 5 | 6 | .combo-shielder { 7 | position: fixed; 8 | top: 0; 9 | bottom: 0; 10 | right: 0; 11 | left: 0; 12 | z-index: 100; 13 | } 14 | 15 | .combo-body { 16 | position: absolute; 17 | top: 33px; 18 | bottom: auto; 19 | left: 0; 20 | right: 0; 21 | z-index: 105; 22 | visibility: visible; 23 | display: inline-block; 24 | } -------------------------------------------------------------------------------- /web/src/app/metadata/profile/source-combo-list/source-combo-list.component.css: -------------------------------------------------------------------------------- 1 | .combo { 2 | position: relative; 3 | right: auto; 4 | } 5 | 6 | .combo-shielder { 7 | position: fixed; 8 | top: 0; 9 | bottom: 0; 10 | right: 0; 11 | left: 0; 12 | z-index: 100; 13 | } 14 | 15 | .combo-body { 16 | position: absolute; 17 | top: 33px; 18 | bottom: auto; 19 | left: 0; 20 | right: 0; 21 | z-index: 105; 22 | visibility: visible; 23 | display: inline-block; 24 | } -------------------------------------------------------------------------------- /web/src/app/metadata/provision-watcher/add-provision-watcher/add-provision-watcher.component.css: -------------------------------------------------------------------------------- 1 | /* .breadcrumb > li + li:before { 2 | content: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4IiBoZWlnaHQ9IjgiPjxwYXRoIGQ9Ik0yLjUgMEwxIDEuNSAzLjUgNCAxIDYuNSAyLjUgOGw0LTQtNC00eiIgZmlsbD0iY3VycmVudENvbG9yIi8+PC9zdmc+); 3 | padding: 0 5px; 4 | } */ 5 | 6 | .breadcrumb > li + li::before { 7 | color: inherit; 8 | font-weight: inherit; 9 | content: '>>'; 10 | padding: 0 5px; 11 | } 12 | 13 | .btn[disabled]:hover { 14 | cursor: not-allowed; 15 | } -------------------------------------------------------------------------------- /web/src/app/metadata/provision-watcher/add-provision-watcher/add-provision-watcher.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { NO_ERRORS_SCHEMA } from '@angular/core'; 2 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 3 | import { RouterTestingModule } from '@angular/router/testing'; 4 | import { FormsModule } from '@angular/forms'; 5 | import { of } from 'rxjs'; 6 | 7 | import { AddProvisionWatcherComponent } from './add-provision-watcher.component'; 8 | import { MetadataService } from '../../../services/metadata.service'; 9 | describe('AddProvisionWatcherComponent', () => { 10 | let component: AddProvisionWatcherComponent; 11 | let fixture: ComponentFixture; 12 | let mockMetadataService: MetadataService 13 | 14 | beforeEach(async () => { 15 | mockMetadataService = jasmine.createSpyObj('MetadataService', { 16 | ping: of({}) 17 | }) 18 | 19 | await TestBed.configureTestingModule({ 20 | imports: [RouterTestingModule, FormsModule], 21 | declarations: [ AddProvisionWatcherComponent ], 22 | providers: [ 23 | {provide: MetadataService, useValue: mockMetadataService} 24 | ], 25 | schemas: [NO_ERRORS_SCHEMA] 26 | }) 27 | .compileComponents(); 28 | }); 29 | 30 | beforeEach(() => { 31 | fixture = TestBed.createComponent(AddProvisionWatcherComponent); 32 | component = fixture.componentInstance; 33 | fixture.detectChanges(); 34 | }); 35 | 36 | it('should create', () => { 37 | expect(component).toBeTruthy(); 38 | }); 39 | }); 40 | -------------------------------------------------------------------------------- /web/src/app/metadata/provision-watcher/edit-provision-watcher/edit-provision-watcher.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/metadata/provision-watcher/edit-provision-watcher/edit-provision-watcher.component.css -------------------------------------------------------------------------------- /web/src/app/metadata/provision-watcher/edit-provision-watcher/edit-provision-watcher.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | import { FormsModule } from '@angular/forms'; 3 | import { RouterTestingModule } from '@angular/router/testing'; 4 | import { of } from 'rxjs'; 5 | 6 | import { EditProvisionWatcherComponent } from './edit-provision-watcher.component'; 7 | import { MetadataService } from '../../../services/metadata.service'; 8 | describe('EditProvisionWatcherComponent', () => { 9 | let component: EditProvisionWatcherComponent; 10 | let fixture: ComponentFixture; 11 | let mockMetadataService: MetadataService 12 | 13 | beforeEach(async () => { 14 | mockMetadataService = jasmine.createSpyObj('MetadataService', { 15 | ping: of({}) 16 | }) 17 | 18 | await TestBed.configureTestingModule({ 19 | declarations: [ EditProvisionWatcherComponent ], 20 | imports: [RouterTestingModule, FormsModule], 21 | providers: [{provide: MetadataService, useValue: mockMetadataService}] 22 | }).compileComponents(); 23 | 24 | fixture = TestBed.createComponent(EditProvisionWatcherComponent); 25 | component = fixture.componentInstance; 26 | fixture.detectChanges(); 27 | }); 28 | 29 | it('should create', () => { 30 | expect(component).toBeTruthy(); 31 | }); 32 | }); 33 | -------------------------------------------------------------------------------- /web/src/app/metadata/provision-watcher/provision-watcher-center/provision-watcher-center.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/metadata/provision-watcher/provision-watcher-center/provision-watcher-center.component.css -------------------------------------------------------------------------------- /web/src/app/metadata/provision-watcher/provision-watcher-center/provision-watcher-center.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/app/metadata/provision-watcher/provision-watcher-center/provision-watcher-center.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ProvisionWatcherCenterComponent } from './provision-watcher-center.component'; 4 | 5 | describe('ProvisionWatcherCenterComponent', () => { 6 | let component: ProvisionWatcherCenterComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ ProvisionWatcherCenterComponent ] 12 | }) 13 | .compileComponents(); 14 | }); 15 | 16 | beforeEach(() => { 17 | fixture = TestBed.createComponent(ProvisionWatcherCenterComponent); 18 | component = fixture.componentInstance; 19 | fixture.detectChanges(); 20 | }); 21 | 22 | it('should create', () => { 23 | expect(component).toBeTruthy(); 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /web/src/app/metadata/provision-watcher/provision-watcher-center/provision-watcher-center.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-provision-watcher-center', 5 | templateUrl: './provision-watcher-center.component.html', 6 | styleUrls: ['./provision-watcher-center.component.css'] 7 | }) 8 | export class ProvisionWatcherCenterComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /web/src/app/metadata/provision-watcher/provision-watcher-list/provision-watcher-list.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } -------------------------------------------------------------------------------- /web/src/app/notifications/notification/notification-center/notification-center.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/notifications/notification/notification-center/notification-center.component.css -------------------------------------------------------------------------------- /web/src/app/notifications/notification/notification-center/notification-center.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/app/notifications/notification/notification-center/notification-center.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-notification-center', 5 | templateUrl: './notification-center.component.html', 6 | styleUrls: ['./notification-center.component.css'] 7 | }) 8 | export class NotificationCenterComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /web/src/app/notifications/notification/notification-list/notification-list.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } -------------------------------------------------------------------------------- /web/src/app/notifications/notifications.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/notifications/notifications.component.css -------------------------------------------------------------------------------- /web/src/app/notifications/notifications.component.html: -------------------------------------------------------------------------------- 1 | 18 | 19 |
20 |
21 | 29 |
30 |
31 | 32 |
33 |
-------------------------------------------------------------------------------- /web/src/app/notifications/notifications.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-notifications', 5 | templateUrl: './notifications.component.html', 6 | styleUrls: ['./notifications.component.css'] 7 | }) 8 | export class NotificationsComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /web/src/app/notifications/notifications.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { CommonModule } from '@angular/common'; 3 | import { FormsModule } from '@angular/forms'; 4 | 5 | import { NotificationsRoutingModule } from './notifications-routing.module'; 6 | import { NotificationsComponent } from './notifications.component'; 7 | import { SubscriptionListComponent } from './subscription/subscription-list/subscription-list.component'; 8 | import { AddSubscriptionComponent } from './subscription/add-subscription/add-subscription.component'; 9 | import { EditSubscriptionComponent } from './subscription/edit-subscription/edit-subscription.component'; 10 | import { SubscriptionCenterComponent } from './subscription/subscription-center/subscription-center.component'; 11 | import { NotificationListComponent } from './notification/notification-list/notification-list.component'; 12 | import { NotificationCenterComponent } from './notification/notification-center/notification-center.component'; 13 | 14 | @NgModule({ 15 | declarations: [NotificationsComponent, SubscriptionListComponent, AddSubscriptionComponent, EditSubscriptionComponent, SubscriptionCenterComponent, NotificationListComponent, NotificationCenterComponent], 16 | imports: [ 17 | CommonModule, 18 | FormsModule, 19 | NotificationsRoutingModule 20 | ] 21 | }) 22 | export class NotificationsModule { } 23 | -------------------------------------------------------------------------------- /web/src/app/notifications/subscription/add-subscription/add-subscription.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/notifications/subscription/add-subscription/add-subscription.component.css -------------------------------------------------------------------------------- /web/src/app/notifications/subscription/edit-subscription/edit-subscription.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/notifications/subscription/edit-subscription/edit-subscription.component.css -------------------------------------------------------------------------------- /web/src/app/notifications/subscription/subscription-center/subscription-center.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/notifications/subscription/subscription-center/subscription-center.component.css -------------------------------------------------------------------------------- /web/src/app/notifications/subscription/subscription-center/subscription-center.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/app/notifications/subscription/subscription-center/subscription-center.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-subscription-center', 5 | templateUrl: './subscription-center.component.html', 6 | styleUrls: ['./subscription-center.component.css'] 7 | }) 8 | export class SubscriptionCenterComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /web/src/app/notifications/subscription/subscription-list/subscription-list.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/notifications/subscription/subscription-list/subscription-list.component.css -------------------------------------------------------------------------------- /web/src/app/rule-engine/rule-engine.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/rule-engine/rule-engine.component.css -------------------------------------------------------------------------------- /web/src/app/rule-engine/rule-engine.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 11 |
12 |
13 | 14 |
15 |
-------------------------------------------------------------------------------- /web/src/app/rule-engine/rule-engine.component.spec.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 18 | import { RouterTestingModule } from '@angular/router/testing' 19 | 20 | import { RuleEngineComponent } from './rule-engine.component'; 21 | 22 | describe('RuleEngineComponent: unit test', () => { 23 | let component: RuleEngineComponent; 24 | let fixture: ComponentFixture; 25 | 26 | beforeEach(async () => { 27 | await TestBed.configureTestingModule({ 28 | declarations: [ RuleEngineComponent ], 29 | imports: [RouterTestingModule] 30 | }).compileComponents(); 31 | 32 | fixture = TestBed.createComponent(RuleEngineComponent); 33 | component = fixture.componentInstance; 34 | fixture.detectChanges(); 35 | }); 36 | 37 | it('is created without errors', () => { 38 | expect(component).toBeTruthy(); 39 | }); 40 | }); 41 | -------------------------------------------------------------------------------- /web/src/app/rule-engine/rule-engine.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-rule-engine', 5 | templateUrl: './rule-engine.component.html', 6 | styleUrls: ['./rule-engine.component.css'] 7 | }) 8 | export class RuleEngineComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /web/src/app/rule-engine/rules/add-rules/add-rules.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } -------------------------------------------------------------------------------- /web/src/app/rule-engine/rules/edit-rules/edit-rules.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/rule-engine/rules/edit-rules/edit-rules.component.css -------------------------------------------------------------------------------- /web/src/app/rule-engine/rules/rule-advanced-options/rule-advanced-options.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/rule-engine/rules/rule-advanced-options/rule-advanced-options.component.css -------------------------------------------------------------------------------- /web/src/app/rule-engine/rules/rules-center/rules-center.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/rule-engine/rules/rules-center/rules-center.component.css -------------------------------------------------------------------------------- /web/src/app/rule-engine/rules/rules-center/rules-center.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/app/rule-engine/rules/rules-center/rules-center.component.spec.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 18 | import { RouterTestingModule } from '@angular/router/testing'; 19 | 20 | import { RulesCenterComponent } from './rules-center.component'; 21 | 22 | describe('RulesCenterComponent: unit test', () => { 23 | let component: RulesCenterComponent; 24 | let fixture: ComponentFixture; 25 | 26 | beforeEach(async () => { 27 | await TestBed.configureTestingModule({ 28 | declarations: [ RulesCenterComponent ], 29 | imports: [RouterTestingModule] 30 | }).compileComponents(); 31 | 32 | fixture = TestBed.createComponent(RulesCenterComponent); 33 | component = fixture.componentInstance; 34 | fixture.detectChanges(); 35 | }); 36 | 37 | it('is created without errors', () => { 38 | expect(component).toBeTruthy(); 39 | }); 40 | }); 41 | -------------------------------------------------------------------------------- /web/src/app/rule-engine/rules/rules-center/rules-center.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-rules-center', 5 | templateUrl: './rules-center.component.html', 6 | styleUrls: ['./rules-center.component.css'] 7 | }) 8 | export class RulesCenterComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /web/src/app/rule-engine/rules/rules-list/rules-list.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } 4 | -------------------------------------------------------------------------------- /web/src/app/rule-engine/rules/sinks/edgex-sink/edgex-sink-optional/edgex-sink-optional.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/rule-engine/rules/sinks/edgex-sink/edgex-sink-optional/edgex-sink-optional.component.css -------------------------------------------------------------------------------- /web/src/app/rule-engine/rules/sinks/edgex-sink/edgex-sink.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/rule-engine/rules/sinks/edgex-sink/edgex-sink.component.css -------------------------------------------------------------------------------- /web/src/app/rule-engine/rules/sinks/log-sink/log-sink.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/rule-engine/rules/sinks/log-sink/log-sink.component.css -------------------------------------------------------------------------------- /web/src/app/rule-engine/rules/sinks/mqtt-sink/mqtt-sink.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/rule-engine/rules/sinks/mqtt-sink/mqtt-sink.component.css -------------------------------------------------------------------------------- /web/src/app/rule-engine/rules/sinks/nop-sink/nop-sink.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/rule-engine/rules/sinks/nop-sink/nop-sink.component.css -------------------------------------------------------------------------------- /web/src/app/rule-engine/rules/sinks/rest-sink/rest-sink.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/rule-engine/rules/sinks/rest-sink/rest-sink.component.css -------------------------------------------------------------------------------- /web/src/app/rule-engine/rules/sinks/sink-base-properties/sink-base-properties.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/rule-engine/rules/sinks/sink-base-properties/sink-base-properties.component.css -------------------------------------------------------------------------------- /web/src/app/rule-engine/rules/sinks/sink-list/sink-list.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } -------------------------------------------------------------------------------- /web/src/app/rule-engine/rules/sinks/sink-list/sink-list.component.spec.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 18 | 19 | import { SinkListComponent } from './sink-list.component'; 20 | 21 | describe('SinkListComponent: unit test', () => { 22 | let component: SinkListComponent; 23 | let fixture: ComponentFixture; 24 | 25 | beforeEach(async () => { 26 | await TestBed.configureTestingModule({ 27 | declarations: [ SinkListComponent ] 28 | }).compileComponents(); 29 | 30 | fixture = TestBed.createComponent(SinkListComponent); 31 | component = fixture.componentInstance; 32 | fixture.detectChanges(); 33 | }); 34 | 35 | it('is created without errors', () => { 36 | expect(component).toBeTruthy(); 37 | }); 38 | }); 39 | -------------------------------------------------------------------------------- /web/src/app/rule-engine/stream/add-stream/add-stream.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } -------------------------------------------------------------------------------- /web/src/app/rule-engine/stream/edit-stream/edit-stream.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } -------------------------------------------------------------------------------- /web/src/app/rule-engine/stream/stream-center/stream-center.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/rule-engine/stream/stream-center/stream-center.component.css -------------------------------------------------------------------------------- /web/src/app/rule-engine/stream/stream-center/stream-center.component.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/app/rule-engine/stream/stream-center/stream-center.component.spec.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 18 | import { RouterTestingModule } from '@angular/router/testing'; 19 | 20 | import { StreamCenterComponent } from './stream-center.component'; 21 | 22 | describe('StreamCenterComponent', () => { 23 | let component: StreamCenterComponent; 24 | let fixture: ComponentFixture; 25 | 26 | beforeEach(async () => { 27 | await TestBed.configureTestingModule({ 28 | declarations: [ StreamCenterComponent ], 29 | imports: [RouterTestingModule] 30 | }).compileComponents(); 31 | 32 | fixture = TestBed.createComponent(StreamCenterComponent); 33 | component = fixture.componentInstance; 34 | fixture.detectChanges(); 35 | }); 36 | 37 | it('is created without errors', () => { 38 | expect(component).toBeTruthy(); 39 | }); 40 | }); 41 | -------------------------------------------------------------------------------- /web/src/app/rule-engine/stream/stream-center/stream-center.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-stream-center', 5 | templateUrl: './stream-center.component.html', 6 | styleUrls: ['./stream-center.component.css'] 7 | }) 8 | export class StreamCenterComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /web/src/app/rule-engine/stream/stream-list/stream-list.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } 4 | #addStreamDialog #editStreamDialog{ 5 | margin-top: 10%; 6 | } -------------------------------------------------------------------------------- /web/src/app/scheduler/interval/add-interval/add-interval.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } -------------------------------------------------------------------------------- /web/src/app/scheduler/interval/edit-interval/edit-interval.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } -------------------------------------------------------------------------------- /web/src/app/scheduler/interval/interval-center/interval-center.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/scheduler/interval/interval-center/interval-center.component.css -------------------------------------------------------------------------------- /web/src/app/scheduler/interval/interval-center/interval-center.component.html: -------------------------------------------------------------------------------- 1 | 18 | 19 | -------------------------------------------------------------------------------- /web/src/app/scheduler/interval/interval-center/interval-center.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-interval-center', 5 | templateUrl: './interval-center.component.html', 6 | styleUrls: ['./interval-center.component.css'] 7 | }) 8 | export class IntervalCenterComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /web/src/app/scheduler/interval/interval-combo-list/interval-combo-list.component.css: -------------------------------------------------------------------------------- 1 | .combo { 2 | position: relative; 3 | right: auto; 4 | } 5 | 6 | .combo-shielder { 7 | position: fixed; 8 | top: 0; 9 | bottom: 0; 10 | right: 0; 11 | left: 0; 12 | z-index: 100; 13 | } 14 | 15 | .combo-body { 16 | position: absolute; 17 | top: 33px; 18 | bottom: auto; 19 | left: 0; 20 | right: 0; 21 | z-index: 105; 22 | visibility: visible; 23 | display: inline-block; 24 | } -------------------------------------------------------------------------------- /web/src/app/scheduler/interval/interval-list/interval-list.component.css: -------------------------------------------------------------------------------- 1 | .btn[disabled]:hover { 2 | cursor: not-allowed; 3 | } -------------------------------------------------------------------------------- /web/src/app/scheduler/intervalaction/add-interval-action/add-interval-action.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/scheduler/intervalaction/add-interval-action/add-interval-action.component.css -------------------------------------------------------------------------------- /web/src/app/scheduler/intervalaction/edit-interval-action/edit-interval-action.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/scheduler/intervalaction/edit-interval-action/edit-interval-action.component.css -------------------------------------------------------------------------------- /web/src/app/scheduler/intervalaction/interval-action-center/interval-action-center.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/scheduler/intervalaction/interval-action-center/interval-action-center.component.css -------------------------------------------------------------------------------- /web/src/app/scheduler/intervalaction/interval-action-center/interval-action-center.component.html: -------------------------------------------------------------------------------- 1 | 18 | 19 | -------------------------------------------------------------------------------- /web/src/app/scheduler/intervalaction/interval-action-center/interval-action-center.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-interval-action-center', 5 | templateUrl: './interval-action-center.component.html', 6 | styleUrls: ['./interval-action-center.component.css'] 7 | }) 8 | export class IntervalActionCenterComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /web/src/app/scheduler/intervalaction/interval-action-list/interval-action-list.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/scheduler/intervalaction/interval-action-list/interval-action-list.component.css -------------------------------------------------------------------------------- /web/src/app/scheduler/scheduler.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/app/scheduler/scheduler.component.css -------------------------------------------------------------------------------- /web/src/app/scheduler/scheduler.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 15 |
16 |
17 | 18 |
19 |
-------------------------------------------------------------------------------- /web/src/app/scheduler/scheduler.component.spec.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2022-2023 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { NO_ERRORS_SCHEMA } from '@angular/core'; 18 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 19 | 20 | import { SchedulerComponent } from './scheduler.component'; 21 | 22 | describe('SchedulerComponent: unit test', () => { 23 | let component: SchedulerComponent; 24 | let fixture: ComponentFixture; 25 | 26 | beforeEach(async () => { 27 | await TestBed.configureTestingModule({ 28 | declarations: [ SchedulerComponent ], 29 | schemas: [NO_ERRORS_SCHEMA] 30 | }).compileComponents(); 31 | 32 | fixture = TestBed.createComponent(SchedulerComponent); 33 | component = fixture.componentInstance; 34 | fixture.detectChanges(); 35 | }); 36 | 37 | it('is created without errors', () => { 38 | expect(component).toBeTruthy(); 39 | }); 40 | }); 41 | -------------------------------------------------------------------------------- /web/src/app/scheduler/scheduler.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-scheduler', 5 | templateUrl: './scheduler.component.html', 6 | styleUrls: ['./scheduler.component.css'] 7 | }) 8 | export class SchedulerComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit(): void { 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /web/src/app/services/init.service.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { Injectable } from '@angular/core'; 18 | import { HttpClient, HttpHeaders } from '@angular/common/http'; 19 | import { Observable } from 'rxjs'; 20 | import { catchError } from 'rxjs/operators'; 21 | 22 | import { ErrorService } from './error.service'; 23 | 24 | @Injectable({ 25 | providedIn: 'root' 26 | }) 27 | export class InitService { 28 | 29 | endpoint: string = ""; 30 | version: string = "/api/v3"; 31 | urlPrefix: string = `${this.endpoint}${this.version}`; 32 | 33 | secureModeUrl: string = `${this.urlPrefix}/auth/securemode`; 34 | 35 | constructor(private http: HttpClient, private errorSvc: ErrorService) { } 36 | 37 | getSecureMode(): Observable { 38 | let url = `${this.secureModeUrl}`; 39 | return this.http.get(url, {responseType: 'text'}).pipe( 40 | catchError(error => this.errorSvc.handleError(error)) 41 | ) 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /web/src/app/services/interceptors/index.ts: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright © 2021-2022 VMware, Inc. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 | * in compliance with the License. You may obtain a copy of the License at 6 | * 7 | * http://www.apache.org/licenses/LICENSE-2.0 8 | * 9 | * Unless required by applicable law or agreed to in writing, software distributed under the License 10 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 | * or implied. See the License for the specific language governing permissions and limitations under 12 | * the License. 13 | * 14 | * @author: Huaqiao Zhang, 15 | *******************************************************************************/ 16 | 17 | import { HTTP_INTERCEPTORS } from '@angular/common/http'; 18 | import { AuthInterceptor } from './auth.interceptor'; 19 | 20 | export const httpInterceptorProviders = [ 21 | { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }, 22 | ]; -------------------------------------------------------------------------------- /web/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/assets/.gitkeep -------------------------------------------------------------------------------- /web/src/assets/img/bg_x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/assets/img/bg_x.png -------------------------------------------------------------------------------- /web/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /web/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | production: false 7 | }; 8 | 9 | /* 10 | * For easier debugging in development mode, you can import the following file 11 | * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. 12 | * 13 | * This import should be commented out in production mode because it will have a negative impact 14 | * on performance if an error is thrown. 15 | */ 16 | // import 'zone.js/dist/zone-error'; // Included with Angular CLI. 17 | -------------------------------------------------------------------------------- /web/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edgexfoundry/edgex-ui-go/8cdda4bcdbb66b44d63df67301c7c51a86d111f3/web/src/favicon.ico -------------------------------------------------------------------------------- /web/src/index.html: -------------------------------------------------------------------------------- 1 | 18 | 19 | 20 | 21 | 22 | 23 | EdgeX Console 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /web/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule) 12 | .catch(err => console.error(err)); 13 | -------------------------------------------------------------------------------- /web/src/styles.css: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | 3 | *{ 4 | font-size:14px; 5 | } 6 | 7 | /* html, body { 8 | width: 100%; 9 | height: 100%; 10 | } */ 11 | 12 | .color-edgex-red { 13 | color: #922C48; 14 | } 15 | 16 | .color-edgex-red-2 { 17 | color: #E60D49; 18 | } 19 | 20 | .color-edgex-blue { 21 | color: #425CC7; 22 | } 23 | 24 | .color-edgex-black { 25 | color: #2D2848; 26 | } 27 | 28 | .color-edgex-dark { 29 | color: #707070; 30 | } 31 | 32 | .color-edgex-light { 33 | color: #DEDDDF; 34 | } -------------------------------------------------------------------------------- /web/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/zone-testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | // First, initialize the Angular testing environment. 11 | getTestBed().initTestEnvironment( 12 | BrowserDynamicTestingModule, 13 | platformBrowserDynamicTesting(), { 14 | teardown: { destroyAfterEach: false } 15 | } 16 | ); 17 | -------------------------------------------------------------------------------- /web/src/typings.d.ts: -------------------------------------------------------------------------------- 1 | declare var $: any; 2 | declare var echarts: any; 3 | declare var CodeMirror: any; 4 | declare var CBOR: any; 5 | declare var sqlFormatter: any; -------------------------------------------------------------------------------- /web/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts", 10 | "src/polyfills.ts" 11 | ], 12 | "include": [ 13 | "src/**/*.d.ts" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /web/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "compileOnSave": false, 4 | "compilerOptions": { 5 | "baseUrl": "./", 6 | "outDir": "./dist/out-tsc", 7 | "forceConsistentCasingInFileNames": true, 8 | "strict": true, 9 | "noImplicitReturns": true, 10 | "noFallthroughCasesInSwitch": true, 11 | "sourceMap": true, 12 | "declaration": false, 13 | "downlevelIteration": true, 14 | "experimentalDecorators": true, 15 | "moduleResolution": "node", 16 | "importHelpers": true, 17 | "target": "ES2022", 18 | "module": "es2020", 19 | "lib": [ 20 | "es2018", 21 | "dom" 22 | ], 23 | "useDefineForClassFields": false 24 | }, 25 | "angularCompilerOptions": { 26 | "strictInjectionParameters": true, 27 | "strictInputAccessModifiers": true, 28 | "strictTemplates": true 29 | } 30 | } -------------------------------------------------------------------------------- /web/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts", 12 | "src/polyfills.ts" 13 | ], 14 | "include": [ 15 | "src/**/*.spec.ts", 16 | "src/**/*.d.ts" 17 | ] 18 | } 19 | --------------------------------------------------------------------------------