v1.1.8
This commit is contained in:
@@ -519,6 +519,12 @@
|
||||
<data name="label.upload" xml:space="preserve">
|
||||
<value>Upload</value>
|
||||
</data>
|
||||
<data name="label.user" xml:space="preserve">
|
||||
<value>User</value>
|
||||
</data>
|
||||
<data name="label.users" xml:space="preserve">
|
||||
<value>Users</value>
|
||||
</data>
|
||||
<data name="label.very.good" xml:space="preserve">
|
||||
<value>Very Good</value>
|
||||
</data>
|
||||
|
||||
@@ -59,6 +59,10 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||
RefreshModel(model);
|
||||
|
||||
// Ensure data is paged to avoid leaking large volumes.
|
||||
model.Paging.PageNo = Math.Max(1, model.Paging.PageNo);
|
||||
model.Paging.PageLength = Math.Max(Math.Min(Sax.Config.Online.Search.Organisations.PageLengthMax, model.Paging.PageLength), (ushort)1);
|
||||
|
||||
// Query organisations that user is a member of.
|
||||
SaxOrganisation.Params prmOrganisation = new SaxOrganisation.Params();
|
||||
prmOrganisation.OrganisationFilter = model.Filter.Organisation;
|
||||
|
||||
@@ -0,0 +1,193 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Saxonite.Net.Core.Web.Online.Models;
|
||||
using Saxonite.Net.Core.Web.Base.App;
|
||||
using Saxonite.Net.Core.Web.Base.Controllers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Saxonite.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
using Saxonite.Net.Standard.Base.App;
|
||||
|
||||
namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
{
|
||||
//=======================================================================
|
||||
// Online Search Controller - Users - Ajax actions.
|
||||
//=======================================================================
|
||||
partial class SearchController
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Account - Get Users.
|
||||
//-------------------------------------------------------------------
|
||||
private class UserListData
|
||||
{
|
||||
public String Id { get; set; }
|
||||
public String Name { get; set; }
|
||||
public String Location { get; set; }
|
||||
}
|
||||
private class AjaxResponse_Search_Users : AjaxResponse_Data
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_Search_Users(SaxModel_Online model) : base(model) { }
|
||||
// User list.
|
||||
public List<UserListData> Users { get; } = new List<UserListData>();
|
||||
}
|
||||
// Ajax request.
|
||||
[HttpPost]
|
||||
[Route("Search/Ajax/Users")]
|
||||
[Route("Search/Ajax/GetUsers")]
|
||||
public IActionResult GetProfileUsers(Model_Search_Users model)
|
||||
{
|
||||
String fn = GetType().Name + ".GetProfileUsers";
|
||||
AjaxResponse_Search_Users responseData = new AjaxResponse_Search_Users(model);
|
||||
String messageTitle = Localiser["label.users"];
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidReferer) return Forbid();
|
||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||
RefreshModel(model);
|
||||
|
||||
// Ensure filter has something to restrict the list.
|
||||
// ToDo May be able to show some results, such as friends when no filter provided.
|
||||
if (StringUtil.IsEmpty(StringUtil.TrimAll(model.Filter.User)))
|
||||
{
|
||||
responseData.Success = true;
|
||||
return Json(responseData);
|
||||
}
|
||||
|
||||
// Ensure data is paged to avoid leaking large volumes.
|
||||
model.Paging.PageNo = Math.Max(1, model.Paging.PageNo);
|
||||
model.Paging.PageLength = Math.Max(Math.Min(Sax.Config.Online.Search.Users.PageLengthMax, model.Paging.PageLength), (ushort)1);
|
||||
|
||||
// Query users that user is a member of.
|
||||
SaxUserAccount.Params prmUserAccount = new SaxUserAccount.Params();
|
||||
prmUserAccount.UserFilter = model.Filter.User;
|
||||
if (SysId.IsValid(model.FilterSportId))
|
||||
prmUserAccount.SportIdsIncluded.Add(model.FilterSportId);
|
||||
if (SysId.IsValid(model.FilterRegionId))
|
||||
prmUserAccount.RegionIdsIncluded.Add(model.FilterRegionId);
|
||||
prmUserAccount.StatusCat = SaxUserAccount.StatusCat.ActiveOnly;
|
||||
model.Paging.ItemTotal = (ulong)AccountMgr.GetUserAccountCount(prmUserAccount);
|
||||
model.PopulatePagingTo(prmUserAccount.ResultsPaging);
|
||||
|
||||
List<SaxUserAccount> users = AccountMgr.GetUserAccountList(prmUserAccount);
|
||||
List<SysId> userIds = users.GetIds();
|
||||
|
||||
// Item columns.
|
||||
ColumnDfn colId = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.Id);
|
||||
ColumnDfn colTitle = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.Title);
|
||||
ColumnDfn colFirstName = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.FirstName);
|
||||
ColumnDfn colLastName = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.LastName);
|
||||
ColumnDfn colRegionCountryName = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.RegionCountry_Name);
|
||||
ColumnDfn colRegionProvinceName = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.RegionProvince_Name);
|
||||
List<ColumnDfn> columns = new List<ColumnDfn>()
|
||||
{
|
||||
colId, colTitle, colFirstName, colLastName,
|
||||
colRegionCountryName,colRegionProvinceName,
|
||||
};
|
||||
|
||||
// Sort columns.
|
||||
colLastName.SortAscending = true;
|
||||
prmUserAccount.SortColumns.Add(colLastName);
|
||||
|
||||
// Query items.
|
||||
using (DbResultSet resultSet = AccountMgr.ExecuteUserAccountQuery(columns, prmUserAccount))
|
||||
{
|
||||
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
|
||||
{
|
||||
NamedValue.Map values = resultSet.GetRecordValues();
|
||||
String displayName = SaxUserAccount.GetDisplayName(values.GetString(colTitle.DataName), values.GetString(colFirstName.DataName), values.GetString(colLastName.DataName));
|
||||
List<String> location = new List<string>() { values.GetString(colRegionProvinceName.DataName), values.GetString(colRegionCountryName.DataName) };
|
||||
UserListData userData = new UserListData()
|
||||
{
|
||||
Id = model.EncryptId(new SysId(values.GetLong(colId.DataName))),
|
||||
Name = displayName,
|
||||
Location = location.Concat(", ", "", "", true, true),
|
||||
};
|
||||
responseData.Users.Add(userData);
|
||||
}
|
||||
}
|
||||
if (model.Paging.IsPaged)
|
||||
model.Paging.ItemCount = (ushort)responseData.Users.Count;
|
||||
|
||||
// Complete response.
|
||||
responseData.SetPaging(model);
|
||||
responseData.Success = true;
|
||||
return Json(responseData);
|
||||
}
|
||||
//-------------------------------------------------------------------
|
||||
// Account - Get Users.
|
||||
//-------------------------------------------------------------------
|
||||
private class UserData
|
||||
{
|
||||
public String Id { get; set; }
|
||||
public String Name { get; set; }
|
||||
public String Location { get; set; }
|
||||
}
|
||||
private class AjaxResponse_Search_User : AjaxResponse_Data
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_Search_User(SaxModel_Online model) : base(model) { }
|
||||
// User list.
|
||||
public UserData User { get; set; }
|
||||
}
|
||||
// Ajax request.
|
||||
[HttpPost]
|
||||
[Route("Search/Ajax/User")]
|
||||
[Route("Search/Ajax/GetUser")]
|
||||
public IActionResult GetProfileUser(Model_Search_Users model)
|
||||
{
|
||||
String fn = GetType().Name + ".GetProfileUser";
|
||||
AjaxResponse_Search_User responseData = new AjaxResponse_Search_User(model);
|
||||
String messageTitle = Localiser["label.user"];
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidReferer) return Forbid();
|
||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||
RefreshModel(model);
|
||||
|
||||
// Record disposable items as they are created so all can be disposed when needed.
|
||||
using (DisposableCollection<SacsHierarchyItem> disposableItems = new DisposableCollection<SacsHierarchyItem>())
|
||||
{
|
||||
// Retrieve user.
|
||||
SysId userAccountId = model.ExtractSysId(model.UserId);
|
||||
if (!SysId.IsValid(userAccountId))
|
||||
{
|
||||
SaLogger.Warn(fn + " User Id not supplied.");
|
||||
return Json(responseData);
|
||||
}
|
||||
SaxUserAccount userAccount = AccountMgr.GetUserAccountById(userAccountId);
|
||||
if (userAccount == null)
|
||||
{
|
||||
SaLogger.Warn(fn + " Failed to retrieve user. Id: " + model.UserId);
|
||||
return Json(responseData);
|
||||
}
|
||||
disposableItems.Add(userAccount);
|
||||
|
||||
// Populate response.
|
||||
List<String> location = new List<string>() { model.GetRegionCaption(userAccount.RegionIdProvince), model.GetRegionCaption(userAccount.RegionIdCountry) };
|
||||
UserData userData = new UserData()
|
||||
{
|
||||
Id = model.EncryptId(userAccount.Id),
|
||||
Name = userAccount.GetDisplayName(),
|
||||
Location = location.Concat(", ", "", "", true, true),
|
||||
};
|
||||
responseData.User = userData;
|
||||
}
|
||||
|
||||
// Complete response.
|
||||
responseData.Success = true;
|
||||
return Json(responseData);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -6,6 +6,7 @@ using Sarand.Net.Standard.Base.Dbas;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using Saxonite.Net.Core.Web.Base.App;
|
||||
using Saxonite.Net.Core.Web.Online.Models;
|
||||
using Saxonite.Net.Standard.Base.App;
|
||||
using Saxonite.Net.Standard.Base.Bus;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@@ -38,6 +39,25 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
return RedirectToAction("", "");
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Search - Users.
|
||||
/// </summary>
|
||||
[HttpGet]
|
||||
public IActionResult Users()
|
||||
{
|
||||
// Validate session.
|
||||
if (!ValidUserSession)
|
||||
return RedirectToAction("", "");
|
||||
|
||||
// Model.
|
||||
Model_Search_Users model = new Model_Search_Users(Localiser);
|
||||
model.Paging.PageNo = 1;
|
||||
model.Paging.PageLength = Sax.Config.Online.Search.Organisations.PageLengthDefault;
|
||||
|
||||
return View(model);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Search - Organisations.
|
||||
@@ -52,7 +72,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
// Model.
|
||||
Model_Search_Organisations model = new Model_Search_Organisations(Localiser);
|
||||
model.Paging.PageNo = 1;
|
||||
model.Paging.PageLength = 12;
|
||||
model.Paging.PageLength = Sax.Config.Online.Search.Users.PageLengthDefault;
|
||||
|
||||
return View(model);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.Helpers;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using Saxonite.Net.Core.Web.Base.App;
|
||||
using Saxonite.Net.Core.Web.Base.Controllers;
|
||||
using Saxonite.Net.Core.Web.Base.Models;
|
||||
using Saxonite.Net.Standard.Base.App;
|
||||
using Saxonite.Net.Standard.Base.Bus;
|
||||
using Saxonite.Net.Standard.Base.Helpers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Saxonite.Net.Core.Web.Online.Models
|
||||
{
|
||||
//=======================================================================
|
||||
public class Model_Search_Users : SaxModel_Online
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
public Model_Search_Users(SaxLocaliser localiser) :
|
||||
base(localiser)
|
||||
{
|
||||
//AdditionalFiles_CSS.Add("css/sax-src-usr.css");
|
||||
AdditionalFiles_JS.Add("js/sax-src-usr.js");
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Page configuration.
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Form properties.
|
||||
public class FilterData
|
||||
{
|
||||
public String User { get; set; }
|
||||
public String RegionId { get; set; }
|
||||
public String SportId { get; set; }
|
||||
}
|
||||
public FilterData Filter { get; } = new FilterData();
|
||||
public SysId FilterSportId { get { return ExtractSysId(Filter.SportId); } }
|
||||
public SysId FilterRegionId { get { return ExtractSysId(Filter.RegionId); } }
|
||||
public String UserId { get; set; }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Validation.
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
@model Model_Search_Users
|
||||
@inject SaxLocaliser Localiser
|
||||
@{
|
||||
/* User dialog panel */
|
||||
}
|
||||
|
||||
<script type="text/javascript">
|
||||
</script>
|
||||
|
||||
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmUserId", @class = "sax-form" }))
|
||||
{
|
||||
<input type="hidden" name="UserId" class="UserId" />
|
||||
}
|
||||
<div id="dlgUser" class="sax-dialog" title="">
|
||||
|
||||
<div class="spacer"></div>
|
||||
|
||||
<div class="row UserLocation">
|
||||
<div class="col-sm-5"><div class="sax-label text-sm-right">@Localiser["label.location"]</div></div>
|
||||
<div class="col-sm"><div class="sax-value"></div></div>
|
||||
</div>
|
||||
|
||||
<div class="spacer"></div>
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,154 @@
|
||||
@model Model_Search_Users
|
||||
@inject SaxLocaliser Localiser
|
||||
@{
|
||||
ViewData["Title"] = "Search Users";
|
||||
}
|
||||
|
||||
<div class="sax-panel Users sax-alpha">
|
||||
|
||||
<script type="text/javascript">
|
||||
sax.lbl.view = '@(Localiser.GetJavascriptText("label.view"))';
|
||||
sax.lbl.follow = '@(Localiser.GetJavascriptText("label.follow"))';
|
||||
sax.dlg.title.user = '@(Localiser.GetJavascriptText("label.user"))';
|
||||
</script>
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div class="col-sm-5">
|
||||
|
||||
@* Filter Form *@
|
||||
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmUserFilter", @class = "sax-form", @action = "#", @method = "POST", onsubmit = "return false;" }))
|
||||
{
|
||||
|
||||
@* Filter panel *@
|
||||
<div class="sax-panel-filter mr-sm-2">
|
||||
@* Filter header *@
|
||||
<div class="sax-header row">
|
||||
@* Filter caption *@
|
||||
<div class="col"><div class="sax-caption">@Localiser["label.users"]</div></div>
|
||||
<div class="fixed row">
|
||||
<div class="col">
|
||||
<partial name="~/Views/Common/ResultsPaging.cshtml" />
|
||||
</div>
|
||||
<div class="fixed">
|
||||
@* Burger menu *@
|
||||
<ul class="nav navbar-nav navbar-dark navbar-right sax-burger">
|
||||
<li class="dropdown-toggle caret-off">
|
||||
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="navbar-toggler-icon"></span></a>
|
||||
<ul class="dropdown-menu dropdown-menu-right sax-dropdown-menu">@* Menu items will be inserted here. *@</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sax-content">
|
||||
|
||||
@* Generic User filter - name etc. *@
|
||||
<div class="sax-control row">
|
||||
<div class="col-sm-4"><div class="sax-label text-left text-sm-right">@Localiser["label.search"]</div></div>
|
||||
<div class="col-sm row">
|
||||
<div class="col"><input type="search" name="Filter.User" class="sax-input FilterUser" maxlength="32" autocomplete="off" /></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@* User sport *@
|
||||
<div class="row pb4">
|
||||
<div class="col-sm-4 sax-label text-left text-sm-right">@Localiser["label.sport"]</div>
|
||||
<div class="col-sm">
|
||||
<div class="row">
|
||||
@Html.HiddenFor(model => model.Filter.SportId, new { @id = "", @class = "FilterSportId" })
|
||||
<div class="col"><input type="text" class="FilterSportCaption sax-input" readonly="readonly" ondblclick="sax.searchUsers.selectFilterSport()" /> </div>
|
||||
<div class="fixed row">
|
||||
<div class="sax-action" onclick="sax.searchUsers.selectFilterSport();"><img src="~/img/action/search24.png" alt="@(Localiser["label.search"])" title="@(Localiser["label.search"])" /></div>
|
||||
<div class="sax-action" onclick="sax.searchUsers.clearFilterSport();"><img src="~/img/action/delete24.png" alt="@(Localiser["label.clear"])" title="@(Localiser["label.clear"])" /></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@* User region *@
|
||||
<div class="row pb4">
|
||||
<div class="col-sm-4 sax-label text-left text-sm-right">@Localiser["label.region"]</div>
|
||||
<div class="col-sm">
|
||||
<div class="row">
|
||||
@Html.HiddenFor(model => model.Filter.RegionId, new { @id = "", @class = "FilterRegionId" })
|
||||
<div class="col"><input type="text" class="FilterRegionCaption sax-input" readonly="readonly" ondblclick="sax.searchUsers.selectFilterRegion()" /> </div>
|
||||
<div class="fixed row">
|
||||
<div class="sax-action" onclick="sax.searchUsers.selectFilterRegion();"><img src="~/img/action/search24.png" alt="@(Localiser["label.search"])" title="@(Localiser["label.search"])" /></div>
|
||||
<div class="sax-action" onclick="sax.searchUsers.clearFilterRegion();"><img src="~/img/action/delete24.png" alt="@(Localiser["label.clear"])" title="@(Localiser["label.clear"])" /></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@* Filter item templates *@
|
||||
<div class="sax-panel-item-template">
|
||||
@* Burger dropdown item template - ul is ignored *@
|
||||
<ul class="sax-dropdown-menu Users">
|
||||
<li class="sax-dropdown-item sax-action"><div class="sax-label">...</div></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
}
|
||||
|
||||
</div>
|
||||
|
||||
<div class="col">
|
||||
|
||||
@* Results Panel *@
|
||||
<div class="sax-panel-results">
|
||||
<div class="sax-panel-messages"></div>
|
||||
<div class="sax-panel-item-list"></div>
|
||||
|
||||
@* Element templates *@
|
||||
<div class="sax-panel-item-template">
|
||||
|
||||
@* Item template *@
|
||||
<div class="sax-panel-item User">
|
||||
<div class="sax-header row">
|
||||
<div class="col">
|
||||
@* User caption *@
|
||||
<div class="sax-caption"><div class="sax-action"><span class="UserName"></span></div></div>
|
||||
</div>
|
||||
<div class="fixed">
|
||||
<div class="UserCategory"></div>
|
||||
</div>
|
||||
<div class="fixed sax-actions">
|
||||
@* Burger menu *@
|
||||
<ul class="nav navbar-nav navbar-light navbar-right sax-burger">
|
||||
<li class="dropdown-toggle caret-off">
|
||||
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="navbar-toggler-icon"></span></a>
|
||||
<ul class="dropdown-menu dropdown-menu-right sax-dropdown-menu">@* Menu items will be inserted here. *@</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sax-content">
|
||||
<div class="row">
|
||||
<div class="col-sm-6"><div class="UserLocation"></div></div>
|
||||
<div class="col-sm-6 text-sm-right"><div class=""></div></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@* Burger dropdown item template - ul is ignored *@
|
||||
<ul class="sax-dropdown-menu User">
|
||||
<li class="sax-dropdown-item sax-action"><div class="sax-label">...</div></li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<partial name="~/Views/Common/RegionSelect.cshtml" />
|
||||
<partial name="~/Views/Common/SportSelect.cshtml" />
|
||||
<partial name="Panel-UserDialog.cshtml" />
|
||||
@@ -149,6 +149,7 @@
|
||||
@Localiser["label.search"]
|
||||
</a>
|
||||
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
|
||||
<div class="dropdown-item text-dark sax-action" onclick="sax.goToPage('Search/Users');">@Localiser["label.users"]</div>
|
||||
<div class="dropdown-item text-dark sax-action" onclick="sax.goToPage('Search/Organisations');">@Localiser["organisation.caption.organisations"]</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
let context = rp.fn.getContext(contextSel, refreshFn);
|
||||
rp.fn.init(context);
|
||||
context.paging = paging = paging || {};
|
||||
context.$rp.toggle(paging.paged);
|
||||
context.$rp.toggle(!!paging.paged);
|
||||
context.$pageNo.val(paging.pageNo);
|
||||
context.$pageLen.val(paging.pageLength);
|
||||
$('.sax-paging-info', context.$rp).text(sax.mdl.resultsPaging.msg.pageInfo.format(paging.pageNo, paging.pageCount));
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
}
|
||||
so.doRefreshResults = function (response)
|
||||
{
|
||||
//sax.debug('doRefreshResults', response);
|
||||
delete sax.awaitingRefreshResponse;
|
||||
sax.refreshControlValues(response.controlValues);
|
||||
var $msgs = $('.sax-panel-messages', $pnl.results).hide().empty();
|
||||
@@ -135,7 +134,6 @@
|
||||
}
|
||||
so.onViewItem = function (response)
|
||||
{
|
||||
sax.debug('onViewItem', response);
|
||||
if (!response.success) return;
|
||||
let dlg = $dlg.org;
|
||||
let item = so.data.organisation = response.organisation;
|
||||
|
||||
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
* Search - Users.
|
||||
*/
|
||||
|
||||
(function (win, doc, undef)
|
||||
{
|
||||
"use strict";
|
||||
let su = sax.searchUsers = {};
|
||||
su.ajax = {}; su.data = {}; su.fn = {};
|
||||
let $pnl = su.$pnl = {}, $frm = su.$frm = {}, $dlg = su.$dlg = {};
|
||||
|
||||
//--------------------------------------------------------------
|
||||
su.refreshResults = function (delay)
|
||||
{
|
||||
if (!su.awaitingRefreshResponse)
|
||||
{
|
||||
$('.sax-burger', $pnl.filter).hide();
|
||||
$('.sax-panel-item-list', $pnl.results).fadeOut(200).empty();
|
||||
$('.sax-panel-messages', $pnl.results).hide().empty().append($('<div class="sax-message">' + sax.msg.dataQuerying + '</div>')).fadeIn(200);
|
||||
}
|
||||
su.ajax.refreshResults = su.ajax.refreshResults || { url: sax.url.base + 'Search/Ajax/Users', formId: 'frmUserFilter', callbackFn: su.doRefreshResults };
|
||||
sax.doAjaxRequest(su.ajax.refreshResults, delay || 50);
|
||||
su.awaitingRefreshResponse = true;
|
||||
}
|
||||
su.doRefreshResults = function (response)
|
||||
{
|
||||
delete sax.awaitingRefreshResponse;
|
||||
sax.refreshControlValues(response.controlValues);
|
||||
var $msgs = $('.sax-panel-messages', $pnl.results).hide().empty();
|
||||
var $items = $('.sax-panel-item-list', $pnl.results).hide().empty();
|
||||
if (!response.success) return;
|
||||
sax.refreshPaging(response, '#frmUserFilter', su.refreshResults);
|
||||
// Menu.
|
||||
let $bgr = $('.sax-burger', $pnl.filter);
|
||||
let $mnu = $('ul.sax-dropdown-menu', $bgr).empty();
|
||||
$mnu.append(su.getFilterMenuOption(sax.lbl.refresh, function () { su.refreshResults(); }, 'sax-refresh'));
|
||||
$bgr.toggle(!!$('.sax-dropdown-item', $mnu).length);
|
||||
// Items.
|
||||
var items = response.users;
|
||||
if (!items.length)
|
||||
return $msgs.append($('<div class="sax-message">' + sax.msg.dataNoneFound + '</div>')).fadeIn(500);
|
||||
for (let itemIdx = 0; itemIdx < items.length; itemIdx++)
|
||||
$items.append(su.populateItem(su.getItemTemplate(), items[itemIdx]));
|
||||
$items.fadeIn(50);
|
||||
}
|
||||
su.populateItem = function ($item, item)
|
||||
{
|
||||
if (!item) return;
|
||||
$('.sax-panel-messages', $pnl.results).hide().empty();
|
||||
$('.UserName', $item).text(item.name);
|
||||
$('.UserLocation', $item).text(item.location);
|
||||
let $bgr = $('.sax-burger', $item);
|
||||
let $mnu = $('ul.sax-dropdown-menu', $bgr).empty();
|
||||
{
|
||||
let fnView = function () { su.viewItem(item) };
|
||||
// ToDo $mnu.append(su.getItemMenuOption(sax.lbl.view, fnView, 'sax-view'));
|
||||
$('.sax-caption .sax-action', $item).off('click').on('click', fnView);
|
||||
$('.sax-content', $item).off('dblclick').on('dblclick', fnView);
|
||||
}
|
||||
$bgr.toggle(!!$('.sax-dropdown-menu .sax-dropdown-item', $item).length);
|
||||
return $item;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
su.getFilterDropdownTemplate = function ()
|
||||
{
|
||||
return $('.sax-panel-item-template .sax-dropdown-menu.Users li.sax-dropdown-item', $pnl.filter).clone();
|
||||
}
|
||||
su.getFilterMenuOption = function (lbl, fn, cls)
|
||||
{
|
||||
return su.getMenuOption(su.getFilterDropdownTemplate(), lbl, fn, cls);
|
||||
}
|
||||
su.getItemTemplate = function ()
|
||||
{
|
||||
return $('.sax-panel-item-template .sax-panel-item.User', $pnl.results).clone();
|
||||
}
|
||||
su.getItemDropdownTemplate = function ()
|
||||
{
|
||||
return $('.sax-panel-item-template .sax-dropdown-menu.User li.sax-dropdown-item', $pnl.results).clone();
|
||||
}
|
||||
su.getItemMenuOption = function (lbl, fn, cls)
|
||||
{
|
||||
return su.getMenuOption(su.getItemDropdownTemplate(), lbl, fn, cls);
|
||||
}
|
||||
su.getMenuOption = function ($opt, lbl, fn, cls)
|
||||
{
|
||||
return $opt.find('div.sax-label').text(lbl).end().on('click', fn).addClass(cls);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
su.selectFilterSport = function ()
|
||||
{
|
||||
let excludeIds = [];
|
||||
sax.mdl.selectSport.fn.selectSport({ caption: sax.dlg.title.selectSport, sportId: $('.FilterSportId', $frm.filter).val(), excludeIds: excludeIds, fnCallback: su.onFilterSportSelected })
|
||||
}
|
||||
su.onFilterSportSelected = function (spt)
|
||||
{
|
||||
$('.FilterSportId', $frm.filter).val(spt ? spt.id : '');
|
||||
$('.FilterSportCaption', $frm.filter).val(spt ? spt.name : '');
|
||||
su.refreshResults();
|
||||
}
|
||||
su.clearFilterSport = function ()
|
||||
{
|
||||
$('.FilterSportId,.FilterSportCaption', $frm.filter).val('');
|
||||
su.refreshResults();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
su.selectFilterRegion = function ()
|
||||
{
|
||||
let excludeIds = [];
|
||||
sax.mdl.selectRegion.fn.selectRegion({ caption: sax.dlg.title.selectRegion, regionId: $('.FilterRegionId', $frm.filter).val(), excludeIds: excludeIds, fnCallback: su.onFilterRegionSelected })
|
||||
}
|
||||
su.onFilterRegionSelected = function (rgn)
|
||||
{
|
||||
$('.FilterRegionId', $frm.filter).val(rgn ? rgn.id : '');
|
||||
$('.FilterRegionCaption', $frm.filter).val(rgn ? rgn.name : '');
|
||||
su.refreshResults();
|
||||
}
|
||||
su.clearFilterRegion = function ()
|
||||
{
|
||||
$('.FilterRegionId,.FilterRegionCaption', $frm.filter).val('');
|
||||
su.refreshResults();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
su.viewItem = function (item)
|
||||
{
|
||||
$('.UserId', $frm.usrId).val(item.id);
|
||||
su.ajax.user = su.ajax.user || { url: sax.url.base + 'Search/Ajax/GetUser', formId: 'frmUserId', callbackFn: su.onViewItem };
|
||||
sax.doAjaxRequest(su.ajax.user, 50);
|
||||
}
|
||||
su.onViewItem = function (response)
|
||||
{
|
||||
if (!response.success) return;
|
||||
let dlg = $dlg.usr;
|
||||
let item = su.data.user = response.user;
|
||||
$('.UserName', dlg).val(item.name);
|
||||
$('.UserLocation', dlg).toggle(!!item.location).find('.sax-value').text(item.location);
|
||||
sax.clearControlErrors();
|
||||
$dlg.usr.dialog('option', 'title', item.name || sax.dlg.title.user);
|
||||
sax.openDialog($dlg.usr, 600, 600);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
$(function ()
|
||||
{
|
||||
$pnl.usrs = $('.sax-panel.Users');
|
||||
$pnl.filter = $('.sax-panel-filter', $pnl.usrs);
|
||||
$pnl.results = $('.sax-panel-results', $pnl.usrs);
|
||||
|
||||
$frm.filter = $('#frmUserFilter', $pnl.usrs);
|
||||
$('.FilterUser', $frm.filter).on('input', function () { su.refreshResults(250); }).on('keypress', function (event)
|
||||
{
|
||||
if (event.keyCode == 13) setTimeout(su.refreshResults, 50);
|
||||
});
|
||||
$('.FilterCategory', $frm.filter).on('change', function () { su.refreshResults(); });
|
||||
|
||||
var opt = sax.dlgOpts();
|
||||
opt.buttons[sax.dlg.btn.cancel] = function () { $(this).dialog('close'); };
|
||||
$dlg.usr = $('#dlgUser').dialog(opt);
|
||||
$frm.usrId = $('#frmUserId');
|
||||
|
||||
setTimeout(su.refreshResults, 250);
|
||||
});
|
||||
|
||||
}(window, window.document));
|
||||
|
||||
/* The End */
|
||||
Reference in New Issue
Block a user