From 122056a9dab73fbd9d4629eda86052b9b9ce3258 Mon Sep 17 00:00:00 2001 From: Andy Howard Date: Thu, 3 Mar 2022 18:46:08 +0000 Subject: [PATCH] v1.2.4 --- .../Base/Consoles/SaxActivityConsole_Web.cs | 29 +- .../Middleware/SaxAuthenticationHandler.cs | 2 + SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs | 19 +- .../SystemController-Ajax-Database.cs | 332 ++++++++++++++---- .../Controllers/SystemController-Ajax-Logs.cs | 2 +- .../Admin/Models/Model_Sport.cs | 84 +++-- .../Admin/Models/Model_System.cs | 7 +- .../Localisation/SaxAdminProperties.resx | 12 +- .../Views/Shared/_Layout.cshtml | 8 +- .../Views/System/Database.cshtml | 78 +++- SaxoniteCoreWebAdmin/wwwroot/js/sax-main.js | 34 +- SaxoniteCoreWebAdmin/wwwroot/js/sax-sys-db.js | 141 ++++++-- .../wwwroot/js/sax-usr-onl.js | 2 +- .../Localisation/SaxOnlineProperties.resx | 12 +- .../Controllers/ActivityController-Ajax.cs | 25 +- .../Controllers/ArticleController-Ajax.cs | 15 +- .../OrganisationController-Ajax-Events.cs | 3 + ...ganisationController-Ajax-Opportunities.cs | 3 + .../Online/Models/Model_Activity.cs | 1 + .../Views/Article/Index.cshtml | 2 +- .../Views/Article/Panel-ArticleDialog.cshtml | 20 +- .../Views/Shared/_Layout.cshtml | 4 +- .../wwwroot/css/sax-form.css | 8 +- .../wwwroot/js/sax-account.js | 2 +- SaxoniteCoreWebOnline/wwwroot/js/sax-art.js | 252 ++++++------- SaxoniteCoreWebOnline/wwwroot/js/sax-main.js | 20 +- .../wwwroot/js/sax-org-evt.js | 1 + SaxoniteStandardBase/Base/App/Sax-Version.cs | 5 +- .../Base/App/SaxDbDfn_Core.cs | 12 +- .../Base/Bus/SaxActivityIndex.cs | 86 ++++- SaxoniteStandardBase/Base/Bus/SaxSport.cs | 16 + .../Base/Bus/SaxUserOnline.cs | 3 +- .../Base/Consoles/SaxActivityConsole.cs | 43 ++- .../Base/Mgr/SaxAccountMgr-UserOnline.cs | 7 + .../Base/Mgr/SaxActivityMgr-ActivityIndex.cs | 11 +- .../Base/Mgr/SaxReferenceMgr-Sport.cs | 61 +++- .../Dbas/Bus/SaxActivityIndex_Dbas.cs | 4 +- .../Dbas/Internal/ActivityIndex_Db.cs | 27 +- .../Dbas/Internal/Article_Db.cs | 2 +- .../Dbas/Internal/ItemAddress_Db.cs | 2 +- .../Dbas/Internal/ItemImage_Db.cs | 2 +- .../Dbas/Internal/ItemSport_Db.cs | 2 +- .../Dbas/Internal/OrganisationEvent_Db.cs | 2 +- .../Internal/OrganisationOpportunity_Db.cs | 2 +- .../Dbas/Internal/Organisation_Db.cs | 2 +- .../Dbas/Internal/Region_Db.cs | 2 +- .../Dbas/Internal/Sport_Db.cs | 8 +- .../Dbas/Internal/UserAccount_Db.cs | 2 +- .../Dbas/Internal/UserActivity_Db.cs | 2 +- .../Dbas/Internal/UserOnline_Db.cs | 2 +- .../Dbas/Internal/UserOrganisation_Db.cs | 2 +- .../Dbas/Internal/UserRole_Db.cs | 2 +- .../Dbas/Internal/UserSession_Db.cs | 2 +- .../Dbas/Internal/UserSportExperience_Db.cs | 2 +- .../Dbas/Internal/UserSport_Db.cs | 2 +- .../Dbas/Mgr/SaxAccountMgr_Dbas-UserOnline.cs | 20 +- .../Mgr/SaxActivityMgr_Dbas-ActivityIndex.cs | 39 +- .../Dbas/Mgr/SaxReferenceMgr_Dbas-Sport.cs | 42 ++- .../Resources/Database/SaxDbDfn_Core.xml | 199 +++++++++-- 59 files changed, 1259 insertions(+), 474 deletions(-) diff --git a/SaxoniteCoreWeb/Base/Consoles/SaxActivityConsole_Web.cs b/SaxoniteCoreWeb/Base/Consoles/SaxActivityConsole_Web.cs index b681441..8febc5d 100644 --- a/SaxoniteCoreWeb/Base/Consoles/SaxActivityConsole_Web.cs +++ b/SaxoniteCoreWeb/Base/Consoles/SaxActivityConsole_Web.cs @@ -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 //------------------------------------------------------------------- /// - /// Record listing of activties by user - those populated to the application page. + /// Record listing of activities by user - those populated to the application page. /// - Activities not previously listed are added to the user's list. /// - Activities previously listed are updated in the user's list. - /// - User Activties no longer listed are flagged as 'Not currently listed'. + /// - User Activities no longer listed are flagged as 'Not currently listed'. /// public override bool RecordUserActivitiesListed(SysId userAccountId, List activityItemIds, DbUpdateInfo dbUpdateInfo) { diff --git a/SaxoniteCoreWeb/Base/Middleware/SaxAuthenticationHandler.cs b/SaxoniteCoreWeb/Base/Middleware/SaxAuthenticationHandler.cs index e3fbae9..bbfe397 100644 --- a/SaxoniteCoreWeb/Base/Middleware/SaxAuthenticationHandler.cs +++ b/SaxoniteCoreWeb/Base/Middleware/SaxAuthenticationHandler.cs @@ -36,6 +36,8 @@ namespace Saxonite.Net.Core.Web.Base.Middleware //------------------------------------------------------------------- protected override async Task HandleAuthenticateAsync() { + // NoOp task to avoid compiler warning. + await Task.Yield(); Context.Response.StatusCode = (int)HttpStatusCode.Unauthorized; return AuthenticateResult.NoResult(); } diff --git a/SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs b/SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs index 4ed6a17..820ac33 100644 --- a/SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs +++ b/SaxoniteCoreWeb/Base/Models/SaxModel_Base.cs @@ -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; } //------------------------------------------------------------------- diff --git a/SaxoniteCoreWebAdmin/Admin/Controllers/SystemController-Ajax-Database.cs b/SaxoniteCoreWebAdmin/Admin/Controllers/SystemController-Ajax-Database.cs index bd6a871..856f8c9 100644 --- a/SaxoniteCoreWebAdmin/Admin/Controllers/SystemController-Ajax-Database.cs +++ b/SaxoniteCoreWebAdmin/Admin/Controllers/SystemController-Ajax-Database.cs @@ -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 tableRowCounts = new Dictionary(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 disposableItems = new DisposableCollection()) { - while (dbResultSet != null && dbResultSet.NextRecord()) + + // Core Database connection. + ISacsDatabase db = SaxGlobals.App.GetCoreDatabase(SessionContext); + + // Database table row counts. + Dictionary tableRowCounts = new Dictionary(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 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 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 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 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 disposableItems = new DisposableCollection()) { - 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 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 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 Properties { get; } = new List(); + public List Columns { get; } = new List(); + public List Indices { get; } = new List(); + } + 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 Columns { get; } = new List(); + 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 disposableItems = new DisposableCollection()) + { + + // 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); + } + //------------------------------------------------------------------- } //======================================================================= diff --git a/SaxoniteCoreWebAdmin/Admin/Controllers/SystemController-Ajax-Logs.cs b/SaxoniteCoreWebAdmin/Admin/Controllers/SystemController-Ajax-Logs.cs index 4d0f7f0..aa49910 100644 --- a/SaxoniteCoreWebAdmin/Admin/Controllers/SystemController-Ajax-Logs.cs +++ b/SaxoniteCoreWebAdmin/Admin/Controllers/SystemController-Ajax-Logs.cs @@ -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"]; diff --git a/SaxoniteCoreWebAdmin/Admin/Models/Model_Sport.cs b/SaxoniteCoreWebAdmin/Admin/Models/Model_Sport.cs index c7401d7..50e9237 100644 --- a/SaxoniteCoreWebAdmin/Admin/Models/Model_Sport.cs +++ b/SaxoniteCoreWebAdmin/Admin/Models/Model_Sport.cs @@ -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 disposableItems = new DisposableCollection()) { - 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(); } diff --git a/SaxoniteCoreWebAdmin/Admin/Models/Model_System.cs b/SaxoniteCoreWebAdmin/Admin/Models/Model_System.cs index 87c77d1..15c9d0c 100644 --- a/SaxoniteCoreWebAdmin/Admin/Models/Model_System.cs +++ b/SaxoniteCoreWebAdmin/Admin/Models/Model_System.cs @@ -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. diff --git a/SaxoniteCoreWebAdmin/Localisation/SaxAdminProperties.resx b/SaxoniteCoreWebAdmin/Localisation/SaxAdminProperties.resx index ce7cbac..e06946d 100644 --- a/SaxoniteCoreWebAdmin/Localisation/SaxAdminProperties.resx +++ b/SaxoniteCoreWebAdmin/Localisation/SaxAdminProperties.resx @@ -147,6 +147,12 @@ No items are awaiting activation + + [1 char available] + + + [{0} chars available] + Accounts @@ -174,12 +180,6 @@ Category - - {0} characters - - - 1 character - Clear diff --git a/SaxoniteCoreWebAdmin/Views/Shared/_Layout.cshtml b/SaxoniteCoreWebAdmin/Views/Shared/_Layout.cshtml index 2bb02dc..7ee72ae 100644 --- a/SaxoniteCoreWebAdmin/Views/Shared/_Layout.cshtml +++ b/SaxoniteCoreWebAdmin/Views/Shared/_Layout.cshtml @@ -54,7 +54,7 @@ } @* Scripts *@ - + diff --git a/SaxoniteCoreWebAdmin/Views/System/Database.cshtml b/SaxoniteCoreWebAdmin/Views/System/Database.cshtml index a453b9d..a3e35a9 100644 --- a/SaxoniteCoreWebAdmin/Views/System/Database.cshtml +++ b/SaxoniteCoreWebAdmin/Views/System/Database.cshtml @@ -4,7 +4,7 @@ ViewData["Title"] = "System - Database"; } -
+
@@ -14,11 +14,11 @@
- @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;" })) {
@Localiser["label.search"]
-
@Html.TextBoxFor(model => model.DatabaseFilter.Table, new { @id = "ifFilterDatabaseTable", @class = "FilterDatabaseTable", @maxlength = "32" })
+
@Html.TextBoxFor(model => model.DatabaseFilter.Search, new { @id = "ifFilterDatabaseTable", @class = "FilterDatabaseTable", @maxlength = "32" })
}
@@ -51,3 +51,75 @@
+ +@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmDbTableName", @onSubmit = "return false;" })) +{ + @Html.HiddenFor(model => model.DatabaseTable.Name, new { @class = "DatabaseTableName" }) +} + + +
+
+ @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmDbTable", @onSubmit = "return false;" })) + { + @Html.HiddenFor(model => model.DatabaseTable.Name, new { @class = "DatabaseTableName" }) + } + + + + + + + + + + + + + +
Properties: + +
+
Columns: + + + + + + +
PosNameFormat
+
Indices: + + + + + + +
NameUniqueColumns
+
+
+
+ + + + + + + + + + + + + + + +
+
+
diff --git a/SaxoniteCoreWebAdmin/wwwroot/js/sax-main.js b/SaxoniteCoreWebAdmin/wwwroot/js/sax-main.js index 05c9257..1c59221 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/js/sax-main.js +++ b/SaxoniteCoreWebAdmin/wwwroot/js/sax-main.js @@ -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) { diff --git a/SaxoniteCoreWebAdmin/wwwroot/js/sax-sys-db.js b/SaxoniteCoreWebAdmin/wwwroot/js/sax-sys-db.js index 0568dea..fe3ee68 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/js/sax-sys-db.js +++ b/SaxoniteCoreWebAdmin/wwwroot/js/sax-sys-db.js @@ -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($('
' + sax.msg.dataQuerying + '
')).fadeIn(200); + var $items = $('.sax-panel-item-list', $pnl.results).fadeOut(200).empty(); + var $msgs = $('.sax-panel-messages', $pnl.results).hide().empty().append($('
' + sax.msg.dataQuerying + '
')).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($('
' + sax.msg.dataNoneFound + '
')).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($('
').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)); diff --git a/SaxoniteCoreWebAdmin/wwwroot/js/sax-usr-onl.js b/SaxoniteCoreWebAdmin/wwwroot/js/sax-usr-onl.js index 5e0799e..5dcd182 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/js/sax-usr-onl.js +++ b/SaxoniteCoreWebAdmin/wwwroot/js/sax-usr-onl.js @@ -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); diff --git a/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx b/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx index 8f10be9..c065d10 100644 --- a/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx +++ b/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx @@ -213,6 +213,12 @@ Sign-up now with a few details and we'll let you know when you can login and get going. + + [1 char available] + + + [{0} chars available] + About @@ -249,12 +255,6 @@ Category - - {0} characters - - - 1 character - Clear diff --git a/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs b/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs index d65f303..3dc12ae 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs @@ -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 activityItemIds = new List(); diff --git a/SaxoniteCoreWebOnline/Online/Controllers/ArticleController-Ajax.cs b/SaxoniteCoreWebOnline/Online/Controllers/ArticleController-Ajax.cs index f38cf2b..f553d18 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/ArticleController-Ajax.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/ArticleController-Ajax.cs @@ -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 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); diff --git a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Events.cs b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Events.cs index b5df19a..b4b6d0c 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Events.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Events.cs @@ -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); diff --git a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Opportunities.cs b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Opportunities.cs index 0b1fa34..497c5eb 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Opportunities.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/OrganisationController-Ajax-Opportunities.cs @@ -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); diff --git a/SaxoniteCoreWebOnline/Online/Models/Model_Activity.cs b/SaxoniteCoreWebOnline/Online/Models/Model_Activity.cs index 56d9556..88f939c 100644 --- a/SaxoniteCoreWebOnline/Online/Models/Model_Activity.cs +++ b/SaxoniteCoreWebOnline/Online/Models/Model_Activity.cs @@ -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(); diff --git a/SaxoniteCoreWebOnline/Views/Article/Index.cshtml b/SaxoniteCoreWebOnline/Views/Article/Index.cshtml index 940bd20..d25a08c 100644 --- a/SaxoniteCoreWebOnline/Views/Article/Index.cshtml +++ b/SaxoniteCoreWebOnline/Views/Article/Index.cshtml @@ -43,7 +43,7 @@
@Html.HiddenFor(model => model.Filter.OrganisationId, new { @id = "ifFilterOrganisationId", @class = "FilterOrganisationId" })
-
+
} diff --git a/SaxoniteCoreWebOnline/Views/Article/Panel-ArticleDialog.cshtml b/SaxoniteCoreWebOnline/Views/Article/Panel-ArticleDialog.cshtml index 62f079c..f1229eb 100644 --- a/SaxoniteCoreWebOnline/Views/Article/Panel-ArticleDialog.cshtml +++ b/SaxoniteCoreWebOnline/Views/Article/Panel-ArticleDialog.cshtml @@ -27,7 +27,7 @@ @Html.HiddenFor(model => model.ArticleExists, new { @id = "ifArticleExists", @class = "ArticleExists" }) @Html.HiddenFor(model => model.ArticleOrganisationId, new { @id = "ifArticleOrganisationId", @class = "ArticleOrganisationId" }) -
+
@@ -49,8 +49,11 @@ @* Article headline *@
-
- +
+
+
+
+
@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 *@
-
- +
+
+
+
+
@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 @@
@Html.HiddenFor(model => model.ArticleSportId, new { @id = "ifArticleSportId", @class = "ArticleSportId" })
@Html.TextBoxFor(model => model.ArticleSportCaption, new { @id = "ifArticleSportCaption", @class = "ArticleSportCaption sax-input", @readonly = "readonly", @onDblClick = "sax.selectSport()" })
-
+
@@ -100,7 +106,7 @@
@Html.HiddenFor(model => model.ArticleRegionId, new { @id = "ifArticleRegionId", @class = "ArticleRegionId" })
@Html.TextBoxFor(model => model.ArticleRegionCaption, new { @id = "ifArticleRegionCaption", @class = "ArticleRegionCaption sax-input", @readonly = "readonly", @onDblClick = "sax.selectRegion()" })
-
+
diff --git a/SaxoniteCoreWebOnline/Views/Shared/_Layout.cshtml b/SaxoniteCoreWebOnline/Views/Shared/_Layout.cshtml index d13369e..c4ce7d9 100644 --- a/SaxoniteCoreWebOnline/Views/Shared/_Layout.cshtml +++ b/SaxoniteCoreWebOnline/Views/Shared/_Layout.cshtml @@ -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")'; diff --git a/SaxoniteCoreWebOnline/wwwroot/css/sax-form.css b/SaxoniteCoreWebOnline/wwwroot/css/sax-form.css index 7da78a6..61ea338 100644 --- a/SaxoniteCoreWebOnline/wwwroot/css/sax-form.css +++ b/SaxoniteCoreWebOnline/wwwroot/css/sax-form.css @@ -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; diff --git a/SaxoniteCoreWebOnline/wwwroot/js/sax-account.js b/SaxoniteCoreWebOnline/wwwroot/js/sax-account.js index 07639f4..e45fbc3 100644 --- a/SaxoniteCoreWebOnline/wwwroot/js/sax-account.js +++ b/SaxoniteCoreWebOnline/wwwroot/js/sax-account.js @@ -53,7 +53,7 @@ { var $select = $('.sax-control select.' + name, $section); $select.val(value).scrollTop(0); - sax.setItemsSelectedLabel($select); + sax.setItemsSelectedInfo($select); } //-------------------------------------------------------------- diff --git a/SaxoniteCoreWebOnline/wwwroot/js/sax-art.js b/SaxoniteCoreWebOnline/wwwroot/js/sax-art.js index 2592b40..c5dc647 100644 --- a/SaxoniteCoreWebOnline/wwwroot/js/sax-art.js +++ b/SaxoniteCoreWebOnline/wwwroot/js/sax-art.js @@ -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($('
' + sax.msg.dataQuerying + '
')).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($('
' + sax.msg.dataNoneFound + '
')).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)); diff --git a/SaxoniteCoreWebOnline/wwwroot/js/sax-main.js b/SaxoniteCoreWebOnline/wwwroot/js/sax-main.js index fa4e206..22ab7aa 100644 --- a/SaxoniteCoreWebOnline/wwwroot/js/sax-main.js +++ b/SaxoniteCoreWebOnline/wwwroot/js/sax-main.js @@ -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) { diff --git a/SaxoniteCoreWebOnline/wwwroot/js/sax-org-evt.js b/SaxoniteCoreWebOnline/wwwroot/js/sax-org-evt.js index fecf73a..a29a380 100644 --- a/SaxoniteCoreWebOnline/wwwroot/js/sax-org-evt.js +++ b/SaxoniteCoreWebOnline/wwwroot/js/sax-org-evt.js @@ -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(); } diff --git a/SaxoniteStandardBase/Base/App/Sax-Version.cs b/SaxoniteStandardBase/Base/App/Sax-Version.cs index 4b72964..0b9233a 100644 --- a/SaxoniteStandardBase/Base/App/Sax-Version.cs +++ b/SaxoniteStandardBase/Base/App/Sax-Version.cs @@ -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. diff --git a/SaxoniteStandardBase/Base/App/SaxDbDfn_Core.cs b/SaxoniteStandardBase/Base/App/SaxDbDfn_Core.cs index 5c3a244..94cef28 100644 --- a/SaxoniteStandardBase/Base/App/SaxDbDfn_Core.cs +++ b/SaxoniteStandardBase/Base/App/SaxDbDfn_Core.cs @@ -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), diff --git a/SaxoniteStandardBase/Base/Bus/SaxActivityIndex.cs b/SaxoniteStandardBase/Base/Bus/SaxActivityIndex.cs index c4120ea..048541f 100644 --- a/SaxoniteStandardBase/Base/Bus/SaxActivityIndex.cs +++ b/SaxoniteStandardBase/Base/Bus/SaxActivityIndex.cs @@ -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. /// - /// Match the item to the sport, region and effective date. + /// Match the item to the sport and region. /// - 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 //------------------------------------------------------------------- /// + /// Combination Sport and Region Ids to index activities. + /// + public class SportRegionIds + { + public SportRegionIds(SysId sportId, SysId regionId) + { + SportId = sportId; + RegionId = regionId; + } + public SysId SportId { get; } + public SysId RegionId { get; } + } + /// /// Item list parameters. /// public new class Params : SacsHierarchyItem.Params @@ -232,12 +288,18 @@ namespace Saxonite.Net.Standard.Base.Bus public List IdsIncluded { get; } = new List(); public List IdsExcluded { get; } = new List(); public List ItemIdsIncluded { get; } = new List(); - public List SportIdsIncluded { get; } = new List(); - public List RegionIdsIncluded { get; } = new List(); - public DateTime EffectiveFrom { get; set; } - public DateTime EffectiveTo { get; set; } + /// Activities must match one of the sport/region combinations specified. + public List SportRegionIdsIncluded { get; } = new List(); + /// Owner User Accounts - to include activities in result for users regardless of sports/regions. + public List UserAccountIdsOwnerIncluded { get; } = new List(); + /// Owner Organisations - to include activities in result for organisations regardless of sport/region combinations. + public List OrganisationIdsOwnerIncluded { get; } = new List(); /// User Account - to include User Activity data in result. public SysId UserAccountId { get; set; } + public DateTime EffectiveFrom { get; set; } + public DateTime EffectiveTo { get; set; } + /// Not Expired - either Expiry date not set or is after specified date. + 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 { /// - /// Get first entry that matcehs the sport, region and effective date. + /// Get first entry that matches the sport and region. /// - public static SaxActivityIndex GetActivityIndexBySportRegionEffective(this List values, SysId sportId, SysId regionId, DateTime effectiveOn) + public static SaxActivityIndex GetActivityIndexBySportRegion(this List values, SysId sportId, SysId regionId) { - return values.Find(item => item.MatchesSportRegionEffective(sportId, regionId, effectiveOn)); + return values.Find(item => item.MatchesSportRegion(sportId, regionId)); } } diff --git a/SaxoniteStandardBase/Base/Bus/SaxSport.cs b/SaxoniteStandardBase/Base/Bus/SaxSport.cs index 13ed8a3..f1aec6e 100644 --- a/SaxoniteStandardBase/Base/Bus/SaxSport.cs +++ b/SaxoniteStandardBase/Base/Bus/SaxSport.cs @@ -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 /// Properties other than common. 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 IdsIncluded { get; } = new List(); public List IdsExcluded { get; } = new List(); + public SysId SportIdParent {get; set; } /// Generic filter - partial sport name, or other matching value (tbd). public String SportFilter { get; set; } public String NameFull { get; set; } diff --git a/SaxoniteStandardBase/Base/Bus/SaxUserOnline.cs b/SaxoniteStandardBase/Base/Bus/SaxUserOnline.cs index 8e23ef3..bf8c3d0 100644 --- a/SaxoniteStandardBase/Base/Bus/SaxUserOnline.cs +++ b/SaxoniteStandardBase/Base/Bus/SaxUserOnline.cs @@ -22,7 +22,8 @@ namespace Saxonite.Net.Standard.Base.Bus OnlineAt, // User properties. EmailAddress, - Title, FirstName, LastName, + DisplayName, Title, FirstName, LastName, + LastLoginOn, LastLoginAt, } diff --git a/SaxoniteStandardBase/Base/Consoles/SaxActivityConsole.cs b/SaxoniteStandardBase/Base/Consoles/SaxActivityConsole.cs index f3d0a63..3c7dd5f 100644 --- a/SaxoniteStandardBase/Base/Consoles/SaxActivityConsole.cs +++ b/SaxoniteStandardBase/Base/Consoles/SaxActivityConsole.cs @@ -25,21 +25,35 @@ namespace Saxonite.Net.Standard.Base.Consoles public class IndexContext { // ToDo Include Localiser. + /// + /// Index Context - high level activity filter. + /// User Account allows User specific information about the activities to be included. + /// public IndexContext(SysId userAccountId) { UserAccountId = userAccountId; } public SysId UserAccountId { get; } - public List SportIds { get; } = new List(); - public List RegionIds { get; } = new List(); - // Todo: Default period is ~12 months ago up to ~3 months in the future. + /// Activities must match one of the sport/region combinations specified. + public List SportRegionIdsIncluded { get; } = new List(); + /// + /// Owner Users - eg. journalist for articles. + /// Allows the users' activities to be queried without relying on matching sport/region combinations. + /// + public List UserAccountIdsOwner { get; } = new List(); + /// + /// Owner Organisations - for articles, events and opportunities. + /// Allows the organisations' own activities to be queried without relying on matching sport/region combinations. + /// + public List OrganisationIdsOwner { get; } = new List(); + // 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 SportIds { get; } = new List(); public List RegionIds { get; } = new List(); 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 /// Single entry in the index for an activity. 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); } diff --git a/SaxoniteStandardBase/Base/Mgr/SaxAccountMgr-UserOnline.cs b/SaxoniteStandardBase/Base/Mgr/SaxAccountMgr-UserOnline.cs index 5045830..249851d 100644 --- a/SaxoniteStandardBase/Base/Mgr/SaxAccountMgr-UserOnline.cs +++ b/SaxoniteStandardBase/Base/Mgr/SaxAccountMgr-UserOnline.cs @@ -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; diff --git a/SaxoniteStandardBase/Base/Mgr/SaxActivityMgr-ActivityIndex.cs b/SaxoniteStandardBase/Base/Mgr/SaxActivityMgr-ActivityIndex.cs index b835f86..5ed70db 100644 --- a/SaxoniteStandardBase/Base/Mgr/SaxActivityMgr-ActivityIndex.cs +++ b/SaxoniteStandardBase/Base/Mgr/SaxActivityMgr-ActivityIndex.cs @@ -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; diff --git a/SaxoniteStandardBase/Base/Mgr/SaxReferenceMgr-Sport.cs b/SaxoniteStandardBase/Base/Mgr/SaxReferenceMgr-Sport.cs index a8a9c10..7f3d92f 100644 --- a/SaxoniteStandardBase/Base/Mgr/SaxReferenceMgr-Sport.cs +++ b/SaxoniteStandardBase/Base/Mgr/SaxReferenceMgr-Sport.cs @@ -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 disposableItems = new DisposableCollection()) { - 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."); + } + } } } diff --git a/SaxoniteStandardDbas/Dbas/Bus/SaxActivityIndex_Dbas.cs b/SaxoniteStandardDbas/Dbas/Bus/SaxActivityIndex_Dbas.cs index 6d2422d..42dde2d 100644 --- a/SaxoniteStandardDbas/Dbas/Bus/SaxActivityIndex_Dbas.cs +++ b/SaxoniteStandardDbas/Dbas/Bus/SaxActivityIndex_Dbas.cs @@ -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; diff --git a/SaxoniteStandardDbas/Dbas/Internal/ActivityIndex_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/ActivityIndex_Db.cs index 57d412a..e9ce4ad 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/ActivityIndex_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/ActivityIndex_Db.cs @@ -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 fieldsIgnoreOnUpdate { get; } = new List() { @@ -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); } diff --git a/SaxoniteStandardDbas/Dbas/Internal/Article_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/Article_Db.cs index a0743cc..9b6a37e 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/Article_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/Article_Db.cs @@ -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 { diff --git a/SaxoniteStandardDbas/Dbas/Internal/ItemAddress_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/ItemAddress_Db.cs index e27427c..b3468c0 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/ItemAddress_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/ItemAddress_Db.cs @@ -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 { diff --git a/SaxoniteStandardDbas/Dbas/Internal/ItemImage_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/ItemImage_Db.cs index cff87be..2737021 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/ItemImage_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/ItemImage_Db.cs @@ -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 { diff --git a/SaxoniteStandardDbas/Dbas/Internal/ItemSport_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/ItemSport_Db.cs index d7b1114..c6773c1 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/ItemSport_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/ItemSport_Db.cs @@ -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 { diff --git a/SaxoniteStandardDbas/Dbas/Internal/OrganisationEvent_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/OrganisationEvent_Db.cs index 91c79b2..13ff869 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/OrganisationEvent_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/OrganisationEvent_Db.cs @@ -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 { diff --git a/SaxoniteStandardDbas/Dbas/Internal/OrganisationOpportunity_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/OrganisationOpportunity_Db.cs index c8cbf7c..dee36cd 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/OrganisationOpportunity_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/OrganisationOpportunity_Db.cs @@ -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 { diff --git a/SaxoniteStandardDbas/Dbas/Internal/Organisation_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/Organisation_Db.cs index 60fb8ab..9dd2383 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/Organisation_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/Organisation_Db.cs @@ -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 { diff --git a/SaxoniteStandardDbas/Dbas/Internal/Region_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/Region_Db.cs index b33bb1c..d6d6bd9 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/Region_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/Region_Db.cs @@ -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 { diff --git a/SaxoniteStandardDbas/Dbas/Internal/Sport_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/Sport_Db.cs index f4094cc..a56916c 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/Sport_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/Sport_Db.cs @@ -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 fields { get; } = new List() { "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); diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserAccount_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserAccount_Db.cs index 4d6e2f0..c1c925b 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/UserAccount_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/UserAccount_Db.cs @@ -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 { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserActivity_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserActivity_Db.cs index 8acf8c3..cb666a0 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/UserActivity_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/UserActivity_Db.cs @@ -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 { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserOnline_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserOnline_Db.cs index 8e847b8..b793efa 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/UserOnline_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/UserOnline_Db.cs @@ -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 { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserOrganisation_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserOrganisation_Db.cs index 33db103..bb88f47 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/UserOrganisation_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/UserOrganisation_Db.cs @@ -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 { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserRole_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserRole_Db.cs index c09e493..39bdb57 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/UserRole_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/UserRole_Db.cs @@ -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 { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserSession_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserSession_Db.cs index fbd8128..bbdfd3c 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/UserSession_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/UserSession_Db.cs @@ -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 { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserSportExperience_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserSportExperience_Db.cs index fabefcf..3554959 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/UserSportExperience_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/UserSportExperience_Db.cs @@ -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 { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserSport_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserSport_Db.cs index b3164cf..217adce 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/UserSport_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/UserSport_Db.cs @@ -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 { diff --git a/SaxoniteStandardDbas/Dbas/Mgr/SaxAccountMgr_Dbas-UserOnline.cs b/SaxoniteStandardDbas/Dbas/Mgr/SaxAccountMgr_Dbas-UserOnline.cs index 7dc38d4..9e0df6e 100644 --- a/SaxoniteStandardDbas/Dbas/Mgr/SaxAccountMgr_Dbas-UserOnline.cs +++ b/SaxoniteStandardDbas/Dbas/Mgr/SaxAccountMgr_Dbas-UserOnline.cs @@ -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 cols = new List(); 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) { diff --git a/SaxoniteStandardDbas/Dbas/Mgr/SaxActivityMgr_Dbas-ActivityIndex.cs b/SaxoniteStandardDbas/Dbas/Mgr/SaxActivityMgr_Dbas-ActivityIndex.cs index 605aab3..ab2184f 100644 --- a/SaxoniteStandardDbas/Dbas/Mgr/SaxActivityMgr_Dbas-ActivityIndex.cs +++ b/SaxoniteStandardDbas/Dbas/Mgr/SaxActivityMgr_Dbas-ActivityIndex.cs @@ -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 applicableFilter = new List(); - // 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; } diff --git a/SaxoniteStandardDbas/Dbas/Mgr/SaxReferenceMgr_Dbas-Sport.cs b/SaxoniteStandardDbas/Dbas/Mgr/SaxReferenceMgr_Dbas-Sport.cs index 46f1cbd..4c93874 100644 --- a/SaxoniteStandardDbas/Dbas/Mgr/SaxReferenceMgr_Dbas-Sport.cs +++ b/SaxoniteStandardDbas/Dbas/Mgr/SaxReferenceMgr_Dbas-Sport.cs @@ -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 cols = new List(); + 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. diff --git a/SaxoniteStandardDbas/Resources/Database/SaxDbDfn_Core.xml b/SaxoniteStandardDbas/Resources/Database/SaxDbDfn_Core.xml index e422baf..d5b8edd 100644 --- a/SaxoniteStandardDbas/Resources/Database/SaxDbDfn_Core.xml +++ b/SaxoniteStandardDbas/Resources/Database/SaxDbDfn_Core.xml @@ -95,6 +95,57 @@ dbo ActivityIndex
6 + UserAccountIdOwner + Int + + 4 + int + false + 10 + 4 + 0 + Nullable + true + + + + dbo + ActivityIndex
+ 7 + OrganisationIdOwner + Int + + 4 + int + false + 10 + 4 + 0 + Nullable + true + +
+ + dbo + ActivityIndex
+ 8 + ExpiresOn + DateTime + + 93 + smalldatetime + false + 16 + 16 + 0 + Nullable + true + +
+ + dbo + ActivityIndex
+ 9 Notes VarChar @@ -111,7 +162,7 @@ dbo ActivityIndex
- 7 + 10 Flags SmallInt @@ -128,7 +179,7 @@ dbo ActivityIndex
- 8 + 11 Status VarChar @@ -145,7 +196,7 @@ dbo ActivityIndex
- 9 + 12 CreateOn DateTime @@ -162,7 +213,7 @@ dbo ActivityIndex
- 10 + 13 CreateBy Int @@ -179,7 +230,7 @@ dbo ActivityIndex
- 11 + 14 CreateHost VarChar @@ -196,7 +247,7 @@ dbo ActivityIndex
- 12 + 15 UpdateOn DateTime @@ -213,7 +264,7 @@ dbo ActivityIndex
- 13 + 16 UpdateBy Int @@ -230,7 +281,7 @@ dbo ActivityIndex
- 14 + 17 UpdateHost VarChar @@ -249,14 +300,14 @@ dbo ActivityIndex
- PK_ActivityIndex + PK_ActivityIndex_1 1 true false false false 1 - 14 + 18 false @@ -279,11 +330,6 @@ RegionId true - - 5 - EffectiveOn - true -
@@ -311,6 +357,31 @@ + + dbo + ActivityIndex
+ IDX_ActivityIndex_Organisation_Effective + 3 + false + false + false + false + 0 + 0 + false + + + 1 + OrganisationIdOwner + true + + + 2 + EffectiveOn + true + + +
dbo ActivityIndex
@@ -341,6 +412,31 @@
+ + dbo + ActivityIndex
+ IDX_ActivityIndex_User_Effective + 3 + false + false + false + false + 0 + 0 + false + + + 1 + UserAccountIdOwner + true + + + 2 + EffectiveOn + true + + +
@@ -665,8 +761,8 @@ false false false - 2 - 13 + 3 + 19 false @@ -1717,7 +1813,7 @@ false false 1 - 12 + 17 false @@ -1730,7 +1826,7 @@ dbo ItemImage
- IDX_ItemImage_ + IDX_ItemImage_Item 3 false false @@ -3754,6 +3850,23 @@ dbo Sport
2 + SportIdParent + Int + + 4 + int + false + 10 + 4 + 0 + Nullable + true + +
+ + dbo + Sport
+ 3 Name VarChar @@ -3770,7 +3883,7 @@ dbo Sport
- 3 + 4 SpecialityLabel SmallInt @@ -3787,7 +3900,7 @@ dbo Sport
- 4 + 5 Notes VarChar @@ -3804,7 +3917,7 @@ dbo Sport
- 5 + 6 Flags SmallInt @@ -3821,7 +3934,7 @@ dbo Sport
- 6 + 7 Status VarChar @@ -3838,7 +3951,7 @@ dbo Sport
- 7 + 8 CreateOn DateTime @@ -3855,7 +3968,7 @@ dbo Sport
- 8 + 9 CreateBy Int @@ -3872,7 +3985,7 @@ dbo Sport
- 9 + 10 CreateHost VarChar @@ -3889,7 +4002,7 @@ dbo Sport
- 10 + 11 UpdateOn DateTime @@ -3906,7 +4019,7 @@ dbo Sport
- 11 + 12 UpdateBy Int @@ -3923,7 +4036,7 @@ dbo Sport
- 12 + 13 UpdateHost VarChar @@ -3979,6 +4092,26 @@ + + dbo + Sport
+ IDX_Sport_Parent + 3 + false + false + false + false + 0 + 0 + false + + + 1 + SportIdParent + true + + +
@@ -5005,7 +5138,7 @@ false false 1 - 21 + 24 false @@ -5167,8 +5300,8 @@ false false false - 0 - 0 + 1 + 2 false @@ -5452,7 +5585,7 @@ false false 1 - 15 + 16 false