This commit is contained in:
2022-04-20 17:46:16 +01:00
parent acd070dbc6
commit 9a8dc99d85
63 changed files with 1965 additions and 308 deletions
@@ -164,6 +164,7 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
// User Activity filter.
SaxUserActivity.Params prmUserActivity = new SaxUserActivity.Params();
prmUserActivity.UserAccountIdsIncluded.Add(context.UserAccountId);
prmUserActivity.ItemIdsIncluded.AddRange(activityItemIds);
prmUserActivity.StatusCat = SaxUserActivity.StatusCat.ActiveOnly;
@@ -28,7 +28,8 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
public String LastName { get; set; }
public String RegionNameCountry { get; set; }
public String RegionNameProvince { get; set; }
public int UserRoleCount { get; set; }
public int? UserSportCount { get; set; } = null;
public int? UserRoleCount { get; set; } = null;
public bool? SystemAdmin { get; set; } = null;
public String LastOnlineLoginAt { get; set; }
public String LastAdminLoginAt { get; set; }
@@ -37,9 +38,17 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
{
public String RegionIdCountry { get; set; }
public String RegionIdProvince { get; set; }
// User sports.
public class UserSportData
{
public String SportId { get; set; }
public String SportName { get; set; }
}
public List<UserSportData> Sports { get; set; }
// User roles.
public List<String> userRoleCodes { get; } = new List<string>();
}
private void PopulateUserResponseData(SaxModel_Admin model, UserData_List data, SaxUserAccount user, List<SaxUserRole> userRoles)
private void PopulateUserResponseData(SaxModel_Admin model, UserData_List data, SaxUserAccount user, List<SaxUserSport> userSports, List<SaxUserRole> userRoles)
{
data.Id = SysId.ToString(user.Id);
data.EmailAddress = user.EmailAddress;
@@ -49,7 +58,10 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
data.LastName = user.LastName;
data.RegionNameCountry = model.GetRegionName(user.RegionIdCountry);
data.RegionNameProvince = model.GetRegionName(user.RegionIdProvince);
data.UserRoleCount = userRoles?.GetUserRolesByStatus(SaStatus.Active).Count ?? 0;
// User sports.
// User roles.
if (userRoles?.GetUserRolesByStatus(SaStatus.Active).Count > 0)
data.UserRoleCount = userRoles.GetUserRolesByStatus(SaStatus.Active).Count;
data.SystemAdmin = (userRoles != null && userRoles.Exists(item => item.UserRole == Sax.UserRole.SystemAdmin) ? true : (bool?)null);
data.LastOnlineLoginAt = model.FormatDateTimeForDisplay(user.LastLoginAt);
data.StatusCode = user.StatusCode;
@@ -59,13 +71,31 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
if (userRole_SystemAdmin != null)
data.LastAdminLoginAt = model.FormatDateTimeForDisplay(userRole_SystemAdmin.LastLoginAt);
}
private void PopulateUserResponseData(SaxModel_Admin model, UserData_Full data, SaxUserAccount user, List<SaxUserRole> userRoles)
private void PopulateUserResponseData(SaxModel_Admin model, UserData_Full data, SaxUserAccount user, List<SaxUserSport> userSports, List<SaxUserRole> userRoles)
{
PopulateUserResponseData(model, data as UserData_List, user, userRoles);
PopulateUserResponseData(model, data as UserData_List, user, userSports, userRoles);
data.RegionIdCountry = SysId.ToString(user.RegionIdCountry);
data.RegionIdProvince = SysId.ToString(user.RegionIdProvince);
// User sports.
if (userSports != null && !userSports.IsEmpty())
{
data.Sports = new List<UserData_Full.UserSportData>();
List<SaxSport> sports = ReferenceMgr.GetSportListByIds(userSports.GetSportIds());
foreach (SaxUserSport userSport in userSports)
{
SaxSport sport = sports.GetSportById(userSport.SportId);
UserData_Full.UserSportData userSportData = new UserData_Full.UserSportData()
{
SportId = SysId.ToString(userSport.SportId),
SportName = sport?.Name ?? null
};
data.Sports.Add(userSportData);
}
}
// User roles.
if (userRoles != null)
{
foreach (SaxUserRole userRole in userRoles.GetUserRolesByStatus(SaStatus.Active))
@@ -75,6 +105,14 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
//-------------------------------------------------------------------
// Utilities.
private List<SaxUserSport> GetUserSports(SysId userAccountId, SaxUserSport.StatusCat statusCat = SaxUserSport.StatusCat.NotDeleted)
{
if (!SysId.IsValid(userAccountId)) return new List<SaxUserSport>();
SaxUserSport.Params prmUserSport = new SaxUserSport.Params();
prmUserSport.UserAccountIdsIncluded.Add(userAccountId);
prmUserSport.StatusCat = statusCat;
return AccountMgr.GetUserSportList(prmUserSport);
}
private List<SaxUserRole> GetUserRoles(SysId userAccountId, SaxUserRole.StatusCat statusCat = SaxUserRole.StatusCat.NotDeleted)
{
if (!SysId.IsValid(userAccountId)) return new List<SaxUserRole>();
@@ -142,6 +180,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
ColumnDfn colProvinceName = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.RegionProvince_Name);
ColumnDfn colUserRoleCount = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.UserRoleCount);
ColumnDfn colSystemAdminUser = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.SystemAdminUser);
ColumnDfn colUserSportCount = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.UserSportCount_Active);
ColumnDfn colLastLogin = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.LastLoginAt);
ColumnDfn colAdminLastLogin = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.LastAdminLoginAt);
ColumnDfn colStatus = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.Status);
@@ -149,8 +188,9 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
{
colId, colEmail, colTitle, colFirstName, colLastName,
colCountryName, colProvinceName,
colUserRoleCount, colSystemAdminUser,
colLastLogin, colAdminLastLogin, colStatus
colUserSportCount, colUserRoleCount,
colSystemAdminUser, colLastLogin, colAdminLastLogin,
colStatus
};
// Query items.
@@ -168,6 +208,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
LastName = values.GetString(colLastName.DataName),
RegionNameCountry = values.GetString(colCountryName.DataName),
RegionNameProvince = values.GetString(colProvinceName.DataName),
UserSportCount = StringUtil.ToInt(values.GetString(colUserSportCount.DataName)),
UserRoleCount = StringUtil.ToInt(values.GetString(colUserRoleCount.DataName)),
SystemAdmin = StringUtil.ToBool(values.GetString(colSystemAdminUser.DataName)),
LastOnlineLoginAt = model.FormatDateTimeForDisplay(values.GetDateTime(colLastLogin.DataName)),
@@ -175,6 +216,9 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
StatusCode = values.GetString(colStatus.DataName),
StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName))
};
if (userData.UserSportCount < 1) userData.UserSportCount = null;
if (userData.UserRoleCount < 1) userData.UserRoleCount = null;
if (userData.SystemAdmin == false) userData.SystemAdmin = null;
userData.DisplayName = SaxUserAccount.GetDisplayName(userData.Title, userData.FirstName, userData.LastName);
responseData.Users.Add(userData);
}
@@ -231,8 +275,16 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
}
// User Sports.
List<SaxUserSport> userSports = GetUserSports(user.Id, SaxUserSport.StatusCat.ActiveOnly);
disposableItems.AddRange(userSports);
// User Roles.
List<SaxUserRole> userRoles = GetUserRoles(user.Id, SaxUserRole.StatusCat.ActiveOnly);
disposableItems.AddRange(userRoles);
// Construct response.
PopulateUserResponseData(model, responseData.user, user, GetUserRoles(user.Id).GetUserRolesByStatus(SaStatus.Active));
PopulateUserResponseData(model, responseData.user, user, userSports, userRoles);
responseData.Success = true;
}
return Json(responseData);
@@ -275,8 +327,16 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
return Json(responseData);
}
// User Sports.
List<SaxUserSport> userSports = GetUserSports(user.Id, SaxUserSport.StatusCat.ActiveOnly);
disposableItems.AddRange(userSports);
// User Roles.
List<SaxUserRole> userRoles = GetUserRoles(user.Id, SaxUserRole.StatusCat.ActiveOnly);
disposableItems.AddRange(userRoles);
// Construct response.
PopulateUserResponseData(model, responseData.user, user, GetUserRoles(user.Id).GetUserRolesByStatus(SaStatus.Active));
PopulateUserResponseData(model, responseData.user, user, userSports, userRoles);
responseData.Success = true;
}
return Json(responseData);
@@ -407,8 +467,12 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
}
}
// User Sports.
List<SaxUserSport> userSports = GetUserSports(user.Id, SaxUserSport.StatusCat.ActiveOnly);
disposableItems.AddRange(userSports);
// Construct response.
PopulateUserResponseData(model, responseData.user, user, userRoles.GetUserRolesByStatus(SaStatus.Active));
PopulateUserResponseData(model, responseData.user, user, userSports, userRoles.GetUserRolesByStatus(SaStatus.Active));
responseData.Success = true;
}
return Json(responseData);
@@ -479,8 +543,12 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
emailsSentCount++;
}
// User Sports.
List<SaxUserSport> userSports = GetUserSports(userAccount.Id, SaxUserSport.StatusCat.ActiveOnly);
disposableItems.AddRange(userSports);
// Construct response.
PopulateUserResponseData(model, responseData.user, userAccount, userRoles.GetUserRolesByStatus(SaStatus.Active));
PopulateUserResponseData(model, responseData.user, userAccount, userSports, userRoles.GetUserRolesByStatus(SaStatus.Active));
responseData.SetNotification(messageTitle, "Emails sent: " + emailsSentCount);
responseData.Success = true;
}
@@ -118,7 +118,7 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="company.name" xml:space="preserve">
<value>Solum Forti</value>
<value>Sportierre</value>
</data>
<data name="copyright.symbol.year.html" xml:space="preserve">
<value>&amp;copy; {0}</value>
@@ -162,6 +162,9 @@
<data name="label.address" xml:space="preserve">
<value>Address</value>
</data>
<data name="label.admin" xml:space="preserve">
<value>Admin</value>
</data>
<data name="label.any" xml:space="preserve">
<value>Any</value>
</data>
@@ -378,6 +381,9 @@
<data name="label.sport" xml:space="preserve">
<value>Sport</value>
</data>
<data name="label.sports" xml:space="preserve">
<value>Sports</value>
</data>
<data name="label.status" xml:space="preserve">
<value>Status</value>
</data>
+5 -2
View File
@@ -138,8 +138,11 @@
<div class="col-sm-4 right"><span class="UserRegionNameCountry"></span></div>
</div>
<div class="row">
<div class="col-sm-4"><div class="sax-note UserRoles">Roles: <span class="UserRoleCount"></span></div></div>
<div class="col-sm-4 center"><div class="sax-note UserLastAdminLogin">Admin:&nbsp;<span class="UserLastAdminLoginAt"></span></div></div>
<div class="col-sm-4">
<span class="sax-note UserSports">@Localiser["label.sports"]: <span class="UserSportCount"></span>&nbsp;</span>
<span class="sax-note UserRoles">@Localiser["label.roles"]: <span class="UserRoleCount"></span></span>
</div>
<div class="col-sm-4 center"><div class="sax-note UserLastAdminLogin">@Localiser["label.admin"]:&nbsp;<span class="UserLastAdminLoginAt"></span></div></div>
<div class="col-sm-4 right"><div class="sax-note StatusDesc"></div></div>
</div>
</div>
@@ -4,6 +4,15 @@
/* Users - User dialog panel */
}
<style>
#dlgUser #frmUser .UserSports .Sports
{
max-height: 64px;
padding: 4px 8px;
border: 1px solid #b0b0b0;
overflow-y: scroll;
}
</style>
<script type="text/javascript">
sax.dlg.title.createUser = '@Localiser.GetJavascriptText("user.caption.user.create")';
sax.dlg.title.updateUser = '@Localiser.GetJavascriptText("user.caption.user.update")';
@@ -134,6 +143,20 @@
</div>
*@
@* User Sports *@
<div class="sax-form-control UserSports">
<div class="row">
<div class="col-sm-3">
<div class="sax-label">
<label><span>@Localiser["label.sports"]</span>&nbsp;<span class="UserSportCount"></span></label>
</div>
</div>
<div class="col-sm">
<div class="Sports"></div>
</div>
</div>
</div>
@* User roles *@
<div class="sax-form-control UserRoles">
<div class="row">
@@ -63,6 +63,8 @@
$('.UserLastName', $item).text(item.lastName);
$('.UserRegionNameCountry', $item).text(item.regionNameCountry);
$('.UserRegionNameProvince', $item).text(item.regionNameProvince);
$('.UserSportCount', $item).text(item.userSportCount);
$('.UserSports', $item).toggle(!!item.userSportCount);
$('.UserRoleCount', $item).text(item.userRoleCount);
$('.UserRoles', $item).toggle(!!item.userRoleCount);
$('.UserLastOnlineLoginAt', $item).text(item.lastOnlineLoginAt);
@@ -275,6 +277,7 @@
let frm = $frm.user;
$('.UserId,.UserRegionIdCountry,.UserRegionIdProvince,.UserRoleCodes,input[type="text"],textarea,select', frm).val('');
$('.UserStatus', frm).val(sax.data.defaultStatusCode);
$('div.UserSports', frm).hide();
sax.clearControlErrors();
sax.userAccount = { userRoleCodes: [] };
}
@@ -304,6 +307,13 @@
$('.UserRegionCaptionProvince', frm).val(item.regionNameProvince);
$('.UserRoles', frm).val(sax.getSelectedUserRoleDescs().join('\n'));
$('#ifUserRoleCodes').val(item.userRoleCodes.join(sax.data.userRoleCodeDelim));
if (item.sports && item.sports.length)
{
let $sports = $('div.UserSports', frm).show();
$('.UserSportCount', $sports).text('[' + item.sports.length + ']');
for (const sport of item.sports)
$('.Sports', $sports).append($('<div>').text(sport.sportName));
}
$('.UserStatus', frm).val(item.statusCode);
$dlg.user.dialog('option', 'title', sax.dlg.title.updateUser);
sax.openDialog($dlg.user, 600, 480);
@@ -219,6 +219,9 @@
<data name="info.chars.available" xml:space="preserve">
<value>[{0} chars available]</value>
</data>
<data name="label. registered" xml:space="preserve">
<value>Registered</value>
</data>
<data name="label.about" xml:space="preserve">
<value>About</value>
</data>
@@ -246,6 +249,9 @@
<data name="label.at" xml:space="preserve">
<value>At</value>
</data>
<data name="label.average" xml:space="preserve">
<value>Average</value>
</data>
<data name="label.calendar" xml:space="preserve">
<value>Calendar</value>
</data>
@@ -327,6 +333,9 @@
<data name="label.experience" xml:space="preserve">
<value>Experience</value>
</data>
<data name="label.feedback" xml:space="preserve">
<value>Feedback</value>
</data>
<data name="label.first" xml:space="preserve">
<value>First</value>
</data>
@@ -555,6 +564,9 @@
<data name="label.view" xml:space="preserve">
<value>View</value>
</data>
<data name="label.views" xml:space="preserve">
<value>Views</value>
</data>
<data name="label.year" xml:space="preserve">
<value>Year</value>
</data>
@@ -44,7 +44,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 int? Reaction { get; set; } = null;
public String PublishedOnFmt { get; set; }
}
/// <summary>Article activity info. </summary>
@@ -222,7 +222,8 @@ 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;
if ((int)itemData.Reaction > 0)
activityData.Reaction = (int)itemData.Reaction;
activityData.PublishedOnFmt = Localiser.FormatDate(itemData.EffectiveOn);
responseData.Activities.Add(activityData);
}
@@ -56,6 +56,14 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
public String OrganisationName { get; set; }
public String Headline { get; set; }
public String Summary { get; set; }
public class FeedbackData
{
public String Summary { get; set; }
public long? ViewCount { get; set; } = null;
public long? FeedbackCount { get; set; } = null;
public String FeedbackAverage { get; set; }
}
public FeedbackData Feedback { get; set; }
public String RegionCaptionPrimary { get; set; }
public String SportCaptionPrimary { get; set; }
public String PublishedOnFmt { get; set; }
@@ -70,12 +78,13 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
public String PublishedOn_Calendar { get; set; }
public ArticleContentData Content { get; } = new ArticleContentData();
}
private void PopulateArticleResponseData(Model_Article model, SaxArticle article, SaxOrganisation organisation, ArticleData_List data)
private void PopulateArticleResponseListData(Model_Article model, SaxArticle article, SaxOrganisation organisation, SaxActivityFeedback activityFeedback, ArticleData_List data)
{
data.Id = model.EncryptId(article.Id);
data.OrganisationId = SysId.ToString(article.OrganisationId);
data.Headline = article.Headline;
data.Summary = article.Summary;
PopulateFeedbackResponseListData(activityFeedback, data);
data.RegionCaptionPrimary = model.GetRegionCaption(article.RegionIdPrimary);
data.SportCaptionPrimary = model.GetSportCaption(article.SportIdPrimary);
data.CreatedOnFmt = DateUtil.Format(article.CreateStamp.On, "d-MMM-yyyy");
@@ -83,9 +92,9 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
data.StatusCode = article.StatusCode;
data.StatusDesc = article.StatusDesc;
}
private void PopulateArticleResponseData(Model_Article model, SaxArticle article, SaxOrganisation organisation, ArticleData_Full data)
private void PopulateArticleResponseData(Model_Article model, SaxArticle article, SaxOrganisation organisation, SaxActivityFeedback activityFeedback, ArticleData_Full data)
{
PopulateArticleResponseData(model, article, organisation, data as ArticleData_List);
PopulateArticleResponseListData(model, article, organisation, activityFeedback, data as ArticleData_List);
data.RegionIdPrimary = model.GetEncryptedRegionId(article.RegionIdPrimary);
data.SportIdPrimary = model.GetEncryptedSportId(article.SportIdPrimary);
data.Published = DateUtil.IsValid(article.PublishedAt) ? true : (bool?)null;
@@ -112,6 +121,27 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
data.Content.Segments.Add(segmentData);
}
}
// Feedback.
private void PopulateFeedbackResponseData(SaxActivityFeedback activityFeedback, ArticleData_Full data)
{
PopulateFeedbackResponseListData(activityFeedback, data);
}
private void PopulateFeedbackResponseListData(SaxActivityFeedback activityFeedback, ArticleData_List data)
{
if (activityFeedback == null) return;
PopulateFeedbackResponseListData(activityFeedback.ViewCount, activityFeedback.FeedbackCount, activityFeedback.FeedbackTotal, activityFeedback.FeedbackAverage, data);
}
private void PopulateFeedbackResponseListData(long viewCount, long feedbackCount, long feedbackTotal, decimal feedbackAverage, ArticleData_List data)
{
if (viewCount <= 0) return;
data.Feedback = new ArticleData_List.FeedbackData();
data.Feedback.Summary = viewCount.ToString();
if (feedbackCount > 0)
data.Feedback.Summary = feedbackAverage.ToString("N1") + " " + feedbackCount.ToString() + "/" + data.Feedback.Summary;
data.Feedback.ViewCount = viewCount;
data.Feedback.FeedbackCount = feedbackCount;
data.Feedback.FeedbackAverage = feedbackAverage.ToString("N1");
}
//-------------------------------------------------------------------
// Get Article List ajax request.
@@ -226,11 +256,17 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
ColumnDfn colPublishedOn = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.PublishedAt_Date);
ColumnDfn colStatus = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.Status);
ColumnDfn colCreatedOn = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.CreateOn_Date);
// Feedback.
ColumnDfn colFeedback_ViewCount = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.Feedback_ViewCount);
ColumnDfn colFeedback_FeedbackCount = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.Feedback_FeedbackCount);
ColumnDfn colFeedback_FeedbackTotal = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.Feedback_FeedbackTotal);
ColumnDfn colFeedback_FeedbackAverage = ActivityMgr.GetArticleColumnDfn(SaxArticle.Column.Feedback_FeedbackAverage);
List<ColumnDfn> columns = new List<ColumnDfn>()
{
colId, colOrganisationId, colOrganisationName, colHeadline, colSummary,
colRegionIdPrimary, colSportIdPrimary, colPublishedOn,
colStatus, colCreatedOn
colStatus, colCreatedOn,
colFeedback_ViewCount, colFeedback_FeedbackCount, colFeedback_FeedbackTotal, colFeedback_FeedbackAverage
};
// Sort columns.
@@ -257,6 +293,10 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
StatusCode = values.GetString(colStatus.DataName),
StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName))
};
// Feedback.
long viewCount = values.GetLong(colFeedback_ViewCount.DataName);
if (viewCount > 0)
PopulateFeedbackResponseListData(viewCount, values.GetLong(colFeedback_FeedbackCount.DataName), values.GetLong(colFeedback_FeedbackTotal.DataName), values.GetDecimal(colFeedback_FeedbackAverage.DataName), articleData);
responseData.Articles.Add(articleData);
}
}
@@ -338,8 +378,12 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
ItemDataMgr.UpdateItemImage(itemImage, DbUpdateInfo);
}
// Article Feedback.
SaxActivityFeedback activityFeedback = ActivityMgr.GetActivityFeedbackForItem(article.GetItemId());
disposableItems.Add(activityFeedback);
// Construct response.
PopulateArticleResponseData(model, article, organisation, responseData.Article);
PopulateArticleResponseData(model, article, organisation, activityFeedback, responseData.Article);
}
responseData.Success = true;
return Json(responseData);
@@ -685,8 +729,12 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
ItemDataMgr.UpdateItemImage(itemImage, DbUpdateInfo);
}
// Article Feedback.
SaxActivityFeedback activityFeedback = ActivityMgr.GetActivityFeedbackForItem(article.GetItemId());
disposableItems.Add(activityFeedback);
// Construct response.
PopulateArticleResponseData(model, article, organisation, responseData.Article);
PopulateArticleResponseData(model, article, organisation, activityFeedback, responseData.Article);
responseData.Success = true;
}
return Json(responseData);
@@ -79,6 +79,7 @@
<div class="sax-caption"><div class="sax-action ArticleHeadline"></div></div>
</div>
<div class="fixed"><div class="OrganisationName pt4 pr16"></div></div>
<div class="fixed"><div class="ArticleFeedback pt4 pr16"></div></div>
<div class="fixed sax-actions">
@* Burger menu *@
<ul class="nav navbar-nav navbar-light navbar-right sax-burger">
@@ -128,8 +128,9 @@
<div class="fixed"><div class="pl16 pt4 pr8">@Html.CheckBoxFor(model => model.ArticlePublish, new { @id = "chkArticlePublish", @class = "ArticlePublish" })&nbsp;<span class="" onclick="$('#chkArticlePublish').click()">@Localiser["label.publish"]</span></div></div>
<div class="col">@Html.TextBoxFor(model => model.ArticlePublishOn, new { @id = "ifArticlePublishOn", @class = "sax-input sax-calendar ArticlePublishOn", @readonly = "readonly" })</div>
</div>
<div class="row ArticlePublished">
<div class="col"><div class="">@Localiser["label.published"]: <span class="ArticlePublishedOn"></span></div></div>
<div class="ArticlePublished">
<div class=""><div class="">@Localiser["label.published"]: <span class="ArticlePublishedOn"></span></div></div>
<div class=""><div class="">@Localiser["label.feedback"]: <span class="ArticleFeedback"></span></div></div>
</div>
</div>
<div class="sax-message"></div>
@@ -61,7 +61,10 @@ else
<div class="sax-caption">
<div class="row">
<div class="col"><div class="sax-action ActivityCaption"></div></div>
<div class="col center"><div class="sax-action ActivityOrganisation"></div></div>
<div class="fixed row">
<div class="col sax-action ActivityOrganisation"></div>
<div class="fixed right ActivityReaction"></div>
</div>
</div>
</div>
</div>
+26 -18
View File
@@ -8,6 +8,18 @@
background-position: right 4px center;
}
.sax-panel-item.Activity .ActivityReaction
{
min-width: 84px;
padding: 0 0 0 4px;
vertical-align:top;
}
.sax-panel-item.Activity .ActivityReaction img
{
vertical-align:top;
}
.sax-panel-item.Activity.sax-activity-reaction-1 .sax-header
{
background-image: URL("../img/icon/star-gold-24.png");
@@ -94,7 +106,7 @@
#dlgActivity .sax-panel-item.Article .ArticleContentSegment
{
margin:4px 0;
margin: 4px 0;
}
#dlgActivity .sax-panel-item.Article .ArticleContentSegmentImage img
@@ -105,32 +117,28 @@
.ui-dialog.sax-dialog-activity button.ActivityReaction
{
min-width: 80px;
min-width: 24px;
height: 24px;
margin: 4px 2px;
padding: 0;
color: transparent;
background-color: transparent;
background-position: center center;
background-repeat: no-repeat;
background-image: url("../img/icon/star-grey-24.png");
border: none;
}
.ui-dialog.sax-dialog-activity button.ActivityReaction:focus
{
background-color: transparent;
box-shadow: none;
outline: none;
}
.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 */
Binary file not shown.

After

Width:  |  Height:  |  Size: 648 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 964 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -55,6 +55,7 @@
$('.sax-panel-messages', $pnl.results).hide().empty();
if (!$('#ifFilterOrganisationId', $frm.filter).val())
$('.OrganisationName', $item).text(item.organisationName);
$('.ArticleFeedback', $item).html(item.feedback ? '[<img src="/img/icon/star-gold-16.png" style="vertical-align:top;" />' + item.feedback.summary + ']' : '').toggle(!!item.feedback);
$('.ArticleHeadline', $item).text(item.headline);
$('.ArticleSummary', $item).text(item.summary);
$('.ArticleRegionCaption', $item).text(item.regionCaptionPrimary);
@@ -197,6 +198,7 @@
$('#chkArticlePublish', $frmA).prop("checked", item.published);
$('.sax-input.sax-calendar.ArticlePublishOn', $frmA).datepicker('setDate', item.published ? item.publishedOn_Calendar : 'today');
$('span.ArticlePublishedOn', $frmA).text(item.publishedOnFmt);
$('span.ArticleFeedback', $frmA).html(item.feedback ? '<img src="/img/icon/star-gold-16.png" style="vertical-align:top;" />&nbsp;' + item.feedback.summary : '');
$('div.ArticlePublish', $frmA).toggle(!item.published || item.publishedInFuture);
$('div.ArticlePublished', $frmA).toggle(!!item.published && !item.publishedInFuture);
$('#cbArticleStatusCode', $frmA).val(item.statusCode);
+47 -37
View File
@@ -10,11 +10,10 @@
sax.refreshResults = function (delay)
{
if (sax.awaitingLogin) return;
var $results = $('.sax-panel-results');
if (!sax.awaitingRefreshResponse)
{
var $items = $('.sax-panel-item-list', $results).fadeOut(200).empty();
var $msgs = $('.sax-panel-messages', $results).hide().empty().append($('<div class="sax-message">' + sax.msg.dataQuerying + '</div>')).fadeIn(200);
var $items = $('.sax-panel-item-list', sax.$pnl.results).fadeOut(200).empty();
var $msgs = $('.sax-panel-messages', sax.$pnl.results).hide().empty().append($('<div class="sax-message">' + sax.msg.dataQuerying + '</div>')).fadeIn(200);
}
sax.ajax.refreshResults = sax.ajax.refreshResults || { url: sax.url.base + 'Activity/Ajax/GetList', formId: 'frmActivityFilter', callbackFn: sax.doRefreshResults };
sax.doAjaxRequest(sax.ajax.refreshResults, delay || 50);
@@ -24,28 +23,29 @@
{
//sax.debug('doRefreshResults', response);
delete sax.awaitingRefreshResponse;
var $results = $('.sax-panel-results');
var $msgs = $('.sax-panel-messages', $results).hide().empty();
var $items = $('.sax-panel-item-list', $results).hide().empty();
var $tmpl = $('.sax-panel-item-template .sax-panel-item', $results);
var $msgs = $('.sax-panel-messages', sax.$pnl.results).hide().empty();
var $items = $('.sax-panel-item-list', sax.$pnl.results).hide().empty();
if (!response.success) return;
var items = response.activities;
if (!items.length)
return $msgs.append($('<div class="sax-message">' + sax.msg.dataNoneFound + '</div>')).fadeIn(500);
for (let itemIdx = 0; itemIdx < items.length; itemIdx++)
{
let item = items[itemIdx];
let $item = $tmpl.clone();
sax.populateItem($item, item);
$items.append($item);
sax.activity = { item: items[itemIdx], $item: sax.getActivityTemplate() };
sax.populateItem(sax.activity);
$items.append(sax.activity.$item);
delete sax.activity;
}
$items.fadeIn(50);
}
sax.populateItem = function ($item, item)
sax.populateItem = function (activity)
{
//sax.debug('populateItem', item);
//sax.debug('populateItem', activity);
let item = activity.item;
let $item = activity.$item;
if (!item) return;
$item.addClass(item.itemTypeClass).toggleClass('sax-activity-reaction-' + item.reaction, !!item.reaction);
$item.addClass(item.itemTypeClass);//.toggleClass('sax-activity-reaction-' + item.reaction, !!item.reaction);
sax.refreshItemReaction(activity);
$('.ActivityOrganisation', $item).text(item.organisation);
$('.ActivityAuthor', $item).text(item.author);
$('.ActivityCaption', $item).text(item.caption);
@@ -53,24 +53,37 @@
$('.ActivitySport', $item).text(item.sport);
$('.ActivityRegion', $item).text(item.region);
$('.ActivityPublishedOn', $item).text(item.publishedOnFmt);
$item.off('click').on('click', function () { sax.expandActivity(item, $item); })
$('.sax-panel-results .sax-panel-messages').hide().empty();
$item.on('click', '.sax-header .ActivityCaption', function () { sax.expandActivity(activity); }).on('dblclick', '.sax-content', function () { sax.expandActivity(activity); });
$('.sax-panel-messages', sax.$pnl.results).hide().empty();
}
sax.refreshItem = function ()
sax.refreshItem = function (activity)
{
if (!sax.activity) return;
for (let i = 1; i < 4; i++)
sax.activity.$item.toggleClass('sax-activity-reaction-' + i, sax.activity.item.reaction == i);
if (!activity) return;
sax.refreshItemReaction(activity);
}
sax.refreshItemReaction = function (activity)
{
if (!activity) return;
let $react = $('.ActivityReaction', activity.$item).empty();
for (let i = 1; i <= Math.min(5, activity.item.reaction); i++)
$react.append($('<img>').prop('src', '../img/icon/star-gold-16.png'));
}
//--------------------------------------------------------------
sax.expandActivity = function (item, $item)
sax.getActivityTemplate = function ()
{
//sax.debug('expandActivity', item, $item);
return $('.sax-panel-item-template .sax-panel-item.Activity', sax.$pnl.results).clone();
}
//--------------------------------------------------------------
sax.expandActivity = function (activity)
{
//sax.debug('expandActivity', activity);
let $frm = $('#frmActivityId');
$('.ActivityItemType', $frm).val(item.itemType);
$('.ActivityItemId', $frm).val(item.itemId);
sax.activity = { item: item, $item: $item };
$('.ActivityItemType', $frm).val(activity.item.itemType);
$('.ActivityItemId', $frm).val(activity.item.itemId);
sax.activity = activity;
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);
}
@@ -97,6 +110,7 @@
if (seg.body)
{
let $seg = $('.sax-panel-item-template .sax-panel-item.ArticleContentSegment').clone().html(seg.body.html);
$('a', $seg).prop('target', 'sax-art-lnk');
$seg.appendTo($segs);
}
if (seg.image)
@@ -136,18 +150,12 @@
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);
for (let i = 1; i <= 5; i++)
$('.sax-dialog-activity button.ActivityReaction' + i).toggleClass(selectedClass, i <= r);
}
sax.setActivityReaction = function (r)
{
//sax.debug('setActivityReaction', r, $('.sax-dialog-activity button.ActivityReaction' + r));
if ($('.sax-dialog-activity button.ActivityReaction' + r).hasClass(selectedClass)) r = 0;
sax.clearActivityReactionButton();
let fn = function (response)
{
if (!response.success) return;
@@ -165,17 +173,19 @@
//--------------------------------------------------------------
$(function ()
{
sax.$pnl.results = $('.sax-panel-results');
var opt = sax.dlgOpts();
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); } };
opt.buttons['close'] = { text: sax.dlg.btn.close, class: "floatr", click: function () { sax.refreshItem(sax.activity); delete sax.activity; $(this).dialog('close'); } };
for (let i = 1; i <= 5; i++)
opt.buttons['react' + i] = { text: i, class: "floatl ActivityReaction ActivityReaction" + i, click: function () { sax.setActivityReaction(i); } };
sax.$dlg.activity = $('#dlgActivity').dialog(opt);
setTimeout(sax.refreshResults, 250);
});
//--------------------------------------------------------------
}(window, window.document));
/* The End */
+5 -2
View File
@@ -18,7 +18,7 @@ namespace Saxonite.Net.Standard.Base.App
//-------------------------------------------------------------------
public static class Version
{
private static String version { get; } = "1.2.4.4";
private static String version { get; } = "1.2.5.0";
// Retrieve version.
public static String GetFullVersion () { return version; }
public static String GetAppVersion ()
@@ -31,7 +31,7 @@ namespace Saxonite.Net.Standard.Base.App
String[] versionElements = version.Split('.');
return String.Join(".", versionElements.Take(3));
}
catch (Exception exc) { SaLogger.Warn("Sax.Version.ToString " + ExceptionUtil.GetErrorStateMessage(exc)); }
catch (Exception exc) { SaLogger.Warn("Sax.Version.GetAppVersion " + ExceptionUtil.GetErrorStateMessage(exc)); }
}
return version;
}
@@ -40,6 +40,9 @@ namespace Saxonite.Net.Standard.Base.App
//-------------------------------------------------------------------
// Version history.
//-------------------------------------------------------------------
// 1.2.5 20-Apr-2022 Article feedback
// - Online Activity/Article feedback 5 stars, summary on Article list/popup.
// - Admin - User - Sports listed.
// 1.2.4 3-Mar-2022 View own articles.
// - Online Home page lists own articlesregardless of sport/region.
// - Admin System Database Table info.
+5 -3
View File
@@ -284,9 +284,11 @@ namespace Saxonite.Net.Standard.Base.App
{
Unknown = 0,
/* Do not change the values or codes - tied to database. */
Good = 400,
VeryGood = 600,
Exceptional = 800,
OK = 1,
Good = 2,
VeryGood = 3,
Outstanding = 4,
Exceptional = 5,
}
//-------------------------------------------------------------------
+193 -175
View File
@@ -6,7 +6,7 @@ using System.Collections.Generic;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Base.App
{
@@ -17,6 +17,7 @@ namespace Saxonite.Base.App
public enum TableIdx
{
Unknown = 0,
ActivityFeedback,
ActivityIndex,
Article,
ItemAddress,
@@ -42,6 +43,14 @@ namespace Saxonite.Base.App
public enum ColumnIdx
{
Unknown = 0,
ActivityFeedback_ItemType,
ActivityFeedback_ItemId,
ActivityFeedback_ViewCount,
ActivityFeedback_FeedbackCount,
ActivityFeedback_FeedbackTotal,
ActivityFeedback_FeedbackAverage,
ActivityFeedback_CreateOn,
ActivityFeedback_UpdateOn,
ActivityIndex_ItemType,
ActivityIndex_ItemId,
ActivityIndex_SportId,
@@ -367,8 +376,8 @@ namespace Saxonite.Base.App
//-------------------------------------------------------------------
// Data members.
private static readonly int tableCount = 18;
private static readonly int columnCount = 321;
private static readonly int tableCount = 19;
private static readonly int columnCount = 329;
private static ulong maxTextLen = 0;
//-------------------------------------------------------------------
@@ -514,6 +523,7 @@ namespace Saxonite.Base.App
// Table definitions.
private static readonly String[] tables =
{
"ActivityFeedback",
"ActivityIndex",
"Article",
"ItemAddress",
@@ -560,30 +570,20 @@ namespace Saxonite.Base.App
{
new ColumnDfn(1,"ItemType",3,5,false,5),
new ColumnDfn(1,"ItemId",5,-5,false,19),
new ColumnDfn(1,"SportId",4,4,false,10),
new ColumnDfn(1,"RegionId",4,4,false,10),
new ColumnDfn(1,"UserAccountIdOwner",4,4,false,10),
new ColumnDfn(1,"OrganisationIdOwner",4,4,false,10),
new ColumnDfn(1,"EffectiveOn",9,93,false,16),
new ColumnDfn(1,"ExpiresOn",9,93,false,16),
new ColumnDfn(1,"Notes",0,-9,false,2000),
new ColumnDfn(1,"Flags",3,5,false,5),
new ColumnDfn(1,"Status",0,12,false,3),
new ColumnDfn(1,"ViewCount",5,-5,false,19),
new ColumnDfn(1,"FeedbackCount",5,-5,false,19),
new ColumnDfn(1,"FeedbackTotal",5,-5,false,19),
new ColumnDfn(1,"FeedbackAverage",8,3,false,9),
new ColumnDfn(1,"CreateOn",9,93,false,23),
new ColumnDfn(1,"CreateBy",4,4,false,10),
new ColumnDfn(1,"CreateHost",0,12,false,100),
new ColumnDfn(1,"UpdateOn",9,93,false,23),
new ColumnDfn(1,"UpdateBy",4,4,false,10),
new ColumnDfn(1,"UpdateHost",0,12,false,100),
new ColumnDfn(2,"Id",4,4,true,10),
new ColumnDfn(2,"UserAccountIdAuthor",4,4,false,10),
new ColumnDfn(2,"OrganisationId",4,4,false,10),
new ColumnDfn(2,"SportIdPrimary",4,4,false,10),
new ColumnDfn(2,"RegionIdPrimary",4,4,false,10),
new ColumnDfn(2,"Headline",0,-9,false,200),
new ColumnDfn(2,"Summary",0,-9,false,2000),
new ColumnDfn(2,"BodyData",0,-9,false,0),
new ColumnDfn(2,"PublishedAt",9,93,false,16),
new ColumnDfn(2,"ItemType",3,5,false,5),
new ColumnDfn(2,"ItemId",5,-5,false,19),
new ColumnDfn(2,"SportId",4,4,false,10),
new ColumnDfn(2,"RegionId",4,4,false,10),
new ColumnDfn(2,"UserAccountIdOwner",4,4,false,10),
new ColumnDfn(2,"OrganisationIdOwner",4,4,false,10),
new ColumnDfn(2,"EffectiveOn",9,93,false,16),
new ColumnDfn(2,"ExpiresOn",9,93,false,16),
new ColumnDfn(2,"Notes",0,-9,false,2000),
new ColumnDfn(2,"Flags",3,5,false,5),
new ColumnDfn(2,"Status",0,12,false,3),
@@ -593,32 +593,18 @@ namespace Saxonite.Base.App
new ColumnDfn(2,"UpdateOn",9,93,false,23),
new ColumnDfn(2,"UpdateBy",4,4,false,10),
new ColumnDfn(2,"UpdateHost",0,12,false,100),
new ColumnDfn(3,"Id",5,-5,true,19),
new ColumnDfn(3,"ItemType",3,5,false,5),
new ColumnDfn(3,"ItemId",4,4,false,10),
new ColumnDfn(3,"AddressType",3,5,false,5),
new ColumnDfn(3,"Caption",0,-9,false,200),
new ColumnDfn(3,"Line1",0,-9,false,200),
new ColumnDfn(3,"Line2",0,-9,false,200),
new ColumnDfn(3,"Line3",0,-9,false,200),
new ColumnDfn(3,"Town",0,-9,false,100),
new ColumnDfn(3,"Province",0,-9,false,100),
new ColumnDfn(3,"RegionIdProvince",4,4,false,10),
new ColumnDfn(3,"Country",0,-9,false,100),
new ColumnDfn(3,"RegionIdCountry",4,4,false,10),
new ColumnDfn(3,"PostalCode",0,-9,false,32),
new ColumnDfn(3,"PhoneMain",0,-9,false,100),
new ColumnDfn(3,"LocationSource",0,12,false,100),
new ColumnDfn(3,"LocationStoredAt",9,93,false,16),
new ColumnDfn(3,"LocationUpdateRequired",1,-7,false,1),
new ColumnDfn(3,"LocationData",0,-9,false,4000),
new ColumnDfn(3,"LocationFormattedAddress",0,-9,false,4000),
new ColumnDfn(3,"LocationLatitude",8,3,false,9),
new ColumnDfn(3,"LocationLongitude",8,3,false,9),
new ColumnDfn(3,"LocationAltitude",8,3,false,9),
new ColumnDfn(3,"Id",4,4,true,10),
new ColumnDfn(3,"UserAccountIdAuthor",4,4,false,10),
new ColumnDfn(3,"OrganisationId",4,4,false,10),
new ColumnDfn(3,"SportIdPrimary",4,4,false,10),
new ColumnDfn(3,"RegionIdPrimary",4,4,false,10),
new ColumnDfn(3,"Headline",0,-9,false,200),
new ColumnDfn(3,"Summary",0,-9,false,2000),
new ColumnDfn(3,"BodyData",0,-9,false,0),
new ColumnDfn(3,"PublishedAt",9,93,false,16),
new ColumnDfn(3,"Notes",0,-9,false,2000),
new ColumnDfn(3,"Flags",3,5,false,5),
new ColumnDfn(3,"Status",0,1,false,3),
new ColumnDfn(3,"Status",0,12,false,3),
new ColumnDfn(3,"CreateOn",9,93,false,23),
new ColumnDfn(3,"CreateBy",4,4,false,10),
new ColumnDfn(3,"CreateHost",0,12,false,100),
@@ -628,30 +614,48 @@ namespace Saxonite.Base.App
new ColumnDfn(4,"Id",5,-5,true,19),
new ColumnDfn(4,"ItemType",3,5,false,5),
new ColumnDfn(4,"ItemId",4,4,false,10),
new ColumnDfn(4,"ImageType",3,5,false,5),
new ColumnDfn(4,"ImageSeq",2,-6,false,3),
new ColumnDfn(4,"SessionUid",5,-5,false,19),
new ColumnDfn(4,"ImageUid",4,4,false,10),
new ColumnDfn(4,"Filename",0,-9,false,1024),
new ColumnDfn(4,"Mime",0,12,false,64),
new ColumnDfn(4,"ContentType",0,12,false,128),
new ColumnDfn(4,"Width",4,4,false,10),
new ColumnDfn(4,"Height",4,4,false,10),
new ColumnDfn(4,"ImageData",10,-3,false,0),
new ColumnDfn(4,"AddressType",3,5,false,5),
new ColumnDfn(4,"Caption",0,-9,false,200),
new ColumnDfn(4,"Line1",0,-9,false,200),
new ColumnDfn(4,"Line2",0,-9,false,200),
new ColumnDfn(4,"Line3",0,-9,false,200),
new ColumnDfn(4,"Town",0,-9,false,100),
new ColumnDfn(4,"Province",0,-9,false,100),
new ColumnDfn(4,"RegionIdProvince",4,4,false,10),
new ColumnDfn(4,"Country",0,-9,false,100),
new ColumnDfn(4,"RegionIdCountry",4,4,false,10),
new ColumnDfn(4,"PostalCode",0,-9,false,32),
new ColumnDfn(4,"PhoneMain",0,-9,false,100),
new ColumnDfn(4,"LocationSource",0,12,false,100),
new ColumnDfn(4,"LocationStoredAt",9,93,false,16),
new ColumnDfn(4,"LocationUpdateRequired",1,-7,false,1),
new ColumnDfn(4,"LocationData",0,-9,false,4000),
new ColumnDfn(4,"LocationFormattedAddress",0,-9,false,4000),
new ColumnDfn(4,"LocationLatitude",8,3,false,9),
new ColumnDfn(4,"LocationLongitude",8,3,false,9),
new ColumnDfn(4,"LocationAltitude",8,3,false,9),
new ColumnDfn(4,"Notes",0,-9,false,2000),
new ColumnDfn(4,"Flags",3,5,false,5),
new ColumnDfn(4,"Status",0,12,false,3),
new ColumnDfn(4,"Status",0,1,false,3),
new ColumnDfn(4,"CreateOn",9,93,false,23),
new ColumnDfn(4,"CreateBy",4,4,false,10),
new ColumnDfn(4,"CreateHost",0,12,false,100),
new ColumnDfn(4,"UpdateOn",9,93,false,23),
new ColumnDfn(4,"UpdateBy",4,4,false,10),
new ColumnDfn(4,"UpdateHost",0,12,false,100),
new ColumnDfn(5,"Id",4,4,true,10),
new ColumnDfn(5,"Id",5,-5,true,19),
new ColumnDfn(5,"ItemType",3,5,false,5),
new ColumnDfn(5,"ItemId",4,4,false,10),
new ColumnDfn(5,"SportId",4,4,false,10),
new ColumnDfn(5,"ItemSportData",0,-9,false,0),
new ColumnDfn(5,"ImageType",3,5,false,5),
new ColumnDfn(5,"ImageSeq",2,-6,false,3),
new ColumnDfn(5,"SessionUid",5,-5,false,19),
new ColumnDfn(5,"ImageUid",4,4,false,10),
new ColumnDfn(5,"Filename",0,-9,false,1024),
new ColumnDfn(5,"Mime",0,12,false,64),
new ColumnDfn(5,"ContentType",0,12,false,128),
new ColumnDfn(5,"Width",4,4,false,10),
new ColumnDfn(5,"Height",4,4,false,10),
new ColumnDfn(5,"ImageData",10,-3,false,0),
new ColumnDfn(5,"Notes",0,-9,false,2000),
new ColumnDfn(5,"Flags",3,5,false,5),
new ColumnDfn(5,"Status",0,12,false,3),
@@ -662,14 +666,10 @@ namespace Saxonite.Base.App
new ColumnDfn(5,"UpdateBy",4,4,false,10),
new ColumnDfn(5,"UpdateHost",0,12,false,100),
new ColumnDfn(6,"Id",4,4,true,10),
new ColumnDfn(6,"Name",0,-9,false,100),
new ColumnDfn(6,"OrganisationType",0,12,false,3),
new ColumnDfn(6,"OrganisationCategory",0,12,false,3),
new ColumnDfn(6,"SportIdPrimary",4,4,false,10),
new ColumnDfn(6,"RegionIdPrimary",4,4,false,10),
new ColumnDfn(6,"CountryIso2Code",0,12,false,2),
new ColumnDfn(6,"PhoneMain",0,-9,false,50),
new ColumnDfn(6,"PhoneAlt",0,-9,false,50),
new ColumnDfn(6,"ItemType",3,5,false,5),
new ColumnDfn(6,"ItemId",4,4,false,10),
new ColumnDfn(6,"SportId",4,4,false,10),
new ColumnDfn(6,"ItemSportData",0,-9,false,0),
new ColumnDfn(6,"Notes",0,-9,false,2000),
new ColumnDfn(6,"Flags",3,5,false,5),
new ColumnDfn(6,"Status",0,12,false,3),
@@ -680,16 +680,14 @@ namespace Saxonite.Base.App
new ColumnDfn(6,"UpdateBy",4,4,false,10),
new ColumnDfn(6,"UpdateHost",0,12,false,100),
new ColumnDfn(7,"Id",4,4,true,10),
new ColumnDfn(7,"OrganisationId",4,4,false,10),
new ColumnDfn(7,"Name",0,-9,false,100),
new ColumnDfn(7,"OrganisationType",0,12,false,3),
new ColumnDfn(7,"OrganisationCategory",0,12,false,3),
new ColumnDfn(7,"SportIdPrimary",4,4,false,10),
new ColumnDfn(7,"RegionIdCountry",4,4,false,10),
new ColumnDfn(7,"EventAt",9,93,false,16),
new ColumnDfn(7,"EventTypeCode",0,12,false,3),
new ColumnDfn(7,"Summary",0,-9,false,200),
new ColumnDfn(7,"Details",0,-9,false,2000),
new ColumnDfn(7,"EventData",0,-9,false,0),
new ColumnDfn(7,"PublishedAt",9,93,false,16),
new ColumnDfn(7,"ExpiresAt",9,93,false,16),
new ColumnDfn(7,"RegionIdPrimary",4,4,false,10),
new ColumnDfn(7,"CountryIso2Code",0,12,false,2),
new ColumnDfn(7,"PhoneMain",0,-9,false,50),
new ColumnDfn(7,"PhoneAlt",0,-9,false,50),
new ColumnDfn(7,"Notes",0,-9,false,2000),
new ColumnDfn(7,"Flags",3,5,false,5),
new ColumnDfn(7,"Status",0,12,false,3),
@@ -702,11 +700,12 @@ namespace Saxonite.Base.App
new ColumnDfn(8,"Id",4,4,true,10),
new ColumnDfn(8,"OrganisationId",4,4,false,10),
new ColumnDfn(8,"SportIdPrimary",4,4,false,10),
new ColumnDfn(8,"RegionIdPrimary",4,4,false,10),
new ColumnDfn(8,"OpportunityTypeCode",0,12,false,3),
new ColumnDfn(8,"Position",0,-9,false,200),
new ColumnDfn(8,"Outline",0,-9,false,2000),
new ColumnDfn(8,"OpportunityData",0,-9,false,0),
new ColumnDfn(8,"RegionIdCountry",4,4,false,10),
new ColumnDfn(8,"EventAt",9,93,false,16),
new ColumnDfn(8,"EventTypeCode",0,12,false,3),
new ColumnDfn(8,"Summary",0,-9,false,200),
new ColumnDfn(8,"Details",0,-9,false,2000),
new ColumnDfn(8,"EventData",0,-9,false,0),
new ColumnDfn(8,"PublishedAt",9,93,false,16),
new ColumnDfn(8,"ExpiresAt",9,93,false,16),
new ColumnDfn(8,"Notes",0,-9,false,2000),
@@ -719,12 +718,15 @@ namespace Saxonite.Base.App
new ColumnDfn(8,"UpdateBy",4,4,false,10),
new ColumnDfn(8,"UpdateHost",0,12,false,100),
new ColumnDfn(9,"Id",4,4,true,10),
new ColumnDfn(9,"RegionType",3,5,false,5),
new ColumnDfn(9,"CountryIso2Code",0,12,false,2),
new ColumnDfn(9,"Name",0,-9,false,100),
new ColumnDfn(9,"Latitude",8,3,false,9),
new ColumnDfn(9,"Longitude",8,3,false,9),
new ColumnDfn(9,"RegionIdParent",4,4,false,10),
new ColumnDfn(9,"OrganisationId",4,4,false,10),
new ColumnDfn(9,"SportIdPrimary",4,4,false,10),
new ColumnDfn(9,"RegionIdPrimary",4,4,false,10),
new ColumnDfn(9,"OpportunityTypeCode",0,12,false,3),
new ColumnDfn(9,"Position",0,-9,false,200),
new ColumnDfn(9,"Outline",0,-9,false,2000),
new ColumnDfn(9,"OpportunityData",0,-9,false,0),
new ColumnDfn(9,"PublishedAt",9,93,false,16),
new ColumnDfn(9,"ExpiresAt",9,93,false,16),
new ColumnDfn(9,"Notes",0,-9,false,2000),
new ColumnDfn(9,"Flags",3,5,false,5),
new ColumnDfn(9,"Status",0,12,false,3),
@@ -735,9 +737,12 @@ namespace Saxonite.Base.App
new ColumnDfn(9,"UpdateBy",4,4,false,10),
new ColumnDfn(9,"UpdateHost",0,12,false,100),
new ColumnDfn(10,"Id",4,4,true,10),
new ColumnDfn(10,"SportIdParent",4,4,false,10),
new ColumnDfn(10,"RegionType",3,5,false,5),
new ColumnDfn(10,"CountryIso2Code",0,12,false,2),
new ColumnDfn(10,"Name",0,-9,false,100),
new ColumnDfn(10,"SpecialityLabel",3,5,false,5),
new ColumnDfn(10,"Latitude",8,3,false,9),
new ColumnDfn(10,"Longitude",8,3,false,9),
new ColumnDfn(10,"RegionIdParent",4,4,false,10),
new ColumnDfn(10,"Notes",0,-9,false,2000),
new ColumnDfn(10,"Flags",3,5,false,5),
new ColumnDfn(10,"Status",0,12,false,3),
@@ -748,29 +753,9 @@ namespace Saxonite.Base.App
new ColumnDfn(10,"UpdateBy",4,4,false,10),
new ColumnDfn(10,"UpdateHost",0,12,false,100),
new ColumnDfn(11,"Id",4,4,true,10),
new ColumnDfn(11,"EmailAddress",0,-9,false,200),
new ColumnDfn(11,"Title",0,-9,false,20),
new ColumnDfn(11,"FirstName",0,-9,false,100),
new ColumnDfn(11,"Initials",0,-9,false,10),
new ColumnDfn(11,"LastName",0,-9,false,100),
new ColumnDfn(11,"About",0,-9,false,2000),
new ColumnDfn(11,"PhoneMain",0,-9,false,50),
new ColumnDfn(11,"PhoneMobile",0,-9,false,50),
new ColumnDfn(11,"PhoneAlt",0,-9,false,50),
new ColumnDfn(11,"Gender",2,-6,false,3),
new ColumnDfn(11,"DateOfBirthDay",2,-6,false,3),
new ColumnDfn(11,"DateOfBirthMonth",2,-6,false,3),
new ColumnDfn(11,"DateOfBirthYear",3,5,false,5),
new ColumnDfn(11,"RegionIdCountry",4,4,false,10),
new ColumnDfn(11,"RegionIdProvince",4,4,false,10),
new ColumnDfn(11,"JournalistData",0,-9,false,0),
new ColumnDfn(11,"PasswordToken",0,12,false,32),
new ColumnDfn(11,"PasswordHashed",0,-9,false,100),
new ColumnDfn(11,"PasswordHistory",0,-9,false,0),
new ColumnDfn(11,"PasswordChangedAt",9,93,false,16),
new ColumnDfn(11,"LastLoginAt",9,93,false,16),
new ColumnDfn(11,"LastInvalidLoginAt",9,93,false,16),
new ColumnDfn(11,"InvalidLoginCount",3,5,false,5),
new ColumnDfn(11,"SportIdParent",4,4,false,10),
new ColumnDfn(11,"Name",0,-9,false,100),
new ColumnDfn(11,"SpecialityLabel",3,5,false,5),
new ColumnDfn(11,"Notes",0,-9,false,2000),
new ColumnDfn(11,"Flags",3,5,false,5),
new ColumnDfn(11,"Status",0,12,false,3),
@@ -780,19 +765,30 @@ namespace Saxonite.Base.App
new ColumnDfn(11,"UpdateOn",9,93,false,23),
new ColumnDfn(11,"UpdateBy",4,4,false,10),
new ColumnDfn(11,"UpdateHost",0,12,false,100),
new ColumnDfn(12,"Id",5,-5,true,19),
new ColumnDfn(12,"UserAccountId",4,4,false,10),
new ColumnDfn(12,"ItemType",3,5,false,5),
new ColumnDfn(12,"ItemId",5,-5,false,19),
new ColumnDfn(12,"CurrentlyListed",1,-7,false,1),
new ColumnDfn(12,"ListedAtFirst",9,93,false,16),
new ColumnDfn(12,"ListedAtLast",9,93,false,16),
new ColumnDfn(12,"ViewedAtFirst",9,93,false,16),
new ColumnDfn(12,"ViewedAtLast",9,93,false,16),
new ColumnDfn(12,"Reaction",3,5,false,5),
new ColumnDfn(12,"ReactedAtFirst",9,93,false,16),
new ColumnDfn(12,"ReactedAtLast",9,93,false,16),
new ColumnDfn(12,"UserActivityData",0,-9,false,0),
new ColumnDfn(12,"Id",4,4,true,10),
new ColumnDfn(12,"EmailAddress",0,-9,false,200),
new ColumnDfn(12,"Title",0,-9,false,20),
new ColumnDfn(12,"FirstName",0,-9,false,100),
new ColumnDfn(12,"Initials",0,-9,false,10),
new ColumnDfn(12,"LastName",0,-9,false,100),
new ColumnDfn(12,"About",0,-9,false,2000),
new ColumnDfn(12,"PhoneMain",0,-9,false,50),
new ColumnDfn(12,"PhoneMobile",0,-9,false,50),
new ColumnDfn(12,"PhoneAlt",0,-9,false,50),
new ColumnDfn(12,"Gender",2,-6,false,3),
new ColumnDfn(12,"DateOfBirthDay",2,-6,false,3),
new ColumnDfn(12,"DateOfBirthMonth",2,-6,false,3),
new ColumnDfn(12,"DateOfBirthYear",3,5,false,5),
new ColumnDfn(12,"RegionIdCountry",4,4,false,10),
new ColumnDfn(12,"RegionIdProvince",4,4,false,10),
new ColumnDfn(12,"JournalistData",0,-9,false,0),
new ColumnDfn(12,"PasswordToken",0,12,false,32),
new ColumnDfn(12,"PasswordHashed",0,-9,false,100),
new ColumnDfn(12,"PasswordHistory",0,-9,false,0),
new ColumnDfn(12,"PasswordChangedAt",9,93,false,16),
new ColumnDfn(12,"LastLoginAt",9,93,false,16),
new ColumnDfn(12,"LastInvalidLoginAt",9,93,false,16),
new ColumnDfn(12,"InvalidLoginCount",3,5,false,5),
new ColumnDfn(12,"Notes",0,-9,false,2000),
new ColumnDfn(12,"Flags",3,5,false,5),
new ColumnDfn(12,"Status",0,12,false,3),
@@ -802,29 +798,36 @@ namespace Saxonite.Base.App
new ColumnDfn(12,"UpdateOn",9,93,false,23),
new ColumnDfn(12,"UpdateBy",4,4,false,10),
new ColumnDfn(12,"UpdateHost",0,12,false,100),
new ColumnDfn(13,"Id",5,-5,true,19),
new ColumnDfn(13,"UserAccountId",4,4,false,10),
new ColumnDfn(13,"OnlineAt",9,93,false,16),
new ColumnDfn(14,"Id",5,-5,true,19),
new ColumnDfn(13,"ItemType",3,5,false,5),
new ColumnDfn(13,"ItemId",5,-5,false,19),
new ColumnDfn(13,"CurrentlyListed",1,-7,false,1),
new ColumnDfn(13,"ListedAtFirst",9,93,false,16),
new ColumnDfn(13,"ListedAtLast",9,93,false,16),
new ColumnDfn(13,"ViewedAtFirst",9,93,false,16),
new ColumnDfn(13,"ViewedAtLast",9,93,false,16),
new ColumnDfn(13,"Reaction",3,5,false,5),
new ColumnDfn(13,"ReactedAtFirst",9,93,false,16),
new ColumnDfn(13,"ReactedAtLast",9,93,false,16),
new ColumnDfn(13,"UserActivityData",0,-9,false,0),
new ColumnDfn(13,"Notes",0,-9,false,2000),
new ColumnDfn(13,"Flags",3,5,false,5),
new ColumnDfn(13,"Status",0,12,false,3),
new ColumnDfn(13,"CreateOn",9,93,false,23),
new ColumnDfn(13,"CreateBy",4,4,false,10),
new ColumnDfn(13,"CreateHost",0,12,false,100),
new ColumnDfn(13,"UpdateOn",9,93,false,23),
new ColumnDfn(13,"UpdateBy",4,4,false,10),
new ColumnDfn(13,"UpdateHost",0,12,false,100),
new ColumnDfn(14,"UserAccountId",4,4,false,10),
new ColumnDfn(14,"OrganisationId",4,4,false,10),
new ColumnDfn(14,"OrganisationRoleCodes",0,12,false,256),
new ColumnDfn(14,"OrganisationRoleCount",2,-6,false,3),
new ColumnDfn(14,"AdminComment",0,-9,false,2000),
new ColumnDfn(14,"Notes",0,-9,false,2000),
new ColumnDfn(14,"Flags",3,5,false,5),
new ColumnDfn(14,"Status",0,12,false,3),
new ColumnDfn(14,"CreateOn",9,93,false,23),
new ColumnDfn(14,"CreateBy",4,4,false,10),
new ColumnDfn(14,"CreateHost",0,12,false,100),
new ColumnDfn(14,"UpdateOn",9,93,false,23),
new ColumnDfn(14,"UpdateBy",4,4,false,10),
new ColumnDfn(14,"UpdateHost",0,12,false,100),
new ColumnDfn(14,"OnlineAt",9,93,false,16),
new ColumnDfn(15,"Id",5,-5,true,19),
new ColumnDfn(15,"UserAccountId",4,4,false,10),
new ColumnDfn(15,"UserRoleCode",0,12,false,16),
new ColumnDfn(15,"LastLoginAt",9,93,false,16),
new ColumnDfn(15,"LastInvalidLoginAt",9,93,false,16),
new ColumnDfn(15,"InvalidLoginCount",3,5,false,5),
new ColumnDfn(15,"OrganisationId",4,4,false,10),
new ColumnDfn(15,"OrganisationRoleCodes",0,12,false,256),
new ColumnDfn(15,"OrganisationRoleCount",2,-6,false,3),
new ColumnDfn(15,"AdminComment",0,-9,false,2000),
new ColumnDfn(15,"Notes",0,-9,false,2000),
new ColumnDfn(15,"Flags",3,5,false,5),
new ColumnDfn(15,"Status",0,12,false,3),
@@ -834,42 +837,34 @@ namespace Saxonite.Base.App
new ColumnDfn(15,"UpdateOn",9,93,false,23),
new ColumnDfn(15,"UpdateBy",4,4,false,10),
new ColumnDfn(15,"UpdateHost",0,12,false,100),
new ColumnDfn(16,"Id",5,-5,true,19),
new ColumnDfn(16,"UserAccountId",4,4,false,10),
new ColumnDfn(16,"ActivityIndexIds",0,-9,false,0),
new ColumnDfn(16,"UserSessionData",0,-9,false,0),
new ColumnDfn(16,"UserRoleCode",0,12,false,16),
new ColumnDfn(16,"LastLoginAt",9,93,false,16),
new ColumnDfn(16,"LastInvalidLoginAt",9,93,false,16),
new ColumnDfn(16,"InvalidLoginCount",3,5,false,5),
new ColumnDfn(16,"Notes",0,-9,false,2000),
new ColumnDfn(16,"Flags",3,5,false,5),
new ColumnDfn(16,"Status",0,12,false,3),
new ColumnDfn(16,"CreateOn",9,93,false,23),
new ColumnDfn(16,"CreateBy",4,4,false,10),
new ColumnDfn(16,"CreateHost",0,12,false,100),
new ColumnDfn(16,"UpdateOn",9,93,false,23),
new ColumnDfn(17,"Id",5,-5,true,19),
new ColumnDfn(16,"UpdateBy",4,4,false,10),
new ColumnDfn(16,"UpdateHost",0,12,false,100),
new ColumnDfn(17,"UserAccountId",4,4,false,10),
new ColumnDfn(17,"SportId",4,4,false,10),
new ColumnDfn(17,"About",0,-9,false,2000),
new ColumnDfn(17,"Participation",3,5,false,5),
new ColumnDfn(17,"Officiating",3,5,false,5),
new ColumnDfn(17,"UserSportData",0,-9,false,0),
new ColumnDfn(17,"Notes",0,-9,false,2000),
new ColumnDfn(17,"ActivityIndexIds",0,-9,false,0),
new ColumnDfn(17,"UserSessionData",0,-9,false,0),
new ColumnDfn(17,"Flags",3,5,false,5),
new ColumnDfn(17,"Status",0,12,false,3),
new ColumnDfn(17,"CreateOn",9,93,false,23),
new ColumnDfn(17,"CreateBy",4,4,false,10),
new ColumnDfn(17,"CreateHost",0,12,false,100),
new ColumnDfn(17,"UpdateOn",9,93,false,23),
new ColumnDfn(17,"UpdateBy",4,4,false,10),
new ColumnDfn(17,"UpdateHost",0,12,false,100),
new ColumnDfn(18,"Id",5,-5,true,19),
new ColumnDfn(18,"UserSportId",5,-5,false,19),
new ColumnDfn(18,"PeriodFrom",9,93,false,16),
new ColumnDfn(18,"PeriodTo",9,93,false,16),
new ColumnDfn(18,"OrganisationId",4,4,false,10),
new ColumnDfn(18,"OrganisationName",0,-9,false,200),
new ColumnDfn(18,"Summary",0,-9,false,2000),
new ColumnDfn(18,"Team",0,-9,false,64),
new ColumnDfn(18,"League",0,-9,false,64),
new ColumnDfn(18,"Speciality",0,-9,false,64),
new ColumnDfn(18,"SpecialitiesOther",0,-9,false,1000),
new ColumnDfn(18,"RegionIdNation",4,4,false,10),
new ColumnDfn(18,"RegionIdProvince",4,4,false,10),
new ColumnDfn(18,"UserSportExperienceData",0,-9,false,0),
new ColumnDfn(18,"UserAccountId",4,4,false,10),
new ColumnDfn(18,"SportId",4,4,false,10),
new ColumnDfn(18,"About",0,-9,false,2000),
new ColumnDfn(18,"Participation",3,5,false,5),
new ColumnDfn(18,"Officiating",3,5,false,5),
new ColumnDfn(18,"UserSportData",0,-9,false,0),
new ColumnDfn(18,"Notes",0,-9,false,2000),
new ColumnDfn(18,"Flags",3,5,false,5),
new ColumnDfn(18,"Status",0,12,false,3),
@@ -879,6 +874,29 @@ namespace Saxonite.Base.App
new ColumnDfn(18,"UpdateOn",9,93,false,23),
new ColumnDfn(18,"UpdateBy",4,4,false,10),
new ColumnDfn(18,"UpdateHost",0,12,false,100),
new ColumnDfn(19,"Id",5,-5,true,19),
new ColumnDfn(19,"UserSportId",5,-5,false,19),
new ColumnDfn(19,"PeriodFrom",9,93,false,16),
new ColumnDfn(19,"PeriodTo",9,93,false,16),
new ColumnDfn(19,"OrganisationId",4,4,false,10),
new ColumnDfn(19,"OrganisationName",0,-9,false,200),
new ColumnDfn(19,"Summary",0,-9,false,2000),
new ColumnDfn(19,"Team",0,-9,false,64),
new ColumnDfn(19,"League",0,-9,false,64),
new ColumnDfn(19,"Speciality",0,-9,false,64),
new ColumnDfn(19,"SpecialitiesOther",0,-9,false,1000),
new ColumnDfn(19,"RegionIdNation",4,4,false,10),
new ColumnDfn(19,"RegionIdProvince",4,4,false,10),
new ColumnDfn(19,"UserSportExperienceData",0,-9,false,0),
new ColumnDfn(19,"Notes",0,-9,false,2000),
new ColumnDfn(19,"Flags",3,5,false,5),
new ColumnDfn(19,"Status",0,12,false,3),
new ColumnDfn(19,"CreateOn",9,93,false,23),
new ColumnDfn(19,"CreateBy",4,4,false,10),
new ColumnDfn(19,"CreateHost",0,12,false,100),
new ColumnDfn(19,"UpdateOn",9,93,false,23),
new ColumnDfn(19,"UpdateBy",4,4,false,10),
new ColumnDfn(19,"UpdateHost",0,12,false,100),
};
//-------------------------------------------------------------------
@@ -0,0 +1,212 @@
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Utils;
using Saxonite.Net.Standard.Base.App;
using System;
using System.Collections.Generic;
using System.Text;
namespace Saxonite.Net.Standard.Base.Bus
{
//=======================================================================
// ActivityIndex.
//=======================================================================
public abstract class SaxActivityFeedback : SacsHierarchyItem
{
//-------------------------------------------------------------------
// Columns.
public enum Column
{
Pos,
// Item.
ItemType,
ItemType_Code,
ItemType_Desc,
ItemId,
// Feedback.
ViewCount,
FeedbackCount,
FeedbackTotal,
FeedbackAverage,
// Common.
CreateOn_Date,
UpdateOn_Date,
}
//-------------------------------------------------------------------
/// <summary>Properties other than common.</summary>
public class DataProperties
{
public ItemId ItemId { get; set; } = new ItemId();
public long ViewCount { get; set; }
public long FeedbackCount { get; set; }
public long FeedbackTotal { get; set; }
public decimal FeedbackAverage { get; set; }
}
//-------------------------------------------------------------------
// Data.
public new class Data : SacsHierarchyItem.Data
{
// Data members.
private readonly DataProperties data = new DataProperties();
// Construction.
public Data() { }
// Properties.
public ItemId ItemId
{
get { return data.ItemId; }
set { CheckChanged(data.ItemId, value); data.ItemId = value; }
}
public long ViewCount
{
get { return data.ViewCount; }
set { CheckChanged(data.ViewCount, value); data.ViewCount = value; }
}
public long FeedbackCount
{
get { return data.FeedbackCount; }
set { CheckChanged(data.FeedbackCount, value); data.FeedbackCount = value; }
}
public long FeedbackTotal
{
get { return data.FeedbackTotal; }
set { CheckChanged(data.FeedbackTotal, value); data.FeedbackTotal = value; }
}
public decimal FeedbackAverage
{
get { return data.FeedbackAverage; }
set { CheckChanged(data.FeedbackAverage, value); data.FeedbackAverage = value; }
}
// Population.
internal void PopulateFrom(Data data)
{
ItemId = data.ItemId;
ViewCount = data.ViewCount;
FeedbackCount = data.FeedbackCount;
FeedbackTotal = data.FeedbackTotal;
FeedbackAverage = data.FeedbackAverage;
base.PopulateFrom(data);
}
public Data Clone()
{
Data data = new Data();
data.PopulateFrom(this);
return data;
}
}
//-------------------------------------------------------------------
// Error field - identify properties with validation error.
public new class ErrField : SacsHierarchyItem.ErrField
{
// Identifies the field that has invalid data.
public ValidValue ItemId { get; set; } = ValidValue.Valid;
public ValidValue ViewCount { get; set; } = ValidValue.Valid;
public ValidValue FeedbackCount { get; set; } = ValidValue.Valid;
public ValidValue FeedbackTotal { get; set; } = ValidValue.Valid;
public ValidValue FeedbackAverage { get; set; } = ValidValue.Valid;
}
//-------------------------------------------------------------------
// Data members.
private readonly Data data = new Data();
//-------------------------------------------------------------------
// Construction.
protected SaxActivityFeedback(ItemId itemId) : base()
{
base.SetData(data);
ItemId = itemId;
}
//-------------------------------------------------------------------
// Item Types.
private readonly static List<Sax.DataItemType> validItemTypes = new List<Sax.DataItemType>()
{ Sax.DataItemType.Article, Sax.DataItemType.OrganisationEvent, Sax.DataItemType.OrganisationOpportunity };
public static List<Sax.DataItemType> ValidItemTypes { get { return new List<Sax.DataItemType>(validItemTypes); } }
//-------------------------------------------------------------------
// Utilities.
//-------------------------------------------------------------------
// Properties.
public Data GetData() { return data.Clone(); }
public void SetData(Data data)
{
String fn = GetType().Name + ".SetData";
// Properties that cannot be changed if previously specified.
if (SysId.IsValid(Id) && SysId.ToInt(Id) != SysId.ToInt(data.Id))
throw new NotSupportedException(fn + " Id cannot be changed");
if (ItemId.IsValid(ItemId) && ItemId.Type != data.ItemId.Type && SysId.ToInt(ItemId.Id) != SysId.ToInt(data.ItemId.Id))
throw new NotSupportedException(fn + " Item Id cannot be changed");
this.data.PopulateFrom(data);
}
public ItemId ItemId
{
get { return data.ItemId; }
protected set { data.ItemId = value; }
}
public long ViewCount
{
get { return data.ViewCount; }
set { data.ViewCount = value; }
}
public long FeedbackCount
{
get { return data.FeedbackCount; }
set { data.FeedbackCount = value; }
}
public long FeedbackTotal
{
get { return data.FeedbackTotal; }
set { data.FeedbackTotal = value; }
}
public decimal FeedbackAverage
{
get { return data.FeedbackAverage; }
set { data.FeedbackAverage = value; }
}
//-------------------------------------------------------------------
// Flags - positions 1-16 available.
//-------------------------------------------------------------------
// A s s o c i a t e d D a t a
//-------------------------------------------------------------------
//-------------------------------------------------------------------
// P a r a m s
//-------------------------------------------------------------------
/// <summary>
/// Combination Sport and Region Ids to index activities.
/// </summary>
public class SportFeedbackAverages
{
public SportFeedbackAverages(SysId sportId, SysId regionId)
{
FeedbackTotal = sportId;
FeedbackAverage = regionId;
}
public SysId FeedbackTotal { get; }
public SysId FeedbackAverage { get; }
}
/// <summary>
/// Item list parameters.
/// </summary>
public new class Params : SacsHierarchyItem.Params
{
// List filtering.
public List<ItemId> ItemIdsIncluded { get; } = new List<ItemId>();
}
//-------------------------------------------------------------------
}
//=======================================================================
// Item list extension methods.
public static class SaxActivityFeedbackList
{
}
//=======================================================================
}
@@ -60,7 +60,7 @@ namespace Saxonite.Net.Standard.Base.Bus
/// <summary>Properties other than common.</summary>
public class DataProperties
{
public ItemId ItemId { get; set; }
public ItemId ItemId { get; set; } = new ItemId();
public SysId UserAccountIdOwner { get; set; }
public SysId OrganisationIdOwner { get; set; }
public SysId SportId { get; set; }
@@ -175,6 +175,12 @@ namespace Saxonite.Net.Standard.Base.Bus
Status = DefaultStatus;
}
//-------------------------------------------------------------------
// Item Types.
private readonly static List<Sax.DataItemType> validItemTypes = new List<Sax.DataItemType>()
{ Sax.DataItemType.Article, Sax.DataItemType.OrganisationEvent, Sax.DataItemType.OrganisationOpportunity };
public static List<Sax.DataItemType> ValidItemTypes { get { return new List<Sax.DataItemType>(validItemTypes); } }
//-------------------------------------------------------------------
// Status.
private static readonly List<SaStatus> validStatuses = new List<SaStatus>()
@@ -286,8 +292,6 @@ namespace Saxonite.Net.Standard.Base.Bus
public new class Params : SacsHierarchyItem.Params
{
// List filtering.
public List<SysId> IdsIncluded { get; } = new List<SysId>();
public List<SysId> IdsExcluded { get; } = new List<SysId>();
public List<ItemId> ItemIdsIncluded { get; } = new List<ItemId>();
/// <summary>Activities must match one of the sport/region combinations specified.</summary>
public List<SportRegionIds> SportRegionIdsIncluded { get; } = new List<SportRegionIds>();
@@ -38,6 +38,11 @@ namespace Saxonite.Net.Standard.Base.Bus
Summary,
PublishedAt_Date,
PublishedAt_DateTime,
// Feedback.
Feedback_ViewCount,
Feedback_FeedbackCount,
Feedback_FeedbackTotal,
Feedback_FeedbackAverage,
// Associated data.
// Common.
Notes,
@@ -58,7 +58,7 @@ namespace Saxonite.Net.Standard.Base.Bus
/// <summary>Properties other than common.</summary>
public class DataProperties
{
public ItemId ItemId { get; set; }
public ItemId ItemId { get; set; } = new ItemId();
public Sax.AddressType AddressType { get; set; }
public String Caption { get; set; }
public String Line1 { get; set; }
@@ -50,7 +50,7 @@ namespace Saxonite.Net.Standard.Base.Bus
/// <summary>Properties other than common.</summary>
public class DataProperties
{
public ItemId ItemId { get; set; }
public ItemId ItemId { get; set; } = new ItemId();
public Sax.ImageType ImageType { get; set; }
public byte ImageSeq { get; set; }
public long SessionUid { get; set; }
@@ -42,7 +42,7 @@ namespace Saxonite.Net.Standard.Base.Bus
/// <summary>Properties other than common.</summary>
public class DataProperties
{
public ItemId ItemId { get; set; }
public ItemId ItemId { get; set; } = new ItemId();
public SysId SportId { get; set; }
public String ItemSportData { get; set; }
}
+19 -9
View File
@@ -50,7 +50,7 @@ namespace Saxonite.Net.Standard.Base.Bus
// Data members.
private readonly DataProperties data = new DataProperties();
// Construction.
public Data ()
public Data()
{
Status = DefaultStatus;
}
@@ -71,14 +71,14 @@ namespace Saxonite.Net.Standard.Base.Bus
set { CheckChanged((short)data.SpecialityLabel, (short)value); data.SpecialityLabel = value; }
}
// Population.
internal void PopulateFrom (Data data)
internal void PopulateFrom(Data data)
{
SportIdParent = data.SportIdParent;
Name = data.Name;
SpecialityLabel = data.SpecialityLabel;
base.PopulateFrom(data);
}
public Data Clone ()
public Data Clone()
{
Data data = new Data();
data.PopulateFrom(this);
@@ -102,7 +102,7 @@ namespace Saxonite.Net.Standard.Base.Bus
//-------------------------------------------------------------------
// Construction.
protected SaxSport (SysId id) : base(id)
protected SaxSport(SysId id) : base(id)
{
base.SetData(data);
Status = DefaultStatus;
@@ -118,7 +118,7 @@ namespace Saxonite.Net.Standard.Base.Bus
};
public static SaStatus DefaultStatus { get { return SaStatus.Active; } }
public static List<SaStatus> ValidStatuses { get { return new List<SaStatus>(validStatuses); } }
public static DataValue.TriStateType GetStatusTriState (SaStatus status)
public static DataValue.TriStateType GetStatusTriState(SaStatus status)
{
if (status == SaStatus.Active) return DataValue.TriStateType.Green;
if (status == SaStatus.Inactive) return DataValue.TriStateType.Red;
@@ -128,15 +128,15 @@ namespace Saxonite.Net.Standard.Base.Bus
//-------------------------------------------------------------------
// Utilities.
public ItemId GetItemId ()
public ItemId GetItemId()
{
return new ItemId((short)Sax.DataItemType.Sport, Id);
}
//-------------------------------------------------------------------
// Properties.
public Data GetData () { return data.Clone(); }
public void SetData (Data data)
public Data GetData() { return data.Clone(); }
public void SetData(Data data)
{
String fn = GetType().Name + ".SetData";
// Properties that cannot be changed if previously specified.
@@ -187,7 +187,7 @@ namespace Saxonite.Net.Standard.Base.Bus
// List filtering.
public List<SysId> IdsIncluded { get; } = new List<SysId>();
public List<SysId> IdsExcluded { get; } = new List<SysId>();
public SysId SportIdParent {get; set; }
public SysId SportIdParent { get; set; }
/// <summary>Generic filter - partial sport name, or other matching value (tbd).</summary>
public String SportFilter { get; set; }
public String NameFull { get; set; }
@@ -203,6 +203,16 @@ namespace Saxonite.Net.Standard.Base.Bus
// Item list extension methods.
public static class SaxSportList
{
//-------------------------------------------------------------------
public static SaxSport GetSportById(this IEnumerable<SaxSport> values, SysId sportId)
{
if (!SysId.IsValid(sportId)) return null;
foreach (SaxSport sport in values)
if (sport.Id.Equals(sportId)) return sport;
return null;
}
//-------------------------------------------------------------------
}
//=======================================================================
@@ -46,6 +46,8 @@ namespace Saxonite.Net.Standard.Base.Bus
LastInvalidLoginAt,
InvalidLoginCount,
// Associated data.
UserSportCount,
UserSportCount_Active,
UserRoleCount,
SystemAdminUser,
LastAdminLoginOn,
@@ -53,7 +53,7 @@ namespace Saxonite.Net.Standard.Base.Bus
public class DataProperties
{
public SysId UserAccountId { get; set; }
public ItemId ItemId { get; set; }
public ItemId ItemId { get; set; } = new ItemId();
public bool CurrentlyListed {get; set; }
public DateTime ListedAtFirst { get; set; }
public DateTime ListedAtLast { get; set; }
@@ -3,6 +3,7 @@ using Sarand.Net.Standard.Base.Core;
using Saxonite.Net.Standard.Base.App;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Saxonite.Net.Standard.Base.Bus
@@ -257,6 +258,17 @@ namespace Saxonite.Net.Standard.Base.Bus
// Item list extension methods.
public static class SaxUserSportList
{
//-------------------------------------------------------------------
// Extract Sport Ids.
public static List<SysId> GetSportIds(this IEnumerable<SaxUserSport> values)
{
List<SysId> sportIds = new List<SysId>();
foreach (SaxUserSport userSport in values)
sportIds.AddId(userSport.SportId);
return sportIds;
}
//-------------------------------------------------------------------
}
//=======================================================================
@@ -0,0 +1,191 @@
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
using Saxonite.Base.App;
using Saxonite.Net.Standard.Base.App;
using Saxonite.Net.Standard.Base.Bus;
using System;
using System.Collections.Generic;
using System.Text;
namespace Saxonite.Net.Standard.Base.Mgr
{
//=======================================================================
partial class SaxActivityMgr
{
//*******************************************************************
// Activity Mgr - Activity Index
//*******************************************************************
// Utilities.
public Boolean IsValidItemForFeedback(ItemId itemId)
{
if (!ItemId.IsValid(itemId))
return false;
if (!SaxActivityFeedback.ValidItemTypes.Contains((Sax.DataItemType)itemId.Type))
return false;
return true;
}
//-------------------------------------------------------------------
public SaxActivityFeedback GetActivityFeedbackForItem(ItemId itemId)
{
ClearErrorState();
if (!ItemId.IsValid(itemId))
return null;
SaxActivityFeedback.Params prmActivityFeedback = new SaxActivityFeedback.Params();
prmActivityFeedback.ItemIdsIncluded.Add(itemId);
return GetActivityFeedback(prmActivityFeedback);
}
//-------------------------------------------------------------------
public Boolean UpdateActivityFeedback(ItemId itemId, int viewCountIncrement, int feedbackCountIncrement, int feedbackTotalIncrement, DbUpdateInfo dbUpdateInfo)
{
String fn = "UpdateActivityFeedback";
ClearErrorState();
if (!ItemId.IsValid(itemId))
return SetErrorState("Unable to update activity feedback - Item Id must be supplied");
if (viewCountIncrement == 0 && feedbackCountIncrement == 0 && feedbackTotalIncrement == 0)
return true;
if (DebugMode)
SaLogger.Info(fn + " View count incr: " + viewCountIncrement + ". Feedback count incr: " + feedbackCountIncrement + ". Feedback total incr: " + feedbackTotalIncrement);
using (DisposableCollection<SacsDisposable> disposableItems = new DisposableCollection<SacsDisposable>())
{
bool activityFeedbackCreated = false;
SaxActivityFeedback activityFeedback = GetActivityFeedbackForItem(itemId);
if (activityFeedback == null)
{
activityFeedback = CreateActivityFeedback(itemId);
activityFeedbackCreated = true;
}
disposableItems.Add(activityFeedback);
// Update properties.
activityFeedback.ViewCount = Math.Max(0, activityFeedback.ViewCount + viewCountIncrement);
activityFeedback.FeedbackCount = Math.Max(0, activityFeedback.FeedbackCount + feedbackCountIncrement);
activityFeedback.FeedbackTotal = Math.Max(0, activityFeedback.FeedbackTotal + feedbackTotalIncrement);
activityFeedback.FeedbackAverage = activityFeedback.FeedbackCount > 0 ? (decimal)activityFeedback.FeedbackTotal / activityFeedback.FeedbackCount : 0;
// Store feedback.
if (activityFeedbackCreated)
InsertActivityFeedback(activityFeedback, dbUpdateInfo);
else
UpdateActivityFeedback(activityFeedback, dbUpdateInfo);
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Create item.
public abstract SaxActivityFeedback CreateActivityFeedback(ItemId itemId);
//-------------------------------------------------------------------
// Retrieve individual items.
public abstract SaxActivityFeedback GetActivityFeedback(SaxActivityFeedback.Params prmActivityFeedback);
//-------------------------------------------------------------------
// Validate item data.
public bool IsValidActivityFeedback(SaxActivityFeedback activityIndex)
{
ClearErrorState();
if (activityIndex == null) return SetErrorState(ErrorMessage.ItemNotSpecified);
return IsValidActivityFeedbackData(activityIndex.GetData(), new SaxActivityFeedback.ErrField());
}
public virtual bool IsValidActivityFeedbackData(SaxActivityFeedback.Data data, SaxActivityFeedback.ErrField errField)
{
ClearErrorState();
//---------------------------------------------------------------
// Item Id.
if (errField.ItemId != SacsHierarchyItem.ValidValue.Ignore)
{
if (!ItemId.IsValid(data.ItemId))
{
errField.ItemId = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("item id must be specified");
}
if (!IsValidItemForFeedback(data.ItemId))
{
errField.ItemId = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("invalid item type specified");
}
}
// View Count.
if (errField.ViewCount != SacsHierarchyItem.ValidValue.Ignore && data.ViewCount < 0)
{
errField.ViewCount = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("View count must not be negative");
}
// Feedback Count.
if (errField.FeedbackCount != SacsHierarchyItem.ValidValue.Ignore && data.FeedbackCount < 0)
{
errField.FeedbackCount = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Feedback count must not be negative");
}
// Feedback Total.
if (errField.FeedbackTotal != SacsHierarchyItem.ValidValue.Ignore && data.FeedbackTotal < 0)
{
errField.FeedbackTotal = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Feedback count must not be negative");
}
// Feedback Average.
if (errField.FeedbackAverage != SacsHierarchyItem.ValidValue.Ignore && data.FeedbackAverage < 0)
{
errField.FeedbackAverage = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Feedback count must not be negative");
}
//---------------------------------------------------------------
return true;
}
//-------------------------------------------------------------------
// ActivityFeedback database interface.
public abstract bool InsertActivityFeedback(SaxActivityFeedback activityIndex, DbUpdateInfo dbUpdateInfo);
public abstract bool UpdateActivityFeedback(SaxActivityFeedback activityIndex, DbUpdateInfo dbUpdateInfo);
public virtual bool ActivityFeedbackCanBeDeleted(SaxActivityFeedback activityIndex)
{
ClearErrorState();
return true;
}
public abstract bool DeleteActivityFeedback(SaxActivityFeedback activityIndex, DbUpdateInfo dbUpdateInfo);
//-------------------------------------------------------------------
// ActivityFeedback list:
public abstract ColumnDfn GetActivityFeedbackColumnDfn(SaxActivityFeedback.Column columnId, String caption = "", int width = 0);
public abstract List<String> GetActivityFeedbackQueryFilter(SaxActivityFeedback.Params prmActivityFeedback);
public abstract long GetActivityFeedbackCount(SaxActivityFeedback.Params prmActivityFeedback);
public abstract List<SaxActivityFeedback> GetActivityFeedbackList(SaxActivityFeedback.Params prmActivityFeedback);
public abstract DbResultSet ExecuteActivityFeedbackQuery(List<ColumnDfn> columns, SaxActivityFeedback.Params prmActivityFeedback);
//-------------------------------------------------------------------
/// <summary>
/// Extract and format result set data value where specific handling is required.
/// <para>Where response is an invalid data value, format value using column.FormatValue(values).</para>
/// </summary>
public virtual DataValue GetActivityFeedbackDataValue(ColumnDfn column, NamedValue.Map values)
{
DataValue value = new DataValue();
switch ((SaxActivityFeedback.Column)column.Id)
{
//-----------------------------------------------------------
// Data item type.
case SaxActivityFeedback.Column.ItemType_Code:
{
value = new DataValue(DataItemTypeCodes.GetCodeForType(values.GetLong(column.DataName)));
}
break;
case SaxActivityFeedback.Column.ItemType_Desc:
{
value = new DataValue(DataItemTypeCodes.GetDescForType(values.GetLong(column.DataName)));
}
break;
//-----------------------------------------------------------
}
return value;
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -4,6 +4,7 @@ using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
using Saxonite.Base.App;
using Saxonite.Net.Standard.Base.App;
using Saxonite.Net.Standard.Base.Bus;
using System;
using System.Collections.Generic;
@@ -18,11 +19,21 @@ namespace Saxonite.Net.Standard.Base.Mgr
// Activity Mgr - Activity Index
//*******************************************************************
// Utilities.
public Boolean IsValidItemForIndex(ItemId itemId)
{
if (!ItemId.IsValid(itemId))
return false;
if (!SaxActivityFeedback.ValidItemTypes.Contains((Sax.DataItemType)itemId.Type))
return false;
return true;
}
//-------------------------------------------------------------------
public List<SaxActivityIndex> GetActivityIndexListForItem(ItemId itemId)
{
ClearErrorState();
List<SaxActivityIndex> activityIndexEntries = new List<SaxActivityIndex>();
if (!ItemId.IsValid(itemId)) return activityIndexEntries;
if (!IsValidItemForIndex(itemId)) return activityIndexEntries;
SaxActivityIndex.Params prmActivityIndex = new SaxActivityIndex.Params();
prmActivityIndex.ItemIdsIncluded.Add(itemId);
return GetActivityIndexList(prmActivityIndex);
@@ -50,10 +61,18 @@ namespace Saxonite.Net.Standard.Base.Mgr
//---------------------------------------------------------------
// Item Id.
if (errField.ItemId != SacsHierarchyItem.ValidValue.Ignore && !ItemId.IsValid(data.ItemId))
if (errField.ItemId != SacsHierarchyItem.ValidValue.Ignore)
{
errField.ItemId = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("Item Id must be specified");
if (!ItemId.IsValid(data.ItemId))
{
errField.ItemId = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("item id must be specified");
}
if (!IsValidItemForIndex(data.ItemId))
{
errField.ItemId = SacsHierarchyItem.ValidValue.Invalid;
return SetErrorState("invalid item type specified");
}
}
// Sport.
if (errField.SportId != SacsHierarchyItem.ValidValue.Ignore && !SysId.IsValid(data.SportId))
@@ -169,6 +169,14 @@ namespace Saxonite.Net.Standard.Base.Mgr
public abstract List<String> GetRegionQueryFilter(SaxRegion.Params prmRegion);
public abstract long GetRegionCount(SaxRegion.Params prmRegion);
public abstract List<SaxRegion> GetRegionList(SaxRegion.Params prmRegion);
public List<SaxRegion> GetRegionListByIds(List<SysId> regionIds)
{
if (regionIds.IsEmpty()) return new List<SaxRegion>();
SaxRegion.Params prmRegion = new SaxRegion.Params();
prmRegion.IdsIncluded.AddIds(regionIds);
prmRegion.StatusCat = SaxRegion.StatusCat.Any;
return GetRegionList(prmRegion);
}
public abstract DbResultSet ExecuteRegionQuery(List<ColumnDfn> columns, SaxRegion.Params prmRegion);
//-------------------------------------------------------------------
@@ -149,6 +149,14 @@ namespace Saxonite.Net.Standard.Base.Mgr
public abstract List<String> GetSportQueryFilter(SaxSport.Params prmSport);
public abstract long GetSportCount(SaxSport.Params prmSport);
public abstract List<SaxSport> GetSportList(SaxSport.Params prmSport);
public List<SaxSport> GetSportListByIds(List<SysId> sportIds)
{
if (sportIds.IsEmpty()) return new List<SaxSport>();
SaxSport.Params prmSport = new SaxSport.Params();
prmSport.IdsIncluded.AddIds(sportIds);
prmSport.StatusCat = SaxSport.StatusCat.Any;
return GetSportList(prmSport);
}
public abstract DbResultSet ExecuteSportQuery(List<ColumnDfn> columns, SaxSport.Params prmSport);
//-------------------------------------------------------------------
@@ -0,0 +1,31 @@
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Dbas;
using Saxonite.Net.Standard.Base.Bus;
using System;
using System.Collections.Generic;
using System.Text;
namespace Saxonite.Net.Standard.Dbas.Bus
{
//=======================================================================
public class SaxActivityFeedback_Dbas : SaxActivityFeedback
{
//-------------------------------------------------------------------
// Data members.
private ISacsDatabase database;
//-------------------------------------------------------------------
// Construction.
public SaxActivityFeedback_Dbas(ISacsDatabase database, ItemId itemId) :
base(itemId)
{
this.database = database;
}
//-------------------------------------------------------------------
// Associated data.
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,184 @@
using Microsoft.Data.SqlClient;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
using Saxonite.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
internal class ActivityFeedback_Db : SaxDbDataItem
{
//-------------------------------------------------------------------
// Column definitions.
public class ColumnsData
{
public ColumnDataInt16 _ItemType { get; } = new ColumnDataInt16("ItemType");
public ColumnDataInt64 _ItemId { get; } = new ColumnDataInt64("ItemId");
public ColumnDataInt64 _ViewCount { get; } = new ColumnDataInt64("ViewCount");
public ColumnDataInt64 _FeedbackCount { get; } = new ColumnDataInt64("FeedbackCount");
public ColumnDataInt64 _FeedbackTotal { get; } = new ColumnDataInt64("FeedbackTotal");
public ColumnDataDecimal _FeedbackAverage { get; } = new ColumnDataDecimal("FeedbackAverage");
public ColumnDataDateTime _CreateOn { get; } = new ColumnDataDateTime("CreateOn");
public ColumnDataDateTime _UpdateOn { get; } = new ColumnDataDateTime("UpdateOn");
}
//-------------------------------------------------------------------
// Data members.
protected static List<String> fields { get; } = new List<String>()
{
"ItemType",
"ItemId",
"ViewCount",
"FeedbackCount",
"FeedbackTotal",
"FeedbackAverage",
"CreateOn",
"UpdateOn",
};
protected static List<String> fieldsId { get; } = new List<String>()
{
};
protected static List<String> fieldsPrimary { get; } = new List<String>()
{
"ItemType",
"ItemId",
};
protected static List<String> fieldsIgnoreOnUpdate { get; } = new List<String>()
{
"CreateOn",
"CreateBy",
"CreateHost",
};
//-------------------------------------------------------------------
// Construction.
internal ActivityFeedback_Db (IDatabaseInfo dbInfo) : base(dbInfo)
{
}
//-------------------------------------------------------------------
// Properties.
public override String SchemaName { get; } = "dbo";
public override String TableName { get; } = "ActivityFeedback";
public String TableNameFmt { get { return (!String.IsNullOrEmpty(SchemaName) ? "[" + SchemaName + "]." : "") + "[" + TableName + "]"; } }
public static List<String> Fields { get { return new List<String>(fields); } }
public static List<String> FieldsId { get { return new List<String>(fieldsId); } }
public static List<String> FieldsNonId { get { return fields.FindAll(item => !fieldsId.ContainsCI(item)); } }
// Columns.
public ColumnsData Cols { get; } = new ColumnsData();
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 Int64 _ViewCount { get { return Cols._ViewCount.Value; } set { Cols._ViewCount.Value = value; } }
public Int64 _FeedbackCount { get { return Cols._FeedbackCount.Value; } set { Cols._FeedbackCount.Value = value; } }
public Int64 _FeedbackTotal { get { return Cols._FeedbackTotal.Value; } set { Cols._FeedbackTotal.Value = value; } }
public Decimal _FeedbackAverage { get { return Cols._FeedbackAverage.Value; } set { Cols._FeedbackAverage.Value = value; } }
public DateTime _CreateOn { get { return Cols._CreateOn.Value; } set { Cols._CreateOn.Value = value; } }
public DateTime _UpdateOn { get { return Cols._UpdateOn.Value; } set { Cols._UpdateOn.Value = value; } }
// Existing columns - confirmed on database if table exists.
public List<String> ExistingColumnNames { get { return GetExistingColumnNames(Fields); } }
public List<String> ExistingColumnNamesNonId { get { return GetExistingColumnNames(FieldsNonId); } }
//-------------------------------------------------------------------
// Population.
public override void PopulateFrom (DbCommand dbCommand, String tableAlias, String filter)
{
dbCommand.CommandText =
"SELECT " + ExistingColumnNames.Concat(", ", (!String.IsNullOrEmpty(tableAlias) ? tableAlias + "." : "") + "[", "]") + " " +
"FROM " + TableNameFmt + (!String.IsNullOrEmpty(tableAlias) ? " " + tableAlias : "") + " " +
(!String.IsNullOrEmpty(filter) ? "WHERE " + filter : "");
Log(GetType().Name + ".PopulateFrom", dbCommand.CommandText);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
dbDataReader.Read();
PopulateFrom(dbDataReader);
}
}
public override void PopulateFrom (DbDataReader dbDataReader)
{
_ItemType = GetFieldInt16(dbDataReader, "ItemType", _ItemType);
_ItemId = GetFieldInt64(dbDataReader, "ItemId", _ItemId);
_ViewCount = GetFieldInt64(dbDataReader, "ViewCount", _ViewCount);
_FeedbackCount = GetFieldInt64(dbDataReader, "FeedbackCount", _FeedbackCount);
_FeedbackTotal = GetFieldInt64(dbDataReader, "FeedbackTotal", _FeedbackTotal);
_FeedbackAverage = GetFieldDecimal(dbDataReader, "FeedbackAverage", _FeedbackAverage);
_CreateOn = GetFieldDateTime(dbDataReader, "CreateOn", _CreateOn);
_UpdateOn = GetFieldDateTime(dbDataReader, "UpdateOn", _UpdateOn);
}
//-------------------------------------------------------------------
// Insert command.
public override bool ExecuteInsertCommand (DbCommand dbCommand)
{
List<String> columnNames = ExistingColumnNamesNonId;
// Construct query.
String query =
"INSERT INTO " + TableNameFmt + " " +
"("+columnNames.Concat(",","[","]")+") ";
if (dbCommand is SqlCommand)
query += "VALUES (" + columnNames.Concat(",", "@", "") + ") ";
else query += "VALUES (" + StringListUtil.CreateList("?", columnNames.Count).Concat(",") + ") ";
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteInsertCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("ItemType")) AddCommandParameter(dbCommand, "@ItemType", _ItemType);
if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId);
if (columnNames.ContainsCI("ViewCount")) AddCommandParameter(dbCommand, "@ViewCount", _ViewCount);
if (columnNames.ContainsCI("FeedbackCount")) AddCommandParameter(dbCommand, "@FeedbackCount", _FeedbackCount);
if (columnNames.ContainsCI("FeedbackTotal")) AddCommandParameter(dbCommand, "@FeedbackTotal", _FeedbackTotal);
if (columnNames.ContainsCI("FeedbackAverage")) AddCommandParameter(dbCommand, "@FeedbackAverage", _FeedbackAverage);
if (columnNames.ContainsCI("CreateOn")) AddCommandParameter(dbCommand, "@CreateOn", _CreateOn);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
// Execute insert command.
bool commandSuccess = false;
int executeNonQuery = dbCommand.ExecuteNonQuery();
if (executeNonQuery == 1)
{
commandSuccess = true;
}
return commandSuccess;
}
//-------------------------------------------------------------------
// Update command.
public override bool ExecuteUpdateCommand (DbCommand dbCommand)
{
// Columns to update.
List<String> columnNames = ExistingColumnNamesNonId.Where(item => !fieldsPrimary.ContainsCI(item) && !fieldsIgnoreOnUpdate.ContainsCI(item)).ToList();
// Construct query.
String query = "UPDATE " + TableNameFmt + " SET ";
if (dbCommand is SqlCommand)
{
query += StringPairList.CreateFrom(columnNames.Bracket("[","]"),columnNames).Concat("=@").Concat(", ") + " ";
query += "WHERE ItemType=@ItemType AND ItemId=@ItemId;";
}
else
{
query += columnNames.Concat(", ", "", "=?") + " ";
query += "WHERE ItemType=? AND ItemId=?;";
}
dbCommand.CommandText = query;
Log(GetType().Name + ".ExecuteUpdateCommand", dbCommand.CommandText);
// Populate parameters.
dbCommand.Parameters.Clear();
if (columnNames.ContainsCI("ViewCount")) AddCommandParameter(dbCommand, "@ViewCount", _ViewCount);
if (columnNames.ContainsCI("FeedbackCount")) AddCommandParameter(dbCommand, "@FeedbackCount", _FeedbackCount);
if (columnNames.ContainsCI("FeedbackTotal")) AddCommandParameter(dbCommand, "@FeedbackTotal", _FeedbackTotal);
if (columnNames.ContainsCI("FeedbackAverage")) AddCommandParameter(dbCommand, "@FeedbackAverage", _FeedbackAverage);
if (columnNames.ContainsCI("UpdateOn")) AddCommandParameter(dbCommand, "@UpdateOn", _UpdateOn);
AddCommandParameter(dbCommand, "@ItemType", _ItemType);
AddCommandParameter(dbCommand, "@ItemId", _ItemId);
int executeNonQueryResult = dbCommand.ExecuteNonQuery();
return (executeNonQueryResult == 1);
}
//-------------------------------------------------------------------
}
}
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq;
//---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56
// Code generated by Sarand Database Utilities Mon 11-Apr-2022 17:51:44
//---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal
{
@@ -295,6 +295,8 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
//private static readonly String prefixUserAccount_UserSport = aliasUserAccount_UserSport + "_";
private static readonly String aliasUserAccount_UserRole = "UsrAct_UsrRol";
//private static readonly String prefixUserAccount_UserRole = aliasUserAccount_UserRole + "_";
private static readonly String colUserAccount_UserSportCount = "UsrAct_SportCount";
private static readonly String colUserAccount_UserSportCount_Active = "UsrAct_SportCount_Act";
private static readonly String colUserAccount_UserRoleCount = "UsrAct_RoleCount";
private static readonly String colUserAccount_SystemAdminRole = "UsrAct_SystemAdminRole";
private void SetUserAccountColDfn
@@ -401,6 +403,19 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
//-----------------------------------------------------------
// Derived properties.
// User Sports.
case SaxUserAccount.Column.UserSportCount:
SetUserAccountColDfn(columnDfn, "Sports", 80, SaxDbDfn_Core.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.DataName = colUserAccount_UserSportCount;
columnDfn.ReadOnly = true;
break;
case SaxUserAccount.Column.UserSportCount_Active:
SetUserAccountColDfn(columnDfn, "Sports (active)", 80, SaxDbDfn_Core.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.DataName = colUserAccount_UserSportCount_Active;
columnDfn.ReadOnly = true;
break;
// User roles.
case SaxUserAccount.Column.UserRoleCount:
SetUserAccountColDfn(columnDfn, "Roles", 80, SaxDbDfn_Core.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.DataName = colUserAccount_UserRoleCount;
@@ -824,6 +839,24 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(col, aliasUserAccount_UserRole_SysAdmin), prefixUserAccount_UserRole_SysAdmin + SaxDbDfn_Core.GetColumnName(col, false));
}
//---------------------------------------------------------------------
// User Sport count.
if (columns.HasId(SaxUserAccount.Column.UserSportCount) || columns.HasId(SaxUserAccount.Column.UserSportCount_Active))
{
String aliasUserSport = "aUsrSpt";
DbQuery queryUserSport = new DbQuery(CoreDatabase.DbmsType);
queryUserSport.Tables.Add(SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.UserSport), aliasUserSport);
queryUserSport.Columns.Add("Count(*)");
queryUserSport.Filters.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserSport_UserAccountId, aliasUserSport) + "=" + SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserAccount_Id, aliasUserAccount));
queryUserSport.Filters.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserSport_Status, aliasUserSport) + "!='" + SacsSystem.GetStatusCode(SaStatus.Deleted) + "'");
query.Columns.Add("(" + queryUserSport.BuildQuery() + ")", colUserAccount_UserSportCount);
// Active user sports.
queryUserSport.Filters.Clear();
queryUserSport.Filters.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserSport_UserAccountId, aliasUserSport) + "=" + SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserAccount_Id, aliasUserAccount));
queryUserSport.Filters.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserSport_Status, aliasUserSport) + "='" + SacsSystem.GetStatusCode(SaStatus.Active) + "'");
query.Columns.Add("(" + queryUserSport.BuildQuery() + ")", colUserAccount_UserSportCount_Active);
}
//---------------------------------------------------------------------
// User Role count.
if (columns.HasId(SaxUserAccount.Column.UserRoleCount))
@@ -0,0 +1,482 @@
using Sarand.Net.Standard.Dbas.Data;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Saxonite.Base.App;
using Saxonite.Net.Standard.Dbas.Bus;
using Saxonite.Net.Standard.Dbas.Internal;
using Saxonite.Net.Standard.Base.App;
using Saxonite.Net.Standard.Base.Bus;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Text;
using Sarand.Net.Standard.Base.Utils;
using System.Linq;
namespace Saxonite.Net.Standard.Dbas.Mgr
{
//=======================================================================
partial class SaxActivityMgr_Dbas
{
//*******************************************************************
// Activity Mgr - ActivityFeedback
//*******************************************************************
// Utilities.
private List<StringPair> GetLogProperties(SaxActivityFeedback activityFeedback)
{
return new List<StringPair>()
{
new StringPair("ItemId",ItemId.ToString(activityFeedback.ItemId)),
new StringPair("ViewCount",activityFeedback.ViewCount.ToString()),
};
}
//-------------------------------------------------------------------
// Create item.
public override SaxActivityFeedback CreateActivityFeedback(ItemId itemId)
{
ClearErrorState();
return new SaxActivityFeedback_Dbas(CoreDatabase, itemId);
}
private SaxActivityFeedback_Dbas CreateActivityFeedback(ActivityFeedback_Db dbActivityFeedback)
{
ClearErrorState();
ItemId itemId = new ItemId(dbActivityFeedback._ItemType, new SysId(dbActivityFeedback._ItemId));
SaxActivityFeedback_Dbas activityFeedback = new SaxActivityFeedback_Dbas(CoreDatabase, itemId);
PopulateFrom(dbActivityFeedback, activityFeedback);
return activityFeedback;
}
//-------------------------------------------------------------------
// Get item.
public override SaxActivityFeedback GetActivityFeedback(SaxActivityFeedback.Params prm)
{
ClearErrorState();
return GetActivityFeedback(GetActivityFeedbackQueryFilter(prm).Concat(" And ", "(", ")"));
}
private SaxActivityFeedback GetActivityFeedback(String filter)
{
ClearErrorState();
long count = GetActivityFeedbackCount(filter);
if (count == 0) return null;
if (count != 1)
{
SetErrorState("Multiple items found");
return null;
}
SaxActivityFeedback activityFeedback = null;
// Query data.
using (var dbConnection = CoreDatabase.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
ActivityFeedback_Db dbActivityFeedback = new ActivityFeedback_Db(CoreDbInfo);
dbActivityFeedback.PopulateFrom(dbCommand, aliasActivityFeedback, filter);
activityFeedback = CreateActivityFeedback(dbActivityFeedback);
}
catch (Exception exc)
{
SetErrorState("Database query exception");
SaLogger.Warn(GetType().Name + ".GetActivityFeedback\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc));
}
}
return activityFeedback;
}
//-------------------------------------------------------------------
// Validate item.
public override bool IsValidActivityFeedbackData(SaxActivityFeedback.Data data, SaxActivityFeedback.ErrField errField)
{
ClearErrorState();
if (!base.IsValidActivityFeedbackData(data, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert item.
public override bool InsertActivityFeedback(SaxActivityFeedback activityFeedback, DbUpdateInfo dbUpdateInfo)
{
String fn = GetType().Name + ".InsertActivityFeedback";
ClearErrorState();
if (!IsValidActivityFeedback(activityFeedback)) return false;
//if (SysId.IsValid(activityFeedback.Id)) return SetErrorState(ErrorMessage.ValiditemId);
using (var dbConnection = CoreDatabase.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
ActivityFeedback_Db dbActivityFeedback = new ActivityFeedback_Db(CoreDbInfo);
PopulateTo(dbActivityFeedback, activityFeedback, dbUpdateInfo);
if (ActivityFeedback_Db.FieldsNonId.Contains("Id"))
{
// Generate next Id.
// ToDo dbActivityFeedback._Id = CoreDatabase.GetNextIdFromTable("ActivityFeedback");
}
dbActivityFeedback.ExecuteInsertCommand(dbCommand);
//activityFeedback.Id = new SysId(dbActivityFeedback._Id);
activityFeedback.Changed = false;
if (DebugMode) SaLogger.Debug(fn + " Inserted. " + GetLogProperties(activityFeedback).Concat(": ").Concat("", "\n\t"));
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Update item.
public override bool UpdateActivityFeedback(SaxActivityFeedback activityFeedback, DbUpdateInfo dbUpdateInfo)
{
String fn = GetType().Name + ".UpdateActivityFeedback";
ClearErrorState();
if (!IsValidActivityFeedback(activityFeedback)) return false;
//if (!SysId.IsValid(activityFeedback.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
if (!activityFeedback.Changed)
{
if (DebugMode) SaLogger.Debug(fn + " Data not changed. " + GetLogProperties(activityFeedback).Concat(": ").Concat("", "\n\t"));
return true;
}
using (var dbConnection = CoreDatabase.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve item.
dbConnection.Open();
ActivityFeedback_Db dbActivityFeedback = new ActivityFeedback_Db(CoreDbInfo);
dbActivityFeedback.PopulateFrom(dbCommand, aliasActivityFeedback, GetActivityFeedbackQueryFilter(activityFeedback, aliasActivityFeedback).Concat(" AND ", "(", ")"));
// ToDo SaxUpdateLogItemMonitor_ActivityFeedback updateLogMonitor = new SaxUpdateLogItemMonitor_ActivityFeedback(SessionContext, CreateActivityFeedback(dbActivityFeedback), dbUpdateInfo);
// Update item.
PopulateTo(dbActivityFeedback, activityFeedback, dbUpdateInfo);
dbActivityFeedback.ExecuteUpdateCommand(dbCommand);
activityFeedback.Changed = false;
if (DebugMode) SaLogger.Debug(fn + " Updated. " + GetLogProperties(activityFeedback).Concat(": ").Concat("", "\n\t"));
// Record updates.
// ToDo updateLogMonitor.RecordUpdatedValues(activityFeedback);
// ToDo updateLogMonitor.LogUpdates();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Delete item.
public override bool ActivityFeedbackCanBeDeleted(SaxActivityFeedback activityFeedback)
{
ClearErrorState();
if (!base.ActivityFeedbackCanBeDeleted(activityFeedback)) return false;
return true;
}
public override bool DeleteActivityFeedback(SaxActivityFeedback activityFeedback, DbUpdateInfo dbUpdateInfo)
{
String fn = GetType().Name + ".DeleteActivityFeedback";
ClearErrorState();
if (!ActivityFeedbackCanBeDeleted(activityFeedback)) return false;
using (var dbConnection = CoreDatabase.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve item.
dbConnection.Open();
ActivityFeedback_Db dbActivityFeedback = new ActivityFeedback_Db(CoreDbInfo);
String filter = GetActivityFeedbackQueryFilter(activityFeedback, aliasActivityFeedback).Concat(" AND ", "(", ")");
dbActivityFeedback.PopulateFrom(dbCommand, aliasActivityFeedback, filter);
// Delete item.
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = "DELETE " + aliasActivityFeedback + " FROM " + SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.ActivityFeedback) + " As " + aliasActivityFeedback + " WHERE " + filter + ";";
dbCommand.ExecuteNonQuery();
activityFeedback.Changed = false;
if (DebugMode) SaLogger.Debug(fn + " Deleted. " + GetLogProperties(activityFeedback).Concat(": ").Concat("", "\n\t"));
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Copy data properties to and from database.
private void PopulateTo(ActivityFeedback_Db dbActivityFeedback, SaxActivityFeedback activityFeedback, DbUpdateInfo dbUpdateInfo)
{
dbActivityFeedback._ItemType = activityFeedback.ItemId.Type;
dbActivityFeedback._ItemId = SysId.ToInt(activityFeedback.ItemId.Id);
dbActivityFeedback._ViewCount = activityFeedback.ViewCount;
dbActivityFeedback._FeedbackCount = activityFeedback.FeedbackCount;
dbActivityFeedback._FeedbackTotal = activityFeedback.FeedbackTotal;
dbActivityFeedback._FeedbackAverage = activityFeedback.FeedbackAverage;
if (!DateUtil.IsValid(dbActivityFeedback._CreateOn))
{
dbActivityFeedback._CreateOn = DateTime.Now;
}
dbActivityFeedback._UpdateOn = DateTime.Now;
}
private void PopulateFrom(ActivityFeedback_Db dbActivityFeedback, SaxActivityFeedback activityFeedback)
{
//activityFeedback.ItemId = new ItemId(dbActivityFeedback._ItemType, new SysId(dbActivityFeedback._ItemId);
activityFeedback.ViewCount = dbActivityFeedback._ViewCount;
activityFeedback.FeedbackCount = dbActivityFeedback._FeedbackCount;
activityFeedback.FeedbackTotal = dbActivityFeedback._FeedbackTotal;
activityFeedback.FeedbackAverage = dbActivityFeedback._FeedbackAverage;
activityFeedback.SetCreateStamp(dbActivityFeedback._CreateOn, null, null);
activityFeedback.SetUpdateStamp(dbActivityFeedback._UpdateOn, null, null);
activityFeedback.AcceptChanges();
}
//-------------------------------------------------------------------
// Item column definitions.
public static String aliasActivityFeedback { get; } = "ActFbk";
private void SetActivityFeedbackColDfn
(ColumnDfn col, String caption, int width, SaxDbDfn_Core.ColumnIdx dbCol,
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
String alias = "", String prefix = "")
{
if (String.IsNullOrEmpty(alias) && SaxDbDfn_Core.GetTableForColumn(dbCol) == SaxDbDfn_Core.TableIdx.ActivityFeedback)
alias = aliasActivityFeedback;
col.Set(caption, width, (int)dbCol, prefix + SaxDbDfn_Core.GetColumnName(dbCol, false), SaxDbDfn_Core.GetColumnNameQual(dbCol, alias), dataType, align);
if (dataType == DataValue.DataType.String && dbCol != SaxDbDfn_Core.ColumnIdx.Unknown)
col.MaxLength = (int)SaxDbDfn_Core.GetColTextLen(dbCol);
}
public override ColumnDfn GetActivityFeedbackColumnDfn(SaxActivityFeedback.Column columnId, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width);
switch (columnId)
{
//-----------------------------------------------------------
case SaxActivityFeedback.Column.Pos:
SetActivityFeedbackColDfn(columnDfn, "Pos", 60, SaxDbDfn_Core.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
columnDfn.ReadOnly = true;
columnDfn.Resizable = false;
break;
//-----------------------------------------------------------
// Item.
case SaxActivityFeedback.Column.ItemType:
SetActivityFeedbackColDfn(columnDfn, "Item type", 80, SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ItemType, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
case SaxActivityFeedback.Column.ItemType_Code:
SetActivityFeedbackColDfn(columnDfn, "Item type", 80, SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ItemType, ColumnAlignment.Center, DataValue.DataType.String);
columnDfn.ReadOnly = true;
break;
case SaxActivityFeedback.Column.ItemType_Desc:
SetActivityFeedbackColDfn(columnDfn, "Item type", 100, SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ItemType, ColumnAlignment.Center, DataValue.DataType.String);
columnDfn.ReadOnly = true;
break;
case SaxActivityFeedback.Column.ItemId:
SetActivityFeedbackColDfn(columnDfn, "Item #", 80, SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ItemId, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
//-----------------------------------------------------------
// Feedback.
case SaxActivityFeedback.Column.ViewCount:
SetActivityFeedbackColDfn(columnDfn, "Views", 80, SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ViewCount, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
case SaxActivityFeedback.Column.FeedbackCount:
SetActivityFeedbackColDfn(columnDfn, "Feedbacks", 80, SaxDbDfn_Core.ColumnIdx.ActivityFeedback_FeedbackCount, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
case SaxActivityFeedback.Column.FeedbackTotal:
SetActivityFeedbackColDfn(columnDfn, "Feedbacks", 80, SaxDbDfn_Core.ColumnIdx.ActivityFeedback_FeedbackTotal, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
case SaxActivityFeedback.Column.FeedbackAverage:
SetActivityFeedbackColDfn(columnDfn, "Feedbacks", 80, SaxDbDfn_Core.ColumnIdx.ActivityFeedback_FeedbackAverage, ColumnAlignment.Center, DataValue.DataType.Double);
columnDfn.NumDecimals = 2;
columnDfn.ReadOnly = true;
break;
//-----------------------------------------------------------
// Common properties.
case SaxActivityFeedback.Column.CreateOn_Date:
SetActivityFeedbackColDfn(columnDfn, "Created", 80, SaxDbDfn_Core.ColumnIdx.ActivityFeedback_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
case SaxActivityFeedback.Column.UpdateOn_Date:
SetActivityFeedbackColDfn(columnDfn, "Updated", 80, SaxDbDfn_Core.ColumnIdx.ActivityFeedback_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
//-----------------------------------------------------------
}
if (!String.IsNullOrEmpty(caption))
columnDfn.Caption = caption;
if (width > 0)
columnDfn.Width = width;
return columnDfn;
}
//-------------------------------------------------------------------
// Item query filter.
public List<string> GetActivityFeedbackQueryFilter(SaxActivityFeedback activityFeedback, String aliasActivityFeedback)
{
// NB Only the Ids need to be queried. Effective date is a property of the Ids.
List<String> filter = new List<String>();
filter.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ItemType, aliasActivityFeedback) + "=" + activityFeedback.ItemId.Type);
filter.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ItemId, aliasActivityFeedback) + "=" + SysId.ToInt(activityFeedback.ItemId.Id));
return filter;
}
public override List<string> GetActivityFeedbackQueryFilter(SaxActivityFeedback.Params prm)
{
List<String> filter = new List<String>();
String aliasActivityFeedback = SaxActivityMgr_Dbas.aliasActivityFeedback;
// Item Ids.
if (!prm.ItemIdsIncluded.IsEmpty())
{
List<String> itemIdFilters = new List<string>();
foreach (ItemId itemId in prm.ItemIdsIncluded)
{
if (!ItemId.IsValid(itemId)) continue;
String itemIdFilter =
SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ItemType, aliasActivityFeedback) + "=" + itemId.Type +
" AND " + SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ItemId, aliasActivityFeedback) + "=" + SysId.ToInt(itemId.Id);
itemIdFilters.Add(itemIdFilter);
}
if (!itemIdFilters.IsEmpty())
filter.Add(itemIdFilters.Concat(" OR ", "(", ")"));
}
if (filter.Count < 1) filter.Add("1=1");
return filter;
}
// Item sort columns.
public List<String> GetActivityFeedbackSortColumns(SaxActivityFeedback.Params prm)
{
// Sort sequence:
List<String> sortColumnNames = new List<String>();
foreach (var columnDfn in prm.SortColumns)
{
// Need to ensure correct alias used for ActivityFeedback columns in case of conflict.
String sortCol = String.Empty;
if (SaxDbDfn_Core.GetTableForColumn((SaxDbDfn_Core.ColumnIdx)columnDfn.DbColumn) == SaxDbDfn_Core.TableIdx.ActivityFeedback)
{
sortCol = SaxDbDfn_Core.GetColumnNameQual((SaxDbDfn_Core.ColumnIdx)columnDfn.DbColumn, aliasActivityFeedback);
}
else
{
sortCol = columnDfn.DataName;
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
sortCol = columnDfn.SortDataName;
}
if (!sortCol.IsEmpty())
{
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", "));
}
}
sortColumnNames.RemoveBlanks();
if (sortColumnNames.IsEmpty())
{
// Default sort columns.
sortColumnNames.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ItemType, aliasActivityFeedback) + " ASC");
sortColumnNames.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ItemId, aliasActivityFeedback) + " ASC");
}
return sortColumnNames;
}
//-------------------------------------------------------------------
// Item count.
private long GetActivityFeedbackCount(String filter)
{
ClearErrorState();
return CoreDatabase.GetRowCount(SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.ActivityFeedback) + " As " + aliasActivityFeedback, filter);
}
public override long GetActivityFeedbackCount(SaxActivityFeedback.Params prm)
{
ClearErrorState();
return GetActivityFeedbackCount(GetActivityFeedbackQueryFilter(prm).Concat(" AND ", "(", ")"));
}
//-------------------------------------------------------------------
// Item list.
public override List<SaxActivityFeedback> GetActivityFeedbackList(SaxActivityFeedback.Params prm)
{
List<SaxActivityFeedback> userActivitys = new List<SaxActivityFeedback>();
DbQuery qry = new DbQuery(CoreDatabase.DbmsType);
qry.Tables.Add(SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.ActivityFeedback), aliasActivityFeedback);
ActivityFeedback_Db dbActivityFeedback = new ActivityFeedback_Db(CoreDbInfo);
qry.Columns.AddRange(dbActivityFeedback.ExistingColumnNames);
qry.Filters.AddRange(GetActivityFeedbackQueryFilter(prm));
qry.OrderBy.AddRange(GetActivityFeedbackSortColumns(prm));
// Query data.
using (var dbConnection = CoreDatabase.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
while (dbDataReader.Read())
{
dbActivityFeedback = new ActivityFeedback_Db(CoreDbInfo);
dbActivityFeedback.PopulateFrom(dbDataReader);
userActivitys.Add(CreateActivityFeedback(dbActivityFeedback));
}
}
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetActivityFeedbackList\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc));
}
}
return userActivitys;
}
//-------------------------------------------------------------------
// Item query execution.
public override DbResultSet ExecuteActivityFeedbackQuery(List<ColumnDfn> columns, SaxActivityFeedback.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------------
// Construct query.
DbQuery query = new DbQuery(CoreDatabase.DbmsType);
query.Tables.Add(SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.ActivityFeedback), aliasActivityFeedback);
// Add columns as defined in query list.
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ItemType, aliasActivityFeedback));
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ItemId, aliasActivityFeedback));
if (columns.HasId(SaxActivityFeedback.Column.ViewCount))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ViewCount, aliasActivityFeedback));
if (columns.HasId(SaxActivityFeedback.Column.FeedbackCount))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_FeedbackCount, aliasActivityFeedback));
if (columns.HasId(SaxActivityFeedback.Column.FeedbackTotal))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_FeedbackTotal, aliasActivityFeedback));
if (columns.HasId(SaxActivityFeedback.Column.FeedbackAverage))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_FeedbackAverage, aliasActivityFeedback));
// Common properties.
if (columns.HasId(SaxActivityFeedback.Column.CreateOn_Date))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_CreateOn, aliasActivityFeedback));
if (columns.HasId(SaxActivityFeedback.Column.UpdateOn_Date))
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_UpdateOn, aliasActivityFeedback));
//---------------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetActivityFeedbackQueryFilter(prm));
if (prm.ItemIdsIncluded.Count != 1)
{
// Configure sort sequence.
foreach (String sortColumn in GetActivityFeedbackSortColumns(prm))
query.OrderBy.Add(sortColumn);
}
//---------------------------------------------------------------------
//return new DbResultSet_DataTableReader(db, query.BuildQuery(prm.ResultsPaging));
return DbResultSet_DataReader.ExecuteQuery(CoreDatabase, query.BuildQuery(prm.ResultsPaging));
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -672,7 +672,7 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
// Populate filter.
query.Filters.AddRange(GetActivityIndexQueryFilter(prm));
if (prm.IdsIncluded.Count != 1)
if (prm.ItemIdsIncluded.Count != 1)
{
// Configure sort sequence.
foreach (String sortColumn in GetActivityIndexSortColumns(prm))
@@ -256,13 +256,15 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
// Item column definitions.
private static readonly String aliasArticle = "Art";
private static readonly String aliasArticle_Author = "Art_Auth";
private static readonly String prefixArticle_Author = "Art_Jrn_";
private static readonly String prefixArticle_Author = aliasArticle_Author + "_";
private static readonly String aliasArticle_Organisation = "Art_Org";
private static readonly String prefixArticle_Organisation = "Art_Org_";
private static readonly String prefixArticle_Organisation = aliasArticle_Organisation + "_";
private static readonly String aliasArticle_Sport = "Art_Spt";
private static readonly String prefixArticle_Sport = "Art_Spt_";
private static readonly String prefixArticle_Sport = aliasArticle_Sport + "_";
private static readonly String aliasArticle_Region = "Art_Rgn";
private static readonly String prefixArticle_Region = "Art_Rgn_";
private static readonly String prefixArticle_Region = aliasArticle_Region + "_";
private static readonly String aliasArticle_Feedback = "Art_Fbk";
private static readonly String prefixArticle_Feedback = aliasArticle_Feedback + "_";
private void SetArticleColDfn
(ColumnDfn col, String caption, int width, SaxDbDfn_Core.ColumnIdx dbCol,
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
@@ -364,6 +366,26 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
columnDfn.ReadOnly = true;
break;
//-----------------------------------------------------------
// Feedback.
case SaxArticle.Column.Feedback_ViewCount:
SetArticleColDfn(columnDfn, "Views", 80, SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ViewCount, ColumnAlignment.Center, DataValue.DataType.Long, aliasActivityFeedback, prefixArticle_Feedback);
columnDfn.ReadOnly = true;
break;
case SaxArticle.Column.Feedback_FeedbackCount:
SetArticleColDfn(columnDfn, "Feedbacks", 80, SaxDbDfn_Core.ColumnIdx.ActivityFeedback_FeedbackCount, ColumnAlignment.Center, DataValue.DataType.Long, aliasActivityFeedback, prefixArticle_Feedback);
columnDfn.ReadOnly = true;
break;
case SaxArticle.Column.Feedback_FeedbackTotal:
SetArticleColDfn(columnDfn, "Feedback total", 80, SaxDbDfn_Core.ColumnIdx.ActivityFeedback_FeedbackTotal, ColumnAlignment.Center, DataValue.DataType.Long, aliasActivityFeedback, prefixArticle_Feedback);
columnDfn.ReadOnly = true;
break;
case SaxArticle.Column.Feedback_FeedbackAverage:
SetArticleColDfn(columnDfn, "Feedback", 80, SaxDbDfn_Core.ColumnIdx.ActivityFeedback_FeedbackAverage, ColumnAlignment.Center, DataValue.DataType.Double, aliasActivityFeedback, prefixArticle_Feedback);
columnDfn.ReadOnly = true;
columnDfn.NumDecimals = 2;
break;
//-----------------------------------------------------------
// Derived properties.
@@ -672,6 +694,24 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(col, aliasArticle_Region), prefixArticle_Region + SaxDbDfn_Core.GetColumnName(col, false));
}
//---------------------------------------------------------------------
// Feedback.
if (columns.HasId(SaxArticle.Column.Feedback_ViewCount) || columns.HasId(SaxArticle.Column.Feedback_FeedbackCount) || columns.HasId(SaxArticle.Column.Feedback_FeedbackTotal) || columns.HasId(SaxArticle.Column.Feedback_FeedbackAverage))
{
DbQueryJoin joinFeedback = new DbQueryJoin(DbJoinType.LeftOuter);
joinFeedback.Table = new StringPair(SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.ActivityFeedback), aliasArticle_Feedback);
joinFeedback.Filters.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ItemType, aliasArticle_Feedback) + "=" + ((int)Sax.DataItemType.Article).ToString());
joinFeedback.Filters.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ItemId, aliasArticle_Feedback) + "=" + SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.Article_Id, aliasArticle));
query.Joins.Add(joinFeedback);
List<SaxDbDfn_Core.ColumnIdx> cols = new List<SaxDbDfn_Core.ColumnIdx>();
cols.Add(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_ViewCount);
cols.Add(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_FeedbackCount);
cols.Add(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_FeedbackTotal);
cols.Add(SaxDbDfn_Core.ColumnIdx.ActivityFeedback_FeedbackAverage);
foreach (var col in cols)
query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(col, aliasArticle_Feedback), prefixArticle_Feedback + SaxDbDfn_Core.GetColumnName(col, false));
}
//---------------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetArticleQueryFilter(prm));
@@ -122,6 +122,7 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
userActivity.Id = new SysId(dbUserActivity._Id);
userActivity.Changed = false;
if (DebugMode) SaLogger.Debug(fn + " Inserted. " + GetLogProperties(userActivity).Concat(": ").Concat("", "\n\t"));
UpdateActivityFeedback(userActivity, null, dbUpdateInfo);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
@@ -150,6 +151,8 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
dbConnection.Open();
UserActivity_Db dbUserActivity = new UserActivity_Db(CoreDbInfo);
dbUserActivity.PopulateFrom(dbCommand, aliasUserActivity, "Id=" + SysId.ToString(userActivity.Id));
// Snapshot item.
SaxUserActivity userActivity_Snapshot = CreateUserActivity(dbUserActivity);
// ToDo SaxUpdateLogItemMonitor_UserActivity updateLogMonitor = new SaxUpdateLogItemMonitor_UserActivity(SessionContext, CreateUserActivity(dbUserActivity), dbUpdateInfo);
// Update item.
PopulateTo(dbUserActivity, userActivity, dbUpdateInfo);
@@ -159,12 +162,35 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
// Record updates.
// ToDo updateLogMonitor.RecordUpdatedValues(userActivity);
// ToDo updateLogMonitor.LogUpdates();
// Update activity feedback.
UpdateActivityFeedback(userActivity, userActivity_Snapshot, dbUpdateInfo);
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
private bool UpdateActivityFeedback (SaxUserActivity userActivity, SaxUserActivity userActivity_Previous, DbUpdateInfo dbUpdateInfo)
{
// Calculate changes in feedback for this user activity compared to the previous instance.
// User activity status - deleted are ignored.
bool deletedPreviously = userActivity_Previous?.IsStatusDeleted ?? true;
bool deletedCurrently = userActivity.IsStatusDeleted;
// Activity viewing.
bool viewedPreviously = userActivity_Previous?.ViewedAtFirst.IsValid() ?? false && !deletedPreviously;
bool viewedCurrently = userActivity.ViewedAtFirst.IsValid() && !deletedCurrently;
int viewCountIncrement = viewedCurrently == viewedPreviously ? 0 : viewedCurrently ? 1 : -1;
// Activity feaction.
int feedbackPreviously = Math.Max(0, (!deletedPreviously && userActivity_Previous != null) ? (int)userActivity_Previous.Reaction : 0);
int feedbackCurrently = Math.Max(0, !deletedCurrently ? (int)userActivity.Reaction : 0);
bool reactedPreviously = (userActivity_Previous?.ReactedAtFirst.IsValid() ?? false) && (feedbackPreviously > 0) && !deletedPreviously;
bool reactedCurrently = (userActivity.ReactedAtFirst.IsValid() && feedbackCurrently > 0 && !deletedCurrently);
int feedbackCountIncrement = reactedCurrently == reactedPreviously ? 0 : reactedCurrently ? 1 : -1;
int feedbackTotalIncrement = feedbackCurrently - feedbackPreviously;
// Update the Activity feedback.
return ActivityMgr.UpdateActivityFeedback(userActivity.ItemId, viewCountIncrement, feedbackCountIncrement, feedbackTotalIncrement, dbUpdateInfo);
}
//-------------------------------------------------------------------
// Delete item.
public override bool UserActivityCanBeDeleted(SaxUserActivity userActivity)
@@ -1,6 +1,176 @@
<?xml version="1.0"?>
<DbDfnDatabase xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Tables>
<DbDfnTable>
<Schema>dbo</Schema>
<Name>ActivityFeedback</Name>
<Remarks />
<Columns>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityFeedback</Table>
<Pos>1</Pos>
<Name>ItemType</Name>
<DataType>SmallInt</DataType>
<DataTypeName />
<DataTypeNative>5</DataTypeNative>
<DataTypeNameNative>smallint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>5</Size>
<BufferLen>2</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityFeedback</Table>
<Pos>2</Pos>
<Name>ItemId</Name>
<DataType>BigInt</DataType>
<DataTypeName />
<DataTypeNative>-5</DataTypeNative>
<DataTypeNameNative>bigint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>19</Size>
<BufferLen>8</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityFeedback</Table>
<Pos>3</Pos>
<Name>ViewCount</Name>
<DataType>BigInt</DataType>
<DataTypeName />
<DataTypeNative>-5</DataTypeNative>
<DataTypeNameNative>bigint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>19</Size>
<BufferLen>8</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityFeedback</Table>
<Pos>4</Pos>
<Name>FeedbackCount</Name>
<DataType>BigInt</DataType>
<DataTypeName />
<DataTypeNative>-5</DataTypeNative>
<DataTypeNameNative>bigint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>19</Size>
<BufferLen>8</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityFeedback</Table>
<Pos>5</Pos>
<Name>FeedbackTotal</Name>
<DataType>BigInt</DataType>
<DataTypeName />
<DataTypeNative>-5</DataTypeNative>
<DataTypeNameNative>bigint</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>19</Size>
<BufferLen>8</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityFeedback</Table>
<Pos>6</Pos>
<Name>FeedbackAverage</Name>
<DataType>Decimal</DataType>
<DataTypeName />
<DataTypeNative>3</DataTypeNative>
<DataTypeNameNative>decimal</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>9</Size>
<BufferLen>11</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityFeedback</Table>
<Pos>7</Pos>
<Name>CreateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>datetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>23</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ActivityFeedback</Table>
<Pos>8</Pos>
<Name>UpdateOn</Name>
<DataType>DateTime</DataType>
<DataTypeName />
<DataTypeNative>93</DataTypeNative>
<DataTypeNameNative>datetime</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>23</Size>
<BufferLen>16</BufferLen>
<DecimalDigits>3</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
</Columns>
<Indices>
<DbDfnIndex>
<Schema>dbo</Schema>
<Table>ActivityFeedback</Table>
<Name>PK_ActivityFeedback</Name>
<IndexType>1</IndexType>
<Unique>true</Unique>
<Primary>false</Primary>
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>0</Pages>
<UniqueValues>0</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
<Seq>1</Seq>
<Name>ItemType</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
<DbDfnIndexColumn>
<Seq>2</Seq>
<Name>ItemId</Name>
<Ascend>true</Ascend>
</DbDfnIndexColumn>
</Columns>
</DbDfnIndex>
</Indices>
</DbDfnTable>
<DbDfnTable>
<Schema>dbo</Schema>
<Name>ActivityIndex</Name>
@@ -307,7 +477,7 @@
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>1</Pages>
<UniqueValues>22</UniqueValues>
<UniqueValues>23</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
@@ -762,7 +932,7 @@
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>3</Pages>
<UniqueValues>20</UniqueValues>
<UniqueValues>21</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
@@ -1813,7 +1983,7 @@
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>1</Pages>
<UniqueValues>17</UniqueValues>
<UniqueValues>19</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
@@ -5155,7 +5325,7 @@
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>1</Pages>
<UniqueValues>32</UniqueValues>
<UniqueValues>36</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>
@@ -5318,7 +5488,7 @@
<Clustered>false</Clustered>
<Nullable>false</Nullable>
<Pages>1</Pages>
<UniqueValues>2</UniqueValues>
<UniqueValues>3</UniqueValues>
<HasColumns>false</HasColumns>
<Columns>
<DbDfnIndexColumn>