From f94552df5bd2955d83f4368b86b920b5323adf2a Mon Sep 17 00:00:00 2001 From: Steve Crook Date: Thu, 12 Sep 2024 10:17:02 +1000 Subject: [PATCH 1/2] New grid view property migrators --- .../Context/DataTypeMigrationContext.cs | 27 ++++++++ .../Extensions/ContentTypeExtensions.cs | 12 ++-- .../Extensions/DataTypeExtensions.cs | 32 +++++++++ .../Shared/SharedContentTypeBaseHandler.cs | 10 ++- .../Handlers/Shared/SharedDataTypeHandler.cs | 36 ++++++++++ .../Models/NewContentTypeProperty.cs | 9 ++- .../Models/NewDataTypeInfo.cs | 26 ++++++++ ...idToBlockGridConfigLayoutSettingsHelper.cs | 17 +++-- .../GridToBlockGridNameExtensions.cs | 3 + .../BlockGrid/Models/GridModels.cs | 14 +++- .../GridViewPropertyBooleanMigrator.cs | 11 +++- .../GridViewPropertyNumberMigrator.cs | 20 ++++++ ...GridViewPropertyRadioButtonListMigrator.cs | 66 +++++++++++++++++++ .../IGridSettingsViewMigrator.cs | 4 +- 14 files changed, 272 insertions(+), 15 deletions(-) create mode 100644 uSync.Migrations.Core/Extensions/DataTypeExtensions.cs create mode 100644 uSync.Migrations.Core/Models/NewDataTypeInfo.cs create mode 100644 uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyNumberMigrator.cs create mode 100644 uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyRadioButtonListMigrator.cs diff --git a/uSync.Migrations.Core/Context/DataTypeMigrationContext.cs b/uSync.Migrations.Core/Context/DataTypeMigrationContext.cs index afbbbeb9..8bf1bc1a 100644 --- a/uSync.Migrations.Core/Context/DataTypeMigrationContext.cs +++ b/uSync.Migrations.Core/Context/DataTypeMigrationContext.cs @@ -30,6 +30,9 @@ public class DataTypeMigrationContext /// private Dictionary _dataTypeAliases { get; set; } = new(); + private Dictionary _newDataTypes + = new Dictionary(StringComparer.OrdinalIgnoreCase); + /// /// add a datatype alias to the lookup /// @@ -88,6 +91,30 @@ public string GetVariation(Guid guid, string defaultValue) => _dataTypeVariations?.TryGetValue(guid, out var variation) == true ? variation : defaultValue; + /// + /// add a new data type - will then be processed as part of the + /// migration process. + /// + public void AddNewDataType(NewDataTypeInfo newDataType) + { + if (!_newDataTypes.ContainsKey(newDataType.Alias)) + _newDataTypes.Add(newDataType.Alias, newDataType); + } + + /// + /// list of all the new data types to be created. + /// + /// + public IList GetNewDataTypes() + => _newDataTypes.Values.ToList(); + + /// + /// get new datatype by alias + /// + /// + public NewDataTypeInfo? GetNewDataType(string alias) + => _newDataTypes.Values.FirstOrDefault(dt => dt.Alias == alias); + /// /// return the first definition that we find matching the editorAlias /// diff --git a/uSync.Migrations.Core/Extensions/ContentTypeExtensions.cs b/uSync.Migrations.Core/Extensions/ContentTypeExtensions.cs index 6054523c..80164a82 100644 --- a/uSync.Migrations.Core/Extensions/ContentTypeExtensions.cs +++ b/uSync.Migrations.Core/Extensions/ContentTypeExtensions.cs @@ -41,17 +41,21 @@ public static XElement MakeXMLFromNewDocType(this NewContentTypeInfo newDocType, index++; var dataType = dataTypeService.GetDataType(property.DataTypeAlias); - if (dataType == null) continue; + var newDataType = dataType == null ? + context.DataTypes.GetNewDataType(property.DataTypeAlias) : + null; + + if (dataType == null && newDataType == null) continue; var propNode = new XElement("GenericProperty", new XElement("Key", $"{newDocType.Alias}_{property.Alias}".ToGuid()), new XElement("Name", property.Name), new XElement("Alias", property.Alias), - new XElement("Definition", dataType.Key), - new XElement("Type", dataType.EditorAlias), + new XElement("Definition", dataType == null ? newDataType!.Key : dataType.Key), + new XElement("Type", dataType == null ? newDataType!.EditorAlias : dataType.EditorAlias), new XElement("Mandatory", false), new XElement("Validation", ""), - new XElement("Description", new XCData("")), + new XElement("Description", new XCData(property.Description ?? "")), new XElement("SortOrder", index), GetTabElement(property, newDocType), new XElement("Variations", "Nothing"), diff --git a/uSync.Migrations.Core/Extensions/DataTypeExtensions.cs b/uSync.Migrations.Core/Extensions/DataTypeExtensions.cs new file mode 100644 index 00000000..7bbc3bf9 --- /dev/null +++ b/uSync.Migrations.Core/Extensions/DataTypeExtensions.cs @@ -0,0 +1,32 @@ +using Newtonsoft.Json; +using System.Xml.Linq; +using Umbraco.Extensions; + +using uSync.Core; +using uSync.Migrations.Core.Context; +using uSync.Migrations.Core.Models; + +namespace uSync.Migrations.Core.Extensions; +internal static class DataTypeExtensions +{ + public static XElement MakeXMLFromNewDataType(this NewDataTypeInfo newDataType, + JsonSerializerSettings _jsonSerializerSettings) + { + var source = new XElement("DataType", + new XAttribute(uSyncConstants.Xml.Key, newDataType.Alias.ToGuid()), + new XAttribute(uSyncConstants.Xml.Alias, newDataType.Alias), + new XAttribute(uSyncConstants.Xml.Level, 1), + new XElement(uSyncConstants.Xml.Info, + new XElement(uSyncConstants.Xml.Name, newDataType.Name), + new XElement("EditorAlias", newDataType.EditorAlias), + new XElement("DatabaseType", newDataType.DatabaseType))); + + if (newDataType.Config != null) + { + source.Add(new XElement("Config", + new XCData(JsonConvert.SerializeObject(newDataType.Config, _jsonSerializerSettings)))); + } + + return source; + } +} diff --git a/uSync.Migrations.Core/Handlers/Shared/SharedContentTypeBaseHandler.cs b/uSync.Migrations.Core/Handlers/Shared/SharedContentTypeBaseHandler.cs index 43875098..e1393f28 100644 --- a/uSync.Migrations.Core/Handlers/Shared/SharedContentTypeBaseHandler.cs +++ b/uSync.Migrations.Core/Handlers/Shared/SharedContentTypeBaseHandler.cs @@ -316,11 +316,17 @@ private void AddAdditionaProperties(NewContentTypeInfo contentType, SyncMigratio foreach (var property in contentType.Properties) { var dataType = _dataTypeService.GetDataType(property.DataTypeAlias); + var newDataType = dataType == null ? + context.DataTypes.GetNewDataType(property.DataTypeAlias) : + null; - if (dataType != null) + if (dataType != null || newDataType != null) { + var editorAlias = dataType == null ? newDataType!.EditorAlias : dataType.EditorAlias; + var key = dataType == null ? newDataType!.Key : dataType.Key; + context.ContentTypes.AddProperty(contentType.Alias, property.Alias, - property.OriginalEditorAlias ?? dataType.EditorAlias, dataType.EditorAlias, dataType.Key); + property.OriginalEditorAlias ?? editorAlias, editorAlias, key); } } } diff --git a/uSync.Migrations.Core/Handlers/Shared/SharedDataTypeHandler.cs b/uSync.Migrations.Core/Handlers/Shared/SharedDataTypeHandler.cs index 4e31ff73..76ace6c4 100644 --- a/uSync.Migrations.Core/Handlers/Shared/SharedDataTypeHandler.cs +++ b/uSync.Migrations.Core/Handlers/Shared/SharedDataTypeHandler.cs @@ -10,8 +10,10 @@ using uSync.Core; using uSync.Migrations.Core.Context; +using uSync.Migrations.Core.Extensions; using uSync.Migrations.Core.Migrators; using uSync.Migrations.Core.Migrators.Models; +using uSync.Migrations.Core.Models; using uSync.Migrations.Core.Serialization; using uSync.Migrations.Core.Services; @@ -195,4 +197,38 @@ protected virtual XElement MakeMigratedXml( return target; } + /// + /// hook into the DoMigration loop so we can add additional datatypes + /// + /// + /// + protected override IEnumerable PostDoMigration(SyncMigrationContext context) + { + var messages = new List(); + messages.AddRange(base.PostDoMigration(context)); + messages.AddRange(CreateAdditional(context)); + return messages; + } + + /// + /// Add additional data types that might have been added by datatypes during the + /// first part of the migration (i.e BlockGrid conversion) + /// + /// + /// + protected IEnumerable CreateAdditional(SyncMigrationContext context) + { + var messages = new List(); + + foreach (var dataType in context.DataTypes.GetNewDataTypes()) + { + // if this has been blocked don't add it. + if (context.IsBlocked(ItemType, dataType.Alias)) continue; + + var source = dataType.MakeXMLFromNewDataType(_jsonSerializerSettings); + messages.Add(SaveTargetXml(context.Metadata.MigrationId, source)); + } + return messages; + } + } diff --git a/uSync.Migrations.Core/Models/NewContentTypeProperty.cs b/uSync.Migrations.Core/Models/NewContentTypeProperty.cs index b3afcd09..45430ab0 100644 --- a/uSync.Migrations.Core/Models/NewContentTypeProperty.cs +++ b/uSync.Migrations.Core/Models/NewContentTypeProperty.cs @@ -9,16 +9,23 @@ public NewContentTypeProperty(string name, string alias, string dataTypeAlias) DataTypeAlias = dataTypeAlias ?? throw new ArgumentNullException(nameof(dataTypeAlias)); } - public NewContentTypeProperty(string name, string alias, string dataTypeAlias, string orginalEditorAlias) + public NewContentTypeProperty(string name, string alias, string dataTypeAlias, string? orginalEditorAlias) : this(name, alias, dataTypeAlias) { OriginalEditorAlias = orginalEditorAlias; } + public NewContentTypeProperty(string name, string alias, string dataTypeAlias, string? orginalEditorAlias, string? description) + : this(name, alias, dataTypeAlias, orginalEditorAlias) + { + Description = description; + } + public string Name { get; set; } public string Alias { get; set; } public string DataTypeAlias { get; set; } + public string? Description { get; set; } public string? OriginalEditorAlias { get; set; } public string TabAlias { get; set; } = "block"; diff --git a/uSync.Migrations.Core/Models/NewDataTypeInfo.cs b/uSync.Migrations.Core/Models/NewDataTypeInfo.cs new file mode 100644 index 00000000..a583a039 --- /dev/null +++ b/uSync.Migrations.Core/Models/NewDataTypeInfo.cs @@ -0,0 +1,26 @@ +namespace uSync.Migrations.Core.Models; + +public class NewDataTypeInfo +{ + public NewDataTypeInfo(Guid key, string alias, string name, string editorAlias, string databaseType, object? config) + { + Key = key; + Alias = alias ?? throw new ArgumentNullException(nameof(alias)); + Name = name ?? throw new ArgumentNullException(nameof(name)); + EditorAlias = editorAlias ?? throw new ArgumentNullException(nameof(editorAlias)); + DatabaseType = databaseType ?? throw new ArgumentNullException(nameof(databaseType)); + Config = config; + } + + public Guid Key { get; set; } = Guid.Empty; + + public string Alias { get; set; } + + public string Name { get; set; } + + public string EditorAlias { get; set; } + + public string DatabaseType { get; set; } + + public object? Config { get; set; } +} \ No newline at end of file diff --git a/uSync.Migrations.Migrators/BlockGrid/Config/GridToBlockGridConfigLayoutSettingsHelper.cs b/uSync.Migrations.Migrators/BlockGrid/Config/GridToBlockGridConfigLayoutSettingsHelper.cs index c36a9340..e4bd2e9e 100644 --- a/uSync.Migrations.Migrators/BlockGrid/Config/GridToBlockGridConfigLayoutSettingsHelper.cs +++ b/uSync.Migrations.Migrators/BlockGrid/Config/GridToBlockGridConfigLayoutSettingsHelper.cs @@ -61,20 +61,29 @@ private void AddGridLayoutSettings(IEnumerable gr return null; } var gridSettingPropertyMigrator = _gridSettingsViewMigrators.GetMigrator(configItem.View); - var dataTypeAlias = gridSettingPropertyMigrator is not null && !gridSettingPropertyMigrator.NewDataTypeAlias.IsNullOrWhiteSpace() - ? gridSettingPropertyMigrator.NewDataTypeAlias + string? migratorDataTypeAlias = gridSettingPropertyMigrator?.GetNewDataTypeAlias(gridAlias, configItem.Label); + + var dataTypeAlias = !migratorDataTypeAlias.IsNullOrWhiteSpace() + ? migratorDataTypeAlias : configItem.View; if (dataTypeAlias.IsNullOrWhiteSpace() == true) { _logger.LogError("No view defined for grid layout configuration in {alias}", gridAlias); return null; } - return new NewContentTypeProperty(configItem.Label ?? contentTypeAlias, contentTypeAlias, dataTypeAlias); + + var additionalDataType = gridSettingPropertyMigrator?.GetAdditionalDataType(dataTypeAlias, configItem.Prevalues?.Select(v => v.Label!)); + if (additionalDataType != null) + { + context.DataTypes.AddNewDataType(additionalDataType); + } + + return new NewContentTypeProperty(configItem.Label ?? contentTypeAlias, contentTypeAlias, dataTypeAlias, orginalEditorAlias: null, configItem.Description); }).WhereNotNull(); var alias = _conventions.LayoutSettingsContentTypeAlias(gridAlias); - context.ContentTypes.AddNewContentType(new NewContentTypeInfo(alias.ToGuid(), alias, alias, "icon-book color-red", "BlockGrid/settings") + context.ContentTypes.AddNewContentType(new NewContentTypeInfo(alias.ToGuid(), alias, alias, "icon-book color-red", "BlockGrid/Settings") { Description = alias, IsElement = true, diff --git a/uSync.Migrations.Migrators/BlockGrid/Extensions/GridToBlockGridNameExtensions.cs b/uSync.Migrations.Migrators/BlockGrid/Extensions/GridToBlockGridNameExtensions.cs index f3d6f375..a6712729 100644 --- a/uSync.Migrations.Migrators/BlockGrid/Extensions/GridToBlockGridNameExtensions.cs +++ b/uSync.Migrations.Migrators/BlockGrid/Extensions/GridToBlockGridNameExtensions.cs @@ -33,4 +33,7 @@ public static Guid GetContentTypeKeyOrDefault(this SyncMigrationContext context, public static string GetBlockGridLayoutSettingsContentTypeAlias(this string name, IShortStringHelper shortStringHelper) => name.GetContentTypeAlias("BlockGridLayoutSettings_", shortStringHelper); + public static string GetBlockGridLayoutAreaSettingsContentTypeAlias(this string name, IShortStringHelper shortStringHelper) + => name.GetContentTypeAlias("BlockGridLayoutAreaSettings_", shortStringHelper); + } diff --git a/uSync.Migrations.Migrators/BlockGrid/Models/GridModels.cs b/uSync.Migrations.Migrators/BlockGrid/Models/GridModels.cs index 0e6996aa..002a5d2d 100644 --- a/uSync.Migrations.Migrators/BlockGrid/Models/GridModels.cs +++ b/uSync.Migrations.Migrators/BlockGrid/Models/GridModels.cs @@ -60,7 +60,7 @@ internal class GridSettingsConfiguration GridSettingsConfigurationItem[]? ConfigItems { get; set; } } -internal class GridSettingsConfigurationItem +public class GridSettingsConfigurationItem { [JsonProperty("label")] public string? Label { get; set; } @@ -79,6 +79,18 @@ internal class GridSettingsConfigurationItem [JsonProperty("applyTo")] public string? ApplyTo { get; set; } + + [JsonProperty("prevalues")] + public IEnumerable? Prevalues { get; set; } + +} +public class GridSettingsConfigurationItemPrevalue +{ + [JsonProperty("label")] + public string? Label { get; set; } + + [JsonProperty("value")] + public string? Value { get; set; } } /// /// contains the data for a block (content and settings) diff --git a/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyBooleanMigrator.cs b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyBooleanMigrator.cs index 49348f35..8554a8e3 100644 --- a/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyBooleanMigrator.cs +++ b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyBooleanMigrator.cs @@ -1,13 +1,20 @@ -namespace uSync.Migrations.Migrators.BlockGrid.SettingsMigrators; +using uSync.Migrations.Migrators.BlockGrid.Models; + +namespace uSync.Migrations.Migrators.BlockGrid.SettingsMigrators; public class GridViewPropertyBooleanMigrator : IGridSettingsViewMigrator { public string ViewKey => "Boolean"; - public string NewDataTypeAlias => "True/false"; + public string GetNewDataTypeAlias(string gridAlias, string? configItemLabel) => "True/false"; public object ConvertContentString(string value) { return value; } + + public NewDataTypeInfo? GetAdditionalDataType(string dataTypeAlias, IEnumerable? preValues) + { + return null; + } } \ No newline at end of file diff --git a/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyNumberMigrator.cs b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyNumberMigrator.cs new file mode 100644 index 00000000..3cba61bf --- /dev/null +++ b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyNumberMigrator.cs @@ -0,0 +1,20 @@ +using uSync.Migrations.Migrators.BlockGrid.Models; + +namespace uSync.Migrations.Migrators.BlockGrid.SettingsMigrators; + +public class GridViewPropertyNumberMigrator : IGridSettingsViewMigrator +{ + public string ViewKey => "Number"; + + public string GetNewDataTypeAlias(string gridAlias, string? configItemLabel) => "Numeric"; + + public object ConvertContentString(string value) + { + return value; + } + + public NewDataTypeInfo? GetAdditionalDataType(string dataTypeAlias, IEnumerable? preValues) + { + return null; + } +} \ No newline at end of file diff --git a/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyRadioButtonListMigrator.cs b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyRadioButtonListMigrator.cs new file mode 100644 index 00000000..02eef547 --- /dev/null +++ b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyRadioButtonListMigrator.cs @@ -0,0 +1,66 @@ +using Newtonsoft.Json; +using Umbraco.Cms.Core.Models; +using Umbraco.Extensions; + +namespace uSync.Migrations.Migrators.BlockGrid.SettingsMigrators; + +public class GridViewPropertyRadioButtonListMigrator : IGridSettingsViewMigrator +{ + public string ViewKey => "RadioButtonList"; + + public string GetNewDataTypeAlias(string gridAlias, string? configItemLabel) + { + string newDataTypeAlias = gridAlias; + if (!string.IsNullOrEmpty(configItemLabel)) + { + newDataTypeAlias += " - " + configItemLabel; + } + newDataTypeAlias += " - Radio Button List"; + + return newDataTypeAlias; + } + + + public object ConvertContentString(string value) + { + return value; + } + + public NewDataTypeInfo? GetAdditionalDataType(string dataTypeAlias, IEnumerable? preValues) + { + if (preValues is null) + { + return null; + } + + NewDataTypeInfo newDataTypeInfo = + new NewDataTypeInfo(dataTypeAlias.ToGuid(), + dataTypeAlias, + dataTypeAlias, + "Umbraco.RadioButtonList", + nameof(ValueStorageType.Nvarchar), + new RadioButtonListConfig(preValues)); + + return newDataTypeInfo; + } +} + +public class RadioButtonListConfig +{ + public RadioButtonListConfig(IEnumerable preValues) + { + Items = preValues.Select((value, ix) => new RadioButtonListConfigItem() { Id = ix, Value = value }); + } + + [JsonProperty("items")] + public IEnumerable Items { get; set; } +} + +public class RadioButtonListConfigItem +{ + [JsonProperty("id")] + public int Id { get; set; } + + [JsonProperty("value")] + public string? Value { get; set; } +} \ No newline at end of file diff --git a/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/IGridSettingsViewMigrator.cs b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/IGridSettingsViewMigrator.cs index 1296ac58..2b7b7a2a 100644 --- a/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/IGridSettingsViewMigrator.cs +++ b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/IGridSettingsViewMigrator.cs @@ -6,8 +6,10 @@ namespace uSync.Migrations.Migrators.BlockGrid.SettingsMigrators; public interface IGridSettingsViewMigrator : IDiscoverable { string ViewKey { get; } - string NewDataTypeAlias { get; } + string GetNewDataTypeAlias(string gridAlias, string? configItemLabel); public object ConvertContentString(string value); + + public NewDataTypeInfo? GetAdditionalDataType(string dataTypeAlias, IEnumerable? preValues); } public class GridSettingsViewMigratorCollectionBuilder From a88486b72edf9acb46aea7be73e59d98b45ef839 Mon Sep 17 00:00:00 2001 From: Steve Crook Date: Wed, 9 Oct 2024 15:29:59 +1100 Subject: [PATCH 2/2] Add column settings from grid to block grid --- .../GridToBlockGridConfigLayoutBlockHelper.cs | 54 ++++- ...idToBlockGridConfigLayoutSettingsHelper.cs | 19 +- .../Content/GridToBlockContentHelper.cs | 190 +++++++++++++++--- .../BlockGrid/Extensions/GridConventions.cs | 6 + .../GridToBlockGridNameExtensions.cs | 2 +- .../BlockGrid/GridToBlockGridMigrator.cs | 11 +- .../GridViewPropertyBooleanMigrator.cs | 2 +- .../GridViewPropertyImageMigrator.cs | 20 ++ .../GridViewPropertyNumberMigrator.cs | 2 +- ...GridViewPropertyRadioButtonListMigrator.cs | 10 +- .../IGridSettingsViewMigrator.cs | 3 +- 11 files changed, 271 insertions(+), 48 deletions(-) create mode 100644 uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyImageMigrator.cs diff --git a/uSync.Migrations.Migrators/BlockGrid/Config/GridToBlockGridConfigLayoutBlockHelper.cs b/uSync.Migrations.Migrators/BlockGrid/Config/GridToBlockGridConfigLayoutBlockHelper.cs index 408a5054..52677839 100644 --- a/uSync.Migrations.Migrators/BlockGrid/Config/GridToBlockGridConfigLayoutBlockHelper.cs +++ b/uSync.Migrations.Migrators/BlockGrid/Config/GridToBlockGridConfigLayoutBlockHelper.cs @@ -26,7 +26,7 @@ public GridToBlockGridConfigLayoutBlockHelper( _logger = logger; } - public void AddLayoutBlocks(GridToBlockGridConfigContext gridBlockContext, SyncMigrationContext context, string dataTypeAlias) + public void AddLayoutBlocks(GridToBlockGridConfigContext gridBlockContext, SyncMigrationContext context, string dataTypeAlias, bool addAreaSettingsLayout = false) { // gather all the layout blocks we can from the templates // and layouts sections of the config. @@ -34,6 +34,12 @@ public void AddLayoutBlocks(GridToBlockGridConfigContext gridBlockContext, SyncM GetLayoutLayouts(gridBlockContext.GridConfiguration.GetItemBlock("layouts"), gridBlockContext, context, dataTypeAlias); + if (addAreaSettingsLayout) + { + // Add a single layout to serve as a container for areas with settings + GetSettingsContainerLayout(gridBlockContext, context, dataTypeAlias); + } + AddContentTypesForLayoutBlocks(gridBlockContext, context); } @@ -207,6 +213,52 @@ private void GetLayoutLayouts(JToken? layouts, GridToBlockGridConfigContext grid } + private void GetSettingsContainerLayout(GridToBlockGridConfigContext gridBlockContext, SyncMigrationContext context, string dataTypeAlias) + { + var rowAreas = new List(); + + var allowed = new List { "*" }; + + var label = _conventions.SettingsContainerLayoutBlockLabel; + var alias = label; + + var area = new BlockGridConfiguration.BlockGridAreaConfiguration + { + Alias = _conventions.AreaAlias(0), + ColumnSpan = gridBlockContext.GridColumns, + RowSpan = 1, + Key = alias.ToGuid() + }; + + rowAreas.Add(area); + + gridBlockContext.AllowedEditors[area] = allowed; + + var contentTypeAlias = alias; + var settingsContentTypeAlias = _conventions.LayoutAreaSettingsContentTypeAlias(dataTypeAlias); + + var layoutBlock = new BlockGridConfiguration.BlockGridBlockConfiguration + { + Label = label, + Areas = rowAreas.ToArray(), + ContentElementTypeKey = context.GetContentTypeKeyOrDefault(contentTypeAlias, contentTypeAlias.ToGuid()), + SettingsElementTypeKey = context.GetContentTypeKeyOrDefault(settingsContentTypeAlias, settingsContentTypeAlias.ToGuid()), + GroupKey = gridBlockContext.LayoutsGroup.Key.ToString(), + BackgroundColor = Grid.LayoutBlocks.Background, + IconColor = Grid.LayoutBlocks.Icon, + AllowAtRoot = false, + AllowInAreas = true + }; + + gridBlockContext.LayoutBlocks.TryAdd(contentTypeAlias, layoutBlock); + + context.ContentTypes.AddNewContentType(new NewContentTypeInfo(layoutBlock.ContentElementTypeKey, contentTypeAlias, contentTypeAlias, "icon-layout color-purple", folder: "BlockGrid/Layouts") + { + Description = "Grid Layoutblock", + IsElement = true + }); + } + private void AddContentTypesForLayoutBlocks(GridToBlockGridConfigContext gridBlockContext, SyncMigrationContext context) { var rootAllowed = gridBlockContext.GetRootAllowedLayouts(); diff --git a/uSync.Migrations.Migrators/BlockGrid/Config/GridToBlockGridConfigLayoutSettingsHelper.cs b/uSync.Migrations.Migrators/BlockGrid/Config/GridToBlockGridConfigLayoutSettingsHelper.cs index e4bd2e9e..ad765966 100644 --- a/uSync.Migrations.Migrators/BlockGrid/Config/GridToBlockGridConfigLayoutSettingsHelper.cs +++ b/uSync.Migrations.Migrators/BlockGrid/Config/GridToBlockGridConfigLayoutSettingsHelper.cs @@ -16,6 +16,7 @@ internal class GridToBlockGridConfigLayoutSettingsHelper private readonly GridSettingsViewMigratorCollection _gridSettingsViewMigrators; private readonly ILogger _logger; + public bool AnyAreaSettings { get; set; } = false; public GridToBlockGridConfigLayoutSettingsHelper( GridConventions conventions, @@ -33,11 +34,15 @@ public void AddGridSettings(GridToBlockGridConfigContext gridBlockContext, SyncM var gridStyles = GetGridSettingsFromConfig(gridBlockContext.GridConfiguration?.GetItemBlock("styles")); - // Take only the settings that have applyTo = row. Other value here could be cell. - // TODO: Implement cell settings converter. - var gridSettings = gridConfig.Concat(gridStyles).Where(s => s.ApplyTo != "cell"); + var gridRowSettings = gridConfig.Concat(gridStyles).Where(s => s.ApplyTo != "cell"); - AddGridLayoutSettings(gridSettings, gridBlockContext, context, gridAlias); + AddGridLayoutSettings(gridRowSettings, gridBlockContext, context, gridAlias, isArea: false); + + var gridAreaSettings = gridConfig.Concat(gridStyles).Where(s => s.ApplyTo != "row"); + + AnyAreaSettings = gridAreaSettings.Any(); + + AddGridLayoutSettings(gridAreaSettings, gridBlockContext, context, gridAlias, isArea: true); } private IEnumerable GetGridSettingsFromConfig(JToken? config) @@ -50,7 +55,7 @@ private IEnumerable GetGridSettingsFromConfig(JTo return config.ToObject>() ?? Enumerable.Empty(); } - private void AddGridLayoutSettings(IEnumerable gridLayoutConfigurations, GridToBlockGridConfigContext gridBlockContext, SyncMigrationContext context, string gridAlias) + private void AddGridLayoutSettings(IEnumerable gridLayoutConfigurations, GridToBlockGridConfigContext gridBlockContext, SyncMigrationContext context, string gridAlias, bool isArea = false) { var contentTypeProperties = gridLayoutConfigurations.Where(configItem => configItem.Key is not null).Select(configItem => { @@ -72,7 +77,7 @@ private void AddGridLayoutSettings(IEnumerable gr return null; } - var additionalDataType = gridSettingPropertyMigrator?.GetAdditionalDataType(dataTypeAlias, configItem.Prevalues?.Select(v => v.Label!)); + var additionalDataType = gridSettingPropertyMigrator?.GetAdditionalDataType(dataTypeAlias, configItem.Prevalues); if (additionalDataType != null) { context.DataTypes.AddNewDataType(additionalDataType); @@ -81,7 +86,7 @@ private void AddGridLayoutSettings(IEnumerable gr return new NewContentTypeProperty(configItem.Label ?? contentTypeAlias, contentTypeAlias, dataTypeAlias, orginalEditorAlias: null, configItem.Description); }).WhereNotNull(); - var alias = _conventions.LayoutSettingsContentTypeAlias(gridAlias); + var alias = isArea ? _conventions.LayoutAreaSettingsContentTypeAlias(gridAlias) : _conventions.LayoutSettingsContentTypeAlias(gridAlias); context.ContentTypes.AddNewContentType(new NewContentTypeInfo(alias.ToGuid(), alias, alias, "icon-book color-red", "BlockGrid/Settings") { diff --git a/uSync.Migrations.Migrators/BlockGrid/Content/GridToBlockContentHelper.cs b/uSync.Migrations.Migrators/BlockGrid/Content/GridToBlockContentHelper.cs index 911efcd3..c88d85d8 100644 --- a/uSync.Migrations.Migrators/BlockGrid/Content/GridToBlockContentHelper.cs +++ b/uSync.Migrations.Migrators/BlockGrid/Content/GridToBlockContentHelper.cs @@ -2,16 +2,18 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; - +using System.Text.RegularExpressions; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Logging; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Blocks; +using Umbraco.Cms.Core.Services; using Umbraco.Extensions; using uSync.Migrations.Migrators.BlockGrid.BlockMigrators; using uSync.Migrations.Migrators.BlockGrid.Extensions; using uSync.Migrations.Migrators.BlockGrid.Models; +using uSync.Migrations.Migrators.BlockGrid.SettingsMigrators; namespace uSync.Migrations.Migrators.BlockGrid.Content; @@ -24,17 +26,20 @@ internal class GridToBlockContentHelper private readonly GridConventions _conventions; private readonly ILogger _logger; private readonly IProfilingLogger _profilingLogger; + private readonly IMediaService _mediaService; public GridToBlockContentHelper( GridConventions gridConventions, SyncBlockMigratorCollection blockMigrators, ILogger logger, - IProfilingLogger profilingLogger) + IProfilingLogger profilingLogger, + IMediaService mediaService) { _blockMigrators = blockMigrators; _conventions = gridConventions; _logger = logger; _profilingLogger = profilingLogger; + _mediaService = mediaService; } /// @@ -104,14 +109,16 @@ public GridToBlockContentHelper( var areaIsFullWidth = rowIsFullWidth && area.value.Grid.GetIntOrDefault(0) == gridColumns; // get the content - var contentAndSettings = GetGridAreaBlockContent(area.value, context).ToList(); - if (!contentAndSettings.Any()) continue; + var content = GetGridAreaBlockContent(area.value, context).ToList(); + if (!content.Any()) continue; + + var settings = GetSettingsBlockItemDataFromArea(area.value, context, dataTypeAlias); // get the layouts - var layouts = GetGridAreaBlockLayouts(area.value, contentAndSettings).ToList(); + var layouts = GetGridAreaBlockLayouts(area.value, content).ToList(); if (!layouts.Any()) continue; - if (areaIsFullWidth) + if (settings is null && areaIsFullWidth) { blockLayouts.AddRange(layouts); } @@ -123,18 +130,49 @@ public GridToBlockContentHelper( Items = layouts.ToArray() }; + if (settings is not null) + { + // create a container that we can add the settings to, put the content in the container, and put the container in areaItem + + var childAreaItem = new BlockGridLayoutAreaItem + { + Key = _conventions.SettingsContainerLayoutBlockLabel.ToGuid(), + Items = layouts.ToArray() + }; + + var settingsContainerLayoutItem = new BlockGridLayoutItem() + { + ContentUdi = settings.Udi, + ColumnSpan = gridColumns, + RowSpan = 1, + SettingsUdi = settings.Udi, + Areas = new BlockGridLayoutAreaItem[] { childAreaItem } + }; + + var childContentData = new BlockItemData + { + Udi = settings.Udi, + ContentTypeKey = _conventions.SettingsContainerLayoutBlockLabel.ToGuid(), + }; + + content.Add(childContentData); + + areaItem.Items = new BlockGridLayoutItem[] { settingsContainerLayoutItem }; + } + rowLayoutAreas.Add(areaItem); } - // add the content and settings to the block. - contentAndSettings.ForEach(x => + // add the content to the block. + content.ForEach(x => { - block.ContentData.Add(x.Content); - if (x.Settings != null) - { - block.SettingsData.Add(x.Settings); - } + block.ContentData.Add(x); }); + + if (settings is not null) + { + block.SettingsData.Add(settings); + } } // row @@ -181,28 +219,70 @@ public GridToBlockContentHelper( return block; } - private IEnumerable GetGridAreaBlockContent(GridValue.GridArea area, SyncMigrationContext context) + private IEnumerable GetGridAreaBlockContent(GridValue.GridArea area, SyncMigrationContext context) { foreach (var control in area.Controls) { var content = GetBlockItemDataFromGridControl(control, context); if (content == null) continue; - BlockItemData? settings = null; - // TODO Settings ? + yield return content; + } + } - yield return new BlockContentPair(content, settings); + private BlockItemData? GetSettingsBlockItemDataFromArea(GridValue.GridArea area, SyncMigrationContext context, string dataTypeAlias) + { + if (dataTypeAlias.IsNullOrWhiteSpace()) + { + return null; } + + if ((area.Config is null || area.Config.Count() == 0) && + (area.Styles is null || area.Styles.Count() == 0)) + { + // avoid adding a settings container if there aren't any settings + return null; + } + + var settingsValues = new Dictionary(); + + var areaLayoutSettingsContentTypeAlias = _conventions.LayoutAreaSettingsContentTypeAlias(dataTypeAlias); + var areaSettingsContentTypeKey = context.GetContentTypeKeyOrDefault(areaLayoutSettingsContentTypeAlias, areaLayoutSettingsContentTypeAlias.ToGuid()); + var areaSettingsContentType = context.ContentTypes.GetNewContentTypes().FirstOrDefault(t => t.Alias == areaLayoutSettingsContentTypeAlias); + + if (area.Config is not null) + { + foreach (JProperty config in area.Config) + { + AddPropertyValue(context, areaSettingsContentType, settingsValues, config); + } + } + + if (area.Styles is not null) + { + foreach (JProperty style in area.Styles) + { + AddPropertyValue(context, areaSettingsContentType, settingsValues, style); + } + } + + return new BlockItemData + { + Udi = Udi.Create(UmbConstants.UdiEntityType.Element, Guid.NewGuid()), + ContentTypeKey = areaSettingsContentTypeKey, + ContentTypeAlias = areaLayoutSettingsContentTypeAlias, + RawPropertyValues = settingsValues + }; } - private IEnumerable GetGridAreaBlockLayouts(GridValue.GridArea area, IEnumerable contentAndSettings) + private IEnumerable GetGridAreaBlockLayouts(GridValue.GridArea area, IEnumerable content) { - foreach (var item in contentAndSettings) + foreach (var item in content) { var layout = new BlockGridLayoutItem { - ContentUdi = item.Content.Udi, - SettingsUdi = item.Settings?.Udi, + ContentUdi = item.Udi, + SettingsUdi = null, ColumnSpan = area.Grid.GetIntOrDefault(0), RowSpan = 1 }; @@ -238,12 +318,13 @@ private BlockContentPair GetGridRowBlockContentAndSettings(GridValue.GridRow row var rowLayoutSettingsContentTypeAlias = _conventions.LayoutSettingsContentTypeAlias(dataTypeAlias); var rowSettingsContentTypeKey = context.GetContentTypeKeyOrDefault(rowLayoutSettingsContentTypeAlias, rowLayoutSettingsContentTypeAlias.ToGuid()); + var rowSettingsContentType = context.ContentTypes.GetNewContentTypes().FirstOrDefault(t => t.Alias == rowLayoutSettingsContentTypeAlias); if (row.Config is not null) { foreach (JProperty config in row.Config) { - settingsValues.Add(_conventions.FormatGridSettingKey(config.Name), config.Value); + AddPropertyValue(context, rowSettingsContentType, settingsValues, config); } } @@ -251,13 +332,7 @@ private BlockContentPair GetGridRowBlockContentAndSettings(GridValue.GridRow row { foreach (JProperty style in row.Styles) { - // Dont overwrite values. If styles have same settings keys as config, what should happen? - // TODO: Figure out what to do here / what gets priority?## - var formattedKey = _conventions.FormatGridSettingKey(style.Name); - if (!settingsValues.ContainsKey(formattedKey)) - { - settingsValues.Add(formattedKey, style.Value); - } + AddPropertyValue(context, rowSettingsContentType, settingsValues, style); } } @@ -269,6 +344,62 @@ private BlockContentPair GetGridRowBlockContentAndSettings(GridValue.GridRow row RawPropertyValues = settingsValues }; } + + private void AddPropertyValue(SyncMigrationContext context, NewContentTypeInfo? rowSettingsContentType, Dictionary settingsValues, JProperty config) + { + var formattedKey = _conventions.FormatGridSettingKey(config.Name); + + if (settingsValues.ContainsKey(formattedKey)) + { + // Dont overwrite values. If styles have same settings keys as config, what should happen? + // TODO: Figure out what to do here / what gets priority?## + return; + } + + var configValue = config.Value; + + // For radio button list data types, replace the value with the label, since Umbraco radio button lists don't have separate labels and values. + // The new value (the old label) will need to be translated to the old value in the presentation code. + if (rowSettingsContentType != null) + { + var property = rowSettingsContentType.Properties.FirstOrDefault(p => p.Alias == config.Name); + + if (property != null) + { + var dataType = context.DataTypes.GetNewDataType(property.DataTypeAlias); + + if (dataType != null && + dataType.Config is RadioButtonListConfig) + { + var radioButtonListConfig = (dataType.Config as RadioButtonListConfig)!; + var configItem = radioButtonListConfig.Items.FirstOrDefault(i => i.OldValue == configValue.Value()); + if (configItem != null) + { + configValue = JToken.Parse(string.Format("'{0}'", configItem.Value)); + } + } + else if (property.DataTypeAlias == "Image Media Picker") + { + Match match = (new Regex(@"^url\((.*)\)$")).Match(config.Value.ToString()); + + if (match.Success) + { + string path = match.Groups[1].Value; + IMedia? media = _mediaService.GetMediaByPath(config.Value.ToString().Replace("url(", "").Replace(")", "")); + + if (media is not null) + { + configValue = JToken.Parse(string.Format("[{0}]", JsonConvert.SerializeObject(new { key = Guid.NewGuid(), mediaKey = media.Key }))); + } + } + } + } + } + + settingsValues.Add(formattedKey, configValue); + } + + private BlockGridLayoutItem GetGridRowBlockLayout(BlockContentPair rowContentAndSettings, List rowLayoutAreas, int? rowColumns) { return new BlockGridLayoutItem @@ -279,7 +410,6 @@ private BlockGridLayoutItem GetGridRowBlockLayout(BlockContentPair rowContentAnd ColumnSpan = rowColumns, RowSpan = 1, }; - } private BlockItemData? GetBlockItemDataFromGridControl(GridValue.GridControl control, SyncMigrationContext context) diff --git a/uSync.Migrations.Migrators/BlockGrid/Extensions/GridConventions.cs b/uSync.Migrations.Migrators/BlockGrid/Extensions/GridConventions.cs index fa191024..5b48af3a 100644 --- a/uSync.Migrations.Migrators/BlockGrid/Extensions/GridConventions.cs +++ b/uSync.Migrations.Migrators/BlockGrid/Extensions/GridConventions.cs @@ -31,9 +31,15 @@ public string LayoutAreaAlias(string layout, string areaAlias) public string LayoutContentTypeAlias(string layout) => layout.GetBlockGridLayoutContentTypeAlias(ShortStringHelper); + public string LayoutSettingsContentTypeAlias(string layout) => layout.GetBlockGridLayoutSettingsContentTypeAlias(ShortStringHelper); + public string LayoutAreaSettingsContentTypeAlias(string layout) + => layout.GetBlockGridLayoutAreaSettingsContentTypeAlias(ShortStringHelper); + + public string SettingsContainerLayoutBlockLabel => "Settings container"; + public string FormatGridSettingKey(string setting) { var splitString = setting.Split("-"); diff --git a/uSync.Migrations.Migrators/BlockGrid/Extensions/GridToBlockGridNameExtensions.cs b/uSync.Migrations.Migrators/BlockGrid/Extensions/GridToBlockGridNameExtensions.cs index a6712729..57df17c2 100644 --- a/uSync.Migrations.Migrators/BlockGrid/Extensions/GridToBlockGridNameExtensions.cs +++ b/uSync.Migrations.Migrators/BlockGrid/Extensions/GridToBlockGridNameExtensions.cs @@ -34,6 +34,6 @@ public static string GetBlockGridLayoutSettingsContentTypeAlias(this string name => name.GetContentTypeAlias("BlockGridLayoutSettings_", shortStringHelper); public static string GetBlockGridLayoutAreaSettingsContentTypeAlias(this string name, IShortStringHelper shortStringHelper) - => name.GetContentTypeAlias("BlockGridLayoutAreaSettings_", shortStringHelper); + => name.GetContentTypeAlias("BlockGridLayoutAreaSettings_", shortStringHelper); } diff --git a/uSync.Migrations.Migrators/BlockGrid/GridToBlockGridMigrator.cs b/uSync.Migrations.Migrators/BlockGrid/GridToBlockGridMigrator.cs index 6d55bf5a..1cba229f 100644 --- a/uSync.Migrations.Migrators/BlockGrid/GridToBlockGridMigrator.cs +++ b/uSync.Migrations.Migrators/BlockGrid/GridToBlockGridMigrator.cs @@ -6,6 +6,7 @@ using Umbraco.Cms.Core.Logging; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.PropertyEditors; +using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Strings; using uSync.Migrations.Core.Legacy.Grid; @@ -31,6 +32,7 @@ public class GridToBlockGridMigrator : SyncPropertyMigratorBase private readonly ILogger _logger; private readonly IProfilingLogger _profilingLogger; private readonly GridConventions _conventions; + private readonly IMediaService _mediaService; public GridToBlockGridMigrator( ILegacyGridConfig gridConfig, @@ -38,7 +40,8 @@ public GridToBlockGridMigrator( GridSettingsViewMigratorCollection gridSettingsMigrators, IShortStringHelper shortStringHelper, ILoggerFactory loggerFactory, - IProfilingLogger profilingLogger) + IProfilingLogger profilingLogger, + IMediaService mediaService) { _gridConfig = gridConfig; _blockMigrators = blockMigrators; @@ -47,6 +50,7 @@ public GridToBlockGridMigrator( _loggerFactory = loggerFactory; _profilingLogger = profilingLogger; _logger = loggerFactory.CreateLogger(); + _mediaService = mediaService; } public override string GetEditorAlias(SyncMigrationDataTypeProperty dataTypeProperty, SyncMigrationContext context) @@ -87,7 +91,7 @@ public override string GetDatabaseType(SyncMigrationDataTypeProperty dataTypePro layoutSettingsBlockHelper.AddGridSettings(gridToBlockContext, context, dataTypeProperty.DataTypeAlias); // prep the layouts - layoutBlockHelper.AddLayoutBlocks(gridToBlockContext, context, dataTypeProperty.DataTypeAlias); + layoutBlockHelper.AddLayoutBlocks(gridToBlockContext, context, dataTypeProperty.DataTypeAlias, addAreaSettingsLayout: layoutSettingsBlockHelper.AnyAreaSettings); // Add the content blocks contentBlockHelper.AddContentBlocks(gridToBlockContext, context); @@ -169,7 +173,8 @@ private ILegacyGridEditorsConfig GetGridConfig(SyncMigrationContext context) _conventions, _blockMigrators, _loggerFactory.CreateLogger(), - _profilingLogger); + _profilingLogger, + _mediaService); var blockValue = helper.ConvertToBlockValue(source, context, dataTypeAlias ?? ""); if (blockValue == null) diff --git a/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyBooleanMigrator.cs b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyBooleanMigrator.cs index 8554a8e3..52c94ab6 100644 --- a/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyBooleanMigrator.cs +++ b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyBooleanMigrator.cs @@ -13,7 +13,7 @@ public object ConvertContentString(string value) return value; } - public NewDataTypeInfo? GetAdditionalDataType(string dataTypeAlias, IEnumerable? preValues) + public NewDataTypeInfo? GetAdditionalDataType(string dataTypeAlias, IEnumerable? preValues) { return null; } diff --git a/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyImageMigrator.cs b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyImageMigrator.cs new file mode 100644 index 00000000..590892a5 --- /dev/null +++ b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyImageMigrator.cs @@ -0,0 +1,20 @@ +using uSync.Migrations.Migrators.BlockGrid.Models; + +namespace uSync.Migrations.Migrators.BlockGrid.SettingsMigrators; + +public class GridViewPropertyImageMigrator : IGridSettingsViewMigrator +{ + public string ViewKey => "ImagePicker"; + + public string GetNewDataTypeAlias(string gridAlias, string? configItemLabel) => "Image Media Picker"; + + public object ConvertContentString(string value) + { + return value; + } + + public NewDataTypeInfo? GetAdditionalDataType(string dataTypeAlias, IEnumerable? preValues) + { + return null; + } +} \ No newline at end of file diff --git a/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyNumberMigrator.cs b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyNumberMigrator.cs index 3cba61bf..c17ca215 100644 --- a/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyNumberMigrator.cs +++ b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyNumberMigrator.cs @@ -13,7 +13,7 @@ public object ConvertContentString(string value) return value; } - public NewDataTypeInfo? GetAdditionalDataType(string dataTypeAlias, IEnumerable? preValues) + public NewDataTypeInfo? GetAdditionalDataType(string dataTypeAlias, IEnumerable? preValues) { return null; } diff --git a/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyRadioButtonListMigrator.cs b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyRadioButtonListMigrator.cs index 02eef547..35a431d0 100644 --- a/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyRadioButtonListMigrator.cs +++ b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/GridViewPropertyRadioButtonListMigrator.cs @@ -1,6 +1,7 @@ using Newtonsoft.Json; using Umbraco.Cms.Core.Models; using Umbraco.Extensions; +using uSync.Migrations.Migrators.BlockGrid.Models; namespace uSync.Migrations.Migrators.BlockGrid.SettingsMigrators; @@ -26,7 +27,7 @@ public object ConvertContentString(string value) return value; } - public NewDataTypeInfo? GetAdditionalDataType(string dataTypeAlias, IEnumerable? preValues) + public NewDataTypeInfo? GetAdditionalDataType(string dataTypeAlias, IEnumerable? preValues) { if (preValues is null) { @@ -47,9 +48,9 @@ public object ConvertContentString(string value) public class RadioButtonListConfig { - public RadioButtonListConfig(IEnumerable preValues) + public RadioButtonListConfig(IEnumerable preValues) { - Items = preValues.Select((value, ix) => new RadioButtonListConfigItem() { Id = ix, Value = value }); + Items = preValues.Select((preValue, ix) => new RadioButtonListConfigItem() { Id = ix, Value = preValue.Label, OldValue = preValue.Value }); } [JsonProperty("items")] @@ -63,4 +64,7 @@ public class RadioButtonListConfigItem [JsonProperty("value")] public string? Value { get; set; } + + [JsonIgnore] + public string? OldValue { get; set; } } \ No newline at end of file diff --git a/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/IGridSettingsViewMigrator.cs b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/IGridSettingsViewMigrator.cs index 2b7b7a2a..b02122a2 100644 --- a/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/IGridSettingsViewMigrator.cs +++ b/uSync.Migrations.Migrators/BlockGrid/SettingsMigrators/IGridSettingsViewMigrator.cs @@ -1,5 +1,6 @@ using Umbraco.Cms.Core.Composing; using Umbraco.Extensions; +using uSync.Migrations.Migrators.BlockGrid.Models; namespace uSync.Migrations.Migrators.BlockGrid.SettingsMigrators; @@ -9,7 +10,7 @@ public interface IGridSettingsViewMigrator : IDiscoverable string GetNewDataTypeAlias(string gridAlias, string? configItemLabel); public object ConvertContentString(string value); - public NewDataTypeInfo? GetAdditionalDataType(string dataTypeAlias, IEnumerable? preValues); + public NewDataTypeInfo? GetAdditionalDataType(string dataTypeAlias, IEnumerable? preValues); } public class GridSettingsViewMigratorCollectionBuilder