From d95d49d4c6fd46e259ee86a3d4583e94ca9b0c00 Mon Sep 17 00:00:00 2001 From: andy Date: Tue, 25 Oct 2022 11:55:32 +0100 Subject: [PATCH] v1.2.9.1 --- SaxoniteCoreWeb/Base/App/SaxLocaliser.cs | 6 + .../Base/Consoles/SaxActivityConsole_Web.cs | 4 +- .../Base/Controllers/SaxController_Base.cs | 5 +- SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs | 18 +- .../Admin/Controllers/ImageController.cs | 6 +- .../OrganisationController-Ajax-Members.cs | 2 +- SaxoniteCoreWebAdmin/wwwroot/js/sax-main.js | 2 +- .../Localisation/SaxOnlineProperties.resx | 36 + .../AccountController-Ajax-Contact.cs | 12 +- .../AccountController-Ajax-Eligibility.cs | 462 +++++++++++++ .../AccountController-Ajax-Organisations.cs | 6 +- .../AccountController-Ajax-Sports.cs | 8 +- ...ountController-Ajax-UserSportExperience.cs | 8 +- .../Online/Controllers/AccountController.cs | 24 + .../Controllers/ActivityController-Ajax.cs | 10 +- .../Controllers/ArticleController-Ajax.cs | 16 +- .../Online/Controllers/ArticleController.cs | 2 +- .../Online/Controllers/ImageController.cs | 6 +- .../OrganisationController-Ajax-Events.cs | 4 +- .../OrganisationController-Ajax-Members.cs | 16 +- ...ganisationController-Ajax-Opportunities.cs | 4 +- .../OrganisationController-Ajax.cs | 6 +- .../Controllers/OrganisationController.cs | 2 +- .../Online/Models/Model_Account.cs | 7 +- .../Online/Models/Model_UserEligibility.cs | 112 ++++ .../Online/Models/SaxModel_Online.cs | 10 +- .../Views/Account/Organisations.cshtml | 26 + .../Views/Account/Profile-Eligibility.cshtml | 168 +++++ .../Account/Profile-Organisations.cshtml | 5 +- .../Account/Profile-SportExperiences.cshtml | 1 + .../Views/Account/Profile-Sports.cshtml | 21 +- .../Views/Account/Profile.cshtml | 6 +- .../Views/Account/Sports.cshtml | 11 + .../Views/Shared/_Layout.cshtml | 2 + .../wwwroot/js/sax-account.js | 8 +- SaxoniteCoreWebOnline/wwwroot/js/sax-home.js | 2 +- SaxoniteCoreWebOnline/wwwroot/js/sax-main.js | 2 +- .../wwwroot/js/sax-pro-elg.js | 233 +++++++ .../js/{sax-usr-spt-exp.js => sax-pro-exp.js} | 29 +- .../js/{sax-usr-org.js => sax-pro-org.js} | 0 .../js/{sax-usr-spt.js => sax-pro-spt.js} | 87 ++- .../js/{sax-usr-pro.js => sax-pro-usr.js} | 0 SaxoniteStandardBase/Base/App/Sax-Config.cs | 4 +- SaxoniteStandardBase/Base/App/Sax-Version.cs | 6 +- SaxoniteStandardBase/Base/App/Sax.cs | 21 +- .../Base/App/SaxDbDfn_Core.cs | 132 ++-- SaxoniteStandardBase/Base/App/SaxInternals.cs | 1 + .../Base/App/SaxSystem-CodeTypes.cs | 14 +- .../Base/Bus/SaxUserEligibility.cs | 323 +++++++++ .../Base/Consoles/SaxActivityConsole.cs | 2 +- .../Base/Mgr/SaxAccountMgr-UserEligibility.cs | 253 +++++++ SaxoniteStandardBase/Base/Mgr/SaxItemMgr.cs | 1 + .../Dbas/Bus/SaxUserEligibility_Dbas.cs | 33 + .../Dbas/Internal/ActivityFeedback_Db.cs | 2 +- .../Dbas/Internal/ActivityIndex_Db.cs | 2 +- .../Dbas/Internal/Article_Db.cs | 2 +- .../Dbas/Internal/ItemAddress_Db.cs | 2 +- .../Dbas/Internal/ItemAssociation_Db.cs | 2 +- .../Dbas/Internal/ItemImage_Db.cs | 2 +- .../Dbas/Internal/ItemSport_Db.cs | 2 +- .../Dbas/Internal/OrganisationEvent_Db.cs | 2 +- .../Internal/OrganisationOpportunity_Db.cs | 2 +- .../Dbas/Internal/Organisation_Db.cs | 2 +- .../Dbas/Internal/Region_Db.cs | 2 +- .../Dbas/Internal/Sport_Db.cs | 2 +- .../Dbas/Internal/UserAccount_Db.cs | 2 +- .../Dbas/Internal/UserActivity_Db.cs | 2 +- .../Dbas/Internal/UserEligibility_Db.cs | 230 +++++++ .../Dbas/Internal/UserOnline_Db.cs | 2 +- .../Dbas/Internal/UserOrganisation_Db.cs | 2 +- .../Dbas/Internal/UserRole_Db.cs | 2 +- .../Dbas/Internal/UserSession_Db.cs | 2 +- .../Dbas/Internal/UserSportExperience_Db.cs | 2 +- .../Dbas/Internal/UserSport_Db.cs | 2 +- .../Mgr/SaxAccountMgr_Dbas-UserEligibility.cs | 630 ++++++++++++++++++ .../Resources/Database/SaxDbDfn_Core.xml | 379 +++++++++++ 76 files changed, 3242 insertions(+), 222 deletions(-) create mode 100644 SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Eligibility.cs create mode 100644 SaxoniteCoreWebOnline/Online/Models/Model_UserEligibility.cs create mode 100644 SaxoniteCoreWebOnline/Views/Account/Organisations.cshtml create mode 100644 SaxoniteCoreWebOnline/Views/Account/Profile-Eligibility.cshtml create mode 100644 SaxoniteCoreWebOnline/Views/Account/Sports.cshtml create mode 100644 SaxoniteCoreWebOnline/wwwroot/js/sax-pro-elg.js rename SaxoniteCoreWebOnline/wwwroot/js/{sax-usr-spt-exp.js => sax-pro-exp.js} (92%) rename SaxoniteCoreWebOnline/wwwroot/js/{sax-usr-org.js => sax-pro-org.js} (100%) rename SaxoniteCoreWebOnline/wwwroot/js/{sax-usr-spt.js => sax-pro-spt.js} (57%) rename SaxoniteCoreWebOnline/wwwroot/js/{sax-usr-pro.js => sax-pro-usr.js} (100%) create mode 100644 SaxoniteStandardBase/Base/Bus/SaxUserEligibility.cs create mode 100644 SaxoniteStandardBase/Base/Mgr/SaxAccountMgr-UserEligibility.cs create mode 100644 SaxoniteStandardDbas/Dbas/Bus/SaxUserEligibility_Dbas.cs create mode 100644 SaxoniteStandardDbas/Dbas/Internal/UserEligibility_Db.cs create mode 100644 SaxoniteStandardDbas/Dbas/Mgr/SaxAccountMgr_Dbas-UserEligibility.cs diff --git a/SaxoniteCoreWeb/Base/App/SaxLocaliser.cs b/SaxoniteCoreWeb/Base/App/SaxLocaliser.cs index 5ff65e8..168736a 100644 --- a/SaxoniteCoreWeb/Base/App/SaxLocaliser.cs +++ b/SaxoniteCoreWeb/Base/App/SaxLocaliser.cs @@ -237,6 +237,12 @@ namespace Saxonite.Net.Core.Web.Base.App return GetCodeTypeCaption(Sax.CodeType.RegionType, regionType); } + // Eligibility type. + public String GetEligibilityTypeCaption(Sax.EligibilityType regionType) + { + return GetCodeTypeCaption(Sax.CodeType.EligibilityType, regionType); + } + // User role. public String GetUserRoleCaption(Sax.UserRole userRole) { diff --git a/SaxoniteCoreWeb/Base/Consoles/SaxActivityConsole_Web.cs b/SaxoniteCoreWeb/Base/Consoles/SaxActivityConsole_Web.cs index 45867f5..4503c39 100644 --- a/SaxoniteCoreWeb/Base/Consoles/SaxActivityConsole_Web.cs +++ b/SaxoniteCoreWeb/Base/Consoles/SaxActivityConsole_Web.cs @@ -119,8 +119,8 @@ namespace Saxonite.Net.Core.Web.Base.Consoles Sax.DataItemType itemType = (Sax.DataItemType)values.GetLong(colItemType.DataName); ItemId itemId = new ItemId((short)itemType, new SysId(values.GetLong(colItemId.DataName))); DateTime effectiveOn = values.GetDate(colDataNameEffectiveOn); - ActivityData_Web activtyData = new ActivityData_Web(itemId, effectiveOn); - activityDataList.Add(activtyData); + ActivityData_Web activityData = new ActivityData_Web(itemId, effectiveOn); + activityDataList.Add(activityData); SaLogger.Info(fn + " Activity found - " + itemType.ToString() + ":" + SysId.ToString(itemId.Id) + ". Effective: " + DateUtil.Format(effectiveOn, "d-MMM-yyyy")); } } diff --git a/SaxoniteCoreWeb/Base/Controllers/SaxController_Base.cs b/SaxoniteCoreWeb/Base/Controllers/SaxController_Base.cs index ea91ac7..bb63793 100644 --- a/SaxoniteCoreWeb/Base/Controllers/SaxController_Base.cs +++ b/SaxoniteCoreWeb/Base/Controllers/SaxController_Base.cs @@ -117,6 +117,7 @@ namespace Saxonite.Net.Core.Web.Base.Controllers public List SportParticipationCodes { get { return Internals.SportParticipationCodes; } } public List SportOfficiatingCodes { get { return Internals.SportOfficiatingCodes; } } public List RegionTypeCodes { get { return Internals.RegionTypeCodes; } } + public List EligibilityTypeCodes { get { return Internals.EligibilityTypeCodes; } } public List UserRoleCodes { get { return Internals.UserRoleCodes; } } public List OrganisationTypeCodes { get { return Internals.OrganisationTypeCodes; } } public List OrganisationCategoryCodes { get { return Internals.OrganisationCategoryCodes; } } @@ -308,11 +309,11 @@ namespace Saxonite.Net.Core.Web.Base.Controllers if (SessionData == null || !SessionData.ValidUserSession) return false; SaxSessionDataConsole sessionDataConsole = SessionDataConsole; if (sessionDataConsole != null) - sessionDataConsole.RecordUserActive(UserAccountId, CreatedAt); + sessionDataConsole.RecordUserActive(SessionUserAccountId, CreatedAt); return true; } } - public SysId UserAccountId { get { return SessionData?.User?.UserAccountId ?? null; } } + public SysId SessionUserAccountId { get { return SessionData?.User?.UserAccountId ?? null; } } public DbUpdateInfo DbUpdateInfo { get { return SessionData?.DbUpdateInfo ?? new DbUpdateInfo(null, "", SaxSystem.ComputerName); } } // Referrer. public String Referer { get { return Request.Headers["Referer"].ToString(); } } diff --git a/SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs b/SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs index 2b2c9b7..e2b5b26 100644 --- a/SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs +++ b/SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs @@ -16,6 +16,7 @@ using Saxonite.Net.Standard.Base.Mgr; using System; using System.Collections.Generic; using System.Globalization; +using static Saxonite.Net.Standard.Base.App.Sax; namespace Saxonite.Net.Core.Web.Base.Models { @@ -60,12 +61,12 @@ namespace Saxonite.Net.Core.Web.Base.Models public String InstanceVersion { get { return !StringUtil.IsEmpty(App.AppConfig.Instance) ? App.AppConfig.Instance + " v" + Sax.Version.GetFullVersion() : "v" + Sax.Version.GetAppVersion(); } } public bool IncludeGoogleAnalytics { get; set; } = false; // Views can be registered to avoid multiple inclusions in a page. - private HashSet registeredViews = new HashSet(StringComparer.OrdinalIgnoreCase); + private HashSet registeredViews = new HashSet(StringComparer.OrdinalIgnoreCase); /// /// Views can be registered to avoid multiple inclusions in a page. /// Only generate view content if this method returns true. /// - public bool RegisterView (String viewName) + public bool RegisterView(String viewName) { #if DEBUG if (registeredViews.Contains(viewName)) @@ -93,6 +94,7 @@ namespace Saxonite.Net.Core.Web.Base.Models public List SportParticipationCodes { get { return Internals.SportParticipationCodes; } } public List SportOfficiatingCodes { get { return Internals.SportOfficiatingCodes; } } public List RegionTypeCodes { get { return Internals.RegionTypeCodes; } } + public List EligibilityTypeCodes { get { return Internals.EligibilityTypeCodes; } } public List UserRoleCodes { get { return Internals.UserRoleCodes; } } public List OrganisationTypeCodes { get { return Internals.OrganisationTypeCodes; } } public List OrganisationCategoryCodes { get { return Internals.OrganisationCategoryCodes; } } @@ -397,6 +399,18 @@ namespace Saxonite.Net.Core.Web.Base.Models get { return new SelectList(SaxSystem.GetCodesOfType(Sax.CodeType.Title), "Code", "Desc"); } } + /// List of eligibility types for dropdown. + public IEnumerable EligibilityTypesForSelect + { + get + { + List values = new List(); + foreach (TypeCodeDesc eligibilityType in Internals.EligibilityTypeCodes) + values.Add(new SelectListItem(Localiser.GetEligibilityTypeCaption((Sax.EligibilityType)eligibilityType.Type), eligibilityType.Code)); + return values; + } + } + /// List of Organisation Types for dropdown. public IEnumerable OrganisationTypesForSelect { diff --git a/SaxoniteCoreWebAdmin/Admin/Controllers/ImageController.cs b/SaxoniteCoreWebAdmin/Admin/Controllers/ImageController.cs index 105993f..61aaea8 100644 --- a/SaxoniteCoreWebAdmin/Admin/Controllers/ImageController.cs +++ b/SaxoniteCoreWebAdmin/Admin/Controllers/ImageController.cs @@ -46,7 +46,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers String userAccountIdParam = "";// ToDo Decrypt from uaie value. SysId userAccountId = userAccountIdParam.ToSysId(); if (!SysId.IsValid(userAccountId)) - userAccountId = UserAccountId; + userAccountId = SessionUserAccountId; return GetAccountContactImage(userAccountId, Sax.ImageType.Avatar); } @@ -68,7 +68,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers // Response should not be cached. Response.Headers[HeaderNames.CacheControl] = "no-cache, no-store, must-revalidate, max-age=0"; Response.Headers[HeaderNames.Expires] = "-1"; - SysId userAccountId = UserAccountId; + SysId userAccountId = SessionUserAccountId; return GetAccountContactImage(userAccountId, Sax.ImageType.Avatar_Upload); } @@ -191,7 +191,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers // Validate session and referrer. if (!ValidReferer || !ValidUserSession) return Forbid(); - ItemId userItemId = new ItemId((short)Sax.DataItemType.UserAccount, UserAccountId); + ItemId userItemId = new ItemId((short)Sax.DataItemType.UserAccount, SessionUserAccountId); // Extract encrypted parameters. NameValueCollection parameters = ExtractSessionParams(iie); diff --git a/SaxoniteCoreWebAdmin/Admin/Controllers/OrganisationController-Ajax-Members.cs b/SaxoniteCoreWebAdmin/Admin/Controllers/OrganisationController-Ajax-Members.cs index f0b0e6a..cf3ba8b 100644 --- a/SaxoniteCoreWebAdmin/Admin/Controllers/OrganisationController-Ajax-Members.cs +++ b/SaxoniteCoreWebAdmin/Admin/Controllers/OrganisationController-Ajax-Members.cs @@ -48,7 +48,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers data.Id = SysId.ToString(userOrganisation.Id); // User. data.UserAccountId = SysId.ToString(userAccount.Id); - if (userAccount.Id.Equals(UserAccountId)) data.Self = true; + if (userAccount.Id.Equals(SessionUserAccountId)) data.Self = true; data.EmailAddress = userAccount.EmailAddress; data.DisplayName = userAccount.GetDisplayName(); data.UserStatusCode = userAccount.StatusCode; diff --git a/SaxoniteCoreWebAdmin/wwwroot/js/sax-main.js b/SaxoniteCoreWebAdmin/wwwroot/js/sax-main.js index 37ff9b9..aacb0e2 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/js/sax-main.js +++ b/SaxoniteCoreWebAdmin/wwwroot/js/sax-main.js @@ -139,7 +139,7 @@ { if (e.keyCode == 8 || e.keyCode == 46) { - $(this).datepicker('setDate', null); + $(this).datepicker('setDate', null).datepicker('hide').change(); } }); } diff --git a/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx b/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx index 2a00ae0..6a46d71 100644 --- a/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx +++ b/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx @@ -138,6 +138,18 @@ My Details + + Eligibility + + + Add Eligibility + + + Remove Eligibility + + + Update Eligibility + My Organisations @@ -183,6 +195,9 @@ Update Member + + My Eligibility + Solum Forti @@ -339,6 +354,9 @@ Effective + + Eligibility + Email @@ -354,6 +372,15 @@ Experience + + Expires + + + Expires on + + + Expiry + Facebook @@ -393,6 +420,9 @@ Image + + Info + Remember Me @@ -429,6 +459,12 @@ Month + + My Organisations + + + My Sports + Name diff --git a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Contact.cs b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Contact.cs index 75bc3fd..44ae0eb 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Contact.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Contact.cs @@ -74,7 +74,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Utilites. private ItemId GetUserItemId(SysId userAccountId) { - return new ItemId((short)Sax.DataItemType.UserAccount, UserAccountId); + return new ItemId((short)Sax.DataItemType.UserAccount, userAccountId); } //------------------------------------------------------------------- @@ -122,11 +122,11 @@ namespace Saxonite.Net.Core.Web.Online.Controllers responseData.ImageContentTypes = SaxItemImage.GetValidContentTypes(Sax.DataItemType.UserAccount); // Retrieve user details. - SaxUserAccount userAccount = AccountMgr.GetUserAccountById(UserAccountId); + SaxUserAccount userAccount = AccountMgr.GetUserAccountById(SessionUserAccountId); disposableItems.Add(userAccount); if (userAccount == null) { - SaLogger.Warn(fn + " Failed to retrieve user account for Id: " + SysId.ToString(UserAccountId)); + SaLogger.Warn(fn + " Failed to retrieve user account for Id: " + SysId.ToString(SessionUserAccountId)); return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); } @@ -218,7 +218,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers return Json(responseData.SetControlError("AccountContactImage", Localiser["msg.upload.image.resize.failed"])); // Image belongs to the user's account. - ItemId userItemId = GetUserItemId(UserAccountId); + ItemId userItemId = GetUserItemId(SessionUserAccountId); // Store uploaded image as 'Upload' Avatar - awaiting confirmation that the contact details are to be saved. SaxItemImage itemImage = ItemDataMgr.GetItemImage(userItemId, Sax.ImageType.Avatar_Upload, SaxItemImage.StatusCat.Any); @@ -291,11 +291,11 @@ namespace Saxonite.Net.Core.Web.Online.Controllers return Json(responseData); // Retrieve user details. - SaxUserAccount userAccount = AccountMgr.GetUserAccountById(UserAccountId); + SaxUserAccount userAccount = AccountMgr.GetUserAccountById(SessionUserAccountId); disposableItems.Add(userAccount); if (userAccount == null) { - SaLogger.Warn(fn + " Failed to retrieve user account for Id: " + SysId.ToString(UserAccountId)); + SaLogger.Warn(fn + " Failed to retrieve user account for Id: " + SysId.ToString(SessionUserAccountId)); return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); } if (!userAccount.EmailAddress.EqualsCI(SessionData.User.EmailAddress)) diff --git a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Eligibility.cs b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Eligibility.cs new file mode 100644 index 0000000..85a5cba --- /dev/null +++ b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Eligibility.cs @@ -0,0 +1,462 @@ +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; + +namespace Saxonite.Net.Core.Web.Online.Controllers +{ + //======================================================================= + // Online Account Controller - User Eligibility - Ajax actions. + //======================================================================= + partial class AccountController + { + //------------------------------------------------------------------- + // Data definitions. + private class UserEligibilityResponseListData : AjaxResponse_Data.ItemData_Base + { + public String UserAccountId { get; set; } + public String RegionName { get; set; } + public String EligibilityTypeDesc { get; set; } + public String Info { get; set; } + public String ExpiresOnFmt { get; set; } + } + private class UserEligibilityResponseItemData : UserEligibilityResponseListData + { + public String RegionId { get; set; } + public String EligibilityType { get; set; } + public String ExpiresOnFrm { get; set; } + } + private void PopulateUserEligibilityResponseListData(SaxModel_Online model, SaxUserEligibility userEligibility, UserEligibilityResponseListData data) + { + data.Id = model.EncryptId(userEligibility.Id); + data.UserAccountId = model.EncryptId(userEligibility.UserAccountId); + data.RegionName = model.GetRegionCaption(userEligibility.RegionId); + data.EligibilityTypeDesc = Localiser.GetEligibilityTypeCaption(userEligibility.EligibilityType); + data.Info = userEligibility.Info; + data.ExpiresOnFmt = model.FormatDateForDisplay(userEligibility.ExpiresOn); + } + private void PopulateUserEligibilityResponseItemData(SaxModel_Online model, SaxUserEligibility userEligibility, UserEligibilityResponseItemData data) + { + PopulateUserEligibilityResponseListData(model, userEligibility, data); + data.RegionId = model.GetEncryptedRegionId(userEligibility.RegionId); + data.EligibilityType = EligibilityTypeCodes.GetCodeForType(userEligibility.EligibilityType); + data.ExpiresOnFrm = model.FormatDateForForm(userEligibility.ExpiresOn); + data.CreatedOnFmt = model.FormatDateForDisplay(userEligibility.CreateStamp.On); + data.StatusCode = userEligibility.StatusCode; + data.StatusDesc = userEligibility.StatusDesc; + } + + //------------------------------------------------------------------- + // Account - Get User Eligibility list. + //------------------------------------------------------------------- + private class EligibilityTypeData + { + public String Code { get; set; } + public String Desc { get; set; } + /// Does the eligibility type allow a date range. + public bool? Dates { get; set; } = null; + } + private class AjaxResponse_UserEligibilityListData : AjaxResponse_Data + { + // Construction. + public AjaxResponse_UserEligibilityListData(SaxModel_Online model) : base(model) { } + // Eligibility list. + public List Eligibilities { get; } = new List(); + // Eligibility types. + public List Types { get; } = new List(); + } + // Ajax request. + [HttpPost] + [Route("Account/Ajax/GetUserEligibilities")] + [Route("Account/Ajax/GetUserEligibilityList")] + public IActionResult GetUserEligibilities(Model_UserEligibility model) + { + String fn = GetType().Name + ".GetUserEligibilities"; + AjaxResponse_UserEligibilityListData responseData = new AjaxResponse_UserEligibilityListData(model); + String messageTitle = Localiser["account.caption.profile.eligibility"]; + + // Validate session and referrer. + if (!ValidReferer) return Forbid(); + if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); + RefreshModel(model); + + // Eligibility types. + foreach (Sax.EligibilityType eligibilityType in EnumUtil.GetValues()) + { + EligibilityTypeData typeData = new EligibilityTypeData(); + typeData.Code = model.EligibilityTypeCodes.GetCodeForType(eligibilityType); + if (StringUtil.IsBlank(typeData.Code)) continue; + typeData.Desc = Localiser.GetEligibilityTypeCaption(eligibilityType); + if (SaxUserEligibility.AllowsApplicablePeriod(eligibilityType)) + typeData.Dates = true; + responseData.Types.Add(typeData); + } + + // User account. + SysId userAccountId = StringUtil.ToSysId(model.UserAccount.Id); + if (!SysId.IsValid(userAccountId)) + userAccountId = SessionUserAccountId; + + // Item filter. + SaxUserEligibility.Params prmUserEligibility = new SaxUserEligibility.Params(); + prmUserEligibility.UserAccountIdsIncluded.Add(userAccountId); + prmUserEligibility.StatusCat = SaxUserEligibility.StatusCat.NotDeleted; + prmUserEligibility.SortColumns.Add(AccountMgr.GetUserEligibilityColumnDfn(SaxUserEligibility.Column.EligibilityType)); + model.Paging.ItemTotal = (ulong)AccountMgr.GetUserEligibilityCount(prmUserEligibility); + model.PopulatePagingTo(prmUserEligibility.ResultsPaging); + + // Item columns. + ColumnDfn colId = AccountMgr.GetUserEligibilityColumnDfn(SaxUserEligibility.Column.Id); + ColumnDfn colUserAccountId = AccountMgr.GetUserEligibilityColumnDfn(SaxUserEligibility.Column.UserAccountId); + ColumnDfn colRegionName = AccountMgr.GetUserEligibilityColumnDfn(SaxUserEligibility.Column.Region_Name); + ColumnDfn colEligibilityType = AccountMgr.GetUserEligibilityColumnDfn(SaxUserEligibility.Column.EligibilityType); + ColumnDfn colInfo = AccountMgr.GetUserEligibilityColumnDfn(SaxUserEligibility.Column.Info); + ColumnDfn colExpires = AccountMgr.GetUserEligibilityColumnDfn(SaxUserEligibility.Column.ExpiresOn); + ColumnDfn colStatus = AccountMgr.GetUserEligibilityColumnDfn(SaxUserEligibility.Column.Status); + List columns = new List() + { + colId,colUserAccountId, + colRegionName, colEligibilityType, + colInfo, colExpires, + colStatus, + }; + + // Sort columns. + prmUserEligibility.SortColumns.Add(colRegionName); + + // Query items. + using (DbResultSet resultSet = AccountMgr.ExecuteUserEligibilityQuery(columns, prmUserEligibility)) + { + while (resultSet != null && resultSet.HasRows && resultSet.NextRecord()) + { + NamedValue.Map values = resultSet.GetRecordValues(); + Sax.EligibilityType eligibilityType = (Sax.EligibilityType)values.GetLong(colEligibilityType.DataName); + UserEligibilityResponseListData userEligibilityData = new UserEligibilityResponseListData() + { + Id = model.EncryptId(new SysId(values.GetLong(colId.DataName))), + UserAccountId = model.EncryptId(new SysId(values.GetLong(colUserAccountId.DataName))), + RegionName = values.GetString(colRegionName.DataName), + EligibilityTypeDesc = Localiser.GetEligibilityTypeCaption(eligibilityType), + Info = values.GetString(colInfo.DataName), + ExpiresOnFmt = model.FormatDateForDisplay(values.GetDate(colExpires.DataName)), + StatusCode = values.GetString(colStatus.DataName), + StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName)) + }; + responseData.Eligibilities.Add(userEligibilityData); + } + } + if (model.Paging.IsPaged) + model.Paging.ItemCount = (ushort)responseData.Eligibilities.Count; + + // Complete response. + responseData.SetPaging(model); + responseData.Success = true; + return Json(responseData); + } + + //------------------------------------------------------------------- + // Get User Eligibility ajax request. + //------------------------------------------------------------------- + private class AjaxResponse_UserEligibility : AjaxResponse_Data + { + // Construction. + public AjaxResponse_UserEligibility(SaxModel_Online model) : base(model) { } + // Eligibility details. + public UserEligibilityResponseItemData Eligibility { get; } = new UserEligibilityResponseItemData(); + } + //------------------------------------------------------------------- + [HttpPost] + [Route("Account/Ajax/GetUserEligibility")] + public IActionResult Ajax_GetUserEligibility(Model_UserEligibility model) + { + String fn = GetType().Name + ".Ajax_GetUserEligibility"; + String messageTitle = Localiser["account.caption.profile.eligibility"]; + AjaxResponse_UserEligibility responseData = new AjaxResponse_UserEligibility(model); + + // 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 disposableItems = new DisposableCollection()) + { + + // Identify item. + SysId userEligibilityId = model.ExtractSysId(model.Eligibility.Id); + if (!SysId.IsValid(userEligibilityId)) + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"])); + + // Retrieve item. + SaxUserEligibility userEligibility = AccountMgr.GetUserEligibilityById(userEligibilityId); + disposableItems.Add(userEligibility); + if (userEligibility == null) + { + SaLogger.Warn(fn + " Failed to retrieve User Eligibility for Id: '" + model.Eligibility.Id + "'"); + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"])); + } + + // Construct response. + PopulateUserEligibilityResponseItemData(model, userEligibility, responseData.Eligibility); + responseData.Success = true; + } + return Json(responseData); + } + + //------------------------------------------------------------------- + // Store User Eligibility ajax request. + //------------------------------------------------------------------- + private class AjaxResponse_StoreUserEligibility : AjaxResponse_Data + { + // Construction. + public AjaxResponse_StoreUserEligibility(SaxModel_Online model) : base(model) { } + // Eligibility details. + public UserEligibilityResponseItemData Eligibility { get; } = new UserEligibilityResponseItemData(); + } + //------------------------------------------------------------------- + [HttpPost] + [Route("Account/Ajax/StoreUserEligibility")] + public IActionResult Ajax_StoreUserEligibility(Model_UserEligibility model) + { + String fn = GetType().Name + ".Ajax_StoreUserEligibility"; + String messageTitle = Localiser["account.caption.profile.eligibility"]; + AjaxResponse_StoreUserEligibility responseData = new AjaxResponse_StoreUserEligibility(model); + + // 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 disposableItems = new DisposableCollection()) + { + + // Validate item properties. + model.ValidateEligibilityDetails(responseData); + if (responseData.HasControlErrors()) + return Json(responseData); + + // User account. + SysId userAccountId = StringUtil.ToSysId(model.UserAccount.Id); + if (!SysId.IsValid(userAccountId)) + userAccountId = SessionUserAccountId; + + // Validate User Eligibility Id against 'Exists' flag. + SysId userEligibilityId = model.ExtractSysId(model.Eligibility.Id); + bool eligibilityExists = StringUtil.ToBool(model.Eligibility.Exists); + if (eligibilityExists && !SysId.IsValid(userEligibilityId)) + { + SaLogger.Warn(fn + " Id not specified for existing User Eligibility."); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + } + if (!eligibilityExists && SysId.IsValid(userEligibilityId)) + { + SaLogger.Warn(fn + " Id specified for new User Eligibility: '" + model.Eligibility.Id + "'"); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + } + + // Retrieve existing item. + SaxUserEligibility userEligibility = AccountMgr.GetUserEligibilityById(userEligibilityId); + disposableItems.Add(userEligibility); + if (userEligibility == null && SysId.IsValid(userEligibilityId)) + { + SaLogger.Warn(fn + " Failed to retrieve User Eligibility for Id: '" + model.Eligibility.Id + "'"); + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"])); + } + + // Validate user eligibility properties. + if (userEligibility != null) + { + if (!userEligibility.UserAccountId.Equals(userAccountId)) + { + SaLogger.Warn(fn + " Inconsistent User Account Id specified for User Eligibility. Expected: " + userEligibility.UserAccountId + ". Found: " + userAccountId); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + } + } + + // Region. + SysId regionId = model.Eligibility.RegionId != null ? model.DecryptId(model.Eligibility.RegionId) : userEligibility != null ? userEligibility.RegionId : null; + if (!SysId.IsValid(regionId)) + { + // Shouldn't get here. + SaLogger.Warn(fn + " Region Id not supplied for " + (eligibilityExists ? "existing" : "new") + " eligibility."); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + } + SaxRegion.Data region = Internals.GetRegion(regionId); + + // Eligibility type. + Sax.EligibilityType eligibilityType = userEligibility != null ? userEligibility.EligibilityType : model.Eligibility.getEligibilityType(); + if (eligibilityType <= 0) + { + // Shouldn't get here. + SaLogger.Warn(fn + " Eligibility type not specified for " + (eligibilityExists ? "existing" : "new") + " eligibility."); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + } + + // Check for duplicate data. + // ToDo Should include date range in checking for duplicate eligibility? + { + // First check without region. + SaxUserEligibility.Params prmUserEligibility = new SaxUserEligibility.Params(); + if (userEligibility != null) + prmUserEligibility.IdsExcluded.Add(userEligibility.Id); + prmUserEligibility.UserAccountIdsIncluded.Add(userAccountId); + prmUserEligibility.EligibilityTypesIncluded.Add(eligibilityType); + prmUserEligibility.StatusCat = SaxUserEligibility.StatusCat.NotDeleted; + 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"])); + // 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"])); + } + + // If eligibility doesn't exist for the user, it may have been previously deleted. + if (userEligibility == null) + { + SaxUserEligibility.Params prmUserEligibility = new SaxUserEligibility.Params(); + prmUserEligibility.UserAccountIdsIncluded.Add(userAccountId); + prmUserEligibility.RegionIdsIncluded.Add(regionId); + prmUserEligibility.EligibilityTypesIncluded.Add(eligibilityType); + prmUserEligibility.StatusCat = SaxUserEligibility.StatusCat.Any; + 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"])); + } + else + { + userEligibility = AccountMgr.CreateUserEligibility(userAccountId, regionId, eligibilityType); + disposableItems.Add(userEligibility); + } + } + + // Populate item properties. + if (model.Eligibility.Info != null) + userEligibility.Info = model.Eligibility.Info; + if (model.Eligibility.ExpiresOn != null) + userEligibility.ExpiresOn = model.ParseDateFromForm(model.Eligibility.ExpiresOn); + + // Store item. + if (!SysId.IsValid(userEligibility.Id)) + { + if (!AccountMgr.InsertUserEligibility(userEligibility, DbUpdateInfo)) + { + SaLogger.Warn(fn + " Failed to insert user eligibility: " + AccountMgr.ErrorStateMessage); + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"])); + } + } + else + { + if (!AccountMgr.UpdateUserEligibility(userEligibility, DbUpdateInfo)) + { + SaLogger.Warn(fn + " Failed to update user eligibility [Id:" + SysId.ToString(userEligibility.Id) + "]: " + AccountMgr.ErrorStateMessage); + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"])); + } + } + + // Construct response. + PopulateUserEligibilityResponseItemData(model, userEligibility, responseData.Eligibility); + responseData.Success = true; + } + return Json(responseData); + } + + //------------------------------------------------------------------- + // Remove User Eligibility ajax request. + //------------------------------------------------------------------- + private class AjaxResponse_RemoveUserEligibility : AjaxResponse_Data + { + // Construction. + public AjaxResponse_RemoveUserEligibility(SaxModel_Online model) : base(model) { } + } + //------------------------------------------------------------------- + [HttpPost] + [Route("Account/Ajax/RemoveUserEligibility")] + public IActionResult Ajax_RemoveUserEligibility(Model_UserEligibility model) + { + String fn = GetType().Name + ".Ajax_RemoveUserEligibility"; + String messageTitle = Localiser["account.caption.profile.eligibility"]; + AjaxResponse_UserEligibility responseData = new AjaxResponse_UserEligibility(model); + + // Validate session and referrer. + if (!ValidReferer) return Forbid(); + if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); + RefreshModel(model); + + // User account. + SysId userAccountId = StringUtil.ToSysId(model.UserAccount.Id); + if (!SysId.IsValid(userAccountId)) + userAccountId = SessionUserAccountId; + + // Record disposable items as they are created so all can be disposed when needed. + using (DisposableCollection disposableItems = new DisposableCollection()) + { + + // User Eligibility Id. + SysId userEligibilityId = model.ExtractSysId(model.Eligibility.Id); + if (!SysId.IsValid(userEligibilityId)) + { + SaLogger.Warn(fn + " Id not specified to remove User Eligibility."); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + } + + // Retrieve existing item. + SaxUserEligibility userEligibility = AccountMgr.GetUserEligibilityById(userEligibilityId); + disposableItems.Add(userEligibility); + if (userEligibility == null) + { + SaLogger.Warn(fn + " Failed to retrieve User Eligibility for Id: '" + model.Eligibility.Id + "'"); + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"])); + } + + // Validate user eligibility properties. + if (!userEligibility.UserAccountId.Equals(userAccountId)) + { + SaLogger.Warn(fn + " Inconsistent User Account Id specified for User Eligibility. Expected: " + userEligibility.UserAccountId + ". Found: " + userAccountId); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); + } + + // Delete item. + if (!AccountMgr.DeleteUserEligibility(userEligibility, DbUpdateInfo)) + { + SaLogger.Warn(fn + " Failed to delete user eligibility [Id:" + SysId.ToString(userEligibility.Id) + "]: " + AccountMgr.ErrorStateMessage); + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"])); + } + + // Construct response. + PopulateUserEligibilityResponseItemData(model, userEligibility, responseData.Eligibility); + responseData.Success = true; + } + return Json(responseData); + } + + //------------------------------------------------------------------- + } + //======================================================================= +} diff --git a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Organisations.cs b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Organisations.cs index 1208ddf..fef0b9e 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Organisations.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Organisations.cs @@ -166,7 +166,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Query organisations that user is a member of. SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params(); - prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId); + prmUserOrganisation.UserAccountIdsIncluded.Add(SessionUserAccountId); prmUserOrganisation.OrganisationStatusCat = SaxOrganisation.StatusCat.ActiveOnly; prmUserOrganisation.OrganisationMembersOnly = true; prmUserOrganisation.StatusCat = SaxUserOrganisation.StatusCat.ActiveOnly; @@ -294,7 +294,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers disposableItems.Add(address); // Check whether user is a member of this organisation. - SaxUserOrganisation userOrganisation = AccountMgr.GetUserOrganisationByUserOrganisation(UserAccountId, organisationId); + SaxUserOrganisation userOrganisation = AccountMgr.GetUserOrganisationByUserOrganisation(SessionUserAccountId, organisationId); disposableItems.Add(userOrganisation); if (userOrganisation != null) { @@ -402,7 +402,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } // Check whether user is a member of this organisation. - SaxUserOrganisation userOrganisation = AccountMgr.GetUserOrganisationByUserOrganisation(UserAccountId, organisationId); + SaxUserOrganisation userOrganisation = AccountMgr.GetUserOrganisationByUserOrganisation(SessionUserAccountId, organisationId); disposableItems.Add(userOrganisation); if (userOrganisation == null) { diff --git a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Sports.cs b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Sports.cs index b415bbe..97dd1e8 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Sports.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Sports.cs @@ -54,7 +54,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers data.SportAbout = userSport.About; data.SportParticipationCode = SportParticipationCodes.GetCodeForType(userSport.Participation); data.SportOfficiatingCode = SportOfficiatingCodes.GetCodeForType(userSport.Officiating); - data.CreatedOnFmt = DateUtil.Format(userSport.CreateStamp.On, "d-MMM-yyyy"); + data.CreatedOnFmt = model.FormatDateForDisplay(userSport.CreateStamp.On); data.StatusCode = userSport.StatusCode; data.StatusDesc = userSport.StatusDesc; } @@ -85,7 +85,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Item filter. SaxUserSport.Params prmUserSport = new SaxUserSport.Params(); - prmUserSport.UserAccountIdsIncluded.Add(UserAccountId); + prmUserSport.UserAccountIdsIncluded.Add(SessionUserAccountId); prmUserSport.StatusCat = SaxUserSport.StatusCat.NotDeleted; model.Paging.ItemTotal = (ulong)AccountMgr.GetUserSportCount(prmUserSport); model.PopulatePagingTo(prmUserSport.ResultsPaging); @@ -267,7 +267,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers if (userSport == null) { SaxUserSport.Params prmUserSport = new SaxUserSport.Params(); - prmUserSport.UserAccountIdsIncluded.Add(UserAccountId); + prmUserSport.UserAccountIdsIncluded.Add(SessionUserAccountId); prmUserSport.SportIdsIncluded.Add(sportId); prmUserSport.StatusCat = SaxUserSport.StatusCat.Any; userSport = AccountMgr.GetUserSport(prmUserSport); @@ -287,7 +287,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } else { - userSport = AccountMgr.CreateUserSport(UserAccountId, sportId); + userSport = AccountMgr.CreateUserSport(SessionUserAccountId, sportId); disposableItems.Add(userSport); } } diff --git a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-UserSportExperience.cs b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-UserSportExperience.cs index ae8581d..f7d58ed 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-UserSportExperience.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-UserSportExperience.cs @@ -129,7 +129,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers SysId userSportId = model.ExtractSysId(model.UserSportId); SaxUserSport userSport = AccountMgr.GetUserSportById(userSportId); disposableItems.Add(userSport); - if (userSport == null || !userSport.UserAccountId.Equals(UserAccountId)) + if (userSport == null || !userSport.UserAccountId.Equals(SessionUserAccountId)) return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); // Sport details. @@ -226,7 +226,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers disposableItems.Add(userSportExperience); SaxUserSport userSport = AccountMgr.GetUserSportById(userSportExperience?.UserSportId ?? null); disposableItems.Add(userSport); - if (userSportExperience == null || userSport == null || !userSport.UserAccountId.Equals(UserAccountId)) + if (userSportExperience == null || userSport == null || !userSport.UserAccountId.Equals(SessionUserAccountId)) return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); // Populate data to response. @@ -285,7 +285,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers disposableItems.Add(userSportExperience); userSport = AccountMgr.GetUserSportById(userSportExperience?.UserSportId ?? null); disposableItems.Add(userSport); - if (userSportExperience == null || userSport == null || !userSport.UserAccountId.Equals(UserAccountId)) + if (userSportExperience == null || userSport == null || !userSport.UserAccountId.Equals(SessionUserAccountId)) return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); } else @@ -295,7 +295,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers SysId userSportId = model.ExtractSysId(model.UserSportId); userSport = AccountMgr.GetUserSportById(userSportId); disposableItems.Add(userSport); - if (userSport == null || !userSport.UserAccountId.Equals(UserAccountId)) + if (userSport == null || !userSport.UserAccountId.Equals(SessionUserAccountId)) return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); // Create User Sport Experience. userSportExperience = AccountMgr.CreateUserSportExperience(userSport.Id); diff --git a/SaxoniteCoreWebOnline/Online/Controllers/AccountController.cs b/SaxoniteCoreWebOnline/Online/Controllers/AccountController.cs index f8c5170..ebdab01 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/AccountController.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/AccountController.cs @@ -47,6 +47,30 @@ namespace Saxonite.Net.Core.Web.Online.Controllers return View(model); } + //------------------------------------------------------------------- + [HttpGet] + public IActionResult Sports() + { + // Validate session. + if (!ValidUserSession) + return RedirectToAction("", ""); + + Model_Account model = new Model_Account(Localiser); + return View(model); + } + + //------------------------------------------------------------------- + [HttpGet] + public IActionResult Organisations() + { + // Validate session. + if (!ValidUserSession) + return RedirectToAction("", ""); + + Model_Account model = new Model_Account(Localiser); + return View(model); + } + //------------------------------------------------------------------- } //======================================================================= diff --git a/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs b/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs index 78f19ca..e180920 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs @@ -116,7 +116,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers Organisation = model.GetOrganisationName(organisationEvent.OrganisationId); if (controller.ItemDataMgr.ItemHasActiveImage(organisation?.GetItemId() ?? null, Sax.ImageType.OrganisationLogo)) OrganisationLogoUrl = controller.GetOrganisationLogoLink(organisation.Id, false); - EventAt = DateUtil.Format(organisationEvent.EventAt, "d-MMM-yy"); + EventAt = model.FormatDateForDisplay(organisationEvent.EventAt); if (organisationEvent.EventAt.Hour > 0 || organisationEvent.EventAt.Minute > 0) EventAt += DateUtil.Format(organisationEvent.EventAt, " HH:ss"); Summary = organisationEvent.Summary; @@ -182,7 +182,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers SaxSessionData_Online sessionData = SessionData_Online; // User context. - SysId userAccountId = UserAccountId; + SysId userAccountId = SessionUserAccountId; SaxActivityConsole.IndexContext indexContext = new SaxActivityConsole.IndexContext(userAccountId); if (SysId.IsValid(userAccountId)) indexContext.UserAccountIdsOwner.Add(userAccountId); @@ -389,8 +389,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers responseData.Opportunity = new ActivityResponseData_Opportunity(this, model, opportunity, organisation); } - // Record activty viewing. - if (!ActivityConsole.RecordUserActivityViewed(UserAccountId, new ItemId((short)itemType, itemId), DbUpdateInfo)) + // Record activity viewing. + if (!ActivityConsole.RecordUserActivityViewed(SessionUserAccountId, new ItemId((short)itemType, itemId), DbUpdateInfo)) { SaLogger.Warn(fn + " Failed to record Activity Viewing: " + ActivityConsole.ErrorStateMessage + "." + GetLogSuffix()); return Json(responseData); @@ -435,7 +435,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } // Record activity reaction. - if (!ActivityConsole.RecordUserActivityReaction(UserAccountId, new ItemId((short)itemType, itemId), model.GetActivityReaction(), DbUpdateInfo)) + if (!ActivityConsole.RecordUserActivityReaction(SessionUserAccountId, new ItemId((short)itemType, itemId), model.GetActivityReaction(), DbUpdateInfo)) { SaLogger.Warn(fn + " Failed to record Activity Reaction: " + ActivityConsole.ErrorStateMessage + "." + GetLogSuffix()); return Json(responseData); diff --git a/SaxoniteCoreWebOnline/Online/Controllers/ArticleController-Ajax.cs b/SaxoniteCoreWebOnline/Online/Controllers/ArticleController-Ajax.cs index bebcf5c..c8363fa 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/ArticleController-Ajax.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/ArticleController-Ajax.cs @@ -87,8 +87,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers PopulateFeedbackResponseListData(activityFeedback, data); data.RegionCaptionPrimary = model.GetRegionCaption(article.RegionIdPrimary); data.SportCaptionPrimary = model.GetSportCaption(article.SportIdPrimary); - data.CreatedOnFmt = DateUtil.Format(article.CreateStamp.On, "d-MMM-yyyy"); - data.PublishedOnFmt = DateUtil.Format(article.PublishedAt, "d-MMM-yyyy"); + data.CreatedOnFmt = model.FormatDateForDisplay(article.CreateStamp.On); + data.PublishedOnFmt = model.FormatDateForDisplay(article.PublishedAt); data.StatusCode = article.StatusCode; data.StatusDesc = article.StatusDesc; } @@ -173,14 +173,14 @@ namespace Saxonite.Net.Core.Web.Online.Controllers if (!ValidReferer) return Forbid(); if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); SaxSessionData_Online sessionData = SessionData_Online; - SysId userAccountId = UserAccountId; + SysId userAccountId = SessionUserAccountId; RefreshModel(model); // Record disposable items as they are created so all can be disposed when needed. using (DisposableCollection disposableItems = new DisposableCollection()) { // User account. - SaxUserAccount userAccount = AccountMgr.GetUserAccountById(UserAccountId); + SaxUserAccount userAccount = AccountMgr.GetUserAccountById(userAccountId); disposableItems.Add(userAccount); // Organisations that the user has rights to author articles for. @@ -292,8 +292,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers Summary = values.GetString(colSummary.DataName), RegionCaptionPrimary = model.GetRegionCaption(values.GetString(colRegionIdPrimary.DataName).ToSysId()), SportCaptionPrimary = model.GetSportCaption(values.GetString(colSportIdPrimary.DataName).ToSysId()), - CreatedOnFmt = DateUtil.Format(values.GetDateTime(colCreatedOn.DataName), "d-MMM-yyyy"), - PublishedOnFmt = DateUtil.Format(values.GetDateTime(colPublishedOn.DataName), "d-MMM-yyyy"), + CreatedOnFmt = model.FormatDateForDisplay(values.GetDateTime(colCreatedOn.DataName)), + PublishedOnFmt = model.FormatDateForDisplay(values.GetDateTime(colPublishedOn.DataName)), StatusCode = values.GetString(colStatus.DataName), StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName)) }; @@ -338,7 +338,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Validate session and referrer. if (!ValidReferer) return Forbid(); if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); - SysId userAccountId = UserAccountId; + SysId userAccountId = SessionUserAccountId; RefreshModel(model); // Record disposable items as they are created so all can be disposed when needed. @@ -552,7 +552,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers return Json(responseData); // Validate User & Organisation. - SysId userAccountId = UserAccountId; + SysId userAccountId = SessionUserAccountId; SysId organisationId = model.ExtractSysId(model.ArticleOrganisationId); if (SysId.IsValid(organisationId)) { diff --git a/SaxoniteCoreWebOnline/Online/Controllers/ArticleController.cs b/SaxoniteCoreWebOnline/Online/Controllers/ArticleController.cs index 48ff84f..953eab5 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/ArticleController.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/ArticleController.cs @@ -34,7 +34,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers return RedirectToAction("", ""); // User must either be a Journalist or have Article Admin rights with at least one organisation. - List organisations = AccountMgr.GetOrganisationsForAnyUserRole(UserAccountId, new [] { Sax.OrganisationRole.Admin, Sax.OrganisationRole.ArticleAdmin }); + List organisations = AccountMgr.GetOrganisationsForAnyUserRole(SessionUserAccountId, new [] { Sax.OrganisationRole.Admin, Sax.OrganisationRole.ArticleAdmin }); if (organisations.Count < 1 && !UserIsJournalist) return RedirectToAction("", ""); diff --git a/SaxoniteCoreWebOnline/Online/Controllers/ImageController.cs b/SaxoniteCoreWebOnline/Online/Controllers/ImageController.cs index 0d4e489..6e93d50 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/ImageController.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/ImageController.cs @@ -59,7 +59,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers String userAccountIdParam = "";// ToDo Decrypt from uaie value. SysId userAccountId = userAccountIdParam.ToSysId(); if (!SysId.IsValid(userAccountId)) - userAccountId = UserAccountId; + userAccountId = SessionUserAccountId; return GetAccountContactImage(userAccountId, Sax.ImageType.Avatar); } @@ -81,7 +81,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Response should not be cached. Response.Headers[HeaderNames.CacheControl] = "no-cache, no-store, must-revalidate, max-age=0"; Response.Headers[HeaderNames.Expires] = "-1"; - SysId userAccountId = UserAccountId; + SysId userAccountId = SessionUserAccountId; return GetAccountContactImage(userAccountId, Sax.ImageType.Avatar_Upload); } @@ -206,7 +206,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Validate session and referrer. if (!ValidReferer) return Forbid(); if (!ValidUserSession) return Forbid(); - ItemId userItemId = new ItemId((short)Sax.DataItemType.UserAccount, UserAccountId); + ItemId userItemId = new ItemId((short)Sax.DataItemType.UserAccount, SessionUserAccountId); // Extract encrypted parameters. NameValueCollection parameters = ExtractOnlineParams(iie); diff --git a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Events.cs b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Events.cs index 26635d3..1d890d8 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Events.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Events.cs @@ -116,7 +116,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers if (!ValidReferer) return Forbid(); if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); RefreshModel(model); - SysId userAccountId = UserAccountId; + SysId userAccountId = SessionUserAccountId; // Record disposable items as they are created so all can be disposed when needed. using (DisposableCollection disposableItems = new DisposableCollection()) @@ -370,7 +370,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } // Ensure that the user has the correct role to update Events for this organisation. - if (!AccountMgr.UserHasAnyOrganisationRole(UserAccountId, organisationId, new[] { Sax.OrganisationRole.Admin, Sax.OrganisationRole.ScheduleAdmin })) + if (!AccountMgr.UserHasAnyOrganisationRole(SessionUserAccountId, organisationId, new[] { Sax.OrganisationRole.Admin, Sax.OrganisationRole.ScheduleAdmin })) { SaLogger.Warn(fn + " User doesn't have 'Event Admin' role for Organisation Id: " + organisationId); return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); diff --git a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Members.cs b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Members.cs index 3362403..910b8a2 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Members.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Members.cs @@ -44,7 +44,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers { data.Id = model.EncryptId(userOrganisation.Id); data.UserAccountId = model.EncryptId(userOrganisation.UserAccountId); - if (userOrganisation.UserAccountId.Equals(UserAccountId)) data.CurrentUser = true; + if (userOrganisation.UserAccountId.Equals(SessionUserAccountId)) data.CurrentUser = true; data.EmailAddress = userAccount.EmailAddress; data.DisplayName = userAccount.GetDisplayName(); data.RoleCodes.Clear(); @@ -133,7 +133,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers responseData.MemberRoles.Add(memberRole.Code, Localiser.GetOrganisationRoleCaption((Sax.OrganisationRole)memberRole.Type)); // Session User roles. - responseData.User.CanManage = AccountMgr.UserHasAnyOrganisationRole(UserAccountId, organisation.Id, new List { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin }); + responseData.User.CanManage = AccountMgr.UserHasAnyOrganisationRole(SessionUserAccountId, organisation.Id, new List { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin }); // Item filter. SaxUserOrganisation.Params prmMember = new SaxUserOrganisation.Params(); @@ -183,7 +183,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers StatusCode = values.GetString(colUserStatus.DataName), StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colUserStatus.DataName)) }; - if (model.ExtractSysId(memberData.UserAccountId).Equals(UserAccountId)) memberData.CurrentUser = true; + if (model.ExtractSysId(memberData.UserAccountId).Equals(SessionUserAccountId)) memberData.CurrentUser = true; String memberRoleCodes = values.GetString(colOrganisationRoleCodes.DataName); foreach (String memberRoleCode in StringListUtil.Split(memberRoleCodes, SaxUserOrganisation.UserOrgnisationRoleDelim)) { @@ -259,7 +259,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } // Session User roles. - bool userCanManageMembers = AccountMgr.UserHasAnyOrganisationRole(UserAccountId, organisation.Id, new List { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin }); + bool userCanManageMembers = AccountMgr.UserHasAnyOrganisationRole(SessionUserAccountId, organisation.Id, new List { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin }); // Validate user account. SaxUserAccount userAccount = AccountMgr.GetUserAccountById(userOrganisation.UserAccountId); @@ -369,7 +369,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } // Ensure that the user has the correct role to update Members for this organisation. - bool userCanManageMembers = AccountMgr.UserHasAnyOrganisationRole(UserAccountId, organisationId, new List { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin }); + bool userCanManageMembers = AccountMgr.UserHasAnyOrganisationRole(SessionUserAccountId, organisationId, new List { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin }); if (!userCanManageMembers) { SaLogger.Warn(fn + " User doesn't have 'Member Admin' role for Organisation Id: " + organisationId); @@ -395,7 +395,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } // Validate roles for current user. - if (userOrganisation.UserAccountId.Equals(UserAccountId)) + if (userOrganisation.UserAccountId.Equals(SessionUserAccountId)) { // User is modifying their own organisation member. if (userOrganisation.CanManageOrganisation && !model.OrganisationRoleCodes.Any(item => item.Type == (int)Sax.OrganisationRole.Admin)) @@ -562,7 +562,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } // Ensure that the user has the correct role to update Members for this organisation. - bool userCanManageMembers = AccountMgr.UserHasAnyOrganisationRole(UserAccountId, organisation.Id, new List { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin }); + bool userCanManageMembers = AccountMgr.UserHasAnyOrganisationRole(SessionUserAccountId, organisation.Id, new List { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin }); if (!userCanManageMembers) { SaLogger.Warn(fn + " User doesn't have 'Member Admin' role for Organisation Id: " + organisation.Id); @@ -678,7 +678,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } // Ensure that the user has the correct role to update Members for this organisation. - bool userCanManageMembers = AccountMgr.UserHasAnyOrganisationRole(UserAccountId, organisation.Id, new List { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin }); + bool userCanManageMembers = AccountMgr.UserHasAnyOrganisationRole(SessionUserAccountId, organisation.Id, new List { Sax.OrganisationRole.Admin, Sax.OrganisationRole.MemberAdmin }); if (!userCanManageMembers) { SaLogger.Warn(fn + " User doesn't have 'Member Admin' role for Organisation Id: " + organisation.Id); diff --git a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Opportunities.cs b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Opportunities.cs index c2db68f..e4b6051 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Opportunities.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Opportunities.cs @@ -106,7 +106,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers if (!ValidReferer) return Forbid(); if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); RefreshModel(model); - SysId userAccountId = UserAccountId; + SysId userAccountId = SessionUserAccountId; // Record disposable items as they are created so all can be disposed when needed. using (DisposableCollection disposableItems = new DisposableCollection()) @@ -357,7 +357,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } // Ensure that the user has the correct role to update Opportunities for this organisation. - if (!AccountMgr.UserHasAnyOrganisationRole(UserAccountId, organisationId, new[] { Sax.OrganisationRole.Admin, Sax.OrganisationRole.OpportunityAdmin })) + if (!AccountMgr.UserHasAnyOrganisationRole(SessionUserAccountId, organisationId, new[] { Sax.OrganisationRole.Admin, Sax.OrganisationRole.OpportunityAdmin })) { SaLogger.Warn(fn + " User doesn't have 'Opportunity Admin' role for Organisation Id: " + organisationId); return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); diff --git a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax.cs b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax.cs index 6a6b0de..573d021 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax.cs @@ -153,7 +153,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Organisation filter SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params(); - prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId); + prmUserOrganisation.UserAccountIdsIncluded.Add(SessionUserAccountId); prmUserOrganisation.OrganisationStatusCat = SaxOrganisation.StatusCat.ActiveOnly; prmUserOrganisation.OrganisationMembersOnly = true; prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.Admin); @@ -228,7 +228,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Organisation filter SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params(); - prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId); + prmUserOrganisation.UserAccountIdsIncluded.Add(SessionUserAccountId); prmUserOrganisation.OrganisationStatusCat = SaxOrganisation.StatusCat.ActiveOnly; prmUserOrganisation.OrganisationMembersOnly = true; prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.Admin); @@ -303,7 +303,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Organisation filter SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params(); - prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId); + prmUserOrganisation.UserAccountIdsIncluded.Add(SessionUserAccountId); prmUserOrganisation.OrganisationStatusCat = SaxOrganisation.StatusCat.ActiveOnly; prmUserOrganisation.OrganisationMembersOnly = true; prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.Admin); diff --git a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController.cs b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController.cs index d14c756..fd7b579 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController.cs @@ -138,7 +138,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Filter to identify suitable organisations that user is a member of and has the appropriate rights. SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params(); - prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId); + prmUserOrganisation.UserAccountIdsIncluded.Add(SessionUserAccountId); prmUserOrganisation.OrganisationStatusCat = SaxOrganisation.StatusCat.ActiveOnly; prmUserOrganisation.OrganisationMembersOnly = true; prmUserOrganisation.OrganisationRolesAny.AddRange(requiredRoles); diff --git a/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs b/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs index 6260857..433d0aa 100644 --- a/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs +++ b/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs @@ -29,10 +29,7 @@ namespace Saxonite.Net.Core.Web.Online.Models // Page includes. AdditionalFiles_CSS.Add("css/sax-account.css"); AdditionalFiles_JS.Add("js/sax-account.js"); - AdditionalFiles_JS.Add("js/sax-usr-pro.js"); - AdditionalFiles_JS.Add("js/sax-usr-spt.js"); - AdditionalFiles_JS.Add("js/sax-usr-spt-exp.js"); - AdditionalFiles_JS.Add("js/sax-usr-org.js"); + AdditionalFiles_JS.Add("js/sax-pro-usr.js"); } //------------------------------------------------------------------- @@ -82,7 +79,7 @@ namespace Saxonite.Net.Core.Web.Online.Models public ModelData_Organisation Organisation { get; } //------------------------------------------------------------------- - // Validate modela data. + // Validate model data. //------------------------------------------------------------------- // Validate contact details. public bool ValidateContactDetails(SaxController_Base.AjaxResponse_Data responseData) diff --git a/SaxoniteCoreWebOnline/Online/Models/Model_UserEligibility.cs b/SaxoniteCoreWebOnline/Online/Models/Model_UserEligibility.cs new file mode 100644 index 0000000..8f93be7 --- /dev/null +++ b/SaxoniteCoreWebOnline/Online/Models/Model_UserEligibility.cs @@ -0,0 +1,112 @@ +using Microsoft.AspNetCore.Http; +using Sarand.Net.Standard.Base.Bus; +using Sarand.Net.Standard.Base.Core; +using Sarand.Net.Standard.Base.Utils; +using Saxonite.Base.App; +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 System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; + +namespace Saxonite.Net.Core.Web.Online.Models +{ + //======================================================================= + public class Model_UserEligibility : SaxModel_Online + { + //------------------------------------------------------------------- + // Construction. + public Model_UserEligibility(SaxLocaliser localiser) : + base(localiser) + { + } + + //------------------------------------------------------------------- + // User properties. + public class UserAccountData + { + public String Id { get; set; } + } + public UserAccountData UserAccount { get; } = new UserAccountData(); + + // Eligibility properties. + public class EligibilityData + { + /// User Experience Id. + public String Id { get; set; } + /// Flag to indicate whether item is being updated. + public String Exists { get; set; } + /// User Experience Region Id. + public String RegionId { get; set; } + /// User Experience Type. + public String Type { get; set; } + /// User Experience Info. + public String Info { get; set; } + public Sax.EligibilityType getEligibilityType() + { + if (Type != null) + return (Sax.EligibilityType)SaxSystem.GetCodesOfType(Sax.CodeType.EligibilityType).GetTypeForCode(Type); + return Sax.EligibilityType.Unknown; + } + /// User Experience Expiry date. + public String ExpiresOn { get; set; } + } + public EligibilityData Eligibility { get; } = new EligibilityData(); + + //------------------------------------------------------------------- + // Validate model data. + //------------------------------------------------------------------- + // Validate eligibility details. + public bool ValidateEligibilityDetails(SaxController_Base.AjaxResponse_Data responseData) + { + // Eligibility type. + String controlName = "EligibilityType"; + if (Eligibility.Type == null || Eligibility.getEligibilityType() <= 0) + { + responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); + } + + // Eligibility Region - mandatory for new eligibility. + controlName = "EligibilityRegion"; + SysId eligibilityRegionId = ExtractSysId(Eligibility.RegionId); + if ((Eligibility.RegionId == null || !SysId.IsValid(eligibilityRegionId)) && !StringUtil.ToBool(Eligibility.Exists)) + { + responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]); + } + else if (Eligibility.RegionId != null) + { + SaxRegion.Data eligibilityRegion = Internals.GetRegion(eligibilityRegionId); + if (eligibilityRegion == null) + responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]); + } + + // Eligibility info. + controlName = "EligibilityInfo"; + if (Eligibility.Info != null) + { + responseData.SetControlValue(controlName, Eligibility.Info); + if (StringUtil.GetLength(Eligibility.Info) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserEligibility_Info)) + responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserEligibility_Info)]); + } + + // Eligibility Expiry date. + controlName = "EligibilityExpiry"; + if (Eligibility.ExpiresOn != null) + { + if (!StringUtil.IsBlank(Eligibility.ExpiresOn) && !DateUtil.IsValid(ParseDateFromForm(Eligibility.ExpiresOn))) + { + responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]); + } + } + return !responseData.HasControlErrors(); + } + + //------------------------------------------------------------------- + } + //======================================================================= +} diff --git a/SaxoniteCoreWebOnline/Online/Models/SaxModel_Online.cs b/SaxoniteCoreWebOnline/Online/Models/SaxModel_Online.cs index aff697b..d6e2477 100644 --- a/SaxoniteCoreWebOnline/Online/Models/SaxModel_Online.cs +++ b/SaxoniteCoreWebOnline/Online/Models/SaxModel_Online.cs @@ -42,7 +42,7 @@ namespace Saxonite.Net.Core.Web.Online.Models //------------------------------------------------------------------- // Session. public SaxSessionData_Online SessionData_Online { get { return SessionData as SaxSessionData_Online; } } - public SysId UserAccountId { get { return SessionData_Online?.User?.UserAccountId ?? null; } } + public SysId SessionUserAccountId { get { return SessionData_Online?.User?.UserAccountId ?? null; } } //------------------------------------------------------------------- // Menu options. @@ -61,7 +61,7 @@ namespace Saxonite.Net.Core.Web.Online.Models if (userCanManage.OrganisationMembers == null && ValidUserSession) { SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params(); - prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId); + prmUserOrganisation.UserAccountIdsIncluded.Add(SessionUserAccountId); prmUserOrganisation.OrganisationMembersOnly = true; prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.Admin); prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.MemberAdmin); @@ -78,7 +78,7 @@ namespace Saxonite.Net.Core.Web.Online.Models if (userCanManage.OrganisationOpportunities == null && ValidUserSession) { SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params(); - prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId); + prmUserOrganisation.UserAccountIdsIncluded.Add(SessionUserAccountId); prmUserOrganisation.OrganisationMembersOnly = true; prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.Admin); prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.OpportunityAdmin); @@ -95,7 +95,7 @@ namespace Saxonite.Net.Core.Web.Online.Models if (userCanManage.OrganisationSchedule == null && ValidUserSession) { SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params(); - prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId); + prmUserOrganisation.UserAccountIdsIncluded.Add(SessionUserAccountId); prmUserOrganisation.OrganisationMembersOnly = true; prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.Admin); prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.ScheduleAdmin); @@ -112,7 +112,7 @@ namespace Saxonite.Net.Core.Web.Online.Models if (userCanManage.OrganisationArticles == null && ValidUserSession) { SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params(); - prmUserOrganisation.UserAccountIdsIncluded.Add(UserAccountId); + prmUserOrganisation.UserAccountIdsIncluded.Add(SessionUserAccountId); prmUserOrganisation.OrganisationMembersOnly = true; prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.Admin); prmUserOrganisation.OrganisationRolesAny.Add(Sax.OrganisationRole.ArticleAdmin); diff --git a/SaxoniteCoreWebOnline/Views/Account/Organisations.cshtml b/SaxoniteCoreWebOnline/Views/Account/Organisations.cshtml new file mode 100644 index 0000000..f3b5ae6 --- /dev/null +++ b/SaxoniteCoreWebOnline/Views/Account/Organisations.cshtml @@ -0,0 +1,26 @@ +@model Model_Account +@inject SaxLocaliser Localiser +@{ + ViewData["Title"] = "Profile - Organisations"; +} + + + + + + + + diff --git a/SaxoniteCoreWebOnline/Views/Account/Profile-Eligibility.cshtml b/SaxoniteCoreWebOnline/Views/Account/Profile-Eligibility.cshtml new file mode 100644 index 0000000..6fa4acf --- /dev/null +++ b/SaxoniteCoreWebOnline/Views/Account/Profile-Eligibility.cshtml @@ -0,0 +1,168 @@ +@model Model_Account +@inject SaxLocaliser Localiser + +
+ +
+ +
+
+
@Localiser["caption.my.eligibility"]
+
+ @* Burger menu *@ + + @* Filter item templates *@ +
+ @* Burger dropdown item template - ul is ignored *@ +
    +
  • ...
  • +
