From 558be9063f0008ba9ec56df63e2d4f3ea1f4553e Mon Sep 17 00:00:00 2001 From: Andy Howard Date: Fri, 18 Jun 2021 19:57:52 +0100 Subject: [PATCH] v1.0.8.1 --- .../Base/Consoles/SaxActivityConsole_Web.cs | 213 +++++++++++++++++- .../Localisation/SaxOnlineProperties.resx | 9 + .../Controllers/ActivityController-Ajax.cs | 64 +++++- .../Online/Models/Model_Activity.cs | 9 + SaxoniteCoreWebOnline/Views/Home/Index.cshtml | 8 + .../wwwroot/css/sax-home.css | 53 +++++ .../wwwroot/img/icon/star-gold-2-24.png | Bin 0 -> 1135 bytes .../wwwroot/img/icon/star-gold-24.png | Bin 0 -> 1031 bytes .../wwwroot/img/icon/star-gold-3-24.png | Bin 0 -> 1147 bytes .../wwwroot/img/icon/star-gold-32.png | Bin 0 -> 1428 bytes .../wwwroot/img/icon/star-gold-48.png | Bin 0 -> 2235 bytes SaxoniteCoreWebOnline/wwwroot/js/sax-home.js | 65 ++++-- SaxoniteStandardBase/Base/App/Sax-Version.cs | 6 +- .../Base/App/SaxDbDfn_Core.cs | 18 +- .../Base/Bus/SaxActivityIndex.cs | 8 + .../Base/Bus/SaxUserActivity.cs | 98 ++++++++ .../Base/Consoles/SaxActivityConsole.cs | 36 ++- .../Base/Mgr/SaxActivityMgr-UserActivity.cs | 9 + .../Dbas/Internal/ActivityIndex_Db.cs | 2 +- .../Dbas/Internal/ItemImage_Db.cs | 2 +- .../Dbas/Internal/ItemSport_Db.cs | 2 +- .../Dbas/Internal/JournalistArticle_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 | 2 +- .../Dbas/Internal/UserAccount_Db.cs | 2 +- .../Dbas/Internal/UserActivity_Db.cs | 44 +++- .../Dbas/Internal/UserOrganisation_Db.cs | 2 +- .../Dbas/Internal/UserRole_Db.cs | 2 +- .../Dbas/Internal/UserSession_Db.cs | 2 +- .../Dbas/Internal/UserSport_Db.cs | 2 +- .../Mgr/SaxActivityMgr_Dbas-ActivityIndex.cs | 63 +++++- .../Mgr/SaxActivityMgr_Dbas-UserActivity.cs | 53 ++++- .../Resources/Database/SaxDbDfn_Core.xml | 168 +++++++++++++- 35 files changed, 875 insertions(+), 75 deletions(-) create mode 100644 SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-2-24.png create mode 100644 SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-24.png create mode 100644 SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-3-24.png create mode 100644 SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-32.png create mode 100644 SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-48.png diff --git a/SaxoniteCoreWeb/Base/Consoles/SaxActivityConsole_Web.cs b/SaxoniteCoreWeb/Base/Consoles/SaxActivityConsole_Web.cs index 7467a04..9b2a20d 100644 --- a/SaxoniteCoreWeb/Base/Consoles/SaxActivityConsole_Web.cs +++ b/SaxoniteCoreWeb/Base/Consoles/SaxActivityConsole_Web.cs @@ -8,6 +8,7 @@ using Saxonite.Base.App; using Saxonite.Net.Standard.Base.App; using Saxonite.Net.Standard.Base.Bus; using Saxonite.Net.Standard.Base.Consoles; +using Saxonite.Net.Standard.Dbas.Mgr; using System; using System.Collections.Generic; using System.Linq; @@ -20,7 +21,8 @@ namespace Saxonite.Net.Core.Web.Base.Consoles //------------------------------------------------------------------- // Data members. private readonly SaxInternals internals; - private readonly String alias_ActivityIndex = "ActIdx"; + private readonly String alias_ActivityIndex = SaxActivityMgr_Dbas.aliasActivityIndex; + private readonly String alias_ActivityIndex_UserActivity = SaxActivityMgr_Dbas.aliasActivityIndex_UserActivity; protected class IndexStatsData { public int EntriesInserted { get; set; } @@ -54,6 +56,11 @@ namespace Saxonite.Net.Core.Web.Base.Consoles public void SetBlurb(String blurb) { Blurb = blurb; } public void SetSport(SysId sportId, String sportName) { SportId = sportId; SportName = sportName; } public void SetRegion(SysId regionId, String regionName) { RegionId = regionId; RegionName = regionName; } + // User Activity. + public void SetLastListedAt(DateTime lastListedAt) { LastListedAt = lastListedAt; } + public void SetLastViewedAt(DateTime lastViewedAt) { LastViewedAt = lastViewedAt; } + public void SetReaction(Sax.ActivityReaction reaction) { Reaction = reaction; } + public void SetLastReactedAt(DateTime lastReactedAt) { LastReactedAt = lastReactedAt; } public static int CompareActivityIndices(ActivityData_Web item1, ActivityData_Web item2) { int effectiveCompare = item1.EffectiveOn.CompareTo(item2.EffectiveOn); @@ -64,6 +71,7 @@ namespace Saxonite.Net.Core.Web.Base.Consoles public override IndexResults QueryIndex(IndexContext context) { String fn = GetType().Name + ".QueryIndex"; + ClearErrorState(); IndexResults results = new IndexResults(); if (!context.IsValid()) return results; @@ -72,7 +80,7 @@ namespace Saxonite.Net.Core.Web.Base.Consoles ColumnDfn colItemId = internals.ActivityMgr.GetActivityIndexColumnDfn(SaxActivityIndex.Column.ItemId); String colDataNameEffectiveOn = "EffectiveOn"; - // Query the index. + // Query the Activity Index. ISacsDatabase db = SaxGlobals.App.GetCoreDatabase(SessionContext); DbQuery query = new DbQuery(db.DbmsType); query.Tables.Add(SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.ActivityIndex, false), alias_ActivityIndex); @@ -102,14 +110,17 @@ namespace Saxonite.Net.Core.Web.Base.Consoles Sax.DataItemType itemType = (Sax.DataItemType)values.GetLong(colItemType.DataName); ItemId itemId = new ItemId((short)itemType, new SysId(values.GetLong(colItemId.DataName))); DateTime effectiveOn = values.GetDate(colDataNameEffectiveOn); - activityDataList.Add(new ActivityData_Web(itemId, effectiveOn)); + ActivityData_Web activtyData = new ActivityData_Web(itemId, effectiveOn); + activityDataList.Add(activtyData); SaLogger.Info(fn + " Activity found - " + itemType.ToString() + ":" + SysId.ToString(itemId.Id) + ". Effective: " + DateUtil.Format(effectiveOn, "d-MMM-yyyy")); } } + + // Sort the activity list. activityDataList.Sort(ActivityData_Web.CompareActivityIndices); // Populate activity details. - PopulateActivityDetails(activityDataList); + PopulateActivityDetails(context, activityDataList); // ToDo Remove activities with blank caption. @@ -120,12 +131,64 @@ namespace Saxonite.Net.Core.Web.Base.Consoles //------------------------------------------------------------------- // Populate Activity Details. //------------------------------------------------------------------- - private void PopulateActivityDetails(List activities) + private void PopulateActivityDetails(IndexContext context, List activities) { - PopulateJournalistArticleDetails(activities); - PopulateOrganisationOpportunitiesDetails(activities); + PopulateUserActivityDetails(context, activities); + PopulateJournalistArticleDetails(context, activities); + PopulateOrganisationOpportunitiesDetails(context, activities); } - private void PopulateJournalistArticleDetails(List activities) + + //------------------------------------------------------------------- + private void PopulateUserActivityDetails(IndexContext context, List activities) + { + // Validate parameters. + if (!SysId.IsValid(context.UserAccountId)) return; + + // Extract article Ids. + List activityItemIds = activities.Select(item => new ItemId(item.ItemId.Type, item.ItemId.Id)).ToList(); + if (activityItemIds.IsEmpty()) return; + + // User Activity columns - limit to essential information. + ColumnDfn colItemType = Internals.ActivityMgr.GetUserActivityColumnDfn(SaxUserActivity.Column.ItemType); + ColumnDfn colItemId = Internals.ActivityMgr.GetUserActivityColumnDfn(SaxUserActivity.Column.ItemId); + ColumnDfn colUserAccountId = Internals.ActivityMgr.GetUserActivityColumnDfn(SaxUserActivity.Column.UserAccountId); + ColumnDfn colLastListedAt = Internals.ActivityMgr.GetUserActivityColumnDfn(SaxUserActivity.Column.LastListedAt); + ColumnDfn colLastViewedAt = Internals.ActivityMgr.GetUserActivityColumnDfn(SaxUserActivity.Column.LastViewedAt); + ColumnDfn colReaction = Internals.ActivityMgr.GetUserActivityColumnDfn(SaxUserActivity.Column.Reaction); + ColumnDfn colLastReactedAt = Internals.ActivityMgr.GetUserActivityColumnDfn(SaxUserActivity.Column.LastReactedAt); + List columns = new List() { colItemType, colItemId, colUserAccountId, colLastListedAt, colLastViewedAt, colReaction, colLastReactedAt }; + + // User Activity filter. + SaxUserActivity.Params prmUserActivity = new SaxUserActivity.Params(); + prmUserActivity.ItemIdsIncluded.AddRange(activityItemIds); + prmUserActivity.StatusCat = SaxUserActivity.StatusCat.ActiveOnly; + + using (DbResultSet dbResultSet = Internals.ActivityMgr.ExecuteUserActivityQuery(columns, prmUserActivity)) + { + while (dbResultSet != null && dbResultSet.NextRecord()) + { + NamedValue.Map values = dbResultSet.GetRecordValues(); + ItemId activityItemId = new ItemId((short)values.GetLong(colItemType.DataName), new SysId(values.GetLong(colItemId.DataName))); + DateTime lastListedAt = values.GetDateTime(colLastListedAt.DataName); + DateTime lastViewedAt = values.GetDateTime(colLastViewedAt.DataName); + Sax.ActivityReaction reaction = (Sax.ActivityReaction)values.GetLong(colReaction.DataName); + DateTime lastReactedAt = values.GetDateTime(colLastReactedAt.DataName); + + // Populate to corresponding activities. + foreach (ActivityData_Web activity in activities.FindAll(item => item.ItemId.Equals(activityItemId))) + { + activity.SetLastListedAt(lastListedAt); + activity.SetLastViewedAt(lastViewedAt); + activity.SetReaction(reaction); + activity.SetLastReactedAt(lastReactedAt); + } + } + } + } + + //------------------------------------------------------------------- + // Journalist Article details. + private void PopulateJournalistArticleDetails(IndexContext context, List activities) { // Extract article Ids. List articleIds = activities.FindAll(item => item.ItemId.Type == (int)Sax.DataItemType.JournalistArticle).Select(ItemId => ItemId.ItemId.Id).ToList(); @@ -170,7 +233,10 @@ namespace Saxonite.Net.Core.Web.Base.Consoles } } } - private void PopulateOrganisationOpportunitiesDetails(List activities) + + //------------------------------------------------------------------- + // Organisation Opportunity details. + private void PopulateOrganisationOpportunitiesDetails(IndexContext context, List activities) { // Extract opportunity Ids. List opportunityIds = activities.FindAll(item => item.ItemId.Type == (int)Sax.DataItemType.OrganisationOpportunity).Select(ItemId => ItemId.ItemId.Id).ToList(); @@ -222,11 +288,14 @@ namespace Saxonite.Net.Core.Web.Base.Consoles protected override bool StoreActivityIndexData(IndexData indexData, DbUpdateInfo dbUpdateInfo) { String fn = GetType().Name + ".StoreActivityIndexData"; + ClearErrorState(); + + // Validate paramaters. if (!ItemId.IsValid(indexData.ItemId)) return false; if (!ValidActivityItemTypes.Contains((Sax.DataItemType)indexData.ItemId.Type)) { SaLogger.Warn(fn + " Invalid item type specified for Activity Index: " + ((Sax.DataItemType)indexData.ItemId.Type).ToString()); - return false; + return SetErrorState("Invalid item type specified for Activity Index"); } IndexStatsData stats = new IndexStatsData(); @@ -287,6 +356,7 @@ namespace Saxonite.Net.Core.Web.Base.Consoles protected override bool ClearActivityIndex(ItemId itemId, DbUpdateInfo dbUpdateInfo) { String fn = GetType().Name + ".ClearActivityIndex"; + ClearErrorState(); String tableName = SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.ActivityIndex); String filter = SaxDbDfn_Core.GetColumnName(SaxDbDfn_Core.ColumnIdx.ActivityIndex_ItemType) + "=" + itemId.Type + @@ -297,6 +367,129 @@ namespace Saxonite.Net.Core.Web.Base.Consoles return true; } + //------------------------------------------------------------------- + // User Activities + //------------------------------------------------------------------- + /// + /// Record listing of activties 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'. + /// + public override bool RecordUserActivitiesListed(SysId userAccountId, List activityItemIds, DbUpdateInfo dbUpdateInfo) + { + String fn = GetType().Name + ".RecordUserActivitiesListed"; + if (!SysId.IsValid(userAccountId)) return SetErrorState("User Account must be specified"); + if (activityItemIds.IsEmpty()) return SetErrorState("Activity item ids must be specified"); + String sqlNow = "'" + DateUtil.FormatSqlDateTime(DateTime.Now) + "'"; + String sqlStatus = "'" + SacsSystem.GetStatusCode(SaxUserActivity.DefaultStatus) + "'"; + + // Merge query - insert missing user activities and update existing. + List query = new List() + { + "Merge", + "\tInto " + SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.UserActivity) + " As UsrAct", + // Virtual table defining Activity Item Ids currently listed. + "\tUsing", + "\t(", + "\t\tSelect ItemType, ItemId From (Select 0 ItemType, 0 ItemId" + activityItemIds.Select(item => " Union Select " + item.Type.ToString() + ", " + item.Id.ToString()).ToList().Concat("", " ") + ") Dat Where Dat.ItemType>0 And Dat.ItemId>0", + "\t) As Act", + "\tOn UsrAct.UserAccountId="+userAccountId.ToString() + " And UsrAct.ItemType=Act.ItemType And UsrAct.ItemId=Act.ItemId", + // Matched - Update the User Activity to indicate 'Currently listed' and update the last listed date/time. + "\tWhen Matched Then", + "\t\tUpdate Set CurrentlyListed=1, ListedAtLast=" + sqlNow + ", Status=" + sqlStatus + ", UpdateOn=" + sqlNow + ", UpdateBy=" + dbUpdateInfo.UserId.ToString() + ", UpdateHost='" + dbUpdateInfo.Host + "'", + // Not Matched By Target - Insert the User Activity and indicate 'Currently listed' with first and last listed date/times. + "\tWhen Not Matched Then", + "\t\tInsert", + "\t\t\t(UserAccountId, ItemType, ItemId, CurrentlyListed, ListedAtFirst, ListedAtLast, Reaction, UserActivityData, Notes, Flags, Status, CreateOn, CreateBy, CreateHost, UpdateOn, UpdateBy, UpdateHost)", + "\t\t\tValues ("+userAccountId.ToString()+", Act.ItemType, Act.ItemId, 1, " + sqlNow + ", " + sqlNow + ", 0, '', '', 0, " + sqlStatus + ", " + sqlNow + ", " + dbUpdateInfo.UserId.ToString() + ", '" + dbUpdateInfo.Host + "', " + sqlNow + ", " + dbUpdateInfo.UserId.ToString() + ", '" + dbUpdateInfo.Host + "')", + // Not Matched By Source - Update the User Activity to indicate 'Not currently listed'. + "\tWhen Not Matched By Source And UsrAct.UserAccountId=" + userAccountId.ToString() + " And CurrentlyListed=1 Then", + "\t\tUpdate Set CurrentlyListed=0, UpdateOn=" + sqlNow + ", UpdateBy=" + dbUpdateInfo.UserId.ToString() + ", UpdateHost='" + dbUpdateInfo.Host + "'", + ";" + }; + String sql = query.Concat("\n"); + //SaLogger.Debug(fn + " Query:\n" + sql); + ISacsDatabase db = SaxGlobals.App.GetCoreDatabase(SessionContext); + int rows = db.ExecuteNonQuery(sql); + if (db.HasErrorState()) + SaLogger.Debug(fn + " Database error: " + db.ErrorStateMessage); + SaLogger.Debug(fn + " Rows modified: " + rows); + + return true; + } + + //------------------------------------------------------------------- + public override bool RecordUserActivityViewed(SysId userAccountId, ItemId activityItemId, DbUpdateInfo dbUpdateInfo) + { + String fn = GetType().Name + ".RecordUserActivityViewed"; + if (!SysId.IsValid(userAccountId)) return SetErrorState("User Account must be specified"); + if (!ItemId.IsValid(activityItemId)) return SetErrorState("Activity item id must be specified"); + DateTime now = DateTime.Now; + + SaxUserActivity userActivity = internals.ActivityMgr.GetUserActivityForUserItem(userAccountId, activityItemId); + if (userActivity != null) + { + // Update activity. + userActivity.CurrentlyListed = true; + if (!DateUtil.IsValid(userActivity.ViewedAtFirst)) + userActivity.ViewedAtFirst = now; + userActivity.ViewedAtLast = now; + userActivity.Status = SaxUserActivity.DefaultStatus; + if (!internals.ActivityMgr.UpdateUserActivity(userActivity, dbUpdateInfo)) + { + SaLogger.Warn(fn + " Failed to update User Activity for viewing: " + internals.ActivityMgr.ErrorStateMessage); + return SetErrorState(internals.ActivityMgr.ErrorStateMessage); + } + } + else + { + SaLogger.Warn(fn + " User Activity not found. UserAccountId: " + userAccountId.ToString() + ". Item Type: " + (Sax.DataItemType)activityItemId.Type + ". ItemId: " + activityItemId.Id.ToString() + "."); + return SetErrorState("User Activity not found"); + } + + return true; + } + + //------------------------------------------------------------------- + public override bool RecordUserActivityReaction(SysId userAccountId, ItemId activityItemId, Sax.ActivityReaction activityReaction, DbUpdateInfo dbUpdateInfo) + { + String fn = GetType().Name + ".RecordUserActivityReaction"; + if (!SysId.IsValid(userAccountId)) return SetErrorState("User Account must be specified"); + if (!ItemId.IsValid(activityItemId)) return SetErrorState("Activity item id must be specified"); + DateTime now = DateTime.Now; + + SaxUserActivity userActivity = internals.ActivityMgr.GetUserActivityForUserItem(userAccountId, activityItemId); + if (userActivity != null) + { + if (userActivity.Reaction != activityReaction) + { + // Update activity. + userActivity.CurrentlyListed = true; + if (!DateUtil.IsValid(userActivity.ViewedAtFirst)) + userActivity.ViewedAtFirst = now; + userActivity.ViewedAtLast = now; + userActivity.Reaction = activityReaction; + if (!DateUtil.IsValid(userActivity.ReactedAtFirst)) + userActivity.ReactedAtFirst = now; + userActivity.ReactedAtLast = now; + userActivity.Status = SaxUserActivity.DefaultStatus; + if (!internals.ActivityMgr.UpdateUserActivity(userActivity, dbUpdateInfo)) + { + SaLogger.Warn(fn + " Failed to update User Activity with reaction: " + internals.ActivityMgr.ErrorStateMessage); + return SetErrorState(internals.ActivityMgr.ErrorStateMessage); + } + } + } + else + { + SaLogger.Warn(fn + " User Activity not found. UserAccountId: " + userAccountId.ToString() + ". Item Type: " + (Sax.DataItemType)activityItemId.Type + ". ItemId: " + activityItemId.Id.ToString() + "."); + return SetErrorState("User Activity not found"); + } + + return true; + } + //------------------------------------------------------------------- } //======================================================================= diff --git a/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx b/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx index 895847b..be7962b 100644 --- a/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx +++ b/SaxoniteCoreWebOnline/Localisation/SaxOnlineProperties.resx @@ -234,12 +234,18 @@ Email address + + Excellent + First name Forgotten password? + + Good + Headline @@ -357,6 +363,9 @@ update + + Very Good + Yes diff --git a/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs b/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs index 0852391..b458a74 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/ActivityController-Ajax.cs @@ -41,6 +41,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers public String Blurb { get; set; } public String Sport { get; set; } public String Region { get; set; } + public int Reaction { get; set; } public String PublishedOnFmt { get; set; } } /// Article activity info. @@ -124,7 +125,8 @@ namespace Saxonite.Net.Core.Web.Online.Controllers SaxSessionData_Online sessionData = SessionData_Online; // User context. - SaxActivityConsole.IndexContext indexContext = new SaxActivityConsole.IndexContext(); + SysId userAccountId = SessionData.User.UserAccountId; + SaxActivityConsole.IndexContext indexContext = new SaxActivityConsole.IndexContext(userAccountId); // Regions. if (SysId.IsValid(sessionData.User.RegionIdProvince)) @@ -136,9 +138,11 @@ namespace Saxonite.Net.Core.Web.Online.Controllers indexContext.SportIds.AddRange(sessionData.Profile.Sports.Select(item => item.SportId)); // Populate activities. + List activityItemIds = new List(); SaxActivityConsole.IndexResults indexResults = ActivityConsole.QueryIndex(indexContext); foreach (SaxActivityConsole.IndexResults.ActivityData itemData in indexResults.Items) { + activityItemIds.Add(itemData.ItemId); ActivityResponseData activityData = new ActivityResponseData(); activityData.ItemType = itemData.ItemId.Type; if (itemData.ItemId.Type == (int)Sax.DataItemType.JournalistArticle) @@ -151,10 +155,14 @@ namespace Saxonite.Net.Core.Web.Online.Controllers activityData.Blurb = itemData.Blurb; activityData.Sport = Localiser.GetSportName(itemData.SportId, itemData.SportName); activityData.Region = Localiser.GetRegionName(itemData.RegionId, itemData.RegionName); + activityData.Reaction = (int)itemData.Reaction; activityData.PublishedOnFmt = Localiser.FormatDate(itemData.EffectiveOn); responseData.Activities.Add(activityData); } + if (!activityItemIds.IsEmpty()) + ActivityConsole.RecordUserActivitiesListed(userAccountId, activityItemIds, DbUpdateInfo); + // Complete response. responseData.Success = true; return Json(responseData); @@ -186,7 +194,6 @@ namespace Saxonite.Net.Core.Web.Online.Controllers if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData); SaxSessionData_Online sessionData = SessionData_Online; - String logSuffix = " User: " + sessionData.User.EmailAddress; // Identify activity. Sax.DataItemType itemType = (Sax.DataItemType)StringUtil.ToShort(model.ActivityType); @@ -221,11 +228,64 @@ namespace Saxonite.Net.Core.Web.Online.Controllers responseData.Opportunity = new ActivityResponseData_Opportunity(model, opportunity); } + // Record activty viewing. + if (!ActivityConsole.RecordUserActivityViewed(SessionData.User.UserAccountId, new ItemId((short)itemType, itemId), DbUpdateInfo)) + { + SaLogger.Warn(fn + " Failed to record Activity Viewing: " + ActivityConsole.ErrorStateMessage + "." + getLogSuffix()); + return Json(responseData); + } + // Complete response. responseData.Success = true; return Json(responseData); } + //------------------------------------------------------------------- + // Activity Reaction. + //------------------------------------------------------------------- + public class AjaxResponse_ActivityReaction : AjaxResponse_Base + { + public int Reaction { get; set; } + } + //------------------------------------------------------------------- + [HttpPost] + [Route("Activity/Ajax/React")] + [Route("Activity/Ajax/Reaction")] + public IActionResult Ajax_SetActivityReaction(Model_Activity model) + { + String fn = GetType().Name + ".Ajax_SetActivityReaction"; + String messageTitle = Localiser["activity.caption.activity"]; + AjaxResponse_ActivityReaction responseData = new AjaxResponse_ActivityReaction(); + + // Validate session and referrer. + if (!ValidReferer) + return Forbid(); + if (!ValidUserSession) + return GetAjaxResult_InvalidSession(responseData); + SaxSessionData_Online sessionData = SessionData_Online; + + // Identify activity. + Sax.DataItemType itemType = (Sax.DataItemType)StringUtil.ToShort(model.ActivityType); + SysId itemId = model.ActivityIdx.ToSysId(); + if (itemType <= 0 || !SysId.IsValid(itemId)) + { + SaLogger.Warn(fn + " Activity type/Id inncorrectly specified." + getLogSuffix()); + return Json(responseData); + } + + // Record activity reaction. + if (!ActivityConsole.RecordUserActivityReaction(SessionData.User.UserAccountId, new ItemId((short)itemType, itemId), model.GetActivityReaction(), DbUpdateInfo)) + { + SaLogger.Warn(fn + " Failed to record Activity Reaction: " + ActivityConsole.ErrorStateMessage + "." + getLogSuffix()); + return Json(responseData); + } + + // Complete response. + responseData.Reaction = (int)model.GetActivityReaction(); + responseData.Success = true; + return Json(responseData); + } + //------------------------------------------------------------------- } //======================================================================= diff --git a/SaxoniteCoreWebOnline/Online/Models/Model_Activity.cs b/SaxoniteCoreWebOnline/Online/Models/Model_Activity.cs index c5eecad..11c1fe3 100644 --- a/SaxoniteCoreWebOnline/Online/Models/Model_Activity.cs +++ b/SaxoniteCoreWebOnline/Online/Models/Model_Activity.cs @@ -4,6 +4,7 @@ using Saxonite.Base.App; using Saxonite.Net.Core.Web.Base.App; using Saxonite.Net.Core.Web.Base.Controllers; using Saxonite.Net.Core.Web.Base.Models; +using Saxonite.Net.Standard.Base.App; using System; using System.Collections.Generic; using System.Linq; @@ -33,6 +34,14 @@ namespace Saxonite.Net.Core.Web.Online.Models // ToDo Replace Type + Idx (Id) with Idx and cross-reference stored in Session data. public String ActivityType { get; set; } public String ActivityIdx { get; set; } + public String ActivityReaction{ get; set; } + public Sax.ActivityReaction GetActivityReaction() + { + Sax.ActivityReaction reaction = EnumUtil.ParseEnum(ActivityReaction, Sax.ActivityReaction.Unknown); + if (reaction <= 0 && StringUtil.IsNumeric(ActivityReaction)) + reaction = (Sax.ActivityReaction)StringUtil.ToShort(ActivityReaction); + return reaction; + } //------------------------------------------------------------------- } diff --git a/SaxoniteCoreWebOnline/Views/Home/Index.cshtml b/SaxoniteCoreWebOnline/Views/Home/Index.cshtml index 6c936ee..de77341 100644 --- a/SaxoniteCoreWebOnline/Views/Home/Index.cshtml +++ b/SaxoniteCoreWebOnline/Views/Home/Index.cshtml @@ -63,6 +63,14 @@ else } + @* Activity React form - to record reaction to the selected activity. *@ + @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmActivityReact", @class = "", @action = "#", onsubmit = "return false;" })) + { + + + + } + @* Activity popup dialog with details. *@
diff --git a/SaxoniteCoreWebOnline/wwwroot/css/sax-home.css b/SaxoniteCoreWebOnline/wwwroot/css/sax-home.css index 3cf1ef7..5711a05 100644 --- a/SaxoniteCoreWebOnline/wwwroot/css/sax-home.css +++ b/SaxoniteCoreWebOnline/wwwroot/css/sax-home.css @@ -2,6 +2,29 @@ Home stylesheet. */ +.sax-panel-item.Activity .sax-header +{ + background-repeat: no-repeat; + background-position: right 4px center; +} + +.sax-panel-item.Activity.sax-activity-reaction-1 .sax-header +{ + background-image: URL("../img/icon/star-gold-24.png"); +} + +.sax-panel-item.Activity.sax-activity-reaction-2 .sax-header +{ + background-image: URL("../img/icon/star-gold-2-24.png"); +} + +.sax-panel-item.Activity.sax-activity-reaction-3 .sax-header +{ + background-image: URL("../img/icon/star-gold-3-24.png"); +} + +/* Activity Details */ + #dlgActivity.ui-dialog-content.ui-widget-content { padding: 4px 4px 0 4px; @@ -46,4 +69,34 @@ { } +.ui-dialog.sax-dialog-activity button.ActivityReaction +{ + min-width: 80px; + color: transparent; + background-color: transparent; + background-position: center center; + background-repeat: no-repeat; +} + +.ui-dialog.sax-dialog-activity button.ActivityReaction.sax-selected +{ + border-color: #d4af37; + box-shadow: 0 0 2px 2px #d4af37 inset; +} + +.ui-dialog.sax-dialog-activity button.ActivityReaction1 +{ + background-image: url("../img/icon/star-gold-24.png"); +} + +.ui-dialog.sax-dialog-activity button.ActivityReaction2 +{ + background-image: url("../img/icon/star-gold-2-24.png"); +} + +.ui-dialog.sax-dialog-activity button.ActivityReaction3 +{ + background-image: url("../img/icon/star-gold-3-24.png"); +} + /* The End */ diff --git a/SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-2-24.png b/SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-2-24.png new file mode 100644 index 0000000000000000000000000000000000000000..9052c1f3e20a04f885817c3440760f983be59b89 GIT binary patch literal 1135 zcmV-#1d#iQP)o_m000SaNLh0L01EH`01EH{Laa2H00004XF*Lt006O%3;baP000C2Nklow$-c5PlerJ??AlUrm(FfxbYQr{ zopV3ue9yV(&H%Jm_$=01Q?1TT3l zpk2Nz0gH>T1Sz#f2r&?2jyLrDG|CD=kWJVMc^r0nuazf@ zou7Pk(;#tLxt}-Cw;Z}t5EZ6IwgS%@gtdD?5F~`{O1Zo;8_F)7Gx{HRAsh_fjcjaN zOPLhb7Z*?_la{#?nKLd>gkKvStIXb>HNW`ib|>*T$N@unpBuf))z|t%5M&mP^l@kR zfg}p$LLpZ%*1A+(UqHF+lEN4Z)XQ2sKRzs2#rKXM2dh!({otcUj%KEmJ$(3zJL#?& z2@=*K{n)THBb(I=7~^~LH%tlR`ccQ(c>&SU17qc%+%%q-eALXz>?CZGy9R&k>>7L| zto4a&Yc@lk`+|I* z26(lFvu93&WttKpOu0N)piW{UDiV9U@y7j`YOa;wz2r9)U>1*UW59Me&&lL0@Fo)L zTPbig&4m?2s4C7_>|KJ#Jvm&d!H#fJRnLZ`k_H~rWAzX2KaaGJ%aw5O~Z_%`gxAwu}jWmKFEk#-*h;8E;*N+eQ})`QYDUQ2Br&!eb}@1 z|F_qF?FG#rU4{DUXXwsyeWWEX^(iHZ9 z*vm^|=0f@(Pf63(oE1b@9PTurlALNAfHzHHGhupq3g>_mtj5IwI))8>3%^mA$bT(x znK1}Z6Zrd>ayE#2GeJPK%a*)~@3ZfZ zUzNd41N=Zv<;+DgKcB_3;slRWb{`pA$*leV+R^%-wpSU#YTmC@<>+!ncK8N1{U^%i z;WOWyyuEnx6XTg1<$nH=@${FUcID3ge9NUxRZuP;>CId`Z`Wx3q0ttDvp!xOuT5}D zAI+E4x%4mUt{dKd`lrWxV1ohNAjqk&^sVbR{|3nMx$Jh~|Lgz&002ovPDHLkV1nkV B=+XcH literal 0 HcmV?d00001 diff --git a/SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-3-24.png b/SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-3-24.png new file mode 100644 index 0000000000000000000000000000000000000000..f220d95e8c07109ad165f0abd88e31a92adf55d6 GIT binary patch literal 1147 zcmV->1cdvEP)k}kKct!6&2G~s`^wHt<~}^Lv8CWHorNvzbYPjg zch3Esd%pMHbA|zE;u7M`P~rrHni=DFzSNAdUDihAO@X~PD}Z+7HzklH$cqw?=WkX3 z?a22mP(D8%5dix@z)0$6&{{qDcIA5(s8f?i2!S9Fh}e<9Q>_l5UHP5`5`xA#qv!(! zC-6e6187&iCxI3hUkY+=k1%EuAzW|d*~v*zS~dB0=6ez-7S#4~W=9ycNexd(ET(9? zS`|P$^F0Z~s1;|-#=U8RyG7kT!9~lCK|Ax6%-rxBTJZLl^^O4sgfIj!mx(&#U0@$D zvyy$1GYiRhddY@^j@b77c5&DJ^`Jsgd#oY%gtw`Hb4t)sjijgEzTUx#j9F}*xK`W1Wlf}wn~iAd@f53<046C49l_X zcV0bQ{K9?aXFj=VkUXi~g9+?ggzl7NO+=#G09OUV`duJN3ZYJ=Twa|G<(AHv{r5f> z4uO23nZJ(sOUsR#yL*tE2CqT+3Q!uuY7X7lSBg4fT_KYM(?7!wfrPW zst8B>(AnLf$Wpmb$XCquu83hQkbG`Q6G8+wwq>n8d|0rH?;Sk~cD=3ZM?R_NXl6>= zgSW5HNq5aiQm7v7r>3o&xtvj;l-{{~#ZoBUD3!=wmIxm`FjoG_OXBkrpEPnZI|-ZB zuE8HWy9OT$>wWV2x&spvKM3kr*3g47g%CTivRW0FuQ;id0^4(7th(f7@_yqtEc4rU z!{y%oeL+0O0o<+9=~E}cwk(A)pFFupoD*CP6JMZ?U_yHv+XyD|KMP!D3><{G z-&h*vGe7g|3M8uI+wk_t*)xAasZ?~~Nd|QI;9I3*`1^!%HiUgMjzhGIS$Q4nWA9(T zD?^?q?<0O)fow;Pr;SB2KcB*};usGUcODvBOJ05c`r*po1*(4sUr+>Ze!mY^v-ws+{KGdB&f3{Gjl?O&W zyqLW`%Y&{rH|>fu{W8_ zIrrSX_u6Z(bM^sP#l!grmW~dvtj3418e>C=JyR;mJ6GdlRp>b(FB9Mz4$rPR1DqeQ z;@=AlNMn0Dh-(f&O;qmY0A50%d}FoTu;u^+LVQ2~2nQ}OzJE;tnCj<1UIcE&&uZZ% z&P_OL1R$e~?&4H0V@$&eAOnP~zk1&Cd&2!uz*$MtY%FhI=h(-W{Bx7o`+D)H7yF3ox<36xED#(AqG9wy|WJ1AyG87sV zrZX8kz8(OeuQvIUomn>K8uWHR2@~bdk<+GpP>WQ8U~02q?9QrLFzKnGsG1%r8ymT- zR8(zumsM`b>WQK-#zsdn!QcQ1hl3Vf(;aho_@1WWP|Mp&e6}15(bXG}USS}7iP1cB z--{Oe95B^18NZ%N#DjWu&9k=Qp&>088XzOXA(>L&^< z>xcl~U`ci?s9uXhbC+(3g@?xm`}#&7(hcfe&=H4jPK|@jN2YEpD9EMMYTkCrEb@m~ zlJ^jZh?*qKVT`L9xztMCmn%KIj%sUaA;$x9%abnUC83PfsHoL>gct&~m z=uuD?i?OT*^7p0c#`1f%eCKr6iJ~Y;=DV9Wud7%7yd-0s>6#7BOwD@RI>S)G&{YUFVcUaD zIhoQl=kek}&q|`Uxyi5mRH&v+t;wGSqHjj7&IZGh)iB7`%NO9@LU!{WU3qJ7$1j`J z)2BQqR&wRWy+}^CdEWW)Ov%L6fPA=U0Dqisc>heB=dq#IPa#TC6BfP3bfs5L0i$(O$8@xYLjkjC18Bu z11d%Rg80CPNlXlB64NM16-Z1#zigx=ZPN6)rO8UOEROBGoWzc=?Q8qK&f$Nqr?o~h^mx%VuKMtX817p@P%>1h9aQEUf&I%w*zwK z37~+!cKbtAyNTEk&Qa{_>hN{**0m5mGKmZe}0|6bQvJXG zW*MEI#E7}TPAtNa)mqmQ7&!F9qOvEeF}4~UhYVQ3Fjr^4?87l6*r4V-yH5>%M$SOQ zfUav^$7SEK6lj`Zbjm`=>}HvxxOC@FHR<5)M**(tN#ntT2VUHN9TjQR^_HV>>q|~o zEh;S9ia1Wd`6?tv(wmTnD}jI=(G&p+vm@RsA)ru^mJ@9yv}Q*G<~U2Wuvo8Oi!i+} zwID|wgz8H|Q{ZQziC@v*z( zJa4b8`vRQrg@Rdw047}uPY1nT5B7S8I3Q5A1Ubkdbh4>c`s-pimv!fzc2r@()^|Yc z=yG1S*(+u|Q;V#&VpFH0gvMgi_bVsH?@ey4t1pFo5?ORWNQAt;K?I-$C8?BSyc`DF zuItM8Uw$p=UrHjUWcsLGJPXG86|7}jL6nNNQj?6+RfmWk9+SdjK`hj|yhER1zu#xq zb-jG0^_X{{2wZS{7`gD`C04SR9ywQoI~~Gq9&s0e#LgVVb(^Cy%8NDALmtnkNmbhy z3ML(p)+-qR!70Lrk#VA_C3ZCzTzS>|Tkj)>SR(!gQtIR)@oHG@<+7_}2Q4bu4zVs; zFJJzfrX=O*XZCI`0#M>)P*%q$6MR@QtWYEtGy*69e~}43`Rc3Ebgr24Zdh#G>ku0V z#lHs*#Zc4Zg~dCNt7ID%poOG>P}<#nEjHx&%n6r~5|=f(=c}cqhM`*s(U7L9T5wvW zQz3(k#3)B7NuL(eK38Si%m@%eL&nUnrs*UaGhYAZk;GdMgX5t$bLCaL_6uT>BO81?F6%eCuZijE zLTA<(^hQf%Sqm-zz)`NqNe(?Mjz`&zE_mApZJu^^wu4o*%=k{NL9w;3KgxqhBKtWY zS?}va_Qysb5k6f9N%&Ou{3m@qbZT;9esbcuH57#u4|w7d%{n81vkJq8_?^c_fX9}G z?9iE=vj6! z+0U*GI1zVVYlq*tcR#EH!(QfM5=WkLw?sSB^UWuv+nhssno#l%r8J`gVPVkEi=ZlQ z{=>Me%wj#bW&|{fUq~M`KK|%73Ww(+fNdGz4D4=hkxsOg6%jq(j4Gkiuzhf#n3{n<%qPF;`{dzxFL@2#Z3-6CB=SlI*H z<@WTP6y?f;VSXxQ2z;EL%N+9|{D RegionIdsIncluded { get; } = new List(); public DateTime EffectiveFrom { get; set; } public DateTime EffectiveTo { get; set; } + /// User Account - to include User Activity data in result. + public SysId UserAccountId { get; set; } // Table aliases - blank if not linked. public String Alias_ActivityIndex { get; set; } } diff --git a/SaxoniteStandardBase/Base/Bus/SaxUserActivity.cs b/SaxoniteStandardBase/Base/Bus/SaxUserActivity.cs index de180f5..22f2710 100644 --- a/SaxoniteStandardBase/Base/Bus/SaxUserActivity.cs +++ b/SaxoniteStandardBase/Base/Bus/SaxUserActivity.cs @@ -30,6 +30,13 @@ namespace Saxonite.Net.Standard.Base.Bus ItemType_Code, ItemType_Desc, ItemId, + FirstListedAt, + LastListedAt, + FirstViewedAt, + LastViewedAt, + Reaction, + FirstReactedAt, + LastReactedAt, // Associated data. // Common. Notes, @@ -47,7 +54,14 @@ namespace Saxonite.Net.Standard.Base.Bus { public SysId UserAccountId { get; set; } public ItemId ItemId { get; set; } + public bool CurrentlyListed {get; set; } + public DateTime ListedAtFirst { get; set; } + public DateTime ListedAtLast { get; set; } + public DateTime ViewedAtFirst { get; set; } + public DateTime ViewedAtLast { get; set; } public Sax.ActivityReaction Reaction { get; set; } + public DateTime ReactedAtFirst { get; set; } + public DateTime ReactedAtLast { get; set; } public String UserActivityData { get; set; } } @@ -73,11 +87,46 @@ namespace Saxonite.Net.Standard.Base.Bus get { return data.ItemId; } set { CheckChanged(data.ItemId, value); data.ItemId = value; } } + public bool CurrentlyListed + { + get { return data.CurrentlyListed; } + set { CheckChanged(data.CurrentlyListed, value); data.CurrentlyListed = value; } + } + public DateTime ListedAtFirst + { + get { return data.ListedAtFirst; } + set { CheckChanged(data.ListedAtFirst, value); data.ListedAtFirst = value; } + } + public DateTime ListedAtLast + { + get { return data.ListedAtLast; } + set { CheckChanged(data.ListedAtLast, value); data.ListedAtLast = value; } + } + public DateTime ViewedAtFirst + { + get { return data.ViewedAtFirst; } + set { CheckChanged(data.ViewedAtFirst, value); data.ViewedAtFirst = value; } + } + public DateTime ViewedAtLast + { + get { return data.ViewedAtLast; } + set { CheckChanged(data.ViewedAtLast, value); data.ViewedAtLast = value; } + } public Sax.ActivityReaction Reaction { get { return data.Reaction; } set { CheckChanged((int)data.Reaction, (int)value); data.Reaction = value; } } + public DateTime ReactedAtFirst + { + get { return data.ReactedAtFirst; } + set { CheckChanged(data.ReactedAtFirst, value); data.ReactedAtFirst = value; } + } + public DateTime ReactedAtLast + { + get { return data.ReactedAtLast; } + set { CheckChanged(data.ReactedAtLast, value); data.ReactedAtLast = value; } + } public String UserActivityData { get { return data.UserActivityData; } @@ -88,7 +137,14 @@ namespace Saxonite.Net.Standard.Base.Bus { UserAccountId = data.UserAccountId; ItemId = data.ItemId; + CurrentlyListed = data.CurrentlyListed; + ListedAtFirst = data.ListedAtFirst; + ListedAtLast = data.ListedAtLast; + ViewedAtFirst = data.ViewedAtFirst; + ViewedAtLast = data.ViewedAtLast; Reaction = data.Reaction; + ReactedAtFirst = data.ReactedAtFirst; + ReactedAtLast = data.ReactedAtLast; UserActivityData = data.UserActivityData; base.PopulateFrom(data); } @@ -107,7 +163,14 @@ namespace Saxonite.Net.Standard.Base.Bus // Identifies the field that has invalid data. public ValidValue UserAccountId { get; set; } = ValidValue.Valid; public ValidValue ItemId { get; set; } = ValidValue.Valid; + public ValidValue CurrentlyListed { get; set; } = ValidValue.Valid; + public ValidValue ListedAtFirst { get; set; } = ValidValue.Valid; + public ValidValue ListedAtLast { get; set; } = ValidValue.Valid; + public ValidValue ViewedAtFirst { get; set; } = ValidValue.Valid; + public ValidValue ViewedAtLast { get; set; } = ValidValue.Valid; public ValidValue Reaction { get; set; } = ValidValue.Valid; + public ValidValue ReactedAtFirst { get; set; } = ValidValue.Valid; + public ValidValue ReactedAtLast { get; set; } = ValidValue.Valid; public ValidValue UserActivityData { get; set; } = ValidValue.Valid; } @@ -175,11 +238,46 @@ namespace Saxonite.Net.Standard.Base.Bus get { return data.ItemId; } protected set { data.ItemId = value; } } + public bool CurrentlyListed + { + get { return data.CurrentlyListed; } + set { data.CurrentlyListed = value; } + } + public DateTime ListedAtFirst + { + get { return data.ListedAtFirst; } + set { data.ListedAtFirst = value; } + } + public DateTime ListedAtLast + { + get { return data.ListedAtLast; } + set { data.ListedAtLast = value; } + } + public DateTime ViewedAtFirst + { + get { return data.ViewedAtFirst; } + set { data.ViewedAtFirst = value; } + } + public DateTime ViewedAtLast + { + get { return data.ViewedAtLast; } + set { data.ViewedAtLast = value; } + } public Sax.ActivityReaction Reaction { get { return data.Reaction; } set { data.Reaction = value; } } + public DateTime ReactedAtFirst + { + get { return data.ReactedAtFirst; } + set { data.ReactedAtFirst = value; } + } + public DateTime ReactedAtLast + { + get { return data.ReactedAtLast; } + set { data.ReactedAtLast = value; } + } public String UserActivityData { get { return data.UserActivityData; } diff --git a/SaxoniteStandardBase/Base/Consoles/SaxActivityConsole.cs b/SaxoniteStandardBase/Base/Consoles/SaxActivityConsole.cs index 8bc90a4..865cd34 100644 --- a/SaxoniteStandardBase/Base/Consoles/SaxActivityConsole.cs +++ b/SaxoniteStandardBase/Base/Consoles/SaxActivityConsole.cs @@ -15,7 +15,7 @@ namespace Saxonite.Net.Standard.Base.Consoles // to identifying the activities that are relevant to a User or other context // that defines at least one region/sport combination and an effective date (usually today). //======================================================================= - public abstract class SaxActivityConsole : SacsDisposable + public abstract class SaxActivityConsole : SaErrorStateItem { //------------------------------------------------------------------- // Definitions. @@ -24,6 +24,11 @@ namespace Saxonite.Net.Standard.Base.Consoles /// public class IndexContext { + public IndexContext (SysId userAccountId) + { + UserAccountId = userAccountId; + } + public SysId UserAccountId { get; } public List SportIds { get; } = new List(); public List RegionIds { get; } = new List(); // Default period is ~3 months up to today. @@ -55,10 +60,15 @@ namespace Saxonite.Net.Standard.Base.Consoles public DateTime EffectiveOn { get; } public String Caption { get; protected set; } public String Blurb { get; protected set; } - public SysId SportId{ get; protected set; } - public String SportName{ get; protected set; } + public SysId SportId { get; protected set; } + public String SportName { get; protected set; } public SysId RegionId { get; protected set; } - public String RegionName{ get; protected set; } + public String RegionName { get; protected set; } + // User Activity. + public DateTime LastListedAt { get; protected set; } + public DateTime LastViewedAt { get; protected set; } + public Sax.ActivityReaction Reaction { get; protected set; } + public DateTime LastReactedAt { get; protected set; } } public List Items { get; } = new List(); } @@ -105,6 +115,8 @@ namespace Saxonite.Net.Standard.Base.Consoles /// public bool StoreActivityIndex(SaxJournalistArticle article, DbUpdateInfo dbUpdateInfo) { + ClearErrorState(); + // Only active articles have an activity index. if (!article.IsStatusActive) ClearActivityIndex(article.GetItemId(), dbUpdateInfo); @@ -128,6 +140,8 @@ namespace Saxonite.Net.Standard.Base.Consoles /// public bool StoreActivityIndex(SaxOrganisationOpportunity opportunity, DbUpdateInfo dbUpdateInfo) { + ClearErrorState(); + // Only active opportunities have an activity index. if (!opportunity.IsStatusActive) ClearActivityIndex(opportunity.GetItemId(), dbUpdateInfo); @@ -209,16 +223,15 @@ namespace Saxonite.Net.Standard.Base.Consoles } //------------------------------------------------------------------- + // Activity Index data. protected abstract bool StoreActivityIndexData(IndexData indexData, DbUpdateInfo dbUpdateInfo); - - //------------------------------------------------------------------- protected abstract bool ClearActivityIndex(ItemId itemId, DbUpdateInfo dbUpdateInfo); //------------------------------------------------------------------- - // Utilities. - //------------------------------------------------------------------- + // Activity Index Utilities. protected List GetEntriesForIndex(IndexData indexData) { + ClearErrorState(); List indexEntries = new List(); if (ItemId.IsValid(indexData.ItemId) && DateUtil.IsValid(indexData.EffectiveOn)) { @@ -235,6 +248,13 @@ namespace Saxonite.Net.Standard.Base.Consoles return indexEntries; } + //------------------------------------------------------------------- + // User Activities + //------------------------------------------------------------------- + public abstract bool RecordUserActivitiesListed(SysId userAccountId, List activityItemIds, DbUpdateInfo dbUpdateInfo); + public abstract bool RecordUserActivityViewed(SysId userAccountId, ItemId activityItemId, DbUpdateInfo dbUpdateInfo); + public abstract bool RecordUserActivityReaction(SysId userAccountId, ItemId activityItemId, Sax.ActivityReaction activityReaction, DbUpdateInfo dbUpdateInfo); + //------------------------------------------------------------------- } //======================================================================= diff --git a/SaxoniteStandardBase/Base/Mgr/SaxActivityMgr-UserActivity.cs b/SaxoniteStandardBase/Base/Mgr/SaxActivityMgr-UserActivity.cs index 51a2dba..da962ff 100644 --- a/SaxoniteStandardBase/Base/Mgr/SaxActivityMgr-UserActivity.cs +++ b/SaxoniteStandardBase/Base/Mgr/SaxActivityMgr-UserActivity.cs @@ -26,6 +26,15 @@ namespace Saxonite.Net.Standard.Base.Mgr //------------------------------------------------------------------- // Retrieve individual items. public abstract SaxUserActivity GetUserActivity(SaxUserActivity.Params prmUserActivity); + public SaxUserActivity GetUserActivityForUserItem(SysId userAccountId, ItemId itemId) + { + if (!SysId.IsValid(userAccountId) || !ItemId.IsValid(itemId)) return null; + SaxUserActivity.Params prmUserActivity = new SaxUserActivity.Params(); + prmUserActivity.UserAccountIdsIncluded.Add(userAccountId); + prmUserActivity.ItemIdsIncluded.Add(itemId); + prmUserActivity.StatusCat = SaxUserActivity.StatusCat.Any; + return ActivityMgr.GetUserActivity(prmUserActivity); + } //------------------------------------------------------------------- // Validate item data. diff --git a/SaxoniteStandardDbas/Dbas/Internal/ActivityIndex_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/ActivityIndex_Db.cs index 069eed3..087563c 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 Tue 8-Jun-2021 19:08:09 +// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/ItemImage_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/ItemImage_Db.cs index 9b97ba1..09a022c 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 Tue 8-Jun-2021 19:08:09 +// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/ItemSport_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/ItemSport_Db.cs index 61f6cbb..69a4025 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 Tue 8-Jun-2021 19:08:09 +// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/JournalistArticle_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/JournalistArticle_Db.cs index a852a5f..3f559b1 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/JournalistArticle_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/JournalistArticle_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Tue 8-Jun-2021 19:08:09 +// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/OrganisationOpportunity_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/OrganisationOpportunity_Db.cs index 9d2757d..8b94cba 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 Tue 8-Jun-2021 19:08:09 +// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/Organisation_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/Organisation_Db.cs index f60ec33..0d33216 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 Tue 8-Jun-2021 19:08:09 +// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/Region_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/Region_Db.cs index 20b274a..7a28e2d 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 Tue 8-Jun-2021 19:08:09 +// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/Sport_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/Sport_Db.cs index 88e6a54..3dd0ee5 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 Tue 8-Jun-2021 19:08:09 +// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserAccount_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserAccount_Db.cs index b362ca7..8445b03 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 Tue 8-Jun-2021 19:08:09 +// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserActivity_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserActivity_Db.cs index 4780977..ff25408 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 Tue 8-Jun-2021 19:08:09 +// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { @@ -23,7 +23,14 @@ namespace Saxonite.Net.Standard.Dbas.Internal public ColumnDataInt32 _UserAccountId { get; } = new ColumnDataInt32("UserAccountId"); public ColumnDataInt16 _ItemType { get; } = new ColumnDataInt16("ItemType"); public ColumnDataInt64 _ItemId { get; } = new ColumnDataInt64("ItemId"); + public ColumnDataBoolean _CurrentlyListed { get; } = new ColumnDataBoolean("CurrentlyListed"); + public ColumnDataDateTime _ListedAtFirst { get; } = new ColumnDataDateTime("ListedAtFirst"); + public ColumnDataDateTime _ListedAtLast { get; } = new ColumnDataDateTime("ListedAtLast"); + public ColumnDataDateTime _ViewedAtFirst { get; } = new ColumnDataDateTime("ViewedAtFirst"); + public ColumnDataDateTime _ViewedAtLast { get; } = new ColumnDataDateTime("ViewedAtLast"); public ColumnDataInt16 _Reaction { get; } = new ColumnDataInt16("Reaction"); + public ColumnDataDateTime _ReactedAtFirst { get; } = new ColumnDataDateTime("ReactedAtFirst"); + public ColumnDataDateTime _ReactedAtLast { get; } = new ColumnDataDateTime("ReactedAtLast"); public ColumnDataString _UserActivityData { get; } = new ColumnDataString("UserActivityData"); public ColumnDataString _Notes { get; } = new ColumnDataString("Notes"); public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags"); @@ -44,7 +51,14 @@ namespace Saxonite.Net.Standard.Dbas.Internal "UserAccountId", "ItemType", "ItemId", + "CurrentlyListed", + "ListedAtFirst", + "ListedAtLast", + "ViewedAtFirst", + "ViewedAtLast", "Reaction", + "ReactedAtFirst", + "ReactedAtLast", "UserActivityData", "Notes", "Flags", @@ -91,7 +105,14 @@ namespace Saxonite.Net.Standard.Dbas.Internal public Int32 _UserAccountId { get { return Cols._UserAccountId.Value; } set { Cols._UserAccountId.Value = value; } } public Int16 _ItemType { get { return Cols._ItemType.Value; } set { Cols._ItemType.Value = value; } } public Int64 _ItemId { get { return Cols._ItemId.Value; } set { Cols._ItemId.Value = value; } } + public Boolean _CurrentlyListed { get { return Cols._CurrentlyListed.Value; } set { Cols._CurrentlyListed.Value = value; } } + public DateTime _ListedAtFirst { get { return Cols._ListedAtFirst.Value; } set { Cols._ListedAtFirst.Value = value; } } + public DateTime _ListedAtLast { get { return Cols._ListedAtLast.Value; } set { Cols._ListedAtLast.Value = value; } } + public DateTime _ViewedAtFirst { get { return Cols._ViewedAtFirst.Value; } set { Cols._ViewedAtFirst.Value = value; } } + public DateTime _ViewedAtLast { get { return Cols._ViewedAtLast.Value; } set { Cols._ViewedAtLast.Value = value; } } public Int16 _Reaction { get { return Cols._Reaction.Value; } set { Cols._Reaction.Value = value; } } + public DateTime _ReactedAtFirst { get { return Cols._ReactedAtFirst.Value; } set { Cols._ReactedAtFirst.Value = value; } } + public DateTime _ReactedAtLast { get { return Cols._ReactedAtLast.Value; } set { Cols._ReactedAtLast.Value = value; } } public String _UserActivityData { get { return Cols._UserActivityData.Value; } set { Cols._UserActivityData.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; } } @@ -127,7 +148,14 @@ namespace Saxonite.Net.Standard.Dbas.Internal _UserAccountId = GetFieldInt32(dbDataReader, "UserAccountId", _UserAccountId); _ItemType = GetFieldInt16(dbDataReader, "ItemType", _ItemType); _ItemId = GetFieldInt64(dbDataReader, "ItemId", _ItemId); + _CurrentlyListed = GetFieldBoolean(dbDataReader, "CurrentlyListed", _CurrentlyListed); + _ListedAtFirst = GetFieldDateTime(dbDataReader, "ListedAtFirst", _ListedAtFirst); + _ListedAtLast = GetFieldDateTime(dbDataReader, "ListedAtLast", _ListedAtLast); + _ViewedAtFirst = GetFieldDateTime(dbDataReader, "ViewedAtFirst", _ViewedAtFirst); + _ViewedAtLast = GetFieldDateTime(dbDataReader, "ViewedAtLast", _ViewedAtLast); _Reaction = GetFieldInt16(dbDataReader, "Reaction", _Reaction); + _ReactedAtFirst = GetFieldDateTime(dbDataReader, "ReactedAtFirst", _ReactedAtFirst); + _ReactedAtLast = GetFieldDateTime(dbDataReader, "ReactedAtLast", _ReactedAtLast); _UserActivityData = GetFieldString(dbDataReader, "UserActivityData", _UserActivityData); _Notes = GetFieldString(dbDataReader, "Notes", _Notes); _Flags = GetFieldInt16(dbDataReader, "Flags", _Flags); @@ -162,7 +190,14 @@ namespace Saxonite.Net.Standard.Dbas.Internal if (columnNames.ContainsCI("UserAccountId")) AddCommandParameter(dbCommand, "@UserAccountId", _UserAccountId); if (columnNames.ContainsCI("ItemType")) AddCommandParameter(dbCommand, "@ItemType", _ItemType); if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId); + if (columnNames.ContainsCI("CurrentlyListed")) AddCommandParameter(dbCommand, "@CurrentlyListed", _CurrentlyListed); + if (columnNames.ContainsCI("ListedAtFirst")) AddCommandParameter(dbCommand, "@ListedAtFirst", _ListedAtFirst); + if (columnNames.ContainsCI("ListedAtLast")) AddCommandParameter(dbCommand, "@ListedAtLast", _ListedAtLast); + if (columnNames.ContainsCI("ViewedAtFirst")) AddCommandParameter(dbCommand, "@ViewedAtFirst", _ViewedAtFirst); + if (columnNames.ContainsCI("ViewedAtLast")) AddCommandParameter(dbCommand, "@ViewedAtLast", _ViewedAtLast); if (columnNames.ContainsCI("Reaction")) AddCommandParameter(dbCommand, "@Reaction", _Reaction); + if (columnNames.ContainsCI("ReactedAtFirst")) AddCommandParameter(dbCommand, "@ReactedAtFirst", _ReactedAtFirst); + if (columnNames.ContainsCI("ReactedAtLast")) AddCommandParameter(dbCommand, "@ReactedAtLast", _ReactedAtLast); if (columnNames.ContainsCI("UserActivityData")) AddCommandParameter(dbCommand, "@UserActivityData", _UserActivityData); if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes); if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags); @@ -212,7 +247,14 @@ namespace Saxonite.Net.Standard.Dbas.Internal if (columnNames.ContainsCI("UserAccountId")) AddCommandParameter(dbCommand, "@UserAccountId", _UserAccountId); if (columnNames.ContainsCI("ItemType")) AddCommandParameter(dbCommand, "@ItemType", _ItemType); if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId); + if (columnNames.ContainsCI("CurrentlyListed")) AddCommandParameter(dbCommand, "@CurrentlyListed", _CurrentlyListed); + if (columnNames.ContainsCI("ListedAtFirst")) AddCommandParameter(dbCommand, "@ListedAtFirst", _ListedAtFirst); + if (columnNames.ContainsCI("ListedAtLast")) AddCommandParameter(dbCommand, "@ListedAtLast", _ListedAtLast); + if (columnNames.ContainsCI("ViewedAtFirst")) AddCommandParameter(dbCommand, "@ViewedAtFirst", _ViewedAtFirst); + if (columnNames.ContainsCI("ViewedAtLast")) AddCommandParameter(dbCommand, "@ViewedAtLast", _ViewedAtLast); if (columnNames.ContainsCI("Reaction")) AddCommandParameter(dbCommand, "@Reaction", _Reaction); + if (columnNames.ContainsCI("ReactedAtFirst")) AddCommandParameter(dbCommand, "@ReactedAtFirst", _ReactedAtFirst); + if (columnNames.ContainsCI("ReactedAtLast")) AddCommandParameter(dbCommand, "@ReactedAtLast", _ReactedAtLast); if (columnNames.ContainsCI("UserActivityData")) AddCommandParameter(dbCommand, "@UserActivityData", _UserActivityData); if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes); if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags); diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserOrganisation_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserOrganisation_Db.cs index 6cda00a..4f75c67 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 Tue 8-Jun-2021 19:08:09 +// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserRole_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserRole_Db.cs index ca264b1..8baac34 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 Tue 8-Jun-2021 19:08:09 +// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserSession_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserSession_Db.cs index e580ba5..2777252 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 Tue 8-Jun-2021 19:08:09 +// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserSport_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserSport_Db.cs index 723a88c..c273cb3 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 Tue 8-Jun-2021 19:08:09 +// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Mgr/SaxActivityMgr_Dbas-ActivityIndex.cs b/SaxoniteStandardDbas/Dbas/Mgr/SaxActivityMgr_Dbas-ActivityIndex.cs index f2c9701..b2e3b47 100644 --- a/SaxoniteStandardDbas/Dbas/Mgr/SaxActivityMgr_Dbas-ActivityIndex.cs +++ b/SaxoniteStandardDbas/Dbas/Mgr/SaxActivityMgr_Dbas-ActivityIndex.cs @@ -238,15 +238,17 @@ namespace Saxonite.Net.Standard.Dbas.Mgr //------------------------------------------------------------------- // Item column definitions. - private static readonly String aliasActivityIndex = "ActIdx"; - private static readonly String aliasActivityIndex_Article = "ActIdx_JrnArt"; - private static readonly String prefixActivityIndex_Article = "ActIdx_JrnArt_"; - private static readonly String aliasActivityIndex_Opportunity = "ActIdx_OrgOpp"; - private static readonly String prefixActivityIndex_Opportunity = "ActIdx_OrgOpp_"; - private static readonly String aliasActivityIndex_Region = "ActIdx_Rgn"; - private static readonly String prefixActivityIndex_Region = "ActIdx_Rgn_"; - private static readonly String aliasActivityIndex_Sport = "ActIdx_Spt"; - private static readonly String prefixActivityIndex_Sport = "ActIdx_Spt_"; + public static String aliasActivityIndex { get; } = "ActIdx"; + public static String aliasActivityIndex_UserActivity { get; } = "ActIdx_UsrAct"; + private static String prefixActivityIndex_UserActivity { get; } = aliasActivityIndex_UserActivity + "_"; + public static String aliasActivityIndex_Article { get; } = "ActIdx_JrnArt"; + private static String prefixActivityIndex_Article { get; } = aliasActivityIndex_Article + "_"; + public static String aliasActivityIndex_Opportunity { get; } = "ActIdx_OrgOpp"; + private static String prefixActivityIndex_Opportunity { get; } = aliasActivityIndex_Opportunity + "_"; + public static String aliasActivityIndex_Region { get; } = "ActIdx_Rgn"; + private static String prefixActivityIndex_Region { get; } = aliasActivityIndex_Region + "_"; + public static String aliasActivityIndex_Sport { get; } = "ActIdx_Spt"; + private static String prefixActivityIndex_Sport { get; } = aliasActivityIndex_Sport + "_"; private void SetActivityIndexColDfn (ColumnDfn col, String caption, int width, SaxDbDfn_Core.ColumnIdx dbCol, ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String, @@ -290,6 +292,29 @@ namespace Saxonite.Net.Standard.Dbas.Mgr columnDfn.ReadOnly = true; break; + //----------------------------------------------------------- + // User Activity. + case SaxActivityIndex.Column.UserActivity_UserAccountId: + SetActivityIndexColDfn(columnDfn, "User #", 80, SaxDbDfn_Core.ColumnIdx.UserActivity_UserAccountId, ColumnAlignment.Center, DataValue.DataType.Long, aliasActivityIndex_UserActivity, prefixActivityIndex_UserActivity); + columnDfn.ReadOnly = true; + break; + case SaxActivityIndex.Column.UserActivity_ListedAtLast: + SetActivityIndexColDfn(columnDfn, "Last Listed", 90, SaxDbDfn_Core.ColumnIdx.UserActivity_ListedAtLast, ColumnAlignment.Center, DataValue.DataType.DateTime, aliasActivityIndex_UserActivity, prefixActivityIndex_UserActivity); + columnDfn.ReadOnly = true; + break; + case SaxActivityIndex.Column.UserActivity_ViewedAtLast: + SetActivityIndexColDfn(columnDfn, "Last Viewed", 90, SaxDbDfn_Core.ColumnIdx.UserActivity_ViewedAtLast, ColumnAlignment.Center, DataValue.DataType.DateTime, aliasActivityIndex_UserActivity, prefixActivityIndex_UserActivity); + columnDfn.ReadOnly = true; + break; + case SaxActivityIndex.Column.UserActivity_Reaction: + SetActivityIndexColDfn(columnDfn, "Reaction", 60, SaxDbDfn_Core.ColumnIdx.UserActivity_Reaction, ColumnAlignment.Center, DataValue.DataType.Long, aliasActivityIndex_UserActivity, prefixActivityIndex_UserActivity); + columnDfn.ReadOnly = true; + break; + case SaxActivityIndex.Column.UserActivity_ReactedAtLast: + SetActivityIndexColDfn(columnDfn, "Last Reacted", 90, SaxDbDfn_Core.ColumnIdx.UserActivity_ReactedAtLast, ColumnAlignment.Center, DataValue.DataType.DateTime, aliasActivityIndex_UserActivity, prefixActivityIndex_UserActivity); + columnDfn.ReadOnly = true; + break; + //----------------------------------------------------------- // Article. case SaxActivityIndex.Column.Article_Headline: @@ -546,6 +571,26 @@ namespace Saxonite.Net.Standard.Dbas.Mgr if (columns.HasId(SaxActivityIndex.Column.UpdateOn_Date)) query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityIndex_UpdateOn, aliasActivityIndex)); + //--------------------------------------------------------------------- + // User Activity. + if (columns.HasId(SaxActivityIndex.Column.UserActivity_UserAccountId) || columns.HasId(SaxActivityIndex.Column.UserActivity_ListedAtLast) || columns.HasId(SaxActivityIndex.Column.UserActivity_ViewedAtLast) || columns.HasId(SaxActivityIndex.Column.UserActivity_Reaction) || columns.HasId(SaxActivityIndex.Column.UserActivity_ReactedAtLast)) + { + DbQueryJoin joinUserActivity = new DbQueryJoin(DbJoinType.LeftOuter); + joinUserActivity.Table = new StringPair(SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.UserActivity), aliasActivityIndex_UserActivity); + joinUserActivity.Filters.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_UserActivityData, aliasActivityIndex_UserActivity) + "=" + prm.UserAccountId.ToString()); + joinUserActivity.Filters.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ItemType, aliasActivityIndex_UserActivity) + "=" + SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityIndex_ItemType, aliasActivityIndex)); + joinUserActivity.Filters.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ItemId, aliasActivityIndex_UserActivity) + "=" + SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityIndex_ItemId, aliasActivityIndex)); + query.Joins.Add(joinUserActivity); + List cols = new List(); + cols.Add(SaxDbDfn_Core.ColumnIdx.UserActivity_UserAccountId); + cols.Add(SaxDbDfn_Core.ColumnIdx.UserActivity_ListedAtLast); + cols.Add(SaxDbDfn_Core.ColumnIdx.UserActivity_ViewedAtLast); + cols.Add(SaxDbDfn_Core.ColumnIdx.UserActivity_Reaction); + cols.Add(SaxDbDfn_Core.ColumnIdx.UserActivity_ReactedAtLast); + foreach (var col in cols) + query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(col, aliasActivityIndex_UserActivity), prefixActivityIndex_UserActivity + SaxDbDfn_Core.GetColumnName(col, false)); + } + //--------------------------------------------------------------------- // Article. if (columns.HasId(SaxActivityIndex.Column.Article_Headline) || columns.HasId(SaxActivityIndex.Column.Article_Summary)) diff --git a/SaxoniteStandardDbas/Dbas/Mgr/SaxActivityMgr_Dbas-UserActivity.cs b/SaxoniteStandardDbas/Dbas/Mgr/SaxActivityMgr_Dbas-UserActivity.cs index 14d4ab8..da2183c 100644 --- a/SaxoniteStandardDbas/Dbas/Mgr/SaxActivityMgr_Dbas-UserActivity.cs +++ b/SaxoniteStandardDbas/Dbas/Mgr/SaxActivityMgr_Dbas-UserActivity.cs @@ -207,7 +207,14 @@ namespace Saxonite.Net.Standard.Dbas.Mgr dbUserActivity._UserAccountId = SysId.ToInt(userActivity.UserAccountId); dbUserActivity._ItemType = userActivity.ItemId.Type; dbUserActivity._ItemId = SysId.ToInt(userActivity.ItemId.Id); + dbUserActivity._CurrentlyListed = userActivity.CurrentlyListed; + dbUserActivity._ListedAtFirst = userActivity.ListedAtFirst; + dbUserActivity._ListedAtLast = userActivity.ListedAtLast; + dbUserActivity._ViewedAtFirst = userActivity.ViewedAtFirst; + dbUserActivity._ViewedAtLast = userActivity.ViewedAtLast; dbUserActivity._Reaction = (short)userActivity.Reaction; + dbUserActivity._ReactedAtFirst = userActivity.ReactedAtFirst; + dbUserActivity._ReactedAtLast = userActivity.ReactedAtLast; dbUserActivity._UserActivityData = userActivity.UserActivityData; dbUserActivity._Notes = userActivity.Notes; dbUserActivity._Status = SacsSystem.GetStatusCode(userActivity.Status); @@ -227,7 +234,14 @@ namespace Saxonite.Net.Standard.Dbas.Mgr //userActivity.Id = new SysId(dbUserActivity._Id); //userActivity.UserAccountId = new SysId(dbUserActivity._UserAccountId); //userActivity.ItemId = new ItemId(dbUserActivity._ItemType, new SysId(dbUserActivity._ItemId); + userActivity.CurrentlyListed = dbUserActivity._CurrentlyListed; + userActivity.ListedAtFirst = dbUserActivity._ListedAtFirst; + userActivity.ListedAtLast = dbUserActivity._ListedAtLast; + userActivity.ViewedAtFirst = dbUserActivity._ViewedAtFirst; + userActivity.ViewedAtLast = dbUserActivity._ViewedAtLast; userActivity.Reaction = (Sax.ActivityReaction)dbUserActivity._Reaction; + userActivity.ReactedAtFirst = dbUserActivity._ReactedAtFirst; + userActivity.ReactedAtLast = dbUserActivity._ReactedAtLast; userActivity.UserActivityData = dbUserActivity._UserActivityData; userActivity.Notes = dbUserActivity._Notes; userActivity.Status = SacsSystem.GetStatusForCode(dbUserActivity._Status); @@ -240,7 +254,7 @@ namespace Saxonite.Net.Standard.Dbas.Mgr // Item column definitions. private static readonly String aliasUserActivity = "UsrAct"; private static readonly String aliasUserActivity_UserAccount = "UsrAct_UsrAct"; - private static readonly String prefixUserActivity_UserAccount= "UsrAct_UsrAct_"; + private static readonly String prefixUserActivity_UserAccount = "UsrAct_UsrAct_"; private static readonly String aliasUserActivity_Article = "UsrAct_JrnArt"; private static readonly String prefixUserActivity_Article = "UsrAct_JrnArt_"; private static readonly String aliasUserActivity_Opportunity = "UsrAct_OrgOpp"; @@ -321,6 +335,27 @@ namespace Saxonite.Net.Standard.Dbas.Mgr //----------------------------------------------------------- // Properties. + case SaxUserActivity.Column.FirstListedAt: + SetUserActivityColDfn(columnDfn, "First listed", 80, SaxDbDfn_Core.ColumnIdx.UserActivity_ListedAtFirst, ColumnAlignment.Center, DataValue.DataType.DateTime); + break; + case SaxUserActivity.Column.LastListedAt: + SetUserActivityColDfn(columnDfn, "Last listed", 80, SaxDbDfn_Core.ColumnIdx.UserActivity_ListedAtLast, ColumnAlignment.Center, DataValue.DataType.DateTime); + break; + case SaxUserActivity.Column.FirstViewedAt: + SetUserActivityColDfn(columnDfn, "First viewed", 80, SaxDbDfn_Core.ColumnIdx.UserActivity_ViewedAtFirst, ColumnAlignment.Center, DataValue.DataType.DateTime); + break; + case SaxUserActivity.Column.LastViewedAt: + SetUserActivityColDfn(columnDfn, "Last viewed", 80, SaxDbDfn_Core.ColumnIdx.UserActivity_ViewedAtLast, ColumnAlignment.Center, DataValue.DataType.DateTime); + break; + case SaxUserActivity.Column.Reaction: + SetUserActivityColDfn(columnDfn, "Reaction", 80, SaxDbDfn_Core.ColumnIdx.UserActivity_Reaction, ColumnAlignment.Center, DataValue.DataType.Long); + break; + case SaxUserActivity.Column.FirstReactedAt: + SetUserActivityColDfn(columnDfn, "First reacted", 80, SaxDbDfn_Core.ColumnIdx.UserActivity_ReactedAtFirst, ColumnAlignment.Center, DataValue.DataType.DateTime); + break; + case SaxUserActivity.Column.LastReactedAt: + SetUserActivityColDfn(columnDfn, "Last reacted", 80, SaxDbDfn_Core.ColumnIdx.UserActivity_ReactedAtLast, ColumnAlignment.Center, DataValue.DataType.DateTime); + break; //----------------------------------------------------------- // Derived properties. @@ -501,9 +536,23 @@ namespace Saxonite.Net.Standard.Dbas.Mgr if (columns.HasId(SaxUserActivity.Column.Id)) query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_Id, aliasUserActivity)); bool hasUserAccountCols = (columns.HasId(SaxUserActivity.Column.User_EmailAddress) || columns.HasId(SaxUserActivity.Column.User_DisplayName) || columns.HasId(SaxUserActivity.Column.User_Title) || columns.HasId(SaxUserActivity.Column.User_FirstName) || columns.HasId(SaxUserActivity.Column.User_LastName)); - query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_UserAccountId, aliasUserActivity)); + query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_UserAccountId, aliasUserActivity)); query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ItemType, aliasUserActivity)); query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ItemId, aliasUserActivity)); + if (columns.HasId(SaxUserActivity.Column.FirstListedAt)) + query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ListedAtFirst, aliasUserActivity)); + if (columns.HasId(SaxUserActivity.Column.LastListedAt)) + query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ListedAtLast, aliasUserActivity)); + if (columns.HasId(SaxUserActivity.Column.FirstViewedAt)) + query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ViewedAtFirst, aliasUserActivity)); + if (columns.HasId(SaxUserActivity.Column.LastViewedAt)) + query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ViewedAtLast, aliasUserActivity)); + if (columns.HasId(SaxUserActivity.Column.Reaction)) + query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_Reaction, aliasUserActivity)); + if (columns.HasId(SaxUserActivity.Column.FirstReactedAt)) + query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ReactedAtFirst, aliasUserActivity)); + if (columns.HasId(SaxUserActivity.Column.LastReactedAt)) + query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_ReactedAtLast, aliasUserActivity)); // Common properties. if (columns.HasId(SaxUserActivity.Column.Notes)) query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserActivity_Notes, aliasUserActivity)); diff --git a/SaxoniteStandardDbas/Resources/Database/SaxDbDfn_Core.xml b/SaxoniteStandardDbas/Resources/Database/SaxDbDfn_Core.xml index 53f90ea..77ffed6 100644 --- a/SaxoniteStandardDbas/Resources/Database/SaxDbDfn_Core.xml +++ b/SaxoniteStandardDbas/Resources/Database/SaxDbDfn_Core.xml @@ -3503,6 +3503,91 @@ dbo UserActivity
5 + CurrentlyListed + Bit + + -7 + bit + false + 1 + 1 + 0 + NoNulls + false + + + + dbo + UserActivity
+ 6 + ListedAtFirst + DateTime + + 93 + smalldatetime + false + 16 + 16 + 0 + NoNulls + false + +
+ + dbo + UserActivity
+ 7 + ListedAtLast + DateTime + + 93 + smalldatetime + false + 16 + 16 + 0 + Nullable + true + +
+ + dbo + UserActivity
+ 8 + ViewedAtFirst + DateTime + + 93 + smalldatetime + false + 16 + 16 + 0 + Nullable + true + +
+ + dbo + UserActivity
+ 9 + ViewedAtLast + DateTime + + 93 + smalldatetime + false + 16 + 16 + 0 + Nullable + true + +
+ + dbo + UserActivity
+ 10 Reaction SmallInt @@ -3512,6 +3597,23 @@ 5 2 0 + NoNulls + false + +
+ + dbo + UserActivity
+ 11 + ReactedAtFirst + DateTime + + 93 + smalldatetime + false + 16 + 16 + 0 Nullable true @@ -3519,7 +3621,24 @@ dbo UserActivity
- 6 + 12 + ReactedAtLast + DateTime + + 93 + smalldatetime + false + 16 + 16 + 0 + Nullable + true + +
+ + dbo + UserActivity
+ 13 UserActivityData VarChar @@ -3529,14 +3648,14 @@ 0 0 0 - Nullable - true + NoNulls + false
dbo UserActivity
- 7 + 14 Notes VarChar @@ -3553,7 +3672,7 @@ dbo UserActivity
- 8 + 15 Flags SmallInt @@ -3570,7 +3689,7 @@ dbo UserActivity
- 9 + 16 Status VarChar @@ -3587,7 +3706,7 @@ dbo UserActivity
- 10 + 17 CreateOn DateTime @@ -3604,7 +3723,7 @@ dbo UserActivity
- 11 + 18 CreateBy Int @@ -3621,7 +3740,7 @@ dbo UserActivity
- 12 + 19 CreateHost VarChar @@ -3638,7 +3757,7 @@ dbo UserActivity
- 13 + 20 UpdateOn DateTime @@ -3655,7 +3774,7 @@ dbo UserActivity
- 14 + 21 UpdateBy Int @@ -3672,7 +3791,7 @@ dbo UserActivity
- 15 + 22 UpdateHost VarChar @@ -3783,6 +3902,31 @@ + + dbo + UserActivity
+ IDX_UserActivity_User_CurrentlyListed + 3 + false + false + false + false + 0 + 0 + false + + + 1 + UserAccountId + true + + + 2 + CurrentlyListed + true + + +