Browse Source

Revise Member Profile page

pull/41/head
Berkan Sasmaz 5 years ago
parent
commit
63ea355e90
  1. 2
      src/EventHub.Application.Contracts/Events/EventDetailDto.cs
  2. 10
      src/EventHub.Application.Contracts/Members/IMemberAppService.cs
  3. 19
      src/EventHub.Application.Contracts/Members/UserDto.cs
  4. 3
      src/EventHub.Application/EventHubApplicationAutoMapperProfile.cs
  5. 5
      src/EventHub.Application/Events/EventAppService.cs
  6. 24
      src/EventHub.Application/Members/MemberAppService.cs
  7. 2
      src/EventHub.Web.Theme/Themes/EventHub/Components/MainNavbar/Default.cshtml
  8. 4
      src/EventHub.Web/Pages/Events/Components/AttendeesArea/Default.cshtml
  9. 4
      src/EventHub.Web/Pages/Events/Detail.cshtml
  10. 119
      src/EventHub.Web/Pages/Members/Profile.cshtml
  11. 54
      src/EventHub.Web/Pages/Members/Profile.cshtml.cs
  12. 4
      src/EventHub.Web/Pages/Organizations/Components/MembersArea/_memberListSection.cshtml
  13. 6
      src/EventHub.Web/Pages/Organizations/Profile.cshtml
  14. 2
      src/EventHub.Web/Pages/Organizations/Profile.cshtml.cs
  15. 82
      src/EventHub.Web/Pages/Profile.cshtml
  16. 10
      src/EventHub.Web/Pages/Profile.cshtml.cs

2
src/EventHub.Application.Contracts/Events/EventDetailDto.cs

@ -11,6 +11,8 @@ namespace EventHub.Events
public string OrganizationDisplayName { get; set; }
public string OwnerUserName { get; set; }
public string OwnerEmail { get; set; }
public string Title { get; set; }

10
src/EventHub.Application.Contracts/Members/IMemberAppService.cs

@ -0,0 +1,10 @@
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace EventHub.Members
{
public interface IMemberAppService : IApplicationService
{
Task<UserDto> FindByUserNameAsync(string username);
}
}

19
src/EventHub.Application.Contracts/Members/UserDto.cs

@ -0,0 +1,19 @@
using System;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Auditing;
namespace EventHub.Members
{
public class UserDto : EntityDto<Guid>, IHasCreationTime
{
public string UserName { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string Email { get; set; }
public DateTime CreationTime { get; set; }
}
}

3
src/EventHub.Application/EventHubApplicationAutoMapperProfile.cs

@ -2,6 +2,7 @@
using EventHub.Countries;
using EventHub.Events;
using EventHub.Events.Registrations;
using EventHub.Members;
using EventHub.Organizations;
using EventHub.Organizations.Memberships;
using EventHub.Users;
@ -34,6 +35,8 @@ namespace EventHub
.Ignore(x => x.Country);
CreateMap<Country, CountryLookupDto>();
CreateMap<AppUser, UserDto>();
}
}
}

5
src/EventHub.Application/Events/EventAppService.cs

@ -179,9 +179,12 @@ namespace EventHub.Events
dto.OrganizationId = organization.Id;
dto.OrganizationName = organization.Name;
dto.OrganizationDisplayName = organization.DisplayName;
dto.OwnerEmail = (await _userRepository.GetAsync(organization.OwnerUserId)).Email;
dto.CoverImageContent = await GetCoverImageAsync(dto.Id);
var user = await _userRepository.GetAsync(organization.OwnerUserId);
dto.OwnerUserName = user.UserName;
dto.OwnerEmail = user.Email;
return dto;
}

24
src/EventHub.Application/Members/MemberAppService.cs

@ -0,0 +1,24 @@
using System;
using System.Threading.Tasks;
using EventHub.Users;
using Volo.Abp.Domain.Repositories;
namespace EventHub.Members
{
public class MemberAppService : EventHubAppService, IMemberAppService
{
private readonly IRepository<AppUser, Guid> _userRepository;
public MemberAppService(IRepository<AppUser, Guid> userRepository)
{
_userRepository = userRepository;
}
public async Task<UserDto> FindByUserNameAsync(string username)
{
var user = await _userRepository.FindAsync(x => x.UserName == username);
return ObjectMapper.Map<AppUser, UserDto>(user);
}
}
}

