diff --git a/src/RJP.MultiUrlPicker/Models/Link.cs b/src/RJP.MultiUrlPicker/Models/Link.cs index c3dc1e7..e5e8e49 100644 --- a/src/RJP.MultiUrlPicker/Models/Link.cs +++ b/src/RJP.MultiUrlPicker/Models/Link.cs @@ -14,6 +14,7 @@ namespace RJP.MultiUrlPicker.Models public class Link { private readonly JToken _linkItem; + private readonly Lazy _umbracoHelper; private bool _publishedContentInitialized = false; private string _name; private string _url; @@ -24,9 +25,10 @@ public class Link private Udi _udi; private int? _id; - public Link(JToken linkItem) + public Link(JToken linkItem, Lazy umbracoHelper = null) { _linkItem = linkItem; + _umbracoHelper = umbracoHelper ?? new Lazy(() => new UmbracoHelper(UmbracoContext.Current)); } private IPublishedContent PublishedContent @@ -158,7 +160,6 @@ public LinkType Type } } - private void InitPublishedContent() { if (!_publishedContentInitialized) @@ -170,9 +171,22 @@ private void InitPublishedContent() return; } - if (Udi.TryParse(_linkItem.Value("udi"), out _udi)) + if (Udi.TryParse(_linkItem.Value("udi"), out _udi) && _udi is GuidUdi guidUdi) { - _content = _udi.ToPublishedContent(); + var umbracoType = Constants.UdiEntityType.ToUmbracoObjectType(_udi.EntityType); + if (umbracoType == UmbracoObjectTypes.Media) + { + var entityService = ApplicationContext.Current.Services.EntityService; + var mediaAttempt = entityService.GetIdForKey(guidUdi.Guid, umbracoType); + if (mediaAttempt.Success) + { + _content = _umbracoHelper.Value.TypedMedia(mediaAttempt.Result); + } + } + else + { + _content = _umbracoHelper.Value.TypedContent(guidUdi.Guid); + } _id = _content?.Id; } else @@ -181,15 +195,13 @@ private void InitPublishedContent() _id = _linkItem.Value("id"); if (_id.HasValue) { - var helper = new UmbracoHelper(UmbracoContext.Current); - if (_linkItem.Value("isMedia")) { - _content = helper.TypedMedia(_id.Value); + _content = _umbracoHelper.Value.TypedMedia(_id.Value); } else { - _content = helper.TypedContent(_id.Value); + _content = _umbracoHelper.Value.TypedContent(_id.Value); } SetUdi(); diff --git a/src/RJP.MultiUrlPicker/Models/MultiUrls.cs b/src/RJP.MultiUrlPicker/Models/MultiUrls.cs index 8f12778..e95972a 100644 --- a/src/RJP.MultiUrlPicker/Models/MultiUrls.cs +++ b/src/RJP.MultiUrlPicker/Models/MultiUrls.cs @@ -1,4 +1,4 @@ -namespace RJP.MultiUrlPicker.Models +namespace RJP.MultiUrlPicker.Models { using System; using System.Collections.Generic; @@ -8,6 +8,7 @@ using Newtonsoft.Json.Linq; using Umbraco.Core.Logging; + using Umbraco.Web; [Obsolete("Use IEnumerable instead")] public class MultiUrls : IEnumerable @@ -39,12 +40,14 @@ public MultiUrls(string propertyData) private void Initialize(JArray data) { + var umbracoHelper = new Lazy(() => new UmbracoHelper(UmbracoContext.Current)); + foreach (var item in data) { - var newLink = new Link(item); + var newLink = new Link(item, umbracoHelper); if (!newLink.Deleted) { - _multiUrls.Add(new Link(item)); + _multiUrls.Add(newLink); } else { diff --git a/src/RJP.MultiUrlPicker/MultiUrlPickerValueConverter.cs b/src/RJP.MultiUrlPicker/MultiUrlPickerValueConverter.cs index afe7724..2cf77e8 100644 --- a/src/RJP.MultiUrlPicker/MultiUrlPickerValueConverter.cs +++ b/src/RJP.MultiUrlPicker/MultiUrlPickerValueConverter.cs @@ -37,22 +37,24 @@ public override bool IsConverter(PublishedPropertyType propertyType) public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) { - if (string.IsNullOrWhiteSpace(source?.ToString())) + var sourceString = source?.ToString(); + if (string.IsNullOrWhiteSpace(sourceString)) { return null; } - if (source.ToString().Trim().StartsWith("[")) + if (sourceString.DetectIsJson()) { try { - return JArray.Parse(source.ToString()); + return JArray.Parse(sourceString); } catch (Exception ex) { LogHelper.Error("Error parsing JSON", ex); } } + return null; } @@ -65,14 +67,16 @@ public override object ConvertSourceToObject(PublishedPropertyType propertyType, } var urls = new MultiUrls((JArray)source); - if(isMultiple) + if (isMultiple) { - if(maxNumberOfItems > 0) + if (maxNumberOfItems > 0) { return urls.Take(maxNumberOfItems); } + return urls; } + return urls.FirstOrDefault(); } @@ -82,6 +86,7 @@ public Type GetPropertyValueType(PublishedPropertyType propertyType) { return typeof(IEnumerable); } + return typeof(Link); } @@ -108,12 +113,9 @@ private bool IsMultipleDataType(int dataTypeId, out int maxNumberOfItems) if (preValues.TryGetValue("maxNumberOfItems", out PreValue maxNumberOfItemsPreValue) && int.TryParse(maxNumberOfItemsPreValue.Value, out maxNumberOfItems)) { - PreValue versionPreValue; - Version version; - // for backwards compatibility, always return true if version - // is less than 2.0.0 - if (preValues.TryGetValue("version", out versionPreValue) && - Version.TryParse(versionPreValue.Value, out version) + // For backwards compatibility, always return true if version is less than 2.0.0 + if (preValues.TryGetValue("version", out PreValue versionPreValue) && + Version.TryParse(versionPreValue.Value, out Version version) && version >= new Version(2, 0, 0)) { return maxNumberOfItems != 1;