Merge remote-tracking branch 'origin/7.0.0' into 7.0.0-pubcontent
Conflicts: src/Umbraco.Tests/TestHelpers/BaseWebTest.cs src/Umbraco.Web.UI/Umbraco/create/PartialView.ascx src/Umbraco.Web.UI/Umbraco/create/PartialView.ascx.designer.cs src/Umbraco.Web.UI/packages.config src/Umbraco.Web.UI/umbraco/config/create/UI.xml src/Umbraco.Web/Umbraco.Web.csproj src/Umbraco.Web/UmbracoHelper.cs src/Umbraco.Web/umbraco.presentation/umbraco/create/DLRScripting.ascx src/Umbraco.Web/umbraco.presentation/umbraco/create/PartialViewTasks.cs src/Umbraco.Web/umbraco.presentation/umbraco/create/xslt.ascx
This commit is contained in:
@@ -21,7 +21,10 @@ namespace Umbraco.Web.Models.ContentEditing
|
||||
|
||||
[DataMember(Name = "createDate")]
|
||||
public DateTime CreateDate { get; set; }
|
||||
|
||||
|
||||
[DataMember(Name = "published")]
|
||||
public bool Published { get; set; }
|
||||
|
||||
[DataMember(Name = "owner")]
|
||||
public UserBasic Owner { get; set; }
|
||||
|
||||
|
||||
@@ -23,6 +23,9 @@ namespace Umbraco.Web.Models.ContentEditing
|
||||
[DataMember(Name = "icon")]
|
||||
public string Icon { get; set; }
|
||||
|
||||
[DataMember(Name = "key")]
|
||||
public Guid Key { get; set; }
|
||||
|
||||
[DataMember(Name = "parentId", IsRequired = true)]
|
||||
[Required]
|
||||
public int ParentId { get; set; }
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Runtime.Serialization;
|
||||
using System;
|
||||
using System.Runtime.Serialization;
|
||||
using Umbraco.Core.Models;
|
||||
|
||||
namespace Umbraco.Web.Models.ContentEditing
|
||||
@@ -16,5 +17,11 @@ namespace Umbraco.Web.Models.ContentEditing
|
||||
[DataMember(Name = "email")]
|
||||
public string Email { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// This is the unique Id stored in the database - but could also be the unique id for a custom membership provider
|
||||
/// </summary>
|
||||
[DataMember(Name = "key")]
|
||||
public Guid Key { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
37
src/Umbraco.Web/Models/ContentEditing/MemberPassword.cs
Normal file
37
src/Umbraco.Web/Models/ContentEditing/MemberPassword.cs
Normal file
@@ -0,0 +1,37 @@
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace Umbraco.Web.Models.ContentEditing
|
||||
{
|
||||
/// <summary>
|
||||
/// A model representing the data required to set a member/user password depending on the provider installed.
|
||||
/// </summary>
|
||||
public class MemberPassword
|
||||
{
|
||||
/// <summary>
|
||||
/// The password value
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This
|
||||
/// </remarks>
|
||||
[DataMember(Name = "newPassword")]
|
||||
public string NewPassword { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The old password - used to change a password when: EnablePasswordRetrieval = false
|
||||
/// </summary>
|
||||
[DataMember(Name = "oldPassword")]
|
||||
public string OldPassword { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Set to true if the password is to be reset - only valid when: EnablePasswordReset = true
|
||||
/// </summary>
|
||||
[DataMember(Name = "reset")]
|
||||
public bool? Reset { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The password answer - required for reset when: RequiresQuestionAndAnswer = true
|
||||
/// </summary>
|
||||
[DataMember(Name = "answer")]
|
||||
public string Answer { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Runtime.Serialization;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Models.Validation;
|
||||
|
||||
@@ -9,6 +10,11 @@ namespace Umbraco.Web.Models.ContentEditing
|
||||
/// </summary>
|
||||
public class MemberSave : ContentBaseItemSave<IMember>
|
||||
{
|
||||
public MemberSave()
|
||||
{
|
||||
Password = new MemberPassword();
|
||||
}
|
||||
|
||||
[DataMember(Name = "username", IsRequired = true)]
|
||||
[RequiredForPersistence(AllowEmptyStrings = false, ErrorMessage = "Required")]
|
||||
public string Username { get; set; }
|
||||
@@ -16,8 +22,8 @@ namespace Umbraco.Web.Models.ContentEditing
|
||||
[DataMember(Name = "email", IsRequired = true)]
|
||||
[RequiredForPersistence(AllowEmptyStrings = false, ErrorMessage = "Required")]
|
||||
public string Email { get; set; }
|
||||
|
||||
[DataMember(Name = "password")]
|
||||
public string Password { get; set; }
|
||||
|
||||
[DataMember(Name = "password")]
|
||||
public MemberPassword Password { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -28,6 +28,7 @@ namespace Umbraco.Web.Models.Mapping
|
||||
display.Alias = originalProp.Alias;
|
||||
display.Description = originalProp.PropertyType.Description;
|
||||
display.Label = originalProp.PropertyType.Name;
|
||||
display.HideLabel = display.PropertyEditor.ValueEditor.HideLabel;
|
||||
|
||||
var dataTypeService = _dataTypeService.Value;
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace Umbraco.Web.Models.Mapping
|
||||
{
|
||||
var propertyDto = base.ConvertCore(originalProperty);
|
||||
|
||||
var dataTypeService = (DataTypeService)_dataTypeService.Value;
|
||||
var dataTypeService = _dataTypeService.Value;
|
||||
|
||||
propertyDto.IsRequired = originalProperty.PropertyType.Mandatory;
|
||||
propertyDto.ValidationRegExp = originalProperty.PropertyType.ValidationRegExp;
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
using AutoMapper;
|
||||
using System.Collections.Generic;
|
||||
using System.Web.Security;
|
||||
using AutoMapper;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Models.Mapping;
|
||||
@@ -53,7 +55,9 @@ namespace Umbraco.Web.Models.Mapping
|
||||
config.CreateMap<IMember, ContentItemDto<IMember>>()
|
||||
.ForMember(
|
||||
dto => dto.Owner,
|
||||
expression => expression.ResolveUsing<OwnerResolver<IMember>>());
|
||||
expression => expression.ResolveUsing<OwnerResolver<IMember>>())
|
||||
//do no map the custom member properties (currently anyways, they were never there in 6.x)
|
||||
.ForMember(dto => dto.Properties, expression => expression.ResolveUsing<MemberDtoPropertiesValueResolver>());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -63,6 +67,8 @@ namespace Umbraco.Web.Models.Mapping
|
||||
/// <param name="display"></param>
|
||||
private static void MapGenericCustomProperties(IMember member, MemberDisplay display)
|
||||
{
|
||||
var membershipProvider = Membership.Provider;
|
||||
|
||||
TabsAndPropertiesResolver.MapGenericProperties(
|
||||
member, display,
|
||||
new ContentPropertyDisplay
|
||||
@@ -70,24 +76,53 @@ namespace Umbraco.Web.Models.Mapping
|
||||
Alias = string.Format("{0}login", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
|
||||
Label = ui.Text("login"),
|
||||
Value = display.Username,
|
||||
View = "textbox"
|
||||
View = "textbox",
|
||||
Config = new Dictionary<string, object> { { "IsRequired", true } }
|
||||
},
|
||||
new ContentPropertyDisplay
|
||||
{
|
||||
Alias = string.Format("{0}password", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
|
||||
Label = ui.Text("password"),
|
||||
Value = "",
|
||||
View = "changepassword" //TODO: Hard coding this because the templatepicker doesn't necessarily need to be a resolvable (real) property editor
|
||||
View = "changepassword",//TODO: Hard coding this because the templatepicker doesn't necessarily need to be a resolvable (real) property editor
|
||||
Config = new Dictionary<string, object>
|
||||
{
|
||||
//the password change toggle will only be displayed if there is already a password assigned.
|
||||
{ "hasPassword", member.Password.IsNullOrWhiteSpace() == false },
|
||||
{ "minPasswordLength", membershipProvider.MinRequiredPasswordLength },
|
||||
{ "enableReset", membershipProvider.EnablePasswordReset },
|
||||
{ "enablePasswordRetrieval" , membershipProvider.EnablePasswordRetrieval },
|
||||
{ "requiresQuestionAnswer", membershipProvider.RequiresQuestionAndAnswer }
|
||||
//TODO: Inject the other parameters in here to change the behavior of this control - based on the membership provider settings.
|
||||
}
|
||||
},
|
||||
new ContentPropertyDisplay
|
||||
{
|
||||
Alias = string.Format("{0}email", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
|
||||
Label = ui.Text("general", "email"),
|
||||
Value = display.Email,
|
||||
View = "textbox"
|
||||
View = "email",
|
||||
Config = new Dictionary<string, object> {{"IsRequired", true}}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This ensures that the custom membership provider properties are not mapped (currently since they weren't there in v6)
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Because these properties don't exist on the form, if we don't remove them for this map we'll get validation errors when posting data
|
||||
/// </remarks>
|
||||
internal class MemberDtoPropertiesValueResolver : ValueResolver<IMember, IEnumerable<ContentPropertyDto>>
|
||||
{
|
||||
protected override IEnumerable<ContentPropertyDto> ResolveCore(IMember source)
|
||||
{
|
||||
var exclude = Constants.Conventions.Member.StandardPropertyTypeStubs.Select(x => x.Value.Alias).ToArray();
|
||||
return source.Properties
|
||||
.Where(x => exclude.Contains(x.Alias) == false)
|
||||
.Select(Mapper.Map<Property, ContentPropertyDto>);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Models.Mapping;
|
||||
using Umbraco.Web.Models.ContentEditing;
|
||||
using umbraco;
|
||||
|
||||
namespace Umbraco.Web.Models.Mapping
|
||||
{
|
||||
@@ -10,6 +11,9 @@ namespace Umbraco.Web.Models.Mapping
|
||||
public override void ConfigureMappings(IConfiguration config, ApplicationContext applicationContext)
|
||||
{
|
||||
config.CreateMap<Section, Core.Models.Section>()
|
||||
.ForMember(
|
||||
dto => dto.Name,
|
||||
expression => expression.MapFrom(section => ui.Text("sections", section.Alias)))
|
||||
.ReverseMap(); //backwards too!
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,9 +41,9 @@ namespace Umbraco.Web.Models.Mapping
|
||||
/// setting up the properties such as Created date, udpated date, template selected, etc...
|
||||
/// </remarks>
|
||||
public static void MapGenericProperties<TPersisted>(
|
||||
TPersisted content,
|
||||
TPersisted content,
|
||||
ContentItemDisplayBase<ContentPropertyDisplay, TPersisted> display,
|
||||
params ContentPropertyDisplay[] customProperties)
|
||||
params ContentPropertyDisplay[] customProperties)
|
||||
where TPersisted : IContentBase
|
||||
{
|
||||
|
||||
@@ -105,6 +105,7 @@ namespace Umbraco.Web.Models.Mapping
|
||||
|
||||
//re-assign
|
||||
genericProps.Properties = contentProps;
|
||||
|
||||
}
|
||||
|
||||
protected override IEnumerable<Tab<ContentPropertyDisplay>> ResolveCore(IContentBase content)
|
||||
@@ -141,7 +142,7 @@ namespace Umbraco.Web.Models.Mapping
|
||||
{
|
||||
Id = rootGroup.Id,
|
||||
Alias = rootGroup.Name,
|
||||
Label = rootGroup.Name,
|
||||
Label = TranslateTab(rootGroup.Name),
|
||||
Properties = aggregateProperties,
|
||||
IsActive = false
|
||||
});
|
||||
@@ -155,16 +156,45 @@ namespace Umbraco.Web.Models.Mapping
|
||||
aggregateTabs.Add(new Tab<ContentPropertyDisplay>
|
||||
{
|
||||
Id = 0,
|
||||
Label = "Generic properties",
|
||||
Label = ui.Text("general", "properties"),
|
||||
Alias = "Generic properties",
|
||||
Properties = Mapper.Map<IEnumerable<Property>, IEnumerable<ContentPropertyDisplay>>(orphanProperties)
|
||||
});
|
||||
|
||||
|
||||
|
||||
//set the first tab to active
|
||||
aggregateTabs.First().IsActive = true;
|
||||
|
||||
return aggregateTabs;
|
||||
}
|
||||
|
||||
private string TranslateTab(string tabName)
|
||||
{
|
||||
|
||||
if (!tabName.StartsWith("#"))
|
||||
return tabName;
|
||||
|
||||
return tabName.Substring(1);
|
||||
|
||||
/*
|
||||
* The below currently doesnt work on my machine, since the dictonary always creates an entry with lang id = 0, but I dont have a lang id zero
|
||||
* so the query always fails, which is odd
|
||||
*
|
||||
var local = ApplicationContext.Current.Services.LocalizationService;
|
||||
var dic = local.GetDictionaryItemByKey(tabName);
|
||||
if (dic == null || !dic.Translations.Any())
|
||||
return tabName;
|
||||
|
||||
var lang = local.GetLanguageByCultureCode(UmbracoContext.Current.Security.CurrentUser.Language);
|
||||
if (lang == null)
|
||||
return tabName;
|
||||
|
||||
|
||||
var translation = dic.Translations.Where(x => x.Language == lang).FirstOrDefault();
|
||||
if (translation == null)
|
||||
return tabName;
|
||||
|
||||
return translation.Value;*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace Umbraco.Web.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a paged result for a model collection
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
[DataContract(Name = "pagedCollection", Namespace = "")]
|
||||
public class PagedResult<T>
|
||||
{
|
||||
public PagedResult(long totalItems, long pageNumber, long pageSize)
|
||||
{
|
||||
TotalItems = totalItems;
|
||||
PageNumber = pageNumber;
|
||||
PageSize = pageSize;
|
||||
|
||||
if (pageSize > 0)
|
||||
{
|
||||
TotalPages = (long) Math.Ceiling(totalItems/(Decimal) pageSize);
|
||||
}
|
||||
else
|
||||
{
|
||||
TotalPages = 1;
|
||||
}
|
||||
}
|
||||
|
||||
[DataMember(Name = "pageNumber")]
|
||||
public long PageNumber { get; private set; }
|
||||
|
||||
[DataMember(Name = "pageSize")]
|
||||
public long PageSize { get; private set; }
|
||||
|
||||
[DataMember(Name = "totalPages")]
|
||||
public long TotalPages { get; private set; }
|
||||
|
||||
[DataMember(Name = "totalItems")]
|
||||
public long TotalItems { get; private set; }
|
||||
|
||||
[DataMember(Name = "items")]
|
||||
public IEnumerable<T> Items { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Calculates the skip size based on the paged parameters specified
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Returns 0 if the page number or page size is zero
|
||||
/// </remarks>
|
||||
internal int SkipSize
|
||||
{
|
||||
get
|
||||
{
|
||||
if (PageNumber > 0 && PageSize > 0)
|
||||
{
|
||||
return Convert.ToInt32((PageNumber - 1)*PageSize);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user