Code Monkey home page Code Monkey logo

softwareag / cumulocity-app-builder Goto Github PK

View Code? Open in Web Editor NEW
16.0 8.0 6.0 6.75 MB

The Application Builder for Cumulocity provides a simple, coding-free way to create new applications inside Cumulocity. Application Builder is an open-source tool for you to create web applications in a no-code environment. Created by Global Presales.

License: Apache License 2.0

TypeScript 81.60% HTML 14.25% JavaScript 1.28% Less 2.70% CSS 0.17%
cumulocity global-presales dashboard application-builder widgets cumulocity-iot iot-analytics cumulocity-webapp webapp widget

cumulocity-app-builder's Introduction

Application Builder for Cumulocity

The Application Builder for Cumulocity provides a simple, coding-free way to create new applications inside Cumulocity. Application Builder is an open-source tool for you to create web applications in a no-code environment. It's being managed by the Software AG's open-source community but not officially supported by Software AG. You can log any issues at GitHub or ask any question on the Software AG Tech Community. Support will provided on best endeavours.

What's new?

  • New default branding: Introducing our new default branding, Inspired by Delite 2.0 – Software AG's in-house design system.
  • Enhanced group template dashboard: Give an identical dashboard to every device/asset based on its type.
  • Enhanced dashboard catalog: Now you can create dashboard based on device group and asset/device type using pre-design dashboard templates.
  • Dashboard catalog reloaded: Experience the next level with our latest dashboard templates for Predictive Maintenance, Smart Field Services, and Smart Billing—Now with one-click Microservice installation!
  • Enhanced Branding: Various improvement in overall branding.
  • Cumulocity upgrade: Application Builder is now based on Cumulocity 1018.0.125
  • Various bug fixes

Features

  • Browser-based Device Simulators: Create device simulators that run directly in your browser.
  • DTDL Simulator: User can now create simulator based on DTDL(Digital Twins Definition Language).
  • Group Simulator: User can create simulator for existing device group or new device group.
  • Runtime widgets plugin: Install widgets without re-compiling. Please refer our Demo Widget.
  • Group template dashboards: Give every device in a group an identical dashboard (but customized to the device).
  • Create an App with a custom contextPath: Change the URL used to access a particular app.
  • Application Clone: User can now clone existing application while creating new one.
  • GainSight Integration: Gainsight is integrated with app builder and user can control it from settings page.
  • Home Page: User can find quick start videos, help and support information on home page.
  • Tabs: Group your dashboards into tabs.
  • Dashboard Catalog: User can select any pre-designed template for dashboard and ability to install dependent runtime widgets.
  • Widget Catalog: Now user has ability to install/update widgets directly from Widget Catalog. This is single place where user can also find widget details such as documentation, preview, license and author details.
  • Branding: Now user can use color picker to choose millions of colors to customize branding. Header, Action bar and tab bar are also customizable.
  • Theme: Application builder now support one clicks theme selection and custom theme creation.
  • Server-Side Simulators: Application Builder now supports Server-side simulators. User just need to install micro-service from here and you will get option while creating simulator to "Run on Server".
  • Role Based Access: User can now control dashboard visibility in application builder by assigning global role(s) to a dashboard.
  • File(CSV/JSON) Based Simulator: Application Builder now supports File Based Simulators(Server-side). User just need to install micro-service from here and use simulator type as File(CSV/JSON). User can import CSV/JSON file to create measurements/events to simulate use cases.
  • Help & Support: Try out our new help & support dashboard template while creating dashboard. This will help user to quickly create help and support page for cumulocity application.
  • Demo Catalog: User now able to try out pre-built cumulocity demos by installing Demo Catalog which is available in your home page.
  • Auto Upgrade Notification: From Application Builder 1.3.0 onwards user will get notification whenever new version of app builder available and ability to seamless upgrade by single click.
  • Settings: Now user has abilities to control various features such as hide logo, disable auto upgrade, hide tabs for device specific dashboards, etc.
  • Dashboard Tree view: Dashboard Tree view provides hierarchical view for quicker and easier access to a dashboard.
  • Dashboard Locking: User can now lock/unlock all dashboards by just one click.
  • Dashboard Search: Smart search introduced to quickly search your dashboard.
  • Seamless upgrade experience: Upgrade of application builder made simpler. Click here for more detail.

Installation

Install Application Builder

First Time:

  1. Grab the Latest Release Zip
  2. Go to the Administration view in your tenant (/apps/administration)
  3. Open the Ecosystem section in the navigator and click Applications
  4. Click Add application
  5. Select Upload web application
  6. Select the Zip you downloaded earlier