2
src/EventHub.Web.Theme/Themes/EventHub/Components/MainNavbar/Default.cshtml

@ -59,7 +59,7 @@
<a class="dropdown-item" href="@(EventHubExternalUrls.EhAccount.EnsureEndsWith('/') + "account/manage")" target="_blank" title="@L["Settings"]">
<i class="fas fa-cog"></i> @L["Settings"]
</a>
<a class="dropdown-item" href="@Url.Page("/profile")" title="@L["Profile"]">
<a class="dropdown-item" href="/members/profile?username=@CurrentUser.UserName" title="@L["Profile"]">
<i class="fas fa-user"></i> @L["Profile"]
</a>
<a class="dropdown-item" href="/account/logout?returnUrl=@EventHubExternalUrls.EhWww@(System.Net.WebUtility.UrlEncode(Context.Request.GetEncodedPathAndQuery()))" title="@L["Logout"]">

4
src/EventHub.Web/Pages/Events/Components/AttendeesArea/Default.cshtml

@ -5,7 +5,9 @@
<div>
@foreach (var attendee in Model.Attendees)
{
<img gravatar-email="@attendee.Email" default-image="Wavatar" gravatar-size="40" class="org-avatar rounded-circle"/>
<a href="/members/profile?username=@attendee.UserName">
<img gravatar-email="@attendee.Email" default-image="Wavatar" gravatar-size="40" class="org-avatar rounded-circle"/>
</a>
}
</div>
}

4
src/EventHub.Web/Pages/Events/Detail.cshtml

