438 lines
18 KiB
C#
438 lines
18 KiB
C#
using Microsoft.AspNetCore.Mvc;
|
|
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
|
|
using Sarand.BusinessMgr.Web.Control.Components;
|
|
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<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
|
|
public List<ItemCodeDesc> StatusesCreate { get; } = new List<ItemCodeDesc>();
|
|
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(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
|
|
if (status != SaStatus.Deleted)
|
|
responseData.StatusesCreate.Add(new AjaxResponse_Data.ItemCodeDesc(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<ISacsDisposable> disposables = new DisposableCollection<ISacsDisposable>())
|
|
{
|
|
|
|
// Identify item.
|
|
SysId itemParamId = SysId.ToSysId(model.Param.Id);
|
|
if (!SysId.IsValid(itemParamId))
|
|
return Json(responseData.SetPopupMessage(messageTitle, Localiser["msg.error.item.id.not.specified"]));
|
|
|
|
// Retrieve item.
|
|
SbmcItemParam itemParam = ControlItemMgr.GetItemParamById(itemParamId);
|
|
if (itemParam == null)
|
|
{
|
|
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve itemParam for Id: '" + itemParamId + "'");
|
|
return Json(responseData.SetPopupMessage(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.SetPopupMessage(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.SetPopupMessage(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<ISacsDisposable> disposables = new DisposableCollection<ISacsDisposable>())
|
|
{
|
|
|
|
// Retrieve existing item.
|
|
SbmcItemParam itemParam = ControlItemMgr.GetItemParamById(itemParamId);
|
|
if (itemParam == null && SysId.IsValid(itemParamId))
|
|
{
|
|
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve Item Param for Id: '" + model.Param.Id + "'");
|
|
return Json(responseData.SetPopupMessage(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.SetPopupMessage(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.SetPopupMessage(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.SetPopupMessage(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.SetPopupMessage(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.SetPopupMessage(messageTitle, Localiser["msg.error.item.insert.failed"] + "\n\n" + ControlItemMgr.ErrorStateMessage));
|
|
}
|
|
responseData.SetNotifyMessage(messageTitle, Localiser["msg.item.created"]);
|
|
}
|
|
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.SetPopupMessage(messageTitle, Localiser["msg.error.item.update.failed"] + "\n\n" + ControlItemMgr.ErrorStateMessage));
|
|
}
|
|
responseData.SetNotifyMessage(messageTitle, Localiser["msg.item.updated"]);
|
|
}
|
|
|
|
// Construct response.
|
|
PopulateParamResponseItemData(model, responseData.Param, itemParam);
|
|
responseData.Success = true;
|
|
}
|
|
return Json(responseData);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|