Files
Umbraco-CMS/src/Umbraco.Web/ContentApps/ListViewContentAppFactory.cs
2019-04-23 21:31:48 +02:00

128 lines
5.5 KiB
C#

using System;
using System.Collections.Generic;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.ContentEditing;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Services;
using Umbraco.Web.Models.ContentEditing;
namespace Umbraco.Web.ContentApps
{
internal class ListViewContentAppFactory : IContentAppFactory
{
// see note on ContentApp
private const int Weight = -666;
private readonly IDataTypeService _dataTypeService;
private readonly PropertyEditorCollection _propertyEditors;
public ListViewContentAppFactory(IDataTypeService dataTypeService, PropertyEditorCollection propertyEditors)
{
_dataTypeService = dataTypeService;
_propertyEditors = propertyEditors;
}
public ContentApp GetContentAppFor(object o, IEnumerable<IReadOnlyUserGroup> userGroups)
{
string contentTypeAlias, entityType;
int dtdId;
switch (o)
{
case IContent content when !content.ContentType.IsContainer:
return null;
case IContent content:
contentTypeAlias = content.ContentType.Alias;
entityType = "content";
dtdId = Core.Constants.DataTypes.DefaultContentListView;
break;
case IMedia media when !media.ContentType.IsContainer && media.ContentType.Alias != Core.Constants.Conventions.MediaTypes.Folder:
return null;
case IMedia media:
contentTypeAlias = media.ContentType.Alias;
entityType = "media";
dtdId = Core.Constants.DataTypes.DefaultMediaListView;
break;
default:
throw new NotSupportedException($"Object type {o.GetType()} is not supported here.");
}
return CreateContentApp(_dataTypeService, _propertyEditors, entityType, contentTypeAlias, dtdId);
}
public static ContentApp CreateContentApp(IDataTypeService dataTypeService,
PropertyEditorCollection propertyEditors,
string entityType, string contentTypeAlias,
int defaultListViewDataType)
{
if (dataTypeService == null) throw new ArgumentNullException(nameof(dataTypeService));
if (propertyEditors == null) throw new ArgumentNullException(nameof(propertyEditors));
if (string.IsNullOrWhiteSpace(entityType)) throw new ArgumentException("message", nameof(entityType));
if (string.IsNullOrWhiteSpace(contentTypeAlias)) throw new ArgumentException("message", nameof(contentTypeAlias));
if (defaultListViewDataType == default) throw new ArgumentException("defaultListViewDataType", nameof(defaultListViewDataType));
var contentApp = new ContentApp
{
Alias = "umbListView",
Name = "Child items",
Icon = "icon-list",
View = "views/content/apps/listview/listview.html",
Weight = Weight
};
var customDtdName = Core.Constants.Conventions.DataTypes.ListViewPrefix + contentTypeAlias;
//first try to get the custom one if there is one
var dt = dataTypeService.GetDataType(customDtdName)
?? dataTypeService.GetDataType(defaultListViewDataType);
if (dt == null)
{
throw new InvalidOperationException("No list view data type was found for this document type, ensure that the default list view data types exists and/or that your custom list view data type exists");
}
var editor = propertyEditors[dt.EditorAlias];
if (editor == null)
{
throw new NullReferenceException("The property editor with alias " + dt.EditorAlias + " does not exist");
}
var listViewConfig = editor.GetConfigurationEditor().ToConfigurationEditor(dt.Configuration);
//add the entity type to the config
listViewConfig["entityType"] = entityType;
//Override Tab Label if tabName is provided
if (listViewConfig.ContainsKey("tabName"))
{
var configTabName = listViewConfig["tabName"];
if (configTabName != null && String.IsNullOrWhiteSpace(configTabName.ToString()) == false)
contentApp.Name = configTabName.ToString();
}
// if the list view is configured to show umbContent first, update the list view content app weight accordingly
if(listViewConfig.ContainsKey("showContentFirst") &&
listViewConfig["showContentFirst"]?.ToString().TryConvertTo<bool>().Result == true)
{
contentApp.Weight = ContentEditorContentAppFactory.Weight + 1;
}
//This is the view model used for the list view app
contentApp.ViewModel = new List<ContentPropertyDisplay>
{
new ContentPropertyDisplay
{
Alias = $"{Core.Constants.PropertyEditors.InternalGenericPropertiesPrefix}containerView",
Label = "",
Value = null,
View = editor.GetValueEditor().View,
HideLabel = true,
Config = listViewConfig
}
};
return contentApp;
}
}
}