// Copyright (c) Umbraco. // See LICENSE for more details. using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Extensions; namespace Umbraco.Cms.Core.PropertyEditors; /// /// Handles nested Udi keys when /// - saving: Empty keys get generated /// - copy: keys get replaced by new ones while keeping references intact /// - scaffolding: keys get replaced by new ones while keeping references intact /// public abstract class ComplexPropertyEditorContentNotificationHandler : INotificationHandler, INotificationHandler, INotificationHandler { protected abstract string EditorAlias { get; } public void Handle(ContentCopyingNotification notification) { IEnumerable props = notification.Copy.GetPropertiesByEditor(EditorAlias); UpdatePropertyValues(props, false); } public void Handle(ContentSavingNotification notification) { foreach (IContent entity in notification.SavedEntities) { IEnumerable props = entity.GetPropertiesByEditor(EditorAlias); UpdatePropertyValues(props, true); } } public void Handle(ContentScaffoldedNotification notification) { IEnumerable props = notification.Scaffold.GetPropertiesByEditor(EditorAlias); UpdatePropertyValues(props, false); } protected abstract string FormatPropertyValue(string rawJson, bool onlyMissingKeys); private void UpdatePropertyValues(IEnumerable props, bool onlyMissingKeys) { foreach (IProperty prop in props) { // A Property may have one or more values due to cultures IReadOnlyCollection propVals = prop.Values; foreach (IPropertyValue cultureVal in propVals) { // Remove keys from published value & any nested properties var publishedValue = cultureVal.PublishedValue?.ToString(); var updatedPublishedVal = FormatPropertyValue(publishedValue!, onlyMissingKeys).NullOrWhiteSpaceAsNull(); cultureVal.PublishedValue = updatedPublishedVal; // Remove keys from edited/draft value & any nested properties var editedValue = cultureVal.EditedValue?.ToString(); var updatedEditedVal = FormatPropertyValue(editedValue!, onlyMissingKeys).NullOrWhiteSpaceAsNull(); cultureVal.EditedValue = updatedEditedVal; } } } }