From 47af95d3ed2d12cc7c1e94f102e0f2b87d4b2257 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Thu, 5 Jul 2018 18:37:09 +0300 Subject: [PATCH 1/3] Dashboard load improvements. --- ui/src/app/api/dashboard.service.js | 2 +- ui/src/app/api/user.service.js | 7 ++++--- ui/src/app/app.run.js | 7 +++++-- .../app/components/widget/widget.controller.js | 6 +++++- ui/src/app/dashboard/dashboard.controller.js | 11 ++++++++++- ui/src/app/dashboard/dashboard.routes.js | 18 ++++++++++++++++++ ui/src/app/dashboard/dashboard.tpl.html | 2 +- 7 files changed, 44 insertions(+), 9 deletions(-) diff --git a/ui/src/app/api/dashboard.service.js b/ui/src/app/api/dashboard.service.js index 507fe9767a..adab48fb46 100644 --- a/ui/src/app/api/dashboard.service.js +++ b/ui/src/app/api/dashboard.service.js @@ -252,7 +252,7 @@ function DashboardService($rootScope, $http, $q, $location, $filter) { if (port != 80 && port != 443) { url += ":" + port; } - url += "/dashboards/" + dashboard.id.id + "?publicId=" + dashboard.publicCustomerId; + url += "/dashboard/" + dashboard.id.id + "?publicId=" + dashboard.publicCustomerId; return url; } diff --git a/ui/src/app/api/user.service.js b/ui/src/app/api/user.service.js index cb85709384..48c811bb8d 100644 --- a/ui/src/app/api/user.service.js +++ b/ui/src/app/api/user.service.js @@ -488,7 +488,8 @@ function UserService($http, $q, $rootScope, adminService, dashboardService, logi } else { return true; } - } else if (to.name === 'home.dashboards.dashboard' && allowedDashboardIds.indexOf(params.dashboardId) > -1) { + } else if ((to.name === 'home.dashboards.dashboard' || to.name === 'dashboard') + && allowedDashboardIds.indexOf(params.dashboardId) > -1) { return false; } else { return true; @@ -504,10 +505,10 @@ function UserService($http, $q, $rootScope, adminService, dashboardService, logi var place = 'home.links'; if (currentUser.authority === 'TENANT_ADMIN' || currentUser.authority === 'CUSTOMER_USER') { if (userHasDefaultDashboard()) { - place = 'home.dashboards.dashboard'; + place = $rootScope.forceFullscreen ? 'dashboard' : 'home.dashboards.dashboard'; params = {dashboardId: currentUserDetails.additionalInfo.defaultDashboardId}; } else if (isPublic()) { - place = 'home.dashboards.dashboard'; + place = 'dashboard'; params = {dashboardId: lastPublicDashboardId}; } } else if (currentUser.authority === 'SYS_ADMIN') { diff --git a/ui/src/app/app.run.js b/ui/src/app/app.run.js index f3886b8dec..4667b09e06 100644 --- a/ui/src/app/app.run.js +++ b/ui/src/app/app.run.js @@ -113,7 +113,10 @@ export default function AppRun($rootScope, $window, $injector, $location, $log, showForbiddenDialog(); } else if (to.redirectTo) { evt.preventDefault(); - $state.go(to.redirectTo, params) + $state.go(to.redirectTo, params); + } else if (to.name === 'home.dashboards.dashboard' && $rootScope.forceFullscreen) { + evt.preventDefault(); + $state.go('dashboard', params); } } } else { @@ -138,7 +141,7 @@ export default function AppRun($rootScope, $window, $injector, $location, $log, $rootScope.pageTitle = 'ThingsBoard'; $rootScope.stateChangeSuccessHandle = $rootScope.$on('$stateChangeSuccess', function (evt, to, params) { - if (userService.isPublic() && to.name === 'home.dashboards.dashboard') { + if (userService.isPublic() && to.name === 'dashboard') { $location.search('publicId', userService.getPublicId()); userService.updateLastPublicDashboardId(params.dashboardId); } diff --git a/ui/src/app/components/widget/widget.controller.js b/ui/src/app/components/widget/widget.controller.js index 9feb40d7b5..36e5bee1cc 100644 --- a/ui/src/app/components/widget/widget.controller.js +++ b/ui/src/app/components/widget/widget.controller.js @@ -479,7 +479,11 @@ export default function WidgetController($scope, $state, $timeout, $window, $ele dashboardId: targetDashboardId, state: utils.objToBase64([ stateObject ]) } - $state.go('home.dashboards.dashboard', stateParams); + if ($state.current.name === 'dashboard') { + $state.go('dashboard', stateParams); + } else { + $state.go('home.dashboards.dashboard', stateParams); + } break; case types.widgetActionTypes.custom.value: var customFunction = descriptor.customFunction; diff --git a/ui/src/app/dashboard/dashboard.controller.js b/ui/src/app/dashboard/dashboard.controller.js index f672f3f03b..6df48df032 100644 --- a/ui/src/app/dashboard/dashboard.controller.js +++ b/ui/src/app/dashboard/dashboard.controller.js @@ -196,6 +196,7 @@ export default function DashboardController(types, utils, dashboardUtils, widget vm.displayDashboardTimewindow = displayDashboardTimewindow; vm.displayDashboardsSelect = displayDashboardsSelect; vm.displayEntitiesSelect = displayEntitiesSelect; + vm.hideFullscreenButton = hideFullscreenButton; vm.widgetsBundle; @@ -258,7 +259,11 @@ export default function DashboardController(types, utils, dashboardUtils, widget dashboardId: vm.currentDashboardId }); } else { - $state.go('home.dashboards.dashboard', {dashboardId: vm.currentDashboardId}); + if ($state.current.name === 'dashboard') { + $state.go('dashboard', {dashboardId: vm.currentDashboardId}); + } else { + $state.go('home.dashboards.dashboard', {dashboardId: vm.currentDashboardId}); + } } } }); @@ -805,6 +810,10 @@ export default function DashboardController(types, utils, dashboardUtils, widget } } + function hideFullscreenButton() { + return vm.widgetEditMode || vm.iframeMode || $rootScope.forceFullscreen || $state.current.name === 'dashboard'; + } + function onRevertWidgetEdit(widgetForm) { if (widgetForm.$dirty) { widgetForm.$setPristine(); diff --git a/ui/src/app/dashboard/dashboard.routes.js b/ui/src/app/dashboard/dashboard.routes.js index ccb43c708f..4572ac38f7 100644 --- a/ui/src/app/dashboard/dashboard.routes.js +++ b/ui/src/app/dashboard/dashboard.routes.js @@ -86,6 +86,24 @@ export default function DashboardRoutes($stateProvider) { label: '{"icon": "dashboard", "label": "{{ vm.dashboard.title }}", "translate": "false"}' } }) + .state('dashboard', { + url: '/dashboard/:dashboardId?state', + reloadOnSearch: false, + module: 'private', + auth: ['TENANT_ADMIN', 'CUSTOMER_USER'], + views: { + "@": { + templateUrl: dashboardTemplate, + controller: 'DashboardController', + controllerAs: 'vm' + } + }, + data: { + widgetEditMode: false, + searchEnabled: false, + pageTitle: 'dashboard.dashboard' + } + }) .state('home.customers.dashboards.dashboard', { url: '/:dashboardId?state', reloadOnSearch: false, diff --git a/ui/src/app/dashboard/dashboard.tpl.html b/ui/src/app/dashboard/dashboard.tpl.html index 9626509a51..829f174fe7 100644 --- a/ui/src/app/dashboard/dashboard.tpl.html +++ b/ui/src/app/dashboard/dashboard.tpl.html @@ -16,7 +16,7 @@ --> + hide-expand-button="vm.hideFullscreenButton()" expand-tooltip-direction="bottom" ng-if="vm.dashboard">
Date: Fri, 6 Jul 2018 13:00:41 +0300 Subject: [PATCH 2/3] Add help links for new Rule Nodes. --- ui/src/app/help/help-links.constant.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ui/src/app/help/help-links.constant.js b/ui/src/app/help/help-links.constant.js index 1b708a9178..458c118883 100644 --- a/ui/src/app/help/help-links.constant.js +++ b/ui/src/app/help/help-links.constant.js @@ -20,6 +20,7 @@ var ruleNodeClazzHelpLinkMap = { 'org.thingsboard.rule.engine.filter.TbJsSwitchNode': 'ruleNodeJsSwitch', 'org.thingsboard.rule.engine.filter.TbMsgTypeFilterNode': 'ruleNodeMessageTypeFilter', 'org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode': 'ruleNodeMessageTypeSwitch', + 'org.thingsboard.rule.engine.filter.TbOriginatorTypeFilterNode': 'ruleNodeOriginatorTypeFilter', 'org.thingsboard.rule.engine.filter.TbOriginatorTypeSwitchNode': 'ruleNodeOriginatorTypeSwitch', 'org.thingsboard.rule.engine.metadata.TbGetAttributesNode': 'ruleNodeOriginatorAttributes', 'org.thingsboard.rule.engine.metadata.TbGetOriginatorFieldsNode': 'ruleNodeOriginatorFields', @@ -31,7 +32,8 @@ var ruleNodeClazzHelpLinkMap = { 'org.thingsboard.rule.engine.transform.TbTransformMsgNode': 'ruleNodeTransformMsg', 'org.thingsboard.rule.engine.mail.TbMsgToEmailNode': 'ruleNodeMsgToEmail', 'org.thingsboard.rule.engine.action.TbClearAlarmNode': 'ruleNodeClearAlarm', - 'org.thingsboard.rule.engine.action.TbCreateAlarmNode': 'ruleNodeCrateAlarm', + 'org.thingsboard.rule.engine.action.TbCreateAlarmNode': 'ruleNodeCreateAlarm', + 'org.thingsboard.rule.engine.delay.TbMsgDelayNode': 'ruleNodeMsgDelay', 'org.thingsboard.rule.engine.debug.TbMsgGeneratorNode': 'ruleNodeMsgGenerator', 'org.thingsboard.rule.engine.action.TbLogNode': 'ruleNodeLog', 'org.thingsboard.rule.engine.rpc.TbSendRPCReplyNode': 'ruleNodeRpcCallReply', @@ -61,6 +63,7 @@ export default angular.module('thingsboard.help', []) ruleNodeJsSwitch: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#switch-node", ruleNodeMessageTypeFilter: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#message-type-filter-node", ruleNodeMessageTypeSwitch: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#message-type-switch-node", + ruleNodeOriginatorTypeFilter: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#originator-type-filter-node", ruleNodeOriginatorTypeSwitch: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/filter-nodes/#originator-type-switch-node", ruleNodeOriginatorAttributes: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#originator-attributes", ruleNodeOriginatorFields: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/enrichment-nodes/#originator-fields", @@ -72,7 +75,8 @@ export default angular.module('thingsboard.help', []) ruleNodeTransformMsg: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/transformation-nodes/#script-transformation-node", ruleNodeMsgToEmail: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/transformation-nodes/#to-email-node", ruleNodeClearAlarm: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#clear-alarm-node", - ruleNodeCrateAlarm: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#create-alarm-node", + ruleNodeCreateAlarm: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#create-alarm-node", + ruleNodeMsgDelay: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#delay-node", ruleNodeMsgGenerator: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#generator-node", ruleNodeLog: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#log-node", ruleNodeRpcCallReply: helpBaseUrl + "/docs/user-guide/rule-engine-2-0/action-nodes/#rpc-call-reply-node", From 60046e8353fa070cf5bf6c5161d7db99099c0175 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 6 Jul 2018 20:49:19 +0300 Subject: [PATCH 3/3] Reduce UI resources size. UI resources compression support. --- application/src/main/resources/thingsboard.yml | 7 +++++++ ui/package.json | 4 ++-- ui/src/app/components/json-content.directive.js | 4 ++-- ui/src/app/components/json-object-edit.directive.js | 2 +- ui/src/app/widget/widget-editor.controller.js | 11 +++++------ ui/webpack.config.prod.js | 8 ++++++++ 6 files changed, 25 insertions(+), 11 deletions(-) diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 5653193d27..154a0982b1 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -328,6 +328,13 @@ spring.mvc.cors: max-age: "1800" allow-credentials: "true" +# spring serve gzip compressed static resources +spring.resources.chain: + gzipped: "true" + strategy: + content: + enabled: "true" + # HSQLDB DAO Configuration spring: data: diff --git a/ui/package.json b/ui/package.json index 892664faec..a4b0e4d385 100644 --- a/ui/package.json +++ b/ui/package.json @@ -15,7 +15,6 @@ }, "dependencies": { "@flowjs/ng-flow": "^2.7.1", - "ace-builds": "1.3.1", "angular": "1.5.8", "angular-animate": "1.5.8", "angular-aria": "1.5.8", @@ -47,7 +46,7 @@ "angular-ui-router": "^0.3.1", "angular-websocket": "^2.0.1", "base64-js": "^1.2.1", - "brace": "^0.8.0", + "brace": "^0.10.0", "canvas-gauges": "^2.0.9", "clipboard": "^1.5.15", "compass-sass-mixins": "^0.12.7", @@ -96,6 +95,7 @@ "babel-loader": "^6.2.5", "babel-preset-es2015": "^6.14.0", "babel-preset-react": "^6.16.0", + "compression-webpack-plugin": "^1.1.11", "connect-history-api-fallback": "^1.3.0", "copy-webpack-plugin": "^3.0.1", "cross-env": "^3.2.4", diff --git a/ui/src/app/components/json-content.directive.js b/ui/src/app/components/json-content.directive.js index e945079273..102748679c 100644 --- a/ui/src/app/components/json-content.directive.js +++ b/ui/src/app/components/json-content.directive.js @@ -18,8 +18,8 @@ import './json-content.scss'; import 'brace/ext/language_tools'; import 'brace/mode/json'; import 'brace/mode/text'; -import 'ace-builds/src-min-noconflict/snippets/json'; -import 'ace-builds/src-min-noconflict/snippets/text'; +import 'brace/snippets/json'; +import 'brace/snippets/text'; import fixAceEditor from './ace-editor-fix'; diff --git a/ui/src/app/components/json-object-edit.directive.js b/ui/src/app/components/json-object-edit.directive.js index 215b7b9fe8..9364689f1e 100644 --- a/ui/src/app/components/json-object-edit.directive.js +++ b/ui/src/app/components/json-object-edit.directive.js @@ -17,7 +17,7 @@ import './json-object-edit.scss'; import 'brace/ext/language_tools'; import 'brace/mode/json'; -import 'ace-builds/src-min-noconflict/snippets/json'; +import 'brace/snippets/json'; import fixAceEditor from './ace-editor-fix'; diff --git a/ui/src/app/widget/widget-editor.controller.js b/ui/src/app/widget/widget-editor.controller.js index 6f0ad8761e..089d64cf5a 100644 --- a/ui/src/app/widget/widget-editor.controller.js +++ b/ui/src/app/widget/widget-editor.controller.js @@ -20,12 +20,11 @@ import 'brace/mode/javascript'; import 'brace/mode/html'; import 'brace/mode/css'; import 'brace/mode/json'; -import 'ace-builds/src-min-noconflict/ace'; -import 'ace-builds/src-min-noconflict/snippets/javascript'; -import 'ace-builds/src-min-noconflict/snippets/text'; -import 'ace-builds/src-min-noconflict/snippets/html'; -import 'ace-builds/src-min-noconflict/snippets/css'; -import 'ace-builds/src-min-noconflict/snippets/json'; +import 'brace/snippets/javascript'; +import 'brace/snippets/text'; +import 'brace/snippets/html'; +import 'brace/snippets/css'; +import 'brace/snippets/json'; /* eslint-disable import/no-unresolved, import/default */ diff --git a/ui/webpack.config.prod.js b/ui/webpack.config.prod.js index 150638def1..f02b880f8c 100644 --- a/ui/webpack.config.prod.js +++ b/ui/webpack.config.prod.js @@ -18,6 +18,7 @@ const HtmlWebpackPlugin = require('html-webpack-plugin'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const CopyWebpackPlugin = require('copy-webpack-plugin'); +const CompressionPlugin = require('compression-webpack-plugin'); const webpack = require('webpack'); const path = require('path'); @@ -64,6 +65,13 @@ module.exports = { NODE_ENV: JSON.stringify('production'), }, }), + new CompressionPlugin({ + asset: "[path].gz[query]", + algorithm: "gzip", + test: /\.js$|\.css$|\.svg$|\.ttf$|\.woff$|\.woff2|\.eot$/, + threshold: 10240, + minRatio: 0.8 + }) ], node: { tls: "empty",