From 07941a9b4a081fb791fdc92c0af88498d047eedf Mon Sep 17 00:00:00 2001 From: Darpan Lalani Date: Thu, 27 Apr 2023 13:19:51 +0530 Subject: [PATCH 1/3] 2.0 Release (#90) * Non-working- upgraded with 1013 * initial commit * initial commit 2 * updated version and image fix * optimized AppService calls * updated with 1015 * updated with plugin support in widget catalog * Added validation for simulators * widget catalog upgraded to support plugins * reverted code in simulator manager service * ngx-echart added as part of app builder core build * Added plugin specific code changes in widget details component * plugin verfication feature implemented * Added progress indicator while installing,updating and deleting plugins * updated plugin verification logic * Hide progress modal after uninstall * upgraded timeout * updated delaytimeout * removed echart widget module * CSS Changes in widget catalog * Added pluginType entry in grid and list view, fixed simulator issue * Dashboard Catalog Changes to Support Plugins * Code changes w.r.t Plugin Install/Uninstall/Update * Lock Dashboard, Search Dashboard and Branding Issue related code changes * updated for seamless upgrade from 1.3.x to 1.4.x * updated package.json * updated with dev branch and verify widget update for seamless upgrade from 1.3.2 * Search Dashboard With Reordering Issue Fixed * Branding issue fixed * Lock Dashboard code issue fix * Lock Unlock icon css, branding issue fix when primary color is white * Drag and drop issue fixed * Drag and Drop issue fix on search * plugin installation * search dashboard issue fix and simulator code change to add required interval for new device * Branding issue w.r.t pagination * added overall progress bar and changed widget catalog to plugin catalog * updated with upgrade changes * updated with plugin message * added context-path condition to restict app builder upgrade notification * dashboard catalog changes * initial commit with version upgrade * 1.3.2 dev (#76) * updated with global role - poc * updated with global role implementation * updated dashboard catalog for role based access * updated with role base access for tab group and navigation dashboard * updated: removed console log * added role based access * updated simulator error message * added tree view for dashboard * added file for dahsboard hierarchy * Tree Structure Code Changes * CSS Changes w.r.t tree structure * Tree Structure css changes * Added CSS to show hide collapse button * bug fixed in group template * Tree Structure Code Changes * Tree Structure Code Changes * context-path app issue resolved * drag n drop issue solution * Code changes w.r.t Dashboard Structure * css changes w.r.t tree structure * updated with isDashboard flag * Code changes w.r.t tree structure * css changes in tree structure * update styling * update styling * Widget Details page issue fixed for Smart Map Widget * added expand all feature, fixed title and branding issue * fixed issue related to tree structure * installed new version of external assets binary * removed console log * Removed inline styles in dashboard config component Co-authored-by: Darpankumar Lalani * updated with new plugin service api integration * updated readme for 1.3.2 release * updated readme * 1.3.2 dev (#77) * updated with global role - poc * updated with global role implementation * updated dashboard catalog for role based access * updated with role base access for tab group and navigation dashboard * updated: removed console log * added role based access * updated simulator error message * added tree view for dashboard * added file for dahsboard hierarchy * Tree Structure Code Changes * CSS Changes w.r.t tree structure * Tree Structure css changes * Added CSS to show hide collapse button * bug fixed in group template * Tree Structure Code Changes * Tree Structure Code Changes * context-path app issue resolved * drag n drop issue solution * Code changes w.r.t Dashboard Structure * css changes w.r.t tree structure * updated with isDashboard flag * Code changes w.r.t tree structure * css changes in tree structure * update styling * update styling * Widget Details page issue fixed for Smart Map Widget * added expand all feature, fixed title and branding issue * fixed issue related to tree structure * installed new version of external assets binary * removed console log * Removed inline styles in dashboard config component * Lock and unlock dashboard title change Co-authored-by: Darpankumar Lalani * updated readme * 1.3.2 dev (#78) * updated with global role - poc * updated with global role implementation * updated dashboard catalog for role based access * updated with role base access for tab group and navigation dashboard * updated: removed console log * added role based access * updated simulator error message * added tree view for dashboard * added file for dahsboard hierarchy * Tree Structure Code Changes * CSS Changes w.r.t tree structure * Tree Structure css changes * Added CSS to show hide collapse button * bug fixed in group template * Tree Structure Code Changes * Tree Structure Code Changes * context-path app issue resolved * drag n drop issue solution * Code changes w.r.t Dashboard Structure * css changes w.r.t tree structure * updated with isDashboard flag * Code changes w.r.t tree structure * css changes in tree structure * update styling * update styling * Widget Details page issue fixed for Smart Map Widget * added expand all feature, fixed title and branding issue * fixed issue related to tree structure * installed new version of external assets binary * removed console log * Removed inline styles in dashboard config component * Lock and unlock dashboard title change * change in create dashboard Co-authored-by: Darpankumar Lalani * updated version * updated for dev testing * update with remove unused binary and upgrade service merge fixed * Fixed issues * added code for c8y1015 compatibility * Reverted catalog name to widget catalog * external asset service updated simulator max restrctions added widget catalog no widgets message updated * updated error handling in template catalog json * code updated for preprod branch * Dynamic select of dev/preprod branch, css fix in widget catalog and edit dashboard issue fix * Upgraded c8y to 1016.0.93 * updated by removing basic auth in simulator * Fixed undefined error in Applications page * updated with subscribe tenant fix. error handling incase of widget is assigned to different tenant * updated message for subscribed app builder bug fix for app with context path icon * updated to 1016.0.109 * updated with selectable dashboard path * url modified for template details * added support for assets in dashboard catalog * updated error handling in verify plugin * Added Under Maintenance Code * Updated under maintenance check * 1.3.3 dev (#81) * 1.3.3 code changes * Updated check in under maintenance * Updated warning message w.r.t sub-tenant * reset config remotes while updating application * Updated c8y version to 1011.0.38 * Updated package version * Removed console logs * reverted console logs and removed commented code * change label * demo catalog multiple version support added * added support for multiple demo catalog version * added iscompatible check * Custom Branding and Branding Issue Code Changes * Changes in app list component * Fixed issue in verify widget compatibility method * Custom Branding issue fixed * Fixed Custom Branding Issue * Updated condition in findInstalledWidget method * RC flag removed * updated readme * Updated readme for 1.3.3 release * update implementation to get list of packages * Custom Branding Code Changes and fixed other issues * Code Changes w.r.t direct install of app builder from administration * Bug fix for app with context path (#83) * bug fix for app with context path * Changes while uninstalling widgets * Branding Issue fixed * App Builder Home page changes * Added await and changes while installing plugins * Changes in direct install of app builder * Changes in direct install method * added exception handling * added changes for clone app logic * Changes in app builder direct install * Default view changed to list view for dashboards * css issue fixed in list view * Improved simulator locking behaviour. Avoided lock check logic if there is no simulator created * White line branding issue and App builder direct install code fix * updated messaging text * Changes w.r.t app builder external assets * removed duplicate code * Branding Issue and Dashboard Config issue fixed * Dashboard General Code Changes * fix dashboard config issue * RC tag removed * updated based on latest changes in 2.0 * updated with label changed * 2.0.0 dev 1 (#87) * Compatible check added while installing widgets in direct install method * Fixed issues for lock/unlock tab navigator data explorer * Copy Clipboard Feature and Dark Theme Issue Fixed * added logic for indirect install for demo catalog widget * dark theme issue fixed * Updated Readme * updated readme * updated readme * Updated readme with how to sections * Updated document * branding issue of icons fixed, smart rules, alarms, data explorer fixed * Update README.md * updated readme * Updated readme --------- Co-authored-by: Darpankumar Lalani * 2.0.0 dev 1 (#88) * Compatible check added while installing widgets in direct install method * Fixed issues for lock/unlock tab navigator data explorer * Copy Clipboard Feature and Dark Theme Issue Fixed * added logic for indirect install for demo catalog widget * dark theme issue fixed * Updated Readme * updated readme * updated readme * Updated readme with how to sections * Updated document * branding issue of icons fixed, smart rules, alarms, data explorer fixed * Update README.md * updated readme * Updated readme * search dashboard code changes --------- Co-authored-by: Darpankumar Lalani * update packages * 2.0.0 dev 1 (#89) * Compatible check added while installing widgets in direct install method * Fixed issues for lock/unlock tab navigator data explorer * Copy Clipboard Feature and Dark Theme Issue Fixed * added logic for indirect install for demo catalog widget * dark theme issue fixed * Updated Readme * updated readme * updated readme * Updated readme with how to sections * Updated document * branding issue of icons fixed, smart rules, alarms, data explorer fixed * Update README.md * updated readme * Updated readme * search dashboard code changes * updated with condition --------- Co-authored-by: Sheethal JR * Updated Readme * Updated readme * Updated with video link --------- Co-authored-by: Sheethal JR (SJR) Co-authored-by: SheethalJR <99970126+SheethalJR@users.noreply.github.com> Co-authored-by: Sheethal JR --- .vscode/settings.json | 2 + README.md | 100 +- app.module.ts | 40 +- binary/app-builder-external-assets-2.1.0.tgz | Bin 25737 -> 0 bytes binary/app-builder-external-assets-3.2.0.tgz | Bin 0 -> 22129 bytes ...-runtime-widget-loader-1011.0.20-0.0.3.tgz | Bin 117039 -> 0 bytes .../app-builder-upgrade.service.ts | 529 +- builder/app-data.service.ts | 47 + builder/app-list/app-list.component.html | 71 +- builder/app-list/app-list.component.ts | 7 +- .../new-application-modal.component.ts | 18 +- .../dashboard-config.component.html | 123 +- .../dashboard-config.component.less | 71 +- .../dashboard-config.component.ts | 257 +- .../dashboard-node.component.css | 12 +- .../dashboard-node.component.html | 14 +- .../dashboard-node.component.ts | 8 +- .../edit-dashboard-modal.component.ts | 11 +- .../new-dashboard-modal.component.html | 11 +- .../new-dashboard-modal.component.ts | 15 +- builder/application/alarms/alarmListModule.js | 2 +- .../alarms/devicemanagement-alarmList.html | 97 + ...app-builder-context-dashboard.component.ts | 42 +- .../dataexplorer/dataPointExplorer.js | 291 + .../application/dataexplorer/explorer.html | 95 + .../legacy-data-explorer.component.ts | 13 +- .../group-template.component.ts | 13 +- .../legacy-smart-rules.component.ts | 2 +- .../smartrules/smart-rules-list.html | 325 + builder/branding/branding.component.html | 202 +- builder/branding/branding.component.ts | 97 +- builder/branding/branding.module.ts | 14 +- builder/branding/branding.service.ts | 30 +- builder/branding/custom-branding.component.ts | 90 + builder/builder.module.ts | 74 +- builder/home/home.component.html | 16 +- builder/home/home.component.ts | 114 +- .../app-builder-navigation.service.ts | 14 +- builder/settings/settings.service.ts | 36 +- .../edit-simulator-modal.component.html | 44 +- .../edit-simulator-modal.component.ts | 79 +- .../new-simulator-modal.component.html | 104 +- .../new-simulator-modal.component.ts | 111 +- .../simulator-config.component.html | 11 +- .../simulator-config.component.ts | 54 +- .../simulator-config.module.ts | 2 + .../simulator-config.service.ts} | 27 +- .../simulation-lock.service.ts | 2 +- .../simulator-communication.service.ts | 9 +- .../simulator-manager.service.ts | 10 +- .../simulator-worker-api.service.ts | 6 +- builder/simulator/simulator-config.ts | 3 +- builder/simulator/worker/index.ts | 38 - .../worker/simulator-worker.module.ts | 90 - .../simulator/worker/worker-app-id.service.ts | 46 - .../template-catalog.component.html | 19 +- .../template-catalog.component.ts | 141 +- .../template-catalog.model.ts | 1 + .../template-catalog.service.ts | 15 +- .../template-update.component.html | 4 +- .../alert-message-modal.component.ts | 6 +- .../device-selector.service.ts | 2 +- .../progress-indicator-modal.component.html | 9 + .../progress-indicator-modal.component.ts | 6 + .../progress-indicator.service.ts | 8 +- .../my-widgets/my-widgets.component.html | 37 +- .../my-widgets/my-widgets.component.less | 4 +- .../my-widgets/my-widgets.component.ts | 138 +- .../widget-catalog.component.html | 27 +- .../widget-catalog.component.less | 9 +- .../widget-catalog.component.ts | 137 +- .../widget-catalog/widget-catalog.service.ts | 285 +- .../widget-details.component.html | 10 +- .../widget-details.component.ts | 241 +- dashboard-by-id/dashboard-by-id.component.ts | 13 +- .../device-selector.component.html | 2 +- extra-webpack.config.js | 61 +- gulpfile.js | 14 +- i18n.ts | 18 + index.ts | 3 + ng1.ts | 7 +- package-lock.json | 28674 +++++++++------- package.json | 107 +- patches/nvd3+0.0.1.patch | 13 - .../dtdl/dtdl.config.component.ts | 22 +- .../file-values.config.component.ts | 122 +- .../position-update.config.component.ts | 36 +- .../random-value.config.component.ts | 28 +- .../random-walk.config.component.ts | 28 +- .../series-value.config.component.ts | 26 +- .../wave/wave.config.component.ts | 27 +- tsconfig.json | 2 +- ui-assets/dashboard-node.hierarchy.less | 2 +- ui-assets/index.less | 47 +- 94 files changed, 18919 insertions(+), 14971 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 binary/app-builder-external-assets-2.1.0.tgz create mode 100644 binary/app-builder-external-assets-3.2.0.tgz delete mode 100644 binary/cumulocity-runtime-widget-loader-1011.0.20-0.0.3.tgz create mode 100644 builder/app-data.service.ts create mode 100644 builder/application/alarms/devicemanagement-alarmList.html create mode 100644 builder/application/dataexplorer/dataPointExplorer.js create mode 100644 builder/application/dataexplorer/explorer.html create mode 100644 builder/application/smartrules/smart-rules-list.html create mode 100644 builder/branding/custom-branding.component.ts rename builder/{simulator/worker/worker-app-state.service.ts => simulator-config/simulator-config.service.ts} (53%) rename builder/simulator/{worker => mainthread}/simulation-lock.service.ts (99%) rename builder/simulator/{worker => mainthread}/simulator-manager.service.ts (96%) rename builder/simulator/{worker => mainthread}/simulator-worker-api.service.ts (99%) delete mode 100644 builder/simulator/worker/index.ts delete mode 100644 builder/simulator/worker/simulator-worker.module.ts delete mode 100644 builder/simulator/worker/worker-app-id.service.ts create mode 100644 i18n.ts delete mode 100644 patches/nvd3+0.0.1.patch diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/README.md b/README.md index 7ab013a..5aeecc5 100644 --- a/README.md +++ b/README.md @@ -6,26 +6,30 @@ Application Builder is an open-source tool for you to create web applications  ## What's new? -* **Bug fix:** Clone application with context path -* **Bug fix:** Branding for existing app -* **Improvement:** User upgrade experience -* **Minor bug fixes** +* **Widgets turned plugins:** Application builder now support micro-frontend plugins. Standard widgets are already available as plugin in widget catalog. +* **Optimized Performance:** Application builder now provide faster response times, reduced resource usage, and improved user experience. +* **Custom Branding:** Provides flexibility and control over application’s look and feel. +* **Dashboards:** Simplified the dashboard navigation by introducing path while creating dashboard. +* **Seamless upgrade experience:** Upgrade of application builder made simpler. [Click here for more detail.](#how-to-upgrade-application-builder-to-20) +* **Cumulocity upgrade:** Application Builder is now based on Cumulocity 1016.0.170 +* **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](https://github.com/Azure/opendigitaltwins-dtdl/blob/master/DTDL/v2/dtdlv2.md)(Digital Twins Definition Language). * **Group Simulator:** User can create simulator for existing device group or new device group. -* **Runtime widget loading:** Install widgets without re-compiling. Please refer our [Demo Widget](https://github.com/SoftwareAG/cumulocity-demo-widget). +* **Runtime widgets plugin:** Install widgets without re-compiling. Please refer our [Demo Widget](https://github.com/SoftwareAG/cumulocity-demo-widget-plugin). * **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. -* **New Home Page:** New Home Page with quick start videos, help and support information. +* **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 runtime widgets directly from Widget Catalog. This is single place where user can also find widget details such as documentation, preview, license and author details. +* **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. +* **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](https://github.com/SoftwareAG/cumulocity-app-builder/releases/download/v1.3.1/simulator-app-builder.zip) 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](https://github.com/SoftwareAG/cumulocity-app-builder/releases/download/v1.3.1/csv-simulator-ms.zip) and use simulator type as File(CSV/JSON). User can import CSV/JSON file to create measurements/events to simulate use cases. @@ -115,7 +119,9 @@ cd cumulocity-app-builder ``` 2. (Optional) Checkout a specific version: ``` -git checkout v1.3.3 + +git checkout v2.0.0 + ``` 3. Install the dependencies: ``` @@ -151,19 +157,87 @@ This guide will teach you how to create your first application using the Applica 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](https://tech.forums.softwareag.com/t/how-to-convert-cumulocity-iot-widgets-to-plugins/277977) 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-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 +**NOTE:** This is only shown in the main page of the Application Builder, not when editing an individual application. ## Runtime Widgets -Application Builder supports runtime widgets deployment. Some of the runtime widgets are already available in widget catalog. -You can find runtime widgets at [Software AG Open Source](https://open-source.softwareag.com/?search=widget&topic=cumulocity-iot) +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](https://open-source.softwareag.com/?search=plugin&topic=cumulocity-iot) -Would you like to create your own Custom Runtime widget? Please refer our [Demo Widget](https://github.com/SoftwareAG/cumulocity-demo-widget). +Would you like to create your own Custom Runtime widget? Please refer our [Demo Widget](https://github.com/SoftwareAG/cumulocity-demo-widget-plugin). ## Troubleshooting + + ### Application Builder 2.0.0 and later + + * **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](https://github.com/SoftwareAG/cumulocity-app-builder/edit/2.0.0-dev-1/README.md#how-to-downgrade-application-builder-to-13x) 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 diff --git a/app.module.ts b/app.module.ts index 991788d..7f6fbda 100644 --- a/app.module.ts +++ b/app.module.ts @@ -19,39 +19,34 @@ import { Injector, NgModule } from '@angular/core'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { NavigationError, Router, RouterModule as NgRouterModule } from '@angular/router'; import { UpgradeModule as NgUpgradeModule } from '@angular/upgrade/static'; -import { AppStateService, CoreModule, RouterModule, PluginsModule } from '@c8y/ngx-components'; +import { AppStateService, CoreModule, RouterModule} from '@c8y/ngx-components'; import { DashboardUpgradeModule, UpgradeModule, HybridAppModule } from '@c8y/ngx-components/upgrade'; import { BuilderModule } from "./builder/builder.module"; import { filter, first, map, startWith, tap, withLatestFrom } from "rxjs/operators"; import { IUser } from '@c8y/client'; import { SimulationStrategiesModule } from "./simulation-strategies/simulation-strategies.module"; import { CustomWidgetsModule } from "./custom-widgets/custom-widgets.module"; -import { RuntimeWidgetInstallerModule, RuntimeWidgetLoaderService } from "cumulocity-runtime-widget-loader"; import { interval } from 'rxjs'; import { SettingsService } from './builder/settings/settings.service'; - -import { BinaryFileDownloadModule } from '@c8y/ngx-components/binary-file-download'; +import { WidgetsModule } from '@c8y/ngx-components/widgets'; @NgModule({ - imports: [ - // Upgrade module must be the first - UpgradeModule, - BrowserAnimationsModule, - RouterModule.forRoot(), - NgRouterModule.forRoot([], { enableTracing: false, useHash: true }), - CoreModule.forRoot(), - // PluginsModule, - NgUpgradeModule, - DashboardUpgradeModule, - BinaryFileDownloadModule, - BuilderModule, - SimulationStrategiesModule, - CustomWidgetsModule, - RuntimeWidgetInstallerModule - ] + imports: [ + // Upgrade module must be the first + UpgradeModule, + BrowserAnimationsModule, + RouterModule.forRoot(), + NgRouterModule.forRoot([], { enableTracing: false, useHash: true }), + CoreModule.forRoot(), + NgUpgradeModule, + DashboardUpgradeModule, + BuilderModule, + SimulationStrategiesModule, + WidgetsModule, + CustomWidgetsModule + ] }) export class AppModule extends HybridAppModule { - constructor(protected upgrade: NgUpgradeModule, appStateService: AppStateService, private router: Router, - private runtimeWidgetLoaderService: RuntimeWidgetLoaderService, + constructor(protected upgrade: NgUpgradeModule, appStateService: AppStateService, private router: Router, private injector: Injector, private settingsService: SettingsService) { super(); @@ -81,7 +76,6 @@ export class AppModule extends HybridAppModule { ngDoBootstrap(): void { super.ngDoBootstrap(); // Only do this after bootstrapping so that angularJs is loaded - this.runtimeWidgetLoaderService.loadRuntimeWidgets(); // A hack to get href hash changes to always trigger an Angular Router update... There seems to be an AngularUpgrade/AngularJS/Cumulocity bug somewhere that stops the hashchange event firing. // This bug is apparent when trying to use the AppSwitcher to change to another AppBuilder App, sometimes it works, sometimes it doesn't const $injector = this.injector.get('$injector'); diff --git a/binary/app-builder-external-assets-2.1.0.tgz b/binary/app-builder-external-assets-2.1.0.tgz deleted file mode 100644 index 1a9a134036b74b75375889fd1ed2bb88b6ade413..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25737 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%0AUHqT!hyuwE$nG^ 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 literal 0 HcmV?d00001 diff --git a/binary/cumulocity-runtime-widget-loader-1011.0.20-0.0.3.tgz b/binary/cumulocity-runtime-widget-loader-1011.0.20-0.0.3.tgz deleted file mode 100644 index e612ea715c1ac928be3f7bf2c4c5a6a5dc7c2aa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117039 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

9{v3KdGvD| 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 diff --git a/builder/app-builder-upgrade/app-builder-upgrade.service.ts b/builder/app-builder-upgrade/app-builder-upgrade.service.ts index 3574bd9..5a48e29 100644 --- a/builder/app-builder-upgrade/app-builder-upgrade.service.ts +++ b/builder/app-builder-upgrade/app-builder-upgrade.service.ts @@ -18,7 +18,7 @@ import { DOCUMENT } from "@angular/common"; import { HttpClient, HttpHeaders } from "@angular/common/http"; -import { Inject, Injectable, isDevMode, Renderer2, RendererFactory2 } from "@angular/core"; +import { Inject, Injectable, Renderer2, RendererFactory2 } from "@angular/core"; import { AlertService, AppStateService } from "@c8y/ngx-components"; import { ApplicationService, UserService } from "@c8y/ngx-components/api"; import { AppBuilderExternalAssetsService } from "app-builder-external-assets"; @@ -30,15 +30,16 @@ import * as JSZip from "jszip"; import { BsModalRef, BsModalService } from "ngx-bootstrap/modal"; import { forkJoin, Observable } from "rxjs"; import { AppBuilderConfig, VersionInfo } from "./app-builder-upgrade.model"; -import { version } from '../../package.json'; import { AppIdService } from "../app-id.service"; -import { catchError } from "rxjs/operators"; +import { catchError, delay, first } from "rxjs/operators"; import * as semver from "semver"; +import { IApplication } from "@c8y/client"; +import * as _ from 'lodash'; import { WidgetCatalogService } from "./../widget-catalog/widget-catalog.service"; -import { contextPathFromURL } from "../utils/contextPathFromURL"; -import { WidgetCatalog, WidgetModel } from "builder/widget-catalog/widget-catalog.model"; - +import { WidgetCatalog, WidgetModel } from "./../widget-catalog/widget-catalog.model"; +import { contextPathFromURL } from "./../utils/contextPathFromURL"; +const appVersion = require('../../package.json').version; @Injectable({ providedIn: 'root' }) export class AppBuilderUpgradeService { private renderer: Renderer2; @@ -49,34 +50,37 @@ export class AppBuilderUpgradeService { private GATEWAY_URL_GitHubAPI_FallBack = ''; private GATEWAY_URL_Labcase_FallBack = ''; private GATEWAY_URL_GitHubAsset_FallBack = ''; + // private appBuilderConfigPath = '/appbuilderConfig/app-builder-config.json'; private appBuilderConfigPath = '/appbuilderConfig/app-builder-config.json'; private devBranchPath = "?ref=development"; private preprodBranchPath = "?ref=preprod"; private appBuilderConfigModel: AppBuilderConfig; private versionInfo: VersionInfo; private applicationsList = []; + private currentApp: IApplication; userHasAdminRights: boolean; - - public appVersion: string = version; + public appVersion: string = appVersion; public newVersion: boolean = false; public errorReported = false; - appBuilderApp: any; constructor(private http: HttpClient, public rendererFactory: RendererFactory2, @Inject(DOCUMENT) private _document: Document, private modalService: BsModalService, private progressIndicatorService: ProgressIndicatorService, private appService: ApplicationService, private externalService: AppBuilderExternalAssetsService, - private widgetCatalogService: WidgetCatalogService, private settingService: SettingsService, private userService: UserService, private appStateService: AppStateService, - appIdService: AppIdService, private alertService: AlertService) { + appIdService: AppIdService, private alertService: AlertService, private widgetCatalogService: WidgetCatalogService) { this.GATEWAY_URL_GitHubAsset = this.externalService.getURL('GITHUB', 'gatewayURL_GitHubAsset'); this.GATEWAY_URL_GitHubAPI = this.externalService.getURL('GITHUB', 'gatewayURL_Github'); this.GATEWAY_URL_Labcase = this.externalService.getURL('DBCATALOG', 'gatewayURL'); - this.GATEWAY_URL_GitHubAPI_FallBack = this.externalService.getURL('GITHUB','gatewayURL_Github_Fallback'); - this.GATEWAY_URL_GitHubAsset_FallBack = this.externalService.getURL('GITHUB','gatewayURL_GitHubAsset_Fallback'); + this.GATEWAY_URL_GitHubAPI_FallBack = this.externalService.getURL('GITHUB', 'gatewayURL_Github_Fallback'); + this.GATEWAY_URL_GitHubAsset_FallBack = this.externalService.getURL('GITHUB', 'gatewayURL_GitHubAsset_Fallback'); this.GATEWAY_URL_Labcase_FallBack = this.externalService.getURL('DBCATALOG', 'gatewayURL_Fallback'); - appIdService.appIdDelayedUntilAfterLogin$.subscribe(() => { + appIdService.appIdDelayedUntilAfterLogin$.pipe(first()).subscribe(() => { this.userHasAdminRights = userService.hasRole(appStateService.currentUser.value, "ROLE_APPLICATION_MANAGEMENT_ADMIN") + this.appStateService.currentApplication.subscribe(app => { + this.currentApp = app; + this.verifyPlugins(); + }); }); } @@ -88,7 +92,7 @@ export class AppBuilderUpgradeService { }; async loadUpgradeBanner() { - if(contextPathFromURL() == 'app-builder') { + if (contextPathFromURL() == 'app-builder') { const isAppBuilderUpgradeNotification = await this.settingService.isAppUpgradeNotification(); if (this.userHasAdminRights && isAppBuilderUpgradeNotification) { await this.getAppBuilderConfig(); @@ -112,39 +116,43 @@ export class AppBuilderUpgradeService { private async getAppBuilderConfig() { await this.fetchAppBuilderConfig() - .subscribe(async appBuilderConfig => { - this.appBuilderConfigModel = appBuilderConfig; - let isValidContextPath = false; - if (this.appBuilderConfigModel && this.appBuilderConfigModel.upgradeInfo) { - this.versionInfo = this.appBuilderConfigModel.upgradeInfo.find( info => info.currentVersion === this.appVersion); - if(this.versionInfo) { - if (this.isLatestVersionAvailable(this.appVersion,this.versionInfo.updateAvailable)) { - this.newVersion = true; - } else { - this.newVersion = false; - } - const appList = await this.getApplicationList(); - const currentTenantId = this.settingService.getTenantName(); - this.appBuilderApp = appList.find( - app => this.versionInfo.contextPath && app.contextPath === this.versionInfo.contextPath && (String(app.availability) === 'PRIVATE')); - if(!this.appBuilderApp) { - // Checking app builder subscribed one.. - this.appBuilderApp = appList.find( - app => this.versionInfo.contextPath && app.contextPath === this.versionInfo.contextPath ); + .subscribe(async appBuilderConfig => { + this.appBuilderConfigModel = appBuilderConfig; + let isValidContextPath = false; + if (this.appBuilderConfigModel && this.appBuilderConfigModel.upgradeInfo) { + this.versionInfo = this.appBuilderConfigModel.upgradeInfo.find(info => info.currentVersion === this.appVersion); + if (this.versionInfo) { + if (this.isLatestVersionAvailable(this.appVersion, this.versionInfo.updateAvailable)) { + this.newVersion = true; + } else { + this.newVersion = false; + } + const appList = await this.getApplicationList(); + const currentTenantId = this.settingService.getTenantName(); + let appBuilderApp = appList.find( + app => this.versionInfo.contextPath && app.contextPath === this.versionInfo.contextPath && (String(app.availability) === 'PRIVATE')); + if (!appBuilderApp) { + // Checking app builder subscribed one.. + appBuilderApp = appList.find( + app => this.versionInfo.contextPath && app.contextPath === this.versionInfo.contextPath); + } + const appBuilderTenantId = (appBuilderApp && appBuilderApp.owner && appBuilderApp.owner.tenant ? appBuilderApp.owner.tenant.id : undefined); + if (appBuilderApp && currentTenantId === appBuilderTenantId) { isValidContextPath = true; } + /* else { + this.alertService.warning("Unable to detect valid Application Builder", + "Context Path of installed version of application builder is not matching with server"); + } */ } - const appBuilderTenantId = (this.appBuilderApp && this.appBuilderApp.owner && this.appBuilderApp.owner.tenant ? this.appBuilderApp.owner.tenant.id : undefined); - if(this.appBuilderApp && currentTenantId === appBuilderTenantId) { isValidContextPath = true;} + } - - } - if (this.newVersion && isValidContextPath) { - this.createAndRenderBanner(); - } - }); + if (this.newVersion && isValidContextPath) { + this.createAndRenderBanner(); + } + }); } private isLatestVersionAvailable(currentVersion: string, availableVersion: string) { - return semver.lt(currentVersion, availableVersion); + return semver.lt(currentVersion, availableVersion); } private initiateUpgrade(event: any) { @@ -156,7 +164,7 @@ export class AppBuilderUpgradeService { const confirmMsg = this.versionInfo?.confirmMsg; const alertMessage = { title: 'Installation Confirmation', - description: (confirmMsg ? confirmMsg: `You are about to upgrade Application Builder. + description: (confirmMsg ? confirmMsg : `You are about to upgrade Application Builder. Do you want to proceed?`), type: 'info', externalLink: (this.versionInfo?.releaseLink ? this.versionInfo?.releaseLink : ''), @@ -167,31 +175,18 @@ export class AppBuilderUpgradeService { const upgradeAppBuilderDialogRef = this.alertModalDialog(alertMessage); upgradeAppBuilderDialogRef.content.event.subscribe(async data => { if (data && data.isConfirm) { - if(this.versionInfo.verifyPlugins){ - if (this.appBuilderApp && this.appBuilderApp.availability === 'MARKET') { - const alertMessage = { - title: 'Installation Confirmation', - description: `You are about to upgrade the subscribed application. If any sub-tenant is subscribing to this application, it could be affected. - Do you wish to proceed?`, - type: 'warning', - alertType: 'confirm', //info|confirm - confirmPrimary: true //confirm Button is primary - } - const upgradeAppBuilderDialogRef = this.alertModalDialog(alertMessage); - upgradeAppBuilderDialogRef.content.event.subscribe(async data => { - if (data && data.isConfirm) { - this.showProgressModalDialog('Verifying existing widgets...'); - await this.verifyWidgetCompatibilityWithPlugin(); - } - }); - } else { - this.showProgressModalDialog('Verifying existing widgets...'); - await this.verifyWidgetCompatibilityWithPlugin(); - } + this.showProgressModalDialog('Downloading Application Builder...'); + await this.downlaodAndUpgradeAppBuilder(); + + // TODO: To be removed since plugin verification not required for future release + /* if(this.versionInfo.verifyPlugins){ + this.showProgressModalDialog('Verifying existing widgets...'); + await this.verifyWidgetCompatibilityWithPlugin(); } else { this.showProgressModalDialog('Downloading Application Builder...'); await this.downlaodAndUpgradeAppBuilder(); - } + } */ + } }); } @@ -232,7 +227,6 @@ export class AppBuilderUpgradeService { return this.modalService.show(AlertMessageModalComponent, { class: 'c8y-wizard', initialState: { message } }); } - async downloadAndInstall(binaryLocation: string, fileName: string, isGithub: boolean, installationType: 'INSTALL' | 'UPGRADE' | 'ANY') { this.errorReported = false; if (!binaryLocation) { @@ -268,6 +262,7 @@ export class AppBuilderUpgradeService { this.progressModal.hide(); throw Error("Not a Binary"); } + await this.upgradeApp(binaryFile, appC8yJson, installationType); } @@ -276,13 +271,13 @@ export class AppBuilderUpgradeService { if (installationType !== "INSTALL") { const appList = await this.getApplicationList(); const appName = appList.find(app => app.contextPath === appC8yJson.contextPath && app.availability === 'PRIVATE'); - if(appName) { + if (appName) { await this.uploadApp(appName, binaryFile, appC8yJson); - } - else{ + } + else { const appName = appList.find(app => app.contextPath === appC8yJson.contextPath); const appTenantId = (appName && appName.owner && appName.owner.tenant ? appName.owner.tenant.id : undefined); - if(appName && (String(appName.availability) === 'PRIVATE' || appTenantId === this.settingService.getTenantName())) { + if (appName && (String(appName.availability) === 'PRIVATE' || appTenantId === this.settingService.getTenantName())) { await this.uploadApp(appName, binaryFile, appC8yJson); } else { @@ -291,7 +286,7 @@ export class AppBuilderUpgradeService { return; } } - } else if(installationType !== "UPGRADE") { + } else if (installationType !== "UPGRADE") { // Create the custom App this.progressIndicatorService.setProgress(70); const custmApp = (await this.appService.create({ @@ -322,24 +317,23 @@ export class AppBuilderUpgradeService { this.progressIndicatorService.setProgress(90); } - private async uploadApp(appName: any, binaryFile: any, appC8yJson: any){ + private async uploadApp(appName: any, binaryFile: any, appC8yJson: any) { this.progressIndicatorService.setProgress(70); - // Upload the binary - const appBinary = (await this.appService.binary(appName).upload(binaryFile)).data; - // Update the app - this.progressIndicatorService.setProgress(80); - await this.appService.update({ - ...appC8yJson, - id: appName.id, - activeVersionId: appBinary.id.toString(), - config: {remotes:{}} - }); - if (window && window['aptrinsic']) { - window['aptrinsic']('track', 'gp_application_updated', { - "appBuilder": appName.name, - "tenantId": this.settingService.getTenantName(), - }); - } + // Upload the binary + const appBinary = (await this.appService.binary(appName).upload(binaryFile)).data; + // Update the app + this.progressIndicatorService.setProgress(80); + await this.appService.update({ + ...appC8yJson, + id: appName.id, + activeVersionId: appBinary.id.toString() + }); + if (window && window['aptrinsic']) { + window['aptrinsic']('track', 'gp_application_updated', { + "appBuilder": appName.name, + "tenantId": this.settingService.getTenantName(), + }); + } } private downloadBinary(binaryId: string, isGithub: boolean): Promise { let url = `${this.GATEWAY_URL_GitHubAsset}${binaryId}`; @@ -349,17 +343,17 @@ export class AppBuilderUpgradeService { return this.http.get(url, { responseType: 'arraybuffer' }) - .pipe(catchError(err => { - console.log('App Builder Upgrade Binary: Error in primary endpoint! using fallback...'); - let url = `${this.GATEWAY_URL_GitHubAsset_FallBack}${binaryId}`; - if (!isGithub) { - url = `${this.GATEWAY_URL_Labcase_FallBack}${binaryId}` - } - return this.http.get(url, { - responseType: 'arraybuffer' - }) - })) - .toPromise(); + .pipe(catchError(err => { + console.log('App Builder Upgrade Binary: Error in primary endpoint! using fallback...'); + let url = `${this.GATEWAY_URL_GitHubAsset_FallBack}${binaryId}`; + if (!isGithub) { + url = `${this.GATEWAY_URL_Labcase_FallBack}${binaryId}` + } + return this.http.get(url, { + responseType: 'arraybuffer' + }) + })) + .toPromise(); } fetchAppBuilderConfig(): Observable { @@ -367,157 +361,260 @@ export class AppBuilderUpgradeService { const urlFallBack = `${this.GATEWAY_URL_GitHubAPI_FallBack}${this.appBuilderConfigPath}`; if (this.appVersion.includes('dev')) { return this.http.get(`${url}${this.devBranchPath}`, this.HTTP_HEADERS) - .pipe(catchError(err => { - console.log('App Builder Config: Error in primary endpoint! using fallback...'); - return this.http.get(`${urlFallBack}${this.devBranchPath}`, this.HTTP_HEADERS) - })); + .pipe(catchError(err => { + console.log('App Builder Config: Error in primary endpoint! using fallback...'); + return this.http.get(`${urlFallBack}${this.devBranchPath}`, this.HTTP_HEADERS) + })); } else if (this.appVersion.includes('rc')) { return this.http.get(`${url}${this.preprodBranchPath}`, this.HTTP_HEADERS) - .pipe(catchError(err => { - console.log('App Builder Config: Error in primary endpoint! using fallback...'); - return this.http.get(`${urlFallBack}${this.preprodBranchPath}`, this.HTTP_HEADERS) - })); + .pipe(catchError(err => { + console.log('App Builder Config: Error in primary endpoint! using fallback...'); + return this.http.get(`${urlFallBack}${this.preprodBranchPath}`, this.HTTP_HEADERS) + })); } else { return this.http.get(`${url}`, this.HTTP_HEADERS) - .pipe(catchError(err => { - console.log('App Builder Config: Error in primary endpoint! using fallback...'); - return this.http.get(`${urlFallBack}`, this.HTTP_HEADERS) - })); + .pipe(catchError(err => { + console.log('App Builder Config: Error in primary endpoint! using fallback...'); + return this.http.get(`${urlFallBack}`, this.HTTP_HEADERS) + })); } } async getApplicationList() { - if(this.applicationsList && this.applicationsList.length > 0) { return this.applicationsList; } - this.applicationsList = (await this.appService.list({ pageSize: 2000, withTotalPages: true }) as any).data ; + if (this.applicationsList && this.applicationsList.length > 0) { return this.applicationsList; } + this.applicationsList = (await this.appService.list({ pageSize: 2000, withTotalPages: true }) as any).data; return this.applicationsList; } - private async verifyWidgetCompatibilityWithPlugin() { - let widgetCatalog: WidgetCatalog ; - let appList = await this.getApplicationList(); - this.progressIndicatorService.setProgress(10); - appList = appList.filter(app => (app.name && app.name.toLowerCase().includes('widget') || app.contextPath && app.contextPath.includes('widget')) && app.manifest && app.manifest.noAppSwitcher === true); - forkJoin([this.widgetCatalogService.fetchWidgetCatalog(), this.widgetCatalogService.fetchWidgetForDemoCatalog()]) - .subscribe(async ([widgetList1, widgetList2]) => { - this.progressIndicatorService.setProgress(15); - widgetCatalog = widgetList1; - widgetList2.widgets.forEach((widget: WidgetModel) => { - const widgetObj = widgetCatalog.widgets.find(widgetObj => widgetObj.contextPath === widget.contextPath); - if (!widgetObj && this.widgetCatalogService.isNextCompatiblieVersion(widget)) { widgetCatalog.widgets.push(widget); } - }); - appList.forEach(app => { - const appWidgetObj = widgetCatalog.widgets.find(widgetObj => widgetObj.contextPath === app.contextPath); - if (!appWidgetObj) { - appWidgetObj - widgetCatalog.widgets.push({ - contextPath: app.contextPath, - title: app.name, - requiredPlatformVersion: (app.manifest && app.manifest.requiredPlatformVersion ? app.manifest.requiredPlatformVersion : ''), - version: (app.manifest && app.manifest.version ? app.manifest.version : '') - }); - } + private async verifyPlugins() { + const appVersion = this.currentApp?.manifest?.version; + const appRemotes = this.currentApp?.config?.remotes; + const appBuilderConfig = (await this.settingService.getAppBuilderConfigs()); + if (appBuilderConfig?.configs?.remotes && Object.keys(appBuilderConfig?.configs?.remotes).length > 0) { + if (appVersion === appBuilderConfig?.appBuilderVersion && _.isEqual(appRemotes, appBuilderConfig?.configs.remotes)) { + console.info('All plugins are installed!'); + } else if (this.userHasAdminRights) { + if (appVersion !== appBuilderConfig?.appBuilderVersion) { + this.showProgressModalDialog('Verifying plugins! Please wait...'); + let widgetCatalog: WidgetCatalog; + forkJoin([this.widgetCatalogService.fetchWidgetCatalog(), this.widgetCatalogService.fetchWidgetForDemoCatalog()]) + .subscribe(async ([widgetList1, widgetList2]) => { + const widgetCatalogWidgets = [...widgetList1.widgets]; + widgetCatalog = widgetList1; + widgetList2.widgets.forEach((widget: WidgetModel) => { + const widgetObj = widgetCatalogWidgets.find(widgetObj => widgetObj.contextPath === widget.contextPath); + if (!widgetObj) { widgetCatalog.widgets.push(widget); } + }); + await this.installPlugins(appBuilderConfig, appRemotes, widgetCatalog); + }); + } + else { + this.showProgressModalDialog('Verifying plugins! Please wait...'); + await this.widgetCatalogService.updateRemotesToAppBuilderConfig(); + this.progressModal.hide(); + this.showProgressModalDialog('Refreshing...'); + await new Promise(resolve => setTimeout(resolve, 4000)); + window.location.reload(); + } + } + else { + this.alertService.danger('Plugin verification required! Please login with Admin permission and refresh this page.') + } + } else { + if (appVersion !== appBuilderConfig?.appBuilderVersion) { + this.verifyPluginsOnDirectInstall(); + } + } + } + async installPlugins(appBuilderConfig, appRemotes, widgetCatalog: any, nonCompatibleWidgets?: any) { + widgetCatalog.widgets = await this.widgetCatalogService.filterInstalledWidgets(widgetCatalog, this.userHasAdminRights); + const totalRemotes = (appBuilderConfig?.configs?.remotes ? Object.keys(appBuilderConfig?.configs?.remotes).length : 0); + const eachRemoteProgress: number = Math.floor((totalRemotes > 1 ? (90 / totalRemotes) : 0)); + let overallProgress = 0; + if (totalRemotes > 1) { this.progressIndicatorService.setOverallProgress(overallProgress); } + const appBuilderConfigRemotes = this.widgetCatalogService.removeVersionFromPluginRemotes(appBuilderConfig?.configs?.remotes); + let appConfigUpdated = false; + for (let remote of appBuilderConfigRemotes) { + let pluginBinary = widgetCatalog.widgets.find(widget => widget.contextPath === remote?.pluginContext && widget.isCompatible); + if (pluginBinary && (pluginBinary.binaryLink && pluginBinary.binaryLink !== '' || pluginBinary.link && pluginBinary.link !=="")) { + this.progressIndicatorService.setProgress(0); + this.progressIndicatorService.setMessage(`Installing ${pluginBinary.title}`); + this.progressIndicatorService.setProgress(10); + let binary = null; + let fileName = ''; + if (pluginBinary.binaryLink && pluginBinary.binaryLink !== '') { + binary = await new Promise(resolve => this.widgetCatalogService.downloadBinary(pluginBinary.binaryLink) + .subscribe(binaryData => resolve(binaryData), error => { + this.logError(); + })) as any; + fileName = pluginBinary.binaryLink.replace(/^.*[\\\/]/, ''); + } else { + binary = await new Promise(resolve => this.widgetCatalogService.downloadBinaryFromLabcase(pluginBinary.link) + .subscribe(binaryData => resolve(binaryData), error => { + this.logError(); + })) as any; + fileName = pluginBinary.fileName; + } + const blob = new Blob([binary], { + type: 'application/zip' }); - let isDownloadUpgrade = true; - let plugins = []; - if (widgetCatalog && widgetCatalog.widgets && widgetCatalog.widgets.length > 0) { - widgetCatalog.widgets.forEach(widget => { - widget.isCompatible = this.widgetCatalogService.isCompatiblieVersion(widget); - const appObj = appList.find(app => app.contextPath === widget.contextPath); - widget.installedVersion = (appObj && appObj.manifest && appObj.manifest.version ? appObj.manifest.version : ''); - widget.installed = appObj && this.findInstalledWidget(widget, widgetCatalog); //(widgetObj != undefined); + const fileOfBlob = new File([blob], fileName); + await this.widgetCatalogService.installPackage(fileOfBlob); + appConfigUpdated = true; + } + overallProgress = overallProgress + eachRemoteProgress; + this.progressIndicatorService.setOverallProgress(overallProgress) + } + if (!appConfigUpdated) { + await this.settingService.updateAppConfigurationForPlugin(appRemotes); + } + this.progressModal.hide(); + if (nonCompatibleWidgets) { + const alertMessage = { + title: 'Information', + description: `Following widgets are not compatible with Application Builder ${appVersion}: + ${nonCompatibleWidgets.toLocaleUpperCase()}`, + type: 'info', + alertType: '', //info|confirm + confirmPrimary: false //confirm Button is primary + } + const confirmNonCompatibleWidgets = this.alertModalDialog(alertMessage); + confirmNonCompatibleWidgets.content.event.subscribe(async data => { + if (data && !data.isConfirm) { + sessionStorage.setItem('isUpgrade', 'false'); + this.settingService.updateAppBuilderMO(); + this.showProgressModalDialog('Refreshing...'); + await new Promise(resolve => setTimeout(resolve, 4000)); + window.location.reload(); + + } + }); + } else { + sessionStorage.setItem('isUpgrade', 'false'); + this.settingService.updateAppBuilderMO(); + this.showProgressModalDialog('Refreshing...'); + await new Promise(resolve => setTimeout(resolve, 4000)); + window.location.reload(); + + } + } + + private async verifyPluginsOnDirectInstall() { + if (this.userHasAdminRights) { + this.showProgressModalDialog('Verifying plugins! Please wait...'); + let appList = await this.getApplicationList(); + let widgetCatalog: WidgetCatalog; + const appRemotes = this.currentApp?.config?.remotes; + appList = appList.filter(app => (app.name && app.name.toLowerCase().includes('widget') || app.contextPath && app.contextPath.includes('widget')) && app.manifest && app.manifest.noAppSwitcher === true); + forkJoin([this.widgetCatalogService.fetchWidgetCatalog(), this.widgetCatalogService.fetchWidgetForDemoCatalog()]) + .subscribe(async ([widgetList1, widgetList2]) => { + const widgetCatalogWidgets = [...widgetList1.widgets]; + widgetCatalog = widgetList1; + widgetList2.widgets.forEach((widget: WidgetModel) => { + const widgetObj = widgetCatalogWidgets.find(widgetObj => widgetObj.contextPath === widget.contextPath); + if (!widgetObj) { widgetCatalog.widgets.push(widget); } }); - this.progressIndicatorService.setProgress(25); - let installedWidgets = widgetCatalog.widgets.filter(widget => widget.installed); - let nonCompatibleWidgets = ''; - if(installedWidgets && installedWidgets.length > 0){ - installedWidgets.forEach( widget => { - const compatiblePlugin = widgetCatalog.widgets.find( plugin => (plugin.oldContextPath ? plugin.oldContextPath === widget.contextPath : plugin.contextPath === widget.contextPath) && - this.widgetCatalogService.isNextCompatiblieVersion(plugin)); - if(compatiblePlugin) { - widget.isNextVersionAvailable = true; - plugins.push(compatiblePlugin); - } else { - nonCompatibleWidgets += `${widget.title} \n`; - } - }); - - if(nonCompatibleWidgets) { - isDownloadUpgrade = false; - this.progressModal.hide(); - const alertMessage = { - title: 'Installation Confirmation', - description: `Following widgets are not compatible with Application Builder ${this.versionInfo.updateAvailable}: - ${nonCompatibleWidgets.toLocaleUpperCase()} - Do you want to proceed?`, - type: 'info', - alertType: 'confirm', //info|confirm - confirmPrimary: true //confirm Button is primary - } - const confirmNonCompatibleWidgets = this.alertModalDialog(alertMessage); - confirmNonCompatibleWidgets.content.event.subscribe(async data => { - if (data && data.isConfirm) { - this.showProgressModalDialog('Saving plugins configuration...'); - this.progressIndicatorService.setProgress(26); - await this.updateAppConfigurationForPlugin(plugins); - this.progressIndicatorService.setProgress(28); - await this.downlaodAndUpgradeAppBuilder(); - if(plugins && plugins.length > 0) { - await this.uninstallWidgets(plugins); + appList.forEach(app => { + const appWidgetObj = widgetCatalog.widgets.find(widgetObj => widgetObj.contextPath === app.contextPath); + if (!appWidgetObj) { + widgetCatalog.widgets.push({ + contextPath: app.contextPath, + title: app.name, + requiredPlatformVersion: (app.manifest && app.manifest.requiredPlatformVersion ? app.manifest.requiredPlatformVersion : ''), + version: (app.manifest && app.manifest.version ? app.manifest.version : '') + }); + } + + }); + let plugins = []; + if (widgetCatalog && widgetCatalog.widgets && widgetCatalog.widgets.length > 0) { + widgetCatalog.widgets.forEach(widget => { + const appObj = appList.find(app => app.contextPath === widget.contextPath); + widget.installedVersion = (appObj && appObj.manifest && appObj.manifest.version ? appObj.manifest.version : ''); + widget.installed = appObj && this.findInstalledWidget(widget, widgetCatalog); //(widgetObj != undefined); + }); + let installedWidgets = widgetCatalog.widgets.filter(widget => widget.installed); + let nonCompatibleWidgets = ''; + let appConfigUpdated = false; + if (installedWidgets && installedWidgets.length > 0) { + installedWidgets.forEach(widget => { + const compatiblePlugin = widgetCatalog.widgets.find(plugin => (plugin.oldContextPath ? plugin.oldContextPath === widget.contextPath : plugin.contextPath === widget.contextPath) && + this.widgetCatalogService.isCompatiblieVersion(plugin)); + if (compatiblePlugin) { + widget.isNextVersionAvailable = true; + plugins.push(compatiblePlugin); + } else { + if (!this.widgetCatalogService.isCompatiblieVersion(widget)) { + nonCompatibleWidgets += `${widget.title} \n`; } } }); - } else if(plugins && plugins.length > 0) { - this.progressIndicatorService.setMessage('Saving plugins configuration...'); - await this.updateAppConfigurationForPlugin(plugins); - this.progressIndicatorService.setProgress(28); + if (plugins && plugins.length > 0) { + sessionStorage.setItem('isUpgrade', 'true'); + await this.updateAppConfigurationForPlugin(plugins, 'true'); + await this.uninstallWidgets(plugins); + await this.settingService.getAppBuilderConfig(); + const appBuilderConfig = (await this.settingService.getAppBuilderConfigs()); + await this.installPlugins(appBuilderConfig, appRemotes, widgetCatalog, nonCompatibleWidgets); + appConfigUpdated = true; + } + } + if (!appConfigUpdated) { + await this.settingService.updateAppConfigurationForPlugin(appRemotes); + this.showProgressModalDialog('Refreshing...'); + await new Promise(resolve => setTimeout(resolve, 4000)); + window.location.reload(); } } - } - if(isDownloadUpgrade) { - await this.downlaodAndUpgradeAppBuilder(); - } - if(isDownloadUpgrade && plugins && plugins.length > 0) { - await this.uninstallWidgets(plugins); - } - }, error => { - this.alertService.danger("There is some technical error! Please try after sometime."); - this.progressModal.hide(); - }); - } - - // if same widget exists in widget catalog json more than one time with different version - private findInstalledWidget(widget: WidgetModel, widgetCatalog: any) { - const checkWidgetInCatalog = widgetCatalog.widgets.filter(widgetCatalogWidget => widget.id ? widgetCatalogWidget.id === widget.id : widgetCatalogWidget.contextPath === widget.contextPath); - if (checkWidgetInCatalog && checkWidgetInCatalog.length > 1) { - const isWidgetInstalled = checkWidgetInCatalog.find(installObj => installObj.installed); - if (isWidgetInstalled) return false; - return widget.isCompatible && this.widgetCatalogService.checkInstalledVersion(widget); + }, error => { + this.alertService.danger("There is some technical error! Please try after sometime."); + this.progressModal.hide(); + }); } - return true; } - private async updateAppConfigurationForPlugin(plugins: any) { + private async updateAppConfigurationForPlugin(plugins: any, underMaintenance?: any) { let remotes = {}; for (const pluginBinary of plugins) { (remotes[pluginBinary.contextPath] = remotes[pluginBinary.contextPath] || []).push(pluginBinary.moduleName); }; // updating config MO to retain widget status - await this.settingService.updateAppConfigurationForPlugin(remotes, 'true'); - } + await this.settingService.updateAppConfigurationForPlugin(remotes, underMaintenance); + } private async uninstallWidgets(plugins: any) { const appList = await this.getApplicationList(); for (const pluginBinary of plugins) { - const widgetAppObj = appList.find(app => pluginBinary.oldContextPath ? app.contextPath === pluginBinary.oldContextPath : app.contextPath === pluginBinary.contextPath) - if (widgetAppObj) { + const widgetAppObj: IApplication = appList.find(app => pluginBinary.oldContextPath ? app.contextPath === pluginBinary.oldContextPath : app.contextPath === pluginBinary.contextPath) + if (widgetAppObj && (widgetAppObj.manifest && !widgetAppObj.manifest?.isPackage)) { try { await this.appService.delete(widgetAppObj.id); } catch (e) { - console.error(e); + console.error(e); } } }; - } - + } + + // if same widget exists in widget catalog json more than one time with different version + private findInstalledWidget(widget: WidgetModel, widgetCatalog: any) { + const checkWidgetInCatalog = widgetCatalog.widgets.filter(widgetCatalogWidget => widget.id ? widgetCatalogWidget.id === widget.id : widgetCatalogWidget.contextPath === widget.contextPath); + if (checkWidgetInCatalog && checkWidgetInCatalog.length > 1) { + const isWidgetInstalled = checkWidgetInCatalog.find(installObj => installObj.installed); + if (isWidgetInstalled) return false; + return this.checkInstalledVersionForDirectInstall(widget); + } + return true; + } + + private logError() { + this.alertService.danger("Unable verify plugin due to technical error! Please try after sometime."); + this.progressModal.hide(); + } + checkInstalledVersionForDirectInstall(widget: WidgetModel) { + if (!widget.installedVersion) return true; + const major = '>=' + semver.major(widget.installedVersion) + '.0.0'; + return semver.satisfies(widget.version, major); + } } \ No newline at end of file diff --git a/builder/app-data.service.ts b/builder/app-data.service.ts new file mode 100644 index 0000000..5e0e333 --- /dev/null +++ b/builder/app-data.service.ts @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2019 Software AG, Darmstadt, Germany and/or its licensors +* +* SPDX-License-Identifier: Apache-2.0 +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. + */ + +import {from, Observable} from "rxjs"; +import {Injectable} from "@angular/core"; +import { ApplicationService, IApplication } from "@c8y/client"; + +@Injectable({providedIn: 'root'}) +export class AppDataService { + + APP_DETAILS_REFRESH_INTERVAL = 5000; // Milliseconds + + private appDetails: Observable; + private appId: string | number = ''; + private lastUpdated = 0; + forceUpdate = false; + constructor(private appService: ApplicationService) { + } + + getAppDetails(appId: string): Observable { + const currentTime = Date.now(); + if(appId && (appId !== this.appId || this.forceUpdate)) { + this.appId = appId; + if(this.forceUpdate || this.lastUpdated == 0 || ( currentTime - this.lastUpdated > this.APP_DETAILS_REFRESH_INTERVAL)){ + this.appDetails = from(this.appService.detail(appId).then(res => res.data as any)); + this.lastUpdated = Date.now(); + this.forceUpdate = false; + } + } + return this.appDetails; + } +} diff --git a/builder/app-list/app-list.component.html b/builder/app-list/app-list.component.html index 6edb1d4..c4b033e 100644 --- a/builder/app-list/app-list.component.html +++ b/builder/app-list/app-list.component.html @@ -7,39 +7,44 @@ Add application -

-
- -
-

-

{{app.name}}

-
-
- - Open - +
+

No application to list.

+
+ +
+
+ +
+

+

{{app.name}}

+
+
-
+
diff --git a/builder/app-list/app-list.component.ts b/builder/app-list/app-list.component.ts index 52a9132..399cb32 100644 --- a/builder/app-list/app-list.component.ts +++ b/builder/app-list/app-list.component.ts @@ -39,13 +39,13 @@ import { AppListService } from "./app-list.service"; }) export class AppListComponent { // applications: Observable; - applications: IApplication[]; + applications: IApplication[] = []; allApplications: IApplication[]; userHasAdminRights: boolean; bsModalRef: BsModalRef; - + isBusy = true; constructor(private router: Router, private appService: ApplicationService, private appStateService: AppStateService, private modalService: BsModalService, private userService: UserService, private appListService: AppListService, private realTimeService: Realtime) { @@ -62,7 +62,6 @@ export class AppListComponent { } }); this.getListOfApplications(); - } private async getListOfApplications() { @@ -75,10 +74,12 @@ export class AppListComponent { } this.applications = this.allApplications.filter(app => app.hasOwnProperty('applicationBuilder')); this.applications = this.applications.sort((a, b) => a.id > b.id ? 1 : -1); + this.isBusy = false; } else { this.allApplications = (await this.appService.listByUser(this.appStateService.currentUser.value, { pageSize: 2000 })).data; this.applications = this.allApplications.filter(app => app.hasOwnProperty('applicationBuilder')); this.applications = this.applications.sort((a, b) => a.id > b.id ? 1 : -1); + this.isBusy = false; } /* if(this.userHasAdminRights){ this.applications = from(new Observable( diff --git a/builder/app-list/new-application-modal.component.ts b/builder/app-list/new-application-modal.component.ts index eb1a5bb..fe0ef5b 100644 --- a/builder/app-list/new-application-modal.component.ts +++ b/builder/app-list/new-application-modal.component.ts @@ -38,7 +38,7 @@ import { AppListService } from './app-list.service';
- +
@@ -96,6 +96,16 @@ export class NewApplicationModalComponent implements OnInit { this.loadApplicationsForClone(); } + validateAppName(newAppBuilderAppForm) { + const appFound = this.allApplications.find(app => app.name.toLowerCase() === this.appName.toLowerCase() || + (this.appPath && this.appPath.length > 0 && (app.contextPath && app.contextPath?.toLowerCase() === this.appPath.toLowerCase()))) + if (appFound) { + newAppBuilderAppForm.form.setErrors({ 'invalid': true }); + this.alertService.danger(" Application name or context path already exists!"); + return; + } + } + async createApplication() { let isCloneApp = false; let appBuilderObj; @@ -290,6 +300,12 @@ export class NewApplicationModalComponent implements OnInit { ...defaultAppBuilderData } as any); + + // update manifest + await this.appService.storeAppManifest(app.id, { + ...appBuilder.manifest, + icon: defaultAppBuilderData.icon + }); // Update App Builder Custom Properties await this.updateAppBuilderConfiguration(existingAppBuilderId, appId); diff --git a/builder/application-config/dashboard-config.component.html b/builder/application-config/dashboard-config.component.html index 59a3fa4..530b714 100644 --- a/builder/application-config/dashboard-config.component.html +++ b/builder/application-config/dashboard-config.component.html @@ -2,7 +2,8 @@ -
{{item.value.visibility === 'no-nav' ? 'Tabs Only' : item.value.visibility === 'hidden' ? 'Hidden': item.value.visibility}}
{{item.value.tabGroup}}
@@ -72,10 +74,12 @@

Details

{{item.value.groupTemplate ? 'Children of: ' : ''}}{{item.value.deviceId || '-'}}
- - + +
@@ -84,14 +88,13 @@

Details

Dashboards

-
-