From e783b35a3a4f751cf05841dad521e76f23d56dd9 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 19 Aug 2013 17:39:50 +1000 Subject: [PATCH] Updated the data type controller to return the correct data for the editor, including more models and model mappings. --- .../src/common/mocks/resources/_utils.js | 14 +- .../App_Plugins/MyPackage/Package.manifest | 2 +- .../Editors/BackOfficeController.cs | 3 +- src/Umbraco.Web/Editors/ContentController.cs | 1 - src/Umbraco.Web/Editors/DataTypeController.cs | 59 +++++++++ .../Models/ContentEditing/ContentItemBasic.cs | 13 +- .../Models/ContentEditing/ContentTypeBasic.cs | 13 +- .../Models/ContentEditing/DataTypeDisplay.cs | 24 ++++ .../Models/ContentEditing/EntityBasic.cs | 8 +- .../ContentEditing/PreValueFieldDisplay.cs | 41 ++++++ .../ContentEditing/PropertyEditorBasic.cs | 18 +++ .../AvailablePropertyEditorsResolver.cs | 17 +++ ...delMapper.cs => ContentTypeModelMapper.cs} | 38 +++--- .../Models/Mapping/DataTypeModelMapper.cs | 25 ++++ ...aModelMapper.cs => NewMediaModelMapper.cs} | 120 +++++++++--------- .../Models/Mapping/PreValueDisplayResolver.cs | 24 ++++ src/Umbraco.Web/Umbraco.Web.csproj | 11 +- 17 files changed, 309 insertions(+), 122 deletions(-) create mode 100644 src/Umbraco.Web/Editors/DataTypeController.cs create mode 100644 src/Umbraco.Web/Models/ContentEditing/DataTypeDisplay.cs create mode 100644 src/Umbraco.Web/Models/ContentEditing/PreValueFieldDisplay.cs create mode 100644 src/Umbraco.Web/Models/ContentEditing/PropertyEditorBasic.cs create mode 100644 src/Umbraco.Web/Models/Mapping/AvailablePropertyEditorsResolver.cs rename src/Umbraco.Web/Models/Mapping/{MediaTypeModelMapper.cs => ContentTypeModelMapper.cs} (97%) create mode 100644 src/Umbraco.Web/Models/Mapping/DataTypeModelMapper.cs rename src/Umbraco.Web/Models/Mapping/{MediaModelMapper.cs => NewMediaModelMapper.cs} (97%) create mode 100644 src/Umbraco.Web/Models/Mapping/PreValueDisplayResolver.cs diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/_utils.js b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/_utils.js index 61993c92bc..68685fbc12 100644 --- a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/_utils.js +++ b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/_utils.js @@ -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" } ] diff --git a/src/Umbraco.Web.UI/App_Plugins/MyPackage/Package.manifest b/src/Umbraco.Web.UI/App_Plugins/MyPackage/Package.manifest index a542d5b3ff..4bd8049ca3 100644 --- a/src/Umbraco.Web.UI/App_Plugins/MyPackage/Package.manifest +++ b/src/Umbraco.Web.UI/App_Plugins/MyPackage/Package.manifest @@ -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" diff --git a/src/Umbraco.Web/Editors/BackOfficeController.cs b/src/Umbraco.Web/Editors/BackOfficeController.cs index 433a088100..ad20aa592a 100644 --- a/src/Umbraco.Web/Editors/BackOfficeController.cs +++ b/src/Umbraco.Web/Editors/BackOfficeController.cs @@ -61,7 +61,8 @@ namespace Umbraco.Web.Editors {"mediaTypeApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl("GetAllowedChildren")}, {"authenticationApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl("PostLogin")}, {"legacyApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl("DeleteLegacyItem")}, - {"entityApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl("GetById")} + {"entityApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl("GetById")}, + {"dataTypeApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl("GetById")}, } }, { diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index e18ca1c529..03ad0fb005 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -31,7 +31,6 @@ using Constants = Umbraco.Core.Constants; namespace Umbraco.Web.Editors { - /// /// The API controller used for editing content /// diff --git a/src/Umbraco.Web/Editors/DataTypeController.cs b/src/Umbraco.Web/Editors/DataTypeController.cs new file mode 100644 index 0000000000..41dbed0c26 --- /dev/null +++ b/src/Umbraco.Web/Editors/DataTypeController.cs @@ -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 +{ + /// + /// The API controller used for editing data types + /// + /// + /// 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. + /// + [PluginController("UmbracoApi")] + [UmbracoApplicationAuthorize(Constants.Applications.Developer)] + public class DataTypeController : UmbracoAuthorizedJsonController + { + /// + /// Gets the content json for the content id + /// + /// + /// + public DataTypeDisplay GetById(int id) + { + var dataType = Services.DataTypeService.GetDataTypeDefinitionById(id); + if (dataType == null) + { + throw new HttpResponseException(HttpStatusCode.NotFound); + } + + return Mapper.Map(dataType); + } + + /// + /// Returns the pre-values for the specified property editor + /// + /// + /// + public IEnumerable 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); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs index fed6b9b959..8123ee2155 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs @@ -13,19 +13,8 @@ namespace Umbraco.Web.Models.ContentEditing /// A model representing a basic content item /// [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; } diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentTypeBasic.cs b/src/Umbraco.Web/Models/ContentEditing/ContentTypeBasic.cs index a580443157..1f70ec381d 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentTypeBasic.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentTypeBasic.cs @@ -12,16 +12,8 @@ namespace Umbraco.Web.Models.ContentEditing /// Generally used to return the minimal amount of data about a content type /// [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; } diff --git a/src/Umbraco.Web/Models/ContentEditing/DataTypeDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/DataTypeDisplay.cs new file mode 100644 index 0000000000..f52bd623d2 --- /dev/null +++ b/src/Umbraco.Web/Models/ContentEditing/DataTypeDisplay.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; + +namespace Umbraco.Web.Models.ContentEditing +{ + /// + /// Represents a data type that is being edited + /// + [DataContract(Name = "dataType", Namespace = "")] + public class DataTypeDisplay : EntityBasic + { + [DataMember(Name = "selectedEditor", IsRequired = true)] + [Required] + public Guid SelectedEditor { get; set; } + + [DataMember(Name = "availableEditors")] + public IEnumerable AvailableEditors { get; set; } + + [DataMember(Name = "preValues")] + public IEnumerable PreValues { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/ContentEditing/EntityBasic.cs b/src/Umbraco.Web/Models/ContentEditing/EntityBasic.cs index 5cc1adbf4e..6c14463f7d 100644 --- a/src/Umbraco.Web/Models/ContentEditing/EntityBasic.cs +++ b/src/Umbraco.Web/Models/ContentEditing/EntityBasic.cs @@ -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")] diff --git a/src/Umbraco.Web/Models/ContentEditing/PreValueFieldDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/PreValueFieldDisplay.cs new file mode 100644 index 0000000000..9f38f6c331 --- /dev/null +++ b/src/Umbraco.Web/Models/ContentEditing/PreValueFieldDisplay.cs @@ -0,0 +1,41 @@ +using System.Runtime.Serialization; + +namespace Umbraco.Web.Models.ContentEditing +{ + /// + /// Defines a pre value editable field for a data type + /// + [DataContract(Name = "propertyEditor", Namespace = "")] + public class PreValueFieldDisplay + { + /// + /// The name to display for this pre-value field + /// + [DataMember(Name = "label", IsRequired = true)] + public string Name { get; set; } + + /// + /// The description to display for this pre-value field + /// + [DataMember(Name = "description")] + public string Description { get; set; } + + /// + /// Specifies whether to hide the label for the pre-value + /// + [DataMember(Name = "hideLabel")] + public bool HideLabel { get; set; } + + /// + /// The key to store the pre-value against + /// + [DataMember(Name = "key", IsRequired = true)] + public string Key { get; set; } + + /// + /// The view to render for the field + /// + [DataMember(Name = "view", IsRequired = true)] + public string View { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/ContentEditing/PropertyEditorBasic.cs b/src/Umbraco.Web/Models/ContentEditing/PropertyEditorBasic.cs new file mode 100644 index 0000000000..fc72abbf5b --- /dev/null +++ b/src/Umbraco.Web/Models/ContentEditing/PropertyEditorBasic.cs @@ -0,0 +1,18 @@ +using System; +using System.Runtime.Serialization; + +namespace Umbraco.Web.Models.ContentEditing +{ + /// + /// Defines an available property editor to be able to select for a data type + /// + [DataContract(Name = "propertyEditor", Namespace = "")] + public class PropertyEditorBasic + { + [DataMember(Name = "editorId")] + public Guid EditorId { get; set; } + + [DataMember(Name = "name")] + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/Mapping/AvailablePropertyEditorsResolver.cs b/src/Umbraco.Web/Models/Mapping/AvailablePropertyEditorsResolver.cs new file mode 100644 index 0000000000..c0572930a5 --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/AvailablePropertyEditorsResolver.cs @@ -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> + { + protected override IEnumerable ResolveCore(IDataTypeDefinition source) + { + return PropertyEditorResolver.Current.PropertyEditors.Select(Mapper.Map); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/Mapping/MediaTypeModelMapper.cs b/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapper.cs similarity index 97% rename from src/Umbraco.Web/Models/Mapping/MediaTypeModelMapper.cs rename to src/Umbraco.Web/Models/Mapping/ContentTypeModelMapper.cs index 7af4ca2006..d21a90475f 100644 --- a/src/Umbraco.Web/Models/Mapping/MediaTypeModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentTypeModelMapper.cs @@ -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 -{ - /// - /// Defines mappings for content/media (and i'm sure one day member) type mappings - /// - internal class ContentTypeModelMapper : MapperConfiguration - { - public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) - { - config.CreateMap(); - config.CreateMap(); - } - } +using AutoMapper; +using Umbraco.Core; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Mapping; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Web.Models.Mapping +{ + /// + /// Defines mappings for content/media (and i'm sure one day member) type mappings + /// + internal class ContentTypeModelMapper : MapperConfiguration + { + public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) + { + config.CreateMap(); + config.CreateMap(); + } + } } \ No newline at end of file diff --git a/src/Umbraco.Web/Models/Mapping/DataTypeModelMapper.cs b/src/Umbraco.Web/Models/Mapping/DataTypeModelMapper.cs new file mode 100644 index 0000000000..e3eb42897b --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/DataTypeModelMapper.cs @@ -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() + .ForMember(basic => basic.EditorId, expression => expression.MapFrom(editor => editor.Id)); + + config.CreateMap(); + + config.CreateMap() + .ForMember(display => display.AvailableEditors, expression => expression.ResolveUsing()) + .ForMember(display => display.PreValues, expression => expression.ResolveUsing()) + .ForMember(display => display.SelectedEditor, expression => expression.MapFrom(definition => definition.ControlId)); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs b/src/Umbraco.Web/Models/Mapping/NewMediaModelMapper.cs similarity index 97% rename from src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs rename to src/Umbraco.Web/Models/Mapping/NewMediaModelMapper.cs index fe3643da87..5bec0a4e2e 100644 --- a/src/Umbraco.Web/Models/Mapping/MediaModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/NewMediaModelMapper.cs @@ -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 -{ - /// - /// Declares model mappings for media. - /// - internal class NewMediaModelMapper : MapperConfiguration - { - public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) - { - //FROM IMedia TO MediaItemDisplay - config.CreateMap() - .ForMember( - dto => dto.Owner, - expression => expression.ResolveUsing>()) - .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()) - .AfterMap((media, display) => TabsAndPropertiesResolver.MapGenericProperties(media, display)); - - //FROM IMedia TO ContentItemBasic - config.CreateMap>() - .ForMember( - dto => dto.Owner, - expression => expression.ResolveUsing>()) - .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 - config.CreateMap>() - .ForMember( - dto => dto.Owner, - expression => expression.ResolveUsing>()); - } - - } -} +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 +{ + /// + /// Declares model mappings for media. + /// + internal class NewMediaModelMapper : MapperConfiguration + { + public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext) + { + //FROM IMedia TO MediaItemDisplay + config.CreateMap() + .ForMember( + dto => dto.Owner, + expression => expression.ResolveUsing>()) + .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()) + .AfterMap((media, display) => TabsAndPropertiesResolver.MapGenericProperties(media, display)); + + //FROM IMedia TO ContentItemBasic + config.CreateMap>() + .ForMember( + dto => dto.Owner, + expression => expression.ResolveUsing>()) + .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 + config.CreateMap>() + .ForMember( + dto => dto.Owner, + expression => expression.ResolveUsing>()); + } + + } +} diff --git a/src/Umbraco.Web/Models/Mapping/PreValueDisplayResolver.cs b/src/Umbraco.Web/Models/Mapping/PreValueDisplayResolver.cs new file mode 100644 index 0000000000..5bef6c75bd --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/PreValueDisplayResolver.cs @@ -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> + { + protected override IEnumerable 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); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 764018f4a9..903e4df729 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -298,10 +298,17 @@ + + + + + + + @@ -341,8 +348,8 @@ - - + +