This commit is contained in:
2022-03-03 18:46:08 +00:00
parent 1ac4c7f51a
commit 122056a9da
59 changed files with 1259 additions and 474 deletions
@@ -92,10 +92,12 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
// Filter.
SaxActivityIndex.Params prmActivityIndex = new SaxActivityIndex.Params();
prmActivityIndex.SportIdsIncluded.AddRange(context.SportIds);
prmActivityIndex.RegionIdsIncluded.AddRange(context.RegionIds);
prmActivityIndex.UserAccountIdsOwnerIncluded.AddRange(context.UserAccountIdsOwner);
prmActivityIndex.OrganisationIdsOwnerIncluded.AddRange(context.OrganisationIdsOwner);
prmActivityIndex.SportRegionIdsIncluded.AddRange(context.SportRegionIdsIncluded);
prmActivityIndex.EffectiveFrom = context.EffectiveFrom;
prmActivityIndex.EffectiveTo = context.EffectiveTo;
prmActivityIndex.NotExpiredOn = context.NotExpiredOn;
prmActivityIndex.Alias_ActivityIndex = alias_ActivityIndex;
prmActivityIndex.ResultsPaging.PageNo = 1;
prmActivityIndex.ResultsPaging.PageLength = 100;
@@ -389,14 +391,18 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
IndexEntryData indexEntrydata = indexEntryDataList.Find(item => item.MatchesIds(indexEntry));
if (indexEntrydata != null)
{
// Match found - if the effective date differs, update it.
if (!indexEntry.EffectiveOn.Equals(indexEntrydata.EffectiveOn))
// Match found - update properties.
indexEntry.UserAccountIdOwner = indexEntrydata.UserAccountIdOwner;
indexEntry.OrganisationIdOwner = indexEntrydata.OrganisationIdOwner;
indexEntry.EffectiveOn = indexEntrydata.EffectiveOn;
indexEntry.ExpiresOn = indexEntrydata.ExpiresOn;
if (indexEntry.Changed)
{
indexEntry.EffectiveOn = indexEntrydata.EffectiveOn;
if (Internals.ActivityMgr.UpdateActivityIndex(indexEntry, dbUpdateInfo))
stats.EntriesUpdated++;
else SaLogger.Warn(fn + " Failed to update Activity Index - " + Internals.ActivityMgr.ErrorStateMessage);
}
// Remove the entry from the 'required' list.
// Entries remaining in this list will be created.
indexEntryDataList.Remove(indexEntrydata);
@@ -412,7 +418,11 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
// The remaining required Index entries will be created.
foreach (IndexEntryData indexEntry in indexEntryDataList)
{
SaxActivityIndex itemIndexEntry = Internals.ActivityMgr.CreateActivityIndex(indexEntry.ItemId, indexEntry.SportId, indexEntry.RegionId, indexEntry.EffectiveOn);
SaxActivityIndex itemIndexEntry = Internals.ActivityMgr.CreateActivityIndex(indexEntry.ItemId, indexEntry.SportId, indexEntry.RegionId);
itemIndexEntry.UserAccountIdOwner = indexEntry.UserAccountIdOwner;
itemIndexEntry.OrganisationIdOwner = indexEntry.OrganisationIdOwner;
itemIndexEntry.EffectiveOn = indexEntry.EffectiveOn;
itemIndexEntry.ExpiresOn = indexEntry.ExpiresOn;
if (Internals.ActivityMgr.InsertActivityIndex(itemIndexEntry, dbUpdateInfo))
stats.EntriesInserted++;
else SaLogger.Warn(fn + " Failed to insert Activity Index - " + Internals.ActivityMgr.ErrorStateMessage);
@@ -439,7 +449,8 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
" And " + SaxDbDfn_Core.GetColumnName(SaxDbDfn_Core.ColumnIdx.ActivityIndex_ItemId) + "=" + itemId.Id.ToLong();
ISacsDatabase db = SaxGlobals.App.GetCoreDatabase(SessionContext);
int recordsDeleted = db.ExecuteDelete(tableName, filter);
SaLogger.Info(fn + " Records deleted: " + recordsDeleted + ". Filter: " + filter, true);
if (recordsDeleted > 0)
SaLogger.Info(fn + " Records deleted: " + recordsDeleted + ". Filter: " + filter, true);
return true;
}
@@ -447,10 +458,10 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
// User Activities
//-------------------------------------------------------------------
/// <summary>
/// Record listing of activties by user - those populated to the application page.
/// Record listing of activities by user - those populated to the application page.
/// <para>- Activities not previously listed are added to the user's list.</para>
/// <para>- Activities previously listed are updated in the user's list.</para>
/// <para>- User Activties no longer listed are flagged as 'Not currently listed'.</para>
/// <para>- User Activities no longer listed are flagged as 'Not currently listed'.</para>
/// </summary>
public override bool RecordUserActivitiesListed(SysId userAccountId, List<ItemId> activityItemIds, DbUpdateInfo dbUpdateInfo)
{
@@ -36,6 +36,8 @@ namespace Saxonite.Net.Core.Web.Base.Middleware
//-------------------------------------------------------------------
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
// NoOp task to avoid compiler warning.
await Task.Yield();
Context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
return AuthenticateResult.NoResult();
}
+15 -4
View File
@@ -238,9 +238,13 @@ namespace Saxonite.Net.Core.Web.Base.Models
case SaxDbDfn_Core.ColumnIdx.Organisation_PhoneMain:
case SaxDbDfn_Core.ColumnIdx.Organisation_PhoneAlt:
return Math.Min(maxLength, 20);
//case SaxDbDfn.ColumnIdx.UserAccount_Postcode:
//case SaxDbDfn.ColumnIdx.ItemAddress_Postcode:
// return Math.Min(maxLength, 16);
//case SaxDbDfn.ColumnIdx.UserAccount_Postcode:
//case SaxDbDfn.ColumnIdx.ItemAddress_Postcode:
// return Math.Min(maxLength, 16);
case SaxDbDfn_Core.ColumnIdx.Article_Headline:
return Math.Min(maxLength, 2000);
case SaxDbDfn_Core.ColumnIdx.Article_Summary:
return Math.Min(maxLength, 1000);
}
return maxLength;
}
@@ -288,7 +292,14 @@ namespace Saxonite.Net.Core.Web.Base.Models
}
public DateTime ParseDateFromForm(String value)
{
return DateUtil.ParseExact(value, "dd-MMM-yyyy", SessionCulture);
DateTime date = DateUtil.ParseExact(value, "dd-MMM-yyyy", SessionCulture);
if (!date.IsValid())
date = DateUtil.ParseExact(value, "dd-MMM-yyyy", CultureInfo.CurrentUICulture);
if (!date.IsValid())
date = DateUtil.ParseExact(value, "dd-MMM-yyyy", CultureInfo.CurrentCulture);
if (!date.IsValid())
date = DateUtil.ParseExact(value, "dd-MMM-yyyy", CultureInfo.InvariantCulture);
return date;
}
//-------------------------------------------------------------------
@@ -60,44 +60,49 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
if (!ValidUserSession)
return GetAjaxResult_InvalidSession(responseData);
// Core Database connection.
ISacsDatabase db = SaxGlobals.App.GetCoreDatabase(SessionContext);
// Database table row counts.
Dictionary<String, int> tableRowCounts = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
String query =
"SELECT QUOTENAME(SCHEMA_NAME(sOBJ.schema_id)) + '.' + QUOTENAME(sOBJ.name) AS[TableName], SUM(sPTN.Rows) AS[RowCount] " +
"FROM sys.objects AS sOBJ " +
"INNER JOIN sys.partitions AS sPTN ON sOBJ.object_id = sPTN.object_id " +
"WHERE sOBJ.type = 'U' AND sOBJ.is_ms_shipped = 0x0 AND index_id< 2 /*Index Id: 0:Heap,1:Clustered*/ " +
"GROUP BY sOBJ.schema_id, sOBJ.name";
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(db, query))
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<SacsDisposable> disposableItems = new DisposableCollection<SacsDisposable>())
{
while (dbResultSet != null && dbResultSet.NextRecord())
// Core Database connection.
ISacsDatabase db = SaxGlobals.App.GetCoreDatabase(SessionContext);
// Database table row counts.
Dictionary<String, int> tableRowCounts = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
String query =
"SELECT QUOTENAME(SCHEMA_NAME(sOBJ.schema_id)) + '.' + QUOTENAME(sOBJ.name) As [TableName], SUM(sPTN.Rows) As [RowCount] " +
"FROM sys.objects AS sOBJ " +
"INNER JOIN sys.partitions AS sPTN ON sOBJ.object_id = sPTN.object_id " +
"WHERE sOBJ.type = 'U' AND sOBJ.is_ms_shipped = 0x0 AND index_id< 2 /*Index Id: 0:Heap,1:Clustered*/ " +
"GROUP BY sOBJ.schema_id, sOBJ.name";
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(db, query))
{
tableRowCounts.Add(dbResultSet.GetRecordValues().GetValue("TableName").ToString(), (int)dbResultSet.GetRecordValues().GetValue("RowCount").AsLong());
while (dbResultSet != null && dbResultSet.NextRecord())
{
tableRowCounts.Add(dbResultSet.GetRecordValues().GetValue("TableName").ToString(), (int)dbResultSet.GetRecordValues().GetValue("RowCount").AsLong());
}
}
}
// Core database tables.
List<DbDfnTable> tableDfns = db.GetTableDfns();
foreach (DbDfnTable tableDfn in tableDfns.OrderBy(item => item.Name))
{
// Filter by table name.
if (!StringUtil.IsEmpty(model.DatabaseFilter.Table) && !tableDfn.Name.ContainsCI(model.DatabaseFilter.Table))
continue;
// Core database tables.
List<DbDfnTable> tableDfns = db.GetTableDfns();
foreach (DbDfnTable tableDfn in tableDfns.OrderBy(item => item.Name))
{
// Filter by table name.
if (!StringUtil.IsEmpty(model.DatabaseFilter.Search) && !tableDfn.Name.ContainsCI(model.DatabaseFilter.Search))
continue;
DatabaseTableData tableData = new DatabaseTableData();
tableData.SchemaName = tableDfn.Schema;
tableData.TableName = tableDfn.Name;
tableData.QualifiedName = tableDfn.QualifiedName;
tableData.ColumnCount = tableDfn.ColumnCount;
tableData.IndexCount = tableDfn.IndexCount;
DatabaseTableData tableData = new DatabaseTableData();
tableData.SchemaName = tableDfn.Schema;
tableData.TableName = tableDfn.Name;
tableData.QualifiedName = tableDfn.QualifiedName;
tableData.ColumnCount = tableDfn.ColumnCount;
tableData.IndexCount = tableDfn.IndexCount;
// Row count.
tableData.RowCount = tableRowCounts.GetValueOrDefault(tableDfn.QuotedQualifiedName, 0);
// Row count.
tableData.RowCount = tableRowCounts.GetValueOrDefault(tableDfn.QuotedQualifiedName, 0);
responseData.Tables.Add(tableData);
responseData.Tables.Add(tableData);
}
}
// Complete response.
@@ -127,9 +132,9 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
//-------------------------------------------------------------------
[HttpPost]
[Route("System/Ajax/ValidateDatabaseSchema")]
public IActionResult Ajax_ValidateDatabaseSchema(Model_Sport model)
public IActionResult Ajax_ValidateDatabaseSchema(Model_System model)
{
String fn = GetType().Name + ".Ajax_GetDatabaseTables";
String fn = GetType().Name + ".Ajax_ValidateDatabaseSchema";
String messageTitle = Localiser["system.caption.database"];
AjaxResponse_ValidateDatabaseSchema responseData = new AjaxResponse_ValidateDatabaseSchema(model);
@@ -137,42 +142,47 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
if (!ValidUserSession)
return GetAjaxResult_InvalidSession(responseData);
// Core Database connection.
ISacsDatabase db = SaxGlobals.App.GetCoreDatabase(SessionContext);
// Retrieve XML database schema definition.
var assembly = typeof(SaxSystem_Dbas).GetTypeInfo().Assembly;
String xmlSchema = SacsResourceHelper.GetManifestResourceAsText(assembly, "", "SaxDbDfn_Core.xml");
if (StringUtil.IsEmpty(xmlSchema))
return Json(responseData.SetMessage(messageTitle, "Failed to extract XML schema definition."));
// Extract schema from XML definition.
SaDbProcess_ConvertDbSchema.Config cfgSchemaConvert = new SaDbProcess_ConvertDbSchema.Config();
SaDbProcess_ConvertDbSchema procSchemaConvert = new SaDbProcess_ConvertDbSchema(cfgSchemaConvert);
List<DbDfnTable> tables = procSchemaConvert.ConvertXmlToTables(xmlSchema);
if (procSchemaConvert.HasProcessError())
return Json(responseData.SetMessage(messageTitle, "Failed to convert XML schema: " + procSchemaConvert.GetProcessError()));
SaDbProcess_CompareDatabaseSchemas.Config cfgSchemaCompare = new SaDbProcess_CompareDatabaseSchemas.Config(tables, db);
cfgSchemaCompare.HideIdenticalObjects = true;
cfgSchemaCompare.IgnorePosition = true;
SaDbProcess_CompareDatabaseSchemas procSchemaCompare = new SaDbProcess_CompareDatabaseSchemas(cfgSchemaCompare);
procSchemaCompare.ProcessNotifier = this;
procSchemaCompare.RunProcess();
List<SaDbProcess_CompareDatabaseSchemas.SchemaComparisonItem> schemaComparisonItems = procSchemaCompare.GetSchemaComparisonItems();
foreach (SaDbProcess_CompareDatabaseSchemas.SchemaComparisonItem schemaComparisonItem in schemaComparisonItems)
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<SacsDisposable> disposableItems = new DisposableCollection<SacsDisposable>())
{
DbSchemaItemResponseData item = new DbSchemaItemResponseData()
// Core Database connection.
ISacsDatabase db = SaxGlobals.App.GetCoreDatabase(SessionContext);
// Retrieve XML database schema definition.
var assembly = typeof(SaxSystem_Dbas).GetTypeInfo().Assembly;
String xmlSchema = SacsResourceHelper.GetManifestResourceAsText(assembly, "", "SaxDbDfn_Core.xml");
if (StringUtil.IsEmpty(xmlSchema))
return Json(responseData.SetMessage(messageTitle, "Failed to extract XML schema definition."));
// Extract schema from XML definition.
SaDbProcess_ConvertDbSchema.Config cfgSchemaConvert = new SaDbProcess_ConvertDbSchema.Config();
SaDbProcess_ConvertDbSchema procSchemaConvert = new SaDbProcess_ConvertDbSchema(cfgSchemaConvert);
List<DbDfnTable> tables = procSchemaConvert.ConvertXmlToTables(xmlSchema);
if (procSchemaConvert.HasProcessError())
return Json(responseData.SetMessage(messageTitle, "Failed to convert XML schema: " + procSchemaConvert.GetProcessError()));
SaDbProcess_CompareDatabaseSchemas.Config cfgSchemaCompare = new SaDbProcess_CompareDatabaseSchemas.Config(tables, db);
cfgSchemaCompare.HideIdenticalObjects = true;
cfgSchemaCompare.IgnorePosition = true;
SaDbProcess_CompareDatabaseSchemas procSchemaCompare = new SaDbProcess_CompareDatabaseSchemas(cfgSchemaCompare);
procSchemaCompare.ProcessNotifier = this;
procSchemaCompare.RunProcess();
List<SaDbProcess_CompareDatabaseSchemas.SchemaComparisonItem> schemaComparisonItems = procSchemaCompare.GetSchemaComparisonItems();
foreach (SaDbProcess_CompareDatabaseSchemas.SchemaComparisonItem schemaComparisonItem in schemaComparisonItems)
{
Id = schemaComparisonItem.Id,
TableName = schemaComparisonItem.TableName,
ColumnName = schemaComparisonItem.ColumnName,
ColumnPosition = schemaComparisonItem.ColumnPosition,
IndexName = schemaComparisonItem.IndexName,
Comment = schemaComparisonItem.Comment
};
responseData.Items.Add(item);
DbSchemaItemResponseData item = new DbSchemaItemResponseData()
{
Id = schemaComparisonItem.Id,
TableName = schemaComparisonItem.TableName,
ColumnName = schemaComparisonItem.ColumnName,
ColumnPosition = schemaComparisonItem.ColumnPosition,
IndexName = schemaComparisonItem.IndexName,
Comment = schemaComparisonItem.Comment
};
responseData.Items.Add(item);
}
}
// Complete response.
@@ -193,6 +203,194 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
{
}
//-------------------------------------------------------------------
// Database Table ajax request.
//-------------------------------------------------------------------
private class AjaxResponseData_Table
{
public AjaxResponseData_Table(DbDfnTable tableDfn)
{
Schema = tableDfn.Schema;
Name = tableDfn.Name;
if (!StringUtil.IsEmpty(tableDfn.Remarks))
Remarks = tableDfn.Remarks;
foreach (DbDfnColumn columnDfn in tableDfn.Columns)
Columns.Add(new AjaxResponseData_Column(columnDfn));
foreach (DbDfnIndex indexDfn in tableDfn.Indices)
Indices.Add(new AjaxResponseData_Index(indexDfn));
}
public String Schema { get; }
public String Name { get; }
public String QualifiedName { get { return (!StringUtil.IsEmpty(Schema) ? Schema + "." : "") + Name; } }
public String QuotedQualifiedName { get { return (!StringUtil.IsEmpty(Schema) ? "[" + Schema + "]." : "") + "[" + Name + "]"; } }
public String Remarks { get; set; } = String.Empty;
public List<AjaxResponse_Data.ItemLabelValue> Properties { get; } = new List<AjaxResponse_Data.ItemLabelValue>();
public List<AjaxResponseData_Column> Columns { get; } = new List<AjaxResponseData_Column>();
public List<AjaxResponseData_Index> Indices { get; } = new List<AjaxResponseData_Index>();
}
private class AjaxResponseData_Column
{
public int Pos { get; }
public String Name { get; }
public String Format { get; }
public String DataTypeName { get; }
public short? DataTypeNative { get; }
public String DataTypeNameNative { get; }
public bool? IsIdentity { get; }
public long? Size { get; }
public long? BufferLen { get; }
public short? DecimalDigits { get; }
public bool? Nullable { get; }
public bool? IsNullable { get; }
public String Remarks { get; }
public AjaxResponseData_Column(DbDfnColumn columnDfn)
{
Pos = columnDfn.Pos;
Name = columnDfn.Name;
Format = columnDfn.GetFormat();
if (!StringUtil.IsEmpty(columnDfn.DataTypeName))
DataTypeName = columnDfn.DataTypeName;
if (columnDfn.DataTypeNative > 0)
DataTypeNative = columnDfn.DataTypeNative;
if (!StringUtil.IsEmpty(columnDfn.DataTypeNameNative))
DataTypeNameNative = columnDfn.DataTypeNameNative;
if (columnDfn.IsIdentity)
IsIdentity = columnDfn.IsIdentity;
if (columnDfn.Size > 0)
Size = columnDfn.Size;
if (columnDfn.BufferLen > 0)
BufferLen = columnDfn.BufferLen;
if (columnDfn.DecimalDigits > 0)
DecimalDigits = columnDfn.DecimalDigits;
if (columnDfn.Nullable == DbColumnNullable.Nullable)
Nullable = true;
if (columnDfn.IsNullable)
IsNullable = columnDfn.IsNullable;
if (!StringUtil.IsEmpty(columnDfn.Remarks))
Remarks = columnDfn.Remarks;
}
}
private class AjaxResponseData_Index
{
public String Name { get; }
public int? IndexType { get; }
public bool? Unique { get; }
public bool? Primary { get; }
public bool? Clustered { get; }
public bool? Nullable { get; }
public int? Pages { get; }
public int? UniqueValues { get; }
public List<AjaxResponseData_IndexColumn> Columns { get; } = new List<AjaxResponseData_IndexColumn>();
public AjaxResponseData_Index(DbDfnIndex indexDfn)
{
Name = indexDfn.Name;
if (indexDfn.IndexType > 0)
IndexType = indexDfn.IndexType;
if (indexDfn.Unique)
Unique = indexDfn.Unique;
if (indexDfn.Primary)
Primary = indexDfn.Primary;
if (indexDfn.Clustered)
Clustered = indexDfn.Clustered;
if (indexDfn.Nullable)
Nullable = indexDfn.Nullable;
if (indexDfn.Pages > 0)
Pages = indexDfn.Pages;
if (indexDfn.UniqueValues > 0)
UniqueValues = indexDfn.UniqueValues;
foreach (DbDfnIndexColumn indexColumnDfn in indexDfn.Columns)
Columns.Add(new AjaxResponseData_IndexColumn(indexColumnDfn));
}
}
private class AjaxResponseData_IndexColumn
{
public short Seq { get; }
public String Name { get; }
public bool? Desc { get; }
public AjaxResponseData_IndexColumn(DbDfnIndexColumn indexColumnDfn)
{
Seq = indexColumnDfn.Seq;
Name = indexColumnDfn.Name;
if (!indexColumnDfn.Ascend)
Desc = true;
}
}
private class AjaxResponse_DatabaseTable : AjaxResponse_Data
{
// Construction.
public AjaxResponse_DatabaseTable(SaxModel_Admin model) : base(model) { }
// Database table.
public String PopupTitle { get; set; }
public AjaxResponseData_Table Table { get; set; }
}
//-------------------------------------------------------------------
[HttpPost]
[Route("System/Ajax/GetDatabaseTable")]
public IActionResult Ajax_GetDatabaseTable(Model_System model)
{
String fn = GetType().Name + ".Ajax_GetDatabaseTable";
String messageTitle = Localiser["system.caption.database"];
AjaxResponse_DatabaseTable responseData = new AjaxResponse_DatabaseTable(model);
// Validate session.
if (!ValidUserSession)
return GetAjaxResult_InvalidSession(responseData);
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<SacsDisposable> disposableItems = new DisposableCollection<SacsDisposable>())
{
// Parameters.
if (StringUtil.IsEmpty(model.DatabaseTable.Name))
return Json(responseData.SetMessage(messageTitle, "Table name must be supplied."));
// Core Database connection.
ISacsDatabase db = SaxGlobals.App.GetCoreDatabase(SessionContext);
// Table definition.
DbDfnTable tableDfn = db.GetTableDfn(model.DatabaseTable.Name, true);
if (tableDfn == null)
return Json(responseData.SetMessage(messageTitle, "Invalid Table name supplied."));
// Populate table response.
responseData.Table = new AjaxResponseData_Table(tableDfn);
responseData.PopupTitle = Localiser["label.table"] + ": " + tableDfn.Name;
// Database sizing.
String query = "Exec sp_SpaceUsed [" + tableDfn.QualifiedName + "];";
using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(db, query))
{
if (dbResultSet != null && dbResultSet.NextRecord())
{
// Row count.
long rows = StringUtil.ToLong(dbResultSet.GetRecordValues().GetValue("rows").ToString());
if (rows > 0)
responseData.Table.Properties.Add(new AjaxResponse_Data.ItemLabelValue() { Label = "Rows", Value = rows.ToString() });
// Reserved space.
String reserved = dbResultSet.GetRecordValues().GetValue("reserved").AsString();
if (!StringUtil.IsEmpty(reserved))
responseData.Table.Properties.Add(new AjaxResponse_Data.ItemLabelValue() { Label = "Reserved", Value = reserved });
// Data space.
String data = dbResultSet.GetRecordValues().GetValue("data").AsString();
if (!StringUtil.IsEmpty(data))
responseData.Table.Properties.Add(new AjaxResponse_Data.ItemLabelValue() { Label = "Data", Value = data });
// Index space.
String index = dbResultSet.GetRecordValues().GetValue("index_size").AsString();
if (!StringUtil.IsEmpty(index))
responseData.Table.Properties.Add(new AjaxResponse_Data.ItemLabelValue() { Label = "Indices", Value = index });
// Unused space.
String unused = dbResultSet.GetRecordValues().GetValue("unused").AsString();
if (!StringUtil.IsEmpty(unused))
responseData.Table.Properties.Add(new AjaxResponse_Data.ItemLabelValue() { Label = "Unused", Value = unused });
}
}
}
// Complete response.
responseData.Success = true;
return Json(responseData);
}
//-------------------------------------------------------------------
}
//=======================================================================
@@ -38,7 +38,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
//-------------------------------------------------------------------
[HttpPost]
[Route("System/Ajax/GetLogFileList")]
public IActionResult Ajax_GetLogFileList(Model_Sport model)
public IActionResult Ajax_GetLogFileList(Model_System model)
{
String fn = GetType().Name + ".Ajax_GetLogFileList";
String messageTitle = Localiser["system.caption.logs"];
@@ -37,6 +37,7 @@ namespace Saxonite.Net.Core.Web.Admin.Models
//-------------------------------------------------------------------
// Sport properties.
public String SportId { get; set; }
public String SportIdParent { get; set; }
public String SportName { get; set; }
public String SportSpecialityLabelCode { get; set; }
public Sax.SportSpecialityLabel SportSpecialityLabel { get { return (Sax.SportSpecialityLabel)SportSpecialityLabelCodes.GetTypeForCode(SportSpecialityLabelCode); } }
@@ -49,47 +50,64 @@ namespace Saxonite.Net.Core.Web.Admin.Models
// Sport.
public bool ValidateSportData(SaxController_Base.AjaxResponse_Data responseData)
{
// Sport name.
if (SportName != null)
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<SacsHierarchyItem> disposableItems = new DisposableCollection<SacsHierarchyItem>())
{
responseData.SetControlValue(nameof(SportName), SportName);
if (StringUtil.IsEmpty(SportName))
responseData.SetControlError(nameof(SportName), Localiser["msg.validation.mandatory.value"]);
else if (StringUtil.GetLength(SportName) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Sport_Name))
responseData.SetControlError(nameof(SportName), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Sport_Name)]);
else
// Parent sport.
SysId sportIdParent = SportIdParent.ToSysId();
if (SportIdParent != null && SysId.IsValid(sportIdParent))
{
// Check for duplicate name.
SaxSport.Params prmSport = new SaxSport.Params();
SysId sportId = SportId.ToSysId();
if (SysId.IsValid(sportId))
prmSport.IdsExcluded.Add(sportId);
prmSport.NamePartial = SportName;
prmSport.StatusCat = SaxSport.StatusCat.Any;
if (ReferenceMgr.GetSportCount(prmSport) > 0)
responseData.SetControlError(nameof(SportName), Localiser["msg.validation.duplicate.value"]);
SaxSport sport = ReferenceMgr.GetSportById(SportIdParent.ToSysId());
disposableItems.Add(sport);
if (sport == null)
responseData.SetControlError(nameof(SportIdParent), Localiser["msg.validation.invalid.value"]);
else if (SysId.IsValid(sport.SportIdParent))
responseData.SetControlError(nameof(SportIdParent), Localiser["msg.validation.invalid.value"]);
}
}
// Sport Speciality Label.
if (SportSpecialityLabelCode != null)
{
if (!StringUtil.IsEmpty(SportSpecialityLabelCode))
// Sport name.
if (SportName != null)
{
if (SportSpecialityLabel <= 0)
responseData.SetControlError(nameof(SportSpecialityLabel), Localiser["msg.validation.invalid.value"]);
responseData.SetControlValue(nameof(SportName), SportName);
if (StringUtil.IsEmpty(SportName))
responseData.SetControlError(nameof(SportName), Localiser["msg.validation.mandatory.value"]);
else if (StringUtil.GetLength(SportName) > GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Sport_Name))
responseData.SetControlError(nameof(SportName), Localiser["msg.validation.maximum.length", GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Sport_Name)]);
else
{
// Check for duplicate name.
SaxSport.Params prmSport = new SaxSport.Params();
SysId sportId = SportId.ToSysId();
if (SysId.IsValid(sportId))
prmSport.IdsExcluded.Add(sportId);
prmSport.NamePartial = SportName;
prmSport.StatusCat = SaxSport.StatusCat.Any;
if (ReferenceMgr.GetSportCount(prmSport) > 0)
responseData.SetControlError(nameof(SportName), Localiser["msg.validation.duplicate.value"]);
}
}
}
// Sport status.
if (SportStatusCode != null)
{
if (StringUtil.IsEmpty(SportStatusCode))
responseData.SetControlError(nameof(SportStatus), Localiser["msg.validation.mandatory.value"]);
else if (!SaxSport.ValidStatuses.Contains(SportStatus))
responseData.SetControlError(nameof(SportStatus), Localiser["msg.validation.invalid.value"]);
}
// Sport Speciality Label.
if (SportSpecialityLabelCode != null)
{
if (!StringUtil.IsEmpty(SportSpecialityLabelCode))
{
if (SportSpecialityLabel <= 0)
responseData.SetControlError(nameof(SportSpecialityLabel), Localiser["msg.validation.invalid.value"]);
}
}
// Sport status.
if (SportStatusCode != null)
{
if (StringUtil.IsEmpty(SportStatusCode))
responseData.SetControlError(nameof(SportStatus), Localiser["msg.validation.mandatory.value"]);
else if (!SaxSport.ValidStatuses.Contains(SportStatus))
responseData.SetControlError(nameof(SportStatus), Localiser["msg.validation.invalid.value"]);
}
}
return !responseData.HasControlErrors();
}
@@ -24,9 +24,14 @@ namespace Saxonite.Net.Core.Web.Admin.Models
// Database page properties.
public class DatabaseFilterData
{
public String Table { get; set; }
public String Search { get; set; }
}
public DatabaseFilterData DatabaseFilter { get; } = new DatabaseFilterData();
public class DatabaseTableData
{
public String Name { get; set; }
}
public DatabaseTableData DatabaseTable { get; } = new DatabaseTableData();
//-------------------------------------------------------------------
// Logs page properties.
@@ -147,6 +147,12 @@
<data name="home.msg.no.items.awaiting.activation" xml:space="preserve">
<value>No items are awaiting activation</value>
</data>
<data name="info.char.available" xml:space="preserve">
<value>[1 char available]</value>
</data>
<data name="info.chars.available" xml:space="preserve">
<value>[{0} chars available]</value>
</data>
<data name="label.accounts" xml:space="preserve">
<value>Accounts</value>
</data>
@@ -174,12 +180,6 @@
<data name="label.category" xml:space="preserve">
<value>Category</value>
</data>
<data name="label.characters.count" xml:space="preserve">
<value>{0} characters</value>
</data>
<data name="label.characters.one" xml:space="preserve">
<value>1 character</value>
</data>
<data name="label.clear" xml:space="preserve">
<value>Clear</value>
</data>
@@ -54,7 +54,7 @@
}
@* Scripts *@
<script>
<script>
var sax = sax || { page: {}, mdl: {}, url: {}, links: {}, form: {}, data: {}, ajax: {}, msg: {}, lbl: {}, dlg: { title: {}, btn: {} }, $frm: {}, $dlg: {}, $pnl: {}, session: {}, kli: {} };
sax.url.base = '@Model.RedirectLocation.Base';
sax.url.home = '@Model.RedirectLocation.Home';
@@ -70,8 +70,8 @@
sax.dlg.btn.ok = '@Localiser["label.ok"]';
sax.dlg.btn.close = '@Localiser["label.close"]';
sax.dlg.btn.cancel = '@Localiser["label.cancel"]';
sax.lbl.availableCharacter = '@Localiser.GetJavascriptText("label.characters.one")';
sax.lbl.availableCharacters = '@Localiser.GetJavascriptText("label.characters.count", "{0}")';
sax.lbl.charAvailable = '@Localiser.GetJavascriptText("info.char.available")';
sax.lbl.charsAvailable = '@Localiser.GetJavascriptText("info.chars.available", "{0}")';
sax.lbl.noneSelected = '@Localiser.GetJavascriptText("label.selected.none")';
sax.lbl.numberSelected = '@Localiser.GetJavascriptText("label.selected.count", "{0}")';
sax.msg.signOutConfirm = '@Localiser.GetJavascriptText("security.msg.signout.confirm")';
@@ -84,7 +84,7 @@
sax.kli.active = @keepLoggedIn;
sax.kli.interval = @(Sax.Config.Admin.Session.Cookie.KeepLoggedInTimeoutMillis);
sax.debugMode = @debug;
</script>
</script>
</head>
<body>
@@ -4,7 +4,7 @@
ViewData["Title"] = "System - Database";
}
<div class="container-fluid">
<div class="container-fluid DatabaseTables">
<div class="sax-panel-filter">
<div class="sax-header row">
@@ -14,11 +14,11 @@
</div>
</div>
<div class="sax-content">
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmDatabaseFilter", @class = "sax-form", @onSubmit = "return false;" }))
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmDbTableFilter", @class = "sax-form", @onSubmit = "return false;" }))
{
<div class="row">
<div class="col-sm-5 sax-label text-left text-sm-right">@Localiser["label.search"]</div>
<div class="col-sm-7">@Html.TextBoxFor(model => model.DatabaseFilter.Table, new { @id = "ifFilterDatabaseTable", @class = "FilterDatabaseTable", @maxlength = "32" })</div>
<div class="col-sm-7">@Html.TextBoxFor(model => model.DatabaseFilter.Search, new { @id = "ifFilterDatabaseTable", @class = "FilterDatabaseTable", @maxlength = "32" })</div>
</div>
}
</div>
@@ -51,3 +51,75 @@
</div>
</div>
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmDbTableName", @onSubmit = "return false;" }))
{
@Html.HiddenFor(model => model.DatabaseTable.Name, new { @class = "DatabaseTableName" })
}
<style>
#dlgDbTable tr.sax-heading td
{
color:#808080;
border-bottom: 1px solid #808080;
}
</style>
<div id="dlgDbTable" class="sax-panel-item-template">
<div class="">
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmDbTable", @onSubmit = "return false;" }))
{
@Html.HiddenFor(model => model.DatabaseTable.Name, new { @class = "DatabaseTableName" })
}
<table>
<tr>
<td class="right pt2 pr8">Properties:</td>
<td>
<table class="TableProperties">
</table>
</td>
</tr>
<tr>
<td class="right pt2 pr8">Columns:</td>
<td>
<table class="TableColumns">
<tr class="sax-heading">
<td class="right pl8 pr8">Pos</td>
<td class="pl8 pr8">Name</td>
<td class="center">Format</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="right pt2 pr8">Indices:</td>
<td>
<table class="TableIndices">
<tr class="sax-heading">
<td class="pl8 pr8">Name</td>
<td class="center pl8 pr8">Unique</td>
<td class="pl8 pr8">Columns</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
<div class="sax-panel-item-template">
<table>
<tr class="TableProperty">
<td class="sax-label Label right pl8 pr8"></td>
<td class="Value pl8 pr8"></td>
</tr>
<tr class="TableColumn">
<td class="Pos right pl8 pr8"></td>
<td class="Name pl8 pr8"></td>
<td class="Format center pl8 pr8"></td>
</tr>
<tr class="TableIndex">
<td class="Name pl8 pr16"></td>
<td class="Unique center"></td>
<td class="Columns pl8 pr8"></td>
</tr>
</table>
</div>
</div>
+22 -12
View File
@@ -103,24 +103,34 @@
if (ctrl == null || ctrl.value == null) return;
if (ctrl.value.length > len) ctrl.value = ctrl.value.substring(0, len);
}
sax.setAvailableCharsLabel = function ($if, max, $lbl)
sax.setAvailableCharsInfo = function ($if, max, $info)
{
var avail = Math.max(0, max - $if.val().length);
$lbl.text(avail == 1 ? sax.lbl.availableCharacter : sax.lbl.availableCharacters.replace(/\{0\}/g, avail));
let info = '';
if (max > 0)
{
let avail = Math.max(0, max - $if.val().length);
info = (avail == 1 ? sax.lbl.charAvailable : sax.lbl.charsAvailable.replace(/\{0\}/g, avail));
}
($info || $('.sax-info', $if.closest('.sax-form-control'))).text(info);
}
sax.setCharsAvailableLabel = function ($if, max)
{
var avail = Math.max(0, max - $if.val().length);
$('.sax-select-chars-available', $if.closest('.sax-form-control')).text(avail == 1 ? sax.lbl.availableCharacter : sax.lbl.availableCharacters.replace(/\{0\}/g, avail));
}
sax.setItemsSelectedLabel = function ($sel)
sax.setItemsSelectedInfo = function ($sel, $info)
{
var sel = $(':selected', $sel).length;
$('.sax-select-items-selected', $sel.closest('.sax-form-control')).text(sel == 0 ? sax.lbl.noneSelected : sax.lbl.numberSelected.replace(/\{0\}/g, sel));
($info || $('.sax-info', $sel.closest('.sax-form-control'))).text(sel == 0 ? sax.lbl.noneSelected : sax.lbl.numberSelected.replace(/\{0\}/g, sel));
}
sax.initCalendars = function (sel)
sax.initCalendars = function (sel, opt)
{
return $(sel).datepicker();
return $(sel).datepicker(opt || {});
}
sax.allowClearCalendar = function (sel)
{
$(sel).datepicker().on('keyup', function (e)
{
if (e.keyCode == 8 || e.keyCode == 46)
{
$(this).datepicker('setDate', null);
}
});
}
sax.refreshPaging = function (response, context, refreshFn)
{
+103 -38
View File
@@ -5,94 +5,159 @@
(function (win, doc, undef)
{
"use strict";
let sd = sax.sysDb = { $pnl: {}, $frm: {}, $dlg: {} };
let $pnl = sd.$pnl; let $frm = sd.$frm; let $dlg = sd.$dlg;
sax.itemIdPrefix = 'Itm_';
//--------------------------------------------------------------
sax.refreshResults = function (delay)
sd.refreshResults = function (delay)
{
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);
var $items = $('.sax-panel-item-list', $pnl.results).fadeOut(200).empty();
var $msgs = $('.sax-panel-messages', $pnl.results).hide().empty().append($('<div class="sax-message">' + sax.msg.dataQuerying + '</div>')).fadeIn(200);
}
sax.ajax.refreshResults = sax.ajax.refreshResults || { url: sax.url.base + 'System/Ajax/GetDatabaseTables', formId: 'frmDatabaseFilter', callbackFn: sax.doRefreshResults };
sax.ajax.refreshResults = sax.ajax.refreshResults || { url: sax.url.base + 'System/Ajax/GetDatabaseTables', formId: 'frmDbTableFilter', callbackFn: sd.doRefreshResults };
sax.doAjaxRequest(sax.ajax.refreshResults, delay || 50);
sax.awaitingRefreshResponse = true;
}
sax.doRefreshResults = function (response)
sd.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 $tmpl = $('.sax-panel-item-template .sax-panel-item.DatabaseTable', $results);
var $msgs = $('.sax-panel-messages', $pnl.results).hide().empty();
var $items = $('.sax-panel-item-list', $pnl.results).hide().empty();
if (!response.success) return;
// Items.
var items = response.tables;
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 = $tmpl.clone();
sax.populateItem($item, item);
$items.append($item);
}
$items.append(sd.populateItem(sd.getTableTemplate(), items[itemIdx]));
$items.fadeIn(50);
}
sax.populateItem = function ($item, item)
sd.populateItem = function ($item, item)
{
if (!item) return;
if (!item) return $item;
$item.prop('id', sax.itemIdPrefix + item.id);
$('.TableName', $item).text(item.qualifiedName);
$('.RowCount', $item).text(item.rowCount);
$('.ColumnCount', $item).text(item.columnCount);
$('.IndexCount', $item).text(item.indexCount);
$('.sax-caption .sax-action, .sax-actions .sax-action.sax-item-view', $item).off('click').on('click', function () { sax.viewItem(item.id) })
$item.off('dblclick').on('dblclick', function () { sax.updateItem(item.id) })
$('.sax-caption .sax-action, .sax-actions .sax-action.sax-item-view', $item).off('click').on('click', function () { sd.viewItem(item) })
$item.off('dblclick').on('dblclick', function () { sax.viewItem(item) })
$('.sax-panel-results .sax-panel-messages').hide().empty();
return $item;
}
sd.getTableTemplate = function ()
{
return $('.sax-panel-item-template .sax-panel-item.DatabaseTable', $pnl.results).clone();
}
//--------------------------------------------------------------
sax.viewItem = function (id)
sd.viewItem = function (item)
{
$('.DatabaseTableName', sax.$frm.dbTableName).val(id);
sax.ajax.updateItem = sax.ajax.updateItem || { url: sax.url.base + 'System/Ajax/GetDatabaseTable', formId: 'frmDatabaseTableName', callbackFn: sax.onViewItem };
//sax.debug('viewItem', item.tableName, $frm.tableName, $('.DatabaseTableName', $frm.tableName))
$('.DatabaseTableName', $frm.tableName).val(item.tableName);
sax.ajax.updateItem = sax.ajax.updateItem || { url: sax.url.base + 'System/Ajax/GetDatabaseTable', formId: 'frmDbTableName', callbackFn: sd.onViewItem };
sax.doAjaxRequest(sax.ajax.updateItem, 50);
}
sax.onViewItem = function (response)
sd.onViewItem = function (response)
{
//sax.debug('onViewItem', response);
let $frm = sax.$frm.dbTable;
$('input[type="text"],textarea,select', $frm).val('');
sd.clearItem();
if (!response.success) return;
let item = response.table;
$('.DatabaseTableName', $frm).val(item.name);
let $frmT = $frm.table;
$('.DatabaseTableName', $frmT).val(item.name);
// Properties.
let prts = item.properties;
let $prts = $('.TableProperties', $dlg.table);
$('tr:not(.sax-heading)', $prts).remove();
for (let prtIdx = 0; prtIdx < prts.length; prtIdx++)
{
let prt = prts[prtIdx];
let $prt = sd.getTablePropertyTemplate();
$('.Label', $prt).text(prt.label);
$('.Value', $prt).text(prt.value);
$prts.append($prt);
}
// Columns.
let cols = item.columns;
let $cols = $('.TableColumns', $dlg.table);
$('tr:not(.sax-heading)', $cols).remove();
for (let colIdx = 0; colIdx < cols.length; colIdx++)
{
let col = cols[colIdx];
let $col = sd.getTableColumnTemplate();
$('.Pos', $col).text(col.pos);
$('.Name', $col).text(col.name);
$('.Format', $col).text(col.format);
$cols.append($col);
}
// Indices.
let idxs = item.indices;
let $idxs = $('.TableIndices', $dlg.table);
$('tr:not(.sax-heading)', $idxs).remove();
for (let idxIdx = 0; idxIdx < idxs.length; idxIdx++)
{
let idx = idxs[idxIdx];
let $idx = sd.getTableIndexTemplate();
$('.Name', $idx).text(idx.name);
for (const col of idx.columns)
$('.Columns', $idx).append($('<div>').text(col.name));
$('.Unique', $idx).text(idx.unique?'Yes':'');
$idxs.append($idx);
}
// Display table details.
$dlg.table.dialog('option', 'title', response.popupTitle || "Table: " + item.name);
sax.openDialog($dlg.table, 600, 600);
}
sd.clearItem = function ()
{
let $frmT = $frm.table;
$('input[type="text"],textarea,select', $frmT).val('');
sax.clearControlErrors();
sax.$dlg.dbTable.dialog('option', 'title', sax.dlg.title.viewDatabaseTable);
sax.openDialog(sax.$dlg.dbTable, 600, 600);
}
sd.getTablePropertyTemplate = function ()
{
return sd.getTableRowTemplate('TableProperty');
}
sd.getTableColumnTemplate = function ()
{
return sd.getTableRowTemplate('TableColumn');
}
sd.getTableIndexTemplate = function ()
{
return sd.getTableRowTemplate('TableIndex');
}
sd.getTableRowTemplate = function (name)
{
return $('.sax-panel-item-template .'+name, $dlg.table).clone();
}
//--------------------------------------------------------------
$(function ()
{
$('.sax-action.sax-results-refresh').on('click', function () { sax.refreshResults(); });
$pnl.tables = $('.DatabaseTables');
$pnl.filter = $('.sax-panel-filter', $pnl.tables);
$pnl.results = $('.sax-panel-results', $pnl.tables);
$pnl.filter.on('click', '.sax-action.sax-results-refresh', function () { sd.refreshResults(); });
$('.sax-input').on('input', function () { sax.clearControlError(this); });
sax.$frm.filter = $('#frmDatabaseFilter');
$('.FilterDatabaseTable', sax.$frm.filter).on('input', function () { sax.refreshResults(250); });
sax.$frm.dbTableName = $('#frmDatabaseTableName');
sax.$frm.dbTable = $('#frmDatabaseTable');
$frm.filter = $('#frmDbTableFilter');
$('.FilterDatabaseTable', $frm.filter).on('input', function () { sd.refreshResults(250); });
$frm.tableName = $('#frmDbTableName');
$frm.table = $('#frmDbTable');
var opt = sax.dlgOpts();
opt.buttons[sax.dlg.btn.ok] = function () { sax.storeItem(); };
opt.buttons[sax.dlg.btn.cancel] = function () { $(this).dialog('close'); };
sax.$dlg.dbTable = $('#dlgDatabaseTable').dialog(opt);
//opt.buttons[sax.dlg.btn.ok] = function () { sax.storeItem(); };
opt.buttons[sax.dlg.btn.close] = function () { $(this).dialog('close'); };
$dlg.table = $('#dlgDbTable').dialog(opt);
setTimeout(sax.refreshResults, 250);
setTimeout(sd.refreshResults, 250);
});
}(window, window.document));
@@ -264,7 +264,7 @@
//--------------------------------------------------------------
sax.userEmails = function (item)
{
sax.debug('userEmails', item);
//sax.debug('userEmails', item);
let frm = $frm.emailsl
$('.UserId', frm).val(item.id);
$('.UserEmailAddress', frm).val(item.emailAddress);
@@ -213,6 +213,12 @@
<data name="home.organisation.request.para2" xml:space="preserve">
<value>Sign-up now with a few details and we'll let you know when you can login and get going.</value>
</data>
<data name="info.char.available" xml:space="preserve">
<value>[1 char available]</value>
</data>
<data name="info.chars.available" xml:space="preserve">
<value>[{0} chars available]</value>
</data>
<data name="label.about" xml:space="preserve">
<value>About</value>
</data>
@@ -249,12 +255,6 @@
<data name="label.category" xml:space="preserve">
<value>Category</value>
</data>
<data name="label.characters.count" xml:space="preserve">
<value>{0} characters</value>
</data>
<data name="label.characters.one" xml:space="preserve">
<value>1 character</value>
</data>
<data name="label.clear" xml:space="preserve">
<value>Clear</value>
</data>
@@ -109,7 +109,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
{
Organisation = model.GetOrganisationName(organisationEvent.OrganisationId);
EventAt = DateUtil.Format(organisationEvent.EventAt, "d-MMM-yy");
if (organisationEvent.EventAt.Hour>0 || organisationEvent.EventAt.Minute > 0)
if (organisationEvent.EventAt.Hour > 0 || organisationEvent.EventAt.Minute > 0)
EventAt += DateUtil.Format(organisationEvent.EventAt, " HH:ss");
Summary = organisationEvent.Summary;
Details = organisationEvent.Details;
@@ -118,7 +118,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
PublishedOnFmt = model.Localiser.FormatDate(organisationEvent.PublishedAt);
}
public String Organisation { get; set; }
public String EventAt{ get; set; }
public String EventAt { get; set; }
public String Summary { get; set; }
public String Details { get; set; }
public String Sport { get; set; }
@@ -172,18 +172,23 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
// User context.
SysId userAccountId = UserAccountId;
SaxActivityConsole.IndexContext indexContext = new SaxActivityConsole.IndexContext(userAccountId);
if (SysId.IsValid(userAccountId))
indexContext.UserAccountIdsOwner.Add(userAccountId);
SysId organisationId = model.DecryptId(model.Filter.OrganisationId);
if (SysId.IsValid(organisationId))
indexContext.OrganisationIdsOwner.Add(organisationId);
// Period.
indexContext.EffectiveTo = DateTime.Today;
// Regions.
if (SysId.IsValid(sessionData.User.RegionIdProvince))
indexContext.RegionIds.Add(sessionData.User.RegionIdProvince);
else if (SysId.IsValid(sessionData.User.RegionIdCountry))
indexContext.RegionIds.Add(sessionData.User.RegionIdCountry);
// Sports.
indexContext.SportIds.AddRange(sessionData.Profile.Sports.Select(item => item.SportId));
// Sport and region combinations.
foreach (SysId sportId in sessionData.Profile.Sports.Select(item => item.SportId))
{
if (SysId.IsValid(sessionData.User.RegionIdProvince))
indexContext.SportRegionIdsIncluded.Add(new SaxActivityIndex.SportRegionIds(sportId, sessionData.User.RegionIdProvince));
else if (SysId.IsValid(sessionData.User.RegionIdCountry))
indexContext.SportRegionIdsIncluded.Add(new SaxActivityIndex.SportRegionIds(sportId, sessionData.User.RegionIdCountry));
}
// Populate activities.
List<ItemId> activityItemIds = new List<ItemId>();
@@ -50,18 +50,14 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
//-------------------------------------------------------------------
// Article data.
private class ArticleData_List
private class ArticleData_List : AjaxResponse_Data.ItemData_Base
{
public String Id { get; set; }
public String OrganisationId { get; set; }
public String Headline { get; set; }
public String Summary { get; set; }
public String RegionCaptionPrimary { get; set; }
public String SportCaptionPrimary { get; set; }
public String PublishedOnFmt { get; set; }
public String CreatedOnFmt { get; set; }
public String StatusCode { get; set; }
public String StatusDesc { get; set; }
}
private class ArticleData_Full : ArticleData_List
{
@@ -75,7 +71,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
}
private void PopulateArticleResponseData(Model_Article model, SaxArticle article, ArticleData_List data)
{
data.Id = SysId.ToString(article.Id);
data.Id = model.EncryptId(article.Id);
data.OrganisationId = SysId.ToString(article.OrganisationId);
data.Headline = article.Headline;
data.Summary = article.Summary;
@@ -245,8 +241,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
NamedValue.Map values = resultSet.GetRecordValues();
ArticleData_List articleData = new ArticleData_List()
{
Id = values.GetString(colId.DataName),
OrganisationId = values.GetString(colOrganisationId.DataName),
Id = model.EncryptId(new SysId(values.GetLong(colId.DataName))),
OrganisationId = model.EncryptId(new SysId(values.GetLong(colOrganisationId.DataName))),
Headline = values.GetString(colHeadline.DataName),
Summary = values.GetString(colSummary.DataName),
RegionCaptionPrimary = model.GetRegionCaption(values.GetString(colRegionIdPrimary.DataName).ToSysId()),
@@ -586,6 +582,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
List<SaxItemImage> itemImages = ItemDataMgr.GetItemImageList(prmItemImage);
// If Article doesn't yet exist, create it now so that images can be assigned.
bool articleCreated = false;
if (!SysId.IsValid(article.Id))
{
if (!ActivityMgr.InsertArticle(article, DbUpdateInfo))
@@ -593,6 +590,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
SaLogger.Warn(fn + " Failed to insert article: " + ActivityMgr.ErrorStateMessage);
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"]));
}
articleCreated = true;
}
// Content.
@@ -651,6 +649,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
SaLogger.Warn(fn + " Failed to update article [Id:" + SysId.ToString(article.Id) + "]: " + ActivityMgr.ErrorStateMessage);
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"]));
}
SaLogger.Info(fn + " Article " + (articleCreated ? "created" : "updated") + ". Id: " + article.Id.ToString() + ". User: " + SessionData.User.EmailAddress, true);
// Store Article Activity Index data.
ActivityConsole.StoreActivityIndex(article, DbUpdateInfo);
@@ -404,6 +404,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
organisationEvent.Status = model.EventStatus;
// Store item.
bool eventCreated = false;
if (!SysId.IsValid(organisationEvent.Id))
{
if (!ActivityMgr.InsertOrganisationEvent(organisationEvent, DbUpdateInfo))
@@ -411,6 +412,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
SaLogger.Warn(fn + " Failed to insert organisationEvent: " + ActivityMgr.ErrorStateMessage);
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"]));
}
eventCreated = true;
}
else
{
@@ -420,6 +422,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"]));
}
}
SaLogger.Info(fn + " Event " + (eventCreated ? "created" : "updated") + ". Id: " + organisationEvent.Id.ToString() + ". User: " + SessionData.User.EmailAddress + ". Organisation: " + organisation.Name, true);
// Store Event Activity Index data.
ActivityConsole.StoreActivityIndex(organisationEvent, DbUpdateInfo);
@@ -385,6 +385,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
opportunity.Status = model.OpportunityStatus;
// Store item.
bool opportunityCreated = false;
if (!SysId.IsValid(opportunity.Id))
{
if (!ActivityMgr.InsertOrganisationOpportunity(opportunity, DbUpdateInfo))
@@ -392,6 +393,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
SaLogger.Warn(fn + " Failed to insert opportunity: " + ActivityMgr.ErrorStateMessage);
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"]));
}
opportunityCreated = true;
}
else
{
@@ -401,6 +403,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"]));
}
}
SaLogger.Info(fn + " Opportunity " + (opportunityCreated ? "created" : "updated") + ". Id: " + opportunity.Id.ToString() + ". User: " + SessionData.User.EmailAddress + ". Organisation: " + organisation.Name, true);
// Store Opportunity Activity Index data.
ActivityConsole.StoreActivityIndex(opportunity, DbUpdateInfo);
@@ -27,6 +27,7 @@ namespace Saxonite.Net.Core.Web.Online.Models
public class FilterData
{
public String Activity { get; set; }
public String OrganisationId { get; set; }
}
public FilterData Filter { get; } = new FilterData();
@@ -43,7 +43,7 @@
<div class="col-sm-8 row">
@Html.HiddenFor(model => model.Filter.OrganisationId, new { @id = "ifFilterOrganisationId", @class = "FilterOrganisationId" })
<div class="col"><input type="text" id="ifFilterOrganisation" class="FilterOrganisation sax-input" readonly="readonly" value="@(Model.Filter.OrganisationCaption)" /></div>
<div class="fixed"><button class="sax-button" onclick="sax.selectFilterOrganisation()">@Localiser["label.select"]</button></div>
<div class="fixed"><button class="sax-button">@Localiser["label.select"]</button></div>
</div>
</div>
}
@@ -27,7 +27,7 @@
@Html.HiddenFor(model => model.ArticleExists, new { @id = "ifArticleExists", @class = "ArticleExists" })
@Html.HiddenFor(model => model.ArticleOrganisationId, new { @id = "ifArticleOrganisationId", @class = "ArticleOrganisationId" })
<div class="sax-article ArticleHeader">
<div class="sax-article ArticleHeader-xxx">
<div class="sax-article-panel sax-article-header">
@@ -49,8 +49,11 @@
@* Article headline *@
<div class="sax-form-control ArticleHeadline">
<div class="sax-label">
<label for="ifArticleHeadline"><span>@Localiser["label.headline"]</span><span class="required">&nbsp;*</span></label>
<div class="row">
<div class="col">
<div class="sax-label"><label for="ifArticleHeadline"><span>@Localiser["label.headline"]</span><span class="required">&nbsp;*</span></label></div>
</div>
<div class="fixed right"><div class="sax-info"></div></div>
</div>
<div class="sax-control">
@Html.TextBoxFor(model => model.ArticleHeadline, new { @id = "ifArticleHeadline", @class = "ArticleHeadline sax-input", @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Article_Headline) })
@@ -60,8 +63,11 @@
@* Article summary *@
<div class="sax-form-control ArticleSummary">
<div class="sax-label">
<label for="ifArticleSummary"><span>@Localiser["label.summary"]</span><span class="required">&nbsp;*</span></label>
<div class="row">
<div class="col">
<div class="sax-label"><label for="ifArticleSummary"><span>@Localiser["label.summary"]</span><span class="required">&nbsp;*</span></label></div>
</div>
<div class="fixed right"><div class="sax-info"></div></div>
</div>
<div class="sax-control">
@Html.TextAreaFor(model => model.ArticleSummary, new { @id = "ifArticleSummary", @class = "ArticleSummary sax-textarea", @rows = 6, @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.Article_Summary) })
@@ -81,7 +87,7 @@
<div class="sax-control row">
@Html.HiddenFor(model => model.ArticleSportId, new { @id = "ifArticleSportId", @class = "ArticleSportId" })
<div class="col">@Html.TextBoxFor(model => model.ArticleSportCaption, new { @id = "ifArticleSportCaption", @class = "ArticleSportCaption sax-input", @readonly = "readonly", @onDblClick = "sax.selectSport()" }) </div>
<div class="fixed"><button class="SelectSport sax-button" style="min-width:auto;margin-left:4px;padding:4px 6px" onclick="sax.selectSport()">@Localiser["label.select"]</button></div>
<div class="fixed"><button class="SelectSport sax-button" style="min-width:auto;margin-left:4px;padding:4px 6px">@Localiser["label.select"]</button></div>
</div>
<div class="sax-message"></div>
</div>
@@ -100,7 +106,7 @@
<div class="sax-control row">
@Html.HiddenFor(model => model.ArticleRegionId, new { @id = "ifArticleRegionId", @class = "ArticleRegionId" })
<div class="col">@Html.TextBoxFor(model => model.ArticleRegionCaption, new { @id = "ifArticleRegionCaption", @class = "ArticleRegionCaption sax-input", @readonly = "readonly", @onDblClick = "sax.selectRegion()" }) </div>
<div class="fixed"><button class="SelectRegion sax-button" style="min-width:auto;margin-left:4px;padding:4px 6px" onclick="sax.selectRegion()">@Localiser["label.select"]</button></div>
<div class="fixed"><button class="SelectRegion sax-button" style="min-width:auto;margin-left:4px;padding:4px 6px">@Localiser["label.select"]</button></div>
</div>
<div class="sax-message"></div>
</div>
@@ -75,8 +75,8 @@
sax.lbl.create='@Localiser.GetJavascriptText("label.create")';
sax.lbl.add='@Localiser.GetJavascriptText("label.add")';
sax.lbl.calendar='@Localiser.GetJavascriptText("label.calendar")';
sax.lbl.availableCharacter = '@Localiser.GetJavascriptText("label.characters.one")';
sax.lbl.availableCharacters = '@Localiser.GetJavascriptText("label.characters.count", "{0}")';
sax.lbl.charAvailable = '@Localiser.GetJavascriptText("info.char.available")';
sax.lbl.charsAvailable = '@Localiser.GetJavascriptText("info.chars.available", "{0}")';
sax.lbl.noneSelected = '@Localiser.GetJavascriptText("label.selected.none")';
sax.lbl.numberSelected = '@Localiser.GetJavascriptText("label.selected.count", "{0}")';
sax.msg.itemRemoveConfirm = '@Localiser.GetJavascriptText("msg.confirm.item.remove")';
@@ -107,7 +107,7 @@
{
}
/* Labels, values, notes */
/* Info panel - Labels, values, info , notes */
.sax-panel-info .sax-label, .sax-panel-info .sax-value
{
@@ -153,6 +153,12 @@
line-height: 1.25;
}
.sax-form .sax-form-control .sax-info
{
font-size: 0.8rem;
line-height: 1.2;
}
.sax-form .sax-form-control .sax-note
{
font-size: 0.9rem;
@@ -53,7 +53,7 @@
{
var $select = $('.sax-control select.' + name, $section);
$select.val(value).scrollTop(0);
sax.setItemsSelectedLabel($select);
sax.setItemsSelectedInfo($select);
}
//--------------------------------------------------------------
+133 -119
View File
@@ -7,26 +7,27 @@
"use strict";
sax.segIdPrefix = 'Seg_';
sax.classFileDrag = 'sax-file-drag';
let $pnl = sax.$pnl, $frm = sax.$frm;
let am = sax.articleMgt = { data: {}, $pnl: {}, $frm: {}, $dlg: {} };
let $pnl = am.$pnl, $frm = am.$frm, $dlg = am.$dlg;
let ac = sax.articleContent = sax.articleContent || {};
//--------------------------------------------------------------
sax.refreshResults = function (delay)
am.refreshResults = function (delay)
{
if (!sax.awaitingRefreshResponse)
if (!am.awaitingRefreshResponse)
{
$('.sax-burger', $pnl.filter).hide();
$('.sax-panel-item-list', $pnl.results).fadeOut(200).empty();
$('.sax-panel-messages', $pnl.results).hide().empty().append($('<div class="sax-message">' + sax.msg.dataQuerying + '</div>')).fadeIn(200);
}
sax.ajax.refreshResults = sax.ajax.refreshResults || { url: sax.url.base + 'Article/Ajax/GetList', formId: 'frmArticleFilter', callbackFn: sax.doRefreshResults };
sax.ajax.refreshResults = sax.ajax.refreshResults || { url: sax.url.base + 'Article/Ajax/GetList', formId: 'frmArticleFilter', callbackFn: am.doRefreshResults };
sax.doAjaxRequest(sax.ajax.refreshResults, delay || 50);
sax.awaitingRefreshResponse = true;
am.awaitingRefreshResponse = true;
}
sax.doRefreshResults = function (response)
am.doRefreshResults = function (response)
{
//sax.debug('doRefreshResults', response);
delete sax.awaitingRefreshResponse;
delete am.awaitingRefreshResponse;
sax.refreshControlValues(response.controlValues);
var $msgs = $('.sax-panel-messages', $pnl.results).hide().empty();
var $items = $('.sax-panel-item-list', $pnl.results).hide().empty();
@@ -34,25 +35,24 @@
sax.data.articleOrganisations = response.organisations;
sax.data.defaultSport = response.defaultSport;
sax.data.defaultRegion = response.defaultRegion;
sax.refreshPaging(response, '#frmArticleFilter', sax.refreshResults);
sax.refreshPaging(response, '#frmArticleFilter', am.refreshResults);
// Menu.
let $mnu = $('.sax-burger ul.sax-dropdown-menu', $pnl.filter).empty();
$mnu.append(sax.getFilterMenuOption(sax.lbl.refresh, function () { sax.refreshResults(); }, 'sax-refresh'));
$mnu.append(sax.getFilterMenuOption(sax.lbl.add, function () { sax.createItem(); }, 'sax-add'));
$mnu.append(am.getFilterMenuOption(sax.lbl.refresh, function () { am.refreshResults(); }, 'sax-refresh'));
$mnu.append(am.getFilterMenuOption(sax.lbl.add, function () { am.createItem(); }, 'sax-add'));
$('.sax-burger', $pnl.filter).toggle(!!$('.sax-dropdown-item', $mnu).length);
// Items.
var items = response.articles;
if (!items.length)
return $msgs.append($('<div class="sax-message">' + sax.msg.dataNoneFound + '</div>')).fadeIn(500);
for (let itemIdx = 0; itemIdx < items.length; itemIdx++)
$items.append(sax.populateItem(sax.getItemTemplate(), items[itemIdx]));
$items.append(am.populateItem(am.getItemTemplate(), items[itemIdx]));
$items.fadeIn(50);
}
sax.populateItem = function ($item, item)
am.populateItem = function ($item, item)
{
if (!item) return;
$('.sax-panel-messages', $pnl.results).hide().empty();
$item.prop('id', sax.getItemId(item.id));
$('.ArticleHeadline', $item).text(item.headline);
$('.ArticleSummary', $item).text(item.summary);
$('.ArticleRegionCaption', $item).text(item.regionCaptionPrimary);
@@ -65,8 +65,8 @@
let $mnu = $('ul.sax-dropdown-menu', $bgr).empty();
if (!item.deleted)
{
let fnUpd = function () { sax.updateItem(item) };
$mnu.append(sax.getItemMenuOption(sax.lbl.edit, fnUpd, 'sax-edit'));
let fnUpd = function () { am.updateItem(item, $item) };
$mnu.append(am.getItemMenuOption(sax.lbl.edit, fnUpd, 'sax-edit'));
$('.sax-caption .sax-action', $item).off('click').on('click', fnUpd);
}
else $('.sax-caption .sax-action', $item).removeClass('sax-action');
@@ -75,62 +75,59 @@
}
//--------------------------------------------------------------
sax.getItemId = function (id)
{
return 'Itm_' + id;
}
sax.getFilterDropdownTemplate = function ()
am.getFilterDropdownTemplate = function ()
{
return $('.sax-panel-item-template .sax-dropdown-menu.Articles li.sax-dropdown-item', $pnl.filter).clone();
}
sax.getItemTemplate = function ()
am.getItemTemplate = function ()
{
return $('.sax-panel-item-template .sax-panel-item.Article', $pnl.results).clone();
}
sax.getItemDropdownTemplate = function ()
am.getItemDropdownTemplate = function ()
{
return $('.sax-panel-item-template .sax-dropdown-menu.Article li.sax-dropdown-item', $pnl.results).clone();
}
sax.getSegmentTemplate = function ()
am.getSegmentTemplate = function ()
{
return $('.sax-panel-item-template .sax-panel-item.ArticleSegment', ac.$content).clone();
}
sax.getFilterMenuOption = function (lbl, fn, cls)
am.getFilterMenuOption = function (lbl, fn, cls)
{
return sax.getMenuOption(sax.getFilterDropdownTemplate(), lbl, fn, cls);
return am.getMenuOption(am.getFilterDropdownTemplate(), lbl, fn, cls);
}
sax.getItemMenuOption = function (lbl, fn, cls)
am.getItemMenuOption = function (lbl, fn, cls)
{
return sax.getMenuOption(sax.getItemDropdownTemplate(), lbl, fn, cls);
return am.getMenuOption(am.getItemDropdownTemplate(), lbl, fn, cls);
}
sax.getMenuOption = function ($opt, lbl, fn, cls)
am.getMenuOption = function ($opt, lbl, fn, cls)
{
return $opt.find('div.sax-label').text(lbl).end().on('click', fn).addClass(cls);
}
//--------------------------------------------------------------
sax.selectFilterOrganisation = function ()
am.selectFilterOrganisation = function ()
{
if (!sax.data.articleOrganisations || !sax.data.articleOrganisations.length) return;
sax.showSelectOrganisation();
am.showSelectOrganisation();
}
sax.showSelectOrganisation = function ()
am.showSelectOrganisation = function ()
{
//sax.debug('sax.selectFilterOrganisation', sax.data.articleOrganisations);
sax.selectOrganisation.fn.selectOrganisation({ caption: sax.dlg.title.selectOrganisation, items: sax.data.articleOrganisations, fnCallback: sax.onOrganisationSelected });
//sax.debug('am.selectFilterOrganisation', sax.data.articleOrganisations);
sax.selectOrganisation.fn.selectOrganisation({ caption: sax.dlg.title.selectOrganisation, items: sax.data.articleOrganisations, fnCallback: am.onOrganisationSelected });
}
sax.onOrganisationSelected = function (id, name)
am.onOrganisationSelected = function (id, name)
{
//sax.debug('sax.onOrganisationSelected', id, name);
//sax.debug('am.onOrganisationSelected', id, name);
$('#frmArticleFilter #ifFilterOrganisationId, #frmArticle #ifArticleOrganisationId').val(id);
$('#frmArticleFilter #ifFilterOrganisation').val(name);
sax.refreshResults(50);
am.refreshResults(50);
}
//--------------------------------------------------------------
sax.createItem = function ()
am.createItem = function ()
{
sax.clearItem();
am.clearItem();
delete am.data.item; delete am.data.$item;
let $frmA = $frm.article;
if (sax.data.defaultSport)
{
@@ -142,10 +139,10 @@
$('#ifArticleRegionId', $frmA).val(sax.data.defaultRegion.id);
$('#ifArticleRegionCaption', $frmA).val(sax.data.defaultRegion.name);
}
sax.populateArticleContent({});
sax.openArticleDialog(sax.dlg.title.createArticle);
am.populateArticleContent({});
am.openArticleDialog(sax.dlg.title.createArticle);
}
sax.clearItem = function ()
am.clearItem = function ()
{
let $frmF = $frm.filter;
let $frmA = $frm.article;
@@ -160,26 +157,30 @@
$('.sax-input.sax-calendar.ArticlePublishOn', $frmA).datepicker('setDate', 'today');
sax.clearControlErrors();
}
sax.openArticleDialog = function (title)
am.openArticleDialog = function (title)
{
sax.clearControlErrors();
sax.switchArticleHeader();
sax.$dlg.article.dialog('option', 'title', title);
sax.openDialog(sax.$dlg.article, 600, 800);
am.switchArticleHeader();
$dlg.article.dialog('option', 'title', title);
sax.openDialog($dlg.article, 600, 800);
$('.ArticleHeadline.sax-input', $frm.article).trigger("input");
$('.ArticleSummary.sax-textarea', $frm.article).trigger("input");
}
//--------------------------------------------------------------
sax.updateItem = function (item)
am.updateItem = function (item, $item)
{
am.clearItem();
am.data.item = item; am.data.$item = $item;
$('.ArticleId', $frm.articleId).val(item.id);
sax.ajax.updateItem = sax.ajax.updateItem || { url: sax.url.base + 'Article/Ajax/GetItem', formId: 'frmArticleId', callbackFn: sax.onUpdateItem };
sax.ajax.updateItem = sax.ajax.updateItem || { url: sax.url.base + 'Article/Ajax/GetItem', formId: 'frmArticleId', callbackFn: am.onUpdateItem };
sax.doAjaxRequest(sax.ajax.updateItem, 50);
}
sax.onUpdateItem = function (response)
am.onUpdateItem = function (response)
{
//sax.debug('onUpdateItem', response);
sax.clearItem();
if (!response.success) return;
am.clearItem();
let $frmA = $frm.article;
let item = response.article;
$('#ifArticleId', $frmA).val(item.id);
@@ -197,48 +198,48 @@
$('div.ArticlePublish', $frmA).toggle(!item.published || item.publishedInFuture);
$('div.ArticlePublished', $frmA).toggle(!!item.published && !item.publishedInFuture);
$('#cbArticleStatusCode', $frmA).val(item.statusCode);
sax.populateArticleContent(item.content);
sax.openArticleDialog(sax.dlg.title.updateArticle);
am.populateArticleContent(item.content);
am.openArticleDialog(sax.dlg.title.updateArticle);
}
//--------------------------------------------------------------
sax.switchArticleHeader = function ()
am.switchArticleHeader = function ()
{
$('.sax-article').removeClass('ArticleContent').addClass('ArticleHeader');
}
sax.switchArticleContent = function ()
am.switchArticleContent = function ()
{
$('.sax-article').removeClass('ArticleHeader').addClass('ArticleContent');
}
//--------------------------------------------------------------
sax.selectSport = function ()
am.selectArticleSport = function ()
{
sax.mdl.selectSport.fn.selectSport({ caption: sax.dlg.title.selectSport, sportId: $('#ifArticleSportId').val(), fnCallback: sax.onSelectSport })
sax.mdl.selectSport.fn.selectSport({ caption: sax.dlg.title.selectSport, sportId: $('#ifArticleSportId').val(), fnCallback: am.onSelectArticleSport })
}
sax.onSelectSport = function (sport)
am.onSelectArticleSport = function (sport)
{
sax.clearControlError($('#ifArticleSportId').val(sport.id));
$('#ifArticleSportCaption').val(sport ? sport.name : '');
}
//--------------------------------------------------------------
sax.selectRegion = function ()
am.selectArticleRegion = function ()
{
sax.mdl.selectRegion.fn.selectRegion({ caption: sax.dlg.title.selectRegion, regionId: $('#ifArticleRegionId').val(), fnCallback: sax.onSelectRegion })
sax.mdl.selectRegion.fn.selectRegion({ caption: sax.dlg.title.selectRegion, regionId: $('#ifArticleRegionId').val(), fnCallback: am.onSelectArticleRegion })
}
sax.onSelectRegion = function (region)
am.onSelectArticleRegion = function (region)
{
sax.clearControlError($('#ifArticleRegionId').val(region.id));
$('#ifArticleRegionCaption').val(region ? region.name : '');
}
//--------------------------------------------------------------
sax.segmentId = function (idx)
am.segmentId = function (idx)
{
return sax.segIdPrefix + idx;
}
sax.populateArticleContent = function (content)
am.populateArticleContent = function (content)
{
//sax.debug('populateArticleContent', content);
ac.$segList.empty();
@@ -247,17 +248,17 @@
let segments = content.segments || [];
if (!segments.length) segments.push({ body: {} });
for (let segIdx = 0; segIdx < segments.length; segIdx++)
sax.addContentSegment(segments[segIdx]);
am.addContentSegment(segments[segIdx]);
}
sax.addContentSegment = function (seg, idxAfter, idxBefore)
am.addContentSegment = function (seg, idxAfter, idxBefore)
{
let idx = ++ac.segIdx;
let segId = sax.segmentId(idx);
let segId = am.segmentId(idx);
if ($('.sax-panel-item.ArticleSegment', ac.$segList).length >= 6)
{
return;
}
let $seg = sax.getSegmentTemplate().prop('id', segId)
let $seg = am.getSegmentTemplate().prop('id', segId)
if (seg.body)
{
$('.sax-article-segment-body', $seg).html(seg.body.html);
@@ -271,14 +272,14 @@
$('.sax-article-segment-image', $seg).show().find('img').prop('src', seg.image.imageLink);
$('.sax-action.sax-add-image', $seg).hide();
}
$('.sax-action.sax-add', $seg).on('click', function () { sax.addContentSegment({ body: {} }, idx); });
$('.sax-action.sax-add-image', $seg).on('click', function () { sax.selectArticleImage(idx); });
$('.sax-action.sax-up', $seg).on('click', function () { sax.moveUpContentSegment(idx); });
$('.sax-action.sax-down', $seg).on('click', function () { sax.moveDownContentSegment(idx); });
$('.sax-action.sax-delete', $seg).on('click', function () { sax.deleteContentSegment(idx); });
$('.sax-action.sax-add', $seg).on('click', function () { am.addContentSegment({ body: {} }, idx); });
$('.sax-action.sax-add-image', $seg).on('click', function () { am.selectArticleImage(idx); });
$('.sax-action.sax-up', $seg).on('click', function () { am.moveUpContentSegment(idx); });
$('.sax-action.sax-down', $seg).on('click', function () { am.moveDownContentSegment(idx); });
$('.sax-action.sax-delete', $seg).on('click', function () { am.deleteContentSegment(idx); });
let $segAfter = $('#' + sax.segmentId(idxAfter));
let $segBefore = $('#' + sax.segmentId(idxBefore));
let $segAfter = $('#' + am.segmentId(idxAfter));
let $segBefore = $('#' + am.segmentId(idxBefore));
if ($segAfter.length) $seg.insertAfter($segAfter);
else if ($segBefore.length) $seg.insertBefore($segBefore);
else ac.$segList.append($seg);
@@ -336,13 +337,13 @@
.on("dragenter", function (evt) { $seg.dragCount++; sax.haltEvent(evt); })
.on("dragover", function (evt) { sax.haltEvent(evt); if (!$seg.hasClass(sax.classFileDrag)) $seg.addClass(sax.classFileDrag); })
.on("dragleave", function (evt) { $seg.dragCount--; sax.haltEvent(evt); if (!$seg.dragCount) $seg.removeClass(sax.classFileDrag); })
.on("drop", function (evt) { sax.haltEvent(evt); $seg.removeClass(sax.classFileDrag); sax.onDropArticleImage(evt, idx, $seg); });
.on("drop", function (evt) { sax.haltEvent(evt); $seg.removeClass(sax.classFileDrag); am.onDropArticleImage(evt, idx, $seg); });
}
}
sax.moveUpContentSegment = function (idx)
am.moveUpContentSegment = function (idx)
{
//sax.debug('moveUpContentSegment(' + idx + ')');
let segId = sax.segmentId(idx);
let segId = am.segmentId(idx);
let $segPrev;
$('.sax-panel-item.ArticleSegment', ac.$segList).detach().each(
function (i, el)
@@ -357,10 +358,10 @@
$segPrev = $seg;
});
}
sax.moveDownContentSegment = function (idx)
am.moveDownContentSegment = function (idx)
{
//sax.debug('moveDownContentSegment(' + idx + ')');
let segId = sax.segmentId(idx);
let segId = am.segmentId(idx);
let $segMove;
let $segs = $('.sax-panel-item.ArticleSegment', ac.$segList).detach();
$segs.each(
@@ -377,37 +378,37 @@
$segMove = null;
});
}
sax.deleteContentSegment = function (idx)
am.deleteContentSegment = function (idx)
{
//sax.debug('deleteContentSegment(' + idx + ')');
if ($('.sax-panel-item.ArticleSegment', ac.$segList).length < 2) return;
sax.confirmItemRemove(function () { $('#' + sax.segmentId(idx)).remove(); });
sax.confirmItemRemove(function () { $('#' + am.segmentId(idx)).remove(); });
}
sax.selectArticleImage = function (idx)
am.selectArticleImage = function (idx)
{
let $dlg = sax.$dlg.selectArticleImage.dialog('option', { title: sax.dlg.title.imageUpload });
$('input.SegmentIdx', $dlg).val(idx);
$('#ifArticleImage', $dlg).val('');
sax.openDialog($dlg, 560, 240);
let $dlgAI = $dlg.selectArticleImage.dialog('option', { title: sax.dlg.title.imageUpload });
$('input.SegmentIdx', $dlgAI).val(idx);
$('#ifArticleImage', $dlgAI).val('');
sax.openDialog($dlgAI, 560, 240);
}
sax.uploadArticleImage = function ()
am.uploadArticleImage = function ()
{
let $dlg = sax.$dlg.selectArticleImage;
let $fileCtrl = $('#ifArticleImage', $dlg);
let $dlgAI = $dlg.selectArticleImage;
let $fileCtrl = $('#ifArticleImage', $dlgAI);
if (!$fileCtrl.length || !$fileCtrl[0].files.length)
return sax.doAlert(sax.dlg.title.imageUpload, sax.msg.uploadFileSelect);
let file = $fileCtrl[0].files[0];
sax.onDropArticleImageFile(file, $('input.SegmentIdx', $dlg).val(), $dlg);
am.onDropArticleImageFile(file, $('input.SegmentIdx', $dlgAI).val(), $dlgAI);
}
sax.onDropArticleImage = function (evt, idx, $seg)
am.onDropArticleImage = function (evt, idx, $seg)
{
//sax.debug('onDropArticleImage');
let files = evt.originalEvent.dataTransfer.files;
if (files.length < 1) return;
if (files.length > 1) return sax.doAlert(sax.dlg.title.imageUpload, sax.msg.uploadImageSingle);
sax.onDropArticleImageFile(files[0], idx, $('#frmArticle'));
am.onDropArticleImageFile(files[0], idx, $('#frmArticle'));
}
sax.onDropArticleImageFile = function (file, idx, context)
am.onDropArticleImageFile = function (file, idx, context)
{
//sax.debug('onDropArticleImageFile', file, context);
ac.segIdxAddImage = idx;
@@ -418,14 +419,14 @@
sax.clearControlError();
sax.data.contactImageUploadContext = context;
sax.ajax.uploadArticleImage = sax.ajax.uploadArticleImage || { url: sax.url.base + 'Article/Ajax/UploadImage', callbackFn: sax.handleArticleImageUploadResponse, noWaitIcon: true };
sax.ajax.uploadArticleImage = sax.ajax.uploadArticleImage || { url: sax.url.base + 'Article/Ajax/UploadImage', callbackFn: am.handleArticleImageUploadResponse, noWaitIcon: true };
sax.ajax.uploadArticleImage.formData = new FormData();
sax.ajax.uploadArticleImage.formData.append("__RequestVerificationToken", $('#frmNavigate input[name="__RequestVerificationToken"]').val());
sax.ajax.uploadArticleImage.formData.append("ArticleId", $('#ifArticleId', $frm.article).val());
sax.ajax.uploadArticleImage.formData.append("ArticleImage", file);
sax.doAjaxRequest(sax.ajax.uploadArticleImage, 50);
}
sax.handleArticleImageUploadResponse = function (response)
am.handleArticleImageUploadResponse = function (response)
{
let context = sax.data.contactImageUploadContext;
//sax.debug('handleArticleImageUploadResponse', response, context);
@@ -435,33 +436,44 @@
$('img.ArticleImageUploadProgress', context).hide();
if (response.success && response.segment)
{
sax.addContentSegment(response.segment, 0, ac.segIdxAddImage);
am.addContentSegment(response.segment, 0, ac.segIdxAddImage);
delete ac.segIdxAddImage;
sax.$dlg.selectArticleImage.dialog('close');
$dlg.selectArticleImage.dialog('close');
}
}
//--------------------------------------------------------------
sax.storeItem = function ()
am.storeItem = function ()
{
sax.ajax.storeItem = sax.ajax.storeItem || { url: sax.url.base + 'Article/Ajax/StoreItem', formId: 'frmArticle', callbackFn: sax.onStoreItem };
sax.ajax.storeItem = sax.ajax.storeItem || { url: sax.url.base + 'Article/Ajax/StoreItem', formId: 'frmArticle', callbackFn: am.onStoreItem };
sax.doAjaxRequest(sax.ajax.storeItem, 50);
}
sax.onStoreItem = function (response)
am.onStoreItem = function (response)
{
//sax.debug('onStoreItem', response);
sax.refreshControlValues(response.controlValues);
if (!response.success) return;
sax.$dlg.article.dialog('close');
if (!response.success)
{
if ($('.sax-article .sax-article-header .sax-form-control.sax-error').length) am.switchArticleHeader();
return;
}
$dlg.article.dialog('close');
var item = response.article;
var $item = $('#' + sax.getItemId(item.id));
if (!$item.length)
var $item = am.data.$item;
if (!$item)
{
$item = sax.getItemTemplate();
$item = am.getItemTemplate();
$('.sax-panel-item-list', $pnl.results).prepend($item).show();
}
sax.populateItem($item, item)
am.populateItem($item, item)
}
//--------------------------------------------------------------
am.refreshControlInfo = function (ctrl)
{
let $ctrl = $(ctrl);
sax.setAvailableCharsInfo($ctrl, $ctrl.prop('maxlength'));
}
//--------------------------------------------------------------
@@ -471,33 +483,35 @@
$pnl.results = $('.sax-panel-results');
$frm.filter = $('#frmArticleFilter');
$('.sax-action.sax-item-create', $pnl.filter).on('click', function () { sax.createItem(); });
$('.sax-action.sax-results-refresh', $pnl.filter).on('click', function () { sax.refreshResults(); });
$('.ArticleFilter', $frm.filter).on('input', function () { sax.refreshResults(250); }).on('keypress', function (event)
$frm.filter.on('click', '.OrganisationFilter .sax-button', am.selectFilterOrganisation);
$('.ArticleFilter', $frm.filter).on('input', function () { am.refreshResults(250); }).on('keypress', function (event)
{
if (event.keyCode == 13) setTimeout(sax.refreshResults, 50);
if (event.keyCode == 13) setTimeout(am.refreshResults, 50);
});
$frm.articleId = $('#frmArticleId');
$frm.article = $('#frmArticle');
$('.sax-input,.sax-textarea', $frm.article).on('input', function () { sax.clearControlError(this); });
var opt = sax.dlgOpts();
opt.buttons[sax.dlg.btn.cancel] = { text: sax.dlg.btn.cancel, class: "floatr", click: function () { $(this).dialog('close'); } };
opt.buttons[sax.dlg.btn.ok] = { text: sax.dlg.btn.ok, class: "floatr", click: function () { sax.storeItem(); } };
opt.buttons['Header'] = { text: 'Header', class: "floatl", click: function () { sax.switchArticleHeader(); } };
opt.buttons['Content'] = { text: 'Content', class: "floatl", click: function () { sax.switchArticleContent(); } };
sax.$dlg.article = $('#dlgArticle').dialog(opt);
opt.buttons[sax.dlg.btn.ok] = { text: sax.dlg.btn.ok, class: "floatr", click: function () { am.storeItem(); } };
opt.buttons['Header'] = { text: 'Header', class: "floatl", click: function () { am.switchArticleHeader(); } };
opt.buttons['Content'] = { text: 'Content', class: "floatl", click: function () { am.switchArticleContent(); } };
$dlg.article = $('#dlgArticle').dialog(opt);
ac.$content = $('.sax-article-panel.sax-article-content');
ac.$segList = $('.sax-article-segment-list', ac.$content);
$frm.article = $('#frmArticle', $dlg.article);
$frm.article.on('input', '.ArticleHeadline.sax-input,.ArticleSummary.sax-textarea', function () { am.refreshControlInfo(this); });
$frm.article.on('click', '.sax-button.SelectSport', am.selectArticleSport).on('click', '.sax-button.SelectRegion', am.selectArticleRegion);
$('.sax-input,.sax-textarea', $frm.article).on('input', function () { sax.clearControlError(this); });
sax.initCalendars('.sax-input.sax-calendar', { minDate: '-' + (sax.articlePublish.maxDaysBefore || '7'), maxDate: '+' + (sax.articlePublish.maxDaysAhead || '7') });
$('#ifArticlePublishOn').datepicker('option', 'onSelect', function (d, i) { if (d !== i.lastVal) { $('#chkArticlePublish').prop("checked", true); } });
ac.$content = $('.sax-article-panel.sax-article-content', $dlg.article);
ac.$segList = $('.sax-article-segment-list', ac.$content);
var opt = sax.dlgOpts();
opt.buttons[sax.dlg.btn.ok] = function () { sax.uploadArticleImage(); };
opt.buttons[sax.dlg.btn.ok] = function () { am.uploadArticleImage(); };
opt.buttons[sax.dlg.btn.cancel] = function () { $(this).dialog('close'); };
sax.$dlg.selectArticleImage = $('#dlgSelectArticleImage').dialog(opt);
$dlg.selectArticleImage = $('#dlgSelectArticleImage').dialog(opt);
setTimeout(sax.refreshResults, 250);
setTimeout(am.refreshResults, 250);
});
}(window, window.document));
+10 -10
View File
@@ -108,20 +108,20 @@
if (ctrl == null || ctrl.value == null) return;
if (ctrl.value.length > len) ctrl.value = ctrl.value.substring(0, len);
}
sax.setAvailableCharsLabel = function ($if, max, $lbl)
sax.setAvailableCharsInfo = function ($if, max, $info)
{
var avail = Math.max(0, max - $if.val().length);
$lbl.text(avail == 1 ? sax.lbl.availableCharacter : sax.lbl.availableCharacters.replace(/\{0\}/g, avail));
let info = '';
if (max > 0)
{
let avail = Math.max(0, max - $if.val().length);
info = (avail == 1 ? sax.lbl.charAvailable : sax.lbl.charsAvailable.replace(/\{0\}/g, avail));
}
($info || $('.sax-info', $if.closest('.sax-form-control'))).text(info);
}
sax.setCharsAvailableLabel = function ($if, max)
{
var avail = Math.max(0, max - $if.val().length);
$('.sax-select-chars-available', $if.closest('.sax-form-control')).text(avail == 1 ? sax.lbl.availableCharacter : sax.lbl.availableCharacters.replace(/\{0\}/g, avail));
}
sax.setItemsSelectedLabel = function ($sel)
sax.setItemsSelectedInfo = function ($sel, $info)
{
var sel = $(':selected', $sel).length;
$('.sax-select-items-selected', $sel.closest('.sax-form-control')).text(sel == 0 ? sax.lbl.noneSelected : sax.lbl.numberSelected.replace(/\{0\}/g, sel));
($info || $('.sax-info', $sel.closest('.sax-form-control'))).text(sel == 0 ? sax.lbl.noneSelected : sax.lbl.numberSelected.replace(/\{0\}/g, sel));
}
sax.initCalendars = function (sel, opt)
{
@@ -182,6 +182,7 @@
delete oe.$item;
$('#ifEventId,#ifEventExists,#ifEventSportIdPrimary,#ifEventRegionIdCountry,input[type="text"],textarea,select', $frm.evt).val('');
$('#cbEventType', $frm.evt).find('option[value=""]').remove();
$('.EventDate', $frm.evt).datepicker('setDate', 'today');
sax.clearControlErrors();
}
+4 -1
View File
@@ -18,7 +18,7 @@ namespace Saxonite.Net.Standard.Base.App
//-------------------------------------------------------------------
public static class Version
{
private static String version { get; } = "1.2.3.2";
private static String version { get; } = "1.2.4";
// Retrieve version.
public static String GetFullVersion () { return version; }
public static String GetAppVersion ()
@@ -40,6 +40,9 @@ namespace Saxonite.Net.Standard.Base.App
//-------------------------------------------------------------------
// Version history.
//-------------------------------------------------------------------
// 1.2.4 3-Mar-2022 View own articles.
// - Online Home page lists own articlesregardless of sport/region.
// - Admin System Database Table info.
// 1.2.3 16-Feb-2022 User online activity.
// - Record user last online.
// - Online Organisation category select - remove Partner/Other.
+10 -2
View File
@@ -6,7 +6,7 @@ using System.Collections.Generic;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:00
//---------------------------------------------------------------------------
namespace Saxonite.Base.App
{
@@ -47,6 +47,9 @@ namespace Saxonite.Base.App
ActivityIndex_SportId,
ActivityIndex_RegionId,
ActivityIndex_EffectiveOn,
ActivityIndex_UserAccountIdOwner,
ActivityIndex_OrganisationIdOwner,
ActivityIndex_ExpiresOn,
ActivityIndex_Notes,
ActivityIndex_Flags,
ActivityIndex_Status,
@@ -216,6 +219,7 @@ namespace Saxonite.Base.App
Region_UpdateBy,
Region_UpdateHost,
Sport_Id,
Sport_SportIdParent,
Sport_Name,
Sport_SpecialityLabel,
Sport_Notes,
@@ -360,7 +364,7 @@ namespace Saxonite.Base.App
//-------------------------------------------------------------------
// Data members.
private static readonly int tableCount = 18;
private static readonly int columnCount = 313;
private static readonly int columnCount = 317;
private static ulong maxTextLen = 0;
//-------------------------------------------------------------------
@@ -555,6 +559,9 @@ namespace Saxonite.Base.App
new ColumnDfn(1,"SportId",4,4,false,10),
new ColumnDfn(1,"RegionId",4,4,false,10),
new ColumnDfn(1,"EffectiveOn",9,93,false,16),
new ColumnDfn(1,"UserAccountIdOwner",4,4,false,10),
new ColumnDfn(1,"OrganisationIdOwner",4,4,false,10),
new ColumnDfn(1,"ExpiresOn",9,93,false,16),
new ColumnDfn(1,"Notes",0,-9,false,2000),
new ColumnDfn(1,"Flags",3,5,false,5),
new ColumnDfn(1,"Status",0,12,false,3),
@@ -724,6 +731,7 @@ namespace Saxonite.Base.App
new ColumnDfn(9,"UpdateBy",4,4,false,10),
new ColumnDfn(9,"UpdateHost",0,12,false,100),
new ColumnDfn(10,"Id",4,4,true,10),
new ColumnDfn(10,"SportIdParent",4,4,false,10),
new ColumnDfn(10,"Name",0,-9,false,100),
new ColumnDfn(10,"SpecialityLabel",3,5,false,5),
new ColumnDfn(10,"Notes",0,-9,false,2000),
@@ -43,6 +43,7 @@ namespace Saxonite.Net.Standard.Base.Bus
Region_Name,
// Properties.
EffectiveOn,
ExpiresOn,
// Associated data.
// Common.
Notes,
@@ -59,9 +60,12 @@ namespace Saxonite.Net.Standard.Base.Bus
public class DataProperties
{
public ItemId ItemId { get; set; }
public SysId UserAccountIdOwner { get; set; }
public SysId OrganisationIdOwner { get; set; }
public SysId SportId { get; set; }
public SysId RegionId { get; set; }
public DateTime EffectiveOn { get; set; }
public DateTime ExpiresOn { get; set; }
}
//-------------------------------------------------------------------
@@ -81,6 +85,16 @@ namespace Saxonite.Net.Standard.Base.Bus
get { return data.ItemId; }
set { CheckChanged(data.ItemId, value); data.ItemId = value; }
}
public SysId UserAccountIdOwner
{
get { return data.UserAccountIdOwner; }
set { CheckChanged(data.UserAccountIdOwner, value); data.UserAccountIdOwner = value; }
}
public SysId OrganisationIdOwner
{
get { return data.OrganisationIdOwner; }
set { CheckChanged(data.OrganisationIdOwner, value); data.OrganisationIdOwner = value; }
}
public SysId SportId
{
get { return data.SportId; }
@@ -101,13 +115,26 @@ namespace Saxonite.Net.Standard.Base.Bus
data.EffectiveOn = value.Date;
}
}
public DateTime ExpiresOn
{
get { return data.ExpiresOn; }
set
{
// Values are restricted to whole date, ie. no time.
CheckChanged(data.ExpiresOn, value.Date);
data.ExpiresOn = value.Date;
}
}
// Population.
internal void PopulateFrom(Data data)
{
ItemId = data.ItemId;
UserAccountIdOwner = data.UserAccountIdOwner;
OrganisationIdOwner = data.OrganisationIdOwner;
SportId = data.SportId;
RegionId = data.RegionId;
EffectiveOn = data.EffectiveOn;
ExpiresOn = data.ExpiresOn;
base.PopulateFrom(data);
}
public Data Clone()
@@ -124,9 +151,12 @@ namespace Saxonite.Net.Standard.Base.Bus
{
// Identifies the field that has invalid data.
public ValidValue ItemId { get; set; } = ValidValue.Valid;
public ValidValue UserAccountIdOwner { get; set; } = ValidValue.Valid;
public ValidValue OrganisationIdOwner { get; set; } = ValidValue.Valid;
public ValidValue SportId { get; set; } = ValidValue.Valid;
public ValidValue RegionId { get; set; } = ValidValue.Valid;
public ValidValue EffectiveOn { get; set; } = ValidValue.Valid;
public ValidValue ExpiresOn { get; set; } = ValidValue.Valid;
}
//-------------------------------------------------------------------
@@ -135,13 +165,12 @@ namespace Saxonite.Net.Standard.Base.Bus
//-------------------------------------------------------------------
// Construction.
protected SaxActivityIndex(ItemId itemId, SysId sportId, SysId regionId, DateTime effectiveOn) : base()
protected SaxActivityIndex(ItemId itemId, SysId sportId, SysId regionId) : base()
{
base.SetData(data);
ItemId = itemId;
SportId = sportId;
RegionId = regionId;
EffectiveOn = effectiveOn;
Status = DefaultStatus;
}
@@ -164,13 +193,12 @@ namespace Saxonite.Net.Standard.Base.Bus
//-------------------------------------------------------------------
// Utilities.
/// <summary>
/// Match the item to the sport, region and effective date.
/// Match the item to the sport and region.
/// </summary>
public bool MatchesSportRegionEffective(SysId sportId, SysId regionId, DateTime effectiveOn)
public bool MatchesSportRegion(SysId sportId, SysId regionId)
{
if (!SportId.Equals(sportId)) return false;
if (!RegionId.Equals(regionId)) return false;
if (!EffectiveOn.Equals(effectiveOn.Date)) return false;
return true;
}
@@ -197,6 +225,16 @@ namespace Saxonite.Net.Standard.Base.Bus
get { return data.ItemId; }
protected set { data.ItemId = value; }
}
public SysId UserAccountIdOwner
{
get { return data.UserAccountIdOwner; }
set { data.UserAccountIdOwner = value; }
}
public SysId OrganisationIdOwner
{
get { return data.OrganisationIdOwner; }
set { data.OrganisationIdOwner = value; }
}
public SysId SportId
{
get { return data.SportId; }
@@ -212,6 +250,11 @@ namespace Saxonite.Net.Standard.Base.Bus
get { return data.EffectiveOn; }
set { data.EffectiveOn = value; }
}
public DateTime ExpiresOn
{
get { return data.ExpiresOn; }
set { data.ExpiresOn = value; }
}
//-------------------------------------------------------------------
// Flags - positions 1-16 available.
@@ -224,6 +267,19 @@ namespace Saxonite.Net.Standard.Base.Bus
// P a r a m s
//-------------------------------------------------------------------
/// <summary>
/// Combination Sport and Region Ids to index activities.
/// </summary>
public class SportRegionIds
{
public SportRegionIds(SysId sportId, SysId regionId)
{
SportId = sportId;
RegionId = regionId;
}
public SysId SportId { get; }
public SysId RegionId { get; }
}
/// <summary>
/// Item list parameters.
/// </summary>
public new class Params : SacsHierarchyItem.Params
@@ -232,12 +288,18 @@ namespace Saxonite.Net.Standard.Base.Bus
public List<SysId> IdsIncluded { get; } = new List<SysId>();
public List<SysId> IdsExcluded { get; } = new List<SysId>();
public List<ItemId> ItemIdsIncluded { get; } = new List<ItemId>();
public List<SysId> SportIdsIncluded { get; } = new List<SysId>();
public List<SysId> RegionIdsIncluded { get; } = new List<SysId>();
public DateTime EffectiveFrom { get; set; }
public DateTime EffectiveTo { get; set; }
/// <summary>Activities must match one of the sport/region combinations specified.</summary>
public List<SportRegionIds> SportRegionIdsIncluded { get; } = new List<SportRegionIds>();
/// <summary>Owner User Accounts - to include activities in result for users regardless of sports/regions.</summary>
public List<SysId> UserAccountIdsOwnerIncluded { get; } = new List<SysId>();
/// <summary>Owner Organisations - to include activities in result for organisations regardless of sport/region combinations.</summary>
public List<SysId> OrganisationIdsOwnerIncluded { get; } = new List<SysId>();
/// <summary>User Account - to include User Activity data in result.</summary>
public SysId UserAccountId { get; set; }
public DateTime EffectiveFrom { get; set; }
public DateTime EffectiveTo { get; set; }
/// <summary>Not Expired - either Expiry date not set or is after specified date.</summary>
public DateTime NotExpiredOn { get; set; }
// Table aliases - blank if not linked.
public String Alias_ActivityIndex { get; set; }
}
@@ -249,11 +311,11 @@ namespace Saxonite.Net.Standard.Base.Bus
public static class SaxActivityIndexList
{
/// <summary>
/// Get first entry that matcehs the sport, region and effective date.
/// Get first entry that matches the sport and region.
/// </summary>
public static SaxActivityIndex GetActivityIndexBySportRegionEffective(this List<SaxActivityIndex> values, SysId sportId, SysId regionId, DateTime effectiveOn)
public static SaxActivityIndex GetActivityIndexBySportRegion(this List<SaxActivityIndex> values, SysId sportId, SysId regionId)
{
return values.Find(item => item.MatchesSportRegionEffective(sportId, regionId, effectiveOn));
return values.Find(item => item.MatchesSportRegion(sportId, regionId));
}
}
+16
View File
@@ -18,6 +18,8 @@ namespace Saxonite.Net.Standard.Base.Bus
{
Pos,
Id,
SportIdParent,
ParentSport_Name,
Name,
SpecialityLabel,
SpecialityLabel_Desc,
@@ -36,6 +38,7 @@ namespace Saxonite.Net.Standard.Base.Bus
/// <summary>Properties other than common.</summary>
public class DataProperties
{
public SysId SportIdParent { get; set; }
public String Name { get; set; } = String.Empty;
public Sax.SportSpecialityLabel SpecialityLabel { get; set; }
}
@@ -52,6 +55,11 @@ namespace Saxonite.Net.Standard.Base.Bus
Status = DefaultStatus;
}
// Properties.
public SysId SportIdParent
{
get { return data.SportIdParent; }
set { CheckChanged(data.SportIdParent, value); data.SportIdParent = value; }
}
public String Name
{
get { return data.Name; }
@@ -65,6 +73,7 @@ namespace Saxonite.Net.Standard.Base.Bus
// Population.
internal void PopulateFrom (Data data)
{
SportIdParent = data.SportIdParent;
Name = data.Name;
SpecialityLabel = data.SpecialityLabel;
base.PopulateFrom(data);
@@ -82,6 +91,7 @@ namespace Saxonite.Net.Standard.Base.Bus
public new class ErrField : SacsHierarchyItem.ErrField
{
// Identifies the field that has invalid data.
public ValidValue SportIdParent { get; set; } = ValidValue.Valid;
public ValidValue Name { get; set; } = ValidValue.Valid;
public ValidValue SpecialityLabel { get; set; } = ValidValue.Valid;
}
@@ -134,6 +144,11 @@ namespace Saxonite.Net.Standard.Base.Bus
throw new NotSupportedException(fn + " Id cannot be changed");
this.data.PopulateFrom(data);
}
public SysId SportIdParent
{
get { return data.SportIdParent; }
set { data.SportIdParent = value; }
}
public String Name
{
get { return data.Name; }
@@ -172,6 +187,7 @@ namespace Saxonite.Net.Standard.Base.Bus
// List filtering.
public List<SysId> IdsIncluded { get; } = new List<SysId>();
public List<SysId> IdsExcluded { get; } = new List<SysId>();
public SysId SportIdParent {get; set; }
/// <summary>Generic filter - partial sport name, or other matching value (tbd).</summary>
public String SportFilter { get; set; }
public String NameFull { get; set; }
@@ -22,7 +22,8 @@ namespace Saxonite.Net.Standard.Base.Bus
OnlineAt,
// User properties.
EmailAddress,
Title, FirstName, LastName,
DisplayName, Title, FirstName, LastName,
LastLoginOn,
LastLoginAt,
}
@@ -25,21 +25,35 @@ namespace Saxonite.Net.Standard.Base.Consoles
public class IndexContext
{
// ToDo Include Localiser.
/// <summary>
/// Index Context - high level activity filter.
/// <para>User Account allows User specific information about the activities to be included.</para>
/// </summary>
public IndexContext(SysId userAccountId)
{
UserAccountId = userAccountId;
}
public SysId UserAccountId { get; }
public List<SysId> SportIds { get; } = new List<SysId>();
public List<SysId> RegionIds { get; } = new List<SysId>();
// Todo: Default period is ~12 months ago up to ~3 months in the future.
/// <summary>Activities must match one of the sport/region combinations specified.</summary>
public List<SaxActivityIndex.SportRegionIds> SportRegionIdsIncluded { get; } = new List<SaxActivityIndex.SportRegionIds>();
/// <summary>
/// Owner Users - eg. journalist for articles.
/// <para>Allows the users' activities to be queried without relying on matching sport/region combinations.</para>
/// </summary>
public List<SysId> UserAccountIdsOwner { get; } = new List<SysId>();
/// <summary>
/// Owner Organisations - for articles, events and opportunities.
/// <para>Allows the organisations' own activities to be queried without relying on matching sport/region combinations.</para>
/// </summary>
public List<SysId> OrganisationIdsOwner { get; } = new List<SysId>();
// Todo: Default effective period for Activities.
public DateTime EffectiveFrom { get; set; } = DateUtil.IncrementDate(DateTime.Today, -365);
public DateTime EffectiveTo { get; set; } = DateUtil.IncrementDate(DateTime.Today, 30);
public DateTime NotExpiredOn { get; set; } = DateTime.Today;
public bool IsValid()
{
// Context must contain at least a sport, a region and a valid effective period.
if (!SportIds.HasValidIds()) return false;
if (!RegionIds.HasValidIds()) return false;
if (!SportRegionIdsIncluded.Exists(item => SysId.IsValid(item.SportId) && SysId.IsValid(item.RegionId)) && !UserAccountIdsOwner.HasValidIds() && !OrganisationIdsOwner.HasValidIds()) return false;
if (!DateUtil.IsValid(EffectiveFrom) || EffectiveTo < EffectiveFrom) return false;
return true;
}
@@ -138,6 +152,8 @@ namespace Saxonite.Net.Standard.Base.Consoles
{
// Activity Index properties.
IndexData indexData = new IndexData(article.GetItemId());
indexData.UserAccountIdOwner = article.UserAccountIdAuthor;
indexData.OrganisationIdOwner = article.OrganisationId;
indexData.SportIds.Add(article.SportIdPrimary);
indexData.RegionIds.Add(article.RegionIdPrimary);
indexData.EffectiveOn = DateUtil.OnInvalid(article.PublishedAt.Date, article.CreateStamp.On.Date);
@@ -165,9 +181,11 @@ namespace Saxonite.Net.Standard.Base.Consoles
// Activity Index properties.
IndexData indexData = new IndexData(organisationEvent.GetItemId());
indexData.OrganisationIdOwner = organisationEvent.OrganisationId;
indexData.SportIds.Add(organisationEvent.SportIdPrimary);
indexData.RegionIds.Add(organisationEvent.RegionIdCountry);
indexData.EffectiveOn = DateUtil.OnInvalid(organisationEvent.PublishedAt.Date, organisationEvent.CreateStamp.On.Date);
indexData.ExpiresOn = DateUtil.OnInvalid(organisationEvent.ExpiresAt.Date, DateUtil.IncrementDate(indexData.EffectiveOn, 7));
return StoreActivityIndexData(indexData, dbUpdateInfo);
}
public bool ClearActivityIndex(SaxOrganisationEvent organisationEvent, DbUpdateInfo dbUpdateInfo)
@@ -190,9 +208,11 @@ namespace Saxonite.Net.Standard.Base.Consoles
// Activity Index properties.
IndexData indexData = new IndexData(opportunity.GetItemId());
indexData.OrganisationIdOwner = opportunity.OrganisationId;
indexData.SportIds.Add(opportunity.SportIdPrimary);
indexData.RegionIds.Add(opportunity.RegionIdPrimary);
indexData.EffectiveOn = DateUtil.OnInvalid(opportunity.PublishedAt.Date, opportunity.CreateStamp.On.Date);
indexData.ExpiresOn = DateUtil.OnInvalid(opportunity.ExpiresAt.Date, DateUtil.IncrementDate(indexData.EffectiveOn, 28));
return StoreActivityIndexData(indexData, dbUpdateInfo);
}
public bool ClearActivityIndex(SaxOrganisationOpportunity opportunity, DbUpdateInfo dbUpdateInfo)
@@ -211,9 +231,12 @@ namespace Saxonite.Net.Standard.Base.Consoles
ItemId = itemId;
}
public ItemId ItemId { get; }
public SysId UserAccountIdOwner { get; set; }
public SysId OrganisationIdOwner { get; set; }
public List<SysId> SportIds { get; } = new List<SysId>();
public List<SysId> RegionIds { get; } = new List<SysId>();
public DateTime EffectiveOn { get; set; }
public DateTime ExpiresOn { get; set; }
public bool IsValid()
{
if (!ItemId.IsValid(ItemId)) return false;
@@ -226,17 +249,23 @@ namespace Saxonite.Net.Standard.Base.Consoles
/// <summary>Single entry in the index for an activity.</summary>
protected class IndexEntryData
{
public IndexEntryData(ItemId itemId, SysId sportId, SysId regionId, DateTime effectiveOn)
public IndexEntryData(ItemId itemId, SysId userAccountIdOwner, SysId organisationIdOwner, SysId sportId, SysId regionId, DateTime effectiveOn, DateTime expiresOn)
{
ItemId = itemId;
UserAccountIdOwner = userAccountIdOwner;
OrganisationIdOwner = organisationIdOwner;
SportId = sportId;
RegionId = regionId;
EffectiveOn = effectiveOn;
ExpiresOn = expiresOn;
}
public ItemId ItemId { get; }
public SysId UserAccountIdOwner { get; }
public SysId OrganisationIdOwner { get; }
public SysId SportId { get; }
public SysId RegionId { get; }
public DateTime EffectiveOn { get; }
public DateTime ExpiresOn { get; }
public bool IsValid()
{
if (!ItemId.IsValid(ItemId)) return false;
@@ -279,7 +308,7 @@ namespace Saxonite.Net.Standard.Base.Consoles
{
foreach (SysId regionId in indexData.RegionIds.FindAll(item => SysId.IsValid(item)))
{
IndexEntryData indexEntry = new IndexEntryData(indexData.ItemId, sportId, regionId, indexData.EffectiveOn);
IndexEntryData indexEntry = new IndexEntryData(indexData.ItemId, indexData.UserAccountIdOwner, indexData.OrganisationIdOwner, sportId, regionId, indexData.EffectiveOn, indexData.ExpiresOn);
if (indexEntry.IsValid())
indexEntries.Add(indexEntry);
}
@@ -109,6 +109,13 @@ namespace Saxonite.Net.Standard.Base.Mgr
switch ((SaxUserOnline.Column)column.Id)
{
//-----------------------------------------------------------
case SaxUserOnline.Column.DisplayName:
String title = values.GetValue(GetUserOnlineColumnDfn(SaxUserOnline.Column.Title).DataName).ToString();
String firstName = values.GetValue(GetUserOnlineColumnDfn(SaxUserOnline.Column.FirstName).DataName).ToString();
String lastName = values.GetValue(GetUserOnlineColumnDfn(SaxUserOnline.Column.LastName).DataName).ToString();
value = new DataValue(SaxUserAccount.GetDisplayName(title, firstName, lastName));
break;
//-----------------------------------------------------------
}
return value;
@@ -30,7 +30,7 @@ namespace Saxonite.Net.Standard.Base.Mgr
//-------------------------------------------------------------------
// Create item.
public abstract SaxActivityIndex CreateActivityIndex(ItemId itemId, SysId sportId, SysId regionId, DateTime effectiveOn);
public abstract SaxActivityIndex CreateActivityIndex(ItemId itemId, SysId sportId, SysId regionId);
//-------------------------------------------------------------------
// Retrieve individual items.
@@ -95,7 +95,14 @@ namespace Saxonite.Net.Standard.Base.Mgr
}
}
// NB Associated data items aren't validated as these should be valid on the 'parent' object.
// NB Associated data items shouldn't need to be validated as these should be valid on the 'parent' object.
if (errField.OrganisationIdOwner != SacsHierarchyItem.ValidValue.Ignore && SysId.IsValid(data.OrganisationIdOwner))
{
}
if (errField.OrganisationIdOwner != SacsHierarchyItem.ValidValue.Ignore && SysId.IsValid(data.OrganisationIdOwner))
{
}
//---------------------------------------------------------------
return true;
@@ -78,29 +78,54 @@ namespace Saxonite.Net.Standard.Base.Mgr
{
ClearErrorState();
// Name.
if (errField.Name != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Name, "name", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.Sport_Name), true))
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<SacsHierarchyItem> disposableItems = new DisposableCollection<SacsHierarchyItem>())
{
errField.Name = SacsHierarchyItem.ValidValue.Invalid;
return false;
}
// Common properties.
if (errField.Notes != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Notes, "notes", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.Sport_Notes)))
{
errField.Notes = SacsHierarchyItem.ValidValue.Invalid;
return false;
}
if (errField.Status != SacsHierarchyItem.ValidValue.Ignore)
{
if (!IsValidValue(data.StatusCode, "status", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.Sport_Status), true, true))
// Name.
if (errField.Name != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Name, "name", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.Sport_Name), true))
{
errField.Status = SacsHierarchyItem.ValidValue.Invalid;
errField.Name = SacsHierarchyItem.ValidValue.Invalid;
return false;
}
if (!SaxSport.ValidStatuses.Contains(data.Status))
// Common properties.
if (errField.Notes != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Notes, "notes", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.Sport_Notes)))
{
errField.Status = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState(ErrorMessage.InvalidStatus);
errField.Notes = SacsHierarchyItem.ValidValue.Invalid;
return false;
}
if (errField.Status != SacsHierarchyItem.ValidValue.Ignore)
{
if (!IsValidValue(data.StatusCode, "status", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.Sport_Status), true, true))
{
errField.Status = SacsHierarchyItem.ValidValue.Invalid;
return false;
}
if (!SaxSport.ValidStatuses.Contains(data.Status))
{
errField.Status = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState(ErrorMessage.InvalidStatus);
}
}
// Associated data.
if (data.Status != SaStatus.Deleted)
{
if (errField.SportIdParent != SacsHierarchyItem.ValidValue.Ignore && SysId.IsValid(data.SportIdParent))
{
SaxSport sport = GetSportById(data.SportIdParent);
disposableItems.Add(sport);
if (sport == null)
{
errField.SportIdParent = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Invalid parent");
}
if (SysId.IsValid(sport.SportIdParent))
{
errField.SportIdParent = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("parent already has a parent.");
}
}
}
}
@@ -16,8 +16,8 @@ namespace Saxonite.Net.Standard.Dbas.Bus
//-------------------------------------------------------------------
// Construction.
public SaxActivityIndex_Dbas(ISacsDatabase database, ItemId itemId, SysId sportId, SysId regionId, DateTime effectiveOn, UInt16 flags) :
base(itemId, sportId, regionId, effectiveOn)
public SaxActivityIndex_Dbas(ISacsDatabase database, ItemId itemId, SysId sportId, SysId regionId, UInt16 flags) :
base(itemId, sportId, regionId)
{
this.database = database;
Flags = flags;
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:00
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -24,6 +24,9 @@ namespace Saxonite.Net.Standard.Dbas.Internal
public ColumnDataInt32 _SportId { get; } = new ColumnDataInt32("SportId");
public ColumnDataInt32 _RegionId { get; } = new ColumnDataInt32("RegionId");
public ColumnDataDateTime _EffectiveOn { get; } = new ColumnDataDateTime("EffectiveOn");
public ColumnDataInt32 _UserAccountIdOwner { get; } = new ColumnDataInt32("UserAccountIdOwner");
public ColumnDataInt32 _OrganisationIdOwner { get; } = new ColumnDataInt32("OrganisationIdOwner");
public ColumnDataDateTime _ExpiresOn { get; } = new ColumnDataDateTime("ExpiresOn");
public ColumnDataString _Notes { get; } = new ColumnDataString("Notes");
public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags");
public ColumnDataString _Status { get; } = new ColumnDataString("Status");
@@ -44,6 +47,9 @@ namespace Saxonite.Net.Standard.Dbas.Internal
"SportId",
"RegionId",
"EffectiveOn",
"UserAccountIdOwner",
"OrganisationIdOwner",
"ExpiresOn",
"Notes",
"Flags",
"Status",
@@ -63,7 +69,6 @@ namespace Saxonite.Net.Standard.Dbas.Internal
"ItemId",
"SportId",
"RegionId",
"EffectiveOn",
};
protected static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
@@ -93,6 +98,9 @@ namespace Saxonite.Net.Standard.Dbas.Internal
public Int32 _SportId { get { return Cols._SportId.Value; } set { Cols._SportId.Value = value; } }
public Int32 _RegionId { get { return Cols._RegionId.Value; } set { Cols._RegionId.Value = value; } }
public DateTime _EffectiveOn { get { return Cols._EffectiveOn.Value; } set { Cols._EffectiveOn.Value = value; } }
public Int32 _UserAccountIdOwner { get { return Cols._UserAccountIdOwner.Value; } set { Cols._UserAccountIdOwner.Value = value; } }
public Int32 _OrganisationIdOwner { get { return Cols._OrganisationIdOwner.Value; } set { Cols._OrganisationIdOwner.Value = value; } }
public DateTime _ExpiresOn { get { return Cols._ExpiresOn.Value; } set { Cols._ExpiresOn.Value = value; } }
public String _Notes { get { return Cols._Notes.Value; } set { Cols._Notes.Value = value; } }
public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } }
public String _Status { get { return Cols._Status.Value; } set { Cols._Status.Value = value; } }
@@ -128,6 +136,9 @@ namespace Saxonite.Net.Standard.Dbas.Internal
_SportId = GetFieldInt32(dbDataReader, "SportId", _SportId);
_RegionId = GetFieldInt32(dbDataReader, "RegionId", _RegionId);
_EffectiveOn = GetFieldDateTime(dbDataReader, "EffectiveOn", _EffectiveOn);
_UserAccountIdOwner = GetFieldInt32(dbDataReader, "UserAccountIdOwner", _UserAccountIdOwner);
_OrganisationIdOwner = GetFieldInt32(dbDataReader, "OrganisationIdOwner", _OrganisationIdOwner);
_ExpiresOn = GetFieldDateTime(dbDataReader, "ExpiresOn", _ExpiresOn);
_Notes = GetFieldString(dbDataReader, "Notes", _Notes);
_Flags = GetFieldInt16(dbDataReader, "Flags", _Flags);
_Status = GetFieldString(dbDataReader, "Status", _Status);
@@ -160,6 +171,9 @@ namespace Saxonite.Net.Standard.Dbas.Internal
if (columnNames.ContainsCI("SportId")) AddCommandParameter(dbCommand, "@SportId", _SportId);
if (columnNames.ContainsCI("RegionId")) AddCommandParameter(dbCommand, "@RegionId", _RegionId);
if (columnNames.ContainsCI("EffectiveOn")) AddCommandParameter(dbCommand, "@EffectiveOn", _EffectiveOn);
if (columnNames.ContainsCI("UserAccountIdOwner")) AddCommandParameter(dbCommand, "@UserAccountIdOwner", _UserAccountIdOwner);
if (columnNames.ContainsCI("OrganisationIdOwner")) AddCommandParameter(dbCommand, "@OrganisationIdOwner", _OrganisationIdOwner);
if (columnNames.ContainsCI("ExpiresOn")) AddCommandParameter(dbCommand, "@ExpiresOn", _ExpiresOn);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
@@ -190,17 +204,21 @@ namespace Saxonite.Net.Standard.Dbas.Internal
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE ItemType=@ItemType AND ItemId=@ItemId AND SportId=@SportId AND RegionId=@RegionId AND EffectiveOn=@EffectiveOn;";
query += "WHERE ItemType=@ItemType AND ItemId=@ItemId AND SportId=@SportId AND RegionId=@RegionId;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE ItemType=? AND ItemId=? AND SportId=? AND RegionId=? AND EffectiveOn=?;";
query += "WHERE ItemType=? AND ItemId=? AND SportId=? AND RegionId=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("EffectiveOn")) AddCommandParameter(dbCommand, "@EffectiveOn", _EffectiveOn);
if (columnNames.ContainsCI("UserAccountIdOwner")) AddCommandParameter(dbCommand, "@UserAccountIdOwner", _UserAccountIdOwner);
if (columnNames.ContainsCI("OrganisationIdOwner")) AddCommandParameter(dbCommand, "@OrganisationIdOwner", _OrganisationIdOwner);
if (columnNames.ContainsCI("ExpiresOn")) AddCommandParameter(dbCommand, "@ExpiresOn", _ExpiresOn);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags);
if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status);
@@ -211,7 +229,6 @@ namespace Saxonite.Net.Standard.Dbas.Internal
AddCommandParameter(dbCommand, "@ItemId", _ItemId);
AddCommandParameter(dbCommand, "@SportId", _SportId);
AddCommandParameter(dbCommand, "@RegionId", _RegionId);
AddCommandParameter(dbCommand, "@EffectiveOn", _EffectiveOn);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:00
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:00
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:00
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:00
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:00
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:00
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:00
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:00
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:00
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -20,6 +20,7 @@ namespace Saxonite.Net.Standard.Dbas.Internal
public class ColumnsData
{
public ColumnDataInt32 _Id { get; } = new ColumnDataInt32("Id", true);
public ColumnDataInt32 _SportIdParent { get; } = new ColumnDataInt32("SportIdParent");
public ColumnDataString _Name { get; } = new ColumnDataString("Name");
public ColumnDataInt16 _SpecialityLabel { get; } = new ColumnDataInt16("SpecialityLabel");
public ColumnDataString _Notes { get; } = new ColumnDataString("Notes");
@@ -38,6 +39,7 @@ namespace Saxonite.Net.Standard.Dbas.Internal
protected static List<String> fields { get; } = new List<String>()
{
"Id",
"SportIdParent",
"Name",
"SpecialityLabel",
"Notes",
@@ -82,6 +84,7 @@ namespace Saxonite.Net.Standard.Dbas.Internal
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
public Int32 _Id { get { return Cols._Id.Value; } set { Cols._Id.Value = value; } }
public Int32 _SportIdParent { get { return Cols._SportIdParent.Value; } set { Cols._SportIdParent.Value = value; } }
public String _Name { get { return Cols._Name.Value; } set { Cols._Name.Value = value; } }
public Int16 _SpecialityLabel { get { return Cols._SpecialityLabel.Value; } set { Cols._SpecialityLabel.Value = value; } }
public String _Notes { get { return Cols._Notes.Value; } set { Cols._Notes.Value = value; } }
@@ -115,6 +118,7 @@ namespace Saxonite.Net.Standard.Dbas.Internal
public override void PopulateFrom (DbDataReader dbDataReader)
{
_Id = GetFieldInt32(dbDataReader, "Id", _Id);
_SportIdParent = GetFieldInt32(dbDataReader, "SportIdParent", _SportIdParent);
_Name = GetFieldString(dbDataReader, "Name", _Name);
_SpecialityLabel = GetFieldInt16(dbDataReader, "SpecialityLabel", _SpecialityLabel);
_Notes = GetFieldString(dbDataReader, "Notes", _Notes);
@@ -147,6 +151,7 @@ namespace Saxonite.Net.Standard.Dbas.Internal
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("SportIdParent")) AddCommandParameter(dbCommand, "@SportIdParent", _SportIdParent);
if (columnNames.ContainsCI("Name")) AddCommandParameter(dbCommand, "@Name", _Name);
if (columnNames.ContainsCI("SpecialityLabel")) AddCommandParameter(dbCommand, "@SpecialityLabel", _SpecialityLabel);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
@@ -194,6 +199,7 @@ namespace Saxonite.Net.Standard.Dbas.Internal
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("SportIdParent")) AddCommandParameter(dbCommand, "@SportIdParent", _SportIdParent);
if (columnNames.ContainsCI("Name")) AddCommandParameter(dbCommand, "@Name", _Name);
if (columnNames.ContainsCI("SpecialityLabel")) AddCommandParameter(dbCommand, "@SpecialityLabel", _SpecialityLabel);
if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes);
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:00
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:01
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:01
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:01
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:01
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:01
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:01
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Sat 15-Jan-2022 16:34:34
// Code generated by Sarand Database Utilities Thu 3-Mar-2022 16:50:01
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -69,7 +69,7 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
}
catch (Exception exc)
{
SaLogger.Warn(fn + " ");
SaLogger.Warn(fn + " " + ExceptionUtil.GetLogMessage(exc, 0));
return false;
}
return true;
@@ -298,6 +298,10 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
SetUserOnlineColDfn(columnDfn, "Email", 160, SaxDbDfn_Core.ColumnIdx.UserAccount_EmailAddress, ColumnAlignment.Left, DataValue.DataType.String, aliasUserOnline_UserAccount, prefixUserOnline_UserAccount);
columnDfn.ReadOnly = true;
break;
case SaxUserOnline.Column.DisplayName:
SetUserOnlineColDfn(columnDfn, "User", 160, SaxDbDfn_Core.ColumnIdx.UserAccount_LastName, ColumnAlignment.Left, DataValue.DataType.String, aliasUserOnline_UserAccount, prefixUserOnline_UserAccount);
columnDfn.ReadOnly = true;
break;
case SaxUserOnline.Column.Title:
SetUserOnlineColDfn(columnDfn, "Title", 70, SaxDbDfn_Core.ColumnIdx.UserAccount_Title, ColumnAlignment.Left, DataValue.DataType.String, aliasUserOnline_UserAccount, prefixUserOnline_UserAccount);
columnDfn.ReadOnly = true;
@@ -310,6 +314,10 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
SetUserOnlineColDfn(columnDfn, "Last name", 120, SaxDbDfn_Core.ColumnIdx.UserAccount_LastName, ColumnAlignment.Left, DataValue.DataType.String, aliasUserOnline_UserAccount, prefixUserOnline_UserAccount);
columnDfn.ReadOnly = true;
break;
case SaxUserOnline.Column.LastLoginOn:
SetUserOnlineColDfn(columnDfn, "Last login on", 80, SaxDbDfn_Core.ColumnIdx.UserAccount_LastLoginAt, ColumnAlignment.Center, DataValue.DataType.Date, aliasUserOnline_UserAccount, prefixUserOnline_UserAccount);
columnDfn.ReadOnly = true;
break;
case SaxUserOnline.Column.LastLoginAt:
SetUserOnlineColDfn(columnDfn, "Last login", 100, SaxDbDfn_Core.ColumnIdx.UserAccount_LastLoginAt, ColumnAlignment.Center, DataValue.DataType.DateTime, aliasUserOnline_UserAccount, prefixUserOnline_UserAccount);
columnDfn.ReadOnly = true;
@@ -504,7 +512,7 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
//---------------------------------------------------------------------
// User Account.
bool hasUserAccountCols = columns.HasId(SaxUserOnline.Column.EmailAddress) || columns.HasId(SaxUserOnline.Column.Title) || columns.HasId(SaxUserOnline.Column.FirstName) || columns.HasId(SaxUserOnline.Column.LastName) || columns.HasId(SaxUserOnline.Column.LastLoginAt);
bool hasUserAccountCols = columns.HasId(SaxUserOnline.Column.EmailAddress) || columns.HasId(SaxUserOnline.Column.DisplayName) || columns.HasId(SaxUserOnline.Column.Title) || columns.HasId(SaxUserOnline.Column.FirstName) || columns.HasId(SaxUserOnline.Column.LastName) || columns.HasId(SaxUserOnline.Column.LastLoginOn) || columns.HasId(SaxUserOnline.Column.LastLoginAt);
if (hasUserAccountCols)
{
prm.Alias_UserAccount = aliasUserOnline_UserAccount;
@@ -514,13 +522,13 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
List<SaxDbDfn_Core.ColumnIdx> cols = new List<SaxDbDfn_Core.ColumnIdx>();
if (columns.HasId(SaxUserOnline.Column.EmailAddress))
cols.Add(SaxDbDfn_Core.ColumnIdx.UserAccount_EmailAddress);
if (columns.HasId(SaxUserOnline.Column.Title))
if (columns.HasId(SaxUserOnline.Column.DisplayName) || columns.HasId(SaxUserOnline.Column.Title))
cols.Add(SaxDbDfn_Core.ColumnIdx.UserAccount_Title);
if (columns.HasId(SaxUserOnline.Column.FirstName))
if (columns.HasId(SaxUserOnline.Column.DisplayName) || columns.HasId(SaxUserOnline.Column.FirstName))
cols.Add(SaxDbDfn_Core.ColumnIdx.UserAccount_FirstName);
if (columns.HasId(SaxUserOnline.Column.LastName))
if (columns.HasId(SaxUserOnline.Column.DisplayName) || columns.HasId(SaxUserOnline.Column.LastName))
cols.Add(SaxDbDfn_Core.ColumnIdx.UserAccount_LastName);
if (columns.HasId(SaxUserOnline.Column.LastLoginAt))
if (columns.HasId(SaxUserOnline.Column.LastLoginOn) || columns.HasId(SaxUserOnline.Column.LastLoginAt))
cols.Add(SaxDbDfn_Core.ColumnIdx.UserAccount_LastLoginAt);
if (cols.Count > 0)
{
@@ -37,16 +37,16 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
//-------------------------------------------------------------------
// Create item.
public override SaxActivityIndex CreateActivityIndex(ItemId itemId, SysId sportId, SysId regionId, DateTime effectiveOn)
public override SaxActivityIndex CreateActivityIndex(ItemId itemId, SysId sportId, SysId regionId)
{
ClearErrorState();
return new SaxActivityIndex_Dbas(CoreDatabase, itemId, sportId, regionId, effectiveOn, 0);
return new SaxActivityIndex_Dbas(CoreDatabase, itemId, sportId, regionId, 0);
}
private SaxActivityIndex_Dbas CreateActivityIndex(ActivityIndex_Db dbActivityIndex)
{
ClearErrorState();
ItemId itemId = new ItemId(dbActivityIndex._ItemType, new SysId(dbActivityIndex._ItemId));
SaxActivityIndex_Dbas activityIndex = new SaxActivityIndex_Dbas(CoreDatabase, itemId, new SysId(dbActivityIndex._SportId), new SysId(dbActivityIndex._RegionId), dbActivityIndex._EffectiveOn, (UInt16)dbActivityIndex._Flags);
SaxActivityIndex_Dbas activityIndex = new SaxActivityIndex_Dbas(CoreDatabase, itemId, new SysId(dbActivityIndex._SportId), new SysId(dbActivityIndex._RegionId), (UInt16)dbActivityIndex._Flags);
PopulateFrom(dbActivityIndex, activityIndex);
return activityIndex;
}
@@ -209,7 +209,10 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
dbActivityIndex._ItemId = SysId.ToInt(activityIndex.ItemId.Id);
dbActivityIndex._SportId = SysId.ToInt(activityIndex.SportId);
dbActivityIndex._RegionId = SysId.ToInt(activityIndex.RegionId);
dbActivityIndex._UserAccountIdOwner = SysId.ToInt(activityIndex.UserAccountIdOwner);
dbActivityIndex._OrganisationIdOwner = SysId.ToInt(activityIndex.OrganisationIdOwner);
dbActivityIndex._EffectiveOn = activityIndex.EffectiveOn;
dbActivityIndex._ExpiresOn = activityIndex.ExpiresOn;
dbActivityIndex._Notes = activityIndex.Notes;
dbActivityIndex._Status = SacsSystem.GetStatusCode(activityIndex.Status);
dbActivityIndex._Flags = (short)activityIndex.Flags;
@@ -228,7 +231,10 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
//activityIndex.ItemId = new ItemId(dbActivityIndex._ItemType, new SysId(dbActivityIndex._ItemId);
//activityIndex.SportId = new SysId(dbActivityIndex._SportId);
//activityIndex.RegionId = new SysId(dbActivityIndex._RegionId);
activityIndex.UserAccountIdOwner = new SysId(dbActivityIndex._UserAccountIdOwner);
activityIndex.OrganisationIdOwner = new SysId(dbActivityIndex._OrganisationIdOwner);
activityIndex.EffectiveOn = dbActivityIndex._EffectiveOn;
activityIndex.ExpiresOn = dbActivityIndex._ExpiresOn;
activityIndex.Notes = dbActivityIndex._Notes;
activityIndex.Status = SacsSystem.GetStatusForCode(dbActivityIndex._Status);
activityIndex.SetCreateStamp(dbActivityIndex._CreateOn, new SysId(dbActivityIndex._CreateBy), dbActivityIndex._CreateHost);
@@ -438,15 +444,22 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
filter.Add(itemIdFilters.Concat(" OR ", "(", ")"));
}
// Sport Ids.
String sportIdsIncluded = prm.SportIdsIncluded.Concat(",");
if (!sportIdsIncluded.IsEmpty())
filter.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityIndex_SportId, aliasActivityIndex) + " IN (" + sportIdsIncluded + ")");
// Activities are applicable if match on eo fthe sport/region combinations or match one of the owners (user or organisation).
List<String> applicableFilter = new List<string>();
// Region Ids.
String regionIdsIncluded = prm.RegionIdsIncluded.Concat(",");
if (!regionIdsIncluded.IsEmpty())
filter.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityIndex_RegionId, aliasActivityIndex) + " IN (" + regionIdsIncluded + ")");
// Sport and Region Id combinations.
foreach (SaxActivityIndex.SportRegionIds sportRegionIds in prm.SportRegionIdsIncluded)
applicableFilter.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityIndex_SportId, aliasActivityIndex) + "=" + sportRegionIds.SportId.ToString() + " AND " + SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityIndex_RegionId, aliasActivityIndex) + "=" + sportRegionIds.RegionId.ToString());
// Owner - User Account and/or Organisation.
if (prm.UserAccountIdsOwnerIncluded.Exists(item => SysId.IsValid(item)))
applicableFilter.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityIndex_UserAccountIdOwner, aliasActivityIndex) + " IN (" + prm.UserAccountIdsOwnerIncluded.Concat(",") + ")");
if (prm.OrganisationIdsOwnerIncluded.Exists(item => SysId.IsValid(item)))
applicableFilter.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityIndex_OrganisationIdOwner, aliasActivityIndex) + " IN (" + prm.OrganisationIdsOwnerIncluded.Concat(",") + ")");
// Any one of the applicable filters can be matched.
if (!applicableFilter.IsEmpty())
filter.Add(applicableFilter.Concat(" OR ", "(", ")"));
// Effective period.
if (DateUtil.IsValid(prm.EffectiveFrom))
@@ -454,6 +467,10 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
if (DateUtil.IsValid(prm.EffectiveTo))
filter.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityIndex_EffectiveOn, aliasActivityIndex) + "<" + DbQuery.FormatDateForCondition(DateUtil.IncrementDate(prm.EffectiveTo.Date, 1)));
// Expiry.
if (DateUtil.IsValid(prm.NotExpiredOn))
filter.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityIndex_ExpiresOn, aliasActivityIndex) + " Is Null Or " + SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityIndex_ExpiresOn, aliasActivityIndex) + ">" + DbQuery.FormatDateForCondition(prm.NotExpiredOn.Date));
if (filter.Count < 1) filter.Add("1=1");
return filter;
}
@@ -211,6 +211,7 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
private void PopulateTo(Sport_Db dbSport, SaxSport sport, DbUpdateInfo dbUpdateInfo)
{
dbSport._Id = SysId.ToInt(sport.Id);
dbSport._SportIdParent = SysId.ToInt(sport.SportIdParent);
dbSport._Name = sport.Name;
dbSport._SpecialityLabel = (short)sport.SpecialityLabel;
// Common properties.
@@ -230,6 +231,7 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
private void PopulateFrom(Sport_Db dbSport, SaxSport sport)
{
//sport.Id = new SysId(dbSport._Id);
sport.SportIdParent = new SysId(dbSport._SportIdParent);
sport.Name = dbSport._Name;
sport.SpecialityLabel = (Sax.SportSpecialityLabel)dbSport._SpecialityLabel;
// Common properties.
@@ -242,7 +244,9 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
//-------------------------------------------------------------------
// Item column definitions.
private static readonly String aliasSport = "Sprt";
private static readonly String aliasSport = "Spt";
private static readonly String aliasSport_Parent = "Spt_Prt";
private static readonly String prefixSport_Parent = aliasSport_Parent + "_";
//private static readonly String colSport_AssociatedData_Count = "UsrAct_AD_Count";
private void SetSportColDfn
(ColumnDfn col, String caption, int width, SaxDbDfn_Core.ColumnIdx dbCol,
@@ -275,6 +279,14 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
//-----------------------------------------------------------
// Properties.
case SaxSport.Column.SportIdParent:
SetSportColDfn(columnDfn, "Parent #", 60, SaxDbDfn_Core.ColumnIdx.Sport_SportIdParent, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
case SaxSport.Column.ParentSport_Name:
SetSportColDfn(columnDfn, "Parent", 120, SaxDbDfn_Core.ColumnIdx.Sport_Name, ColumnAlignment.Center, DataValue.DataType.String, aliasSport_Parent, prefixSport_Parent);
columnDfn.ReadOnly = true;
break;
case SaxSport.Column.Name:
SetSportColDfn(columnDfn, "Name", 120, SaxDbDfn_Core.ColumnIdx.Sport_Name);
break;
@@ -338,6 +350,10 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
if (!excludedIds.IsEmpty())
filter.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.Sport_Id, aliasSport) + " NOT IN (" + excludedIds + ")");
// Parent Sport.
if (SysId.IsValid(prm.SportIdParent))
filter.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.Sport_SportIdParent, aliasSport) + "=" + prm.SportIdParent.ToString());
// Generic filter.
if (!StringUtil.IsEmpty(prm.SportFilter))
{
@@ -480,6 +496,8 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
// Add columns as defined in query list.
if (columns.HasId(SaxSport.Column.Id))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.Sport_Id, aliasSport));
if (columns.HasId(SaxSport.Column.SportIdParent))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.Sport_SportIdParent, aliasSport));
if (columns.HasId(SaxSport.Column.Name))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.Sport_Name, aliasSport));
if (columns.HasId(SaxSport.Column.SpecialityLabel) || columns.HasId(SaxSport.Column.SpecialityLabel_Desc))
@@ -497,20 +515,18 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.Sport_UpdateOn, aliasSport));
//---------------------------------------------------------------------
// Movement count.
/*
if (columns.HasId(SaxSport.Column.Movement_Count))
// Parent Sport.
if (columns.HasId(SaxSport.Column.ParentSport_Name))
{
// Ref. SaxSport_Dbas.HasAssetMovements
String aliasMovement = "aCntMov";
DbQuery queryMovement = new DbQuery(SaxDatabase.DbmsType);
queryMovement.Tables.Add(SaxDbDfn.GetTableName(SaxDbDfn.TableIdx.AssetMovement), aliasMovement);
queryMovement.Columns.Add("Count(*)");
queryMovement.Filters.Add(SaxDbDfn.GetColumnNameQual(SaxDbDfn.ColumnIdx.AssetMovement_AssetItemType, aliasMovement) + "=" + (int)Sax.AssetItemType.Sport);
queryMovement.Filters.Add(SaxDbDfn.GetColumnNameQual(SaxDbDfn.ColumnIdx.AssetMovement_AssetItemId, aliasMovement) + "=" + SaxDbDfn.GetColumnNameQual(SaxDbDfn.ColumnIdx.Sport_Id, aliasSport));
query.Columns.Add("(" + queryMovement.BuildQuery() + ")", colSport_Movement_Count);
DbQueryJoin joinSport = new DbQueryJoin(DbJoinType.LeftOuter);
joinSport.Table = new StringPair(SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.Sport), aliasSport_Parent);
joinSport.Filters.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.Sport_Id, aliasSport_Parent) + "=" + SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.Sport_SportIdParent, aliasSport));
query.Joins.Add(joinSport);
List<SaxDbDfn_Core.ColumnIdx> cols = new List<SaxDbDfn_Core.ColumnIdx>();
cols.Add(SaxDbDfn_Core.ColumnIdx.Sport_Name);
foreach (var col in cols)
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(col, aliasSport_Parent), prefixSport_Parent + SaxDbDfn_Core.GetColumnName(col, false));
}
*/
//---------------------------------------------------------------------
// Populate filter.
@@ -95,6 +95,57 @@
<Schema>dbo</Schema>
<Table>ActivityIndex</Table>
<Pos>6</Pos>
<Name>UserAccountIdOwner</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityIndex</Table>
<Pos>7</Pos>
<Name>OrganisationIdOwner</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityIndex</Table>
<Pos>8</Pos>
<Name>ExpiresOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>smalldatetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>16</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityIndex</Table>
<Pos>9</Pos>
<Name>Notes</Name>
<DataType>VarChar</DataType>
<DataTypeName />
@@ -111,7 +162,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityIndex</Table>
<Pos>7</Pos>
<Pos>10</Pos>
<Name>Flags</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
@@ -128,7 +179,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityIndex</Table>
<Pos>8</Pos>
<Pos>11</Pos>
<Name>Status</Name>
<DataType>VarChar</DataType>
<DataTypeName />
@@ -145,7 +196,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityIndex</Table>
<Pos>9</Pos>
<Pos>12</Pos>
<Name>CreateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
@@ -162,7 +213,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityIndex</Table>
<Pos>10</Pos>
<Pos>13</Pos>
<Name>CreateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
@@ -179,7 +230,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityIndex</Table>
<Pos>11</Pos>
<Pos>14</Pos>
<Name>CreateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
@@ -196,7 +247,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityIndex</Table>
<Pos>12</Pos>
<Pos>15</Pos>
<Name>UpdateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
@@ -213,7 +264,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityIndex</Table>
<Pos>13</Pos>
<Pos>16</Pos>
<Name>UpdateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
@@ -230,7 +281,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityIndex</Table>
<Pos>14</Pos>
<Pos>17</Pos>
<Name>UpdateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
@@ -249,14 +300,14 @@
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>ActivityIndex</Table>
<Name>PK_ActivityIndex</Name>
<Name>PK_ActivityIndex_1</Name>
<IndexType>1</IndexType>
<Unique>true</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>1</Pages>
<UniqueValues>14</UniqueValues>
<UniqueValues>18</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
@@ -279,11 +330,6 @@
<Name>RegionId</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
<DbDfnIndexColumn>
<Seq>5</Seq>
<Name>EffectiveOn</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
@@ -311,6 +357,31 @@
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>ActivityIndex</Table>
<Name>IDX_ActivityIndex_Organisation_Effective</Name>
<IndexType>3</IndexType>
<Unique>false</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>OrganisationIdOwner</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
<DbDfnIndexColumn>
<Seq>2</Seq>
<Name>EffectiveOn</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>ActivityIndex</Table>
@@ -341,6 +412,31 @@
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>ActivityIndex</Table>
<Name>IDX_ActivityIndex_User_Effective</Name>
<IndexType>3</IndexType>
<Unique>false</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>UserAccountIdOwner</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
<DbDfnIndexColumn>
<Seq>2</Seq>
<Name>EffectiveOn</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
</Indices>
</DbDfnTable>
<DbDfnTable>
@@ -665,8 +761,8 @@
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>2</Pages>
<UniqueValues>13</UniqueValues>
<Pages>3</Pages>
<UniqueValues>19</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
@@ -1717,7 +1813,7 @@
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>1</Pages>
<UniqueValues>12</UniqueValues>
<UniqueValues>17</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
@@ -1730,7 +1826,7 @@
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>ItemImage</Table>
<Name>IDX_ItemImage_</Name>
<Name>IDX_ItemImage_Item</Name>
<IndexType>3</IndexType>
<Unique>false</Unique>
<Primary>false</Primary>
@@ -3754,6 +3850,23 @@
<Schema>dbo</Schema>
<Table>Sport</Table>
<Pos>2</Pos>
<Name>SportIdParent</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>Nullable</Nullable>
<IsNullable>true</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>Sport</Table>
<Pos>3</Pos>
<Name>Name</Name>
<DataType>VarChar</DataType>
<DataTypeName />
@@ -3770,7 +3883,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>Sport</Table>
<Pos>3</Pos>
<Pos>4</Pos>
<Name>SpecialityLabel</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
@@ -3787,7 +3900,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>Sport</Table>
<Pos>4</Pos>
<Pos>5</Pos>
<Name>Notes</Name>
<DataType>VarChar</DataType>
<DataTypeName />
@@ -3804,7 +3917,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>Sport</Table>
<Pos>5</Pos>
<Pos>6</Pos>
<Name>Flags</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
@@ -3821,7 +3934,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>Sport</Table>
<Pos>6</Pos>
<Pos>7</Pos>
<Name>Status</Name>
<DataType>VarChar</DataType>
<DataTypeName />
@@ -3838,7 +3951,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>Sport</Table>
<Pos>7</Pos>
<Pos>8</Pos>
<Name>CreateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
@@ -3855,7 +3968,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>Sport</Table>
<Pos>8</Pos>
<Pos>9</Pos>
<Name>CreateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
@@ -3872,7 +3985,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>Sport</Table>
<Pos>9</Pos>
<Pos>10</Pos>
<Name>CreateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
@@ -3889,7 +4002,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>Sport</Table>
<Pos>10</Pos>
<Pos>11</Pos>
<Name>UpdateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
@@ -3906,7 +4019,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>Sport</Table>
<Pos>11</Pos>
<Pos>12</Pos>
<Name>UpdateBy</Name>
<DataType>Int</DataType>
<DataTypeName />
@@ -3923,7 +4036,7 @@
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>Sport</Table>
<Pos>12</Pos>
<Pos>13</Pos>
<Name>UpdateHost</Name>
<DataType>VarChar</DataType>
<DataTypeName />
@@ -3979,6 +4092,26 @@
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>Sport</Table>
<Name>IDX_Sport_Parent</Name>
<IndexType>3</IndexType>
<Unique>false</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>SportIdParent</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
</Indices>
</DbDfnTable>
<DbDfnTable>
@@ -5005,7 +5138,7 @@
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>1</Pages>
<UniqueValues>21</UniqueValues>
<UniqueValues>24</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
@@ -5167,8 +5300,8 @@
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<Pages>1</Pages>
<UniqueValues>2</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
@@ -5452,7 +5585,7 @@
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>1</Pages>
<UniqueValues>15</UniqueValues>
<UniqueValues>16</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>