Asset Categories

This commit is contained in:
Andy Howard
2025-01-27 10:01:32 +00:00
parent 03b3a81dab
commit a3ac029d55
130 changed files with 1809 additions and 1423 deletions
@@ -1,24 +1,17 @@
using Newtonsoft.Json;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Web.Portal.Controllers;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Core;
using Sarand.BusinessMgr.Net.Standard.Base.Mgr;
using Sarand.BusinessMgr.Web.Portal.Controllers;
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.Helpers;
using Sarand.Net.Standard.Base.Security;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm.Config;
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm.Config.Database;
using Sarand.BusinessMgr.Net.Standard.Base.Core;
using Sarand.BusinessMgr.Net.Standard.Base.Mgr;
using Sarand.Net.Standard.Base.App;
namespace Sarand.BusinessMgr.Web.Portal.App
{
@@ -14,7 +14,6 @@ using Sarand.Net.Standard.Base.ItemOptions;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Base.Security;
using Sarand.Net.Standard.Base.UpdateLog;
using static Sarand.BusinessMgr.Net.Core.Web.App.SbmAppConfig;
namespace Sarand.BusinessMgr.Web.Portal.App
{
@@ -26,7 +26,6 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
public String TypeDesc { get; set; }
public String Code { get; set; }
public String Caption { get; set; }
public long? AssetCount { get; set; }
// Fields.
public class FieldData
{
@@ -47,7 +46,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
data.Caption = assetCategory.DescBrief;
// Asset count.
long assetCount = Internals.AssetMgr.GetAssetCountForAssetCategory(assetCategory.Id);
if (assetCount > 0) data.AssetCount = assetCount;
if (assetCount > 0) data.Field.Value.Add($"{Model_AssetCategory.ItemField.AssetCount}", $"{assetCount}");
}
private void PopulateAssetCategoryResponseItemData(SbmModel_Portal model, AssetCategoryItemData data, SbmAssetCategory assetCategory)
{
@@ -216,7 +215,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
assetCategoryData.Field.Value.Add($"{Model_AssetCategory.ItemField.Status}", SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName)));
long assetCount = values.GetLong(colAssetCount.DataName);
if (assetCount > 0)
assetCategoryData.AssetCount = assetCount;
assetCategoryData.Field.Value.Add($"{Model_AssetCategory.ItemField.AssetCount}", $"{assetCount}");
// Cleanse item values.
assetCategoryData.Field.Value.RemoveAll(item => StringUtil.IsBlank(item.Value));
responseData.AssetCategories.Add(assetCategoryData);
@@ -100,7 +100,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
// Item filter.
SbmAsset.Params prmAsset = new SbmAsset.Params();
prmAsset.Search = model.Filter.Search;
prmAsset.StatusCat = model.Filter.GetStatusCat();
prmAsset.StatusCat = model.GetFilterStatusCat();
model.Paging.ItemTotal = (ulong)AssetMgr.GetAssetCount(prmAsset);
model.PopulatePagingTo(prmAsset.ResultsPaging);
@@ -12,7 +12,6 @@ using Sarand.Net.Standard.Base.Security;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm;
namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
{
@@ -473,8 +472,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
// Oct24 Not yet implemented - may be in separate page/controller.
private class AssociatedProductsData
{
public Sbm.AssociatedItemMode ItemMode = AssociatedItemMode.Unknown;
public Sbm.ItemLinkType ItemLinkType = ItemLinkType.Unknown;
public Sbm.AssociatedItemMode ItemMode = Sbm.AssociatedItemMode.Unknown;
public Sbm.ItemLinkType ItemLinkType = Sbm.ItemLinkType.Unknown;
public ItemId ItemIdParent;
public ItemId ItemIdChild;
public List<SbmItemLink> ItemLinks { get; set; }
@@ -1,43 +1,36 @@
using Microsoft.AspNetCore.Mvc.Filters;
using Newtonsoft.Json;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Controllers;
using Sarand.BusinessMgr.Web.Portal.App;
using Sarand.BusinessMgr.Net.Core.Web.Components;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Consoles;
using Sarand.BusinessMgr.Net.Standard.Base.Core;
using Sarand.BusinessMgr.Net.Standard.Base.Mgr;
using Sarand.BusinessMgr.Web.Portal.App;
using Sarand.BusinessMgr.Web.Portal.Helpers;
using Sarand.BusinessMgr.Web.Portal.Models;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Security;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using System.Web;
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm.Config.Database;
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
using Sarand.BusinessMgr.Net.Core.Web.Helpers;
using Sarand.BusinessMgr.Web.Portal.Helpers;
using DocumentFormat.OpenXml.EMMA;
using DocumentFormat.OpenXml.Wordprocessing;
using Sarand.BusinessMgr.Net.Core.Web.Models;
using Sarand.BusinessMgr.Web.Portal.Models;
using Sarand.BusinessMgr.Net.Standard.Base.Consoles;
using Sarand.Net.Standard.Base.CodeTypes;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Diary;
using Sarand.Net.Standard.Base.Email;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Interfaces;
using Sarand.Net.Standard.Base.ItemData;
using Sarand.Net.Standard.Base.ItemDocs;
using Sarand.Net.Standard.Base.ItemOptions;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Base.Security;
using Sarand.Net.Standard.Base.UpdateLog;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Linq;
using System.Web;
namespace Sarand.BusinessMgr.Web.Portal.Controllers
{
@@ -68,42 +61,42 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers
//-------------------------------------------------------------------
// Properties.
public SbmInternals Internals { get { if (internals == null && UserContext_Core != null) { internals = new SbmInternals(UserContext_Core); } return internals; } }
protected SbmInternals Internals { get { if (internals == null && UserContext_Core != null) { internals = new SbmInternals(UserContext_Core); } return internals; } }
// Managers.
public SbmAccountMgr AccountMgr { get { return Internals.AccountMgr; } }
public SbmAssetMgr AssetMgr { get { return Internals.AssetMgr; } }
public SbmCommodityMgr CommodityMgr { get { return Internals.CommodityMgr; } }
public SbmPriceMgr PriceMgr { get { return Internals.PriceMgr; } }
public SbmTransactionMgr TransactionMgr { get { return Internals.TransactionMgr; } }
public SbmStockMgr StockMgr { get { return Internals.StockMgr; } }
public SbmProcessMgr ProcessMgr { get { return Internals.ProcessMgr; } }
public SbmDataItemMgr DataItemMgr { get { return Internals.DataItemMgr; } }
protected SbmAccountMgr AccountMgr { get { return Internals.AccountMgr; } }
protected SbmAssetMgr AssetMgr { get { return Internals.AssetMgr; } }
protected SbmCommodityMgr CommodityMgr { get { return Internals.CommodityMgr; } }
protected SbmPriceMgr PriceMgr { get { return Internals.PriceMgr; } }
protected SbmTransactionMgr TransactionMgr { get { return Internals.TransactionMgr; } }
protected SbmStockMgr StockMgr { get { return Internals.StockMgr; } }
protected SbmProcessMgr ProcessMgr { get { return Internals.ProcessMgr; } }
protected SbmDataItemMgr DataItemMgr { get { return Internals.DataItemMgr; } }
// Consoles.
public SbmSessionConsole SessionConsole { get { return Internals.SessionConsole; } }
public SaDiaryConsole DiaryConsole { get { return Internals.DiaryConsole; } }
public SaSecurityConsole SecurityConsole { get { return Internals.SecurityConsole; } }
public SaCodeTypeConsole CodeTypeConsole { get { return Internals.CodeTypeConsole; } }
public SaReferenceDataConsole ReferenceDataConsole { get { return Internals.ReferenceDataConsole; } }
public SaUpdateLogConsole UpdateLogConsole { get { return Internals.UpdateLogConsole; } }
public SaInterfaceConsole InterfaceConsole { get { return Internals.InterfaceConsole; } }
public SaItemDocConsole ItemDocConsole { get { return Internals.ItemDocConsole; } }
public SaItemOptionConsole ItemOptionConsole { get { return Internals.ItemOptionConsole; } }
public SaItemDataConsole ItemDataConsole { get { return Internals.ItemDataConsole; } }
protected SbmSessionConsole SessionConsole { get { return Internals.SessionConsole; } }
protected SaDiaryConsole DiaryConsole { get { return Internals.DiaryConsole; } }
protected SaSecurityConsole SecurityConsole { get { return Internals.SecurityConsole; } }
protected SaCodeTypeConsole CodeTypeConsole { get { return Internals.CodeTypeConsole; } }
protected SaReferenceDataConsole ReferenceDataConsole { get { return Internals.ReferenceDataConsole; } }
protected SaUpdateLogConsole UpdateLogConsole { get { return Internals.UpdateLogConsole; } }
protected SaInterfaceConsole InterfaceConsole { get { return Internals.InterfaceConsole; } }
protected SaItemDocConsole ItemDocConsole { get { return Internals.ItemDocConsole; } }
protected SaItemOptionConsole ItemOptionConsole { get { return Internals.ItemOptionConsole; } }
protected SaItemDataConsole ItemDataConsole { get { return Internals.ItemDataConsole; } }
// Configurations.
public SbmStockControlConfig StockControlConfig { get { return Internals.StockControlConfig; } }
public SbmRequirementCostingConfig RequirementCostingConfig { get { return Internals.RequirementCostingConfig; } }
protected SbmStockControlConfig StockControlConfig { get { return Internals.StockControlConfig; } }
protected SbmRequirementCostingConfig RequirementCostingConfig { get { return Internals.RequirementCostingConfig; } }
// System codes.
public List<TypeCodeDesc> GetCodesOfType(Sbm.SystemCode systemCode) { return Internals.GetSystemCodes(systemCode); }
protected List<TypeCodeDesc> GetCodesOfType(Sbm.SystemCode systemCode) { return Internals.GetSystemCodes(systemCode); }
// Email.
public SaEmailConfig EmailConfig { get { return Internals.EmailConfig; } }
public SbmEmailConsole EmailConsole { get { return Internals.EmailConsole; } }
protected SaEmailConfig EmailConfig { get { return Internals.EmailConfig; } }
protected SbmEmailConsole EmailConsole { get { return Internals.EmailConsole; } }
//-------------------------------------------------------------------
// Session data.
/// <summary>Portal session data</summary>
protected SbmSessionData_Portal SessionData_Portal { get { return SessionData as SbmSessionData_Portal; } }
public override ISbmUserOrganisationContext UserContext_Core { get { return SessionData_Portal; } }
protected ISbmUserOrganisationContext UserContext_Core { get { return SessionData_Portal; } }
/// <summary>
/// Session data deserialisation.
/// </summary>
@@ -209,6 +202,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers
// Create session.
if (!OpenUserSession(sessionDataForUser))
{
Debugger.Break();
SaLogger.Warn($"{SysUtil.Fn} Failed to open user session. Repository context: {sessionDataForUser.RepositoryContext}. Email: {securityItemUser.EmailAddress}.");
errorMessage = Localiser["security.msg.signin.invalid"];
return false;
@@ -1,34 +1,24 @@
using Microsoft.AspNetCore.Mvc;
using NPOI.SS.Formula.Functions;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Helpers;
using Sarand.BusinessMgr.Web.Portal.App;
using Sarand.BusinessMgr.Web.Portal.Models;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Consoles;
using Sarand.BusinessMgr.Net.Standard.Base.Core;
using Sarand.BusinessMgr.Net.Standard.Base.Helpers;
using Sarand.BusinessMgr.Net.Standard.Base.Mgr;
using Sarand.BusinessMgr.Net.Standard.Dbas.App;
using Sarand.BusinessMgr.Web.Portal.App;
using Sarand.BusinessMgr.Web.Portal.Helpers;
using Sarand.BusinessMgr.Web.Portal.Models;
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.Email;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Security;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using DocumentFormat.OpenXml.EMMA;
using static Sarand.Net.Standard.Base.Bus.SaErrorStateItem;
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
using Sarand.BusinessMgr.Web.Portal.Helpers;
namespace Sarand.BusinessMgr.Web.Portal.Controllers.Security
{
@@ -80,7 +70,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Security
if (!(SessionData_Portal?.ValidUser ?? false))
{
SaLogger.Warn($"{SysUtil.Fn} Failed to identify Suitable database. Context: {model.RepositoryContext}. Email: {model.EmailAddress}.");
return Json(responseData.SetControlError(nameof(model.EmailAddress), model.Localiser["security.msg.signin.invalid"]));
return Json(responseData.SetControlError(nameof(model.EmailAddress), Localiser["security.msg.signin.invalid"]));
}
// Construct response.
@@ -12,7 +12,6 @@ using Sarand.Net.Standard.Base.Security;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm;
namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
{
@@ -9,7 +9,6 @@ using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm.Config.Database;
namespace Sarand.BusinessMgr.Web.Portal.Helpers
{
@@ -0,0 +1,311 @@
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Bus;
using System;
using System.Collections.Generic;
namespace Sarand.BusinessMgr.Web.Portal.Models.Assets
{
//=======================================================================
// Asset model - Configuration.
//=======================================================================
partial class Model_Asset
{
//-------------------------------------------------------------------
/// <summary>Prefix for field names.</summary>
public const String FieldNamePrefix = "AssetCat";
/// <summary>Item fields.</summary>
public enum ItemField
{
// Asset properties.
Id,
// Identity.
Category,
SerialNumber,
ReferenceExt,
DescBrief,
// Purchase.
Supplier,
PurchaseDate,
PurchaseAmount,
PurchaseTaxCode,
PurchaseAmountGross,
PurchaseInvoiceRef,
PaymentTerms,
PurchaseAmountSettlementGross,
PurchaseAmountEnhancementGross,
// Sale.
Customer,
SaleOn,
SaleCategory,
SaleAmount,
SaleTaxCode,
SaleAmountGross,
SaleTaxCodeProfit,
// Associated properties.
VehicleCount,
// Common.
Notes,
Status,
CreatedOn,
UpdatedOn,
Actions,
}
/// <summary>
/// Identifier used by form fields to show control specific messages generated by model validation etc.
/// <para>- Both page and model should use this method to consistently generate the field name.</para>
/// </summary>
public static String GetFieldName(ItemField field)
{
return $"{FieldNamePrefix}{field}";
}
// List configuration.
public class ListConfigData
{
// Actions.
public class ActionData
{
public class AllowData
{
public bool? Create { get; set; }
public bool? Update { get; set; }
}
public AllowData Allow { get; } = new AllowData();
}
public ActionData Action { get; } = new ActionData();
// List columns.
public class ColumnData
{
// Column name prefix.
public String Prefix { get; } = Model_Asset.FieldNamePrefix;
// Hide column.
public HashSet<string> Hide { get; } = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
// Column labels.
public Dictionary<String, String> Label { get; } = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
}
public ColumnData Column { get; } = new ColumnData();
}
public ListConfigData ListConfig { get; private set; }
//-------------------------------------------------------------------
/// <summary>
/// Populate Asset list configuration data - only required on initial page construction.
/// </summary>
public void PopulateListConfig()
{
ListConfig = new ListConfigData();
PopulateListConfig(ListConfig);
}
public void PopulateListConfig(ListConfigData config)
{
ViewMode pageMode = GetFilterMode();
bool modeIsSearch = pageMode == ViewMode.Search;
bool modeIsMaintain = pageMode == ViewMode.Maintain;
bool assetPurchaseAllowed = SessionConsole.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.Asset_Purchase);
bool assetSaleAllowed = SessionConsole.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.Asset_Sale);
bool assetRentalAllowed = SessionConsole.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.Asset_Rental);
bool assetDisposalAllowed = SessionConsole.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.Asset_Disposal);
bool userCanCreateAssets = SessionData_Portal.SecurityProfile.UserCanCreateItemType(Sbm.ItemType.Asset);
bool userCanUpdateAssets = SessionData_Portal.SecurityProfile.UserCanUpdateItemType(Sbm.ItemType.Asset);
// Actions.
if (userCanCreateAssets)
config.Action.Allow.Create = true;
if (userCanUpdateAssets)
config.Action.Allow.Update = true;
// List columns.
if (SysId.IsValid(GetFilterAssetCategoryId()))
config.Column.Hide.Add($"{ItemField.Category}");
// Asset Category Assets.
if (!modeIsMaintain || !SessionConsole.AllowOption(Sbm.ConfigOption.Vehicles))
config.Column.Hide.Add($"{ItemField.VehicleCount}");
// Actions.
if (!modeIsMaintain)
config.Column.Hide.Add($"{ItemField.Actions}");
}
//-------------------------------------------------------------------
// Item configuration.
//-------------------------------------------------------------------
// Legacy Asset dialog tabs and panels.
// Dialog:
// - Category, SerialNumber, DescBrief, Status.
// Tab 1 'Properties':
// Item - Item info Html panel.
// Purchase - price, tax code, on, net price, invoice ref, settlement, payment terms, enhancement, supplier.
// Sale - price, tax code, category, net price, sold price, sold on.
// Rental - cost, cost unit, price, price unit.
// Disposal - method, dispose on.
// Notes.
// Tab 2 'Processes'.
//-------------------------------------------------------------------
public class ItemConfigData
{
// Update dialog title.
public String Title { get; set; }
// Pre-select Asset type.
public class TypeData
{
public TypeData(string code, String desc)
{
Code = code;
Desc = desc;
}
public String Code { get; set; }
public String Desc { get; set; }
}
public TypeData Type { get; set; }
// Field name prefix.
public String Prefix { get; } = Model_Asset.FieldNamePrefix;
// Control flags.
public bool? ManagedByAccounts { get; set; }
public bool? LocalPricing { get; set; }
// Allowed actions.
public class AllowData
{
public bool? UpdateCode { get; set; }
}
public AllowData Allow { get; } = new AllowData();
// Item fields.
public class FieldData
{
// Field name prefix.
public String Prefix { get; } = Model_Asset.FieldNamePrefix;
// Hide field.
public HashSet<string> Hide { get; } = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
// Read-only field.
public HashSet<string> Readonly { get; } = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
// Field labels.
public Dictionary<String, String> Label { get; } = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
}
public FieldData Field { get; } = new FieldData();
}
/// <summary>
/// Populate item configuration for existing vehicle.
/// </summary>
public void PopulateItemConfig(ItemConfigData config, SbmAsset asset, SbmAssetCategory assetCategory)
{
PopulateItemConfig(config, asset.GetItemId(), assetCategory?.AssetType ?? Sbm.AssetType.Unknown);
}
/// <summary>
/// Populate item configuration for new or existing vehicle.
/// </summary>
public void PopulateItemConfig(ItemConfigData config, ItemId assetId, Sbm.AssetType assetType)
{
// Session configuration.
bool assetPurchaseAllowed = SessionConsole.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.Asset_Purchase);
bool assetSaleAllowed = SessionConsole.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.Asset_Sale);
bool assetRentalAllowed = SessionConsole.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.Asset_Rental);
bool assetDisposalAllowed = SessionConsole.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.Asset_Disposal);
bool userCanCreateAssets = SessionData_Portal.SecurityProfile.UserCanCreateItemType(Sbm.ItemType.Asset);
bool userCanUpdateAssets = SessionData_Portal.SecurityProfile.UserCanUpdateItemType(Sbm.ItemType.Asset);
// Update dialog title.
config.Title = Localiser["caption.vehicle.update"];
//---------------------------------------------------------------
// Identity.
// Asset category.
// ToDo - Asset type readonly if any associated items.
if (!userCanUpdateAssets || ItemId.IsValid(assetId))
config.Field.Readonly.Add($"{ItemField.Category}");
// Serial Number.
if (!userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.SerialNumber}");
// Description.
if (!userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.DescBrief}");
//---------------------------------------------------------------
// Purchase.
// Purchase net price.
if (!assetPurchaseAllowed||!userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.PurchaseAmount}");
// Purchase tax code.
if (!assetPurchaseAllowed || !userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.PurchaseTaxCode}");
// Purchase gross price.
if (!assetPurchaseAllowed || !userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.PurchaseAmountGross}");
// Purchase date.
if (!assetPurchaseAllowed || !userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.PurchaseDate}");
// Invoice reference.
if (!assetPurchaseAllowed || !userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.PurchaseInvoiceRef}");
// Payment terms.
if (!assetPurchaseAllowed || !userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.PaymentTerms}");
// Purchase Settlement gross price.
if (!assetPurchaseAllowed || !userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.PurchaseAmountSettlementGross}");
// Purchase Enhancenment gross price.
if (!assetPurchaseAllowed || !userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.PurchaseAmountEnhancementGross}");
// Supplier.
if (!assetPurchaseAllowed || !userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.Supplier}");
//---------------------------------------------------------------
// Sale.
// Sale net price.
if (!assetSaleAllowed || !userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.SaleAmount}");
// Tax code.
if (!assetSaleAllowed || !userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.SaleTaxCode}");
// Sale gross price.
if (!assetSaleAllowed || !userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.SaleAmountGross}");
// Tax code - profit.
if (!userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.SaleTaxCodeProfit}");
// Customer.
if (!assetPurchaseAllowed || !userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.Customer}");
//---------------------------------------------------------------
// Common properties.
// Status.
if (!userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.Status}");
// Notes.
if (!userCanUpdateAssets)
config.Field.Readonly.Add($"{ItemField.Notes}");
//---------------------------------------------------------------
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -1,6 +1,6 @@
using DocumentFormat.OpenXml.Spreadsheet;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Controllers;
using Sarand.BusinessMgr.Net.Core.Web.Components;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
@@ -17,6 +17,13 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets
//=======================================================================
public partial class Model_Asset : SbmModel_Portal
{
//-------------------------------------------------------------------
// Definitions.
public enum ViewMode
{
Search, Maintain, AssetsForItem
}
//-------------------------------------------------------------------
// Construction.
public Model_Asset(SbmLocaliser localiser) :
@@ -28,14 +35,24 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets
// Filter properties.
public class FilterData
{
public String Mode { get; set; }
public String AssetCategoryId { get; set; }
public String Search { get; set; }
public String StatusCat { get; set; }
public SbmAsset.StatusCat GetStatusCat()
{
return EnumUtil.ParseEnum(StatusCat, SbmAsset.StatusCat.NotDeleted);
}
}
public FilterData Filter { get; } = new FilterData();
public ViewMode GetFilterMode()
{
return EnumUtil.ParseEnum(Filter.Mode, ViewMode.Search);
}
public SysId GetFilterAssetCategoryId()
{
return SysId.ToSysId(Filter.AssetCategoryId);
}
public SbmAsset.StatusCat GetFilterStatusCat()
{
return EnumUtil.ParseEnum(Filter.StatusCat, SbmAsset.StatusCat.NotDeleted);
}
//-------------------------------------------------------------------
// Item properties.
@@ -44,7 +61,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets
public String Exists { get; set; }
public String Id { get; set; }
public String CategoryId { get; set; }
public String SerialNumber{ get; set; }
public String SerialNumber { get; set; }
public String DescBrief { get; set; }
public String Notes { get; set; }
public String StatusCode { get; set; }
@@ -94,7 +111,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets
}
// Notes.
if (Asset.Notes!= null)
if (Asset.Notes != null)
{
String controlName = "AssetNotes";
responseData.SetControlValue(controlName, Asset.Notes);
@@ -3,7 +3,6 @@ using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Bus;
using System;
using System.Collections.Generic;
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm;
namespace Sarand.BusinessMgr.Web.Portal.Models.Assets
{
@@ -107,7 +106,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets
// List columns.
if (GetFilterAssetType() <= 0)
if (GetFilterAssetType() > 0)
config.Column.Hide.Add($"{ItemField.Type}");
// Asset Category Assets.
@@ -1,7 +1,7 @@
using DocumentFormat.OpenXml.Spreadsheet;
using Microsoft.AspNetCore.Http;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Controllers;
using Sarand.BusinessMgr.Net.Core.Web.Components;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
@@ -1,6 +1,6 @@
using DocumentFormat.OpenXml.Spreadsheet;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Controllers;
using Sarand.BusinessMgr.Net.Core.Web.Components;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
@@ -1,6 +1,6 @@
using DocumentFormat.OpenXml.Spreadsheet;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Controllers;
using Sarand.BusinessMgr.Net.Core.Web.Components;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
@@ -1,20 +1,12 @@
using Microsoft.AspNetCore.Http;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Controllers;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm;
using static Sarand.BusinessMgr.Web.Portal.Models.Contacts.Model_Contact;
namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
{
@@ -1,19 +1,10 @@
using Microsoft.AspNetCore.Mvc.Rendering;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Controllers;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
{
@@ -1,19 +1,12 @@
using DocumentFormat.OpenXml.EMMA;
using Microsoft.AspNetCore.Mvc.Rendering;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Controllers;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
{
@@ -1,13 +1,4 @@
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Controllers;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Sarand.BusinessMgr.Web.Portal.Models
{
@@ -1,5 +1,5 @@
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Controllers;
using Sarand.BusinessMgr.Net.Core.Web.Components;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Helpers;
@@ -1,23 +1,35 @@
using Microsoft.AspNetCore.Mvc.Rendering;
using NPOI.SS.Formula.Functions;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Models;
using Sarand.BusinessMgr.Net.Core.Web.Components;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Core;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Consoles;
using Sarand.BusinessMgr.Net.Standard.Base.Mgr;
using Sarand.BusinessMgr.Web.Portal.App;
using Sarand.Net.Standard.Base.CodeTypes;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Diary;
using Sarand.Net.Standard.Base.Interfaces;
using Sarand.Net.Standard.Base.ItemData;
using Sarand.Net.Standard.Base.ItemDocs;
using Sarand.Net.Standard.Base.ItemOptions;
using Sarand.Net.Standard.Base.ReferenceData;
using Sarand.Net.Standard.Base.Security;
using Sarand.Net.Standard.Base.UpdateLog;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm;
namespace Sarand.BusinessMgr.Web.Portal.Models
{
//=======================================================================
public class SbmModel_Portal : SbmModel_Base
{
//-------------------------------------------------------------------
// Data members.
private SbmInternals internals;
//-------------------------------------------------------------------
// Protected construction.
protected SbmModel_Portal(SbmLocaliser localiser) :
@@ -25,22 +37,60 @@ namespace Sarand.BusinessMgr.Web.Portal.Models
{
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (internals != null) internals.Dispose(); internals = null;
}
base.Dispose(disposing);
}
//-------------------------------------------------------------------
// Properties.
public SbmSessionData_Portal SessionData_Portal { get { return SessionData as SbmSessionData_Portal; } }
public override ISbmUserOrganisationContext UserContext_Core { get { return SessionData_Portal; } }
protected SbmSessionData_Portal SessionData_Portal { get { return SessionData_Web as SbmSessionData_Portal; } }
public String OrganisationName { get { return SessionData_Portal?.Organisation?.DisplayName ?? ""; } }
//-------------------------------------------------------------------
// Security profile.
public bool UserCanViewFinancials() { return SessionData_Portal.SecurityProfile.UserCanViewFinancials(); }
public bool UserCanViewCommodityFinancials_Supply() { return SessionData_Portal.SecurityProfile.UserCanViewFinancials(FinancialType.CommoditySupply); }
public bool UserCanViewCommodityFinancials_Sales() { return SessionData_Portal.SecurityProfile.UserCanViewFinancials(FinancialType.CommoditySales); }
public bool UserCanViewCommodityFinancials_Supply() { return SessionData_Portal.SecurityProfile.UserCanViewFinancials(Sbm.FinancialType.CommoditySupply); }
public bool UserCanViewCommodityFinancials_Sales() { return SessionData_Portal.SecurityProfile.UserCanViewFinancials(Sbm.FinancialType.CommoditySales); }
public bool UserCanUpdateFinancials() { return SessionData_Portal.SecurityProfile.UserCanUpdateFinancials(); }
public bool UserCanStockTake() { return SessionData_Portal.SecurityProfile.UserHasSecurityRight(SecurityRight.StockTake); }
public bool UserCanStockTake() { return SessionData_Portal.SecurityProfile.UserHasSecurityRight(Sbm.SecurityRight.StockTake); }
public bool UserCanCreateItem(Sbm.ItemType itemType) { return SessionData_Portal.SecurityProfile.UserCanCreateItemType(itemType); }
public bool UserCanUpdateItem(Sbm.ItemType itemType) { return SessionData_Portal.SecurityProfile.UserCanUpdateItemType(itemType); }
//-------------------------------------------------------------------
// Business components.
// NB Keep these accessors protected to avoid them being called by the model binding logic before the session data is ready.
protected SbmInternals Internals { get { if (internals == null) internals = new SbmInternals(SessionData_Portal); return internals; } }
// Managers.
protected SbmAccountMgr AccountMgr { get { return Internals.AccountMgr; } }
protected SbmAssetMgr AssetMgr { get { return Internals.AssetMgr; } }
protected SbmCommodityMgr CommodityMgr { get { return Internals.CommodityMgr; } }
protected SbmPriceMgr PriceMgr { get { return Internals.PriceMgr; } }
protected SbmTransactionMgr TransactionMgr { get { return Internals.TransactionMgr; } }
protected SbmStockMgr StockMgr { get { return Internals.StockMgr; } }
protected SbmProcessMgr ProcessMgr { get { return Internals.ProcessMgr; } }
protected SbmDataItemMgr DataItemMgr { get { return Internals.DataItemMgr; } }
// Consoles.
protected SbmSessionConsole SessionConsole { get { return Internals.SessionConsole; } }
protected SaDiaryConsole DiaryConsole { get { return Internals.DiaryConsole; } }
protected SaSecurityConsole SecurityConsole { get { return Internals.SecurityConsole; } }
protected SaCodeTypeConsole CodeTypeConsole { get { return Internals.CodeTypeConsole; } }
protected SaReferenceDataConsole ReferenceDataConsole { get { return Internals.ReferenceDataConsole; } }
protected SaUpdateLogConsole UpdateLogConsole { get { return Internals.UpdateLogConsole; } }
protected SaInterfaceConsole InterfaceConsole { get { return Internals.InterfaceConsole; } }
protected SaItemDocConsole ItemDocConsole { get { return Internals.ItemDocConsole; } }
protected SaItemOptionConsole ItemOptionConsole { get { return Internals.ItemOptionConsole; } }
protected SaItemDataConsole ItemDataConsole { get { return Internals.ItemDataConsole; } }
// Configurations.
protected SbmStockControlConfig StockControlConfig { get { return Internals.StockControlConfig; } }
protected SbmRequirementCostingConfig RequirementCostingConfig { get { return Internals.RequirementCostingConfig; } }
// System codes.
protected List<TypeCodeDesc> GetCodesOfType(Sbm.SystemCode systemCode) { return Internals.GetSystemCodes(systemCode); }
//-------------------------------------------------------------------
// Page menu options.
@@ -109,6 +159,28 @@ namespace Sarand.BusinessMgr.Web.Portal.Models
//-------------------------------------------------------------------
// View reference data.
//-------------------------------------------------------------------
// NB Use methods rather than accessors for properties that depend on session data
// to avoid the model binding logic invoking a getter before it's ready for use.
/// <summary>List of Code Types for dropdown.</summary>
public IEnumerable<SelectListItem> GetCodeTypesForSelect()
{
List<CodeDesc> codeTypes = new List<CodeDesc>();
SaCodeType.Params prmCodeType = new SaCodeType.Params();
prmCodeType.SortColumns.Add(CodeTypeConsole.GetCodeTypeColumnDfn(SaCodeType.Column.Name));
foreach (SaCodeType codeType in CodeTypeConsole.GetCodeTypeList(prmCodeType))
codeTypes.Add(codeType.Code, codeType.Name);
return new SelectList(codeTypes, "Code", "Desc");
}
/// <summary>List of Code Type Codes for dropdown.</summary>
public IEnumerable<SelectListItem> GetCodeTypeCodesForSelect(Sbm.ApplCodeType codeType, bool activeOnly = true)
{
List<CodeDesc> codes = new List<CodeDesc>();
foreach (SaCode code in CodeTypeConsole.GetCodesForCodeType(SbmSystem.GetCodeTypeCode(codeType), activeOnly))
codes.Add(code.Code, code.Description);
return new SelectList(codes, "Code", "Desc");
}
//-------------------------------------------------------------------
// View reference data - Contacts.
@@ -153,7 +225,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models
commodityTypes.Add(Sbm.CommodityType.Any, "", Localiser["label.any"]);
foreach (TypeCodeDesc commodityType in GetCodesOfType(Sbm.SystemCode.CommodityType))
{
if (commodityType.Type == (int)Sbm.CommodityType.Asset && !SessionConsole.AllowOption(ConfigOption.Assets)) continue;
if (commodityType.Type == (int)Sbm.CommodityType.Asset && !SessionConsole.AllowOption(Sbm.ConfigOption.Assets)) continue;
commodityTypes.Add(commodityType);
}
return new SelectList(commodityTypes, "Code", "Desc");
@@ -167,7 +239,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models
List<TypeCodeDesc> commodityTypes = new List<TypeCodeDesc>();
foreach (TypeCodeDesc commodityType in GetCodesOfType(Sbm.SystemCode.CommodityType))
{
if (commodityType.Type == (int)Sbm.CommodityType.Asset && !SessionConsole.AllowOption(ConfigOption.Assets)) continue;
if (commodityType.Type == (int)Sbm.CommodityType.Asset && !SessionConsole.AllowOption(Sbm.ConfigOption.Assets)) continue;
commodityTypes.Add(commodityType);
}
return new SelectList(commodityTypes, "Code", "Desc");
@@ -1,20 +1,11 @@
using Microsoft.AspNetCore.Http;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Controllers;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using static Sarand.BusinessMgr.Net.Standard.Base.App.Sbm;
using static Sarand.BusinessMgr.Web.Portal.Models.Contacts.Model_Contact;
namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
{
@@ -1,6 +1,6 @@
using DocumentFormat.OpenXml.Spreadsheet;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Controllers;
using Sarand.BusinessMgr.Net.Core.Web.Components;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
@@ -1,15 +1,10 @@
using DocumentFormat.OpenXml.Spreadsheet;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Core.Web.Controllers;
using Sarand.BusinessMgr.Net.Core.Web.App;
using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Helpers;
using Sarand.Net.Standard.Base.Utils;
using System;
namespace Sarand.BusinessMgr.Web.Portal.Models.Vehicles
{
@@ -40,6 +40,10 @@
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
<Content Update="Views\Assets\Asset\Panel-AssetMaintain.cshtml">
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
<Content Update="Views\Association\Panel-AssociationList.cshtml">
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
@@ -51,7 +55,6 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Views\Assets\Asset\" />
<Folder Include="Views\Transaction\" />
</ItemGroup>
@@ -3,213 +3,6 @@
@inject SbmLocaliser Localiser
@{
ViewData["Title"] = "Assets";
Model.AdditionalFiles_JS.Add("js/sbm-asset.js");
}
<div class="sbm-panel Assets fullheight">
<script type="text/javascript">
sbm.dlg.title.createItem = '@(Localiser.GetJavascriptText("caption.asset.create"))';
sbm.dlg.title.updateItem = '@(Localiser.GetJavascriptText("caption.asset.update"))';
sbm.lbl.selectCategory = '@(Localiser.GetJavascriptText("caption.category.select"))';
</script>
<div class="sbm-panel-data sbm-flex">
@* Filter form - wrap header to include paging controls. *@
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmAssetFilter", @class = "sbm-form", @onSubmit = "return false;" }))
{
<div class="sbm-panel-header">
<div class="row">
<div class="fixed">
<partial name="~/Views/Common/ResultsPaging.cshtml" />
</div>
<div class="col center"><div class="sbm-panel-caption">@Localiser["label.assets"]</div></div>
<div class="fixed">
@* Burger menu *@
<ul class="nav navbar-nav navbar-dark navbar-right sbm-burger">
<li class="dropdown-toggle caret-off">
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="navbar-toggler-icon"></span></a>
<ul class="dropdown-menu dropdown-menu-right sbm-dropdown-menu">@* Menu items will be inserted here. *@</ul>
</li>
</ul>
</div>
</div>
</div>
@* Filter Panel *@
<div class="sbm-panel-filter">
<div class="row pb4">
<div class="col-sm-5 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
<div class="col-sm-7">
@Html.TextBoxFor(model => model.Filter.Search, new { @id = "", @class = "FilterSearch", @maxlength = "32" })
</div>
</div>
</div>
}
<div class="sbm-panel-item-table sbm-flex">
<table class="sbm-item-list">
<thead>
<tr>
<th class="pl-2">@Localiser["label.category"]</th>
<th class="">@Localiser["label.serial"]</th>
<th class="">@Localiser["label.description"]</th>
<th class="center">@Localiser["label.status"]</th>
<th class="right" style="width:2%;"></th>
</tr>
<tr><td colspan="6"><div class="sbm-panel-messages"></div></td></tr>
</thead>
<tbody></tbody>
</table>
</div>
@* Element templates *@
<div class="sbm-panel-item-template">
@* Filter Burger option template - ul is ignored *@
<ul class="sbm-dropdown-menu AssetFilter">
<li class="sbm-dropdown-item sbm-action"><div class="sbm-label">XXX</div></li>
</ul>
@* Asset row template - table is ignored. *@
<table class="">
<tr class="sbm-row-item Asset">
<td><div class="AssetCategory pl-1"></div></td>
<td><div class="AssetSerial"></div></td>
<td><div class="AssetDescription"></div></td>
<td><div class="AssetStatusDesc center"></div></td>
<td>
<div class="right">
@* Burger menu *@
<ul class="nav navbar-nav navbar-light navbar-right sbm-burger">
<li class="dropdown-toggle caret-off">
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="sbm-ellipsis-dot"></span><span class="sbm-ellipsis-dot"></span><span class="sbm-ellipsis-dot"></span></a>
<ul class="dropdown-menu dropdown-menu-right sbm-dropdown-menu">@* Menu items will be inserted here. *@</ul>
</li>
</ul>
</div>
</td>
</tr>
</table>
@* Item Burger option template - ul is ignored *@
<ul class="sbm-dropdown-menu Asset">
<li class="sbm-dropdown-item sbm-action"><div class="sbm-label">XXX</div></li>
</ul>
</div>
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmAssetId", @onSubmit = "return false;" }))
{
@Html.HiddenFor(model => model.Asset.Id, new { @id = "", @class = "AssetId" })
}
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmCategories", @onSubmit = "return false;" }))
{
}
<div id="dlgAsset" class="sbm-dialog">
<div class="spacer2"></div>
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmAsset", @class = "sbm-form", @onSubmit = "return false;" }))
{
@Html.HiddenFor(model => model.Asset.Exists, new { @id = "", @class = "AssetExists" })
@Html.HiddenFor(model => model.Asset.Id, new { @id = "", @class = "AssetId" })
@* Type *@
<div class="sbm-form-control AssetCategory">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for=""><span>@Localiser["label.category"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control row">
<div class="col">
@Html.HiddenFor(model => model.Asset.CategoryId, new { @id = "", @class = "AssetCategoryId" })
<input type="text" class="AssetCategory sbm-input" readonly="readonly" />
</div>
<div class="fixed">
<div class="sbm-action AssetCategorySearch"><img src="~/img/action/search24.png" alt="" title="" /></div>
</div>
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Serial Number*@
<div class="sbm-form-control AssetSerialNumber">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifAssetSerialNumber"><span>@Localiser["label.serial"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control">
@Html.TextBoxFor(model => model.Asset.SerialNumber, new { @id = "ifAssetSerialNumber", @class = "AssetSerialNumber sbm-input upper", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaAsset_SerialNumber) })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Description *@
<div class="sbm-form-control AssetDescription">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifAssetDescription"><span>@Localiser["label.description"]</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control">
@Html.TextBoxFor(model => model.Asset.DescBrief, new { @id = "ifAssetDescription", @class = "AssetDescription sbm-input", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaAsset_DescBrief) })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Status *@
<div class="sbm-form-control AssetStatus">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="cbAssetStatus"><span>@Localiser["label.status"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control">
<select id="cbAssetStatus" class="sbm-select AssetStatus" name="Asset.StatusCode"></select>
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Notes *@
<div class="sbm-form-control AssetNotes">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifAssetNotes"><span>@Localiser["label.notes"]</span></label>
</div>
</div>
<div class="col-sm">
<div class="sbm-control">
@Html.TextAreaFor(model => model.Asset.Notes, new { @id = "ifAssetNotes", @class = "AssetNotes sbm-textarea", @rows = 3, @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaAsset_Notes) })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
}
<div class="spacer2"></div>
</div>
@* Select Item dialog and script *@
<partial name="~/Views/Common/SelectItem.cshtml" />
</div>
</div>
<partial name="Panel-AssetMaintain.cshtml" />
@@ -0,0 +1,121 @@
@* Asset - Dialog Panel *@
@* View is decoupled from Asset model as it may be included in other views, eg. Vehicles. *@
@model SbmModel_Portal
@inject SbmLocaliser Localiser
@{
// Ensure view is only included once in page.
if (!Model.RegisterView("Views/Assets/Asset/Panel-AssetSelect")) return;
Model.AdditionalFiles_JS.Add("js/sbm-asset.js");
}
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmAssetId", @onSubmit = "return false;" }))
{
@Html.Hidden("Asset.Id", "", new { @id = "", @class = "AssetId" })
}
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmCategories", @onSubmit = "return false;" }))
{
}
<div id="dlgAsset" class="sbm-dialog">
<div class="spacer2"></div>
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmAsset", @class = "sbm-form", @onSubmit = "return false;" }))
{
@Html.Hidden("Asset.Exists", "", new { @id = "", @class = "AssetExists" })
@Html.Hidden("Asset.Id", "", new { @id = "", @class = "AssetId" })
@* Type *@
<div class="sbm-form-control AssetCategory">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for=""><span>@Localiser["label.category"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control row">
<div class="col">
@Html.Hidden("Asset.CategoryId", "", new { @id = "", @class = "AssetCategoryId" })
<input type="text" class="AssetCategory sbm-input" readonly="readonly" />
</div>
<div class="fixed">
<div class="sbm-action AssetCategorySearch"><img src="~/img/action/search24.png" alt="" title="" /></div>
</div>
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Serial Number*@
<div class="sbm-form-control AssetSerialNumber">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifAssetSerialNumber"><span>@Localiser["label.serial"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control">
@Html.TextBox("Asset.SerialNumber", "", new { @id = "ifAssetSerialNumber", @class = "AssetSerialNumber sbm-input upper", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaAsset_SerialNumber) })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Description *@
<div class="sbm-form-control AssetDescription">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifAssetDescription"><span>@Localiser["label.description"]</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control">
@Html.TextBox("Asset.DescBrief", "", new { @id = "ifAssetDescription", @class = "AssetDescription sbm-input", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaAsset_DescBrief) })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Status *@
<div class="sbm-form-control AssetStatus">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="cbAssetStatus"><span>@Localiser["label.status"]</span><span class="required">&nbsp;*</span></label>
</div>
</div>
<div class="col-sm-9">
<div class="sbm-control">
<select id="cbAssetStatus" class="sbm-select AssetStatus" name="Asset.StatusCode"></select>
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
@* Notes *@
<div class="sbm-form-control AssetNotes">
<div class="row">
<div class="col-sm-3">
<div class="sbm-label">
<label for="ifAssetNotes"><span>@Localiser["label.notes"]</span></label>
</div>
</div>
<div class="col-sm">
<div class="sbm-control">
@Html.TextArea("Asset.Notes", "", new { @id = "ifAssetNotes", @class = "AssetNotes sbm-textarea", @rows = 3, @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.SaAsset_Notes) })
</div>
<div class="sbm-message"></div>
</div>
</div>
</div>
}
<div class="spacer2"></div>
</div>
@* Select Item dialog and script *@
<partial name="~/Views/Common/SelectItem.cshtml" />
@@ -0,0 +1,55 @@
@* Asset - Maintain Panel *@
@* View is decoupled from Asset model as it may be included in other views, eg. Vehicles. *@
@model SbmModel_Portal
@inject SbmLocaliser Localiser
@{
/* NB Can potentially appear more than once on a page. */
}
<div class="sbm-panel-item-table sbm-flex">
<table class="sbm-item-list">
<thead>
<tr>
<th class="pl-2">@Localiser["label.category"]</th>
<th class="">@Localiser["label.serial"]</th>
<th class="">@Localiser["label.description"]</th>
<th class="center">@Localiser["label.status"]</th>
<th class="right" style="width:2%;"></th>
</tr>
<tr><td colspan="6"><div class="sbm-panel-messages"></div></td></tr>
</thead>
<tbody></tbody>
</table>
</div>
@* Element templates *@
<div class="sbm-panel-item-template">
@* Filter Burger option template - ul is ignored *@
<ul class="sbm-dropdown-menu AssetFilter">
<li class="sbm-dropdown-item sbm-action"><div class="sbm-label">XXX</div></li>
</ul>
@* Asset row template - table is ignored. *@
<table class="">
<tr class="sbm-row-item Asset">
<td><div class="AssetCategory pl-1"></div></td>
<td><div class="AssetSerial"></div></td>
<td><div class="AssetDescription"></div></td>
<td><div class="AssetStatusDesc center"></div></td>
<td>
<div class="right">
@* Burger menu *@
<ul class="nav navbar-nav navbar-light navbar-right sbm-burger">
<li class="dropdown-toggle caret-off">
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="sbm-ellipsis-dot"></span><span class="sbm-ellipsis-dot"></span><span class="sbm-ellipsis-dot"></span></a>
<ul class="dropdown-menu dropdown-menu-right sbm-dropdown-menu">@* Menu items will be inserted here. *@</ul>
</li>
</ul>
</div>
</td>
</tr>
</table>
@* Item Burger option template - ul is ignored *@
<ul class="sbm-dropdown-menu Asset">
<li class="sbm-dropdown-item sbm-action"><div class="sbm-label">XXX</div></li>
</ul>
</div>
@@ -0,0 +1,71 @@
@* Asset - Maintain Panel *@
@* View is decoupled from Asset model as it may be included in other views, eg. Vehicles. *@
@model SbmModel_Portal
@inject SbmLocaliser Localiser
@{
// Ensure view is only included once in page.
if (!Model.RegisterView("Views/Assets/Asset/Panel-AssetMaintain")) return;
Model.AdditionalFiles_JS.Add("js/sbm-asset.js");
}
<div class="sbm-panel Assets fullheight">
<script type="text/javascript">
sbm.dlg.title.createItem = '@(Localiser.GetJavascriptText("caption.asset.create"))';
sbm.dlg.title.updateItem = '@(Localiser.GetJavascriptText("caption.asset.update"))';
sbm.lbl.selectCategory = '@(Localiser.GetJavascriptText("caption.category.select"))';
</script>
<div class="sbm-panel-data sbm-flex">
@* Filter form - wrap header to include paging controls. *@
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmAssetFilter", @class = "sbm-form", @onSubmit = "return false;" }))
{
@Html.Hidden("Filter.Mode", Model_Asset.ViewMode.Maintain, new { @id = "" })
<div class="sbm-panel-header">
<div class="row">
<div class="fixed">
<partial name="~/Views/Common/ResultsPaging.cshtml" />
</div>
<div class="col center"><div class="sbm-panel-caption">@Localiser["label.assets"]</div></div>
<div class="fixed">
@* Burger menu *@
<ul class="nav navbar-nav navbar-dark navbar-right sbm-burger">
<li class="dropdown-toggle caret-off">
<a href="#" class="dropdown" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="navbar-toggler-icon"></span></a>
<ul class="dropdown-menu dropdown-menu-right sbm-dropdown-menu">@* Menu items will be inserted here. *@</ul>
</li>
</ul>
</div>
</div>
</div>
@* Filter Panel *@
<div class="sbm-panel-filter">
<div class="row">
<div class="col-sm-4 row pb4">
<div class="col-5 sbm-label text-right">@Localiser["label.category"]</div>
<div class="col-7">
@Html.Hidden("Filter.AssetCategoryId", "", new { @id = "", @class = "FilterAssetCategoryId", @maxlength = "32" })
<input type="text" id="" class="FilterAssetCategory" readonly="readonly" />
</div>
</div>
<div class="col-sm-4 row pb4">
<div class="col-5 sbm-label text-right">@Localiser["label.search"]</div>
<div class="col-7">
@Html.TextBox("Filter.Search", "", new { @id = "", @class = "FilterSearch", @maxlength = "32" })
</div>
</div>
</div>
</div>
}
<partial name="Panel-AssetList.cshtml" />
</div>
</div>
<partial name="Panel-AssetDialog.cshtml" />
<partial name="~/Views/Assets/AssetCategory/Panel-AssetCategorySelect.cshtml" />
@@ -0,0 +1,43 @@
@* Asset - Maintain Panel *@
@* View is decoupled from Asset model as it may be included in other views, eg. Vehicles. *@
@model SbmModel_Portal
@inject SbmLocaliser Localiser
@{
// Ensure view is only included once in page.
if (!Model.RegisterView("Views/Assets/Asset/Panel-AssetSelect")) return;
Model.AdditionalFiles_JS.Add("js/sbm-asset.js");
}
<script type="text/javascript">
</script>
<div id="dlgAssetSelect" class="sbm-dialog sbm-flex sbm-no-padding" title="@Localiser["caption.contact.select"]">
@using (@Html.BeginForm(FormMethod.Post, new { @id = "", @class = "frmAssetFilter sbm-form", @onSubmit = "return false;" }))
{
@Html.Hidden("Filter.Mode", Model_Asset.ViewMode.Search, new { @id = "" })
@* Filter Panel *@
<div class="sbm-panel-filter">
<div class="row">
<div class="col-sm-4 row pb4">
@* Asset type *@
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.type"]</div>
<div class="col-8 col-sm-8">
@Html.DropDownList("Filter.AssetType", Model.GetAssetTypeCodesForFilterDropdown(), Localiser["label.any"], new { @id = "", @class = "FilterAssetType sbm-select" })
</div>
</div>
<div class="col-sm-4 row pb4">
@* Asset filter - name etc. *@
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.search"]</div>
<div class="col-8 col-sm-8">
@Html.TextBox("Filter.Search", "", new { @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" })
</div>
</div>
</div>
</div>
}
<partial name="Panel-AssetList.cshtml" />
</div>
@@ -1,10 +1,11 @@
@* View is decoupled from Asset Category model as it may be included in other views, eg. Assets. *@
@* Asset Category - Dialog panel *@
@* View is decoupled from Asset Category model as it may be included in other views, eg. Assets. *@
@model SbmModel_Portal
@inject SbmLocaliser Localiser
@{
/* Asset Category - Dialog panel */
// Ensure view is only included once in page.
if (!Model.RegisterView("Views/Assets/AssetCategory/Panel-AssetCategoryDialog")) return;
Model.AdditionalFiles_JS.Add("js/sbm-asset-cat.js");
}
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmAssetCategoryId", @onSubmit = "return false;" }))
@@ -1,8 +1,8 @@
@* View is decoupled from Asset Category model as it may be included in other views, eg. Assets. *@
@* Asset Category - List panel *@
@* View is decoupled from Asset Category model as it may be included in other views, eg. Assets. *@
@model SbmModel_Portal
@inject SbmLocaliser Localiser
@{
/* Asset Category - List panel */
/* NB Can potentially appear more than once on a page. */
}
@@ -15,6 +15,7 @@
<th class="@Model_AssetCategory.GetFieldName(Model_AssetCategory.ItemField.Code) width10pc">@Localiser["label.code"]</th>
<th class="@Model_AssetCategory.GetFieldName(Model_AssetCategory.ItemField.Caption) width25pc">@Localiser["label.description"]</th>
<th class="@Model_AssetCategory.GetFieldName(Model_AssetCategory.ItemField.Notes) width25pc d-none d-md-table-cell">@Localiser["label.notes"]</th>
<th class="@Model_AssetCategory.GetFieldName(Model_AssetCategory.ItemField.AssetCount) width10pc center">@Localiser["label.assets"]</th>
<th class="@Model_AssetCategory.GetFieldName(Model_AssetCategory.ItemField.Status) width10pc center">@Localiser["label.status"]</th>
<th class="@Model_AssetCategory.GetFieldName(Model_AssetCategory.ItemField.Actions) width5pc"></th>
</tr>
@@ -39,6 +40,7 @@
<td class="@Model_AssetCategory.GetFieldName(Model_AssetCategory.ItemField.Code)"></td>
<td class="@Model_AssetCategory.GetFieldName(Model_AssetCategory.ItemField.Caption)"></td>
<td class="@Model_AssetCategory.GetFieldName(Model_AssetCategory.ItemField.Notes) d-none d-md-table-cell"></td>
<td class="@Model_AssetCategory.GetFieldName(Model_AssetCategory.ItemField.AssetCount) center"></td>
<td class="@Model_AssetCategory.GetFieldName(Model_AssetCategory.ItemField.Status) center"></td>
<td class="@Model_AssetCategory.GetFieldName(Model_AssetCategory.ItemField.Actions)">
<div class="right">
@@ -1,8 +1,8 @@
@* View is decoupled from Asset Category model as it may be included in other views, eg. Assets. *@
@* Asset Category - Maintain Panel *@
@* View is decoupled from Asset Category model as it may be included in other views, eg. Assets. *@
@model SbmModel_Portal
@inject SbmLocaliser Localiser
@{
/* Asset Category - Maintain panel */
// Ensure view is only included once in page.
if (!Model.RegisterView("Views/Assets/AssetCategory/Panel-AssetCategoryMaintain")) return;
Model.AdditionalFiles_JS.Add("js/sbm-asset-cat.js");
@@ -18,7 +18,7 @@
<div class="sbm-panel-data sbm-flex">
@* Filter form - wrap header to include paging controls. *@
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmAssetCategoryFilter", @class = "sbm-form", @onSubmit = "return false;" }))
@using (@Html.BeginForm(FormMethod.Post, new { @id = "", @class = "frmAssetCategoryFilter sbm-form", @onSubmit = "return false;" }))
{
@Html.Hidden("Filter.Mode", Model_AssetCategory.ViewMode.Maintain, new { @id = "" })
@@ -1,8 +1,8 @@
@* View is decoupled from Asset Category model as it may be included in other views, eg. Assets. *@
@* Asset Category - Select panel *@
@* View is decoupled from Asset Category model as it may be included in other views, eg. Assets. *@
@model SbmModel_Portal
@inject SbmLocaliser Localiser
@{
/* Asset Category - Select panel */
// Ensure view is only included once in page.
if (!Model.RegisterView("Views/Assets/AssetCategory/Panel-AssetCategorySelect")) return;
Model.AdditionalFiles_JS.Add("js/sbm-asset-cat.js");
@@ -24,7 +24,7 @@
@* AssetCategory type *@
<div class="col-4 col-sm-4 sbm-label text-left text-sm-right">@Localiser["label.type"]</div>
<div class="col-8 col-sm-8">
@Html.DropDownList("Filter.AssetCategoryType", Model.GetAssetTypeCodesForFilterDropdown(), Localiser["label.any"], new { @id = "", @class = "FilterAssetCategoryType sbm-select" })
@Html.DropDownList("Filter.AssetType", Model.GetAssetTypeCodesForFilterDropdown(), Localiser["label.any"], new { @id = "", @class = "FilterAssetType sbm-select" })
</div>
</div>
<div class="col-sm-4 row pb4">
@@ -71,6 +71,13 @@
padding: 2px 8px 0 0;
}
.sbm-panel-filter input[type="text"],
.sbm-panel-filter textarea,
.sbm-panel-filter select
{
max-width: 96%;
}
/* Data panel - Content */
.sbm-panel-data .sbm-content
@@ -54,9 +54,9 @@ body
/* Responsive */
body > .container, header > .container, footer > .container
#sbm-page-body > .container, header > .container, footer > .container
{
padding: 0 0.5%;
padding: 0 4px;
}
@media (min-width: 992px)
@@ -79,6 +79,10 @@
$('.' + prefix + 'Status', $item).text(item.statusDesc).removeStatusClasses().addClass('sbm-status-' + item.statusCode.toLowerCase());
if (!env.mode.search)
{
let $assetCount = $('.' + prefix + 'AssetCount', $item).off('click');
sbm.debug($assetCount.text());
if ($assetCount.text() > 0)
$assetCount.on('click', function () { sbm.navigateTo('Assets/Asset'); }).addClass('sbm-action-text');
// Actions.
let fnUpd = function () { ac.updateItem(env, item.id) };
var $bgr = $('.sbm-burger', $item).invisible();
@@ -221,7 +225,7 @@
//sbm.debug('selectAssetCategory', prm);
let env = ac.env.select;
env.prmSelect = prm;
env.$frm.filter.find('.FilterAssetCategoryType').val('');
env.$frm.filter.find('.FilterAssetType').val('');
env.$frm.filter.find('.FilterSearch').val(prm.search || '');
env.$pnl.table.find('tbody tr').remove();
sbm.openDialog(env.$dlg.select, 1000, 800);
@@ -238,7 +242,7 @@
{
//sbm.debug('selectItem', env, env.prmSelect.item);
env.$dlg.select.dialog('close');
env.prmSelect.fnSuccess(env.prmSelect.item);
if (env.prmSelect.fnSuccess) env.prmSelect.fnSuccess(env.prmSelect.item);
delete env.prmSelect;
}
@@ -254,7 +258,7 @@
ac.onItemEdited = function (env, item)
{
//sbm.debug('ac.onItemEdited', env, item);
env.prmEdit.fnSuccess(item);
if (env.prmEdit.fnSuccess) env.prmEdit.fnSuccess(item);
delete env.prmEdit;
}
@@ -271,7 +275,7 @@
env.$pnl.msgs = env.$pnl.table.find('.sbm-panel-messages');
env.$pnl.tmpls = env.$pnl.items.find('.sbm-panel-item-template');
env.$frm.filter = $('#frmAssetCategoryFilter').on('input', '.FilterSearch', function () { ac.refreshResults(250); });
env.$frm.filter = env.$pnl.items.find('.frmAssetCategoryFilter').on('input', '.FilterSearch', function () { ac.refreshResults(250); });
env.$frm.itemId = $('#frmAssetCategoryId');
var opt = sbm.dlgOpts();
@@ -24,7 +24,7 @@
}
ac.handleAssets = function (response)
{
sbm.debug('handleAssets', response);
//sbm.debug('handleAssets', response);
delete ac.awaitingRefreshResponse;
let $table = $('table', $pnl.table).find('tbody tr').remove().end();
$pnl.msgs.hide().empty();
@@ -198,6 +198,16 @@
delete ac.data.assets;
}
//--------------------------------------------------------------
ac.onSelectFilterAssetCategory=function(env, item)
{
sbm.debug('onSelectFilterAssetCategory', env, item);
env.$frm.filter.find('.FilterAssetCategoryId').val(item.id);
env.$frm.filter.find('.FilterAssetCategory').val(item.name);
setTimeout(ac.refreshResults, 250);
}
//--------------------------------------------------------------
$(function ()
{
@@ -209,7 +219,8 @@
$pnl.tmpls = $('.sbm-panel-item-template', $pnl.items);
$frm.filter = $('#frmAssetFilter');
$('.FilterSearch', $frm.filter).on('input', function () { ac.refreshResults(250); });
$frm.filter.on('input', '.FilterSearch', function () { ac.refreshResults(250); });
$frm.filter.on('dblclick', '.FilterAssetCategory', function () { sbm.fn.selectAssetCategory({ fnSuccess: function (item) { ac.onSelectFilterAssetCategory(env, item); } }); });
$frm.itemId = $('#frmAssetId');
$frm.categories = $('#frmCategories');