This commit is contained in:
2021-06-22 10:05:59 +01:00
parent 558be9063f
commit e40ff8a7f2
50 changed files with 899 additions and 184 deletions
@@ -48,6 +48,10 @@ namespace Saxonite.Net.Core.UnitTests.Web.Admin.App
Assert.IsTrue(sessionData.ValidUserSession); Assert.IsTrue(sessionData.ValidUserSession);
Assert.AreNotEqual("", sessionData.User.DisplayName); Assert.AreNotEqual("", sessionData.User.DisplayName);
int idx = sessionData.NextItemIdx;
idx = sessionData.NextItemIdx;
idx = sessionData.NextItemIdx;
// Serialise session data using same method as base controller. // Serialise session data using same method as base controller.
String sessionDataJson = JsonConvert.SerializeObject(sessionData); String sessionDataJson = JsonConvert.SerializeObject(sessionData);
Assert.AreNotEqual("", sessionDataJson); Assert.AreNotEqual("", sessionDataJson);
@@ -61,6 +65,8 @@ namespace Saxonite.Net.Core.UnitTests.Web.Admin.App
Assert.IsNotNull(sessionDataDeserialized); Assert.IsNotNull(sessionDataDeserialized);
// Validate deserialised values. // Validate deserialised values.
Assert.AreEqual(sessionData.SessionIdx, sessionDataDeserialized.SessionIdx);
Assert.AreEqual(sessionData.ItemIdx, sessionDataDeserialized.ItemIdx);
Assert.AreEqual(App.SessionContext.Index, sessionDataDeserialized.SessionContext.Index); Assert.AreEqual(App.SessionContext.Index, sessionDataDeserialized.SessionContext.Index);
Assert.AreEqual(Sax.Application.Admin, sessionDataDeserialized.SessionContext.Application); Assert.AreEqual(Sax.Application.Admin, sessionDataDeserialized.SessionContext.Application);
Assert.AreEqual(SysId.ToInt(sessionDataDeserialized.User.UserAccountId), SysId.ToInt(sessionDataDeserialized.User.UserAccountId)); Assert.AreEqual(SysId.ToInt(sessionDataDeserialized.User.UserAccountId), SysId.ToInt(sessionDataDeserialized.User.UserAccountId));
@@ -77,6 +77,10 @@ namespace Saxonite.Net.Core.UnitTests.Web.Online.App
sessionData.Filter.OrganisationIdMember = filterOrganisationIdMember; sessionData.Filter.OrganisationIdMember = filterOrganisationIdMember;
sessionData.Filter.OrganisationCaptionMember = filterOrganisationCaptionMember; sessionData.Filter.OrganisationCaptionMember = filterOrganisationCaptionMember;
int idx = sessionData.NextItemIdx;
idx = sessionData.NextItemIdx;
idx = sessionData.NextItemIdx;
// Serialise session data using same method as base controller. // Serialise session data using same method as base controller.
String sessionDataJson = JsonConvert.SerializeObject(sessionData); String sessionDataJson = JsonConvert.SerializeObject(sessionData);
Assert.AreNotEqual("", sessionDataJson); Assert.AreNotEqual("", sessionDataJson);
@@ -90,8 +94,13 @@ namespace Saxonite.Net.Core.UnitTests.Web.Online.App
Assert.IsNotNull(sessionDataDeserialised); Assert.IsNotNull(sessionDataDeserialised);
// Validate deserialised values. // Validate deserialised values.
Assert.AreEqual(sessionData.SessionIdx, sessionDataDeserialised.SessionIdx);
Assert.AreEqual(sessionData.ItemIdx, sessionDataDeserialised.ItemIdx);
Assert.AreEqual(sessionData.Base64IV_OnlineApp, sessionDataDeserialised.Base64IV_OnlineApp);
Assert.AreEqual(App.SessionContext.Index, sessionDataDeserialised.SessionContext.Index); Assert.AreEqual(App.SessionContext.Index, sessionDataDeserialised.SessionContext.Index);
Assert.AreEqual(Sax.Application.Online, sessionDataDeserialised.SessionContext.Application); Assert.AreEqual(Sax.Application.Online, sessionDataDeserialised.SessionContext.Application);
// User details.
Assert.AreEqual(SysId.ToInt(sessionDataDeserialised.User.UserAccountId), SysId.ToInt(sessionDataDeserialised.User.UserAccountId)); Assert.AreEqual(SysId.ToInt(sessionDataDeserialised.User.UserAccountId), SysId.ToInt(sessionDataDeserialised.User.UserAccountId));
Assert.AreEqual(SysId.ToInt(sessionData.User.UserAccountId), SysId.ToInt(sessionDataDeserialised.User.UserAccountId)); Assert.AreEqual(SysId.ToInt(sessionData.User.UserAccountId), SysId.ToInt(sessionDataDeserialised.User.UserAccountId));
Assert.AreEqual(sessionData.User.EmailAddress, sessionDataDeserialised.User.EmailAddress); Assert.AreEqual(sessionData.User.EmailAddress, sessionDataDeserialised.User.EmailAddress);
@@ -10,6 +10,11 @@ namespace Saxonite.Net.Core.Web.Base.App
public abstract class SaxSessionData_Web : SaxSessionData public abstract class SaxSessionData_Web : SaxSessionData
{ {
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Private construction - for JSON deserialisation.
protected SaxSessionData_Web(long sessionIdx, int itemIdx, SaxSessionContext sessionContext) :
base(sessionIdx, itemIdx, sessionContext)
{
}
// Protected construction. // Protected construction.
protected SaxSessionData_Web(SaxSessionContext sessionContext, SaxUserAccount userAccount, List<SaxUserRole> userRoles) : protected SaxSessionData_Web(SaxSessionContext sessionContext, SaxUserAccount userAccount, List<SaxUserRole> userRoles) :
base(sessionContext, userAccount, userRoles) base(sessionContext, userAccount, userRoles)
@@ -15,7 +15,9 @@ namespace Saxonite.Net.Core.Web.Admin.App
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Construction. // Construction.
[JsonConstructor] [JsonConstructor]
private SaxSessionData_Admin(SaxSessionContext sessionContext) : this(sessionContext, null, null) { } private SaxSessionData_Admin(long sessionIdx, int itemIdx, SaxSessionContext sessionContext) :
base(sessionIdx, itemIdx, sessionContext)
{ }
/// <summary> /// <summary>
/// SessionData construction. /// SessionData construction.
/// <para>SessionContext and UserAccount must be supplied.</para> /// <para>SessionContext and UserAccount must be supplied.</para>
@@ -23,8 +25,7 @@ namespace Saxonite.Net.Core.Web.Admin.App
/// </summary> /// </summary>
public SaxSessionData_Admin(SaxSessionContext sessionContext, SaxUserAccount userAccount, List<SaxUserRole> userRoles) : public SaxSessionData_Admin(SaxSessionContext sessionContext, SaxUserAccount userAccount, List<SaxUserRole> userRoles) :
base(sessionContext, userAccount, userRoles) base(sessionContext, userAccount, userRoles)
{ { }
}
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Properties. // Properties.
@@ -369,6 +369,9 @@
<data name="label.yes" xml:space="preserve"> <data name="label.yes" xml:space="preserve">
<value>Yes</value> <value>Yes</value>
</data> </data>
<data name="msg.confirm.item.remove" xml:space="preserve">
<value>Are you sure that this item should be removed?</value>
</data>
<data name="msg.data.noneFound" xml:space="preserve"> <data name="msg.data.noneFound" xml:space="preserve">
<value>No matching data has been found.</value> <value>No matching data has been found.</value>
</data> </data>
@@ -414,6 +417,9 @@
<data name="msg.upload.file.uploading" xml:space="preserve"> <data name="msg.upload.file.uploading" xml:space="preserve">
<value>Uploading {0}.</value> <value>Uploading {0}.</value>
</data> </data>
<data name="msg.upload.image.invalid" xml:space="preserve">
<value>Invalid image file uploaded</value>
</data>
<data name="msg.upload.image.single" xml:space="preserve"> <data name="msg.upload.image.single" xml:space="preserve">
<value>Only one image can be uploaded.</value> <value>Only one image can be uploaded.</value>
</data> </data>
@@ -3,7 +3,9 @@ using Newtonsoft.Json.Linq;
using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Helpers;
using Saxonite.Net.Core.Web.Base.App; using Saxonite.Net.Core.Web.Base.App;
using Saxonite.Net.Core.Web.Online.Controllers;
using Saxonite.Net.Standard.Base.App; using Saxonite.Net.Standard.Base.App;
using Saxonite.Net.Standard.Base.Bus; using Saxonite.Net.Standard.Base.Bus;
using System; using System;
@@ -20,7 +22,9 @@ namespace Saxonite.Net.Core.Web.Online.App
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Construction. // Construction.
[JsonConstructor] [JsonConstructor]
private SaxSessionData_Online(SaxSessionContext sessionContext) : this(sessionContext, null, null) { } private SaxSessionData_Online(long sessionIdx, int itemIdx, SaxSessionContext sessionContext) :
base(sessionIdx, itemIdx, sessionContext)
{ }
/// <summary> /// <summary>
/// SessionData construction. /// SessionData construction.
/// <para>SessionContext and UserAccount must be supplied.</para> /// <para>SessionContext and UserAccount must be supplied.</para>
@@ -148,6 +152,10 @@ namespace Saxonite.Net.Core.Web.Online.App
} }
public FilterData Filter { get; private set; } = new FilterData(); public FilterData Filter { get; private set; } = new FilterData();
//-------------------------------------------------------------------
// Online application encryption IV value - for consistent encryption during session.
public String Base64IV_OnlineApp { get; private set; } = SacsEncryptionHelper.InitSymmetricEncryptionIV(SaxController_Online.Base64Key_OnlineApp);
//------------------------------------------------------------------- //-------------------------------------------------------------------
// JSON Deserialisation. // JSON Deserialisation.
[JsonExtensionData] [JsonExtensionData]
@@ -148,7 +148,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
if (model.AccountContactImage.Count != 1) if (model.AccountContactImage.Count != 1)
{ {
SaLogger.Warn(fn + " Invalid number of image files uploaded: " + model.AccountContactImage.Count); SaLogger.Warn(fn + " Invalid number of image files uploaded: " + model.AccountContactImage.Count);
return Json(responseData.SetControlError("AccountContactImage", "Only one image can be uploaded.")); return Json(responseData.SetControlError("AccountContactImage", Localiser["msg.upload.image.single"]));
} }
IFormFile file = model.AccountContactImage[0]; IFormFile file = model.AccountContactImage[0];
@@ -163,7 +163,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
// Validate the image. // Validate the image.
ImageUtils.ImageConfig imageConfig = ImageUtils.VerifyImageData(imageData); ImageUtils.ImageConfig imageConfig = ImageUtils.VerifyImageData(imageData);
if (!imageConfig.ValidImage) if (!imageConfig.ValidImage)
return Json(responseData.SetControlError("AccountContactImage", "Invalid image file uploaded.")); return Json(responseData.SetControlError("AccountContactImage", Localiser["msg.upload.image.invalid"]));
// Image belongs to the user's account. // Image belongs to the user's account.
ItemId userItemId = GetUserItemId(SessionData.User.UserAccountId); ItemId userItemId = GetUserItemId(SessionData.User.UserAccountId);
@@ -47,7 +47,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
/// <summary>Article activity info. </summary> /// <summary>Article activity info. </summary>
public class ActivityResponseData_Article public class ActivityResponseData_Article
{ {
public ActivityResponseData_Article(SaxModel_Online model, SaxJournalistArticle article) public ActivityResponseData_Article(SaxController_Online controller, SaxModel_Online model, SaxJournalistArticle article)
{ {
Headline = article.Headline; Headline = article.Headline;
Summary = article.Summary; Summary = article.Summary;
@@ -56,7 +56,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
PublishedOnFmt = model.Localiser.FormatDate(article.PublishedAt); PublishedOnFmt = model.Localiser.FormatDate(article.PublishedAt);
SaxJournalistArticle.ContentData content = SaxJournalistArticle.ExtractContent(article.BodyData); SaxJournalistArticle.ContentData content = SaxJournalistArticle.ExtractContent(article.BodyData);
foreach (SaxJournalistArticle.ContentData.SegmentData segment in content.Segments) foreach (SaxJournalistArticle.ContentData.SegmentData segment in content.Segments)
Content.Segments.Add(new ContentData.SegmentData(segment)); Content.Segments.Add(new ContentData.SegmentData(controller, segment));
} }
public String Headline { get; set; } public String Headline { get; set; }
public String Summary { get; set; } public String Summary { get; set; }
@@ -67,15 +67,29 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
{ {
public class SegmentData public class SegmentData
{ {
public SegmentData(SaxJournalistArticle.ContentData.SegmentData segment) public SegmentData(SaxController_Online controller, SaxJournalistArticle.ContentData.SegmentData segment)
{ {
Body.Html = segment.Body.Html; if (segment.Body.IsValid())
{
Body = new BodyData();
Body.Html = segment.Body.Html;
}
else if (segment.Image.IsValid())
{
Image = new ImageData();
Image.Link = JournalistController.GetArticleImageLink(controller, segment.Image.ItemImageId);
}
} }
public class BodyData public class BodyData
{ {
public String Html { get; set; } public String Html { get; set; }
} }
public BodyData Body { get; } = new BodyData(); public BodyData Body { get; }
public class ImageData
{
public String Link { get; set; }
}
public ImageData Image { get; }
} }
public List<SegmentData> Segments { get; } = new List<SegmentData>(); public List<SegmentData> Segments { get; } = new List<SegmentData>();
} }
@@ -214,7 +228,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
SaLogger.Warn(fn + " Article not found for Activity Id: " + itemId.ToString() + "." + getLogSuffix()); SaLogger.Warn(fn + " Article not found for Activity Id: " + itemId.ToString() + "." + getLogSuffix());
return Json(responseData); return Json(responseData);
} }
responseData.Article = new ActivityResponseData_Article(model, article); responseData.Article = new ActivityResponseData_Article(this, model, article);
} }
else if (itemType == Sax.DataItemType.OrganisationOpportunity) else if (itemType == Sax.DataItemType.OrganisationOpportunity)
{ {
@@ -19,6 +19,7 @@ using System.IO;
using System.Drawing; using System.Drawing;
using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Core;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
using System.Collections.Specialized;
namespace Saxonite.Net.Core.Web.Online.Controllers namespace Saxonite.Net.Core.Web.Online.Controllers
{ {
@@ -118,6 +119,42 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
return File(itemImage.ImageData, itemImage.ContentType); return File(itemImage.ImageData, itemImage.ContentType);
} }
//-------------------------------------------------------------------
// Journalist Article image
//-------------------------------------------------------------------
public static String ParamName_JournalistArticleImageEncrypted { get; } = "jaie";
public static String ParamName_ItemImageId { get; } = "iii";
/// <summary>
/// Get the specified Journalist Article Image.
/// <para>Encrypted parameters:</para>
/// <para>- iii: item Image Id.</para>
/// </summary>
[HttpGet]
[Route("Image/Journalist/Article")]
public IActionResult GetJournalistArticleImage(String jaie)
{
String fn = GetType().Name + ".GetJournalistArticleImage";
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return Forbid();
ItemId userItemId = new ItemId((short)Sax.DataItemType.UserAccount, SessionData.User.UserAccountId);
// EXtract encrypted parameters.
NameValueCollection parameters = ExtractOnlineParams(jaie);
if (parameters.Count<1) return Forbid();
// Item Image.
SysId itemImageId = parameters.Get(ParamName_ItemImageId).ToSysId();
if (!SysId.IsValid(itemImageId)) return Forbid();
SaxItemImage itemImage = ItemDataMgr.GetItemImageById(itemImageId);
if (itemImage == null)
return NotFound();
// Construct response.
return File(itemImage.ImageData, itemImage.ContentType);
}
//------------------------------------------------------------------- //-------------------------------------------------------------------
} }
//======================================================================= //=======================================================================
@@ -1,15 +1,20 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Base.Utils;
using Saxonite.Net.Core.Web.Online.App;
using Saxonite.Net.Core.Web.Online.Models; using Saxonite.Net.Core.Web.Online.Models;
using Saxonite.Net.Standard.Base.App; using Saxonite.Net.Standard.Base.App;
using Saxonite.Net.Standard.Base.Bus; using Saxonite.Net.Standard.Base.Bus;
using Saxonite.Net.Standard.Base.Consoles; using Saxonite.Net.Standard.Base.Consoles;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
@@ -28,12 +33,19 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
} }
public class ArticleContentSegmentData public class ArticleContentSegmentData
{ {
public ArticleContentSegmentBodyData Body { get; } = new ArticleContentSegmentBodyData(); public ArticleContentSegmentBodyData Body { get; set; }
public ArticleContentSegmentImageData Image { get; set; }
} }
public class ArticleContentSegmentBodyData public class ArticleContentSegmentBodyData
{ {
public String Html { get; set; } public String Html { get; set; }
} }
public class ArticleContentSegmentImageData
{
public int ItemImageId { get; set; }
public int ImageIdx { get; set; }
public String ImageLink { get; set; }
}
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Journalist Article data. // Journalist Article data.
@@ -80,7 +92,17 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
foreach (var contentSegment in articleContent.Segments) foreach (var contentSegment in articleContent.Segments)
{ {
var segmentData = new ArticleContentSegmentData(); var segmentData = new ArticleContentSegmentData();
segmentData.Body.Html = contentSegment.Body.Html; if (contentSegment.Body.IsValid())
{
segmentData.Body = new ArticleContentSegmentBodyData();
segmentData.Body.Html = contentSegment.Body.Html;
}
else if (contentSegment.Image.IsValid())
{
segmentData.Image = new ArticleContentSegmentImageData();
segmentData.Image.ItemImageId = SysId.ToInt(contentSegment.Image.ItemImageId);
segmentData.Image.ImageLink = GetArticleImageLink(contentSegment.Image.ItemImageId);
}
data.Content.Segments.Add(segmentData); data.Content.Segments.Add(segmentData);
} }
} }
@@ -102,16 +124,14 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
AjaxResponse_ArticleList responseData = new AjaxResponse_ArticleList(); AjaxResponse_ArticleList responseData = new AjaxResponse_ArticleList();
// Validate session and referrer. // Validate session and referrer.
if (!ValidReferer) if (!ValidReferer) return Forbid();
return Forbid(); if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
if (!ValidUserSession) if (!UserIsJournalist) return GetAjaxResult_GoHome(responseData);
return GetAjaxResult_InvalidSession(responseData); SaxSessionData_Online sessionData = SessionData_Online;
if (!UserIsJournalist)
return GetAjaxResult_GoHome(responseData);
// Item filter. // Item filter.
SaxJournalistArticle.Params prmArticle = new SaxJournalistArticle.Params(); SaxJournalistArticle.Params prmArticle = new SaxJournalistArticle.Params();
prmArticle.UserAccountIdsJournalistIncluded.Add(SessionData.User.UserAccountId); prmArticle.UserAccountIdsJournalistIncluded.Add(sessionData.User.UserAccountId);
prmArticle.ArticleFilter = model.Filter.Article; prmArticle.ArticleFilter = model.Filter.Article;
prmArticle.StatusCat = SaxJournalistArticle.StatusCat.NotDeleted; prmArticle.StatusCat = SaxJournalistArticle.StatusCat.NotDeleted;
model.DataItemTotal = (ulong)ActivityMgr.GetJournalistArticleCount(prmArticle); model.DataItemTotal = (ulong)ActivityMgr.GetJournalistArticleCount(prmArticle);
@@ -204,12 +224,144 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"])); return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
} }
// Delete upload images.
SaxItemImage.Params prmItemImage = new SaxItemImage.Params();
prmItemImage.ItemIdsIncluded.Add(new ItemId((short)Sax.DataItemType.JournalistArticle, articleId));
prmItemImage.ImageTypesIncluded.Add(Sax.ImageType.ArticleUpload);
prmItemImage.StatusCat = SaxItemImage.StatusCat.NotDeleted;
foreach (SaxItemImage itemImage in ItemDataMgr.GetItemImageList(prmItemImage))
{
itemImage.SessionUid = 0;
itemImage.ImageUid = 0;
itemImage.Status = SaStatus.Deleted;
ItemDataMgr.UpdateItemImage(itemImage, DbUpdateInfo);
}
// Construct response. // Construct response.
PopulateArticleResponseData(model, article, responseData.Article); PopulateArticleResponseData(model, article, responseData.Article);
responseData.Success = true; responseData.Success = true;
return Json(responseData); return Json(responseData);
} }
//-------------------------------------------------------------------
// Journalist - Upload Article Image.
//-------------------------------------------------------------------
public class AjaxResponse_UploadArticleImage : AjaxResponse_Data
{
public ArticleContentSegmentData Segment { get; set; }
public String UploadMsg { get; set; }
}
// Ajax request.
[HttpPost]
[Route("Journalist/Ajax/UploadArticleImage")]
public IActionResult UploadArticleImage(Model_Journalist model)
{
String fn = GetType().Name + ".UploadArticleImage";
AjaxResponse_UploadArticleImage responseData = new AjaxResponse_UploadArticleImage();
String messageTitle = Localiser["journalist.caption.article"];
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
SaxSessionData_Online sessionData = SessionData_Online;
// Validate number of images.
if (model.ArticleImage.IsEmpty())
{
SaLogger.Warn(fn + " No image file supplied for upload");
return Json(responseData);
}
if (model.ArticleImage.Count != 1)
{
SaLogger.Warn(fn + " Invalid number of image files uploaded: " + model.ArticleImage.Count);
return Json(responseData.SetControlError("ArticleImage", Localiser["msg.upload.image.single"]));
}
IFormFile file = model.ArticleImage[0];
// Image properties.
byte[] imageData = null;
using (MemoryStream fileStream = new MemoryStream())
{
file.CopyTo(fileStream);
imageData = fileStream.ToArray();
}
// Validate the image.
ImageUtils.ImageConfig imageConfig = ImageUtils.VerifyImageData(imageData);
if (!imageConfig.ValidImage)
return Json(responseData.SetControlError("ArticleImage", Localiser["msg.upload.image.invalid"]));
// Image belongs to the article.
// If the article doesn't yet exist, it will need to be uploaded to the user first and later transferred.
SysId articleId = model.ArticleId.ToSysId();
ItemId articleItemId = new ItemId((short)Sax.DataItemType.JournalistArticle, articleId);
ItemId userItemId = new ItemId((short)Sax.DataItemType.UserAccount, sessionData.User.UserAccountId);
ItemId imageItemId = SysId.IsValid(articleId) ? articleItemId : userItemId;
// Store uploaded image as 'Upload' - awaiting confirmation that the article details are to be saved.
// NB Reuse any existing deleted article upload image to avoid creating new images unless necessary.
SaxItemImage.Params prmItemImage = new SaxItemImage.Params();
prmItemImage.ItemIdsIncluded.Add(imageItemId);
prmItemImage.ImageTypesIncluded.Add(Sax.ImageType.Article);
prmItemImage.ImageTypesIncluded.Add(Sax.ImageType.ArticleUpload);
prmItemImage.StatusCat = SaxItemImage.StatusCat.Deleted;
prmItemImage.ResultsPaging.PageLength = 1;
prmItemImage.ResultsPaging.PageNo = 1;
List<SaxItemImage> itemImages = ItemDataMgr.GetItemImageList(prmItemImage);
SaxItemImage itemImage = !itemImages.IsEmpty() ? itemImages[0] : null;
if (itemImage == null)
itemImage = ItemDataMgr.CreateItemImage(imageItemId, Sax.ImageType.ArticleUpload);
itemImage.ImageType = Sax.ImageType.ArticleUpload;
itemImage.Filename = file.FileName;
itemImage.Mime = SacsContentTypeHelper.GetMimeTypeFromContentType(file.ContentType).ToString().ToLower();
itemImage.ContentType = file.ContentType;
itemImage.Width = imageConfig.Width;
itemImage.Height = imageConfig.Height;
itemImage.ImageData = imageData;
itemImage.SessionUid = sessionData.SessionIdx;
itemImage.ImageUid = sessionData.NextItemIdx;
itemImage.Status = SaxItemImage.DefaultStatus;
if (!SysId.IsValid(itemImage.Id))
{
if (!ItemDataMgr.InsertItemImage(itemImage, DbUpdateInfo))
{
SaLogger.Warn(fn + " Failed to insert uploaded image - " + ItemDataMgr.ErrorStateMessage);
return Json(responseData.SetControlError("ArticleImage", Localiser["msg.error.item.insert.failed"]));
}
}
else
{
if (!ItemDataMgr.UpdateItemImage(itemImage, DbUpdateInfo))
{
SaLogger.Warn(fn + " Failed to update uploaded image - " + ItemDataMgr.ErrorStateMessage);
return Json(responseData.SetControlError("ArticleImage", Localiser["msg.error.item.insert.failed"]));
}
}
// Segment image info.
responseData.Segment = new ArticleContentSegmentData();
responseData.Segment.Image = new ArticleContentSegmentImageData();
responseData.Segment.Image.ImageLink = GetArticleImageLink(itemImage.Id);
responseData.Segment.Image.ImageIdx = itemImage.ImageUid;
// Complete response.
//responseData.SetNotification(messageTitle, "Image uploaded.");
responseData.Success = true;
return Json(responseData);
}
private String GetArticleImageLink(SysId itemImageId)
{
return GetArticleImageLink(this, itemImageId);
}
public static String GetArticleImageLink(SaxController_Online controller, SysId itemImageId)
{
String imageLink = "Image/Journalist/Article?";
NameValueCollection parameters = new NameValueCollection();
parameters.Add(ImageController.ParamName_ItemImageId, SysId.ToString(itemImageId));
return imageLink + ImageController.ParamName_JournalistArticleImageEncrypted + "=" + SaxController_Online.EncryptOnlineParams(controller, parameters);
}
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Store Article ajax request. // Store Article ajax request.
//------------------------------------------------------------------- //-------------------------------------------------------------------
@@ -222,12 +374,10 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
AjaxResponse_Article responseData = new AjaxResponse_Article(); AjaxResponse_Article responseData = new AjaxResponse_Article();
// Validate session and referrer. // Validate session and referrer.
if (!ValidReferer) if (!ValidReferer) return Forbid();
return Forbid(); if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
if (!ValidUserSession) if (!UserIsJournalist) return GetAjaxResult_GoHome(responseData);
return GetAjaxResult_InvalidSession(responseData); SaxSessionData_Online sessionData = SessionData_Online;
if (!UserIsJournalist)
return GetAjaxResult_GoHome(responseData);
// Validate item properties. // Validate item properties.
model.ValidateArticleData(responseData); model.ValidateArticleData(responseData);
@@ -258,7 +408,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
// Create new item if required. // Create new item if required.
if (article == null) if (article == null)
article = ActivityMgr.CreateJournalistArticle(SessionData.User.UserAccountId); article = ActivityMgr.CreateJournalistArticle(sessionData.User.UserAccountId);
// Populate item properties. // Populate item properties.
if (model.ArticleRegionId != null) if (model.ArticleRegionId != null)
@@ -272,20 +422,18 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
if (model.ArticleStatusCode != null) if (model.ArticleStatusCode != null)
article.Status = model.ArticleStatus; article.Status = model.ArticleStatus;
// Content. // Retrieve all article images - before new article is created as uploaded images are assigned to user first.
if (model.ArticleContentSegments != null) SaxItemImage.Params prmItemImage = new SaxItemImage.Params();
{ if (SysId.IsValid(article.Id))
SaxJournalistArticle.ContentData articleContent = new SaxJournalistArticle.ContentData(); prmItemImage.ItemIdsIncluded.Add(article.GetItemId());
foreach (String contentSegment in model.ArticleContentSegments) else
{ prmItemImage.ItemIdsIncluded.Add(new ItemId((short)Sax.DataItemType.UserAccount, sessionData.User.UserAccountId));
if (StringUtil.IsEmpty(contentSegment)) continue; prmItemImage.ImageTypesIncluded.Add(Sax.ImageType.Article);
var segment = articleContent.AddSegment(); prmItemImage.ImageTypesIncluded.Add(Sax.ImageType.ArticleUpload);
segment.Body.Html = contentSegment; prmItemImage.StatusCat = SaxItemImage.StatusCat.NotDeleted;
} List<SaxItemImage> itemImages = ItemDataMgr.GetItemImageList(prmItemImage);
article.BodyData = SaxJournalistArticle.GetContentData(articleContent);
}
// Store item. // If Article doesn't yet exist, create it now so that images can be assigned.
if (!SysId.IsValid(article.Id)) if (!SysId.IsValid(article.Id))
{ {
if (!ActivityMgr.InsertJournalistArticle(article, DbUpdateInfo)) if (!ActivityMgr.InsertJournalistArticle(article, DbUpdateInfo))
@@ -294,18 +442,76 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"] + "\n\n" + ActivityMgr.ErrorStateMessage)); return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"] + "\n\n" + ActivityMgr.ErrorStateMessage));
} }
} }
else
// Content.
if (model.ArticleContentSegmentBodies != null)
{ {
if (!ActivityMgr.UpdateJournalistArticle(article, DbUpdateInfo)) SaxJournalistArticle.ContentData articleContent = new SaxJournalistArticle.ContentData();
for (int segmentIdx = 0; segmentIdx < model.ArticleContentSegmentBodies.Count; segmentIdx++)
{ {
SaLogger.Warn(fn + " Failed to update article [Id:" + SysId.ToString(article.Id) + "]: " + ActivityMgr.ErrorStateMessage); String segmentBody = model.ArticleContentSegmentBodies[segmentIdx];
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"] + "\n\n" + ActivityMgr.ErrorStateMessage)); String segmentItemImageId = model.ArticleContentSegmentItemImageIds.Count > segmentIdx ? model.ArticleContentSegmentItemImageIds[segmentIdx] : "";
String segmentImageIdx = model.ArticleContentSegmentImageIdxs.Count > segmentIdx ? model.ArticleContentSegmentImageIdxs[segmentIdx] : "";
if (!StringUtil.IsEmpty(segmentBody))
{
// HTML Body segment.
var segment = articleContent.AddSegment();
segment.Body.Html = segmentBody;
}
else if (!StringUtil.IsEmpty(segmentItemImageId) || !StringUtil.IsEmpty(segmentImageIdx))
{
SysId itemImageId = segmentItemImageId.ToSysId();
int imageIdx = StringUtil.ToInt(segmentImageIdx);
// Check for new image first.
SaxItemImage itemImage = itemImages.GetItemImageBySessionImage(sessionData.SessionIdx, imageIdx);
if (itemImage == null)
itemImage = itemImages.GetItemImageById(itemImageId);
if (itemImage != null)
{
// Ensure that the image is correctly identified for the Article.
itemImage.ItemId = article.GetItemId();
itemImage.ImageType = Sax.ImageType.Article;
itemImage.SessionUid = 0;
itemImage.ImageUid = 0;
itemImage.Status = SaxItemImage.DefaultStatus;
if (ItemDataMgr.UpdateItemImage(itemImage, DbUpdateInfo))
{
// Assign the image segment to the article.
var segment = articleContent.AddSegment();
segment.Image.ItemImageId = itemImage.Id;
// Remove the image from the list as it's now been handled.
itemImages.Remove(itemImage);
}
else
SaLogger.Warn(fn + " Failed to update article image: " + ItemDataMgr.ErrorStateMessage);
}
else
SaLogger.Warn(fn + " Failed to identify article image. ItemImageId: " + itemImageId.ToInt() + ". SessionIdx: " + sessionData.SessionIdx + ". ImageIdx: " + imageIdx + ".");
}
} }
article.BodyData = SaxJournalistArticle.GetContentData(articleContent);
}
// Update the Article.
if (!ActivityMgr.UpdateJournalistArticle(article, DbUpdateInfo))
{
SaLogger.Warn(fn + " Failed to update article [Id:" + SysId.ToString(article.Id) + "]: " + ActivityMgr.ErrorStateMessage);
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"] + "\n\n" + ActivityMgr.ErrorStateMessage));
} }
// Store Article Activity Index data. // Store Article Activity Index data.
ActivityConsole.StoreActivityIndex(article, DbUpdateInfo); ActivityConsole.StoreActivityIndex(article, DbUpdateInfo);
// Delete remaining images as they are no longer required.
foreach (SaxItemImage itemImage in itemImages)
{
itemImage.SessionUid = 0;
itemImage.ImageUid = 0;
itemImage.Status = SaStatus.Deleted;
ItemDataMgr.UpdateItemImage(itemImage, DbUpdateInfo);
}
// Construct response. // Construct response.
PopulateArticleResponseData(model, article, responseData.Article); PopulateArticleResponseData(model, article, responseData.Article);
responseData.Success = true; responseData.Success = true;
@@ -15,6 +15,7 @@ using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Web;
namespace Saxonite.Net.Core.Web.Online.Controllers namespace Saxonite.Net.Core.Web.Online.Controllers
{ {
@@ -236,8 +237,27 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
return keepLoggedInParams; return keepLoggedInParams;
} }
//-------------------------------------------------------------------
// Parameter encryption, eg. for images.
//-------------------------------------------------------------------
// Encryption key is the same for all users but a different IV value is generated for each session so that the links/parameters cannot be shared.
public static String Base64Key_OnlineApp { get; } = SacsEncryptionHelper.EncodePlainKey("<Saxonite#Online+App@Encryption>", SacsEncryptionHelper.KeyLength);
protected String EncryptOnlineParams(NameValueCollection parameters)
{
return HttpUtility.UrlEncode(EncryptParameters(parameters, SessionData_Online.Base64IV_OnlineApp, Base64Key_OnlineApp));
}
public static String EncryptOnlineParams(SaxController_Online controller, NameValueCollection parameters)
{
return controller.EncryptOnlineParams(parameters);
}
protected NameValueCollection ExtractOnlineParams(String encryptedParams)
{
return DecryptParameters(encryptedParams, SessionData_Online.Base64IV_OnlineApp, Base64Key_OnlineApp);
}
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Logging. // Logging.
//-------------------------------------------------------------------
protected String getLogSuffix() protected String getLogSuffix()
{ {
List<String> logSuffix = new List<string>(); List<String> logSuffix = new List<string>();
@@ -1,4 +1,5 @@
using Sarand.Net.Standard.Base.App; using Microsoft.AspNetCore.Http;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Base.Utils;
@@ -49,7 +50,11 @@ namespace Saxonite.Net.Core.Web.Online.Models
public String ArticleStatusCode { get; set; } public String ArticleStatusCode { get; set; }
public SaStatus ArticleStatus { get { return SacsSystem.GetStatusForCode(ArticleStatusCode); } } public SaStatus ArticleStatus { get { return SacsSystem.GetStatusForCode(ArticleStatusCode); } }
// Article content. // Article content.
public List<String> ArticleContentSegments { get; set; } public List<String> ArticleContentSegmentBodies { get; set; }
public List<String> ArticleContentSegmentItemImageIds { get; set; }
public List<String> ArticleContentSegmentImageIdxs { get; set; }
// Article images.
public List<IFormFile> ArticleImage { get; set; }
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Validation. // Validation.
@@ -191,6 +191,6 @@
} }
</div> </div>
</div> </div>
</div> </div>
@@ -85,6 +85,9 @@ else
</div> </div>
<div class="sax-panel-item ArticleContentSegment"> <div class="sax-panel-item ArticleContentSegment">
</div> </div>
<div class="sax-panel-item ArticleContentSegmentImage center">
<img src="" alt="" title="" />
</div>
<div class="sax-panel-item Opportunity"> <div class="sax-panel-item Opportunity">
<div class="OpportunityOrganisation"></div> <div class="OpportunityOrganisation"></div>
<div class="OpportunityPosition"></div> <div class="OpportunityPosition"></div>
@@ -82,13 +82,30 @@
<div class="sax-panel-item-template"> <div class="sax-panel-item-template">
<div class="sax-panel-item ArticleSegment"> <div class="sax-panel-item ArticleSegment">
<input type="hidden" name="ArticleContentSegments" class="ArticleContentSegment" value="" /> @* Inputs with same name for every segment to ensure they are uploaded as a list. *@
<div class="row"> <input type="hidden" name="ArticleContentSegmentBodies" class="ArticleContentSegmentBody" value="" />
<div class="col"><div class="sax-article-segment"></div></div> <input type="hidden" name="ArticleContentSegmentItemImageIds" class="ArticleContentSegmentItemImageId" value="" />
<input type="hidden" name="ArticleContentSegmentImageIdxs" class="ArticleContentSegmentImageIdx" value="" />
@* Image drop panel *@
<div class="sax-panel-file-drop row">
<div class="col">Drop image here</div>
<div class="fixed"> <div class="fixed">
<img id="" class="ContactImageUploadProgress" src="~/img/animated/progress-basketball-32.gif" style="display:none;margin:8px 4px;" />
</div>
</div>
@* Segment details *@
<div class="row">
@* Segment body *@
<div class="col">
<div class="sax-article-segment-body"></div>
<div class="sax-article-segment-image hidden"><img src="" alt="" title="" /></div>
</div>
<div class="fixed sax-actions">
@* Segment actions *@
<div class="sax-action sax-add"><img src="~/img/action/add24.png" alt="" title="" /></div> <div class="sax-action sax-add"><img src="~/img/action/add24.png" alt="" title="" /></div>
<div class="sax-action sax-up"><img src="~/img/action/prev24.png" alt="" title="" /></div> <div class="sax-action sax-add-image"><img src="~/img/action/image-add-24.png" alt="" title="" /></div>
<div class="sax-action sax-down"><img src="~/img/action/next24.png" alt="" title="" /></div> <div class="sax-action sax-up"><img src="~/img/action/upload24.png" alt="" title="" /></div>
<div class="sax-action sax-down"><img src="~/img/action/download24.png" alt="" title="" /></div>
<div class="sax-action sax-delete"><img src="~/img/action/delete24.png" alt="" title="" /></div> <div class="sax-action sax-delete"><img src="~/img/action/delete24.png" alt="" title="" /></div>
</div> </div>
</div> </div>
@@ -101,6 +118,35 @@
} }
<div id="dlgSelectArticleImage" class="sax-dialog">
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmSelectArticleImage", @class = "sax-form", @onSubmit = "return false;" }))
{
<input type="hidden" id="" class="SegmentIdx" />
<div class="spacer4"></div>
<div class="sax-form-control ArticleImage">
<div class="row">
<div class="fixed"><div style="padding:0 12px;">@Localiser["label.image"]</div></div>
<div class="col"><input type="file" id="ifArticleImage" name="" class="fullwidth" style="" /></div>
</div>
<div class="sax-message"></div>
</div>
<div class="spacer2"></div>
<div class="row">
<div class="col"><div class="UploadMessage"></div></div>
<div class="fixed"><img id="" class="ArticleImageUploadProgress" src="~/img/animated/progress-basketball-32.gif" style="display:none;margin:8px 4px;" /></div>
</div>
<div class="spacer2"></div>
}
</div>
<script type="text/javascript">
sax.dlg.title.imageUpload = '@Localiser.GetJavascriptText("account.caption.image.upload")';
sax.msg.uploadFileSelect = '@Localiser.GetJavascriptText("msg.upload.file.select")';
sax.msg.uploadImageSingle = '@Localiser.GetJavascriptText("msg.upload.image.single")';
sax.msg.uploadFileSizeMax = '@Localiser.GetJavascriptText("msg.upload.file.size.max","{0}")';
sax.msg.uploadFileTypeInvalid = '@Localiser.GetJavascriptText("msg.upload.file.type.invalid","{0}")';
sax.msg.uploadingFile = '@Localiser.GetJavascriptText("msg.upload.file.uploading","{0}")';
</script>
<partial name="~/Views/Common/SelectRegion.cshtml" /> <partial name="~/Views/Common/SelectRegion.cshtml" />
<partial name="~/Views/Common/SelectSport.cshtml" /> <partial name="~/Views/Common/SelectSport.cshtml" />
@@ -74,6 +74,7 @@
sax.lbl.availableCharacters = '@Localiser.GetJavascriptText("label.characters.count", "{0}")'; sax.lbl.availableCharacters = '@Localiser.GetJavascriptText("label.characters.count", "{0}")';
sax.lbl.noneSelected = '@Localiser.GetJavascriptText("label.selected.none")'; sax.lbl.noneSelected = '@Localiser.GetJavascriptText("label.selected.none")';
sax.lbl.numberSelected = '@Localiser.GetJavascriptText("label.selected.count", "{0}")'; sax.lbl.numberSelected = '@Localiser.GetJavascriptText("label.selected.count", "{0}")';
sax.msg.itemRemoveConfirm = '@Localiser.GetJavascriptText("msg.confirm.item.remove")';
sax.msg.signOutConfirm = '@Localiser.GetJavascriptText("security.msg.signout.confirm")'; sax.msg.signOutConfirm = '@Localiser.GetJavascriptText("security.msg.signout.confirm")';
sax.msg.somethingGoneWrong = '@Localiser.GetJavascriptText("msg.something.gone.wrong")'; sax.msg.somethingGoneWrong = '@Localiser.GetJavascriptText("msg.something.gone.wrong")';
sax.msg.dataRefreshing = '@Localiser.GetJavascriptText("msg.data.refreshing")'; sax.msg.dataRefreshing = '@Localiser.GetJavascriptText("msg.data.refreshing")';
@@ -89,7 +89,12 @@
border-radius: 4px; border-radius: 4px;
} }
.sax-profile #pnlContactImageDrop.sax-panel-drop.sax-dragging .sax-profile #pnlContactImageDrop.sax-panel-drop *
{
pointer-events: none;
}
.sax-profile #pnlContactImageDrop.sax-panel-drop.sax-file-drag
{ {
border-color: var(--color-profile); border-color: var(--color-profile);
} }
@@ -69,6 +69,16 @@
{ {
} }
#dlgActivity .sax-panel-item.Article .ArticleContentSegment
{
}
#dlgActivity .sax-panel-item.Article .ArticleContentSegmentImage img
{
max-width:75%;
max-height:400px;
}
.ui-dialog.sax-dialog-activity button.ActivityReaction .ui-dialog.sax-dialog-activity button.ActivityReaction
{ {
min-width: 80px; min-width: 80px;
@@ -23,26 +23,26 @@
border-radius: 6px; border-radius: 6px;
} }
.sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment .sax-article-segment .sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment .sax-article-segment-body
{ {
min-height: 160px; min-height: 150px;
max-height: 320px; max-height: 300px;
margin: 0; margin: 0;
padding: 4px; padding: 4px;
background-color: #e0efff; background-color: #e0efff;
border: 2px solid #e0efff; border: 2px solid #e0efff;
border-radius: 4px; border-radius: 4px;
overflow-y: scroll; overflow-y: scroll;
z-index:1000; z-index: 1000;
} }
.sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment:hover .sax-article-segment .sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment:hover .sax-article-segment-body
/*,.sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment .sax-article-segment:focus*/ /*,.sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment .sax-article-segment-body:focus*/
{ {
border: 2px solid #c0d0ff; border: 2px solid #c0d0ff;
} }
.sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment .sax-article-segment.mce-edit-focus .sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment .sax-article-segment-body.mce-edit-focus
{ {
margin-top: 48px; margin-top: 48px;
} }
@@ -52,4 +52,58 @@
z-index: 1000; z-index: 1000;
} }
.sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment.sax-file-drag
{
border-color: var(--color-article);
}
.sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment .sax-actions
{
margin: 2px 0;
}
.sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment .sax-action
{
margin: 0 2px;
padding: 2px 2px;
border-radius: 4px;
}
.sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment .sax-action:hover
{
background-color: var(--color-article-pale);
}
.sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment .sax-action img
{
}
.sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment .sax-panel-file-drop
{
display: none;
}
.sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment.sax-file-drag .sax-panel-file-drop
{
display: block;
margin: 4px;
border: 1px dashed var(--color-article);
}
.sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment.ArticleImage .sax-article-segment-body
{
display: none;
}
.sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment.ArticleImage .sax-article-segment-image
{
display: block;
}
.sax-article.ArticleContent .sax-article-content .sax-panel-item.ArticleSegment .sax-article-segment-image img
{
max-width: 320px;
max-height: 160px;
}
/* The End */ /* The End */
Binary file not shown.

