From d46d23b372b248cd5a32dcacd7c1b85bead1dfc0 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Feb 2016 12:07:45 +0100 Subject: [PATCH] Fixes: U4-7732 Grid changes do not trigger Unsaved Changes notification --- .../umbsetdirtyonchange.directive.js | 29 +++++++++++++++++++ .../propertyeditors/grid/grid.controller.js | 15 +++++++--- .../src/views/propertyeditors/grid/grid.html | 3 +- 3 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/components/validation/umbsetdirtyonchange.directive.js diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/validation/umbsetdirtyonchange.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/validation/umbsetdirtyonchange.directive.js new file mode 100644 index 0000000000..37a773ae97 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/validation/umbsetdirtyonchange.directive.js @@ -0,0 +1,29 @@ +(function() { + 'use strict'; + + function SetDirtyOnChange() { + + function link(scope, el, attr, ctrl) { + + var initValue = attr.umbSetDirtyOnChange; + + attr.$observe("umbSetDirtyOnChange", function (newValue) { + if(newValue !== initValue) { + ctrl.$setDirty(); + } + }); + + } + + var directive = { + require: "^form", + restrict: 'A', + link: link + }; + + return directive; + } + + angular.module('umbraco.directives').directive('umbSetDirtyOnChange', SetDirtyOnChange); + +})(); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.controller.js index 29176da102..54155574f1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.controller.js @@ -1,9 +1,11 @@ angular.module("umbraco") .controller("Umbraco.PropertyEditors.GridController", - function ($scope, $http, assetsService, localizationService, $rootScope, dialogService, gridService, mediaResource, imageHelper, $timeout, umbRequestHelper) { + function ($scope, $http, assetsService, localizationService, $rootScope, dialogService, gridService, mediaResource, imageHelper, $timeout, umbRequestHelper, angularHelper) { // Grid status variables var placeHolder = ""; + var currentForm = angularHelper.getCurrentForm($scope); + $scope.currentRow = null; $scope.currentCell = null; $scope.currentToolsControl = null; @@ -73,6 +75,7 @@ angular.module("umbraco") tinyMCE.execCommand("mceRemoveEditor", false, id); tinyMCE.init(draggedRteSettings[id]); }); + currentForm.$setDirty(); } }; @@ -160,6 +163,7 @@ angular.module("umbraco") } }); } + currentForm.$setDirty(); }, start: function (e, ui) { @@ -320,6 +324,8 @@ angular.module("umbraco") section.rows.push(row); } + currentForm.$setDirty(); + $scope.showRowConfigurations = false; }; @@ -329,8 +335,7 @@ angular.module("umbraco") section.rows.splice($index, 1); $scope.currentRow = null; $scope.openRTEToolbarId = null; - - //$scope.initContent(); + currentForm.$setDirty(); } if(section.rows.length === 0) { @@ -397,6 +402,8 @@ angular.module("umbraco") gridItem.config = configObject; gridItem.hasConfig = gridItemHasConfig(styleObject, configObject); + currentForm.$setDirty(); + $scope.gridItemSettingsDialog.show = false; $scope.gridItemSettingsDialog = null; }; @@ -407,7 +414,7 @@ angular.module("umbraco") }; }; - + function stripModifier(val, modifier) { if (!val || !modifier || modifier.indexOf(placeHolder) < 0) { return val; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.html index 99b207a627..339ee9d455 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.html @@ -174,7 +174,8 @@ ng-click="clickControl($index, area.controls, area)" ng-class="{'-active': control.active}" on-outside-click="clickOutsideControl($index, area.controls, area)" - bind-click-on="{{control.active}}"> + bind-click-on="{{control.active}}" + umb-set-dirty-on-change="{{control.value}}">