Browse Source

Add Profile page

pull/41/head
Berkan Sasmaz 6 years ago
parent
commit
6e7e614f5d
  1. 2
      src/EventHub.Application.Contracts/Events/EventListFilterDto.cs
  2. 44
      src/EventHub.Application/Events/EventAppService.cs
  3. 2
      src/EventHub.Web.Theme/Themes/EventHub/Components/MainNavbar/Default.cshtml
  4. 7
      src/EventHub.Web/Pages/Events/Components/EventsArea/Default.cshtml
  5. 5
      src/EventHub.Web/Pages/Events/Components/EventsArea/EventsAreaViewComponent.cs
  6. 5
      src/EventHub.Web/Pages/Events/Components/EventsArea/events-area.js
  7. 20
      src/EventHub.Web/Pages/Events/Detail.cshtml
  8. 6
      src/EventHub.Web/Pages/Organizations/Components/OrganizationsArea/Default.cshtml
  9. 5
      src/EventHub.Web/Pages/Organizations/Components/OrganizationsArea/organizations-area.js
  10. 285
      src/EventHub.Web/Pages/Profile.cshtml
  11. 9
      src/EventHub.Web/Pages/Profile.cshtml.cs

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

@ -10,6 +10,8 @@ namespace EventHub.Events
public DateTime? MaxDate { get; set; }
public Guid? OrganizationId { get; set; }
public Guid? RegisteredUserId { get; set; }
public bool? IsOnline { get; set; }

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

