Skip to content

Commit

Permalink
Translate member picker property editor value to V14 compatible forma…
Browse files Browse the repository at this point in the history
…t (and back again) (#16149)

* Translate member picker property editor value to V14 compatible format (and back again)

* Fix typo

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
  • Loading branch information
kjac and elit0451 authored Apr 29, 2024
1 parent d1e90dd commit 0e12b94
Showing 1 changed file with 53 additions and 0 deletions.
53 changes: 53 additions & 0 deletions src/Umbraco.Core/PropertyEditors/MemberPickerPropertyEditor.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
using Umbraco.Cms.Core.IO;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.Editors;
using Umbraco.Cms.Core.Serialization;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Strings;
using Umbraco.Extensions;

namespace Umbraco.Cms.Core.PropertyEditors;

[DataEditor(
Expand All @@ -9,4 +17,49 @@ public class MemberPickerPropertyEditor : DataEditor
public MemberPickerPropertyEditor(IDataValueEditorFactory dataValueEditorFactory)
: base(dataValueEditorFactory)
=> SupportsReadOnly = true;

protected override IDataValueEditor CreateValueEditor() =>
DataValueEditorFactory.Create<MemberPickerPropertyValueEditor>(Attribute!);

private class MemberPickerPropertyValueEditor : DataValueEditor
{
private readonly IMemberService _memberService;

public MemberPickerPropertyValueEditor(
IShortStringHelper shortStringHelper,
IJsonSerializer jsonSerializer,
IIOHelper ioHelper,
DataEditorAttribute attribute,
IMemberService memberService)
: base(shortStringHelper, jsonSerializer, ioHelper, attribute)
=> _memberService = memberService;

public override object? ToEditor(IProperty property, string? culture = null, string? segment = null)
{
// the stored value is either an UDI or an integer ID - need to transform this into the corresponding member key
var value = base.ToEditor(property, culture, segment);
if (value is not string stringValue || stringValue.IsNullOrWhiteSpace())
{
return value;
}

if (UdiParser.TryParse<GuidUdi>(stringValue, out GuidUdi? guidUdi))
{
return guidUdi.Guid;
}

if (int.TryParse(stringValue, out int memberId))
{
return _memberService.GetById(memberId)?.Key;
}

return null;
}

// the editor value is expected to be the member key - store it as the member UDI
public override object? FromEditor(ContentPropertyData editorValue, object? currentValue)
=> editorValue.Value is string stringValue && Guid.TryParse(stringValue, out Guid memberKey)
? new GuidUdi(Constants.UdiEntityType.Member, memberKey)
: null;
}
}

0 comments on commit 0e12b94

Please sign in to comment.