+
+
+
+
+ +
+ @* User Eligibility list. *@ +
+
+ + @* Item templates *@ +
+ @* User Eligibility template *@ +
+
+
+
+ @* Burger menu *@ + +
+
+
+
+
+
@Localiser["label.expires"]: 
+
+
+
+ @* User Eligibility Burger dropdown template - ul is ignored *@ +
    +
  • ...
  • +
+
+ + @* 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 dialog *@ +
+ +
+ @using (Html.BeginForm(FormMethod.Post, new { @id = "frmUserEligibility", @class = "sax-form", @onSubmit = "return false;" })) + { + + + + @* Region *@ +
+
+
+
+ +
+
+
+
+ @Html.Hidden("Eligibility.RegionId", "", new { @id = "ifEligibilityRegionId", @class = "EligibilityRegionId" }) +
+
+
+
+
+
+
+ + @* Eligibility Type *@ +
+
+
+
+ +
+
+
+
+ @Html.DropDownList("Eligibility.Type", Model.EligibilityTypesForSelect, "", new { @id = "ifEligibilityType", @class = "EligibilityType sax-select", @readonly = "readonly", @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_EmailAddress) }) +
+
+
+
+
+ + @* Info *@ +
+
+
+
+ +
+
+
+
+ @Html.TextArea("Eligibility.Info", "", new { @id = "ifEligibilityInfo", @class = "EligibilityInfo sax-textarea", @rows = 4, @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserEligibility_Info) }) +
+
+
+
+
+ + @* Expiry *@ +
+
+
+
+ +
+
+
+
+
+
 @Localiser["label.expires.on"]
