Updated the data type controller to return the correct data for the editor, including more models and model mappings.

This commit is contained in:
Shannon
2013-08-19 17:39:50 +10:00
parent 78e836025b
commit e783b35a3a
17 changed files with 309 additions and 122 deletions

View File

@@ -25,23 +25,13 @@ angular.module('umbraco.mocks').
label: "Custom pre value 1 for editor " + selectedId,
description: "Enter a value for this pre-value",
key: "myPreVal",
view: "requiredfield",
validation: [
{
type: "Required"
}
]
view: "requiredfield"
},
{
label: "Custom pre value 2 for editor " + selectedId,
description: "Enter a value for this pre-value",
key: "myPreVal",
view: "requiredfield",
validation: [
{
type: "Required"
}
]
view: "requiredfield"
}
]

View File

@@ -24,7 +24,7 @@
label: "Regular expression",
description: "Enter a regular expression to use to validate this editor",
key: "regex",
view: "~/App_Plugins/MyPackage/PropertyEditors/Views/regexStatement.html",
view: "requiredfield",
validation: [
{
type: "Required"

View File

@@ -61,7 +61,8 @@ namespace Umbraco.Web.Editors
{"mediaTypeApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl<MediaTypeController>("GetAllowedChildren")},
{"authenticationApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl<AuthenticationController>("PostLogin")},
{"legacyApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl<LegacyController>("DeleteLegacyItem")},
{"entityApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl<EntityController>("GetById")}
{"entityApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl<EntityController>("GetById")},
{"dataTypeApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl<DataTypeController>("GetById")},
}
},
{

View File

@@ -31,7 +31,6 @@ using Constants = Umbraco.Core.Constants;
namespace Umbraco.Web.Editors
{
/// <summary>
/// The API controller used for editing content
/// </summary>

View File

@@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web.Http;
using AutoMapper;
using Umbraco.Core.Models;
using Umbraco.Core.PropertyEditors;
using Umbraco.Web.Models.ContentEditing;
using Umbraco.Web.Mvc;
using Umbraco.Web.WebApi.Filters;
using Constants = Umbraco.Core.Constants;
namespace Umbraco.Web.Editors
{
/// <summary>
/// The API controller used for editing data types
/// </summary>
/// <remarks>
/// This controller is decorated with the UmbracoApplicationAuthorizeAttribute which means that any user requesting
/// access to ALL of the methods on this controller will need access to the developer application.
/// </remarks>
[PluginController("UmbracoApi")]
[UmbracoApplicationAuthorize(Constants.Applications.Developer)]
public class DataTypeController : UmbracoAuthorizedJsonController
{
/// <summary>
/// Gets the content json for the content id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public DataTypeDisplay GetById(int id)
{
var dataType = Services.DataTypeService.GetDataTypeDefinitionById(id);
if (dataType == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return Mapper.Map<IDataTypeDefinition, DataTypeDisplay>(dataType);
}
/// <summary>
/// Returns the pre-values for the specified property editor
/// </summary>
/// <param name="editorId"></param>
/// <returns></returns>
public IEnumerable<PreValueFieldDisplay> GetPreValues(Guid editorId)
{
var propEd = PropertyEditorResolver.Current.GetById(editorId);
if (propEd == null)
{
throw new InvalidOperationException("Could not find property editor with id " + editorId);
}
return propEd.PreValueEditor.Fields.Select(Mapper.Map<PreValueFieldDisplay>);
}
}
}

View File

@@ -13,19 +13,8 @@ namespace Umbraco.Web.Models.ContentEditing
/// A model representing a basic content item
/// </summary>
[DataContract(Name = "content", Namespace = "")]
public class ContentItemBasic
public class ContentItemBasic : EntityBasic
{
[DataMember(Name = "icon")]
public string Icon { get; set; }
[DataMember(Name = "id", IsRequired = true)]
[Required]
public int Id { get; set; }
[DataMember(Name = "name", IsRequired = true)]
[RequiredForPersistence(AllowEmptyStrings = false, ErrorMessage = "Required")]
public string Name { get; set; }
[DataMember(Name = "updateDate")]
public DateTime UpdateDate { get; set; }

View File

@@ -12,16 +12,8 @@ namespace Umbraco.Web.Models.ContentEditing
/// Generally used to return the minimal amount of data about a content type
/// </remarks>
[DataContract(Name = "contentType", Namespace = "")]
public class ContentTypeBasic
public class ContentTypeBasic : EntityBasic
{
[DataMember(Name = "id", IsRequired = true)]
[Required]
public int Id { get; set; }
[DataMember(Name = "name", IsRequired = true)]
[Required]
public string Name { get; set; }
[DataMember(Name = "alias", IsRequired = true)]
[Required]
public string Alias { get; set; }
@@ -29,9 +21,6 @@ namespace Umbraco.Web.Models.ContentEditing
[DataMember(Name = "description")]
public string Description { get; set; }
[DataMember(Name = "icon")]
public string Icon { get; set; }
[DataMember(Name = "thumbnail")]
public string Thumbnail { get; set; }

View File

@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Runtime.Serialization;
namespace Umbraco.Web.Models.ContentEditing
{
/// <summary>
/// Represents a data type that is being edited
/// </summary>
[DataContract(Name = "dataType", Namespace = "")]
public class DataTypeDisplay : EntityBasic
{
[DataMember(Name = "selectedEditor", IsRequired = true)]
[Required]
public Guid SelectedEditor { get; set; }
[DataMember(Name = "availableEditors")]
public IEnumerable<PropertyEditorBasic> AvailableEditors { get; set; }
[DataMember(Name = "preValues")]
public IEnumerable<PreValueFieldDisplay> PreValues { get; set; }
}
}

View File

@@ -1,19 +1,23 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
using Umbraco.Core.Models.Validation;
namespace Umbraco.Web.Models.ContentEditing
{
[DataContract(Name = "entity", Namespace = "")]
public class EntityBasic
{
[DataMember(Name = "name")]
[DataMember(Name = "name", IsRequired = true)]
[RequiredForPersistence(AllowEmptyStrings = false, ErrorMessage = "Required")]
public string Name { get; set; }
[DataMember(Name = "id")]
[DataMember(Name = "id", IsRequired = true)]
[Required]
public int Id { get; set; }
[DataMember(Name = "icon")]

View File

@@ -0,0 +1,41 @@
using System.Runtime.Serialization;
namespace Umbraco.Web.Models.ContentEditing
{
/// <summary>
/// Defines a pre value editable field for a data type
/// </summary>
[DataContract(Name = "propertyEditor", Namespace = "")]
public class PreValueFieldDisplay
{
/// <summary>
/// The name to display for this pre-value field
/// </summary>
[DataMember(Name = "label", IsRequired = true)]
public string Name { get; set; }
/// <summary>
/// The description to display for this pre-value field
/// </summary>
[DataMember(Name = "description")]
public string Description { get; set; }
/// <summary>
/// Specifies whether to hide the label for the pre-value
/// </summary>
[DataMember(Name = "hideLabel")]
public bool HideLabel { get; set; }
/// <summary>
/// The key to store the pre-value against
/// </summary>
[DataMember(Name = "key", IsRequired = true)]
public string Key { get; set; }
/// <summary>
/// The view to render for the field
/// </summary>
[DataMember(Name = "view", IsRequired = true)]
public string View { get; set; }
}
}

View File

@@ -0,0 +1,18 @@
using System;
using System.Runtime.Serialization;
namespace Umbraco.Web.Models.ContentEditing
{
/// <summary>
/// Defines an available property editor to be able to select for a data type
/// </summary>
[DataContract(Name = "propertyEditor", Namespace = "")]
public class PropertyEditorBasic
{
[DataMember(Name = "editorId")]
public Guid EditorId { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
}
}

View File

@@ -0,0 +1,17 @@
using System.Collections.Generic;
using System.Linq;
using AutoMapper;
using Umbraco.Core.Models;
using Umbraco.Core.PropertyEditors;
using Umbraco.Web.Models.ContentEditing;
namespace Umbraco.Web.Models.Mapping
{
internal class AvailablePropertyEditorsResolver : ValueResolver<IDataTypeDefinition, IEnumerable<PropertyEditorBasic>>
{
protected override IEnumerable<PropertyEditorBasic> ResolveCore(IDataTypeDefinition source)
{
return PropertyEditorResolver.Current.PropertyEditors.Select(Mapper.Map<PropertyEditorBasic>);
}
}
}

View File

@@ -1,20 +1,20 @@
using AutoMapper;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Mapping;
using Umbraco.Web.Models.ContentEditing;
namespace Umbraco.Web.Models.Mapping
{
/// <summary>
/// Defines mappings for content/media (and i'm sure one day member) type mappings
/// </summary>
internal class ContentTypeModelMapper : MapperConfiguration
{
public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext)
{
config.CreateMap<IMediaType, ContentTypeBasic>();
config.CreateMap<IContentType, ContentTypeBasic>();
}
}
using AutoMapper;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Mapping;
using Umbraco.Web.Models.ContentEditing;
namespace Umbraco.Web.Models.Mapping
{
/// <summary>
/// Defines mappings for content/media (and i'm sure one day member) type mappings
/// </summary>
internal class ContentTypeModelMapper : MapperConfiguration
{
public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext)
{
config.CreateMap<IMediaType, ContentTypeBasic>();
config.CreateMap<IContentType, ContentTypeBasic>();
}
}
}

View File

@@ -0,0 +1,25 @@
using AutoMapper;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Mapping;
using Umbraco.Core.PropertyEditors;
using Umbraco.Web.Models.ContentEditing;
namespace Umbraco.Web.Models.Mapping
{
internal class DataTypeModelMapper : MapperConfiguration
{
public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext)
{
config.CreateMap<PropertyEditor, PropertyEditorBasic>()
.ForMember(basic => basic.EditorId, expression => expression.MapFrom(editor => editor.Id));
config.CreateMap<PreValueField, PreValueFieldDisplay>();
config.CreateMap<IDataTypeDefinition, DataTypeDisplay>()
.ForMember(display => display.AvailableEditors, expression => expression.ResolveUsing<AvailablePropertyEditorsResolver>())
.ForMember(display => display.PreValues, expression => expression.ResolveUsing<PreValueDisplayResolver>())
.ForMember(display => display.SelectedEditor, expression => expression.MapFrom(definition => definition.ControlId));
}
}
}

View File

@@ -1,60 +1,60 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AutoMapper;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Mapping;
using Umbraco.Core.PropertyEditors;
using Umbraco.Web.Models.ContentEditing;
namespace Umbraco.Web.Models.Mapping
{
/// <summary>
/// Declares model mappings for media.
/// </summary>
internal class NewMediaModelMapper : MapperConfiguration
{
public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext)
{
//FROM IMedia TO MediaItemDisplay
config.CreateMap<IMedia, MediaItemDisplay>()
.ForMember(
dto => dto.Owner,
expression => expression.ResolveUsing<OwnerResolver<IMedia>>())
.ForMember(
dto => dto.Icon,
expression => expression.MapFrom(content => content.ContentType.Icon))
.ForMember(
dto => dto.ContentTypeAlias,
expression => expression.MapFrom(content => content.ContentType.Alias))
.ForMember(
dto => dto.ContentTypeName,
expression => expression.MapFrom(content => content.ContentType.Name))
.ForMember(display => display.Properties, expression => expression.Ignore())
.ForMember(display => display.Tabs, expression => expression.ResolveUsing<TabsAndPropertiesResolver>())
.AfterMap((media, display) => TabsAndPropertiesResolver.MapGenericProperties(media, display));
//FROM IMedia TO ContentItemBasic<ContentPropertyBasic, IMedia>
config.CreateMap<IMedia, ContentItemBasic<ContentPropertyBasic, IMedia>>()
.ForMember(
dto => dto.Owner,
expression => expression.ResolveUsing<OwnerResolver<IMedia>>())
.ForMember(
dto => dto.Icon,
expression => expression.MapFrom(content => content.ContentType.Icon))
.ForMember(
dto => dto.ContentTypeAlias,
expression => expression.MapFrom(content => content.ContentType.Alias));
//FROM IMedia TO ContentItemDto<IMedia>
config.CreateMap<IMedia, ContentItemDto<IMedia>>()
.ForMember(
dto => dto.Owner,
expression => expression.ResolveUsing<OwnerResolver<IMedia>>());
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AutoMapper;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Mapping;
using Umbraco.Core.PropertyEditors;
using Umbraco.Web.Models.ContentEditing;
namespace Umbraco.Web.Models.Mapping
{
/// <summary>
/// Declares model mappings for media.
/// </summary>
internal class NewMediaModelMapper : MapperConfiguration
{
public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext)
{
//FROM IMedia TO MediaItemDisplay
config.CreateMap<IMedia, MediaItemDisplay>()
.ForMember(
dto => dto.Owner,
expression => expression.ResolveUsing<OwnerResolver<IMedia>>())
.ForMember(
dto => dto.Icon,
expression => expression.MapFrom(content => content.ContentType.Icon))
.ForMember(
dto => dto.ContentTypeAlias,
expression => expression.MapFrom(content => content.ContentType.Alias))
.ForMember(
dto => dto.ContentTypeName,
expression => expression.MapFrom(content => content.ContentType.Name))
.ForMember(display => display.Properties, expression => expression.Ignore())
.ForMember(display => display.Tabs, expression => expression.ResolveUsing<TabsAndPropertiesResolver>())
.AfterMap((media, display) => TabsAndPropertiesResolver.MapGenericProperties(media, display));
//FROM IMedia TO ContentItemBasic<ContentPropertyBasic, IMedia>
config.CreateMap<IMedia, ContentItemBasic<ContentPropertyBasic, IMedia>>()
.ForMember(
dto => dto.Owner,
expression => expression.ResolveUsing<OwnerResolver<IMedia>>())
.ForMember(
dto => dto.Icon,
expression => expression.MapFrom(content => content.ContentType.Icon))
.ForMember(
dto => dto.ContentTypeAlias,
expression => expression.MapFrom(content => content.ContentType.Alias));
//FROM IMedia TO ContentItemDto<IMedia>
config.CreateMap<IMedia, ContentItemDto<IMedia>>()
.ForMember(
dto => dto.Owner,
expression => expression.ResolveUsing<OwnerResolver<IMedia>>());
}
}
}

View File

@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using AutoMapper;
using Umbraco.Core.Models;
using Umbraco.Core.PropertyEditors;
using Umbraco.Web.Models.ContentEditing;
namespace Umbraco.Web.Models.Mapping
{
internal class PreValueDisplayResolver : ValueResolver<IDataTypeDefinition, IEnumerable<PreValueFieldDisplay>>
{
protected override IEnumerable<PreValueFieldDisplay> ResolveCore(IDataTypeDefinition source)
{
var propEd = PropertyEditorResolver.Current.GetById(source.ControlId);
if (propEd == null)
{
throw new InvalidOperationException("Could not find property editor with id " + source.ControlId);
}
return propEd.PreValueEditor.Fields.Select(Mapper.Map<PreValueFieldDisplay>);
}
}
}

View File

@@ -298,10 +298,17 @@
<Compile Include="Configuration\WebRouting.cs" />
<Compile Include="Editors\AuthenticationController.cs" />
<Compile Include="Editors\ContentController.cs" />
<Compile Include="Editors\DataTypeController.cs" />
<Compile Include="Editors\EntityController.cs" />
<Compile Include="Models\ContentEditing\DataTypeDisplay.cs" />
<Compile Include="Models\ContentEditing\EntityBasic.cs" />
<Compile Include="Models\ContentEditing\PreValueFieldDisplay.cs" />
<Compile Include="Models\ContentEditing\PropertyEditorBasic.cs" />
<Compile Include="Models\ContentEditing\TemplateBasic.cs" />
<Compile Include="Models\Mapping\AvailablePropertyEditorsResolver.cs" />
<Compile Include="Models\Mapping\DataTypeModelMapper.cs" />
<Compile Include="Models\Mapping\EntityModelMapper.cs" />
<Compile Include="Models\Mapping\PreValueDisplayResolver.cs" />
<Compile Include="Models\PagedResult.cs" />
<Compile Include="PropertyEditors\DatePropertyEditor.cs" />
<Compile Include="PropertyEditors\DateTimePropertyEditor.cs" />
@@ -341,8 +348,8 @@
<Compile Include="Models\Mapping\ContentPropertyDtoConverter.cs" />
<Compile Include="Models\Mapping\ContentPropertyModelMapper.cs" />
<Compile Include="Models\Mapping\CreatorResolver.cs" />
<Compile Include="Models\Mapping\MediaModelMapper.cs" />
<Compile Include="Models\Mapping\MediaTypeModelMapper.cs" />
<Compile Include="Models\Mapping\NewMediaModelMapper.cs" />
<Compile Include="Models\Mapping\ContentTypeModelMapper.cs" />
<Compile Include="Models\Mapping\ContentModelMapper.cs" />
<Compile Include="Models\Mapping\OwnerResolver.cs" />
<Compile Include="Models\Mapping\SectionModelMapper.cs" />