2018-08-16 23:30:33 +10:00
|
|
|
|
using System;
|
|
|
|
|
|
using AutoMapper;
|
|
|
|
|
|
using Umbraco.Core;
|
|
|
|
|
|
using Umbraco.Core.Models;
|
|
|
|
|
|
using Umbraco.Web.Models.ContentEditing;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Umbraco.Web.Models.Mapping
|
|
|
|
|
|
{
|
2018-09-14 10:08:09 +10:00
|
|
|
|
|
2018-09-14 11:31:43 +10:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Returns the <see cref="ContentSavedState?"/> for an <see cref="IContent"/> item
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <typeparam name="T"></typeparam>
|
|
|
|
|
|
internal class ContentBasicSavedStateResolver<T> : IValueResolver<IContent, IContentProperties<T>, ContentSavedState?>
|
|
|
|
|
|
where T : ContentPropertyBasic
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly ContentSavedStateResolver<T> _inner = new ContentSavedStateResolver<T>();
|
|
|
|
|
|
|
|
|
|
|
|
public ContentSavedState? Resolve(IContent source, IContentProperties<T> destination, ContentSavedState? destMember, ResolutionContext context)
|
|
|
|
|
|
{
|
|
|
|
|
|
return _inner.Resolve(source, destination, default, context);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-09-14 10:08:09 +10:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Returns the <see cref="ContentSavedState"/> for an <see cref="IContent"/> item
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <typeparam name="T"></typeparam>
|
|
|
|
|
|
internal class ContentSavedStateResolver<T> : IValueResolver<IContent, IContentProperties<T>, ContentSavedState>
|
|
|
|
|
|
where T : ContentPropertyBasic
|
2018-08-16 23:30:33 +10:00
|
|
|
|
{
|
2018-09-14 10:08:09 +10:00
|
|
|
|
public ContentSavedState Resolve(IContent source, IContentProperties<T> destination, ContentSavedState destMember, ResolutionContext context)
|
2018-08-16 23:30:33 +10:00
|
|
|
|
{
|
|
|
|
|
|
PublishedState publishedState;
|
|
|
|
|
|
bool isEdited;
|
|
|
|
|
|
|
|
|
|
|
|
if (source.ContentType.VariesByCulture())
|
|
|
|
|
|
{
|
|
|
|
|
|
//Get the culture from the context which will be set during the mapping operation for each variant
|
2018-09-17 13:19:24 +02:00
|
|
|
|
var culture = context.Options.GetCulture();
|
2018-08-16 23:30:33 +10:00
|
|
|
|
|
|
|
|
|
|
//a culture needs to be in the context for a variant content item
|
|
|
|
|
|
if (culture == null)
|
|
|
|
|
|
throw new InvalidOperationException($"No culture found in mapping operation when one is required for a culture variant");
|
|
|
|
|
|
|
|
|
|
|
|
publishedState = source.PublishedState == PublishedState.Unpublished //if the entire document is unpublished, then flag every variant as unpublished
|
|
|
|
|
|
? PublishedState.Unpublished
|
|
|
|
|
|
: source.IsCulturePublished(culture)
|
|
|
|
|
|
? PublishedState.Published
|
|
|
|
|
|
: PublishedState.Unpublished;
|
|
|
|
|
|
|
2018-08-28 15:00:45 +02:00
|
|
|
|
isEdited = source.IsCultureEdited(culture);
|
2018-08-16 23:30:33 +10:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
publishedState = source.PublishedState == PublishedState.Unpublished
|
|
|
|
|
|
? PublishedState.Unpublished
|
|
|
|
|
|
: PublishedState.Published;
|
|
|
|
|
|
|
2018-08-28 15:00:45 +02:00
|
|
|
|
isEdited = source.Edited;
|
2018-08-16 23:30:33 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-08-28 15:00:45 +02:00
|
|
|
|
if (publishedState == PublishedState.Unpublished)
|
|
|
|
|
|
return isEdited && source.Id > 0 ? ContentSavedState.Draft : ContentSavedState.NotCreated;
|
|
|
|
|
|
|
|
|
|
|
|
if (publishedState == PublishedState.Published)
|
|
|
|
|
|
return isEdited ? ContentSavedState.PublishedPendingChanges : ContentSavedState.Published;
|
|
|
|
|
|
|
|
|
|
|
|
throw new NotSupportedException($"PublishedState {publishedState} is not supported.");
|
2018-08-16 23:30:33 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|