After

Width:  |  Height:  |  Size: 739 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -5,6 +5,7 @@
(function (win, doc, undef) (function (win, doc, undef)
{ {
"use strict"; "use strict";
sax.classFileDrag = 'sax-file-drag';
sax.profile = { contact: {}, sports: {}, organisations: {} }; sax.profile = { contact: {}, sports: {}, organisations: {} };
//-------------------------------------------------------------- //--------------------------------------------------------------
@@ -106,7 +107,7 @@
} }
sax.onDropContactImageFile = function (file, context) sax.onDropContactImageFile = function (file, context)
{ {
//sax.debug('onDropContactImageFile', file); //sax.debug('onDropContactImageFile', file, context);
if (file.size > sax.maxProfileImageSize) return sax.doAlert(sax.dlg.title.imageUpload, sax.msg.uploadFileSizeMax.format(sax.formatFileSize(sax.maxProfileImageSize))); if (file.size > sax.maxProfileImageSize) return sax.doAlert(sax.dlg.title.imageUpload, sax.msg.uploadFileSizeMax.format(sax.formatFileSize(sax.maxProfileImageSize)));
if (file.type != 'image/jpg' && file.type != 'image/jpeg' && file.type != 'image/png') return sax.doAlert(sax.dlg.title.imageUpload, sax.msg.uploadFileTypeInvalid.format(sax.getFileType(file))); if (file.type != 'image/jpg' && file.type != 'image/jpeg' && file.type != 'image/png') return sax.doAlert(sax.dlg.title.imageUpload, sax.msg.uploadFileTypeInvalid.format(sax.getFileType(file)));
$(".UploadMessage", context).text(sax.msg.uploadingFile.format(file.name)); $(".UploadMessage", context).text(sax.msg.uploadingFile.format(file.name));
@@ -123,7 +124,7 @@
sax.handleContactImageUploadResponse = function (response) sax.handleContactImageUploadResponse = function (response)
{ {
let context = sax.data.contactImageUploadContext; let context = sax.data.contactImageUploadContext;
sax.debug('handleContactImageUploadResponse', response, context); //sax.debug('handleContactImageUploadResponse', response, context);
if (!response) return; if (!response) return;
var $section = $('.sax-panel-section.ProfileContact'); var $section = $('.sax-panel-section.ProfileContact');
sax.refreshControlValues(response.controlValues, context); sax.refreshControlValues(response.controlValues, context);
@@ -340,9 +341,9 @@
sax.$pnl.contactImageDrag = $('#pnlContactImageDrop') sax.$pnl.contactImageDrag = $('#pnlContactImageDrop')
.on("dragenter", function (evt) { sax.haltEvent(evt); }) .on("dragenter", function (evt) { sax.haltEvent(evt); })
.on("dragover", function (evt) { sax.haltEvent(evt); if (!sax.$pnl.contactImageDrag.hasClass('sax-dragging')) sax.$pnl.contactImageDrag.addClass('sax-dragging'); }) .on("dragover", function (evt) { sax.haltEvent(evt); if (!sax.$pnl.contactImageDrag.hasClass(sax.classFileDrag)) sax.$pnl.contactImageDrag.addClass(sax.classFileDrag); })
.on("dragleave", function (evt) { sax.haltEvent(evt); sax.$pnl.contactImageDrag.removeClass('sax-dragging'); }) .on("dragleave", function (evt) { sax.haltEvent(evt); sax.$pnl.contactImageDrag.removeClass(sax.classFileDrag); })
.on("drop", function (evt) { sax.haltEvent(evt); sax.$pnl.contactImageDrag.removeClass('sax-dragging'); sax.onDropContactImage(evt); }); .on("drop", function (evt) { sax.haltEvent(evt); sax.$pnl.contactImageDrag.removeClass(sax.classFileDrag); sax.onDropContactImage(evt); });
$('.sax-panel-section.ProfileSports .sax-action.sax-add').on('click', function (evt) { sax.addProfileSport(); }); $('.sax-panel-section.ProfileSports .sax-action.sax-add').on('click', function (evt) { sax.addProfileSport(); });
var opt = sax.dlgOpts(); var opt = sax.dlgOpts();
+14 -4
View File
@@ -23,7 +23,7 @@
} }
sax.doRefreshResults = function (response) sax.doRefreshResults = function (response)
{ {
sax.debug('doRefreshResults', response); //sax.debug('doRefreshResults', response);
delete sax.awaitingRefreshResponse; delete sax.awaitingRefreshResponse;
var $results = $('.sax-panel-results'); var $results = $('.sax-panel-results');
var $msgs = $('.sax-panel-messages', $results).hide().empty(); var $msgs = $('.sax-panel-messages', $results).hide().empty();
@@ -69,7 +69,7 @@
let $frm = $('#frmActivityId'); let $frm = $('#frmActivityId');
$('.ActivityType', $frm).val(item.itemType); $('.ActivityType', $frm).val(item.itemType);
$('.ActivityIdx', $frm).val(item.itemIdx); $('.ActivityIdx', $frm).val(item.itemIdx);
sax.activity = { item:item, $item: $item }; sax.activity = { item: item, $item: $item };
sax.ajax.activityInfo = sax.ajax.activityInfo || { url: sax.url.base + 'Activity/Ajax/GetInfo', formId: 'frmActivityId', callbackFn: sax.showActivityDetails, noWaitIcon: true }; sax.ajax.activityInfo = sax.ajax.activityInfo || { url: sax.url.base + 'Activity/Ajax/GetInfo', formId: 'frmActivityId', callbackFn: sax.showActivityDetails, noWaitIcon: true };
sax.doAjaxRequest(sax.ajax.activityInfo, 50); sax.doAjaxRequest(sax.ajax.activityInfo, 50);
} }
@@ -81,14 +81,24 @@
if (item = response.article) if (item = response.article)
{ {
let $itm = $('.sax-panel-item-template .sax-panel-item.Article').clone(); let $itm = $('.sax-panel-item-template .sax-panel-item.Article').clone();
let $segs = $('.ArticleContentSegments', $itm);
$('.ArticleHeadline', $itm).text(item.headline); $('.ArticleHeadline', $itm).text(item.headline);
$('.ArticleSummary', $itm).text(item.summary).toggle(!!item.summary); $('.ArticleSummary', $itm).text(item.summary).toggle(!!item.summary);
let segs = item.content.segments; let segs = item.content.segments;
for (let segIdx = 0; segIdx < segs.length; segIdx++) for (let segIdx = 0; segIdx < segs.length; segIdx++)
{ {
let seg = segs[segIdx]; let seg = segs[segIdx];
let $seg = $('.sax-panel-item-template .sax-panel-item.ArticleContentSegment').clone().html(seg.body.html); if (seg.body)
$('.ArticleContentSegments', $itm).append($seg); {
let $seg = $('.sax-panel-item-template .sax-panel-item.ArticleContentSegment').clone().html(seg.body.html);
$seg.appendTo($segs);
}
if (seg.image)
{
let $seg = $('.sax-panel-item-template .sax-panel-item.ArticleContentSegmentImage').clone();
$('img', $seg).prop('src', seg.image.link);
$seg.appendTo($segs);
}
} }
$act.append($itm); $act.append($itm);
} }
+147 -50
View File
@@ -7,6 +7,7 @@
"use strict"; "use strict";
sax.itemIdPrefix = 'Itm_'; sax.itemIdPrefix = 'Itm_';
sax.segIdPrefix = 'Seg_'; sax.segIdPrefix = 'Seg_';
sax.classFileDrag = 'sax-file-drag';
let ac = sax.articleContent = sax.articleContent || {}; let ac = sax.articleContent = sax.articleContent || {};
//-------------------------------------------------------------- //--------------------------------------------------------------
@@ -68,16 +69,16 @@
} }
sax.populateArticleContent = function (content) sax.populateArticleContent = function (content)
{ {
sax.debug('populateArticleContent', content); //sax.debug('populateArticleContent', content);
ac.$segList.empty(); ac.$segList.empty();
ac.segIdx = 0; ac.segIdx = 0;
let segments = content.segments || [{}]; let segments = content.segments || [];
if (!segments.length) segments.push({}); if (!segments.length) segments.push({ body: {}});
for (let segIdx = 0; segIdx < segments.length; segIdx++) for (let segIdx = 0; segIdx < segments.length; segIdx++)
sax.addContentSegment(segments[segIdx]); sax.addContentSegment(segments[segIdx]);
} }
sax.addContentSegment = function (seg) sax.addContentSegment = function (seg, idxAfter, idxBefore)
{ {
let idx = ++ac.segIdx; let idx = ++ac.segIdx;
let segId = sax.segmentId(idx); let segId = sax.segmentId(idx);
@@ -86,57 +87,90 @@
return; return;
} }
let $seg = $('.sax-panel-item-template .sax-panel-item.ArticleSegment', ac.$content).clone().prop('id', segId) let $seg = $('.sax-panel-item-template .sax-panel-item.ArticleSegment', ac.$content).clone().prop('id', segId)
let segBody = seg.body || {}; if (seg.body)
$('.sax-article-segment', $seg).html(segBody.html); {
$('input.ArticleContentSegment', $seg).val(segBody.html); $('.sax-article-segment-body', $seg).html(seg.body.html);
ac.$segList.append($seg); $('input.ArticleContentSegmentBody', $seg).val(seg.body.html);
$('.sax-action.sax-add', $seg).on('click', function () { sax.addContentSegment({}, idx); }); }
else if (seg.image)
{
$seg.addClass("ArticleImage");
$('input.ArticleContentSegmentItemImageId', $seg).val(seg.image.itemImageId);
$('input.ArticleContentSegmentImageIdx', $seg).val(seg.image.imageIdx);
$('.sax-article-segment-image', $seg).show().find('img').prop('src', seg.image.imageLink);
$('.sax-action.sax-add-image', $seg).hide();
}
$('.sax-action.sax-add', $seg).on('click', function () { sax.addContentSegment({ body: {} }, idx); });
$('.sax-action.sax-add-image', $seg).on('click', function () { sax.selectArticleImage(idx); });
$('.sax-action.sax-up', $seg).on('click', function () { sax.moveUpContentSegment(idx); }); $('.sax-action.sax-up', $seg).on('click', function () { sax.moveUpContentSegment(idx); });
$('.sax-action.sax-down', $seg).on('click', function () { sax.moveDownContentSegment(idx); }); $('.sax-action.sax-down', $seg).on('click', function () { sax.moveDownContentSegment(idx); });
$('.sax-action.sax-delete', $seg).on('click', function () { sax.deleteContentSegment(idx); }); $('.sax-action.sax-delete', $seg).on('click', function () { sax.deleteContentSegment(idx); });
tinymce.init({ let $segAfter = $('#' + sax.segmentId(idxAfter));
branding: false, let $segBefore = $('#' + sax.segmentId(idxBefore));
elementpath: true, if ($segAfter.length) $seg.insertAfter($segAfter);
menubar: false, else if ($segBefore.length) $seg.insertBefore($segBefore);
inline: true, else ac.$segList.append($seg);
//skin: 'small',
//icons: 'small', if (seg.body)
selector: '#' + segId + ' .sax-article-segment', {
setup: function (ed) tinymce.init({
{ branding: false,
ed.on('blur', function (e) elementpath: true,
menubar: false,
inline: true,
//skin: 'small',
//icons: 'small',
selector: '#' + segId + ' .sax-article-segment-body',
setup: function (ed)
{ {
let ed = tinymce.get(e.target.id); ed.on('focus', function (e)
let $ed = $('#' + ed.id); {
let $seg = $ed.closest('.sax-panel-item.ArticleSegment'); ed.notificationManager.close();
$(".sax-article-segment p", $seg).each(function (i,el) { if ($.trim($(el).text()) == "") { $(el).remove(); } }); });
let $inp = $seg.find('input.ArticleContentSegment').val(ed.getContent()); ed.on('blur', function (e)
sax.debug('blur Id: ' + e.target.id + '. Val: ' + $inp.val()); {
}); let ed = tinymce.get(e.target.id);
}, let $ed = $('#' + ed.id);
/* let $seg = $ed.closest('.sax-panel-item.ArticleSegment');
plugins: [ $(".sax-article-segment-body p", $seg).each(function (i, el) { if ($.trim($(el).text()) == "") { $(el).remove(); } });
//'link', let $inp = $seg.find('input.ArticleContentSegmentBody').val(ed.getContent());
'lists', //sax.debug('blur Id: ' + e.target.id + '. Val: ' + $inp.val());
//'powerpaste', });
//'autolink', },
//'tinymcespellchecker' plugins: [
], //'paste image'
//powerpaste_word_import: 'clean', //'link',
//powerpaste_html_import: 'clean', //'lists',
*/ //'powerpaste',
toolbar: [ //'autolink',
'undo redo | bold italic underline | fontselect fontsizeselect', //'tinymcespellchecker'
'forecolor backcolor | alignleft aligncenter alignright alignfull | numlist bullist outdent indent' ],
], //paste_block_drop: true,
valid_elements: 'p[style],strong,em,span[style],a[href],ul,ol,li', //powerpaste_block_drop: true,
valid_styles: { '*': 'font-size,font-family,color,text-decoration,text-align' }, /*
}); //powerpaste_word_import: 'clean',
//powerpaste_html_import: 'clean',
*/
toolbar: [
'undo redo | bold italic underline | fontselect fontsizeselect',
'forecolor backcolor | alignleft aligncenter alignright alignfull | numlist bullist outdent indent'
],
valid_elements: 'p[style],strong,em,span[style],a[href],ul,ol,li',
valid_styles: { '*': 'font-size,font-family,color,background-color,text-decoration,text-align' },
});
$seg.dragCount = 0;
$seg
.on("dragenter", function (evt) { $seg.dragCount++; sax.haltEvent(evt); })
.on("dragover", function (evt) { sax.haltEvent(evt); if (!$seg.hasClass(sax.classFileDrag)) $seg.addClass(sax.classFileDrag); })
.on("dragleave", function (evt) { $seg.dragCount--; sax.haltEvent(evt); if (!$seg.dragCount) $seg.removeClass(sax.classFileDrag); })
.on("drop", function (evt) { sax.haltEvent(evt); $seg.removeClass(sax.classFileDrag); sax.onDropArticleImage(evt, idx, $seg); });
}
} }
sax.moveUpContentSegment = function (idx) sax.moveUpContentSegment = function (idx)
{ {
sax.debug('moveUpContentSegment(' + idx + ')'); //sax.debug('moveUpContentSegment(' + idx + ')');
let segId = sax.segmentId(idx); let segId = sax.segmentId(idx);
let $segPrev; let $segPrev;
$('.sax-panel-item.ArticleSegment', ac.$segList).detach().each( $('.sax-panel-item.ArticleSegment', ac.$segList).detach().each(
@@ -154,7 +188,7 @@
} }
sax.moveDownContentSegment = function (idx) sax.moveDownContentSegment = function (idx)
{ {
sax.debug('moveDownContentSegment(' + idx + ')'); //sax.debug('moveDownContentSegment(' + idx + ')');
let segId = sax.segmentId(idx); let segId = sax.segmentId(idx);
let $segMove; let $segMove;
let $segs = $('.sax-panel-item.ArticleSegment', ac.$segList).detach(); let $segs = $('.sax-panel-item.ArticleSegment', ac.$segList).detach();
@@ -169,13 +203,71 @@
} }
ac.$segList.append($seg); ac.$segList.append($seg);
if ($segMove) $segMove.insertAfter($seg); if ($segMove) $segMove.insertAfter($seg);
$segMove = null;
}); });
} }
sax.deleteContentSegment = function (idx) sax.deleteContentSegment = function (idx)
{ {
sax.debug('deleteContentSegment(' + idx + ')'); //sax.debug('deleteContentSegment(' + idx + ')');
if ($('.sax-panel-item.ArticleSegment', ac.$segList).length < 2) return; if ($('.sax-panel-item.ArticleSegment', ac.$segList).length < 2) return;
$('#' + sax.segmentId(idx)).remove(); sax.confirmItemRemove(function () { $('#' + sax.segmentId(idx)).remove(); });
}
sax.selectArticleImage = function (idx)
{
let $dlg = sax.$dlg.selectArticleImage.dialog('option', { title: sax.dlg.title.imageUpload });
$('input.SegmentIdx', $dlg).val(idx);
$('#ifArticleImage', $dlg).val('');
sax.openDialog($dlg, 560, 240);
}
sax.uploadArticleImage = function ()
{
let $dlg = sax.$dlg.selectArticleImage;
let $fileCtrl = $('#ifArticleImage', $dlg);
if (!$fileCtrl.length || !$fileCtrl[0].files.length)
return sax.doAlert(sax.dlg.title.imageUpload, sax.msg.uploadFileSelect);
let file = $fileCtrl[0].files[0];
sax.onDropArticleImageFile(file, $('input.SegmentIdx', $dlg).val(), $dlg);
}
sax.onDropArticleImage = function (evt, idx, $seg)
{
//sax.debug('onDropArticleImage');
let files = evt.originalEvent.dataTransfer.files;
if (files.length < 1) return;
if (files.length > 1) return sax.doAlert(sax.dlg.title.imageUpload, sax.msg.uploadImageSingle);
sax.onDropArticleImageFile(files[0], idx, $('#frmArticle'));
}
sax.onDropArticleImageFile = function (file, idx, context)
{
//sax.debug('onDropArticleImageFile', file, context);
ac.segIdxAddImage = idx;
if (file.size > sax.maxProfileImageSize) return sax.doAlert(sax.dlg.title.imageUpload, sax.msg.uploadFileSizeMax.format(sax.formatFileSize(sax.maxProfileImageSize)));
if (file.type != 'image/jpg' && file.type != 'image/jpeg' && file.type != 'image/png') return sax.doAlert(sax.dlg.title.imageUpload, sax.msg.uploadFileTypeInvalid.format(sax.getFileType(file)));
$(".UploadMessage", context).text(sax.msg.uploadingFile.format(file.name));
$('img.ArticleImageUploadProgress', context).fadeIn(200);
sax.clearControlError(sax.$pnl.contactImageDrag);
sax.data.contactImageUploadContext = context;
sax.ajax.uploadArticleImage = sax.ajax.uploadArticleImage || { url: sax.url.base + 'Journalist/Ajax/UploadArticleImage', callbackFn: sax.handleArticleImageUploadResponse, noWaitIcon: true };
sax.ajax.uploadArticleImage.formData = new FormData();
sax.ajax.uploadArticleImage.formData.append("__RequestVerificationToken", $('#frmNavigate input[name="__RequestVerificationToken"]').val());
sax.ajax.uploadArticleImage.formData.append("ArticleId", $('#ifArticleId', sax.$frm.article).val());
sax.ajax.uploadArticleImage.formData.append("ArticleImage", file);
sax.doAjaxRequest(sax.ajax.uploadArticleImage, 50);
}
sax.handleArticleImageUploadResponse = function (response)
{
let context = sax.data.contactImageUploadContext;
//sax.debug('handleArticleImageUploadResponse', response, context);
if (!response) return;
sax.refreshControlValues(response.controlValues, context);
$(".UploadMessage", context).empty();
$('img.ArticleImageUploadProgress', context).hide();
if (response.success && response.segment)
{
sax.addContentSegment(response.segment, 0, ac.segIdxAddImage);
delete ac.segIdxAddImage;
sax.$dlg.selectArticleImage.dialog('close');
}
} }
//-------------------------------------------------------------- //--------------------------------------------------------------
@@ -313,6 +405,11 @@
ac.$content = $('.sax-article-panel.sax-article-content'); ac.$content = $('.sax-article-panel.sax-article-content');
ac.$segList = $('.sax-article-segment-list', ac.$content); ac.$segList = $('.sax-article-segment-list', ac.$content);
var opt = sax.dlgOpts();
opt.buttons[sax.dlg.btn.ok] = function () { sax.uploadArticleImage(); };
opt.buttons[sax.dlg.btn.cancel] = function () { $(this).dialog('close'); };
sax.$dlg.selectArticleImage = $('#dlgSelectArticleImage').dialog(opt);
setTimeout(sax.refreshResults, 250); setTimeout(sax.refreshResults, 250);
}); });
+18 -13
View File
@@ -68,7 +68,7 @@
evt.preventDefault(); evt.preventDefault();
evt.stopPropagation(); evt.stopPropagation();
} }
sax.debug = sax.debugMode ? window.console.log.bind(window.console) : function () { }; sax.debug = sax.debugMode ? win.console.log.bind(win.console) : function () { };
//-------------------------------------------------------------- //--------------------------------------------------------------
sax.setOddDataRowClass = function (rowSel, cName) sax.setOddDataRowClass = function (rowSel, cName)
@@ -152,10 +152,11 @@
// Dialogs. // Dialogs.
sax.openDialog = function ($dlg, width, height) sax.openDialog = function ($dlg, width, height)
{ {
let $win = $(win);
$dlg.dialog( $dlg.dialog(
{ {
minWidth: null, maxWidth: null, width: Math.min(width || 400, $(window).width() * .90), minWidth: null, maxWidth: null, width: Math.min(width || 400, $win.width() * .90),
minHeight: null, maxHeight: null, height: Math.min(height || 320, $(window).innerHeight() * .90) minHeight: null, maxHeight: null, height: Math.min(height || 320, $win.innerHeight() * .96)
}).dialog('open'); }).dialog('open');
return $dlg; return $dlg;
} }
@@ -205,6 +206,10 @@
$('#dlgConfirmMsg').html(msg); $('#dlgConfirmMsg').html(msg);
sax.openDialog(sax.$dlg.confirm); sax.openDialog(sax.$dlg.confirm);
} }
sax.confirmItemRemove = function (fn)
{
sax.doConfirm('', sax.msg.itemRemoveConfirm, fn);
}
sax.doProgress = function (title, msg, delay) sax.doProgress = function (title, msg, delay)
{ {
if (!msg) if (!msg)
@@ -235,8 +240,8 @@
// Notifications. // Notifications.
sax.showNotification = function (title, msg) sax.showNotification = function (title, msg)
{ {
window.clearTimeout(sax.toNotification); win.clearTimeout(sax.toNotification);
var $win = $(window); var $win = $(win);
var $not = $('#sax-notification').hide(); var $not = $('#sax-notification').hide();
if (!$not.length) if (!$not.length)
{ {
@@ -255,7 +260,7 @@
} }
sax.hideNotification = function () sax.hideNotification = function ()
{ {
window.clearTimeout(sax.toNotification); win.clearTimeout(sax.toNotification);
$('#sax-notification').slideUp(500); $('#sax-notification').slideUp(500);
} }
sax.doPleaseWait = function () sax.doPleaseWait = function ()
@@ -272,13 +277,13 @@
// Ajax. // Ajax.
sax.doAjaxRequest = function (ajax, delay) sax.doAjaxRequest = function (ajax, delay)
{ {
window.clearTimeout(ajax.timeout); win.clearTimeout(ajax.timeout);
if (!ajax.noWaitIcon) sax.doPleaseWait(); if (!ajax.noWaitIcon) sax.doPleaseWait();
ajax.timeout = setTimeout(function () { sax.execAjaxRequest(ajax); }, Math.max(50, parseInt(delay || 0, 10))); ajax.timeout = setTimeout(function () { sax.execAjaxRequest(ajax); }, Math.max(50, parseInt(delay || 0, 10)));
} }
sax.execAjaxRequest = function (ajax) sax.execAjaxRequest = function (ajax)
{ {
window.clearTimeout(ajax.timeout); win.clearTimeout(ajax.timeout);
if (ajax.request) ajax.request.abort(); if (ajax.request) ajax.request.abort();
var cfgAjax = var cfgAjax =
{ {
@@ -360,7 +365,7 @@
{ {
sax.session = sax.session || { refresh: {} }; sax.session = sax.session || { refresh: {} };
let ssr = sax.session.refresh; let ssr = sax.session.refresh;
window.clearTimeout(ssr.timeout); win.clearTimeout(ssr.timeout);
ssr.timeout = setTimeout(function () { sax.refreshSession(); }, 150000); ssr.timeout = setTimeout(function () { sax.refreshSession(); }, 150000);
} }
sax.refreshSession = function () sax.refreshSession = function ()
@@ -383,12 +388,12 @@
} }
sax.setControlError = function (sel, error) sax.setControlError = function (sel, error)
{ {
var $ctrl = $(sel).closest('.sax-form-control').toggleClass('sax-error',!!error.length); var $ctrl = $(sel).closest('.sax-form-control').toggleClass('sax-error', !!error.length);
$('.sax-message', $ctrl).text(error); $('.sax-message', $ctrl).text(error);
} }
sax.refreshControlValues = function (controlValues, context) sax.refreshControlValues = function (controlValues, context)
{ {
var $frmCtrls = $('.sax-form-control',context).removeClass('sax-error'); var $frmCtrls = $('.sax-form-control', context).removeClass('sax-error');
sax.clearControlErrors(); sax.clearControlErrors();
var values = (controlValues || []); var values = (controlValues || []);
var valuesLen = values.length; var valuesLen = values.length;
@@ -461,11 +466,11 @@
if (viewport.is('xs')) $body.addClass('mob'); if (viewport.is('xs')) $body.addClass('mob');
else if (viewport.current() != 'unrecognized') $body.addClass('dsk'); else if (viewport.current() != 'unrecognized') $body.addClass('dsk');
} }
sax.isAutoHeight = function () { return ($(window).width() < 360 || $(window).height() < 560 || sax.isMob()); } sax.isAutoHeight = function () { return ($(win).width() < 360 || $(win).height() < 560 || sax.isMob()); }
sax.onWinResizePage = function () { }; sax.onWinResizePage = function () { };
sax.onWinResize = function () sax.onWinResize = function ()
{ {
var winH = $(window).height(); var winH = $(win).height();
var $pageBody = $('#sax-page-body'); var $pageBody = $('#sax-page-body');
var $hdr = $('#sax-page-header'); var $hdr = $('#sax-page-header');
var $ftr = $('#sax-page-footer'); var $ftr = $('#sax-page-footer');
+3 -1
View File
@@ -18,7 +18,7 @@ namespace Saxonite.Net.Standard.Base.App
//------------------------------------------------------------------- //-------------------------------------------------------------------
public static class Version public static class Version
{ {
private static String version { get; } = "1.0.8.1"; private static String version { get; } = "1.0.9.0";
// Retrieve version. // Retrieve version.
public static String GetFullVersion () { return version; } public static String GetFullVersion () { return version; }
public static String GetAppVersion () public static String GetAppVersion ()
@@ -40,6 +40,8 @@ namespace Saxonite.Net.Standard.Base.App
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Version history. // Version history.
//------------------------------------------------------------------- //-------------------------------------------------------------------
// 1.0.9 ?-Jun-2021 Journalist Articles
// - Online Article Images.
// 1.0.8 15-Jun-2021 Online Article Content // 1.0.8 15-Jun-2021 Online Article Content
// - Journalist Articles styled content. // - Journalist Articles styled content.
// - Online home page click through activity for details with reaction. // - Online home page click through activity for details with reaction.
+5 -1
View File
@@ -227,8 +227,12 @@ namespace Saxonite.Net.Standard.Base.App
Unknown, Unknown,
/// <summary>User's profile image.</summary> /// <summary>User's profile image.</summary>
Avatar = 100, Avatar = 100,
/// <summary>User's new profile image awaiting confirmation.</summary> /// <summary>User's profile image, uploaded awaiting confirmation.</summary>
AvatarUpload = 101, AvatarUpload = 101,
/// <summary>Journalist Article image.</summary>
Article = 200,
/// <summary>Journalist Article image uploaded, awaiting confirmation.</summary>
ArticleUpload = 201,
} }
//------------------------------------------------------------------- //-------------------------------------------------------------------
@@ -6,7 +6,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 // Code generated by Sarand Database Utilities Tue 22-Jun-2021 08:56:11
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Base.App namespace Saxonite.Base.App
{ {
@@ -57,6 +57,8 @@ namespace Saxonite.Base.App
ItemImage_ItemId, ItemImage_ItemId,
ItemImage_ImageType, ItemImage_ImageType,
ItemImage_ImageSeq, ItemImage_ImageSeq,
ItemImage_SessionUid,
ItemImage_ImageUid,
ItemImage_Filename, ItemImage_Filename,
ItemImage_Mime, ItemImage_Mime,
ItemImage_ContentType, ItemImage_ContentType,
@@ -269,7 +271,7 @@ namespace Saxonite.Base.App
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Data members. // Data members.
private static readonly int tableCount = 14; private static readonly int tableCount = 14;
private static readonly int columnCount = 226; private static readonly int columnCount = 228;
private static ulong maxTextLen = 0; private static ulong maxTextLen = 0;
//------------------------------------------------------------------- //-------------------------------------------------------------------
@@ -474,6 +476,8 @@ namespace Saxonite.Base.App
new ColumnDfn(2,"ItemId",4,4,false,10), new ColumnDfn(2,"ItemId",4,4,false,10),
new ColumnDfn(2,"ImageType",3,5,false,5), new ColumnDfn(2,"ImageType",3,5,false,5),
new ColumnDfn(2,"ImageSeq",2,-6,false,3), new ColumnDfn(2,"ImageSeq",2,-6,false,3),
new ColumnDfn(2,"SessionUid",5,-5,false,19),
new ColumnDfn(2,"ImageUid",4,4,false,10),
new ColumnDfn(2,"Filename",0,-9,false,1024), new ColumnDfn(2,"Filename",0,-9,false,1024),
new ColumnDfn(2,"Mime",0,12,false,64), new ColumnDfn(2,"Mime",0,12,false,64),
new ColumnDfn(2,"ContentType",0,12,false,128), new ColumnDfn(2,"ContentType",0,12,false,128),
@@ -10,6 +10,7 @@ using System.Text;
using System.Diagnostics; using System.Diagnostics;
using Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Base.Utils;
using Newtonsoft.Json.Converters; using Newtonsoft.Json.Converters;
using Sarand.Net.Standard.Base.Helpers;
namespace Saxonite.Net.Standard.Base.App namespace Saxonite.Net.Standard.Base.App
{ {
@@ -17,16 +18,15 @@ namespace Saxonite.Net.Standard.Base.App
public abstract class SaxSessionData public abstract class SaxSessionData
{ {
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Protected construction. private static long sessionIdxRoot = SacsRandomHelper.GetInt32(1000, 1999);
protected SaxSessionData()
{
}
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Construction. // Construction.
/// <summary>Hidden constructor for deserialisation only.</summary> /// <summary>Protected constructor for deserialisation only.</summary>
private SaxSessionData(SaxSessionContext sessionContext) protected SaxSessionData(long sessionIdx, int itemIdx, SaxSessionContext sessionContext)
{ {
SessionIdx = sessionIdx;
ItemIdx = itemIdx;
SessionContext = sessionContext; SessionContext = sessionContext;
userData = CreateUserData(SessionContext, null, null); userData = CreateUserData(SessionContext, null, null);
} }
@@ -37,12 +37,20 @@ namespace Saxonite.Net.Standard.Base.App
/// </summary> /// </summary>
protected SaxSessionData(SaxSessionContext sessionContext, SaxUserAccount userAccount, List<SaxUserRole> userRoles) protected SaxSessionData(SaxSessionContext sessionContext, SaxUserAccount userAccount, List<SaxUserRole> userRoles)
{ {
SessionIdx = ++sessionIdxRoot;
ItemIdx = 1000;
SessionContext = sessionContext; SessionContext = sessionContext;
userData = CreateUserData(SessionContext, userAccount, userRoles); userData = CreateUserData(SessionContext, userAccount, userRoles);
} }
//------------------------------------------------------------------- //-------------------------------------------------------------------
// Properties. // Properties.
// Session and Item indexers.
public long SessionIdx { get; }
public int ItemIdx { get; private set; }
[JsonIgnore]
public int NextItemIdx { get { return ++ItemIdx; } }
// Session context.
public SaxSessionContext SessionContext { get; } public SaxSessionContext SessionContext { get; }
[JsonIgnore] [JsonIgnore]
public bool ValidUserSession { get { return SysId.IsValid(User.UserAccountId) && SysId.IsValid(User.UserAccountId); } } public bool ValidUserSession { get { return SysId.IsValid(User.UserAccountId) && SysId.IsValid(User.UserAccountId); } }
@@ -98,6 +98,8 @@ namespace Saxonite.Net.Standard.Base.App
// Image types. // Image types.
imageTypeCodes.Add(Sax.ImageType.Avatar, "Avatar", "Avatar"); imageTypeCodes.Add(Sax.ImageType.Avatar, "Avatar", "Avatar");
imageTypeCodes.Add(Sax.ImageType.AvatarUpload, "AvatarUpload", "Avatar - upload"); imageTypeCodes.Add(Sax.ImageType.AvatarUpload, "AvatarUpload", "Avatar - upload");
imageTypeCodes.Add(Sax.ImageType.Article, "Article", "Article");
imageTypeCodes.Add(Sax.ImageType.ArticleUpload, "ArticleUpload", "Article - upload");
//--------------------------------------------------------------- //---------------------------------------------------------------
// Organisation types. // Organisation types.
+43 -2
View File
@@ -53,6 +53,8 @@ namespace Saxonite.Net.Standard.Base.Bus
public ItemId ItemId { get; set; } public ItemId ItemId { get; set; }
public Sax.ImageType ImageType { get; set; } public Sax.ImageType ImageType { get; set; }
public byte ImageSeq { get; set; } public byte ImageSeq { get; set; }
public long SessionUid { get; set; }
public int ImageUid { get; set; }
public String Filename { get; set; } public String Filename { get; set; }
public String Mime { get; set; } public String Mime { get; set; }
public String ContentType { get; set; } public String ContentType { get; set; }
@@ -88,6 +90,16 @@ namespace Saxonite.Net.Standard.Base.Bus
get { return data.ImageSeq; } get { return data.ImageSeq; }
set { CheckChanged(data.ImageSeq, value); data.ImageSeq = value; } set { CheckChanged(data.ImageSeq, value); data.ImageSeq = value; }
} }
public long SessionUid
{
get { return data.SessionUid; }
set { CheckChanged(data.SessionUid, value); data.SessionUid = value; }
}
public int ImageUid
{
get { return data.ImageUid; }
set { CheckChanged(data.ImageUid, value); data.ImageUid = value; }
}
public String Filename public String Filename
{ {
get { return data.Filename; } get { return data.Filename; }
@@ -124,6 +136,8 @@ namespace Saxonite.Net.Standard.Base.Bus
ItemId = data.ItemId; ItemId = data.ItemId;
ImageType = data.ImageType; ImageType = data.ImageType;
ImageSeq = data.ImageSeq; ImageSeq = data.ImageSeq;
SessionUid = data.SessionUid;
ImageUid = data.ImageUid;
Filename = data.Filename; Filename = data.Filename;
Mime = data.Mime; Mime = data.Mime;
ContentType = data.ContentType; ContentType = data.ContentType;
@@ -148,6 +162,8 @@ namespace Saxonite.Net.Standard.Base.Bus
public ValidValue ItemId { get; set; } = ValidValue.Valid; public ValidValue ItemId { get; set; } = ValidValue.Valid;
public ValidValue ImageType { get; set; } = ValidValue.Valid; public ValidValue ImageType { get; set; } = ValidValue.Valid;
public ValidValue ImageSeq { get; set; } = ValidValue.Valid; public ValidValue ImageSeq { get; set; } = ValidValue.Valid;
public ValidValue SessionUid { get; set; } = ValidValue.Valid;
public ValidValue ImageUid { get; set; } = ValidValue.Valid;
public ValidValue Filename { get; set; } = ValidValue.Valid; public ValidValue Filename { get; set; } = ValidValue.Valid;
public ValidValue Mime { get; set; } = ValidValue.Valid; public ValidValue Mime { get; set; } = ValidValue.Valid;
public ValidValue ContentType { get; set; } = ValidValue.Valid; public ValidValue ContentType { get; set; } = ValidValue.Valid;
@@ -213,18 +229,28 @@ namespace Saxonite.Net.Standard.Base.Bus
public ItemId ItemId public ItemId ItemId
{ {
get { return data.ItemId; } get { return data.ItemId; }
protected set { data.ItemId = value; } set { data.ItemId = value; }
} }
public Sax.ImageType ImageType public Sax.ImageType ImageType
{ {
get { return data.ImageType; } get { return data.ImageType; }
protected set { data.ImageType = value; } set { data.ImageType = value; }
} }
public byte ImageSeq public byte ImageSeq
{ {
get { return data.ImageSeq; } get { return data.ImageSeq; }
set { data.ImageSeq = value; } set { data.ImageSeq = value; }
} }
public long SessionUid
{
get { return data.SessionUid; }
set { data.SessionUid = value; }
}
public int ImageUid
{
get { return data.ImageUid; }
set { data.ImageUid = value; }
}
public String Filename public String Filename
{ {
get { return data.Filename; } get { return data.Filename; }
@@ -273,6 +299,7 @@ namespace Saxonite.Net.Standard.Base.Bus
NotDeleted, NotDeleted,
ActiveOnly, ActiveOnly,
InctiveOnly, InctiveOnly,
Deleted,
} }
/// <summary> /// <summary>
/// Item list parameters. /// Item list parameters.
@@ -294,6 +321,20 @@ namespace Saxonite.Net.Standard.Base.Bus
// Item list extension methods. // Item list extension methods.
public static class SaxItemImageList public static class SaxItemImageList
{ {
//-------------------------------------------------------------------
public static SaxItemImage GetItemImageById(this List<SaxItemImage> values, SysId itemImageId)
{
if (!SysId.IsValid(itemImageId)) return null;
return values.Find(item => item.Id.Equals(itemImageId));
}
public static SaxItemImage GetItemImageBySessionImage(this List<SaxItemImage> values, long sessionUid, int imageUid)
{
if (sessionUid < 1 || imageUid < 1) return null;
return values.Find(item => item.SessionUid == sessionUid && item.ImageUid == imageUid);
}
//-------------------------------------------------------------------
} }
//======================================================================= //=======================================================================
@@ -21,23 +21,46 @@ namespace Saxonite.Net.Standard.Base.Bus
private static readonly String ElementName_Segments = "segments"; private static readonly String ElementName_Segments = "segments";
private static readonly String ElementName_Segment = "segment"; private static readonly String ElementName_Segment = "segment";
private static readonly String ElementName_Body = "body"; private static readonly String ElementName_Body = "body";
private static readonly String ElementName_Html= "html"; private static readonly String ElementName_Html = "html";
private static readonly String ElementName_Image = "image";
private static readonly String ElementName_ImageId = "imageId";
//------------------------------------------------------------------- //-------------------------------------------------------------------
/// <summary>Article content.</summary> /// <summary>Article content.</summary>
public class ContentData public class ContentData
{ {
/// <summary>
/// Article Content Segment - either body content or image.
/// </summary>
public class SegmentData public class SegmentData
{ {
// Segment body.
public class BodyData public class BodyData
{ {
public bool IsValid()
{
if (!StringUtil.IsEmpty(Html)) return true;
return false;
}
public String Html { get; set; } = String.Empty; public String Html { get; set; } = String.Empty;
} }
public BodyData Body { get; } = new BodyData(); public BodyData Body { get; } = new BodyData();
// Segment image.
public class ImageData
{
public bool IsValid()
{
if (SysId.IsValid(ItemImageId)) return true;
return false;
}
public SysId ItemImageId { get; set; }
}
public ImageData Image { get; } = new ImageData();
// Validate. // Validate.
public bool IsValid() public bool IsValid()
{ {
if (!StringUtil.IsEmpty(Body.Html)) return true; if (Body.IsValid()) return true;
if (Image.IsValid()) return true;
return false; return false;
} }
} }
@@ -59,6 +82,7 @@ namespace Saxonite.Net.Standard.Base.Bus
{ {
String fn = typeof(ContentData).FullName + ".ExtractContent"; String fn = typeof(ContentData).FullName + ".ExtractContent";
ContentData content = new ContentData(); ContentData content = new ContentData();
if (StringUtil.IsEmpty(contentData)) return content;
try try
{ {
@@ -99,6 +123,22 @@ namespace Saxonite.Net.Standard.Base.Bus
else SaLogger.Warn(fn + " Unexpected 'Segment' child element: " + segmentChildElementName); else SaLogger.Warn(fn + " Unexpected 'Segment' child element: " + segmentChildElementName);
} }
} }
else if (segmentChildElementName.EqualsCI(ElementName_Image))
{
// Content segment image.
XElement imageElement = segmentChildElement;
foreach (XElement imageChildElement in imageElement.GetChildElements())
{
String imageChildElementName = imageChildElement.GetLocalName();
if (imageChildElementName.EqualsCI(ElementName_ImageId))
{
// Content segment image Id.
XElement imageIdElement = imageChildElement;
segment.Image.ItemImageId = imageIdElement.Value.ToSysId();
}
else SaLogger.Warn(fn + " Unexpected 'Segment' child element: " + segmentChildElementName);
}
}
else SaLogger.Warn(fn + " Unexpected 'Segment' child element: " + segmentChildElementName); else SaLogger.Warn(fn + " Unexpected 'Segment' child element: " + segmentChildElementName);
} }
// Add this segment to the list. // Add this segment to the list.
@@ -136,9 +176,20 @@ namespace Saxonite.Net.Standard.Base.Bus
{ {
if (!segment.IsValid()) continue; if (!segment.IsValid()) continue;
XElement segmentElement = segmentsElement.AppendElement(ElementName_Segment); XElement segmentElement = segmentsElement.AppendElement(ElementName_Segment);
XElement bodyElement = segmentElement.AppendElement(ElementName_Body); if (segment.Body.IsValid())
if (!StringUtil.IsEmpty(segment.Body.Html)) {
bodyElement.AppendElement(ElementName_Html, segment.Body.Html); // Segment Body.
XElement bodyElement = segmentElement.AppendElement(ElementName_Body);
if (!StringUtil.IsEmpty(segment.Body.Html))
bodyElement.AppendElement(ElementName_Html, segment.Body.Html);
}
else if (segment.Image.IsValid())
{
// Segment Image.
XElement imageElement = segmentElement.AppendElement(ElementName_Image);
if (SysId.IsValid(segment.Image.ItemImageId))
imageElement.AppendElement(ElementName_ImageId, SysId.ToString(segment.Image.ItemImageId));
}
} }
return doc.GetXml(); return doc.GetXml();
} }
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 // Code generated by Sarand Database Utilities Tue 22-Jun-2021 08:56:11
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 // Code generated by Sarand Database Utilities Tue 22-Jun-2021 08:56:11
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -24,6 +24,8 @@ namespace Saxonite.Net.Standard.Dbas.Internal
public ColumnDataInt32 _ItemId { get; } = new ColumnDataInt32("ItemId"); public ColumnDataInt32 _ItemId { get; } = new ColumnDataInt32("ItemId");
public ColumnDataInt16 _ImageType { get; } = new ColumnDataInt16("ImageType"); public ColumnDataInt16 _ImageType { get; } = new ColumnDataInt16("ImageType");
public ColumnDataByte _ImageSeq { get; } = new ColumnDataByte("ImageSeq"); public ColumnDataByte _ImageSeq { get; } = new ColumnDataByte("ImageSeq");
public ColumnDataInt64 _SessionUid { get; } = new ColumnDataInt64("SessionUid");
public ColumnDataInt32 _ImageUid { get; } = new ColumnDataInt32("ImageUid");
public ColumnDataString _Filename { get; } = new ColumnDataString("Filename"); public ColumnDataString _Filename { get; } = new ColumnDataString("Filename");
public ColumnDataString _Mime { get; } = new ColumnDataString("Mime"); public ColumnDataString _Mime { get; } = new ColumnDataString("Mime");
public ColumnDataString _ContentType { get; } = new ColumnDataString("ContentType"); public ColumnDataString _ContentType { get; } = new ColumnDataString("ContentType");
@@ -50,6 +52,8 @@ namespace Saxonite.Net.Standard.Dbas.Internal
"ItemId", "ItemId",
"ImageType", "ImageType",
"ImageSeq", "ImageSeq",
"SessionUid",
"ImageUid",
"Filename", "Filename",
"Mime", "Mime",
"ContentType", "ContentType",
@@ -102,6 +106,8 @@ namespace Saxonite.Net.Standard.Dbas.Internal
public Int32 _ItemId { get { return Cols._ItemId.Value; } set { Cols._ItemId.Value = value; } } public Int32 _ItemId { get { return Cols._ItemId.Value; } set { Cols._ItemId.Value = value; } }
public Int16 _ImageType { get { return Cols._ImageType.Value; } set { Cols._ImageType.Value = value; } } public Int16 _ImageType { get { return Cols._ImageType.Value; } set { Cols._ImageType.Value = value; } }
public Byte _ImageSeq { get { return Cols._ImageSeq.Value; } set { Cols._ImageSeq.Value = value; } } public Byte _ImageSeq { get { return Cols._ImageSeq.Value; } set { Cols._ImageSeq.Value = value; } }
public Int64 _SessionUid { get { return Cols._SessionUid.Value; } set { Cols._SessionUid.Value = value; } }
public Int32 _ImageUid { get { return Cols._ImageUid.Value; } set { Cols._ImageUid.Value = value; } }
public String _Filename { get { return Cols._Filename.Value; } set { Cols._Filename.Value = value; } } public String _Filename { get { return Cols._Filename.Value; } set { Cols._Filename.Value = value; } }
public String _Mime { get { return Cols._Mime.Value; } set { Cols._Mime.Value = value; } } public String _Mime { get { return Cols._Mime.Value; } set { Cols._Mime.Value = value; } }
public String _ContentType { get { return Cols._ContentType.Value; } set { Cols._ContentType.Value = value; } } public String _ContentType { get { return Cols._ContentType.Value; } set { Cols._ContentType.Value = value; } }
@@ -143,6 +149,8 @@ namespace Saxonite.Net.Standard.Dbas.Internal
_ItemId = GetFieldInt32(dbDataReader, "ItemId", _ItemId); _ItemId = GetFieldInt32(dbDataReader, "ItemId", _ItemId);
_ImageType = GetFieldInt16(dbDataReader, "ImageType", _ImageType); _ImageType = GetFieldInt16(dbDataReader, "ImageType", _ImageType);
_ImageSeq = GetFieldByte(dbDataReader, "ImageSeq", _ImageSeq); _ImageSeq = GetFieldByte(dbDataReader, "ImageSeq", _ImageSeq);
_SessionUid = GetFieldInt64(dbDataReader, "SessionUid", _SessionUid);
_ImageUid = GetFieldInt32(dbDataReader, "ImageUid", _ImageUid);
_Filename = GetFieldString(dbDataReader, "Filename", _Filename); _Filename = GetFieldString(dbDataReader, "Filename", _Filename);
_Mime = GetFieldString(dbDataReader, "Mime", _Mime); _Mime = GetFieldString(dbDataReader, "Mime", _Mime);
_ContentType = GetFieldString(dbDataReader, "ContentType", _ContentType); _ContentType = GetFieldString(dbDataReader, "ContentType", _ContentType);
@@ -183,6 +191,8 @@ namespace Saxonite.Net.Standard.Dbas.Internal
if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId); if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId);
if (columnNames.ContainsCI("ImageType")) AddCommandParameter(dbCommand, "@ImageType", _ImageType); if (columnNames.ContainsCI("ImageType")) AddCommandParameter(dbCommand, "@ImageType", _ImageType);
if (columnNames.ContainsCI("ImageSeq")) AddCommandParameter(dbCommand, "@ImageSeq", _ImageSeq); if (columnNames.ContainsCI("ImageSeq")) AddCommandParameter(dbCommand, "@ImageSeq", _ImageSeq);
if (columnNames.ContainsCI("SessionUid")) AddCommandParameter(dbCommand, "@SessionUid", _SessionUid);
if (columnNames.ContainsCI("ImageUid")) AddCommandParameter(dbCommand, "@ImageUid", _ImageUid);
if (columnNames.ContainsCI("Filename")) AddCommandParameter(dbCommand, "@Filename", _Filename); if (columnNames.ContainsCI("Filename")) AddCommandParameter(dbCommand, "@Filename", _Filename);
if (columnNames.ContainsCI("Mime")) AddCommandParameter(dbCommand, "@Mime", _Mime); if (columnNames.ContainsCI("Mime")) AddCommandParameter(dbCommand, "@Mime", _Mime);
if (columnNames.ContainsCI("ContentType")) AddCommandParameter(dbCommand, "@ContentType", _ContentType); if (columnNames.ContainsCI("ContentType")) AddCommandParameter(dbCommand, "@ContentType", _ContentType);
@@ -238,6 +248,8 @@ namespace Saxonite.Net.Standard.Dbas.Internal
if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId); if (columnNames.ContainsCI("ItemId")) AddCommandParameter(dbCommand, "@ItemId", _ItemId);
if (columnNames.ContainsCI("ImageType")) AddCommandParameter(dbCommand, "@ImageType", _ImageType); if (columnNames.ContainsCI("ImageType")) AddCommandParameter(dbCommand, "@ImageType", _ImageType);
if (columnNames.ContainsCI("ImageSeq")) AddCommandParameter(dbCommand, "@ImageSeq", _ImageSeq); if (columnNames.ContainsCI("ImageSeq")) AddCommandParameter(dbCommand, "@ImageSeq", _ImageSeq);
if (columnNames.ContainsCI("SessionUid")) AddCommandParameter(dbCommand, "@SessionUid", _SessionUid);
if (columnNames.ContainsCI("ImageUid")) AddCommandParameter(dbCommand, "@ImageUid", _ImageUid);
if (columnNames.ContainsCI("Filename")) AddCommandParameter(dbCommand, "@Filename", _Filename); if (columnNames.ContainsCI("Filename")) AddCommandParameter(dbCommand, "@Filename", _Filename);
if (columnNames.ContainsCI("Mime")) AddCommandParameter(dbCommand, "@Mime", _Mime); if (columnNames.ContainsCI("Mime")) AddCommandParameter(dbCommand, "@Mime", _Mime);
if (columnNames.ContainsCI("ContentType")) AddCommandParameter(dbCommand, "@ContentType", _ContentType); if (columnNames.ContainsCI("ContentType")) AddCommandParameter(dbCommand, "@ContentType", _ContentType);
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 // Code generated by Sarand Database Utilities Tue 22-Jun-2021 08:56:11
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 // Code generated by Sarand Database Utilities Tue 22-Jun-2021 08:56:11
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 // Code generated by Sarand Database Utilities Tue 22-Jun-2021 08:56:11
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 // Code generated by Sarand Database Utilities Tue 22-Jun-2021 08:56:11
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 // Code generated by Sarand Database Utilities Tue 22-Jun-2021 08:56:11
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 // Code generated by Sarand Database Utilities Tue 22-Jun-2021 08:56:11
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 // Code generated by Sarand Database Utilities Tue 22-Jun-2021 08:56:11
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 // Code generated by Sarand Database Utilities Tue 22-Jun-2021 08:56:11
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 // Code generated by Sarand Database Utilities Tue 22-Jun-2021 08:56:11
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 // Code generated by Sarand Database Utilities Tue 22-Jun-2021 08:56:11
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 // Code generated by Sarand Database Utilities Tue 22-Jun-2021 08:56:11
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -9,7 +9,7 @@ using System.Data.Common;
using System.Linq; using System.Linq;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Code generated by Sarand Database Utilities Fri 18-Jun-2021 11:08:40 // Code generated by Sarand Database Utilities Tue 22-Jun-2021 08:56:11
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
namespace Saxonite.Net.Standard.Dbas.Internal namespace Saxonite.Net.Standard.Dbas.Internal
{ {
@@ -29,7 +29,7 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
return new List<StringPair>() return new List<StringPair>()
{ {
new StringPair("Id", SysId.ToString(itemImage.Id)), new StringPair("Id", SysId.ToString(itemImage.Id)),
new StringPair("ItemId", ItemId.ToString(itemImage.ItemId)), new StringPair("ItemId", (Sax.DataItemType)itemImage.ItemId.Type + ": " + itemImage.ItemId.Id),
new StringPair("ImageType", itemImage.ImageType.ToString()), new StringPair("ImageType", itemImage.ImageType.ToString()),
new StringPair("Status", itemImage.StatusCode) new StringPair("Status", itemImage.StatusCode)
}; };
@@ -209,6 +209,8 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
dbItemImage._ItemId = SysId.ToInt(itemImage.ItemId.Id); dbItemImage._ItemId = SysId.ToInt(itemImage.ItemId.Id);
dbItemImage._ImageType = (short)itemImage.ImageType; dbItemImage._ImageType = (short)itemImage.ImageType;
dbItemImage._ImageSeq = itemImage.ImageSeq; dbItemImage._ImageSeq = itemImage.ImageSeq;
dbItemImage._SessionUid = itemImage.SessionUid;
dbItemImage._ImageUid = itemImage.ImageUid;
dbItemImage._Filename = itemImage.Filename; dbItemImage._Filename = itemImage.Filename;
dbItemImage._Mime = itemImage.Mime; dbItemImage._Mime = itemImage.Mime;
dbItemImage._ContentType = itemImage.ContentType; dbItemImage._ContentType = itemImage.ContentType;
@@ -235,6 +237,8 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
//itemImage.ItemId = new ItemId(dbItemImage._ItemType, new SysId(dbItemImage._ItemId); //itemImage.ItemId = new ItemId(dbItemImage._ItemType, new SysId(dbItemImage._ItemId);
//itemImage.ImageType = (Sax.ImageType)dbItemImage._ImageType; //itemImage.ImageType = (Sax.ImageType)dbItemImage._ImageType;
itemImage.ImageSeq = dbItemImage._ImageSeq; itemImage.ImageSeq = dbItemImage._ImageSeq;
itemImage.SessionUid = dbItemImage._SessionUid;
itemImage.ImageUid = dbItemImage._ImageUid;
itemImage.Filename = dbItemImage._Filename; itemImage.Filename = dbItemImage._Filename;
itemImage.Mime = dbItemImage._Mime; itemImage.Mime = dbItemImage._Mime;
itemImage.ContentType = dbItemImage._ContentType; itemImage.ContentType = dbItemImage._ContentType;
@@ -407,8 +411,12 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
// Status. // Status.
if (prm.StatusCat == SaxItemImage.StatusCat.ActiveOnly) if (prm.StatusCat == SaxItemImage.StatusCat.ActiveOnly)
filter.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ItemImage_Status, aliasItemImage) + "='" + SacsSystem.GetStatusCode(SaStatus.Active) + "'"); filter.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ItemImage_Status, aliasItemImage) + "='" + SacsSystem.GetStatusCode(SaStatus.Active) + "'");
else if (prm.StatusCat == SaxItemImage.StatusCat.InctiveOnly)
filter.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ItemImage_Status, aliasItemImage) + "='" + SacsSystem.GetStatusCode(SaStatus.Inactive) + "'");
else if (prm.StatusCat == SaxItemImage.StatusCat.NotDeleted) else if (prm.StatusCat == SaxItemImage.StatusCat.NotDeleted)
filter.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ItemImage_Status, aliasItemImage) + "!='" + SacsSystem.GetStatusCode(SaStatus.Deleted) + "'"); filter.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ItemImage_Status, aliasItemImage) + "!='" + SacsSystem.GetStatusCode(SaStatus.Deleted) + "'");
else if (prm.StatusCat == SaxItemImage.StatusCat.Deleted)
filter.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.ItemImage_Status, aliasItemImage) + "='" + SacsSystem.GetStatusCode(SaStatus.Deleted) + "'");
if (filter.Count < 1) filter.Add("1=1"); if (filter.Count < 1) filter.Add("1=1");
return filter; return filter;
@@ -28,7 +28,7 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
return new List<StringPair>() return new List<StringPair>()
{ {
new StringPair("Id",SysId.ToString(itemSport.Id)), new StringPair("Id",SysId.ToString(itemSport.Id)),
new StringPair("ItemId",ItemId.ToString(itemSport.ItemId)), new StringPair("ItemId", (Sax.DataItemType)itemSport.ItemId.Type + ": " + itemSport.ItemId.Id),
new StringPair("Sport",SysId.ToString(itemSport.SportId)), new StringPair("Sport",SysId.ToString(itemSport.SportId)),
new StringPair("Status",itemSport.StatusCode) new StringPair("Status",itemSport.StatusCode)
}; };
@@ -437,6 +437,40 @@
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>ItemImage</Table> <Table>ItemImage</Table>
<Pos>6</Pos> <Pos>6</Pos>
<Name>SessionUid</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>ItemImage</Table>
<Pos>7</Pos>
<Name>ImageUid</Name>
<DataType>Int</DataType>
<DataTypeName />
<DataTypeNative>4</DataTypeNative>
<DataTypeNameNative>int</DataTypeNameNative>
<IsIdentity>false</IsIdentity>
<Size>10</Size>
<BufferLen>4</BufferLen>
<DecimalDigits>0</DecimalDigits>
<Nullable>NoNulls</Nullable>
<IsNullable>false</IsNullable>
<Remarks />
</DbDfnColumn>
<DbDfnColumn>
<Schema>dbo</Schema>
<Table>ItemImage</Table>
<Pos>8</Pos>
<Name>Filename</Name> <Name>Filename</Name>
<DataType>VarChar</DataType> <DataType>VarChar</DataType>
<DataTypeName /> <DataTypeName />
@@ -453,7 +487,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>ItemImage</Table> <Table>ItemImage</Table>
<Pos>7</Pos> <Pos>9</Pos>
<Name>Mime</Name> <Name>Mime</Name>
<DataType>VarChar</DataType> <DataType>VarChar</DataType>
<DataTypeName /> <DataTypeName />
@@ -470,7 +504,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>ItemImage</Table> <Table>ItemImage</Table>
<Pos>8</Pos> <Pos>10</Pos>
<Name>ContentType</Name> <Name>ContentType</Name>
<DataType>VarChar</DataType> <DataType>VarChar</DataType>
<DataTypeName /> <DataTypeName />
@@ -487,7 +521,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>ItemImage</Table> <Table>ItemImage</Table>
<Pos>9</Pos> <Pos>11</Pos>
<Name>Width</Name> <Name>Width</Name>
<DataType>Int</DataType> <DataType>Int</DataType>
<DataTypeName /> <DataTypeName />
@@ -504,7 +538,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>ItemImage</Table> <Table>ItemImage</Table>
<Pos>10</Pos> <Pos>12</Pos>
<Name>Height</Name> <Name>Height</Name>
<DataType>Int</DataType> <DataType>Int</DataType>
<DataTypeName /> <DataTypeName />
@@ -521,7 +555,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>ItemImage</Table> <Table>ItemImage</Table>
<Pos>11</Pos> <Pos>13</Pos>
<Name>ImageData</Name> <Name>ImageData</Name>
<DataType>Binary</DataType> <DataType>Binary</DataType>
<DataTypeName /> <DataTypeName />
@@ -538,7 +572,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>ItemImage</Table> <Table>ItemImage</Table>
<Pos>12</Pos> <Pos>14</Pos>
<Name>Notes</Name> <Name>Notes</Name>
<DataType>VarChar</DataType> <DataType>VarChar</DataType>
<DataTypeName /> <DataTypeName />
@@ -555,7 +589,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>ItemImage</Table> <Table>ItemImage</Table>
<Pos>13</Pos> <Pos>15</Pos>
<Name>Flags</Name> <Name>Flags</Name>
<DataType>SmallInt</DataType> <DataType>SmallInt</DataType>
<DataTypeName /> <DataTypeName />
@@ -572,7 +606,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>ItemImage</Table> <Table>ItemImage</Table>
<Pos>14</Pos> <Pos>16</Pos>
<Name>Status</Name> <Name>Status</Name>
<DataType>VarChar</DataType> <DataType>VarChar</DataType>
<DataTypeName /> <DataTypeName />
@@ -589,7 +623,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>ItemImage</Table> <Table>ItemImage</Table>
<Pos>15</Pos> <Pos>17</Pos>
<Name>CreateOn</Name> <Name>CreateOn</Name>
<DataType>DateTime</DataType> <DataType>DateTime</DataType>
<DataTypeName /> <DataTypeName />
@@ -606,7 +640,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>ItemImage</Table> <Table>ItemImage</Table>
<Pos>16</Pos> <Pos>18</Pos>
<Name>CreateBy</Name> <Name>CreateBy</Name>
<DataType>Int</DataType> <DataType>Int</DataType>
<DataTypeName /> <DataTypeName />
@@ -623,7 +657,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>ItemImage</Table> <Table>ItemImage</Table>
<Pos>17</Pos> <Pos>19</Pos>
<Name>CreateHost</Name> <Name>CreateHost</Name>
<DataType>VarChar</DataType> <DataType>VarChar</DataType>
<DataTypeName /> <DataTypeName />
@@ -640,7 +674,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>ItemImage</Table> <Table>ItemImage</Table>
<Pos>18</Pos> <Pos>20</Pos>
<Name>UpdateOn</Name> <Name>UpdateOn</Name>
<DataType>DateTime</DataType> <DataType>DateTime</DataType>
<DataTypeName /> <DataTypeName />
@@ -657,7 +691,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>ItemImage</Table> <Table>ItemImage</Table>
<Pos>19</Pos> <Pos>21</Pos>
<Name>UpdateBy</Name> <Name>UpdateBy</Name>
<DataType>Int</DataType> <DataType>Int</DataType>
<DataTypeName /> <DataTypeName />
@@ -674,7 +708,7 @@
<DbDfnColumn> <DbDfnColumn>
<Schema>dbo</Schema> <Schema>dbo</Schema>
<Table>ItemImage</Table> <Table>ItemImage</Table>
<Pos>20</Pos> <Pos>22</Pos>
<Name>UpdateHost</Name> <Name>UpdateHost</Name>
<DataType>VarChar</DataType> <DataType>VarChar</DataType>
<DataTypeName /> <DataTypeName />
@@ -700,7 +734,7 @@
<Clustered>false</Clustered> <Clustered>false</Clustered>
<Nullable>false</Nullable> <Nullable>false</Nullable>
<Pages>1</Pages> <Pages>1</Pages>
<UniqueValues>2</UniqueValues> <UniqueValues>5</UniqueValues>
<HasColumns>false</HasColumns> <HasColumns>false</HasColumns>
<Columns> <Columns>
<DbDfnIndexColumn> <DbDfnIndexColumn>
@@ -3816,8 +3850,8 @@
<Primary>false</Primary> <Primary>false</Primary>
<Clustered>false</Clustered> <Clustered>false</Clustered>
<Nullable>false</Nullable> <Nullable>false</Nullable>
<Pages>0</Pages> <Pages>1</Pages>
<UniqueValues>0</UniqueValues> <UniqueValues>8</UniqueValues>
<HasColumns>false</HasColumns> <HasColumns>false</HasColumns>
<Columns> <Columns>
<DbDfnIndexColumn> <DbDfnIndexColumn>