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 0000000..9052c1f Binary files /dev/null and b/SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-2-24.png differ diff --git a/SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-24.png b/SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-24.png new file mode 100644 index 0000000..e61af4d Binary files /dev/null and b/SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-24.png differ 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 0000000..f220d95 Binary files /dev/null and b/SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-3-24.png differ diff --git a/SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-32.png b/SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-32.png new file mode 100644 index 0000000..5877a56 Binary files /dev/null and b/SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-32.png differ diff --git a/SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-48.png b/SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-48.png new file mode 100644 index 0000000..1650922 Binary files /dev/null and b/SaxoniteCoreWebOnline/wwwroot/img/icon/star-gold-48.png differ diff --git a/SaxoniteCoreWebOnline/wwwroot/js/sax-home.js b/SaxoniteCoreWebOnline/wwwroot/js/sax-home.js index 2b743d3..29ce7a7 100644 --- a/SaxoniteCoreWebOnline/wwwroot/js/sax-home.js +++ b/SaxoniteCoreWebOnline/wwwroot/js/sax-home.js @@ -23,7 +23,7 @@ } sax.doRefreshResults = function (response) { - //sax.debug('doRefreshResults', response); + sax.debug('doRefreshResults', response); delete sax.awaitingRefreshResponse; var $results = $('.sax-panel-results'); var $msgs = $('.sax-panel-messages', $results).hide().empty(); @@ -44,31 +44,38 @@ } sax.populateItem = function ($item, item) { - sax.debug('populateItem', item); + //sax.debug('populateItem', item); if (!item) return; - $item.prop('id', sax.itemIdPrefix + item.itemIdx).addClass(item.itemTypeClass); + $item.prop('id', sax.itemIdPrefix + item.itemIdx).addClass(item.itemTypeClass).toggleClass('sax-activity-reaction-' + item.reaction, !!item.reaction); $('.ActivityCaption', $item).text(item.caption); $('.ActivityBlurb', $item).text(item.blurb); $('.ActivitySport', $item).text(item.sport); $('.ActivityRegion', $item).text(item.region); $('.ActivityPublishedOn', $item).text(item.publishedOnFmt); - $item.off('click').on('click', function () { sax.expandActivity(item.itemType, item.itemIdx); }) + $item.off('click').on('click', function () { sax.expandActivity(item, $item); }) $('.sax-panel-results .sax-panel-messages').hide().empty(); } + sax.refreshItem = function () + { + if (!sax.activity) return; + for (let i = 1; i < 4; i++) + sax.activity.$item.toggleClass('sax-activity-reaction-' + i, sax.activity.item.reaction == i); + } //-------------------------------------------------------------- - sax.expandActivity = function (type, idx) + sax.expandActivity = function (item, $item) { - sax.debug('expandActivity(' + type + ',' + idx + ')'); + //sax.debug('expandActivity', item, $item); let $frm = $('#frmActivityId'); - $('.ActivityType', $frm).val(type); - $('.ActivityIdx', $frm).val(idx); + $('.ActivityType', $frm).val(item.itemType); + $('.ActivityIdx', $frm).val(item.itemIdx); + sax.activity = { item:item, $item: $item }; sax.ajax.activityInfo = sax.ajax.activityInfo || { url: sax.url.base + 'Activity/Ajax/GetInfo', formId: 'frmActivityId', callbackFn: sax.showActivityDetails, noWaitIcon: true }; sax.doAjaxRequest(sax.ajax.activityInfo, 50); } sax.showActivityDetails = function (response) { - sax.debug('showActivityDetails', response); + //sax.debug('showActivityDetails', response); let $act = $('#dlgActivity .sax-content').empty(); let item; if (item = response.article) @@ -82,9 +89,7 @@ let seg = segs[segIdx]; let $seg = $('.sax-panel-item-template .sax-panel-item.ArticleContentSegment').clone().html(seg.body.html); $('.ArticleContentSegments', $itm).append($seg); - sax.debug(seg, $seg); } - sax.debug($itm); $act.append($itm); } else if (item = response.opportunity) @@ -96,15 +101,49 @@ $act.append($itm); } else return; + sax.setActivityReactionButton(sax.activity.item.reaction); sax.openDialog(sax.$dlg.activity, 800, 1600); } + //-------------------------------------------------------------- + let selectedClass = 'sax-selected'; + sax.setActivityReactionButton = function (r) + { + sax.clearActivityReactionButton(); + $('.sax-dialog-activity button.ActivityReaction' + r).addClass(selectedClass); + } + sax.clearActivityReactionButton = function (r) + { + $('.sax-dialog-activity button.ActivityReaction').removeClass(selectedClass); + } + sax.setActivityReaction = function (r) + { + //sax.debug('setActivityReaction', r); + if ($('.sax-dialog-activity button.ActivityReaction' + r).hasClass(selectedClass)) r = 0; + sax.clearActivityReactionButton(); + let fn = function (response) + { + if (!response.success) return; + sax.activity.item.reaction = response.reaction; + sax.setActivityReactionButton(response.reaction); + } + let $frm = $('#frmActivityReact'); + $('.ActivityType', $frm).val(sax.activity.item.itemType); + $('.ActivityIdx', $frm).val(sax.activity.item.itemIdx); + $('.ActivityReaction', $frm).val(r); + sax.ajax.activityReact = sax.ajax.activityReact || { url: sax.url.base + 'Activity/Ajax/React', formId: 'frmActivityReact', callbackFn: fn, noWaitIcon: true }; + sax.doAjaxRequest(sax.ajax.activityReact, 20); + } + //-------------------------------------------------------------- $(function () { var opt = sax.dlgOpts(); - opt.dialogClass += ' sax-dialog-border-thin sax-dialog-rounding-none sax-dialog-titlebar-hide'; - opt.buttons[sax.dlg.btn.close] = function () { $(this).dialog('close'); }; + opt.dialogClass += ' sax-dialog-activity sax-dialog-border-thin sax-dialog-rounding-none sax-dialog-titlebar-hide'; + opt.buttons['close'] = { text: sax.dlg.btn.close, class: "floatr", click: function () { sax.refreshItem(); delete sax.activity; $(this).dialog('close'); } }; + opt.buttons['react1'] = { text: '1', class: "floatl ActivityReaction ActivityReaction1", click: function () { sax.setActivityReaction(1); } }; + opt.buttons['react2'] = { text: '2', class: "floatl ActivityReaction ActivityReaction2", click: function () { sax.setActivityReaction(2); } }; + opt.buttons['react3'] = { text: '3', class: "floatl ActivityReaction ActivityReaction3", click: function () { sax.setActivityReaction(3); } }; sax.$dlg.activity = $('#dlgActivity').dialog(opt); setTimeout(sax.refreshResults, 250); diff --git a/SaxoniteStandardBase/Base/App/Sax-Version.cs b/SaxoniteStandardBase/Base/App/Sax-Version.cs index 8bd72ba..6aebb30 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.0.8.0"; + private static String version { get; } = "1.0.8.1"; // Retrieve version. public static String GetFullVersion () { return version; } public static String GetAppVersion () @@ -41,8 +41,8 @@ namespace Saxonite.Net.Standard.Base.App // Version history. //------------------------------------------------------------------- // 1.0.8 15-Jun-2021 Online Article Content - // - Journalist Articles now have styled content. - // - Online home page click through activity for details. + // - Journalist Articles styled content. + // - Online home page click through activity for details with reaction. // 1.0.7 8-Jun-2021 Online Activities & Profile // - Style Online Activities by type. // - Profile Contact Image upload. diff --git a/SaxoniteStandardBase/Base/App/SaxDbDfn_Core.cs b/SaxoniteStandardBase/Base/App/SaxDbDfn_Core.cs index 82f1d8a..12c1984 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 Tue 8-Jun-2021 19:08:09 +// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 //--------------------------------------------------------------------------- namespace Saxonite.Base.App { @@ -199,7 +199,14 @@ namespace Saxonite.Base.App UserActivity_UserAccountId, UserActivity_ItemType, UserActivity_ItemId, + UserActivity_CurrentlyListed, + UserActivity_ListedAtFirst, + UserActivity_ListedAtLast, + UserActivity_ViewedAtFirst, + UserActivity_ViewedAtLast, UserActivity_Reaction, + UserActivity_ReactedAtFirst, + UserActivity_ReactedAtLast, UserActivity_UserActivityData, UserActivity_Notes, UserActivity_Flags, @@ -262,7 +269,7 @@ namespace Saxonite.Base.App //------------------------------------------------------------------- // Data members. private static readonly int tableCount = 14; - private static readonly int columnCount = 219; + private static readonly int columnCount = 226; private static ulong maxTextLen = 0; //------------------------------------------------------------------- @@ -609,7 +616,14 @@ namespace Saxonite.Base.App new ColumnDfn(10,"UserAccountId",4,4,false,10), new ColumnDfn(10,"ItemType",3,5,false,5), new ColumnDfn(10,"ItemId",5,-5,false,19), + new ColumnDfn(10,"CurrentlyListed",1,-7,false,1), + new ColumnDfn(10,"ListedAtFirst",9,93,false,16), + new ColumnDfn(10,"ListedAtLast",9,93,false,16), + new ColumnDfn(10,"ViewedAtFirst",9,93,false,16), + new ColumnDfn(10,"ViewedAtLast",9,93,false,16), new ColumnDfn(10,"Reaction",3,5,false,5), + new ColumnDfn(10,"ReactedAtFirst",9,93,false,16), + new ColumnDfn(10,"ReactedAtLast",9,93,false,16), new ColumnDfn(10,"UserActivityData",0,-9,false,0), new ColumnDfn(10,"Notes",0,-9,false,2000), new ColumnDfn(10,"Flags",3,5,false,5), diff --git a/SaxoniteStandardBase/Base/Bus/SaxActivityIndex.cs b/SaxoniteStandardBase/Base/Bus/SaxActivityIndex.cs index 3c8ec9b..1caa0e5 100644 --- a/SaxoniteStandardBase/Base/Bus/SaxActivityIndex.cs +++ b/SaxoniteStandardBase/Base/Bus/SaxActivityIndex.cs @@ -23,6 +23,12 @@ namespace Saxonite.Net.Standard.Base.Bus ItemType_Code, ItemType_Desc, ItemId, + // User Activity. + UserActivity_UserAccountId, + UserActivity_ListedAtLast, + UserActivity_ViewedAtLast, + UserActivity_Reaction, + UserActivity_ReactedAtLast, // Journalist Article. Article_Headline, Article_Summary, @@ -230,6 +236,8 @@ namespace Saxonite.Net.Standard.Base.Bus public List 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 + + +