diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/embed.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/embed.controller.js deleted file mode 100644 index dfc9cfdcef..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/embed.controller.js +++ /dev/null @@ -1,28 +0,0 @@ -angular.module("umbraco") - .controller("Umbraco.PropertyEditors.Grid.EmbedController", - function ($scope, $rootScope, $timeout) { - - $scope.setEmbed = function(){ - $scope.embedDialog = {}; - $scope.embedDialog.view = "embed"; - $scope.embedDialog.show = true; - - $scope.embedDialog.submit = function(model) { - $scope.control.value = model.embed.preview; - $scope.embedDialog.show = false; - $scope.embedDialog = null; - }; - - $scope.embedDialog.close = function(oldModel) { - $scope.embedDialog.show = false; - $scope.embedDialog = null; - }; - - }; - - $timeout(function(){ - if($scope.control.$initializing){ - $scope.setEmbed(); - } - }, 200); -}); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/embed.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/embed.html deleted file mode 100644 index e506ac5880..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/embed.html +++ /dev/null @@ -1,17 +0,0 @@ -
- -
- -
Click to embed
-
- -
- - - - -
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/error.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/error.html deleted file mode 100644 index 67ef4ea112..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/error.html +++ /dev/null @@ -1,2 +0,0 @@ -

Something went wrong with this editor, below is the data stored:

