using System; using Umbraco.Core; using Umbraco.Core.Mapping; using Umbraco.Core.Models; using Umbraco.Web.Models.ContentEditing; namespace Umbraco.Web.Models.Mapping { /// /// Returns the for an item /// /// internal class ContentBasicSavedStateMapper where T : ContentPropertyBasic { private readonly ContentSavedStateMapper _inner = new ContentSavedStateMapper(); public ContentSavedState? Map(IContent source, MapperContext context) { return _inner.Map(source, context); } } /// /// Returns the for an item /// /// internal class ContentSavedStateMapper 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."); } } }