From 48ab9a19e88ebab1cab9addac6e00d9a67e3a968 Mon Sep 17 00:00:00 2001 From: James Kolpack Date: Fri, 24 Feb 2023 10:52:33 -0500 Subject: [PATCH] UserList improvements --- WebCms/Controllers/MembershipController.cs | 48 +++++++++++++++++++--- WebCms/Models/UserViewModel.cs | 14 +++++++ WebCms/Views/Membership/UserList.cshtml | 29 +++++++++---- WebCms/WebCms.csproj | 4 ++ WebCms/packages.config | 1 + 5 files changed, 82 insertions(+), 14 deletions(-) create mode 100644 WebCms/Models/UserViewModel.cs diff --git a/WebCms/Controllers/MembershipController.cs b/WebCms/Controllers/MembershipController.cs index 9ced867..b8652ec 100644 --- a/WebCms/Controllers/MembershipController.cs +++ b/WebCms/Controllers/MembershipController.cs @@ -1,8 +1,8 @@ -using System; -using System.Linq; +using System.Linq; using System.Web.Mvc; using System.Web.Security; using Hangfire; +using JoinExtensions.Enumerable; using LeafWeb.WebCms.Models; using LeafWeb.WebCms.Services; using log4net; @@ -215,13 +215,49 @@ namespace LeafWeb.WebCms.Controllers [MemberAuthorize(AllowGroup = "Administrator")] public ActionResult UserList() { - var emails - = from li in DataService.GetLeafInputs() + var leafInputUsers= + from li in DataService.GetLeafInputs() group li by li.Email into emailGroup - select new { emailGroup.Key, emailGroup.FirstOrDefault().Name }; + select new UserViewModel + { + Email = emailGroup.Key, + Name = emailGroup.FirstOrDefault().Name, + LeafInputCount = emailGroup.Count(), + FirstSeen = emailGroup.OrderBy(e => e.Added).FirstOrDefault().Added + }; - return View(emails.ToList().Select(e => new Tuple(e.Name, e.Key))); + var memberService = ApplicationContext.Current.Services.MemberService; + + // join leaf input users and memberships together on email address + var users = + memberService.GetAllMembers() + .FullOuterJoinExtEnumerable( + leafInputUsers, + m => m.Email, + uvm => uvm.Email, + (member, leafInputUser) => + { + if (member == null) + return leafInputUser; + var vm = new UserViewModel + { + Email = member.Email, + Name = member.Name, + Member = true, + FirstSeen = member.CreateDate + }; + if (leafInputUser == null) + return vm; + + vm.LeafInputCount = leafInputUser.LeafInputCount; + if (leafInputUser.FirstSeen < vm.FirstSeen) + vm.FirstSeen = leafInputUser.FirstSeen; + + return vm; + }); + + return View(users.DistinctBy(u => u.Email).OrderByDescending(u => u.FirstSeen)); } } } \ No newline at end of file diff --git a/WebCms/Models/UserViewModel.cs b/WebCms/Models/UserViewModel.cs new file mode 100644 index 0000000..ab4a0b3 --- /dev/null +++ b/WebCms/Models/UserViewModel.cs @@ -0,0 +1,14 @@ +using System; + +namespace LeafWeb.WebCms.Models +{ + public class UserViewModel + { + public string Email { get; set; } + public string Name { get; set; } + public bool Member { get; set; } + public int LeafInputCount { get; set; } + + public DateTime FirstSeen { get; set; } + } +} \ No newline at end of file diff --git a/WebCms/Views/Membership/UserList.cshtml b/WebCms/Views/Membership/UserList.cshtml index 796bf71..6b976ed 100644 --- a/WebCms/Views/Membership/UserList.cshtml +++ b/WebCms/Views/Membership/UserList.cshtml @@ -1,16 +1,29 @@ -@model IEnumerable> +@model IEnumerable
-
- - - @foreach (var m in Model) - { +
+
+ + + + + @foreach (var m in Model) + { - + + + + + - } + } +
EmailNameFirst SeenMember# of Leaf Input
@m.Item1@m.Item2@m.Email@m.Name@m.FirstSeen.ToShortDateString() + @if (m.Member) + { + + } + @m.LeafInputCount
diff --git a/WebCms/WebCms.csproj b/WebCms/WebCms.csproj index 05fd4d0..59d31d8 100644 --- a/WebCms/WebCms.csproj +++ b/WebCms/WebCms.csproj @@ -118,6 +118,9 @@ ..\packages\UmbracoCms.Core.7.15.10\lib\net452\interfaces.dll + + ..\packages\leftjoin-rightjoin-fulljoin-outerjoin.3.2.0\lib\netstandard2.0\JoinExtensions.dll + ..\packages\UmbracoCms.Core.7.15.10\lib\net452\log4net.dll @@ -1237,6 +1240,7 @@ + diff --git a/WebCms/packages.config b/WebCms/packages.config index d73e7b3..a0e12b8 100644 --- a/WebCms/packages.config +++ b/WebCms/packages.config @@ -20,6 +20,7 @@ +