@ -20,6 +20,7 @@ namespace EventHub.Events
{
private readonly EventManager _eventManager;
private readonly EventRegistrationManager _eventRegistrationManager;
private readonly IRepository<EventRegistration, Guid> _eventRegistrationRepository;
private readonly IRepository<Event, Guid> _eventRepository;
private readonly IRepository<Organization, Guid> _organizationRepository;
private readonly IRepository<AppUser, Guid> _userRepository;
@ -29,14 +30,16 @@ namespace EventHub.Events
public EventAppService(
EventManager eventManager,
EventRegistrationManager eventRegistrationManager,
IRepository<EventRegistration, Guid> eventRegistrationRepository,
IRepository<Event, Guid> eventRepository,
IRepository<Organization, Guid> organizationRepository,
IRepository<AppUser, Guid> userRepository,
IRepository<Country, Guid> countriesRepository,
IRepository<Organization, Guid> organizationRepository,
IRepository<AppUser, Guid> userRepository,
IRepository<Country, Guid> countriesRepository,
IBlobContainer<EventCoverImageContainer> eventBlobContainer)
{
_eventManager = eventManager;
_eventRegistrationManager = eventRegistrationManager;
_eventRegistrationRepository = eventRegistrationRepository;
_eventRepository = eventRepository;
_organizationRepository = organizationRepository;
_userRepository = userRepository;
@ -74,7 +77,7 @@ namespace EventHub.Events
{
await SaveCoverImageAsync(@event.Id, input.CoverImageContent);
}
await _eventRepository.InsertAsync(@event);
return ObjectMapper.Map<Event, EventDto>(@event);
@ -83,12 +86,23 @@ namespace EventHub.Events
public async Task<PagedResultDto<EventInListDto>> GetListAsync(EventListFilterDto input)
{
var eventQueryable = await _eventRepository.GetQueryableAsync();
var eventRegistrationQueryable = await _eventRegistrationRepository.GetQueryableAsync();
var organizationQueryable = await _organizationRepository.GetQueryableAsync();
var query = from @event in eventQueryable
join organization in organizationQueryable on @event.OrganizationId equals organization.Id
select new {@event, organization};
if (input.RegisteredUserId.HasValue)
{
var registeredEvent = _eventRegistrationRepository
.Where(x => x.UserId == input.RegisteredUserId)
.Select(s => s.EventId);
var eventIds = await AsyncExecuter.ToListAsync(registeredEvent);
query = query.Where(x => eventIds.Contains(x.@event.Id));
}
if (input.MinDate.HasValue)
{
query = query.Where(i => i.@event.EndTime >= input.MinDate.Value);
@ -103,17 +117,17 @@ namespace EventHub.Events
{
query = query.Where(i => i.@event.OrganizationId == input.OrganizationId.Value);
}
if (input.IsOnline.HasValue)
{
query = query.Where(i => i.@event.IsOnline == input.IsOnline);
}
if (!input.Language.IsNullOrWhiteSpace())
{
query = query.Where(i => i.@event.Language == input.Language);
}
if (input.CountryId.HasValue && input.CountryId != Guid.Empty)
{
query = query.Where(i => i.@event.CountryId == input.CountryId);
@ -177,15 +191,15 @@ namespace EventHub.Events
var user = await _userRepository.GetAsync(CurrentUser.GetId());
var dto = ObjectMapper.Map<Event, EventLocationDto>(@event);
dto.IsRegistered = await _eventRegistrationManager.IsRegisteredAsync(@event, user);
if (!dto.IsRegistered)
{
dto.OnlineLink = null;
dto.City = null;
}
if (dto.IsRegistered && @event.CountryId.HasValue)
{
dto.Country = (await _countriesRepository.GetAsync(@event.CountryId.Value)).Name;
@ -193,7 +207,7 @@ namespace EventHub.Events
return dto;
}
public async Task<List<CountryLookupDto>> GetCountriesLookupAsync()
{
var countriesQueryable = await _countriesRepository.GetQueryableAsync();
@ -233,7 +247,7 @@ namespace EventHub.Events
@event.SetTitle(input.Title);
@event.SetDescription(input.Description);
@event.Language = input.Language;
await _eventManager.SetCapacityAsync(@event, input.Capacity);
await _eventRepository.UpdateAsync(@event);
@ -252,7 +266,7 @@ namespace EventHub.Events
@event.SetTime(input.StartTime, input.EndTime);
@event.TimingChangeCount++;
await _eventRepository.UpdateAsync(@event);
}
@ -260,10 +274,10 @@ namespace EventHub.Events
public async Task SaveCoverImageAsync(Guid id, byte[] coverImageContent)
{
var blobName = id.ToString();
await _eventBlobContainer.SaveAsync(blobName, coverImageContent, overrideExisting: true);
}
private async Task<byte[]> GetCoverImageAsync(Guid id)
{
var blobName = id.ToString();

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

@ -56,7 +56,7 @@
</span>
</a>
<div class="dropdown-menu dropdown-menu-right">
<a class="dropdown-item" href="@(EventHubExternalUrls.EhAccount.EnsureEndsWith('/') + "Account/Manage")" target="_blank" title="@L["Settings"]">
<a class="dropdown-item" href="@Url.Page("/Profile")" title="@L["Settings"]">
<i class="fas fa-cog"></i> @L["Settings"]
</a>
<a class="dropdown-item" href="/Account/Logout?returnUrl=@EventHubExternalUrls.EhWww" title="@L["Logout"]">

7
src/EventHub.Web/Pages/Events/Components/EventsArea/Default.cshtml

@ -2,22 +2,23 @@
@if (Model.Events != null && Model.Events.Count > 0)
{
<div id="EventList" class="row" data-total-count="@Model.TotalCount" data-skip-count="@Model.SkipCount" data-max-result-count="@Model.MaxResultCount">
<div id="EventList" class="row" data-hash-code="@Model.GetHashCode()" data-total-count="@Model.TotalCount" data-skip-count="@Model.SkipCount" data-max-result-count="@Model.MaxResultCount">
<partial name="~/Pages/Events/Components/EventsArea/_eventListSection.cshtml" model="@Model.Events"/>
</div>
@if (Model.IsPagination && Model.TotalCount > Model.MaxResultCount && Model.TotalCount > Model.Events.Count)
{
<div class="row load-more-section">
<div class="row load-more-section-@Model.GetHashCode()">
<div class="col text-center">
<button
id="LoadMoreButton"
id="LoadMoreButton-@Model.GetHashCode()"
class="btn btn-secondary btn-lg"
data-url="@Url.Action("GetList","Event",
new {
minDate = Model.MinDate,
maxDate = Model.MaxDate,
organizationId = Model.OrganizationId,
registeredUserId = Model.RegisteredUserId,
isOnline = Model.IsOnline,
language = Model.Language,
countryId = Model.CountryId,

5
src/EventHub.Web/Pages/Events/Components/EventsArea/EventsAreaViewComponent.cs

@ -22,6 +22,7 @@ namespace EventHub.Web.Pages.Events.Components.EventsArea
public async Task<IViewComponentResult> InvokeAsync(
Guid? organizationId,
Guid? registeredUserId,
DateTime? minDate,
DateTime? maxDate,
bool? isOnline,
@ -35,6 +36,7 @@ namespace EventHub.Web.Pages.Events.Components.EventsArea
new EventListFilterDto
{
OrganizationId = organizationId,
RegisteredUserId = registeredUserId,
MinDate = minDate,
MaxDate = maxDate,
IsOnline = isOnline,
@ -52,6 +54,7 @@ namespace EventHub.Web.Pages.Events.Components.EventsArea
Events = result.Items,
TotalCount = result.TotalCount,
OrganizationId = organizationId,
RegisteredUserId = registeredUserId,
MinDate = minDate,
MaxDate = maxDate,
IsOnline = isOnline,
@ -72,6 +75,8 @@ namespace EventHub.Web.Pages.Events.Components.EventsArea
public Guid? OrganizationId { get; set; }
public Guid? RegisteredUserId { get; set; }
public DateTime? MinDate { get; set; }
public DateTime? MaxDate { get; set; }

5
src/EventHub.Web/Pages/Events/Components/EventsArea/events-area.js

@ -3,9 +3,10 @@
var totalCount = Number($wrapper.find('[data-total-count]').attr('data-total-count'))
var skipCount = Number($wrapper.find('[data-skip-count]').attr('data-skip-count'))
var maxResultCount = Number($wrapper.find('[data-max-result-count]').attr('data-max-result-count'))
var hashCode = Number($wrapper.find('[data-hash-code]').attr('data-hash-code'))
function init() {
var loadMoreButton = $wrapper.find('#LoadMoreButton');
var loadMoreButton = $wrapper.find('#LoadMoreButton-' + hashCode);
loadMoreButton.click(function (e) {
e.preventDefault();
skipCount += maxResultCount;
@ -21,7 +22,7 @@
}).always(function () {
var eventCount = $('.event').length;
if (Number(eventCount) >= totalCount) {
$('.load-more-section').hide();
$('.load-more-section-' + hashCode).hide();
}
loadMoreButton.buttonBusy(false);
});

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

@ -29,25 +29,19 @@
</div>
<div class="col-md-5 pl-md-5">
@if (Model.IsEventOwner)
{
<h1 class="mt-4 mt-md-0">
@Model.Event.Title
<a href="/event/edit/@Model.Event.Url" class="btn btn-primary btn-xs text-white">
<i class="far fa-edit"></i>
</a>
</h1>
}
else
{
<h1 class="mt-4 mt-md-0">@Model.Event.Title</h1>
}
<h1 class="mt-4 mt-md-0">@Model.Event.Title</h1>
@await Component.InvokeAsync(typeof(LocationAreaViewComponent), new {eventId = Model.Event.Id})
<h5 class="detail-head mt-4">Owner</h5>
<div>
<img gravatar-email="@Model.Event.OwnerEmail" default-image="Wavatar" gravatar-size="60" class="org-avatar avatar rounded-circle"/>
</div>
@if (Model.IsEventOwner)
{
<a href="/event/edit/@Model.Event.Url" class="btn btn-primary mt-4 text-white">
<i class="far fa-edit"></i> Edit
</a>
}
@await Component.InvokeAsync(typeof(RegistrationAreaViewComponent), new {eventId = Model.Event.Id})
</div>
</div>

6
src/EventHub.Web/Pages/Organizations/Components/OrganizationsArea/Default.cshtml

@ -2,16 +2,16 @@
@if (Model.Organizations != null && Model.Organizations.Count > 0)
{
<div id="OrganizationList" class="row" data-total-count="@Model.TotalCount" data-skip-count="@Model.SkipCount" data-max-result-count="@Model.MaxResultCount">
<div id="OrganizationList" class="row" data-hash-code="@Model.GetHashCode()" data-total-count="@Model.TotalCount" data-skip-count="@Model.SkipCount" data-max-result-count="@Model.MaxResultCount">
<partial name="~/Pages/Organizations/Components/OrganizationsArea/_organizationListSection.cshtml" model="@Model.Organizations"/>
</div>
@if (Model.IsPagination && Model.TotalCount > Model.MaxResultCount && Model.TotalCount > Model.Organizations.Count)
{
<div class="row load-more-section">
<div class="row load-more-section-@Model.GetHashCode()">
<div class="col text-center">
<button
id="LoadMoreButton"
id="LoadMoreButton-@Model.GetHashCode()"
class="btn btn-secondary btn-lg"
data-url="@Url.Action("GetList", "Organization", new {maxResultCount = Model.MaxResultCount})">
Load More

5
src/EventHub.Web/Pages/Organizations/Components/OrganizationsArea/organizations-area.js

@ -3,9 +3,10 @@
var totalCount = Number($wrapper.find('[data-total-count]').attr('data-total-count'))
var skipCount = Number($wrapper.find('[data-skip-count]').attr('data-skip-count'))
var maxResultCount = Number($wrapper.find('[data-max-result-count]').attr('data-max-result-count'))
var hashCode = Number($wrapper.find('[data-hash-code]').attr('data-hash-code'))
function init() {
var loadMoreButton = $wrapper.find('#LoadMoreButton');
var loadMoreButton = $wrapper.find('#LoadMoreButton-' + hashCode);
loadMoreButton.click(function (e) {
e.preventDefault();
skipCount += maxResultCount;
@ -21,7 +22,7 @@
}).always(function () {
var organizationCount = $('.organization').length;
if (Number(organizationCount) >= totalCount) {
$('.load-more-section').hide();
$('.load-more-section-' + hashCode).hide();
}
loadMoreButton.buttonBusy(false);
});

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

@ -0,0 +1,285 @@
@page
@using EventHub.Web.Pages.Events.Components.EventsArea
@using Volo.Abp.Identity
@using Volo.Abp.ObjectExtending
@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="myTab">
<li class="nav-item">
<a href="#MyProfile" class="nav-link active" data-toggle="tab">My Profile</a>
</li>
<li class="nav-item">
<a href="#NotificationSettings" class="nav-link" data-toggle="tab">Notification Settings</a>
</li>
<li class="nav-item">
<a href="#MyEvents" class="nav-link" data-toggle="tab">My Events</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="MyProfile" class="tab-pane fade show active">
<div class="row">
<div class="col-md-4">
<div class="card">
<div class="card-body text-center">
<h3 class="text-left">Profile Photo</h3>
<img src="assets/big-avatar.png">
<p class="mt-3">
You should note that the photo to be added does not exceed <span class="text-primary">30 MB</span> in <span class="text-primary">JPEG</span> or <span class="text-primary">PNG</span> format.
</p>
<a href="#" class="btn btn-primary btn-lg mt-2">
Update Profile Photo
</a>
</div>
</div>
</div>
<div class="col-md-8">
<div class="card">
<div class="card-body" style="min-height: 496px">
<h3 class="mb-4">Profile Informations</h3>
<div class="form">
<div class="row">
<div class="col-md-6">
<div class="form-label-group">
<input type="Name" id="inputName" class="form-control" placeholder="Name" required="">
<label for="inputName">Name</label>
</div>
</div>
<div class="col-md-6">
<div class="form-label-group">
<input type="Surname" id="inputSurname" class="form-control" placeholder="Surname" required="">
<label for="inputSurname">Surname</label>
</div>
</div>
<div class="col-md-6">
<div class="form-label-group">
<input type="Email" id="inputEmail" class="form-control" placeholder="Email" required="">
<label for="inputEmail">E-mail Address</label>
</div>
</div>
<div class="col-md-6">
<div class="form-label-group">
<input type="location" id="inputLocation" class="form-control" placeholder="Location" required="">
<label for="inputLocation">Location</label>
</div>
</div>
<div class="col-md-6">
<div class="form-label-group">
<input type="Company" id="inputCompany" class="form-control" placeholder="Company" required="">
<label for="inputCompany">Company</label>
</div>
</div>
<div class="col-md-6">
<div class="form-label-group">
<input type="Title" id="inputTitle" class="form-control" placeholder="Title" required="">
<label for="inputTitle">Title</label>
</div>
</div>
<div class="col-md-12">
<div class="form-label-group">
<input type="Bio" id="inputBio" class="form-control" placeholder="Bio" required="">
<label for="inputBio">Bio</label>
</div>
</div>
<div class="col-md-12 text-right">
<a href="#" class="btn btn-primary btn-lg">
Update Information
</a>
</div>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-body">
<h3 class="mb-4">Change Password</h3>
<div class="form">
<div class="row">
<div class="col-md-6">
<div class="form-label-group">
<input type="OldPassword" id="inputName" class="form-control" placeholder="Old Password" required="">
<label for="inputOldPassword">Old Password</label>
</div>
</div>
<div class="col-md-6">
</div>
<div class="col-md-6">
<div class="form-label-group">
<input type="NewPassword" id="inputName" class="form-control" placeholder="New Password" required="">
<label for="inputNewPassword">New Password</label>
</div>
</div>
<div class="col-md-6">
<div class="form-label-group">
<input type="NewPassword2" id="inputName" class="form-control" placeholder="New Password (Again)" required="">
<label for="inputNewPassword2">New Password (Again)</label>
</div>
</div>
<div class="col-md-12 text-right">
<a href="#" class="btn btn-primary btn-lg">
Update Information
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="NotificationSettings" class="tab-pane fade">
<div class="row">
<div class="col-md-8 mx-auto">
<div class="card">
<div class="card-body" style="min-height: 496px">
<h3 class="mb-5">Notification Settings</h3>
<h4 class="mt-4 mb-3">General Notifications</h4>
<div class="row my-1">
<div class="col">Send SMS notification</div>
<div class="col-auto text-right">
<div class="checkbox switcher">
<label for="switch1">
<input type="checkbox" id="switch1" value="">
<span>
<small></small>
</span>
</label>
</div>
</div>
</div>
<div class="row my-1">
<div class="col">Send E-mail notification</div>
<div class="col-auto text-right">
<div class="checkbox switcher">
<label for="switch2">
<input type="checkbox" id="switch2" value="" checked>
<span>
<small></small>
</span>
</label>
</div>
</div>
</div>
<h4 class="mt-4 mb-3">Special Notifications to EventHub</h4>
<div class="row my-1">
<div class="col">Send notification about updates</div>
<div class="col-auto text-right">
<div class="checkbox switcher">
<label for="switch3">
<input type="checkbox" id="switch3" value="">
<span>
<small></small>
</span>
</label>
</div>
</div>
</div>
<div class="row my-1">
<div class="col">Send notification for organization suggestions</div>
<div class="col-auto text-right">
<div class="checkbox switcher">
<label for="switch4">
<input type="checkbox" id="switch4" value="" checked>
<span>
<small></small>
</span>
</label>
</div>
</div>
</div>
<div class="row my-1">
<div class="col">Send notifications for new organizations</div>
<div class="col-auto text-right">
<div class="checkbox switcher">
<label for="switch5">
<input type="checkbox" id="switch5" value="">
<span>
<small></small>
</span>
</label>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="MyEvents" 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 Events</h3>
@await Component.InvokeAsync(typeof(EventsAreaViewComponent), new
{
registeredUserId = CurrentUser.Id,
maxResultCount = 6,
skipCount = 0
})
</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.Id,
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.Id,
maxResultCount = 6,
skipCount = 0
})
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

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

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