From 4ede57836e418d7217ad4970d3be2d537b28bc9d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 09:51:44 +0200 Subject: [PATCH 01/14] move insertfield files to new location --- .../insertfield/insertfield.controller.js | 0 .../{overlays => infiniteeditors}/insertfield/insertfield.html | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/Umbraco.Web.UI.Client/src/views/common/{overlays => infiniteeditors}/insertfield/insertfield.controller.js (100%) rename src/Umbraco.Web.UI.Client/src/views/common/{overlays => infiniteeditors}/insertfield/insertfield.html (100%) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.controller.js similarity index 100% rename from src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.controller.js rename to src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.controller.js diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.html similarity index 100% rename from src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.html rename to src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.html From 4cc31a62c00697b8be0d24b57bf2ff8f3b455269 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 11:46:28 +0200 Subject: [PATCH 02/14] convert insertfeld overlay to an infinite editor --- .../src/common/services/editor.service.js | 18 + .../insertfield/insertfield.controller.js | 19 +- .../insertfield/insertfield.html | 369 ++++++++++-------- 3 files changed, 236 insertions(+), 170 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js index 0bbfe34fe1..87c0e12514 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js @@ -249,6 +249,23 @@ open(editor); } + /** + * @ngdoc method + * @name umbraco.services.editorService#insertField + * @methodOf umbraco.services.editorService + * + * @description + * Opens the insert field editor in infinite editing, the submit callback returns the code snippet + * @param {Callback} editor.submit Submits the editor + * @param {Callback} editor.close Closes the editor + * @returns {Object} editor object + */ + function insertField(editor) { + editor.view = "views/common/infiniteeditors/insertfield/insertfield.html"; + editor.size = "small"; + open(editor); + } + /** * @ngdoc method * @name umbraco.services.editorService#sectionPicker @@ -283,6 +300,7 @@ insertCodeSnippet: insertCodeSnippet, userGroupPicker: userGroupPicker, sectionPicker: sectionPicker, + insertField: insertField, userPicker: userPicker }; diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.controller.js index ebe2feabb9..db3e16f8b6 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.controller.js @@ -1,7 +1,7 @@ (function () { "use strict"; - function InsertFieldController($scope, $http, contentTypeResource, localizationService) { + function InsertFieldController($scope, contentTypeResource, localizationService) { var vm = this; @@ -29,6 +29,8 @@ vm.setCasingOption = setCasingOption; vm.setEncodingOption = setEncodingOption; vm.generateOutputSample = generateOutputSample; + vm.submit = submit; + vm.close = close; function onInit() { @@ -139,10 +141,21 @@ } - onInit(); + function submit(model) { + if($scope.model.submit) { + $scope.model.submit(model); + } + } + function close() { + if($scope.model.close) { + $scope.model.close(); + } + } + + onInit(); } - angular.module("umbraco").controller("Umbraco.Overlays.InsertFieldController", InsertFieldController); + angular.module("umbraco").controller("Umbraco.Editors.InsertFieldController", InsertFieldController); })(); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.html index 3218b44dd8..56bd498fd1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.html @@ -1,188 +1,223 @@ -
+
- -
-
- -
- -
-
-
+ -
- - -
+ + - -
- - Add fallback field + + + -
-
- -
- + +
+
+ +
+ +
+
-
-
-
-
- -
- +
+ + +
-
-
- -
- + +
+ + Add fallback field + +
+
+ +
+ +
+
+
+
-
-
-
- -
-
-
- - -
-
-
- -
Format and encoding
- - -
-
-
+
- + + +
+
+ +
+ +
+
+
- Date only - Date and time - -
-
-
- -
-
-
-
- + +
+
+
+ + +
+
- Uppercase - Lowercase -
-
-
- -
-
-
-
- +
Format and encoding
+ + +
+
+
+
+ +
+ Date only + Date and time + +
+
- HTML - URL -
-
-
-
Modify output
- - -
-
- -
- -
-
-
- - -
-
- -
- -
-
-
- - -
-
-
-
- + +
+
+
+
+ +
+ Uppercase + Lowercase +
+
- -
-
-
- -
-
-
- -
{{ vm.generateOutputSample() }}
-
-
-
+ +
+
+
+
+ +
+ HTML + URL +
+
+
-
+
Modify output
+ + +
+
+ +
+ +
+
+
+ + +
+
+ +
+ +
+
+
+ + +
+
+
+
+ +
+ +
+
+
+ + +
+
+
+ +
{{ vm.generateOutputSample() }}
+
+
+
+ + + + + + + + + + + + + + +
From d88ed02a8d5d6e50ed421dedecfa1e53bcfeb30f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 11:47:48 +0200 Subject: [PATCH 03/14] use insert field infinite editor in template, partial views and macro partial views editors --- .../partialviewmacros/edit.controller.js | 19 ++++++------------- .../src/views/partialviewmacros/edit.html | 7 ------- .../src/views/partialviews/edit.controller.js | 17 +++++------------ .../src/views/partialviews/edit.html | 7 ------- .../src/views/templates/edit.controller.js | 19 ++++++------------- .../src/views/templates/edit.html | 7 ------- 6 files changed, 17 insertions(+), 59 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.controller.js index c58a5573a9..52499aa47f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.controller.js @@ -180,24 +180,17 @@ function openPageFieldOverlay() { - vm.pageFieldOverlay = { - submitButtonLabel: "Insert", - closeButtonlabel: "Cancel", - view: "insertfield", - show: true, + var insertFieldEditor = { submit: function (model) { insert(model.umbracoField); - vm.pageFieldOverlay.show = false; - vm.pageFieldOverlay = null; + editorService.close(); }, - close: function (model) { - // close the dialog - vm.pageFieldOverlay.show = false; - vm.pageFieldOverlay = null; - // focus editor - vm.editor.focus(); + close: function () { + editorService.close(); + vm.editor.focus(); } }; + editorService.insertField(insertFieldEditor); } diff --git a/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.html b/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.html index 810b1cb8ae..dde5fc8171 100644 --- a/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.html @@ -83,11 +83,4 @@ position="right"> - - -
diff --git a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js index d5a17c83c7..b125324833 100644 --- a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js @@ -187,24 +187,17 @@ function openPageFieldOverlay() { - vm.pageFieldOverlay = { - submitButtonLabel: "Insert", - closeButtonlabel: "Cancel", - view: "insertfield", - show: true, + var insertFieldEditor = { submit: function (model) { insert(model.umbracoField); - vm.pageFieldOverlay.show = false; - vm.pageFieldOverlay = null; + editorService.close(); }, - close: function (model) { - // close the dialog - vm.pageFieldOverlay.show = false; - vm.pageFieldOverlay = null; - // focus editor + close: function () { + editorService.close(); vm.editor.focus(); } }; + editorService.insertField(insertFieldEditor); } diff --git a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.html b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.html index 4a16ad4ebf..5fc8f19d6c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.html @@ -91,11 +91,4 @@ position="right"> - - -
diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 39ae1dd583..1a0cd93a35 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -407,24 +407,17 @@ function openPageFieldOverlay() { - vm.pageFieldOverlay = { - submitButtonLabel: "Insert", - closeButtonlabel: "Cancel", - view: "insertfield", - show: true, + var insertFieldEditor = { submit: function (model) { insert(model.umbracoField); - vm.pageFieldOverlay.show = false; - vm.pageFieldOverlay = null; + editorService.close(); }, - close: function (model) { - // close the dialog - vm.pageFieldOverlay.show = false; - vm.pageFieldOverlay = null; - // focus editor - vm.editor.focus(); + close: function () { + editorService.close(); + vm.editor.focus(); } }; + editorService.insertField(insertFieldEditor); } diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index 0b1b574e70..b68c1845c1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -131,13 +131,6 @@ position="right"> - - - Date: Wed, 1 Aug 2018 12:30:31 +0200 Subject: [PATCH 04/14] update insert code snippet infinite editor to use new insert field editor --- .../insertcodesnippet.controller.js | 16 ++++------------ .../insertcodesnippet/insertcodesnippet.html | 6 +----- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.controller.js index 90d3e945a4..e24f8cd80b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.controller.js @@ -52,28 +52,20 @@ } function openPageFieldOverlay() { - vm.pageFieldOverlay = { - submitButtonLabel: "Insert", - closeButtonlabel: "Cancel", - view: "insertfield", - show: true, + var insertFieldEditor = { submit: function(model) { - $scope.model.insert = { "type": "umbracoField", "umbracoField": model.umbracoField }; - $scope.model.submit($scope.model); - - vm.pageFieldOverlay.show = false; - vm.pageFieldOverlay = null; + editorService.close(); }, close: function (model) { - vm.pageFieldOverlay.show = false; - vm.pageFieldOverlay = null; + editorService.close(); } }; + editorService.insertField(insertFieldEditor); } function openDictionaryItemOverlay() { diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.html index 2cc5cb2e5c..405a56e79b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.html @@ -60,9 +60,5 @@ view="vm.macroPickerOverlay.view" position="right"> - - +
From 37db8516ed46b815c1f5882c7c0c2f7db232bb2b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 13:13:09 +0200 Subject: [PATCH 05/14] move template sections overlay to infinite editors --- .../src/common/services/editor.service.js | 18 ++++++++++++++++++ .../templatesections.controller.js | 0 .../templatesections/templatesections.html | 0 3 files changed, 18 insertions(+) rename src/Umbraco.Web.UI.Client/src/views/common/{overlays => infiniteeditors}/templatesections/templatesections.controller.js (100%) rename src/Umbraco.Web.UI.Client/src/views/common/{overlays => infiniteeditors}/templatesections/templatesections.html (100%) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js index 87c0e12514..d3f3209559 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js @@ -266,6 +266,23 @@ open(editor); } + /** + * @ngdoc method + * @name umbraco.services.editorService#templateSections + * @methodOf umbraco.services.editorService + * + * @description + * Opens the template sections editor in infinite editing, the submit callback returns the type to insert + * @param {Callback} editor.submit Submits the editor + * @param {Callback} editor.close Closes the editor + * @returns {Object} editor object + */ + function templateSections(editor) { + editor.view = "views/common/infiniteeditors/templatesections/templatesections.html"; + editor.size = "small"; + open(editor); + } + /** * @ngdoc method * @name umbraco.services.editorService#sectionPicker @@ -301,6 +318,7 @@ userGroupPicker: userGroupPicker, sectionPicker: sectionPicker, insertField: insertField, + templateSections: templateSections, userPicker: userPicker }; diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/templatesections/templatesections.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.controller.js similarity index 100% rename from src/Umbraco.Web.UI.Client/src/views/common/overlays/templatesections/templatesections.controller.js rename to src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.controller.js diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/templatesections/templatesections.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.html similarity index 100% rename from src/Umbraco.Web.UI.Client/src/views/common/overlays/templatesections/templatesections.html rename to src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.html From fbfcccc13df41d9152638b1d6907c637ba7e05f9 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 13:33:17 +0200 Subject: [PATCH 06/14] add infinite editor markup to template sections --- .../templatesections.controller.js | 24 ++- .../templatesections/templatesections.html | 145 +++++++++++------- 2 files changed, 111 insertions(+), 58 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.controller.js index d8cc93c1b8..36d7c0f4ed 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.controller.js @@ -1,35 +1,47 @@ (function () { "use strict"; - function TemplateSectionsOverlayController($scope) { + function TemplateSectionsController($scope, formHelper) { var vm = this; + vm.select = select; + vm.submit = submit; + vm.close = close; + $scope.model.mandatoryRenderSection = false; if(!$scope.model.title) { $scope.model.title = "Sections"; } - vm.select = select; - function onInit() { - if($scope.model.hasMaster) { $scope.model.insertType = 'addSection'; } else { $scope.model.insertType = 'renderBody'; } - } function select(type) { $scope.model.insertType = type; } + function submit(model) { + if (formHelper.submitForm({scope: $scope})) { + $scope.model.submit($scope.model); + } + } + + function close() { + if($scope.model.close) { + $scope.model.close(); + } + } + onInit(); } - angular.module("umbraco").controller("Umbraco.Overlays.TemplateSectionsOverlay", TemplateSectionsOverlayController); + angular.module("umbraco").controller("Umbraco.Editors.TemplateSectionsController", TemplateSectionsController); })(); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.html index b97057302e..d6e3996287 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.html @@ -1,64 +1,105 @@ -
+
- -
-
+
-
+ -
- -
-
+ + -
+ + + -
-
-
- -
- -
-
- - - - - -
- -
- - -
- +
+
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ + + + + +
+ +
+ + +
+ +
+
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+ + + + + +
+
+
-
-
-
+
+
-
+ -
-
-
- -
+ + + + + + + + -
-
- - - - - -
-
+ + + -
-
From b5f02367ab0906d6dfa59b12b48267b04f1fed06 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 13:34:01 +0200 Subject: [PATCH 07/14] Use new template section infinite editor instead of the old overlay in the template editor --- .../src/views/templates/edit.controller.js | 15 ++++----------- .../src/views/templates/edit.html | 7 ------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 1a0cd93a35..1b58f14c03 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -510,12 +510,8 @@ function openSectionsOverlay() { - - vm.sectionsOverlay = { - view: "templatesections", + var templateSections = { isMaster: vm.template.isMasterTemplate, - submitButtonLabel: "Insert", - show: true, submit: function(model) { if (model.insertType === 'renderBody') { @@ -533,18 +529,15 @@ wrap(code); } - vm.sectionsOverlay.show = false; - vm.sectionsOverlay = null; + editorService.close(); }, close: function(model) { - // close dialog - vm.sectionsOverlay.show = false; - vm.sectionsOverlay = null; - // focus editor + editorService.close(); vm.editor.focus(); } } + editorService.templateSections(templateSections); } function openMasterTemplateOverlay() { diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index b68c1845c1..09eb0ad988 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -130,13 +130,6 @@ view="vm.macroPickerOverlay.view" position="right"> - - - Date: Wed, 1 Aug 2018 15:20:48 +0200 Subject: [PATCH 08/14] add item picker infinite editor + use in template editor --- .../src/common/services/editor.service.js | 24 ++++++++- .../itempicker/itempicker.controller.js | 47 ++++++++++++++++ .../itempicker/itempicker.html | 54 +++++++++++++++++++ .../src/views/templates/edit.controller.js | 15 ++---- 4 files changed, 128 insertions(+), 12 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/itempicker/itempicker.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/itempicker/itempicker.html diff --git a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js index d3f3209559..1334456b99 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js @@ -300,6 +300,27 @@ open(editor); } + /** + * @ngdoc method + * @name umbraco.services.editorService#itemPicker + * @methodOf umbraco.services.editorService + * + * @description + * Opens the section picker in infinite editing, the submit callback returns an array of the selected items + * + * @param {Array} editor.availableItems Array of available items. + * @param {Array} editor.selectedItems Array of selected items. When passed in the selected items will be filtered from the available items. + * @param {Boolean} editor.filter Set to false to hide the filter. + * @param {Callback} editor.submit Submits the editor. + * @param {Callback} editor.close Closes the editor. + * @returns {Object} editor object + */ + function itemPicker(editor) { + editor.view = "views/common/infiniteeditors/itempicker/itempicker.html"; + editor.size = "small"; + open(editor); + } + var service = { getEditors: getEditors, open: open, @@ -319,7 +340,8 @@ sectionPicker: sectionPicker, insertField: insertField, templateSections: templateSections, - userPicker: userPicker + userPicker: userPicker, + itemPicker: itemPicker }; return service; diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/itempicker/itempicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/itempicker/itempicker.controller.js new file mode 100644 index 0000000000..094e108d8f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/itempicker/itempicker.controller.js @@ -0,0 +1,47 @@ +/** + * @ngdoc controller + * @name Umbraco.Editors.ItemPickerController + * @function + * + * @description + * The controller for a reusable editor to pick items + */ + +function ItemPickerController($scope, localizationService) { + + var vm = this; + + vm.selectItem = selectItem; + vm.submit = submit; + vm.close = close; + + function onInit() { + if (!$scope.model.title) { + localizationService.localize("defaultdialogs_selectItem").then(function(value){ + $scope.model.title = value; + }); + } + } + + function selectItem(item) { + $scope.model.selectedItem = item; + submit($scope.model); + }; + + function submit(model) { + if($scope.model.submit) { + $scope.model.submit(model); + } + } + + function close() { + if($scope.model.close) { + $scope.model.close(); + } + } + + onInit(); + +} + +angular.module("umbraco").controller("Umbraco.Editors.ItemPicker", ItemPickerController); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/itempicker/itempicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/itempicker/itempicker.html new file mode 100644 index 0000000000..9963807772 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/itempicker/itempicker.html @@ -0,0 +1,54 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 1b58f14c03..8c425a97b6 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -558,16 +558,11 @@ localizationService.localize("template_mastertemplate").then(function(value){ var title = value; - - vm.masterTemplateOverlay = { - view: "itempicker", + var masterTemplate = { title: title, availableItems: availableMasterTemplates, - show: true, submit: function(model) { - var template = model.selectedItem; - if (template && template.alias) { vm.template.masterTemplateAlias = template.alias; setLayout(template.alias + ".cshtml"); @@ -575,18 +570,16 @@ vm.template.masterTemplateAlias = null; setLayout(null); } - - vm.masterTemplateOverlay.show = false; - vm.masterTemplateOverlay = null; + editorService.close(); }, close: function(oldModel) { // close dialog - vm.masterTemplateOverlay.show = false; - vm.masterTemplateOverlay = null; + editorService.close(); // focus editor vm.editor.focus(); } }; + editorService.itemPicker(masterTemplate); }); } From bf4b48aa9d637d5696c59e40a9c0794709e8b8f9 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 18:47:08 +0200 Subject: [PATCH 09/14] move the macropicker files to the infinite editor folder --- .../macropicker/macropicker.controller.js | 0 .../{overlays => infiniteeditors}/macropicker/macropicker.html | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/Umbraco.Web.UI.Client/src/views/common/{overlays => infiniteeditors}/macropicker/macropicker.controller.js (100%) rename src/Umbraco.Web.UI.Client/src/views/common/{overlays => infiniteeditors}/macropicker/macropicker.html (100%) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/macropicker/macropicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.controller.js similarity index 100% rename from src/Umbraco.Web.UI.Client/src/views/common/overlays/macropicker/macropicker.controller.js rename to src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.controller.js diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/macropicker/macropicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html similarity index 100% rename from src/Umbraco.Web.UI.Client/src/views/common/overlays/macropicker/macropicker.html rename to src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html From 0a31ac6ef3832496586531d4451fc4026e2d56fd Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 18:47:55 +0200 Subject: [PATCH 10/14] use macropicker in template editor --- .../src/common/services/editor.service.js | 21 ++++++++++++++++++- .../src/views/templates/edit.controller.js | 20 +++++------------- .../src/views/templates/edit.html | 8 ------- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js index 1334456b99..cbe05529a2 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js @@ -321,6 +321,24 @@ open(editor); } + /** + * @ngdoc method + * @name umbraco.services.editorService#macroPicker + * @methodOf umbraco.services.editorService + * + * @description + * Opens a macro picker in infinite editing, the submit callback returns an array of the selected items + * + * @param {Callback} editor.submit Submits the editor. + * @param {Callback} editor.close Closes the editor. + * @returns {Object} editor object + */ + function macroPicker(editor) { + editor.view = "views/common/infiniteeditors/macropicker/macropicker.html"; + editor.size = "small"; + open(editor); + } + var service = { getEditors: getEditors, open: open, @@ -341,7 +359,8 @@ insertField: insertField, templateSections: templateSections, userPicker: userPicker, - itemPicker: itemPicker + itemPicker: itemPicker, + macroPicker: macroPicker }; return service; diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 8c425a97b6..52802d0f48 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -381,31 +381,21 @@ } function openMacroOverlay() { - - vm.macroPickerOverlay = { - view: "macropicker", + var macroPicker = { dialogData: {}, - show: true, submit: function (model) { - var macroObject = macroService.collectValueData(model.selectedMacro, model.macroParams, "Mvc"); insert(macroObject.syntax); - - vm.macroPickerOverlay.show = false; - vm.macroPickerOverlay = null; - + editorService.close(); }, - close: function(oldModel) { - // close the dialog - vm.macroPickerOverlay.show = false; - vm.macroPickerOverlay = null; - // focus editor + close: function() { + editorService.close(); vm.editor.focus(); } }; + editorService.macroPicker(macroPicker); } - function openPageFieldOverlay() { var insertFieldEditor = { submit: function (model) { diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index 09eb0ad988..f2ee70801d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -123,13 +123,6 @@ - - - -
From 3e36e06d77f15b53237493205549cd4b6fc5bd8b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 19:01:44 +0200 Subject: [PATCH 11/14] add extra markup for the infinite editor --- .../macropicker/macropicker.controller.js | 6 + .../macropicker/macropicker.html | 136 +++++++++++------- 2 files changed, 88 insertions(+), 54 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.controller.js index 058f71bfcf..aa63f2d6d6 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.controller.js @@ -26,6 +26,12 @@ function MacroPickerController($scope, entityResource, macroResource, umbPropEdi } }; + $scope.close = function() { + if($scope.model.close) { + $scope.model.close(); + } + } + /** changes the view to edit the params of the selected macro */ /** if there is pnly one macro, and it has parameters - editor can skip selecting the Macro **/ function editParams(insertIfNoParameters) { diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html index 8f16bc40d4..a9551138e1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html @@ -1,63 +1,91 @@
-
+ + + -
+ + + +
- +
+ + + + + + + + There are no macros available to insert + + +
+ +
+ +
{{model.selectedMacro.name}}
+ +
    +
  • + + + + + + + +
  • +
+ + + There are no parameters for this macro + + +
+
+
+
+
- + + + + + + - - - There are no macros available to insert - - -
- -
- -
{{model.selectedMacro.name}}
- -
    -
  • - - - - - - - -
  • -
- - - There are no parameters for this macro - - -
-
+
From 759c21cec9658b5b66bc2a86e73164cddad73a67 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 20:06:35 +0200 Subject: [PATCH 12/14] use infinite macropicker in partial views and partial view macro editior --- .../insertcodesnippet.controller.js | 17 ++++++---------- .../partialviewmacros/edit.controller.js | 19 +++++------------- .../src/views/partialviewmacros/edit.html | 7 ------- .../src/views/partialviews/edit.controller.js | 20 +++++-------------- .../src/views/partialviews/edit.html | 7 ------- .../src/views/templates/edit.html | 7 ------- 6 files changed, 16 insertions(+), 61 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.controller.js index e24f8cd80b..526d076048 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.controller.js @@ -28,27 +28,22 @@ } function openMacroPicker() { - - vm.macroPickerOverlay = { - view: "macropicker", + var macroPicker = { dialogData: {}, - show: true, submit: function(model) { - $scope.model.insert = { "type": "macro", "macroParams": model.macroParams, "selectedMacro": model.selectedMacro }; - $scope.model.submit($scope.model); - - vm.macroPickerOverlay.show = false; - vm.macroPickerOverlay = null; - + editorService.close(); + }, + close: function() { + editorService.close(); } }; - + editorService.macroPicker(macroPicker); } function openPageFieldOverlay() { diff --git a/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.controller.js index 52499aa47f..84b58cac94 100644 --- a/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.controller.js @@ -154,28 +154,19 @@ } function openMacroOverlay() { - - vm.macroPickerOverlay = { - view: "macropicker", + var macroPicker = { dialogData: {}, - show: true, submit: function (model) { - var macroObject = macroService.collectValueData(model.selectedMacro, model.macroParams, "Mvc"); insert(macroObject.syntax); - - vm.macroPickerOverlay.show = false; - vm.macroPickerOverlay = null; - + editorService.close(); }, - close: function(oldModel) { - // close the dialog - vm.macroPickerOverlay.show = false; - vm.macroPickerOverlay = null; - // focus editor + close: function() { + editorService.close(); vm.editor.focus(); } }; + editorService.macroPicker(macroPicker); } diff --git a/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.html b/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.html index dde5fc8171..e28b76d785 100644 --- a/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.html @@ -76,11 +76,4 @@ - - -
diff --git a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js index b125324833..a337a00acc 100644 --- a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js @@ -161,31 +161,21 @@ function openMacroOverlay() { - - vm.macroPickerOverlay = { - view: "macropicker", + var macroPicker = { dialogData: {}, - show: true, submit: function (model) { - var macroObject = macroService.collectValueData(model.selectedMacro, model.macroParams, "Mvc"); insert(macroObject.syntax); - - vm.macroPickerOverlay.show = false; - vm.macroPickerOverlay = null; - + editorService.close(); }, - close: function(oldModel) { - // close the dialog - vm.macroPickerOverlay.show = false; - vm.macroPickerOverlay = null; - // focus editor + close: function() { + editorService.close(); vm.editor.focus(); } }; + editorService.macroPicker(macroPicker); } - function openPageFieldOverlay() { var insertFieldEditor = { submit: function (model) { diff --git a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.html b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.html index 5fc8f19d6c..a222234e80 100644 --- a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.html @@ -84,11 +84,4 @@
- - -
diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index f2ee70801d..7bc063b020 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -123,12 +123,5 @@ - - -
From 788ed8b61b36f0e4cf402838274d30bd491f8b12 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 Aug 2018 10:00:11 +0200 Subject: [PATCH 13/14] make template editor support infinite editing --- .../content/umbcontentnodeinfo.directive.js | 14 +++- .../src/common/services/editor.service.js | 18 +++++ .../src/views/templates/edit.controller.js | 77 ++++++++++++------- .../src/views/templates/edit.html | 26 ++++--- 4 files changed, 95 insertions(+), 40 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js index c9d78a3551..78d6eda0f2 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js @@ -92,15 +92,21 @@ }; scope.openTemplate = function () { - var url = "/settings/templates/edit/" + scope.node.templateId; - $location.url(url); + var templateEditor = { + id: scope.node.templateId, + submit: function(model) { + editorService.close(); + }, + close: function() { + editorService.close(); + } + }; + editorService.templateEditor(templateEditor); } scope.updateTemplate = function (templateAlias) { - // update template value scope.node.template = templateAlias; - }; scope.datePickerChange = function (event, type) { diff --git a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js index cbe05529a2..800f150ee8 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js @@ -232,6 +232,23 @@ open(editor); } + /** + * @ngdoc method + * @name umbraco.services.editorService#templateEditor + * @methodOf umbraco.services.editorService + * + * @description + * Opens the user group picker in infinite editing, the submit callback returns the saved template + * @param {String} editor.id The template id + * @param {Callback} editor.submit Submits the editor + * @param {Callback} editor.close Closes the editor + * @returns {Object} editor object + */ + function templateEditor(editor) { + editor.view = "views/templates/edit.html"; + open(editor); + } + /** * @ngdoc method * @name umbraco.services.editorService#sectionPicker @@ -355,6 +372,7 @@ nodePermissions: nodePermissions, insertCodeSnippet: insertCodeSnippet, userGroupPicker: userGroupPicker, + templateEditor: templateEditor, sectionPicker: sectionPicker, insertField: insertField, templateSections: templateSections, diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 52802d0f48..615aeb94ee 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -5,6 +5,9 @@ var vm = this; var oldMasterTemplateAlias = null; + var infiniteMode = $scope.model && $scope.model.infiniteMode; + var id = infiniteMode ? $scope.model.id : $routeParams.id; + var create = infiniteMode ? $scope.model.create : $routeParams.create; vm.page = {}; vm.page.loading = true; @@ -83,24 +86,25 @@ rebindCallback: function (orignal, saved) {} }).then(function (saved) { - if (!suppressNotification) { - localizationService.localizeMany(["speechBubbles_templateSavedHeader", "speechBubbles_templateSavedText"]).then(function(data){ - var header = data[0]; - var message = data[1]; - notificationsService.success(header, message); - }); - } - + if (!suppressNotification) { + localizationService.localizeMany(["speechBubbles_templateSavedHeader", "speechBubbles_templateSavedText"]).then(function(data){ + var header = data[0]; + var message = data[1]; + notificationsService.success(header, message); + }); + } vm.page.saveButtonState = "success"; vm.template = saved; //sync state - editorState.set(vm.template); + if(!infiniteMode) { + editorState.set(vm.template); + } // sync tree // if master template alias has changed move the node to it's new location - if(oldMasterTemplateAlias !== vm.template.masterTemplateAlias) { + if(!infiniteMode && oldMasterTemplateAlias !== vm.template.masterTemplateAlias) { // When creating a new template the id is -1. Make sure We don't remove the root node. if (vm.page.menu.currentNode.id !== "-1") { @@ -119,15 +123,21 @@ } else { // normal tree sync - navigationService.syncTree({ tree: "templates", path: vm.template.path, forceReload: true }).then(function (syncArgs) { - vm.page.menu.currentNode = syncArgs.node; - }); + if(!infiniteMode) { + navigationService.syncTree({ tree: "templates", path: vm.template.path, forceReload: true }).then(function (syncArgs) { + vm.page.menu.currentNode = syncArgs.node; + }); + } } // clear $dirty state on form setFormState("pristine"); + if(infiniteMode) { + submit(); + } + }, function (err) { @@ -154,18 +164,14 @@ vm.templates = templates; }); - if($routeParams.create){ - - templateResource.getScaffold(($routeParams.id)).then(function (template) { + if(create) { + templateResource.getScaffold((id)).then(function (template) { vm.ready(template); }); - - }else{ - - templateResource.getById($routeParams.id).then(function(template){ + } else { + templateResource.getById(id).then(function(template){ vm.ready(template); }); - } }; @@ -176,7 +182,7 @@ vm.template = template; // if this is a new template, bind to the blur event on the name - if ($routeParams.create) { + if (create) { $timeout(function() { var nameField = angular.element(document.querySelector('[data-element="editor-name-field"]')); if (nameField) { @@ -191,10 +197,12 @@ //sync state - editorState.set(vm.template); - navigationService.syncTree({ tree: "templates", path: vm.template.path, forceReload: true }).then(function (syncArgs) { - vm.page.menu.currentNode = syncArgs.node; - }); + if(!infiniteMode) { + editorState.set(vm.template); + navigationService.syncTree({ tree: "templates", path: vm.template.path, forceReload: true }).then(function (syncArgs) { + vm.page.menu.currentNode = syncArgs.node; + }); + } // save state of master template to use for comparison when syncing the tree on save oldMasterTemplateAlias = angular.copy(template.masterTemplateAlias); @@ -312,7 +320,7 @@ // initial cursor placement // Keep cursor in name field if we are create a new template // else set the cursor at the bottom of the code editor - if(!$routeParams.create) { + if(!create) { $timeout(function(){ vm.editor.navigateFileEnd(); vm.editor.focus(); @@ -341,6 +349,8 @@ vm.getMasterTemplateName = getMasterTemplateName; vm.removeMasterTemplate = removeMasterTemplate; vm.closeShortcuts = closeShortcuts; + vm.submit = submit; + vm.close = close; function openInsertOverlay() { var insertOverlay = { @@ -684,6 +694,19 @@ function closeShortcuts() { vm.showKeyboardShortcut = false; } + + function submit() { + if($scope.model.submit) { + $scope.model.template = vm.template; + $scope.model.submit($scope.model); + } + } + + function close() { + if($scope.model.close) { + $scope.model.close(); + } + } vm.init(); diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index 7bc063b020..5576d2713f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -106,16 +106,24 @@ + + + - - + + From 85b18eec05f975611a6f8395e021c8bab54c5848 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 6 Aug 2018 10:47:20 +0200 Subject: [PATCH 14/14] only allow to open template if user has access to settings section --- .../components/content/umbcontentnodeinfo.directive.js | 2 ++ .../src/views/components/content/umb-content-node-info.html | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js index 78d6eda0f2..5f9f1f4a36 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js @@ -12,6 +12,7 @@ scope.disableTemplates = Umbraco.Sys.ServerVariables.features.disabledFeatures.disableTemplates; scope.allowChangeDocumentType = false; + scope.allowChangeTemplate = false; function onInit() { @@ -20,6 +21,7 @@ angular.forEach(user.sections, function(section){ if(section.alias === "settings") { scope.allowChangeDocumentType = true; + scope.allowChangeTemplate = true; } }); }); diff --git a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html index ac38761010..498134d6e0 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html @@ -197,7 +197,7 @@ ng-change="updateTemplate(node.template)"> - + Open