This commit is contained in:
2021-05-13 19:36:30 +01:00
parent ae64e14da4
commit edd6e39c35
63 changed files with 2694 additions and 1680 deletions
@@ -30,6 +30,13 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
public String CategoryCode { get; set; }
public String CategoryDesc { get; set; }
public long MemberCount { get; set; }
// Region.
public long RegionId { get; set; }
public String RegionName { get; set; }
// Sport.
public long SportId { get; set; }
public String SportName { get; set; }
// Common properties.
public String StatusCode { get; set; }
public String StatusDesc { get; set; }
}
@@ -45,6 +52,21 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
data.CategoryCode = OrganisationCategories.GetCodeForType(organisation.OrganisationCategory);
data.CategoryDesc = OrganisationCategories.GetDescForType(organisation.OrganisationCategory);
data.MemberCount = AccountMgr.GetOrganisationMemberCount(organisation.Id);
// Region.
data.RegionId = SysId.ToLong(organisation.RegionIdPrimary);
using (SaxRegion region = ReferenceMgr.GetRegionById(organisation.RegionIdPrimary))
{
if (region != null)
data.RegionName = region.Name;
}
// Sport.
data.SportId = SysId.ToLong(organisation.SportIdPrimary);
using (SaxSport region = ReferenceMgr.GetSportById(organisation.SportIdPrimary))
{
if (region != null)
data.SportName = region.Name;
}
// Common properties.
data.StatusCode = organisation.StatusCode;
data.StatusDesc = organisation.StatusDesc;
}
@@ -59,6 +81,9 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
public class AjaxResponse_OrganisationList : AjaxResponse_Data
{
public List<OrganisationData_List> Organisations { get; } = new List<OrganisationData_List>();
// Reference data.
public List<CodeDesc> Statuses { get; } = new List<CodeDesc>();
public String DefaultStatusCode { get; set; }
}
//-------------------------------------------------------------------
[HttpPost]
@@ -73,6 +98,11 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
if (!ValidUserSession)
return GetAjaxResult_InvalidSession(responseData);
// Reference data - statuses.
foreach (SaStatus status in SaxOrganisation.ValidStatuses.FindAll(item => item != SaStatus.Deleted))
responseData.Statuses.Add(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status));
responseData.DefaultStatusCode = SacsSystem.GetStatusCode(SaxOrganisation.DefaultStatus);
// Item filter.
SaxOrganisation.Params prmOrganisation = new SaxOrganisation.Params();
prmOrganisation.OrganisationFilter = model.Filter.Organisation;
@@ -89,6 +119,10 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
ColumnDfn colPhoneAlt = AccountMgr.GetOrganisationColumnDfn(SaxOrganisation.Column.PhoneAlt);
ColumnDfn colUserCount = AccountMgr.GetOrganisationColumnDfn(SaxOrganisation.Column.User_Count);
ColumnDfn colMemberCount = AccountMgr.GetOrganisationColumnDfn(SaxOrganisation.Column.Member_Count);
ColumnDfn colRegionId = AccountMgr.GetOrganisationColumnDfn(SaxOrganisation.Column.RegionId);
ColumnDfn colRegionName = AccountMgr.GetOrganisationColumnDfn(SaxOrganisation.Column.Region_Name);
ColumnDfn colSportId = AccountMgr.GetOrganisationColumnDfn(SaxOrganisation.Column.SportId);
ColumnDfn colSportName = AccountMgr.GetOrganisationColumnDfn(SaxOrganisation.Column.Sport_Name);
ColumnDfn colStatus = AccountMgr.GetOrganisationColumnDfn(SaxOrganisation.Column.Status);
List<ColumnDfn> columns = new List<ColumnDfn>()
{
@@ -98,8 +132,9 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
colOrganisationCategory,
colPhoneMain,
colPhoneAlt,
colUserCount,
colMemberCount,
colUserCount, colMemberCount,
colRegionId, colRegionName,
colSportId, colSportName,
colStatus
};
@@ -120,6 +155,10 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
CategoryCode = values.GetString(colOrganisationCategory.DataName),
CategoryDesc = OrganisationCategories.GetDescForCode(values.GetString(colOrganisationCategory.DataName)),
MemberCount = StringUtil.ToLong(values.GetString(colMemberCount.DataName)),
RegionId = values.GetLong(colRegionId.DataName),
RegionName = values.GetString(colRegionName.DataName),
SportId = values.GetLong(colSportId.DataName),
SportName = values.GetString(colSportName.DataName),
StatusCode = values.GetString(colStatus.DataName),
StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName))
};
@@ -216,8 +255,15 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
organisation.OrganisationType = model.OrganisationType;
if (model.OrganisationCategoryValue != null)
organisation.OrganisationCategory = model.OrganisationCategory;
if (model.OrganisationRegionId != null)
organisation.RegionIdPrimary = model.OrganisationRegionId.ToSysId();
if (model.OrganisationSportId != null)
organisation.SportIdPrimary = model.OrganisationSportId.ToSysId();
// Common properties.
if (model.OrganisationStatusCode != null)
organisation.Status = model.OrganisationStatus;
if (model.OrganisationNotes != null)
organisation.Notes = model.OrganisationNotes;
// Store item.
if (!SysId.IsValid(organisation.Id))
@@ -49,8 +49,8 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
foreach (Sax.OrganisationRole organisationRole in userOrganisation.OrganisationRoles.FindAll(item => item != Sax.OrganisationRole.Member))
data.RoleCodes.Add(OrganisationRoles.GetCodeForType(organisationRole));
data.RoleCount = userOrganisation.OrganisationRoles.Count - 1;
data.StatusCode = organisation.StatusCode;
data.StatusDesc = organisation.StatusDesc;
data.StatusCode = userOrganisation.StatusCode;
data.StatusDesc = userOrganisation.StatusDesc;
}
private void PopulateMemberResponseData(MemberData_Full data, SaxUserOrganisation userOrganisation, SaxUserAccount userAccount, SaxOrganisation organisation)
{
@@ -63,7 +63,10 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
public class AjaxResponse_MemberList : AjaxResponse_Data
{
public List<MemberData_List> Members { get; } = new List<MemberData_List>();
// Reference data.
public List<CodeDesc> MemberRoles { get; } = new List<CodeDesc>();
public List<CodeDesc> Statuses { get; } = new List<CodeDesc>();
public String DefaultStatusCode { get; set; }
}
//-------------------------------------------------------------------
[HttpPost]
@@ -91,6 +94,11 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
foreach (TypeCodeDesc organisationRole in OrganisationRoles.FindAll(item => item.Type != (int)Sax.OrganisationRole.Member))
responseData.MemberRoles.Add(organisationRole.Code, Localiser.GetOrganisationRoleCaption((Sax.OrganisationRole)organisationRole.Type));
// Reference data - statuses.
foreach (SaStatus status in SaxUserOrganisation.ValidStatuses.FindAll(item => item != SaStatus.Deleted))
responseData.Statuses.Add(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status));
responseData.DefaultStatusCode = SacsSystem.GetStatusCode(SaxUserOrganisation.DefaultStatus);
// Item filter.
SaxUserOrganisation.Params prmUserOrganisation = new SaxUserOrganisation.Params();
prmUserOrganisation.OrganisationIdsIncluded.Add(filterOrganisationId);
@@ -277,7 +285,9 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
prmUserOrganisation.OrganisationMembersOnly = false;
prmUserOrganisation.StatusCat = SaxUserOrganisation.StatusCat.Any;
userOrganisation = AccountMgr.GetUserOrganisation(prmUserOrganisation);
if (userOrganisation == null)
if (userOrganisation != null)
userOrganisation.Status = SaStatus.Active;
else
// Organisation not found for user.
userOrganisation = AccountMgr.CreateUserOrganisation(userAccountId, organisationId);
}
@@ -293,8 +303,8 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
userOrganisation.OrganisationRoles = SaxUserOrganisation.GetOrganisationRolesFromCodes(model.GetMemberRoleCodes());
if (!userOrganisation.OrganisationRoles.Contains(Sax.OrganisationRole.Member))
userOrganisation.OrganisationRoles.Add(Sax.OrganisationRole.Member);
userOrganisation.Status = SaStatus.Active;
if (model.MemberStatusCode != null)
userOrganisation.Status = model.MemberStatus;
// Store item.
if (!SysId.IsValid(userOrganisation.Id))
@@ -53,6 +53,9 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
public class AjaxResponse_RegionList : AjaxResponse_Data
{
public List<RegionData_List> Regions { get; } = new List<RegionData_List>();
// Reference data.
public List<CodeDesc> Statuses { get; } = new List<CodeDesc>();
public String DefaultStatusCode { get; set; }
}
//-------------------------------------------------------------------
[HttpPost]
@@ -67,6 +70,11 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
if (!ValidUserSession)
return GetAjaxResult_InvalidSession(responseData);
// Reference data - statuses.
foreach (SaStatus status in SaxRegion.ValidStatuses.FindAll(item => item != SaStatus.Deleted))
responseData.Statuses.Add(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status));
responseData.DefaultStatusCode = SacsSystem.GetStatusCode(SaxRegion.DefaultStatus);
// Item filter.
SaxRegion.Params prmRegion = new SaxRegion.Params();
prmRegion.RegionFilter = model.Filter.Region;
@@ -133,7 +133,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
return userAccount;
}
private void recordInvalidLoginAttempt (Model_Security model, SaxUserAccount userAccount)
private void recordInvalidLoginAttempt(Model_Security model, SaxUserAccount userAccount)
{
String fn = GetType().Name + ".recordInvalidLoginAttempt";
@@ -321,7 +321,13 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
// Retrieve user account.
SaxUserAccount userAccount = AccountMgr.GetUserAccountByEmailAddress(model.EmailAddress);
if (userAccount != null && (userAccount.IsStatusActive || DebugMode))
if (userAccount == null)
SaLogger.Warn(fn + " Unable to send password request email to " + model.EmailAddress + " - account does not exist");
else if (!userAccount.IsStatusActive)
SaLogger.Warn(fn + " Unable to send password request email to " + model.EmailAddress + " - account is not active");
else if (!AccountMgr.UserHasRole(userAccount.Id, Sax.UserRole.SystemAdmin))
SaLogger.Warn(fn + " Unable to send password request email to " + model.EmailAddress + " - account is not 'Admin'");
else
{
// Send password request email.
SaEmailData emailData = new SaEmailData();
@@ -333,11 +339,6 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
SaLogger.Info(fn + " Password request email sent to " + model.EmailAddress, true);
else SaLogger.Warn(fn + " Failed to send password request email to " + model.EmailAddress);
}
else
{
if (userAccount == null) SaLogger.Warn(fn + " Unable to send password request email to " + model.EmailAddress + " - account does not exist");
else if (!userAccount.IsStatusActive) SaLogger.Warn(fn + " Unable to send password request email to " + model.EmailAddress + " - account is not active");
}
// Construct response.
responseData.Success = true;
@@ -77,12 +77,20 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
String logSuffix = requestPasswordParams.GetValidParams().Concat("", " ", ".");
using (SaxUserAccount userAccount = AccountMgr.GetUserAccountById(requestPasswordParams.UserAccountId))
{
if (requestPasswordParams.IsValid(userAccount))
if (userAccount.IsStatusActive)
{
model.rpe = encryptedParams;
validSessionRequired = false;
if (AccountMgr.UserHasRole(userAccount.Id, Sax.UserRole.SystemAdmin))
{
if (requestPasswordParams.IsValid(userAccount))
{
model.rpe = encryptedParams;
validSessionRequired = false;
}
else SaLogger.Warn(fn + " 'Request Password' parameters supplied but invalid. " + logSuffix);
}
else SaLogger.Warn(fn + " 'Request Password' parameters supplied but account is not 'Admin'. " + logSuffix);
}
else SaLogger.Warn(fn + " 'Request Password' parameters supplied but invalid. " + logSuffix);
else SaLogger.Warn(fn + " 'Request Password' parameters supplied but account is not active. " + logSuffix);
}
}
}
@@ -46,6 +46,9 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
public class AjaxResponse_SportList : AjaxResponse_Data
{
public List<SportData_List> Sports { get; } = new List<SportData_List>();
// Reference data.
public List<CodeDesc> Statuses { get; } = new List<CodeDesc>();
public String DefaultStatusCode { get; set; }
}
//-------------------------------------------------------------------
[HttpPost]
@@ -60,6 +63,11 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
if (!ValidUserSession)
return GetAjaxResult_InvalidSession(responseData);
// Reference data - statuses.
foreach (SaStatus status in SaxSport.ValidStatuses.FindAll(item => item != SaStatus.Deleted))
responseData.Statuses.Add(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status));
responseData.DefaultStatusCode = SacsSystem.GetStatusCode(SaxSport.DefaultStatus);
// Item filter.
SaxSport.Params prmSport = new SaxSport.Params();
prmSport.SportFilter = model.Filter.Sport;
@@ -59,20 +59,36 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
}
}
//-------------------------------------------------------------------
// Utilities.
private List<SaxUserRole> GetUserRoles(SysId userAccountId, SaxUserRole.StatusCat statusCat = SaxUserRole.StatusCat.NotDeleted)
{
if (!SysId.IsValid(userAccountId)) return new List<SaxUserRole>();
SaxUserRole.Params prmUserRole = new SaxUserRole.Params();
prmUserRole.UserAccountIdsIncluded.Add(userAccountId);
prmUserRole.StatusCat = statusCat;
return AccountMgr.GetUserRoleList(prmUserRole);
}
//-------------------------------------------------------------------
// Get User List ajax request.
//-------------------------------------------------------------------
public class AjaxResponse_UserList : AjaxResponse_Data
{
public List<UserData_List> Users { get; } = new List<UserData_List>();
// Reference data.
public List<CodeDesc> UserRoles { get; } = new List<CodeDesc>();
public List<CodeDesc> Statuses { get; } = new List<CodeDesc>();
public String DefaultStatusCode { get; set; }
}
//-------------------------------------------------------------------
[HttpPost]
[Route("User/Ajax/GetList")]
public IActionResult Ajax_GetList(Model_User model)
[Route("User/Ajax/GetUsers")]
[Route("User/Ajax/GetUserList")]
public IActionResult Ajax_GetUserList(Model_User model)
{
String fn = GetType().Name + ".Ajax_GetList";
String fn = GetType().Name + ".Ajax_GetUserList";
String messageTitle = Localiser["user.caption.users"];
AjaxResponse_UserList responseData = new AjaxResponse_UserList();
@@ -83,6 +99,11 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
// Reference data - user roles.
foreach (TypeCodeDesc userRole in UserRoles)
responseData.UserRoles.Add(userRole.Code, Localiser.GetUserRoleCaption((Sax.UserRole)userRole.Type));
responseData.DefaultStatusCode = SacsSystem.GetStatusCode(SaxUserAccount.DefaultStatus);
// Reference data - statuses.
foreach (SaStatus status in SaxUserAccount.ValidStatuses.FindAll(item => item != SaStatus.Deleted))
responseData.Statuses.Add(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status));
// Item filter.
SaxUserAccount.Params prmUserAccount = new SaxUserAccount.Params();
@@ -140,7 +161,6 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
// Complete response.
responseData.SetPaging(model);
responseData.Success = true;
return Json(responseData);
}
@@ -154,9 +174,10 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
//-------------------------------------------------------------------
[HttpPost]
[Route("User/Ajax/GetItem")]
public IActionResult Ajax_GetItem(Model_User model)
[Route("User/Ajax/GetUser")]
public IActionResult Ajax_GetUser(Model_User model)
{
String fn = GetType().Name + ".Ajax_GetItem";
String fn = GetType().Name + ".Ajax_GetUser";
String messageTitle = Localiser["user.caption.user"];
AjaxResponse_User responseData = new AjaxResponse_User();
@@ -176,25 +197,47 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
}
// User's roles.
// Construct response.
PopulateUserResponseData(responseData.user, user, GetUserRoles(user.Id).GetUserRolesByStatus(SaStatus.Active));
// Complete response.
responseData.Success = true;
return Json(responseData);
}
//-------------------------------------------------------------------
private List<SaxUserRole> GetUserRoles(SysId userAccountId, SaxUserRole.StatusCat statusCat = SaxUserRole.StatusCat.NotDeleted)
// Get User by email ajax request.
//-------------------------------------------------------------------
[HttpPost]
[Route("User/Ajax/GetUserByEmail")]
public IActionResult Ajax_GetUserByEmail(Model_User model)
{
if (!SysId.IsValid(userAccountId)) return new List<SaxUserRole>();
SaxUserRole.Params prmUserRole = new SaxUserRole.Params();
prmUserRole.UserAccountIdsIncluded.Add(userAccountId);
prmUserRole.StatusCat = statusCat;
return AccountMgr.GetUserRoleList(prmUserRole);
String fn = GetType().Name + ".Ajax_GetUserByEmail";
String messageTitle = Localiser["user.caption.user"];
AjaxResponse_User responseData = new AjaxResponse_User();
StoreSessionData = false;
// Validate session.
if (!ValidUserSession)
return GetAjaxResult_InvalidSession(responseData);
// Identify user.
if (StringUtil.IsEmpty(model.UserEmailAddress))
{
SaLogger.Warn(fn + " Attempt to get user details with blank email.");
return Json(responseData);
}
// Retrieve user.
SaxUserAccount user = AccountMgr.GetUserAccountByEmailAddress(model.UserEmailAddress);
if (user == null)
{
SaLogger.Warn(fn + " Failed to retrieve user for Email: " + model.UserEmailAddress);
return Json(responseData);
}
// Construct response.
PopulateUserResponseData(responseData.user, user, GetUserRoles(user.Id).GetUserRolesByStatus(SaStatus.Active));
responseData.Success = true;
return Json(responseData);
}
//-------------------------------------------------------------------
@@ -202,9 +245,10 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
//-------------------------------------------------------------------
[HttpPost]
[Route("User/Ajax/StoreItem")]
public IActionResult Ajax_StoreItem(Model_User model)
[Route("User/Ajax/StoreUser")]
public IActionResult Ajax_StoreUser(Model_User model)
{
String fn = GetType().Name + ".Ajax_StoreItem";
String fn = GetType().Name + ".Ajax_StoreUser";
String messageTitle = Localiser["user.caption.user"];
AjaxResponse_User responseData = new AjaxResponse_User();
@@ -225,27 +269,30 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
}
// User roles, including deleted.
List<String> userRoleCodes = model.GetUserRoleCodes();
// User roles, including deleted in case of reassignment.
List<SaxUserRole> userRoles = new List<SaxUserRole>();
if (user != null) userRoles = GetUserRoles(user.Id, SaxUserRole.StatusCat.Any);
foreach (String userRoleCode in userRoleCodes)
if (model.UserRoleCodes != null)
{
// Role to activate.
Sax.UserRole role = (Sax.UserRole)UserRoles.GetTypeForCode(userRoleCode);
SaxUserRole userRole = userRoles.GetUserRoleByRole(role);
if (userRole == null)
List<String> userRoleCodes = model.GetUserRoleCodes();
foreach (String userRoleCode in userRoleCodes)
{
userRole = AccountMgr.CreateUserRole(user?.Id, role);
userRoles.Add(userRole);
// Role to activate.
Sax.UserRole role = (Sax.UserRole)UserRoles.GetTypeForCode(userRoleCode);
SaxUserRole userRole = userRoles.GetUserRoleByRole(role);
if (userRole == null)
{
userRole = AccountMgr.CreateUserRole(user?.Id, role);
userRoles.Add(userRole);
}
userRole.Status = SaStatus.Active;
}
// Roles to deactivate.
foreach (SaxUserRole userRole in userRoles)
{
if (!userRoleCodes.Exists(item => item.EqualsCI(UserRoles.GetCodeForType(userRole.UserRole))))
userRole.Status = SaStatus.Inactive;
}
userRole.Status = SaStatus.Active;
}
// Roles to deactivate.
foreach (SaxUserRole userRole in userRoles)
{
if (!userRoleCodes.Exists(item => item.EqualsCI(UserRoles.GetCodeForType(userRole.UserRole))))
userRole.Status = SaStatus.Inactive;
}
// Create new item if required.
@@ -274,9 +321,6 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
SaLogger.Warn(fn + " Failed to insert user: " + AccountMgr.ErrorStateMessage);
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"] + "\n\n" + AccountMgr.ErrorStateMessage));
}
// Apply User Account Id to dependent items.
foreach (SaxUserRole userRole in (userRoles))
userRole.UserAccountId = user.Id;
}
else
{
@@ -287,28 +331,31 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
}
}
// Associated data - User Roles.
foreach (SaxUserRole userRole in (userRoles))
if (model.UserRoleCodes != null)
{
// Store User Role.
if (!SysId.IsValid(userRole.Id))
// Associated data - User Roles.
foreach (SaxUserRole userRole in (userRoles))
{
if (!AccountMgr.InsertUserRole(userRole, DbUpdateInfo))
SaLogger.Warn(fn + " Failed to insert user role: " + AccountMgr.ErrorStateMessage);
}
else
{
if (!AccountMgr.UpdateUserRole(userRole, DbUpdateInfo))
SaLogger.Warn(fn + " Failed to update user role [Id:" + SysId.ToString(userRole.Id) + "]: " + AccountMgr.ErrorStateMessage);
// Store User Role.
if (!SysId.IsValid(userRole.Id))
{
// Apply User Account Id if not yet done (for new user).
if (!SysId.IsValid(userRole.UserAccountId))
userRole.UserAccountId = user.Id;
if (!AccountMgr.InsertUserRole(userRole, DbUpdateInfo))
SaLogger.Warn(fn + " Failed to insert user role: " + AccountMgr.ErrorStateMessage);
}
else
{
if (!AccountMgr.UpdateUserRole(userRole, DbUpdateInfo))
SaLogger.Warn(fn + " Failed to update user role [Id:" + SysId.ToString(userRole.Id) + "]: " + AccountMgr.ErrorStateMessage);
}
}
}
// Construct response.
PopulateUserResponseData(responseData.user, user, userRoles.GetUserRolesByStatus(SaStatus.Active));
// Complete response.
responseData.Success = true;
return Json(responseData);
}
@@ -52,6 +52,10 @@ namespace Saxonite.Net.Core.Web.Admin.Models
public Sax.OrganisationType OrganisationType { get { return (Sax.OrganisationType)OrganisationTypes.GetTypeForCode(OrganisationTypeValue); } }
public String OrganisationCategoryValue { get; set; }
public Sax.OrganisationCategory OrganisationCategory { get { return (Sax.OrganisationCategory)OrganisationCategories.GetTypeForCode(OrganisationCategoryValue); } }
public String OrganisationRegionId { get; set; }
public String OrganisationSportId { get; set; }
// Common properties.
public String OrganisationNotes { get; set; }
public String OrganisationStatusCode { get; set; }
public SaStatus OrganisationStatus { get { return SacsSystem.GetStatusForCode(OrganisationStatusCode); } }
@@ -89,9 +93,9 @@ namespace Saxonite.Net.Core.Web.Admin.Models
if (OrganisationStatusCode != null)
{
if (StringUtil.IsEmpty(OrganisationStatusCode))
responseData.SetControlError(nameof(OrganisationStatusCode), Localiser["msg.validation.mandatory.value"]);
responseData.SetControlError(nameof(OrganisationStatus), Localiser["msg.validation.mandatory.value"]);
else if (!SaxOrganisation.ValidStatuses.Contains(OrganisationStatus))
responseData.SetControlError(nameof(OrganisationStatusCode), Localiser["msg.validation.invalid.value"]);
responseData.SetControlError(nameof(OrganisationStatus), Localiser["msg.validation.invalid.value"]);
}
return !responseData.HasControlErrors();
@@ -91,6 +91,15 @@ namespace Saxonite.Net.Core.Web.Admin.Models
// 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();
}
@@ -127,9 +127,9 @@ namespace Saxonite.Net.Core.Web.Admin.Models
if (RegionStatusCode != null)
{
if (StringUtil.IsEmpty(RegionStatusCode))
responseData.SetControlError(nameof(RegionStatusCode), Localiser["msg.validation.mandatory.value"]);
responseData.SetControlError(nameof(RegionStatus), Localiser["msg.validation.mandatory.value"]);
else if (!SaxRegion.ValidStatuses.Contains(RegionStatus))
responseData.SetControlError(nameof(RegionStatusCode), Localiser["msg.validation.invalid.value"]);
responseData.SetControlError(nameof(RegionStatus), Localiser["msg.validation.invalid.value"]);
}
return !responseData.HasControlErrors();
@@ -77,9 +77,9 @@ namespace Saxonite.Net.Core.Web.Admin.Models
if (SportStatusCode != null)
{
if (StringUtil.IsEmpty(SportStatusCode))
responseData.SetControlError(nameof(SportStatusCode), Localiser["msg.validation.mandatory.value"]);
responseData.SetControlError(nameof(SportStatus), Localiser["msg.validation.mandatory.value"]);
else if (!SaxSport.ValidStatuses.Contains(SportStatus))
responseData.SetControlError(nameof(SportStatusCode), Localiser["msg.validation.invalid.value"]);
responseData.SetControlError(nameof(SportStatus), Localiser["msg.validation.invalid.value"]);
}
return !responseData.HasControlErrors();
@@ -54,7 +54,10 @@ namespace Saxonite.Net.Core.Web.Admin.Models
{
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; }
@@ -119,9 +122,9 @@ namespace Saxonite.Net.Core.Web.Admin.Models
if (UserStatusCode != null)
{
if (StringUtil.IsEmpty(UserStatusCode))
responseData.SetControlError(nameof(UserStatusCode), Localiser["msg.validation.mandatory.value"]);
responseData.SetControlError(nameof(UserStatus), Localiser["msg.validation.mandatory.value"]);
else if (!SaxUserAccount.ValidStatuses.Contains(UserStatus))
responseData.SetControlError(nameof(UserStatusCode), Localiser["msg.validation.invalid.value"]);
responseData.SetControlError(nameof(UserStatus), Localiser["msg.validation.invalid.value"]);
}
return !responseData.HasControlErrors();
@@ -177,6 +177,12 @@
<data name="label.iso2.code" xml:space="preserve">
<value>ISO2 code</value>
</data>
<data name="label.item.selected" xml:space="preserve">
<value>Selected item</value>
</data>
<data name="label.items.available" xml:space="preserve">
<value>Available items</value>
</data>
<data name="label.keep.signed.in" xml:space="preserve">
<value>Keep me signed-in</value>
</data>
@@ -210,12 +216,18 @@
<data name="label.refresh" xml:space="preserve">
<value>Refresh</value>
</data>
<data name="label.region" xml:space="preserve">
<value>Region</value>
</data>
<data name="label.remove" xml:space="preserve">
<value>Remove</value>
</data>
<data name="label.roles" xml:space="preserve">
<value>Roles</value>
</data>
<data name="label.search" xml:space="preserve">
<value>Search</value>
</data>
<data name="label.security" xml:space="preserve">
<value>Security</value>
</data>
@@ -228,6 +240,12 @@
<data name="label.selected.none" xml:space="preserve">
<value>none selected</value>
</data>
<data name="label.sport" xml:space="preserve">
<value>Sport</value>
</data>
<data name="label.status" xml:space="preserve">
<value>Status</value>
</data>
<data name="label.strength" xml:space="preserve">
<value>Strength</value>
</data>
@@ -336,6 +354,9 @@
<data name="region.caption.region.create" xml:space="preserve">
<value>Create Region</value>
</data>
<data name="region.caption.region.select" xml:space="preserve">
<value>Select Region</value>
</data>
<data name="region.caption.region.update" xml:space="preserve">
<value>Update Region</value>
</data>
@@ -384,6 +405,9 @@
<data name="sport.caption.sport.create" xml:space="preserve">
<value>Create Sport</value>
</data>
<data name="sport.caption.sport.select" xml:space="preserve">
<value>Select Sport</value>
</data>
<data name="sport.caption.sport.update" xml:space="preserve">
<value>Update Sport</value>
</data>
@@ -18,7 +18,7 @@
{
<div class="row">
<div class="col-sm-5 sax-label text-left text-sm-right">@Localiser["organisation.caption.organisation"]</div>
<div class="col-sm-7"><input type="text" id="" class="sax-input" name="Filter.Organisation" onkeypress="sax.organisationSelection.fn.refreshOrganisations(250)" /></div>
<div class="col-sm-7"><input type="text" id="" class="sax-input FilterOrganisation" name="Filter.Organisation" maxlength="32" /></div>
</div>
}
@@ -1,12 +1,12 @@
@model SaxModel_Admin
@inject SaxLocaliser Localiser
<link rel="stylesheet" href="~/css/sax-codeSelection.css?@Model.HrefVersion" />
<script src="~/js/sax-codeSelection.js?@Model.HrefVersion"></script>
<link rel="stylesheet" href="~/css/sax-selectCode.css?@Model.HrefVersion" />
<script src="~/js/sax-selectCode.js?@Model.HrefVersion"></script>
<script type="text/javascript">
</script>
<div id="dlgCodeSelection" class="sax-dialog sax-form">
<div id="dlgSelectCode" class="sax-dialog sax-form">
@* Filter *@
<div class="">
@@ -18,7 +18,7 @@
@* Available codes *@
<div class="col-sm-5">
<div class="h-100 sax-codeSelection-codes AvailableCodes">
<div class="h-100 sax-selectCode-codes AvailableCodes">
</div>
@@ -30,11 +30,11 @@
<div class="row">
<div class="col-sx-6 col-sm-12 center">
<button class="sax-button" onclick="">@Localiser["label.select"]</button>
<button class="sax-button Select">@Localiser["label.select"]</button>
</div>
<div class="col-sx-6 col-sm-12 center">
<button class="sax-button" onclick="">@Localiser["label.remove"]</button>
<button class="sax-button Remove">@Localiser["label.remove"]</button>
</div>
</div>
@@ -44,7 +44,7 @@
@* Selected codes *@
<div class="col-sm-5">
<div class="h-100 sax-codeSelection-codes SelectedCodes">
<div class="h-100 sax-selectCode-codes SelectedCodes">
</div>
</div>
@@ -0,0 +1,49 @@
@model SaxModel_Admin
@inject SaxLocaliser Localiser
<link rel="stylesheet" href="~/css/sax-selectItem.css?@Model.HrefVersion" />
<div id="dlgSelectItem" class="sax-dialog sax-form">
<div class="container-fluid h-100">
@* Selected Item *@
<div class="SelectedItem">
<div class="row">
<div class="col-sm-12"><div class="sax-label">@Localiser["label.item.selected"]:</div></div>
<div class="col-sm-12"><div class="SelectedItemName"></div></div>
</div>
<div class="spacer2"></div>
</div>
@* Item Filter *@
<div class="ItemFilter sax-form">
<div class="row">
<div class="col right"><div class="sax-label">@Localiser["label.search"]</div></div>
<div class="fixed"><input id="ifItemFilter" class="sax-input" type="text" onkeyup="sax.data.selectItem.fn.displayItems();" /></div>
</div>
<div class="spacer2"></div>
</div>
@* Available items *@
<div class="row">
<div class="col"><div class="sax-label bottom">@Localiser["label.items.available"]:</div></div>
</div>
<div class="row">
<div class="col-sm-12 sax-selectItem-items AvailableItems"></div>
</div>
</div>
<div class="sax-panel-item-template">
<div class="sax-panel-item Item">
<div class="ItemName"></div>
</div>
</div>
<script src="~/js/sax-selectItem.js?@Model.HrefVersion"></script>
</div>
@@ -19,7 +19,7 @@
{
<div class="row">
<div class="col-sm-5 sax-label text-left text-sm-right">@Localiser["organisation.caption.organisation"]</div>
<div class="col-sm-7">@Html.TextBoxFor(model => model.Filter.Organisation, new { @id = "ifFilterOrganisation", @class = "FilterOrganisation", @maxlength = "32", @onkeypress = "sax.refreshResults(250)" })</div>
<div class="col-sm-7">@Html.TextBoxFor(model => model.Filter.Organisation, new { @id = "ifFilterOrganisation", @class = "FilterOrganisation", @maxlength = "32" })</div>
</div>
}
</div>
@@ -39,12 +39,12 @@
<div class="row">
<div class="col-sm-4"><div class="OrganisationCategory"></div></div>
<div class="col-sm-4"><div class="OrganisationType"></div></div>
<div class="col-sm-4 right"><div class=""></div></div>
<div class="col-sm-4 text-left text-sm-right"><div class="OrganisationRegion"></div></div>
</div>
<div class="row">
<div class="col-sm-4"><div class="OrganisationSport"></div></div>
<div class="col-sm-4"><div class="OrganisationMemberCount sax-action-text">@Localiser["label.members"]:&nbsp;<span class="MemberCount"></span></div></div>
<div class="col-sm-4"><div class=""></div></div>
<div class="col-sm-4 right"><div class="StatusDesc"></div></div>
<div class="col-sm-4 text-left text-sm-right"><div class="StatusDesc"></div></div>
</div>
</div>
</div>
@@ -12,10 +12,14 @@
sax.dlg.title.selectMemberRoles = '@Localiser.GetJavascriptText("organisation.caption.select.member.roles")';
sax.data.userRoleCodeDelim = '@Model.MemberRoleCodeDelim';
</script>
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmMemberId", @class = "sax-form" }))
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmMemberId" }))
{
@Html.HiddenFor(model => model.UserOrganisationId, new { @id = "", @class = "UserOrganisationId" })
}
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmUserEmail"}))
{
<input type="hidden" id="" class="UserEmailAddress" name="UserEmailAddress" />
}
<div id="dlgMember" class="sax-dialog" title="">
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmMember", @class = "sax-form", @onSubmit = "return false;" }))
@@ -58,8 +62,19 @@
<div class="sax-message"></div>
</div>
@* Member status *@
<div class="sax-form-control MemberStatus">
<div class="sax-label">
<label for="cbMemberStatus"><span><span class="required">*</span> @Localiser["label.status"]</span></label>
</div>
<div class="sax-control">
<select id="cbMemberStatus" class="sax-select MemberStatus" name="MemberStatusCode"></select>
</div>
<div class="sax-message"></div>
</div>
}
<partial name="~/Views/Common/CodeSelection.cshtml" />
<partial name="~/Views/Common/SelectCode.cshtml" />
</div>
@@ -7,6 +7,8 @@
<script type="text/javascript">
sax.dlg.title.createOrganisation = '@Localiser.GetJavascriptText("organisation.caption.organisation.create")';
sax.dlg.title.updateOrganisation = '@Localiser.GetJavascriptText("organisation.caption.organisation.update")';
sax.dlg.title.selectRegion = '@Localiser.GetJavascriptText("region.caption.region.select")';
sax.dlg.title.selectSport = '@Localiser.GetJavascriptText("sport.caption.sport.select")';
</script>
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmOrganisationId", @class = "sax-form" }))
{
@@ -16,7 +18,7 @@
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmOrganisation", @class = "sax-form", @onSubmit = "return false;" }))
{
@Html.HiddenFor(model => model.OrganisationId, new { @id="", @class = "OrganisationId" })
@Html.HiddenFor(model => model.OrganisationId, new { @id = "", @class = "OrganisationId" })
@* Organisation name *@
<div class="sax-form-control OrganisationName">
@@ -51,8 +53,45 @@
<div class="sax-message"></div>
</div>
@* Organisation country *@
@* Organisation region *@
<div class="sax-form-control OrganisationRegionId">
<div class="sax-label">
<label for="ifOrganisationRegionId"><span><span class="required">*</span> @Localiser["label.region"]</span></label>
</div>
<div class="sax-control row">
@Html.HiddenFor(model => model.OrganisationRegionId, new { @id = "ifOrganisationRegionId", @class = "OrganisationRegionId" })
<div class="col"><input type="text" id="ifOrganisationRegionCaption" class="OrganisationRegionCaption sax-input" readonly="readonly" ondblclick="sax.selectRegion()" /> </div>
<div class="fixed"><button id="pbSelectRegion" class="sax-button" style="min-width:auto;margin-left:4px;padding:4px 6px" onclick="sax.selectRegion()">@Localiser["label.select"]</button></div>
</div>
<div class="sax-message"></div>
</div>
@* Organisation sport *@
<div class="sax-form-control OrganisationSportId">
<div class="sax-label">
<label for="ifOrganisationSportId"><span><span class="required">*</span> @Localiser["label.sport"]</span></label>
</div>
<div class="sax-control row">
@Html.HiddenFor(model => model.OrganisationSportId, new { @id = "ifOrganisationSportId", @class = "OrganisationSportId" })
<div class="col"><input type="text" id="ifOrganisationSportCaption" class="OrganisationSportCaption sax-input" readonly="readonly" ondblclick="sax.selectSport()" /> </div>
<div class="fixed"><button id="pbSelectSport" class="sax-button" style="min-width:auto;margin-left:4px;padding:4px 6px" onclick="sax.selectSport()">@Localiser["label.select"]</button></div>
</div>
<div class="sax-message"></div>
</div>
@* Organisation status *@
<div class="sax-form-control OrganisationStatus">
<div class="sax-label">
<label for="cbOrganisationStatus"><span><span class="required">*</span> @Localiser["label.status"]</span></label>
</div>
<div class="sax-control">
<select id="cbOrganisationStatus" class="sax-select OrganisationStatus" name="OrganisationStatusCode"></select>
</div>
<div class="sax-message"></div>
</div>
}
<partial name="~/Views/Common/SelectItem.cshtml" />
</div>
@@ -19,7 +19,7 @@
{
<div class="row">
<div class="col-sm-5 sax-label text-left text-sm-right">@Localiser["region.caption.region"]</div>
<div class="col-sm-7">@Html.TextBoxFor(model => model.Filter.Region, new { @id = "ifFilterRegion", @class = "FilterRegion", @maxlength = "32", @onkeypress = "sax.refreshResults(250)" })</div>
<div class="col-sm-7">@Html.TextBoxFor(model => model.Filter.Region, new { @id = "ifFilterRegion", @class = "FilterRegion", @maxlength = "32" })</div>
</div>
}
</div>
@@ -51,6 +51,17 @@
<div class="sax-message"></div>
</div>
@* Region status *@
<div class="sax-form-control RegionStatus">
<div class="sax-label">
<label for="cbRegionStatus"><span><span class="required">*</span> @Localiser["label.status"]</span></label>
</div>
<div class="sax-control">
<select id="cbRegionStatus" class="sax-select RegionStatus" name="RegionStatusCode"></select>
</div>
<div class="sax-message"></div>
</div>
}
</div>
@@ -19,7 +19,7 @@
{
<div class="row">
<div class="col-sm-5 sax-label text-left text-sm-right">@Localiser["sport.caption.sport"]</div>
<div class="col-sm-7">@Html.TextBoxFor(model => model.Filter.Sport, new { @id = "ifFilterSport", @class = "FilterSport", @maxlength = "32", @onkeypress = "sax.refreshResults(250)" })</div>
<div class="col-sm-7">@Html.TextBoxFor(model => model.Filter.Sport, new { @id = "ifFilterSport", @class = "FilterSport", @maxlength = "32" })</div>
</div>
}
</div>
@@ -29,6 +29,17 @@
<div class="sax-message"></div>
</div>
@* Sport status *@
<div class="sax-form-control SportStatus">
<div class="sax-label">
<label for="cbSportStatus"><span><span class="required">*</span> @Localiser["label.status"]</span></label>
</div>
<div class="sax-control">
<select id="cbSportStatus" class="sax-select SportStatus" name="SportStatusCode"></select>
</div>
<div class="sax-message"></div>
</div>
}
</div>
+1 -1
View File
@@ -19,7 +19,7 @@
{
<div class="row">
<div class="col-sm-5 sax-label text-left text-sm-right">@Localiser["user.caption.user"]</div>
<div class="col-sm-7">@Html.TextBoxFor(model => model.Filter.User, new { @id = "ifFilterUser", @class = "FilterUser", @maxlength = "32", @onkeypress = "sax.refreshResults(250)" })</div>
<div class="col-sm-7">@Html.TextBoxFor(model => model.Filter.User, new { @id = "ifFilterUser", @class = "FilterUser", @maxlength = "32" })</div>
</div>
}
</div>
@@ -76,8 +76,19 @@
<div class="sax-message"></div>
</div>
@* User status *@
<div class="sax-form-control UserStatus">
<div class="sax-label">
<label for="cbUserStatus"><span><span class="required">*</span> @Localiser["label.status"]</span></label>
</div>
<div class="sax-control">
<select id="cbUserStatus" class="sax-select UserStatus" name="UserStatusCode"></select>
</div>
<div class="sax-message"></div>
</div>
}
<partial name="~/Views/Common/CodeSelection.cshtml" />
<partial name="~/Views/Common/SelectCode.cshtml" />
</div>
@@ -4,7 +4,7 @@
/* Panels */
.sax-codeSelection-codes
.sax-selectCode-codes
{
padding:2px 0;
background-color:#f0f0f0;
@@ -12,7 +12,7 @@
border-radius: 6px;
}
#dlgCodeSelection.sax-form button.sax-button
#dlgSelectCode.sax-form button.sax-button
{
margin: 4px 0;
}
@@ -0,0 +1,61 @@
/*
Item Selection stylesheet.
*/
/* Panels */
#dlgSelectItem .SelectedItemName
{
min-height: 1.5rem;
padding: 2px 4px;
background-color: #f0f0f0;
border: 1px solid #b0b0b0;
border-radius: 4px;
overflow: hidden;
}
#dlgSelectItem .ItemFilter .sax-label
{
margin-right: 6px;
}
#dlgSelectItem .sax-button
{
padding: 2px 8px;
border-radius: 6px;
}
#dlgSelectItem .sax-selectItem-items
{
margin-bottom: 8px;
padding: 2px 0;
background-color: #f0f0f0;
border: 1px solid #b0b0b0;
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
overflow-x: hidden;
overflow-y: scroll;
}
#dlgSelectItem.sax-form button.sax-button
{
margin: 4px 0;
}
#dlgSelectItem .sax-panel-item.Item
{
margin: 2px 4px;
padding: 2px 4px;
background-color: #fff;
border: 2px solid #d8d8ff;
border-radius: 4px;
cursor: pointer;
}
#dlgSelectItem .sax-panel-item.Item.sel
{
background-color: #ececff;
border-color: #8a8aff;
}
/* The End */
@@ -1,83 +0,0 @@
/*
* Admin - User page scripts.
*/
(function (win, doc, undef)
{
"use strict";
let cs = sax.codeSelection = sax.codeSelection || { fn: {}, $dlg: {}, codeIdPrefix: 'Code_' };
//--------------------------------------------------------------
/*
* Code selection config:
* - caption - dialog title.
* - width: preferred dialog width (default: 400).
* - height: preferred dialog height (default: 400).
* - showFilter: whether to display filter control(s).
* - filterLabel: filter code field caption.
* - maxItems: maximum number of available items to list.
* - codes - list of {code,desc,comment} objects
* - selectedCodes - list of codes.
* - fnCallback - method to call on completion to store codes taking list of selected codes as parameter.
*/
cs.fn.openCodeSelection = function (cfg)
{
sax.debug('openCodeSelection', cfg);
cs.fn.init();
cs.cfg = cfg;
cs.selectedCodes = cfg.selectedCodes || [];
cs.fn.displayCodes(cfg.codes);
sax.openDialog(cs.$dlg.dialog('option', { title: cfg.caption || 'Select Codes' }), cs.cfg.width || 400, cs.cfg.height || 400);
}
cs.fn.displayCodes = function (codes)
{
let $codesAvail = $('.sax-codeSelection-codes.AvailableCodes').empty();
let $codesSelec = $('.sax-codeSelection-codes.SelectedCodes').empty();
let $codeTmpl = $('.sax-panel-item-template .sax-panel-item.Code');
for (let codeIdx = 0; codeIdx < codes.length; codeIdx++)
{
let code = codes[codeIdx];
let selected = cs.selectedCodes.indexOf(code.code) >= 0;
let $code = $codeTmpl.clone();
$($code).prop('id', cs.codeIdPrefix + code.code).attr('aria-code', code.code).on('click', function () { cs.fn.onClickCode(code.code); }).on('dblclick', function () { cs.fn.onDblClickCode(code.code); }).find('.CodeDesc').text(code.desc).end();
if (selected) $codesSelec.append($code);
else $codesAvail.append($code);
}
}
cs.fn.onClickCode = function (code)
{
$('.sax-panel-item.Code').removeClass('sel');
$('.sax-panel-item.Code[aria-code="' + code + '"]').addClass('sel');
}
cs.fn.onDblClickCode = function (code)
{
let codeIdx = cs.selectedCodes.indexOf(code);
//sax.debug('onDblClickCode', code, codeIdx);
if (codeIdx >= 0) cs.selectedCodes.splice(codeIdx, 1); else cs.selectedCodes.push(code)
cs.fn.displayCodes(cs.cfg.codes)
$('.sax-panel-item.Code[aria-code="' + code + '"]').addClass('sel');
}
cs.fn.storeCodeSelection = function ()
{
//sax.debug('storeCodeSelection', cs.cfg, cs.selectedCodes);
if (cs.cfg.fnCallback) cs.cfg.fnCallback(cs.selectedCodes);
cs.$dlg.dialog('close');
delete cs.cfg;
delete cs.selectedCodes;
}
//--------------------------------------------------------------
cs.fn.init = function ()
{
if (!cs.$dlg) return;
var opt = sax.dlgOpts();
opt.buttons[sax.dlg.btn.ok] = function () { cs.fn.storeCodeSelection(); };
opt.buttons[sax.dlg.btn.cancel] = function () { $(this).dialog('close'); };
cs.$dlg = $('#dlgCodeSelection').dialog(opt);
}
}(window, window.document));
/* The End */
@@ -31,6 +31,10 @@
{
return sax.isNumeric(value) ? parseInt(value, 10) : defaultValue || 0;
}
sax.escapeRegExp = function (val)
{
return (val || '').replace(/[[{}()*+?^$|\]\.\\]/g, "\\$&");
}
sax.debug = sax.debugMode ? win.console.log.bind(win.console) : function () { };
//--------------------------------------------------------------
@@ -56,6 +60,12 @@
return index % 2 == 1 ? "other" : "";
});
}
sax.populateSelectCodeDesc = function ($sel, values)
{
$sel = $($sel).empty();
for (const value of values)
$sel.append($('<option>').prop('value', value.code).text(value.desc));
}
sax.checkTextAreaMaxLength = function (ctrl, len)
{
if (ctrl == null || ctrl.value == null) return;
@@ -460,6 +470,7 @@
}(window, window.document));
//--------------------------------------------------------------
(function ()
{
if (typeof Object.defineProperty === 'function')
@@ -1,147 +1,223 @@
/*
* Admin - Organisation page scripts.
*/
"use strict";
sax.itemIdPrefix = 'Itm_';
//--------------------------------------------------------------
sax.refreshResults = function (delay)
(function (win, doc, undef)
{
var $results = $('.sax-panel-results');
if (!sax.awaitingRefreshResponse)
{
var $items = $('.sax-panel-item-list', $results).fadeOut(200).empty();
var $msgs = $('.sax-panel-messages', $results).hide().empty().append($('<div class="sax-message">' + sax.msg.dataQuerying + '</div>')).fadeIn(200);
}
sax.ajaxRefreshResults = sax.ajaxRefreshResults || { url: sax.url.base + 'Organisation/Ajax/GetList', formId: 'frmOrganisationFilter', callbackFn: sax.doRefreshResults };
sax.doAjaxRequest(sax.ajaxRefreshResults, delay || 50);
sax.awaitingRefreshResponse = true;
}
sax.doRefreshResults = function (response)
{
sax.debug('doRefreshResults', response);
delete sax.awaitingRefreshResponse;
sax.refreshControlValues(response.controlValues);
var $results = $('.sax-panel-results');
var $msgs = $('.sax-panel-messages', $results).hide().empty();
var $items = $('.sax-panel-item-list', $results).hide().empty();
var $templ = $('.sax-panel-item-template .sax-panel-item.Organisation', $results);
if (!response.success) return;
// Items.
var items = response.organisations;
if (!items.length)
return $msgs.append($('<div class="sax-message">' + sax.msg.dataNoneFound + '</div>')).fadeIn(500);
for (let itemIdx = 0; itemIdx < items.length; itemIdx++)
{
let item = items[itemIdx];
let $item = $templ.clone();
sax.populateItem($item, item);
$items.append($item);
}
$items.fadeIn(50);
}
sax.populateItem = function ($item, item)
{
if (!item) return;
$item.prop('id', sax.itemIdPrefix + item.id);
$('.OrganisationName', $item).text(item.name);
$('.OrganisationType', $item).text(item.typeDesc);
$('.OrganisationCategory', $item).text(item.categoryDesc);
$('.OrganisationMemberCount', $item).on('click', function () { sax.onClickMemberCount(item.id); }).find('.MemberCount').text(item.memberCount);
$('.StatusDesc', $item).text(item.statusDesc);
$('.sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
}
"use strict";
sax.itemIdPrefix = 'Itm_';
//--------------------------------------------------------------
sax.createItem = function ()
{
$('.OrganisationId,input[type="text"],textarea,select', sax.$frm.organisation).val('');
sax.clearControlErrors();
sax.$dlg.organisation.dialog('option', 'title', sax.dlg.title.createOrganisation);
sax.openDialog(sax.$dlg.organisation, 600, 600);
}
sax.doCreateItem = function ()
{
sax.storeItem();
}
//--------------------------------------------------------------
sax.updateItem = function (id)
{
$('.OrganisationId', sax.$frm.organisationId).val(id);
sax.ajaxUpdateItem = sax.ajaxUpdateItem || { url: sax.url.base + 'Organisation/Ajax/GetItem', formId: 'frmOrganisationId', callbackFn: sax.onUpdateItem };
sax.doAjaxRequest(sax.ajaxUpdateItem, 50);
}
sax.onUpdateItem = function (response)
{
//sax.debug('onUpdateItem', response);
let $frm = sax.$frm.organisation;
$('.OrganisationId,input[type="text"],textarea,select', $frm).val('');
if (!response.success) return;
let item = response.organisation;
$('.OrganisationId', $frm).val(item.id);
$('.OrganisationName', $frm).val(item.name);
$('.OrganisationType', $frm).val(item.typeCode);
$('.OrganisationCategory', $frm).val(item.categoryCode);
sax.clearControlErrors();
sax.$dlg.organisation.dialog('option', 'title', sax.dlg.title.updateOrganisation);
sax.openDialog(sax.$dlg.organisation, 600, 600);
}
sax.doUpdateItem = function ()
{
sax.storeItem();
}
//--------------------------------------------------------------
sax.storeItem = function ()
{
sax.ajaxStoreItem = sax.ajaxStoreItem || { url: sax.url.base + 'Organisation/Ajax/StoreItem', formId: 'frmOrganisation', callbackFn: sax.onStoreItem };
sax.doAjaxRequest(sax.ajaxStoreItem, 50);
}
sax.onStoreItem = function (response)
{
//sax.debug('onStoreItem', response);
sax.refreshControlValues(response.controlValues);
if (!response.success) return;
sax.$dlg.organisation.dialog('close');
var item = response.organisation;
var $item = $('#' + sax.itemIdPrefix + item.id);
if (!$item.length)
//--------------------------------------------------------------
sax.refreshResults = function (delay)
{
var $results = $('.sax-panel-results');
$item = $('.sax-panel-item-template .sax-panel-item.Organisation', $results).clone();
$('.sax-panel-item-list', $results).prepend($item).show();
if (!sax.awaitingRefreshResponse)
{
var $items = $('.sax-panel-item-list', $results).fadeOut(200).empty();
var $msgs = $('.sax-panel-messages', $results).hide().empty().append($('<div class="sax-message">' + sax.msg.dataQuerying + '</div>')).fadeIn(200);
}
sax.ajaxRefreshResults = sax.ajaxRefreshResults || { url: sax.url.base + 'Organisation/Ajax/GetList', formId: 'frmOrganisationFilter', callbackFn: sax.doRefreshResults };
sax.doAjaxRequest(sax.ajaxRefreshResults, delay || 50);
sax.awaitingRefreshResponse = true;
}
sax.doRefreshResults = function (response)
{
sax.debug('doRefreshResults', response);
delete sax.awaitingRefreshResponse;
sax.refreshControlValues(response.controlValues);
var $results = $('.sax-panel-results');
var $msgs = $('.sax-panel-messages', $results).hide().empty();
var $items = $('.sax-panel-item-list', $results).hide().empty();
var $templ = $('.sax-panel-item-template .sax-panel-item.Organisation', $results);
if (!response.success) return;
// Reference data - Statuses.
if (response.defaultStatusCode) sax.data.defaultStatusCode = response.defaultStatusCode;
if (response.statuses)
sax.populateSelectCodeDesc('#cbOrganisationStatus', response.statuses);
// Items.
var items = response.organisations;
if (!items.length)
return $msgs.append($('<div class="sax-message">' + sax.msg.dataNoneFound + '</div>')).fadeIn(500);
for (let itemIdx = 0; itemIdx < items.length; itemIdx++)
{
let item = items[itemIdx];
let $item = $templ.clone();
sax.populateItem($item, item);
$items.append($item);
}
$items.fadeIn(50);
}
sax.populateItem = function ($item, item)
{
if (!item) return;
$item.prop('id', sax.itemIdPrefix + item.id);
$('.OrganisationName', $item).text(item.name);
$('.OrganisationType', $item).text(item.typeDesc);
$('.OrganisationCategory', $item).text(item.categoryDesc);
$('.OrganisationRegion', $item).text(item.regionName);
$('.OrganisationSport', $item).text(item.sportName);
$('.OrganisationMemberCount', $item).on('click', function () { sax.onClickMemberCount(item.id); }).find('.MemberCount').text(item.memberCount);
$('.StatusDesc', $item).text(item.statusDesc);
$('.sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
}
sax.populateItem($item, item)
}
//--------------------------------------------------------------
sax.onClickMemberCount = function (id)
{
if (!(id * 1)) return;
sax.doPleaseWait();
let $frm = $('#frmOrganisationId');
$('.OrganisationId',$frm).val(id);
$frm.prop('action', sax.url.base + 'Organisation/Members').submit();
}
//--------------------------------------------------------------
sax.selectRegion = function ()
{
if (!sax.data.regions)
{
let handleRegionsResponse = function (response)
{
if (response && response.success && response.regions)
sax.data.regions = response.regions;
sax.showSelectRegion();
}
sax.ajaxRegions = sax.ajaxRegions || { url: sax.url.base + 'Region/Ajax/GetList', formId: 'frmNavigate', callbackFn: handleRegionsResponse };
sax.doAjaxRequest(sax.ajaxRegions, 50);
}
else sax.showSelectRegion();
}
sax.showSelectRegion = function ()
{
sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectRegion, items: sax.data.regions, fnCallback: sax.onRegionSelected });
}
sax.onRegionSelected = function (rgn)
{
sax.debug('onRegionSelected', rgn);
let $frm = sax.$frm.organisation;
$('.OrganisationRegionId', $frm).val(rgn.id);
$('.OrganisationRegionCaption', $frm).val(rgn.name);
}
//--------------------------------------------------------------
$(function ()
{
$('.sax-panel-filter .sax-action.sax-item-create').on('click', function () { sax.createItem(); });
$('.sax-panel-filter .sax-action.sax-results-refresh').on('click', function () { sax.refreshResults(); });
$('.sax-input').on('keydown', function () { sax.clearControlError(this); });
//--------------------------------------------------------------
sax.selectSport = function ()
{
if (!sax.data.sports)
{
let handleSportsResponse = function (response)
{
if (response && response.success && response.sports)
sax.data.sports = response.sports;
sax.showSelectSport();
}
sax.ajaxSports = sax.ajaxSports || { url: sax.url.base + 'Sport/Ajax/GetList', formId: 'frmNavigate', callbackFn: handleSportsResponse };
sax.doAjaxRequest(sax.ajaxSports, 50);
}
else sax.showSelectSport();
}
sax.showSelectSport = function ()
{
sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectSport, items: sax.data.sports, fnCallback: sax.onSportSelected });
}
sax.onSportSelected = function (rgn)
{
sax.debug('onSportSelected', rgn);
let $frm = sax.$frm.organisation;
$('.OrganisationSportId', $frm).val(rgn.id);
$('.OrganisationSportCaption', $frm).val(rgn.name);
}
sax.$frm.organisationId = $('#frmOrganisationId');
sax.$frm.organisation = $('#frmOrganisation');
//--------------------------------------------------------------
sax.createItem = function ()
{
let $frm = sax.$frm.organisation;
$('.OrganisationId,.OrganisationRegionId,.OrganisationSportId,input[type="text"],textarea,select', $frm).val('');
$('.OrganisationStatus', $frm).val(sax.data.defaultStatusCode);
sax.clearControlErrors();
sax.$dlg.organisation.dialog('option', 'title', sax.dlg.title.createOrganisation);
sax.openDialog(sax.$dlg.organisation, 600, 600);
}
sax.doCreateItem = function ()
{
sax.storeItem();
}
var opt = sax.dlgOpts();
opt.buttons[sax.dlg.btn.ok] = function () { sax.doCreateItem(); };
opt.buttons[sax.dlg.btn.cancel] = function () { $(this).dialog('close'); };
sax.$dlg.organisation = $('#dlgOrganisation').dialog(opt);
//--------------------------------------------------------------
sax.updateItem = function (id)
{
$('.OrganisationId', sax.$frm.organisationId).val(id);
sax.ajaxUpdateItem = sax.ajaxUpdateItem || { url: sax.url.base + 'Organisation/Ajax/GetItem', formId: 'frmOrganisationId', callbackFn: sax.onUpdateItem };
sax.doAjaxRequest(sax.ajaxUpdateItem, 50);
}
sax.onUpdateItem = function (response)
{
//sax.debug('onUpdateItem', response);
let $frm = sax.$frm.organisation;
$('.OrganisationId,input[type="text"],textarea,select', $frm).val('');
if (!response.success) return;
let item = response.organisation;
$('.OrganisationId', $frm).val(item.id);
$('.OrganisationName', $frm).val(item.name);
$('.OrganisationType', $frm).val(item.typeCode);
$('.OrganisationCategory', $frm).val(item.categoryCode);
$('.OrganisationRegionId', $frm).val(item.regionId);
$('.OrganisationRegionCaption', $frm).val(item.regionName);
$('.OrganisationSportId', $frm).val(item.sportId);
$('.OrganisationSportCaption', $frm).val(item.sportName);
$('.OrganisationStatus', $frm).val(item.statusCode);
sax.clearControlErrors();
sax.$dlg.organisation.dialog('option', 'title', sax.dlg.title.updateOrganisation);
sax.openDialog(sax.$dlg.organisation, 600, 600);
}
sax.doUpdateItem = function ()
{
sax.storeItem();
}
setTimeout(sax.refreshResults, 250);
});
//--------------------------------------------------------------
sax.storeItem = function ()
{
sax.ajaxStoreItem = sax.ajaxStoreItem || { url: sax.url.base + 'Organisation/Ajax/StoreItem', formId: 'frmOrganisation', callbackFn: sax.onStoreItem };
sax.doAjaxRequest(sax.ajaxStoreItem, 50);
}
sax.onStoreItem = function (response)
{
//sax.debug('onStoreItem', response);
sax.refreshControlValues(response.controlValues);
if (!response.success) return;
sax.$dlg.organisation.dialog('close');
//--------------------------------------------------------------
var item = response.organisation;
var $item = $('#' + sax.itemIdPrefix + item.id);
if (!$item.length)
{
var $results = $('.sax-panel-results');
$item = $('.sax-panel-item-template .sax-panel-item.Organisation', $results).clone();
$('.sax-panel-item-list', $results).prepend($item).show();
}
sax.populateItem($item, item)
}
//--------------------------------------------------------------
sax.onClickMemberCount = function (id)
{
if (!(id * 1)) return;
sax.doPleaseWait();
let $frm = $('#frmOrganisationId');
$('.OrganisationId', $frm).val(id);
$frm.prop('action', sax.url.base + 'Organisation/Members').submit();
}
//--------------------------------------------------------------
$(function ()
{
$('.sax-panel-filter .sax-action.sax-item-create').on('click', function () { sax.createItem(); });
$('.sax-panel-filter .sax-action.sax-results-refresh').on('click', function () { sax.refreshResults(); });
$('.sax-input').on('input', function () { sax.clearControlError(this); });
sax.$frm.filter = $('#frmOrganisationFilter');
$('.FilterOrganisation', sax.$frm.filter).on('input', function () { sax.refreshResults(250); });
sax.$frm.organisationId = $('#frmOrganisationId');
sax.$frm.organisation = $('#frmOrganisation');
var opt = sax.dlgOpts();
opt.buttons[sax.dlg.btn.ok] = function () { sax.doCreateItem(); };
opt.buttons[sax.dlg.btn.cancel] = function () { $(this).dialog('close'); };
sax.$dlg.organisation = $('#dlgOrganisation').dialog(opt);
setTimeout(sax.refreshResults, 250);
});
}(window, window.document));
/* The End */
@@ -30,9 +30,13 @@
var $items = $('.sax-panel-item-list', $results).hide().empty();
var $templ = $('.sax-panel-item-template .sax-panel-item.Member', $results);
if (!response.success) return;
// Reference data.
// Reference data - roles.
if (response.memberRoles && response.memberRoles.length)
sax.data.memberRoles = response.memberRoles;
// Reference data - Statuses.
if (response.defaultStatusCode) sax.data.defaultStatusCode = response.defaultStatusCode;
if (response.statuses)
sax.populateSelectCodeDesc('#cbMemberStatus', response.statuses);
// Items.
var items = response.members;
if (!items.length)
@@ -60,7 +64,7 @@
//--------------------------------------------------------------
sax.selectOrganisation = function ()
{
sax.debug('sax.selectOrganisation');
//sax.debug('sax.selectOrganisation');
sax.organisationSelection.fn.openDialog({ caption: sax.dlg.title.selectOrganisation, fnCallback: sax.onOrganisationSelected });
}
sax.onOrganisationSelected = function (id, name)
@@ -71,6 +75,22 @@
sax.refreshResults(50);
}
//--------------------------------------------------------------
sax.onChangeEmail = function ()
{
let $frm = sax.$frm.member;
let $mbrName = $('.MemberUserName', $frm);
$('#frmUserEmail .UserEmailAddress').val($('.MemberUserEmailAddress', $frm).val());
$mbrName.val('');
let fn = function (response)
{
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);
}
//--------------------------------------------------------------
// Member Roles.
sax.selectMemberRoles = function ()
@@ -79,7 +99,7 @@
sax.selectMemberRoleConfig = sax.selectMemberRoleConfig || { caption: sax.dlg.title.selectMemberRoles, width: 520, fnCallback: sax.updateMemberRoles };
sax.selectMemberRoleConfig.codes = sax.data.memberRoles;
sax.selectMemberRoleConfig.selectedCodes = sax.member.roleCodes || [];
sax.codeSelection.fn.openCodeSelection(sax.selectMemberRoleConfig);
sax.selectCode.fn.openSelectCode(sax.selectMemberRoleConfig);
}
sax.updateMemberRoles = function (memberRoleCodes)
{
@@ -108,6 +128,7 @@
$('.UserOrganisationId,.MemberRoleCodes,input[type="text"],textarea,select', $frm).val('');
$('.MemberOrganisationId', $frm).val($('#frmMemberFilter #ifFilterOrganisationId').val());
$('.MemberUserEmailAddress', $frm).prop('readonly', false);
$('.MemberStatus', $frm).val(sax.data.defaultStatusCode);
sax.clearControlErrors();
sax.member = { roleCodes: [] };
sax.$dlg.member.dialog('option', 'title', sax.dlg.title.createMember);
@@ -138,6 +159,7 @@
$('.MemberUserName', $frm).val(item.displayName).prop('readonly', true);
$('.MemberRoleCodes', $frm).val(item.roleCodes);
$('#ifMemberRoles').val(sax.getSelectedMemberRoleDescs().join('\n'));
$('.MemberStatus', $frm).val(item.statusCode);
sax.clearControlErrors();
sax.$dlg.member.dialog('option', 'title', sax.dlg.title.updateMember);
sax.openDialog(sax.$dlg.member, 600, 600);
@@ -171,21 +193,16 @@
sax.populateItem($item, item)
}
//--------------------------------------------------------------
sax.onClickMemberCount = function (id)
{
sax.debug('onClickMemberCount', id);
}
//--------------------------------------------------------------
$(function ()
{
$('.sax-panel-filter .sax-action.sax-item-create').on('click', function () { sax.createItem(); });
$('.sax-panel-filter .sax-action.sax-results-refresh').on('click', function () { sax.refreshResults(); });
$('.sax-input').on('keydown', function () { sax.clearControlError(this); });
$('.sax-input').on('input', function () { sax.clearControlError(this); });
sax.$frm.memberId = $('#frmMemberId');
sax.$frm.member = $('#frmMember');
$('#ifMemberUserEmailAddress', sax.$frm.member).on('change', function () { sax.onChangeEmail(); });
var opt = sax.dlgOpts();
opt.buttons[sax.dlg.btn.ok] = function () { sax.doCreateItem(); };
@@ -32,8 +32,8 @@
{
//sax.debug('os.doRefreshResults', response);
if (!response.success) return;
let $results = $('.sax-selection-results.Organisations').empty().hide();
let $tmpl = $('.sax-panel-item-template .sax-panel-item.Organisation');
let $results = $('.sax-selection-results.Organisations', os.$dlg).empty().hide();
let $tmpl = $('.sax-panel-item-template .sax-panel-item.Organisation', os.$dlg);
let items = response.organisations;
if (items)
{
@@ -51,10 +51,10 @@
{
//sax.debug('onClickOrganisation', item);
os.data.item = item;
$('.sax-panel-item.Organisation').removeClass('sel');
$('.sax-panel-item.Organisation#' + os.itemIdPrefix + item.id).addClass('sel');
$('.sax-panel-item.Organisation', os.$dlg).removeClass('sel');
$('.sax-panel-item.Organisation#' + os.itemIdPrefix + item.id, os.$dlg).addClass('sel');
}
os.fn.onDblClickOrganisation= function (item)
os.fn.onDblClickOrganisation = function (item)
{
//sax.debug('onDblClickCode', item);
os.data.item = item;
@@ -62,7 +62,7 @@
}
os.fn.confirmSelection = function ()
{
//sax.debug('storeCodeSelection', os.data.item);
//sax.debug('confirmSelection', os.data.item);
if (!os.data.item) return;
if (os.cfg.fnCallback) os.cfg.fnCallback(os.data.item.id, os.data.item.name);
os.$dlg.dialog('close');
@@ -79,6 +79,8 @@
opt.buttons[sax.dlg.btn.ok] = function () { os.fn.confirmSelection(); };
opt.buttons[sax.dlg.btn.cancel] = function () { $(this).dialog('close'); };
os.$dlg = $('#dlgOrganisationSelection').dialog(opt);
$('.sax-input.FilterOrganisation', os.$dlg).on('input', function () { sax.organisationSelection.fn.refreshOrganisations(250); });
}
}(window, window.document));
+137 -123
View File
@@ -1,137 +1,151 @@
/*
* Admin - Region page scripts.
*/
"use strict";
sax.itemIdPrefix = 'Itm_';
//--------------------------------------------------------------
sax.refreshResults = function (delay)
(function (win, doc, undef)
{
var $results = $('.sax-panel-results');
if (!sax.awaitingRefreshResponse)
{
var $items = $('.sax-panel-item-list', $results).fadeOut(200).empty();
var $msgs = $('.sax-panel-messages', $results).hide().empty().append($('<div class="sax-message">' + sax.msg.dataQuerying + '</div>')).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.awaitingRefreshResponse = true;
}
sax.doRefreshResults = function (response)
{
//sax.debug('doRefreshResults', response);
delete sax.awaitingRefreshResponse;
sax.refreshControlValues(response.controlValues);
var $results = $('.sax-panel-results');
var $msgs = $('.sax-panel-messages', $results).hide().empty();
var $items = $('.sax-panel-item-list', $results).hide().empty();
var $templ = $('.sax-panel-item-template .sax-panel-item.Region', $results);
if (!response.success) return;
// Items.
var items = response.regions;
if (!items.length)
return $msgs.append($('<div class="sax-message">' + sax.msg.dataNoneFound + '</div>')).fadeIn(500);
for (let itemIdx = 0; itemIdx < items.length; itemIdx++)
{
let item = items[itemIdx];
let $item = $templ.clone();
sax.populateItem($item, item);
$items.append($item);
}
$items.fadeIn(50);
}
sax.populateItem = function ($item, item)
{
if (!item) return;
$item.prop('id', sax.itemIdPrefix + item.id);
$('.RegionName', $item).text(item.name);
$('.RegionCountryIso2Code', $item).text(item.countryIso2Code);
$('.RegionTypeDesc', $item).text(item.regionTypeDesc);
$('.RegionParentName', $item).text(item.parentName);
$('.RegionStatusDesc', $item).text(item.statusDesc);
$('.sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
}
"use strict";
sax.itemIdPrefix = 'Itm_';
//--------------------------------------------------------------
sax.createItem = function ()
{
$('.RegionId,input[type="text"],textarea,select', sax.$frm.region).val('');
sax.clearControlErrors();
sax.$dlg.region.dialog('option', 'title', sax.dlg.title.createRegion);
sax.openDialog(sax.$dlg.region, 600, 600);
}
sax.doCreateItem = function ()
{
sax.storeItem();
}
//--------------------------------------------------------------
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.onUpdateItem = function (response)
{
//sax.debug('onUpdateItem', response);
let $frm = sax.$frm.region;
$('.RegionId,input[type="text"],textarea,select', $frm).val('');
if (!response.success) return;
let item = response.region;
$('.RegionId', $frm).val(item.id);
$('.RegionType', $frm).val(item.regionTypeCode);
$('.RegionCountryIso2Code', $frm).val(item.countryIso2Code);
$('.RegionName', $frm).val(item.name);
sax.clearControlErrors();
sax.$dlg.region.dialog('option', 'title', sax.dlg.title.updateRegion);
sax.openDialog(sax.$dlg.region, 600, 600);
}
sax.doUpdateItem = function ()
{
sax.storeItem();
}
//--------------------------------------------------------------
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.onStoreItem = function (response)
{
//sax.debug('onStoreItem', response);
sax.refreshControlValues(response.controlValues);
if (!response.success) return;
sax.$dlg.region.dialog('close');
var item = response.region;
var $item = $('#' + sax.itemIdPrefix + item.id);
if (!$item.length)
//--------------------------------------------------------------
sax.refreshResults = function (delay)
{
var $results = $('.sax-panel-results');
$item = $('.sax-panel-item-template .sax-panel-item.Region', $results).clone();
$('.sax-panel-item-list', $results).prepend($item).show();
if (!sax.awaitingRefreshResponse)
{
var $items = $('.sax-panel-item-list', $results).fadeOut(200).empty();
var $msgs = $('.sax-panel-messages', $results).hide().empty().append($('<div class="sax-message">' + sax.msg.dataQuerying + '</div>')).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.awaitingRefreshResponse = true;
}
sax.doRefreshResults = function (response)
{
//sax.debug('doRefreshResults', response);
delete sax.awaitingRefreshResponse;
sax.refreshControlValues(response.controlValues);
var $results = $('.sax-panel-results');
var $msgs = $('.sax-panel-messages', $results).hide().empty();
var $items = $('.sax-panel-item-list', $results).hide().empty();
var $templ = $('.sax-panel-item-template .sax-panel-item.Region', $results);
if (!response.success) return;
// Reference data - Statuses.
if (response.defaultStatusCode) sax.data.defaultStatusCode = response.defaultStatusCode;
if (response.statuses)
sax.populateSelectCodeDesc('#cbRegionStatus', response.statuses);
// Items.
var items = response.regions;
if (!items.length)
return $msgs.append($('<div class="sax-message">' + sax.msg.dataNoneFound + '</div>')).fadeIn(500);
for (let itemIdx = 0; itemIdx < items.length; itemIdx++)
{
let item = items[itemIdx];
let $item = $templ.clone();
sax.populateItem($item, item);
$items.append($item);
}
$items.fadeIn(50);
}
sax.populateItem = function ($item, item)
{
if (!item) return;
$item.prop('id', sax.itemIdPrefix + item.id);
$('.RegionName', $item).text(item.name);
$('.RegionCountryIso2Code', $item).text(item.countryIso2Code);
$('.RegionTypeDesc', $item).text(item.regionTypeDesc);
$('.RegionParentName', $item).text(item.parentName);
$('.RegionStatusDesc', $item).text(item.statusDesc);
$('.sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
}
sax.populateItem($item, item)
}
//--------------------------------------------------------------
$(function ()
{
$('.sax-action.sax-item-create').on('click', function () { sax.createItem(); });
$('.sax-action.sax-results-refresh').on('click', function () { sax.refreshResults(); });
$('.sax-input').on('keydown', function () { sax.clearControlError(this); });
//--------------------------------------------------------------
sax.createItem = function ()
{
let $frm = sax.$frm.region;
$('.RegionId,input[type="text"],textarea,select', $frm).val('');
$('.RegionStatus', $frm).val(sax.data.defaultStatusCode);
sax.clearControlErrors();
sax.$dlg.region.dialog('option', 'title', sax.dlg.title.createRegion);
sax.openDialog(sax.$dlg.region, 600, 600);
}
sax.doCreateItem = function ()
{
sax.storeItem();
}
sax.$frm.regionId = $('#frmRegionId');
sax.$frm.region = $('#frmRegion');
//--------------------------------------------------------------
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.onUpdateItem = function (response)
{
//sax.debug('onUpdateItem', response);
let $frm = sax.$frm.region;
$('.RegionId,input[type="text"],textarea,select', $frm).val('');
if (!response.success) return;
let item = response.region;
$('.RegionId', $frm).val(item.id);
$('.RegionType', $frm).val(item.regionTypeCode);
$('.RegionCountryIso2Code', $frm).val(item.countryIso2Code);
$('.RegionName', $frm).val(item.name);
$('.RegionStatus', $frm).val(item.statusCode);
sax.clearControlErrors();
sax.$dlg.region.dialog('option', 'title', sax.dlg.title.updateRegion);
sax.openDialog(sax.$dlg.region, 600, 600);
}
sax.doUpdateItem = function ()
{
sax.storeItem();
}
var opt = sax.dlgOpts();
opt.buttons[sax.dlg.btn.ok] = function () { sax.doCreateItem(); };
opt.buttons[sax.dlg.btn.cancel] = function () { $(this).dialog('close'); };
sax.$dlg.region = $('#dlgRegion').dialog(opt);
//--------------------------------------------------------------
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.onStoreItem = function (response)
{
//sax.debug('onStoreItem', response);
sax.refreshControlValues(response.controlValues);
if (!response.success) return;
sax.$dlg.region.dialog('close');
setTimeout(sax.refreshResults, 250);
});
var item = response.region;
var $item = $('#' + sax.itemIdPrefix + item.id);
if (!$item.length)
{
var $results = $('.sax-panel-results');
$item = $('.sax-panel-item-template .sax-panel-item.Region', $results).clone();
$('.sax-panel-item-list', $results).prepend($item).show();
}
sax.populateItem($item, item)
}
//--------------------------------------------------------------
//--------------------------------------------------------------
$(function ()
{
$('.sax-action.sax-item-create').on('click', function () { sax.createItem(); });
$('.sax-action.sax-results-refresh').on('click', function () { sax.refreshResults(); });
$('.sax-input').on('input', function () { sax.clearControlError(this); });
sax.$frm.filter = $('#frmRegionFilter');
$('.FilterRegion', sax.$frm.filter).on('input', function () { sax.refreshResults(250); });
sax.$frm.regionId = $('#frmRegionId');
sax.$frm.region = $('#frmRegion');
var opt = sax.dlgOpts();
opt.buttons[sax.dlg.btn.ok] = function () { sax.doCreateItem(); };
opt.buttons[sax.dlg.btn.cancel] = function () { $(this).dialog('close'); };
sax.$dlg.region = $('#dlgRegion').dialog(opt);
setTimeout(sax.refreshResults, 250);
});
}(window, window.document));
/* The End */
+79 -74
View File
@@ -1,84 +1,89 @@
/*
* Admin - Security page scripts.
*/
"use strict";
//--------------------------------------------------------------
sax.doSignin = function ()
(function (win, doc, undef)
{
sax.clearControlErrors();
sax.ajaxSignin = sax.ajaxSignin || { url: sax.url.base + 'Security/Ajax/Signin', formId: 'frmSignIn', callbackFn: sax.onSignin };
sax.doAjaxRequest(sax.ajaxSignin, 50);
}
sax.onSignin = function (response)
{
sax.debug(response);
sax.refreshControlValues(response.controlValues);
if (!response.success) return;
sax.goToPage('');
}
"use strict";
//--------------------------------------------------------------
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.onScorePassword = function (response)
{
var score = (response || {}).score || 0;
sax.$prgPasswordStrength.progressbar("option", "value", score).removeClass('amber green').addClass(score > 3 ? 'green' : score > 2 ? 'amber' : '');
}
//--------------------------------------------------------------
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.onChangePassword = function (response)
{
sax.refreshControlValues(response.controlValues);
if (!response.success) return;
if ($('#ifRpe').length)
sax.goToPage('Security/Signin');
else sax.goToPage('');
}
//--------------------------------------------------------------
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.onRequestPassword = function (response)
{
sax.refreshControlValues(response.controlValues);
if (!response.success) return;
var gotoSigninPage = function ()
//--------------------------------------------------------------
sax.doSignin = function ()
{
sax.goToPage('Security/Signin');
sax.clearControlErrors();
sax.ajaxSignin = sax.ajaxSignin || { url: sax.url.base + 'Security/Ajax/Signin', formId: 'frmSignIn', callbackFn: sax.onSignin };
sax.doAjaxRequest(sax.ajaxSignin, 50);
}
sax.onSignin = function (response)
{
sax.debug(response);
sax.refreshControlValues(response.controlValues);
if (!response.success) return;
sax.goToPage('');
}
if (response.successMsg)
sax.doAlert($('.sax-page-caption').text(), response.successMsg, gotoSigninPage);
else gotoSigninPage();
}
//--------------------------------------------------------------
$(function ()
{
$(':input:enabled:visible:first').focus();
$('#ifEmailAddress,#ifPasswordCurrent,#ifPassword,#ifPasswordConfirm').on('keydown', function () { sax.clearControlError(this); });
$('#frmChangePassword #ifPassword').on('keyup', sax.doScorePassword);
sax.$prgPasswordStrength = $('#frmChangePassword #prgPasswordStrength').progressbar({ 'max': 5 });
$('#ifEmailAddress,#ifPassword', $('#frmSignIn')).on('keypress', function (e) { if (e.which == 13) sax.doSignin(); });
$('#frmSignIn #pbSignIn').on('click', function () { sax.doSignin(); });
$('#ifPasswordCurrent,#ifPassword,#ifPasswordConfirm', $('#frmChangePassword')).on('keypress', function (e) { if (e.which == 13) sax.doChangePassword(); });
$('#frmChangePassword #pbChangePassword').on('click', function () { sax.doChangePassword(); });
$('#ifEmailAddress', $('#frmRequestPassword')).on('keypress', function (e) { if (e.which == 13) sax.doRequestPassword(); });
$('#frmRequestPassword #pbRequestPassword').on('click', function () { sax.doRequestPassword(); });
});
//--------------------------------------------------------------
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.onScorePassword = function (response)
{
var score = (response || {}).score || 0;
sax.$prgPasswordStrength.progressbar("option", "value", score).removeClass('amber green').addClass(score > 3 ? 'green' : score > 2 ? 'amber' : '');
}
//--------------------------------------------------------------
//--------------------------------------------------------------
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.onChangePassword = function (response)
{
sax.refreshControlValues(response.controlValues);
if (!response.success) return;
if ($('#ifRpe').length)
sax.goToPage('Security/Signin');
else sax.goToPage('');
}
//--------------------------------------------------------------
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.onRequestPassword = function (response)
{
sax.refreshControlValues(response.controlValues);
if (!response.success) return;
var gotoSigninPage = function ()
{
sax.goToPage('Security/Signin');
}
if (response.successMsg)
sax.doAlert($('.sax-page-caption').text(), response.successMsg, gotoSigninPage);
else gotoSigninPage();
}
//--------------------------------------------------------------
$(function ()
{
$(':input:enabled:visible:first').focus();
$('#ifEmailAddress,#ifPasswordCurrent,#ifPassword,#ifPasswordConfirm').on('input', function () { sax.clearControlError(this); });
$('#frmChangePassword #ifPassword').on('keyup', sax.doScorePassword);
sax.$prgPasswordStrength = $('#frmChangePassword #prgPasswordStrength').progressbar({ 'max': 5 });
$('#ifEmailAddress,#ifPassword', $('#frmSignIn')).on('keypress', function (e) { if (e.which == 13) sax.doSignin(); });
$('#frmSignIn #pbSignIn').on('click', function () { sax.doSignin(); });
$('#ifPasswordCurrent,#ifPassword,#ifPasswordConfirm', $('#frmChangePassword')).on('keypress', function (e) { if (e.which == 13) sax.doChangePassword(); });
$('#frmChangePassword #pbChangePassword').on('click', function () { sax.doChangePassword(); });
$('#ifEmailAddress', $('#frmRequestPassword')).on('keypress', function (e) { if (e.which == 13) sax.doRequestPassword(); });
$('#frmRequestPassword #pbRequestPassword').on('click', function () { sax.doRequestPassword(); });
});
}(window, window.document));
/* The End */
@@ -0,0 +1,119 @@
/*
* Admin - Code selection.
*/
(function (win, doc, undef)
{
"use strict";
let sc = sax.selectCode = sax.selectCode || { fn: {}, $dlg: {}, codeIdPrefix: 'Code_' };
//--------------------------------------------------------------
/*
* Code selection config:
* - caption - dialog title.
* - width: preferred dialog width (default: 400).
* - height: preferred dialog height (default: 400).
* - showFilter: whether to display filter control(s).
* - filterLabel: filter code field caption.
* - maxItems: maximum number of available items to list.
* - codes - list of {code,desc,comment} objects
* - selectedCodes - list of codes.
* - fnCallback - method to call on completion to store codes taking list of selected codes as parameter.
*/
sc.fn.openSelectCode = function (cfg)
{
//sax.debug('openSelectCode', cfg);
sc.fn.init();
sc.cfg = cfg;
sc.selectedCodes = cfg.selectedCodes || [];
sc.fn.displayCodes(cfg.codes);
sax.openDialog(sc.$dlg.dialog('option', { title: cfg.caption || 'Select Codes' }), sc.cfg.width || 400, sc.cfg.height || 400);
}
sc.fn.displayCodes = function (codes)
{
let $codesAvail = $('.sax-selectCode-codes.AvailableCodes').empty();
let $codesSelec = $('.sax-selectCode-codes.SelectedCodes').empty();
let $codeTmpl = $('.sax-panel-item-template .sax-panel-item.Code');
for (let codeIdx = 0; codeIdx < codes.length; codeIdx++)
{
let code = codes[codeIdx];
let selected = sc.selectedCodes.indexOf(code.code) >= 0;
let $code = $codeTmpl.clone();
$($code).prop('id', sc.codeIdPrefix + code.code).attr('aria-code', code.code).on('click', function () { sc.fn.onClickCode(code.code); }).on('dblclick', function () { sc.fn.onDblClickCode(code.code); }).find('.CodeDesc').text(code.desc).end();
if (selected) $codesSelec.append($code);
else $codesAvail.append($code);
}
}
sc.fn.onClickCode = function (code)
{
$('.sax-panel-item.Code').removeClass('sel');
$('.sax-panel-item.Code[aria-code="' + code + '"]').addClass('sel');
}
sc.fn.onDblClickCode = function (code)
{
let codeIdx = sc.selectedCodes.indexOf(code);
//sax.debug('onDblClickCode', code, codeIdx);
if (codeIdx >= 0) sc.selectedCodes.splice(codeIdx, 1); else sc.selectedCodes.push(code)
sc.fn.displayCodes(sc.cfg.codes)
$('.sax-panel-item.Code[aria-code="' + code + '"]').addClass('sel');
}
sc.fn.onClickSelect = function ()
{
let codes = [];
$('.sax-selectCode-codes.AvailableCodes .sax-panel-item.Code.sel').each(function (idx, el)
{
let code = $(el).attr('aria-code');
if (code)
{
codes.push(code);
sc.selectedCodes.push(code);
};
});
sc.fn.displayCodes(sc.cfg.codes)
for (const code of codes)
$('.sax-panel-item.Code[aria-code="' + code + '"]').addClass('sel');
}
sc.fn.onClickRemove = function ()
{
let codes = [];
$('.sax-selectCode-codes.SelectedCodes .sax-panel-item.Code.sel').each(function (idx, el)
{
let code = $(el).attr('aria-code');
if (code)
{
let codeIdx = sc.selectedCodes.indexOf(code);
if (codeIdx >= 0)
{
codes.push(code);
sc.selectedCodes.splice(codeIdx, 1);
}
};
});
sc.fn.displayCodes(sc.cfg.codes)
for (const code of codes)
$('.sax-panel-item.Code[aria-code="' + code + '"]').addClass('sel');
}
sc.fn.storeSelectCode = function ()
{
//sax.debug('storeSelectCode', sc.cfg, sc.selectedCodes);
if (sc.cfg.fnCallback) sc.cfg.fnCallback(sc.selectedCodes);
sc.$dlg.dialog('close');
delete sc.cfg;
delete sc.selectedCodes;
}
//--------------------------------------------------------------
sc.fn.init = function ()
{
if (!sc.$dlg) return;
var opt = sax.dlgOpts();
opt.buttons[sax.dlg.btn.ok] = function () { sc.fn.storeSelectCode(); };
opt.buttons[sax.dlg.btn.cancel] = function () { $(this).dialog('close'); };
sc.$dlg = $('#dlgSelectCode').dialog(opt);
$('.sax-button.Select', sc.$dlg).on('click', function () { sc.fn.onClickSelect(); });
$('.sax-button.Remove', sc.$dlg).on('click', function () { sc.fn.onClickRemove(); });
}
}(window, window.document));
/* The End */
@@ -0,0 +1,124 @@
/*
* Admin - Item selection.
*/
(function (win, doc, undef)
{
"use strict";
let si = sax.data.selectItem = sax.data.selectItem || { items: {}, fn: {}, $dlg: {}, itemIdPrefix: 'Itm_' };
//--------------------------------------------------------------
/*
* Item selection config:
* - caption - dialog title.
* - items - list of objects: { id, name }
* - itemId - currently selected item.
* - fnCallback - method to call on completion to store selected item.
*/
si.fn.selectItem = function (cfg)
{
si.fn.init();
si.cfg = cfg;
si.itemId = cfg.itemId;
si.fn.showSelectItem();
}
si.fn.showSelectItem = function ()
{
$('.SelectedItemName', si.$dlg).text(si.fn.getItemName(si.itemId));
$('#ifItemFilter', si.$dlg).val('');
si.fn.displayItems();
sax.openDialog(si.$dlg.dialog('option', { title: si.cfg.caption || 'Select Item' }), 400, 600);
}
//--------------------------------------------------------------
si.fn.compareItems = function (a, b)
{
var comparison = a.name.toLowerCase().localeCompare(b.name.toLowerCase());
if (comparison === 0)
return a.name.localeCompare(b.name);
return comparison;
}
//--------------------------------------------------------------
si.fn.displayItems = function ()
{
let filter = $('#ifItemFilter', si.$dlg).val();
let reFilter = new RegExp(sax.escapeRegExp((filter || '').trim()), 'i');
let $itemsAvail = $('.sax-selectItem-items.AvailableItems').empty();
let $itemTmpl = $('.sax-panel-item-template .sax-panel-item.Item');
let items = [...si.cfg.items];
items.sort(si.fn.compareItems);
for (let rgnIdx = 0; rgnIdx < items.length; rgnIdx++)
{
let item = items[rgnIdx];
let id = item.id;
if (filter && !item.name.match(reFilter)) continue;
let $item = $itemTmpl.clone();
$item.prop('id', si.itemIdPrefix + id).on('click', function () { si.fn.onClickItem(id); }).on('dblclick', function () { si.fn.onDblClickItem(id); }).find('.ItemName').text(item.name).end();
if (id == si.itemId) $item.addClass('sel');
$itemsAvail.append($item);
}
}
si.fn.getItem = function (id)
{
for (let rgnIdx = 0; rgnIdx < si.cfg.items.length; rgnIdx++)
{
let item = si.cfg.items[rgnIdx];
if (item.id == id) return item;
}
}
si.fn.getItemName = function (id)
{
let item = si.fn.getItem(id);
return item ? item.name : '';
}
//--------------------------------------------------------------
si.fn.onClickItem = function (id)
{
$('.SelectedItemName', si.$dlg).text(si.fn.getItemName(si.itemId = id));
$('.sax-panel-item.Item').removeClass('sel');
$('.sax-panel-item.Item#' + si.itemIdPrefix + id).addClass('sel');
}
si.fn.onDblClickItem = function (id)
{
si.itemId = id;
si.fn.storeSelectItem();
}
si.fn.storeSelectItem = function ()
{
if (!si.itemId) return;
let item = si.fn.getItem(si.itemId);
if (!item) return;
if (si.cfg.fnCallback) si.cfg.fnCallback(item);
si.$dlg.dialog('close');
si.fn.cleanUp();
}
si.fn.cleanUp = function ()
{
delete si.cfg;
delete si.itemId;
}
//--------------------------------------------------------------
si.fn.onDlgSize = function ()
{
let $pnl = $('.sax-selectItem-items.AvailableItems');
$pnl.outerHeight(Math.floor(si.$dlg.innerHeight() - $pnl.position().top - ($pnl.outerHeight(true) - $pnl.innerHeight())));
}
//--------------------------------------------------------------
si.fn.init = function ()
{
if (!si.$dlg) return;
var opt = sax.dlgOpts();
opt.open = function (evt, ui) { si.fn.onDlgSize(); };
opt.resize = function (evt, ui) { si.fn.onDlgSize(); };
opt.buttons[sax.dlg.btn.ok] = function () { si.fn.storeSelectItem(); };
opt.buttons[sax.dlg.btn.cancel] = function () { si.fn.cleanUp(); $(this).dialog('close'); };
si.$dlg = $('#dlgSelectItem').dialog(opt);
}
}(window, window.document));
/* The End */
+132 -122
View File
@@ -1,136 +1,146 @@
/*
* Admin - Sport page scripts.
*/
"use strict";
sax.itemIdPrefix = 'Itm_';
//--------------------------------------------------------------
sax.refreshResults = function (delay)
(function (win, doc, undef)
{
var $results = $('.sax-panel-results');
if (!sax.awaitingRefreshResponse)
{
var $items = $('.sax-panel-item-list', $results).fadeOut(200).empty();
var $msgs = $('.sax-panel-messages', $results).hide().empty().append($('<div class="sax-message">' + sax.msg.dataQuerying + '</div>')).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.awaitingRefreshResponse = true;
}
sax.doRefreshResults = function (response)
{
//sax.debug('doRefreshResults', response);
delete sax.awaitingRefreshResponse;
sax.refreshControlValues(response.controlValues);
var $results = $('.sax-panel-results');
var $msgs = $('.sax-panel-messages', $results).hide().empty();
var $items = $('.sax-panel-item-list', $results).hide().empty();
var $templ = $('.sax-panel-item-template .sax-panel-item.Sport', $results);
if (!response.success) return;
// Items.
var items = response.sports;
if (!items.length)
return $msgs.append($('<div class="sax-message">' + sax.msg.dataNoneFound + '</div>')).fadeIn(500);
for (let itemIdx = 0; itemIdx < items.length; itemIdx++)
{
let item = items[itemIdx];
let $item = $templ.clone();
sax.populateItem($item, item);
$items.append($item);
}
$items.fadeIn(50);
}
sax.populateItem = function ($item, item)
{
if (!item) return;
$item.prop('id', sax.itemIdPrefix + item.id);
$('.SportName', $item).text(item.name);
$('.SportType', $item).text(item.typeDesc);
$('.SportCategory', $item).text(item.categoryDesc);
$('.StatusDesc', $item).text(item.statusDesc);
$('.sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
}
"use strict";
sax.itemIdPrefix = 'Itm_';
//--------------------------------------------------------------
sax.createItem = function ()
{
$('.SportId,input[type="text"],textarea,select', sax.$frm.sport).val('');
sax.clearControlErrors();
sax.$dlg.sport.dialog('option', 'title', sax.dlg.title.createSport);
sax.openDialog(sax.$dlg.sport, 600, 600);
}
sax.doCreateItem = function ()
{
sax.storeItem();
}
//--------------------------------------------------------------
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.onUpdateItem = function (response)
{
//sax.debug('onUpdateItem', response);
let $frm = sax.$frm.sport;
$('.SportId,input[type="text"],textarea,select', $frm).val('');
if (!response.success) return;
let item = response.sport;
$('.SportId', $frm).val(item.id);
$('.SportName', $frm).val(item.name);
$('.SportType', $frm).val(item.typeCode);
$('.SportCategory', $frm).val(item.categoryCode);
sax.clearControlErrors();
sax.$dlg.sport.dialog('option', 'title', sax.dlg.title.updateSport);
sax.openDialog(sax.$dlg.sport, 600, 600);
}
sax.doUpdateItem = function ()
{
sax.storeItem();
}
//--------------------------------------------------------------
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.onStoreItem = function (response)
{
//sax.debug('onStoreItem', response);
sax.refreshControlValues(response.controlValues);
if (!response.success) return;
sax.$dlg.sport.dialog('close');
var item = response.sport;
var $item = $('#' + sax.itemIdPrefix + item.id);
if (!$item.length)
//--------------------------------------------------------------
sax.refreshResults = function (delay)
{
var $results = $('.sax-panel-results');
$item = $('.sax-panel-item-template .sax-panel-item.Sport', $results).clone();
$('.sax-panel-item-list', $results).prepend($item).show();
if (!sax.awaitingRefreshResponse)
{
var $items = $('.sax-panel-item-list', $results).fadeOut(200).empty();
var $msgs = $('.sax-panel-messages', $results).hide().empty().append($('<div class="sax-message">' + sax.msg.dataQuerying + '</div>')).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.awaitingRefreshResponse = true;
}
sax.doRefreshResults = function (response)
{
//sax.debug('doRefreshResults', response);
delete sax.awaitingRefreshResponse;
sax.refreshControlValues(response.controlValues);
var $results = $('.sax-panel-results');
var $msgs = $('.sax-panel-messages', $results).hide().empty();
var $items = $('.sax-panel-item-list', $results).hide().empty();
var $templ = $('.sax-panel-item-template .sax-panel-item.Sport', $results);
if (!response.success) return;
// Reference data - Statuses.
if (response.defaultStatusCode) sax.data.defaultStatusCode = response.defaultStatusCode;
if (response.statuses)
sax.populateSelectCodeDesc('#cbSportStatus', response.statuses);
// Items.
var items = response.sports;
if (!items.length)
return $msgs.append($('<div class="sax-message">' + sax.msg.dataNoneFound + '</div>')).fadeIn(500);
for (let itemIdx = 0; itemIdx < items.length; itemIdx++)
{
let item = items[itemIdx];
let $item = $templ.clone();
sax.populateItem($item, item);
$items.append($item);
}
$items.fadeIn(50);
}
sax.populateItem = function ($item, item)
{
if (!item) return;
$item.prop('id', sax.itemIdPrefix + item.id);
$('.SportName', $item).text(item.name);
$('.StatusDesc', $item).text(item.statusDesc);
$('.sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
}
sax.populateItem($item, item)
}
//--------------------------------------------------------------
$(function ()
{
$('.sax-action.sax-item-create').on('click', function () { sax.createItem(); });
$('.sax-action.sax-results-refresh').on('click', function () { sax.refreshResults(); });
$('.sax-input').on('keydown', function () { sax.clearControlError(this); });
//--------------------------------------------------------------
sax.createItem = function ()
{
let $frm = sax.$frm.sport;
$('.SportId,input[type="text"],textarea,select', $frm).val('');
$('.SportStatus', $frm).val(sax.data.defaultStatusCode);
sax.clearControlErrors();
sax.$dlg.sport.dialog('option', 'title', sax.dlg.title.createSport);
sax.openDialog(sax.$dlg.sport, 600, 600);
}
sax.doCreateItem = function ()
{
sax.storeItem();
}
sax.$frm.sportId = $('#frmSportId');
sax.$frm.sport = $('#frmSport');
//--------------------------------------------------------------
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.onUpdateItem = function (response)
{
//sax.debug('onUpdateItem', response);
let $frm = sax.$frm.sport;
$('.SportId,input[type="text"],textarea,select', $frm).val('');
if (!response.success) return;
let item = response.sport;
$('.SportId', $frm).val(item.id);
$('.SportName', $frm).val(item.name);
$('.SportStatus', $frm).val(item.statusCode);
sax.clearControlErrors();
sax.$dlg.sport.dialog('option', 'title', sax.dlg.title.updateSport);
sax.openDialog(sax.$dlg.sport, 600, 600);
}
sax.doUpdateItem = function ()
{
sax.storeItem();
}
var opt = sax.dlgOpts();
opt.buttons[sax.dlg.btn.ok] = function () { sax.doCreateItem(); };
opt.buttons[sax.dlg.btn.cancel] = function () { $(this).dialog('close'); };
sax.$dlg.sport = $('#dlgSport').dialog(opt);
//--------------------------------------------------------------
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.onStoreItem = function (response)
{
//sax.debug('onStoreItem', response);
sax.refreshControlValues(response.controlValues);
if (!response.success) return;
sax.$dlg.sport.dialog('close');
setTimeout(sax.refreshResults, 250);
});
var item = response.sport;
var $item = $('#' + sax.itemIdPrefix + item.id);
if (!$item.length)
{
var $results = $('.sax-panel-results');
$item = $('.sax-panel-item-template .sax-panel-item.Sport', $results).clone();
$('.sax-panel-item-list', $results).prepend($item).show();
}
sax.populateItem($item, item)
}
//--------------------------------------------------------------
//--------------------------------------------------------------
$(function ()
{
$('.sax-action.sax-item-create').on('click', function () { sax.createItem(); });
$('.sax-action.sax-results-refresh').on('click', function () { sax.refreshResults(); });
$('.sax-input').on('input', function () { sax.clearControlError(this); });
sax.$frm.filter = $('#frmSportFilter');
$('.FilterSport', sax.$frm.filter).on('input', function () { sax.refreshResults(250); });
sax.$frm.sportId = $('#frmSportId');
sax.$frm.sport = $('#frmSport');
var opt = sax.dlgOpts();
opt.buttons[sax.dlg.btn.ok] = function () { sax.doCreateItem(); };
opt.buttons[sax.dlg.btn.cancel] = function () { $(this).dialog('close'); };
sax.$dlg.sport = $('#dlgSport').dialog(opt);
setTimeout(sax.refreshResults, 250);
});
}(window, window.document));
/* The End */
+14 -4
View File
@@ -31,9 +31,13 @@
var $items = $('.sax-panel-item-list', $results).hide().empty();
var $templ = $('.sax-panel-item-template .sax-panel-item.User', $results);
if (!response.success) return;
// Reference data.
// Reference data - Roles.
if (response.userRoles && response.userRoles.length)
sax.data.userRoles = response.userRoles;
// Reference data - Statuses.
if (response.defaultStatusCode) sax.data.defaultStatusCode = response.defaultStatusCode;
if (response.statuses)
sax.populateSelectCodeDesc('#cbUserStatus', response.statuses);
// Items.
var items = response.users;
if (!items.length)
@@ -72,7 +76,7 @@
sax.selectUserRoleConfig = sax.selectUserRoleConfig || { caption: sax.dlg.title.selectUserRoles, width: 520, fnCallback: sax.updateUserRoles };
sax.selectUserRoleConfig.codes = sax.data.userRoles;
sax.selectUserRoleConfig.selectedCodes = sax.userAccount.userRoleCodes || [];
sax.codeSelection.fn.openCodeSelection(sax.selectUserRoleConfig);
sax.selectCode.fn.openSelectCode(sax.selectUserRoleConfig);
}
sax.updateUserRoles = function (userRoleCodes)
{
@@ -97,7 +101,9 @@
//--------------------------------------------------------------
sax.createItem = function ()
{
$('.UserAccountId,.UserRoleCodes,input[type="text"],textarea,select', sax.$frm.user).val('');
let $frm = sax.$frm.user;
$('.UserAccountId,.UserRoleCodes,input[type="text"],textarea,select', $frm).val('');
$('.UserStatus', $frm).val(sax.data.defaultStatusCode);
sax.clearControlErrors();
sax.userAccount = { userRoleCodes: [] };
sax.$dlg.user.dialog('option', 'title', sax.dlg.title.createUser);
@@ -130,6 +136,7 @@
$('.UserLastName', $frm).val(item.lastName);
$('.UserRoles', $frm).val(sax.getSelectedUserRoleDescs().join('\n'));
$('#ifUserRoleCodes').val(item.userRoleCodes.join(sax.data.userRoleCodeDelim));
$('.UserStatus', $frm).val(item.statusCode);
sax.$dlg.user.dialog('option', 'title', sax.dlg.title.updateUser);
sax.openDialog(sax.$dlg.user, 600, 600);
}
@@ -167,8 +174,11 @@
{
$('.sax-action.sax-item-create').on('click', function () { sax.createItem(); });
$('.sax-action.sax-results-refresh').on('click', function () { sax.refreshResults(); });
$('.sax-input,.sax-select').on('keydown click', function () { sax.clearControlError(this); });
$('.sax-input').on('input', function () { sax.clearControlError(this); });
$('.sax-select').on('click', function () { sax.clearControlError(this); });
sax.$frm.filter = $('#frmUserFilter');
$('.FilterUser', sax.$frm.filter).on('input', function () { sax.refreshResults(250); });
sax.$frm.userId = $('#frmUserId');
sax.$frm.user = $('#frmUser');