-
{{control | json}}
\ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/macro.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/macro.controller.js deleted file mode 100644 index d536d9174a..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/macro.controller.js +++ /dev/null @@ -1,64 +0,0 @@ -angular.module("umbraco") - .controller("Umbraco.PropertyEditors.Grid.MacroController", - function ($scope, $rootScope, $timeout, dialogService, macroResource, macroService, $routeParams) { - - $scope.title = "Click to insert macro"; - - $scope.setMacro = function(){ - - var dialogData = { - richTextEditor: true, - macroData: $scope.control.value || { - macroAlias: $scope.control.editor.config && $scope.control.editor.config.macroAlias - ? $scope.control.editor.config.macroAlias : "" - } - }; - - $scope.macroPickerOverlay = {}; - $scope.macroPickerOverlay.view = "macropicker"; - $scope.macroPickerOverlay.dialogData = dialogData; - $scope.macroPickerOverlay.show = true; - - $scope.macroPickerOverlay.submit = function(model) { - - var macroObject = macroService.collectValueData(model.selectedMacro, model.macroParams, dialogData.renderingEngine); - - $scope.control.value = { - macroAlias: macroObject.macroAlias, - macroParamsDictionary: macroObject.macroParamsDictionary - }; - - $scope.setPreview($scope.control.value ); - - $scope.macroPickerOverlay.show = false; - $scope.macroPickerOverlay = null; - }; - - $scope.macroPickerOverlay.close = function(oldModel) { - $scope.macroPickerOverlay.show = false; - $scope.macroPickerOverlay = null; - }; - - }; - - $scope.setPreview = function(macro){ - var contentId = $routeParams.id; - - macroResource.getMacroResultAsHtmlForEditor(macro.macroAlias, contentId, macro.macroParamsDictionary) - .then(function (htmlResult) { - $scope.title = macro.macroAlias; - if(htmlResult.trim().length > 0 && htmlResult.indexOf("Macro:") < 0){ - $scope.preview = htmlResult; - } - }); - - }; - - $timeout(function(){ - if($scope.control.$initializing){ - $scope.setMacro(); - }else if($scope.control.value){ - $scope.setPreview($scope.control.value); - } - }, 200); -}); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/macro.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/macro.html deleted file mode 100644 index f36a870423..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/macro.html +++ /dev/null @@ -1,23 +0,0 @@ -
- -
-
- -
{{title}}
-
-
-
-
-
-
- - - - -
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/media.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/media.controller.js deleted file mode 100644 index 21f9534848..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/media.controller.js +++ /dev/null @@ -1,78 +0,0 @@ -angular.module("umbraco") - .controller("Umbraco.PropertyEditors.Grid.MediaController", - function ($scope, $rootScope, $timeout, userService) { - - if (!$scope.model.config.startNodeId) { - userService.getCurrentUser().then(function (userData) { - $scope.model.config.startNodeId = userData.startMediaIds.length !== 1 ? -1 : userData.startMediaIds[0]; - $scope.model.config.startNodeIsVirtual = userData.startMediaIds.length !== 1; - }); - } - - $scope.setImage = function(){ - $scope.mediaPickerOverlay = {}; - $scope.mediaPickerOverlay.view = "mediapicker"; - $scope.mediaPickerOverlay.startNodeId = $scope.model.config && $scope.model.config.startNodeId ? $scope.model.config.startNodeId : undefined; - $scope.mediaPickerOverlay.startNodeIsVirtual = $scope.mediaPickerOverlay.startNodeId ? $scope.model.config.startNodeIsVirtual : undefined; - $scope.mediaPickerOverlay.cropSize = $scope.control.editor.config && $scope.control.editor.config.size ? $scope.control.editor.config.size : undefined; - $scope.mediaPickerOverlay.showDetails = true; - $scope.mediaPickerOverlay.disableFolderSelect = true; - $scope.mediaPickerOverlay.onlyImages = true; - $scope.mediaPickerOverlay.show = true; - - $scope.mediaPickerOverlay.submit = function(model) { - var selectedImage = model.selectedImages[0]; - - $scope.control.value = { - focalPoint: selectedImage.focalPoint, - id: selectedImage.id, - udi: selectedImage.udi, - image: selectedImage.image, - altText: selectedImage.altText - }; - - $scope.setUrl(); - - $scope.mediaPickerOverlay.show = false; - $scope.mediaPickerOverlay = null; - }; - - $scope.mediaPickerOverlay.close = function(oldModel) { - $scope.mediaPickerOverlay.show = false; - $scope.mediaPickerOverlay = null; - }; - }; - - $scope.setUrl = function(){ - - if($scope.control.value.image){ - var url = $scope.control.value.image; - - if($scope.control.editor.config && $scope.control.editor.config.size){ - url += "?width=" + $scope.control.editor.config.size.width; - url += "&height=" + $scope.control.editor.config.size.height; - url += "&animationprocessmode=first"; - - if($scope.control.value.focalPoint){ - url += "¢er=" + $scope.control.value.focalPoint.top +"," + $scope.control.value.focalPoint.left; - url += "&mode=crop"; - } - } - - // set default size if no crop present (moved from the view) - if (url.indexOf('?') == -1) - { - url += "?width=800&upscale=false&animationprocessmode=false" - } - $scope.url = url; - } - }; - - $timeout(function(){ - if($scope.control.$initializing){ - $scope.setImage(); - }else if($scope.control.value){ - $scope.setUrl(); - } - }, 200); -}); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/media.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/media.html deleted file mode 100644 index dd35757397..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/media.html +++ /dev/null @@ -1,24 +0,0 @@ -
- -
- -
Click to insert image
-
- -
- - -
- - - - -
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/rte.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/rte.controller.js deleted file mode 100644 index 99c3fd80ff..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/rte.controller.js +++ /dev/null @@ -1,74 +0,0 @@ -(function() { - "use strict"; - - function GridRichTextEditorController($scope, tinyMceService, macroService) { - - var vm = this; - - vm.openLinkPicker = openLinkPicker; - vm.openMediaPicker = openMediaPicker; - vm.openMacroPicker = openMacroPicker; - vm.openEmbed = openEmbed; - - function openLinkPicker(editor, currentTarget, anchorElement) { - vm.linkPickerOverlay = { - view: "linkpicker", - currentTarget: currentTarget, - show: true, - submit: function(model) { - tinyMceService.insertLinkInEditor(editor, model.target, anchorElement); - vm.linkPickerOverlay.show = false; - vm.linkPickerOverlay = null; - } - }; - } - - function openMediaPicker(editor, currentTarget, userData) { - vm.mediaPickerOverlay = { - currentTarget: currentTarget, - onlyImages: true, - showDetails: true, - startNodeId: userData.startMediaIds.length !== 1 ? -1 : userData.startMediaIds[0], - view: "mediapicker", - show: true, - submit: function(model) { - tinyMceService.insertMediaInEditor(editor, model.selectedImages[0]); - vm.mediaPickerOverlay.show = false; - vm.mediaPickerOverlay = null; - } - }; - } - - function openEmbed(editor) { - vm.embedOverlay = { - view: "embed", - show: true, - submit: function(model) { - tinyMceService.insertEmbeddedMediaInEditor(editor, model.embed.preview); - vm.embedOverlay.show = false; - vm.embedOverlay = null; - } - }; - } - - function openMacroPicker(editor, dialogData) { - vm.macroPickerOverlay = { - view: "macropicker", - dialogData: dialogData, - show: true, - submit: function(model) { - var macroObject = macroService.collectValueData(model.selectedMacro, model.macroParams, dialogData.renderingEngine); - tinyMceService.insertMacroInEditor(editor, macroObject, $scope); - vm.macroPickerOverlay.show = false; - vm.macroPickerOverlay = null; - } - }; - } - - - - } - - angular.module("umbraco").controller("Umbraco.PropertyEditors.Grid.RichTextEditorController", GridRichTextEditorController); - -})(); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/rte.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/rte.html deleted file mode 100644 index 7bceed6a60..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/rte.html +++ /dev/null @@ -1,42 +0,0 @@ -
- -
-
- - - - - - - - - - - - - -
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/textstring.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/textstring.controller.js deleted file mode 100644 index 25b387d6be..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/textstring.controller.js +++ /dev/null @@ -1,8 +0,0 @@ -angular.module("umbraco") - .controller("Umbraco.PropertyEditors.Grid.TextStringController", - function ($scope, $rootScope, $timeout, dialogService) { - - - - }); - diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/textstring.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/textstring.html deleted file mode 100644 index 18526b0216..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid2/editors/textstring.html +++ /dev/null @@ -1,9 +0,0 @@ -
- -
diff --git a/src/Umbraco.Web/PropertyEditors/DropDownMultiplePropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/DropDownMultiplePropertyEditor.cs index 43091b547a..8c94d3bd47 100644 --- a/src/Umbraco.Web/PropertyEditors/DropDownMultiplePropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/DropDownMultiplePropertyEditor.cs @@ -14,7 +14,7 @@ namespace Umbraco.Web.PropertyEditors /// Due to maintaining backwards compatibility this data type stores the value as a string which is a comma separated value of the /// ids of the individual items so we have logic in here to deal with that. /// - [DataEditor(Constants.PropertyEditors.Aliases.DropDownListMultiple, "Dropdown list multiple", "dropdown", Group = "lists", Icon="icon-bulleted-list", IsDeprecated = true)] + [DataEditor(Constants.PropertyEditors.Aliases.DropDownListMultiple, "(Obsolete) Dropdown list multiple", "dropdown", Group = "lists", Icon="icon-bulleted-list", IsDeprecated = true)] public class DropDownMultiplePropertyEditor : DropDownMultipleWithKeysPropertyEditor { /// diff --git a/src/Umbraco.Web/PropertyEditors/DropDownMultipleWithKeysPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/DropDownMultipleWithKeysPropertyEditor.cs index 8b0759ea70..831fb3a56a 100644 --- a/src/Umbraco.Web/PropertyEditors/DropDownMultipleWithKeysPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/DropDownMultipleWithKeysPropertyEditor.cs @@ -14,7 +14,7 @@ namespace Umbraco.Web.PropertyEditors /// Due to backwards compatibility, this editor stores the value as a CSV string listing /// the ids of individual items. /// - [DataEditor(Constants.PropertyEditors.Aliases.DropdownlistMultiplePublishKeys, "Dropdown list multiple, publish keys", "dropdown", Group = "lists", Icon = "icon-bulleted-list", IsDeprecated = true)] + [DataEditor(Constants.PropertyEditors.Aliases.DropdownlistMultiplePublishKeys, "(Obsolete) Dropdown list multiple, publish keys", "dropdown", Group = "lists", Icon = "icon-bulleted-list", IsDeprecated = true)] public class DropDownMultipleWithKeysPropertyEditor : DropDownPropertyEditor { private readonly ILocalizedTextService _textService; diff --git a/src/Umbraco.Web/PropertyEditors/DropDownPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/DropDownPropertyEditor.cs index b3d687d196..4603adbf08 100644 --- a/src/Umbraco.Web/PropertyEditors/DropDownPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/DropDownPropertyEditor.cs @@ -18,7 +18,7 @@ namespace Umbraco.Web.PropertyEditors /// as INT and we have logic in here to ensure it is formatted correctly including ensuring that the string value is published /// in cache and not the int ID. /// - [DataEditor(Constants.PropertyEditors.Aliases.DropDownList, "Dropdown list", "dropdown", ValueType = ValueTypes.String, Group = "lists", Icon = "icon-indent", IsDeprecated = true)] + [DataEditor(Constants.PropertyEditors.Aliases.DropDownList, "(Obsolete) Dropdown list", "dropdown", ValueType = ValueTypes.String, Group = "lists", Icon = "icon-indent", IsDeprecated = true)] public class DropDownPropertyEditor : DropDownWithKeysPropertyEditor { /// diff --git a/src/Umbraco.Web/PropertyEditors/DropDownWithKeysPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/DropDownWithKeysPropertyEditor.cs index 2a21860d71..29ea1234f1 100644 --- a/src/Umbraco.Web/PropertyEditors/DropDownWithKeysPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/DropDownWithKeysPropertyEditor.cs @@ -13,7 +13,7 @@ namespace Umbraco.Web.PropertyEditors /// as INT and we have logic in here to ensure it is formatted correctly including ensuring that the INT ID value is published /// in cache and not the string value. /// - [DataEditor(Constants.PropertyEditors.Aliases.DropdownlistPublishKeys, "Dropdown list, publishing keys", "dropdown", ValueType = ValueTypes.Integer, Group = "lists", Icon = "icon-indent", IsDeprecated = true)] + [DataEditor(Constants.PropertyEditors.Aliases.DropdownlistPublishKeys, "(Obsolete) Dropdown list, publishing keys", "dropdown", ValueType = ValueTypes.Integer, Group = "lists", Icon = "icon-indent", IsDeprecated = true)] public class DropDownWithKeysPropertyEditor : DataEditor { private readonly ILocalizedTextService _textService; diff --git a/src/Umbraco.Web/PropertyEditors/Grid2PropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/Grid2PropertyEditor.cs index 791fe8031b..cc39e7af36 100644 --- a/src/Umbraco.Web/PropertyEditors/Grid2PropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/Grid2PropertyEditor.cs @@ -18,91 +18,91 @@ namespace Umbraco.Web.PropertyEditors /// /// Represents a grid property and parameter editor. /// - [DataEditor(Constants.PropertyEditors.Aliases.Grid2, "Grid", "grid", HideLabel = true, ValueType = ValueTypes.Json, Group="rich content", Icon="icon-layout")] + [DataEditor(Constants.PropertyEditors.Aliases.Grid2, "Grid", "grid2", HideLabel = true, ValueType = ValueTypes.Json, Group="rich content", Icon="icon-layout")] public class Grid2PropertyEditor : DataEditor { public Grid2PropertyEditor(ILogger logger) : base(logger) { } - internal void DocumentWriting(object sender, Examine.LuceneEngine.DocumentWritingEventArgs e) - { - foreach (var value in e.ValueSet.Values) - { - //if there is a value, it's a string and it's detected as json - if (value.Value.Count > 0 && value.Value[0] != null && (value.Value[0] is string firstVal) && firstVal.DetectIsJson()) - { - try - { - //TODO: We should deserialize this to Umbraco.Core.Models.GridValue instead of doing the below - var json = JsonConvert.DeserializeObject(firstVal); + //internal void DocumentWriting(object sender, Examine.LuceneEngine.DocumentWritingEventArgs e) + //{ + // foreach (var value in e.ValueSet.Values) + // { + // //if there is a value, it's a string and it's detected as json + // if (value.Value.Count > 0 && value.Value[0] != null && (value.Value[0] is string firstVal) && firstVal.DetectIsJson()) + // { + // try + // { + // //TODO: We should deserialize this to Umbraco.Core.Models.GridValue instead of doing the below + // var json = JsonConvert.DeserializeObject(firstVal); - //check if this is formatted for grid json - if (json.HasValues && json.TryGetValue("name", out _) && json.TryGetValue("sections", out _)) - { - //get all values and put them into a single field (using JsonPath) - var sb = new StringBuilder(); - foreach (var row in json.SelectTokens("$.sections[*].rows[*]")) - { - var rowName = row["name"].Value(); - var areaVals = row.SelectTokens("$.areas[*].controls[*].value"); + // //check if this is formatted for grid json + // if (json.HasValues && json.TryGetValue("name", out _) && json.TryGetValue("sections", out _)) + // { + // //get all values and put them into a single field (using JsonPath) + // var sb = new StringBuilder(); + // foreach (var row in json.SelectTokens("$.sections[*].rows[*]")) + // { + // var rowName = row["name"].Value(); + // var areaVals = row.SelectTokens("$.areas[*].controls[*].value"); - foreach (var areaVal in areaVals) - { - //TODO: If it's not a string, then it's a json formatted value - - // we cannot really index this in a smart way since it could be 'anything' - if (areaVal.Type == JTokenType.String) - { - var str = areaVal.Value(); - str = XmlHelper.CouldItBeXml(str) ? str.StripHtml() : str; - sb.Append(str); - sb.Append(" "); + // foreach (var areaVal in areaVals) + // { + // //TODO: If it's not a string, then it's a json formatted value - + // // we cannot really index this in a smart way since it could be 'anything' + // if (areaVal.Type == JTokenType.String) + // { + // var str = areaVal.Value(); + // str = XmlHelper.CouldItBeXml(str) ? str.StripHtml() : str; + // sb.Append(str); + // sb.Append(" "); - //add the row name as an individual field - e.Document.Add( - new Field( - $"{value.Key}.{rowName}", str, Field.Store.YES, Field.Index.ANALYZED)); - } + // //add the row name as an individual field + // e.Document.Add( + // new Field( + // $"{value.Key}.{rowName}", str, Field.Store.YES, Field.Index.ANALYZED)); + // } - } - } + // } + // } - if (sb.Length > 0) - { - //First save the raw value to a raw field - e.Document.Add( - new Field( - $"{UmbracoExamineIndexer.RawFieldPrefix}{value.Key}", - firstVal, Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS, Field.TermVector.NO)); + // if (sb.Length > 0) + // { + // //First save the raw value to a raw field + // e.Document.Add( + // new Field( + // $"{UmbracoExamineIndexer.RawFieldPrefix}{value.Key}", + // firstVal, Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS, Field.TermVector.NO)); - //now replace the original value with the combined/cleaned value - e.Document.RemoveField(value.Key); - e.Document.Add( - new Field( - value.Key, - sb.ToString(), Field.Store.YES, Field.Index.ANALYZED)); - } - } - } - catch (InvalidCastException) - { - //swallow...on purpose, there's a chance that this isn't the json format we are looking for - // and we don't want that to affect the website. - } - catch (JsonException) - { - //swallow...on purpose, there's a chance that this isn't json and we don't want that to affect - // the website. - } - catch (ArgumentException) - { - //swallow on purpose to prevent this error: - // Can not add Newtonsoft.Json.Linq.JValue to Newtonsoft.Json.Linq.JObject. - } - } + // //now replace the original value with the combined/cleaned value + // e.Document.RemoveField(value.Key); + // e.Document.Add( + // new Field( + // value.Key, + // sb.ToString(), Field.Store.YES, Field.Index.ANALYZED)); + // } + // } + // } + // catch (InvalidCastException) + // { + // //swallow...on purpose, there's a chance that this isn't the json format we are looking for + // // and we don't want that to affect the website. + // } + // catch (JsonException) + // { + // //swallow...on purpose, there's a chance that this isn't json and we don't want that to affect + // // the website. + // } + // catch (ArgumentException) + // { + // //swallow on purpose to prevent this error: + // // Can not add Newtonsoft.Json.Linq.JValue to Newtonsoft.Json.Linq.JObject. + // } + // } - } - } + // } + //} /// /// Overridden to ensure that the value is validated diff --git a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs index 0f3211b743..3b6a691c43 100644 --- a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs @@ -18,7 +18,7 @@ namespace Umbraco.Web.PropertyEditors /// /// Represents a grid property and parameter editor. /// - [DataEditor(Constants.PropertyEditors.Aliases.Grid, "Grid layout", "grid", HideLabel = true, ValueType = ValueTypes.Json, Group="rich content", Icon="icon-layout")] + [DataEditor(Constants.PropertyEditors.Aliases.Grid, "(Obsolete) Grid layout", "grid", HideLabel = true, ValueType = ValueTypes.Json, Group="rich content", Icon="icon-layout", IsDeprecated = true)] public class GridPropertyEditor : DataEditor { public GridPropertyEditor(ILogger logger)