diff --git a/SaxoniteCoreWebAdmin/wwwroot/css/sax-data.css b/SaxoniteCoreWebAdmin/wwwroot/css/sax-data.css index c4c240e..7ccb301 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/css/sax-data.css +++ b/SaxoniteCoreWebAdmin/wwwroot/css/sax-data.css @@ -155,6 +155,11 @@ font-weight: bold; } +.sax-panel-item > .sax-header ul.nav.sax-burger +{ + margin: 0; +} + .sax-panel-item > .sax-header .sax-action { border-radius: 4px; diff --git a/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx b/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx index a3d5fbc..b53558f 100644 --- a/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx +++ b/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx @@ -153,6 +153,9 @@ My Sports + + Sport Experience + Activities @@ -243,6 +246,9 @@ Close + + Club + Comment @@ -267,6 +273,9 @@ Delete + + Discipline + Edit @@ -282,12 +291,18 @@ Excellent + + Experience + First name Forgotten password? + + From + Gender @@ -306,6 +321,9 @@ Last name + + League + Location @@ -366,6 +384,9 @@ Current password + + Period + Phone @@ -426,6 +447,9 @@ none selected + + Speciality + Sport @@ -441,9 +465,15 @@ Summary + + Team + Title + + To + Town diff --git a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Contact.cs b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Contact.cs index 20e8c74..fb3809c 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Contact.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Contact.cs @@ -120,7 +120,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers if (userAccount == null) { SaLogger.Warn(fn + " Failed to retrieve user account for Id: " + SysId.ToString(SessionData.User.UserAccountId)); - return Json(responseData.SetGoHome(messageTitle, @Localiser.GetJavascriptText("msg.something.gone.wrong"))); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); } // Logically delete any previous 'Uploaded' Avatar image. @@ -264,12 +264,12 @@ namespace Saxonite.Net.Core.Web.Online.Controllers if (userAccount == null) { SaLogger.Warn(fn + " Failed to retrieve user account for Id: " + SysId.ToString(SessionData.User.UserAccountId)); - return Json(responseData.SetGoHome(messageTitle, @Localiser.GetJavascriptText("msg.something.gone.wrong"))); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); } if (!userAccount.EmailAddress.EqualsCI(SessionData.User.EmailAddress)) { SaLogger.Warn(fn + " Unable to update user account '" + userAccount.EmailAddress + ". Email doesn't match session: " + SessionData.User.EmailAddress); - return Json(responseData.SetGoHome(messageTitle, @Localiser.GetJavascriptText("msg.something.gone.wrong"))); + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); } // Populate user properties. @@ -303,9 +303,9 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } // Regions. if (model.AccountRegionIdCountry != null) - userAccount.RegionIdCountry = model.AccountRegionIdCountry.ToSysId(); + userAccount.RegionIdCountry = model.ExtractSysId(model.AccountRegionIdCountry); if (model.AccountRegionIdProvince != null) - userAccount.RegionIdProvince = model.AccountRegionIdProvince.ToSysId(); + userAccount.RegionIdProvince = model.ExtractSysId(model.AccountRegionIdProvince); // Update User Account. if (userAccount.Changed) SaLogger.Info(fn + " Updating user account '" + userAccount.EmailAddress + "'. Id: " + SysId.ToString(userAccount.Id), true); diff --git a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Sports.cs b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Sports.cs index 3717eee..d108bae 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Sports.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Sports.cs @@ -157,7 +157,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers RefreshModel(model); // Identify item. - SysId userSportId = model.UserSportId.ToSysId(); + SysId userSportId = model.ExtractSysId(model.UserSportId); if (!SysId.IsValid(userSportId)) return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"])); @@ -205,7 +205,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers return Json(responseData); // Validate Profile Sport Id against 'Exists' flag. - SysId userSportId = model.UserSportId.ToSysId(); + SysId userSportId = model.ExtractSysId(model.UserSportId); bool profileSportExists = StringUtil.ToBool(model.ProfileSportExists); if (profileSportExists && !SysId.IsValid(userSportId)) { @@ -219,7 +219,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } // Retrieve the sport. - SysId sportId = model.ProfileSportId.ToSysId(); + SysId sportId = model.ExtractSysId(model.ProfileSportId); SaxSport sport = ReferenceMgr.GetSportById(sportId); if (sport == null) { diff --git a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-UserSportExperience.cs b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-UserSportExperience.cs new file mode 100644 index 0000000..9e3971e --- /dev/null +++ b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-UserSportExperience.cs @@ -0,0 +1,351 @@ +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 Saxonite.Net.Standard.Base.App; +using Microsoft.AspNetCore.Http; +using Sarand.Net.Standard.Base.Helpers; +using System.IO; +using System.Drawing; +using Sarand.Net.Standard.Base.Core; +using Sarand.Net.Standard.Base.Dbas; + +namespace Saxonite.Net.Core.Web.Online.Controllers +{ + //======================================================================= + // Online Account Controller - User Sport Experience - Ajax actions. + //======================================================================= + partial class AccountController + { + //------------------------------------------------------------------- + // Common response data. + private class SportExperienceResponseData_List + { + public String Id { get; set; } + public String UserSportId { get; set; } + public String Period { get; set; } + public String PeriodFrom { get; set; } + public String PeriodTo { get; set; } + public String OrganisationName { get; set; } + public String Summary { get; set; } + public String Team { get; set; } + public String League { get; set; } + public String Speciality { get; set; } + // Regions. + public String RegionCaptionNation { get; set; } + public String RegionCaptionProvince { get; set; } + public string RegionRepresentation { get; set; } + } + private class SportExperienceResponseData_Detail : SportExperienceResponseData_List + { + public String PeriodFrom_YMD { get; set; } + public String PeriodTo_YMD { get; set; } + public String OrganisationId { get; set; } + public String RegionIdNation { get; set; } + public String RegionIdProvince { get; set; } + } + private void PopulateSportExperienceResponseData(Model_UserSportExperience model, SportExperienceResponseData_Detail data, SaxUserSportExperience userSportExperience) + { + data.Id = model.EncryptId(userSportExperience.Id); + data.UserSportId = model.EncryptId(userSportExperience.UserSportId); + data.PeriodFrom_YMD = DateUtil.FormatDateForJavascript(userSportExperience.PeriodFrom); + data.PeriodFrom = model.FormatDateForForm(userSportExperience.PeriodFrom); + data.PeriodTo_YMD = DateUtil.FormatDateForJavascript(userSportExperience.PeriodTo); + data.PeriodTo = model.FormatDateForForm(userSportExperience.PeriodTo); + data.Period = data.PeriodFrom + " - " + data.PeriodTo; + data.OrganisationId = model.EncryptId(userSportExperience.OrganisationId); + data.OrganisationName = userSportExperience.OrganisationName; + data.Summary = userSportExperience.Summary; + data.Team = userSportExperience.Team; + data.League = userSportExperience.League; + data.Speciality = userSportExperience.Speciality; + // Regions. + data.RegionIdNation = model.EncryptId(userSportExperience.RegionIdNation); + data.RegionIdProvince = model.EncryptId(userSportExperience.RegionIdProvince); + using (SaxRegion regionNation = Internals.GetRegion(userSportExperience.RegionIdNation)) + using (SaxRegion regionProvince = Internals.GetRegion(userSportExperience.RegionIdProvince)) + { + data.RegionCaptionNation = Localiser.GetRegionName(regionNation); + data.RegionCaptionProvince = Localiser.GetRegionName(regionProvince); + List locations = new List() { data.RegionCaptionProvince, data.RegionCaptionNation }; + data.RegionRepresentation = locations.Concat(", ", "", "", true, true); + } + } + + //------------------------------------------------------------------- + // Utilites. + + //------------------------------------------------------------------- + // User Sport - Get Experience list. + //------------------------------------------------------------------- + private class AjaxResponse_UserSportExperienceList : AjaxResponse_Data + { + // Construction. + public AjaxResponse_UserSportExperienceList(SaxModel_Online model) : base(model) { } + // Contact details. + public List Experiences { get; } = new List(); + } + // Ajax request. + [HttpPost] + [Route("UserSport/Ajax/GetExperienceList")] + public IActionResult GetUserSportExperienceList(Model_UserSportExperience model) + { + String fn = GetType().Name + ".GetUserSportExperienceList"; + AjaxResponse_UserSportExperienceList responseData = new AjaxResponse_UserSportExperienceList(model); + String messageTitle = Localiser["account.caption.profile.sports"]; + + // 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 User Sport Id against user account. + SysId userSportId = model.ExtractSysId(model.UserSportId); + SaxUserSport userSport = AccountMgr.GetUserSportById(userSportId); + disposableItems.Add(userSport); + if (userSport == null || !userSport.UserAccountId.Equals(SessionData.User.UserAccountId)) + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); + + // Columns. + ColumnDfn colId = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.Id); + ColumnDfn colUserSportId = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.UserSportId); + ColumnDfn colPeriodFrom = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.PeriodFrom); + ColumnDfn colPeriodTo = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.PeriodTo); + ColumnDfn colOrganisationId = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.OrganisationId); + ColumnDfn colOrganisationName = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.Organisation_Name); + ColumnDfn colSummary = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.Summary); + ColumnDfn colTeam = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.Team); + ColumnDfn colLeague = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.League); + ColumnDfn colSpeciality = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.Speciality); + ColumnDfn colNotes = AccountMgr.GetUserSportExperienceColumnDfn(SaxUserSportExperience.Column.Notes); + List columnsToQuery = new List() + { + colId, colUserSportId, colPeriodFrom, colPeriodTo, + colOrganisationId, colOrganisationName, + colSummary, colTeam, colLeague, colSpeciality, colNotes + }; + + // Filter. + SaxUserSportExperience.Params prmUserSportExperience = new SaxUserSportExperience.Params(); + prmUserSportExperience.UserSportIdsIncluded.Add(model.ExtractSysId(model.UserSportId)); + prmUserSportExperience.StatusCat = SaxUserSportExperience.StatusCat.NotDeleted; + + // Sort columns. + colPeriodFrom.SortAscending = false; + prmUserSportExperience.SortColumns.Add(colPeriodFrom); + + // Query items. + using (DbResultSet resultSet = AccountMgr.ExecuteUserSportExperienceQuery(columnsToQuery, prmUserSportExperience)) + { + while (resultSet != null && resultSet.HasRows && resultSet.NextRecord()) + { + NamedValue.Map values = resultSet.GetRecordValues(); + SportExperienceResponseData_List itemData = new SportExperienceResponseData_List() + { + Id = model.EncryptId(new SysId(values.GetLong(colId.DataName))), + UserSportId = model.EncryptId(new SysId(values.GetLong(colUserSportId.DataName))), + PeriodFrom = model.FormatDateForForm(values.GetDate(colPeriodFrom.DataName)), + PeriodTo = model.FormatDateForForm(values.GetDate(colPeriodTo.DataName)), + OrganisationName = AccountMgr.GetUserSportExperienceDataValue(colOrganisationName, values).AsString(), + Summary = values.GetString(colSummary.DataName), + Team = values.GetString(colTeam.DataName), + League = values.GetString(colLeague.DataName), + Speciality = values.GetString(colSpeciality.DataName), + }; + itemData.Period = itemData.PeriodFrom + " - " + itemData.PeriodTo; + responseData.Experiences.Add(itemData); + } + } + } + + // Complete response. + responseData.Success = true; + return Json(responseData); + } + + //------------------------------------------------------------------- + // User Sport - Get Experience. + //------------------------------------------------------------------- + private class AjaxResponse_UserSportExperienceData : AjaxResponse_Data + { + // Construction. + public AjaxResponse_UserSportExperienceData(SaxModel_Online model) : base(model) { } + // Contact details. + public SportExperienceResponseData_Detail Experience { get; set; } + } + // Ajax request. + [HttpPost] + [Route("UserSport/Ajax/GetExperience")] + public IActionResult GetUserSportExperience(Model_UserSportExperience model) + { + String fn = GetType().Name + ".GetUserSportExperience"; + AjaxResponse_UserSportExperienceData responseData = new AjaxResponse_UserSportExperienceData(model); + String messageTitle = Localiser["account.caption.profile.sports"]; + + // 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 User Sport Experience Id against user account. + SysId userSportExperienceId = model.ExtractSysId(model.UserSportExperienceId); + SaxUserSportExperience userSportExperience = AccountMgr.GetUserSportExperienceById(userSportExperienceId); + disposableItems.Add(userSportExperience); + SaxUserSport userSport = AccountMgr.GetUserSportById(userSportExperience?.UserSportId ?? null); + disposableItems.Add(userSport); + if (userSportExperience == null || userSport == null || !userSport.UserAccountId.Equals(SessionData.User.UserAccountId)) + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); + + // Populate data to response. + responseData.Experience = new SportExperienceResponseData_Detail(); + PopulateSportExperienceResponseData(model, responseData.Experience, userSportExperience); + } + + // Complete response. + responseData.Success = true; + return Json(responseData); + } + + //------------------------------------------------------------------- + // Account - Store User Sport Experience. + //------------------------------------------------------------------- + private class AjaxResponse_StoreUserSportExperience : AjaxResponse_Data + { + // Construction. + public AjaxResponse_StoreUserSportExperience(SaxModel_Online model) : base(model) { } + // Contact details. + public SportExperienceResponseData_Detail Experience { get; set; } + } + // Ajax request. + [HttpPost] + [Route("UserSport/Ajax/StoreExperience")] + public IActionResult StoreUserSportExperience(Model_UserSportExperience model) + { + String fn = GetType().Name + ".StoreUserSportExperience"; + AjaxResponse_StoreUserSportExperience responseData = new AjaxResponse_StoreUserSportExperience(model); + String messageTitle = Localiser["account.caption.profile.sports"]; + + // 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 data. + model.ValidateProfileSportData(responseData); + if (responseData.HasControlErrors()) + return Json(responseData); + + // Validate User Sport Experience Id. + SysId userSportExperienceId = model.ExtractSysId(model.UserSportExperienceId); + if (SysId.IsValid(userSportExperienceId) != StringUtil.ToBool(model.UserSportExperienceExists)) + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); + + // Retrieve User Sport Experience. + SaxUserSportExperience userSportExperience = null; + SaxUserSport userSport = null; + if (SysId.IsValid(userSportExperienceId)) + { + userSportExperience = AccountMgr.GetUserSportExperienceById(userSportExperienceId); + disposableItems.Add(userSportExperience); + userSport = AccountMgr.GetUserSportById(userSportExperience?.UserSportId ?? null); + disposableItems.Add(userSport); + if (userSportExperience == null || userSport == null || !userSport.UserAccountId.Equals(SessionData.User.UserAccountId)) + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); + } + else + { + // Creating new User Sport Experience. + // Retrieve User Sport and validate. + SysId userSportId = model.ExtractSysId(model.UserSportId); + userSport = AccountMgr.GetUserSportById(userSportId); + disposableItems.Add(userSport); + if (userSport == null || !userSport.UserAccountId.Equals(SessionData.User.UserAccountId)) + return Json(responseData.SetGoHome(messageTitle, Localiser["msg.something.gone.wrong"])); + // Create User Sport Experience. + userSportExperience = AccountMgr.CreateUserSportExperience(userSport.Id); + disposableItems.Add(userSportExperience); + } + + // Populate properties. + userSportExperience.Changed = false; + if (model.ExperiencePeriodFrom != null) + userSportExperience.PeriodFrom = model.ParseDateFromForm(model.ExperiencePeriodFrom); + if (model.ExperiencePeriodTo != null) + userSportExperience.PeriodTo = model.ParseDateFromForm(model.ExperiencePeriodTo); + if (model.ExperienceOrganisationId != null) + userSportExperience.OrganisationId = model.ExtractSysId(model.ExperienceOrganisationId); + if (model.ExperienceOrganisationName != null) + userSportExperience.OrganisationName = model.ExperienceOrganisationName; + if (model.ExperienceSummary != null) + userSportExperience.Summary = model.ExperienceSummary; + if (model.ExperienceTeam != null) + userSportExperience.Team = model.ExperienceTeam; + if (model.ExperienceLeague != null) + userSportExperience.League = model.ExperienceLeague; + if (model.ExperienceSpeciality != null) + userSportExperience.Speciality = model.ExperienceSpeciality; + // Regions. + if (model.ExperienceRegionIdNation != null) + userSportExperience.RegionIdNation = model.ExtractSysId(model.ExperienceRegionIdNation); + if (model.ExperienceRegionIdProvince != null) + userSportExperience.RegionIdProvince = model.ExtractSysId(model.ExperienceRegionIdProvince); + + // Store Experience. + if (!SysId.IsValid(userSportExperience.Id)) + { + if (AccountMgr.InsertUserSportExperience(userSportExperience, DbUpdateInfo)) + { + responseData.SetNotification(messageTitle, Localiser["msg.item.created"]); + } + else + { + SaLogger.Warn(fn + " Failed to insert user sport experience: " + AccountMgr.ErrorStateMessage); + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"])); + } + } + else + { + if (AccountMgr.UpdateUserSportExperience(userSportExperience, DbUpdateInfo)) + { + responseData.SetNotification(messageTitle, Localiser["msg.item.updated"]); + } + else + { + SaLogger.Warn(fn + " Failed to update user sport experience: " + AccountMgr.ErrorStateMessage); + return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"])); + } + } + + // Populate data to response. + responseData.Experience = new SportExperienceResponseData_Detail(); + PopulateSportExperienceResponseData(model, responseData.Experience, userSportExperience); + } + + // Complete response. + responseData.Success = true; + return Json(responseData); + } + + //------------------------------------------------------------------- + } + //======================================================================= +} diff --git a/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs b/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs index 211ec48..e3d3412 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs @@ -220,7 +220,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Identify activity. Sax.DataItemType itemType = (Sax.DataItemType)StringUtil.ToShort(model.ActivityType); - SysId itemId = model.ActivityIdx.ToSysId(); + SysId itemId = model.ExtractSysId(model.ActivityIdx); if (itemType <= 0 || !SysId.IsValid(itemId)) { SaLogger.Warn(fn + " Activity type/Id inncorrectly specified." + GetLogSuffix()); @@ -288,7 +288,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Identify activity. Sax.DataItemType itemType = (Sax.DataItemType)StringUtil.ToShort(model.ActivityType); - SysId itemId = model.ActivityIdx.ToSysId(); + SysId itemId = model.ExtractSysId(model.ActivityIdx); if (itemType <= 0 || !SysId.IsValid(itemId)) { SaLogger.Warn(fn + " Activity type/Id inncorrectly specified." + GetLogSuffix()); diff --git a/SaxoniteCoreWebOnline/Online/Controllers/ArticleController-Ajax.cs b/SaxoniteCoreWebOnline/Online/Controllers/ArticleController-Ajax.cs index c43c84e..2fb8446 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/ArticleController-Ajax.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/ArticleController-Ajax.cs @@ -261,7 +261,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers RefreshModel(model); // Identify item. - SysId articleId = model.ArticleId.ToSysId(); + SysId articleId = model.ExtractSysId(model.ArticleId); if (!SysId.IsValid(articleId)) return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"])); @@ -351,7 +351,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Image belongs to the article. // If the article doesn't yet exist, it will need to be uploaded to the user first and later transferred. - SysId articleId = model.ArticleId.ToSysId(); + SysId articleId = model.ExtractSysId(model.ArticleId); ItemId articleItemId = new ItemId((short)Sax.DataItemType.Article, articleId); ItemId userItemId = new ItemId((short)Sax.DataItemType.UserAccount, sessionData.User.UserAccountId); ItemId imageItemId = SysId.IsValid(articleId) ? articleItemId : userItemId; @@ -467,7 +467,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } // Validate item Id against 'Exists' flag. - SysId articleId = model.ArticleId.ToSysId(); + SysId articleId = model.ExtractSysId(model.ArticleId); bool articleExists = StringUtil.ToBool(model.ArticleExists); if (articleExists && !SysId.IsValid(articleId)) { @@ -508,9 +508,9 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Populate item properties. if (model.ArticleRegionId != null) - article.RegionIdPrimary = model.ArticleRegionId.ToSysId(); + article.RegionIdPrimary = model.ExtractSysId(model.ArticleRegionId); if (model.ArticleSportId != null) - article.SportIdPrimary = model.ArticleSportId.ToSysId(); + article.SportIdPrimary = model.ExtractSysId(model.ArticleSportId); if (model.ArticleHeadline != null) article.Headline = model.ArticleHeadline; if (model.ArticleSummary != null) @@ -558,7 +558,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } else if (!StringUtil.IsEmpty(segmentItemImageId) || !StringUtil.IsEmpty(segmentImageIdx)) { - SysId itemImageId = segmentItemImageId.ToSysId(); + SysId itemImageId = model.ExtractSysId(segmentItemImageId); int imageIdx = StringUtil.ToInt(segmentImageIdx); // Check for new image first. diff --git a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Members.cs b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Members.cs index 764908a..3447e13 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Members.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Members.cs @@ -105,7 +105,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers RefreshModel(model); // Organisation. - SysId organisationId = model.Filter.OrganisationId.ToSysId(); + SysId organisationId = model.ExtractSysId(model.Filter.OrganisationId); SaxOrganisation organisation = AccountMgr.GetOrganisationById(organisationId); if (organisation == null || !organisation.IsStatusActive) { @@ -178,7 +178,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers StatusCode = values.GetString(colUserStatus.DataName), StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colUserStatus.DataName)) }; - if (memberData.UserAccountId.ToSysId().Equals(SessionData.User.UserAccountId)) memberData.CurrentUser = true; + if (model.ExtractSysId(memberData.UserAccountId).Equals(SessionData.User.UserAccountId)) memberData.CurrentUser = true; String memberRoleCodes = values.GetString(colOrganisationRoleCodes.DataName); foreach (String memberRoleCode in StringListUtil.Split(memberRoleCodes, SaxUserOrganisation.UserOrgnisationRoleDelim)) { @@ -226,7 +226,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers RefreshModel(model); // Identify item. - SysId memberId = model.MemberId.ToSysId(); + SysId memberId = model.ExtractSysId(model.MemberId); if (!SysId.IsValid(memberId)) return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"])); @@ -314,7 +314,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers //--------------------------------------------------------------- // Validate Member against Id against 'Exists' flag. - SysId memberId = model.MemberId.ToSysId(); + SysId memberId = model.ExtractSysId(model.MemberId); bool memberExists = StringUtil.ToBool(model.MemberExists); if (memberExists && !SysId.IsValid(memberId)) { @@ -341,7 +341,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } // Validate the Organisation. - SysId organisationId = userOrganisation != null ? userOrganisation.OrganisationId : model.MemberOrganisationId.ToSysId(); + SysId organisationId = userOrganisation != null ? userOrganisation.OrganisationId : model.ExtractSysId(model.MemberOrganisationId); if (!SysId.IsValid(organisationId)) { SaLogger.Warn(fn + " Organisation Id not specified for Member."); @@ -529,7 +529,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers { // Retrieve User Organisation [MemberId). - SysId userOrganisationId = model.MemberId.ToSysId(); + SysId userOrganisationId = model.ExtractSysId(model.MemberId); SaxUserOrganisation userOrganisation = AccountMgr.GetUserOrganisationById(userOrganisationId); disposableItems.Add(userOrganisation); if (userOrganisation == null || !userOrganisation.IsStatusActive) @@ -645,7 +645,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers { // Retrieve User Organisation [MemberId). - SysId userOrganisationId = model.MemberId.ToSysId(); + SysId userOrganisationId = model.ExtractSysId(model.MemberId); SaxUserOrganisation userOrganisation = AccountMgr.GetUserOrganisationById(userOrganisationId); disposableItems.Add(userOrganisation); if (userOrganisation == null || !userOrganisation.IsStatusActive) diff --git a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Opportunities.cs b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Opportunities.cs index d582630..bb9b1f6 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Opportunities.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Opportunities.cs @@ -32,7 +32,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers public String PublishedOnFmt { get; set; } public String ExpiresOnFmt { get; set; } } - private class OpportunityData_Full : OpportunityData_List + private class OpportunityData_Detail : OpportunityData_List { public String RegionIdPrimary { get; set; } public String SportIdPrimary { get; set; } @@ -54,7 +54,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers data.StatusCode = opportunity.StatusCode; data.StatusDesc = opportunity.StatusDesc; } - private void PopulateOpportunityResponseData(Model_Organisation_Opportunities model, SaxOrganisationOpportunity opportunity, OpportunityData_Full data) + private void PopulateOpportunityResponseData(Model_Organisation_Opportunities model, SaxOrganisationOpportunity opportunity, OpportunityData_Detail data) { PopulateOpportunityResponseData(model, opportunity, data as OpportunityData_List); data.RegionIdPrimary = SysId.ToString(opportunity.RegionIdPrimary); @@ -97,7 +97,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers RefreshModel(model); // Organisation. - SysId organisationId = model.Filter.OrganisationId.ToSysId(); + SysId organisationId = model.ExtractSysId(model.Filter.OrganisationId); using (SaxOrganisation organisation = AccountMgr.GetOrganisationById(organisationId)) { if (organisation == null || !organisation.IsStatusActive) @@ -205,7 +205,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Construction. public AjaxResponse_Opportunity(SaxModel_Online model) : base(model) { } // Opportunity details. - public OpportunityData_Full Opportunity { get; } = new OpportunityData_Full(); + public OpportunityData_Detail Opportunity { get; } = new OpportunityData_Detail(); } //------------------------------------------------------------------- [HttpPost] @@ -222,7 +222,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers RefreshModel(model); // Identify item. - SysId opportunityId = model.OpportunityId.ToSysId(); + SysId opportunityId = model.ExtractSysId(model.OpportunityId); if (!SysId.IsValid(opportunityId)) return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"])); @@ -279,7 +279,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers return Json(responseData); // Validate Opportunity against Id against 'Exists' flag. - SysId opportunityId = model.OpportunityId.ToSysId(); + SysId opportunityId = model.ExtractSysId(model.OpportunityId); bool opportunityExists = StringUtil.ToBool(model.OpportunityExists); if (opportunityExists && !SysId.IsValid(opportunityId)) { @@ -306,7 +306,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } // Validate the Organisation. - SysId organisationId = model.OpportunityOrganisationId.ToSysId(); + SysId organisationId = model.ExtractSysId(model.OpportunityOrganisationId); if (!SysId.IsValid(organisationId)) { SaLogger.Warn(fn + " Organisation Id not specified for Opportunity."); @@ -341,9 +341,9 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Populate item properties. if (model.OpportunityRegionId != null) - opportunity.RegionIdPrimary = model.OpportunityRegionId.ToSysId(); + opportunity.RegionIdPrimary = model.ExtractSysId(model.OpportunityRegionId); if (model.OpportunitySportId != null) - opportunity.SportIdPrimary = model.OpportunitySportId.ToSysId(); + opportunity.SportIdPrimary = model.ExtractSysId(model.OpportunitySportId); if (model.OpportunityTypeCode != null) opportunity.OpportunityType = (Sax.OpportunityType)OpportunityTypeCodes.GetTypeForCode(model.OpportunityTypeCode); if (model.OpportunityPosition != null) diff --git a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Request.cs b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Request.cs index e6ac2bc..509e6cf 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Request.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Request.cs @@ -48,14 +48,16 @@ namespace Saxonite.Net.Core.Web.Online.Controllers return Json(responseData); // Check Regions. - SaxRegion regionCountry = Internals.GetRegion(model.OrganisationRegionIdCountry.ToSysId()); - if (SysId.IsValid(model.OrganisationRegionIdCountry.ToSysId()) && regionCountry == null) + SysId regionIdCountry = model.ExtractSysId(model.OrganisationRegionIdCountry); + SaxRegion regionCountry = Internals.GetRegion(regionIdCountry); + if (SysId.IsValid(regionIdCountry) && regionCountry == null) { SaLogger.Warn(fn + " Country region not found. Id: " + model.OrganisationRegionIdCountry + ". " + GetLogSuffix()); return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); } - SaxRegion regionProvince = Internals.GetRegion(model.OrganisationAddressRegionIdProvince.ToSysId()); - if (SysId.IsValid(model.OrganisationAddressRegionIdProvince.ToSysId()) && regionProvince == null) + SysId regionIdAddressProvince= model.ExtractSysId(model.OrganisationAddressRegionIdProvince); + SaxRegion regionProvince = Internals.GetRegion(regionIdAddressProvince); + if (SysId.IsValid(regionIdAddressProvince) && regionProvince == null) { SaLogger.Warn(fn + " Province region not found. Id: " + model.OrganisationAddressRegionIdProvince + ". " + GetLogSuffix()); return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"])); @@ -102,17 +104,18 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } } - if (SysId.IsValid(model.OrganisationSportId.ToSysId())) + SysId organisationSportId = model.ExtractSysId(model.OrganisationSportId); + if (SysId.IsValid(organisationSportId)) { // Add User Sport if not already present. // NB This will also reactivate an inactive or deleted User Sport. SaxUserSport.Params prmUserSport = new SaxUserSport.Params(); prmUserSport.UserAccountIdsIncluded.Add(userAccount.Id); - prmUserSport.SportIdsIncluded.Add(model.OrganisationSportId.ToSysId()); + prmUserSport.SportIdsIncluded.Add(organisationSportId); prmUserSport.StatusCat = SaxUserSport.StatusCat.Any; SaxUserSport userSport = AccountMgr.GetUserSport(prmUserSport); if (userSport == null) - userSport = AccountMgr.CreateUserSport(userAccount.Id, model.OrganisationSportId.ToSysId()); + userSport = AccountMgr.CreateUserSport(userAccount.Id, organisationSportId); userSport.Status = SaxUserSport.DefaultStatus; if (!SysId.IsValid(userSport.Id)) { @@ -137,8 +140,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers organisation.Name = model.OrganisationName; organisation.OrganisationType = model.GetOrganisationType(); organisation.OrganisationCategory = model.GetOrganisationCategory(); - organisation.SportIdPrimary = model.OrganisationSportId.ToSysId(); - organisation.RegionIdPrimary = model.OrganisationRegionIdCountry.ToSysId(); + organisation.SportIdPrimary = organisationSportId; + organisation.RegionIdPrimary = model.ExtractSysId(model.OrganisationRegionIdCountry); organisation.PhoneMain = model.OrganisationPhoneMain; organisation.Status = SaStatus.Awaiting; if (!AccountMgr.InsertOrganisation(organisation, DbUpdateInfo)) @@ -163,7 +166,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers organisationAddress.Line3 = model.OrganisationAddressLine3; organisationAddress.Town = model.OrganisationAddressTown; organisationAddress.Province = model.OrganisationAddressProvince; - organisationAddress.RegionIdProvince = model.OrganisationAddressRegionIdProvince.ToSysId(); + organisationAddress.RegionIdProvince = model.ExtractSysId(model.OrganisationAddressRegionIdProvince); if (SysId.IsValid(regionCountry.Id)) { organisationAddress.Country = regionCountry.Name; diff --git a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax.cs b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax.cs index 6faba77..c218bcc 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax.cs @@ -73,8 +73,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers // Organisation filter. SaxOrganisation.Params prmOrganisation = new SaxOrganisation.Params(); prmOrganisation.OrganisationFilter = model.Filter.Organisation; - prmOrganisation.RegionIdsIncluded.AddId(model.Filter.RegionId.ToSysId()); - prmOrganisation.SportIdsIncluded.AddId(model.Filter.SportId.ToSysId()); + prmOrganisation.RegionIdsIncluded.AddId(model.ExtractSysId(model.Filter.RegionId)); + prmOrganisation.SportIdsIncluded.AddId(model.ExtractSysId(model.Filter.SportId)); prmOrganisation.StatusCat = SaxOrganisation.StatusCat.ActiveOnly; prmOrganisation.SortColumns.Add(colOrganisationName); model.Paging.ItemTotal = (ulong)AccountMgr.GetOrganisationCount(prmOrganisation); diff --git a/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs b/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs index b1b9507..2ea9cac 100644 --- a/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs +++ b/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs @@ -25,6 +25,10 @@ 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-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"); } //------------------------------------------------------------------- @@ -128,9 +132,10 @@ namespace Saxonite.Net.Core.Web.Online.Models //--------------------------------------------------------------- // Country Region. - if (AccountRegionIdCountry != null && SysId.IsValid(AccountRegionIdCountry.ToSysId())) + SysId regionIdCountry = ExtractSysId(AccountRegionIdCountry); + if (AccountRegionIdCountry != null && SysId.IsValid(regionIdCountry)) { - SaxRegion regionCountry = Internals.GetRegion(AccountRegionIdCountry.ToSysId()); + SaxRegion regionCountry = Internals.GetRegion(regionIdCountry); if (regionCountry == null) responseData.SetControlError(nameof(AccountRegionIdCountry), Localiser["msg.validation.invalid.value"]); } @@ -138,7 +143,8 @@ namespace Saxonite.Net.Core.Web.Online.Models // Province Region. if (AccountRegionIdProvince != null) { - SaxRegion regionProvince = Internals.GetRegion(AccountRegionIdProvince.ToSysId()); + SysId regionIdProvince = ExtractSysId(AccountRegionIdProvince); + SaxRegion regionProvince = Internals.GetRegion(regionIdProvince); if (regionProvince == null) responseData.SetControlError(nameof(AccountRegionIdProvince), Localiser["msg.validation.invalid.value"]); } @@ -152,7 +158,7 @@ namespace Saxonite.Net.Core.Web.Online.Models // Sport. if (ProfileSportId != null) { - SysId profileSportId = ProfileSportId.ToSysId(); + SysId profileSportId = ExtractSysId(ProfileSportId); if (!SysId.IsValid(profileSportId)) responseData.SetControlError(nameof(ProfileSportId), Localiser["msg.validation.mandatory.value"]); } diff --git a/SaxoniteCoreWebOnline/Online/Models/Model_Article.cs b/SaxoniteCoreWebOnline/Online/Models/Model_Article.cs index 6cd015b..e50ab2d 100644 --- a/SaxoniteCoreWebOnline/Online/Models/Model_Article.cs +++ b/SaxoniteCoreWebOnline/Online/Models/Model_Article.cs @@ -108,7 +108,7 @@ namespace Saxonite.Net.Core.Web.Online.Models // Article sport. if (ArticleSportId != null) { - SysId articleSportId = ArticleSportId.ToSysId(); + SysId articleSportId = ExtractSysId(ArticleSportId); if (!SysId.IsValid(articleSportId)) responseData.SetControlError(nameof(ArticleSportId), Localiser["msg.validation.mandatory.value"]); } @@ -116,7 +116,7 @@ namespace Saxonite.Net.Core.Web.Online.Models // Article region. if (ArticleRegionId != null) { - SysId articleRegionId = ArticleRegionId.ToSysId(); + SysId articleRegionId = ExtractSysId(ArticleRegionId); if (!SysId.IsValid(articleRegionId)) responseData.SetControlError(nameof(ArticleRegionId), Localiser["msg.validation.mandatory.value"]); } diff --git a/SaxoniteCoreWebOnline/Online/Models/Model_Organisation.cs b/SaxoniteCoreWebOnline/Online/Models/Model_Organisation.cs index 8a55dd5..5e37684 100644 --- a/SaxoniteCoreWebOnline/Online/Models/Model_Organisation.cs +++ b/SaxoniteCoreWebOnline/Online/Models/Model_Organisation.cs @@ -107,12 +107,12 @@ namespace Saxonite.Net.Core.Web.Online.Models responseData.SetControlError(nameof(OrganisationName), Localiser["msg.validation.mandatory.value"]); else if (StringUtil.GetLength(OrganisationName) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Organisation_Name)) responseData.SetControlError(nameof(OrganisationName), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Organisation_Name)]); - else if (SysId.IsValid(OrganisationRegionIdCountry.ToSysId())) + else if (SysId.IsValid(ExtractSysId(OrganisationRegionIdCountry))) { // Ensure that the organisation name is unique within the country. SaxOrganisation.Params prmOrganisation = new SaxOrganisation.Params(); prmOrganisation.NameFull = OrganisationName; - prmOrganisation.RegionIdsIncluded.Add(OrganisationRegionIdCountry.ToSysId()); + prmOrganisation.RegionIdsIncluded.Add(ExtractSysId(OrganisationRegionIdCountry)); prmOrganisation.StatusCat = SaxOrganisation.StatusCat.Any; if (AccountMgr.GetOrganisationCount(prmOrganisation) > 0) responseData.SetControlError(nameof(OrganisationName), Localiser["msg.validation.duplicate.value"]); @@ -129,13 +129,13 @@ namespace Saxonite.Net.Core.Web.Online.Models // Organisation Sport - mandatory for certain organisation categories. if (StringUtil.IsEmpty(OrganisationSportId) && SaxOrganisation.IsSportMandatory(GetOrganisationCategory())) responseData.SetControlError(nameof(OrganisationSportId), Localiser["msg.validation.mandatory.value"]); - else if (!StringUtil.IsEmpty(OrganisationSportId) && !SysId.IsValid(OrganisationSportId.ToSysId())) + else if (!StringUtil.IsEmpty(OrganisationSportId) && !SysId.IsValid(ExtractSysId(OrganisationSportId))) responseData.SetControlError(nameof(OrganisationSportId), Localiser["msg.validation.invalid.value"]); // Organisation Region Country - mandatory. if (StringUtil.IsEmpty(OrganisationRegionIdCountry)) responseData.SetControlError(nameof(OrganisationRegionIdCountry), Localiser["msg.validation.mandatory.value"]); - else if (!SysId.IsValid(OrganisationRegionIdCountry.ToSysId())) + else if (!SysId.IsValid(ExtractSysId(OrganisationRegionIdCountry))) responseData.SetControlError(nameof(OrganisationRegionIdCountry), Localiser["msg.validation.invalid.value"]); // Organisation Address Line 1 - mandatory. diff --git a/SaxoniteCoreWebOnline/Online/Models/Model_Organisation_Opportunities.cs b/SaxoniteCoreWebOnline/Online/Models/Model_Organisation_Opportunities.cs index f35cf20..5841266 100644 --- a/SaxoniteCoreWebOnline/Online/Models/Model_Organisation_Opportunities.cs +++ b/SaxoniteCoreWebOnline/Online/Models/Model_Organisation_Opportunities.cs @@ -88,7 +88,7 @@ namespace Saxonite.Net.Core.Web.Online.Models // Opportunity sport. if (OpportunitySportId != null) { - SysId articleSportId = OpportunitySportId.ToSysId(); + SysId articleSportId = ExtractSysId(OpportunitySportId); if (!SysId.IsValid(articleSportId)) responseData.SetControlError(nameof(OpportunitySportId), Localiser["msg.validation.mandatory.value"]); } @@ -96,7 +96,7 @@ namespace Saxonite.Net.Core.Web.Online.Models // Opportunity region. if (OpportunityRegionId != null) { - SysId articleRegionId = OpportunityRegionId.ToSysId(); + SysId articleRegionId = ExtractSysId(OpportunityRegionId); if (!SysId.IsValid(articleRegionId)) responseData.SetControlError(nameof(OpportunityRegionId), Localiser["msg.validation.mandatory.value"]); } diff --git a/SaxoniteCoreWebOnline/Online/Models/Model_UserSportExperience.cs b/SaxoniteCoreWebOnline/Online/Models/Model_UserSportExperience.cs new file mode 100644 index 0000000..e181268 --- /dev/null +++ b/SaxoniteCoreWebOnline/Online/Models/Model_UserSportExperience.cs @@ -0,0 +1,117 @@ +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.Threading.Tasks; + +namespace Saxonite.Net.Core.Web.Online.Models +{ + //======================================================================= + public class Model_UserSportExperience : SaxModel_Online + { + //------------------------------------------------------------------- + // Construction. + public Model_UserSportExperience(SaxLocaliser localiser) : + base(localiser) + { + } + + //------------------------------------------------------------------- + // User Sports Experience Properties. + public String UserSportExperienceId { get; set; } + public String UserSportExperienceExists { get; set; } + public String UserSportId { get; set; } + public String ExperiencePeriodFrom { get; set; } + public String ExperiencePeriodTo { get; set; } + public String ExperienceOrganisationId { get; set; } + public String ExperienceOrganisationName { get; set; } + public String ExperienceSummary { get; set; } + public String ExperienceTeam { get; set; } + public String ExperienceLeague { get; set; } + public String ExperienceSpeciality { get; set; } + // Regions. + public String ExperienceRegionIdNation { get; set; } + public String ExperienceRegionIdProvince { get; set; } + + //------------------------------------------------------------------- + // Validate User Sport Experience data. + public bool ValidateProfileSportData(SaxController_Base.AjaxResponse_Data responseData) + { + // Period dates. + DateTime periodFrom = ParseDateFromForm(ExperiencePeriodFrom); + DateTime periodTo = ParseDateFromForm(ExperiencePeriodTo); + + // Period From. + if (ExperiencePeriodFrom != null) + { + // Period from date is mandatory. + if (!DateUtil.IsValid(periodFrom)) + responseData.SetControlError(nameof(ExperiencePeriodFrom), Localiser["msg.validation.invalid.value"]); + } + + // Period To. + if (ExperiencePeriodTo != null) + { + // Period to date is optional must not be before the from date. + if (DateUtil.IsValid(periodTo) && DateUtil.IsValid(periodFrom) && periodTo.CompareTo(periodFrom) < 0) + responseData.SetControlError(nameof(ExperiencePeriodTo), Localiser["msg.validation.invalid.value"]); + } + + // Organisation name. + if (ExperienceOrganisationName != null) + { + responseData.SetControlValue(nameof(ExperienceOrganisationName), ExperienceOrganisationName); + if (StringUtil.GetLength(ExperienceOrganisationName) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserSportExperience_OrganisationName)) + responseData.SetControlError(nameof(ExperienceOrganisationName), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserSportExperience_OrganisationName)]); + } + + // Summary. + if (ExperienceSummary != null) + { + responseData.SetControlValue(nameof(ExperienceSummary), ExperienceSummary); + if (StringUtil.IsEmpty(ExperienceSummary)) + responseData.SetControlError(nameof(ExperienceSummary), Localiser["msg.validation.mandatory.value"]); + else if (StringUtil.GetLength(ExperienceSummary) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserSportExperience_Summary)) + responseData.SetControlError(nameof(ExperienceSummary), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserSportExperience_Summary)]); + } + + // Team. + if (ExperienceTeam != null) + { + responseData.SetControlValue(nameof(ExperienceTeam), ExperienceTeam); + if (StringUtil.GetLength(ExperienceTeam) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserSportExperience_Team)) + responseData.SetControlError(nameof(ExperienceTeam), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserSportExperience_Team)]); + } + + // League. + if (ExperienceLeague != null) + { + responseData.SetControlValue(nameof(ExperienceLeague), ExperienceLeague); + if (StringUtil.GetLength(ExperienceLeague) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserSportExperience_League)) + responseData.SetControlError(nameof(ExperienceLeague), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserSportExperience_League)]); + } + + // Speciality. + if (ExperienceSpeciality != null) + { + responseData.SetControlValue(nameof(ExperienceSpeciality), ExperienceSpeciality); + if (StringUtil.GetLength(ExperienceSpeciality) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserSportExperience_Speciality)) + responseData.SetControlError(nameof(ExperienceSpeciality), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserSportExperience_Speciality)]); + } + + return !responseData.HasControlErrors(); + } + + //------------------------------------------------------------------- + } + //======================================================================= +} diff --git a/SaxoniteCoreWebOnline/Online/Models/SaxModel_Online.cs b/SaxoniteCoreWebOnline/Online/Models/SaxModel_Online.cs index 1534f71..d8f611e 100644 --- a/SaxoniteCoreWebOnline/Online/Models/SaxModel_Online.cs +++ b/SaxoniteCoreWebOnline/Online/Models/SaxModel_Online.cs @@ -131,9 +131,11 @@ namespace Saxonite.Net.Core.Web.Online.Models idObfuscationParams.Add(ParamName_IdObfuscation_Id, SysId.ToString(id)); return SaxController_Base.EncryptParameters(idObfuscationParams, Base64IV_IdObfuscation, Base64Key_IdObfuscation); } - public SysId DecryptId(String encryptedParams) + public SysId DecryptId(String encryptedId) { - NameValueCollection idObfuscationParams = SaxController_Base.DecryptParameters(encryptedParams, Base64IV_IdObfuscation, Base64Key_IdObfuscation); + if (StringUtil.IsNumeric(encryptedId)) + return encryptedId.ToSysId(); + NameValueCollection idObfuscationParams = SaxController_Base.DecryptParameters(encryptedId, Base64IV_IdObfuscation, Base64Key_IdObfuscation); return idObfuscationParams.Get(ParamName_IdObfuscation_Id).ToSysId(); } diff --git a/SaxoniteCoreWebOnline/Views/Account/Profile-Contact.cshtml b/SaxoniteCoreWebOnline/Views/Account/Profile-Contact.cshtml index 41b2fca..83bac52 100644 --- a/SaxoniteCoreWebOnline/Views/Account/Profile-Contact.cshtml +++ b/SaxoniteCoreWebOnline/Views/Account/Profile-Contact.cshtml @@ -261,7 +261,7 @@
-
+
} diff --git a/SaxoniteCoreWebOnline/Views/Account/Profile-SportExperiences.cshtml b/SaxoniteCoreWebOnline/Views/Account/Profile-SportExperiences.cshtml new file mode 100644 index 0000000..446a01c --- /dev/null +++ b/SaxoniteCoreWebOnline/Views/Account/Profile-SportExperiences.cshtml @@ -0,0 +1,229 @@ +@model SaxModel_Online +@inject SaxLocaliser Localiser +@* Sport Experience panel - list experience for sport *@ + + +@using (Html.BeginForm(FormMethod.Post, new { @id = "frmSportExperienceId", @class = "sax-form", @onSubmit = "return false;" })) +{ + +} + +
+ +
+ + @using (Html.BeginForm(FormMethod.Post, new { @id = "frmSportExperience", @class = "sax-form", @onSubmit = "return false;" })) + { + + + + + @* Period *@ +
+ +
+
+ +
+
+ +
+
+
+ @* Period From *@ +
+
+ +
+
+ +
+
+
+
+ +
+ @* Period To *@ +
+
+ +
+
+ +
+
+
+
+
+
+ +
+ + @* Summary *@ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ + @* Organisation *@ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ + @* Speciality *@ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ + @* Team *@ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ + @* League *@ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ + } + +
+ +
+ + diff --git a/SaxoniteCoreWebOnline/Views/Account/Profile-Sports.cshtml b/SaxoniteCoreWebOnline/Views/Account/Profile-Sports.cshtml index bbe0da7..0156ab7 100644 --- a/SaxoniteCoreWebOnline/Views/Account/Profile-Sports.cshtml +++ b/SaxoniteCoreWebOnline/Views/Account/Profile-Sports.cshtml @@ -20,7 +20,7 @@ @* Filter item templates *@
- @* Burger dropdown item template - ul is ignored *@ + @* Filter Burger dropdown template - ul is ignored *@
  • ...
