Adds new ValueReference classes and update to Interface for IsForEditor method to check if we should get references for a specific dataeditor based on its alias
This commit is contained in:
@@ -36,6 +36,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
where TRepository : class, IRepository
|
||||
{
|
||||
private readonly Lazy<PropertyEditorCollection> _propertyEditors;
|
||||
private readonly DataValueReferenceCollection _dataValueReferences;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
@@ -49,13 +50,14 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
/// </param>
|
||||
protected ContentRepositoryBase(IScopeAccessor scopeAccessor, AppCaches cache, ILogger logger,
|
||||
ILanguageRepository languageRepository, IRelationRepository relationRepository, IRelationTypeRepository relationTypeRepository,
|
||||
Lazy<PropertyEditorCollection> propertyEditors)
|
||||
Lazy<PropertyEditorCollection> propertyEditors, DataValueReferenceCollection dataValueReferences)
|
||||
: base(scopeAccessor, cache, logger)
|
||||
{
|
||||
LanguageRepository = languageRepository;
|
||||
RelationRepository = relationRepository;
|
||||
RelationTypeRepository = relationTypeRepository;
|
||||
_propertyEditors = propertyEditors;
|
||||
_dataValueReferences = dataValueReferences;
|
||||
}
|
||||
|
||||
protected abstract TRepository This { get; }
|
||||
@@ -826,15 +828,21 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
foreach (var p in entity.Properties)
|
||||
{
|
||||
if (!PropertyEditors.TryGet(p.PropertyType.PropertyEditorAlias, out var editor)) continue;
|
||||
var valueEditor = editor.GetValueEditor();
|
||||
if (!(valueEditor is IDataValueReference reference)) continue;
|
||||
|
||||
//TODO: Support variants/segments! This is not required for this initial prototype which is why there is a check here
|
||||
if (!p.PropertyType.VariesByNothing()) continue;
|
||||
|
||||
var val = p.GetValue(); // get the invariant value
|
||||
var refs = reference.GetReferences(val);
|
||||
trackedRelations.AddRange(refs);
|
||||
|
||||
// WB: Loop over our collection of references registered and add references
|
||||
foreach (var item in _dataValueReferences)
|
||||
{
|
||||
// Check if this value reference is for this datatype/editor
|
||||
// Then call it's GetReferences method - to see if the value stored
|
||||
// in the dataeditor/property has referecnes to media items
|
||||
if (item.IsForEditor(editor))
|
||||
trackedRelations.AddRange(item.GetReferences(val));
|
||||
}
|
||||
}
|
||||
|
||||
//First delete all auto-relations for this entity
|
||||
|
||||
@@ -20,8 +20,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
{
|
||||
public DocumentBlueprintRepository(IScopeAccessor scopeAccessor, AppCaches appCaches, ILogger logger,
|
||||
IContentTypeRepository contentTypeRepository, ITemplateRepository templateRepository, ITagRepository tagRepository, ILanguageRepository languageRepository, IRelationRepository relationRepository, IRelationTypeRepository relationTypeRepository,
|
||||
Lazy<PropertyEditorCollection> propertyEditorCollection)
|
||||
: base(scopeAccessor, appCaches, logger, contentTypeRepository, templateRepository, tagRepository, languageRepository, relationRepository, relationTypeRepository, propertyEditorCollection)
|
||||
Lazy<PropertyEditorCollection> propertyEditorCollection, DataValueReferenceCollection dataValueReferences)
|
||||
: base(scopeAccessor, appCaches, logger, contentTypeRepository, templateRepository, tagRepository, languageRepository, relationRepository, relationTypeRepository, propertyEditorCollection, dataValueReferences)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -46,8 +46,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
/// </param>
|
||||
public DocumentRepository(IScopeAccessor scopeAccessor, AppCaches appCaches, ILogger logger,
|
||||
IContentTypeRepository contentTypeRepository, ITemplateRepository templateRepository, ITagRepository tagRepository, ILanguageRepository languageRepository, IRelationRepository relationRepository, IRelationTypeRepository relationTypeRepository,
|
||||
Lazy<PropertyEditorCollection> propertyEditors)
|
||||
: base(scopeAccessor, appCaches, logger, languageRepository, relationRepository, relationTypeRepository, propertyEditors)
|
||||
Lazy<PropertyEditorCollection> propertyEditors, DataValueReferenceCollection dataValueReferences)
|
||||
: base(scopeAccessor, appCaches, logger, languageRepository, relationRepository, relationTypeRepository, propertyEditors, dataValueReferences)
|
||||
{
|
||||
_contentTypeRepository = contentTypeRepository ?? throw new ArgumentNullException(nameof(contentTypeRepository));
|
||||
_templateRepository = templateRepository ?? throw new ArgumentNullException(nameof(templateRepository));
|
||||
|
||||
@@ -29,8 +29,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
private readonly MediaByGuidReadRepository _mediaByGuidReadRepository;
|
||||
|
||||
public MediaRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger logger, IMediaTypeRepository mediaTypeRepository, ITagRepository tagRepository, ILanguageRepository languageRepository, IRelationRepository relationRepository, IRelationTypeRepository relationTypeRepository,
|
||||
Lazy<PropertyEditorCollection> propertyEditorCollection)
|
||||
: base(scopeAccessor, cache, logger, languageRepository, relationRepository, relationTypeRepository, propertyEditorCollection)
|
||||
Lazy<PropertyEditorCollection> propertyEditorCollection, DataValueReferenceCollection dataValueReferences)
|
||||
: base(scopeAccessor, cache, logger, languageRepository, relationRepository, relationTypeRepository, propertyEditorCollection, dataValueReferences)
|
||||
{
|
||||
_mediaTypeRepository = mediaTypeRepository ?? throw new ArgumentNullException(nameof(mediaTypeRepository));
|
||||
_tagRepository = tagRepository ?? throw new ArgumentNullException(nameof(tagRepository));
|
||||
|
||||
@@ -28,8 +28,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
|
||||
public MemberRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger logger,
|
||||
IMemberTypeRepository memberTypeRepository, IMemberGroupRepository memberGroupRepository, ITagRepository tagRepository, ILanguageRepository languageRepository, IRelationRepository relationRepository, IRelationTypeRepository relationTypeRepository,
|
||||
Lazy<PropertyEditorCollection> propertyEditors)
|
||||
: base(scopeAccessor, cache, logger, languageRepository, relationRepository, relationTypeRepository, propertyEditors)
|
||||
Lazy<PropertyEditorCollection> propertyEditors, DataValueReferenceCollection dataValueReferences)
|
||||
: base(scopeAccessor, cache, logger, languageRepository, relationRepository, relationTypeRepository, propertyEditors, dataValueReferences)
|
||||
{
|
||||
_memberTypeRepository = memberTypeRepository ?? throw new ArgumentNullException(nameof(memberTypeRepository));
|
||||
_tagRepository = tagRepository ?? throw new ArgumentNullException(nameof(tagRepository));
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
namespace Umbraco.Core.PropertyEditors
|
||||
{
|
||||
public class DataValueReferenceCollectionBuilder : LazyCollectionBuilderBase<DataValueReferenceCollectionBuilder, DataValueReferenceCollection, IDataValueReference>
|
||||
public class DataValueReferenceCollectionBuilder : OrderedCollectionBuilderBase<DataValueReferenceCollectionBuilder, DataValueReferenceCollection, IDataValueReference>
|
||||
{
|
||||
protected override DataValueReferenceCollectionBuilder This => this;
|
||||
protected override DataValueReferenceCollectionBuilder This => this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,5 +14,12 @@ namespace Umbraco.Core.PropertyEditors
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
IEnumerable<UmbracoEntityReference> GetReferences(object value);
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether the DataValueReference lookup supports a datatype (data editor).
|
||||
/// </summary>
|
||||
/// <param name="dataType">The datatype.</param>
|
||||
/// <returns>A value indicating whether the converter supports a datatype.</returns>
|
||||
bool IsForEditor(IDataEditor dataEditor);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,9 +75,6 @@ namespace Umbraco.Core.Runtime
|
||||
composition.RegisterUnique<PropertyEditorCollection>();
|
||||
composition.RegisterUnique<ParameterEditorCollection>();
|
||||
|
||||
// TODO: WB Add our collection
|
||||
// Manually register stuff in this collection
|
||||
composition.DataValueReferences();
|
||||
|
||||
// register a server registrar, by default it's the db registrar
|
||||
composition.RegisterUnique<IServerRegistrar>(f =>
|
||||
|
||||
@@ -29,21 +29,11 @@ namespace Umbraco.Web.PropertyEditors
|
||||
|
||||
protected override IDataValueEditor CreateValueEditor() => new ContentPickerPropertyValueEditor(Attribute);
|
||||
|
||||
internal class ContentPickerPropertyValueEditor : DataValueEditor, IDataValueReference
|
||||
internal class ContentPickerPropertyValueEditor : DataValueEditor
|
||||
{
|
||||
public ContentPickerPropertyValueEditor(DataEditorAttribute attribute) : base(attribute)
|
||||
{
|
||||
}
|
||||
|
||||
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
|
||||
{
|
||||
var asString = value is string str ? str : value?.ToString();
|
||||
|
||||
if (string.IsNullOrEmpty(asString)) yield break;
|
||||
|
||||
if (Udi.TryParse(asString, out var udi))
|
||||
yield return new UmbracoEntityReference(udi);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ namespace Umbraco.Web.PropertyEditors
|
||||
|
||||
protected override IConfigurationEditor CreateConfigurationEditor() => new GridConfigurationEditor();
|
||||
|
||||
internal class GridPropertyValueEditor : DataValueEditor, IDataValueReference
|
||||
internal class GridPropertyValueEditor : DataValueEditor
|
||||
{
|
||||
private readonly IUmbracoContextAccessor _umbracoContextAccessor;
|
||||
private readonly HtmlImageSourceParser _imageSourceParser;
|
||||
@@ -156,30 +156,6 @@ namespace Umbraco.Web.PropertyEditors
|
||||
|
||||
return grid;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Resolve references from <see cref="IDataValueEditor"/> values
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
|
||||
{
|
||||
var rawJson = value == null ? string.Empty : value is string str ? str : value.ToString();
|
||||
|
||||
DeserializeGridValue(rawJson, out var richTextEditorValues, out var mediaValues);
|
||||
|
||||
foreach (var umbracoEntityReference in richTextEditorValues.SelectMany(x =>
|
||||
_richTextPropertyValueEditor.GetReferences(x.Value)))
|
||||
{
|
||||
yield return umbracoEntityReference;
|
||||
}
|
||||
|
||||
foreach (var umbracoEntityReference in mediaValues.SelectMany(x =>
|
||||
_mediaPickerPropertyValueEditor.GetReferences(x.Value["udi"])))
|
||||
{
|
||||
yield return umbracoEntityReference;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,21 +33,11 @@ namespace Umbraco.Web.PropertyEditors
|
||||
|
||||
protected override IDataValueEditor CreateValueEditor() => new MediaPickerPropertyValueEditor(Attribute);
|
||||
|
||||
internal class MediaPickerPropertyValueEditor : DataValueEditor, IDataValueReference
|
||||
internal class MediaPickerPropertyValueEditor : DataValueEditor
|
||||
{
|
||||
public MediaPickerPropertyValueEditor(DataEditorAttribute attribute) : base(attribute)
|
||||
{
|
||||
}
|
||||
|
||||
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
|
||||
{
|
||||
var asString = value is string str ? str : value?.ToString();
|
||||
|
||||
if (string.IsNullOrEmpty(asString)) yield break;
|
||||
|
||||
if (Udi.TryParse(asString, out var udi))
|
||||
yield return new UmbracoEntityReference(udi);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -23,25 +23,12 @@ namespace Umbraco.Web.PropertyEditors
|
||||
|
||||
protected override IDataValueEditor CreateValueEditor() => new MultiNodeTreePickerPropertyValueEditor(Attribute);
|
||||
|
||||
public class MultiNodeTreePickerPropertyValueEditor : DataValueEditor, IDataValueReference
|
||||
public class MultiNodeTreePickerPropertyValueEditor : DataValueEditor
|
||||
{
|
||||
public MultiNodeTreePickerPropertyValueEditor(DataEditorAttribute attribute): base(attribute)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
|
||||
{
|
||||
var asString = value == null ? string.Empty : value is string str ? str : value.ToString();
|
||||
|
||||
var udiPaths = asString.Split(',');
|
||||
foreach (var udiPath in udiPaths)
|
||||
{
|
||||
if (Udi.TryParse(udiPath, out var udi))
|
||||
yield return new UmbracoEntityReference(udi);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ using Umbraco.Web.PublishedCache;
|
||||
|
||||
namespace Umbraco.Web.PropertyEditors
|
||||
{
|
||||
public class MultiUrlPickerValueEditor : DataValueEditor, IDataValueReference
|
||||
public class MultiUrlPickerValueEditor : DataValueEditor
|
||||
{
|
||||
private readonly IEntityService _entityService;
|
||||
private readonly ILogger _logger;
|
||||
@@ -190,9 +190,6 @@ namespace Umbraco.Web.PropertyEditors
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ namespace Umbraco.Web.PropertyEditors
|
||||
|
||||
protected override IDataValueEditor CreateValueEditor() => new NestedContentPropertyValueEditor(Attribute, PropertyEditors, _dataTypeService, _contentTypeService);
|
||||
|
||||
internal class NestedContentPropertyValueEditor : DataValueEditor, IDataValueReference
|
||||
internal class NestedContentPropertyValueEditor : DataValueEditor
|
||||
{
|
||||
private readonly PropertyEditorCollection _propertyEditors;
|
||||
private readonly IDataTypeService _dataTypeService;
|
||||
@@ -227,32 +227,6 @@ namespace Umbraco.Web.PropertyEditors
|
||||
// return json
|
||||
return JsonConvert.SerializeObject(deserialized);
|
||||
}
|
||||
|
||||
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
|
||||
{
|
||||
var rawJson = value == null ? string.Empty : value is string str ? str : value.ToString();
|
||||
|
||||
var result = new List<UmbracoEntityReference>();
|
||||
|
||||
foreach (var row in _nestedContentValues.GetPropertyValues(rawJson, out _))
|
||||
{
|
||||
if (row.PropType == null) continue;
|
||||
|
||||
var propEditor = _propertyEditors[row.PropType.PropertyEditorAlias];
|
||||
|
||||
var valueEditor = propEditor?.GetValueEditor();
|
||||
if (!(valueEditor is IDataValueReference reference)) continue;
|
||||
|
||||
var val = row.JsonRowValue[row.PropKey]?.ToString();
|
||||
|
||||
var refs = reference.GetReferences(val);
|
||||
|
||||
result.AddRange(refs);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ namespace Umbraco.Web.PropertyEditors
|
||||
/// <summary>
|
||||
/// A custom value editor to ensure that macro syntax is parsed when being persisted and formatted correctly for display in the editor
|
||||
/// </summary>
|
||||
internal class RichTextPropertyValueEditor : DataValueEditor, IDataValueReference
|
||||
internal class RichTextPropertyValueEditor : DataValueEditor
|
||||
{
|
||||
private IUmbracoContextAccessor _umbracoContextAccessor;
|
||||
private readonly HtmlImageSourceParser _imageSourceParser;
|
||||
@@ -130,24 +130,6 @@ namespace Umbraco.Web.PropertyEditors
|
||||
|
||||
return parsed;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Resolve references from <see cref="IDataValueEditor"/> values
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
|
||||
{
|
||||
var asString = value == null ? string.Empty : value is string str ? str : value.ToString();
|
||||
|
||||
foreach (var udi in _imageSourceParser.FindUdisFromDataAttributes(asString))
|
||||
yield return new UmbracoEntityReference(udi);
|
||||
|
||||
foreach (var udi in _localLinkParser.FindUdisFromLocalLinks(asString))
|
||||
yield return new UmbracoEntityReference(udi);
|
||||
|
||||
//TODO: Detect Macros too ... but we can save that for a later date, right now need to do media refs
|
||||
}
|
||||
}
|
||||
|
||||
internal class RichTextPropertyIndexValueFactory : IPropertyIndexValueFactory
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Models.Editors;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
|
||||
namespace Umbraco.Web.PropertyEditors.ValueReferences
|
||||
{
|
||||
public class ContentPickerPropertyValueReferences : IDataValueReference
|
||||
{
|
||||
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
|
||||
{
|
||||
var asString = value is string str ? str : value?.ToString();
|
||||
|
||||
if (string.IsNullOrEmpty(asString)) yield break;
|
||||
|
||||
if (Udi.TryParse(asString, out var udi))
|
||||
yield return new UmbracoEntityReference(udi);
|
||||
}
|
||||
|
||||
public bool IsForEditor(IDataEditor dataEditor) => dataEditor.Alias.InvariantEquals(Constants.PropertyEditors.Aliases.ContentPicker);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Models.Editors;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
|
||||
namespace Umbraco.Web.PropertyEditors.ValueReferences
|
||||
{
|
||||
public class GridPropertyValueReferences : IDataValueReference
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Resolve references from <see cref="IDataValueEditor"/> values
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
|
||||
{
|
||||
return Enumerable.Empty<UmbracoEntityReference>();
|
||||
|
||||
//var rawJson = value == null ? string.Empty : value is string str ? str : value.ToString();
|
||||
|
||||
////TODO FIX SQUIGLES
|
||||
//GridPropertyEditor.GridPropertyValueEditor.DeserializeGridValue(rawJson, out var richTextEditorValues, out var mediaValues);
|
||||
|
||||
//foreach (var umbracoEntityReference in richTextEditorValues.SelectMany(x =>
|
||||
// _richTextPropertyValueEditor.GetReferences(x.Value)))
|
||||
// yield return umbracoEntityReference;
|
||||
|
||||
//foreach (var umbracoEntityReference in mediaValues.SelectMany(x =>
|
||||
// _mediaPickerPropertyValueEditor.GetReferences(x.Value["udi"])))
|
||||
// yield return umbracoEntityReference;
|
||||
}
|
||||
|
||||
public bool IsForEditor(IDataEditor dataEditor) => dataEditor.Alias.InvariantEquals(Constants.PropertyEditors.Aliases.Grid);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Models.Editors;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
|
||||
namespace Umbraco.Web.PropertyEditors.ValueReferences
|
||||
{
|
||||
public class MediaPickerPropertyValueReferences : IDataValueReference
|
||||
{
|
||||
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
|
||||
{
|
||||
var asString = value is string str ? str : value?.ToString();
|
||||
|
||||
if (string.IsNullOrEmpty(asString)) yield break;
|
||||
|
||||
if (Udi.TryParse(asString, out var udi))
|
||||
yield return new UmbracoEntityReference(udi);
|
||||
}
|
||||
|
||||
public bool IsForEditor(IDataEditor dataEditor) => dataEditor.Alias.InvariantEquals(Constants.PropertyEditors.Aliases.MediaPicker);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Models.Editors;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
|
||||
namespace Umbraco.Web.PropertyEditors.ValueReferences
|
||||
{
|
||||
public class MultiNodeTreePickerPropertyValueReferences : IDataValueReference
|
||||
{
|
||||
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
|
||||
{
|
||||
var asString = value == null ? string.Empty : value is string str ? str : value.ToString();
|
||||
|
||||
var udiPaths = asString.Split(',');
|
||||
foreach (var udiPath in udiPaths)
|
||||
if (Udi.TryParse(udiPath, out var udi))
|
||||
yield return new UmbracoEntityReference(udi);
|
||||
|
||||
}
|
||||
|
||||
public bool IsForEditor(IDataEditor dataEditor) => dataEditor.Alias.InvariantEquals(Constants.PropertyEditors.Aliases.MultiNodeTreePicker);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
using Newtonsoft.Json;
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Models.Editors;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
|
||||
namespace Umbraco.Web.PropertyEditors.ValueReferences
|
||||
{
|
||||
public class MultiUrlPickerValueReferences : IDataValueReference
|
||||
{
|
||||
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
|
||||
{
|
||||
var asString = value == null ? string.Empty : value is string str ? str : value.ToString();
|
||||
|
||||
if (string.IsNullOrEmpty(asString)) yield break;
|
||||
|
||||
var links = JsonConvert.DeserializeObject<List<MultiUrlPickerValueEditor.LinkDto>>(asString);
|
||||
foreach (var link in links)
|
||||
if (link.Udi != null) // Links can be absolute links without a Udi
|
||||
yield return new UmbracoEntityReference(link.Udi);
|
||||
}
|
||||
|
||||
public bool IsForEditor(IDataEditor dataEditor) => dataEditor.Alias.InvariantEquals(Constants.PropertyEditors.Aliases.MultiUrlPicker);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Models.Editors;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
using Umbraco.Core.Services;
|
||||
using static Umbraco.Web.PropertyEditors.NestedContentPropertyEditor;
|
||||
|
||||
namespace Umbraco.Web.PropertyEditors.ValueReferences
|
||||
{
|
||||
public class NestedContentPropertyValueReferences : IDataValueReference
|
||||
{
|
||||
private PropertyEditorCollection _propertyEditors;
|
||||
private NestedContentValues _nestedContentValues;
|
||||
|
||||
//ARGH LightInject moaning at me
|
||||
public NestedContentPropertyValueReferences(PropertyEditorCollection propertyEditors, IContentTypeService contentTypeService)
|
||||
{
|
||||
_propertyEditors = propertyEditors;
|
||||
_nestedContentValues = new NestedContentValues(contentTypeService);
|
||||
}
|
||||
|
||||
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
|
||||
{
|
||||
var rawJson = value == null ? string.Empty : value is string str ? str : value.ToString();
|
||||
|
||||
var result = new List<UmbracoEntityReference>();
|
||||
|
||||
foreach (var row in _nestedContentValues.GetPropertyValues(rawJson, out _))
|
||||
{
|
||||
if (row.PropType == null) continue;
|
||||
|
||||
var propEditor = _propertyEditors[row.PropType.PropertyEditorAlias];
|
||||
|
||||
var valueEditor = propEditor?.GetValueEditor();
|
||||
if (!(valueEditor is IDataValueReference reference)) continue;
|
||||
|
||||
var val = row.JsonRowValue[row.PropKey]?.ToString();
|
||||
|
||||
var refs = reference.GetReferences(val);
|
||||
|
||||
result.AddRange(refs);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public bool IsForEditor(IDataEditor dataEditor) => dataEditor.Alias.InvariantEquals(Constants.PropertyEditors.Aliases.NestedContent);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Models.Editors;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
using Umbraco.Web.Templates;
|
||||
|
||||
namespace Umbraco.Web.PropertyEditors.ValueReferences
|
||||
{
|
||||
public class RichTextPropertyValueReferences : IDataValueReference
|
||||
{
|
||||
private HtmlImageSourceParser _imageSourceParser;
|
||||
private HtmlLocalLinkParser _localLinkParser;
|
||||
|
||||
public RichTextPropertyValueReferences(HtmlImageSourceParser imageSourceParser, HtmlLocalLinkParser localLinkParser)
|
||||
{
|
||||
_imageSourceParser = imageSourceParser;
|
||||
_localLinkParser = localLinkParser;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Resolve references from <see cref="IDataValueEditor"/> values
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
public IEnumerable<UmbracoEntityReference> GetReferences(object value)
|
||||
{
|
||||
var asString = value == null ? string.Empty : value is string str ? str : value.ToString();
|
||||
|
||||
foreach (var udi in _imageSourceParser.FindUdisFromDataAttributes(asString))
|
||||
yield return new UmbracoEntityReference(udi);
|
||||
|
||||
foreach (var udi in _localLinkParser.FindUdisFromLocalLinks(asString))
|
||||
yield return new UmbracoEntityReference(udi);
|
||||
|
||||
//TODO: Detect Macros too ... but we can save that for a later date, right now need to do media refs
|
||||
}
|
||||
|
||||
public bool IsForEditor(IDataEditor dataEditor) => dataEditor.Alias.InvariantEquals(Constants.PropertyEditors.Aliases.TinyMce);
|
||||
}
|
||||
}
|
||||
@@ -42,6 +42,8 @@ using Umbraco.Web.Trees;
|
||||
using Umbraco.Web.WebApi;
|
||||
using Current = Umbraco.Web.Composing.Current;
|
||||
using Umbraco.Web.PropertyEditors;
|
||||
using static Umbraco.Web.PropertyEditors.GridPropertyEditor;
|
||||
using Umbraco.Web.PropertyEditors.ValueReferences;
|
||||
|
||||
namespace Umbraco.Web.Runtime
|
||||
{
|
||||
@@ -274,7 +276,22 @@ namespace Umbraco.Web.Runtime
|
||||
.Append<Issuu>()
|
||||
.Append<Hulu>()
|
||||
.Append<Giphy>();
|
||||
|
||||
|
||||
// Used to determine if a datatype/editor should be storing/tracking
|
||||
// references to media item/s
|
||||
composition.DataValueReferences()
|
||||
.Append<ContentPickerPropertyValueReferences>()
|
||||
|
||||
// TODO: Unsure how to call other ValueReference in collection
|
||||
// When looking at grid item cells for RTE or media found
|
||||
//.Append<GridPropertyValueReferences>()
|
||||
.Append<MediaPickerPropertyValueReferences>()
|
||||
.Append<MultiNodeTreePickerPropertyValueReferences>()
|
||||
.Append<MultiUrlPickerValueReferences>()
|
||||
|
||||
// TODO: LightInject problem
|
||||
//.Append<NestedContentPropertyValueReferences>()
|
||||
.Append<RichTextPropertyValueReferences>();
|
||||
|
||||
// replace with web implementation
|
||||
composition.RegisterUnique<IPublishedSnapshotRebuilder, Migrations.PostMigrations.PublishedSnapshotRebuilder>();
|
||||
|
||||
@@ -235,6 +235,13 @@
|
||||
<Compile Include="Profiling\WebProfilingController.cs" />
|
||||
<Compile Include="PropertyEditors\ParameterEditors\MultipleMediaPickerParameterEditor.cs" />
|
||||
<Compile Include="PropertyEditors\RichTextEditorPastedImages.cs" />
|
||||
<Compile Include="PropertyEditors\ValueReferences\ContentPickerPropertyValueReferences.cs" />
|
||||
<Compile Include="PropertyEditors\ValueReferences\GridPropertyValueReferences.cs" />
|
||||
<Compile Include="PropertyEditors\ValueReferences\MediaPickerPropertyValueReferences.cs" />
|
||||
<Compile Include="PropertyEditors\ValueReferences\MultiNodeTreePickerPropertyValueReferences.cs" />
|
||||
<Compile Include="PropertyEditors\ValueReferences\MultiUrlPickerValueReferences.cs" />
|
||||
<Compile Include="PropertyEditors\ValueReferences\NestedContentPropertyValueReferences.cs" />
|
||||
<Compile Include="PropertyEditors\ValueReferences\RichTextPropertyValueReferences.cs" />
|
||||
<Compile Include="PublishedCache\NuCache\PublishedSnapshotServiceOptions.cs" />
|
||||
<Compile Include="PublishedCache\NuCache\Snap\GenObj.cs" />
|
||||
<Compile Include="PublishedCache\NuCache\Snap\GenRef.cs" />
|
||||
|
||||
Reference in New Issue
Block a user