Bugfix: https://github.com/umbraco/Umbraco-CMS/issues/4827 - Fixed MediaPickerValueConverter when config is Only Images

This commit is contained in:
Shannon
2019-03-26 20:09:12 +11:00
parent 2bfa81c707
commit 080ace90b2

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core;
@@ -14,11 +15,18 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
[DefaultPropertyValueConverter]
public class MediaPickerValueConverter : PropertyValueConverterBase
{
// hard-coding "image" here but that's how it works at UI level too
private const string ImageTypeAlias = "image";
private readonly IPublishedModelFactory _publishedModelFactory;
private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor;
public MediaPickerValueConverter(IPublishedSnapshotAccessor publishedSnapshotAccessor)
public MediaPickerValueConverter(IPublishedSnapshotAccessor publishedSnapshotAccessor,
IPublishedModelFactory publishedModelFactory)
{
_publishedSnapshotAccessor = publishedSnapshotAccessor ?? throw new ArgumentNullException(nameof(publishedSnapshotAccessor));
_publishedSnapshotAccessor = publishedSnapshotAccessor ??
throw new ArgumentNullException(nameof(publishedSnapshotAccessor));
_publishedModelFactory = publishedModelFactory;
}
public override bool IsConverter(PublishedPropertyType propertyType)
@@ -31,15 +39,19 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
var isMultiple = IsMultipleDataType(propertyType.DataType);
var isOnlyImages = IsOnlyImagesDataType(propertyType.DataType);
// hard-coding "image" here but that's how it works at UI level too
return isMultiple
? (isOnlyImages ? typeof(IEnumerable<>).MakeGenericType(ModelType.For("image")) : typeof(IEnumerable<IPublishedContent>))
: (isOnlyImages ? ModelType.For("image") : typeof(IPublishedContent));
? isOnlyImages
? typeof(IEnumerable<>).MakeGenericType(ModelType.For(ImageTypeAlias))
: typeof(IEnumerable<IPublishedContent>)
: isOnlyImages
? ModelType.For(ImageTypeAlias)
: typeof(IPublishedContent);
}
public override PropertyCacheLevel GetPropertyCacheLevel(PublishedPropertyType propertyType)
=> PropertyCacheLevel.Snapshot;
{
return PropertyCacheLevel.Snapshot;
}
private bool IsMultipleDataType(PublishedDataType dataType)
{
@@ -53,26 +65,31 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
return config.OnlyImages;
}
public override object ConvertSourceToIntermediate(IPublishedElement owner, PublishedPropertyType propertyType, object source, bool preview)
public override object ConvertSourceToIntermediate(IPublishedElement owner, PublishedPropertyType propertyType,
object source, bool preview)
{
if (source == null) return null;
var nodeIds = source.ToString()
.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries)
.Select(Udi.Parse)
.ToArray();
return nodeIds;
}
public override object ConvertIntermediateToObject(IPublishedElement owner, PublishedPropertyType propertyType, PropertyCacheLevel cacheLevel, object source, bool preview)
public override object ConvertIntermediateToObject(IPublishedElement owner, PublishedPropertyType propertyType,
PropertyCacheLevel cacheLevel, object source, bool preview)
{
if (source == null)
{
return null;
}
var isMultiple = IsMultipleDataType(propertyType.DataType);
var isOnlyImages = IsOnlyImagesDataType(propertyType.DataType);
var udis = (Udi[]) source;
var mediaItems = isOnlyImages
? _publishedModelFactory.CreateModelList(ImageTypeAlias)
: new List<IPublishedContent>();
if (source == null) return isMultiple ? mediaItems : null;
var udis = (Udi[])source;
var mediaItems = new List<IPublishedContent>();
if (udis.Any())
{
foreach (var udi in udis)
@@ -84,12 +101,15 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
mediaItems.Add(item);
}
if (IsMultipleDataType(propertyType.DataType))
return mediaItems;
return mediaItems.FirstOrDefault();
return isMultiple ? mediaItems : FirstOrDefault(mediaItems);
}
return source;
}
private object FirstOrDefault(IList mediaItems)
{
return mediaItems.Count == 0 ? null : mediaItems[0];
}
}
}