Incremental Upgrade:

  1. Grab the Latest Release Zip
  2. Go to the Administration view in your tenant (/apps/administration)
  3. Open the Ecosystem section in the navigator and click Applications
  4. Click Application Builder
  5. Click *Upload a .zip file
  6. Select the Zip you downloaded earlier

Install Micro Service for Server-Side Simulators

First Time:

  1. Download simulator-app-builder
  2. Go to the Administration view in your tenant (/apps/administration)
  3. Open the Ecosystem section in the navigator and click Microservices
  4. Click Add microservice
  5. Select Upload microservice
  6. Select the Zip you downloaded earlier
  7. Click on Subscribe button

Incremental Upgrade:

  1. Download simulator-app-builder
  2. Go to the Administration view in your tenant (/apps/administration)
  3. Open the Ecosystem section in the navigator and click Microservices
  4. Click Simulator-app-builder
  5. Click *Upload a .zip file
  6. Select the Zip you downloaded earlier
  7. Unsubscribe and subscribe again microservice

Install Micro Service for File Based Simulators(Server Side)

First Time:

  1. Download csv-simulator-ms
  2. Go to the Administration view in your tenant (/apps/administration)
  3. Open the Ecosystem section in the navigator and click Microservices
  4. Click Add microservice
  5. Select Upload microservice
  6. Select the Zip you downloaded earlier
  7. Click on Subscribe button

Incremental Upgrade:

  1. Download csv-simulator-ms
  2. Go to the Administration view in your tenant (/apps/administration)
  3. pen the Ecosystem section in the navigator and click Microservices
  4. Click csv-simulator-ms
  5. Click *Upload a .zip file
  6. Select the Zip you downloaded earlier
  7. Unsubscribe and subscribe again microservice

Build Instructions

Note: It is only necessary to follow these instructions if you are modifying/extending the Application Builder (such as adding custom widgets, branding, etc.), otherwise see the Installation Guide.

Requirements:

  • Git
  • NodeJS (release builds are currently built with v14.18.0)
  • NPM (Included with NodeJS)

Instructions

  1. Clone the repository:
git clone https://github.com/SoftwareAG/cumulocity-app-builder.git
  1. Change directory:
cd cumulocity-app-builder
  1. (Optional) Checkout a specific version:

git checkout v2.0.0

  1. Install the dependencies:
npm install
  1. (Optional) Local development server:
npm start
  1. Build the app:
npm run build
  1. Deploy the app:
npm run deploy

QuickStart

This guide will teach you how to create your first application using the Application Builder.

NOTE: This guide assumes you have followed the Installation instructions

  1. Open the Application Builder from the app switcher (Next to your username in the top right)
  2. Click Add application
  3. Enter the application details and click Save
  4. Select Add dashboard
  5. Click Blank Dashboard
  6. Enter the dashboard details and click Save
  7. Select the dashboard from the navigation

Congratulations! You have created an application and added your first screen.

User Guide

How to convert existing widget into plugin

Please go through How to convert Cumulocity IoT widgets to plugins for step by step guide to convert existing widgets to plugin

How to upgrade Application Builder to 2.0

Application Builder 2.0 is based on micro-frontend architecture and existing Custom Widgets/Runtime widgets are no longer compatible.

When should you upgrade?

  • If you are Admin of the tenant.
  • You are using custom application builder (not subscribed one). If you are using subscribed application builder, then consider impact on sub-tenants before upgrade.
  • Your custom widgets(if any) are converted into plugins or corresponding plugins are available.

When should you not upgrade?

  • When your application builder is subscribed to one or more tenants, and you are not aware the impact of those tenants.
  • You have custom widgets which are not supported plugins or not yet converted to plugins.

How to upgrade

For seamless upgrade experience, please follow below steps:

  1. Upgrade your Application Builder to 1.3.4 (In case if you are using earlier version).
  2. Upgrade your Application Builder to 2.0 using upgrade option in bottom of your page(Available only to admin user).

Please note that if your widgets are part of Widget Catalog(maintained by community), then Application Builder will automatically delete existing widget and install corresponding plugin. In case if custom widget please see How to convert existing widget into plugin

How to upgrade Context Path Application to 2.0

If your existing application is created with providing context path, then it will not be going to upgrade using Application Builder upgrade functionality since it is running in its own application context.