+
@Html.TextBox("Eligibility.ExpiresOn", "", new { @id = "ifEligibilityExpiresOn", @class = "sax-input sax-calendar EligibilityExpiresOn", @readonly = "readonly" })
+
+
+
+
+
+
+ + } +
+
+ +
+ + + diff --git a/SaxoniteCoreWebOnline/Views/Account/Profile-Organisations.cshtml b/SaxoniteCoreWebOnline/Views/Account/Profile-Organisations.cshtml index 083d723..e3b4bd1 100644 --- a/SaxoniteCoreWebOnline/Views/Account/Profile-Organisations.cshtml +++ b/SaxoniteCoreWebOnline/Views/Account/Profile-Organisations.cshtml @@ -46,8 +46,7 @@ @@ -135,3 +134,5 @@ + + diff --git a/SaxoniteCoreWebOnline/Views/Account/Profile-SportExperiences.cshtml b/SaxoniteCoreWebOnline/Views/Account/Profile-SportExperiences.cshtml index f0af5f9..c74be06 100644 --- a/SaxoniteCoreWebOnline/Views/Account/Profile-SportExperiences.cshtml +++ b/SaxoniteCoreWebOnline/Views/Account/Profile-SportExperiences.cshtml @@ -250,3 +250,4 @@ + diff --git a/SaxoniteCoreWebOnline/Views/Account/Profile-Sports.cshtml b/SaxoniteCoreWebOnline/Views/Account/Profile-Sports.cshtml index 47e037f..0f0d730 100644 --- a/SaxoniteCoreWebOnline/Views/Account/Profile-Sports.cshtml +++ b/SaxoniteCoreWebOnline/Views/Account/Profile-Sports.cshtml @@ -30,8 +30,7 @@
-
-
+
@* Item templates *@ @@ -68,12 +67,12 @@ - + @using (Html.BeginForm(FormMethod.Post, new { @id = "frmProfileSportId", @class = "sax-form", @onSubmit = "return false;" })) + { + @Html.HiddenFor(model => model.UserSportId, new { @id = "", @class = "UserSportId" }) + } -@using (Html.BeginForm(FormMethod.Post, new { @id = "frmProfileSportId", @class = "sax-form", @onSubmit = "return false;" })) -{ - @Html.HiddenFor(model => model.UserSportId, new { @id = "", @class = "UserSportId" }) -} +
@@ -95,7 +94,7 @@
-
+
@@ -157,3 +156,9 @@
+ + + diff --git a/SaxoniteCoreWebOnline/Views/Account/Profile.cshtml b/SaxoniteCoreWebOnline/Views/Account/Profile.cshtml index 6a7d6f1..6bce985 100644 --- a/SaxoniteCoreWebOnline/Views/Account/Profile.cshtml +++ b/SaxoniteCoreWebOnline/Views/Account/Profile.cshtml @@ -14,11 +14,15 @@ + + + @@ -28,8 +32,6 @@ sax.dlg.title.selectRegionCountry = '@Localiser.GetJavascriptText("reference.caption.country.select")'; sax.dlg.title.selectRegionProvince = '@Localiser.GetJavascriptText("reference.caption.province.select")'; sax.dlg.title.imageUpload = '@Localiser.GetJavascriptText("account.caption.image.upload")'; - sax.dlg.title.addUserSport = '@Localiser.GetJavascriptText("account.caption.profile.sport.add")'; - sax.dlg.title.updateUserSport = '@Localiser.GetJavascriptText("account.caption.profile.sport.update")'; sax.dlg.title.selectRegion = '@Localiser.GetJavascriptText("reference.caption.region.select")'; sax.dlg.title.selectSport = '@Localiser.GetJavascriptText("reference.caption.sport.select")'; sax.msg.uploadFileSelect = '@Localiser.GetJavascriptText("msg.upload.file.select")'; diff --git a/SaxoniteCoreWebOnline/Views/Account/Sports.cshtml b/SaxoniteCoreWebOnline/Views/Account/Sports.cshtml new file mode 100644 index 0000000..53dc0ab --- /dev/null +++ b/SaxoniteCoreWebOnline/Views/Account/Sports.cshtml @@ -0,0 +1,11 @@ +@model Model_Account +@inject SaxLocaliser Localiser +@{ + ViewData["Title"] = "Profile - Sports"; +} + + + + + + diff --git a/SaxoniteCoreWebOnline/Views/Shared/_Layout.cshtml b/SaxoniteCoreWebOnline/Views/Shared/_Layout.cshtml index c4ce7d9..e9c98e9 100644 --- a/SaxoniteCoreWebOnline/Views/Shared/_Layout.cshtml +++ b/SaxoniteCoreWebOnline/Views/Shared/_Layout.cshtml @@ -129,6 +129,8 @@