Files
BusinessMgr-2019/SaBusinessMgrCoreWebControl/Control/Controllers/Param/ParamController-Ajax.cs
T
2025-01-27 10:01:32 +00:00

438 lines
18 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
using Sarand.BusinessMgr.Web.Control.Models;
using Sarand.BusinessMgr.Web.Control.Models.Param;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
namespace Sarand.BusinessMgr.Web.Control.Controllers.Param
{
//=======================================================================
partial class ParamController
{
//-------------------------------------------------------------------
// Definitions.
// Param data.
private class ParamListData : AjaxResponse_Data.ItemData_Base
{
public String ItemCaption { get; set; }
public String ParamType { get; set; }
public String ParamCaption { get; set; }
public String Name { get; set; }
public String Context { get; set; }
public String Value { get; set; }
public bool? Password { get; set; }
}
private class ParamItemData : ParamListData
{
public String ItemType { get; set; }
public String ItemId { get; set; }
}
private void PopulateParamResponseListData(SbmModel_Control model, ParamListData data, SbmcItemParam itemParam)
{
data.Id = SysId.ToString(itemParam.Id);
data.ItemCaption = itemParam.ItemId.Type.ToString() + ": " + itemParam.ItemId.Id;
data.Name = itemParam.Name;
data.Context = itemParam.Context;
if (itemParam.IsPasswordValue())
data.Password = true;
else
data.Value = itemParam.Value;
data.StatusCode = itemParam.StatusCode;
data.StatusDesc = itemParam.StatusDesc;
}
private void PopulateParamResponseItemData(SbmModel_Control model, ParamItemData data, SbmcItemParam itemParam)
{
PopulateParamResponseListData(model, data, itemParam);
data.ItemType = itemParam.ItemId.Type.ToString();
data.ItemId = SysId.ToString(itemParam.ItemId.Id);
data.ItemCaption = ControlItemMgr.GetItemCaption(itemParam.ItemId);
data.Notes = itemParam.Notes;
}
//-------------------------------------------------------------------
// Get Filter Items ajax request.
//-------------------------------------------------------------------
private class AjaxResponse_FilterItemList : AjaxResponse_Data
{
// Construction.
public AjaxResponse_FilterItemList(SbmModel_Control model) : base(model) { }
// Items.
public List<ItemIdName> Items { get; } = new List<ItemIdName>();
}
//-------------------------------------------------------------------
[HttpPost]
[Route("Param/Param/Ajax/GetFilterItems")]
public IActionResult Ajax_GetParamFilterItemList(Model_Param model)
{
String messageTitle = Localiser["label.params"];
AjaxResponse_FilterItemList responseData = new AjaxResponse_FilterItemList(model);
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
SbmcHierarchyItem.ItemType itemType = EnumUtil.ParseEnum(model.Filter.ItemType, SbmcHierarchyItem.ItemType.Unknown);
if (itemType == SbmcHierarchyItem.ItemType.Unknown)
{
SaLogger.Warn($"{SysUtil.Fn} Item type not specified.");
return Json(responseData);
}
if (itemType == SbmcHierarchyItem.ItemType.Owner)
{
// Item filter.
SbmcOwner.Params prmOwner = new SbmcOwner.Params();
prmOwner.StatusCat = SbmcOwner.StatusCat.ActiveOnly;
//model.Paging.ItemTotal = (ulong)ControlInstanceMgr.GetOwnerCount(prmOwner);
//model.PopulatePagingTo(prmOwner.ResultsPaging);
// Item columns.
ColumnDfn colId = ControlInstanceMgr.GetOwnerColumnDfn(SbmcOwner.Column.Id);
ColumnDfn colName = ControlInstanceMgr.GetOwnerColumnDfn(SbmcOwner.Column.Name);
List<ColumnDfn> columns = new List<ColumnDfn>() { colId, colName };
// Query items.
using (DbResultSet resultSet = ControlInstanceMgr.ExecuteOwnerQuery(columns, prmOwner))
{
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
{
NamedValue.Map values = resultSet.GetRecordValues();
AjaxResponse_Data.ItemIdName itemParamData = new AjaxResponse_Data.ItemIdName()
{
Id = values.GetString(colId.DataName),
Name = values.GetString(colName.DataName),
};
responseData.Items.Add(itemParamData);
}
}
//if (model.Paging.IsPaged)
// model.Paging.ItemCount = (ushort)responseData.Items.Count;
// Complete response.
responseData.SetPaging(model);
responseData.Success = true;
}
else if (itemType == SbmcHierarchyItem.ItemType.Repository)
{
// Item filter.
SbmcRepository.Params prmRepository = new SbmcRepository.Params();
prmRepository.StatusCat = SbmcRepository.StatusCat.ActiveOnly;
//model.Paging.ItemTotal = (ulong)ControlInstanceMgr.GetRepositoryCount(prmRepository);
//model.PopulatePagingTo(prmRepository.ResultsPaging);
// Item columns.
ColumnDfn colId = ControlInstanceMgr.GetRepositoryColumnDfn(SbmcRepository.Column.Id);
ColumnDfn colName = ControlInstanceMgr.GetRepositoryColumnDfn(SbmcRepository.Column.Context);
List<ColumnDfn> columns = new List<ColumnDfn>() { colId, colName };
// Query items.
using (DbResultSet resultSet = ControlInstanceMgr.ExecuteRepositoryQuery(columns, prmRepository))
{
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
{
NamedValue.Map values = resultSet.GetRecordValues();
AjaxResponse_Data.ItemIdName itemParamData = new AjaxResponse_Data.ItemIdName()
{
Id = values.GetString(colId.DataName),
Name = values.GetString(colName.DataName),
};
responseData.Items.Add(itemParamData);
}
}
//if (model.Paging.IsPaged)
// model.Paging.ItemCount = (ushort)responseData.Items.Count;
// Complete response.
responseData.SetPaging(model);
responseData.Success = true;
}
return Json(responseData);
}
//-------------------------------------------------------------------
// Get Param List ajax request.
//-------------------------------------------------------------------
private class AjaxResponse_ParamList : AjaxResponse_Data
{
// Construction.
public AjaxResponse_ParamList(SbmModel_Control model) : base(model) { }
// Items.
public List<ParamListData> Params { get; } = new List<ParamListData>();
// Reference data.
public List<CodeDesc> Statuses { get; } = new List<CodeDesc>();
public List<CodeDesc> StatusesCreate { get; } = new List<CodeDesc>();
public String StatusCodeDefault { get; set; }
}
//-------------------------------------------------------------------
[HttpPost]
[Route("Param/Param/Ajax/GetList")]
[Route("Param/Param/Ajax/GetParams")]
[Route("Param/Param/Ajax/GetParamList")]
public IActionResult Ajax_GetParamList(Model_Param model)
{
String messageTitle = Localiser["label.params"];
AjaxResponse_ParamList responseData = new AjaxResponse_ParamList(model);
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
// Reference data - statuses.
foreach (SaStatus status in SbmcItemParam.ValidStatuses)
{
responseData.Statuses.Add(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status));
if (status != SaStatus.Deleted)
responseData.StatusesCreate.Add(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status));
}
responseData.StatusCodeDefault = SacsSystem.GetStatusCode(SbmcItemParam.DefaultStatus);
// Item filter.
SbmcItemParam.Params prmParam = new SbmcItemParam.Params();
ItemId itemId = new ItemId(StringUtil.ToShort(model.Filter.ItemType), SysId.ToSysId(model.Filter.ItemId));
if (ItemId.IsValid(itemId))
prmParam.ItemIdsIncluded.Add(itemId);
prmParam.Search = model.Filter.Search;
prmParam.Search = model.Filter.Search;
prmParam.StatusCat = model.Filter.GetStatusCat();
model.Paging.ItemTotal = (ulong)ControlItemMgr.GetItemParamCount(prmParam);
model.PopulatePagingTo(prmParam.ResultsPaging);
// Item columns.
ColumnDfn colId = ControlItemMgr.GetItemParamColumnDfn(SbmcItemParam.Column.Id);
ColumnDfn colItemCaption = ControlItemMgr.GetItemParamColumnDfn(SbmcItemParam.Column.Item_Caption);
ColumnDfn colContext = ControlItemMgr.GetItemParamColumnDfn(SbmcItemParam.Column.Context);
ColumnDfn colName = ControlItemMgr.GetItemParamColumnDfn(SbmcItemParam.Column.Name);
ColumnDfn colValue = ControlItemMgr.GetItemParamColumnDfn(SbmcItemParam.Column.Value);
ColumnDfn colFlags = ControlItemMgr.GetItemParamColumnDfn(SbmcItemParam.Column.Flags);
ColumnDfn colStatus = ControlItemMgr.GetItemParamColumnDfn(SbmcItemParam.Column.Status);
List<ColumnDfn> columns = new List<ColumnDfn>()
{
colId, colItemCaption, colContext, colName, colValue, colFlags, colStatus
};
// Query items.
using (DbResultSet resultSet = ControlItemMgr.ExecuteItemParamQuery(columns, prmParam))
{
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
{
NamedValue.Map values = resultSet.GetRecordValues();
String paramContext = values.GetString(colContext.DataName);
String paramName = values.GetString(colName.DataName);
ushort paramFlags = (ushort)values.GetLong(colFlags.DataName);
ParamListData itemParamData = new ParamListData()
{
Id = values.GetString(colId.DataName),
ItemCaption = ControlItemMgr.GetItemParamDataValue(colItemCaption, values).ToString(),
Context = values.GetString(colContext.DataName),
Name = values.GetString(colName.DataName),
Value = ControlItemMgr.GetItemParamDataValue(colValue, values).ToString(),
StatusCode = values.GetString(colStatus.DataName),
StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName))
};
if (SbmcItemParam.IsPasswordValue(paramContext, paramName, paramFlags))
itemParamData.Password = true;
responseData.Params.Add(itemParamData);
}
}
if (model.Paging.IsPaged)
model.Paging.ItemCount = (ushort)responseData.Params.Count;
// Complete response.
responseData.SetPaging(model);
responseData.Success = true;
return Json(responseData);
}
//-------------------------------------------------------------------
// Get Param ajax request.
//-------------------------------------------------------------------
private class AjaxResponse_Param : AjaxResponse_Data
{
// Construction.
public AjaxResponse_Param(SbmModel_Control model) : base(model) { }
// Param details.
public ParamItemData Param { get; } = new ParamItemData();
}
//-------------------------------------------------------------------
[HttpPost]
[Route("Param/Param/Ajax/GetItem")]
[Route("Param/Param/Ajax/GetParam")]
public IActionResult Ajax_GetParam(Model_Param model)
{
String messageTitle = Localiser["label.param"];
AjaxResponse_Param responseData = new AjaxResponse_Param(model);
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<SacsHierarchyItem> disposables = new DisposableCollection<SacsHierarchyItem>())
{
// Identify item.
SysId itemParamId = SysId.ToSysId(model.Param.Id);
if (!SysId.IsValid(itemParamId))
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"]));
// Retrieve item.
SbmcItemParam itemParam = ControlItemMgr.GetItemParamById(itemParamId);
disposables.Add(itemParam);
if (itemParam == null)
{
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve itemParam for Id: '" + itemParamId + "'");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
}
// Construct response.
PopulateParamResponseItemData(model, responseData.Param, itemParam);
responseData.Success = true;
}
return Json(responseData);
}
//-------------------------------------------------------------------
// Store Param ajax request.
//-------------------------------------------------------------------
[HttpPost]
[Route("Param/Param/Ajax/StoreItem")]
[Route("Param/Param/Ajax/StoreParam")]
public IActionResult Ajax_StoreParam(Model_Param model)
{
String messageTitle = Localiser["label.param"];
AjaxResponse_Param responseData = new AjaxResponse_Param(model);
// Validate session and referrer.
if (!ValidReferer) return Forbid();
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
RefreshModel(model);
// Validate item Id.
SysId itemParamId = SysId.ToSysId(model.Param.Id);
if (StringUtil.ToBool(model.Param.Exists) && !SysId.IsValid(itemParamId))
{
SaLogger.Warn($"{SysUtil.Fn} Id not supplied for existing Item Param.");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
}
if (!StringUtil.ToBool(model.Param.Exists) && SysId.IsValid(itemParamId))
{
SaLogger.Warn($"{SysUtil.Fn} Id supplied for new Item Param.");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
}
// Validate item properties.
model.ValidateParamData(responseData);
if (responseData.HasControlErrors())
return Json(responseData);
// Record disposable items as they are created so all can be disposed when needed.
using (DisposableCollection<SacsHierarchyItem> disposables = new DisposableCollection<SacsHierarchyItem>())
{
// Retrieve existing item.
SbmcItemParam itemParam = ControlItemMgr.GetItemParamById(itemParamId);
disposables.Add(itemParam);
if (itemParam == null && SysId.IsValid(itemParamId))
{
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve Item Param for Id: '" + model.Param.Id + "'");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
}
// Contruct item id.
ItemId itemId = new ItemId(StringUtil.ToShort(model.Param.ItemType), SysId.ToSysId(model.Param.ItemId));
if (itemParam != null && !itemParam.ItemId.Equals(itemId))
{
SaLogger.Warn($"{SysUtil.Fn} Inconsistent Item Id specified for Item Param. Expected - Type: {(SbmcHierarchyItem.ItemType)itemParam.ItemId.Type}, Id: {itemParam.ItemId.Id}. Submitted - Type: {(SbmcHierarchyItem.ItemType)itemId.Type}, Id: {itemId.Id} ");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
}
// Ensure combination of item, name and context not duplicate.
if (model.Param.Context != null && model.Param.Name != null)
{
string controlName = "ParamName";
SbmcItemParam.Params prmParam = new SbmcItemParam.Params();
if (itemParam != null)
prmParam.IdsExcluded.Add(itemParam.Id);
prmParam.ItemIdsIncluded.Add(itemId);
prmParam.Context = model.Param.Context;
prmParam.Name = model.Param.Name;
if (ControlItemMgr.GetItemParamCount(prmParam) > 0)
return Json(responseData.SetControlError(controlName, Localiser["msg.validation.duplicate.value"]));
}
// Create new item if required.
if (itemParam == null)
{
if (!ItemId.IsValid(itemId))
{
SaLogger.Warn($"{SysUtil.Fn} Item Id not specified for new Item Param.");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
}
if (!SbmcItemParam.ValidItemTypes.Contains((SbmcHierarchyItem.ItemType)itemId.Type))
{
SaLogger.Warn($"{SysUtil.Fn} Invalid item type ({(SbmcHierarchyItem.ItemType)itemId.Type}) specified for new Item Param.");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
}
if (StringUtil.IsBlank(ControlItemMgr.GetItemCaption(itemId)))
{
SaLogger.Warn($"{SysUtil.Fn} Invalid item (type: {(SbmcHierarchyItem.ItemType)itemId.Type}, id: {itemId.Id}) specified for new Item Param.");
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
}
// Create parameter.
itemParam = ControlItemMgr.CreateItemParam(itemId);
}
// Populate item properties.
if (model.Param.Context != null)
itemParam.Context = model.Param.Context;
if (model.Param.Name != null)
itemParam.Name = model.Param.Name;
if (model.Param.Value != null && StringUtil.ToBool(model.Param.ValueChanged))
itemParam.Value = model.Param.Value;
if (model.Param.Notes != null)
itemParam.Notes = model.Param.Notes;
if (model.Param.StatusCode != null)
itemParam.Status = model.Param.GetStatus();
// Store item.
if (!SysId.IsValid(itemParam.Id))
{
if (!ControlItemMgr.InsertItemParam(itemParam, DbUpdateInfo))
{
SaLogger.Warn($"{SysUtil.Fn} Failed to insert Item Param: " + ControlItemMgr.ErrorStateMessage);
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"] + "\n\n" + ControlItemMgr.ErrorStateMessage));
}
}
else
{
if (!ControlItemMgr.UpdateItemParam(itemParam, DbUpdateInfo))
{
SaLogger.Warn($"{SysUtil.Fn} Failed to update Item Param [Id:" + SysId.ToString(itemParam.Id) + "]: " + ControlItemMgr.ErrorStateMessage);
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"] + "\n\n" + ControlItemMgr.ErrorStateMessage));
}
}
// Construct response.
PopulateParamResponseItemData(model, responseData.Param, itemParam);
responseData.Success = true;
}
return Json(responseData);
}
//-------------------------------------------------------------------
}
//=======================================================================
}