Here are steps to upgrade Context Path application. Please note that this action is non-reversible:

  1. Go to Application Builder -> Add Application.
  2. Give name of your application.
  3. Do not provide any context path.
  4. Select your existing application from "Clone Existing Application".
  5. This will clone your app and bring it into Application Builder context.
  6. Verify your newly created application for all functionalities.
  7. Delete existing application.
  8. If all functionalities are working as expected, then clone application again with context path
  9. Congratulations, you have upgraded your app to 2.0.

How to downgrade Application Builder to 1.3.x

If you already upgraded Application Builder to 2.0 and wanted to downgrade back to 1.3.x for any reason, you can follow below steps:

  1. Download Application Builder 1.3.x binary from release section.
  2. Go to Administration -> Ecosystem -> All Applications.
  3. Click "Application Builder"
  4. Click "Upload a *.zip file".
  5. Upload 1.3.4 binary
  6. Go to Application Builder from app switcher.
  7. Click on "Widget Catalog"
  8. Click on "Uninstall All" button.
  9. This will delete all widgets.
  10. Install required widget again.
  11. Congratulations, you have downgraded your app to 1.3.x

A more detailed user guide and quick start videos are available in the Home section of the Application Builder app.

NOTE: This is only shown in the main page of the Application Builder, not when editing an individual application.

Runtime Widgets

Application Builder supports widget deployment. Some of the widget plugins are already available in widget catalog. You can find widgets at Software AG Open Source

Would you like to create your own Custom Runtime widget? Please refer our Demo Widget.

Troubleshooting

Application Builder 2.1.0

  • Theme Troubles? Existing applications with customized themes are not displaying the correct appearance: Application Builder 2.1.0 now defaults to the new Delite Theme. If your application has a custom theme and is not displaying correctly after an upgrade, please follow these steps for a quick workaround:

    1. Revert or install Application Builder 2.0.0.
    2. Go to your application.
    3. Go to Configuration -> Styling.
    4. Copy all the color code which you customized into notepad.
    5. Update Application Builder 2.1.0.
    6. Go to your application.
    7. Go to Configuration -> Styling.
    8. Click on best match theme out of Default, Classic, Navy Blue or Dark.
    9. Click on "Forge your brand: Unleash your creativity" button.
    10. Update all color code which you copied in step 4.
    11. Save your changes.
  • Theme Troubles? Application Installed from Demo Catalog not showing the correct appearance: Application Builder 2.1.0 now defaults to the new Delite Theme. If you demo from the Demo Catalog is stuck with the old theme, Please follow these steps for quick workaround:

    1. Go to demo application which you installed from Demo Catalog.
    2. Go to Configuration -> Styling.
    3. Click on "Default" theme button.
    4. Save your changes.

Application Builder 2.0.0 and later

  • Persistent 'Under Maintenance' Warning Despite Upgrade to Application Builder 2.0: Typically, users should encounter this warning during the upgrade procedure, although its presence should be brief – lasting no more than a few minutes. If this warning persists even after the upgrade has finished, it indicates a potential issue during plugin installation or may be connected to network-related problems. To address this issue, you can follow these steps:

    Note: You may need to install your widgets/plugins manually from widget catalog or from administration after following these steps.

    1. Logout from Application Builder Application.
    2. Login again to cumulocity and navigate to Administration -> Ecosystem -> All Applications
    3. Select Application Builder (custom) and delete it.
    4. Click on Add Application
    5. Install Application Builder 2.0 from here
    6. Logout from Administration
    7. Login again to cumulocity and navigate to Application Builder
    8. Application Builder 2.0 will commence the installation process.

    If the problem continues to persist, please don't hesitate to reach out to us for assistance using Software AG Tech Community.

  • Widget/plugins are not installed after upgrade: There are multiple reasons that your widgets/plugins might not installed such as browser page refreshed, network error, etc. In this scenario you can follow any of the below approach:

  1. If you have installed many widgets in earlier version of application builder then you can downgrade application builder by following How to downgrade Application Builder to 1.3.x and try again.
  2. If you have few widgets installed in earlier version of application builder, then you can just uninstall those widgets manually from Administration -> Ecosystem -> All Applications and install corresponding plugin either from Widget Catalog or from Administration -> Ecosystem -> Packages.

Application Builder 1.3.x and earlier

  • Failed to load a runtime custom widget:
	Failed to load a runtime custom widget, it may have been compiled for a different Cumulocity version

There is multiple reason for above error while loading page:

  1. Browser cashing issue: Try again after clearing browser cache or run incognito/private mode in browser. This is usually happened when new version of application builder installed or upgraded.
  2. Widget is not compatible with current version of Application builder: There are possibilities that your widget is no longer compatible with application builder due to angular/cumulocity upgrade.

