v1.3.0 Restructure Saxonite workspace and upgrade to .NET 10 (#1)

Move Saxonite’s projects into a dedicated `Workspace` folder and align the solution with .NET 10 and the current Common workspace. Update encryption integration, test project structure and coverage, and repository guidance and upgrade notes.

- Relocate application and library projects while retaining Git rename history.
- Split tests into Admin, Online, and Shared projects; add representative behavioral and serialization tests.
- Update Common integration, application version, and repository documentation.

Application version: 1.3.0

Reviewed-on: #1
Co-authored-by: andy <andy@sarand.com>
This commit was merged in pull request #1.
This commit is contained in:
2026-10-16 18:24:16 +01:00
committed by andy
parent 2c3fb146ab
commit 9f22b522df
1996 changed files with 1992 additions and 1179 deletions
@@ -0,0 +1,24 @@
using Saxonite.Net.Core.Web.Base.App;
using System;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
public class ErrorViewModel : SaxModel_Admin
{
//-------------------------------------------------------------------
// Construction.
public ErrorViewModel(SaxLocaliser localiser) :
base(localiser)
{
}
//-------------------------------------------------------------------
public string RequestId { get; set; }
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,156 @@
using Sacs.Web.Components;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Utils;
using Saxonite.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 System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
/// <summary>
/// Address model data properties.
/// </summary>
public class ModelData_Address : ModelData_Admin
{
//-------------------------------------------------------------------
// Construction.
public ModelData_Address(SaxModel_Admin model, String controlNameSuffix) : base(model)
{
this.ControlNameSuffix = StringUtil.EmptyOnNull(controlNameSuffix) + "Address";
}
//-------------------------------------------------------------------
// Properties.
private String ControlNameSuffix { get; }
// Address properties.
public String Id { get; set; }
public String Line1 { get; set; }
public String Line2 { get; set; }
public String Line3 { get; set; }
public String Town { get; set; }
public String Province { get; set; }
public String RegionIdProvince { get; set; }
public String RegionIdCountry { get; set; }
public String PostalCode { get; set; }
//-------------------------------------------------------------------
// Utilities.
/// <summary>Have any address values been supplied by the form.</summary>
public bool IsSpecified()
{
if (Id != null || Line1 != null || Town != null || Province != null || RegionIdCountry != null || PostalCode != null)
return true;
return false;
}
/// <summary>Have any address values been populated on the form.</summary>
public bool IsPopulated()
{
if (SysId.IsValid(SysId.ToSysId(Id)) || !StringUtil.IsEmpty(Line1) || !StringUtil.IsEmpty(Town) || !StringUtil.IsEmpty(Province) || !StringUtil.IsEmpty(RegionIdCountry) || !StringUtil.IsEmpty(PostalCode))
return true;
return false;
}
//-------------------------------------------------------------------
// Validation.
//-------------------------------------------------------------------
// Address.
public bool ValidateAddressData(SaxModel_Admin model, SaController.AjaxResponse_Data responseData)
{
// Are any properties populated.
bool populated = IsPopulated();
// Address Line 1 - optional.
if (Line1 != null)
{
responseData.SetControlValue(ControlNameSuffix + "Line1", Line1);
if (StringUtil.GetLength(Line1) > Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.ItemAddress_Line1))
responseData.SetControlError(ControlNameSuffix + "Line1", Model.Localiser["msg.validation.maximum.length", Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.ItemAddress_Line1)]);
}
// Address Line 2 - optional.
if (Line2 != null)
{
responseData.SetControlValue(ControlNameSuffix + "Line2", Line2);
if (!StringUtil.IsEmpty(Line2))
{
if (StringUtil.GetLength(Line2) > Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.ItemAddress_Line2))
responseData.SetControlError(ControlNameSuffix + "Line2", Model.Localiser["msg.validation.maximum.length", Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.ItemAddress_Line2)]);
}
}
// Address Line 3 - optional.
if (Line3 != null)
{
responseData.SetControlValue(ControlNameSuffix + "Line3", Line3);
if (!StringUtil.IsEmpty(Line3))
{
if (StringUtil.GetLength(Line3) > Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.ItemAddress_Line3))
responseData.SetControlError(ControlNameSuffix + "Line3", Model.Localiser["msg.validation.maximum.length", Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.ItemAddress_Line3)]);
}
}
// Address Town - mandatory if any value populated.
if (Town != null)
{
String controlName = ControlNameSuffix + nameof(Town);
responseData.SetControlValue(controlName, Town);
if (StringUtil.IsEmpty(Town) && populated)
responseData.SetControlError(controlName, Model.Localiser["msg.validation.mandatory.value"]);
else if (StringUtil.GetLength(Town) > Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.ItemAddress_Town))
responseData.SetControlError(controlName, Model.Localiser["msg.validation.maximum.length", Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.ItemAddress_Town)]);
}
// Address Province - optional.
if (Province != null)
{
String controlName = ControlNameSuffix + nameof(Province);
responseData.SetControlValue(controlName, Province);
if (!StringUtil.IsEmpty(Province))
{
if (StringUtil.GetLength(Province) > Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.ItemAddress_Province))
responseData.SetControlError(controlName, Model.Localiser["msg.validation.maximum.length", Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.ItemAddress_Province)]);
}
}
// Address Country - mandatory if any value populated.
if (RegionIdCountry != null)
{
String controlName = ControlNameSuffix + nameof(RegionIdCountry);
if (!SysId.IsValid(SysId.ToSysId(RegionIdCountry)) && populated)
responseData.SetControlError(controlName, Model.Localiser["msg.validation.mandatory.value"]);
else if (SysId.IsValid(SysId.ToSysId(RegionIdCountry)))
{
SaxRegion.Data region = model.Internals.GetRegion(SysId.ToSysId(RegionIdCountry));
if (region == null || region.RegionType != Sax.RegionType.Country)
responseData.SetControlError(controlName, Model.Localiser["msg.validation.invalid.value"]);
}
}
// Address PostalCode - optional.
if (PostalCode != null)
{
responseData.SetControlValue(ControlNameSuffix + "PostalCode", PostalCode);
if (!StringUtil.IsEmpty(PostalCode))
{
if (StringUtil.GetLength(PostalCode) > Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.ItemAddress_PostalCode))
responseData.SetControlError(ControlNameSuffix + "PostalCode", Model.Localiser["msg.validation.maximum.length", Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.ItemAddress_PostalCode)]);
}
}
return !responseData.HasControlErrors();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,38 @@
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Utils;
using Saxonite.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 System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
/// <summary>
/// Online model data.
/// </summary>
public class ModelData_Admin
{
//-------------------------------------------------------------------
// Construction.
public ModelData_Admin(SaxModel_Admin model)
{
this.Model = model;
}
//-------------------------------------------------------------------
// Properties.
public SaxModel_Admin Model { get; }
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,28 @@
using Saxonite.Net.Core.Web.Base.App;
using Saxonite.Net.Core.Web.Base.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
public class Model_ContactMethod : SaxModel_Admin
{
//-------------------------------------------------------------------
// Construction.
public Model_ContactMethod(SaxLocaliser localiser) :
base(localiser)
{
}
//-------------------------------------------------------------------
// Form properties.
public String ContactMethod { get; set; }
public String ContactValue { get; set; }
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,24 @@
using Saxonite.Net.Core.Web.Base.App;
using Saxonite.Net.Core.Web.Base.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
public class Model_Home : SaxModel_Admin
{
//-------------------------------------------------------------------
// Construction.
public Model_Home(SaxLocaliser localiser) :
base(localiser)
{
AdditionalFiles_JS.Add("js/sax-home.js");
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,245 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Rendering;
using Sarand.Net.Standard.Base.App;
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.Standard.Base.App;
using Saxonite.Net.Standard.Base.Bus;
using Saxonite.Net.Standard.Base.Helpers;
using System;
using System.Collections.Generic;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
public class Model_Organisation : SaxModel_Admin
{
//-------------------------------------------------------------------
// Construction.
public Model_Organisation(SaxLocaliser localiser) :
base(localiser)
{
AdditionalFiles_JS.Add("js/sax-org.js");
Address = new ModelData_Address(this, "");
}
//-------------------------------------------------------------------
// Organisation filter properties.
public class FilterData
{
public String Organisation { get; set; }
public String OrganisationTypeCode { get; set; }
public String OrganisationCategoryCode { get; set; }
public String OrganisationSportId { get; set; }
public String OrganisationSportName { get; set; }
public String OrganisationRegionId { get; set; }
public String OrganisationRegionName { get; set; }
public String OrganisationStatusCategoryCode { get; set; }
}
public FilterData Filter { get; } = new FilterData();
public Sax.OrganisationType FilterOrganisationType
{
get { return (Sax.OrganisationType)OrganisationTypeCodes.GetTypeForCode(Filter.OrganisationTypeCode); }
}
public Sax.OrganisationCategory FilterOrganisationCategory
{
get { return (Sax.OrganisationCategory)OrganisationCategoryCodes.GetTypeForCode(Filter.OrganisationCategoryCode); }
}
public SaxOrganisation.StatusCat FilterOrganisationStatusCategory
{
get { return EnumUtil.ParseEnum(Filter.OrganisationStatusCategoryCode, SaxOrganisation.StatusCat.Any); }
}
/// <summary>Organisation Status Categories for filter.</summary>
public IEnumerable<SelectListItem> OrganisationFilterStatusCategoriesForSelect
{
get
{
List<CodeDesc> statusCategories = new List<CodeDesc>();
statusCategories.Add(SaxOrganisation.StatusCat.Any.ToString(), Localiser["label.any"]);
statusCategories.Add(SaxOrganisation.StatusCat.AwaitingOnly.ToString(), "Awaiting");
statusCategories.Add(SaxOrganisation.StatusCat.ActiveOnly.ToString(), "Active");
statusCategories.Add(SaxOrganisation.StatusCat.InactiveOnly.ToString(), "Inactive");
statusCategories.Add(SaxOrganisation.StatusCat.NotDeleted.ToString(), "Not deleted");
statusCategories.Add(SaxOrganisation.StatusCat.DeletedOnly.ToString(), "Deleted");
return new SelectList(statusCategories, "Code", "Desc", SaxOrganisation.StatusCat.Any.ToString());
}
}
//-------------------------------------------------------------------
// Organisation properties.
public String OrganisationId { get; set; }
public String OrganisationName { get; set; }
public String OrganisationTypeValue { get; set; }
public Sax.OrganisationType OrganisationType { get { return (Sax.OrganisationType)OrganisationTypeCodes.GetTypeForCode(OrganisationTypeValue); } }
public String OrganisationCategoryValue { get; set; }
public Sax.OrganisationCategory OrganisationCategory { get { return (Sax.OrganisationCategory)OrganisationCategoryCodes.GetTypeForCode(OrganisationCategoryValue); } }
public String OrganisationSportId { get; set; }
public String OrganisationRegionIdPrimary { get; set; }
public String OrganisationAbout { get; set; }
public String OrganisationFacilities { get; set; }
// Common properties.
public String OrganisationNotes { get; set; }
public String OrganisationStatusCode { get; set; }
public SaStatus OrganisationStatus { get { return SacsSystem.GetStatusForCode(OrganisationStatusCode); } }
// Contact Methods.
/// <summary>Placeholder field value to indicate the number of Contact Methods in form (even if none are populated).</summary>
public String ContactMethods { get; set; }
public String[] ContactMethod { get; set; }
public String[] ContactValue { get; set; }
/// <summary>Contact methods to be populated during validation.</summary>
public SaxContactData ContactData { get; set; }
// Address.
public ModelData_Address Address { get; }
//-------------------------------------------------------------------
// Images.
public List<IFormFile> OrganisationLogoImage { get; set; }
//-------------------------------------------------------------------
// Utilities.
public bool IsSportMandatory()
{
return SaxOrganisation.IsSportMandatory(OrganisationCategory);
}
//-------------------------------------------------------------------
// Validation.
//-------------------------------------------------------------------
// Organisation validation.
public bool ValidateOrganisationData(SaxController_Base.AjaxResponse_Data responseData)
{
String fn = this.GetType().Name + ".ValidateOrganisationData";
// Organisation name.
if (OrganisationName != null)
{
responseData.SetControlValue(nameof(OrganisationName), OrganisationName);
if (StringUtil.IsEmpty(OrganisationName))
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)]);
}
// Organisation type.
if (OrganisationTypeValue != null)
{
if (StringUtil.IsEmpty(OrganisationTypeValue))
responseData.SetControlError(nameof(OrganisationTypeValue), Localiser["msg.validation.mandatory.value"]);
}
// Organisation category.
if (OrganisationCategoryValue != null)
{
if (StringUtil.IsEmpty(OrganisationCategoryValue))
responseData.SetControlError(nameof(OrganisationCategoryValue), Localiser["msg.validation.mandatory.value"]);
}
// Organisation sport.
if (OrganisationSportId != null)
{
if (SysId.IsValid(SysId.ToSysId(OrganisationSportId)) || IsSportMandatory())
{
using (SaxSport sport = ReferenceMgr.GetSportById(SysId.ToSysId(OrganisationSportId)))
{
if (sport == null)
responseData.SetControlError(nameof(OrganisationSportId), Localiser["msg.validation.invalid.value"]);
}
}
}
// Organisation primary region.
if (OrganisationRegionIdPrimary != null)
{
using (SaxRegion region = ReferenceMgr.GetRegionById(SysId.ToSysId(OrganisationRegionIdPrimary)))
{
if (region == null)
responseData.SetControlError(nameof(OrganisationRegionIdPrimary), Localiser["msg.validation.invalid.value"]);
else if (region.RegionType != Sax.RegionType.Country && region.RegionType != Sax.RegionType.Continent && region.RegionType != Sax.RegionType.World)
responseData.SetControlError(nameof(OrganisationRegionIdPrimary), "Organisation region must be a country or international region");
}
if (!StringUtil.IsEmpty(OrganisationName))
{
// Name must be unqiue within region.
SaxOrganisation.Params prmOrganisation = new SaxOrganisation.Params();
if (SysId.IsValid(SysId.ToSysId(OrganisationId)))
prmOrganisation.IdsExcluded.Add(SysId.ToSysId(OrganisationId));
prmOrganisation.NameFull = OrganisationName;
prmOrganisation.RegionIdsIncluded.Add(SysId.ToSysId(OrganisationRegionIdPrimary));
prmOrganisation.StatusCat = SaxOrganisation.StatusCat.Any;
if (AccountMgr.GetOrganisationCount(prmOrganisation) > 0)
responseData.SetControlError(nameof(OrganisationName), Localiser["msg.validation.duplicate.value"]);
}
}
// Organisation about.
if (OrganisationAbout != null)
{
responseData.SetControlValue(nameof(OrganisationAbout), OrganisationAbout);
if (StringUtil.GetLength(OrganisationAbout) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Organisation_About))
responseData.SetControlError(nameof(OrganisationAbout), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Organisation_About)]);
}
// Organisation facilities.
if (OrganisationFacilities != null)
{
responseData.SetControlValue(nameof(OrganisationFacilities), OrganisationFacilities);
if (StringUtil.GetLength(OrganisationFacilities) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Organisation_Facilities))
responseData.SetControlError(nameof(OrganisationFacilities), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Organisation_Facilities)]);
}
// Contact Methods.
if (ContactMethods != null)
{
ContactData = new SaxContactData("");
ContactMethod = ContactMethod ?? new String[0];
ContactValue = ContactValue ?? new String[0];
for (int idx = 0; idx < ContactMethod.Length && idx < ContactValue.Length; idx++)
{
String methodValue = ContactMethod[idx];
String value = ContactValue[idx];
if (methodValue == null && value == null) continue;
Sax.ContactMethod method = EnumUtil.ParseEnum(methodValue, Sax.ContactMethod.Unknown);
if (method > 0 && !value.IsEmpty() && SaxContactMethodHelper.IsValidContactMethodValue(method, value))
ContactData.SetContactMethodValue(method, value);
else SaLogger.Warn(fn + " Invalid Contact Method data. Method: " + methodValue + ". Value: " + value);
}
if (ContactData.Methods.Count != ContactMethods.ToInt())
{
SaLogger.Warn(fn + " Inconsistent Contact Methods received. Expected: " + ContactMethods + ". Received: " + ContactData.Methods.Count);
responseData.SetPopupMessage(Localiser["caption.contact.method"], "System error");
}
}
// Organisation notes.
if (OrganisationNotes != null)
{
responseData.SetControlValue(nameof(OrganisationNotes), OrganisationNotes);
if (StringUtil.GetLength(OrganisationNotes) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Organisation_Notes))
responseData.SetControlError(nameof(OrganisationNotes), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Organisation_Notes)]);
}
// Organisation status.
if (OrganisationStatusCode != null)
{
if (StringUtil.IsEmpty(OrganisationStatusCode))
responseData.SetControlError(nameof(OrganisationStatus), Localiser["msg.validation.mandatory.value"]);
else if (!SaxOrganisation.ValidStatuses.Contains(OrganisationStatus))
responseData.SetControlError(nameof(OrganisationStatus), Localiser["msg.validation.invalid.value"]);
}
// Validate address fields.
if (Address != null)
Address.ValidateAddressData(this, responseData);
return !responseData.HasControlErrors();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,44 @@
using Sarand.Net.Standard.Base.App;
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.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
/// <summary>
/// Model for Organisation Activation.
/// <para>NB Only used for Ajax activation request.</para>
/// </summary>
public class Model_OrganisationActivation : SaxModel_Admin
{
//-------------------------------------------------------------------
// Construction.
public Model_OrganisationActivation(SaxLocaliser localiser) :
base(localiser)
{
}
//-------------------------------------------------------------------
// Organisation properties.
public String OrganisationId { get; set; }
/// <summary>
/// List of User Organisation Ids that were offered for activation.
/// </summary>
public List<String> OrganisationMemberIds { get; set; }
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,149 @@
using Sarand.Net.Standard.Base.App;
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.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
public class Model_OrganisationAssociations : SaxModel_Admin
{
//-------------------------------------------------------------------
// Definitions.
//-------------------------------------------------------------------
// Construction.
public Model_OrganisationAssociations(SaxLocaliser localiser) :
base(localiser)
{
AdditionalFiles_JS.Add("js/sax-org-ass.js");
}
//-------------------------------------------------------------------
// List configuration.
public class FilterData
{
public String OrganisationId { get; set; }
public String OrganisationName { get; set; }
}
public FilterData Filter { get; } = new FilterData();
//-------------------------------------------------------------------
// Item association.
public String ItemAssociationId { get; set; }
/// <summary>Flag to indicate that a new association needs to be created - must be consistent with validity of Item Association Id.</summary>
public String NewItem { get; set; }
// Organisation.
public String OrganisationId { get; set; }
// Associated organisation.
public String OrganisationIdAssoc { get; set; }
public class AssociationData
{
// Association type option.
public String TypeOption { get; set; }
public Sax.AssociationTypeOption GetAssociationTypeOption() { return EnumUtil.ParseEnum(TypeOption, Sax.AssociationTypeOption.Unknown); }
// Association properties.
public String StatusCode { get; set; }
public SaStatus GetStatus() { return SacsSystem.GetStatusForCode(StatusCode); }
}
public AssociationData Association { get; } = new AssociationData();
//-------------------------------------------------------------------
// Utilities.
public bool IsAssociationTypeDirectionReversed(Sax.AssociationTypeOption associationTypeOption)
{
switch (associationTypeOption)
{
case Sax.AssociationTypeOption.AffiliateChild:
return true;
}
return false;
}
public Sax.AssociationType GetAssociationTypeForOption(Sax.AssociationTypeOption associationTypeOption)
{
switch (associationTypeOption)
{
case Sax.AssociationTypeOption.AffiliateParent:
case Sax.AssociationTypeOption.AffiliateChild:
return Sax.AssociationType.Affiliate;
case Sax.AssociationTypeOption.Partner:
return Sax.AssociationType.Partner;
}
return Sax.AssociationType.Unknown;
}
public bool IsConsistentWith(Sax.AssociationTypeOption associationTypeOption, Sax.AssociationType associationType)
{
switch (associationType)
{
case Sax.AssociationType.Affiliate:
return new List<Sax.AssociationTypeOption>() { Sax.AssociationTypeOption.AffiliateChild, Sax.AssociationTypeOption.AffiliateParent }.Contains(associationTypeOption);
case Sax.AssociationType.Partner:
return new List<Sax.AssociationTypeOption>() { Sax.AssociationTypeOption.Partner }.Contains(associationTypeOption);
}
return false;
}
//-------------------------------------------------------------------
// Validation.
//-------------------------------------------------------------------
// Organisation association validation.
public bool ValidateOrganisationAssociationData(SaxController_Base.AjaxResponse_Data responseData)
{
// Associated Organisation.
if (OrganisationIdAssoc != null)
{
// Mandatory.
String controlName = "OrganisationIdAssoc";
if (!SysId.IsValid(SysId.ToSysId(OrganisationIdAssoc)))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
// Must exist.
else if (!AccountMgr.OrganisationExistsById(SysId.ToSysId(OrganisationIdAssoc)))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
// Not same as primary organisation.
else if (OrganisationId != null && SysId.ToSysId(OrganisationId).Equals(SysId.ToSysId(OrganisationIdAssoc)))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Association type option.
if (Association.TypeOption != null)
{
// Mandatory.
String controlName = "AssociationTypeOption";
if (StringUtil.IsEmpty(Association.TypeOption))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
// Valid value.
else if ((int)Association.GetAssociationTypeOption() < 1)
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Association status.
if (Association.StatusCode != null)
{
// Mandatory.
String controlName = "AssociationStatus";
if (StringUtil.IsEmpty(Association.StatusCode))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
// Valid value.
else if (!SaxOrganisation.ValidStatuses.Contains(Association.GetStatus()))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
return !responseData.HasControlErrors();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,50 @@
using Microsoft.AspNetCore.Http;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Proc.Excel;
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.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
/// <summary>
/// Model for Organisation Download.
/// </summary>
public class Model_OrganisationDownload : Model_Organisation
{
//-------------------------------------------------------------------
// Construction.
public Model_OrganisationDownload(SaxLocaliser localiser) :
base(localiser)
{
}
//-------------------------------------------------------------------
// Properties.
public String IncludeId { get; set; }
//-------------------------------------------------------------------
// Validation.
//-------------------------------------------------------------------
public bool ValidateProperties()
{
return true;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,110 @@
using Sarand.Net.Standard.Base.App;
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.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
public class Model_OrganisationMembers : SaxModel_Admin
{
//-------------------------------------------------------------------
// Construction.
public Model_OrganisationMembers(SaxLocaliser localiser) :
base(localiser)
{
AdditionalFiles_JS.Add("js/sax-org-mbr.js");
}
//-------------------------------------------------------------------
// List configuration.
public class FilterData
{
public String OrganisationId { get; set; }
public String OrganisationName { get; set; }
}
public FilterData Filter { get; } = new FilterData();
//-------------------------------------------------------------------
// Organisation.
public String OrganisationId { get; set; }
// User Organisation (member) properties.
public String UserOrganisationId { get; set; }
[EmailAddress]
public String MemberUserEmailAddress{ get; set; }
public String MemberUserAccountId { get; set; }
public String MemberOrganisationId { get; set; }
public String MemberRoleCodeDelim = ",";
public List<String> MemberRoleCodes { get; set; }
public List<String> GetMemberRoleCodes()
{
List<String> codes = new List<string>();
foreach (String code in MemberRoleCodes)
{
if (StringUtil.IsEmpty(code)) continue;
codes.AddRange(code.Split(MemberRoleCodeDelim));
}
return codes;
}
public String MemberStatusCode { get; set; }
public SaStatus MemberStatus { get { return SacsSystem.GetStatusForCode(MemberStatusCode); } }
//-------------------------------------------------------------------
// Validation.
//-------------------------------------------------------------------
// Organisation member validation.
public bool ValidateOrganisationMemberData(SaxController_Base.AjaxResponse_Data responseData)
{
// User email address.
if (MemberUserEmailAddress != null)
{
responseData.SetControlValue(nameof(MemberUserEmailAddress), MemberUserEmailAddress);
if (StringUtil.IsEmpty(MemberUserEmailAddress))
responseData.SetControlError(nameof(MemberUserEmailAddress), Localiser["msg.validation.mandatory.value"]);
else if (!AccountMgr.UserAccountExistsByEmailAddress(MemberUserEmailAddress))
responseData.SetControlError(nameof(MemberUserEmailAddress), Localiser["msg.validation.invalid.value"]);
}
else
{
// User Account.
if (MemberUserAccountId != null)
{
SysId memberUserAccountId = SysId.ToSysId(MemberUserAccountId);
if (!SysId.IsValid(memberUserAccountId))
responseData.SetControlError(nameof(MemberUserAccountId), Localiser["msg.validation.mandatory.value"]);
}
}
// Member roles.
if (MemberRoleCodes != null)
{
// Roles can be left empty as the 'Member' role is automatically applied.
}
// User Organisation status.
if (MemberStatusCode != null)
{
if (StringUtil.IsEmpty(MemberStatusCode))
responseData.SetControlError(nameof(MemberStatus), Localiser["msg.validation.mandatory.value"]);
else if (!SaxOrganisation.ValidStatuses.Contains(MemberStatus))
responseData.SetControlError(nameof(MemberStatus), Localiser["msg.validation.invalid.value"]);
}
return !responseData.HasControlErrors();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,92 @@
using Microsoft.AspNetCore.Http;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Proc.Excel;
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.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
/// <summary>
/// Model for Organisation Upload.
/// </summary>
public class Model_OrganisationUpload : SaxModel_Admin
{
//-------------------------------------------------------------------
// Construction.
public Model_OrganisationUpload(SaxLocaliser localiser) :
base(localiser)
{
}
//-------------------------------------------------------------------
// Organisation data files - only one allowed per request.
public List<IFormFile> OrganisationDataFile { get; set; }
// Data file properties.
public String SheetNameOrNumber { get; set; } = "1";
public String HeaderRow { get; set; } = "1";
public String FirstDataRow { get; set; } = "2";
//-------------------------------------------------------------------
// Validation.
//-------------------------------------------------------------------
public bool ValidateProperties(SaxController_Base.AjaxResponse_Data responseData)
{
// Data file.
{
String controlName = nameof(OrganisationDataFile);
// A single data file must be supplied.
if (OrganisationDataFile == null || !OrganisationDataFile.Any())
responseData.SetControlError(controlName, Localiser["msg.error.data.file.missing"]);
else if (OrganisationDataFile != null && OrganisationDataFile.Count() > 1)
responseData.SetControlError(controlName, Localiser["msg.error.data.file.multiple"]);
}
// Sheet name or number.
{
String controlName = nameof(SheetNameOrNumber);
if (StringUtil.IsBlank(SheetNameOrNumber))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (!ExcelHelper.IsValidSheetName(SheetNameOrNumber))
responseData.SetControlError(controlName, Localiser["msg.error.sheet.name.invalid"]);
}
// Header row position (from 1).
{
String controlName = nameof(HeaderRow);
if (StringUtil.IsBlank(HeaderRow))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (!StringUtil.IsNumeric(HeaderRow) || StringUtil.ToInt(HeaderRow) < 1)
responseData.SetControlError(controlName, Localiser["msg.error.spreadsheet.row.invalid"]);
}
// First data row position (from 1).
{
String controlName = nameof(FirstDataRow);
if (StringUtil.IsBlank(FirstDataRow))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (!StringUtil.IsNumeric(FirstDataRow) || StringUtil.ToInt(FirstDataRow) < 1)
responseData.SetControlError(controlName, Localiser["msg.error.spreadsheet.row.invalid"]);
}
return !responseData.HasControlErrors();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,26 @@
using Saxonite.Net.Core.Web.Base.App;
using Saxonite.Net.Core.Web.Base.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
public class Model_Policies : SaxModel_Admin
{
//-------------------------------------------------------------------
// Construction.
public Model_Policies(SaxLocaliser localiser) :
base(localiser)
{
}
//-------------------------------------------------------------------
// Properties.
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,153 @@
using Sarand.Net.Standard.Base.App;
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.Admin.Models
{
//=======================================================================
public class Model_Region : SaxModel_Admin
{
//-------------------------------------------------------------------
// Construction.
public Model_Region(SaxLocaliser localiser) :
base(localiser)
{
AdditionalFiles_JS.Add("js/sax-rgn.js");
}
//-------------------------------------------------------------------
// List properties.
public class FilterData
{
public String Region { get; set; }
public String RegionTypeCode { get; set; }
}
public FilterData Filter { get; } = new FilterData();
public Sax.RegionType FilterRegionType
{
get { return (Sax.RegionType)RegionTypeCodes.GetTypeForCode(Filter.RegionTypeCode); }
}
//-------------------------------------------------------------------
// Region properties.
public String RegionId { get; set; }
public String RegionTypeCode { get; set; }
public Sax.RegionType RegionType
{
get { return (Sax.RegionType)RegionTypeCodes.GetTypeForCode(RegionTypeCode); }
set { RegionTypeCode = RegionTypeCodes.GetCodeForType(value); }
}
public String RegionCountryIso2Code { get; set; }
public String RegionName { get; set; }
public String RegionIdParent { get; set; }
public String RegionStatusCode { get; set; }
public SaStatus RegionStatus { get { return SacsSystem.GetStatusForCode(RegionStatusCode); } }
//-------------------------------------------------------------------
// Validation.
//-------------------------------------------------------------------
// Region.
public bool ValidateRegionData(SaxController_Base.AjaxResponse_Data responseData)
{
// Region Type.
if (RegionTypeCode != null)
{
responseData.SetControlValue(nameof(RegionTypeCode), RegionTypeCode);
if (StringUtil.IsEmpty(RegionTypeCode) || (int)RegionType < 1)
responseData.SetControlError(nameof(RegionTypeCode), Localiser["msg.validation.mandatory.value"]);
}
// Region ISO2 code.
if (RegionCountryIso2Code != null)
{
RegionCountryIso2Code = RegionCountryIso2Code.ToUpperInvariant();
responseData.SetControlValue(nameof(RegionCountryIso2Code), RegionCountryIso2Code);
if (RegionType == Sax.RegionType.Country)
{
if (StringUtil.IsEmpty(RegionCountryIso2Code))
responseData.SetControlError(nameof(RegionCountryIso2Code), Localiser["msg.validation.mandatory.value"]);
else if (StringUtil.GetLength(RegionCountryIso2Code) != GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Region_CountryIso2Code))
responseData.SetControlError(nameof(RegionCountryIso2Code), Localiser["msg.validation.invalid.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Region_CountryIso2Code)]);
else
{
// Check for duplicate code.
SaxRegion.Params prmRegion = new SaxRegion.Params();
SysId regionId = SysId.ToSysId(RegionId);
if (SysId.IsValid(regionId))
prmRegion.IdsExcluded.Add(regionId);
prmRegion.CountryIso2CodesIncluded.Add(RegionCountryIso2Code);
prmRegion.StatusCat = SaxRegion.StatusCat.Any;
if (ReferenceMgr.GetRegionCount(prmRegion) > 0)
responseData.SetControlError(nameof(RegionCountryIso2Code), Localiser["msg.validation.duplicate.value"]);
}
}
else if ((int)RegionType > 0 && RegionType != Sax.RegionType.Country)
{
if (!StringUtil.IsEmpty(RegionCountryIso2Code))
responseData.SetControlError(nameof(RegionCountryIso2Code), Localiser["msg.validation.invalid.value"]);
}
}
// Region name.
if (RegionName != null)
{
responseData.SetControlValue(nameof(RegionName), RegionName);
if (StringUtil.IsEmpty(RegionName))
responseData.SetControlError(nameof(RegionName), Localiser["msg.validation.mandatory.value"]);
else if (StringUtil.GetLength(RegionName) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Region_Name))
responseData.SetControlError(nameof(RegionName), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Region_Name)]);
else
{
// Check for duplicate name.
SaxRegion.Params prmRegion = new SaxRegion.Params();
SysId regionId = SysId.ToSysId(RegionId);
if (SysId.IsValid(regionId))
prmRegion.IdsExcluded.Add(regionId);
prmRegion.NameFull = RegionName;
prmRegion.StatusCat = SaxRegion.StatusCat.Any;
if (ReferenceMgr.GetRegionCount(prmRegion) > 0)
responseData.SetControlError(nameof(RegionName), Localiser["msg.validation.duplicate.value"]);
}
}
// Parent region.
if (!StringUtil.IsEmpty(RegionIdParent))
{
SaxRegion parentRegion = ReferenceMgr.GetRegionById(SysId.ToSysId(RegionIdParent));
if (parentRegion != null)
{
if (RegionType<= 0 || SaxRegion.IsValidParentRegionType(RegionType, parentRegion.RegionType))
{
}
else responseData.SetControlError(nameof(RegionIdParent), Localiser["region.msg.parent.type.invalid"]);
}
else responseData.SetControlError(nameof(RegionIdParent), Localiser["msg.validation.invalid.value"]);
}
// Region status.
if (RegionStatusCode != null)
{
if (StringUtil.IsEmpty(RegionStatusCode))
responseData.SetControlError(nameof(RegionStatus), Localiser["msg.validation.mandatory.value"]);
else if (!SaxRegion.ValidStatuses.Contains(RegionStatus))
responseData.SetControlError(nameof(RegionStatus), Localiser["msg.validation.invalid.value"]);
}
return !responseData.HasControlErrors();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,113 @@
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Utils;
using Saxonite.Net.Core.Web.Base.App;
using Saxonite.Net.Core.Web.Base.Controllers;
using Saxonite.Net.Core.Web.Base.Models;
using Saxonite.Net.Standard.Base.Bus;
using Saxonite.Net.Standard.Base.Helpers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
public class Model_Security : SaxModel_Admin
{
//-------------------------------------------------------------------
// Construction.
public Model_Security(SaxLocaliser localiser) :
base(localiser)
{
//AdditionalFiles_CSS.Add("css/sax-security.css");
AdditionalFiles_JS.Add("js/sax-security.js");
}
//-------------------------------------------------------------------
// Page configuration.
public bool RequestPasswordMode { get { return !StringUtil.IsEmpty(rpe); } }
//-------------------------------------------------------------------
// Form properties.
public String EmailAddress { get; set; }
public String PasswordCurrent { get; set; }
public String Password { get; set; }
public String PasswordConfirm { get; set; }
public bool KeepMeSignedIn { get; set; }
/// <summary>Request Password Encrypted params - to allow Change Password without session or requiring old password.</summary>
public String rpe { get; set; }
//-------------------------------------------------------------------
// Validation.
//-------------------------------------------------------------------
// Sign-in.
public bool ValidateSignInData(SaxController_Base.AjaxResponse_Data responseData)
{
// Email address.
responseData.SetControlValue(nameof(EmailAddress), EmailAddress);
if (StringUtil.IsEmpty(EmailAddress))
responseData.SetControlError(nameof(EmailAddress), Localiser["msg.validation.mandatory.value"]);
else if (!SacsDataValidationHelper.IsValidEmailAddress(EmailAddress))
responseData.SetControlError(nameof(EmailAddress), Localiser["msg.validation.invalid.value"]);
// Password.
// NB Do not return the password value in the response.
if (StringUtil.IsEmpty(Password))
responseData.SetControlError(nameof(Password), Localiser["msg.validation.mandatory.value"]);
return !responseData.HasControlErrors();
}
//-------------------------------------------------------------------
// Change password.
public bool ValidateChangePasswordData(SaxUserAccount userAccount, SaxController_Base.AjaxResponse_Data responseData)
{
// Validate Passwords.
// NB Do not return the password values in the response.
// NB Only validate populated values - any null values are not part of the form for this request.
// - 'Current' password is not shown when changing password from 'Request Password' email link.
if (PasswordCurrent != null && StringUtil.IsEmpty(PasswordCurrent))
responseData.SetControlError(nameof(PasswordCurrent), Localiser["msg.validation.mandatory.value"]);
if (StringUtil.IsEmpty(Password))
responseData.SetControlError(nameof(Password), Localiser["msg.validation.mandatory.value"]);
if (StringUtil.IsEmpty(PasswordConfirm))
responseData.SetControlError(nameof(PasswordConfirm), Localiser["msg.validation.mandatory.value"]);
if (!StringUtil.IsEmpty(Password) && !StringUtil.IsEmpty(PasswordConfirm))
{
if (!Password.Equals(PasswordConfirm))
responseData.SetControlError(nameof(PasswordConfirm), Localiser["msg.validation.invalid.value"]);
if (!SaxPasswordHelper.IsValidPassword(Password))
responseData.SetControlError(nameof(PasswordConfirm), Localiser.GetText("msg.warn.password.invalid", new object[] { SaxPasswordHelper.Params.MinLength, SaxPasswordHelper.Params.MinLengthNoComplexity }));
}
if (!responseData.HasControlErrors())
{
if (PasswordCurrent != null && !SaxPasswordHelper.VerifyHashedPassword(userAccount, PasswordCurrent))
responseData.SetControlError(nameof(PasswordCurrent), Localiser["security.change.password.current.invalid"]);
if (SaxPasswordHelper.VerifyHashedPassword(userAccount, Password))
responseData.SetControlError(nameof(Password), Localiser["security.change.password.not.changed"]);
}
return !responseData.HasControlErrors();
}
//-------------------------------------------------------------------
// Request Password.
public bool ValidateRequestPasswordData(SaxController_Base.AjaxResponse_Data responseData)
{
// Email address.
responseData.SetControlValue(nameof(EmailAddress), EmailAddress);
if (StringUtil.IsEmpty(EmailAddress))
responseData.SetControlError(nameof(EmailAddress), Localiser["msg.validation.mandatory.value"]);
else if (!SacsDataValidationHelper.IsValidEmailAddress(EmailAddress))
responseData.SetControlError(nameof(EmailAddress), Localiser["msg.validation.invalid.value"]);
return !responseData.HasControlErrors();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,135 @@
using Sarand.Net.Standard.Base.App;
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.Admin.Models
{
//=======================================================================
public class Model_Sport : SaxModel_Admin
{
//-------------------------------------------------------------------
// Construction.
public Model_Sport(SaxLocaliser localiser) :
base(localiser)
{
AdditionalFiles_JS.Add("js/sax-sport.js");
}
//-------------------------------------------------------------------
// Sport list configuration.
public class FilterData
{
public String Sport { get; set; }
}
public FilterData Filter { get; } = new FilterData();
//-------------------------------------------------------------------
// Sport properties.
public String SportId { get; set; }
public String SportName { get; set; }
public String SportGroupingCode { get; set; }
public Sax.SportGrouping SportGrouping { get { return (Sax.SportGrouping)SportGroupingCodes.GetTypeForCode(SportGroupingCode); } }
public String SportIdParent { get; set; }
public String SportIdsParents { get; set; }
public String SportIdsChildren { get; set; }
public String SportSpecialityLabelCode { get; set; }
public Sax.SportSpecialityLabel SportSpecialityLabel { get { return (Sax.SportSpecialityLabel)SportSpecialityLabelCodes.GetTypeForCode(SportSpecialityLabelCode); } }
public String SportStatusCode { get; set; }
public SaStatus SportStatus { get { return SacsSystem.GetStatusForCode(SportStatusCode); } }
//-------------------------------------------------------------------
// Validation.
//-------------------------------------------------------------------
// Sport.
public bool ValidateSportData(SaxController_Base.AjaxResponse_Data responseData)
{
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<IDisposable> disposableItems = new DisposableCollection<IDisposable>())
{
// Sport Grouping.
if (SportGroupingCode != null)
{
String controlName = nameof(SportGrouping);
if (StringUtil.IsEmpty(SportGroupingCode))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (SportGrouping <= 0)
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Parent sport.
SysId sportIdParent = SysId.ToSysId(SportIdParent);
if (SportIdParent != null && SysId.IsValid(sportIdParent))
{
String controlName = "SportParent";
SaxSport sport = ReferenceMgr.GetSportById(SysId.ToSysId(SportIdParent));
disposableItems.Add(sport);
if (sport == null)
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
else if (SysId.IsValid(sport.SportIdParent))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Sport name.
if (SportName != null)
{
String controlName = nameof(SportName);
responseData.SetControlValue(controlName, SportName);
if (StringUtil.IsEmpty(SportName))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (StringUtil.GetLength(SportName) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Sport_Name))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Sport_Name)]);
else
{
// Check for duplicate name.
SaxSport.Params prmSport = new SaxSport.Params();
SysId sportId = SysId.ToSysId(SportId);
if (SysId.IsValid(sportId))
prmSport.IdsExcluded.Add(sportId);
prmSport.NameFull = SportName;
prmSport.StatusCat = SaxSport.StatusCat.Any;
if (ReferenceMgr.GetSportCount(prmSport) > 0)
responseData.SetControlError(controlName, Localiser["msg.validation.duplicate.value"]);
}
}
// Sport Speciality Label.
if (SportSpecialityLabelCode != null)
{
String controlName = nameof(SportSpecialityLabel);
if (!StringUtil.IsEmpty(SportSpecialityLabelCode))
{
if (SportSpecialityLabel <= 0)
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
}
// Sport status.
if (SportStatusCode != null)
{
String controlName = nameof(SportStatus);
if (StringUtil.IsEmpty(SportStatusCode))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (!SaxSport.ValidStatuses.Contains(SportStatus))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
}
return !responseData.HasControlErrors();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,70 @@
using Microsoft.AspNetCore.Mvc.Rendering;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Core;
using Saxonite.Net.Core.Web.Base.App;
using Saxonite.Net.Core.Web.Base.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
public class Model_System : SaxModel_Admin
{
//-------------------------------------------------------------------
// Construction.
public Model_System(SaxLocaliser localiser) :
base(localiser)
{
}
//-------------------------------------------------------------------
// Properties.
//-------------------------------------------------------------------
// Database page properties.
public class DatabaseFilterData
{
public String Instance { get; set; }
public String Search { get; set; }
}
public DatabaseFilterData DatabaseFilter { get; } = new DatabaseFilterData();
public class DatabaseTableData
{
public String Instance { get; set; }
public String Name { get; set; }
}
public DatabaseTableData DatabaseTable { get; } = new DatabaseTableData();
public IEnumerable<SelectListItem> GetDatabases()
{
List<CodeDesc> items = new List<CodeDesc>();
if (SessionData?.ValidUserSession ?? false)
{
items.Add("Core", Localiser["label.core"]);
items.Add("Reference", Localiser["label.reference"]);
items.Add("Support", Localiser["label.support"]);
}
return new SelectList(items, "Code", "Desc");
}
//-------------------------------------------------------------------
// Logs page properties.
public String LoggingRootFolder { get; } = Regex.Replace(SaLogger.LogFolder, "[\\\\/]Admin$", "");
// Log file filter.
public class LogsFilterData
{
public String Folder { get; set; }
public String Year { get; set; }
public String Month { get; set; }
public String Filename { get; set; }
}
public LogsFilterData LogsFilter { get; } = new LogsFilterData();
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,225 @@
using Microsoft.AspNetCore.Mvc.Rendering;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Utils;
using Saxonite.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.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
public class Model_User : SaxModel_Admin
{
//-------------------------------------------------------------------
// Construction.
public Model_User(SaxLocaliser localiser) :
base(localiser)
{
AdditionalFiles_JS.Add("js/sax-usr.js");
}
//-------------------------------------------------------------------
// User filter properties.
public class FilterData
{
public String User { get; set; }
public String UserSportId { get; set; }
public String UserSportName { get; set; }
public String UserRegionId { get; set; }
public String UserRegionName { get; set; }
public String UserStatusCategoryCode { get; set; }
}
public FilterData Filter { get; } = new FilterData();
public SaxUserAccount.StatusCat FilterUserStatusCategory
{
get { return EnumUtil.ParseEnum(Filter.UserStatusCategoryCode, SaxUserAccount.StatusCat.Any); }
}
/// <summary>User Status Categories for filter.</summary>
public IEnumerable<SelectListItem> UserFilterStatusCategoriesForSelect
{
get
{
List<CodeDesc> statusCategories = new List<CodeDesc>();
statusCategories.Add(SaxUserAccount.StatusCat.Any.ToString(), Localiser["label.any"]);
statusCategories.Add(SaxUserAccount.StatusCat.AwaitingOnly.ToString(), "Awaiting");
statusCategories.Add(SaxUserAccount.StatusCat.ActiveOnly.ToString(), "Active");
statusCategories.Add(SaxUserAccount.StatusCat.InactiveOnly.ToString(), "Inactive");
statusCategories.Add(SaxUserAccount.StatusCat.NotDeleted.ToString(), "Not deleted");
statusCategories.Add(SaxUserAccount.StatusCat.DeletedOnly.ToString(), "Deleted");
return new SelectList(statusCategories, "Code", "Desc", SaxUserAccount.StatusCat.Any.ToString());
}
}
//-------------------------------------------------------------------
// User properties.
public String UserId { get; set; }
[EmailAddress]
public String UserEmailAddress { get; set; }
public String UserTitle { get; set; }
public String UserFirstName { get; set; }
public String UserLastName { get; set; }
public String UserRegionIdCountry { get; set; }
public String UserRegionIdProvince { get; set; }
public String UserRoleCodeDelim = ",";
public new List<String> UserRoleCodes { get; set; }
public List<String> GetUserRoleCodes()
{
List<String> codes = new List<string>();
foreach (String code in UserRoleCodes)
{
if (StringUtil.IsEmpty(code)) continue;
codes.AddRange(code.Split(UserRoleCodeDelim));
}
return codes;
}
public String UserStatusCode { get; set; }
public SaStatus UserStatus { get { return SacsSystem.GetStatusForCode(UserStatusCode); } }
// User emails.
public String UserEmailAcountActivationOnline { get; set; }
public String UserEmailRequestPasswordOnline { get; set; }
public String UserEmailRequestPasswordAdmin { get; set; }
//-------------------------------------------------------------------
// Validation.
//-------------------------------------------------------------------
// User.
public bool ValidateUserData(SaxController_Base.AjaxResponse_Data responseData)
{
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<IDisposable> disposableItems = new DisposableCollection<IDisposable>())
{
// User email.
if (UserEmailAddress != null)
{
UserEmailAddress = UserEmailAddress.ToLowerInvariant();
responseData.SetControlValue(nameof(UserEmailAddress), UserEmailAddress);
if (StringUtil.IsEmpty(UserEmailAddress))
responseData.SetControlError(nameof(UserEmailAddress), Localiser["msg.validation.mandatory.value"]);
else if (StringUtil.GetLength(UserEmailAddress) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_EmailAddress))
responseData.SetControlError(nameof(UserEmailAddress), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_EmailAddress)]);
else if (!SacsDataValidationHelper.IsValidEmailAddress(UserEmailAddress))
responseData.SetControlError(nameof(UserEmailAddress), Localiser["msg.validation.invalid.value"]);
else
{
// Check for duplicate email address.
SaxUserAccount.Params prmUserAccount = new SaxUserAccount.Params();
SysId userAccountId = SysId.ToSysId(UserId);
if (SysId.IsValid(userAccountId))
prmUserAccount.IdsExcluded.Add(userAccountId);
prmUserAccount.EmailAddress = UserEmailAddress;
prmUserAccount.StatusCat = SaxUserAccount.StatusCat.Any;
if (AccountMgr.GetUserAccountCount(prmUserAccount) > 0)
responseData.SetControlError(nameof(UserEmailAddress), Localiser["msg.validation.duplicate.value"]);
}
}
// User title.
if (UserTitle != null)
{
}
// User first name.
if (UserFirstName != null)
{
responseData.SetControlValue(nameof(UserFirstName), UserFirstName);
if (StringUtil.IsEmpty(UserFirstName))
responseData.SetControlError(nameof(UserFirstName), Localiser["msg.validation.mandatory.value"]);
else if (StringUtil.GetLength(UserFirstName) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_FirstName))
responseData.SetControlError(nameof(UserFirstName), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_FirstName)]);
}
// User last name.
if (UserLastName != null)
{
responseData.SetControlValue(nameof(UserLastName), UserLastName);
if (StringUtil.IsEmpty(UserLastName))
responseData.SetControlError(nameof(UserLastName), Localiser["msg.validation.mandatory.value"]);
else if (StringUtil.GetLength(UserLastName) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_LastName))
responseData.SetControlError(nameof(UserLastName), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_LastName)]);
}
// Country region.
SaxRegion regionCountry = null;
if (UserRegionIdCountry != null)
{
if (!SysId.IsValid(SysId.ToSysId(UserRegionIdCountry)))
responseData.SetControlError(nameof(UserRegionIdCountry), Localiser["msg.validation.mandatory.value"]);
else
{
regionCountry = ReferenceMgr.GetRegionById(SysId.ToSysId(UserRegionIdCountry));
disposableItems.Add(regionCountry);
if (regionCountry != null)
{
if (regionCountry.RegionType != Sax.RegionType.Country)
{
SaLogger.Warn($"{SysUtil.Fn} Invalid region type. Expected: Country. Found: " + regionCountry.RegionType.ToString());
responseData.SetControlError(nameof(UserRegionIdCountry), Localiser["msg.validation.invalid.value"]);
}
}
else
{
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve region for Id: " + UserRegionIdCountry);
responseData.SetControlError(nameof(UserRegionIdCountry), Localiser["msg.validation.invalid.value"]);
}
}
}
// Province region.
SaxRegion regionProvince = null;
if (UserRegionIdProvince != null)
{
if (!UserRegionIdProvince.IsEmpty())
{
regionProvince = ReferenceMgr.GetRegionById(SysId.ToSysId(UserRegionIdProvince));
disposableItems.Add(regionProvince);
if (regionProvince != null)
{
if (regionProvince.RegionType != Sax.RegionType.Province)
{
SaLogger.Warn($"{SysUtil.Fn} Invalid region type. Expected: Province . Found: " + regionCountry.RegionType.ToString());
responseData.SetControlError(nameof(UserRegionIdProvince), Localiser["msg.validation.invalid.value"]);
}
else if (regionCountry != null && !regionProvince.RegionIdParent.Equals(regionCountry.Id))
{
SaLogger.Warn($"{SysUtil.Fn} Invalid province region parent. Expected: " + regionCountry.Id.ToString() + " . Found: " + regionCountry.RegionIdParent.ToString());
responseData.SetControlError(nameof(UserRegionIdProvince), Localiser["msg.validation.invalid.value"]);
}
}
else
{
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve region for Id: " + UserRegionIdProvince);
responseData.SetControlError(nameof(UserRegionIdProvince), Localiser["msg.validation.invalid.value"]);
}
}
}
// User status.
if (UserStatusCode != null)
{
if (StringUtil.IsEmpty(UserStatusCode))
responseData.SetControlError(nameof(UserStatus), Localiser["msg.validation.mandatory.value"]);
else if (!SaxUserAccount.ValidStatuses.Contains(UserStatus))
responseData.SetControlError(nameof(UserStatus), Localiser["msg.validation.invalid.value"]);
}
}
return !responseData.HasControlErrors();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,54 @@
using Microsoft.AspNetCore.Mvc.Rendering;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Utils;
using Saxonite.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.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
public class Model_UsersOnline : SaxModel_Admin
{
//-------------------------------------------------------------------
// Construction.
public Model_UsersOnline(SaxLocaliser localiser) :
base(localiser)
{
AdditionalFiles_JS.Add("js/sax-usr-onl.js");
}
//-------------------------------------------------------------------
// User filter properties.
public class FilterData
{
public String User { get; set; }
public String UserSportId { get; set; }
public String UserRegionId { get; set; }
}
public FilterData Filter { get; } = new FilterData();
//-------------------------------------------------------------------
// User properties.
public String UserId { get; set; }
[EmailAddress]
public String UserEmailAddress { get; set; }
public String UserTitle { get; set; }
public String UserFirstName { get; set; }
public String UserLastName { get; set; }
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,56 @@
using Sarand.Net.Standard.Base.App;
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.Admin.Models.Reference
{
//=======================================================================
public class Model_ReferenceBaseball : SaxModel_Admin
{
//-------------------------------------------------------------------
// Construction.
public Model_ReferenceBaseball(SaxLocaliser localiser) :
base(localiser)
{
AdditionalFiles_JS.Add("js/ref/sax-ref-baseball.js");
}
//-------------------------------------------------------------------
// Reference Baseball list parameters.
public class FilterData
{
}
public FilterData Filter { get; } = new FilterData();
//-------------------------------------------------------------------
// Reference Baseball properties.
//-------------------------------------------------------------------
// Validation.
//-------------------------------------------------------------------
// Reference Baseball.
public bool ValidateReferenceBaseballData(Sacs.Web.Components.SaController.AjaxResponse_Data responseData)
{
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<IDisposable> disposables = new DisposableCollection<IDisposable>())
{
}
return !responseData.HasControlErrors();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,64 @@
using Sarand.Net.Standard.Base.App;
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.Admin.Models.Reference
{
//=======================================================================
public class Model_ReferenceGolf : SaxModel_Admin
{
//-------------------------------------------------------------------
// Construction.
public Model_ReferenceGolf(SaxLocaliser localiser) :
base(localiser)
{
AdditionalFiles_JS.Add("js/ref/sax-ref-golf.js");
}
//-------------------------------------------------------------------
// Reference Golf list parameters.
public class FilterData
{
public string CountrySearch { get; set; }
public string CountryId { get; set; }
public string ProvinceSearch { get; set; }
public string ProvinceId { get; set; }
public string CourseSearch { get; set; }
public string CourseId { get; set; }
public string MarkerSearch { get; set; }
public string MarkerHoles { get; set; }
public string MarkerGender { get; set; }
}
public FilterData Filter { get; } = new FilterData();
//-------------------------------------------------------------------
// Reference Golf properties.
//-------------------------------------------------------------------
// Validation.
//-------------------------------------------------------------------
// Reference Golf.
public bool ValidateReferenceGolfData(Sacs.Web.Components.SaController.AjaxResponse_Data responseData)
{
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<IDisposable> disposables = new DisposableCollection<IDisposable>())
{
}
return !responseData.HasControlErrors();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,54 @@
using Sarand.Net.Standard.Base.Bus;
using Saxonite.Net.Core.Web.Admin.App;
using Saxonite.Net.Core.Web.Base.App;
using Saxonite.Net.Core.Web.Base.Models;
using Saxonite.Net.Standard.Base.Bus;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
public class SaxModel_Admin : SaxModel_Base
{
//-------------------------------------------------------------------
// Protected construction.
protected SaxModel_Admin(SaxLocaliser localiser) :
base(localiser)
{
}
//-------------------------------------------------------------------
// Properties.
//-------------------------------------------------------------------
// Session.
public SaxSessionData_Admin SessionData_Admin { get { return SessionData as SaxSessionData_Admin; } }
public SysId SessionUserAccountId { get { return SessionData_Admin?.User?.UserAccountId ?? null; } }
//-------------------------------------------------------------------
// Reference data.
//-------------------------------------------------------------------
public String GetSportName(SysId sportId)
{
using (SaxSport sport = ReferenceMgr.GetSportById(sportId))
{
if (sport != null) return sport.Name;
}
return "";
}
public String GetRegionName(SysId regionId)
{
using (SaxRegion region = ReferenceMgr.GetRegionById(regionId))
{
if (region != null) return region.Name;
}
return "";
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,95 @@
using Sarand.Net.Standard.Base.App;
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.Standard.Base.App;
using Saxonite.Net.Core.Web.Base.Controllers;
using Saxonite.Net.Standard.Base.Bus;
using Saxonite.Net.Standard.Base.Bus.Support;
using System;
namespace Saxonite.Net.Core.Web.Admin.Models.Support
{
//=======================================================================
public class Model_UserReport : SaxModel_Admin_Support
{
//-------------------------------------------------------------------
// Construction.
public Model_UserReport(SaxLocaliser localiser) :
base(localiser)
{
}
//-------------------------------------------------------------------
// User Report list configuration.
public class FilterData
{
public String Report { get; set; }
}
public FilterData Filter { get; } = new FilterData();
//-------------------------------------------------------------------
// Sport properties.
public class UserReportData
{
public String Id { get; set; }
public String Exists { get; set; }
public String ReportType { get; set; }
public String Title { get; set; }
public String Report { get; set; }
public String Status { get; set; }
}
public UserReportData UserReport { get; } = new UserReportData();
public Sax.UserReportType UserReportType{ get { return (Sax.UserReportType)UserReportTypeCodes.GetTypeForCode(UserReport.ReportType); } }
public SaStatus UserReportStatus { get { return SacsSystem.GetStatusForCode(UserReport.Status); } }
//-------------------------------------------------------------------
// Validation.
//-------------------------------------------------------------------
// User Report.
public bool ValidateUserReportData(SaxController_Base.AjaxResponse_Data responseData)
{
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<IDisposable> disposableItems = new DisposableCollection<IDisposable>())
{
// Report Type.
String controlName = "UserReportType";
if (UserReport.ReportType != null)
{
if (StringUtil.IsEmpty(UserReport.ReportType))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (UserReportType <= 0)
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
// Report Title.
controlName = "UserReportTitle";
if (UserReport.Title != null)
{
responseData.SetControlValue(controlName, UserReport.Title);
if (StringUtil.IsEmpty(UserReport.Title))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (StringUtil.GetLength(UserReport.Title) > GetControlMaxLength(SaxDbDfn_Support.ColumnIdx.UserReport_Title))
responseData.SetControlError(controlName, Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Support.ColumnIdx.UserReport_Title)]);
}
// Status.
controlName = "UserReportStatus";
if (UserReport.Status != null)
{
if (StringUtil.IsEmpty(UserReport.Status))
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
else if (!SaxUserReport.ValidStatuses.Contains(UserReportStatus))
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
}
}
return !responseData.HasControlErrors();
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,21 @@
using Saxonite.Net.Core.Web.Base.App;
namespace Saxonite.Net.Core.Web.Admin.Models.Support
{
//=======================================================================
public class SaxModel_Admin_Support : SaxModel_Admin
{
//-------------------------------------------------------------------
// Protected construction.
protected SaxModel_Admin_Support(SaxLocaliser localiser) :
base(localiser)
{
}
//-------------------------------------------------------------------
// Properties.
//-------------------------------------------------------------------
}
//=======================================================================
}