mirror of
https://github.com/RaidMax/IW4M-Admin.git
synced 2025-06-10 23:31:13 -05:00
finish initial rework of profile page with meta pagination
This commit is contained in:
@ -59,7 +59,7 @@ namespace WebfrontCore.Controllers
|
||||
{
|
||||
ClientId = -1,
|
||||
Level = EFClient.Permission.User,
|
||||
CurrentAlias = new EFAlias() { Name = "Web Console Guest" }
|
||||
CurrentAlias = new EFAlias() { Name = "Webfront Guest" }
|
||||
};
|
||||
|
||||
if (!HttpContext.Connection.RemoteIpAddress.GetAddressBytes().SequenceEqual(LocalHost))
|
||||
@ -70,6 +70,7 @@ namespace WebfrontCore.Controllers
|
||||
Client.NetworkId = User.Claims.First(_claim => _claim.Type == ClaimTypes.PrimarySid).Value.ConvertLong();
|
||||
Client.Level = (EFClient.Permission)Enum.Parse(typeof(EFClient.Permission), User.Claims.First(c => c.Type == ClaimTypes.Role).Value);
|
||||
Client.CurrentAlias = new EFAlias() { Name = User.Claims.First(c => c.Type == ClaimTypes.NameIdentifier).Value };
|
||||
Authorized = Client.ClientId >= 0;
|
||||
}
|
||||
|
||||
catch (InvalidOperationException)
|
||||
@ -93,7 +94,6 @@ namespace WebfrontCore.Controllers
|
||||
Authorized = true;
|
||||
}
|
||||
|
||||
Authorized = Client.ClientId >= 0;
|
||||
ViewBag.Authorized = Authorized;
|
||||
ViewBag.Url = Manager.GetApplicationSettings().Configuration().WebfrontUrl;
|
||||
ViewBag.User = Client;
|
||||
|
@ -15,6 +15,7 @@ namespace WebfrontCore.Controllers
|
||||
public async Task<IActionResult> ProfileAsync(int id)
|
||||
{
|
||||
var client = await Manager.GetClientService().Get(id);
|
||||
|
||||
if (client == null)
|
||||
{
|
||||
return NotFound();
|
||||
@ -22,10 +23,6 @@ namespace WebfrontCore.Controllers
|
||||
|
||||
var activePenalties = await Manager.GetPenaltyService().GetActivePenaltiesAsync(client.AliasLinkId, client.IPAddress);
|
||||
|
||||
#if DEBUG
|
||||
Authorized = true;
|
||||
#endif
|
||||
|
||||
var clientDto = new PlayerInfo()
|
||||
{
|
||||
Name = client.Name,
|
||||
@ -55,42 +52,7 @@ namespace WebfrontCore.Controllers
|
||||
LinkedAccounts = client.LinkedAccounts
|
||||
};
|
||||
|
||||
var meta = await MetaService.GetRuntimeMeta(client.ClientId, 0, 1);
|
||||
var penaltyMeta = await Manager.GetPenaltyService()
|
||||
.ReadGetClientPenaltiesAsync(client.ClientId);
|
||||
var administeredPenaltiesMeta = await Manager.GetPenaltyService()
|
||||
.ReadGetClientPenaltiesAsync(client.ClientId, false);
|
||||
|
||||
if (Authorized && client.Level > EFClient.Permission.Trusted)
|
||||
{
|
||||
clientDto.Meta.Add(new ProfileMeta()
|
||||
{
|
||||
Key = Localization["WEBFRONT_CLIENT_META_MASKED"],
|
||||
Value = client.Masked ? Localization["WEBFRONT_CLIENT_META_TRUE"] : Localization["WEBFRONT_CLIENT_META_FALSE"],
|
||||
Sensitive = true,
|
||||
When = DateTime.MinValue
|
||||
});
|
||||
}
|
||||
|
||||
//if (Authorized)
|
||||
//{
|
||||
// clientDto.Meta.AddRange(client.AliasLink.Children
|
||||
// .GroupBy(a => a.Name)
|
||||
// .Select(a => a.First())
|
||||
// .Select(a => new ProfileMeta()
|
||||
// {
|
||||
// Value = $"{Localization["WEBFRONT_CLIENT_META_JOINED"]} {a.Name}",
|
||||
// Sensitive = true,
|
||||
// When = a.DateAdded,
|
||||
// Type = ProfileMeta.MetaType.AliasUpdate
|
||||
// }));
|
||||
//}
|
||||
|
||||
if (Authorized)
|
||||
{
|
||||
penaltyMeta.ForEach(p => p.Value.Offense = p.Value.AutomatedOffense ?? p.Value.Offense);
|
||||
administeredPenaltiesMeta.ForEach(p => p.Value.Offense = p.Value.AutomatedOffense ?? p.Value.Offense);
|
||||
}
|
||||
var meta = await MetaService.GetRuntimeMeta(client.ClientId, 0, 1, DateTime.UtcNow);
|
||||
|
||||
var currentPenalty = activePenalties.FirstOrDefault();
|
||||
|
||||
@ -105,20 +67,7 @@ namespace WebfrontCore.Controllers
|
||||
}
|
||||
|
||||
clientDto.Meta.AddRange(Authorized ? meta : meta.Where(m => !m.Sensitive));
|
||||
clientDto.Meta.AddRange(Authorized ? penaltyMeta : penaltyMeta.Where(m => !m.Sensitive));
|
||||
clientDto.Meta.AddRange(Authorized ? administeredPenaltiesMeta : administeredPenaltiesMeta.Where(m => !m.Sensitive));
|
||||
clientDto.Meta.AddRange(client.Meta.Select(m => new ProfileMeta()
|
||||
{
|
||||
When = m.Created,
|
||||
Key = m.Key,
|
||||
Value = m.Value,
|
||||
Show = false,
|
||||
}));
|
||||
|
||||
clientDto.Meta = clientDto.Meta
|
||||
.OrderByDescending(m => m.When)
|
||||
.ToList();
|
||||
|
||||
|
||||
ViewBag.Title = clientDto.Name.Substring(clientDto.Name.Length - 1).ToLower()[0] == 's' ?
|
||||
clientDto.Name + "'" :
|
||||
clientDto.Name + "'s";
|
||||
@ -179,9 +128,9 @@ namespace WebfrontCore.Controllers
|
||||
return View("Find/Index", clientsDto);
|
||||
}
|
||||
|
||||
public async Task<IActionResult> Meta(int id, int count, int offset)
|
||||
public async Task<IActionResult> Meta(int id, int count, int offset, DateTime? startAt)
|
||||
{
|
||||
var meta = await MetaService.GetRuntimeMeta(id, offset, count);
|
||||
var meta = await MetaService.GetRuntimeMeta(id, startAt == null ? offset : 0, count, startAt ?? DateTime.UtcNow);
|
||||
|
||||
if (meta.Count == 0)
|
||||
{
|
||||
|
@ -1,14 +1,15 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using SharedLibraryCore.Services;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace WebfrontCore.ViewComponents
|
||||
{
|
||||
public class ProfileMetaListViewComponent : ViewComponent
|
||||
{
|
||||
public async Task<IViewComponentResult> InvokeAsync(int clientId, int count, int offset)
|
||||
public async Task<IViewComponentResult> InvokeAsync(int clientId, int count, int offset, DateTime? startAt)
|
||||
{
|
||||
var meta = await MetaService.GetRuntimeMeta(clientId, offset, count);
|
||||
var meta = await MetaService.GetRuntimeMeta(clientId, offset, count, startAt ?? DateTime.UtcNow);
|
||||
return View("_List", meta);
|
||||
}
|
||||
}
|
||||
|
@ -79,7 +79,6 @@
|
||||
</div>
|
||||
|
||||
<div id="profile_info" class="row d-block d-lg-flex flex-row border-bottom border-top pt-2 pb-2">
|
||||
|
||||
<div id="profile_meta_0" class="text-center text-lg-left mr-0 mr-lg-4">
|
||||
@for (int i = 0; i < informationMeta.Count; i += 3)
|
||||
{
|
||||
@ -117,6 +116,10 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="oi oi-chevron-bottom text-center mt-2 btn btn-primary btn-block loader-load-more" title="Load more meta" data-action="unban" aria-hidden="true"></div>
|
||||
</div>
|
||||
|
||||
@section targetid {
|
||||
<input type="hidden" name="targetId" value="@Model.ClientId" />
|
||||
}
|
||||
|
@ -1,20 +1,62 @@
|
||||
@model List<SharedLibraryCore.Dtos.ProfileMeta>
|
||||
@{Layout = null;}
|
||||
@{
|
||||
Layout = null;
|
||||
|
||||
<div class="p2 text-white profile-event-timestep">
|
||||
<span class="text-primary">—</span>
|
||||
<span>@SharedLibraryCore.Utilities.GetTimePassed(Model.FirstOrDefault()?.When ?? DateTime.Now, true)</span>
|
||||
</div>
|
||||
string formatPenalty(SharedLibraryCore.Dtos.ProfileMeta meta)
|
||||
{
|
||||
var penalty = meta.Value as SharedLibraryCore.Dtos.PenaltyInfo;
|
||||
|
||||
@foreach (var meta in Model)
|
||||
string localizationKey = meta.Type == SharedLibraryCore.Dtos.ProfileMeta.MetaType.Penalized ?
|
||||
$"WEBFRONT_CLIENT_META_PENALIZED_{penalty.PenaltyType.ToUpper()}" :
|
||||
$"WEBFRONT_CLIENT_META_WAS_PENALIZED_{penalty.PenaltyType.ToUpper()}";
|
||||
|
||||
string localizationMessage = SharedLibraryCore.Utilities.CurrentLocalization.LocalizationIndex[localizationKey];
|
||||
var regexMatch = System.Text.RegularExpressions.Regex.Match(localizationMessage, @"^{{([^{}]+)}}.+$");
|
||||
string penaltyType = regexMatch.Groups[1].Value.ToString();
|
||||
|
||||
localizationMessage = localizationMessage.Replace(penaltyType, $"<span class='penalties-color-{penalty.PenaltyType.ToLower()}'>{penaltyType}</span>");
|
||||
|
||||
return meta.Type == SharedLibraryCore.Dtos.ProfileMeta.MetaType.Penalized ?
|
||||
string.Format(localizationMessage,
|
||||
$"<span class='text-highlight'><a class='link-inverse' href='{penalty.OffenderId}'>{penalty.OffenderName}</a></span>",
|
||||
$"<span class='automated-penalty-info-detailed text-white' data-clientid='{penalty.OffenderId}'>{penalty.Offense}</span>")
|
||||
.Replace("{", "")
|
||||
.Replace("}", "") :
|
||||
string.Format(localizationMessage,
|
||||
$"<span class='text-highlight'><a class='link-inverse' href='{penalty.PunisherId}'>{penalty.PunisherName}</a></span>",
|
||||
$"<span class='automated-penalty-info-detailed text-white' data-clientid='{penalty.OffenderId}'>{penalty.Offense}</span>",
|
||||
penalty.Offense)
|
||||
.Replace("{", "")
|
||||
.Replace("}", "");
|
||||
}
|
||||
}
|
||||
|
||||
@if (Model.Count > 0)
|
||||
{
|
||||
<div class="p2 text-white profile-event-timestep">
|
||||
<span class="text-primary">—</span>
|
||||
<span>@SharedLibraryCore.Utilities.GetTimePassed(Model.First().When, true)</span>
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (Model.Count == 0)
|
||||
{
|
||||
<div class="p2 text-muted profile-event-timestep">@SharedLibraryCore.Utilities.CurrentLocalization.LocalizationIndex["WEBFRONT_CLIENT_META_NONE"]</div>
|
||||
}
|
||||
|
||||
@foreach (var meta in Model.OrderByDescending(_meta => _meta.When))
|
||||
{
|
||||
@switch (meta.Type)
|
||||
{
|
||||
case SharedLibraryCore.Dtos.ProfileMeta.MetaType.ChatMessage:
|
||||
<div>
|
||||
<div class="profile-meta-entry loader-data-time" data-time="@meta.When">
|
||||
<span style="color:white;">></span>
|
||||
<span class="client-message text-muted" data-serverid="@meta.Extra" data-when="@meta.When"> @meta.Value</span>
|
||||
</div>
|
||||
break;
|
||||
case SharedLibraryCore.Dtos.ProfileMeta.MetaType.ReceivedPenalty:
|
||||
case SharedLibraryCore.Dtos.ProfileMeta.MetaType.Penalized:
|
||||
<div class="profile-meta-entry loader-data-time" data-time="@meta.When">@Html.Raw(formatPenalty(meta))</div>
|
||||
break;
|
||||
}
|
||||
}
|
@ -6375,6 +6375,9 @@ form *, select {
|
||||
padding: 5px;
|
||||
visibility: hidden; }
|
||||
|
||||
.loader-load-more {
|
||||
border-radius: 0; }
|
||||
|
||||
.input-border-transition {
|
||||
-webkit-transition: border 500ms ease-out;
|
||||
-moz-transition: border 500ms ease-out;
|
||||
|
@ -163,6 +163,10 @@ form *, select {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.loader-load-more {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.input-border-transition {
|
||||
-webkit-transition: border 500ms ease-out;
|
||||
-moz-transition: border 500ms ease-out;
|
||||
|
@ -1,5 +1,6 @@
|
||||
let loaderOffset = 10;
|
||||
let loadCount = 10;
|
||||
let startAt = null;
|
||||
let isLoaderLoading = false;
|
||||
let loadUri = '';
|
||||
let loaderResponseId = '';
|
||||
@ -19,13 +20,14 @@ function loadMoreItems() {
|
||||
|
||||
showLoader();
|
||||
isLoaderLoading = true;
|
||||
$.get(loadUri, { offset: loaderOffset, count : loadCount })
|
||||
$.get(loadUri, { offset: loaderOffset, count: loadCount, startAt: startAt })
|
||||
.done(function (response) {
|
||||
$(loaderResponseId).append(response);
|
||||
if (response.trim().length === 0) {
|
||||
staleLoader();
|
||||
}
|
||||
$(document).trigger("loaderFinished", response);
|
||||
startAt = $(response).filter('.loader-data-time').last().data('time');
|
||||
hideLoader();
|
||||
isLoaderLoading = false;
|
||||
})
|
||||
@ -37,47 +39,52 @@ function loadMoreItems() {
|
||||
}
|
||||
|
||||
function setupListeners() {
|
||||
if ($(loaderResponseId).length === 1) {
|
||||
/*
|
||||
https://stackoverflow.com/questions/19731730/jquery-js-detect-users-scroll-attempt-without-any-window-overflow-to-scroll
|
||||
*/
|
||||
if ($(loaderResponseId).length === 1) {
|
||||
/*
|
||||
https://stackoverflow.com/questions/19731730/jquery-js-detect-users-scroll-attempt-without-any-window-overflow-to-scroll
|
||||
*/
|
||||
|
||||
$('html').bind('mousewheel DOMMouseScroll', function (e) {
|
||||
var delta = e.originalEvent.wheelDelta || -e.originalEvent.detail;
|
||||
$('html').bind('mousewheel DOMMouseScroll', function (e) {
|
||||
var delta = e.originalEvent.wheelDelta || -e.originalEvent.detail;
|
||||
|
||||
if (delta < 0 && !hasScrollBar) {
|
||||
loadMoreItems();
|
||||
}
|
||||
});
|
||||
|
||||
/*
|
||||
https://stackoverflow.com/questions/3898130/check-if-a-user-has-scrolled-to-the-bottom
|
||||
*/
|
||||
|
||||
var _throttleTimer = null;
|
||||
var _throttleDelay = 100;
|
||||
var $window = $(window);
|
||||
var $document = $(document);
|
||||
var hasScrollBar = false;
|
||||
|
||||
$document.ready(function () {
|
||||
$window
|
||||
.off('scroll', ScrollHandler)
|
||||
.on('scroll', ScrollHandler);
|
||||
});
|
||||
|
||||
function ScrollHandler(e) {
|
||||
//throttle event:
|
||||
hasScrollBar = true;
|
||||
clearTimeout(_throttleTimer);
|
||||
_throttleTimer = setTimeout(function () {
|
||||
|
||||
//do work
|
||||
if ($window.scrollTop() + $window.height() > $document.height() - 100) {
|
||||
loadMoreItems();
|
||||
if (delta < 0 && !hasScrollBar) {
|
||||
loadMoreItems();
|
||||
}
|
||||
});
|
||||
|
||||
}, _throttleDelay);
|
||||
/*
|
||||
https://stackoverflow.com/questions/3898130/check-if-a-user-has-scrolled-to-the-bottom
|
||||
*/
|
||||
|
||||
var _throttleTimer = null;
|
||||
var _throttleDelay = 100;
|
||||
var $window = $(window);
|
||||
var $document = $(document);
|
||||
var hasScrollBar = false;
|
||||
|
||||
$document.ready(function () {
|
||||
$window
|
||||
.off('scroll', ScrollHandler)
|
||||
.on('scroll', ScrollHandler);
|
||||
$('.loader-load-more').click(function (e) {
|
||||
if (!isLoaderLoading) {
|
||||
loadMoreItems();
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
function ScrollHandler(e) {
|
||||
//throttle event:
|
||||
hasScrollBar = true;
|
||||
clearTimeout(_throttleTimer);
|
||||
_throttleTimer = setTimeout(function () {
|
||||
|
||||
//do work
|
||||
if ($window.scrollTop() + $window.height() > $document.height() - 100) {
|
||||
loadMoreItems();
|
||||
}
|
||||
|
||||
}, _throttleDelay);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -13,6 +13,7 @@
|
||||
/*
|
||||
* load context of chat
|
||||
*/
|
||||
$(document).off('click', '.client-message');
|
||||
$(document).on('click', '.client-message', function (e) {
|
||||
showLoader();
|
||||
const location = $(this);
|
||||
@ -33,6 +34,7 @@
|
||||
/*
|
||||
* load info on ban/flag
|
||||
*/
|
||||
$(document).off('click', '.automated-penalty-info-detailed');
|
||||
$(document).on('click', '.automated-penalty-info-detailed', function (e) {
|
||||
showLoader();
|
||||
const location = $(this).parent();
|
||||
|
Reference in New Issue
Block a user