If your widget is listed in widget catalog, then follow below steps:

  1. Go to widget catalog --> My Widgets
  2. Delete the widget which is giving error (You can identify widget by looking for this iconicon)
  3. Go to "Get More Widget" page
  4. Install the compatible widget/alternate widget
  5. Refresh page

If your widget is not listed in widget catalog, then you may need to upgrade your custom widget to make it compatible with current version of application builder.

  • Demo App(Demo Catalog App) not working after upgrade: There are possibilities that demo installed via demo catalog earlier may not work properly after upgrading application builder. In that scenario, you can perform following steps:
  1. Delete Demo using existing Demo Catalog
  2. Go to Administration -> Applications -> Own Applications
  3. Delete Demo Catalog App
  4. Click on App Switcher and navigate to Application builder
  5. In "Home" Page of application builder, you can find "Install Demo Catalog" option
  6. Install the latest version of Demo Catalog
  7. Install your demo application
  • Application Builder keep loading: If you are building your own version of app builder, you may experience below error in browser console due to nv.d3.js bug.
Uncaught (in promise) TypeError: true is not a function
  at eval (nv.d3.js?4bd4:9)
  at eval (nv.d3.js?4bd4:14365)

If you encounter above error, please follow below steps:

  1. Stop the server.
  2. Go to /cumulocity_app_builder/node_modules/nvd3 folder
  3. Open nv.d3.js file
  4. add ";" at line number 7. Refer below code snippet.
```
  (function(){

  var nv = window.nv || {};


  nv.version = '1.1.15b';
  nv.dev = true; //set false when in production

  window.nv = nv;

```
  1. Save file
  2. Go to /cumulocity_app_builder/patches
  3. Delete nvd3+0.0.1.patch file
  4. Go to /cumulocity_app_builder
  5. Execute "npx patch-package nvd3" command in your terminal
  6. Start the server

Contributing to Application Builder

If you like to submit a pull request, please follow below guidelines:

Guidelines

  • Please describe the changes that you are making
  • For features, please describe how to use the new feature
  • please include a reference to an existing issue, if applicable
  • Specify type of change
    • Bug Fix
    • Feature
    • Other(Refactoring, Documentation, etc..)
  • Does this change Introduce any breaking change ? Yes/No
  • Follow below checklist:
    • Commit Messages follow the pattern
      • A feature commit message is prefixed "feature:"
      • A bugfix commit message is prefixed "fix:"
    • Tests for the changes have been added

These tools are provided as-is and without warranty or support. They do not constitute part of the Software AG product suite. Users are free to use, fork and modify them, subject to the license agreement. While Software AG welcomes contributions, we cannot guarantee to include every contribution in the master project.


For more information you can Ask a Question in the TECH Community Forums.

cumulocity-app-builder's People

Contributors

cariboujohn avatar cguether avatar darpanlalani avatar kalpshekhar-sag avatar rpeach-sag avatar sheethaljr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cumulocity-app-builder's Issues

Simulator locking - Need to check browser clock accuracy

We seem to have an issue where computer clocks are not synchronised....

Solution:

  • get the time from the server
  • compare to the local time
  • store the offset
  • add the offset to the local time before we send any times to the server
  • Periodically update the offset (every 5mins?)

Potential issues with solution:

  • The offset also contains the latency from the initial server call
  • Hopefully this isn't too much of an issue because every user's offset will have a similar latency included (hopefully similar latencies, never anywhere near 5 seconds)

Improve Position Update simulator

At the moment the three components of a position need to be entered in three separate free text boxes. The number of entries in each list needs to be identical.

This could be improved by using an extensible table where each row is a single position with three columns. This would be similar to the Firmware update simulator.

Missing ability to change the page's title tag (to fully overwrite c8y branding)

as a user, I need to be able to fully erase the cumulocity branding in order to ship my custom app to an end-customer (they don't know cumulocity and shouldn't be confused). Instead they should only see the name of my custom app.
Screenshot 2023-01-13 at 16 18 13

For the rest of the platform it seems to be working to overwrite the title (If branding feature is configured):
Screenshot 2023-01-13 at 16 21 38

Version of weather forecast widget gets lost

See attached screenshot. After installing the weather forecast widget from the Widget catalog, no version number is shown and the "Update" button is shown instead. After clicking on the button, the correct version is shown but upon reloading the page, the version number is gone again and the "Update" button is shown again.

