From 1a4c45dbdf063402ae8e67ed3507cefd297bcfbd Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Sun, 19 May 2019 11:25:29 +0200 Subject: [PATCH 01/46] Add block editor config and config editor --- .../PropertyEditors/BlockEditorConfiguration.cs | 7 +++++++ .../PropertyEditors/BlockEditorConfigurationEditor.cs | 9 +++++++++ .../PropertyEditors/BlockEditorPropertyEditor.cs | 2 +- src/Umbraco.Web/Umbraco.Web.csproj | 2 ++ 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs create mode 100644 src/Umbraco.Web/PropertyEditors/BlockEditorConfigurationEditor.cs diff --git a/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs b/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs new file mode 100644 index 0000000000..8c9ba621c7 --- /dev/null +++ b/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs @@ -0,0 +1,7 @@ +namespace Umbraco.Web.PropertyEditors +{ + public class BlockEditorConfiguration + { + // TODO: implement + } +} diff --git a/src/Umbraco.Web/PropertyEditors/BlockEditorConfigurationEditor.cs b/src/Umbraco.Web/PropertyEditors/BlockEditorConfigurationEditor.cs new file mode 100644 index 0000000000..e125c271fa --- /dev/null +++ b/src/Umbraco.Web/PropertyEditors/BlockEditorConfigurationEditor.cs @@ -0,0 +1,9 @@ +using Umbraco.Core.PropertyEditors; + +namespace Umbraco.Web.PropertyEditors +{ + internal class BlockEditorConfigurationEditor : ConfigurationEditor + { + // TODO: implement + } +} diff --git a/src/Umbraco.Web/PropertyEditors/BlockEditorPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/BlockEditorPropertyEditor.cs index dc46e25f2e..b10833fd07 100644 --- a/src/Umbraco.Web/PropertyEditors/BlockEditorPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/BlockEditorPropertyEditor.cs @@ -11,7 +11,7 @@ namespace Umbraco.Web.PropertyEditors : base(logger) { } - protected override IConfigurationEditor CreateConfigurationEditor() => base.CreateConfigurationEditor(); + protected override IConfigurationEditor CreateConfigurationEditor() => new BlockEditorConfigurationEditor(); protected override IDataValueEditor CreateValueEditor() => base.CreateValueEditor(); } diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index e75043b246..4860559e00 100755 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -211,6 +211,8 @@ + + From 174af027e92e1d985e98f7e4644b4b3fd1f8e448 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Sun, 19 May 2019 11:59:24 +0200 Subject: [PATCH 02/46] Block editor config first stab --- .../BlockEditorConfiguration.cs | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs b/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs index 8c9ba621c7..03498e1c2c 100644 --- a/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs +++ b/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs @@ -1,7 +1,27 @@ -namespace Umbraco.Web.PropertyEditors +using Umbraco.Core; +using Umbraco.Core.PropertyEditors; + +namespace Umbraco.Web.PropertyEditors { public class BlockEditorConfiguration { - // TODO: implement + [ConfigurationField("blocks", "Blocks", "views/propertyeditors/textarea/textarea.html")] + public Block[] Blocks { get; set; } + + public class Block + { + public Udi ElementType { get; set; } + + public BlockSetting Settings { get; set; } + } + + public class BlockSetting + { + public string Label { get; set; } + + public string Alias { get; set; } + + public Udi DataType { get; set; } + } } } From 202302e003667429ef900145e82abece6ba712f2 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Sun, 19 May 2019 12:20:46 +0200 Subject: [PATCH 03/46] Plumbing going on here --- .../propertyeditors/blockeditor/blockeditor.controller.js | 7 +++++++ .../views/propertyeditors/blockeditor/blockeditor.html | 5 +++++ .../blockeditor/blockeditor.settings.controller.js | 8 ++++++++ .../propertyeditors/blockeditor/blockeditor.settings.html | 5 +++++ .../PropertyEditors/BlockEditorConfiguration.cs | 2 +- .../PropertyEditors/BlockEditorPropertyEditor.cs | 2 +- 6 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html create mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js new file mode 100644 index 0000000000..999ee7f773 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js @@ -0,0 +1,7 @@ +angular.module("umbraco") + .controller("Umbraco.PropertyEditors.BlockEditor.PropertyEditorController", [ + "$scope", + function ($scope) { + } + ] +); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html new file mode 100644 index 0000000000..bd9cbdc3e4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html @@ -0,0 +1,5 @@ +
+
+        {{model.config | json}}
+    
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js new file mode 100644 index 0000000000..f47b495579 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js @@ -0,0 +1,8 @@ +angular.module("umbraco") + .controller("Umbraco.PropertyEditors.BlockEditor.SettingsController", [ + "$scope", + function ($scope) { + $scope.model.value = []; + } + ] +); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html new file mode 100644 index 0000000000..6e43718b77 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html @@ -0,0 +1,5 @@ +
+
+        {{model.value | json}}
+    
+
diff --git a/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs b/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs index 03498e1c2c..291551efca 100644 --- a/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs +++ b/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs @@ -5,7 +5,7 @@ namespace Umbraco.Web.PropertyEditors { public class BlockEditorConfiguration { - [ConfigurationField("blocks", "Blocks", "views/propertyeditors/textarea/textarea.html")] + [ConfigurationField("blocks", "Blocks", "views/propertyeditors/blockeditor/blockeditor.settings.html")] public Block[] Blocks { get; set; } public class Block diff --git a/src/Umbraco.Web/PropertyEditors/BlockEditorPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/BlockEditorPropertyEditor.cs index b10833fd07..f486af4c3d 100644 --- a/src/Umbraco.Web/PropertyEditors/BlockEditorPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/BlockEditorPropertyEditor.cs @@ -4,7 +4,7 @@ using Umbraco.Core.PropertyEditors; namespace Umbraco.Web.PropertyEditors { - [DataEditor(Constants.PropertyEditors.Aliases.BlockEditor, "Block Editor", ValueType = ValueTypes.Json, Group="rich content")] + [DataEditor(Constants.PropertyEditors.Aliases.BlockEditor, EditorType.PropertyValue , "Block Editor", "blockeditor", ValueType = ValueTypes.Json, Group="rich content", Icon="icon-application-window-alt")] public class BlockEditorPropertyEditor : DataEditor { public BlockEditorPropertyEditor(ILogger logger) From e7303602d20409f42714b43810b5d720964a8631 Mon Sep 17 00:00:00 2001 From: Callum Whyte Date: Sun, 19 May 2019 13:08:07 +0100 Subject: [PATCH 04/46] Listing available element types in block editor settings --- .../blockeditor/blockeditor.settings.controller.js | 10 +++++++++- .../blockeditor/blockeditor.settings.html | 6 ++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js index f47b495579..fbb2c25ed9 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js @@ -1,8 +1,16 @@ angular.module("umbraco") .controller("Umbraco.PropertyEditors.BlockEditor.SettingsController", [ "$scope", - function ($scope) { + "contentTypeResource", + function ($scope, contentTypeResource) { $scope.model.value = []; + + $scope.elementTypes = []; + + contentTypeResource.getAll() + .then(function (data) { + $scope.elementTypes = _.where(data, { isElement: true }); + }); } ] ); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html index 6e43718b77..6eaeb64db6 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html @@ -2,4 +2,10 @@
         {{model.value | json}}
     
+ +
    +
  • + {{elementType.name}} +
  • +
From ab5e7aa1e8d003a5049620ef14d640249058856e Mon Sep 17 00:00:00 2001 From: Callum Whyte Date: Sun, 19 May 2019 14:04:23 +0100 Subject: [PATCH 05/46] Primative add-block functionality in block editor settings --- .../blockeditor.settings.controller.js | 15 ++++++++++++++- .../blockeditor/blockeditor.settings.html | 2 +- .../BlockEditorConfigurationEditor.cs | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js index fbb2c25ed9..e4fc3b4388 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js @@ -3,7 +3,20 @@ "$scope", "contentTypeResource", function ($scope, contentTypeResource) { - $scope.model.value = []; + + if (!$scope.model.value) { + $scope.model.value = []; + } + + $scope.addBlock = function (elementType) { + + var block = { + elementType: elementType.udi, + settings: null + }; + + $scope.model.value.push(block); + } $scope.elementTypes = []; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html index 6eaeb64db6..9b308f3bbf 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html @@ -5,7 +5,7 @@
  • - {{elementType.name}} + {{elementType.name}} Add
diff --git a/src/Umbraco.Web/PropertyEditors/BlockEditorConfigurationEditor.cs b/src/Umbraco.Web/PropertyEditors/BlockEditorConfigurationEditor.cs index e125c271fa..cd68108f16 100644 --- a/src/Umbraco.Web/PropertyEditors/BlockEditorConfigurationEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/BlockEditorConfigurationEditor.cs @@ -4,6 +4,6 @@ namespace Umbraco.Web.PropertyEditors { internal class BlockEditorConfigurationEditor : ConfigurationEditor { - // TODO: implement + } } From 5cb847930dbf88de44066718dad3dd6ef8536549 Mon Sep 17 00:00:00 2001 From: Callum Whyte Date: Sun, 19 May 2019 14:05:14 +0100 Subject: [PATCH 06/46] Ensuring block editor settings JSON properties are lowercased --- .../PropertyEditors/BlockEditorConfiguration.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs b/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs index 291551efca..b91c6b37bf 100644 --- a/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs +++ b/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs @@ -1,4 +1,5 @@ -using Umbraco.Core; +using Newtonsoft.Json; +using Umbraco.Core; using Umbraco.Core.PropertyEditors; namespace Umbraco.Web.PropertyEditors @@ -10,17 +11,22 @@ namespace Umbraco.Web.PropertyEditors public class Block { + [JsonProperty("elementType")] public Udi ElementType { get; set; } + [JsonProperty("settings")] public BlockSetting Settings { get; set; } } public class BlockSetting { + [JsonProperty("label")] public string Label { get; set; } + [JsonProperty("alias")] public string Alias { get; set; } + [JsonProperty("dataType")] public Udi DataType { get; set; } } } From 013bd2c424d1134ca36a4cf76282ded3c798c15f Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Sun, 19 May 2019 17:48:10 +0200 Subject: [PATCH 07/46] Editor for content editing --- .../src/common/resources/content.resource.js | 14 +++ .../blockeditor/blockeditor.controller.js | 85 +++++++++++++++++-- .../blockeditor.editblock.controller.js | 25 ++++++ .../blockeditor/blockeditor.editblock.html | 38 +++++++++ .../blockeditor/blockeditor.html | 31 ++++++- src/Umbraco.Web/Editors/ContentController.cs | 24 +++++- 6 files changed, 206 insertions(+), 11 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.html diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js index d571de0e2d..1cfb61f80c 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js @@ -520,6 +520,20 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) { }); }, + getScaffoldByUdi: function (parentId, udi) { + + return umbRequestHelper.resourcePromise( + $http.get( + umbRequestHelper.getApiUrl( + "contentApiBaseUrl", + "GetEmpty", + [{ udi: udi }, { parentId: parentId }])), + 'Failed to retrieve data for empty content item with udi ' + udi) + .then(function (result) { + return $q.when(umbDataFormatter.formatContentGetData(result)); + }); + }, + getBlueprintScaffold: function (parentId, blueprintId) { return umbRequestHelper.resourcePromise( diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js index 999ee7f773..3f42de2f48 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js @@ -1,7 +1,80 @@ -angular.module("umbraco") - .controller("Umbraco.PropertyEditors.BlockEditor.PropertyEditorController", [ - "$scope", - function ($scope) { +function BlockEditorPropertyEditorController($scope, contentResource, editorService) { + var vm = this; + + vm.scaffolds = []; + vm.blocks = []; + vm.loading = true; + vm.sortableOptions = { + axis: "y", + cursor: "move", + handle: ".handle", + tolerance: 'pointer' + }; + + vm.add = add; + vm.edit = edit; + vm.remove = remove; + + // it would be awesome if we could load all scaffolds in one go... however we need to have an eye out for performance, + // oddly enough it's been shown to actually be slower to load them all at once instead of one at a time + var scaffoldsLoaded = 0; + function init() { + $scope.model.value = $scope.model.value || []; + _.each($scope.model.config.blocks, function (blockConfig) { + contentResource.getScaffoldByUdi(-20, blockConfig.elementType).then(function (scaffold) { + if (scaffold.isElement) { + vm.scaffolds.push(scaffold); + } + scaffoldsLoaded++; + initIfAllScaffoldsHaveLoaded(); + }, function (error) { + scaffoldsLoaded++; + initIfAllScaffoldsHaveLoaded(); + }); + }); + } + + function initIfAllScaffoldsHaveLoaded() { + // Initialize when all scaffolds have loaded + if ($scope.model.config.blocks.length === scaffoldsLoaded) { + vm.scaffolds = _.sortBy(vm.scaffolds, function (scaffold) { + return _.findIndex($scope.model.config.blocks, function (blockConfig) { + return blockConfig.elementType === scaffold.udi; + }); + }); + vm.loading = false; } - ] -); + } + + function add(scaffold) { + var block = angular.copy(scaffold); + edit(block); + } + + function edit(block) { + var options = { + node: block, + title: "TODO: Edit block title here", + view: "views/propertyeditors/blockeditor/blockeditor.editblock.html", + submit: function(model) { + if (vm.blocks.indexOf(block) < 0) { + vm.blocks.push(block); + } + editorService.close(); + }, + close: function() { + editorService.close(); + } + }; + editorService.open(options); + } + + function remove(block) { + if (confirm("TODO: Are you sure?")) { + vm.blocks.splice(vm.blocks.indexOf(block), 1); + } + } + + init(); +} +angular.module("umbraco").controller("Umbraco.PropertyEditors.BlockEditor.PropertyEditorController", BlockEditorPropertyEditorController); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.controller.js new file mode 100644 index 0000000000..227fc384cf --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.controller.js @@ -0,0 +1,25 @@ +function BlockEditorEditBlockController($scope) { + var vm = this; + vm.submit = submit; + vm.close = close; + vm.content = $scope.model.node.variants[0]; + + function init() { + + } + + function submit() { + if($scope.model.submit) { + $scope.model.submit($scope.model); + } + } + + function close() { + if($scope.model.close) { + $scope.model.close(); + } + } + + init(); +} +angular.module("umbraco").controller("Umbraco.PropertyEditors.BlockEditor.EditBlockController", BlockEditorEditBlockController); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.html new file mode 100644 index 0000000000..1103ef0484 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.html @@ -0,0 +1,38 @@ +
+ + + + + + + +
+ + + +
+
+ + + + + + + + + + +
+ +
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html index bd9cbdc3e4..284f3ce20d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html @@ -1,5 +1,28 @@ -
-
-        {{model.config | json}}
-    
+
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+
+ +
+ Add: +
+ +
+
+
diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index de65689353..52b6b3a1d4 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -354,12 +354,34 @@ namespace Umbraco.Web.Editors throw new HttpResponseException(HttpStatusCode.NotFound); } + return EmptyContent(parentId, contentType); + } + + /// + /// Gets an empty content item for the + /// + /// + /// + [OutgoingEditorModelEvent] + public ContentItemDisplay GetEmpty(GuidUdi udi, int parentId) + { + var contentType = Services.ContentTypeService.Get(udi.Guid); + if(contentType == null) + { + throw new HttpResponseException(HttpStatusCode.NotFound); + } + + return EmptyContent(parentId, contentType); + } + + private ContentItemDisplay EmptyContent(int parentId, IContentType contentType) + { var emptyContent = Services.ContentService.Create("", parentId, contentType.Alias, Security.GetUserId().ResultOr(0)); var mapped = MapToDisplay(emptyContent); // translate the content type name if applicable mapped.ContentTypeName = Services.TextService.UmbracoDictionaryTranslate(mapped.ContentTypeName); // if your user type doesn't have access to the Settings section it would not get this property mapped - if (mapped.DocumentType != null) + if(mapped.DocumentType != null) mapped.DocumentType.Name = Services.TextService.UmbracoDictionaryTranslate(mapped.DocumentType.Name); //remove the listview app if it exists From 89f93aa81d3561106adb5ce1bbc07a1ce8af9813 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Sun, 19 May 2019 18:27:02 +0200 Subject: [PATCH 08/46] Bit of work on internal data format --- .../blockeditor/blockeditor.controller.js | 36 +++++++++++++++---- .../blockeditor.editblock.controller.js | 2 +- .../blockeditor/blockeditor.html | 6 ++-- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js index 3f42de2f48..a4038cd681 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js @@ -2,7 +2,6 @@ var vm = this; vm.scaffolds = []; - vm.blocks = []; vm.loading = true; vm.sortableOptions = { axis: "y", @@ -47,19 +46,42 @@ } function add(scaffold) { - var block = angular.copy(scaffold); - edit(block); + var element = angular.copy(scaffold); + var block = { + udi: element.udi + }; + open(element, block); } function edit(block) { + var scaffold = _.findWhere(vm.scaffolds, {udi: block.udi}); + var element = angular.copy(scaffold); + _.each(element.variants[0].tabs, function (tab) { + _.each(tab.properties, function (property) { + if (block[property.alias]) { + property.value = block[property.alias]; + } + }); + }); + + open(element, block); + } + + function open(element, block) { var options = { - node: block, + element: element, title: "TODO: Edit block title here", view: "views/propertyeditors/blockeditor/blockeditor.editblock.html", submit: function(model) { - if (vm.blocks.indexOf(block) < 0) { - vm.blocks.push(block); + _.each(element.variants[0].tabs, function (tab) { + _.each(tab.properties, function (property) { + block[property.alias] = property.value; + }); + }); + if ($scope.model.value.indexOf(block) < 0) { + $scope.model.value.push(block); } + editorService.close(); }, close: function() { @@ -71,7 +93,7 @@ function remove(block) { if (confirm("TODO: Are you sure?")) { - vm.blocks.splice(vm.blocks.indexOf(block), 1); + $scope.model.value.splice($scope.model.value.indexOf(block), 1); } } diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.controller.js index 227fc384cf..779b75bfb8 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.controller.js @@ -2,7 +2,7 @@ var vm = this; vm.submit = submit; vm.close = close; - vm.content = $scope.model.node.variants[0]; + vm.content = $scope.model.element.variants[0]; function init() { diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html index 284f3ce20d..5d9113b4fd 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html @@ -4,10 +4,10 @@
-
-
+
+
- + TODO: block identifier, e.g. icon
From b064566f9e407b2cce7669bba799bbb8f42d5bb7 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Mon, 20 May 2019 07:16:15 +0200 Subject: [PATCH 09/46] Store content and settings separately + actually make it work when saving --- .../blockeditor/blockeditor.controller.js | 22 +++++++++++-------- .../blockeditor/blockeditor.html | 2 +- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js index a4038cd681..17c0465eeb 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js @@ -11,7 +11,7 @@ }; vm.add = add; - vm.edit = edit; + vm.editContent = editContent; vm.remove = remove; // it would be awesome if we could load all scaffolds in one go... however we need to have an eye out for performance, @@ -22,6 +22,8 @@ _.each($scope.model.config.blocks, function (blockConfig) { contentResource.getScaffoldByUdi(-20, blockConfig.elementType).then(function (scaffold) { if (scaffold.isElement) { + // the scaffold udi is not the same as the element type udi, but we need it to be for comparison + scaffold.udi = blockConfig.elementType; vm.scaffolds.push(scaffold); } scaffoldsLoaded++; @@ -48,26 +50,28 @@ function add(scaffold) { var element = angular.copy(scaffold); var block = { - udi: element.udi + udi: element.udi, + content: {}, + settings: {} }; - open(element, block); + openContent(element, block); } - function edit(block) { + function editContent(block) { var scaffold = _.findWhere(vm.scaffolds, {udi: block.udi}); var element = angular.copy(scaffold); _.each(element.variants[0].tabs, function (tab) { _.each(tab.properties, function (property) { - if (block[property.alias]) { - property.value = block[property.alias]; + if (block.content[property.alias]) { + property.value = block.content[property.alias]; } }); }); - open(element, block); + openContent(element, block); } - function open(element, block) { + function openContent(element, block) { var options = { element: element, title: "TODO: Edit block title here", @@ -75,7 +79,7 @@ submit: function(model) { _.each(element.variants[0].tabs, function (tab) { _.each(tab.properties, function (property) { - block[property.alias] = property.value; + block.content[property.alias] = property.value; }); }); if ($scope.model.value.indexOf(block) < 0) { diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html index 5d9113b4fd..ea379f9199 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html @@ -6,7 +6,7 @@
-
+
TODO: block identifier, e.g. icon
From acd329381cf61e691698f7b7136036462ab18fab Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Mon, 20 May 2019 08:29:08 +0200 Subject: [PATCH 10/46] Plumbing for editing settings --- .../blockeditor/blockeditor.controller.js | 18 ++++++++ .../blockeditor.editsettings.controller.js | 24 +++++++++++ .../blockeditor/blockeditor.editsettings.html | 42 +++++++++++++++++++ .../blockeditor/blockeditor.html | 7 +++- 4 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editsettings.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editsettings.html diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js index 17c0465eeb..d22ab4b142 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js @@ -12,6 +12,7 @@ vm.add = add; vm.editContent = editContent; + vm.editSettings = editSettings; vm.remove = remove; // it would be awesome if we could load all scaffolds in one go... however we need to have an eye out for performance, @@ -95,6 +96,23 @@ editorService.open(options); } + function editSettings(block) { + var options = { + settings: block.settings, + title: "TODO: Edit settings title here", + view: "views/propertyeditors/blockeditor/blockeditor.editsettings.html", + size: "medium", + submit: function(model) { + console.log("TODO: something with block settings", model) + editorService.close(); + }, + close: function() { + editorService.close(); + } + }; + editorService.open(options); + } + function remove(block) { if (confirm("TODO: Are you sure?")) { $scope.model.value.splice($scope.model.value.indexOf(block), 1); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editsettings.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editsettings.controller.js new file mode 100644 index 0000000000..fb8e212729 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editsettings.controller.js @@ -0,0 +1,24 @@ +function BlockEditorEditSettingsController($scope) { + var vm = this; + vm.submit = submit; + vm.close = close; + + function init() { + + } + + function submit() { + if($scope.model.submit) { + $scope.model.submit($scope.model); + } + } + + function close() { + if($scope.model.close) { + $scope.model.close(); + } + } + + init(); +} +angular.module("umbraco").controller("Umbraco.PropertyEditors.BlockEditor.EditSettingsController", BlockEditorEditSettingsController); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editsettings.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editsettings.html new file mode 100644 index 0000000000..c97948f83d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editsettings.html @@ -0,0 +1,42 @@ +
+ + + + + + + +
+ + + +

Here be settings editing

+
+
+
+
+
+ + + + + + + + + + +
+ +
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html index ea379f9199..e6193793ba 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html @@ -9,12 +9,15 @@
TODO: block identifier, e.g. icon
-
- +
+
+
+ +
From e41e458322868277e7f79a556f3969d2a4b5cadb Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Mon, 20 May 2019 10:28:29 +0200 Subject: [PATCH 11/46] Rename editblock to editcontent --- .../propertyeditors/blockeditor/blockeditor.controller.js | 2 +- ...ontroller.js => blockeditor.editcontent.controller.js} | 4 ++-- ...editor.editblock.html => blockeditor.editcontent.html} | 2 +- .../views/propertyeditors/blockeditor/blockeditor.html | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) rename src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/{blockeditor.editblock.controller.js => blockeditor.editcontent.controller.js} (78%) rename src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/{blockeditor.editblock.html => blockeditor.editcontent.html} (93%) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js index d22ab4b142..28bb91583c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js @@ -76,7 +76,7 @@ var options = { element: element, title: "TODO: Edit block title here", - view: "views/propertyeditors/blockeditor/blockeditor.editblock.html", + view: "views/propertyeditors/blockeditor/blockeditor.editcontent.html", submit: function(model) { _.each(element.variants[0].tabs, function (tab) { _.each(tab.properties, function (property) { diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editcontent.controller.js similarity index 78% rename from src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.controller.js rename to src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editcontent.controller.js index 779b75bfb8..f05799b398 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editcontent.controller.js @@ -1,4 +1,4 @@ -function BlockEditorEditBlockController($scope) { +function BlockEditorEditContentController($scope) { var vm = this; vm.submit = submit; vm.close = close; @@ -22,4 +22,4 @@ init(); } -angular.module("umbraco").controller("Umbraco.PropertyEditors.BlockEditor.EditBlockController", BlockEditorEditBlockController); +angular.module("umbraco").controller("Umbraco.PropertyEditors.BlockEditor.EditContentController", BlockEditorEditContentController); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editcontent.html similarity index 93% rename from src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.html rename to src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editcontent.html index 1103ef0484..5026de8b63 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editblock.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editcontent.html @@ -1,4 +1,4 @@ -
+
-
-
+
    +
  • TODO: block identifier, e.g. icon
    @@ -18,8 +18,8 @@
    -
-
+ +
Add: From 62e19279a469d3a44aa31a051f5985128c1ae276 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Mon, 20 May 2019 11:06:38 +0200 Subject: [PATCH 12/46] Split things into directives --- .../components/umbblockeditorblock.directive.js | 13 +++++++++++++ .../umbblockeditorblocks.directive.js | 13 +++++++++++++ .../blockeditor/blockeditor.block.html | 14 ++++++++++++++ .../blockeditor/blockeditor.blocks.html | 5 +++++ .../blockeditor/blockeditor.html | 17 +---------------- 5 files changed, 46 insertions(+), 16 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js create mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblocks.directive.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html create mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.blocks.html diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js new file mode 100644 index 0000000000..0db2873782 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js @@ -0,0 +1,13 @@ +angular.module("umbraco.directives").directive('umbBlockEditorBlock', [ + function () { + var link = function (scope, el, attr, ctrl) { + }; + + return { + restrict: "E", + replace: true, + templateUrl: "views/propertyeditors/blockeditor/blockeditor.block.html", + link: link + }; + } +]); diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblocks.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblocks.directive.js new file mode 100644 index 0000000000..9c67e134ea --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblocks.directive.js @@ -0,0 +1,13 @@ +angular.module("umbraco.directives").directive('umbBlockEditorBlocks', [ + function () { + var link = function (scope, el, attr, ctrl) { + }; + + return { + restrict: "E", + replace: true, + templateUrl: "views/propertyeditors/blockeditor/blockeditor.blocks.html", + link: link + }; + } +]); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html new file mode 100644 index 0000000000..85a5e578a4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html @@ -0,0 +1,14 @@ +
+
+ Block identifier goes here (e.g. icon) +
+
+ +
+
+ +
+
+ +
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.blocks.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.blocks.html new file mode 100644 index 0000000000..2763af5039 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.blocks.html @@ -0,0 +1,5 @@ +
    +
  • + +
  • +
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html index f062f004f2..3329a895c3 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html @@ -4,22 +4,7 @@
-
    -
  • -
    - TODO: block identifier, e.g. icon -
    -
    - -
    -
    - -
    -
    - -
    -
  • -
+
Add: From c2a57a1770c850c091bf95247c5a6cd7f1f393db Mon Sep 17 00:00:00 2001 From: Callum Whyte Date: Mon, 20 May 2019 10:43:11 +0100 Subject: [PATCH 13/46] UI for picking block editor element types --- .../blockeditor/block.settings.html | 39 +++++++++ .../blockeditor.settings.controller.js | 83 +++++++++++++++---- .../blockeditor/blockeditor.settings.html | 28 +++++-- 3 files changed, 125 insertions(+), 25 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/block.settings.html diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/block.settings.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/block.settings.html new file mode 100644 index 0000000000..3be46293b3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/block.settings.html @@ -0,0 +1,39 @@ +
+ + + + + + + + + +

Settings will go here...

+
+
+
+ + + + + + + + + + +
+ +
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js index e4fc3b4388..0d7eedbcf0 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js @@ -2,28 +2,77 @@ .controller("Umbraco.PropertyEditors.BlockEditor.SettingsController", [ "$scope", "contentTypeResource", - function ($scope, contentTypeResource) { - - if (!$scope.model.value) { - $scope.model.value = []; - } - - $scope.addBlock = function (elementType) { - - var block = { - elementType: elementType.udi, - settings: null - }; - - $scope.model.value.push(block); - } + "editorService", + function ($scope, contentTypeResource, editorService) { + $scope.blocks = []; $scope.elementTypes = []; + if ($scope.model.value) { + $scope.blocks = $scope.model.value; + } + contentTypeResource.getAll() - .then(function (data) { - $scope.elementTypes = _.where(data, { isElement: true }); + .then(function (contentType) { + $scope.elementTypes.push(contentType); }); + + $scope.addBlock = function () { + var block = {}; + openElementPicker(block); + }; + + $scope.removeBlock = function (index) { + $scope.blocks.splice(index, 1); + }; + + $scope.editSettings = function (block) { + openSettingsPicker(block); + }; + + function openElementPicker(block) { + + var pickerOptions = { + title: "Pick an element type", + view: "views/common/infiniteeditors/treepicker/treepicker.html", + size: "small", + multiPicker: false, + section: "settings", + treeAlias: "documentTypes", + entityType: "documentType", + submit: function (model) { + _.each(model.selection, function (elementType) { + block.elementType = elementType.udi; + $scope.blocks.push(block); + }); + + editorService.close(); + }, + close: function () { + editorService.close(); + } + }; + + editorService.open(pickerOptions); + } + + function openSettingsPicker(block) { + + var pickerOptions = { + title: "Block settings", + view: "views/propertyeditors/blockeditor/block.settings.html", + size: "small", + submit: function (model) { + block.settings = model; + editorService.close(); + }, + close: function () { + editorService.close(); + } + }; + + editorService.open(pickerOptions); + } } ] ); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html index 9b308f3bbf..dc1262812c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html @@ -1,11 +1,23 @@ 
-
-        {{model.value | json}}
-    
-
    -
  • - {{elementType.name}} Add -
  • -
+
{{model.value | json}}
+ +
+ + {{block.elementType}} + + + + Settings + + + + Remove + +
+ + + Add block + +
From 8636b5124e7c1bcc5207d26a39eb9610e9d8044b Mon Sep 17 00:00:00 2001 From: Callum Whyte Date: Mon, 20 May 2019 11:05:18 +0100 Subject: [PATCH 14/46] Copying add property functionality from doctype builder into block editor --- .../blockeditor/block.settings.html | 55 ++++++++++++++++++- .../blockeditor/blockeditor.settings.html | 2 +- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/block.settings.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/block.settings.html index 3be46293b3..851126a11e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/block.settings.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/block.settings.html @@ -12,7 +12,60 @@ -

Settings will go here...

+ +
+ +
+
+ +
+ +
+ +
+
+ + + +
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html index dc1262812c..b658421791 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html @@ -17,7 +17,7 @@
- Add block + Add
From c494ad0adc94926cfbfb3bf37fe68f3dc69e214d Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Mon, 20 May 2019 15:36:57 +0200 Subject: [PATCH 15/46] Fake settings + ability to swap editor and block views --- .../umbblockeditorblock.directive.js | 2 +- .../umbblockeditorblocks.directive.js | 1 - .../blockeditor/blockeditor.block.html | 26 ++++++++++--------- .../blockeditor/blockeditor.blocks.html | 13 ++++++---- .../blockeditor/blockeditor.controller.js | 18 ++++++++++++- 5 files changed, 40 insertions(+), 20 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js index 0db2873782..12cd2a868c 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js @@ -1,11 +1,11 @@ angular.module("umbraco.directives").directive('umbBlockEditorBlock', [ function () { var link = function (scope, el, attr, ctrl) { + scope.view = attr.view; }; return { restrict: "E", - replace: true, templateUrl: "views/propertyeditors/blockeditor/blockeditor.block.html", link: link }; diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblocks.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblocks.directive.js index 9c67e134ea..bf1f8148e2 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblocks.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblocks.directive.js @@ -5,7 +5,6 @@ return { restrict: "E", - replace: true, templateUrl: "views/propertyeditors/blockeditor/blockeditor.blocks.html", link: link }; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html index 85a5e578a4..6aeeef7823 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html @@ -1,14 +1,16 @@ -
-
- Block identifier goes here (e.g. icon) -
-
- -
-
- -
-
- +
+
+
+
+
+ +
+
+ +
+
+
+ Eventually a block identifier will go here (e.g. element type icon) +
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.blocks.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.blocks.html index 2763af5039..54817aa676 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.blocks.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.blocks.html @@ -1,5 +1,8 @@ -
    -
  • - -
  • -
+
+
+
    +
  • + +
  • +
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js index 28bb91583c..2bd846eb71 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js @@ -14,6 +14,8 @@ vm.editContent = editContent; vm.editSettings = editSettings; vm.remove = remove; + // TODO: this needs to be configurable on data type level + vm.blocksView = null; // "/App_Plugins/MyBlockEditor/myblockeditor.html"; // it would be awesome if we could load all scaffolds in one go... however we need to have an eye out for performance, // oddly enough it's been shown to actually be slower to load them all at once instead of one at a time @@ -44,6 +46,12 @@ return blockConfig.elementType === scaffold.udi; }); }); + + _.each($scope.model.value, function (block) { + applyFakeSettings(block); + }); + + vm.loading = false; } } @@ -85,6 +93,7 @@ }); if ($scope.model.value.indexOf(block) < 0) { $scope.model.value.push(block); + applyFakeSettings(block); } editorService.close(); @@ -103,7 +112,7 @@ view: "views/propertyeditors/blockeditor/blockeditor.editsettings.html", size: "medium", submit: function(model) { - console.log("TODO: something with block settings", model) + applyFakeSettings(block); editorService.close(); }, close: function() { @@ -114,11 +123,18 @@ } function remove(block) { + // this should be replaced by a custom dialog (pending some PRs) if (confirm("TODO: Are you sure?")) { $scope.model.value.splice($scope.model.value.indexOf(block), 1); } } init(); + + // TODO: remove this (only for testing) + function applyFakeSettings(block) { + block.settings["cols"] = 1 + Math.floor(Math.random() * 3); + block.settings["rows"] = 1 + Math.floor(Math.random() * 2); + } } angular.module("umbraco").controller("Umbraco.PropertyEditors.BlockEditor.PropertyEditorController", BlockEditorPropertyEditorController); From 8279e6208b6749d8e5da67ea6444f1d2b9103570 Mon Sep 17 00:00:00 2001 From: Nathan Woulfe Date: Tue, 21 May 2019 00:31:39 +1000 Subject: [PATCH 16/46] update models to make thumbnail get-only, and map to file --- .../Configuration/Grid/IGridEditorConfig.cs | 2 + .../PropertyEditors/GridEditor.cs | 16 +++++ .../Models/ContentEditing/ContentTypeBasic.cs | 65 ++----------------- .../NestedContentConfiguration.cs | 15 +++++ 4 files changed, 40 insertions(+), 58 deletions(-) diff --git a/src/Umbraco.Core/Configuration/Grid/IGridEditorConfig.cs b/src/Umbraco.Core/Configuration/Grid/IGridEditorConfig.cs index e447f7f493..8d74354b94 100644 --- a/src/Umbraco.Core/Configuration/Grid/IGridEditorConfig.cs +++ b/src/Umbraco.Core/Configuration/Grid/IGridEditorConfig.cs @@ -10,6 +10,8 @@ namespace Umbraco.Core.Configuration.Grid string View { get; } string Render { get; } string Icon { get; } + string Thumbnail { get; } + string Description { get; } IDictionary Config { get; } } } diff --git a/src/Umbraco.Core/PropertyEditors/GridEditor.cs b/src/Umbraco.Core/PropertyEditors/GridEditor.cs index 986eed9ccc..a55502e089 100644 --- a/src/Umbraco.Core/PropertyEditors/GridEditor.cs +++ b/src/Umbraco.Core/PropertyEditors/GridEditor.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.IO; using Newtonsoft.Json; using Umbraco.Core.Configuration.Grid; using Umbraco.Core.IO; @@ -38,6 +39,21 @@ namespace Umbraco.Core.PropertyEditors [JsonProperty("icon", Required = Required.Always)] public string Icon { get; set; } + [JsonProperty("thumbnail")] + public string Thumbnail { + get + { + var thumbsFolder = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.Thumbnails)); + var files = Directory.GetFiles(thumbsFolder.FullName, $"{Alias}.*"); + + return files.Length == 1 ? + IOHelper.ResolveVirtualUrl($"{SystemDirectories.Thumbnails}/{Path.GetFileName(files[0])}") : null; + } + } + + [JsonProperty("description")] + public string Description { get; set; } + [JsonProperty("config")] public IDictionary Config { get; set; } diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentTypeBasic.cs b/src/Umbraco.Web/Models/ContentEditing/ContentTypeBasic.cs index 56d81a3189..b0af0882d8 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentTypeBasic.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentTypeBasic.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; +using System.IO; using System.Runtime.Serialization; using Umbraco.Core; using Umbraco.Core.Composing; @@ -45,71 +46,19 @@ namespace Umbraco.Web.Models.ContentEditing public string Description { get; set; } [DataMember(Name = "thumbnail")] - public string Thumbnail { get; set; } - - /// - /// Returns true if the icon represents a CSS class instead of a file path - /// - [DataMember(Name = "iconIsClass")] [ReadOnly(true)] - public bool IconIsClass + public string Thumbnail { get { - if (Icon.IsNullOrWhiteSpace()) + var thumbsFolder = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.Thumbnails)); + var files = Directory.GetFiles(thumbsFolder.FullName, $"{Alias}.*"); + if (files.Length == 1) // ignore duplicates { - return true; + return IOHelper.ResolveVirtualUrl($"{SystemDirectories.Thumbnails}/{System.IO.Path.GetFileName(files[0])}"); } - //if it starts with a '.' or doesn't contain a '.' at all then it is a class - return Icon.StartsWith(".") || Icon.Contains(".") == false; - } - } - /// - /// Returns the icon file path if the icon is not a class, otherwise returns an empty string - /// - [DataMember(Name = "iconFilePath")] - [ReadOnly(true)] - public string IconFilePath - { - get - { - return IconIsClass - ? string.Empty - : string.Format("{0}images/umbraco/{1}", Current.Configs.Global().Path.EnsureEndsWith("/"), Icon); - } - } - - /// - /// Returns true if the icon represents a CSS class instead of a file path - /// - [DataMember(Name = "thumbnailIsClass")] - [ReadOnly(true)] - public bool ThumbnailIsClass - { - get - { - if (Thumbnail.IsNullOrWhiteSpace()) - { - return true; - } - //if it starts with a '.' or doesn't contain a '.' at all then it is a class - return Thumbnail.StartsWith(".") || Thumbnail.Contains(".") == false; - } - } - - /// - /// Returns the icon file path if the icon is not a class, otherwise returns an empty string - /// - [DataMember(Name = "thumbnailFilePath")] - [ReadOnly(true)] - public string ThumbnailFilePath - { - get - { - return ThumbnailIsClass - ? string.Empty - : IOHelper.ResolveUrl("~/umbraco/images/thumbnails/" + Thumbnail); + return null; } } diff --git a/src/Umbraco.Web/PropertyEditors/NestedContentConfiguration.cs b/src/Umbraco.Web/PropertyEditors/NestedContentConfiguration.cs index b904a2250d..74c3f452e7 100644 --- a/src/Umbraco.Web/PropertyEditors/NestedContentConfiguration.cs +++ b/src/Umbraco.Web/PropertyEditors/NestedContentConfiguration.cs @@ -1,4 +1,6 @@ using Newtonsoft.Json; +using System.IO; +using Umbraco.Core.IO; using Umbraco.Core.PropertyEditors; namespace Umbraco.Web.PropertyEditors @@ -36,6 +38,19 @@ namespace Umbraco.Web.PropertyEditors [JsonProperty("nameTemplate")] public string Template { get; set; } + + [JsonProperty("thumbnail")] + public string Thumbnail + { + get + { + var thumbsFolder = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.Thumbnails)); + var files = Directory.GetFiles(thumbsFolder.FullName, $"{Alias}.*"); + + return files.Length == 1 ? + IOHelper.ResolveVirtualUrl($"{SystemDirectories.Thumbnails}/{Path.GetFileName(files[0])}") : null; + } + } } } } From 1eb1d4dc63092769f775a20f8685e25239d793f8 Mon Sep 17 00:00:00 2001 From: Nathan Woulfe Date: Tue, 21 May 2019 00:31:55 +1000 Subject: [PATCH 17/46] path to thumbnail folder --- src/Umbraco.Core/IO/SystemDirectories.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Core/IO/SystemDirectories.cs b/src/Umbraco.Core/IO/SystemDirectories.cs index 2f33d82bdc..9f74accd4a 100644 --- a/src/Umbraco.Core/IO/SystemDirectories.cs +++ b/src/Umbraco.Core/IO/SystemDirectories.cs @@ -39,6 +39,8 @@ namespace Umbraco.Core.IO public static string Preview => Data + "/preview"; + public static string Thumbnails => Config + "/thumbnails"; + private static string _root; /// From 22141af54c9c1d1252a59dac8600e24f3f496f48 Mon Sep 17 00:00:00 2001 From: Nathan Woulfe Date: Tue, 21 May 2019 00:32:36 +1000 Subject: [PATCH 18/46] thumbnail is get-only and convention-mapped --- src/Umbraco.Core/Models/ContentTypeBase.cs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Core/Models/ContentTypeBase.cs b/src/Umbraco.Core/Models/ContentTypeBase.cs index 04bcb7424a..b04b30b3cc 100644 --- a/src/Umbraco.Core/Models/ContentTypeBase.cs +++ b/src/Umbraco.Core/Models/ContentTypeBase.cs @@ -2,8 +2,10 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Diagnostics; +using System.IO; using System.Linq; using System.Runtime.Serialization; +using Umbraco.Core.IO; using Umbraco.Core.Models.Entities; using Umbraco.Core.Strings; @@ -20,7 +22,6 @@ namespace Umbraco.Core.Models private string _alias; private string _description; private string _icon = "icon-folder"; - private string _thumbnail = "folder.png"; private bool _allowedAsRoot; // note: only one that's not 'pure element type' private bool _isContainer; private bool _isElement; @@ -152,8 +153,14 @@ namespace Umbraco.Core.Models [DataMember] public string Thumbnail { - get => _thumbnail; - set => SetPropertyValueAndDetectChanges(value, ref _thumbnail, nameof(Thumbnail)); + get + { + var thumbsFolder = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.Thumbnails)); + var files = Directory.GetFiles(thumbsFolder.FullName, $"{Alias}.*"); + + return files.Length == 1 ? + IOHelper.ResolveVirtualUrl($"{SystemDirectories.Thumbnails}/{System.IO.Path.GetFileName(files[0])}") : null; + } } /// @@ -472,7 +479,7 @@ namespace Umbraco.Core.Models { base.PerformDeepClone(clone); - var clonedEntity = (ContentTypeBase) clone; + var clonedEntity = (ContentTypeBase)clone; if (clonedEntity._noGroupPropertyTypes != null) { @@ -481,14 +488,14 @@ namespace Umbraco.Core.Models // we end up with duplicates, see: http://issues.umbraco.org/issue/U4-4842 clonedEntity._noGroupPropertyTypes.CollectionChanged -= PropertyTypesChanged; //clear this event handler if any - clonedEntity._noGroupPropertyTypes = (PropertyTypeCollection) _noGroupPropertyTypes.DeepClone(); //manually deep clone + clonedEntity._noGroupPropertyTypes = (PropertyTypeCollection)_noGroupPropertyTypes.DeepClone(); //manually deep clone clonedEntity._noGroupPropertyTypes.CollectionChanged += clonedEntity.PropertyTypesChanged; //re-assign correct event handler } if (clonedEntity._propertyGroups != null) { clonedEntity._propertyGroups.CollectionChanged -= PropertyGroupsChanged; //clear this event handler if any - clonedEntity._propertyGroups = (PropertyGroupCollection) _propertyGroups.DeepClone(); //manually deep clone + clonedEntity._propertyGroups = (PropertyGroupCollection)_propertyGroups.DeepClone(); //manually deep clone clonedEntity._propertyGroups.CollectionChanged += clonedEntity.PropertyGroupsChanged; //re-assign correct event handler } } From f657c635efda23c1816701c97a45022665c68c93 Mon Sep 17 00:00:00 2001 From: Nathan Woulfe Date: Tue, 21 May 2019 00:33:52 +1000 Subject: [PATCH 19/46] remove old thumbnail/icon stuff --- src/Umbraco.Core/Models/IContentTypeBase.cs | 2 +- .../Packaging/PackageDataInstallation.cs | 1 - .../Factories/ContentTypeFactory.cs | 1 - .../Persistence/Mappers/ContentTypeMapper.cs | 1 - .../Mapping/ContentTypeMapDefinition.cs | 4 -- src/Umbraco.Web/Models/Trees/TreeNode.cs | 42 ------------------- 6 files changed, 1 insertion(+), 50 deletions(-) diff --git a/src/Umbraco.Core/Models/IContentTypeBase.cs b/src/Umbraco.Core/Models/IContentTypeBase.cs index 5f1fe6ed49..773b80f917 100644 --- a/src/Umbraco.Core/Models/IContentTypeBase.cs +++ b/src/Umbraco.Core/Models/IContentTypeBase.cs @@ -33,7 +33,7 @@ namespace Umbraco.Core.Models /// /// Gets or Sets the Thumbnail for the ContentType /// - string Thumbnail { get; set; } + string Thumbnail { get; } /// /// Gets or Sets a boolean indicating whether this ContentType is allowed at the root diff --git a/src/Umbraco.Core/Packaging/PackageDataInstallation.cs b/src/Umbraco.Core/Packaging/PackageDataInstallation.cs index c811f484bc..de8033ee3c 100644 --- a/src/Umbraco.Core/Packaging/PackageDataInstallation.cs +++ b/src/Umbraco.Core/Packaging/PackageDataInstallation.cs @@ -572,7 +572,6 @@ namespace Umbraco.Core.Packaging contentType.Name = infoElement.Element("Name").Value; contentType.Icon = infoElement.Element("Icon").Value; - contentType.Thumbnail = infoElement.Element("Thumbnail").Value; contentType.Description = infoElement.Element("Description").Value; //NOTE AllowAtRoot is a new property in the package xml so we need to verify it exists before using it. diff --git a/src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs b/src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs index 54cfee0ffa..aab92c7605 100644 --- a/src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs @@ -110,7 +110,6 @@ namespace Umbraco.Core.Persistence.Factories entity.Alias = dto.Alias; entity.Name = dto.NodeDto.Text; entity.Icon = dto.Icon; - entity.Thumbnail = dto.Thumbnail; entity.SortOrder = dto.NodeDto.SortOrder; entity.Description = dto.Description; entity.CreateDate = dto.NodeDto.CreateDate; diff --git a/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs b/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs index b14fc546c8..987b87d65e 100644 --- a/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs @@ -35,7 +35,6 @@ namespace Umbraco.Core.Persistence.Mappers DefineMap(nameof(ContentType.Icon), nameof(ContentTypeDto.Icon)); DefineMap(nameof(ContentType.IsContainer), nameof(ContentTypeDto.IsContainer)); DefineMap(nameof(ContentType.IsElement), nameof(ContentTypeDto.IsElement)); - DefineMap(nameof(ContentType.Thumbnail), nameof(ContentTypeDto.Thumbnail)); } } } diff --git a/src/Umbraco.Web/Models/Mapping/ContentTypeMapDefinition.cs b/src/Umbraco.Web/Models/Mapping/ContentTypeMapDefinition.cs index a438f04781..19932c4ca3 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentTypeMapDefinition.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentTypeMapDefinition.cs @@ -184,7 +184,6 @@ namespace Umbraco.Web.Models.Mapping target.Name = source.Name; target.ParentId = source.ParentId; target.Path = source.Path; - target.Thumbnail = source.Thumbnail; target.Trashed = source.Trashed; target.UpdateDate = source.UpdateDate; } @@ -384,7 +383,6 @@ namespace Umbraco.Web.Models.Mapping target.Name = source.Name; target.ParentId = source.ParentId; target.Path = source.Path; - target.Thumbnail = source.Thumbnail; target.AllowedAsRoot = source.AllowAsRoot; target.AllowedContentTypes = source.AllowedContentTypes.Select((t, i) => new ContentTypeSort(t, i)); @@ -480,7 +478,6 @@ namespace Umbraco.Web.Models.Mapping target.Name = source.Name; target.ParentId = source.ParentId; target.Path = source.Path; - target.Thumbnail = source.Thumbnail; target.Udi = MapContentTypeUdi(source); target.UpdateDate = source.UpdateDate; @@ -517,7 +514,6 @@ namespace Umbraco.Web.Models.Mapping target.Name = source.Name; target.ParentId = source.ParentId; target.Path = source.Path; - target.Thumbnail = source.Thumbnail; target.Trashed = source.Trashed; target.Udi = source.Udi; } diff --git a/src/Umbraco.Web/Models/Trees/TreeNode.cs b/src/Umbraco.Web/Models/Trees/TreeNode.cs index 63614b141f..f32b10c34d 100644 --- a/src/Umbraco.Web/Models/Trees/TreeNode.cs +++ b/src/Umbraco.Web/Models/Trees/TreeNode.cs @@ -75,48 +75,6 @@ namespace Umbraco.Web.Models.Trees [DataMember(Name = "menuUrl")] public string MenuUrl { get; set; } - /// - /// Returns true if the icon represents a CSS class instead of a file path - /// - [DataMember(Name = "iconIsClass")] - public bool IconIsClass - { - get - { - if (Icon.IsNullOrWhiteSpace()) - { - return true; - } - - if (Icon.StartsWith("..")) - return false; - - - //if it starts with a '.' or doesn't contain a '.' at all then it is a class - return Icon.StartsWith(".") || Icon.Contains(".") == false; - } - } - - /// - /// Returns the icon file path if the icon is not a class, otherwise returns an empty string - /// - [DataMember(Name = "iconFilePath")] - public string IconFilePath - { - get - { - if (IconIsClass) - return string.Empty; - - //absolute path with or without tilde - if (Icon.StartsWith("~") || Icon.StartsWith("/")) - return IOHelper.ResolveUrl("~" + Icon.TrimStart('~')); - - //legacy icon path - return string.Format("{0}images/umbraco/{1}", Current.Configs.Global().Path.EnsureEndsWith("/"), Icon); - } - } - /// /// A list of additional/custom css classes to assign to the node /// From f17cd844ff24d79aa74efea22bcd001ec3238619 Mon Sep 17 00:00:00 2001 From: Nathan Woulfe Date: Tue, 21 May 2019 00:35:21 +1000 Subject: [PATCH 20/46] wire up all the ui stuff for previews in pickers, showing name in button when one option exists, proper picker for blocks --- src/Umbraco.Web.UI.Client/package-lock.json | 99 +++---- .../src/less/components/card.less | 275 +++++++++++------- .../src/less/components/overlays.less | 4 + .../itempicker/itempicker.controller.js | 8 +- .../overlays/itempicker/itempicker.html | 58 ++-- .../blockeditor/blockeditor.controller.js | 100 ++++++- .../blockeditor/blockeditor.html | 20 +- .../propertyeditors/grid/grid.controller.js | 37 ++- .../src/views/propertyeditors/grid/grid.html | 7 +- .../nestedcontent/nestedcontent.controller.js | 13 +- .../nestedcontent/nestedcontent.html | 3 +- 11 files changed, 409 insertions(+), 215 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index c1c85a9688..0750937cb6 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -1222,7 +1222,7 @@ "arraybuffer.slice": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "integrity": "sha1-O7xCdd1YTMGxCAm4nU6LY6aednU=", "dev": true }, "asap": { @@ -1284,7 +1284,7 @@ "async-limiter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "integrity": "sha1-ePrtjD0HSrgfIrTphdeehzj3IPg=", "dev": true }, "asynckit": { @@ -1535,7 +1535,7 @@ }, "bl": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "dev": true, "requires": { @@ -1551,7 +1551,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -1566,7 +1566,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { @@ -1740,7 +1740,7 @@ "buffer-alloc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "integrity": "sha1-iQ3ZDZI6hz4I4Q5f1RpX5bfM4Ow=", "dev": true, "requires": { "buffer-alloc-unsafe": "^1.1.0", @@ -1750,7 +1750,7 @@ "buffer-alloc-unsafe": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "integrity": "sha1-vX3CauKXLQ7aJTvgYdupkjScGfA=", "dev": true }, "buffer-crc32": { @@ -2516,7 +2516,7 @@ "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", "dev": true }, "continuable-cache": { @@ -4045,7 +4045,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", "dev": true, "requires": { "ms": "2.0.0" @@ -4061,7 +4061,7 @@ }, "engine.io-client": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "resolved": "http://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", "dev": true, "requires": { @@ -4081,7 +4081,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", "dev": true, "requires": { "ms": "2.0.0" @@ -4476,13 +4476,13 @@ "eventemitter3": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "integrity": "sha1-CQtNbNvWRe0Qv3UNS1QHlC17oWM=", "dev": true }, "exec-buffer": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", - "integrity": "sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==", + "integrity": "sha1-sWhtvZBMfPmC5lLB9aebHlVzCCs=", "dev": true, "optional": true, "requires": { @@ -5244,7 +5244,7 @@ "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "integrity": "sha1-a+Dem+mYzhavivwkSXue6bfM2a0=", "dev": true }, "fs-extra": { @@ -5309,8 +5309,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -5331,14 +5330,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5353,20 +5350,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -5483,8 +5477,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -5496,7 +5489,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5511,7 +5503,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5519,14 +5510,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -5545,7 +5534,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -5626,8 +5614,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -5639,7 +5626,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -5725,8 +5711,7 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -5762,7 +5747,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5782,7 +5766,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5826,14 +5809,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -7575,7 +7556,7 @@ "has-binary2": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "integrity": "sha1-d3asYn8+p3JQz8My2rfd9eT10R0=", "dev": true, "requires": { "isarray": "2.0.1" @@ -7778,7 +7759,7 @@ "http-proxy": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "integrity": "sha1-etOElGWPhGBeL220Q230EPTlvpo=", "dev": true, "requires": { "eventemitter3": "^3.0.0", @@ -9335,7 +9316,7 @@ "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=", "dev": true }, "lpad-align": { @@ -9369,7 +9350,7 @@ "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=", "dev": true, "requires": { "pify": "^3.0.0" @@ -12735,7 +12716,7 @@ "dependencies": { "minimist": { "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true }, @@ -13616,7 +13597,7 @@ "qjobs": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "integrity": "sha1-xF6cYYAL0IfviNfiVkI73Unl0HE=", "dev": true }, "qs": { @@ -14775,7 +14756,7 @@ }, "socket.io-parser": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "resolved": "http://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", "dev": true, "requires": { @@ -14787,7 +14768,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", "dev": true, "requires": { "ms": "2.0.0" @@ -14920,7 +14901,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "optional": true, @@ -15328,7 +15309,7 @@ "strip-outer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "integrity": "sha1-sv0qv2YEudHmATBXGV34Nrip1jE=", "dev": true, "requires": { "escape-string-regexp": "^1.0.2" @@ -15488,7 +15469,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -15731,7 +15712,7 @@ "to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "integrity": "sha1-STvUj2LXxD/N7TE6A9ytsuEhOoA=", "dev": true }, "to-fast-properties": { @@ -15860,7 +15841,7 @@ "type-is": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", "dev": true, "requires": { "media-typer": "0.3.0", @@ -15902,7 +15883,7 @@ "ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "integrity": "sha1-n+FTahCmZKZSZqHjzPhf02MCvJw=", "dev": true }, "unc-path-regex": { @@ -16505,7 +16486,7 @@ "ws": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "integrity": "sha1-8c+E/i1ekB686U767OeF8YeiKPI=", "dev": true, "requires": { "async-limiter": "~1.0.0", diff --git a/src/Umbraco.Web.UI.Client/src/less/components/card.less b/src/Umbraco.Web.UI.Client/src/less/components/card.less index 8324698685..ce6119c1d1 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/card.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/card.less @@ -2,20 +2,28 @@ Library of card related compoents, like the right-hand icon list on the grid "cards" */ -.umb-card{ - position: relative; - padding: 5px 10px 5px 10px; +.umb-card { + position: relative; + padding: 5px 10px 5px 10px; background: white; width: 100%; - .title{padding: 12px; color: @gray-3; border-bottom: 1px solid @gray-8; font-weight: 400; font-size: 16px; text-transform: none; margin: 0 -10px 10px -10px;} + .title { + padding: 12px; + color: @gray-3; + border-bottom: 1px solid @gray-8; + font-weight: 400; + font-size: 16px; + text-transform: none; + margin: 0 -10px 10px -10px; + } } -.umb-card-thumb{ +.umb-card-thumb { text-align: center; - i{ + i { text-align: center; font-size: 20px; line-height: 40px; @@ -25,51 +33,62 @@ } } -.umb-card-content{ - .item-title{color: @blackLight; font-weight: 400; border: none; font-size: 16px; text-transform: none; margin-bottom: 3px;} - p{color: @gray-3; margin-bottom: 1px;} +.umb-card-content { + .item-title { + color: @blackLight; + font-weight: 400; + border: none; + font-size: 16px; + text-transform: none; + margin-bottom: 3px; + } + + p { + color: @gray-3; + margin-bottom: 1px; + } } -.umb-card-actions{ +.umb-card-actions { padding-top: 10px; border-top: @gray-10 1px solid; clear: both; } -.umb-card-icons{ - text-align: center; - vertical-align: middle; - display: block; - list-style: none; - margin: 0; - padding: 0; +.umb-card-icons { + text-align: center; + vertical-align: middle; + display: block; + list-style: none; + margin: 0; + padding: 0; } -.umb-card-icons.vertical{ - position: absolute; - top: 7px; - right: 7px; - text-align: right; - width: 1px; +.umb-card-icons.vertical { + position: absolute; + top: 7px; + right: 7px; + text-align: right; + width: 1px; } -.umb-card-icons li{ - display: inline-block; - margin: 0 2px 0 2px; +.umb-card-icons li { + display: inline-block; + margin: 0 2px 0 2px; } -.umb-card-icons.vertical li{ - float: right; - display: block; - margin-bottom: 3px; +.umb-card-icons.vertical li { + float: right; + display: block; + margin-bottom: 3px; } //card iocn list -.umb-card-list{ - display: block; - padding: 0; - margin: 0; - } +.umb-card-list { + display: block; + padding: 0; + margin: 0; +} .umb-card-list li { border-bottom: @gray-10 1px solid; @@ -81,23 +100,23 @@ //Card icon grid for picking items off a card -.umb-card-grid{ - padding: 0; - margin: 0 auto; - list-style: none; +.umb-card-grid { + padding: 0; + margin: 0 auto; + list-style: none; width: 100%; - - display: flex; - flex-flow: row wrap; - justify-content: flex-start; + + display: flex; + flex-flow: row wrap; + justify-content: flex-start; } .umb-card-grid li { - overflow: hidden; - font-size: 12px; - text-align: center; - box-sizing: border-box; - position: relative; + overflow: hidden; + font-size: 12px; + text-align: center; + box-sizing: border-box; + position: relative; width: 100px; } @@ -107,19 +126,18 @@ } .umb-card-grid.-three-in-row li { - flex: 0 0 33.33%; - max-width:33.33%; + flex: 0 0 33.33%; + max-width: 33.33%; } .umb-card-grid .umb-card-grid-item { position: relative; - display: block; - width: 100%; - //height: 100%; + display: block; + width: 100%; padding-top: 100%; - border-radius: 3px; + border-radius: 3px; transition: background-color 120ms; - + > span { position: absolute; top: 10px; @@ -134,11 +152,56 @@ } } +.umb-card-grid.-detailed { + .umb-card-grid-item { + padding-top: 0; + + > div { + padding: 10px; + text-align: left; + font-size: 0; + overflow: hidden; + } + } + + li { + flex: 0 0 auto; + max-width: 50%; + width: 50%; + } + + .umb-card-grid-item--title { + font-size: 15px; + font-weight: 700; + } + + .umb-card-grid-item--description { + font-size: 12px; + display: block; + } + + .umb-card-grid-item--thumbnail, + i { + max-width: 120px; + margin-right: 10px; + float: left; + border-radius:3px; + } + + i { + width: 120px; + height: 80px; + display: flex; + justify-content: center; + align-items: center; + font-size: 60px; + } +} .umb-card-grid .umb-card-grid-item:hover, .umb-card-grid .umb-card-grid-item:focus { - background-color: @ui-option-hover; - color: @ui-option-type-hover; + background-color: @ui-option-hover; + color: @ui-option-type-hover; } .umb-card-grid a { @@ -153,80 +216,82 @@ display: block; } - .umb-card-grid .umb-card-grid-item__loading { - position: absolute; - background-color: rgba(255,255,255,0.8); - top: 0; - right: 0; - bottom: 0; - left: 0; - } +.umb-card-grid .umb-card-grid-item__loading { + position: absolute; + background-color: rgba(255, 255, 255, 0.8); + top: 0; + right: 0; + bottom: 0; + left: 0; +} //Round icon-like button - this should be somewhere else -.umb-btn-round{ - padding: 4px 6px 4px 6px; +.umb-btn-round { + padding: 4px 6px 4px 6px; display: inline-block; cursor: pointer; border-radius: 200px; background: @gray-10; - border:1px solid @gray-6; + border: 1px solid @gray-6; margin: 2px; } -.umb-btn-round:hover, .umb-btn-round:hover *{ - background: @blueDark !important; - color: @white !important; - border-color: @blueDark !important; - text-decoration:none; - } +.umb-btn-round:hover, +.umb-btn-round:hover * { + background: @blueDark !important; + color: @white !important; + border-color: @blueDark !important; + text-decoration: none; +} - .umb-btn-round a:hover { - text-decoration:none; - color: @white !important; - } +.umb-btn-round a:hover { + text-decoration: none; + color: @white !important; +} - .umb-btn-round i { - font-size:16px !important; - color: @gray-8; - display:block; - } +.umb-btn-round i { + font-size: 16px !important; + color: @gray-8; + display: block; +} - .umb-btn-round.alert:hover, .umb-btn-round.alert:hover *{ - background: @red !important; - color: @white !important; - border-color: @red !important; - text-decoration:none; - } +.umb-btn-round.alert:hover, +.umb-btn-round.alert:hover * { + background: @red !important; + color: @white !important; + border-color: @red !important; + text-decoration: none; +} -.umb-btn-round.no-border{ +.umb-btn-round.no-border { border: none !important; background: none !important; } .umb-training-videos { - display: grid; - grid-gap: 10px; - grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); + display: grid; + grid-gap: 10px; + grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); } .umb-training-video { - background: @white; - box-shadow: 0 1px 1px 0 rgba(0,0,0,0.16); - border-radius: @baseBorderRadius; - transition: box-shadow 0.1s ease-in-out, border 0.1s ease-in-out; - box-sizing: border-box; - padding: 20px; + background: @white; + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.16); + border-radius: @baseBorderRadius; + transition: box-shadow 0.1s ease-in-out, border 0.1s ease-in-out; + box-sizing: border-box; + padding: 20px; } .umb-training-video:hover { - box-shadow: 0 3px 6px 0 rgba(0,0,0,0.16); - text-decoration: none; + box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16); + text-decoration: none; } .umb-training-video__label { font-weight: bold; - margin-top: 20px; - display: block; - text-align: center; -} + margin-top: 20px; + display: block; + text-align: center; +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/less/components/overlays.less b/src/Umbraco.Web.UI.Client/src/less/components/overlays.less index f5050fad85..ad4e44f0ae 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/overlays.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/overlays.less @@ -137,6 +137,10 @@ &.umb-overlay--medium { width: 480px; } + + &.umb-overlay--large { + width:640px; + } } .umb-overlay.umb-overlay-target .umb-overlay-header { diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.controller.js index 74a677b7c6..0eb8b8f099 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.controller.js @@ -4,7 +4,7 @@ function ItemPickerOverlay($scope, localizationService) { $scope.model.hideSubmitButton = true; if (!$scope.model.title) { - localizationService.localize("defaultdialogs_selectItem").then(function(value){ + localizationService.localize("defaultdialogs_selectItem").then(function (value) { $scope.model.title = value; }); } @@ -14,7 +14,11 @@ function ItemPickerOverlay($scope, localizationService) { } } - $scope.selectItem = function(item) { + $scope.hasThumbs = function () { + return $scope.model.availableItems.some(x => x.thumbnail); + }; + + $scope.selectItem = function (item) { $scope.model.selectedItem = item; $scope.submitForm($scope.model); }; diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html index a9f57fe304..4d6b251ece 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html @@ -1,26 +1,30 @@
- diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js index 28bb91583c..22d42f76e1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js @@ -1,4 +1,4 @@ -function BlockEditorPropertyEditorController($scope, contentResource, editorService) { +function BlockEditorPropertyEditorController($scope, contentResource, editorService, iconHelper, clipboardService) { var vm = this; vm.scaffolds = []; @@ -14,10 +14,12 @@ vm.editContent = editContent; vm.editSettings = editSettings; vm.remove = remove; + vm.openNodeTypePicker = openNodeTypePicker; // it would be awesome if we could load all scaffolds in one go... however we need to have an eye out for performance, // oddly enough it's been shown to actually be slower to load them all at once instead of one at a time var scaffoldsLoaded = 0; + function init() { $scope.model.value = $scope.model.value || []; _.each($scope.model.config.blocks, function (blockConfig) { @@ -25,6 +27,8 @@ if (scaffold.isElement) { // the scaffold udi is not the same as the element type udi, but we need it to be for comparison scaffold.udi = blockConfig.elementType; + // shift this up to be consistent with other entities + scaffold.thumbnail = scaffold.documentType.thumbnail; vm.scaffolds.push(scaffold); } scaffoldsLoaded++; @@ -58,8 +62,90 @@ openContent(element, block); } + // nw => this needs to be refined, is currently largely a copy from nested content + function openNodeTypePicker($event) { + + vm.overlayMenu = { + show: false, + style: {}, + filter: vm.scaffolds.length > 12 ? true : false, + orderBy: "$index", + view: "itempicker", + event: $event, + clickPasteItem: function (item) { + $scope.pasteFromClipboard(item.data); + vm.overlayMenu.show = false; + vm.overlayMenu = null; + }, + submit: function (model) { + if (model && model.selectedItem) { + add(vm.scaffolds.filter(x => x.contentTypeAlias === model.selectedItem.alias)[0]); + } + vm.overlayMenu.show = false; + vm.overlayMenu = null; + }, + close: function () { + vm.overlayMenu.show = false; + vm.overlayMenu = null; + } + }; + + // this could be used for future limiting on node types + vm.overlayMenu.availableItems = []; + _.each(vm.scaffolds, function (scaffold) { + vm.overlayMenu.availableItems.push({ + alias: scaffold.contentTypeAlias, + name: scaffold.contentTypeName, + icon: iconHelper.convertFromLegacyIcon(scaffold.icon), + thumbnail: scaffold.thumbnail, + description: scaffold.documentType.description + }); + }); + + if (vm.overlayMenu.availableItems.length === 0) { + return; + } + + if (vm.overlayMenu.availableItems.some(x => x.thumbnail)) { + vm.overlayMenu.size = 'large'; + } else { + vm.overlayMenu.size = vm.overlayMenu.availableItems.length > 6 ? "medium" : "small"; + } + + vm.overlayMenu.pasteItems = []; +// var availableNodesForPaste = clipboardService.retriveDataOfType("elementType", contentTypeAliases); +// _.each(availableNodesForPaste, function (node) { +// vm.overlayMenu.pasteItems.push({ +// alias: node.contentTypeAlias, +// name: node.name, //contentTypeName +// data: node, +// icon: iconHelper.convertFromLegacyIcon(node.icon) +// }); +// }); +// +// vm.overlayMenu.title = vm.overlayMenu.pasteItems.length > 0 ? $scope.labels.grid_addElement : $scope.labels.content_createEmpty; +// +// vm.overlayMenu.clickClearPaste = function ($event) { +// $event.stopPropagation(); +// $event.preventDefault(); +// clipboardService.clearEntriesOfType("elementType", contentTypeAliases); +// vm.overlayMenu.pasteItems = []; // This dialog is not connected via the clipboardService events, so we need to update manually. +// }; + + if (vm.overlayMenu.availableItems.length === 1 && vm.overlayMenu.pasteItems.length === 0) { + // only one scaffold type - no need to display the picker + add(vm.scaffolds[0]); + return; + } + + vm.overlayMenu.show = true; + } + + function editContent(block) { - var scaffold = _.findWhere(vm.scaffolds, {udi: block.udi}); + var scaffold = _.findWhere(vm.scaffolds, { + udi: block.udi + }); var element = angular.copy(scaffold); _.each(element.variants[0].tabs, function (tab) { _.each(tab.properties, function (property) { @@ -68,7 +154,7 @@ } }); }); - + openContent(element, block); } @@ -77,7 +163,7 @@ element: element, title: "TODO: Edit block title here", view: "views/propertyeditors/blockeditor/blockeditor.editcontent.html", - submit: function(model) { + submit: function (model) { _.each(element.variants[0].tabs, function (tab) { _.each(tab.properties, function (property) { block.content[property.alias] = property.value; @@ -89,7 +175,7 @@ editorService.close(); }, - close: function() { + close: function () { editorService.close(); } }; @@ -102,11 +188,11 @@ title: "TODO: Edit settings title here", view: "views/propertyeditors/blockeditor/blockeditor.editsettings.html", size: "medium", - submit: function(model) { + submit: function (model) { console.log("TODO: something with block settings", model) editorService.close(); }, - close: function() { + close: function () { editorService.close(); } }; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html index 3329a895c3..c5d5ee56b9 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html @@ -6,11 +6,21 @@ 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 8c5bae56a7..79fa4c35e0 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 @@ -281,22 +281,29 @@ angular.module("umbraco") $scope.openEditorOverlay = function (event, area, index, key) { var title = ""; localizationService.localize("grid_insertControl").then(function (value) { - title = value; - $scope.editorOverlay = { - view: "itempicker", - filter: area.$allowedEditors.length > 15, - title: title, - availableItems: area.$allowedEditors, - event: event, - show: true, - submit: function (model) { - if (model.selectedItem) { - $scope.addControl(model.selectedItem, area, index); - $scope.editorOverlay.show = false; - $scope.editorOverlay = null; + if (area.$allowedEditors.length > 1) { + title = value; + $scope.editorOverlay = { + view: "itempicker", + filter: area.$allowedEditors.length > 15, + title: title, + size: area.$allowedEditors.some(x => x.thumbnail) ? 'large' : 'small', + availableItems: area.$allowedEditors, + event: event, + show: true, + submit: function (model) { + if (model.selectedItem) { + console.log(model.selectedItem); + $scope.addControl(model.selectedItem, area, index); + $scope.editorOverlay.show = false; + $scope.editorOverlay = null; + } } - } - }; + }; + } else { + console.log(area.$allowedEditors[0]); + $scope.addControl(area.$allowedEditors[0], area, index); + } }); }; 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 6b739a9b86..e3704713cb 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 @@ -226,7 +226,11 @@
-
+
+ + + {{ area.$allowedEditors[0].name }} +
@@ -300,6 +304,7 @@ ng-if="editorOverlay.show" model="editorOverlay" view="editorOverlay.view" + size="editorOverlay.size" position="target"> diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js index 7a67e07e0c..548782633b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js @@ -184,7 +184,9 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop $scope.overlayMenu.availableItems.push({ alias: scaffold.contentTypeAlias, name: scaffold.contentTypeName, - icon: iconHelper.convertFromLegacyIcon(scaffold.icon) + icon: iconHelper.convertFromLegacyIcon(scaffold.icon), + thumbnail: scaffold.thumbnail, + description: scaffold.documentType.description }); }); @@ -192,7 +194,11 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop return; } - $scope.overlayMenu.size = $scope.overlayMenu.availableItems.length > 6 ? "medium" : "small"; + if ($scope.overlayMenu.availableItems.some(x => x.thumbnail)) { + $scope.overlayMenu.size = 'large'; + } else { + $scope.overlayMenu.size = $scope.overlayMenu.availableItems.length > 6 ? "medium" : "small"; + } $scope.overlayMenu.pasteItems = []; var availableNodesForPaste = clipboardService.retriveDataOfType("elementType", contentTypeAliases); @@ -399,6 +405,9 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop }); } + // pass the thumbnail on to the scaffold + scaffold.thumbnail = contentType.thumbnail; + // Store the scaffold object $scope.scaffolds.push(scaffold); } diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html index a8a77e2d53..bec6d40506 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html @@ -37,7 +37,8 @@ From 7ce4fbe44c03c1c58cd6e467d670f3e583a2fdc6 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Mon, 20 May 2019 17:40:38 +0200 Subject: [PATCH 21/46] Refactor to make it reusable across implementations --- .../components/umbblockeditor.directive.js | 15 +++++++ .../umbblockeditorblocks.directive.js | 12 ------ .../blockeditor/blockeditor.blocks.html | 8 ---- .../blockeditor.default.controller.js | 11 ++++++ .../blockeditor/blockeditor.default.html | 14 +++++++ ...js => blockeditor.directive.controller.js} | 39 +++++++++---------- .../blockeditor/blockeditor.directive.html | 7 ++++ .../blockeditor/blockeditor.html | 17 +------- 8 files changed, 66 insertions(+), 57 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditor.directive.js delete mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblocks.directive.js delete mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.blocks.html create mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.html rename src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/{blockeditor.controller.js => blockeditor.directive.controller.js} (77%) create mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.directive.html diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditor.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditor.directive.js new file mode 100644 index 0000000000..1fddf4dcc6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditor.directive.js @@ -0,0 +1,15 @@ +angular.module("umbraco.directives").directive('umbBlockEditor', [ + function () { + return { + restrict: "E", + templateUrl: "views/propertyeditors/blockeditor/blockeditor.directive.html", + scope: { + config: "=", + view: "=?", + blocks: "=" + }, + controller: "Umbraco.PropertyEditors.BlockEditor.DirectiveController", + controllerAs: "vm" + }; + } +]); diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblocks.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblocks.directive.js deleted file mode 100644 index bf1f8148e2..0000000000 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblocks.directive.js +++ /dev/null @@ -1,12 +0,0 @@ -angular.module("umbraco.directives").directive('umbBlockEditorBlocks', [ - function () { - var link = function (scope, el, attr, ctrl) { - }; - - return { - restrict: "E", - templateUrl: "views/propertyeditors/blockeditor/blockeditor.blocks.html", - link: link - }; - } -]); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.blocks.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.blocks.html deleted file mode 100644 index 54817aa676..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.blocks.html +++ /dev/null @@ -1,8 +0,0 @@ -
-
-
    -
  • - -
  • -
-
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.controller.js new file mode 100644 index 0000000000..3ed36060fe --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.controller.js @@ -0,0 +1,11 @@ +function BlockEditorDefaultController($scope, contentResource, editorService) { + console.log("Block editor default controller", $scope.model) + // TODO: move this to a controller supporting the default blockeditor view + $scope.sortableOptions = { + axis: "y", + cursor: "move", + handle: ".handle", + tolerance: 'pointer' + }; +} +angular.module("umbraco").controller("Umbraco.PropertyEditors.BlockEditor.DefaultController", BlockEditorDefaultController); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.html new file mode 100644 index 0000000000..97613b0193 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.html @@ -0,0 +1,14 @@ +
+
    +
  • + +
  • +
+ +
+ Add: +
+ +
+
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.directive.controller.js similarity index 77% rename from src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js rename to src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.directive.controller.js index 2bd846eb71..681617871e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.directive.controller.js @@ -1,32 +1,29 @@ -function BlockEditorPropertyEditorController($scope, contentResource, editorService) { +function BlockEditorDirectiveController($scope, contentResource, editorService) { var vm = this; vm.scaffolds = []; vm.loading = true; - vm.sortableOptions = { - axis: "y", - cursor: "move", - handle: ".handle", - tolerance: 'pointer' - }; - vm.add = add; vm.editContent = editContent; vm.editSettings = editSettings; vm.remove = remove; - // TODO: this needs to be configurable on data type level - vm.blocksView = null; // "/App_Plugins/MyBlockEditor/myblockeditor.html"; // it would be awesome if we could load all scaffolds in one go... however we need to have an eye out for performance, // oddly enough it's been shown to actually be slower to load them all at once instead of one at a time var scaffoldsLoaded = 0; function init() { - $scope.model.value = $scope.model.value || []; - _.each($scope.model.config.blocks, function (blockConfig) { - contentResource.getScaffoldByUdi(-20, blockConfig.elementType).then(function (scaffold) { + if (!$scope.blocks) { + $scope.blocks = []; + } + if (!$scope.view) { + $scope.view = "views/propertyeditors/blockeditor/blockeditor.default.html"; + } + + _.each($scope.config, function (config) { + contentResource.getScaffoldByUdi(-20, config.elementType).then(function (scaffold) { if (scaffold.isElement) { // the scaffold udi is not the same as the element type udi, but we need it to be for comparison - scaffold.udi = blockConfig.elementType; + scaffold.udi = config.elementType; vm.scaffolds.push(scaffold); } scaffoldsLoaded++; @@ -40,14 +37,14 @@ function initIfAllScaffoldsHaveLoaded() { // Initialize when all scaffolds have loaded - if ($scope.model.config.blocks.length === scaffoldsLoaded) { + if ($scope.config.length === scaffoldsLoaded) { vm.scaffolds = _.sortBy(vm.scaffolds, function (scaffold) { - return _.findIndex($scope.model.config.blocks, function (blockConfig) { + return _.findIndex($scope.config, function (blockConfig) { return blockConfig.elementType === scaffold.udi; }); }); - _.each($scope.model.value, function (block) { + _.each($scope.blocks, function (block) { applyFakeSettings(block); }); @@ -91,8 +88,8 @@ block.content[property.alias] = property.value; }); }); - if ($scope.model.value.indexOf(block) < 0) { - $scope.model.value.push(block); + if ($scope.blocks.indexOf(block) < 0) { + $scope.blocks.push(block); applyFakeSettings(block); } @@ -125,7 +122,7 @@ function remove(block) { // this should be replaced by a custom dialog (pending some PRs) if (confirm("TODO: Are you sure?")) { - $scope.model.value.splice($scope.model.value.indexOf(block), 1); + $scope.blocks.splice($scope.blocks.indexOf(block), 1); } } @@ -137,4 +134,4 @@ block.settings["rows"] = 1 + Math.floor(Math.random() * 2); } } -angular.module("umbraco").controller("Umbraco.PropertyEditors.BlockEditor.PropertyEditorController", BlockEditorPropertyEditorController); +angular.module("umbraco").controller("Umbraco.PropertyEditors.BlockEditor.DirectiveController", BlockEditorDirectiveController); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.directive.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.directive.html new file mode 100644 index 0000000000..98ae7a79fd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.directive.html @@ -0,0 +1,7 @@ +
+
+ +
+ +
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html index 3329a895c3..3c95c536f3 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html @@ -1,16 +1 @@ -
-
- -
- -
- - -
- Add: -
- -
-
-
-
+ From d71b2a07c4f0515af49c333990ea494aeec2467a Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Mon, 20 May 2019 18:03:21 +0200 Subject: [PATCH 22/46] Refactor block view specification in the block directive --- .../components/umbblockeditorblock.directive.js | 4 ++-- .../blockeditor/blockeditor.block.default.html | 13 +++++++++++++ .../blockeditor/blockeditor.block.html | 16 ---------------- .../blockeditor/blockeditor.default.html | 4 +++- 4 files changed, 18 insertions(+), 19 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.default.html delete mode 100644 src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js index 12cd2a868c..9b471f025f 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js @@ -1,12 +1,12 @@ angular.module("umbraco.directives").directive('umbBlockEditorBlock', [ function () { var link = function (scope, el, attr, ctrl) { - scope.view = attr.view; + scope.view = attr.view || "views/propertyeditors/blockeditor/blockeditor.block.default.html"; }; return { restrict: "E", - templateUrl: "views/propertyeditors/blockeditor/blockeditor.block.html", + template: "
", link: link }; } diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.default.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.default.html new file mode 100644 index 0000000000..b27f08e060 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.default.html @@ -0,0 +1,13 @@ +
+
+
+ +
+
+ +
+
+
+ Eventually a block identifier will go here (e.g. element type icon) +
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html deleted file mode 100644 index 6aeeef7823..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html +++ /dev/null @@ -1,16 +0,0 @@ -
-
-
-
-
- -
-
- -
-
-
- Eventually a block identifier will go here (e.g. element type icon) -
-
-
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.html index 97613b0193..84cf55fe7d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.html @@ -1,7 +1,9 @@ 
  • - +
    + +
From 36616fb9d16547a97b4cbbd3b26c037d2bb4beac Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Mon, 20 May 2019 18:17:57 +0200 Subject: [PATCH 23/46] Split into SimpleGrid --- src/Umbraco.Core/Constants-PropertyEditors.cs | 5 ----- .../umbblockeditorblock.directive.js | 2 +- ...ock.default.html => blockeditor.block.html} | 0 .../blockeditor.default.controller.js | 2 -- .../simplegrid.html} | 0 .../BlockEditorConfiguration.cs | 2 +- .../BlockEditorConfigurationEditor.cs | 9 --------- .../BlockEditorPropertyEditor.cs | 18 ------------------ .../PropertyEditors/SimpleGridConfiguration.cs | 6 ++++++ .../SimpleGridConfigurationEditor.cs | 9 +++++++++ .../SimpleGridPropertyEditor.cs | 17 +++++++++++++++++ src/Umbraco.Web/Umbraco.Web.csproj | 5 +++-- 12 files changed, 37 insertions(+), 38 deletions(-) rename src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/{blockeditor.block.default.html => blockeditor.block.html} (100%) rename src/Umbraco.Web.UI.Client/src/views/propertyeditors/{blockeditor/blockeditor.html => simplegrid/simplegrid.html} (100%) delete mode 100644 src/Umbraco.Web/PropertyEditors/BlockEditorConfigurationEditor.cs delete mode 100644 src/Umbraco.Web/PropertyEditors/BlockEditorPropertyEditor.cs create mode 100644 src/Umbraco.Web/PropertyEditors/SimpleGridConfiguration.cs create mode 100644 src/Umbraco.Web/PropertyEditors/SimpleGridConfigurationEditor.cs create mode 100644 src/Umbraco.Web/PropertyEditors/SimpleGridPropertyEditor.cs diff --git a/src/Umbraco.Core/Constants-PropertyEditors.cs b/src/Umbraco.Core/Constants-PropertyEditors.cs index f9b298e586..0c2e246721 100644 --- a/src/Umbraco.Core/Constants-PropertyEditors.cs +++ b/src/Umbraco.Core/Constants-PropertyEditors.cs @@ -19,11 +19,6 @@ namespace Umbraco.Core ///
public static class Aliases { - /// - /// Block Editor. - /// - public const string BlockEditor = "Umbraco.BlockEditor"; - /// /// CheckBox List. /// diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js index 9b471f025f..09964f3d43 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js @@ -1,7 +1,7 @@ angular.module("umbraco.directives").directive('umbBlockEditorBlock', [ function () { var link = function (scope, el, attr, ctrl) { - scope.view = attr.view || "views/propertyeditors/blockeditor/blockeditor.block.default.html"; + scope.view = attr.view || "views/propertyeditors/blockeditor/blockeditor.block.html"; }; return { diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.default.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html similarity index 100% rename from src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.default.html rename to src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.controller.js index 3ed36060fe..c3287170a7 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.controller.js @@ -1,6 +1,4 @@ function BlockEditorDefaultController($scope, contentResource, editorService) { - console.log("Block editor default controller", $scope.model) - // TODO: move this to a controller supporting the default blockeditor view $scope.sortableOptions = { axis: "y", cursor: "move", diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/simplegrid/simplegrid.html similarity index 100% rename from src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html rename to src/Umbraco.Web.UI.Client/src/views/propertyeditors/simplegrid/simplegrid.html diff --git a/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs b/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs index b91c6b37bf..c96c901861 100644 --- a/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs +++ b/src/Umbraco.Web/PropertyEditors/BlockEditorConfiguration.cs @@ -4,7 +4,7 @@ using Umbraco.Core.PropertyEditors; namespace Umbraco.Web.PropertyEditors { - public class BlockEditorConfiguration + public abstract class BlockEditorConfiguration { [ConfigurationField("blocks", "Blocks", "views/propertyeditors/blockeditor/blockeditor.settings.html")] public Block[] Blocks { get; set; } diff --git a/src/Umbraco.Web/PropertyEditors/BlockEditorConfigurationEditor.cs b/src/Umbraco.Web/PropertyEditors/BlockEditorConfigurationEditor.cs deleted file mode 100644 index cd68108f16..0000000000 --- a/src/Umbraco.Web/PropertyEditors/BlockEditorConfigurationEditor.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Umbraco.Core.PropertyEditors; - -namespace Umbraco.Web.PropertyEditors -{ - internal class BlockEditorConfigurationEditor : ConfigurationEditor - { - - } -} diff --git a/src/Umbraco.Web/PropertyEditors/BlockEditorPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/BlockEditorPropertyEditor.cs deleted file mode 100644 index f486af4c3d..0000000000 --- a/src/Umbraco.Web/PropertyEditors/BlockEditorPropertyEditor.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Umbraco.Core; -using Umbraco.Core.Logging; -using Umbraco.Core.PropertyEditors; - -namespace Umbraco.Web.PropertyEditors -{ - [DataEditor(Constants.PropertyEditors.Aliases.BlockEditor, EditorType.PropertyValue , "Block Editor", "blockeditor", ValueType = ValueTypes.Json, Group="rich content", Icon="icon-application-window-alt")] - public class BlockEditorPropertyEditor : DataEditor - { - public BlockEditorPropertyEditor(ILogger logger) - : base(logger) - { } - - protected override IConfigurationEditor CreateConfigurationEditor() => new BlockEditorConfigurationEditor(); - - protected override IDataValueEditor CreateValueEditor() => base.CreateValueEditor(); - } -} diff --git a/src/Umbraco.Web/PropertyEditors/SimpleGridConfiguration.cs b/src/Umbraco.Web/PropertyEditors/SimpleGridConfiguration.cs new file mode 100644 index 0000000000..8664c3b40c --- /dev/null +++ b/src/Umbraco.Web/PropertyEditors/SimpleGridConfiguration.cs @@ -0,0 +1,6 @@ +namespace Umbraco.Web.PropertyEditors +{ + public class SimpleGridConfiguration : BlockEditorConfiguration + { + } +} diff --git a/src/Umbraco.Web/PropertyEditors/SimpleGridConfigurationEditor.cs b/src/Umbraco.Web/PropertyEditors/SimpleGridConfigurationEditor.cs new file mode 100644 index 0000000000..eaa054ff7e --- /dev/null +++ b/src/Umbraco.Web/PropertyEditors/SimpleGridConfigurationEditor.cs @@ -0,0 +1,9 @@ +using Umbraco.Core.PropertyEditors; + +namespace Umbraco.Web.PropertyEditors +{ + internal class SimpleGridConfigurationEditor : ConfigurationEditor + { + + } +} diff --git a/src/Umbraco.Web/PropertyEditors/SimpleGridPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/SimpleGridPropertyEditor.cs new file mode 100644 index 0000000000..eb20a177ea --- /dev/null +++ b/src/Umbraco.Web/PropertyEditors/SimpleGridPropertyEditor.cs @@ -0,0 +1,17 @@ +using Umbraco.Core.Logging; +using Umbraco.Core.PropertyEditors; + +namespace Umbraco.Web.PropertyEditors +{ + [DataEditor("Umbraco.SimpleGrid", EditorType.PropertyValue , "Simple Grid", "simplegrid", ValueType = ValueTypes.Json, Group="rich content", Icon="icon-application-window-alt")] + public class SimpleGridPropertyEditor : DataEditor + { + public SimpleGridPropertyEditor(ILogger logger) + : base(logger) + { } + + protected override IConfigurationEditor CreateConfigurationEditor() => new SimpleGridConfigurationEditor(); + + protected override IDataValueEditor CreateValueEditor() => base.CreateValueEditor(); + } +} diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 4860559e00..57e2c722a5 100755 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -212,8 +212,9 @@ - - + + + From 663228c33bccb2a51e067c5752717cb17220a6a1 Mon Sep 17 00:00:00 2001 From: Callum Whyte Date: Mon, 20 May 2019 17:18:51 +0100 Subject: [PATCH 24/46] Updating block settings editor --- .../blockeditor/blockeditor.settings.html | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html index b658421791..29e2978724 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.html @@ -1,23 +1,20 @@ 
-
{{model.value | json}}
- -
- - {{block.elementType}} - - - - Settings - - - - Remove - -
+ + Add +
+
{{model.value | json}}
+
From 6c2401fa27603eb179a729549d3acf5424d55b01 Mon Sep 17 00:00:00 2001 From: Callum Whyte Date: Mon, 20 May 2019 17:24:37 +0100 Subject: [PATCH 25/46] Ensuring blocks are persisted when settings are saved --- .../blockeditor/blockeditor.settings.controller.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js index 0d7eedbcf0..3f1ef17d43 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.settings.controller.js @@ -30,6 +30,10 @@ openSettingsPicker(block); }; + $scope.$on("formSubmitting", function () { + $scope.model.value = $scope.blocks; + }); + function openElementPicker(block) { var pickerOptions = { From e2b0053d318f2596101a0a9484cc873140f80e33 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Mon, 20 May 2019 18:37:12 +0200 Subject: [PATCH 26/46] Rename default view to simple list --- .../directives/components/umbblockeditor.directive.js | 7 ++++++- .../blockeditor/blockeditor.directive.controller.js | 3 --- ....controller.js => blockeditor.simplelist.controller.js} | 4 ++-- ...lockeditor.default.html => blockeditor.simplelist.html} | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) rename src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/{blockeditor.default.controller.js => blockeditor.simplelist.controller.js} (57%) rename src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/{blockeditor.default.html => blockeditor.simplelist.html} (87%) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditor.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditor.directive.js index 1fddf4dcc6..79463d1d24 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditor.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditor.directive.js @@ -1,5 +1,9 @@ angular.module("umbraco.directives").directive('umbBlockEditor', [ function () { + var link = function (scope, el, attr, ctrl) { + scope.view = attr.view || "views/propertyeditors/blockeditor/blockeditor.simplelist.html"; + }; + return { restrict: "E", templateUrl: "views/propertyeditors/blockeditor/blockeditor.directive.html", @@ -9,7 +13,8 @@ blocks: "=" }, controller: "Umbraco.PropertyEditors.BlockEditor.DirectiveController", - controllerAs: "vm" + controllerAs: "vm", + link: link }; } ]); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.directive.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.directive.controller.js index 681617871e..e4c16d4c28 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.directive.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.directive.controller.js @@ -15,9 +15,6 @@ if (!$scope.blocks) { $scope.blocks = []; } - if (!$scope.view) { - $scope.view = "views/propertyeditors/blockeditor/blockeditor.default.html"; - } _.each($scope.config, function (config) { contentResource.getScaffoldByUdi(-20, config.elementType).then(function (scaffold) { diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.simplelist.controller.js similarity index 57% rename from src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.controller.js rename to src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.simplelist.controller.js index c3287170a7..b98eb2cd6d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.simplelist.controller.js @@ -1,4 +1,4 @@ -function BlockEditorDefaultController($scope, contentResource, editorService) { +function BlockEditorSimpleListController($scope, contentResource, editorService) { $scope.sortableOptions = { axis: "y", cursor: "move", @@ -6,4 +6,4 @@ tolerance: 'pointer' }; } -angular.module("umbraco").controller("Umbraco.PropertyEditors.BlockEditor.DefaultController", BlockEditorDefaultController); +angular.module("umbraco").controller("Umbraco.PropertyEditors.BlockEditor.SimpleListController", BlockEditorSimpleListController); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.simplelist.html similarity index 87% rename from src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.html rename to src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.simplelist.html index 84cf55fe7d..ff4809da77 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.default.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.simplelist.html @@ -1,4 +1,4 @@ -
+
  • From 6529f472abce910c031cb904388b9772c12b3a53 Mon Sep 17 00:00:00 2001 From: Nathan Woulfe Date: Tue, 21 May 2019 02:37:56 +1000 Subject: [PATCH 27/46] wip - will be merge issues with this. --- .../umbblockeditorblock.directive.js | 2 +- .../components/umbnodepreview.directive.js | 2 +- .../blockeditor/blockeditor.block.html | 22 ++++----- .../blockeditor/blockeditor.blocks.html | 8 ++-- .../blockeditor/blockeditor.controller.js | 48 ++++++++++--------- .../blockeditor.editsettings.controller.js | 9 ++-- .../blockeditor/blockeditor.html | 2 +- .../blockeditor.settings.controller.js | 6 ++- .../blockeditor/blockeditor.settings.html | 2 +- 9 files changed, 51 insertions(+), 50 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js index 0db2873782..ee042eac35 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbblockeditorblock.directive.js @@ -10,4 +10,4 @@ link: link }; } -]); +]); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbnodepreview.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbnodepreview.directive.js index 9f1f7a0d2e..4fb7abea9f 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbnodepreview.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbnodepreview.directive.js @@ -100,7 +100,7 @@ function link(scope, el, attr, ctrl) { if (!scope.editLabelKey) { - scope.editLabelKey = "general_edit"; + scope.editLabelKey = "general_edit"; } userService.getCurrentUser().then(function (u) { var isAdmin = u.userGroups.indexOf('admin') !== -1; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html index 85a5e578a4..68c30065ab 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.block.html @@ -1,14 +1,14 @@ -
    -
    - Block identifier goes here (e.g. icon) +
    + +
    + +
    A name for block to identify it
    +
    {{ description }}
    +
    -
    - -
    -
    - -
    -
    - +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.blocks.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.blocks.html index 2763af5039..dc3afb5823 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.blocks.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.blocks.html @@ -1,5 +1,3 @@ -
      -
    • - -
    • -
    +
    + +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js index 22d42f76e1..acbee4ed0f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.controller.js @@ -16,6 +16,8 @@ vm.remove = remove; vm.openNodeTypePicker = openNodeTypePicker; + let allowedElements = []; + // it would be awesome if we could load all scaffolds in one go... however we need to have an eye out for performance, // oddly enough it's been shown to actually be slower to load them all at once instead of one at a time var scaffoldsLoaded = 0; @@ -48,6 +50,9 @@ return blockConfig.elementType === scaffold.udi; }); }); + + allowedElements = vm.scaffolds.map(x => x.contentTypeAlias); + vm.loading = false; } } @@ -92,7 +97,7 @@ // this could be used for future limiting on node types vm.overlayMenu.availableItems = []; - _.each(vm.scaffolds, function (scaffold) { + vm.scaffolds.forEach(function (scaffold) { vm.overlayMenu.availableItems.push({ alias: scaffold.contentTypeAlias, name: scaffold.contentTypeName, @@ -113,24 +118,22 @@ } vm.overlayMenu.pasteItems = []; -// var availableNodesForPaste = clipboardService.retriveDataOfType("elementType", contentTypeAliases); -// _.each(availableNodesForPaste, function (node) { -// vm.overlayMenu.pasteItems.push({ -// alias: node.contentTypeAlias, -// name: node.name, //contentTypeName -// data: node, -// icon: iconHelper.convertFromLegacyIcon(node.icon) -// }); -// }); -// -// vm.overlayMenu.title = vm.overlayMenu.pasteItems.length > 0 ? $scope.labels.grid_addElement : $scope.labels.content_createEmpty; -// -// vm.overlayMenu.clickClearPaste = function ($event) { -// $event.stopPropagation(); -// $event.preventDefault(); -// clipboardService.clearEntriesOfType("elementType", contentTypeAliases); -// vm.overlayMenu.pasteItems = []; // This dialog is not connected via the clipboardService events, so we need to update manually. -// }; + var availableNodesForPaste = clipboardService.retriveDataOfType("elementType", allowedElements); + availableNodesForPaste.forEach(function (node) { + vm.overlayMenu.pasteItems.push({ + alias: node.contentTypeAlias, + name: node.name, //contentTypeName + data: node, + icon: iconHelper.convertFromLegacyIcon(node.icon) + }); + }); + + vm.overlayMenu.clickClearPaste = function ($event) { + $event.stopPropagation(); + $event.preventDefault(); + clipboardService.clearEntriesOfType("elementType", allowedElements); + vm.overlayMenu.pasteItems = []; // This dialog is not connected via the clipboardService events, so we need to update manually. + }; if (vm.overlayMenu.availableItems.length === 1 && vm.overlayMenu.pasteItems.length === 0) { // only one scaffold type - no need to display the picker @@ -144,7 +147,7 @@ function editContent(block) { var scaffold = _.findWhere(vm.scaffolds, { - udi: block.udi + udi: block.udi }); var element = angular.copy(scaffold); _.each(element.variants[0].tabs, function (tab) { @@ -161,7 +164,7 @@ function openContent(element, block) { var options = { element: element, - title: "TODO: Edit block title here", + title: 'Edit block', view: "views/propertyeditors/blockeditor/blockeditor.editcontent.html", submit: function (model) { _.each(element.variants[0].tabs, function (tab) { @@ -169,10 +172,11 @@ block.content[property.alias] = property.value; }); }); + if ($scope.model.value.indexOf(block) < 0) { $scope.model.value.push(block); } - + editorService.close(); }, close: function () { diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editsettings.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editsettings.controller.js index fb8e212729..0cdb4d1525 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editsettings.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.editsettings.controller.js @@ -1,19 +1,16 @@ function BlockEditorEditSettingsController($scope) { - var vm = this; - vm.submit = submit; - vm.close = close; function init() { } - function submit() { + this.submit = () => { if($scope.model.submit) { $scope.model.submit($scope.model); } } - function close() { + this.close = () => { if($scope.model.close) { $scope.model.close(); } @@ -21,4 +18,4 @@ init(); } -angular.module("umbraco").controller("Umbraco.PropertyEditors.BlockEditor.EditSettingsController", BlockEditorEditSettingsController); +angular.module("umbraco").controller("Umbraco.PropertyEditors.BlockEditor.EditSettingsController", ['$scope', BlockEditorEditSettingsController]); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html index c5d5ee56b9..930294f755 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockeditor/blockeditor.html @@ -4,7 +4,7 @@
    - +