v1.2.9.2
This commit is contained in:
@@ -198,6 +198,12 @@
|
||||
<data name="caption.my.eligibility" xml:space="preserve">
|
||||
<value>My Eligibility</value>
|
||||
</data>
|
||||
<data name="caption.show.info" xml:space="preserve">
|
||||
<value>Show info</value>
|
||||
</data>
|
||||
<data name="caption.user.config" xml:space="preserve">
|
||||
<value>User Configuration</value>
|
||||
</data>
|
||||
<data name="company.name" xml:space="preserve">
|
||||
<value>Solum Forti</value>
|
||||
</data>
|
||||
@@ -243,6 +249,9 @@
|
||||
<data name="info.chars.available" xml:space="preserve">
|
||||
<value>[{0} chars available]</value>
|
||||
</data>
|
||||
<data name="info.profile.eligibility" xml:space="preserve">
|
||||
<value>You can identify the countries that you are eligible to participate for by adding references to your parentage and passport/visas.</value>
|
||||
</data>
|
||||
<data name="label. registered" xml:space="preserve">
|
||||
<value>Registered</value>
|
||||
</data>
|
||||
@@ -282,6 +291,9 @@
|
||||
<data name="label.awards" xml:space="preserve">
|
||||
<value>Awards</value>
|
||||
</data>
|
||||
<data name="label.bio" xml:space="preserve">
|
||||
<value>Bio</value>
|
||||
</data>
|
||||
<data name="label.calendar" xml:space="preserve">
|
||||
<value>Calendar</value>
|
||||
</data>
|
||||
@@ -678,6 +690,9 @@
|
||||
<data name="msg.error.item.delete.failed" xml:space="preserve">
|
||||
<value>Item deletion failed</value>
|
||||
</data>
|
||||
<data name="msg.error.item.duplicate" xml:space="preserve">
|
||||
<value>A duplicate item already exists.</value>
|
||||
</data>
|
||||
<data name="msg.error.item.id.not.found" xml:space="preserve">
|
||||
<value>Item not found for specified Id</value>
|
||||
</data>
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace Saxonite.Net.Core.Web.Online.App
|
||||
private Dictionary<String, SaxAppConfig> appConfigs = new Dictionary<string, SaxAppConfig>();
|
||||
private Dictionary<String, SaxEmailConfig> emailConfigs = new Dictionary<string, SaxEmailConfig>();
|
||||
// Session contexts.
|
||||
private class SessionContextData
|
||||
protected class SessionContextData
|
||||
{
|
||||
public SessionContextData(SaxSessionContext_Web sessionContext)
|
||||
{
|
||||
|
||||
@@ -8,6 +8,7 @@ using Saxonite.Net.Core.Web.Base.App;
|
||||
using Saxonite.Net.Core.Web.Online.Controllers;
|
||||
using Saxonite.Net.Standard.Base.App;
|
||||
using Saxonite.Net.Standard.Base.Bus;
|
||||
using Saxonite.Net.Standard.Base.Data;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@@ -49,16 +50,16 @@ namespace Saxonite.Net.Core.Web.Online.App
|
||||
{
|
||||
return base.RefreshUserData(userAccount);
|
||||
}
|
||||
}
|
||||
}
|
||||
protected override UserData CreateUserData(SaxSessionContext sessionContext, SaxUserAccount userAccount, List<SaxUserRole> userRoles) { return new UserData_Online(sessionContext, userAccount, userRoles); }
|
||||
/// <summary>User - JSON deserialisation route.</summary>
|
||||
public new UserData User { get { return base.User; } set { SetUser(new UserData_Online(value)); } }
|
||||
|
||||
/// <summary>
|
||||
/// Update the user's contect details against the session.
|
||||
/// <para>- User Account must match that already against the session.</para>
|
||||
/// </summary>
|
||||
public bool RefreshUser(SaxUserAccount userAccount)
|
||||
/// <summary>
|
||||
/// Update the user's contect details against the session.
|
||||
/// <para>- User Account must match that already against the session.</para>
|
||||
/// </summary>
|
||||
public bool RefreshUser(SaxUserAccount userAccount)
|
||||
{
|
||||
UserData_Online user = User as UserData_Online;
|
||||
if (user != null)
|
||||
@@ -67,9 +68,19 @@ namespace Saxonite.Net.Core.Web.Online.App
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// User Profile.
|
||||
// Protected constructors & setters for JSON deserialisation.
|
||||
public class UserProfileData
|
||||
// User Config - user's application settings.
|
||||
public class UserConfigData
|
||||
{
|
||||
/// <summary>Online Profile Config data.</summary>
|
||||
public SaxConfigData.ProfileData Profile{ get; set; } = new SaxConfigData.ProfileData();
|
||||
}
|
||||
/// <summary>User Configuration.</summary>
|
||||
public UserConfigData UserConfig { get; set; } = new UserConfigData();
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// User Profile.
|
||||
// Protected constructors & setters for JSON deserialisation.
|
||||
public class UserProfileData
|
||||
{
|
||||
public UserProfileData() { }
|
||||
// Sports.
|
||||
|
||||
@@ -18,6 +18,8 @@ using Sarand.Net.Standard.Base.Helpers;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Saxonite.Net.Standard.Base.Data;
|
||||
using static Saxonite.Net.Standard.Base.App.Sax.Config;
|
||||
|
||||
namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
{
|
||||
@@ -41,6 +43,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
public byte DobDay { get; set; }
|
||||
public byte DobMonth { get; set; }
|
||||
public short DobYear { get; set; }
|
||||
public bool? HasImage { get; set; } = null;
|
||||
// Regions.
|
||||
public String RegionIdCountry { get; set; }
|
||||
public String RegionCaptionCountry { get; set; }
|
||||
@@ -61,6 +64,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
data.DobDay = (byte)userAccount.DateOfBirthDay;
|
||||
data.DobMonth = (byte)userAccount.DateOfBirthMonth;
|
||||
data.DobYear = (short)userAccount.DateOfBirthYear;
|
||||
if (ItemDataMgr.ItemHasActiveImage(userAccount.GetItemId(), Sax.ImageType.Avatar))
|
||||
data.HasImage = true;
|
||||
// Regions.
|
||||
data.RegionIdCountry = model.GetEncryptedRegionId(userAccount.RegionIdCountry);
|
||||
data.RegionIdProvince = model.GetEncryptedRegionId(userAccount.RegionIdProvince);
|
||||
|
||||
@@ -79,6 +79,12 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
public List<UserEligibilityResponseListData> Eligibilities { get; } = new List<UserEligibilityResponseListData>();
|
||||
// Eligibility types.
|
||||
public List<EligibilityTypeData> Types { get; } = new List<EligibilityTypeData>();
|
||||
// User configuration.
|
||||
public class ConfigData
|
||||
{
|
||||
public bool? hideInfo { get; set; } = null;
|
||||
}
|
||||
public ConfigData Config { get; } = new ConfigData();
|
||||
}
|
||||
// Ajax request.
|
||||
[HttpPost]
|
||||
@@ -112,6 +118,10 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
if (!SysId.IsValid(userAccountId))
|
||||
userAccountId = SessionUserAccountId;
|
||||
|
||||
// User configuration.
|
||||
if (SessionData_Online.UserConfig.Profile.Eligibility.HideInfo)
|
||||
responseData.Config.hideInfo = true;
|
||||
|
||||
// Item filter.
|
||||
SaxUserEligibility.Params prmUserEligibility = new SaxUserEligibility.Params();
|
||||
prmUserEligibility.UserAccountIdsIncluded.Add(userAccountId);
|
||||
@@ -300,7 +310,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
SaxRegion.Data region = Internals.GetRegion(regionId);
|
||||
|
||||
// Eligibility type.
|
||||
Sax.EligibilityType eligibilityType = userEligibility != null ? userEligibility.EligibilityType : model.Eligibility.getEligibilityType();
|
||||
Sax.EligibilityType eligibilityType = model.Eligibility.Type != null ? model.Eligibility.getEligibilityType() : userEligibility != null ? userEligibility.EligibilityType : 0;
|
||||
if (eligibilityType <= 0)
|
||||
{
|
||||
// Shouldn't get here.
|
||||
@@ -309,7 +319,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
}
|
||||
|
||||
// Check for duplicate data.
|
||||
// ToDo Should include date range in checking for duplicate eligibility?
|
||||
// ToDo Include date range in checking for duplicate eligibility?
|
||||
{
|
||||
// First check without region.
|
||||
SaxUserEligibility.Params prmUserEligibility = new SaxUserEligibility.Params();
|
||||
@@ -321,33 +331,82 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
long eligibilityCount = AccountMgr.GetUserEligibilityCount(prmUserEligibility);
|
||||
// Selected Eligibility types have a limit on the number of instances allowed.
|
||||
if (eligibilityCount >= SaxUserEligibility.GetMaxInstances(eligibilityType))
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.validation.duplicate.value"]));
|
||||
{
|
||||
SaLogger.Warn(fn + " Eligibility type instance limit reached. Type: " + eligibilityType.ToString() + ". Instances: " + eligibilityCount + ". " + GetLogSuffix());
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.duplicate"]));
|
||||
}
|
||||
// Now include region - only allow one eligibility of each type.
|
||||
prmUserEligibility.RegionIdsIncluded.Add(regionId);
|
||||
eligibilityCount = AccountMgr.GetUserEligibilityCount(prmUserEligibility);
|
||||
if (eligibilityCount >= 1)
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.validation.duplicate.value"]));
|
||||
{
|
||||
SaLogger.Warn(fn + " Duplicate Eligibility exists. RegionId: " + SysId.ToString(regionId) + ". Type: " + eligibilityType.ToString() + ". " + GetLogSuffix());
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.duplicate"]));
|
||||
}
|
||||
}
|
||||
|
||||
// If region or eligibility have changed, check whether an equivalent deleted eligibility exists.
|
||||
// NB Can't modify the current eligibility with the modified values as it would conflict with the
|
||||
// deleted item - unique on user, region and eligibility.
|
||||
if (userEligibility != null && (!userEligibility.RegionId.Equals(regionId) || userEligibility.EligibilityType != eligibilityType))
|
||||
{
|
||||
SaxUserEligibility.Params prmUserEligibility = new SaxUserEligibility.Params();
|
||||
prmUserEligibility.IdsExcluded.Add(userEligibility.Id);
|
||||
prmUserEligibility.UserAccountIdsIncluded.Add(userAccountId);
|
||||
prmUserEligibility.RegionIdsIncluded.Add(regionId);
|
||||
prmUserEligibility.EligibilityTypesIncluded.Add(eligibilityType);
|
||||
prmUserEligibility.StatusCat = SaxUserEligibility.StatusCat.DeletedOnly;
|
||||
SaxUserEligibility userEligibilityDeleted = AccountMgr.GetUserEligibility(prmUserEligibility);
|
||||
if (userEligibilityDeleted != null)
|
||||
{
|
||||
disposableItems.Add(userEligibilityDeleted);
|
||||
SaLogger.Info(fn + " Resurrecting User Eligibility with status: " + userEligibilityDeleted.StatusDesc + ". Id: " + SysId.ToString(userEligibilityDeleted.Id) + ". " + GetLogSuffix());
|
||||
userEligibilityDeleted.Status = SaxUserEligibility.DefaultStatus;
|
||||
// Delete current item and replace with previously deleted item.
|
||||
if (!AccountMgr.DeleteUserEligibility(userEligibility, DbUpdateInfo))
|
||||
{
|
||||
SaLogger.Warn(fn + " Failed to delete user eligibility: " + AccountMgr.ErrorStateMessage);
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"]));
|
||||
}
|
||||
userEligibility = userEligibilityDeleted;
|
||||
}
|
||||
}
|
||||
|
||||
// If eligibility doesn't exist for the user, it may have been previously deleted.
|
||||
if (userEligibility == null)
|
||||
{
|
||||
// See if there is an existing item that matches user, region and eligibility.
|
||||
SaxUserEligibility.Params prmUserEligibility = new SaxUserEligibility.Params();
|
||||
prmUserEligibility.UserAccountIdsIncluded.Add(userAccountId);
|
||||
prmUserEligibility.RegionIdsIncluded.Add(regionId);
|
||||
prmUserEligibility.EligibilityTypesIncluded.Add(eligibilityType);
|
||||
prmUserEligibility.StatusCat = SaxUserEligibility.StatusCat.Any;
|
||||
prmUserEligibility.StatusCat = SaxUserEligibility.StatusCat.DeletedOnly;
|
||||
userEligibility = AccountMgr.GetUserEligibility(prmUserEligibility);
|
||||
if (userEligibility == null)
|
||||
{
|
||||
// Try again for the user & region without the eligibility type.
|
||||
prmUserEligibility.EligibilityTypesIncluded.Clear();
|
||||
userEligibility = AccountMgr.GetUserEligibility(prmUserEligibility);
|
||||
}
|
||||
if (userEligibility == null)
|
||||
{
|
||||
// Try again for the user & eligibility type without the region.
|
||||
prmUserEligibility.RegionIdsIncluded.Clear();
|
||||
prmUserEligibility.EligibilityTypesIncluded.Add(eligibilityType);
|
||||
userEligibility = AccountMgr.GetUserEligibility(prmUserEligibility);
|
||||
}
|
||||
if (userEligibility == null)
|
||||
{
|
||||
// Try again just for the user.
|
||||
prmUserEligibility.RegionIdsIncluded.Clear();
|
||||
prmUserEligibility.EligibilityTypesIncluded.Clear();
|
||||
userEligibility = AccountMgr.GetUserEligibility(prmUserEligibility);
|
||||
}
|
||||
if (userEligibility != null)
|
||||
{
|
||||
disposableItems.Add(userEligibility);
|
||||
if (userEligibility.Status == SaStatus.Deleted)
|
||||
{
|
||||
SaLogger.Info(fn + " Resurrecting User Eligibility with status: " + userEligibility.StatusDesc + ". Id: " + SysId.ToString(userEligibility.Id));
|
||||
userEligibility.Status = SaxUserEligibility.DefaultStatus;
|
||||
}
|
||||
else
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.validation.duplicate.value"]));
|
||||
SaLogger.Info(fn + " Resurrecting User Eligibility with status: " + userEligibility.StatusDesc + ". Id: " + SysId.ToString(userEligibility.Id) + ". " + GetLogSuffix());
|
||||
userEligibility.Status = SaxUserEligibility.DefaultStatus;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -357,6 +416,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
}
|
||||
|
||||
// Populate item properties.
|
||||
userEligibility.RegionId = regionId;
|
||||
userEligibility.EligibilityType = eligibilityType;
|
||||
if (model.Eligibility.Info != null)
|
||||
userEligibility.Info = model.Eligibility.Info;
|
||||
if (model.Eligibility.ExpiresOn != null)
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
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;
|
||||
using MailKit;
|
||||
using Org.BouncyCastle.Asn1.Mozilla;
|
||||
using Microsoft.Extensions.Primitives;
|
||||
using Saxonite.Net.Standard.Base.Data;
|
||||
|
||||
namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
{
|
||||
//=======================================================================
|
||||
// Online Ajax Controller - User Config.
|
||||
//=======================================================================
|
||||
partial class AccountController
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Data definitions.
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Update User Config.
|
||||
//-------------------------------------------------------------------
|
||||
private class AjaxResponse_UserConfigData : AjaxResponse_Data
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_UserConfigData(SaxModel_Online model) : base(model) { }
|
||||
}
|
||||
// Ajax request.
|
||||
[HttpPost]
|
||||
[Route("UserConfig/Ajax/Update")]
|
||||
public IActionResult UpdateUserConfig(SaxModel_Online model)
|
||||
{
|
||||
String fn = GetType().Name + ".UpdateUserConfig";
|
||||
AjaxResponse_UserConfigData responseData = new AjaxResponse_UserConfigData(model);
|
||||
String messageTitle = Localiser["caption.user.config"];
|
||||
|
||||
// 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 Config.
|
||||
Dictionary<Sax.UserConfigType, SaxUserConfig> userConfigs = new Dictionary<Sax.UserConfigType, SaxUserConfig>();
|
||||
|
||||
// Update user's configuration.
|
||||
foreach (String key in Request.Form.Keys)
|
||||
{
|
||||
StringValues formValue = "";
|
||||
Request.Form.TryGetValue(key, out formValue);
|
||||
SaLogger.Debug(fn + " Form data. Key: " + key + ". Value: " + formValue);
|
||||
if (key.EqualsCI("HideProfileEligibilityInfo"))
|
||||
{
|
||||
SaxUserConfig userConfig = RefreshUserConfig(Sax.UserConfigType.Online_Profile, userConfigs);
|
||||
if (userConfig != null)
|
||||
{
|
||||
disposableItems.Add(userConfig);
|
||||
SessionData_Online.UserConfig.Profile.Eligibility.HideInfo = StringUtil.ToBool(formValue);
|
||||
userConfig.ConfigData = SaxConfigData.ProfileData.ToXml(SessionData_Online.UserConfig.Profile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Store configuration.
|
||||
foreach (SaxUserConfig userConfig in userConfigs.Values)
|
||||
{
|
||||
if (!SysId.IsValid(userConfig.Id))
|
||||
{
|
||||
// Add new configuration.
|
||||
if (!AccountMgr.InsertUserConfig(userConfig, DbUpdateInfo))
|
||||
SaLogger.Warn(fn + " Failed to insert User Config: " + AccountMgr.ErrorStateMessage);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Update existing configuration.
|
||||
if (!AccountMgr.UpdateUserConfig(userConfig, DbUpdateInfo))
|
||||
SaLogger.Warn(fn + " Failed to update User Config: " + AccountMgr.ErrorStateMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Complete response.
|
||||
responseData.Success = true;
|
||||
return Json(responseData);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Retrieve the corresponding User Config if previously stored, otherwise create.
|
||||
/// </summary>
|
||||
private SaxUserConfig RefreshUserConfig(Sax.UserConfigType configType, Dictionary<Sax.UserConfigType, SaxUserConfig> userConfigs)
|
||||
{
|
||||
// Check if Config is already in cache.
|
||||
if (userConfigs.ContainsKey(configType)) return userConfigs.GetValueOrDefault(configType, null);
|
||||
// Retrieve user config.
|
||||
SaxUserConfig userConfig = AccountMgr.GetUserConfig(SessionUserAccountId, configType);
|
||||
if (userConfig == null)
|
||||
{
|
||||
// Configuration doesn't currently exist.
|
||||
userConfig = AccountMgr.CreateUserConfig(SessionUserAccountId, configType);
|
||||
}
|
||||
else
|
||||
{
|
||||
// User Configuration already exists.
|
||||
// Refresh configuration in case updated elsewhere.
|
||||
switch (configType)
|
||||
{
|
||||
case Sax.UserConfigType.Online_Profile:
|
||||
SessionData_Online.UserConfig.Profile = SaxConfigData.ProfileData.FromXml(userConfig.ConfigData);
|
||||
break;
|
||||
}
|
||||
}
|
||||
userConfigs.Add(userConfig.ConfigType, userConfig);
|
||||
return userConfig;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -12,6 +12,7 @@ using Sarand.Net.Standard.Base.Bus;
|
||||
using Saxonite.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
|
||||
namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
{
|
||||
@@ -43,19 +44,28 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
String logSuffix = keepLoggedInParams.GetValidParams().Concat("", " ", ".");
|
||||
if (SysId.IsValid(keepLoggedInParams.UserAccountId))
|
||||
{
|
||||
SaxUserAccount userAccount = AccountMgr.GetUserAccountById(keepLoggedInParams.UserAccountId);
|
||||
if (userAccount != null)
|
||||
// Record disposable items as they are created so all can be disposed when needed.
|
||||
using (DisposableCollection<SacsHierarchyItem> disposableItems = new DisposableCollection<SacsHierarchyItem>())
|
||||
{
|
||||
if (userAccount.IsStatusActive)
|
||||
SaxUserAccount userAccount = AccountMgr.GetUserAccountById(keepLoggedInParams.UserAccountId);
|
||||
if (userAccount != null)
|
||||
{
|
||||
String errorMessage = "";
|
||||
if (SignUserIn(userAccount, AccountMgr.GetRolesForUser(userAccount.Id), true, ref errorMessage))
|
||||
SaLogger.Info(fn + " Keep Logged In cookie found." + logSuffix);
|
||||
else SaLogger.Warn(fn + " Keep Logged In cookie found but failed to sign user in: " + errorMessage + "." + logSuffix);
|
||||
disposableItems.Add(userAccount);
|
||||
if (userAccount.IsStatusActive)
|
||||
{
|
||||
List<SaxUserRole> userRoles = AccountMgr.GetRolesForUser(userAccount.Id);
|
||||
disposableItems.AddRange(userRoles);
|
||||
List<SaxUserConfig> userConfigs = AccountMgr.GetConfigsForUser(userAccount.Id);
|
||||
disposableItems.AddRange(userConfigs);
|
||||
String errorMessage = "";
|
||||
if (SignUserIn(userAccount, userRoles, userConfigs, true, ref errorMessage))
|
||||
SaLogger.Info(fn + " Keep Logged In cookie found." + logSuffix);
|
||||
else SaLogger.Warn(fn + " Keep Logged In cookie found but failed to sign user in: " + errorMessage + "." + logSuffix);
|
||||
}
|
||||
else SaLogger.Warn(fn + " Keep Logged In cookie found but UserAccount is not active." + logSuffix);
|
||||
}
|
||||
else SaLogger.Warn(fn + " Keep Logged In cookie found but UserAccount is not active." + logSuffix);
|
||||
else SaLogger.Warn(fn + " Keep Logged In cookie found but UserAccount not found." + logSuffix);
|
||||
}
|
||||
else SaLogger.Warn(fn + " Keep Logged In cookie found but UserAccount not found." + logSuffix);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ using Saxonite.Net.Core.Web.Base.Controllers;
|
||||
using Saxonite.Net.Core.Web.Online.App;
|
||||
using Saxonite.Net.Standard.Base.App;
|
||||
using Saxonite.Net.Standard.Base.Bus;
|
||||
using Saxonite.Net.Standard.Base.Data;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
@@ -52,7 +53,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
/// <para>- Open user session - store details against Sesion Data.</para>
|
||||
/// <para>- Set 'Keep logged in' cookie if required.</para>
|
||||
/// </summary>
|
||||
protected bool SignUserIn(SaxUserAccount userAccount, List<SaxUserRole> userRoles, bool keepLoggedIn, ref String errorMessage)
|
||||
protected bool SignUserIn(SaxUserAccount userAccount, List<SaxUserRole> userRoles, List<SaxUserConfig> userConfigs, bool keepLoggedIn, ref String errorMessage)
|
||||
{
|
||||
String fn = GetType().Name + ".SignUserIn";
|
||||
|
||||
@@ -90,6 +91,17 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
OpenUserSession(SessionContext, userAccount, userRoles);
|
||||
RefreshSessionProfileSports();
|
||||
|
||||
// Refresh User configuration.
|
||||
foreach (SaxUserConfig userConfig in userConfigs)
|
||||
{
|
||||
switch (userConfig.ConfigType)
|
||||
{
|
||||
case Sax.UserConfigType.Online_Profile:
|
||||
SessionData_Online.UserConfig.Profile = SaxConfigData.ProfileData.FromXml(userConfig.ConfigData);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Send the 'Keep Logged In' cookie if requested.
|
||||
if (userAccount.KeepLoggedIn)
|
||||
SetKeepLoggedInCookie();
|
||||
|
||||
@@ -49,19 +49,26 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
|
||||
model.ValidateSignInData(responseData);
|
||||
if (responseData.HasControlErrors())
|
||||
return Json(responseData);
|
||||
// Record disposable items as they are created so all can be disposed when needed.
|
||||
using (DisposableCollection<SacsHierarchyItem> disposableItems = new DisposableCollection<SacsHierarchyItem>())
|
||||
{
|
||||
|
||||
// Get user account.
|
||||
SaxUserAccount userAccount = GetUserAccountForSignin(model, responseData);
|
||||
if (responseData.HasControlErrors())
|
||||
return Json(responseData);
|
||||
// Get user account.
|
||||
SaxUserAccount userAccount = GetUserAccountForSignin(model, responseData);
|
||||
disposableItems.Add(userAccount);
|
||||
if (responseData.HasControlErrors())
|
||||
return Json(responseData);
|
||||
|
||||
String errorMessage = "";
|
||||
if (!SignUserIn(userAccount, AccountMgr.GetRolesForUser(userAccount.Id), model.KeepMeSignedIn, ref errorMessage))
|
||||
return Json(responseData.SetControlError(nameof(model.EmailAddress), errorMessage));
|
||||
|
||||
// Construct response.
|
||||
List<SaxUserRole> userRoles = AccountMgr.GetRolesForUser(userAccount.Id);
|
||||
disposableItems.AddRange(userRoles);
|
||||
List<SaxUserConfig> userConfigs = AccountMgr.GetConfigsForUser(userAccount.Id);
|
||||
disposableItems.AddRange(userConfigs);
|
||||
String errorMessage = "";
|
||||
if (!SignUserIn(userAccount, userRoles, userConfigs, model.KeepMeSignedIn, ref errorMessage))
|
||||
return Json(responseData.SetControlError(nameof(model.EmailAddress), errorMessage));
|
||||
}
|
||||
// Complete response.
|
||||
responseData.Success = SessionData_Online?.ValidUserSession ?? false;
|
||||
|
||||
return Json(responseData);
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ namespace Saxonite.Net.Core.Web.Online.Models
|
||||
AdditionalFiles_CSS.Add("css/sax-account.css");
|
||||
AdditionalFiles_JS.Add("js/sax-account.js");
|
||||
AdditionalFiles_JS.Add("js/sax-pro-usr.js");
|
||||
AdditionalFiles_JS.Add("js/sax-pro-cfg.js");
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Online\Core\" />
|
||||
<Folder Include="Online\Data\" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -163,7 +163,7 @@
|
||||
<div class="row">
|
||||
<div class="col-sm-3">
|
||||
<div class="sax-label">
|
||||
<label for="ifAccountAbout"><span>@Localiser["label.about"]</span></label>
|
||||
<label for="ifAccountAbout"><span>@Localiser["label.bio"]</span></label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
|
||||
@@ -3,166 +3,172 @@
|
||||
|
||||
<div class="sax-panel-section ProfileEligibility sax-populating">
|
||||
|
||||
<div class="sax-panel-info">
|
||||
<div class="sax-panel-info">
|
||||
|
||||
<div class="sax-header">
|
||||
<div class="row">
|
||||
<div class="col sax-action sax-edit"><div class="sax-caption">@Localiser["caption.my.eligibility"]</div></div>
|
||||
<div class="fixed">
|
||||
@* 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">
|
||||
<li class="sax-dropdown-item sax-action sax-add"><div class="sax-label">@(Localiser["label.add"])</div></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
@* Filter item templates *@
|
||||
<div class="sax-panel-item-template">
|
||||
@* Burger dropdown item template - ul is ignored *@
|
||||
<ul class="sax-dropdown-menu ProfileEligibilities">
|
||||
<li class="sax-dropdown-item sax-action"><div class="sax-label">...</div></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sax-header">
|
||||
<div class="row">
|
||||
<div class="col sax-action sax-edit"><div class="sax-caption">@Localiser["caption.my.eligibility"]</div></div>
|
||||
<div class="fixed">
|
||||
@* 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">
|
||||
<li class="sax-dropdown-item sax-action sax-add"><div class="sax-label">@(Localiser["label.add"])</div></li>
|
||||
<li class="sax-dropdown-item sax-action sax-info"><div class="sax-label">@(Localiser["caption.show.info"])</div></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
@* Filter item templates *@
|
||||
<div class="sax-panel-item-template">
|
||||
@* Burger dropdown item template - ul is ignored *@
|
||||
<ul class="sax-dropdown-menu ProfileEligibilities">
|
||||
<li class="sax-dropdown-item sax-action"><div class="sax-label">...</div></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sax-content">
|
||||
@* User Eligibility list. *@
|
||||
<div class="sax-panel-results UserEligibilities"></div>
|
||||
</div>
|
||||
<div class="sax-content">
|
||||
<div class="sax-panel-results">
|
||||
<div class="sax-panel-infotip hidden"><div class="sax-close"></div><div class="sax-info"></div></div>
|
||||
<div class="sax-panel-messages"></div>
|
||||
@* User Eligibility list. *@
|
||||
<div class="sax-panel-item-list"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@* Item templates *@
|
||||
<div class="sax-panel-item-template">
|
||||
@* User Eligibility template *@
|
||||
<div class="sax-panel-item UserEligibility">
|
||||
<div class="sax-header row">
|
||||
<div class="col"><div class="sax-caption"><div class="sax-action EligibilityRegionName"></div></div></div>
|
||||
<div class="fixed">
|
||||
@* 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"></ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sax-content">
|
||||
<div class="row">
|
||||
<div class="col-sm-6"><div class="EligibilityType sax-note"></div></div>
|
||||
<div class="col-sm-6 text-sm-right"><div class="EligibilityExpiry sax-note">@Localiser["label.expires"]: <span class="EligibilityExpiresOn"></span></div></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@* User Eligibility Burger dropdown template - ul is ignored *@
|
||||
<ul class="sax-dropdown-menu UserEligibility">
|
||||
<li class="sax-dropdown-item sax-action"><div class="sax-label">...</div></li>
|
||||
</ul>
|
||||
</div>
|
||||
@* Item templates *@
|
||||
<div class="sax-panel-item-template">
|
||||
@* User Eligibility template *@
|
||||
<div class="sax-panel-item UserEligibility">
|
||||
<div class="sax-header row">
|
||||
<div class="col"><div class="sax-caption"><div class="sax-action EligibilityRegionName"></div></div></div>
|
||||
<div class="fixed">
|
||||
@* 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"></ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sax-content">
|
||||
<div class="row">
|
||||
<div class="col-sm-6"><div class="EligibilityType sax-note"></div></div>
|
||||
<div class="col-sm-6 text-sm-right"><div class="EligibilityExpiry sax-note">@Localiser["label.expires"]: <span class="EligibilityExpiresOn"></span></div></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@* User Eligibility Burger dropdown template - ul is ignored *@
|
||||
<ul class="sax-dropdown-menu UserEligibility">
|
||||
<li class="sax-dropdown-item sax-action"><div class="sax-label">...</div></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@* User Eligibility Id form. *@
|
||||
@using (Html.BeginForm(FormMethod.Post, new { @id = "frmUserEligibilityId", @class = "sax-form", @onSubmit = "return false;" }))
|
||||
{
|
||||
@Html.Hidden("Eligibility.Id", "", new { @id = "", @class = "UserEligibilityId sax-hidden" })
|
||||
}
|
||||
@* User Eligibility Id form. *@
|
||||
@using (Html.BeginForm(FormMethod.Post, new { @id = "frmUserEligibilityId", @class = "sax-form", @onSubmit = "return false;" }))
|
||||
{
|
||||
@Html.Hidden("Eligibility.Id", "", new { @id = "", @class = "UserEligibilityId sax-hidden" })
|
||||
}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@* User Eligibility dialog *@
|
||||
<div id="dlgUserEligibility" class="sax-dialog" title="@Localiser["account.caption.profile.eligibility"]">
|
||||
@* User Eligibility dialog *@
|
||||
<div id="dlgUserEligibility" class="sax-dialog" title="@Localiser["account.caption.profile.eligibility"]">
|
||||
|
||||
<div class="spacer2"></div>
|
||||
@using (Html.BeginForm(FormMethod.Post, new { @id = "frmUserEligibility", @class = "sax-form", @onSubmit = "return false;" }))
|
||||
{
|
||||
<input type="hidden" class="UserEligibilityId sax-hidden" name="Eligibility.Id" />
|
||||
<input type="hidden" class="EligibilityExists sax-hidden" name="Eligibility.Exists" />
|
||||
<div class="spacer2"></div>
|
||||
@using (Html.BeginForm(FormMethod.Post, new { @id = "frmUserEligibility", @class = "sax-form", @onSubmit = "return false;" }))
|
||||
{
|
||||
<input type="hidden" class="UserEligibilityId sax-hidden" name="Eligibility.Id" />
|
||||
<input type="hidden" class="EligibilityExists sax-hidden" name="Eligibility.Exists" />
|
||||
|
||||
@* Region *@
|
||||
<div class="sax-form-control EligibilityRegion">
|
||||
<div class="row">
|
||||
<div class="col-sm-3">
|
||||
<div class="sax-label">
|
||||
<label for="ifEligibilityRegionId"><span>@Localiser["label.region"]</span><span class="required"> *</span></label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
<div class="sax-control row">
|
||||
@Html.Hidden("Eligibility.RegionId", "", new { @id = "ifEligibilityRegionId", @class = "EligibilityRegionId" })
|
||||
<div class="col"><input type="text" id="ifEligibilityRegionName" class="EligibilityRegionName sax-input" readonly="readonly" /></div>
|
||||
<div class="fixed"><button class="SelectEligibilityRegion sax-button" style="min-width:auto;margin-left:4px;padding:4px 6px" >@Localiser["label.select"]</button></div>
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@* Region *@
|
||||
<div class="sax-form-control EligibilityRegion">
|
||||
<div class="row">
|
||||
<div class="col-sm-3">
|
||||
<div class="sax-label">
|
||||
<label for="ifEligibilityRegionId"><span>@Localiser["label.region"]</span><span class="required"> *</span></label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
<div class="sax-control row">
|
||||
@Html.Hidden("Eligibility.RegionId", "", new { @id = "ifEligibilityRegionId", @class = "EligibilityRegionId" })
|
||||
<div class="col"><input type="text" id="ifEligibilityRegionName" class="EligibilityRegionName sax-input" readonly="readonly" /></div>
|
||||
<div class="fixed"><button class="SelectEligibilityRegion sax-button" style="min-width:auto;margin-left:4px;padding:4px 6px">@Localiser["label.select"]</button></div>
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@* Eligibility Type *@
|
||||
<div class="sax-form-control EligibilityType">
|
||||
<div class="row">
|
||||
<div class="col-sm-3">
|
||||
<div class="sax-label">
|
||||
<label for="ifEligibilityType"><span>@Localiser["label.eligibility"]</span><span class="required"> *</span></label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
<div class="sax-control">
|
||||
@Html.DropDownList("Eligibility.Type", Model.EligibilityTypesForSelect, "", new { @id = "ifEligibilityType", @class = "EligibilityType sax-select", @readonly = "readonly", @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_EmailAddress) })
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@* Eligibility Type *@
|
||||
<div class="sax-form-control EligibilityType">
|
||||
<div class="row">
|
||||
<div class="col-sm-3">
|
||||
<div class="sax-label">
|
||||
<label for="ifEligibilityType"><span>@Localiser["label.eligibility"]</span><span class="required"> *</span></label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
<div class="sax-control">
|
||||
@Html.DropDownList("Eligibility.Type", Model.EligibilityTypesForSelect, "", new { @id = "ifEligibilityType", @class = "EligibilityType sax-select", @readonly = "readonly", @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_EmailAddress) })
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@* Info *@
|
||||
<div class="sax-form-control EligibilityInfo">
|
||||
<div class="row">
|
||||
<div class="col-sm-3">
|
||||
<div class="sax-label">
|
||||
<label for="ifEligibilityInfo"><span>@Localiser["label.info"]</span></label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
<div class="sax-control">
|
||||
@Html.TextArea("Eligibility.Info", "", new { @id = "ifEligibilityInfo", @class = "EligibilityInfo sax-textarea", @rows = 4, @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserEligibility_Info) })
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@* Info *@
|
||||
<div class="sax-form-control EligibilityInfo">
|
||||
<div class="row">
|
||||
<div class="col-sm-3">
|
||||
<div class="sax-label">
|
||||
<label for="ifEligibilityInfo"><span>@Localiser["label.info"]</span></label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
<div class="sax-control">
|
||||
@Html.TextArea("Eligibility.Info", "", new { @id = "ifEligibilityInfo", @class = "EligibilityInfo sax-textarea", @rows = 4, @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserEligibility_Info) })
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@* Expiry *@
|
||||
<div class="sax-form-control EligibilityExpiry">
|
||||
<div class="row">
|
||||
<div class="col-sm-3">
|
||||
<div class="sax-label">
|
||||
<label for="ifArticleRegionId"><span>@Localiser["label.expiry"]</span></label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
<div class="sax-control">
|
||||
<div class="row EligibilityExpires">
|
||||
<div class="fixed"><div class="pl16 pt4 pr8"><input type="checkbox" id="chkEligibilityExpires" class="EligibilityExpires sax-checkbox" /> <span class="" onclick="$('#chkEligibilityExpires').click()">@Localiser["label.expires.on"]</span></div></div>
|
||||
<div class="col">@Html.TextBox("Eligibility.ExpiresOn", "", new { @id = "ifEligibilityExpiresOn", @class = "sax-input sax-calendar EligibilityExpiresOn", @readonly = "readonly" })</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@* Expiry *@
|
||||
<div class="sax-form-control EligibilityExpiry">
|
||||
<div class="row">
|
||||
<div class="col-sm-3">
|
||||
<div class="sax-label">
|
||||
<label for="ifArticleRegionId"><span>@Localiser["label.expiry"]</span></label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm">
|
||||
<div class="sax-control">
|
||||
<div class="row EligibilityExpires">
|
||||
<div class="fixed"><div class="pl16 pt4 pr8"><input type="checkbox" id="chkEligibilityExpires" class="EligibilityExpires sax-checkbox" /> <span class="" onclick="$('#chkEligibilityExpires').click()">@Localiser["label.expires.on"]</span></div></div>
|
||||
<div class="col">@Html.TextBox("Eligibility.ExpiresOn", "", new { @id = "ifEligibilityExpiresOn", @class = "sax-input sax-calendar EligibilityExpiresOn", @readonly = "readonly" })</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
}
|
||||
<div class="spacer2"></div>
|
||||
</div>
|
||||
}
|
||||
<div class="spacer2"></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
sax.dlg.title.addUserEligibility = '@Localiser.GetJavascriptText("account.caption.profile.eligibility.add")';
|
||||
sax.dlg.title.updateUserEligibility = '@Localiser.GetJavascriptText("account.caption.profile.eligibility.update")';
|
||||
sax.dlg.title.removeUserEligibility = '@Localiser.GetJavascriptText("account.caption.profile.eligibility.remove")';
|
||||
sax.msg.removeUserEligibility = '@(Localiser.GetJavascriptText("msg.confirm.item.remove"))';
|
||||
sax.msg.eligibilityInfo = '@Localiser.GetJavascriptText("info.profile.eligibility")';
|
||||
sax.dlg.title.addUserEligibility = '@Localiser.GetJavascriptText("account.caption.profile.eligibility.add")';
|
||||
sax.dlg.title.updateUserEligibility = '@Localiser.GetJavascriptText("account.caption.profile.eligibility.update")';
|
||||
sax.dlg.title.removeUserEligibility = '@Localiser.GetJavascriptText("account.caption.profile.eligibility.remove")';
|
||||
sax.msg.removeUserEligibility = '@(Localiser.GetJavascriptText("msg.confirm.item.remove"))';
|
||||
</script>
|
||||
<script src="~/js/sax-pro-elg.js?@Model.HrefVersion"></script>
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
@model SaxModel_Online
|
||||
@inject SaxLocaliser Localiser
|
||||
|
||||
@if (!Model.RegisterView("Views/Common/SportSelect")) return;
|
||||
|
||||
<link rel="stylesheet" href="~/css/sax-spt-cnt.css?@Model.HrefVersion" />
|
||||
<script src="~/js/sax-spt-cnt.js?@Model.HrefVersion"></script>
|
||||
<script type="text/javascript">
|
||||
</script>
|
||||
|
||||
<div id="dlgCodeSelect" class="sax-dialog sax-form" style="padding-bottom:8px;">
|
||||
|
||||
@* Filter *@
|
||||
<div class=""></div>
|
||||
|
||||
<div class="row h-100">
|
||||
|
||||
@* Available codes *@
|
||||
<div class="col-sm-5">
|
||||
|
||||
<div class="h-100 sax-codeSelect-codes AvailableCodes"></div>
|
||||
|
||||
</div>
|
||||
|
||||
@* Code selection *@
|
||||
<div class="col-sm-2">
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div class="col-sx-6 col-sm-12 center">
|
||||
<button class="sax-button Select">@Localiser["label.select"]</button>
|
||||
</div>
|
||||
|
||||
<div class="col-sx-6 col-sm-12 center">
|
||||
<button class="sax-button Remove">@Localiser["label.remove"]</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@* Selected codes *@
|
||||
<div class="col-sm-5">
|
||||
|
||||
<div class="h-100 sax-codeSelect-codes SelectedCodes">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="sax-panel-item-template">
|
||||
<div class="sax-panel-item Code">
|
||||
<div class="CodeDesc"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -124,6 +124,11 @@
|
||||
background-image: url('../img/action/refresh24.png');
|
||||
}
|
||||
|
||||
.sax-header ul.nav.sax-burger ul.sax-dropdown-menu li.sax-action.sax-dropdown-item.sax-info
|
||||
{
|
||||
background-image: url('../img/action/info24.png');
|
||||
}
|
||||
|
||||
.sax-header ul.nav.sax-burger ul.sax-dropdown-menu li.sax-action.sax-dropdown-item.sax-add
|
||||
{
|
||||
background-image: url('../img/action/add24.png');
|
||||
@@ -203,6 +208,31 @@
|
||||
{
|
||||
}
|
||||
|
||||
/* Information tip*/
|
||||
|
||||
.sax-panel-results .sax-panel-infotip
|
||||
{
|
||||
width: 100%;
|
||||
margin-top: 4px;
|
||||
padding: 4px 4px 4px 8px;
|
||||
font-size: 14px;
|
||||
color: #606060;
|
||||
background-color: #fff;
|
||||
border: 1px solid #989898;
|
||||
border-bottom-right-radius: 8px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.sax-panel-results .sax-panel-infotip .sax-close
|
||||
{
|
||||
float: right;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
margin-left: 8px;
|
||||
background: url("../img/action/delete16.png");
|
||||
cursor:pointer;
|
||||
}
|
||||
|
||||
/* Messages */
|
||||
|
||||
.sax-panel-results .sax-panel-messages .sax-message
|
||||
@@ -346,7 +376,7 @@
|
||||
{
|
||||
max-width: 48px;
|
||||
max-height: 48px;
|
||||
margin:4px 4px 2px 0;
|
||||
margin: 4px 4px 2px 0;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
|
||||
@@ -362,10 +362,17 @@ a:focus
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.ui-dialog.center-buttons .ui-dialog-buttonpane .ui-dialog-buttonset
|
||||
{
|
||||
float: none;
|
||||
margin: 0 auto;
|
||||
display: table;
|
||||
}
|
||||
|
||||
.ui-dialog .ui-dialog-buttonpane button
|
||||
{
|
||||
min-width: 60px;
|
||||
margin:4px;
|
||||
margin: 4px;
|
||||
padding: 6px 16px 4px 16px;
|
||||
color: #fff;
|
||||
background-color: #606060;
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
/*
|
||||
Sport Contact stylesheet.
|
||||
*/
|
||||
|
||||
/* The End */
|
||||
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* User Config scripts.
|
||||
*/
|
||||
(function (win, doc, undef)
|
||||
{
|
||||
//--------------------------------------------------------------
|
||||
"use strict";
|
||||
let uc = sax.UserConfig = { fn: {}, ajax: {}, data: {}, $pnl: {}, $frm: {}, $dlg: {} };
|
||||
//--------------------------------------------------------------
|
||||
sax.updateUserConfigOption = uc.fn.updateConfigItem = function (key, val)
|
||||
{
|
||||
let formData = new FormData();
|
||||
formData.append("__RequestVerificationToken", $('#frmNavigate input[name="__RequestVerificationToken"]').val());
|
||||
formData.append(key, val);
|
||||
sax.doAjaxRequest({ url: sax.url.base + 'UserConfig/Ajax/Update', formData: formData }, 50);
|
||||
}
|
||||
//--------------------------------------------------------------
|
||||
}(window, window.document));
|
||||
|
||||
/* The End */
|
||||
@@ -12,6 +12,7 @@
|
||||
sax.refreshProfileEligibilityInfo = function (delay)
|
||||
{
|
||||
ue.init();
|
||||
$pnl.infoTip.hide().find('.sax-info').text(sax.msg.eligibilityInfo);
|
||||
$pnl.usrElg.removeClass('sax-edit').addClass('sax-populating');
|
||||
$('.sax-property', $pnl.usrElg).hide();
|
||||
sax.showDataRefreshingMsg($pnl.usrElg);
|
||||
@@ -30,10 +31,11 @@
|
||||
ue.clearItem();
|
||||
if (!response || !response.success) return;
|
||||
ue.data.types = response.types;
|
||||
$('.sax-message', $pnl.usrElg).stop(true, false).fadeOut(200).empty();
|
||||
$pnl.infoTip.toggle(!response.config.hideInfo);
|
||||
$('.sax-panel-messages', $pnl.results).stop(true, false).hide();
|
||||
let items = response.eligibilities;
|
||||
if (!items) return;
|
||||
let $items = $('.sax-panel-results.UserEligibilities', $pnl.usrElg).empty();
|
||||
let $items = $('.sax-panel-item-list', $pnl.results).empty();
|
||||
for (let itemIdx = 0; itemIdx < items.length; itemIdx++)
|
||||
$items.append(ue.populateItem(ue.getItemTemplate(), items[itemIdx]));
|
||||
$items.show();
|
||||
@@ -45,7 +47,7 @@
|
||||
if (!item) return;
|
||||
$item.prop('id', item.id);
|
||||
let fnUpd = function (evt) { ue.updateItem(item, $item); }
|
||||
let fnRmv = function (evt) { ue.removeItem(item,$item); }
|
||||
let fnRmv = function (evt) { ue.removeItem(item, $item); }
|
||||
$('.sax-header .sax-caption', $item).on('click', fnUpd);
|
||||
$('.sax-content', $item).on('dblclick', fnUpd);
|
||||
|
||||
@@ -86,9 +88,26 @@
|
||||
return $opt.find('div.sax-label').text(lbl).end().on('click', fn).addClass(cls);
|
||||
}
|
||||
//--------------------------------------------------------------
|
||||
ue.data.hideInfoKey = 'HideProfileEligibilityInfo';
|
||||
ue.showInfoTip = function ()
|
||||
{
|
||||
sax.debug('showInfoTip');
|
||||
$pnl.infoTip.show();
|
||||
sax.updateUserConfigOption(ue.data.hideInfoKey, 0);
|
||||
}
|
||||
ue.hideInfoTip = function ()
|
||||
{
|
||||
$pnl.infoTip.hide();
|
||||
sax.updateUserConfigOption(ue.data.hideInfoKey, 1);
|
||||
}
|
||||
//--------------------------------------------------------------
|
||||
ue.addItem = function ()
|
||||
{
|
||||
ue.clearItem();
|
||||
ue.showEligibilityDialog();
|
||||
}
|
||||
ue.showEligibilityDialog = function ()
|
||||
{
|
||||
sax.openDialog($dlg.usrElg.dialog('option', 'title', sax.dlg.title.addUserEligibility), 640, 480);
|
||||
}
|
||||
ue.clearItem = function ()
|
||||
@@ -98,7 +117,7 @@
|
||||
let frm = $frm.usrElg;
|
||||
$('.UserEligibilityId,.EligibilityExists,.EligibilityRegionId,input.sax-input,textarea.sax-textarea,select.sax-select', frm).val('');
|
||||
$('.SelectEligibilityRegion', frm).show();
|
||||
$('.sax-select.EligibilityType', frm).prop('disabled', false);
|
||||
ue.$selType.prop('disabled', false).change();
|
||||
ue.$chkExpires.prop("checked", false);
|
||||
sax.clearControlErrors(frm);
|
||||
}
|
||||
@@ -113,7 +132,7 @@
|
||||
}
|
||||
ue.doUpdateItem = function (response)
|
||||
{
|
||||
sax.debug('doUpdateItem', response);
|
||||
//sax.debug('doUpdateItem', response);
|
||||
if (!response.success) return;
|
||||
ue.clearItem();
|
||||
let frm = $frm.usrElg;
|
||||
@@ -122,19 +141,19 @@
|
||||
ue.$hdnExists.val(1);
|
||||
$('.EligibilityRegionId', frm).val(item.regionId);
|
||||
$('.sax-input.EligibilityRegionName', frm).val(item.regionName);
|
||||
$('.SelectEligibilityRegion', frm).hide();
|
||||
ue.$selType.val(item.eligibilityType).prop('disabled', true).change();
|
||||
//$('.SelectEligibilityRegion', frm).hide();
|
||||
ue.$selType.val(item.eligibilityType);//.prop('disabled', true).change();
|
||||
$('.sax-textarea.EligibilityInfo', frm).val(item.info);
|
||||
ue.$chkExpires.prop("checked", !!item.expiresOnFrm);
|
||||
ue.$dpExpiresOn.val(item.expiresOnFrm);
|
||||
sax.openDialog($dlg.usrElg.dialog('option', 'title', sax.dlg.title.updateUserEligibility), 640, 480);
|
||||
ue.showEligibilityDialog();
|
||||
}
|
||||
//--------------------------------------------------------------
|
||||
ue.selectEligibilityRegion = function ()
|
||||
{
|
||||
//sax.debug('selectEligibilityRegion');
|
||||
let frm = $frm.usrElg;
|
||||
if (ue.$hdnExists.val()) return;
|
||||
//if (ue.$hdnExists.val()) return;
|
||||
sax.mdl.selectRegion.fn.selectRegion({ caption: sax.dlg.title.selectRegion, regionId: $('#ifEligibilityRegionId', frm).val(), fnCallback: ue.storeEligibilityRegion })
|
||||
}
|
||||
ue.storeEligibilityRegion = function (eligibility)
|
||||
@@ -186,7 +205,7 @@
|
||||
//--------------------------------------------------------------
|
||||
ue.removeItem = function (item, $item)
|
||||
{
|
||||
sax.debug('removeItem',item);
|
||||
sax.debug('removeItem', item);
|
||||
ue.data.item = item;
|
||||
ue.data.$item = $item;
|
||||
let fn = function ()
|
||||
@@ -209,7 +228,10 @@
|
||||
{
|
||||
if ($pnl.usrElg) return;
|
||||
$pnl.usrElg = $('.sax-panel-section.ProfileEligibility');
|
||||
$('.sax-action.sax-add', $pnl.usrElg).on('click', function (evt) { ue.addItem(); });
|
||||
$pnl.usrElg.on('click', '.sax-action.sax-add', function (evt) { ue.addItem(); });
|
||||
$pnl.usrElg.on('click', '.sax-action.sax-info', function (evt) { ue.showInfoTip(); });
|
||||
$pnl.results = $('.sax-panel-results', $pnl.usrElg);
|
||||
$pnl.infoTip = $('.sax-panel-infotip', $pnl.results).on('click', '.sax-close', function (evt) { ue.hideInfoTip(); });
|
||||
|
||||
$frm.usrElgId = $('#frmUserEligibilityId', $pnl.usrElg);
|
||||
var opt = sax.dlgOpts();
|
||||
|
||||
@@ -31,14 +31,15 @@
|
||||
sax.onRefreshProfileContactInfo = function (response)
|
||||
{
|
||||
//sax.debug('onRefreshProfileContactInfo', response);
|
||||
if (!response || !response.success || !response.contact) return;
|
||||
if (!response || !response.success) return;
|
||||
let item = response.contact || {};
|
||||
$('.sax-panel-section').slideDown(750);
|
||||
$('.sax-message', $pnl.proCon).stop(true, false).fadeOut(200).empty();
|
||||
$('.sax-value', $pnl.proConInf).empty();
|
||||
sax.refreshInfo($pnl.proConInf, 'AccountEmailAddress', response.contact.emailAddress);
|
||||
sax.refreshInfo($pnl.proConInf, 'AccountName', response.contact.displayName);
|
||||
sax.refreshInfo($pnl.proConInf, 'AccountLocation', response.contact.locationCaption);
|
||||
$('img.AccountContact', $pnl.proConInf).prop('src', 'Image/Account/Contact/Profile?' + (new Date()).getTime());
|
||||
sax.refreshInfo($pnl.proConInf, 'AccountEmailAddress', item.emailAddress);
|
||||
sax.refreshInfo($pnl.proConInf, 'AccountName', item.displayName);
|
||||
sax.refreshInfo($pnl.proConInf, 'AccountLocation', item.locationCaption);
|
||||
$('img.AccountContact', $pnl.proConInf).prop('src', item.hasImage ? 'Image/Account/Contact/Profile?' + (new Date()).getTime() : '').toggle(!!item.hasImage);
|
||||
sax.showNoInfoMsg($pnl.proConInf);
|
||||
$pnl.proCon.removeClass('sax-populating');
|
||||
}
|
||||
@@ -49,27 +50,28 @@
|
||||
sax.data.genders = response.genders;
|
||||
sax.data.months = response.months;
|
||||
sax.data.imageContentTypes = response.imageContentTypes;
|
||||
let item = response.contact || {};
|
||||
$('.sax-message', $pnl.proCon).stop(true, false).fadeOut(200).empty();
|
||||
sax.refreshInput($pnl.proConFrm, 'AccountEmailAddress', response.contact.emailAddress);
|
||||
sax.refreshSelect($pnl.proConFrm, 'AccountTitle', response.contact.title);
|
||||
sax.refreshInput($pnl.proConFrm, 'AccountFirstName', response.contact.firstName);
|
||||
sax.refreshInput($pnl.proConFrm, 'AccountLastName', response.contact.lastName);
|
||||
sax.refreshTextArea($pnl.proConFrm, 'AccountAbout', response.contact.about);
|
||||
sax.refreshInput($pnl.proConFrm, 'AccountEmailAddress', item.emailAddress);
|
||||
sax.refreshSelect($pnl.proConFrm, 'AccountTitle', item.title);
|
||||
sax.refreshInput($pnl.proConFrm, 'AccountFirstName', item.firstName);
|
||||
sax.refreshInput($pnl.proConFrm, 'AccountLastName', item.lastName);
|
||||
sax.refreshTextArea($pnl.proConFrm, 'AccountAbout', item.about);
|
||||
let $selGender = $('#cbAccountGender');
|
||||
if (response.genders && response.genders.length)
|
||||
sax.populateSelectCodeDesc($('#cbAccountGender'), response.genders);
|
||||
sax.refreshSelect($pnl.proConFrm, 'AccountGender', response.contact.gender || '');
|
||||
sax.refreshSelect($pnl.proConFrm, 'AccountGender', item.gender || '');
|
||||
sax.refreshDob();
|
||||
sax.refreshSelect($pnl.proConFrm, 'AccountDobYear', response.contact.dobYear);
|
||||
sax.refreshSelect($pnl.proConFrm, 'AccountDobYear', item.dobYear);
|
||||
sax.refreshDob();
|
||||
sax.refreshSelect($pnl.proConFrm, 'AccountDobMonth', response.contact.dobMonth);
|
||||
sax.refreshSelect($pnl.proConFrm, 'AccountDobMonth', item.dobMonth);
|
||||
sax.refreshDob();
|
||||
sax.refreshSelect($pnl.proConFrm, 'AccountDobDay', response.contact.dobDay);
|
||||
sax.refreshInput($pnl.proConFrm, 'AccountRegionIdCountry', response.contact.regionIdCountry);
|
||||
sax.refreshInput($pnl.proConFrm, 'AccountRegionCaptionCountry', response.contact.regionCaptionCountry);
|
||||
sax.refreshInput($pnl.proConFrm, 'AccountRegionIdProvince', response.contact.regionIdProvince);
|
||||
sax.refreshInput($pnl.proConFrm, 'AccountRegionCaptionProvince', response.contact.regionCaptionProvince);
|
||||
$('img.AccountContact', $pnl.proConFrm).prop('src', 'Image/Account/Contact/Profile?' + (new Date()).getTime());
|
||||
sax.refreshSelect($pnl.proConFrm, 'AccountDobDay', item.dobDay);
|
||||
sax.refreshInput($pnl.proConFrm, 'AccountRegionIdCountry', item.regionIdCountry);
|
||||
sax.refreshInput($pnl.proConFrm, 'AccountRegionCaptionCountry', item.regionCaptionCountry);
|
||||
sax.refreshInput($pnl.proConFrm, 'AccountRegionIdProvince', item.regionIdProvince);
|
||||
sax.refreshInput($pnl.proConFrm, 'AccountRegionCaptionProvince', item.regionCaptionProvince);
|
||||
$('img.AccountContact', $pnl.proConFrm).prop('src', item.hasImage ? 'Image/Account/Contact/Profile?' + (new Date()).getTime() : '');
|
||||
$('.sax-panel-section').slideUp(750, function () { $pnl.proCon.addClass('sax-edit').slideDown(750); });
|
||||
}
|
||||
sax.storeProfileContact = function ()
|
||||
@@ -149,7 +151,7 @@
|
||||
{
|
||||
//sax.debug('onDropContactImageFile', file, context);
|
||||
if (file.size > sax.maxProfileImageSize) return sax.doAlert(sax.dlg.title.imageUpload, sax.msg.uploadFileSizeMax.format(sax.formatFileSize(sax.maxProfileImageSize)));
|
||||
if ((sax.data.imageContentTypes||[]).indexOf(file.type) < 0) return sax.doAlert(sax.dlg.title.imageUpload, sax.msg.uploadFileTypeInvalid.format(sax.getFileType(file)));
|
||||
if ((sax.data.imageContentTypes || []).indexOf(file.type) < 0) return sax.doAlert(sax.dlg.title.imageUpload, sax.msg.uploadFileTypeInvalid.format(sax.getFileType(file)));
|
||||
$(".UploadMessage", context).text(sax.msg.uploadingFile.format(file.name));
|
||||
$('img.ContactImageUploadProgress', context).fadeIn(200);
|
||||
sax.clearControlError($pnl.contactImageDrag);
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Sport contact.
|
||||
*/
|
||||
|
||||
(function (win, doc, undef)
|
||||
{
|
||||
//--------------------------------------------------------------
|
||||
"use strict";
|
||||
let sc = sax.mdl.sportContact = { ajax: {}, data: {}, $pnl: {}, $dlg: {}, $frm: {} };
|
||||
//--------------------------------------------------------------
|
||||
/*
|
||||
* Sport Contact config:
|
||||
* - caption - dialog title.
|
||||
* - contact:
|
||||
* - type
|
||||
* - name
|
||||
* - email
|
||||
* - phone
|
||||
* - typesUsed
|
||||
* - fnCallback - method to call on completion to store details.
|
||||
*/
|
||||
sax.showSportContact = function (cfg)
|
||||
{
|
||||
sc.fn.init();
|
||||
sc.data.cfg = cfg;
|
||||
sax.openDialog(sc.$dlg.dialog('option', { title: sc.data.cfg.caption || 'Select Sport' }), sc.data.cfg.width || 400, sc.data.cfg.height || 800);
|
||||
}
|
||||
//--------------------------------------------------------------
|
||||
sc.fn.displayContact = function ()
|
||||
{
|
||||
}
|
||||
//--------------------------------------------------------------
|
||||
sc.fn.init = function ()
|
||||
{
|
||||
if (sc.$dlg.sptCnt) return;
|
||||
var opt = sax.dlgOpts();
|
||||
opt.open = function (evt, ui) { sc.fn.onDlgSize(); };
|
||||
opt.resize = function (evt, ui) { sc.fn.onDlgSize(); };
|
||||
opt.buttons[sax.dlg.btn.ok] = function () { sc.fn.storeSelectSport(); };
|
||||
opt.buttons[sax.dlg.btn.cancel] = function () { sc.fn.cleanUp(); $(this).dialog('close'); };
|
||||
sc.$dlg.sptCnt = $('#dlgSportContact').dialog(opt);
|
||||
}
|
||||
//--------------------------------------------------------------
|
||||
}(window, window.document));
|
||||
|
||||
/* The End */
|
||||
Reference in New Issue
Block a user