78 lines
2.9 KiB
C#
78 lines
2.9 KiB
C#
using System;
|
|
using Umbraco.Core;
|
|
using Umbraco.Core.Mapping;
|
|
using Umbraco.Core.Models;
|
|
using Umbraco.Web.Models.ContentEditing;
|
|
|
|
namespace Umbraco.Web.Models.Mapping
|
|
{
|
|
/// <summary>
|
|
/// Returns the <see cref="ContentSavedState?"/> for an <see cref="IContent"/> item
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
internal class ContentBasicSavedStateMapper<T>
|
|
where T : ContentPropertyBasic
|
|
{
|
|
private readonly ContentSavedStateMapper<T> _inner = new ContentSavedStateMapper<T>();
|
|
|
|
public ContentSavedState? Map(IContent source, MapperContext context)
|
|
{
|
|
return _inner.Map(source, context);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the <see cref="ContentSavedState"/> for an <see cref="IContent"/> item
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
internal class ContentSavedStateMapper<T>
|
|
where T : ContentPropertyBasic
|
|
{
|
|
public ContentSavedState Map(IContent source, MapperContext context)
|
|
{
|
|
PublishedState publishedState;
|
|
bool isEdited;
|
|
bool isCreated;
|
|
|
|
if (source.ContentType.VariesByCulture())
|
|
{
|
|
//Get the culture from the context which will be set during the mapping operation for each variant
|
|
var culture = context.GetCulture();
|
|
|
|
//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;
|
|
|
|
isEdited = source.IsCultureEdited(culture);
|
|
isCreated = source.Id > 0 && source.IsCultureAvailable(culture);
|
|
}
|
|
else
|
|
{
|
|
publishedState = source.PublishedState == PublishedState.Unpublished
|
|
? PublishedState.Unpublished
|
|
: PublishedState.Published;
|
|
|
|
isEdited = source.Edited;
|
|
isCreated = source.Id > 0;
|
|
}
|
|
|
|
if (!isCreated)
|
|
return ContentSavedState.NotCreated;
|
|
|
|
if (publishedState == PublishedState.Unpublished)
|
|
return ContentSavedState.Draft;
|
|
|
|
if (publishedState == PublishedState.Published)
|
|
return isEdited ? ContentSavedState.PublishedPendingChanges : ContentSavedState.Published;
|
|
|
|
throw new NotSupportedException($"PublishedState {publishedState} is not supported.");
|
|
}
|
|
}
|
|
}
|