@ -34,7 +34,9 @@
<h5 class="detail-head mt-4">Owner</h5>
<div>
<img gravatar-email="@Model.Event.OwnerEmail" default-image="Wavatar" gravatar-size="40" class="org-avatar avatar rounded-circle"/>
<a href="/members/profile?username=@Model.Event.OwnerUserName">
<img gravatar-email="@Model.Event.OwnerEmail" default-image="Wavatar" gravatar-size="40" class="org-avatar avatar rounded-circle"/>
</a>
</div>
@if (Model.IsEventOwner)
{

119
src/EventHub.Web/Pages/Members/Profile.cshtml

@ -0,0 +1,119 @@
@page
@using System.Globalization
@using EventHub.Web.Pages.Events.Components.EventsArea
@using EventHub.Web.Pages.Organizations.Components.OrganizationsArea
@using Volo.Abp.Timing
@using Volo.Abp.Users
@inject ICurrentUser CurrentUser
@inject IClock Clock
@model EventHub.Web.Pages.Members.ProfileModel
<div class="container pt-4">
<div class="row py-4">
<div class="col-md-2">
<div class="">
<ul class="card list-group">
<div class="card-body">
<div class="text-center">
<div>
<div class="profile-pic">
<div class="position-relative d-inline-block mx-auto">
<img gravatar-email="@Model.User.Email" default-image="Wavatar" gravatar-size="80" class="avatar rounded-circle"/>
</div>
</div>
@if (Model.User.Name != null && Model.User.Surname != null)
{
<h4 class="m-0 mt-4">@Model.User.Name @Model.User.Surname</h4>
}
</div>
<div class="mt-4">
<small class="text-muted text-uppercase">UserName</small>
<h4 class="m-0">@Model.User.UserName</h4>
</div>
<div class="mt-4">
<small class="text-muted text-uppercase">Registration Date</small>
<h5 class="m-0">@Model.User.CreationTime.ToString(CultureInfo.CurrentUICulture.DateTimeFormat.ShortDatePattern)</h5>
</div>
</div>
</div>
</ul>
</div>
</div>
<div class="col-md-10">
<ul class="nav nav-tabs profile-nav" id="profileTab">
<li class="nav-item">
<a href="#Organizations" class="nav-link active" data-toggle="tab">Organizations</a>
</li>
<li class="nav-item">
<a href="#AttendedEvents" class="nav-link" data-toggle="tab">Attended Events</a>
</li>
<li class="nav-item">
<a href="#UpcomingEvents" class="nav-link" data-toggle="tab">Upcoming Events</a>
</li>
</ul>
<div class="tab-content profile-content py-4">
<div id="Organizations" class="tab-pane fade show active">
<div class="row">
<div class="col">
<div class="card">
<div class="card-body" style="min-height: 496px">
<div>
<h3 class="mb-4">Ownered Organizations</h3>
<partial name="~/Pages/Organizations/Components/OrganizationsArea/_organizationListSection.cshtml" model="@Model.Organizations"/>
</div>
<div>
<h3 class="mb-4">Membership Organizations</h3>
@await Component.InvokeAsync(typeof(OrganizationsAreaViewComponent), new
{
registeredUserId = Model.User.Id,
maxResultCount = 6
})
</div>
</div>
</div>
</div>
</div>
</div>
<div id="AttendedEvents" class="tab-pane fade">
<div class="row">
<div class="col">
<div class="card">
<div class="card-body" style="min-height: 496px">
<h3 class="mb-4">Attended Events</h3>
<div class="past-events">
@await Component.InvokeAsync(typeof(EventsAreaViewComponent), new
{
maxDate = Clock.Now.ClearTime(),
registeredUserId = Model.User.Id,
maxResultCount = 6,
skipCount = 0
})
</div>
</div>
</div>
</div>
</div>
</div>
<div id="UpcomingEvents" class="tab-pane fade">
<div class="row">
<div class="col">
<div class="card">
<div class="card-body" style="min-height: 496px">
<h3 class="mb-4">Upcoming Events</h3>
@await Component.InvokeAsync(typeof(EventsAreaViewComponent), new
{
minDate = Clock.Now.ClearTime(),
registeredUserId = Model.User.Id,
maxResultCount = 6,
skipCount = 0,
})
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

54
src/EventHub.Web/Pages/Members/Profile.cshtml.cs

@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using EventHub.Members;
using EventHub.Organizations;
using Microsoft.AspNetCore.Mvc;
namespace EventHub.Web.Pages.Members
{
public class ProfileModel : EventHubPageModel
{
private readonly IMemberAppService _memberAppService;
private readonly IOrganizationAppService _organizationAppService;
public List<OrganizationInListDto> Organizations { get; set; }
public ProfileModel(
IMemberAppService memberAppService,
IOrganizationAppService organizationAppService)
{
_memberAppService = memberAppService;
_organizationAppService = organizationAppService;
}
public UserDto User { get; set; }
public async Task<IActionResult> OnGetAsync(string userName)
{
Organizations = (await _organizationAppService.GetMyOrganizationsAsync()).Items.ToList();
if (userName.IsNullOrWhiteSpace())
{
if (CurrentUser.IsAuthenticated)
{
userName = CurrentUser.UserName;
}
else
{
return Redirect("/events");
}
}
User = await _memberAppService.FindByUserNameAsync(userName);
if (User != null)
{
return Page();
}
return Redirect("/events");
}
}
}

4
src/EventHub.Web/Pages/Organizations/Components/MembersArea/_memberListSection.cshtml

@ -4,7 +4,9 @@
{
<div>
<div>
<img gravatar-email="@member.Email" default-image="Wavatar" gravatar-size="40" class="org-avatar avatar rounded-circle"/>
<a href="/members/profile?username=@member.UserName">
<img gravatar-email="@member.Email" default-image="Wavatar" gravatar-size="40" class="org-avatar avatar rounded-circle"/>
</a>
<span class="member-name" style="display: none">
@if (!string.IsNullOrWhiteSpace(member.Name) && !string.IsNullOrWhiteSpace(member.Surname))
{

6
src/EventHub.Web/Pages/Organizations/Profile.cshtml

@ -55,13 +55,15 @@
<div class="col-md-5">
<h5 class="detail-head mt-3 font-weight-bold">Owners</h5>
<div>
<img gravatar-email="@Model.Organization.OwnerEmail" default-image="Wavatar" gravatar-size="40" class="org-avatar avatar rounded-circle" data-toggle="tooltip" title="" data-original-title="@Model.Organization.OwnerUserName"/>
<a href="/members/profile?username=@Model.Organization.OwnerUserName">
<img gravatar-email="@Model.Organization.OwnerEmail" default-image="Wavatar" gravatar-size="40" class="org-avatar avatar rounded-circle" data-toggle="tooltip" title="" data-original-title="@Model.Organization.OwnerUserName"/>
</a>
</div>
@if (Model.IsOrganizationOwner)
{
<a href="/organization/edit/@Model.Organization.Name" class="btn btn-primary mt-4 text-white">
<i class="far fa-edit"></i> Edit
<i class="far fa-edit"></i> edit
</a>
}
@await Component.InvokeAsync(typeof(JoinAreaViewComponent), new {organizationId = Model.Organization.Id})

2
src/EventHub.Web/Pages/Organizations/Profile.cshtml.cs

@ -15,7 +15,7 @@ namespace EventHub.Web.Pages.Organizations
public bool IsOrganizationOwner { get; private set; }
public bool IsShowSocialMediaContent { get; set; } = false;
public bool IsShowSocialMediaContent { get; set; }
private readonly IOrganizationAppService _organizationAppService;

82
src/EventHub.Web/Pages/Profile.cshtml

@ -1,82 +0,0 @@
@page "/profile"
@using EventHub.Web.Pages.Events.Components.EventsArea
@using EventHub.Web.Pages.Organizations.Components.OrganizationsArea
@using Volo.Abp.Timing
@using Volo.Abp.Users
@inject ICurrentUser CurrentUser
@inject IClock Clock
@model EventHub.Web.Pages.ProfileModel
<div class="container pt-4">
<div class="row py-4">
<div class="col-md">
<ul class="nav nav-tabs profile-nav" id="profileTab">
<li class="nav-item">
<a href="#MyOrganizations" class="nav-link active" data-toggle="tab">My Organizations</a>
</li>
<li class="nav-item">
<a href="#MyPastEvents" class="nav-link" data-toggle="tab">My Past Events</a>
</li>
<li class="nav-item">
<a href="#MyUpcomingEvents" class="nav-link" data-toggle="tab">My Upcoming Events</a>
</li>
</ul>
<div class="tab-content profile-content py-4">
<div id="MyOrganizations" class="tab-pane fade show active">
<div class="row">
<div class="col">
<div class="card">
<div class="card-body" style="min-height: 496px">
<h3 class="mb-4">My Organizations</h3>
@await Component.InvokeAsync(typeof(OrganizationsAreaViewComponent), new
{
registeredUserId = CurrentUser.GetId(),
maxResultCount = 12
})
</div>
</div>
</div>
</div>
</div>
<div id="MyPastEvents" class="tab-pane fade">
<div class="row">
<div class="col">
<div class="card">
<div class="card-body" style="min-height: 496px">
<h3 class="mb-4">My Past Events</h3>
<div class="past-events">
@await Component.InvokeAsync(typeof(EventsAreaViewComponent), new
{
maxDate = Clock.Now.ClearTime(),
registeredUserId = CurrentUser.GetId(),
maxResultCount = 6,
skipCount = 0
})
</div>
</div>
</div>
</div>
</div>
</div>
<div id="MyUpcomingEvents" class="tab-pane fade">
<div class="row">
<div class="col">
<div class="card">
<div class="card-body" style="min-height: 496px">
<h3 class="mb-4">My Upcoming Events</h3>
@await Component.InvokeAsync(typeof(EventsAreaViewComponent), new
{
minDate = Clock.Now.ClearTime(),
registeredUserId = CurrentUser.GetId(),
maxResultCount = 6,
skipCount = 0
})
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

10
src/EventHub.Web/Pages/Profile.cshtml.cs

@ -1,10 +0,0 @@
namespace EventHub.Web.Pages
{
public class ProfileModel : EventHubPageModel
{
public void OnGet()
{
}
}
}
Loading…
Cancel
Save