using DocumentFormat.OpenXml.InkML; using DocumentFormat.OpenXml.Wordprocessing; 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; using static Sarand.BusinessMgr.Net.Standard.Base.App.SbmSysParamCache; 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 Items { get; } = new List(); } //------------------------------------------------------------------- [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 columns = new List() { 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 columns = new List() { 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 Params { get; } = new List(); // Reference data. public List Statuses { get; } = new List(); public List StatusesCreate { get; } = new List(); 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.Status); ColumnDfn colStatus = ControlItemMgr.GetItemParamColumnDfn(SbmcItemParam.Column.Status); List columns = new List() { 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 disposables = new DisposableCollection()) { // 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 disposables = new DisposableCollection()) { // 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"])); } // 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); } //------------------------------------------------------------------- } //======================================================================= }