From 21e38935283aafd46c66e43ee1b02b7c0fdc0127 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 18 Nov 2013 15:58:53 +1100 Subject: [PATCH] Fixes: U4-3558 members tree syncing is a bit strange and not showing the selected member --- .../views/member/member.edit.controller.js | 3 +- src/Umbraco.Web/Editors/MemberController.cs | 10 +++++ .../Models/Mapping/MemberModelMapper.cs | 2 +- src/Umbraco.Web/Trees/MemberTreeController.cs | 18 ++++++++- src/Umbraco.Web/Umbraco.Web.csproj | 1 + .../WebApi/ControllerContextExtensions.cs | 11 +++++ .../WebApi/GuidNoHyphenConverter.cs | 40 +++++++++++++++++++ 7 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 src/Umbraco.Web/WebApi/GuidNoHyphenConverter.cs diff --git a/src/Umbraco.Web.UI.Client/src/views/member/member.edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/member/member.edit.controller.js index 3218d64af7..52ed0c38a2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/member/member.edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/member/member.edit.controller.js @@ -16,8 +16,7 @@ function MemberEditController($scope, $routeParams, $location, $q, $window, appS //build a path to sync the tree with function buildTreePath(data) { //TODO: Will this work for the 'other' list ? - var path = data.name[0] + "," + data.key; - path = path.replace(/-/g, ''); + var path = data.name[0].toLowerCase() + "," + data.key; return path; } diff --git a/src/Umbraco.Web/Editors/MemberController.cs b/src/Umbraco.Web/Editors/MemberController.cs index c1f147b64a..0090d76cd8 100644 --- a/src/Umbraco.Web/Editors/MemberController.cs +++ b/src/Umbraco.Web/Editors/MemberController.cs @@ -54,6 +54,16 @@ namespace Umbraco.Web.Editors { } + /// + /// Ensure all GUIDs are formatted without hyphens + /// + /// + protected override void Initialize(System.Web.Http.Controllers.HttpControllerContext controllerContext) + { + base.Initialize(controllerContext); + controllerContext.SetOutgoingNoHyphenGuidFormat(); + } + /// /// Returns the currently configured membership scenario for members in umbraco /// diff --git a/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs b/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs index 2c13a73255..da8010698d 100644 --- a/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs @@ -37,7 +37,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(member => member.CreateDate, expression => expression.MapFrom(user => user.CreationDate)) .ForMember(member => member.UpdateDate, expression => expression.MapFrom(user => user.LastActivityDate)) .ForMember(member => member.LastPasswordChangeDate, expression => expression.MapFrom(user => user.LastPasswordChangedDate)) - .ForMember(member => member.Key, expression => expression.MapFrom(user => user.ProviderUserKey.TryConvertTo().Result)) + .ForMember(member => member.Key, expression => expression.MapFrom(user => user.ProviderUserKey.TryConvertTo().Result.ToString("N"))) //This is a special case for password - we don't actually care what the password is but it either needs to be something or nothing // so we'll set it to something if the member is actually created, otherwise nothing if it is a new member. .ForMember(member => member.Password, expression => expression.MapFrom(user => user.CreationDate > DateTime.MinValue ? Guid.NewGuid().ToString("N") : "")) diff --git a/src/Umbraco.Web/Trees/MemberTreeController.cs b/src/Umbraco.Web/Trees/MemberTreeController.cs index c740ccda5f..f01eb7a4a1 100644 --- a/src/Umbraco.Web/Trees/MemberTreeController.cs +++ b/src/Umbraco.Web/Trees/MemberTreeController.cs @@ -61,7 +61,7 @@ namespace Umbraco.Web.Trees int total; nodes.AddRange( Membership.Provider.FindUsersByName(id + "%", 0, 9999, out total).Cast() - .Select(m => CreateTreeNode(m.ProviderUserKey.ToString(), id, queryStrings, m.UserName, "icon-user"))); + .Select(m => CreateTreeNode(GetNodeIdForCustomProvider(m.ProviderUserKey), id, queryStrings, m.UserName, "icon-user"))); } } else if (id == "others") @@ -75,6 +75,22 @@ namespace Umbraco.Web.Trees return nodes; } + /// + /// We'll see if it is a GUID, if so we'll ensure to format it without hyphens + /// + /// + /// + private string GetNodeIdForCustomProvider(object providerUserKey) + { + if (providerUserKey == null) throw new ArgumentNullException("providerUserKey"); + var guidAttempt = providerUserKey.TryConvertTo(); + if (guidAttempt.Success) + { + return guidAttempt.Result.ToString("N"); + } + return providerUserKey.ToString(); + } + protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings) { var menu = new MenuItemCollection(); diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 65b2011f6d..652a5d3ffb 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -655,6 +655,7 @@ + diff --git a/src/Umbraco.Web/WebApi/ControllerContextExtensions.cs b/src/Umbraco.Web/WebApi/ControllerContextExtensions.cs index 1858048ba6..590785f188 100644 --- a/src/Umbraco.Web/WebApi/ControllerContextExtensions.cs +++ b/src/Umbraco.Web/WebApi/ControllerContextExtensions.cs @@ -5,6 +5,17 @@ namespace Umbraco.Web.WebApi { internal static class ControllerContextExtensions { + /// + /// Sets the JSON GUID format to not have hyphens + /// + /// + internal static void SetOutgoingNoHyphenGuidFormat(this HttpControllerContext controllerContext) + { + var jsonFormatter = controllerContext.Configuration.Formatters.JsonFormatter; + jsonFormatter.SerializerSettings.Converters.Add(new GuidNoHyphenConverter()); + } + + /// /// Sets the JSON datetime format to be a custom one /// diff --git a/src/Umbraco.Web/WebApi/GuidNoHyphenConverter.cs b/src/Umbraco.Web/WebApi/GuidNoHyphenConverter.cs new file mode 100644 index 0000000000..20e6cabfd0 --- /dev/null +++ b/src/Umbraco.Web/WebApi/GuidNoHyphenConverter.cs @@ -0,0 +1,40 @@ +using System; +using Newtonsoft.Json; +using Umbraco.Core; + +namespace Umbraco.Web.WebApi +{ + /// + /// A custom converter for GUID's to format without hyphens + /// + internal class GuidNoHyphenConverter : JsonConverter + { + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + switch (reader.TokenType) + { + case JsonToken.Null: + return Guid.Empty; + case JsonToken.String: + var guidAttempt = reader.Value.TryConvertTo(); + if (guidAttempt.Success) + { + return guidAttempt.Result; + } + throw new FormatException("Could not convert " + reader.Value + " to a GUID"); + default: + throw new ArgumentException("Invalid token type"); + } + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + writer.WriteValue(Guid.Empty.Equals(value) ? "" : ((Guid) value).ToString("N")); + } + + public override bool CanConvert(Type objectType) + { + return typeof(Guid) == objectType; + } + } +} \ No newline at end of file