diff --git a/SaxoniteCoreWeb/Base/App/SaxLocaliser.cs b/SaxoniteCoreWeb/Base/App/SaxLocaliser.cs index 276e759..b1d429d 100644 --- a/SaxoniteCoreWeb/Base/App/SaxLocaliser.cs +++ b/SaxoniteCoreWeb/Base/App/SaxLocaliser.cs @@ -137,6 +137,7 @@ namespace Saxonite.Net.Core.Web.Base.App //------------------------------------------------------------------- private class CodeCache { + public List genderCodes; public List sportParticipationCodes; public List sportOfficiatingCodes; public List regionTypeCodes; @@ -155,6 +156,16 @@ namespace Saxonite.Net.Core.Web.Base.App return SacsSystem.GetStatusDesc(status); } + // Gender. + public String GetGenderCaption(Sax.Gender gender) + { + if ((int)gender < 1) return ""; + if (codes.genderCodes == null) + codes.genderCodes = SaxSystem.GetCodesOfType(Sax.CodeType.Gender); + // ToDo Opportunity Type localisation. + return codes.genderCodes.GetDescForType(gender); + } + // Sport Participation. public String GetSportParticipationTypeCaption(Sax.SportParticipation participation) { diff --git a/SaxoniteCoreWeb/Base/App/SaxStartup.cs b/SaxoniteCoreWeb/Base/App/SaxStartup.cs index bb193b9..40c1540 100644 --- a/SaxoniteCoreWeb/Base/App/SaxStartup.cs +++ b/SaxoniteCoreWeb/Base/App/SaxStartup.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Mvc.Razor; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Options; using Microsoft.Net.Http.Headers; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Core; @@ -160,6 +161,10 @@ namespace Saxonite.Net.Core.Web.Base.App //config.app.UseAuthorization(); config.app.UseAntiforgeryTokens(); + // Localisation. + IOptions localizationOptions = config.app.ApplicationServices.GetService>(); + config.app.UseRequestLocalization(localizationOptions.Value); + config.app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( diff --git a/SaxoniteCoreWeb/Base/Controllers/SaxController_Base.cs b/SaxoniteCoreWeb/Base/Controllers/SaxController_Base.cs index 56c6809..400c740 100644 --- a/SaxoniteCoreWeb/Base/Controllers/SaxController_Base.cs +++ b/SaxoniteCoreWeb/Base/Controllers/SaxController_Base.cs @@ -23,6 +23,7 @@ using Saxonite.Net.Standard.Base.Mgr; using System; using System.Collections.Generic; using System.Collections.Specialized; +using System.Globalization; using System.Linq; using System.Reflection; using System.Text; @@ -70,7 +71,23 @@ namespace Saxonite.Net.Core.Web.Base.Controllers /// Some actions such as scoring a password's complexity don't need to. /// public virtual bool StoreSessionData { get; protected set; } = true; + + //------------------------------------------------------------------- // Culture. + private CultureInfo sessionCulture; + private CultureInfo RequestCulture { get { return Request.HttpContext.Features.Get().RequestCulture.Culture ?? CultureInfo.InvariantCulture; } } + public CultureInfo SessionCulture + { + get + { + if (sessionCulture == null) + { + sessionCulture = RequestCulture; + // ToDo Adjust culture if needed. + } + return sessionCulture; + } + } private string LanguageIso2 { get @@ -79,6 +96,8 @@ namespace Saxonite.Net.Core.Web.Base.Controllers return feature.RequestCulture.UICulture.TwoLetterISOLanguageName.ToLower(); } } + + //------------------------------------------------------------------- // Business components. public SaxInternals Internals { get { if (internals == null) internals = new SaxInternals(SessionContext); return internals; } } // Consoles. @@ -191,6 +210,7 @@ namespace Saxonite.Net.Core.Web.Base.Controllers if (model == null) return; // Session data. + model.Controller = this; model.SessionData = SessionData; // Redirect locations. diff --git a/SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs b/SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs index b69b9cf..481faaf 100644 --- a/SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs +++ b/SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs @@ -6,12 +6,14 @@ using Sarand.Net.Standard.Base.Dbas; 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.Standard.Base.App; using Saxonite.Net.Standard.Base.Bus; using Saxonite.Net.Standard.Base.Consoles; using Saxonite.Net.Standard.Base.Mgr; using System; using System.Collections.Generic; +using System.Globalization; namespace Saxonite.Net.Core.Web.Base.Models { @@ -38,11 +40,15 @@ namespace Saxonite.Net.Core.Web.Base.Models protected SaxAppConfig AppConfig { get { return App.AppConfig; } } protected SaxSystem_Web System { get { return App.System_Web; } } public String SessionCookieName { get { return App.SessionCookieName; } } + public SaxLocaliser Localiser { get; } + public bool DebugMode { get { return SaxSystem.DebugMode; } } + // Session properties. public SaxSessionData SessionData { get; set; } public SaxSessionContext SessionContext { get { return SessionData?.SessionContext ?? App.SessionContext; } } public DbUpdateInfo DbUpdateInfo { get { return SessionData?.DbUpdateInfo ?? new DbUpdateInfo(null, "", SaxSystem.ComputerName); } } - public bool DebugMode { get { return SaxSystem.DebugMode; } } - public SaxLocaliser Localiser { get; } + // Request properties. + public SaxController_Base Controller { get; set; } + public CultureInfo SessionCulture { get { return Controller?.SessionCulture ?? CultureInfo.InvariantCulture; } } //------------------------------------------------------------------- // Page configuration. @@ -190,11 +196,11 @@ namespace Saxonite.Net.Core.Web.Base.Models } public String FormatDateForForm(DateTime value) { - return DateUtil.Format(value, "dd-MMM-yyyy"); + return DateUtil.Format(value, "dd-MMM-yyyy", SessionCulture); } public DateTime ParseDateFromForm(String value) { - return DateUtil.ParseExact(value, "dd-MMM-yyyy"); + return DateUtil.ParseExact(value, "dd-MMM-yyyy", SessionCulture); } //------------------------------------------------------------------- diff --git a/SaxoniteCoreWebAdmin/wwwroot/js/sax-home.js b/SaxoniteCoreWebAdmin/wwwroot/js/sax-home.js index 4f92215..447ede6 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/js/sax-home.js +++ b/SaxoniteCoreWebAdmin/wwwroot/js/sax-home.js @@ -17,8 +17,8 @@ var $items = $('.sax-panel-item-list', $results).fadeOut(200).empty(); var $msgs = $('.sax-panel-messages', $results).hide().empty().append($('
' + sax.msg.dataQuerying + '
')).fadeIn(200); } - sax.ajaxDbSchema = sax.ajaxDbSchema || { url: sax.url.base + 'System/Ajax/ValidateDatabaseSchema', formId: 'frmNavigate', callbackFn: sax.handleDbSchemaResponse, noWaitIcon: true }; - sax.doAjaxRequest(sax.ajaxDbSchema, delay || 50); + sax.ajax.dbSchema = sax.ajax.dbSchema || { url: sax.url.base + 'System/Ajax/ValidateDatabaseSchema', formId: 'frmNavigate', callbackFn: sax.handleDbSchemaResponse, noWaitIcon: true }; + sax.doAjaxRequest(sax.ajax.dbSchema, delay || 50); sax.awaitingRefreshResponse = true; } sax.handleDbSchemaResponse = function (response) diff --git a/SaxoniteCoreWebAdmin/wwwroot/js/sax-organisationMembers.js b/SaxoniteCoreWebAdmin/wwwroot/js/sax-organisationMembers.js index 0e7c700..9ad1b51 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/js/sax-organisationMembers.js +++ b/SaxoniteCoreWebAdmin/wwwroot/js/sax-organisationMembers.js @@ -16,8 +16,8 @@ var $items = $('.sax-panel-item-list', $results).fadeOut(200).empty(); var $msgs = $('.sax-panel-messages', $results).hide().empty().append($('
' + sax.msg.dataQuerying + '
')).fadeIn(200); } - sax.ajaxRefreshResults = sax.ajaxRefreshResults || { url: sax.url.base + 'Organisation/Ajax/GetMemberList', formId: 'frmMemberFilter', callbackFn: sax.doRefreshResults }; - sax.doAjaxRequest(sax.ajaxRefreshResults, delay || 50); + sax.ajax.refreshResults = sax.ajax.refreshResults || { url: sax.url.base + 'Organisation/Ajax/GetMemberList', formId: 'frmMemberFilter', callbackFn: sax.doRefreshResults }; + sax.doAjaxRequest(sax.ajax.refreshResults, delay || 50); sax.awaitingRefreshResponse = true; } sax.doRefreshResults = function (response) @@ -90,8 +90,8 @@ if (!response || !response.success || !response.user) return; $mbrName.val(response.user.displayName); } - sax.ajaxUserByEmail = sax.ajaxUserByEmail || { url: sax.url.base + 'User/Ajax/GetUserByEmail', formId: 'frmUserEmail', callbackFn: fn }; - sax.doAjaxRequest(sax.ajaxUserByEmail, 100); + sax.ajax.userByEmail = sax.ajax.userByEmail || { url: sax.url.base + 'User/Ajax/GetUserByEmail', formId: 'frmUserEmail', callbackFn: fn }; + sax.doAjaxRequest(sax.ajax.userByEmail, 100); } //-------------------------------------------------------------- @@ -146,8 +146,8 @@ sax.updateItem = function (id) { $('.UserOrganisationId', sax.$frm.memberId).val(id); - sax.ajaxUpdateItem = sax.ajaxUpdateItem || { url: sax.url.base + 'Organisation/Ajax/GetMember', formId: 'frmMemberId', callbackFn: sax.onUpdateItem }; - sax.doAjaxRequest(sax.ajaxUpdateItem, 50); + sax.ajax.updateItem = sax.ajax.updateItem || { url: sax.url.base + 'Organisation/Ajax/GetMember', formId: 'frmMemberId', callbackFn: sax.onUpdateItem }; + sax.doAjaxRequest(sax.ajax.updateItem, 50); } sax.onUpdateItem = function (response) { @@ -175,8 +175,8 @@ //-------------------------------------------------------------- sax.storeItem = function () { - sax.ajaxStoreItem = sax.ajaxStoreItem || { url: sax.url.base + 'Organisation/Ajax/StoreMember', formId: 'frmMember', callbackFn: sax.onStoreItem }; - sax.doAjaxRequest(sax.ajaxStoreItem, 50); + sax.ajax.storeItem = sax.ajax.storeItem || { url: sax.url.base + 'Organisation/Ajax/StoreMember', formId: 'frmMember', callbackFn: sax.onStoreItem }; + sax.doAjaxRequest(sax.ajax.storeItem, 50); } sax.onStoreItem = function (response) { diff --git a/SaxoniteCoreWebAdmin/wwwroot/js/sax-region.js b/SaxoniteCoreWebAdmin/wwwroot/js/sax-region.js index a3da3bd..849bafb 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/js/sax-region.js +++ b/SaxoniteCoreWebAdmin/wwwroot/js/sax-region.js @@ -16,8 +16,8 @@ var $items = $('.sax-panel-item-list', $results).fadeOut(200).empty(); var $msgs = $('.sax-panel-messages', $results).hide().empty().append($('
' + sax.msg.dataQuerying + '
')).fadeIn(200); } - sax.ajaxRefreshResults = sax.ajaxRefreshResults || { url: sax.url.base + 'Region/Ajax/GetList', formId: 'frmRegionFilter', callbackFn: sax.doRefreshResults }; - sax.doAjaxRequest(sax.ajaxRefreshResults, delay || 50); + sax.ajax.refreshResults = sax.ajax.refreshResults || { url: sax.url.base + 'Region/Ajax/GetList', formId: 'frmRegionFilter', callbackFn: sax.doRefreshResults }; + sax.doAjaxRequest(sax.ajax.refreshResults, delay || 50); sax.awaitingRefreshResponse = true; } sax.doRefreshResults = function (response) @@ -110,8 +110,8 @@ sax.updateItem = function (id) { $('.RegionId', sax.$frm.regionId).val(id); - sax.ajaxUpdateItem = sax.ajaxUpdateItem || { url: sax.url.base + 'Region/Ajax/GetItem', formId: 'frmRegionId', callbackFn: sax.onUpdateItem }; - sax.doAjaxRequest(sax.ajaxUpdateItem, 50); + sax.ajax.updateItem = sax.ajax.updateItem || { url: sax.url.base + 'Region/Ajax/GetItem', formId: 'frmRegionId', callbackFn: sax.onUpdateItem }; + sax.doAjaxRequest(sax.ajax.updateItem, 50); } sax.onUpdateItem = function (response) { @@ -139,8 +139,8 @@ //-------------------------------------------------------------- sax.storeItem = function () { - sax.ajaxStoreItem = sax.ajaxStoreItem || { url: sax.url.base + 'Region/Ajax/StoreItem', formId: 'frmRegion', callbackFn: sax.onStoreItem }; - sax.doAjaxRequest(sax.ajaxStoreItem, 50); + sax.ajax.storeItem = sax.ajax.storeItem || { url: sax.url.base + 'Region/Ajax/StoreItem', formId: 'frmRegion', callbackFn: sax.onStoreItem }; + sax.doAjaxRequest(sax.ajax.storeItem, 50); } sax.onStoreItem = function (response) { diff --git a/SaxoniteCoreWebAdmin/wwwroot/js/sax-security.js b/SaxoniteCoreWebAdmin/wwwroot/js/sax-security.js index 8bb2c8a..8de2041 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/js/sax-security.js +++ b/SaxoniteCoreWebAdmin/wwwroot/js/sax-security.js @@ -10,8 +10,8 @@ sax.doSignin = function () { sax.clearControlErrors(); - sax.ajaxSignin = sax.ajaxSignin || { url: sax.url.base + 'Security/Ajax/Signin', formId: 'frmSignIn', callbackFn: sax.onSignin }; - sax.doAjaxRequest(sax.ajaxSignin, 50); + sax.ajax.signin = sax.ajax.signin || { url: sax.url.base + 'Security/Ajax/Signin', formId: 'frmSignIn', callbackFn: sax.onSignin }; + sax.doAjaxRequest(sax.ajax.signin, 50); } sax.onSignin = function (response) { @@ -24,8 +24,8 @@ //-------------------------------------------------------------- sax.doScorePassword = function () { - sax.ajaxScorePassword = sax.ajaxScorePassword || { url: sax.url.base + 'Security/Ajax/ScorePassword', formId: 'frmChangePassword', callbackFn: sax.onScorePassword, noWaitIcon: true }; - sax.doAjaxRequest(sax.ajaxScorePassword, 250); + sax.ajax.scorePassword = sax.ajax.scorePassword || { url: sax.url.base + 'Security/Ajax/ScorePassword', formId: 'frmChangePassword', callbackFn: sax.onScorePassword, noWaitIcon: true }; + sax.doAjaxRequest(sax.ajax.scorePassword, 250); } sax.onScorePassword = function (response) { @@ -37,8 +37,8 @@ sax.doChangePassword = function () { sax.clearControlErrors(); - sax.ajaxChangePassword = sax.ajaxChangePassword || { url: sax.url.base + 'Security/Ajax/StorePassword', formId: 'frmChangePassword', callbackFn: sax.onChangePassword }; - sax.doAjaxRequest(sax.ajaxChangePassword, 50); + sax.ajax.changePassword = sax.ajax.changePassword || { url: sax.url.base + 'Security/Ajax/StorePassword', formId: 'frmChangePassword', callbackFn: sax.onChangePassword }; + sax.doAjaxRequest(sax.ajax.changePassword, 50); } sax.onChangePassword = function (response) { @@ -53,8 +53,8 @@ sax.doRequestPassword = function () { sax.clearControlErrors(); - sax.ajaxRequestPassword = sax.ajaxRequestPassword || { url: sax.url.base + 'Security/Ajax/RequestNewPassword', formId: 'frmRequestPassword', callbackFn: sax.onRequestPassword }; - sax.doAjaxRequest(sax.ajaxRequestPassword, 50); + sax.ajax.requestPassword = sax.ajax.requestPassword || { url: sax.url.base + 'Security/Ajax/RequestNewPassword', formId: 'frmRequestPassword', callbackFn: sax.onRequestPassword }; + sax.doAjaxRequest(sax.ajax.requestPassword, 50); } sax.onRequestPassword = function (response) { diff --git a/SaxoniteCoreWebAdmin/wwwroot/js/sax-sport.js b/SaxoniteCoreWebAdmin/wwwroot/js/sax-sport.js index ae02e08..46e382f 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/js/sax-sport.js +++ b/SaxoniteCoreWebAdmin/wwwroot/js/sax-sport.js @@ -16,8 +16,8 @@ var $items = $('.sax-panel-item-list', $results).fadeOut(200).empty(); var $msgs = $('.sax-panel-messages', $results).hide().empty().append($('
' + sax.msg.dataQuerying + '
')).fadeIn(200); } - sax.ajaxRefreshResults = sax.ajaxRefreshResults || { url: sax.url.base + 'Sport/Ajax/GetList', formId: 'frmSportFilter', callbackFn: sax.doRefreshResults }; - sax.doAjaxRequest(sax.ajaxRefreshResults, delay || 50); + sax.ajax.refreshResults = sax.ajax.refreshResults || { url: sax.url.base + 'Sport/Ajax/GetList', formId: 'frmSportFilter', callbackFn: sax.doRefreshResults }; + sax.doAjaxRequest(sax.ajax.refreshResults, delay || 50); sax.awaitingRefreshResponse = true; } sax.doRefreshResults = function (response) @@ -78,8 +78,8 @@ sax.updateItem = function (id) { $('.SportId', sax.$frm.sportId).val(id); - sax.ajaxUpdateItem = sax.ajaxUpdateItem || { url: sax.url.base + 'Sport/Ajax/GetItem', formId: 'frmSportId', callbackFn: sax.onUpdateItem }; - sax.doAjaxRequest(sax.ajaxUpdateItem, 50); + sax.ajax.updateItem = sax.ajax.updateItem || { url: sax.url.base + 'Sport/Ajax/GetItem', formId: 'frmSportId', callbackFn: sax.onUpdateItem }; + sax.doAjaxRequest(sax.ajax.updateItem, 50); } sax.onUpdateItem = function (response) { @@ -103,8 +103,8 @@ //-------------------------------------------------------------- sax.storeItem = function () { - sax.ajaxStoreItem = sax.ajaxStoreItem || { url: sax.url.base + 'Sport/Ajax/StoreItem', formId: 'frmSport', callbackFn: sax.onStoreItem }; - sax.doAjaxRequest(sax.ajaxStoreItem, 50); + sax.ajax.storeItem = sax.ajax.storeItem || { url: sax.url.base + 'Sport/Ajax/StoreItem', formId: 'frmSport', callbackFn: sax.onStoreItem }; + sax.doAjaxRequest(sax.ajax.storeItem, 50); } sax.onStoreItem = function (response) { diff --git a/SaxoniteCoreWebAdmin/wwwroot/js/sax-sys-db.js b/SaxoniteCoreWebAdmin/wwwroot/js/sax-sys-db.js index a8acc44..abc8fd1 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/js/sax-sys-db.js +++ b/SaxoniteCoreWebAdmin/wwwroot/js/sax-sys-db.js @@ -16,8 +16,8 @@ var $items = $('.sax-panel-item-list', $results).fadeOut(200).empty(); var $msgs = $('.sax-panel-messages', $results).hide().empty().append($('
' + sax.msg.dataQuerying + '
')).fadeIn(200); } - sax.ajaxRefreshResults = sax.ajaxRefreshResults || { url: sax.url.base + 'System/Ajax/GetDatabaseTables', formId: 'frmDatabaseFilter', callbackFn: sax.doRefreshResults }; - sax.doAjaxRequest(sax.ajaxRefreshResults, delay || 50); + sax.ajax.refreshResults = sax.ajax.refreshResults || { url: sax.url.base + 'System/Ajax/GetDatabaseTables', formId: 'frmDatabaseFilter', callbackFn: sax.doRefreshResults }; + sax.doAjaxRequest(sax.ajax.refreshResults, delay || 50); sax.awaitingRefreshResponse = true; } sax.doRefreshResults = function (response) @@ -60,8 +60,8 @@ sax.viewItem = function (id) { $('.DatabaseTableName', sax.$frm.dbTableName).val(id); - sax.ajaxUpdateItem = sax.ajaxUpdateItem || { url: sax.url.base + 'System/Ajax/GetDatabaseTable', formId: 'frmDatabaseTableName', callbackFn: sax.onViewItem }; - sax.doAjaxRequest(sax.ajaxUpdateItem, 50); + sax.ajax.updateItem = sax.ajax.updateItem || { url: sax.url.base + 'System/Ajax/GetDatabaseTable', formId: 'frmDatabaseTableName', callbackFn: sax.onViewItem }; + sax.doAjaxRequest(sax.ajax.updateItem, 50); } sax.onViewItem = function (response) { diff --git a/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx b/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx index b07f9ba..a3d5fbc 100644 --- a/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx +++ b/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx @@ -258,6 +258,12 @@ Created + + Date of birth + + + Day + Delete @@ -282,6 +288,9 @@ Forgotten password? + + Gender + Good @@ -306,12 +315,18 @@ Members + + Month + Name No + + Not specified + Officiating @@ -441,6 +456,9 @@ Very Good + + Year + Yes diff --git a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Contact.cs b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Contact.cs index 6e9341f..20e8c74 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Contact.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/AccountController-Ajax-Contact.cs @@ -35,6 +35,11 @@ namespace Saxonite.Net.Core.Web.Online.Controllers public String Title { get; set; } public String FirstName { get; set; } public String LastName { get; set; } + public byte Gender { get; set; } + public String GenderCaption{ get; set; } + public byte DobDay { get; set; } + public byte DobMonth{ get; set; } + public short DobYear{ get; set; } // Regions. public int RegionIdCountry { get; set; } public String RegionCaptionCountry { get; set; } @@ -49,6 +54,12 @@ namespace Saxonite.Net.Core.Web.Online.Controllers data.Title = userAccount.Title; data.FirstName = userAccount.FirstName; data.LastName = userAccount.LastName; + data.Gender = (byte)userAccount.Gender; + data.GenderCaption = Localiser.GetGenderCaption(userAccount.Gender); + data.DobDay= (byte)userAccount.DateOfBirthDay; + data.DobMonth = (byte)userAccount.DateOfBirthMonth; + data.DobYear = (short)userAccount.DateOfBirthYear; + // Regions. data.RegionIdCountry = SysId.ToInt(userAccount.RegionIdCountry); data.RegionIdProvince = SysId.ToInt(userAccount.RegionIdProvince); using (SaxRegion regionCountry = Internals.GetRegion(userAccount.RegionIdCountry)) @@ -77,6 +88,9 @@ namespace Saxonite.Net.Core.Web.Online.Controllers public AjaxResponse_AccountContactData(SaxModel_Online model) : base(model) { } // Contact details. public ContactResponseData Contact { get; set; } + // Reference data. + public List Genders { get; } = new List(); + public List Months { get; } = new List(); } // Ajax request. [HttpPost] @@ -92,6 +106,15 @@ namespace Saxonite.Net.Core.Web.Online.Controllers if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); RefreshModel(model); + // Reference data - Genders. + responseData.Genders.Add("", Localiser["label.not.specified"]); + foreach (TypeCodeDesc gender in Internals.GenderCodes) + responseData.Genders.Add(gender.Type.ToString(), Localiser.GetGenderCaption((Sax.Gender)gender.Type)); + + // Reference data - Months. + for (int month= 1; month <= 12; month++) + responseData.Months.Add(month.ToString(), DateUtil.Format(new DateTime(DateTime.Today.Year, month, 1), "MMMM", SessionCulture)); + // Retrieve user details. SaxUserAccount userAccount = AccountMgr.GetUserAccountById(SessionData.User.UserAccountId); if (userAccount == null) @@ -101,7 +124,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers } // Logically delete any previous 'Uploaded' Avatar image. - ItemId userItemId = GetUserItemId(SessionData.User.UserAccountId); + ItemId userItemId = userAccount.GetItemId(); SaxItemImage itemImageAvatarUploaded = ItemDataMgr.GetItemImage(userItemId, Sax.ImageType.AvatarUpload, SaxItemImage.StatusCat.ActiveOnly); if (itemImageAvatarUploaded != null) { @@ -257,6 +280,27 @@ namespace Saxonite.Net.Core.Web.Online.Controllers userAccount.FirstName = model.AccountFirstName; if (model.AccountLastName != null) userAccount.LastName = model.AccountLastName; + if (model.AccountGender != null) + userAccount.Gender = model.GetAccountGender(); + // Date of birth. + if (model.AccountDobYear != null) + userAccount.DateOfBirthYear = StringUtil.ToShort(model.AccountDobYear); + if (userAccount.DateOfBirthYear > 0) + { + if (model.AccountDobMonth != null) + userAccount.DateOfBirthMonth = (byte)StringUtil.ToShort(model.AccountDobMonth); + if (userAccount.DateOfBirthMonth > 0) + { + if (model.AccountDobDay != null) + userAccount.DateOfBirthDay = (byte)StringUtil.ToShort(model.AccountDobDay); + } + else userAccount.DateOfBirthDay = 0; + } + else + { + userAccount.DateOfBirthMonth = 0; + userAccount.DateOfBirthDay= 0; + } // Regions. if (model.AccountRegionIdCountry != null) userAccount.RegionIdCountry = model.AccountRegionIdCountry.ToSysId(); @@ -279,7 +323,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers RefreshSessionProfileContact(userAccount); // Check for uploaded profile image. - ItemId userItemId = GetUserItemId(SessionData.User.UserAccountId); + ItemId userItemId = userAccount.GetItemId(); SaxItemImage itemImageAvatarUploaded = ItemDataMgr.GetItemImage(userItemId, Sax.ImageType.AvatarUpload, SaxItemImage.StatusCat.ActiveOnly); if (itemImageAvatarUploaded != null) { diff --git a/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs b/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs index 0eaa09a..b1b9507 100644 --- a/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs +++ b/SaxoniteCoreWebOnline/Online/Models/Model_Account.cs @@ -33,6 +33,14 @@ namespace Saxonite.Net.Core.Web.Online.Models public String AccountTitle { get; set; } public String AccountFirstName { get; set; } public String AccountLastName { get; set; } + public String AccountGender { get; set; } + public Sax.Gender GetAccountGender() + { + return (Sax.Gender)StringUtil.ToShort(AccountGender); + } + public String AccountDobDay { get; set; } + public String AccountDobMonth{ get; set; } + public String AccountDobYear{ get; set; } // Regions. public String AccountRegionIdCountry { get; set; } public String AccountRegionCaptionCountry { get; } @@ -60,8 +68,10 @@ namespace Saxonite.Net.Core.Web.Online.Models } //------------------------------------------------------------------- + // Validate users's contact details. public bool ValidateContactDetails(SaxController_Base.AjaxResponse_Data responseData) { + //--------------------------------------------------------------- // Title. if (AccountTitle != null) { @@ -92,6 +102,31 @@ namespace Saxonite.Net.Core.Web.Online.Models responseData.SetControlError(nameof(AccountLastName), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_LastName)]); } + //--------------------------------------------------------------- + // Date of birth. + if (AccountDobYear != null) + { + responseData.SetControlValue(nameof(AccountDobYear), AccountDobYear); + short dobYear = StringUtil.ToShort(AccountDobYear); + if (!StringUtil.IsNumeric(AccountDobYear) || dobYear > DateTime.Today.Year) + responseData.SetControlError(nameof(AccountDobYear), Localiser["msg.validation.invalid.value"]); + } + if (AccountDobMonth != null) + { + responseData.SetControlValue(nameof(AccountDobMonth), AccountDobMonth); + short dobMonth = StringUtil.ToShort(AccountDobMonth); + if (!StringUtil.IsEmpty(AccountDobMonth) && (!StringUtil.IsNumeric(AccountDobMonth) || dobMonth < 0 || dobMonth > 12)) + responseData.SetControlError(nameof(AccountDobMonth), Localiser["msg.validation.invalid.value"]); + } + if (AccountDobDay != null) + { + responseData.SetControlValue(nameof(AccountDobDay), AccountDobDay); + short dobDay = StringUtil.ToShort(AccountDobDay); + if (!StringUtil.IsEmpty(AccountDobDay) && (!StringUtil.IsNumeric(AccountDobDay) || dobDay < 0 || dobDay > 31)) + responseData.SetControlError(nameof(AccountDobDay), Localiser["msg.validation.invalid.value"]); + } + + //--------------------------------------------------------------- // Country Region. if (AccountRegionIdCountry != null && SysId.IsValid(AccountRegionIdCountry.ToSysId())) { diff --git a/SaxoniteCoreWebOnline/Views/Account/Profile-Contact.cshtml b/SaxoniteCoreWebOnline/Views/Account/Profile-Contact.cshtml index 7d52cb4..41b2fca 100644 --- a/SaxoniteCoreWebOnline/Views/Account/Profile-Contact.cshtml +++ b/SaxoniteCoreWebOnline/Views/Account/Profile-Contact.cshtml @@ -7,7 +7,7 @@
-
@Localiser["account.caption.profile.contact"]
+
@Localiser["account.caption.profile.contact"]
@* Burger menu *@