Screenshot 2021-12-20 133652

Cumulocity Application Builder Vulnerability Issues

One of our customer is using Cumulocity App builder and are seeing few vulnerability issues using @c8y/cli:1006.6.8 & @angular-devkit/build-angular": "0.803.17".

While fixing vulnerabilities errors of “@angular-devkit/build- angular by changing version, @c8y packages are getting affected.
Please let us know how these vulnerability issues can be fixed.

Attached the Audit report and package.json file.

npm_audit_report.txt
package.json.txt

Remove the ?app=123

It should be possible to remove the ?app=123 from urls now that I know how to check for AngularJS route changes. The original problem were that ngJs route changes didn't always trigger an Angular route change so switching between apps would sometimes fail

Unable to give users access to specific device groups within App Builder

Unable to give users access to specific device groups within App Builder. App builder needs inventory admin and read role by default, it we give inventory read and admin role, all device groups will be available to the user.

There is no mechanism to restrict users for specific device groups within app builder.

White primary color hiding texts of widgets

Setting the background of the navigator to white (#FFFFFF) by setting primary color in the configuration-styles section to white will make many parts of the widgets (eg. in the config) disappear, since their background is white and they use primary color for many texts.

For screenshots and further description see: https://tech.forums.softwareag.com/t/whitelabeling-of-application-builder-apps-problem-with-primary-color-white/263386

It would hard to change all the the widgets (including open source ones) to not use primary color for texts, so a solution i think of is to make the background of the navigator to be set seperately.

Tested with OAuth Internal?

Hi,

I used the App Builder on a Tenant where I have OAuth Internal enabled. It seems that this causing issues using the App Builder:
appvendorsapp.3f5624350c4eb939b9c4.js:520 ERROR Error: Uncaught (in promise): Object: {"res":{},"data":{"error":"security/Unauthorized","message":"Full authentication is required to access this resource","info":"https://www.cumulocity.com/guides/reference-guide/#error_reporting"}}
at D (appvendorsapp.3f5624350c4eb939b9c4.js:2054)
at appvendorsapp.3f5624350c4eb939b9c4.js:2054
at c (app.3f5624350c4eb939b9c4.js:1)
at e.invoke (appvendorsapp.3f5624350c4eb939b9c4.js:2046)
at Object.onInvoke (appvendorsapp.3f5624350c4eb939b9c4.js:1283)
at e.invoke (appvendorsapp.3f5624350c4eb939b9c4.js:2046)
at t.run (appvendorsapp.3f5624350c4eb939b9c4.js:2046)
at appvendorsapp.3f5624350c4eb939b9c4.js:2054
at e.invokeTask (appvendorsapp.3f5624350c4eb939b9c4.js:2046)
at Object.onInvokeTask (appvendorsapp.3f5624350c4eb939b9c4.js:1283)

This doesn't occur using Basic Auth but this is deprecated at C8Y. So OAuth Internal should be the preferred login method in future.

In Dashboard Configuration provide the ability to copy the Dashboard URL

If a dashboard is configured with Visibility "hidden" it will not be shown in any navigation and can only be accessed by accessing its URL. This URL can be constructed by adding the already displayed dashboard id to the following URL:
/apps/app-builder/index.html#/application//dashboard/

As a convenience method it would be great if the table of dashboards in Configuration contained a "Copy URL" button which copied the URL into the clipboard.

Widgets upload gets stuck

While opening application builder, it takes ages to upload opensource widgets and gets stuck at widget 4. It requires to refresh the page multiple times to get the total number of widgets loaded (30).

Some people experiencing the error get a bad gw error

badgw
image

Create a develop branch

People are cloning the repo and expecting to get the latest release... this is not currently the case. A develop branch would solve the problem

Reduce the size/remove Application Builder logo

The Application Builder logo is very large and appears every time you load an application.

Ideally we would show the logo for the specific application you are opening - this may not be possible because we can't get that info until the user is logged in.

Reducing the size or making it less "in your face" might help

Favicon sometimes fails to load

image

Sometimes the favicon fails to load. I guess this is because the font-awesome font has not loaded (I was pretty sure i waited until the font fired its loaded event???)

App Builder homepage should detect if the Demo Catalog is installed

The homepage of App Builder allows for the installation of the Demo Catalog. Regardless of whether the catalog is installed or not, it always shows the same information:

image

When clicking on "Install Demo Catalog" when the catalog is already installed, opens the Demo Catalog.

App Builder should detect if the Demo Catalog is installed and show different information (e.g. "Open Demo Catalog").

Ability to change the url

The ability to set a new url would be a nice feature.
so that /apps/app-builder?app=123#/application/123/dashboard/456 can instead be: /apps/my-demo

Implementation details:
The app-builder would clone itself and store a applicationBuilder property on the cloned application object. On load any app-builder instance (now renamed) would check itself for an an applicationBuilder property and load that.

Creating App with custom context path fails

App Builder v.1.3.1 on eu-latest 10.15

Steps to reproduce:

  • Create new App named TestABC
  • Define a custom context path testabc

Observed behavior:
The App is not created. The following pop up is shown and does not go away:

image

Javascript console shows below error:
app~vendors~app.099739fe9ca413510a8c.js:1068 ERROR Error: Uncaught (in promise): TypeError: Cannot read properties of undefined (reading 'activeVersionId') TypeError: Cannot read properties of undefined (reading 'activeVersionId') at m.<anonymous> (app.e5b3cf7fd23ae0972c13.js:1:41121) at Generator.next (<anonymous>) at o (app.e5b3cf7fd23ae0972c13.js:1:37764) at e.invoke (app~vendors~app.099739fe9ca413510a8c.js:3806:7209) at Object.onInvoke (app~vendors~app.099739fe9ca413510a8c.js:2028:1773) at e.invoke (app~vendors~app.099739fe9ca413510a8c.js:3806:7149) at t.run (app~vendors~app.099739fe9ca413510a8c.js:3806:2289) at app~vendors~app.099739fe9ca413510a8c.js:3821:2779 at e.invokeTask (app~vendors~app.099739fe9ca413510a8c.js:3806:7893) at Object.onInvokeTask (app~vendors~app.099739fe9ca413510a8c.js:2028:1589) at w (app~vendors~app.099739fe9ca413510a8c.js:3821:1957) at app~vendors~app.099739fe9ca413510a8c.js:3821:1049 at o (app.e5b3cf7fd23ae0972c13.js:1:37782) at e.invoke (app~vendors~app.099739fe9ca413510a8c.js:3806:7209) at Object.onInvoke (app~vendors~app.099739fe9ca413510a8c.js:2028:1773) at e.invoke (app~vendors~app.099739fe9ca413510a8c.js:3806:7149) at t.run (app~vendors~app.099739fe9ca413510a8c.js:3806:2289) at app~vendors~app.099739fe9ca413510a8c.js:3821:2779 at e.invokeTask (app~vendors~app.099739fe9ca413510a8c.js:3806:7893) at Object.onInvokeTask (app~vendors~app.099739fe9ca413510a8c.js:2028:1589) Eo @ app~vendors~app.099739fe9ca413510a8c.js:1068 handleError @ app~vendors~app.099739fe9ca413510a8c.js:1075 next @ app~vendors~app.099739fe9ca413510a8c.js:2070 i @ app~vendors~app.099739fe9ca413510a8c.js:1904 t.__tryOrUnsub @ app~vendors~app.099739fe9ca413510a8c.js:4294 t.next @ app~vendors~app.099739fe9ca413510a8c.js:4294 t._next @ app~vendors~app.099739fe9ca413510a8c.js:4294 t.next @ app~vendors~app.099739fe9ca413510a8c.js:4294 t.next @ app~vendors~app.099739fe9ca413510a8c.js:4723 emit @ app~vendors~app.099739fe9ca413510a8c.js:1904 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2028 e.invoke @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.run @ app~vendors~app.099739fe9ca413510a8c.js:3806 runOutsideAngular @ app~vendors~app.099739fe9ca413510a8c.js:2028 onHandleError @ app~vendors~app.099739fe9ca413510a8c.js:2028 e.handleError @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.runGuarded @ app~vendors~app.099739fe9ca413510a8c.js:3806 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 Zone.__load_patch.n.microtaskDrainDone @ app~vendors~app.099739fe9ca413510a8c.js:3821 b @ app~vendors~app.099739fe9ca413510a8c.js:3806 Promise.then (async) v @ app~vendors~app.099739fe9ca413510a8c.js:3806 y @ app~vendors~app.099739fe9ca413510a8c.js:3806 e.scheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 onScheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 e.scheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.scheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.scheduleMicroTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 C @ app~vendors~app.099739fe9ca413510a8c.js:3821 w @ app~vendors~app.099739fe9ca413510a8c.js:3821 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 Promise.then (async) (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 O.e.then @ app~vendors~app.099739fe9ca413510a8c.js:3821 w @ app~vendors~app.099739fe9ca413510a8c.js:3821 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2960 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 l @ app~vendors~app.099739fe9ca413510a8c.js:2960 s @ app~vendors~app.099739fe9ca413510a8c.js:2960 e.invoke @ app~vendors~app.099739fe9ca413510a8c.js:3806 onInvoke @ app~vendors~app.099739fe9ca413510a8c.js:2028 e.invoke @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.run @ app~vendors~app.099739fe9ca413510a8c.js:3806 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 e.invokeTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 onInvokeTask @ app~vendors~app.099739fe9ca413510a8c.js:2028 e.invokeTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.runTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 b @ app~vendors~app.099739fe9ca413510a8c.js:3806 Promise.then (async) v @ app~vendors~app.099739fe9ca413510a8c.js:3806 y @ app~vendors~app.099739fe9ca413510a8c.js:3806 e.scheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 onScheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 e.scheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.scheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.scheduleMicroTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 C @ app~vendors~app.099739fe9ca413510a8c.js:3821 w @ app~vendors~app.099739fe9ca413510a8c.js:3821 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 Promise.then (async) (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 O.e.then @ app~vendors~app.099739fe9ca413510a8c.js:3821 w @ app~vendors~app.099739fe9ca413510a8c.js:3821 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 l @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2960 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 f @ app~vendors~app.099739fe9ca413510a8c.js:2960 fetch @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:4091 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:4356 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 c @ app~vendors~app.099739fe9ca413510a8c.js:4356 client.fetch @ app~vendors~app.099739fe9ca413510a8c.js:4091 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2960 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 d @ app~vendors~app.099739fe9ca413510a8c.js:2960 fetch @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2960 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 d @ app~vendors~app.099739fe9ca413510a8c.js:2960 list @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2960 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 le @ app~vendors~app.099739fe9ca413510a8c.js:2960 list @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app.e5b3cf7fd23ae0972c13.js:1 o @ app.e5b3cf7fd23ae0972c13.js:1 e.invoke @ app~vendors~app.099739fe9ca413510a8c.js:3806 onInvoke @ app~vendors~app.099739fe9ca413510a8c.js:2028 e.invoke @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.run @ app~vendors~app.099739fe9ca413510a8c.js:3806 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 e.invokeTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 onInvokeTask @ app~vendors~app.099739fe9ca413510a8c.js:2028 e.invokeTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.runTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 b @ app~vendors~app.099739fe9ca413510a8c.js:3806 Promise.then (async) v @ app~vendors~app.099739fe9ca413510a8c.js:3806 y @ app~vendors~app.099739fe9ca413510a8c.js:3806 e.scheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 onScheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 e.scheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.scheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.scheduleMicroTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 C @ app~vendors~app.099739fe9ca413510a8c.js:3821 w @ app~vendors~app.099739fe9ca413510a8c.js:3821 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 Promise.then (async) (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 O.e.then @ app~vendors~app.099739fe9ca413510a8c.js:3821 w @ app~vendors~app.099739fe9ca413510a8c.js:3821 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 l @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2960 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 f @ app~vendors~app.099739fe9ca413510a8c.js:2960 fetch @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:4091 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:4356 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 c @ app~vendors~app.099739fe9ca413510a8c.js:4356 client.fetch @ app~vendors~app.099739fe9ca413510a8c.js:4091 (anonymous) @ app.e5b3cf7fd23ae0972c13.js:1 o @ app.e5b3cf7fd23ae0972c13.js:1 e.invoke @ app~vendors~app.099739fe9ca413510a8c.js:3806 onInvoke @ app~vendors~app.099739fe9ca413510a8c.js:2028 e.invoke @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.run @ app~vendors~app.099739fe9ca413510a8c.js:3806 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 e.invokeTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 onInvokeTask @ app~vendors~app.099739fe9ca413510a8c.js:2028 e.invokeTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.runTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 b @ app~vendors~app.099739fe9ca413510a8c.js:3806 Promise.then (async) v @ app~vendors~app.099739fe9ca413510a8c.js:3806 y @ app~vendors~app.099739fe9ca413510a8c.js:3806 e.scheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 onScheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 e.scheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.scheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.scheduleMicroTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 C @ app~vendors~app.099739fe9ca413510a8c.js:3821 w @ app~vendors~app.099739fe9ca413510a8c.js:3821 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 Promise.then (async) (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 O.e.then @ app~vendors~app.099739fe9ca413510a8c.js:3821 w @ app~vendors~app.099739fe9ca413510a8c.js:3821 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2960 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 l @ app~vendors~app.099739fe9ca413510a8c.js:2960 s @ app~vendors~app.099739fe9ca413510a8c.js:2960 e.invoke @ app~vendors~app.099739fe9ca413510a8c.js:3806 onInvoke @ app~vendors~app.099739fe9ca413510a8c.js:2028 e.invoke @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.run @ app~vendors~app.099739fe9ca413510a8c.js:3806 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 e.invokeTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 onInvokeTask @ app~vendors~app.099739fe9ca413510a8c.js:2028 e.invokeTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.runTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 b @ app~vendors~app.099739fe9ca413510a8c.js:3806 Promise.then (async) v @ app~vendors~app.099739fe9ca413510a8c.js:3806 y @ app~vendors~app.099739fe9ca413510a8c.js:3806 e.scheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 onScheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 e.scheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.scheduleTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.scheduleMicroTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 C @ app~vendors~app.099739fe9ca413510a8c.js:3821 w @ app~vendors~app.099739fe9ca413510a8c.js:3821 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 Promise.then (async) (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 O.e.then @ app~vendors~app.099739fe9ca413510a8c.js:3821 w @ app~vendors~app.099739fe9ca413510a8c.js:3821 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:3821 l @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2960 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 f @ app~vendors~app.099739fe9ca413510a8c.js:2960 fetch @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:4091 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:4356 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 c @ app~vendors~app.099739fe9ca413510a8c.js:4356 client.fetch @ app~vendors~app.099739fe9ca413510a8c.js:4091 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2960 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 d @ app~vendors~app.099739fe9ca413510a8c.js:2960 fetch @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2960 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 d @ app~vendors~app.099739fe9ca413510a8c.js:2960 list @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2960 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 le @ app~vendors~app.099739fe9ca413510a8c.js:2960 list @ app~vendors~app.099739fe9ca413510a8c.js:2960 (anonymous) @ app.e5b3cf7fd23ae0972c13.js:1 (anonymous) @ app.e5b3cf7fd23ae0972c13.js:1 e @ app~vendors~app.099739fe9ca413510a8c.js:3821 f @ app.e5b3cf7fd23ae0972c13.js:1 createApplication @ app.e5b3cf7fd23ae0972c13.js:1 eval @ m.ngfactory.js:224 handleEvent @ app~vendors~app.099739fe9ca413510a8c.js:2150 handleEvent @ app~vendors~app.099739fe9ca413510a8c.js:2157 cg @ app~vendors~app.099739fe9ca413510a8c.js:1833 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2114 (anonymous) @ app~vendors~app.099739fe9ca413510a8c.js:2526 e.invokeTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 onInvokeTask @ app~vendors~app.099739fe9ca413510a8c.js:2028 e.invokeTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.runTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 t.invokeTask @ app~vendors~app.099739fe9ca413510a8c.js:3806 p @ app~vendors~app.099739fe9ca413510a8c.js:3837 f @ app~vendors~app.099739fe9ca413510a8c.js:3837 m @ app~vendors~app.099739fe9ca413510a8c.js:3837

Device Type "Group template" dashboard

It would be nice to add support for device type templated dashboard.

Very similar to group templates (where every device in a group gets the same dashboard), but for every device of a particular type

No validation when creating a new application

There are multiple validation issues when creating a new app:

  • When using the name of an application that already exists, no error is shown but the application is just not created
  • When entering an application to clone, no error is shown if the application does not exist or is not an App Builder application (e.g. "Cockpit", as "clone application" is terminology that is used elsewhere in C8Y to clone WebSDK applications, it would maybe make sense to clarify that only App Builder applications can be cloned here).
  • using an existing context path (e.g. "cockpit") leads to strange behavior (the app seems to be Cockpit but with the selected App Builder logo). Is that intended?

Application Builder should validate app names before saving

App Builder 1.3.1

Steps to reproduce:

  • Create Application named "Dummy"
  • Try to create second application named "Dummy"

Observed behavior: No validation is applied before hitting the Save button, instead app creation fails. Suggestion is to validate app names and detect duplicates before submission. The Save button should be disabled if an application with this name already exists.

Random Walk & Value simulators should validate min&max values

at the moment, it is possible to provide a minimum that is higher than the maximum. This will probably not have the expected behavior.

Also it would be good if the configuration defined if the interval between minimum and maximum is open or closed (i.e. if the minimum and maximum are included).

(edit) Looking at the implementation, my understanding is that the minimum is included but the maximum not.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.