diff --git a/ui/src/app/components/confirm-on-exit.directive.js b/ui/src/app/components/confirm-on-exit.directive.js index fe9a9bdddd..e04e1102a9 100644 --- a/ui/src/app/components/confirm-on-exit.directive.js +++ b/ui/src/app/components/confirm-on-exit.directive.js @@ -18,17 +18,17 @@ export default angular.module('thingsboard.directives.confirmOnExit', []) .name; /*@ngInject*/ -function ConfirmOnExit($state, $mdDialog, $window, $filter, userService) { +function ConfirmOnExit($state, $mdDialog, $window, $filter, $parse, userService) { return { - link: function ($scope) { - + link: function ($scope, $element, $attributes) { + $scope.confirmForm = $scope.$eval($attributes.confirmForm); $window.onbeforeunload = function () { - if (userService.isAuthenticated() && (($scope.confirmForm && $scope.confirmForm.$dirty) || $scope.isDirty)) { + if (userService.isAuthenticated() && (($scope.confirmForm && $scope.confirmForm.$dirty) || $scope.$eval($attributes.isDirty))) { return $filter('translate')('confirm-on-exit.message'); } } $scope.$on('$stateChangeStart', function (event, next, current, params) { - if (userService.isAuthenticated() && (($scope.confirmForm && $scope.confirmForm.$dirty) || $scope.isDirty)) { + if (userService.isAuthenticated() && (($scope.confirmForm && $scope.confirmForm.$dirty) || $scope.$eval($attributes.isDirty))) { event.preventDefault(); var confirm = $mdDialog.confirm() .title($filter('translate')('confirm-on-exit.title')) @@ -40,7 +40,9 @@ function ConfirmOnExit($state, $mdDialog, $window, $filter, userService) { if ($scope.confirmForm) { $scope.confirmForm.$setPristine(); } else { - $scope.isDirty = false; + var remoteSetter = $parse($attributes.isDirty).assign; + remoteSetter($scope, false); + //$scope.isDirty = false; } $state.go(next.name, params); }, function () { @@ -48,9 +50,6 @@ function ConfirmOnExit($state, $mdDialog, $window, $filter, userService) { } }); }, - scope: { - confirmForm: '=', - isDirty: '=' - } + scope: false }; } \ No newline at end of file diff --git a/ui/src/app/locale/locale.constant.js b/ui/src/app/locale/locale.constant.js index a7b2b443da..5dce7872e8 100644 --- a/ui/src/app/locale/locale.constant.js +++ b/ui/src/app/locale/locale.constant.js @@ -1177,6 +1177,8 @@ export default angular.module('thingsboard.locale', []) "type": "Type", "description": "Description", "delete": "Delete rule node", + "select-all": "Select all nodes and connections", + "deselect-all": "Deselect all nodes and connections", "delete-selected-objects": "Delete selected nodes and connections", "rulenode-details": "Rule node details", "debug-mode": "Debug mode", diff --git a/ui/src/app/rulechain/rulechain.controller.js b/ui/src/app/rulechain/rulechain.controller.js index 565e72b444..4eba5b2c52 100644 --- a/ui/src/app/rulechain/rulechain.controller.js +++ b/ui/src/app/rulechain/rulechain.controller.js @@ -27,15 +27,10 @@ import addRuleNodeLinkTemplate from './add-link.tpl.html'; /* eslint-enable import/no-unresolved, import/default */ - -const deleteKeyCode = 46; -const ctrlKeyCode = 17; -const aKeyCode = 65; -const escKeyCode = 27; - /*@ngInject*/ export function RuleChainController($stateParams, $scope, $compile, $q, $mdUtil, $timeout, $mdExpansionPanel, $document, $mdDialog, - $filter, $translate, types, ruleChainService, Modelfactory, flowchartConstants, ruleChain, ruleChainMetaData) { + $filter, $translate, hotkeys, types, ruleChainService, Modelfactory, flowchartConstants, + ruleChain, ruleChainMetaData, ruleNodeComponents) { var vm = this; @@ -76,42 +71,62 @@ export function RuleChainController($stateParams, $scope, $compile, $q, $mdUtil, vm.modelservice = Modelfactory(vm.ruleChainModel, vm.selectedObjects); - vm.ctrlDown = false; - vm.saveRuleChain = saveRuleChain; vm.revertRuleChain = revertRuleChain; vm.objectsSelected = objectsSelected; vm.deleteSelected = deleteSelected; - vm.keyDown = function (evt) { - if (evt.keyCode === ctrlKeyCode) { - vm.ctrlDown = true; - evt.stopPropagation(); - evt.preventDefault(); - } - }; - - vm.keyUp = function (evt) { - - if (evt.keyCode === deleteKeyCode) { - vm.modelservice.deleteSelected(); - } - - if (evt.keyCode == aKeyCode && vm.ctrlDown) { - vm.modelservice.selectAll(); - } - - if (evt.keyCode == escKeyCode) { - vm.modelservice.deselectAll(); - } - - if (evt.keyCode === ctrlKeyCode) { - vm.ctrlDown = false; - evt.stopPropagation(); - evt.preventDefault(); - } - }; + initHotKeys(); + + function initHotKeys() { + hotkeys.bindTo($scope) + .add({ + combo: 'ctrl+a', + description: $translate.instant('rulenode.select-all'), + allowIn: ['INPUT', 'SELECT', 'TEXTAREA'], + callback: function (event) { + event.preventDefault(); + vm.modelservice.selectAll(); + } + }) + .add({ + combo: 'esc', + description: $translate.instant('rulenode.deselect-all'), + allowIn: ['INPUT', 'SELECT', 'TEXTAREA'], + callback: function (event) { + event.preventDefault(); + vm.modelservice.deselectAll(); + } + }) + .add({ + combo: 'ctrl+s', + description: $translate.instant('action.apply'), + allowIn: ['INPUT', 'SELECT', 'TEXTAREA'], + callback: function (event) { + event.preventDefault(); + vm.saveRuleChain(); + } + }) + .add({ + combo: 'ctrl+z', + description: $translate.instant('action.decline-changes'), + allowIn: ['INPUT', 'SELECT', 'TEXTAREA'], + callback: function (event) { + event.preventDefault(); + vm.revertRuleChain(); + } + }) + .add({ + combo: 'del', + description: $translate.instant('rulenode.delete-selected-objects'), + allowIn: ['INPUT', 'SELECT', 'TEXTAREA'], + callback: function (event) { + event.preventDefault(); + vm.modelservice.deleteSelected(); + } + }) + } vm.onEditRuleNodeClosed = function() { vm.editingRuleNode = null; @@ -289,44 +304,40 @@ export function RuleChainController($stateParams, $scope, $compile, $q, $mdUtil, loadRuleChainLibrary(); function loadRuleChainLibrary() { - ruleChainService.getRuleNodeComponents().then( - (ruleNodeComponents) => { - for (var i=0;i - +
@@ -50,8 +52,6 @@