@@ -34,7 +34,9 @@
+ @* Item templates *@
+ @* Sport template *@
@@ -45,6 +47,7 @@ @@ -57,14 +60,20 @@
+ @* Sport Burger dropdown template - ul is ignored *@ +
    +
  • ...
  • +
- @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" }) +}
@@ -111,5 +120,3 @@ }
- - diff --git a/SaxoniteCoreWebOnline/Views/Account/Profile.cshtml b/SaxoniteCoreWebOnline/Views/Account/Profile.cshtml index 44f6780..6a7d6f1 100644 --- a/SaxoniteCoreWebOnline/Views/Account/Profile.cshtml +++ b/SaxoniteCoreWebOnline/Views/Account/Profile.cshtml @@ -16,23 +16,27 @@ + + diff --git a/SaxoniteCoreWebOnline/wwwroot/css/sax-data.css b/SaxoniteCoreWebOnline/wwwroot/css/sax-data.css index 4ab6781..c60a024 100644 --- a/SaxoniteCoreWebOnline/wwwroot/css/sax-data.css +++ b/SaxoniteCoreWebOnline/wwwroot/css/sax-data.css @@ -154,6 +154,11 @@ font-weight: bold; } +.sax-panel-item > .sax-header ul.nav.sax-burger +{ + margin: 0; +} + .sax-panel-item > .sax-header .dropdown-menu { padding: 4px 8px; diff --git a/SaxoniteCoreWebOnline/wwwroot/css/sax-form.css b/SaxoniteCoreWebOnline/wwwroot/css/sax-form.css index 259d4c0..7c4bd62 100644 --- a/SaxoniteCoreWebOnline/wwwroot/css/sax-form.css +++ b/SaxoniteCoreWebOnline/wwwroot/css/sax-form.css @@ -178,6 +178,7 @@ .sax-form .sax-input.sax-calendar { + width:80%; max-width: 180px; } diff --git a/SaxoniteCoreWebOnline/wwwroot/js/sax-account.js b/SaxoniteCoreWebOnline/wwwroot/js/sax-account.js index 06f67d9..07639f4 100644 --- a/SaxoniteCoreWebOnline/wwwroot/js/sax-account.js +++ b/SaxoniteCoreWebOnline/wwwroot/js/sax-account.js @@ -17,339 +17,6 @@ setTimeout(sax.refreshProfileOrganisationsInfo, 50); } - //-------------------------------------------------------------- - sax.refreshProfileContactInfo = function () - { - var $section = $('.sax-panel-section.ProfileContact'); - $section.removeClass('sax-edit').addClass('sax-populating'); - $('.sax-property', $section).hide(); - sax.showDataRefreshingMsg($section); - sax.refreshProfileContact(sax.onRefreshProfileContactInfo); - } - sax.refreshProfileContactForm = function () - { - if (!sax.closeEditPanels()) return; - sax.refreshProfileContact(sax.onRefreshProfileContactForm); - } - sax.refreshProfileContact = function (callbackFn) - { - delete sax.page.profileContactChanged; - sax.ajax.profileContact = sax.ajax.profileContact || { url: sax.url.base + 'Account/Ajax/GetProfileContact', formId: 'frmNavigate', noWaitIcon: true }; - sax.ajax.profileContact.callbackFn = callbackFn; - sax.doAjaxRequest(sax.ajax.profileContact, 50); - } - sax.onRefreshProfileContactInfo = function (response) - { - sax.debug('onRefreshProfileContactInfo', response); - if (!response || !response.success || !response.contact) return; - $('.sax-panel-section').show(); - var $section = $('.sax-panel-section.ProfileContact'); - $('.sax-message', $section).stop(true, false).fadeOut(200).empty(); - $('.sax-value', $section).empty(); - sax.refreshInfo($section, 'AccountEmailAddress', response.contact.emailAddress); - sax.refreshInfo($section, 'AccountName', response.contact.displayName); - sax.refreshInfo($section, 'AccountLocation', response.contact.locationCaption); - $('img.AccountContact', $section).prop('src', 'Image/Account/Contact/Profile?' + (new Date()).getTime()); - sax.showNoInfoMsg($section); - $section.removeClass('sax-populating'); - } - sax.onRefreshProfileContactForm = function (response) - { - //sax.debug('onRefreshProfileContactForm', response); - if (!response || !response.success) return; - sax.data.genders = response.genders; - sax.data.months = response.months; - $('.sax-panel-section').hide(); - var $section = $('.sax-panel-section.ProfileContact').show(); - $('.sax-message', $section).stop(true, false).fadeOut(200).empty(); - sax.refreshInput($section, 'AccountEmailAddress', response.contact.emailAddress); - sax.refreshSelect($section, 'AccountTitle', response.contact.title); - sax.refreshInput($section, 'AccountFirstName', response.contact.firstName); - sax.refreshInput($section, 'AccountLastName', response.contact.lastName); - let $selGender = $('#cbAccountGender'); - if (response.genders && response.genders.length) - sax.populateSelectCodeDesc($('#cbAccountGender'), response.genders); - sax.refreshSelect($section, 'AccountGender', response.contact.gender || ''); - sax.refreshDob(); - sax.refreshSelect($section, 'AccountDobYear', response.contact.dobYear); - sax.refreshDob(); - sax.refreshSelect($section, 'AccountDobMonth', response.contact.dobMonth); - sax.refreshDob(); - sax.refreshSelect($section, 'AccountDobDay', response.contact.dobDay); - sax.refreshInput($section, 'AccountRegionIdCountry', response.contact.regionIdCountry); - sax.refreshInput($section, 'AccountRegionCaptionCountry', response.contact.regionCaptionCountry); - sax.refreshInput($section, 'AccountRegionIdProvince', response.contact.regionIdProvince); - sax.refreshInput($section, 'AccountRegionCaptionProvince', response.contact.regionCaptionProvince); - $('img.AccountContact', $section).prop('src', 'Image/Account/Contact/Profile?' + (new Date()).getTime()); - $section.addClass('sax-edit'); - } - sax.doStoreProfileContact = function () - { - sax.clearControlErrors(); - sax.ajax.storeProfileContact = sax.ajax.storeProfileContact || { url: sax.url.base + 'Account/Ajax/StoreProfileContact', formId: 'frmProfileContact', callbackFn: sax.onStoreProfileContact }; - sax.doAjaxRequest(sax.ajax.storeProfileContact, 50); - } - sax.onStoreProfileContact = function (response) - { - sax.refreshControlValues(response.controlValues); - if (!response || !response.success) - return; - sax.refreshProfileContactInfo(); - } - - //-------------------------------------------------------------- - sax.refreshDob = function () - { - //sax.debug('refreshDob', $('#cbAccountDobYear').val(), $('#cbAccountDobMonth').val(), $('#cbAccountDobDay').val()); - let now = new Date(); - let $selDobYear = $('#cbAccountDobYear'); - if (!$('option', $selDobYear).length) - { - $selDobYear.append($('